diff --git a/apps/docs/components/Favicons.tsx b/apps/docs/components/Favicons.tsx index 1e9ddafffe1..8ab82f3c178 100644 --- a/apps/docs/components/Favicons.tsx +++ b/apps/docs/components/Favicons.tsx @@ -22,15 +22,15 @@ const Favicons = () => { {/* prettier-ignore */} {/* prettier-ignore */} - {/* prettier-ignore */} - {/* prettier-ignore */} - {/* prettier-ignore */} - {/* prettier-ignore */} - diff --git a/apps/docs/pages/guides/auth/auth-helpers/auth-ui.mdx b/apps/docs/pages/guides/auth/auth-helpers/auth-ui.mdx index 4b3afd06db9..66e26a91c2d 100644 --- a/apps/docs/pages/guides/auth/auth-helpers/auth-ui.mdx +++ b/apps/docs/pages/guides/auth/auth-helpers/auth-ui.mdx @@ -41,7 +41,7 @@ const App = () => This renders the Auth component without any styling. We recommend using one of the predefined themes to style the UI. -Import the theme you want to use and pass it to the `appearence.theme` prop. +Import the theme you want to use and pass it to the `appearance.theme` prop. ```js lines=4,16 title=/src/index.js import { Auth } from '@supabase/auth-ui-react' @@ -109,7 +109,7 @@ There are several ways to customize Auth UI: ### Predefined themes -Auth UI comes with several themes to customize the appearance. Each predefined theme comes with at least two variations, a `default` variation, and a `dark` variation. You can switch between these themes using the `theme` prop. Import the theme you want to use and pass it to the `appearence.theme` prop. +Auth UI comes with several themes to customize the appearance. Each predefined theme comes with at least two variations, a `default` variation, and a `dark` variation. You can switch between these themes using the `theme` prop. Import the theme you want to use and pass it to the `appearance.theme` prop. ```js lines=2,13 title=/src/index.js import { createClient } from '@supabase/supabase-js' diff --git a/apps/docs/pages/guides/auth/managing-user-data.mdx b/apps/docs/pages/guides/auth/managing-user-data.mdx index 8b25736949a..5c2580e6a91 100644 --- a/apps/docs/pages/guides/auth/managing-user-data.mdx +++ b/apps/docs/pages/guides/auth/managing-user-data.mdx @@ -36,7 +36,7 @@ Primary keys are **guaranteed not to change**. Columns, indices, constraints or ## Deleting Users -You may delete users directly or via the management console at Authentication > Users. Note that deleting a user from the `auth.users` table does not automatically sign out a user. As Supabase makes use of JSON Web Tokens (JWT), a user's JWT will remain "valid" until it has expired. Should you wish to immediately revoke access for a user, do considering making use of a Row Level Security policy as described below. +You may delete users directly or via the management console at Authentication > Users. Note that deleting a user from the `auth.users` table does not automatically sign out a user. As Supabase makes use of JSON Web Tokens (JWT), a user's JWT will remain "valid" until it has expired. Should you wish to immediately revoke access for a user, do consider making use of a Row Level Security policy as described below. You cannot delete a user if they are the owner of any objects in Supabase Storage. diff --git a/apps/docs/pages/guides/cli.mdx b/apps/docs/pages/guides/cli.mdx index a17186d3d76..7cb2b6fa5ce 100644 --- a/apps/docs/pages/guides/cli.mdx +++ b/apps/docs/pages/guides/cli.mdx @@ -25,6 +25,12 @@ Install the CLI as dev dependency via [npm](https://www.npmjs.com/package/supaba npm install supabase --save-dev ``` +Run the CLI by prefixing each command with `npx` (only applicable when installing through `npm`): + +```sh +npx supabase +``` + diff --git a/apps/docs/pages/guides/database/overview.mdx b/apps/docs/pages/guides/database/overview.mdx index d4667ed82a3..74196706d63 100644 --- a/apps/docs/pages/guides/database/overview.mdx +++ b/apps/docs/pages/guides/database/overview.mdx @@ -10,17 +10,6 @@ export const meta = { Every Supabase project comes with a full [Postgres](https://www.postgresql.org/) database, a free and open source database which is considered one of the world's most stable and advanced databases. -## Postgres or PostgreSQL? - -PostgreSQL the database was derived from the POSTGRES Project, a package written at the University of California at Berkeley in 1986. -This package included a query language called "PostQUEL". - -In 1994, Postgres95 was built on top of POSTGRES code, adding an SQL language interpreter as a replacement for PostQUEL. -Eventually, Postgres95 was renamed to PostgreSQL to reflect the SQL query capability. - -After this, many people referred to it as Postgres since it's less prone to confusion. Supabase is all about -simplicity, so we also refer to it as Postgres. - ## Features ### Table View @@ -97,6 +86,19 @@ You can enable Postgres extensions with the click of a button within the Supabas [Learn more](/docs/guides/database/extensions) about all the extensions provided on Supabase. +## Terminology + +### Postgres or PostgreSQL? + +PostgreSQL the database was derived from the POSTGRES Project, a package written at the University of California at Berkeley in 1986. +This package included a query language called "PostQUEL". + +In 1994, Postgres95 was built on top of POSTGRES code, adding an SQL language interpreter as a replacement for PostQUEL. +Eventually, Postgres95 was renamed to PostgreSQL to reflect the SQL query capability. + +After this, many people referred to it as Postgres since it's less prone to confusion. Supabase is all about +simplicity, so we also refer to it as Postgres. + ## Tips Read about resetting your database password [here](/docs/guides/database/managing-passwords) and changing the timezone of your server [here](/docs/guides/database/managing-timezones). diff --git a/apps/docs/pages/guides/functions/dart-edge.mdx b/apps/docs/pages/guides/functions/dart-edge.mdx index 49ac9142d37..4cb5bac9d9f 100644 --- a/apps/docs/pages/guides/functions/dart-edge.mdx +++ b/apps/docs/pages/guides/functions/dart-edge.mdx @@ -50,7 +50,7 @@ void main() { } ``` -`SupabaseFunctions` class has a `fetch` handler, which is expected to return a `Response` object, and has a `request` parameter, which contains information about the request such as body and headers. +`SupabaseFunctions` class has a `fetch` handler, which is expected to return a `Response` object, and has a `request` parameter, which contains information about the request such as body and headers. ## Using Supabase Client @@ -70,43 +70,11 @@ We also need to use a special HTTP client to HTTP requests in the edge environme dart pub add edge_http_client ``` -We also need to add the `yet_another_json_isolate` package, which is the JSON encoder/decoder that utilizes isolate. - -```bash -dart pub add yet_another_json_isolate -``` - -### Override the JSON isolate - -Since isolates are not supported in the edge, we have to override its behavior to handle JSON serialization using the main thread. - -```dart -import 'package:yet_another_json_isolate/yet_another_json_isolate.dart'; - -class EdgeIsolate implements YAJsonIsolate { - @override - Future decode(String json) { - return Future.value(jsonDecode(json)); - } - - @override - Future dispose() async {} - - @override - Future encode(Object? json) { - return Future.value(jsonEncode(json)); - } - - @override - Future initialize() async {} -} -``` - ### Initialize SupabaseClient -At this point, you can initialize a `SupabaseClient` by passing the [EdgeHttpClient](https://pub.dev/packages/edge_http_client) and the `EdgeIsolate`. We can access the Supabase credentials through the [environment variables](https://supabase.com/docs/guides/functions/secrets) using `Deno.env.get()` method. Note that [Supabase credentials are available by default](https://supabase.com/docs/guides/functions/secrets), so no configurations are necessary. +At this point, you can initialize a `SupabaseClient` by passing the [EdgeHttpClient](https://pub.dev/packages/edge_http_client). We can access the Supabase credentials through the [environment variables](https://supabase.com/docs/guides/functions/secrets) using `Deno.env.get()` method. Note that [Supabase credentials are available by default](https://supabase.com/docs/guides/functions/secrets), so no configurations are necessary. -Combining the isolates we overrode earlier, we have the following sample functions code to query Supabase database using the Supabase client. +Now we have the following sample functions code to query Supabase database using the Supabase client. ```dart import 'dart:convert'; @@ -114,14 +82,12 @@ import 'dart:convert'; import 'package:supabase_functions/supabase_functions.dart'; import 'package:edge_http_client/edge_http_client.dart'; import 'package:supabase/supabase.dart'; -import 'package:yet_another_json_isolate/yet_another_json_isolate.dart'; void main() { final supabase = SupabaseClient( Deno.env.get('SUPABASE_URL')!, Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!, // Use service role key to bypass RLS httpClient: EdgeHttpClient(), - isolate: EdgeIsolate(), ); SupabaseFunctions(fetch: (request) async { @@ -130,24 +96,6 @@ void main() { return Response.json(users); }); } - -class EdgeIsolate implements YAJsonIsolate { - @override - Future decode(String json) { - return Future.value(jsonDecode(json)); - } - - @override - Future dispose() async {} - - @override - Future encode(Object? json) { - return Future.value(jsonEncode(json)); - } - - @override - Future initialize() async {} -} ``` ## Run the Functions @@ -178,7 +126,7 @@ You should be able to access your local function here: ### Deploy to the Edge -Run the following commands to compile and deploy your function on Supabase Edge functions. +Run the following commands to compile and deploy your function on Supabase Edge functions. ```bash edge build supabase_functions diff --git a/apps/docs/pages/guides/getting-started/tutorials/with-sveltekit.mdx b/apps/docs/pages/guides/getting-started/tutorials/with-sveltekit.mdx index 745164db3f7..3d52b20f8d1 100644 --- a/apps/docs/pages/guides/getting-started/tutorials/with-sveltekit.mdx +++ b/apps/docs/pages/guides/getting-started/tutorials/with-sveltekit.mdx @@ -130,7 +130,7 @@ import type { LayoutServerLoad } from './$types'; export const load: LayoutServerLoad = async ({ locals: { getSession } }) => { return { - session: getSession() + session: await getSession() }; }; ``` diff --git a/apps/docs/pages/guides/platform/performance.mdx b/apps/docs/pages/guides/platform/performance.mdx index adbe3a241b9..e0c8a00f402 100644 --- a/apps/docs/pages/guides/platform/performance.mdx +++ b/apps/docs/pages/guides/platform/performance.mdx @@ -118,7 +118,7 @@ limit 100; This query will show you statistics about queries ordered by the cumulative total execution time. It shows the total time the query has spent running as well as the proportion of total execution time the query has taken up. -Queries which are the most time consuming are not necessarily bad, you may have a very effiecient and frequently ran queries that end up taking a large total % time, but it can be useful to help spot queries that are taking up more time than they should. +Queries which are the most time consuming are not necessarily bad, you may have a very efficient and frequently ran queries that end up taking a large total % time, but it can be useful to help spot queries that are taking up more time than they should. ### Hit rate diff --git a/apps/docs/pages/guides/self-hosting.mdx b/apps/docs/pages/guides/self-hosting.mdx index 9c80c496788..39a57fb549e 100644 --- a/apps/docs/pages/guides/self-hosting.mdx +++ b/apps/docs/pages/guides/self-hosting.mdx @@ -21,7 +21,7 @@ If the tool doesn't exist, we build and open source it ourselves. ![Supabase Architecture](/docs/img/supabase-architecture.png) - [Kong](https://github.com/Kong/kong) is a cloud-native API gateway. -- [GoTrue](https://github.com/netlify/gotrue) is an SWT based API for managing users and issuing SWT tokens. +- [GoTrue](https://github.com/supabase/gotrue) is an SWT based API for managing users and issuing SWT tokens. - [PostgREST](http://postgrest.org/) is a web server that turns your PostgreSQL database directly into a RESTful API - [Realtime](https://github.com/supabase/realtime) is an Elixir server that allows you to listen to PostgreSQL inserts, updates, and deletes using websockets. Realtime polls Postgres' built-in replication functionality for database changes, converts changes to JSON, then broadcasts the JSON over websockets to authorized clients. - [Storage](https://github.com/supabase/storage-api) provides a RESTful interface for managing Files stored in S3, using Postgres to manage permissions. diff --git a/apps/docs/public/favicon/android-chrome-192x192.png b/apps/docs/public/favicon/android-chrome-192x192.png index f0a2817a744..c0ac2bb1cdb 100644 Binary files a/apps/docs/public/favicon/android-chrome-192x192.png and b/apps/docs/public/favicon/android-chrome-192x192.png differ diff --git a/apps/docs/public/favicon/android-chrome-512x512.png b/apps/docs/public/favicon/android-chrome-512x512.png index 1c658733e6e..1bdeaa23bb8 100644 Binary files a/apps/docs/public/favicon/android-chrome-512x512.png and b/apps/docs/public/favicon/android-chrome-512x512.png differ diff --git a/apps/docs/public/favicon/archive/apple-touch-icon-114x114.png b/apps/docs/public/favicon/android-icon-144x144.png similarity index 100% rename from apps/docs/public/favicon/archive/apple-touch-icon-114x114.png rename to apps/docs/public/favicon/android-icon-144x144.png diff --git a/apps/docs/public/favicon/android-icon-192x192.png b/apps/docs/public/favicon/android-icon-192x192.png new file mode 100644 index 00000000000..7583d2035e3 Binary files /dev/null and b/apps/docs/public/favicon/android-icon-192x192.png differ diff --git a/apps/docs/public/favicon/android-icon-36x36.png b/apps/docs/public/favicon/android-icon-36x36.png new file mode 100644 index 00000000000..5e4eabec411 Binary files /dev/null and b/apps/docs/public/favicon/android-icon-36x36.png differ diff --git a/apps/docs/public/favicon/android-icon-48x48.png b/apps/docs/public/favicon/android-icon-48x48.png new file mode 100644 index 00000000000..f8d8a7d9c05 Binary files /dev/null and b/apps/docs/public/favicon/android-icon-48x48.png differ diff --git a/apps/docs/public/favicon/archive/apple-touch-icon-72x72.png b/apps/docs/public/favicon/android-icon-72x72.png similarity index 100% rename from apps/docs/public/favicon/archive/apple-touch-icon-72x72.png rename to apps/docs/public/favicon/android-icon-72x72.png diff --git a/apps/docs/public/favicon/android-icon-96x96.png b/apps/docs/public/favicon/android-icon-96x96.png new file mode 100644 index 00000000000..0f1351f3670 Binary files /dev/null and b/apps/docs/public/favicon/android-icon-96x96.png differ diff --git a/apps/www/public/favicon/archive/apple-touch-icon-114x114.png b/apps/docs/public/favicon/apple-icon-114x114.png similarity index 100% rename from apps/www/public/favicon/archive/apple-touch-icon-114x114.png rename to apps/docs/public/favicon/apple-icon-114x114.png diff --git a/apps/docs/public/favicon/archive/apple-touch-icon-120x120.png b/apps/docs/public/favicon/apple-icon-120x120.png similarity index 100% rename from apps/docs/public/favicon/archive/apple-touch-icon-120x120.png rename to apps/docs/public/favicon/apple-icon-120x120.png diff --git a/apps/docs/public/favicon/archive/apple-touch-icon-144x144.png b/apps/docs/public/favicon/apple-icon-144x144.png similarity index 100% rename from apps/docs/public/favicon/archive/apple-touch-icon-144x144.png rename to apps/docs/public/favicon/apple-icon-144x144.png diff --git a/apps/docs/public/favicon/archive/apple-touch-icon-152x152.png b/apps/docs/public/favicon/apple-icon-152x152.png similarity index 100% rename from apps/docs/public/favicon/archive/apple-touch-icon-152x152.png rename to apps/docs/public/favicon/apple-icon-152x152.png diff --git a/apps/docs/public/favicon/apple-icon-180x180.png b/apps/docs/public/favicon/apple-icon-180x180.png new file mode 100644 index 00000000000..2a80dbc2f68 Binary files /dev/null and b/apps/docs/public/favicon/apple-icon-180x180.png differ diff --git a/apps/docs/public/favicon/apple-icon-57x57.png b/apps/docs/public/favicon/apple-icon-57x57.png new file mode 100644 index 00000000000..e7b08eb605f Binary files /dev/null and b/apps/docs/public/favicon/apple-icon-57x57.png differ diff --git a/apps/docs/public/favicon/archive/apple-touch-icon-60x60.png b/apps/docs/public/favicon/apple-icon-60x60.png similarity index 100% rename from apps/docs/public/favicon/archive/apple-touch-icon-60x60.png rename to apps/docs/public/favicon/apple-icon-60x60.png diff --git a/apps/www/public/favicon/archive/apple-touch-icon-72x72.png b/apps/docs/public/favicon/apple-icon-72x72.png similarity index 100% rename from apps/www/public/favicon/archive/apple-touch-icon-72x72.png rename to apps/docs/public/favicon/apple-icon-72x72.png diff --git a/apps/docs/public/favicon/archive/apple-touch-icon-76x76.png b/apps/docs/public/favicon/apple-icon-76x76.png similarity index 100% rename from apps/docs/public/favicon/archive/apple-touch-icon-76x76.png rename to apps/docs/public/favicon/apple-icon-76x76.png diff --git a/apps/docs/public/favicon/apple-icon-precomposed.png b/apps/docs/public/favicon/apple-icon-precomposed.png new file mode 100644 index 00000000000..7583d2035e3 Binary files /dev/null and b/apps/docs/public/favicon/apple-icon-precomposed.png differ diff --git a/apps/docs/public/favicon/apple-icon.png b/apps/docs/public/favicon/apple-icon.png new file mode 100644 index 00000000000..7583d2035e3 Binary files /dev/null and b/apps/docs/public/favicon/apple-icon.png differ diff --git a/apps/docs/public/favicon/apple-touch-icon-114x114.png b/apps/docs/public/favicon/apple-touch-icon-114x114.png index d2ee4b9e139..4aa46d4d25d 100644 Binary files a/apps/docs/public/favicon/apple-touch-icon-114x114.png and b/apps/docs/public/favicon/apple-touch-icon-114x114.png differ diff --git a/apps/docs/public/favicon/apple-touch-icon-120x120.png b/apps/docs/public/favicon/apple-touch-icon-120x120.png index 5bd0e4963a1..d2b0e50ef41 100644 Binary files a/apps/docs/public/favicon/apple-touch-icon-120x120.png and b/apps/docs/public/favicon/apple-touch-icon-120x120.png differ diff --git a/apps/docs/public/favicon/apple-touch-icon-144x144.png b/apps/docs/public/favicon/apple-touch-icon-144x144.png index c73891c985d..00a5d8b5180 100644 Binary files a/apps/docs/public/favicon/apple-touch-icon-144x144.png and b/apps/docs/public/favicon/apple-touch-icon-144x144.png differ diff --git a/apps/docs/public/favicon/apple-touch-icon-152x152.png b/apps/docs/public/favicon/apple-touch-icon-152x152.png index 65f90a02357..310532c4648 100644 Binary files a/apps/docs/public/favicon/apple-touch-icon-152x152.png and b/apps/docs/public/favicon/apple-touch-icon-152x152.png differ diff --git a/apps/docs/public/favicon/apple-touch-icon-57x57.png b/apps/docs/public/favicon/apple-touch-icon-57x57.png index bfa1628afb5..1314e02c744 100644 Binary files a/apps/docs/public/favicon/apple-touch-icon-57x57.png and b/apps/docs/public/favicon/apple-touch-icon-57x57.png differ diff --git a/apps/docs/public/favicon/apple-touch-icon-60x60.png b/apps/docs/public/favicon/apple-touch-icon-60x60.png index 15c5dca8005..0615675e809 100644 Binary files a/apps/docs/public/favicon/apple-touch-icon-60x60.png and b/apps/docs/public/favicon/apple-touch-icon-60x60.png differ diff --git a/apps/docs/public/favicon/apple-touch-icon-72x72.png b/apps/docs/public/favicon/apple-touch-icon-72x72.png index fb0c4fb3663..e4418058cef 100644 Binary files a/apps/docs/public/favicon/apple-touch-icon-72x72.png and b/apps/docs/public/favicon/apple-touch-icon-72x72.png differ diff --git a/apps/docs/public/favicon/apple-touch-icon-76x76.png b/apps/docs/public/favicon/apple-touch-icon-76x76.png index 7d950f0862e..9a76327f94b 100644 Binary files a/apps/docs/public/favicon/apple-touch-icon-76x76.png and b/apps/docs/public/favicon/apple-touch-icon-76x76.png differ diff --git a/apps/docs/public/favicon/archive/android-chrome-192x192.png b/apps/docs/public/favicon/archive/android-chrome-192x192.png deleted file mode 100644 index c0ac2bb1cdb..00000000000 Binary files a/apps/docs/public/favicon/archive/android-chrome-192x192.png and /dev/null differ diff --git a/apps/docs/public/favicon/archive/android-chrome-512x512.png b/apps/docs/public/favicon/archive/android-chrome-512x512.png deleted file mode 100644 index 4de626fcc9e..00000000000 Binary files a/apps/docs/public/favicon/archive/android-chrome-512x512.png and /dev/null differ diff --git a/apps/docs/public/favicon/archive/apple-touch-icon-57x57.png b/apps/docs/public/favicon/archive/apple-touch-icon-57x57.png deleted file mode 100644 index 1314e02c744..00000000000 Binary files a/apps/docs/public/favicon/archive/apple-touch-icon-57x57.png and /dev/null differ diff --git a/apps/docs/public/favicon/archive/favicon-128.png b/apps/docs/public/favicon/archive/favicon-128.png deleted file mode 100644 index d5dca345802..00000000000 Binary files a/apps/docs/public/favicon/archive/favicon-128.png and /dev/null differ diff --git a/apps/docs/public/favicon/archive/favicon-16x16.png b/apps/docs/public/favicon/archive/favicon-16x16.png deleted file mode 100644 index 6361bcecd15..00000000000 Binary files a/apps/docs/public/favicon/archive/favicon-16x16.png and /dev/null differ diff --git a/apps/docs/public/favicon/archive/favicon-196x196.png b/apps/docs/public/favicon/archive/favicon-196x196.png deleted file mode 100644 index adb05b43453..00000000000 Binary files a/apps/docs/public/favicon/archive/favicon-196x196.png and /dev/null differ diff --git a/apps/docs/public/favicon/archive/favicon-32x32.png b/apps/docs/public/favicon/archive/favicon-32x32.png deleted file mode 100644 index 4ea0fba2e3c..00000000000 Binary files a/apps/docs/public/favicon/archive/favicon-32x32.png and /dev/null differ diff --git a/apps/docs/public/favicon/archive/favicon-96x96.png b/apps/docs/public/favicon/archive/favicon-96x96.png deleted file mode 100644 index 92a3d735dff..00000000000 Binary files a/apps/docs/public/favicon/archive/favicon-96x96.png and /dev/null differ diff --git a/apps/docs/public/favicon/archive/favicon.ico b/apps/docs/public/favicon/archive/favicon.ico deleted file mode 100644 index 4e808093c05..00000000000 Binary files a/apps/docs/public/favicon/archive/favicon.ico and /dev/null differ diff --git a/apps/docs/public/favicon/archive/lw7/android-chrome-192x192.png b/apps/docs/public/favicon/archive/lw7/android-chrome-192x192.png new file mode 100644 index 00000000000..f0a2817a744 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw7/android-chrome-192x192.png differ diff --git a/apps/docs/public/favicon/archive/lw7/android-chrome-512x512.png b/apps/docs/public/favicon/archive/lw7/android-chrome-512x512.png new file mode 100644 index 00000000000..1c658733e6e Binary files /dev/null and b/apps/docs/public/favicon/archive/lw7/android-chrome-512x512.png differ diff --git a/apps/docs/public/favicon/archive/lw7/apple-touch-icon-114x114.png b/apps/docs/public/favicon/archive/lw7/apple-touch-icon-114x114.png new file mode 100644 index 00000000000..d2ee4b9e139 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw7/apple-touch-icon-114x114.png differ diff --git a/apps/docs/public/favicon/archive/lw7/apple-touch-icon-120x120.png b/apps/docs/public/favicon/archive/lw7/apple-touch-icon-120x120.png new file mode 100644 index 00000000000..5bd0e4963a1 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw7/apple-touch-icon-120x120.png differ diff --git a/apps/docs/public/favicon/archive/lw7/apple-touch-icon-144x144.png b/apps/docs/public/favicon/archive/lw7/apple-touch-icon-144x144.png new file mode 100644 index 00000000000..c73891c985d Binary files /dev/null and b/apps/docs/public/favicon/archive/lw7/apple-touch-icon-144x144.png differ diff --git a/apps/docs/public/favicon/archive/lw7/apple-touch-icon-152x152.png b/apps/docs/public/favicon/archive/lw7/apple-touch-icon-152x152.png new file mode 100644 index 00000000000..65f90a02357 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw7/apple-touch-icon-152x152.png differ diff --git a/apps/docs/public/favicon/archive/lw7/apple-touch-icon-57x57.png b/apps/docs/public/favicon/archive/lw7/apple-touch-icon-57x57.png new file mode 100644 index 00000000000..bfa1628afb5 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw7/apple-touch-icon-57x57.png differ diff --git a/apps/docs/public/favicon/archive/lw7/apple-touch-icon-60x60.png b/apps/docs/public/favicon/archive/lw7/apple-touch-icon-60x60.png new file mode 100644 index 00000000000..15c5dca8005 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw7/apple-touch-icon-60x60.png differ diff --git a/apps/docs/public/favicon/archive/lw7/apple-touch-icon-72x72.png b/apps/docs/public/favicon/archive/lw7/apple-touch-icon-72x72.png new file mode 100644 index 00000000000..fb0c4fb3663 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw7/apple-touch-icon-72x72.png differ diff --git a/apps/docs/public/favicon/archive/lw7/apple-touch-icon-76x76.png b/apps/docs/public/favicon/archive/lw7/apple-touch-icon-76x76.png new file mode 100644 index 00000000000..7d950f0862e Binary files /dev/null and b/apps/docs/public/favicon/archive/lw7/apple-touch-icon-76x76.png differ diff --git a/apps/docs/public/favicon/archive/lw7/favicon-128.png b/apps/docs/public/favicon/archive/lw7/favicon-128.png new file mode 100644 index 00000000000..2206096f21b Binary files /dev/null and b/apps/docs/public/favicon/archive/lw7/favicon-128.png differ diff --git a/apps/docs/public/favicon/archive/lw7/favicon-16x16.png b/apps/docs/public/favicon/archive/lw7/favicon-16x16.png new file mode 100644 index 00000000000..2e07b15e106 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw7/favicon-16x16.png differ diff --git a/apps/docs/public/favicon/archive/lw7/favicon-196x196.png b/apps/docs/public/favicon/archive/lw7/favicon-196x196.png new file mode 100644 index 00000000000..d10fc7e36d9 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw7/favicon-196x196.png differ diff --git a/apps/docs/public/favicon/archive/lw7/favicon-32x32.png b/apps/docs/public/favicon/archive/lw7/favicon-32x32.png new file mode 100644 index 00000000000..4101a08499b Binary files /dev/null and b/apps/docs/public/favicon/archive/lw7/favicon-32x32.png differ diff --git a/apps/docs/public/favicon/archive/lw7/favicon-96x96.png b/apps/docs/public/favicon/archive/lw7/favicon-96x96.png new file mode 100644 index 00000000000..b23072a2c02 Binary files /dev/null and b/apps/docs/public/favicon/archive/lw7/favicon-96x96.png differ diff --git a/apps/docs/public/favicon/archive/lw7/favicon.ico b/apps/docs/public/favicon/archive/lw7/favicon.ico new file mode 100644 index 00000000000..51b9988fdcb Binary files /dev/null and b/apps/docs/public/favicon/archive/lw7/favicon.ico differ diff --git a/apps/docs/public/favicon/archive/lw7/mstile-144x144.png b/apps/docs/public/favicon/archive/lw7/mstile-144x144.png new file mode 100644 index 00000000000..c73891c985d Binary files /dev/null and b/apps/docs/public/favicon/archive/lw7/mstile-144x144.png differ diff --git a/apps/docs/public/favicon/archive/lw7/mstile-150x150.png b/apps/docs/public/favicon/archive/lw7/mstile-150x150.png new file mode 100644 index 00000000000..bd10ae0a5df Binary files /dev/null and b/apps/docs/public/favicon/archive/lw7/mstile-150x150.png differ diff --git a/apps/docs/public/favicon/archive/lw7/mstile-310x150.png b/apps/docs/public/favicon/archive/lw7/mstile-310x150.png new file mode 100644 index 00000000000..fb4d58022df Binary files /dev/null and b/apps/docs/public/favicon/archive/lw7/mstile-310x150.png differ diff --git a/apps/docs/public/favicon/archive/lw7/mstile-310x310.png b/apps/docs/public/favicon/archive/lw7/mstile-310x310.png new file mode 100644 index 00000000000..0adc45ea0ac Binary files /dev/null and b/apps/docs/public/favicon/archive/lw7/mstile-310x310.png differ diff --git a/apps/docs/public/favicon/archive/lw7/mstile-70x70.png b/apps/docs/public/favicon/archive/lw7/mstile-70x70.png new file mode 100644 index 00000000000..2206096f21b Binary files /dev/null and b/apps/docs/public/favicon/archive/lw7/mstile-70x70.png differ diff --git a/apps/docs/public/favicon/archive/mstile-310x150.png b/apps/docs/public/favicon/archive/mstile-310x150.png deleted file mode 100644 index b1121df62aa..00000000000 Binary files a/apps/docs/public/favicon/archive/mstile-310x150.png and /dev/null differ diff --git a/apps/docs/public/favicon/archive/mstile-70x70.png b/apps/docs/public/favicon/archive/mstile-70x70.png deleted file mode 100644 index d5dca345802..00000000000 Binary files a/apps/docs/public/favicon/archive/mstile-70x70.png and /dev/null differ diff --git a/apps/docs/public/favicon/browserconfig.xml b/apps/docs/public/favicon/browserconfig.xml index 9824d87b115..c5541482230 100644 --- a/apps/docs/public/favicon/browserconfig.xml +++ b/apps/docs/public/favicon/browserconfig.xml @@ -1,9 +1,2 @@ - - - - - #000000 - - - +#ffffff \ No newline at end of file diff --git a/apps/docs/public/favicon/favicon-128.png b/apps/docs/public/favicon/favicon-128.png index 2206096f21b..d5dca345802 100644 Binary files a/apps/docs/public/favicon/favicon-128.png and b/apps/docs/public/favicon/favicon-128.png differ diff --git a/apps/docs/public/favicon/favicon-16x16.png b/apps/docs/public/favicon/favicon-16x16.png index 2e07b15e106..fa07282ee8d 100644 Binary files a/apps/docs/public/favicon/favicon-16x16.png and b/apps/docs/public/favicon/favicon-16x16.png differ diff --git a/apps/docs/public/favicon/favicon-196x196.png b/apps/docs/public/favicon/favicon-196x196.png index d10fc7e36d9..adb05b43453 100644 Binary files a/apps/docs/public/favicon/favicon-196x196.png and b/apps/docs/public/favicon/favicon-196x196.png differ diff --git a/apps/docs/public/favicon/favicon-32x32.png b/apps/docs/public/favicon/favicon-32x32.png index 4101a08499b..7fa29c547a6 100644 Binary files a/apps/docs/public/favicon/favicon-32x32.png and b/apps/docs/public/favicon/favicon-32x32.png differ diff --git a/apps/docs/public/favicon/favicon-96x96.png b/apps/docs/public/favicon/favicon-96x96.png index b23072a2c02..0f1351f3670 100644 Binary files a/apps/docs/public/favicon/favicon-96x96.png and b/apps/docs/public/favicon/favicon-96x96.png differ diff --git a/apps/docs/public/favicon/favicon.ico b/apps/docs/public/favicon/favicon.ico index 51b9988fdcb..5c4d1dcc5cf 100644 Binary files a/apps/docs/public/favicon/favicon.ico and b/apps/docs/public/favicon/favicon.ico differ diff --git a/apps/docs/public/favicon/archive/mstile-144x144.png b/apps/docs/public/favicon/ms-icon-144x144.png similarity index 100% rename from apps/docs/public/favicon/archive/mstile-144x144.png rename to apps/docs/public/favicon/ms-icon-144x144.png diff --git a/apps/docs/public/favicon/archive/mstile-150x150.png b/apps/docs/public/favicon/ms-icon-150x150.png similarity index 100% rename from apps/docs/public/favicon/archive/mstile-150x150.png rename to apps/docs/public/favicon/ms-icon-150x150.png diff --git a/apps/docs/public/favicon/archive/mstile-310x310.png b/apps/docs/public/favicon/ms-icon-310x310.png similarity index 100% rename from apps/docs/public/favicon/archive/mstile-310x310.png rename to apps/docs/public/favicon/ms-icon-310x310.png diff --git a/apps/docs/public/favicon/ms-icon-70x70.png b/apps/docs/public/favicon/ms-icon-70x70.png new file mode 100644 index 00000000000..48f6391fcdc Binary files /dev/null and b/apps/docs/public/favicon/ms-icon-70x70.png differ diff --git a/apps/docs/public/favicon/mstile-144x144.png b/apps/docs/public/favicon/mstile-144x144.png index c73891c985d..00a5d8b5180 100644 Binary files a/apps/docs/public/favicon/mstile-144x144.png and b/apps/docs/public/favicon/mstile-144x144.png differ diff --git a/apps/docs/public/favicon/mstile-150x150.png b/apps/docs/public/favicon/mstile-150x150.png index bd10ae0a5df..4de1d9b1cc1 100644 Binary files a/apps/docs/public/favicon/mstile-150x150.png and b/apps/docs/public/favicon/mstile-150x150.png differ diff --git a/apps/docs/public/favicon/mstile-310x150.png b/apps/docs/public/favicon/mstile-310x150.png index fb4d58022df..b1121df62aa 100644 Binary files a/apps/docs/public/favicon/mstile-310x150.png and b/apps/docs/public/favicon/mstile-310x150.png differ diff --git a/apps/docs/public/favicon/mstile-310x310.png b/apps/docs/public/favicon/mstile-310x310.png index 0adc45ea0ac..7ea95ae09c0 100644 Binary files a/apps/docs/public/favicon/mstile-310x310.png and b/apps/docs/public/favicon/mstile-310x310.png differ diff --git a/apps/docs/public/favicon/mstile-70x70.png b/apps/docs/public/favicon/mstile-70x70.png index 2206096f21b..d5dca345802 100644 Binary files a/apps/docs/public/favicon/mstile-70x70.png and b/apps/docs/public/favicon/mstile-70x70.png differ diff --git a/apps/docs/public/sitemap.xml b/apps/docs/public/sitemap.xml index 5af30326761..01fc1040a98 100644 --- a/apps/docs/public/sitemap.xml +++ b/apps/docs/public/sitemap.xml @@ -12,12 +12,6 @@ 0.5 - - https://supabase.com/docs/support - weekly - 0.5 - - https://supabase.com/docs/handbook/contributing weekly @@ -30,6 +24,48 @@ 0.5 + + https://supabase.com/docs/reference/index + weekly + 0.5 + + + + https://supabase.com/docs/learn/auth-deep-dive/auth-deep-dive-jwts + weekly + 0.5 + + + + https://supabase.com/docs/learn/auth-deep-dive/auth-google-oauth + weekly + 0.5 + + + + https://supabase.com/docs/learn/auth-deep-dive/auth-gotrue + weekly + 0.5 + + + + https://supabase.com/docs/learn/auth-deep-dive/auth-policies + weekly + 0.5 + + + + https://supabase.com/docs/learn/auth-deep-dive/auth-row-level-security + weekly + 0.5 + + + + https://supabase.com/docs/guides/api + weekly + 0.5 + + https://supabase.com/docs/guides/auth weekly @@ -97,37 +133,31 @@ - https://supabase.com/docs/reference/index + https://supabase.com/docs/guides/api/api-keys weekly 0.5 - https://supabase.com/docs/learn/auth-deep-dive/auth-deep-dive-jwts + https://supabase.com/docs/guides/api/creating-routes weekly 0.5 - https://supabase.com/docs/learn/auth-deep-dive/auth-google-oauth + https://supabase.com/docs/guides/api/joins-and-nesting weekly 0.5 - https://supabase.com/docs/learn/auth-deep-dive/auth-gotrue + https://supabase.com/docs/guides/api/quickstart weekly 0.5 - https://supabase.com/docs/learn/auth-deep-dive/auth-policies - weekly - 0.5 - - - - https://supabase.com/docs/learn/auth-deep-dive/auth-row-level-security + https://supabase.com/docs/guides/api/securing-your-api weekly 0.5 @@ -216,90 +246,6 @@ 0.5 - - https://supabase.com/docs/guides/functions/auth - weekly - 0.5 - - - - https://supabase.com/docs/guides/functions/cicd-workflow - weekly - 0.5 - - - - https://supabase.com/docs/guides/functions/connect-to-postgres - 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/global-deployments - 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/functions/storage-caching - weekly - 0.5 - - - - https://supabase.com/docs/guides/functions/typescript-support - weekly - 0.5 - - - - https://supabase.com/docs/guides/database/api - weekly - 0.5 - - https://supabase.com/docs/guides/database/arrays weekly @@ -390,6 +336,84 @@ 0.5 + + https://supabase.com/docs/guides/functions/auth + weekly + 0.5 + + + + https://supabase.com/docs/guides/functions/cicd-workflow + weekly + 0.5 + + + + https://supabase.com/docs/guides/functions/connect-to-postgres + 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/global-deployments + 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/functions/storage-caching + weekly + 0.5 + + + + https://supabase.com/docs/guides/functions/typescript-support + weekly + 0.5 + + https://supabase.com/docs/guides/getting-started/architecture weekly @@ -402,6 +426,108 @@ 0.5 + + https://supabase.com/docs/guides/platform/access-control + weekly + 0.5 + + + + https://supabase.com/docs/guides/platform/backups + weekly + 0.5 + + + + https://supabase.com/docs/guides/platform/compute-add-ons + weekly + 0.5 + + + + https://supabase.com/docs/guides/platform/custom-domains + weekly + 0.5 + + + + https://supabase.com/docs/guides/platform/database-size + weekly + 0.5 + + + + https://supabase.com/docs/guides/platform/going-into-prod + weekly + 0.5 + + + + https://supabase.com/docs/guides/platform/http-status-codes + weekly + 0.5 + + + + https://supabase.com/docs/guides/platform/logs + weekly + 0.5 + + + + https://supabase.com/docs/guides/platform/metrics + weekly + 0.5 + + + + https://supabase.com/docs/guides/platform/migrating-and-upgrading-projects + weekly + 0.5 + + + + https://supabase.com/docs/guides/platform/network-restrictions + weekly + 0.5 + + + + https://supabase.com/docs/guides/platform/performance + weekly + 0.5 + + + + https://supabase.com/docs/guides/platform/permissions + weekly + 0.5 + + + + https://supabase.com/docs/guides/platform/spend-cap + weekly + 0.5 + + + + https://supabase.com/docs/guides/platform/ssl-enforcement + weekly + 0.5 + + + + https://supabase.com/docs/guides/platform/sso + weekly + 0.5 + + + + https://supabase.com/docs/guides/platform/troubleshooting + weekly + 0.5 + + https://supabase.com/docs/guides/integrations/appsmith weekly @@ -559,103 +685,55 @@ - https://supabase.com/docs/guides/platform/access-control + https://supabase.com/docs/guides/resources/examples weekly 0.5 - https://supabase.com/docs/guides/platform/backups + https://supabase.com/docs/guides/resources/glossary weekly 0.5 - https://supabase.com/docs/guides/platform/compute-add-ons + https://supabase.com/docs/guides/self-hosting/docker weekly 0.5 - https://supabase.com/docs/guides/platform/custom-domains + https://supabase.com/docs/guides/storage/access-control weekly 0.5 - https://supabase.com/docs/guides/platform/database-size + https://supabase.com/docs/guides/storage/cdn weekly 0.5 - https://supabase.com/docs/guides/platform/going-into-prod + https://supabase.com/docs/guides/storage/image-transformations weekly 0.5 - https://supabase.com/docs/guides/platform/http-status-codes + https://supabase.com/docs/guides/storage/quickstart weekly 0.5 - https://supabase.com/docs/guides/platform/logs + https://supabase.com/docs/guides/storage/storage-sample weekly 0.5 - https://supabase.com/docs/guides/platform/metrics - weekly - 0.5 - - - - https://supabase.com/docs/guides/platform/migrating-and-upgrading-projects - weekly - 0.5 - - - - https://supabase.com/docs/guides/platform/network-restrictions - weekly - 0.5 - - - - https://supabase.com/docs/guides/platform/performance - weekly - 0.5 - - - - https://supabase.com/docs/guides/platform/permissions - weekly - 0.5 - - - - https://supabase.com/docs/guides/platform/spend-cap - weekly - 0.5 - - - - https://supabase.com/docs/guides/platform/ssl-enforcement - weekly - 0.5 - - - - https://supabase.com/docs/guides/platform/sso - weekly - 0.5 - - - - https://supabase.com/docs/guides/platform/troubleshooting + https://supabase.com/docs/guides/storage/uploads weekly 0.5 @@ -666,6 +744,12 @@ 0.5 + + https://supabase.com/docs/guides/realtime/bring-your-own-database + weekly + 0.5 + + https://supabase.com/docs/guides/realtime/channels weekly @@ -709,49 +793,31 @@ - https://supabase.com/docs/guides/resources/examples + https://supabase.com/docs/guides/api/graphql/graphiql weekly 0.5 - https://supabase.com/docs/guides/resources/glossary + https://supabase.com/docs/guides/api/rest/auto-generated-docs weekly 0.5 - https://supabase.com/docs/guides/self-hosting/docker + https://supabase.com/docs/guides/api/rest/client-libs weekly 0.5 - https://supabase.com/docs/guides/storage/access-control + https://supabase.com/docs/guides/api/rest/generating-types weekly 0.5 - https://supabase.com/docs/guides/storage/cdn - weekly - 0.5 - - - - https://supabase.com/docs/guides/storage/image-transformations - weekly - 0.5 - - - - https://supabase.com/docs/guides/storage/quickstart - weekly - 0.5 - - - - https://supabase.com/docs/guides/storage/storage-sample + https://supabase.com/docs/guides/auth/quickstarts/react weekly 0.5 @@ -804,114 +870,36 @@ 0.5 - - https://supabase.com/docs/guides/auth/social-login/auth-apple - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/social-login/auth-azure - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/social-login/auth-bitbucket - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/social-login/auth-discord - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/social-login/auth-facebook - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/social-login/auth-github - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/social-login/auth-gitlab - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/social-login/auth-google - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/social-login/auth-keycloak - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/social-login/auth-linkedin - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/social-login/auth-notion - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/social-login/auth-slack - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/social-login/auth-spotify - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/social-login/auth-twitch - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/social-login/auth-twitter - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/social-login/auth-workos - weekly - 0.5 - - - - https://supabase.com/docs/guides/auth/social-login/auth-zoom - weekly - 0.5 - - https://supabase.com/docs/guides/auth/sso/auth-sso-saml weekly 0.5 + + https://supabase.com/docs/guides/database/postgres/dropping-all-tables-in-schema + weekly + 0.5 + + + + https://supabase.com/docs/guides/database/postgres/first-row-in-group + weekly + 0.5 + + + + https://supabase.com/docs/guides/database/postgres/indexes + weekly + 0.5 + + + + https://supabase.com/docs/guides/database/postgres/which-version-of-postgres + weekly + 0.5 + + https://supabase.com/docs/guides/functions/examples/cloudflare-turnstile weekly @@ -972,78 +960,6 @@ 0.5 - - https://supabase.com/docs/guides/database/api/generating-types - weekly - 0.5 - - - - https://supabase.com/docs/guides/database/postgres/dropping-all-tables-in-schema - weekly - 0.5 - - - - https://supabase.com/docs/guides/database/postgres/first-row-in-group - weekly - 0.5 - - - - https://supabase.com/docs/guides/database/postgres/indexes - weekly - 0.5 - - - - https://supabase.com/docs/guides/database/postgres/which-version-of-postgres - weekly - 0.5 - - - - 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/database/extensions/http weekly @@ -1201,19 +1117,157 @@ - https://supabase.com/docs/guides/platform/sso/azure + https://supabase.com/docs/guides/getting-started/quickstarts/flutter weekly 0.5 - https://supabase.com/docs/guides/platform/sso/gsuite + https://supabase.com/docs/guides/getting-started/quickstarts/nextjs weekly 0.5 - https://supabase.com/docs/guides/platform/sso/okta + 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/redwoodjs + 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/getting-started/openai/vector-search + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/social-login/auth-apple + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/social-login/auth-azure + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/social-login/auth-bitbucket + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/social-login/auth-discord + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/social-login/auth-facebook + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/social-login/auth-github + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/social-login/auth-gitlab + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/social-login/auth-google + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/social-login/auth-keycloak + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/social-login/auth-linkedin + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/social-login/auth-notion + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/social-login/auth-slack + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/social-login/auth-spotify + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/social-login/auth-twitch + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/social-login/auth-twitter + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/social-login/auth-workos + weekly + 0.5 + + + + https://supabase.com/docs/guides/auth/social-login/auth-zoom weekly 0.5 @@ -1303,19 +1357,25 @@ - https://supabase.com/docs/guides/realtime/extensions/broadcast + https://supabase.com/docs/guides/platform/sso/azure weekly 0.5 - https://supabase.com/docs/guides/realtime/extensions/postgres-changes + https://supabase.com/docs/guides/platform/sso/gsuite weekly 0.5 - https://supabase.com/docs/guides/realtime/extensions/presence + https://supabase.com/docs/guides/platform/sso/okta + weekly + 0.5 + + + + https://supabase.com/docs/guides/resources/migrating-to-supabase/amazon-rds weekly 0.5 @@ -1350,6 +1410,12 @@ 0.5 + + https://supabase.com/docs/guides/self-hosting/analytics/config + weekly + 0.5 + + https://supabase.com/docs/guides/self-hosting/auth/config weekly @@ -1368,6 +1434,24 @@ 0.5 + + https://supabase.com/docs/guides/realtime/extensions/broadcast + weekly + 0.5 + + + + https://supabase.com/docs/guides/realtime/extensions/postgres-changes + weekly + 0.5 + + + + https://supabase.com/docs/guides/realtime/extensions/presence + weekly + 0.5 + + https://supabase.com/docs/reference/javascript/initializing weekly @@ -1404,6 +1488,12 @@ 0.5 + + https://supabase.com/docs/reference/javascript/auth-signinwithsso + weekly + 0.5 + + https://supabase.com/docs/reference/javascript/auth-signout weekly @@ -1898,6 +1988,18 @@ 0.5 + + https://supabase.com/docs/reference/javascript/storage-from-createsigneduploadurl + weekly + 0.5 + + + + https://supabase.com/docs/reference/javascript/storage-from-uploadtosignedurl + weekly + 0.5 + + https://supabase.com/docs/reference/javascript/storage-from-getpublicurl weekly @@ -3578,6 +3680,48 @@ 0.5 + + https://supabase.com/docs/reference/cli/supabase-sso + weekly + 0.5 + + + + https://supabase.com/docs/reference/cli/supabase-sso-info + weekly + 0.5 + + + + https://supabase.com/docs/reference/cli/supabase-sso-add + weekly + 0.5 + + + + https://supabase.com/docs/reference/cli/supabase-sso-remove + weekly + 0.5 + + + + https://supabase.com/docs/reference/cli/supabase-sso-update + weekly + 0.5 + + + + https://supabase.com/docs/reference/cli/supabase-sso-list + weekly + 0.5 + + + + https://supabase.com/docs/reference/cli/supabase-sso-show + weekly + 0.5 + + https://supabase.com/docs/reference/cli/supabase-vanity-subdomains weekly 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 e6c7aa2fe4f..46001ec1f17 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 @@ -69,7 +69,7 @@ Why is this useful? Once we have generated embeddings on multiple texts, it is t ## Embeddings in practice -At a small scale, you could store your embeddings in a CSV file, load them into Python, and use a library like `numPy` to calculated similarity between them using something like cosine distance or dot product. OpenAI has a cookbook [example](https://github.com/openai/openai-cookbook/blob/main/examples/Semantic_text_search_using_embeddings.ipynb) that does just that. Unfortunately this likely won't scale well: +At a small scale, you could store your embeddings in a CSV file, load them into Python, and use a library like `numPy` to calculate similarity between them using something like cosine distance or dot product. OpenAI has a cookbook [example](https://github.com/openai/openai-cookbook/blob/main/examples/Semantic_text_search_using_embeddings.ipynb) that does just that. Unfortunately this likely won't scale well: - What if I need to store and search over a large number of documents and embeddings (more than can fit in memory)? - What if I want to create/update/delete embeddings dynamically? diff --git a/apps/www/_blog/2023-04-14-dbdev.mdx b/apps/www/_blog/2023-04-14-dbdev.mdx new file mode 100644 index 00000000000..f50a74c42a4 --- /dev/null +++ b/apps/www/_blog/2023-04-14-dbdev.mdx @@ -0,0 +1,248 @@ +--- +title: 'dbdev: PostgreSQL Package Manager' +description: We're publicly previewing dbdev, a PostgreSQL package manager. +launchweek: 7 +tags: + - launch-week + - postgres +date: '2023-04-14' +published_at: '2023-04-14T08:00:00.000-07:00' +toc_depth: 3 +author: oli_rice,daltjoh-aws +image: launch-week-7/day-5-one-more-thing/day-5-dbdev-og.jpg +thumb: launch-week-7/day-5-one-more-thing/day-5-dbdev-thumb.jpg +--- + +Today we’re publicly previewing [**`database.dev`**](https://database.dev), a PostgreSQL package manager. At this stage the package registry is read-only. We've preloaded it with a handful of packages, or pglets (PostGres appLETs), to showcase some of the more interesting possibilities. + +db dev landing page + +`dbdev` fills the same role for PostgreSQL as `npm` for JavaScript, `pip` for Python and `cargo` for Rust in that it enables publishing libraries and applications for repeatable deployment. We'll be releasing the tooling necessary for third-parties to publish `pglets` to the registry once we’ve collected some community feedback and incorporate any great new ideas. Our goal is to create an [open ecosystem](https://github.com/supabase/dbdev) for packaging and discovering SQL. + +The initial preview is compatible with [new projects](https://database.new) on the Supabase platform. It can also be installed on any PostgreSQL instance that support [`pg_tle`](https://github.com/aws/pg_tle) and [`pgsql-http`](https://github.com/pramsey/pgsql-http). + +## Get Started with dbdev + +The in-database client is the easiest way to get started. You can setup the installer by executing the SQL snippet available at [database.dev/installer](https://database.dev/installer). + +Once the `dbdev` client is present, `pglet`s can be installed from the registry as shown below: + +```sql +-- Load the package from the package index +select + dbdev.install ('olirice-asciiplot'); + +-- Enable the extension +create extension "olirice-asciiplot" version '0.2.1'; +``` + +You can explore all available `pglet`s on [database.dev](https://database.dev). + +Notice that PostgreSQL sees the [`olirice-asciiplot`](https://database.dev/olirice/asciiplot) `pglet` as a native extension, rather than a raw snippet of SQL. That approach allows us to leverage PostgreSQL's builtin tooling for extension management. + +With our extension installed, you can use it like any other PostgreSQL extension. Continuing with the [`olirice-asciiplot`](https://database.dev/olirice/asciiplot) example, we can call the `scatter` function it provides to create an ASCII scatterplot: + +```sql +select + scatter( + val::numeric, -- x + val::numeric, -- y + 'stonks!', -- title + 15, -- height + 50 -- width + ) +from + generate_series(1,10) z(val); +/* + stonks! +---------------------------------------------- +| * +| +| * +| * +| +| * +| +| * +| * +| +| * +| +| * +| * +*/ +``` + +PostgreSQL's extension tooling is excellent, but it predates some practices learned from best-in-class package indexes like crates.io. To give developers a more modern development experience, we opted to layer additional strictness on top of what PostgreSQL imposes: + +### Versioning + +The extension system has full support for versioning and migrations. Officially, PostgreSQL has loose constraints for version names. We made the choice to enforce a lite version of [Semantic Versioning](https://semver.org) that restricts version numbers to `major.minor.patch` so authors can communicate bug-fixes, features, and breaking changes in a familiar way. + +### Namespaces + +Two common challenges faced by package indexes are name squatting and typo squatting. + +- Name squatting: reserving names for future use +- Typo squatting: reserving misspelling of existing package + +The ethics of name squatting get dicey at scale while typo squatting is widely viewed as malicious behavior. To mitigate both issues, all `pglet`s published to [database.dev](https://database.dev) are namespaced to their owning organization or user’s handle. For example a `pglet` named [`olirice-index_advisor`](https://database.dev/olirice/index_advisor) was created by the account `olirice` under the name `index_advisor`. If another user, `some_user`, forks and republishes the project, it would be available under `some_user-index_advisor`. Problem solved ✅ + +## Running on Supabase + +[database.dev](https://database.dev) is not coupled to the Supabase platform. `dbdev` can load SQL libraries on any PostgreSQL instance with the required base extensions. However, using `dbdev` in tandem with Supabase yields some extra possibilities. + +Supabase reflects APIs directly from your database’s structure, so a `pglet` can contain an entire stateful application, pre-configured with authentication, REST, GraphQL, and realtime change data capture all baked in! + +For example, our friends at [LangChain](https://python.langchain.com/en/latest/index.html) published a Supabase backend for their docs search tool that uses a hybrid of document embeddings and full text search to find relevant documents for a user’s query + +Its available at [`langchain-hybrid_search`](https://database.dev/langchain/hybrid_search) and here’s how you’d set it up: + +```sql +select + dbdev.install ('langchain-hybrid_search'); + +create extension if not exists vector; + +create extension "langchain-hybrid_search" schema public version '1.0.0'; +``` + +That creates the relevant `documents` table and associated search functions. Then, you can immediately hit it from your front end for best-in-class document search. + +```jsx +import { OpenAIEmbeddings } from 'langchain/embeddings/openai' +import { createClient } from '@supabase/supabase-js' +import { SupabaseHybridSearch } from 'langchain/retrievers/supabase' + +const privateKey = process.env.SUPABASE_PRIVATE_KEY +if (!privateKey) throw new Error(`Expected env var SUPABASE_PRIVATE_KEY`) + +const url = process.env.SUPABASE_URL +if (!url) throw new Error(`Expected env var SUPABASE_URL`) + +export const run = async () => { + const client = createClient(url, privateKey) + + const embeddings = new OpenAIEmbeddings() + + const retriever = new SupabaseHybridSearch(embeddings, { + client, + // Below are the defaults, expecting that you set up your supabase table and functions according to the guide above. Please change if necessary. + similarityK: 2, + keywordK: 2, + tableName: 'documents', + similarityQueryName: 'match_documents', + keywordQueryName: 'kw_match_documents', + }) + + const results = await retriever.getRelevantDocuments('hello bye') + + console.log(results) +} +``` + +## Package Highlights + +That's it for the [`dbdev`](http://database.new) announcement, but a package index is less interesting than what you can do with it! In that vein, the following highlights a few of packages I thought were interesting enough to callout: + +### burggraf-pg_headerkit + +[`burggraf-pg_headerkit`](https://database.dev/burggraf/pg_headerkit) is a toolkit for adding advanced features to PostgREST APIs (including Supabase REST): + +- rate limiting +- IP allowlisting/denylisting +- request logging + +and more. + +For example, you could apply a deny listing to your API using `hdr.in_deny_list()` in a row level security policy or view: + +```sql +select + * +from + app.memos +where + not hdr.in_deny_list (); +``` + +### olirice-index_advisor + +[`olirice-index_advisor`](https://database.dev/olirice/index_advisor) is one of the projects we cut from [Launch Week 7](/launch-week). It is simple tool that takes a query and recommends indexes to minimize the “total_cost” according to the query’s [explain plan](https://www.postgresql.org/docs/current/using-explain.html). + +We ultimately ran out of time to squeeze the feature in, but the optimizer works just fine: + +```sql +select dbdev.install('olirice-index_advisor'); +create extension if not exists hypopg; +create extension "olirice-index_advisor"; + +-- Create a dummy table +create table account( + id int primary key, + name text +); + +-- Search for indexes to optimize "select id from account where name = 'adsf'" +select + * +from + index_advisor($$select id from account where name = 'Foo'$$) +``` + +which shows + +```markdown +| startup_cost_before | startup_cost_after | total_cost_before | total_cost_after | index_statements | +| ------------------- | ------------------ | ----------------- | ---------------- | ----------------------------------------------------- | +| 0.00 | 1.17 | 25.88 | 6.40 | {"CREATE INDEX ON public.account USING btree (name)"} | +``` + +In other words, it recommends the index `CREATE INDEX ON public.account USING btree (name)` which is expected to reduce the total cost from 25.88 to 6.40 for a 4x decrease. + +`olirice-index_advisor` is compatible with tables, views, and materialized views. It can also see through views to find relevant indexes on underlying tables, and supports generic query arguments. For example, `$1` in `select id from account where name = $1`, which makes it compatible with queries from `pg_stat_statements` and queries generated by the REST API. + +Keep an eye open for it in Launch Week 8. + +### michelp-adminpack + +[`michelp-adminpack`](https://database.dev/michelp/adminpack) is a collection of tools helpful for administrating your database that we often use internally at Supabase. It holds views for reviewing useful info for debugging and optimizing performance like duplicate indexes, index usage, and table size, to name a few. + +For example, to identify potentially unused indexes that can be dropped, you could use the `index_usage` view, which has columns for: + +| Column | Type | +| --------------- | ------ | +| schemaname | name | +| tablename | name | +| num_rows | bigint | +| table_size | text | +| index_name | name | +| index_size | text | +| unique | text | +| number_of_scans | bigint | +| tuples_read | bigint | +| tuples_fetched | bigint | + +## Limitations + +There are several procedural languages (PL) that can be embedded in PostgreSQL and used to define functions. The ones that ship with stock PostgreSQL are `SQL`, and `pl/pgSQL` but there others that can be installed separately, including `pl/v8` for JavaScript, or `pl/perl` for Perl. A **trusted** language has been restricted to remove potentially hazardous functionality like access to the network stack and file system. `pl/v8` and `pl/perl` are examples of trusted languages. In contrast, `pl/python3u` is **untrusted**. + +A [Trusted Language Extension (TLE)](https://github.com/aws/pg_tle) is a [PostgreSQL extension](https://www.postgresql.org/docs/current/extend-extensions.html), written exclusively using trusted languages. In some ways that makes them less flexible than classic extensions, which can have C language components (more on that in a second). The advantage to TLEs is that they don't require direct access to the PostgreSQL server’s file system to install. That enables TLEs to be installed by end-users rather than by database administrators or hosting providers. TLEs are the enabling technology that allows a package manager like `dbdev` to function on hosted PostgreSQL platforms like Supabase. + +For a more in-depth explanation of Trusted Language Extensions checkout [AWS's pg_tle on Supabase blog post](https://aws.amazon.com/blogs/opensource/supabase-makes-extensions-easier-for-developers-with-trusted-language-extensions-for-postgresql/) or dive into the code at [github.com/aws/pg_tle](https://github.com/aws/pg_tle). + +A recent development in the PostgreSQL extension ecosystem is the 1.0 release of a new trusted language, [`pl/rust`](https://github.com/tcdi/plrust), allowing users to define SQL functions written in Rust. As a compiled language, `pl/rust` functions can execute an order of magnitude faster than `pl/pgSQL` for computationally heavy workloads. That closes the biggest capability gap between native extensions with C components and TLEs. `pl/rust` hasn’t released to Supabase yet, but we’re excited about rolling it out in the coming weeks. + +## Please Give Feedback + +As this is a preview, we anticipate that there may be a few rough edges. If you do take the time to explore `dbdev` at this stage, please contribute to its development at [github.com/supabase/dbdev](https://github.com/supabase/dbdev). + +We are particularly interested in hearing about: + +1. Any issues or bugs you encounter +2. Feature requests and suggestions for improvement +3. Contributions in the form of code, documentation, or testing diff --git a/apps/www/_blog/2023-04-14-launch-week-7-community-highlights.mdx b/apps/www/_blog/2023-04-14-launch-week-7-community-highlights.mdx new file mode 100644 index 00000000000..6e585199759 --- /dev/null +++ b/apps/www/_blog/2023-04-14-launch-week-7-community-highlights.mdx @@ -0,0 +1,199 @@ +--- +title: 'Launch Week 7 Community Highlights' +launchweek: 7 +tags: + - launch-week +date: '2023-04-14' +published_at: '2023-04-14T07:00:00.000-07:00' +toc_depth: 3 +author: paul_copplestone +image: launch-week-7/day-5-community-highlights/day-5-community-highlights-og.jpg +thumb: launch-week-7/day-5-community-highlights/day-5-community-highlights-thumb.jpg +--- + +Supabase is a collaborative company. We work with, sponsor, and support as many open source tools as possible. Here’s a few of this community highlights from the past 3 months. + +## Ecosystem Partners + +![Ecosystem Partners](/images/blog/launch-week-7/day-5-community-highlights/day-5-community-highlights-partners.png) + +Our [Integrations Marketplace](/docs/guides/integrations) continues to grow. This past few months has brought a number of new partners and collaborations: + +### AWS RDS + +We’ve worked with the RDS team to build out the pg_tle extension and tooling and integrating it into Supabase. These changes are a stepping stone towards running the Supabase stack on AWS RDS. Special shoutout to [@jkatz](https://github.com/jkatz), who was an instrumental collaborator and the rest of the RDS team who have been helping to transition [PL/Rust](https://github.com/tcdi/plrust) into a Trusted Language. + +[Read the press announcement on Amazon.com.](https://aws.amazon.com/blogs/opensource/supabase-makes-extensions-easier-for-developers-with-trusted-language-extensions-for-postgresql/) + +[Read about pg_tle at Supabase and our collaboration with AWS.](https://www.notion.so/6f1bac83308846488ee7b01ae5c20200) + +[Read about our experimental database registry, database.dev.](/blog/dbdev) + +### Clickhouse + +Along with our new Clickhouse [Foreign Data Wrapper](https://supabase.github.io/wrappers/clickhouse/), our friends at Clickhouse created guides showing the bidirectional capabilities between Supabase Postgres and Clickhouse Cloud. This is a perfect pairing when you’re consolidating your operational data with your analytical data, or if you have long-running queries that you need to offload to an analytical database like Clickhouse. + +[Read the guide.](https://clickhouse.com/blog/migrating-data-between-clickhouse-postgres) + +### LangChain + +It’s always fun when two open source communities join forces. LangChain is an open source framework for developing applications powered by language models. This week, to support the Supabase AI Hackathon, they released a [Supabase x Langchain template](https://github.com/langchain-ai/langchain-template-supabase), one of the fastest ways to build AI applications. Their community recently made two contributions for Supabase: adding Supabase as a [Vector Store](https://js.langchain.com/docs/modules/indexes/vector_stores/integrations/supabase), and a neat [Hybrid Search](https://js.langchain.com/docs/modules/indexes/retrievers/supabase-hybrid) algorithm using Postgres’ Full Text Search. The also + +[Read the integration docs.](https://js.langchain.com/docs/modules/indexes/vector_stores/integrations/supabase) + +[Clone the template.](https://github.com/langchain-ai/langchain-template-supabase) + +### Vercel + OpenAI + +Do we even need to introduce Vercel and OpenAI? We have a new template in the [Vercel Marketplace](https://vercel.com/templates/next.js/openai-doc-search-starter) for creating GPT-search for your MDX files. The templates takes all the `.mdx` files in the `pages`directory and processes them to use as custom context within [OpenAI Text Completion](https://platform.openai.com/docs/guides/completion) prompts. + +[View the template.](https://vercel.com/templates/next.js/openai-doc-search-starter) + +### Doppler + +Doppler is a fully managed SecretOps platform that helps centralize, orchestrate, and rotate secrets in any environment. Your team can mitigate and remediate risks while using tools that fit natively into existing developer workflows.They just released an integration to automatically sync all of your team's secrets to Supabase. + +[Check out the docs.](https://docs.doppler.com/docs/supabase) + +### Redwood + +The RedwoodJS team has contributed a new framework [Quick Start](/docs/guides/getting-started/quickstarts/redwoodjs) to our docs that will get you from zero to fullstack app with Prisma in just 2 minutes. Big shoutout to [@dthyresson](https://github.com/dthyresson) who continues to be a valuable contributor across many open source communities. + +[Read the QuickStart.](/docs/guides/getting-started/quickstarts/redwoodjs) + +### Dart Edge for Supabase Edge Functions + +Dart Edge, built by [Invertase](https://invertase.io/), allows developers to write edge functions in Dart. Previously, Flutter developers had to use TypeScript for their edge functions, as it was the only supported language. However, with Dart Edge, Flutter developers can write backend code using their favorite programming language, Dart! + +[Check out the guide.](/docs/guides/functions/dart-edge) + +### **T3 Turbo x Supabase** + +T3 Turbo is a type-safe, full-stack template to create Next.js and Expo React Native applications. Using our recent [Mobile Auth updates](/blog/supabase-auth-sso-pkce), the T3 community has helped build the [Supabase Create T3 Turbo template](https://github.com/supabase-community/create-t3-turbo), the fastest and easiest way to get started with Supabase and the T3 Stack. Huge shout out to [Julius](https://twitter.com/jullerino) who single-handedly created the template! + +[Use the template.](https://github.com/supabase-community/create-t3-turbo) + +## Self-hosting with Digital Ocean and Stackgres + +![Self-hosting with Digital Ocean and Stackgres](/images/blog/launch-week-7/day-5-community-highlights/day-5-community-highlights-digitalocean-and-stackgres.png) + +This Launch Week had a big focus on self-hosting, adding support for self-hosted [Logs](/blog/supabase-logs-self-hosted) and [Edge Functions](/blog/edge-runtime-self-hosted-deno-functions). Along with our official [self-hosting guides](/docs/guides/self-hosting) (and existing community support for [AWS](https://github.com/supabase-community/supabase-on-aws), [k8s](https://github.com/supabase-community/supabase-kubernetes), [Traefik](https://github.com/supabase-community/supabase-traefik), and [Terraform](https://github.com/supabase-community/supabase-terraform)), we have a couple of new entrants into the community: + +- [Digital Ocean](https://supabase-on-do.product-docs.pages.dev/developer-center/hosting-supabase-on-digitalocean/) +- [Stackgres](https://stackgres.io/blog/running-supabase-on-top-of-stackgres/) + +We’re looking for more self-hosting maintainers, especially for the self-hosted guides. Everything we do is MIT, Apache2, or PostgreSQL licensed, but our team is relatively small and we don’t have expertise for every deployment strategy that our community might want. If you are willing to help out on a regular basis please reach out! + +## Postgres Extensions and improvements + +![Postgres Extensions and improvements](/images/blog/launch-week-7/day-5-community-highlights/day-5-community-highlights-extensions.png) + +The community continues to add and improve the extensions and configuration for our [Postgres image](https://github.com/supabase/postgres). Here are a few of the crowd favorites: + +### pgvector: Open-source vector similarity search for Postgres + +Just as it says on the label: `pgvector` enables vector functionality within Postgres. It’s been, by far, our most popular addition to date as it can be used to store OpenAI embeddings and serves as an alternative to Pinecone and Milvus. + +[Read the announcement.](/blog/openai-embeddings-postgres-vector) + +### **HypoPG: Hypothetical indexes** + +HypoPG allows you to create hypothetical indexes that are visible to the PostgreSQL query +planner, with no resource cost (CPU, disk, memory). This allows users to “try out” an index without waiting for the server to build them. We have big plans for this extension - we’ll integrate this functionality into the dashboard with an Index Advisor to help you optimize slow-running queries. + +[Read the docs.](/docs/guides/database/extensions/hypopg) + +### pg_tle: Install your own extensions + +We’ve been working with the RDS team to make Postgres _even more_ extensible. While you typically need to wait for Cloud Providers to add extension support to their Postgres offering, pg*tle is a step towards making this \_user managed*. We’ve even built a proof-of-concept registry (similar to NPM or Cargo) where you can upload extensions and share them with the community. + +Link to blog post. + +### PGroonga v3.0 + +PGroonga is an extension implementing full-text search in multiple languages. In v3, PGroonga becomes fully compatible with the Supabase _extensions_ schema deprecating the need to explicitly write a schema for operators. It also increases support for _text_ and _varchar_ array types. They just released this in time for Supabase Launch Week, so we’ll roll it out to the platform in the next month. + +[Read the announcement.](https://groonga.org/en/blog/2023/04/13/pgroonga-3.0.0.html) + +### LZ4 compression + +PG has supported LZ4 page and row compression since v14, with WAL compression added in v15. LZ4 is faster than the standard pglz method. Supabase is now fully-compatible with this option. This is especially useful for TOAST values and WAL compression. + +### ICU compatibility + +Supabase Postgres has been configured with ICU support. This makes it possible to use ICU locales as collation providers. ICU supports many languages and makes the ordering of text type attributes according to these language rules. + +## Client Libraries and utilities + +![Client Libraries and utilities](/images/blog/launch-week-7/day-5-community-highlights/day-5-community-highlights-libraries.png) + +It’s becoming easier to build applications with any language. + +### Support for Swift, Python, and C# + +In the past few months, the community has rallied and shipped 3 new client libraries, complete with Docs: + +- Swift: + - [Documentation](/docs/reference/swift/introduction) | [Source Code](https://github.com/supabase-community/supabase-swift) + - Shout-out to: [grsouza](https://github.com/grsouza) & [@maail](https://github.com/maail) +- Python: + - [Documentation](/docs/reference/python/initializing) | [Source Code](https://github.com/supabase-community/supabase-py) + - Shout-out to: @ +- C# + - [Documentation](/docs/reference/csharp/introduction) | [Source Code](https://github.com/supabase-community/supabase-csharp) + - Maintainers: [@acupofjose](https://github.com/acupofjose), [@veleek](https://github.com/veleek), and [@rhuanbarros](https://github.com/rhuanbarros) + +These libraries are in various stages of readiness, so if you find anything that can be improved don’t hesitate to jump into the source code and help out. + +### Supabase Cache Helpers + +[Philipp](https://github.com/psteinroe) just released 1.0 of “Supabase Cache Helpers”, a collection of cache utilities for Supabase. With just a line of code, you can simplify the logic of **f**etching, subscribing to updates, and mutating data as well as storage objects in your project, and have all the amazing features of SWR or React Query. The cache helpers parse queries into a unique and definite query keys, automatically populating the query cache with every mutation using implicit knowledge of the schema. + +[Check it out on GitHub.](https://github.com/psteinroe/supabase-cache-helpers) + +[Read the docs.](https://supabase-cache-helpers.vercel.app/) + +### SupaShim by Roboflow + +The team at [Roboflow](https://roboflow.com/) just released [`supashim`](https://github.com/roboflow/supashim), which hooks into the Firebase calls from your app and translates them into the Supabase equivalents. With supashim, you can take an existing Firebase app, swap out the `firebase` global for `supashim`, then point it to a self-hosted Supabase instance without changing any application code. Pretty neat! + +[Check it out on GitHub.](https://github.com/roboflow/supashim) + +## Giving back + +We’ve been upstreaming as many changes as possible for Supabase stack. + +### Postgres Patches + +We’ve submitted a number of patches to the Postgres Core: + +- Added the “USER SET” parameter values for `pg_db_role_setting`. This GUC variable lets ordinary roles set placeholder variables, when permission requirements are not known yet [[Patch](https://www.postgresql.org/message-id/flat/20230102154240.GL1153%40telsasoft.com#c04239ecde38752a3132236306784250)] +- Added support for custom tuple slots in the custom executor nodes. This is useful for custom table access methods. [[Patch](https://www.postgresql.org/message-id/flat/CAPpHfduJUU6ToecvTyRE_yjxTS80FyPpct4OHaLFk3OEheMTNA%40mail.gmail.com)] +- Optimizations for LWlock waiting queue scalability. Long LWlock wait queues were not effective at unlocking. We’ve submitted proposals to make the queue lockless (still under community consideration). [Discussion [one](https://www.postgresql.org/message-id/flat/CALT9ZEEz%2B%3DNepc5eti6x531q64Z6%2BDxtP3h-h_8O5HDdtkJcPw%40mail.gmail.com), [two](https://www.postgresql.org/message-id/flat/20221120204310.xywrhyxyytsajuuq%40awork3.anarazel.de), [three](https://www.postgresql.org/message-id/flat/20221027165914.2hofzp4cvutj6gin%40awork3.anarazel.de)] + +### OrioleDB Patches + +We continue to support the development of [OrioleDB](https://github.com/orioledb/orioledb), who are building scalable storage mechanisms for Postgres using table access methods. The OrioleDB extension is now version [Alpha12](https://github.com/orioledb/orioledb/releases/tag/alpha12) and compatible with Postgres 15. + +This release includes various improvements and fixes, including parallel sequential scan of OrioleDB relations. This allows multi-CPU systems to speed up select queries that involve sequential scans. It’s an analogue of heap parallel scan in Postgres core but for index-organized tables. With this base, we’re now implementing methods to build Orioledb indexes using many parallel workers. + +[Read the release notes.](https://github.com/orioledb/orioledb/releases/tag/alpha12) + +## Contributors + +We also want to highlight all the humans who have made meaningful contributions to the Supabase ecosystem since our last Launch Week: + +- [Gary](https://github.com/GaryAustin1) and [Olyno](https://github.com/olyno) - official moderators of our [Discord](https://discord.supabase.com) and overall incredibly helpful people. The community would not be the same without them +- [Bruno D'Luka](https://github.com/bdlukaa) - Caring for the details of Flutter SDK so that we can provide the best DX for Flutter devs +- [CodewithGuillaume](https://twitter.com/blackevilgoblin) - Creating a series of YouTube videos explaining different components of Supabase. +- [Daniel Mossaband](https://github.com/DanMossa) - Worked on fixing bugs and adding features to bring the mobile auth to Supabase +- [David Plugge](https://github.com/david-plugge) - Working on improving the [auth-helpers](https://github.com/supabase/auth-helpers) and fixing issues users report. +- [Jonathan Wilke](https://twitter.com/jonathan_wilke) - built [SupaStarter.dev](https://supastarter.dev/). A SaaS for building SaaSes. +- [grsouza](https://github.com/grsouza) & [Maail](https://github.com/maail) - Built the Swift libraries and documentation. +- [Raphaël Moreau](https://twitter.com/rphlmr) - Built the [supa-stripe-stack](https://github.com/rphlmr/supa-stripe-stack) for Remix to get started building your SaaS in one command. Also the creator the [supa-fly-stack](https://github.com/rphlmr/supa-fly-stack) and [supa-remix-stack](https://github.com/rphlmr/supa-remix-stack) +- [Vinzent](https://github.com/Vinzent03) - Constantly smashing it on the Flutter SDK adding major features such as MFA. +- [Tiniscule](https://twitter.com/tiniscule) - for his open source [Supabase Starter kit](https://github.com/usebasejump/basejump). + +## Community + +And you, our community. Thank you for using Supabase, reading our blog posts, and showing your support. With [over 48,000 GitHub stars](https://github.com/supabase/supabase), we are now in the top 180 most-popular repositories in all of GitHub. We still have a long way to go, but it’s a lot more fun doing it collaboratively. diff --git a/apps/www/_blog/2023-04-14-pg-tle.mdx b/apps/www/_blog/2023-04-14-pg-tle.mdx new file mode 100644 index 00000000000..52aef363a48 --- /dev/null +++ b/apps/www/_blog/2023-04-14-pg-tle.mdx @@ -0,0 +1,60 @@ +--- +title: 'Trusted Language Extensions for Postgres' +launchweek: 7 +tags: + - launch-week + - postgres +date: '2023-04-14' +published_at: '2023-04-14T07:00:00.000-07:00' +to_depth: 3 +author: michel,daltjoh-aws +image: launch-week-7/day-5-supabase-pg-tle/day-5-postgres-tle-thumb.jpg +thumb: launch-week-7/day-5-supabase-pg-tle/day-5-postgres-tle-thumb.jpg +--- + +Most PostgreSQL cloud providers, such as Supabase and AWS RDS, do not allow users to install Postgres extensions into their databases until they have been rigorously vetted. Because of this, many useful Postgres extensions cannot be used on cloud platforms. To solve this, the RDS team has developed a new kind of extension called a **Trusted Language Extension** (TLE). + +A TLE is a Postgres extension that is written in a Trusted Language, and it can be installed in any Postgres provider that has the [pg_tle](https://github.com/aws/pg_tle) extension installed. The goal is to make more extensions available to developers, even if your database is hosted on the cloud. + +## How Postgres extensions work + +Before exploring what a Trusted Language Extension is, let’s cover the basics of Postgres Extensions and the notion of “Trusted Languages” in general. + +A Postgres Extension is a bundle of SQL and other code, primarily [Data Definition Language](https://www.postgresql.org/docs/current/ddl.html) (DDL) code installed into the server’s filesystem, and instantiated in a database with the [`CREATE EXTENSION`](https://www.postgresql.org/docs/current/sql-createextension.html) command. This code can contain any SQL, but almost always includes additional function objects created with the [`CREATE FUNCTION`](https://www.postgresql.org/docs/current/sql-createfunction.html) DDL statement that expose the core features of the extension to the database in some programming language, including an external library function written in C. + +Extensions provide a variety of additional functionality and allow third-party feature distribution without requiring changes to the Postgres database itself - including new data types, storage engines, helper functions, and even entire language runtimes like Javascript or Python. + +Some examples of popular Postgres extensions include: + +- [PostGIS](https://postgis.net/): for working with geospatial data +- [Timescale DB](https://www.timescale.com/): for working with timeseries data +- [Citus](https://www.citusdata.com/): for working with distributed tables +- [plv8](https://plv8.github.io/): for running Node.js inside Postgres +- [pgsodium](https://github.com/michelp/pgsodium): for accessing the libsodium encryption API + +Before extensions can be created, they must first be installed on the filesystem of the database server, which is an important security measure because in some cases extensions may require external libraries and can interact with Postgres internals. Their installation is something that requires careful consideration. + +## Trusted vs Untrusted + +Many extensions provide functions whose implementation is written in C, and creating them in a database means that the compiled C code is “dynamically linked” into your running Postgres process. These dynamically-loaded libraries can now access every aspect of your running database process, right down to raw memory. They are essentially database superusers on steroids. Because of this, C is an “untrusted language” and installing extensions written in C requires filesystem access. + +However there are several _trusted_ languages in Postgres that don’t provide raw access to process memory, the filesytem, or other system functions. These languages obey the security rules of Postgres. The most obvious example of these trusted languages is SQL itself. Another built-in trusted language in Postgres is called [pl/pgsql](https://www.postgresql.org/docs/current/plpgsql.html). It looks a lot like SQL but with some imperative programming features like `IF` blocks and `FOR` loops. The aforementioned plv8 is also a trusted language, as are the languages [pl/perl](https://www.postgresql.org/docs/current/plperl.html) and [pl/tcl](https://www.postgresql.org/docs/current/pltcl.html). Other languages like [pl/python](https://www.postgresql.org/docs/current/plpython.html) are **_not_** trusted because of the way they are integrated into Postgres, they do not obey the “rules” of Postgres security, and so are not included in most cloud provider platforms since they would allow database users to effectively act as a superuser. + +## Trusted Language Extensions + +Near the end of 2022, we got a surprise gift from the team at Amazon Web Services, a new Postgres extension called `pg_tle`, that allows you to **Trusted Language Extensions (TLEs).** A TLE is just like a regular Postgres extension, except that **does not need to be installed on the server filesystem** it is written in a **trusted language** you can install extensions from any database client using the function `pgtle.install_extension()`, just like you can create other objects like tables and views. + +Of course, TLEs _must_ be written in trusted languages as described above, hence the name, so no extensions that are written in C can be TLEs. There are still many extensions that are already written in trusted languages, and soon many more to come with some exciting progress in more performant trusted languages like [pl/rust](https://github.com/tcdi/plrust) which recently reached an official 1.0.0 version release. By removing the constraint that extensions must be installed on the server filesystem, TLEs open up a whole new world of possibilities for packaging and distributing new and modular functionality for Postgres. + +## Collaborating with AWS + +Because untrusted extensions are, by nature, able to break the security rules of Postgres, cloud providers are quite conservative about what extensions to provide to their customers. New extensions are rarely adopted quickly. This slows down the speed that new software can be created and shared. Open source requires opportunity and momentum, and by closing off the opportunity for Postgres users to quickly create, install, evaluate and iterate extensions, progress is slowed. TLEs offer an opportunity for open source developers to create and share code without having to wait for cloud providers or other gatekeepers to install it. + +When AWS released `pg_tle`, we realized immediately how powerful the tool is, and how it will change the way people release and install trusted extensions forever. We started collaborating with the TLE team at AWS, exchanging ideas and resources to further promote TLEs in both our database platform and theirs. By providing the TLE extension in both Supabase and AWS, we are unifying a standard package platform across two of the largest Postgres providers. We hope that other Postgres cloud providers will join the collaboration so that extension developers can leverage a large community base that greatly multiplies the reach of their efforts. + +## Installing TLEs with database.dev + +pg_tle is available on new Supabase projects and on Amazon RDS for Postgres 14.5 and higher. Supabase also includes an extension called [pgsql-http](https://github.com/pramsey/pgsql-http) for making HTTP calls from SQL to REST APIs. So, naturally putting two and two together, we thought it would be cool to see if it’s possible to install TLEs from a REST API using only SQL! + +We've created a new package registry, dbdev, that makes it easy to install extensions in your database migrations - as easy as: `select dbdev.install('langchain-embedding_search')`. +You can read more about dbdev in our other blog post: [dbdev: a PostgreSQL Package Manager](/blog/dbdev). diff --git a/apps/www/_blog/2023-04-14-supabase-studio-2.0.mdx b/apps/www/_blog/2023-04-14-supabase-studio-2.0.mdx new file mode 100644 index 00000000000..09b7a540a01 --- /dev/null +++ b/apps/www/_blog/2023-04-14-supabase-studio-2.0.mdx @@ -0,0 +1,163 @@ +--- +title: 'Supabase Studio 2.0: help when you need it most' +launchweek: 7 +tags: + - launch-week + - studio +date: '2023-04-14' +published_at: '2023-04-14T09:00:00.000-07:00' +to_depth: 3 +author: alaister,joshenlim,jonny,saltcod +image: launch-week-7/day-5-supabase-studio-2.0/day-5-supabase-studio-2.0-og.jpg +thumb: launch-week-7/day-5-supabase-studio-2.0/day-5-supabase-studio-2.0-thumb.jpg +--- + +Today we're announcing Supabase Studio 2.0, packed with a ton of new stuff. We have features people have been asking for forever, and new capabilities that will change the way you work. + +
+ +
+ +Here's the birds-eye-view: + +
    +
  • + [**Supabase AI**](#supabase-ai--assisted-database-development): ChatGPT, right in the Studio +
  • +
  • [**GraphiQL**](#graphiql): Query your database with GraphQL
  • +
  • [**Cascade deletes**](#cascade-deletes): Our #1 most requested feature from the community
  • +
  • [**Query Performance**](#query-performance): Investigate slow running queries
  • +
  • [**Foreign key Selector**](#foreign-key-selector): Look up a row in reference table
  • +
  • [**Postgres Roles**](#postgres-roles): Manage your Postgres roles and privileges
  • +
  • [**Database Webhooks**](#database-webhooks): Database triggers for Edge Functions
  • +
  • + [**Table/View definitions**](#tableview-definitions): View SQL definitions for tables and views +
  • +
  • [**API Autodocs**](#api-autodocs): View auto-generated docs right from the Table Editor
  • +
  • + [**Support for many tables**](#support-for-many-tables): Table Editor now supports 1000s of + tables +
  • +
  • [**JSON editing**](#json-editing): Improved JSON editing
  • +
  • [**Nullable columns**](#nullable-columns): Allow text/bool cells to be null or empty
  • +
+ +## Supabase AI — assisted database development + + + +One of our guiding principles at Supabase is to make SQL more accessible to developers. We don't want to just abstract it away with a custom implementation. By embracing SQL, developers learn important, transferable skills while they build on top of Supabase. + +In the past few months, AI advancements have made this easy! Writing a complex SQL query is now as simple as asking ChatGPT, and we're leaning into this approach with our Studio. AI gives developers superpowers, and by providing relevant context, Supabase gives AI superpowers. + +AI has already changed a lot about the way we work as developers. We can use ChatGPT to write code for us as fast as we can prompt it. We wanted to bring this power into the Studio with integrations that will help you work even faster than before. + +Today you'll be able to do many common SQL operations with the help of AI. You can create tables, views and indexes, write functions and triggers, and more, right from the ⌘K menu. + +Soon, we'll also let you opt-in to sending your table schemas to OpenAI to help fine tune queries to your project. All this should result in a dramatic boost in development speed. Maybe you'll only need half a weekend to scale to millions now! + +As with every ⌘K menu, quick navigation is at the heart of things. You'll now be able to jump to any page in the Studio in a couple of keystrokes. You can also search the Docs directly from the menu. + +We'll be actively working on our ⌘K menu in the coming months to make it faster and even more useful for you. Next, we're going to focus on better support for writing RLS policies. Stay tuned, and make sure to explore how we're integrating AI [behind the scenes](https://supabase.com/blog/tags/AI)! + +Huge props for the amazing work done on the [⌘K package](https://cmdk.paco.me/) we've built on top of here. + +--- + +Along with the new AI features, we also doubled-down on some of the critical missing pieces for a Postgres UI. Before we started to work on any of these, we combed through user feedback and tallied up the most submitted Feature Requests on GitHub. + +
+ +📢 Many of the features and enhancements below came from user requests — [please keep them coming](https://github.com/orgs/supabase/discussions/categories/feature-requests)! + +
+ +## GraphiQL + +![Logs UI](/images/blog/lw7-studio/graphiql.png) + +While GraphQL has been available in Supabase for just over a year, we haven't provided a visual tool for using it. You can now use the very popular GraphiQL directly from the Studio. GraphiQL is a browser tool for writing, validating, and testing GraphQL testing. Being able to use a fully integrated GraphQL IDE is a huge DX win. + +## Cascade deletes + + + +Cascade deletes are a core feature of Postgres, but have not been available in the Studio UI until now. This has been the #1 feature request from the community for a long time. You can now choose what you want to happen when deleting a referenced row in another table, right from Table Editor side panel. + +## Query Performance + +![Logs UI](/images/blog/lw7-studio/query-performance.png) + +We've just released a new Query Performance tool to help you identify slow queries. Using this tool, along with our new [guide](https://supabase.com/docs/guides/platform/performance#examining-query-performance) should help you speed things up. These tools can help you uncover where you might have inefficient queries or schemas, or where you might need indexes or even additional compute resources. + +## Foreign key selector + + + +You can now select a referencing row from another table, rather than having to pass a value manually. +You can also quickly jump to the row being referenced in another table with the _View referencing_ record +button from the grid itself. + +## Postgres Roles + +![Logs UI](/images/blog/lw7-studio/roles.png) + +The Roles page got a huge revision, making it easy for you to manage access control through users, groups, and permissions. It's now easy to see how many connections you're using and where they're coming from. + +## Database Webhooks + +![Logs UI](/images/blog/lw7-studio/webhooks.png) + +We've wanted to improve the webhooks interface for a long time, and we've finally gotten to it. We now have full support for editing your webhooks, and you can now select an edge function to call instead of having to pass in a url. We're happy to roll this very common request out to the community. + +## Table/View definitions + +![Logs UI](/images/blog/lw7-studio/definitions.png) + +You can now see the SQL definitions for your tables and views, directly from the Table Editor. This is a great way to see how Supabase is translating your UI changes into SQL. This can be useful for creating migrations, getting help, or just for learning more about how Supabase and SQL works. + +## API Autodocs + +![Logs UI](/images/blog/lw7-studio/api-autodocs.png) + +You can now view the auto-generated API docs right from the Table Editor. Grab the SQL and `supabase-js` code for all of the CRUD operations, straight from the table. You can also quickly generate and download a Typescript types file for your table, right from the editor. + +### Quality of life improvements + +#### Support for many tables + +Previously, the Table Editor would get slow and unresponsive when you had many tables. We've made a number of improvements to make it much faster and more responsive. Feel free to make all the tables you need! + +#### JSON editing + +You've always been able to use the JSON data type in your tables, but editing the data wasn't easy. We've improved the inline Table Editor, and also now allow you open json cells from the side panel for a more spacious editing experience. Next Launch Week we're hoping to decide if it's pronounced “Jason” or “Jay-sawn”. Stay tuned. + +#### Nullable columns + +Speaking of extremely common feature requests, we've gotten this one a lot in the past few months. You used to have to handle this manually, but now you can now allow text/boolean cells to be null or empty. Supabase, where productivity is more than just an empty (or null) promise. + +## Wrapping Up + +We hope you get a lot of value out of these new features and enhancements. As we mentioned earlier, many of the features listed here came directly from [Feature Requests](https://github.com/orgs/supabase/discussions/categories/feature-requests) on GitHub. Thanks to everyone who have taken the time to submit these, and encourage submissions for anything else you'd like to see. diff --git a/apps/www/components/Favicons.tsx b/apps/www/components/Favicons.tsx index ccdf07dd37a..0775ce24808 100644 --- a/apps/www/components/Favicons.tsx +++ b/apps/www/components/Favicons.tsx @@ -22,15 +22,15 @@ const Favicons = () => { {/* prettier-ignore */} {/* prettier-ignore */} - {/* prettier-ignore */} - {/* prettier-ignore */} - {/* prettier-ignore */} - {/* prettier-ignore */} - diff --git a/apps/www/components/ImageFadeStack.tsx b/apps/www/components/ImageFadeStack.tsx new file mode 100644 index 00000000000..34075797046 --- /dev/null +++ b/apps/www/components/ImageFadeStack.tsx @@ -0,0 +1,81 @@ +import Image from 'next/image' +import React, { useState, useEffect } from 'react' +import { IconPauseCircle, IconPlayCircle } from 'ui' +import { cn } from '~/../../packages/ui/src/utils/cn' + +interface ImageFadeStackProps { + autoplay?: boolean + images: string[] + height?: 'default' + delay?: number + altText?: string + showNavigation?: boolean +} + +const ImageFadeStack = ({ + images, + height = 'default', + delay = 3000, + autoplay = false, + altText = 'Image', + showNavigation = false, +}: ImageFadeStackProps) => { + const [currentImageIndex, setCurrentImageIndex] = useState(0) + const [isPlaying, setIsPlaying] = useState(autoplay) + + useEffect(() => { + if (isPlaying) { + const intervalId = setInterval(() => { + setCurrentImageIndex((prevIndex) => (prevIndex + 1) % images.length) + }, delay) + + return () => clearInterval(intervalId) + } + }, [images, isPlaying]) + + function handleNavClick(index: number) { + setIsPlaying(false) + setCurrentImageIndex(index) + } + + return ( +
+ {images.map((image, index) => ( + <> + {altText} + + ))} +
+ {showNavigation && + images.map((_, index) => ( + + ))} + +
+
+ ) +} + +export default ImageFadeStack diff --git a/apps/www/components/LaunchWeek/7/BlogLinks.tsx b/apps/www/components/LaunchWeek/7/BlogLinks.tsx index d7087d7e3b9..41168f03550 100644 --- a/apps/www/components/LaunchWeek/7/BlogLinks.tsx +++ b/apps/www/components/LaunchWeek/7/BlogLinks.tsx @@ -13,68 +13,76 @@ const BlogLinks = () => {

More Launch Week 7

{activeDays.map((day) => - day.steps?.map((step) => ( - - - -
-
- {step.title} -
-
- {step.thumb && ( - - - - )} -
- - - - )) + day.steps?.map((step, i) => { + return ( + <> + {!step.hideInBlog && } + {step.steps?.map( + (nestedStep, i) => !nestedStep.hideInBlog && + )} + + ) + }) )}
) } +const StepCard = ({ step }: { step: any }) => ( + + + +
+
+ {step.title} +
+
+ {step.thumb && ( + + + + )} +
+ + + +) + const defaultEase = [0.5, 0, 0.35, 1] const hoverVariant = { default: { scale: 1, ease: defaultEase, duration: 0.2 }, diff --git a/apps/www/components/LaunchWeek/Banners/CountdownBanner.tsx b/apps/www/components/LaunchWeek/Banners/CountdownBanner.tsx index 12fe5c3738c..eca864dc160 100644 --- a/apps/www/components/LaunchWeek/Banners/CountdownBanner.tsx +++ b/apps/www/components/LaunchWeek/Banners/CountdownBanner.tsx @@ -37,7 +37,7 @@ function CountdownBanner() { diff --git a/apps/www/components/LaunchWeek/LW7BgGraphic.tsx b/apps/www/components/LaunchWeek/LW7BgGraphic.tsx index f5b29f01eb6..1b824fb5be5 100644 --- a/apps/www/components/LaunchWeek/LW7BgGraphic.tsx +++ b/apps/www/components/LaunchWeek/LW7BgGraphic.tsx @@ -1,11 +1,11 @@ import { motion, useScroll, useTransform } from 'framer-motion' import Image from 'next/image' -import { useMobileViewport } from '../../hooks/useMobileViewport' +import { useBreakpoint } from 'common/hooks/useBreakpoint' import styles from './lw7-bg-graphic.module.css' export default function LW7BgGraphic() { const { scrollYProgress } = useScroll() - const isMobile = useMobileViewport(768) + const isMobile = useBreakpoint(768) const graphicsY = useTransform( scrollYProgress, diff --git a/apps/www/components/LaunchWeek/LaunchSection/LaunchWeekLogoHeader.tsx b/apps/www/components/LaunchWeek/LaunchSection/LaunchWeekLogoHeader.tsx index 99880d97369..8817c16e1db 100644 --- a/apps/www/components/LaunchWeek/LaunchSection/LaunchWeekLogoHeader.tsx +++ b/apps/www/components/LaunchWeek/LaunchSection/LaunchWeekLogoHeader.tsx @@ -1,10 +1,10 @@ import classNames from 'classnames' import Image from 'next/image' import { motion } from 'framer-motion' -import { useMobileViewport } from '../../../hooks/useMobileViewport' +import { useBreakpoint } from 'common/hooks/useBreakpoint' export function LaunchWeekLogoHeader() { - const isMobile = useMobileViewport(640) + const isMobile = useBreakpoint(640) return (
diff --git a/apps/www/components/LaunchWeek/LaunchSection/TicketBrickWall.tsx b/apps/www/components/LaunchWeek/LaunchSection/TicketBrickWall.tsx index 113c4d20d6f..b757f4cdeaf 100644 --- a/apps/www/components/LaunchWeek/LaunchSection/TicketBrickWall.tsx +++ b/apps/www/components/LaunchWeek/LaunchSection/TicketBrickWall.tsx @@ -1,7 +1,7 @@ import Link from 'next/link' import React from 'react' import { Button } from 'ui' -import { useMobileViewport } from '../../../hooks/useMobileViewport' +import { useBreakpoint } from 'common/hooks/useBreakpoint' import { UserData } from '../Ticket/hooks/use-conf-data' import { TicketBrickWallSlider } from './TicketBrickWallSlider' @@ -12,7 +12,7 @@ interface Props { } export default function TicketBrickWall({ users }: Props) { - const isMobile = useMobileViewport(768) + const isMobile = useBreakpoint(768) return (
diff --git a/apps/www/components/LaunchWeek/Releases/LW7/Day5.tsx b/apps/www/components/LaunchWeek/Releases/LW7/Day5.tsx new file mode 100644 index 00000000000..b36d06f1c32 --- /dev/null +++ b/apps/www/components/LaunchWeek/Releases/LW7/Day5.tsx @@ -0,0 +1,742 @@ +import React from 'react' +import Image from 'next/image' +import { motion } from 'framer-motion' +import { useBreakpoint } from 'common/hooks/useBreakpoint' +import { + ArrowTopRightSvg, + CartTitle, + ChipLink, + MultistepSectionHeader, + SectionButtons, + StyledArticleBadge, +} from './components' + +import { WeekDayProps } from '~/components/LaunchWeek/lw7_days' +import { opacityVariant4, scaleOpacityVariant2 } from './LW7Releases' + +import styles from './day5.module.css' +import Link from 'next/link' + +const getDay5Motion = (index: number) => { + switch (index) { + case 0: + return scaleOpacityVariant2 + default: + return undefined + } +} + +const getDay5omt01Motion = (index: number) => { + switch (index) { + case 2: + return opacityVariant4 + default: + return undefined + } +} +const getDay5omt02Motion = (index: number) => { + switch (index) { + case 2: + return opacityVariant4 + default: + return undefined + } +} + +const Day5 = ({ day }: { day: WeekDayProps }) => { + const isMobile = useBreakpoint(767) + const isTablet = useBreakpoint(1023) + const isDesktop = useBreakpoint(1279) + + return ( + <> + {/* Community */} +
+ +
+ {day.steps[0].steps[0].title} + New +
+ + {day.steps[0]?.steps[0]?.bg_layers && + day.steps[0].steps[0].bg_layers?.map( + (layer, i) => + !!layer.img && ( + + + + ) + )} +
+
+ {/* Studio */} + +
+ + + + +
+ {day.steps[1].steps[0].title} +
+ + {day.steps[1].steps[4].badge} + + + + +
+
+ {day.steps[1].steps[0].bg_layers && + day.steps[1].steps[0].bg_layers?.map( + (layer, i) => + !!layer.img && ( + + + + ) + )} +
+ + + + +
+ {day.steps[1].steps[1].title} +
+ {day.steps[1].steps[1].badge} + + + +
+
+ {day.steps[1].steps[1].bg_layers && + day.steps[1].steps[1].bg_layers?.map( + (layer, i) => + !!layer.img && ( + + + + ) + )} + + + +
+ +
+ {day.steps[1].steps[2].title} +
+ + {day.steps[1].steps[2].badge} + + + + +
+
+ {day.steps[1].steps[2].bg_layers && + day.steps[1].steps[2].bg_layers?.map( + (layer, i) => + !!layer.img && ( + + + + ) + )} + + + +
+ +
+ {day.steps[1].steps[3].title} +
+ + {day.steps[1].steps[3].badge} + + + + +
+
+ {day.steps[1].steps[3].bg_layers && + day.steps[1].steps[3].bg_layers?.map( + (layer, i) => + !!layer.img && ( + + + + ) + )} + + + +
+ +
+ {day.steps[1].steps[4].title} +
+ + {day.steps[1].steps[4].badge} + + + + +
+
+ {day.steps[1].steps[4].bg_layers && + day.steps[1].steps[4].bg_layers?.map( + (layer, i) => + !!layer.img && ( + + + + ) + )} + + + +
+ +
+ {day.steps[1].steps[5].title} +
+ + {day.steps[1].steps[5].badge} + + + + +
+
+ {day.steps[1].steps[5].bg_layers && + day.steps[1].steps[5].bg_layers?.map( + (layer, i) => + !!layer.img && ( + + + + ) + )} + + + +
+ +
+ {day.steps[1].steps[6].title} +
+ + {day.steps[1].steps[6].badge} + + + + +
+
+ {day.steps[1].steps[6].bg_layers && + day.steps[1].steps[6].bg_layers?.map( + (layer, i) => + !!layer.img && ( + + + + ) + )} + + + +
+ +
+ {day.steps[1].steps[7].title} +
+ + {day.steps[1].steps[7].badge} + + + + +
+
+ {day.steps[1].steps[7].bg_layers && + day.steps[1].steps[7].bg_layers?.map( + (layer, i) => + !!layer.img && ( + + + + ) + )} + + + +
+ +
+ {day.steps[1].steps[8].title} +
+ + {day.steps[1].steps[8].badge} + + + + +
+
+ {day.steps[1].steps[8].bg_layers && + day.steps[1].steps[8].bg_layers?.map( + (layer, i) => + !!layer.img && ( + + + + ) + )} + + + +
+ +
+ {day.steps[1].steps[9].title} +
+ + {day.steps[1].steps[9].badge} + + + + +
+
+ {day.steps[1].steps[9].bg_layers && + day.steps[1].steps[9].bg_layers?.map( + (layer, i) => + !!layer.img && ( + + + + ) + )} + + + +
+ +
+ {day.steps[1].steps[10].title} +
+ + {day.steps[1].steps[10].badge} + + + + +
+
+ {day.steps[1].steps[10].bg_layers && + day.steps[1].steps[10].bg_layers?.map( + (layer, i) => + !!layer.img && ( + + + + ) + )} + +
+ {/* One More Thing */} + +
+ +
+ {day.steps[2].steps[0].title} + + {day.steps[2].steps[0].badge} + +
+ + {day.steps[2].steps[0].bg_layers && + day.steps[2].steps[0].bg_layers?.map( + (layer, i) => + !!layer.img && ( + + + + ) + )} +
+ +
+ {day.steps[2].steps[1].title} + {day.steps[2].steps[1].badge} +
+ + {day.steps[2].steps[1].bg_layers && + day.steps[2].steps[1].bg_layers?.map( + (layer, i) => + !!layer.img && ( + + + + ) + )} +
+
+ + ) +} + +export default Day5 diff --git a/apps/www/components/LaunchWeek/Releases/LW7/LW7Releases.tsx b/apps/www/components/LaunchWeek/Releases/LW7/LW7Releases.tsx index ed7d4ccc23f..bf6cf2c54be 100644 --- a/apps/www/components/LaunchWeek/Releases/LW7/LW7Releases.tsx +++ b/apps/www/components/LaunchWeek/Releases/LW7/LW7Releases.tsx @@ -15,14 +15,15 @@ import { StyledArticleBadge, } from './components' -import { useMobileViewport } from '../../../../hooks/useMobileViewport' +import { useBreakpoint } from 'common/hooks/useBreakpoint' import { motion } from 'framer-motion' +import Day5 from './Day5' -const defaultEase = [0.25, 0.25, 0, 1] -const defaultDuratonIn = 0.25 -const defaultDuratonOut = 0.1 +export const defaultEase = [0.25, 0.25, 0, 1] +export const defaultDuratonIn = 0.25 +export const defaultDuratonOut = 0.1 -const opacityVariant = { +export const opacityVariant = { default: { opacity: 0.9, ease: defaultEase, duration: defaultDuratonOut }, hover: { opacity: 1, @@ -32,7 +33,7 @@ const opacityVariant = { }, }, } -const opacityVariant2 = { +export const opacityVariant2 = { default: { opacity: 0, ease: defaultEase, duration: defaultDuratonOut }, hover: { opacity: 0.2, @@ -42,7 +43,7 @@ const opacityVariant2 = { }, }, } -const opacityVariant3 = { +export const opacityVariant3 = { default: { opacity: 0, ease: defaultEase, duration: defaultDuratonOut }, hover: { opacity: 1, @@ -52,7 +53,7 @@ const opacityVariant3 = { }, }, } -const opacityVariant4 = { +export const opacityVariant4 = { default: { opacity: 0.3, ease: defaultEase, duration: defaultDuratonOut }, hover: { opacity: 1, @@ -62,7 +63,7 @@ const opacityVariant4 = { }, }, } -const scaleOpacityVariant = { +export const scaleOpacityVariant = { default: { scale: 1, opacity: 0.9, ease: defaultEase, duration: defaultDuratonOut }, hover: { scale: 1.05, @@ -73,13 +74,24 @@ const scaleOpacityVariant = { }, }, } -const aiImageMobileVariant = { +export const scaleOpacityVariant2 = { + default: { scale: 1, opacity: 0.8, ease: defaultEase, duration: defaultDuratonOut }, + hover: { + scale: 1.025, + opacity: 1, + transition: { + duration: defaultDuratonIn, + ease: defaultEase, + }, + }, +} +export const aiImageMobileVariant = { default: { scale: 0.9 }, hover: { scale: 0.9, }, } -const moveX10 = { +export const moveX10 = { default: { x: 0, ease: defaultEase, duration: defaultDuratonOut }, hover: { x: 10, @@ -132,8 +144,7 @@ const getDay4Motion = (index: number) => { export default function LW7Releases() { const [preRelease, day1, day2, day3, day4, day5] = days - const isMobile = useMobileViewport(767) - const isTablet = useMobileViewport(1023) + const isTablet = useBreakpoint(1023) const showAll = false const publishedSections = days @@ -183,13 +194,13 @@ export default function LW7Releases() {
- Supabase AI Hackathon has begun. Join now! + Supabase AI Hackathon
Blog post -
+
@@ -227,7 +238,7 @@ export default function LW7Releases() {
- + More info
@@ -412,7 +423,6 @@ export default function LW7Releases() { New
New
-
+
diff --git a/apps/www/components/LaunchWeek/Releases/LW7/components/index.tsx b/apps/www/components/LaunchWeek/Releases/LW7/components/index.tsx index 632764ee29d..365347c45c9 100644 --- a/apps/www/components/LaunchWeek/Releases/LW7/components/index.tsx +++ b/apps/www/components/LaunchWeek/Releases/LW7/components/index.tsx @@ -47,7 +47,6 @@ export const LinkSvg = () => ( ( /> ) +export const ArrowTopRightSvg = () => ( + + + + +) export const HackernewsSvg = () => ( { ) } +export const MultistepSectionHeader = ({ title, blog }: any) => { + return ( +
+
+ {title && {title}} + {!!blog && ( + + Blog post +
+ +
+
+ )} +
+
+ ) +} export const ChipLink = ({ href, + uiOnly, className, target, children, }: { - href: string + href?: string className?: string + uiOnly?: boolean target?: '_blank' | '_self' | '_parent' | '_top' | 'framename' children: any -}) => ( - -
+ uiOnly ? ( + {children} - - -) + + ) : !!href ? ( + + + {children} + + + ) : null export const SectionButtons = ({ blog, @@ -188,14 +232,14 @@ export const SectionButtons = ({ return (
{!!blog && ( Blog post -
+
@@ -203,7 +247,7 @@ export const SectionButtons = ({ {!!docs && ( Docs -
+
@@ -211,15 +255,15 @@ export const SectionButtons = ({ {!!video && ( Video -
+
)} {!!github && ( - View on Github -
+ Github +
@@ -227,15 +271,15 @@ export const SectionButtons = ({ {!!url && ( Read -
+
)} {hackernews && ( - Read more -
+ Hackernews +
diff --git a/apps/www/components/LaunchWeek/Releases/LW7/day5.module.css b/apps/www/components/LaunchWeek/Releases/LW7/day5.module.css new file mode 100644 index 00000000000..e865d5cad1a --- /dev/null +++ b/apps/www/components/LaunchWeek/Releases/LW7/day5.module.css @@ -0,0 +1,38 @@ +.day5-grid { + grid-template-areas: + 'commandK commandK ' + 'wrappers wrappers ' + 'nullable apiAutodocs' + 'pgRoles pgRoles ' + 'casDeletes casDeletes ' + 'graphiQL graphiQL ' + 'dbWebhooks dbWebhooks ' + 'viewsTables viewsTables' + 'JSONsupport JSONsupport' + 'insights insights '; +} + +@media (min-width: 768px) { + .day5-grid { + grid-template-areas: + 'commandK commandK commandK commandK ' + 'wrappers wrappers nullable apiAutodocs' + 'pgRoles pgRoles casDeletes casDeletes ' + 'pgRoles pgRoles casDeletes casDeletes ' + 'graphiQL graphiQL graphiQL graphiQL ' + 'dbWebhooks dbWebhooks dbWebhooks dbWebhooks ' + 'viewsTables viewsTables JSONsupport JSONsupport' + 'insights insights insights insights '; + } +} + +@media (min-width: 1280px) { + .day5-grid { + grid-template-areas: + 'commandK commandK commandK commandK commandK commandK' + 'wrappers wrappers nullable apiAutodocs pgRoles pgRoles' + 'casDeletes casDeletes graphiQL graphiQL pgRoles pgRoles' + 'casDeletes casDeletes dbWebhooks dbWebhooks dbWebhooks dbWebhooks' + 'viewsTables viewsTables JSONsupport insights insights insights'; + } +} diff --git a/apps/www/components/LaunchWeek/Ticket/ActualTicket.tsx b/apps/www/components/LaunchWeek/Ticket/ActualTicket.tsx index 0dd73115d35..bb59bd906de 100644 --- a/apps/www/components/LaunchWeek/Ticket/ActualTicket.tsx +++ b/apps/www/components/LaunchWeek/Ticket/ActualTicket.tsx @@ -10,7 +10,7 @@ import { UserData } from './hooks/use-conf-data' import ReferralIndicator from '../ReferralIndicator' import useWinningChances from './hooks/useWinningChances' import { SITE_URL } from '~/lib/constants' -import { useMobileViewport } from '../../../hooks/useMobileViewport' +import { useBreakpoint } from 'common/hooks/useBreakpoint' type TicketGenerationState = 'default' | 'loading' @@ -33,7 +33,7 @@ export default function Ticket({ bgImageId, referrals, }: Props) { - const isMobile = useMobileViewport(1023) + const isMobile = useBreakpoint(1023) const [ticketGenerationState, setTicketGenerationState] = useState('default') const divRef = useRef(null) diff --git a/apps/www/components/LaunchWeek/Ticket/TicketsGrid.tsx b/apps/www/components/LaunchWeek/Ticket/TicketsGrid.tsx index 98dd1f204e3..dfaaf8f54a2 100644 --- a/apps/www/components/LaunchWeek/Ticket/TicketsGrid.tsx +++ b/apps/www/components/LaunchWeek/Ticket/TicketsGrid.tsx @@ -1,7 +1,7 @@ import { motion } from 'framer-motion' import Image from 'next/image' import Link from 'next/link' -import { useMobileViewport } from '../../../hooks/useMobileViewport' +import { useBreakpoint } from 'common/hooks/useBreakpoint' import { UserData } from './hooks/use-conf-data' interface Props { @@ -18,8 +18,8 @@ export default function TicketsGrid({ loadedUsers, isLoading, pageCount, offset `${STORAGE_URL}/tickets/gallery/${ isGold ? 'golden' : 'regular' }/${BUCKET_FOLDER_VERSION}/${username}.png` - const isMobile = useMobileViewport(768) - const isTablet = useMobileViewport(1024) + const isMobile = useBreakpoint(768) + const isTablet = useBreakpoint(1024) return (
{ if (props.className !== ignoreClass) { return ( diff --git a/apps/www/lib/posts.tsx b/apps/www/lib/posts.tsx index 1b9080bf7d8..c0a7fad040f 100644 --- a/apps/www/lib/posts.tsx +++ b/apps/www/lib/posts.tsx @@ -53,6 +53,7 @@ export const getSortedPosts = ( ...data, date: formattedDate, readingTime, + publishedAt: data.published_at ?? null, url: url, path: contentPath, } @@ -65,7 +66,10 @@ export const getSortedPosts = ( let sortedPosts = [...allPostsData] sortedPosts = sortedPosts.sort((a, b) => { - if (new Date(a.date) < new Date(b.date)) { + const isPublishedAtBefore = + a.publishedAt && b.publishedAt && Date.parse(a.publishedAt) < Date.parse(b.publishedAt) + + if (isPublishedAtBefore || new Date(a.date) < new Date(b.date)) { return 1 } else { return -1 diff --git a/apps/www/pages/launch-week/index.tsx b/apps/www/pages/launch-week/index.tsx index ad320863206..1bf1f307e1a 100644 --- a/apps/www/pages/launch-week/index.tsx +++ b/apps/www/pages/launch-week/index.tsx @@ -134,7 +134,7 @@ export default function TicketHome({ users }: Props) { />
-
+
diff --git a/apps/www/pages/privacy.mdx b/apps/www/pages/privacy.mdx index 5a2311abe07..96c869ca552 100644 --- a/apps/www/pages/privacy.mdx +++ b/apps/www/pages/privacy.mdx @@ -10,7 +10,7 @@ export const meta = { # Privacy Policy -_Last Modified: 27 March 2021_ +_Last Modified: 14 April 2023_ Thank you for your interest in Supabase, Inc., ("**_Supabase_**," "**_we_**", "**_our_**" or "**_us_**"). Supabase provides a suite of open source tools, stitched together to build a seamless developer experience. This Privacy Notice explains how information about you, that directly identifies you, or that makes you identifiable ("**_personal information_**") is collected, used and disclosed by Supabase in connection with our website at [supabase.com](https://supabase.com) (the "**_Site_**") and our services offered in connection with the Site (collectively with the Site, the "**_Service_**"). @@ -298,6 +298,15 @@ Some browsers also give you the option of downloading and installing extensions |

a0:state

| Strictly necessary | 2 Hours | Authentication Purposes. | |

youtube-nocookie

| Strictly necessary | Persistent |

Privacy-enhanced cookie, essential for embedded videos. [Link.](https://support.google.com/youtube/answer/171780)

Privacy Enhanced Mode allows you to embed YouTube videos without using cookies that track viewing behavior. This means no activity is collected to personalize the viewing experience.

| +## Annex 4 - Information you submit through our Supabase AI tool + +When you submit a support query through our chatbot tool, we will collect the content of your query and information about the databases and other content you manage through the Service. We will only collect information about the structure of your databases and content, such as column and row headings or other information about how that content is organized. We will not access the content of the databases itself or the information you manage through the Service. + +| **How we use the Personal Information** | **Legal Bases for Processing** | **Recipients of Personal Information** | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | +| When you use the chatbot to submit queries through your own individual account, we will use this information to generate automated responses to your query. | The processing is necessary for the performance of a contract with you, namely our Terms of Service. | We may share this information with the following service providers through the provision of the Service: OpenAI, LLC and its affiliates. | +| We use this information to assess the performance of the chatbot tool and improve the Service. | The processing is necessary for our legitimate interests (to develop and improve our service). | We may share this information with the following service providers through the provision of the Service: OpenAI, LLC and its affiliates. | + export default (context) => diff --git a/apps/www/public/customers-rss.xml b/apps/www/public/customers-rss.xml index afd1ea7d986..e8c128abd81 100644 --- a/apps/www/public/customers-rss.xml +++ b/apps/www/public/customers-rss.xml @@ -5,42 +5,42 @@ https://supabase.com Latest news from Supabase en - Wed, 15 Feb 2023 23:11:00 +0000 + Wed, 15 Feb 2023 03:03:30 +0000 https://supabase.com/customers/happyteams HappyTeams unlocks better performance and reduces cost with Supabase. https://supabase.com/customers/happyteams How a bootstrapped startup migrated from Heroku to Supabase in 30 minutes and never looked back. - Wed, 15 Feb 2023 23:11:00 +0000 + Wed, 15 Feb 2023 03:03:30 +0000 https://supabase.com/customers/xendit Xendit use Supabase and create a full solution shipped to production in less than one week. https://supabase.com/customers/xendit As a payment processor, Xendit are responsible for verifying that all transactions are legal. - Mon, 13 Feb 2023 23:11:00 +0000 + Mon, 13 Feb 2023 03:03:30 +0000 https://supabase.com/customers/replenysh Replenysh uses Supabase to implement OTP in less than 24 hours. https://supabase.com/customers/replenysh With Supabase, Replenysh gets a slick auth experience, reduces DevOps overhead, and continues to scale with Postgres. - Mon, 13 Feb 2023 23:11:00 +0000 + Mon, 13 Feb 2023 03:03:30 +0000 https://supabase.com/customers/mobbin How Mobbin migrated 200,000 users from Firebase for a better authentication experience. https://supabase.com/customers/mobbin Mobbin helps over 200,000 creators globally search and view the latest design patterns from well-known apps. - Mon, 13 Feb 2023 23:11:00 +0000 + Mon, 13 Feb 2023 03:03:30 +0000 https://supabase.com/customers/epsilon3 Epsilon3 digitize paper-based procedures in the space industry using telemetry data, simplifying testing and operations. https://supabase.com/customers/epsilon3 Epsilon3 uses Supabase to help teams execute secure and reliable operations in an industry where project spend runs into the billions. - Mon, 13 Feb 2023 23:11:00 +0000 + Mon, 13 Feb 2023 03:03:30 +0000 diff --git a/apps/www/public/favicon/android-chrome-192x192.png b/apps/www/public/favicon/android-chrome-192x192.png index f0a2817a744..c0ac2bb1cdb 100644 Binary files a/apps/www/public/favicon/android-chrome-192x192.png and b/apps/www/public/favicon/android-chrome-192x192.png differ diff --git a/apps/www/public/favicon/android-chrome-512x512.png b/apps/www/public/favicon/android-chrome-512x512.png index 1c658733e6e..1bdeaa23bb8 100644 Binary files a/apps/www/public/favicon/android-chrome-512x512.png and b/apps/www/public/favicon/android-chrome-512x512.png differ diff --git a/studio/public/favicon/archive/apple-touch-icon-114x114.png b/apps/www/public/favicon/android-icon-144x144.png similarity index 100% rename from studio/public/favicon/archive/apple-touch-icon-114x114.png rename to apps/www/public/favicon/android-icon-144x144.png diff --git a/apps/www/public/favicon/android-icon-192x192.png b/apps/www/public/favicon/android-icon-192x192.png new file mode 100644 index 00000000000..7583d2035e3 Binary files /dev/null and b/apps/www/public/favicon/android-icon-192x192.png differ diff --git a/apps/www/public/favicon/android-icon-36x36.png b/apps/www/public/favicon/android-icon-36x36.png new file mode 100644 index 00000000000..5e4eabec411 Binary files /dev/null and b/apps/www/public/favicon/android-icon-36x36.png differ diff --git a/apps/www/public/favicon/android-icon-48x48.png b/apps/www/public/favicon/android-icon-48x48.png new file mode 100644 index 00000000000..f8d8a7d9c05 Binary files /dev/null and b/apps/www/public/favicon/android-icon-48x48.png differ diff --git a/studio/public/favicon/archive/apple-touch-icon-72x72.png b/apps/www/public/favicon/android-icon-72x72.png similarity index 100% rename from studio/public/favicon/archive/apple-touch-icon-72x72.png rename to apps/www/public/favicon/android-icon-72x72.png diff --git a/apps/www/public/favicon/android-icon-96x96.png b/apps/www/public/favicon/android-icon-96x96.png new file mode 100644 index 00000000000..0f1351f3670 Binary files /dev/null and b/apps/www/public/favicon/android-icon-96x96.png differ diff --git a/apps/www/public/favicon/apple-icon-114x114.png b/apps/www/public/favicon/apple-icon-114x114.png new file mode 100644 index 00000000000..4aa46d4d25d Binary files /dev/null and b/apps/www/public/favicon/apple-icon-114x114.png differ diff --git a/apps/www/public/favicon/archive/apple-touch-icon-120x120.png b/apps/www/public/favicon/apple-icon-120x120.png similarity index 100% rename from apps/www/public/favicon/archive/apple-touch-icon-120x120.png rename to apps/www/public/favicon/apple-icon-120x120.png diff --git a/apps/www/public/favicon/archive/apple-touch-icon-144x144.png b/apps/www/public/favicon/apple-icon-144x144.png similarity index 100% rename from apps/www/public/favicon/archive/apple-touch-icon-144x144.png rename to apps/www/public/favicon/apple-icon-144x144.png diff --git a/apps/www/public/favicon/archive/apple-touch-icon-152x152.png b/apps/www/public/favicon/apple-icon-152x152.png similarity index 100% rename from apps/www/public/favicon/archive/apple-touch-icon-152x152.png rename to apps/www/public/favicon/apple-icon-152x152.png diff --git a/apps/www/public/favicon/apple-icon-180x180.png b/apps/www/public/favicon/apple-icon-180x180.png new file mode 100644 index 00000000000..2a80dbc2f68 Binary files /dev/null and b/apps/www/public/favicon/apple-icon-180x180.png differ diff --git a/apps/www/public/favicon/apple-icon-57x57.png b/apps/www/public/favicon/apple-icon-57x57.png new file mode 100644 index 00000000000..e7b08eb605f Binary files /dev/null and b/apps/www/public/favicon/apple-icon-57x57.png differ diff --git a/apps/www/public/favicon/archive/apple-touch-icon-60x60.png b/apps/www/public/favicon/apple-icon-60x60.png similarity index 100% rename from apps/www/public/favicon/archive/apple-touch-icon-60x60.png rename to apps/www/public/favicon/apple-icon-60x60.png diff --git a/apps/www/public/favicon/apple-icon-72x72.png b/apps/www/public/favicon/apple-icon-72x72.png new file mode 100644 index 00000000000..e4418058cef Binary files /dev/null and b/apps/www/public/favicon/apple-icon-72x72.png differ diff --git a/apps/www/public/favicon/archive/apple-touch-icon-76x76.png b/apps/www/public/favicon/apple-icon-76x76.png similarity index 100% rename from apps/www/public/favicon/archive/apple-touch-icon-76x76.png rename to apps/www/public/favicon/apple-icon-76x76.png diff --git a/apps/www/public/favicon/apple-icon-precomposed.png b/apps/www/public/favicon/apple-icon-precomposed.png new file mode 100644 index 00000000000..7583d2035e3 Binary files /dev/null and b/apps/www/public/favicon/apple-icon-precomposed.png differ diff --git a/apps/www/public/favicon/apple-icon.png b/apps/www/public/favicon/apple-icon.png new file mode 100644 index 00000000000..7583d2035e3 Binary files /dev/null and b/apps/www/public/favicon/apple-icon.png differ diff --git a/apps/www/public/favicon/apple-touch-icon-114x114.png b/apps/www/public/favicon/apple-touch-icon-114x114.png index d2ee4b9e139..4aa46d4d25d 100644 Binary files a/apps/www/public/favicon/apple-touch-icon-114x114.png and b/apps/www/public/favicon/apple-touch-icon-114x114.png differ diff --git a/apps/www/public/favicon/apple-touch-icon-120x120.png b/apps/www/public/favicon/apple-touch-icon-120x120.png index 5bd0e4963a1..d2b0e50ef41 100644 Binary files a/apps/www/public/favicon/apple-touch-icon-120x120.png and b/apps/www/public/favicon/apple-touch-icon-120x120.png differ diff --git a/apps/www/public/favicon/apple-touch-icon-144x144.png b/apps/www/public/favicon/apple-touch-icon-144x144.png index c73891c985d..00a5d8b5180 100644 Binary files a/apps/www/public/favicon/apple-touch-icon-144x144.png and b/apps/www/public/favicon/apple-touch-icon-144x144.png differ diff --git a/apps/www/public/favicon/apple-touch-icon-152x152.png b/apps/www/public/favicon/apple-touch-icon-152x152.png index 65f90a02357..310532c4648 100644 Binary files a/apps/www/public/favicon/apple-touch-icon-152x152.png and b/apps/www/public/favicon/apple-touch-icon-152x152.png differ diff --git a/apps/www/public/favicon/apple-touch-icon-57x57.png b/apps/www/public/favicon/apple-touch-icon-57x57.png index bfa1628afb5..1314e02c744 100644 Binary files a/apps/www/public/favicon/apple-touch-icon-57x57.png and b/apps/www/public/favicon/apple-touch-icon-57x57.png differ diff --git a/apps/www/public/favicon/apple-touch-icon-60x60.png b/apps/www/public/favicon/apple-touch-icon-60x60.png index 15c5dca8005..0615675e809 100644 Binary files a/apps/www/public/favicon/apple-touch-icon-60x60.png and b/apps/www/public/favicon/apple-touch-icon-60x60.png differ diff --git a/apps/www/public/favicon/apple-touch-icon-72x72.png b/apps/www/public/favicon/apple-touch-icon-72x72.png index fb0c4fb3663..e4418058cef 100644 Binary files a/apps/www/public/favicon/apple-touch-icon-72x72.png and b/apps/www/public/favicon/apple-touch-icon-72x72.png differ diff --git a/apps/www/public/favicon/apple-touch-icon-76x76.png b/apps/www/public/favicon/apple-touch-icon-76x76.png index 7d950f0862e..9a76327f94b 100644 Binary files a/apps/www/public/favicon/apple-touch-icon-76x76.png and b/apps/www/public/favicon/apple-touch-icon-76x76.png differ diff --git a/apps/www/public/favicon/archive/android-chrome-192x192.png b/apps/www/public/favicon/archive/android-chrome-192x192.png deleted file mode 100644 index c0ac2bb1cdb..00000000000 Binary files a/apps/www/public/favicon/archive/android-chrome-192x192.png and /dev/null differ diff --git a/apps/www/public/favicon/archive/android-chrome-512x512.png b/apps/www/public/favicon/archive/android-chrome-512x512.png deleted file mode 100644 index 4de626fcc9e..00000000000 Binary files a/apps/www/public/favicon/archive/android-chrome-512x512.png and /dev/null differ diff --git a/apps/www/public/favicon/archive/apple-touch-icon-57x57.png b/apps/www/public/favicon/archive/apple-touch-icon-57x57.png deleted file mode 100644 index 1314e02c744..00000000000 Binary files a/apps/www/public/favicon/archive/apple-touch-icon-57x57.png and /dev/null differ diff --git a/apps/www/public/favicon/archive/favicon-128.png b/apps/www/public/favicon/archive/favicon-128.png deleted file mode 100644 index d5dca345802..00000000000 Binary files a/apps/www/public/favicon/archive/favicon-128.png and /dev/null differ diff --git a/apps/www/public/favicon/archive/favicon-16x16.png b/apps/www/public/favicon/archive/favicon-16x16.png deleted file mode 100644 index 6361bcecd15..00000000000 Binary files a/apps/www/public/favicon/archive/favicon-16x16.png and /dev/null differ diff --git a/apps/www/public/favicon/archive/favicon-196x196.png b/apps/www/public/favicon/archive/favicon-196x196.png deleted file mode 100644 index adb05b43453..00000000000 Binary files a/apps/www/public/favicon/archive/favicon-196x196.png and /dev/null differ diff --git a/apps/www/public/favicon/archive/favicon-32x32.png b/apps/www/public/favicon/archive/favicon-32x32.png deleted file mode 100644 index 4ea0fba2e3c..00000000000 Binary files a/apps/www/public/favicon/archive/favicon-32x32.png and /dev/null differ diff --git a/apps/www/public/favicon/archive/favicon-96x96.png b/apps/www/public/favicon/archive/favicon-96x96.png deleted file mode 100644 index 92a3d735dff..00000000000 Binary files a/apps/www/public/favicon/archive/favicon-96x96.png and /dev/null differ diff --git a/apps/www/public/favicon/archive/favicon.ico b/apps/www/public/favicon/archive/favicon.ico deleted file mode 100644 index 4e808093c05..00000000000 Binary files a/apps/www/public/favicon/archive/favicon.ico and /dev/null differ diff --git a/apps/www/public/favicon/archive/lw7/android-chrome-192x192.png b/apps/www/public/favicon/archive/lw7/android-chrome-192x192.png new file mode 100644 index 00000000000..f0a2817a744 Binary files /dev/null and b/apps/www/public/favicon/archive/lw7/android-chrome-192x192.png differ diff --git a/apps/www/public/favicon/archive/lw7/android-chrome-512x512.png b/apps/www/public/favicon/archive/lw7/android-chrome-512x512.png new file mode 100644 index 00000000000..1c658733e6e Binary files /dev/null and b/apps/www/public/favicon/archive/lw7/android-chrome-512x512.png differ diff --git a/apps/www/public/favicon/archive/lw7/apple-touch-icon-114x114.png b/apps/www/public/favicon/archive/lw7/apple-touch-icon-114x114.png new file mode 100644 index 00000000000..d2ee4b9e139 Binary files /dev/null and b/apps/www/public/favicon/archive/lw7/apple-touch-icon-114x114.png differ diff --git a/apps/www/public/favicon/archive/lw7/apple-touch-icon-120x120.png b/apps/www/public/favicon/archive/lw7/apple-touch-icon-120x120.png new file mode 100644 index 00000000000..5bd0e4963a1 Binary files /dev/null and b/apps/www/public/favicon/archive/lw7/apple-touch-icon-120x120.png differ diff --git a/apps/www/public/favicon/archive/lw7/apple-touch-icon-144x144.png b/apps/www/public/favicon/archive/lw7/apple-touch-icon-144x144.png new file mode 100644 index 00000000000..c73891c985d Binary files /dev/null and b/apps/www/public/favicon/archive/lw7/apple-touch-icon-144x144.png differ diff --git a/apps/www/public/favicon/archive/lw7/apple-touch-icon-152x152.png b/apps/www/public/favicon/archive/lw7/apple-touch-icon-152x152.png new file mode 100644 index 00000000000..65f90a02357 Binary files /dev/null and b/apps/www/public/favicon/archive/lw7/apple-touch-icon-152x152.png differ diff --git a/apps/www/public/favicon/archive/lw7/apple-touch-icon-57x57.png b/apps/www/public/favicon/archive/lw7/apple-touch-icon-57x57.png new file mode 100644 index 00000000000..bfa1628afb5 Binary files /dev/null and b/apps/www/public/favicon/archive/lw7/apple-touch-icon-57x57.png differ diff --git a/apps/www/public/favicon/archive/lw7/apple-touch-icon-60x60.png b/apps/www/public/favicon/archive/lw7/apple-touch-icon-60x60.png new file mode 100644 index 00000000000..15c5dca8005 Binary files /dev/null and b/apps/www/public/favicon/archive/lw7/apple-touch-icon-60x60.png differ diff --git a/apps/www/public/favicon/archive/lw7/apple-touch-icon-72x72.png b/apps/www/public/favicon/archive/lw7/apple-touch-icon-72x72.png new file mode 100644 index 00000000000..fb0c4fb3663 Binary files /dev/null and b/apps/www/public/favicon/archive/lw7/apple-touch-icon-72x72.png differ diff --git a/apps/www/public/favicon/archive/lw7/apple-touch-icon-76x76.png b/apps/www/public/favicon/archive/lw7/apple-touch-icon-76x76.png new file mode 100644 index 00000000000..7d950f0862e Binary files /dev/null and b/apps/www/public/favicon/archive/lw7/apple-touch-icon-76x76.png differ diff --git a/apps/www/public/favicon/archive/lw7/favicon-128.png b/apps/www/public/favicon/archive/lw7/favicon-128.png new file mode 100644 index 00000000000..2206096f21b Binary files /dev/null and b/apps/www/public/favicon/archive/lw7/favicon-128.png differ diff --git a/apps/www/public/favicon/archive/lw7/favicon-16x16.png b/apps/www/public/favicon/archive/lw7/favicon-16x16.png new file mode 100644 index 00000000000..2e07b15e106 Binary files /dev/null and b/apps/www/public/favicon/archive/lw7/favicon-16x16.png differ diff --git a/apps/www/public/favicon/archive/lw7/favicon-196x196.png b/apps/www/public/favicon/archive/lw7/favicon-196x196.png new file mode 100644 index 00000000000..d10fc7e36d9 Binary files /dev/null and b/apps/www/public/favicon/archive/lw7/favicon-196x196.png differ diff --git a/apps/www/public/favicon/archive/lw7/favicon-32x32.png b/apps/www/public/favicon/archive/lw7/favicon-32x32.png new file mode 100644 index 00000000000..4101a08499b Binary files /dev/null and b/apps/www/public/favicon/archive/lw7/favicon-32x32.png differ diff --git a/apps/www/public/favicon/archive/lw7/favicon-96x96.png b/apps/www/public/favicon/archive/lw7/favicon-96x96.png new file mode 100644 index 00000000000..b23072a2c02 Binary files /dev/null and b/apps/www/public/favicon/archive/lw7/favicon-96x96.png differ diff --git a/apps/www/public/favicon/archive/lw7/favicon.ico b/apps/www/public/favicon/archive/lw7/favicon.ico new file mode 100644 index 00000000000..51b9988fdcb Binary files /dev/null and b/apps/www/public/favicon/archive/lw7/favicon.ico differ diff --git a/apps/www/public/favicon/archive/lw7/mstile-144x144.png b/apps/www/public/favicon/archive/lw7/mstile-144x144.png new file mode 100644 index 00000000000..c73891c985d Binary files /dev/null and b/apps/www/public/favicon/archive/lw7/mstile-144x144.png differ diff --git a/apps/www/public/favicon/archive/lw7/mstile-150x150.png b/apps/www/public/favicon/archive/lw7/mstile-150x150.png new file mode 100644 index 00000000000..bd10ae0a5df Binary files /dev/null and b/apps/www/public/favicon/archive/lw7/mstile-150x150.png differ diff --git a/apps/www/public/favicon/archive/lw7/mstile-310x150.png b/apps/www/public/favicon/archive/lw7/mstile-310x150.png new file mode 100644 index 00000000000..fb4d58022df Binary files /dev/null and b/apps/www/public/favicon/archive/lw7/mstile-310x150.png differ diff --git a/apps/www/public/favicon/archive/lw7/mstile-310x310.png b/apps/www/public/favicon/archive/lw7/mstile-310x310.png new file mode 100644 index 00000000000..0adc45ea0ac Binary files /dev/null and b/apps/www/public/favicon/archive/lw7/mstile-310x310.png differ diff --git a/apps/www/public/favicon/archive/lw7/mstile-70x70.png b/apps/www/public/favicon/archive/lw7/mstile-70x70.png new file mode 100644 index 00000000000..2206096f21b Binary files /dev/null and b/apps/www/public/favicon/archive/lw7/mstile-70x70.png differ diff --git a/apps/www/public/favicon/archive/mstile-310x150.png b/apps/www/public/favicon/archive/mstile-310x150.png deleted file mode 100644 index b1121df62aa..00000000000 Binary files a/apps/www/public/favicon/archive/mstile-310x150.png and /dev/null differ diff --git a/apps/www/public/favicon/archive/mstile-70x70.png b/apps/www/public/favicon/archive/mstile-70x70.png deleted file mode 100644 index d5dca345802..00000000000 Binary files a/apps/www/public/favicon/archive/mstile-70x70.png and /dev/null differ diff --git a/apps/www/public/favicon/browserconfig.xml b/apps/www/public/favicon/browserconfig.xml index 9824d87b115..c5541482230 100644 --- a/apps/www/public/favicon/browserconfig.xml +++ b/apps/www/public/favicon/browserconfig.xml @@ -1,9 +1,2 @@ - - - - - #000000 - - - +#ffffff \ No newline at end of file diff --git a/apps/www/public/favicon/favicon-128.png b/apps/www/public/favicon/favicon-128.png index 2206096f21b..d5dca345802 100644 Binary files a/apps/www/public/favicon/favicon-128.png and b/apps/www/public/favicon/favicon-128.png differ diff --git a/apps/www/public/favicon/favicon-16x16.png b/apps/www/public/favicon/favicon-16x16.png index 2e07b15e106..fa07282ee8d 100644 Binary files a/apps/www/public/favicon/favicon-16x16.png and b/apps/www/public/favicon/favicon-16x16.png differ diff --git a/apps/www/public/favicon/favicon-196x196.png b/apps/www/public/favicon/favicon-196x196.png index d10fc7e36d9..adb05b43453 100644 Binary files a/apps/www/public/favicon/favicon-196x196.png and b/apps/www/public/favicon/favicon-196x196.png differ diff --git a/apps/www/public/favicon/favicon-32x32.png b/apps/www/public/favicon/favicon-32x32.png index 4101a08499b..7fa29c547a6 100644 Binary files a/apps/www/public/favicon/favicon-32x32.png and b/apps/www/public/favicon/favicon-32x32.png differ diff --git a/apps/www/public/favicon/favicon-96x96.png b/apps/www/public/favicon/favicon-96x96.png index b23072a2c02..0f1351f3670 100644 Binary files a/apps/www/public/favicon/favicon-96x96.png and b/apps/www/public/favicon/favicon-96x96.png differ diff --git a/apps/www/public/favicon/favicon.ico b/apps/www/public/favicon/favicon.ico index 51b9988fdcb..5c4d1dcc5cf 100644 Binary files a/apps/www/public/favicon/favicon.ico and b/apps/www/public/favicon/favicon.ico differ diff --git a/apps/www/public/favicon/archive/mstile-144x144.png b/apps/www/public/favicon/ms-icon-144x144.png similarity index 100% rename from apps/www/public/favicon/archive/mstile-144x144.png rename to apps/www/public/favicon/ms-icon-144x144.png diff --git a/apps/www/public/favicon/archive/mstile-150x150.png b/apps/www/public/favicon/ms-icon-150x150.png similarity index 100% rename from apps/www/public/favicon/archive/mstile-150x150.png rename to apps/www/public/favicon/ms-icon-150x150.png diff --git a/apps/www/public/favicon/archive/mstile-310x310.png b/apps/www/public/favicon/ms-icon-310x310.png similarity index 100% rename from apps/www/public/favicon/archive/mstile-310x310.png rename to apps/www/public/favicon/ms-icon-310x310.png diff --git a/apps/www/public/favicon/ms-icon-70x70.png b/apps/www/public/favicon/ms-icon-70x70.png new file mode 100644 index 00000000000..48f6391fcdc Binary files /dev/null and b/apps/www/public/favicon/ms-icon-70x70.png differ diff --git a/apps/www/public/favicon/mstile-144x144.png b/apps/www/public/favicon/mstile-144x144.png index c73891c985d..00a5d8b5180 100644 Binary files a/apps/www/public/favicon/mstile-144x144.png and b/apps/www/public/favicon/mstile-144x144.png differ diff --git a/apps/www/public/favicon/mstile-150x150.png b/apps/www/public/favicon/mstile-150x150.png index bd10ae0a5df..4de1d9b1cc1 100644 Binary files a/apps/www/public/favicon/mstile-150x150.png and b/apps/www/public/favicon/mstile-150x150.png differ diff --git a/apps/www/public/favicon/mstile-310x150.png b/apps/www/public/favicon/mstile-310x150.png index fb4d58022df..b1121df62aa 100644 Binary files a/apps/www/public/favicon/mstile-310x150.png and b/apps/www/public/favicon/mstile-310x150.png differ diff --git a/apps/www/public/favicon/mstile-310x310.png b/apps/www/public/favicon/mstile-310x310.png index 0adc45ea0ac..7ea95ae09c0 100644 Binary files a/apps/www/public/favicon/mstile-310x310.png and b/apps/www/public/favicon/mstile-310x310.png differ diff --git a/apps/www/public/favicon/mstile-70x70.png b/apps/www/public/favicon/mstile-70x70.png index 2206096f21b..d5dca345802 100644 Binary files a/apps/www/public/favicon/mstile-70x70.png and b/apps/www/public/favicon/mstile-70x70.png differ diff --git a/apps/www/public/images/blog/launch-week-7/day-5-community-highlights/day-5-community-highlights-digitalocean-and-stackgres.png b/apps/www/public/images/blog/launch-week-7/day-5-community-highlights/day-5-community-highlights-digitalocean-and-stackgres.png new file mode 100644 index 00000000000..543665ada3a Binary files /dev/null and b/apps/www/public/images/blog/launch-week-7/day-5-community-highlights/day-5-community-highlights-digitalocean-and-stackgres.png differ diff --git a/apps/www/public/images/blog/launch-week-7/day-5-community-highlights/day-5-community-highlights-extensions.png b/apps/www/public/images/blog/launch-week-7/day-5-community-highlights/day-5-community-highlights-extensions.png new file mode 100644 index 00000000000..a020c884006 Binary files /dev/null and b/apps/www/public/images/blog/launch-week-7/day-5-community-highlights/day-5-community-highlights-extensions.png differ diff --git a/apps/www/public/images/blog/launch-week-7/day-5-community-highlights/day-5-community-highlights-libraries.png b/apps/www/public/images/blog/launch-week-7/day-5-community-highlights/day-5-community-highlights-libraries.png new file mode 100644 index 00000000000..52f1bbebf90 Binary files /dev/null and b/apps/www/public/images/blog/launch-week-7/day-5-community-highlights/day-5-community-highlights-libraries.png differ diff --git a/apps/www/public/images/blog/launch-week-7/day-5-community-highlights/day-5-community-highlights-og.jpg b/apps/www/public/images/blog/launch-week-7/day-5-community-highlights/day-5-community-highlights-og.jpg new file mode 100644 index 00000000000..d848e47eda5 Binary files /dev/null and b/apps/www/public/images/blog/launch-week-7/day-5-community-highlights/day-5-community-highlights-og.jpg differ diff --git a/apps/www/public/images/blog/launch-week-7/day-5-community-highlights/day-5-community-highlights-partners.png b/apps/www/public/images/blog/launch-week-7/day-5-community-highlights/day-5-community-highlights-partners.png new file mode 100644 index 00000000000..e2ea1f228e2 Binary files /dev/null and b/apps/www/public/images/blog/launch-week-7/day-5-community-highlights/day-5-community-highlights-partners.png differ diff --git a/apps/www/public/images/blog/launch-week-7/day-5-community-highlights/day-5-community-highlights-thumb.jpg b/apps/www/public/images/blog/launch-week-7/day-5-community-highlights/day-5-community-highlights-thumb.jpg new file mode 100644 index 00000000000..b4061d7379a Binary files /dev/null and b/apps/www/public/images/blog/launch-week-7/day-5-community-highlights/day-5-community-highlights-thumb.jpg differ diff --git a/apps/www/public/images/blog/launch-week-7/day-5-one-more-thing/day-5-dbdev-og.jpg b/apps/www/public/images/blog/launch-week-7/day-5-one-more-thing/day-5-dbdev-og.jpg new file mode 100644 index 00000000000..2a859a3b724 Binary files /dev/null and b/apps/www/public/images/blog/launch-week-7/day-5-one-more-thing/day-5-dbdev-og.jpg differ diff --git a/apps/www/public/images/blog/launch-week-7/day-5-one-more-thing/day-5-dbdev-thumb.jpg b/apps/www/public/images/blog/launch-week-7/day-5-one-more-thing/day-5-dbdev-thumb.jpg new file mode 100644 index 00000000000..c4a4e5325c5 Binary files /dev/null and b/apps/www/public/images/blog/launch-week-7/day-5-one-more-thing/day-5-dbdev-thumb.jpg differ diff --git a/apps/www/public/images/blog/launch-week-7/day-5-one-more-thing/dbdev-landing.png b/apps/www/public/images/blog/launch-week-7/day-5-one-more-thing/dbdev-landing.png new file mode 100644 index 00000000000..af7e5ab0f98 Binary files /dev/null and b/apps/www/public/images/blog/launch-week-7/day-5-one-more-thing/dbdev-landing.png differ diff --git a/apps/www/public/images/blog/launch-week-7/day-5-one-more-thing/dbdev-og.jpg b/apps/www/public/images/blog/launch-week-7/day-5-one-more-thing/dbdev-og.jpg new file mode 100644 index 00000000000..d02bf3e1873 Binary files /dev/null and b/apps/www/public/images/blog/launch-week-7/day-5-one-more-thing/dbdev-og.jpg differ diff --git a/apps/www/public/images/blog/launch-week-7/day-5-supabase-pg-tle/day-5-postgres-tle-og.jpg b/apps/www/public/images/blog/launch-week-7/day-5-supabase-pg-tle/day-5-postgres-tle-og.jpg new file mode 100644 index 00000000000..68f64e86071 Binary files /dev/null and b/apps/www/public/images/blog/launch-week-7/day-5-supabase-pg-tle/day-5-postgres-tle-og.jpg differ diff --git a/apps/www/public/images/blog/launch-week-7/day-5-supabase-pg-tle/day-5-postgres-tle-thumb.jpg b/apps/www/public/images/blog/launch-week-7/day-5-supabase-pg-tle/day-5-postgres-tle-thumb.jpg new file mode 100644 index 00000000000..e0a742192ba Binary files /dev/null and b/apps/www/public/images/blog/launch-week-7/day-5-supabase-pg-tle/day-5-postgres-tle-thumb.jpg differ diff --git a/apps/www/public/images/blog/launch-week-7/day-5-supabase-studio-2.0/day-5-supabase-studio-2.0-og.jpg b/apps/www/public/images/blog/launch-week-7/day-5-supabase-studio-2.0/day-5-supabase-studio-2.0-og.jpg new file mode 100644 index 00000000000..c6ced3d0eae Binary files /dev/null and b/apps/www/public/images/blog/launch-week-7/day-5-supabase-studio-2.0/day-5-supabase-studio-2.0-og.jpg differ diff --git a/apps/www/public/images/blog/launch-week-7/day-5-supabase-studio-2.0/day-5-supabase-studio-2.0-thumb.jpg b/apps/www/public/images/blog/launch-week-7/day-5-supabase-studio-2.0/day-5-supabase-studio-2.0-thumb.jpg new file mode 100644 index 00000000000..8e9339b03ad Binary files /dev/null and b/apps/www/public/images/blog/launch-week-7/day-5-supabase-studio-2.0/day-5-supabase-studio-2.0-thumb.jpg differ diff --git a/apps/www/public/images/blog/lw7-studio/api-autodocs.png b/apps/www/public/images/blog/lw7-studio/api-autodocs.png new file mode 100644 index 00000000000..a313b6e437f Binary files /dev/null and b/apps/www/public/images/blog/lw7-studio/api-autodocs.png differ diff --git a/apps/www/public/images/blog/lw7-studio/cmdk-1.png b/apps/www/public/images/blog/lw7-studio/cmdk-1.png new file mode 100644 index 00000000000..66b46bb1f4a Binary files /dev/null and b/apps/www/public/images/blog/lw7-studio/cmdk-1.png differ diff --git a/apps/www/public/images/blog/lw7-studio/cmdk-2.png b/apps/www/public/images/blog/lw7-studio/cmdk-2.png new file mode 100644 index 00000000000..91fe39ccfcb Binary files /dev/null and b/apps/www/public/images/blog/lw7-studio/cmdk-2.png differ diff --git a/apps/www/public/images/blog/lw7-studio/cmdk-3.png b/apps/www/public/images/blog/lw7-studio/cmdk-3.png new file mode 100644 index 00000000000..b200bd5c716 Binary files /dev/null and b/apps/www/public/images/blog/lw7-studio/cmdk-3.png differ diff --git a/apps/www/public/images/blog/lw7-studio/cmdk-4.png b/apps/www/public/images/blog/lw7-studio/cmdk-4.png new file mode 100644 index 00000000000..201f70799f5 Binary files /dev/null and b/apps/www/public/images/blog/lw7-studio/cmdk-4.png differ diff --git a/apps/www/public/images/blog/lw7-studio/cmdk-5.png b/apps/www/public/images/blog/lw7-studio/cmdk-5.png new file mode 100644 index 00000000000..dc344534d0e Binary files /dev/null and b/apps/www/public/images/blog/lw7-studio/cmdk-5.png differ diff --git a/apps/www/public/images/blog/lw7-studio/definitions.png b/apps/www/public/images/blog/lw7-studio/definitions.png new file mode 100644 index 00000000000..0efeb206da6 Binary files /dev/null and b/apps/www/public/images/blog/lw7-studio/definitions.png differ diff --git a/apps/www/public/images/blog/lw7-studio/foreign-table-lookup-1.png b/apps/www/public/images/blog/lw7-studio/foreign-table-lookup-1.png new file mode 100644 index 00000000000..8575ad980b6 Binary files /dev/null and b/apps/www/public/images/blog/lw7-studio/foreign-table-lookup-1.png differ diff --git a/apps/www/public/images/blog/lw7-studio/foreign-table-lookup-2.png b/apps/www/public/images/blog/lw7-studio/foreign-table-lookup-2.png new file mode 100644 index 00000000000..35ddb47dbc8 Binary files /dev/null and b/apps/www/public/images/blog/lw7-studio/foreign-table-lookup-2.png differ diff --git a/apps/www/public/images/blog/lw7-studio/foreign-table-lookup-3.png b/apps/www/public/images/blog/lw7-studio/foreign-table-lookup-3.png new file mode 100644 index 00000000000..624583356bd Binary files /dev/null and b/apps/www/public/images/blog/lw7-studio/foreign-table-lookup-3.png differ diff --git a/apps/www/public/images/blog/lw7-studio/foreign-table-lookup-4.png b/apps/www/public/images/blog/lw7-studio/foreign-table-lookup-4.png new file mode 100644 index 00000000000..9d7d3a98bcb Binary files /dev/null and b/apps/www/public/images/blog/lw7-studio/foreign-table-lookup-4.png differ diff --git a/apps/www/public/images/blog/lw7-studio/foreign-table-lookup-5.png b/apps/www/public/images/blog/lw7-studio/foreign-table-lookup-5.png new file mode 100644 index 00000000000..f3c86482b93 Binary files /dev/null and b/apps/www/public/images/blog/lw7-studio/foreign-table-lookup-5.png differ diff --git a/apps/www/public/images/blog/lw7-studio/foreign-table-lookup-6.png b/apps/www/public/images/blog/lw7-studio/foreign-table-lookup-6.png new file mode 100644 index 00000000000..e1ad302ac9d Binary files /dev/null and b/apps/www/public/images/blog/lw7-studio/foreign-table-lookup-6.png differ diff --git a/apps/www/public/images/blog/lw7-studio/foreign-table-lookup-7.png b/apps/www/public/images/blog/lw7-studio/foreign-table-lookup-7.png new file mode 100644 index 00000000000..97b5f91250d Binary files /dev/null and b/apps/www/public/images/blog/lw7-studio/foreign-table-lookup-7.png differ diff --git a/apps/www/public/images/blog/lw7-studio/graphiql.png b/apps/www/public/images/blog/lw7-studio/graphiql.png new file mode 100644 index 00000000000..5b410ba0212 Binary files /dev/null and b/apps/www/public/images/blog/lw7-studio/graphiql.png differ diff --git a/apps/www/public/images/blog/lw7-studio/query-performance.png b/apps/www/public/images/blog/lw7-studio/query-performance.png new file mode 100644 index 00000000000..499210a0a3f Binary files /dev/null and b/apps/www/public/images/blog/lw7-studio/query-performance.png differ diff --git a/apps/www/public/images/blog/lw7-studio/roles.png b/apps/www/public/images/blog/lw7-studio/roles.png new file mode 100644 index 00000000000..d6718a6c05a Binary files /dev/null and b/apps/www/public/images/blog/lw7-studio/roles.png differ diff --git a/apps/www/public/images/blog/lw7-studio/webhooks.png b/apps/www/public/images/blog/lw7-studio/webhooks.png new file mode 100644 index 00000000000..feee0616f4e Binary files /dev/null and b/apps/www/public/images/blog/lw7-studio/webhooks.png differ diff --git a/apps/www/public/images/launchweek/seven/day5/community/community-01-01-mobile.jpg b/apps/www/public/images/launchweek/seven/day5/community/community-01-01-mobile.jpg new file mode 100644 index 00000000000..0ef6572cc64 Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/community/community-01-01-mobile.jpg differ diff --git a/apps/www/public/images/launchweek/seven/day5/community/community-01-01.jpg b/apps/www/public/images/launchweek/seven/day5/community/community-01-01.jpg new file mode 100644 index 00000000000..65fb45763d3 Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/community/community-01-01.jpg differ diff --git a/apps/www/public/images/launchweek/seven/day5/community/community-01-02-mobile.png b/apps/www/public/images/launchweek/seven/day5/community/community-01-02-mobile.png new file mode 100644 index 00000000000..1e571650ac9 Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/community/community-01-02-mobile.png differ diff --git a/apps/www/public/images/launchweek/seven/day5/community/community-01-02.png b/apps/www/public/images/launchweek/seven/day5/community/community-01-02.png new file mode 100644 index 00000000000..a721eade18f Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/community/community-01-02.png differ diff --git a/apps/www/public/images/launchweek/seven/day5/community/community-thumb.jpg b/apps/www/public/images/launchweek/seven/day5/community/community-thumb.jpg new file mode 100644 index 00000000000..5e6deee9749 Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/community/community-thumb.jpg differ diff --git a/apps/www/public/images/launchweek/seven/day5/one-more-thing/dbdev-thumb.jpg b/apps/www/public/images/launchweek/seven/day5/one-more-thing/dbdev-thumb.jpg new file mode 100644 index 00000000000..ac959cd831a Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/one-more-thing/dbdev-thumb.jpg differ diff --git a/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-01-01-mobile.jpg b/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-01-01-mobile.jpg new file mode 100644 index 00000000000..df6a08ff8c5 Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-01-01-mobile.jpg differ diff --git a/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-01-01.jpg b/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-01-01.jpg new file mode 100644 index 00000000000..715807da35d Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-01-01.jpg differ diff --git a/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-01-02-mobile.png b/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-01-02-mobile.png new file mode 100644 index 00000000000..c7a509e2f50 Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-01-02-mobile.png differ diff --git a/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-01-02.png b/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-01-02.png new file mode 100644 index 00000000000..955e3b1ac97 Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-01-02.png differ diff --git a/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-01-03.png b/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-01-03.png new file mode 100644 index 00000000000..6a0322ace8b Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-01-03.png differ diff --git a/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-02-01-mobile.jpg b/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-02-01-mobile.jpg new file mode 100644 index 00000000000..df6a08ff8c5 Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-02-01-mobile.jpg differ diff --git a/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-02-01.jpg b/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-02-01.jpg new file mode 100644 index 00000000000..d95e224c356 Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-02-01.jpg differ diff --git a/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-02-02-mobile.png b/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-02-02-mobile.png new file mode 100644 index 00000000000..ed1864c44d8 Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-02-02-mobile.png differ diff --git a/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-02-02.png b/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-02-02.png new file mode 100644 index 00000000000..caa96a11f80 Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-02-02.png differ diff --git a/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-02-03.png b/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-02-03.png new file mode 100644 index 00000000000..6efe1d128af Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-02-03.png differ diff --git a/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-02-mobile.jpg b/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-02-mobile.jpg new file mode 100644 index 00000000000..9260061c806 Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/one-more-thing/omt-02-mobile.jpg differ diff --git a/apps/www/public/images/launchweek/seven/day5/one-more-thing/pgTLE-thumb.jpg b/apps/www/public/images/launchweek/seven/day5/one-more-thing/pgTLE-thumb.jpg new file mode 100644 index 00000000000..77b6a43a9f0 Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/one-more-thing/pgTLE-thumb.jpg differ diff --git a/apps/www/public/images/launchweek/seven/day5/studio/studio-01-commandK-mobile.jpg b/apps/www/public/images/launchweek/seven/day5/studio/studio-01-commandK-mobile.jpg new file mode 100644 index 00000000000..226bc0221da Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/studio/studio-01-commandK-mobile.jpg differ diff --git a/apps/www/public/images/launchweek/seven/day5/studio/studio-01-commandK.jpg b/apps/www/public/images/launchweek/seven/day5/studio/studio-01-commandK.jpg new file mode 100644 index 00000000000..696fb7aa62d Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/studio/studio-01-commandK.jpg differ diff --git a/apps/www/public/images/launchweek/seven/day5/studio/studio-02-wrappers.jpg b/apps/www/public/images/launchweek/seven/day5/studio/studio-02-wrappers.jpg new file mode 100644 index 00000000000..db4fec50f47 Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/studio/studio-02-wrappers.jpg differ diff --git a/apps/www/public/images/launchweek/seven/day5/studio/studio-03-nullableCols.jpg b/apps/www/public/images/launchweek/seven/day5/studio/studio-03-nullableCols.jpg new file mode 100644 index 00000000000..323d3a91c52 Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/studio/studio-03-nullableCols.jpg differ diff --git a/apps/www/public/images/launchweek/seven/day5/studio/studio-04-apiAutodocs.jpg b/apps/www/public/images/launchweek/seven/day5/studio/studio-04-apiAutodocs.jpg new file mode 100644 index 00000000000..30f55e73eb1 Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/studio/studio-04-apiAutodocs.jpg differ diff --git a/apps/www/public/images/launchweek/seven/day5/studio/studio-05-pgRoles.jpg b/apps/www/public/images/launchweek/seven/day5/studio/studio-05-pgRoles.jpg new file mode 100644 index 00000000000..f22aa135f93 Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/studio/studio-05-pgRoles.jpg differ diff --git a/apps/www/public/images/launchweek/seven/day5/studio/studio-06-casDeletes.jpg b/apps/www/public/images/launchweek/seven/day5/studio/studio-06-casDeletes.jpg new file mode 100644 index 00000000000..b7e2478fb98 Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/studio/studio-06-casDeletes.jpg differ diff --git a/apps/www/public/images/launchweek/seven/day5/studio/studio-07-graphiQL-02.jpg b/apps/www/public/images/launchweek/seven/day5/studio/studio-07-graphiQL-02.jpg new file mode 100644 index 00000000000..c2b5ee866d4 Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/studio/studio-07-graphiQL-02.jpg differ diff --git a/apps/www/public/images/launchweek/seven/day5/studio/studio-07-graphiQL.jpg b/apps/www/public/images/launchweek/seven/day5/studio/studio-07-graphiQL.jpg new file mode 100644 index 00000000000..ea0f808837c Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/studio/studio-07-graphiQL.jpg differ diff --git a/apps/www/public/images/launchweek/seven/day5/studio/studio-08-dbWebhooks-mobile.jpg b/apps/www/public/images/launchweek/seven/day5/studio/studio-08-dbWebhooks-mobile.jpg new file mode 100644 index 00000000000..68e70a81e81 Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/studio/studio-08-dbWebhooks-mobile.jpg differ diff --git a/apps/www/public/images/launchweek/seven/day5/studio/studio-08-dbWebhooks.jpg b/apps/www/public/images/launchweek/seven/day5/studio/studio-08-dbWebhooks.jpg new file mode 100644 index 00000000000..f61b5177adb Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/studio/studio-08-dbWebhooks.jpg differ diff --git a/apps/www/public/images/launchweek/seven/day5/studio/studio-09-viewsTables.jpg b/apps/www/public/images/launchweek/seven/day5/studio/studio-09-viewsTables.jpg new file mode 100644 index 00000000000..b441167c1c4 Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/studio/studio-09-viewsTables.jpg differ diff --git a/apps/www/public/images/launchweek/seven/day5/studio/studio-10-JSONsupport.jpg b/apps/www/public/images/launchweek/seven/day5/studio/studio-10-JSONsupport.jpg new file mode 100644 index 00000000000..2d4d209250e Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/studio/studio-10-JSONsupport.jpg differ diff --git a/apps/www/public/images/launchweek/seven/day5/studio/studio-11-insights.jpg b/apps/www/public/images/launchweek/seven/day5/studio/studio-11-insights.jpg new file mode 100644 index 00000000000..b57abca8a22 Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/studio/studio-11-insights.jpg differ diff --git a/apps/www/public/images/launchweek/seven/day5/studio/studio-thumb.jpg b/apps/www/public/images/launchweek/seven/day5/studio/studio-thumb.jpg new file mode 100644 index 00000000000..d32a35876ac Binary files /dev/null and b/apps/www/public/images/launchweek/seven/day5/studio/studio-thumb.jpg differ diff --git a/apps/www/public/rss.xml b/apps/www/public/rss.xml index 3b2c28456d7..ed2bb354633 100644 --- a/apps/www/public/rss.xml +++ b/apps/www/public/rss.xml @@ -5,1197 +5,1225 @@ https://supabase.com Latest news from Supabase en - Wed, 12 Apr 2023 16:04:00 +0000 + Thu, 13 Apr 2023 22:10:00 +0000 + https://supabase.com/blog/supabase-studio-2.0 + Supabase Studio 2.0: help when you need it most + https://supabase.com/blog/supabase-studio-2.0 + undefined + Thu, 13 Apr 2023 22:10:00 +0000 + + + https://supabase.com/blog/dbdev + dbdev: PostgreSQL Package Manager + https://supabase.com/blog/dbdev + We're publicly previewing dbdev, a PostgreSQL package manager. + Thu, 13 Apr 2023 22:10:00 +0000 + + + https://supabase.com/blog/pg-tle + Trusted Language Extensions for Postgres + https://supabase.com/blog/pg-tle + undefined + Thu, 13 Apr 2023 22:10:00 +0000 + + + https://supabase.com/blog/launch-week-7-community-highlights + Launch Week 7 Community Highlights + https://supabase.com/blog/launch-week-7-community-highlights + undefined + Thu, 13 Apr 2023 22:10:00 +0000 + + https://supabase.com/blog/supabase-auth-sso-pkce Supabase Auth: SSO, Mobile, and Server-side support https://supabase.com/blog/supabase-auth-sso-pkce undefined - Wed, 12 Apr 2023 16:04:00 +0000 + Wed, 12 Apr 2023 22:10:00 +0000 https://supabase.com/blog/storage-v3-resumable-uploads Supabase Storage v3: Resumable Uploads with support for 50GB files https://supabase.com/blog/storage-v3-resumable-uploads undefined - Tue, 11 Apr 2023 16:04:00 +0000 + Tue, 11 Apr 2023 22:10:00 +0000 https://supabase.com/blog/edge-runtime-self-hosted-deno-functions Supabase Edge Runtime: Self-hosted Deno Functions https://supabase.com/blog/edge-runtime-self-hosted-deno-functions undefined - Mon, 10 Apr 2023 16:04:00 +0000 + Mon, 10 Apr 2023 22:10:00 +0000 https://supabase.com/blog/supabase-logs-self-hosted Supabase Logs: open source logging server https://supabase.com/blog/supabase-logs-self-hosted undefined - Sun, 09 Apr 2023 16:04:00 +0000 + Sun, 09 Apr 2023 22:10:00 +0000 https://supabase.com/blog/supabase-beta-update-march-2023 Supabase Beta March 2023 https://supabase.com/blog/supabase-beta-update-march-2023 We are in full shipping mode 🛥️… Launch Week 7 can’t come quickly enough! - Fri, 07 Apr 2023 16:04:00 +0000 + Fri, 07 Apr 2023 22:10:00 +0000 https://supabase.com/blog/launch-week-7-hackathon The Supabase AI Hackathon https://supabase.com/blog/launch-week-7-hackathon Build an Open Source Project over 10 days. 5 prize categories. - Thu, 06 Apr 2023 16:04:00 +0000 + Thu, 06 Apr 2023 22:10:00 +0000 https://supabase.com/blog/designing-with-ai-midjourney Designing with AI: Generating unique artwork for every user https://supabase.com/blog/designing-with-ai-midjourney Using MidJourney to generative artwork and serving ticket images with Edge Functions - Thu, 06 Apr 2023 16:04:00 +0000 + Thu, 06 Apr 2023 22:10:00 +0000 https://supabase.com/blog/infinite-scroll-with-nextjs-framer-motion Infinite scroll with Next.js, Framer Motion, and Supabase https://supabase.com/blog/infinite-scroll-with-nextjs-framer-motion Lazy load and paginate data on scroll with Next.js and a sprinkle of Framer Motion magic ✨ - Mon, 03 Apr 2023 16:04:00 +0000 + Mon, 03 Apr 2023 22:10:00 +0000 https://supabase.com/blog/supaclub SupaClub https://supabase.com/blog/supaclub The Worlds First Software Engineering Nightclub. - Fri, 31 Mar 2023 16:04:00 +0000 + Fri, 31 Mar 2023 22:10:00 +0000 https://supabase.com/blog/supabase-beta-update-february-2023 Supabase Beta February 2023 https://supabase.com/blog/supabase-beta-update-february-2023 There is something for everybody this month - AI, Auth, Database, Edge Functions, GraphQL … you name it! - Wed, 08 Mar 2023 16:04:00 +0000 + Wed, 08 Mar 2023 23:11:00 +0000 https://supabase.com/blog/geo-queries-with-postgis-in-ionic-angular Geo Queries with PostGIS in Ionic Angular https://supabase.com/blog/geo-queries-with-postgis-in-ionic-angular Using the PostGIS extension to build a cross-platform application with Ionic Angular. - Tue, 28 Feb 2023 16:04:00 +0000 + Tue, 28 Feb 2023 23:11:00 +0000 https://supabase.com/blog/type-constraints-in-65-lines-of-sql Type Constraints in 65 lines of SQL https://supabase.com/blog/type-constraints-in-65-lines-of-sql Creating validated data types in Postgres - Thu, 16 Feb 2023 16:04:00 +0000 + Thu, 16 Feb 2023 23:11:00 +0000 https://supabase.com/blog/case-study-happyteams HappyTeams unlocks better performance and reduces cost with Supabase https://supabase.com/blog/case-study-happyteams How a bootstrapped startup migrated from Heroku to Supabase in 30 minutes and never looked back - Wed, 15 Feb 2023 16:04:00 +0000 + Wed, 15 Feb 2023 23:11:00 +0000 https://supabase.com/blog/flutter-real-time-multiplayer-game How to build a real-time multiplayer game with Flutter Flame https://supabase.com/blog/flutter-real-time-multiplayer-game Build a real-time multiplayer game using Flutter, Flame, and Supabase realtime. - Mon, 13 Feb 2023 16:04:00 +0000 + Mon, 13 Feb 2023 23:11:00 +0000 https://supabase.com/blog/supabase-beta-january-2023 Supabase Beta January 2023 https://supabase.com/blog/supabase-beta-january-2023 New Postgres extensions, pg_graphql updates, changes to Edge Functions, and more! - Tue, 07 Feb 2023 16:04:00 +0000 + Tue, 07 Feb 2023 23:11:00 +0000 https://supabase.com/blog/chatgpt-supabase-docs Supabase Clippy: ChatGPT for Supabase Docs https://supabase.com/blog/chatgpt-supabase-docs Creating a ChatGPT interface for the Supabase documentation. - Mon, 06 Feb 2023 16:04:00 +0000 + Mon, 06 Feb 2023 23:11:00 +0000 https://supabase.com/blog/openai-embeddings-postgres-vector Storing OpenAI embeddings in Postgres with pgvector https://supabase.com/blog/openai-embeddings-postgres-vector An example of how to build an AI-powered search engine using OpenAI's embeddings and PostgreSQL. - Sun, 05 Feb 2023 16:04:00 +0000 + Sun, 05 Feb 2023 23:11:00 +0000 https://supabase.com/blog/supabase-beta-december-2022 Supabase Beta December 2022 https://supabase.com/blog/supabase-beta-december-2022 This month the Beta Update is a Launch Week 6 Special, where we review the cascade of announcements. - Wed, 04 Jan 2023 16:04:00 +0000 + Wed, 04 Jan 2023 23:11:00 +0000 https://supabase.com/blog/launch-week-6-hackathon-winners Launch Week 6 Hackathon Winners https://supabase.com/blog/launch-week-6-hackathon-winners Announcing the winners of the Launch Week 6 Hackathon! - Mon, 02 Jan 2023 16:04:00 +0000 + Mon, 02 Jan 2023 23:11: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 16:04:00 +0000 + Thu, 15 Dec 2022 23:11: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 16:04:00 +0000 + Thu, 15 Dec 2022 23:11: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 16:04:00 +0000 + Thu, 15 Dec 2022 23:11: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 16:04:00 +0000 + Thu, 15 Dec 2022 23:11: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 16:04:00 +0000 + Thu, 15 Dec 2022 23:11:00 +0000 https://supabase.com/blog/launch-week-6-wrap-up Launch Week 6: Wrap Up https://supabase.com/blog/launch-week-6-wrap-up That's a wrap on Supabase Launch Week Day 6. Here's everything we shipped in one long blog post. - Thu, 15 Dec 2022 16:04:00 +0000 + Thu, 15 Dec 2022 23:11:00 +0000 https://supabase.com/blog/launch-week-6-community-day Community Day https://supabase.com/blog/launch-week-6-community-day Wrapping up Launch Week 6 with contributors, partners, and friends. - Thu, 15 Dec 2022 16:04:00 +0000 + Thu, 15 Dec 2022 23:11:00 +0000 https://supabase.com/blog/custom-domain-names Custom Domain Names https://supabase.com/blog/custom-domain-names Change your Supabase project's domain name to your own domain. - Thu, 15 Dec 2022 16:04:00 +0000 + Thu, 15 Dec 2022 23:11:00 +0000 https://supabase.com/blog/postgres-foreign-data-wrappers-rust Supabase Wrappers, a Postgres FDW framework written in Rust https://supabase.com/blog/postgres-foreign-data-wrappers-rust A framework for building Postgres Foreign Data Wrappers which connects to Stripe, Firebase, Clickhouse, and more. - Wed, 14 Dec 2022 16:04:00 +0000 + Wed, 14 Dec 2022 23:11:00 +0000 https://supabase.com/blog/mfa-auth-via-rls Multi-factor Authentication via Row Level Security Enforcement https://supabase.com/blog/mfa-auth-via-rls MFA Auth with enforcement via RLS - Tue, 13 Dec 2022 16:04:00 +0000 + Tue, 13 Dec 2022 23:11:00 +0000 https://supabase.com/blog/storage-image-resizing-smart-cdn Supabase Storage v2: Image resizing and Smart CDN https://supabase.com/blog/storage-image-resizing-smart-cdn We're introducing new features for Supabase Storage: Image resizing and a Smart CDN. - Mon, 12 Dec 2022 16:04:00 +0000 + Mon, 12 Dec 2022 23:11:00 +0000 https://supabase.com/blog/new-supabase-docs-built-with-nextjs New Supabase Docs, built with Next.js https://supabase.com/blog/new-supabase-docs-built-with-nextjs We've redesigned our Docs and migrated to Next.js - Sun, 11 Dec 2022 16:04:00 +0000 + Sun, 11 Dec 2022 23:11: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 16:04:00 +0000 + Fri, 09 Dec 2022 23:11:00 +0000 https://supabase.com/blog/who-we-hire Who We Hire at Supabase https://supabase.com/blog/who-we-hire Traits we look for to maintain a culture of shipping fast and often - Thu, 08 Dec 2022 16:04:00 +0000 + Thu, 08 Dec 2022 23:11:00 +0000 https://supabase.com/blog/launch-week-6-hackathon Launch Week 6 Hackathon https://supabase.com/blog/launch-week-6-hackathon Build an Open Source Project, Win $1500 and the Supabase Darkmode Keyboard - Thu, 08 Dec 2022 16:04:00 +0000 + Thu, 08 Dec 2022 23:11:00 +0000 https://supabase.com/blog/supabase-beta-november-2022 Supabase Beta November 2022 https://supabase.com/blog/supabase-beta-november-2022 We are preparing everything for Launch Week 6, but we still had time to ship some goodies this month! - Tue, 06 Dec 2022 16:04:00 +0000 + Tue, 06 Dec 2022 23:11:00 +0000 https://supabase.com/blog/the-supabase-content-storm The Supabase Content Storm https://supabase.com/blog/the-supabase-content-storm We worked with +30 content creators to drop a mountain of content simultaneously. - Mon, 05 Dec 2022 16:04:00 +0000 + Mon, 05 Dec 2022 23:11: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 16:04:00 +0000 + Wed, 30 Nov 2022 23:11: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 16:04:00 +0000 + Wed, 23 Nov 2022 23:11:00 +0000 https://supabase.com/blog/flutter-authentication-and-authorization-with-rls Flutter Authentication and Authorization with RLS https://supabase.com/blog/flutter-authentication-and-authorization-with-rls Learn how you can secure your Flutter app using Supabase Row Level Security. - Mon, 21 Nov 2022 16:04:00 +0000 + Mon, 21 Nov 2022 23:11:00 +0000 https://supabase.com/blog/fetching-and-caching-supabase-data-in-next-js-server-components Fetching and caching Supabase data in Next.js 13 Server Components https://supabase.com/blog/fetching-and-caching-supabase-data-in-next-js-server-components Next.js 13 introduces new data fetching and caching methods to enable React Server Components and Suspense. - Wed, 16 Nov 2022 16:04:00 +0000 + Wed, 16 Nov 2022 23:11:00 +0000 https://supabase.com/blog/authentication-in-ionic-angular Authentication in Ionic Angular with Supabase https://supabase.com/blog/authentication-in-ionic-angular Learn how to build an Ionic Angular app with authentication, Row Level Security, and Magic Link auth. - Mon, 07 Nov 2022 16:04:00 +0000 + Mon, 07 Nov 2022 23:11:00 +0000 https://supabase.com/blog/supabase-beta-update-october-2022 Supabase Beta October 2022 https://supabase.com/blog/supabase-beta-update-october-2022 New SDKs, quickstarts, Functions tricks, and more. But, more importantly, Launch Week 6️ has a date! - Tue, 01 Nov 2022 16:04:00 +0000 + Tue, 01 Nov 2022 23:11: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 16:04:00 +0000 + Wed, 26 Oct 2022 22:10:00 +0000 https://supabase.com/blog/supabase-flutter-sdk-v1-released supabase-flutter v1 Released https://supabase.com/blog/supabase-flutter-sdk-v1-released We've released supabase-flutter v1. More intuitive way of accessing Supabase from your Flutter application. - Thu, 20 Oct 2022 16:04:00 +0000 + Thu, 20 Oct 2022 22:10:00 +0000 https://supabase.com/blog/supabase-js-v2-released supabase-js v2 Released https://supabase.com/blog/supabase-js-v2-released We've released supabase-js v2. Updated examples, quickstarts, and an improved experience. - Wed, 19 Oct 2022 16:04:00 +0000 + Wed, 19 Oct 2022 22:10: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 16:04:00 +0000 + Thu, 13 Oct 2022 22:10:00 +0000 https://supabase.com/blog/supabase-beta-update-september-2022 Supabase Beta September 2022 https://supabase.com/blog/supabase-beta-update-september-2022 We were too focused on clearing out the backlog so we didn't ship anything new last month... or did we?! - Tue, 04 Oct 2022 16:04:00 +0000 + Tue, 04 Oct 2022 22:10: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 16:04:00 +0000 + Sun, 02 Oct 2022 22:10: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 16:04:00 +0000 + Wed, 07 Sep 2022 22:10:00 +0000 https://supabase.com/blog/supabase-beta-update-august-2022 Supabase Beta August 2022 https://supabase.com/blog/supabase-beta-update-august-2022 Launch Week Special. See everything we shipped, plus winners of the Hackathon and the extended Community Highlights - Tue, 06 Sep 2022 16:04:00 +0000 + Tue, 06 Sep 2022 22:10:00 +0000 https://supabase.com/blog/launch-week-5-hackathon-winners Launch Week 5 Hackathon Winners https://supabase.com/blog/launch-week-5-hackathon-winners Announcing the winners of the Launch Week 5 Hackathon! - Wed, 24 Aug 2022 16:04:00 +0000 + Wed, 24 Aug 2022 22:10:00 +0000 https://supabase.com/blog/building-a-realtime-trello-board-with-supabase-and-angular Building a Realtime Trello Board with Supabase and Angular https://supabase.com/blog/building-a-realtime-trello-board-with-supabase-and-angular Go beyond the hello world example with this real world project. - Tue, 23 Aug 2022 16:04:00 +0000 + Tue, 23 Aug 2022 22:10:00 +0000 https://supabase.com/blog/supabase-vault Supabase Vault https://supabase.com/blog/supabase-vault Today we're announcing Vault, a Postgres extension for managing secrets and encryption inside your database. - Thu, 18 Aug 2022 16:04:00 +0000 + Thu, 18 Aug 2022 22:10:00 +0000 https://supabase.com/blog/postgrest-v10 PostgREST v10: EXPLAIN and Improved Relationship Detection https://supabase.com/blog/postgrest-v10 Today, PostgREST 10 was released. Let's take a look at some of the new features that go hand in hand with supabase-js v2. - Thu, 18 Aug 2022 16:04:00 +0000 + Thu, 18 Aug 2022 22:10:00 +0000 https://supabase.com/blog/pg-jsonschema-a-postgres-extension-for-json-validation pg_jsonschema: JSON Schema support for Postgres https://supabase.com/blog/pg-jsonschema-a-postgres-extension-for-json-validation Today we're releasing pg_jsonschema, a Postgres extension for JSON validation. - Thu, 18 Aug 2022 16:04:00 +0000 + Thu, 18 Aug 2022 22:10:00 +0000 https://supabase.com/blog/launch-week-5-one-more-thing One more thing https://supabase.com/blog/launch-week-5-one-more-thing Let's be honest, it's never just one more thing. - Thu, 18 Aug 2022 16:04:00 +0000 + Thu, 18 Aug 2022 22:10:00 +0000 https://supabase.com/blog/launch-week-5-community-day Community Day https://supabase.com/blog/launch-week-5-community-day Wrapping up Launch Week 5 with contributors, partners, and friends. - Thu, 18 Aug 2022 16:04:00 +0000 + Thu, 18 Aug 2022 22:10:00 +0000 https://supabase.com/blog/supabase-realtime-multiplayer-general-availability Realtime: Multiplayer Edition https://supabase.com/blog/supabase-realtime-multiplayer-general-availability Announcing the general availability of Realtime's Broadcast and Presence. - Wed, 17 Aug 2022 16:04:00 +0000 + Wed, 17 Aug 2022 22:10:00 +0000 https://supabase.com/blog/supabase-soc2 Supabase is SOC2 compliant https://supabase.com/blog/supabase-soc2 Supabase is now SOC2 compliant. Learn how we got here and what it means for our customers. - Tue, 16 Aug 2022 16:04:00 +0000 + Tue, 16 Aug 2022 22:10:00 +0000 https://supabase.com/blog/supabase-js-v2 supabase-js v2 https://supabase.com/blog/supabase-js-v2 A look at supabase-js v2, which brings type support and focuses on quality-of-life improvements for developers. - Mon, 15 Aug 2022 16:04:00 +0000 + Mon, 15 Aug 2022 22:10:00 +0000 https://supabase.com/blog/supabase-cli-v1-and-admin-api-beta Supabase CLI v1 and Management API Beta https://supabase.com/blog/supabase-cli-v1-and-admin-api-beta We are moving Supabase CLI v1 out of beta, and releasing Management API beta. - Sun, 14 Aug 2022 16:04:00 +0000 + Sun, 14 Aug 2022 22:10:00 +0000 https://supabase.com/blog/supabase-series-b Supabase Series B https://supabase.com/blog/supabase-series-b Supabase raised $80M in May, bringing our total funding to $116M. - Thu, 11 Aug 2022 16:04:00 +0000 + Thu, 11 Aug 2022 22:10:00 +0000 https://supabase.com/blog/launch-week-5-hackathon Launch Week 5 Hackathon https://supabase.com/blog/launch-week-5-hackathon Build to win $1500 - Friday 12th to Monday 21st August 2022 - Tue, 09 Aug 2022 16:04:00 +0000 + Tue, 09 Aug 2022 22:10:00 +0000 https://supabase.com/blog/slack-consolidate-slackbot-to-consolidate-messages Slack Consolidate: a slackbot built with Python and Supabase https://supabase.com/blog/slack-consolidate-slackbot-to-consolidate-messages A slackbot to consolidate messages from different channels using Supabase, Slack SDK and Python - Mon, 08 Aug 2022 16:04:00 +0000 + Mon, 08 Aug 2022 22:10:00 +0000 https://supabase.com/blog/supabase-beta-update-july-2022 Supabase Beta July 2022 https://supabase.com/blog/supabase-beta-update-july-2022 Launch Week Golden Tickets, Flutter SDK 1.0 Developer Preview and more... - Tue, 02 Aug 2022 16:04:00 +0000 + Tue, 02 Aug 2022 22:10:00 +0000 https://supabase.com/blog/supabase-flutter-sdk-1-developer-preview Supabase Flutter SDK 1.0 Developer Preview https://supabase.com/blog/supabase-flutter-sdk-1-developer-preview Supabase Flutter SDK is getting a major update and we need your help making it better. - Mon, 01 Aug 2022 16:04:00 +0000 + Mon, 01 Aug 2022 22:10: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 16:04:00 +0000 + Sun, 17 Jul 2022 22:10:00 +0000 https://supabase.com/blog/supabase-auth-helpers-with-sveltekit-support Revamped Auth Helpers for Supabase (with SvelteKit support) https://supabase.com/blog/supabase-auth-helpers-with-sveltekit-support Supabase Auth Helpers now have improved developer experience, Sveltekit support, and more. - Tue, 12 Jul 2022 16:04:00 +0000 + Tue, 12 Jul 2022 22:10:00 +0000 https://supabase.com/blog/beta-update-june-2022 Supabase Beta June 2022 https://supabase.com/blog/beta-update-june-2022 Auth Helpers, Unlimited Free Projects, CLI and more... - Tue, 05 Jul 2022 16:04:00 +0000 + Tue, 05 Jul 2022 22:10:00 +0000 https://supabase.com/blog/flutter-tutorial-building-a-chat-app Flutter Tutorial: building a Flutter chat app https://supabase.com/blog/flutter-tutorial-building-a-chat-app Learn how to build a Flutter chat app with open source and scalable backend (inc. auth, realtime, database, and more). - Wed, 29 Jun 2022 16:04:00 +0000 + Wed, 29 Jun 2022 22:10:00 +0000 https://supabase.com/blog/visualizing-supabase-data-using-metabase Visualizing Supabase Data using Metabase https://supabase.com/blog/visualizing-supabase-data-using-metabase How to create different kinds of charts out of data stored in Supabase using Metabase. - Tue, 28 Jun 2022 16:04:00 +0000 + Tue, 28 Jun 2022 22:10: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 16:04:00 +0000 + Mon, 27 Jun 2022 22:10:00 +0000 https://supabase.com/blog/loading-data-supabase-python Python data loading with Supabase https://supabase.com/blog/loading-data-supabase-python An example of how to load data into Supabase using supabase-py - Thu, 16 Jun 2022 16:04:00 +0000 + Thu, 16 Jun 2022 22:10:00 +0000 https://supabase.com/blog/beta-update-may-2022 Supabase Beta May 2022 https://supabase.com/blog/beta-update-may-2022 Product and community updates including wildcard auth redirects, edge functions with webhooks, and Prometheus endpoints for everybody. - Tue, 31 May 2022 16:04:00 +0000 + Tue, 31 May 2022 22:10:00 +0000 https://supabase.com/blog/how-supabase-accelerates-development-of-all-pull-together How Mike Lyndon is using Supabase to accelerate development of AllPullTogether https://supabase.com/blog/how-supabase-accelerates-development-of-all-pull-together Mike Lyndon is learning web development as he builds AllPullTogether, and Supabase is helping him accelerate what he can accomplish. - Wed, 25 May 2022 16:04:00 +0000 + Wed, 25 May 2022 22:10:00 +0000 https://supabase.com/blog/partner-gallery-works-with-supabase Works With Supabase - announcing our Partner Gallery https://supabase.com/blog/partner-gallery-works-with-supabase Introducing our Partner Gallery - open source and made with Supabase. - Tue, 19 Apr 2022 16:04:00 +0000 + Tue, 19 Apr 2022 22:10:00 +0000 https://supabase.com/blog/bring-the-func-hackathon-winners Bring the Func Hackathon Winners 2022 https://supabase.com/blog/bring-the-func-hackathon-winners Celebrating many amazing OSS Hackathon projects using GraphQL and Edge Functions. - Sun, 17 Apr 2022 16:04:00 +0000 + Sun, 17 Apr 2022 22:10:00 +0000 https://supabase.com/blog/beta-update-march-2022 Supabase Beta March 2022 https://supabase.com/blog/beta-update-march-2022 Functions, GraphQL, and much more. - Thu, 14 Apr 2022 16:04:00 +0000 + Thu, 14 Apr 2022 22:10:00 +0000 https://supabase.com/blog/supabrew Supabrew - Never Code Thirsty https://supabase.com/blog/supabrew A light and refreshing non-alcoholic beer for devs. - Thu, 31 Mar 2022 16:04:00 +0000 + Thu, 31 Mar 2022 22:10:00 +0000 https://supabase.com/blog/supabase-realtime-with-multiplayer-features Supabase Realtime, with Multiplayer Features https://supabase.com/blog/supabase-realtime-with-multiplayer-features Today we're announced Realtime, with multiplayer features. Realtime enables broadcast, presence, and listening to database changes delivered over WebSockets. - Thu, 31 Mar 2022 16:04:00 +0000 + Thu, 31 Mar 2022 22:10:00 +0000 https://supabase.com/blog/hackathon-bring-the-func Hackathon: Bring the Func(🕺) https://supabase.com/blog/hackathon-bring-the-func Build open-source projects with our latest features, win limited edition swag and plant a tree! - Thu, 31 Mar 2022 16:04:00 +0000 + Thu, 31 Mar 2022 22:10:00 +0000 https://supabase.com/blog/supabase-edge-functions Edge Functions are now available in Supabase https://supabase.com/blog/supabase-edge-functions Today we're launching Edge Functions. Edge Functions let you execute Typescript code close to your users, no matter where they're located. - Wed, 30 Mar 2022 16:04:00 +0000 + Wed, 30 Mar 2022 22:10:00 +0000 https://supabase.com/blog/supabase-enterprise Introducing Supabase Enterprise https://supabase.com/blog/supabase-enterprise Today we are releasing Supabase Enterprise, a suite of features to scale your project. - Tue, 29 Mar 2022 16:04:00 +0000 + Tue, 29 Mar 2022 22:10:00 +0000 https://supabase.com/blog/graphql-now-available GraphQL is now available in Supabase https://supabase.com/blog/graphql-now-available GraphQL support is now in general availability on the Supabase platform via our open source PostgreSQL extension, pg_graphql (beta). - Mon, 28 Mar 2022 16:04:00 +0000 + Mon, 28 Mar 2022 22:10:00 +0000 https://supabase.com/blog/community-day-lw4 Community Day https://supabase.com/blog/community-day-lw4 Kicking off Launch Week 4 with contributors, partners, and friends. - Sun, 27 Mar 2022 16:04:00 +0000 + Sun, 27 Mar 2022 22:10:00 +0000 https://supabase.com/blog/supabase-launch-week-four Supabase Launch Week 4 https://supabase.com/blog/supabase-launch-week-four Launch Week 4: One new feature every day for an entire week. Starting Monday 28th March. - Thu, 24 Mar 2022 16:04:00 +0000 + Thu, 24 Mar 2022 23:11:00 +0000 https://supabase.com/blog/should-i-open-source-my-company Should I Open Source my Company? https://supabase.com/blog/should-i-open-source-my-company The unexpected upsides of building in public - Thu, 24 Mar 2022 16:04:00 +0000 + Thu, 24 Mar 2022 23:11: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 16:04:00 +0000 + Mon, 07 Mar 2022 23:11:00 +0000 https://supabase.com/blog/supabase-beta-january-2022 Supabase Beta January 2022 https://supabase.com/blog/supabase-beta-january-2022 New auth providers, SMS providers, and new videos. - Mon, 21 Feb 2022 16:04:00 +0000 + Mon, 21 Feb 2022 23:11:00 +0000 https://supabase.com/blog/supabase-beta-december-2021 Supabase Beta December 2021 https://supabase.com/blog/supabase-beta-december-2021 New crypto extension, Postgres videos, and a bunch of cool integrations. - Wed, 19 Jan 2022 16:04:00 +0000 + Wed, 19 Jan 2022 23:11:00 +0000 https://supabase.com/blog/product-hunt-golden-kitty-awards-2021 Golden Kitty Awards Ceremony Watch Party with Supabase https://supabase.com/blog/product-hunt-golden-kitty-awards-2021 Hang out with us while watching the Product Hunt Golden Kitty Awards Ceremony - Wed, 19 Jan 2022 16:04:00 +0000 + Wed, 19 Jan 2022 23:11:00 +0000 https://supabase.com/blog/holiday-hackdays-winners-2021 Holiday Hackdays Winners 2021 https://supabase.com/blog/holiday-hackdays-winners-2021 Celebrating many amazing projects submitted to our Holiday Hackdays Hackathon. - Thu, 16 Dec 2021 16:04:00 +0000 + Thu, 16 Dec 2021 23:11:00 +0000 https://supabase.com/blog/beta-november-2021-launch-week-recap Supabase Beta November 2021: Launch Week Recap https://supabase.com/blog/beta-november-2021-launch-week-recap We wrapped up November with Supabase's third Launch Week. Here's all the awesome stuff that got shipped ... - Tue, 14 Dec 2021 16:04:00 +0000 + Tue, 14 Dec 2021 23:11:00 +0000 https://supabase.com/blog/supabase-holiday-hackdays-hackathon Kicking off the Holiday Hackdays https://supabase.com/blog/supabase-holiday-hackdays-hackathon Build cool stuff and celebrate open-source software with us during the Holiday Hackdays! - Thu, 02 Dec 2021 16:04:00 +0000 + Thu, 02 Dec 2021 23:11:00 +0000 https://supabase.com/blog/pg-graphql pg_graphql: A GraphQL extension for PostgreSQL https://supabase.com/blog/pg-graphql GraphQL support is in development for PostgreSQL + Supabase. - Thu, 02 Dec 2021 16:04:00 +0000 + Thu, 02 Dec 2021 23:11:00 +0000 https://supabase.com/blog/launch-week-three-friday-five-more-things Five more things https://supabase.com/blog/launch-week-three-friday-five-more-things It's never just one more thing! - Thu, 02 Dec 2021 16:04:00 +0000 + Thu, 02 Dec 2021 23:11:00 +0000 https://supabase.com/blog/supabase-acquires-logflare Supabase acquires Logflare https://supabase.com/blog/supabase-acquires-logflare Today, we're ecstatic to announce that Logflare is joining Supabase. - Wed, 01 Dec 2021 16:04:00 +0000 + Wed, 01 Dec 2021 23:11:00 +0000 https://supabase.com/blog/realtime-row-level-security-in-postgresql Realtime Postgres RLS now available on Supabase https://supabase.com/blog/realtime-row-level-security-in-postgresql Realtime database changes are now broadcast to authenticated users, respecting the same PostgreSQL policies that you use for Row Level Security. - Tue, 30 Nov 2021 16:04:00 +0000 + Tue, 30 Nov 2021 23:11:00 +0000 https://supabase.com/blog/supabase-studio Supabase Studio https://supabase.com/blog/supabase-studio The same Dashboard that you're using on our Platform is now available for local development and Self-Hosting. - Mon, 29 Nov 2021 16:04:00 +0000 + Mon, 29 Nov 2021 23:11:00 +0000 https://supabase.com/blog/community-day-lw3 Community Day https://supabase.com/blog/community-day-lw3 Kicking off launch week by highlighting the communities around Supabase. - Sun, 28 Nov 2021 16:04:00 +0000 + Sun, 28 Nov 2021 23:11:00 +0000 https://supabase.com/blog/whats-new-in-postgres-14 New in PostgreSQL 14: What every developer should know https://supabase.com/blog/whats-new-in-postgres-14 A quick look at some new features and functionality in PostgreSQL 14. - Sat, 27 Nov 2021 16:04:00 +0000 + Sat, 27 Nov 2021 23:11:00 +0000 https://supabase.com/blog/postgrest-9 PostgREST 9 https://supabase.com/blog/postgrest-9 New features and updates in PostgREST version 9. - Fri, 26 Nov 2021 16:04:00 +0000 + Fri, 26 Nov 2021 23:11:00 +0000 https://supabase.com/blog/supabase-launch-week-the-trilogy Supabase Launch Week III: Holiday Special https://supabase.com/blog/supabase-launch-week-the-trilogy Tis the season to be shipping. - Thu, 25 Nov 2021 16:04:00 +0000 + Thu, 25 Nov 2021 23:11:00 +0000 https://supabase.com/blog/supabase-how-we-launch How we launch at Supabase https://supabase.com/blog/supabase-how-we-launch The history and methodology of Supabase Launch Week. - Thu, 25 Nov 2021 16:04:00 +0000 + Thu, 25 Nov 2021 23:11:00 +0000 https://supabase.com/blog/supabase-beta-october-2021 Supabase Beta October 2021 https://supabase.com/blog/supabase-beta-october-2021 Three new Auth providers, multi-schema support, and we're gearing up for another Launch Week. - Sat, 06 Nov 2021 16:04:00 +0000 + Sat, 06 Nov 2021 23:11:00 +0000 https://supabase.com/blog/supabase-series-a Supabase $30m Series A https://supabase.com/blog/supabase-series-a Supabase just raised $30M, bringing our total funding to $36M. - Wed, 27 Oct 2021 16:04:00 +0000 + Wed, 27 Oct 2021 22:10:00 +0000 https://supabase.com/blog/replenysh-time-to-value-in-less-than-24-hours Replenysh uses Supabase to implement OTP in less than 24-hours https://supabase.com/blog/replenysh-time-to-value-in-less-than-24-hours Learn how Replenysh uses Supabase to power the circular economy, redefining how brands interact with their customers and products. - Mon, 18 Oct 2021 16:04:00 +0000 + Mon, 18 Oct 2021 22:10:00 +0000 https://supabase.com/blog/hacktoberfest-hackathon-winners-2021 Hacktoberfest Hackathon Winners 2021 https://supabase.com/blog/hacktoberfest-hackathon-winners-2021 Celebrating many amazing projects submitted to our Hacktoberfest Hackathon. - Wed, 13 Oct 2021 16:04:00 +0000 + Wed, 13 Oct 2021 22:10:00 +0000 https://supabase.com/blog/supabase-beta-sept-2021 Supabase Beta Sept 2021 https://supabase.com/blog/supabase-beta-sept-2021 Hackathon, Aborting request, UI updates, and now Hiring. - Sun, 03 Oct 2021 16:04:00 +0000 + Sun, 03 Oct 2021 22:10:00 +0000 https://supabase.com/blog/supabase-hacktoberfest-hackathon-2021 Supabase Hacktoberfest Hackathon 2021 https://supabase.com/blog/supabase-hacktoberfest-hackathon-2021 We're running another Supabase Hackathon during Hacktoberfest! - Mon, 27 Sep 2021 16:04:00 +0000 + Mon, 27 Sep 2021 22:10:00 +0000 https://supabase.com/blog/supabase-beta-august-2021 Supabase Beta August 2021 https://supabase.com/blog/supabase-beta-august-2021 Fundraising, Realtime Security, custom SMS templates, and deployments in South Korea. - Thu, 09 Sep 2021 16:04:00 +0000 + Thu, 09 Sep 2021 22:10:00 +0000 https://supabase.com/blog/supabase-beta-july-2021 Supabase Beta July 2021 https://supabase.com/blog/supabase-beta-july-2021 Discord Logins, Vercel Integration, Full text search, and OAuth guides. - Wed, 11 Aug 2021 16:04:00 +0000 + Wed, 11 Aug 2021 22:10:00 +0000 https://supabase.com/blog/hackathon-winners Open Source Hackathon Winners https://supabase.com/blog/hackathon-winners Let the medal ceremony begin for the best projects submitted during the Supabase Hackathon. - Sun, 08 Aug 2021 16:04:00 +0000 + Sun, 08 Aug 2021 22:10:00 +0000 https://supabase.com/blog/supabase-swag-store Supabase Swag Store https://supabase.com/blog/supabase-swag-store Today we are officially launching the Supabase Swag Store. - Thu, 29 Jul 2021 16:04:00 +0000 + Thu, 29 Jul 2021 22:10:00 +0000 https://supabase.com/blog/supabase-functions-updates Updates for Supabase Functions https://supabase.com/blog/supabase-functions-updates The question on everyone's mind - are we launching Supabase Functions? Well, it's complicated. - Thu, 29 Jul 2021 16:04:00 +0000 + Thu, 29 Jul 2021 22:10:00 +0000 https://supabase.com/blog/1-the-supabase-hackathon The Supabase Hackathon https://supabase.com/blog/1-the-supabase-hackathon A whole week of Hacking for Fun and Prizes. - Thu, 29 Jul 2021 16:04:00 +0000 + Thu, 29 Jul 2021 22:10:00 +0000 https://supabase.com/blog/supabase-reports-and-metrics Supabase Reports and Metrics https://supabase.com/blog/supabase-reports-and-metrics We're exposing a full set of metrics in your projects, so that you can build better (and faster) products for your users. - Wed, 28 Jul 2021 16:04:00 +0000 + Wed, 28 Jul 2021 22:10:00 +0000 https://supabase.com/blog/supabase-auth-passwordless-sms-login Supabase Auth v2: Phone Auth now available https://supabase.com/blog/supabase-auth-passwordless-sms-login Phone Auth is available today on all new and existing Supabase projects. - Tue, 27 Jul 2021 16:04:00 +0000 + Tue, 27 Jul 2021 22:10:00 +0000 https://supabase.com/blog/mobbin-supabase-200000-users Mobbin uses Supabase to authenticate 200,000 users https://supabase.com/blog/mobbin-supabase-200000-users Learn how Mobbin migrated 200,000 users from Firebase for a better authentication experience. - Tue, 27 Jul 2021 16:04:00 +0000 + Tue, 27 Jul 2021 22:10:00 +0000 https://supabase.com/blog/storage-beta Supabase Storage now in Beta https://supabase.com/blog/storage-beta Supabase Storage moves into Beta. - Mon, 26 Jul 2021 16:04:00 +0000 + Mon, 26 Jul 2021 22:10:00 +0000 https://supabase.com/blog/spot-flutter-with-postgres Spot: a video sharing app built with Flutter https://supabase.com/blog/spot-flutter-with-postgres Spot is a geolocation-based video-sharing app with some social networking features. - Mon, 26 Jul 2021 16:04:00 +0000 + Mon, 26 Jul 2021 22:10:00 +0000 https://supabase.com/blog/supabase-postgres-13 Supabase is now on Postgres 13.3 https://supabase.com/blog/supabase-postgres-13 From today, new Supabase projects will be on a version of Supabase Postgres that runs on Postgres 13.3. - Sun, 25 Jul 2021 16:04:00 +0000 + Sun, 25 Jul 2021 22:10:00 +0000 https://supabase.com/blog/supabase-community-day Supabase Community Day https://supabase.com/blog/supabase-community-day Community Day - Sun, 25 Jul 2021 16:04:00 +0000 + Sun, 25 Jul 2021 22:10:00 +0000 https://supabase.com/blog/epsilon3-self-hosting Epsilon3 Self-Host Supabase To Revolutionize Space Operations https://supabase.com/blog/epsilon3-self-hosting Learn how the team at Epsilon3 use Supabase to help teams execute secure and reliable operations in an industry that project spend runs into the billions. - Sun, 25 Jul 2021 16:04:00 +0000 + Sun, 25 Jul 2021 22:10:00 +0000 https://supabase.com/blog/supabase-launch-week-sql Supabase Launch Week II: The SQL https://supabase.com/blog/supabase-launch-week-sql Five days of Supabase. Again. - Wed, 21 Jul 2021 16:04:00 +0000 + Wed, 21 Jul 2021 22:10: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 16:04:00 +0000 + Thu, 01 Jul 2021 22:10:00 +0000 https://supabase.com/blog/supabase-beta-june-2021 Supabase Beta June 2021 https://supabase.com/blog/supabase-beta-june-2021 Discord Logins, Vercel Integration, Full text search, and OAuth guides. - Tue, 01 Jun 2021 16:04:00 +0000 + Tue, 01 Jun 2021 22:10:00 +0000 https://supabase.com/blog/supabase-beta-may-2021 Supabase Beta May 2021 https://supabase.com/blog/supabase-beta-may-2021 Apple & Twitter Logins, Supabase Grid, Go & Swift Libraries. - Tue, 01 Jun 2021 16:04:00 +0000 + Tue, 01 Jun 2021 22:10:00 +0000 https://supabase.com/blog/supabase-beta-april-2021 Supabase Beta April 2021 https://supabase.com/blog/supabase-beta-april-2021 Supabase "gardening" - stability, security, and community support. - Tue, 04 May 2021 16:04:00 +0000 + Tue, 04 May 2021 22:10:00 +0000 https://supabase.com/blog/supabase-beta-march-2021 Supabase Beta March 2021 https://supabase.com/blog/supabase-beta-march-2021 Launch week, Storage, Supabase CLI, Connection Pooling, Supabase UI, and Pricing. - Mon, 05 Apr 2021 16:04:00 +0000 + Mon, 05 Apr 2021 22:10:00 +0000 https://supabase.com/blog/supabase-workflows Workflows are coming to Supabase https://supabase.com/blog/supabase-workflows Functions are great, but you know what's better? - Thu, 01 Apr 2021 16:04:00 +0000 + Thu, 01 Apr 2021 22:10:00 +0000 https://supabase.com/blog/supabase-pgbouncer PgBouncer is now available in Supabase https://supabase.com/blog/supabase-pgbouncer Better support for Serverless and Postgres. - Thu, 01 Apr 2021 16:04:00 +0000 + Thu, 01 Apr 2021 22:10:00 +0000 https://supabase.com/blog/supabase-dot-com Supabase Dot Com https://supabase.com/blog/supabase-dot-com The Supabase Domain name is changing. - Thu, 01 Apr 2021 16:04:00 +0000 + Thu, 01 Apr 2021 22:10:00 +0000 https://supabase.com/blog/supabase-nft-marketplace Supabase Launches NFT Marketplace https://supabase.com/blog/supabase-nft-marketplace A fully encrypted NFT platform to protect and transact your digital assets - Wed, 31 Mar 2021 16:04:00 +0000 + Wed, 31 Mar 2021 22:10:00 +0000 https://supabase.com/blog/supabase-cli Supabase CLI https://supabase.com/blog/supabase-cli Local development, database migrations, and self-hosting. - Tue, 30 Mar 2021 16:04:00 +0000 + Tue, 30 Mar 2021 22:10:00 +0000 https://supabase.com/blog/supabase-storage Storage is now available in Supabase https://supabase.com/blog/supabase-storage Launching Supabase Storage and how you can use it in your apps - Mon, 29 Mar 2021 16:04:00 +0000 + Mon, 29 Mar 2021 22:10:00 +0000 https://supabase.com/blog/pricing Supabase Beta Pricing https://supabase.com/blog/pricing Supabase launches Beta pricing structure - Sun, 28 Mar 2021 16:04:00 +0000 + Sun, 28 Mar 2021 22:10:00 +0000 https://supabase.com/blog/launch-week Launch week https://supabase.com/blog/launch-week Five days of Supabase. - Wed, 24 Mar 2021 16:04:00 +0000 + Wed, 24 Mar 2021 23:11:00 +0000 https://supabase.com/blog/angels-of-supabase Angels of Supabase https://supabase.com/blog/angels-of-supabase Meet the investors of Supabase. - Wed, 24 Mar 2021 16:04:00 +0000 + Wed, 24 Mar 2021 23:11:00 +0000 https://supabase.com/blog/In-The-Loop Developers stay up to date with intheloop.dev https://supabase.com/blog/In-The-Loop Learn why Kevin is building intheloop.dev with Supabase - Sun, 21 Mar 2021 16:04:00 +0000 + Sun, 21 Mar 2021 23:11:00 +0000 https://supabase.com/blog/using-supabase-replit Using Supabase in Replit https://supabase.com/blog/using-supabase-replit Free hosted relational database from within your node.js repl - Wed, 10 Mar 2021 16:04:00 +0000 + Wed, 10 Mar 2021 23:11:00 +0000 https://supabase.com/blog/toad-a-link-shortener-with-simple-apis-for-low-coders Toad, a link shortener with simple APIs for low-coders https://supabase.com/blog/toad-a-link-shortener-with-simple-apis-for-low-coders An easy-to-use link shortening tool with simple APIs - Sun, 07 Mar 2021 16:04:00 +0000 + Sun, 07 Mar 2021 23:11: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. - Thu, 04 Mar 2021 16:04:00 +0000 + Thu, 04 Mar 2021 23:11:00 +0000 https://supabase.com/blog/supabase-beta-february-2021 Supabase Beta February 2021 https://supabase.com/blog/supabase-beta-february-2021 One year of building. - Mon, 01 Mar 2021 16:04:00 +0000 + Mon, 01 Mar 2021 23:11: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 - Fri, 26 Feb 2021 16:04:00 +0000 + Fri, 26 Feb 2021 23:11:00 +0000 https://supabase.com/blog/case-study-roboflow Roboflow.com choose Supabase to power Paint.wtf leaderboard https://supabase.com/blog/case-study-roboflow Learn how Roboflow.com used Supabase to build their Paint.wtf leaderboard - Mon, 08 Feb 2021 16:04:00 +0000 + Mon, 08 Feb 2021 23:11:00 +0000 https://supabase.com/blog/supabase-beta-january-2021 Supabase Beta January 2021 https://supabase.com/blog/supabase-beta-january-2021 Eleven months of building. - Mon, 01 Feb 2021 16:04:00 +0000 + Mon, 01 Feb 2021 23:11:00 +0000 https://supabase.com/blog/supabase-beta-december-2020 Supabase Beta December 2020 https://supabase.com/blog/supabase-beta-december-2020 Ten months of building. - Fri, 01 Jan 2021 16:04:00 +0000 + Fri, 01 Jan 2021 23:11:00 +0000 https://supabase.com/blog/supabase-dashboard-performance Making the Supabase Dashboard Supa-fast https://supabase.com/blog/supabase-dashboard-performance Improving the performance of the Supabase dashboard - Sat, 12 Dec 2020 16:04:00 +0000 + Sat, 12 Dec 2020 23:11:00 +0000 https://supabase.com/blog/supabase-striveschool Supabase Partners With Strive School To Help Teach Open Source https://supabase.com/blog/supabase-striveschool Supabase Partners With Strive School To Help Teach Open Source To The Next Generation Of Developers - Tue, 01 Dec 2020 16:04:00 +0000 + Tue, 01 Dec 2020 23:11:00 +0000 https://supabase.com/blog/case-study-xendit Xendit Built a Counter-Fraud Watchlist for the Fintech Industry https://supabase.com/blog/case-study-xendit See how Xendit use Supabase to build a full-text search engine. - Tue, 01 Dec 2020 16:04:00 +0000 + Tue, 01 Dec 2020 23:11:00 +0000 https://supabase.com/blog/case-study-tayfa TAYFA Built a No-Code Website Builder in Seven Days https://supabase.com/blog/case-study-tayfa See how Tayfa went from idea to paying customer in less than 30 days. - Tue, 01 Dec 2020 16:04:00 +0000 + Tue, 01 Dec 2020 23:11:00 +0000 https://supabase.com/blog/case-study-monitoro Monitoro Built a Web Crawler Handling Millions of API Requests https://supabase.com/blog/case-study-monitoro See how Monitoro built an automated scraping platform using Supabase. - Tue, 01 Dec 2020 16:04:00 +0000 + Tue, 01 Dec 2020 23:11:00 +0000 https://supabase.com/blog/supabase-alpha-november-2020 Supabase Alpha November 2020 https://supabase.com/blog/supabase-alpha-november-2020 Nine months of building. - Mon, 30 Nov 2020 16:04:00 +0000 + Mon, 30 Nov 2020 23:11:00 +0000 https://supabase.com/blog/postgresql-views Postgres Views https://supabase.com/blog/postgresql-views Creating and using a view in PostgreSQL. - Tue, 17 Nov 2020 16:04:00 +0000 + Tue, 17 Nov 2020 23:11:00 +0000 https://supabase.com/blog/supabase-alpha-october-2020 Supabase Alpha October 2020 https://supabase.com/blog/supabase-alpha-october-2020 Eight months of building. - Sun, 01 Nov 2020 16:04:00 +0000 + Sun, 01 Nov 2020 23:11:00 +0000 https://supabase.com/blog/improved-dx Supabase.js 1.0 https://supabase.com/blog/improved-dx We're releasing a new version of our Supabase client with some awesome new improvements. - Thu, 29 Oct 2020 16:04:00 +0000 + Thu, 29 Oct 2020 23:11:00 +0000 https://supabase.com/blog/supabase-alpha-september-2020 Supabase Alpha September 2020 https://supabase.com/blog/supabase-alpha-september-2020 Seven months of building. - Fri, 02 Oct 2020 16:04:00 +0000 + Fri, 02 Oct 2020 22:10:00 +0000 https://supabase.com/blog/supabase-hacktoberfest-2020 Supabase Hacktoberfest 2020 https://supabase.com/blog/supabase-hacktoberfest-2020 Join us for a celebration of open source software and learn how to contribute to Supabase. - Thu, 10 Sep 2020 16:04:00 +0000 + Thu, 10 Sep 2020 22:10:00 +0000 https://supabase.com/blog/supabase-alpha-august-2020 Supabase Alpha August 2020 https://supabase.com/blog/supabase-alpha-august-2020 Six months of building - Wed, 02 Sep 2020 16:04:00 +0000 + Wed, 02 Sep 2020 22:10:00 +0000 https://supabase.com/blog/supabase-auth Supabase Auth https://supabase.com/blog/supabase-auth Authenticate and authorize your users with Supabase Auth - Tue, 04 Aug 2020 16:04:00 +0000 + Tue, 04 Aug 2020 22:10:00 +0000 https://supabase.com/blog/supabase-alpha-july-2020 Supabase Alpha July 2020 https://supabase.com/blog/supabase-alpha-july-2020 Five months of building - Sat, 01 Aug 2020 16:04:00 +0000 + Sat, 01 Aug 2020 22:10: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. - Sat, 01 Aug 2020 16:04:00 +0000 + Sat, 01 Aug 2020 22:10:00 +0000 https://supabase.com/blog/alpha-launch-postmortem Alpha Launch Postmortem https://supabase.com/blog/alpha-launch-postmortem Everything that went wrong with Supabase's launch - Thu, 09 Jul 2020 16:04:00 +0000 + Thu, 09 Jul 2020 22:10: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? - Wed, 08 Jul 2020 16:04:00 +0000 + Wed, 08 Jul 2020 22:10: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? - Mon, 06 Jul 2020 16:04:00 +0000 + Mon, 06 Jul 2020 22:10:00 +0000 https://supabase.com/blog/supabase-alpha-june-2020 Supabase Alpha June 2020 https://supabase.com/blog/supabase-alpha-june-2020 Four months of building - Tue, 30 Jun 2020 16:04:00 +0000 + Tue, 30 Jun 2020 22:10:00 +0000 https://supabase.com/blog/supabase-steve-chavez Steve Chavez has joined Supabase https://supabase.com/blog/supabase-steve-chavez Steve joins Supabase to help build Auth. - Sun, 14 Jun 2020 16:04:00 +0000 + Sun, 14 Jun 2020 22:10:00 +0000 https://supabase.com/blog/supabase-alpha-may-2020 Supabase Alpha May 2020 https://supabase.com/blog/supabase-alpha-may-2020 Three months of building - Sun, 31 May 2020 16:04:00 +0000 + Sun, 31 May 2020 22:10:00 +0000 https://supabase.com/blog/supabase-alpha-april-2020 Supabase Alpha April 2020 https://supabase.com/blog/supabase-alpha-april-2020 Two months of building - Sun, 31 May 2020 16:04:00 +0000 + Sun, 31 May 2020 22:10:00 +0000 diff --git a/apps/www/public/sitemap_www.xml b/apps/www/public/sitemap_www.xml index 354b5258475..7dbff4d42e3 100644 --- a/apps/www/public/sitemap_www.xml +++ b/apps/www/public/sitemap_www.xml @@ -97,13 +97,13 @@ - https://supabase.com/storage + https://supabase.com/realtime weekly 0.5 - https://supabase.com/realtime + https://supabase.com/storage weekly 0.5 @@ -1082,6 +1082,78 @@ 0.5 + + https://supabase.com/blog/infinite-scroll-with-nextjs-framer-motion + weekly + 0.5 + + + + https://supabase.com/blog/designing-with-ai-midjourney + weekly + 0.5 + + + + https://supabase.com/blog/launch-week-7-hackathon + weekly + 0.5 + + + + https://supabase.com/blog/supabase-beta-update-march-2023 + weekly + 0.5 + + + + https://supabase.com/blog/supabase-logs-self-hosted + weekly + 0.5 + + + + https://supabase.com/blog/edge-runtime-self-hosted-deno-functions + weekly + 0.5 + + + + https://supabase.com/blog/storage-v3-resumable-uploads + weekly + 0.5 + + + + https://supabase.com/blog/supabase-auth-sso-pkce + weekly + 0.5 + + + + https://supabase.com/blog/dbdev + weekly + 0.5 + + + + https://supabase.com/blog/launch-week-7-community-highlights + weekly + 0.5 + + + + https://supabase.com/blog/pg-tle + weekly + 0.5 + + + + https://supabase.com/blog/supabase-studio-2.0 + weekly + 0.5 + + https://supabase.com/customers/epsilon3 weekly diff --git a/examples/with-cloudflare-workers/README.md b/examples/with-cloudflare-workers/README.md index 50f0f2cd9df..55ae9ce695c 100644 --- a/examples/with-cloudflare-workers/README.md +++ b/examples/with-cloudflare-workers/README.md @@ -17,7 +17,7 @@ In order to send a JSON response, we first stringify the object we get back from **Install Supabase JS** ```bash -npm i @supabase-supabase-js +npm i @supabase/supabase-js ``` **Create a Cloudflare secret** diff --git a/package-lock.json b/package-lock.json index 42935afdd16..511f63d219a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8484,6 +8484,12 @@ "url": "https://opencollective.com/storybook" } }, + "node_modules/@storybook/global": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz", + "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", + "dev": true + }, "node_modules/@storybook/instrumenter": { "version": "6.5.16", "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-6.5.16.tgz", @@ -38960,10 +38966,12 @@ "tailwindcss-radix": "^1.6.0" }, "devDependencies": { + "@storybook/react": "^6.5.16", "@types/common-tags": "^1.8.1", "@types/react": "^17.0.37", "@types/react-dom": "^17.0.11", "sql-formatter": "^12.2.0", + "storybook-dark-mode": "^2.1.1", "typescript": "4.3.4" } }, @@ -39022,6 +39030,34 @@ "sql-formatter": "bin/sql-formatter-cli.cjs" } }, + "packages/ui/node_modules/storybook-dark-mode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/storybook-dark-mode/-/storybook-dark-mode-2.1.1.tgz", + "integrity": "sha512-Ops6u/htODxIUXnAYASttqcbd2PRN723o0uIKpoYQn1+so2g6gYalpAhuysxnRhCG8yHsm6NJuX5drzzI+uFvQ==", + "dev": true, + "dependencies": { + "@storybook/addons": "^6.5.14", + "@storybook/api": "^6.5.14", + "@storybook/components": "^6.5.14", + "@storybook/core-events": "^6.5.14", + "@storybook/global": "^5.0.0", + "@storybook/theming": "^6.5.14", + "fast-deep-equal": "^3.1.3", + "memoizerific": "^1.11.3" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "packages/ui/node_modules/typescript": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", @@ -45200,6 +45236,12 @@ "regenerator-runtime": "^0.13.7" } }, + "@storybook/global": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz", + "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", + "dev": true + }, "@storybook/instrumenter": { "version": "6.5.16", "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-6.5.16.tgz", @@ -67646,6 +67688,7 @@ "@radix-ui/react-popover": "^1.0.4", "@radix-ui/react-portal": "^1.0.1", "@radix-ui/react-tabs": "^1.0.2", + "@storybook/react": "^6.5.16", "@supabase/auth-helpers-react": "^0.3.1", "@tailwindcss/forms": "^0.4.0", "@tailwindcss/typography": "^0.5.0", @@ -67670,6 +67713,7 @@ "remark-gfm": "^3.0.1", "sql-formatter": "^12.2.0", "sse.js": "^0.6.1", + "storybook-dark-mode": "^2.1.1", "tailwind-merge": "^1.10.0", "tailwindcss": "^3.0.15", "tailwindcss-radix": "^1.6.0", @@ -67716,6 +67760,22 @@ "nearley": "^2.20.1" } }, + "storybook-dark-mode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/storybook-dark-mode/-/storybook-dark-mode-2.1.1.tgz", + "integrity": "sha512-Ops6u/htODxIUXnAYASttqcbd2PRN723o0uIKpoYQn1+so2g6gYalpAhuysxnRhCG8yHsm6NJuX5drzzI+uFvQ==", + "dev": true, + "requires": { + "@storybook/addons": "^6.5.14", + "@storybook/api": "^6.5.14", + "@storybook/components": "^6.5.14", + "@storybook/core-events": "^6.5.14", + "@storybook/global": "^5.0.0", + "@storybook/theming": "^6.5.14", + "fast-deep-equal": "^3.1.3", + "memoizerific": "^1.11.3" + } + }, "typescript": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", diff --git a/packages/common/assets/images/supabase-logo-wordmark--dark.png b/packages/common/assets/images/supabase-logo-wordmark--dark.png index dccffd4247d..821c42ce283 100644 Binary files a/packages/common/assets/images/supabase-logo-wordmark--dark.png and b/packages/common/assets/images/supabase-logo-wordmark--dark.png differ diff --git a/packages/common/assets/images/supabase-logo-wordmark--dark.svg b/packages/common/assets/images/supabase-logo-wordmark--dark.svg index 845e92d0228..9e96fab4ddc 100644 --- a/packages/common/assets/images/supabase-logo-wordmark--dark.svg +++ b/packages/common/assets/images/supabase-logo-wordmark--dark.svg @@ -1,22 +1,23 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + + + + + - - - diff --git a/packages/common/assets/images/supabase-logo-wordmark--light.png b/packages/common/assets/images/supabase-logo-wordmark--light.png index 44d8d24b6b6..0277fee2bbe 100644 Binary files a/packages/common/assets/images/supabase-logo-wordmark--light.png and b/packages/common/assets/images/supabase-logo-wordmark--light.png differ diff --git a/packages/common/assets/images/supabase-logo-wordmark--light.svg b/packages/common/assets/images/supabase-logo-wordmark--light.svg index 51f75314127..60cbc71dc7c 100644 --- a/packages/common/assets/images/supabase-logo-wordmark--light.svg +++ b/packages/common/assets/images/supabase-logo-wordmark--light.svg @@ -1,22 +1,23 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + + + + + - - - diff --git a/packages/common/hooks/index.ts b/packages/common/hooks/index.ts index 6e0d89b50b7..7560f7ebcf5 100644 --- a/packages/common/hooks/index.ts +++ b/packages/common/hooks/index.ts @@ -1,3 +1,2 @@ -import React from 'react' - +export * from './useBreakpoint' export * from './useParams' diff --git a/apps/www/hooks/useMobileViewport.tsx b/packages/common/hooks/useBreakpoint.tsx similarity index 50% rename from apps/www/hooks/useMobileViewport.tsx rename to packages/common/hooks/useBreakpoint.tsx index 772831edcd5..27e29f666d3 100644 --- a/apps/www/hooks/useMobileViewport.tsx +++ b/packages/common/hooks/useBreakpoint.tsx @@ -1,19 +1,20 @@ import { useEffect, useState } from 'react' import { useWindowSize } from 'react-use' -import { isBrowser } from '~/lib/helpers' -export function useMobileViewport(breakpoint = 768) { +const isBrowser = typeof window !== 'undefined' + +export function useBreakpoint(breakpoint = 768) { if (!isBrowser) return - const [isMobile, setIsMobile] = useState(false) + const [isBreakpoint, setIsBreakpoint] = useState(false) const { width } = useWindowSize() useEffect(() => { if (width <= breakpoint) { - setIsMobile(true) + setIsBreakpoint(true) } else { - setIsMobile(false) + setIsBreakpoint(false) } }, [width]) - return isMobile + return isBreakpoint } diff --git a/packages/ui/.storybook/main.js b/packages/ui/.storybook/main.js new file mode 100644 index 00000000000..8762d261f24 --- /dev/null +++ b/packages/ui/.storybook/main.js @@ -0,0 +1,60 @@ +const path = require('path') + +module.exports = { + // stories: [ + // '../src/components/**/*.stories.mdx', + // '../src/components/**/*.stories.@(js|jsx|ts|tsx)', + // ], + // TODO: Temporally Import one by one story and fix build issue. + // After all stories are cleaned, revert to wildcard import. + stories: [ + '../src/components/Accordion/Accordion.stories.tsx', + '../src/components/Alert/Alert.stories.tsx', + '../src/components/Avatar/Avatar.stories.tsx', + '../src/components/Button/Button.stories.tsx', + '../src/components/Checkbox/Checkbox.stories.tsx', + '../src/components/Collapsible/Collapsible.stories.tsx', + '../src/components/ContextMenu/ContextMenu.stories.tsx', + '../src/components/Dropdown/Dropdown.stories.tsx', + ], + addons: [ + '@storybook/addon-links', + '@storybook/addon-essentials', + '@storybook/addon-interactions', + 'storybook-dark-mode', + { + name: '@storybook/addon-postcss', + options: { + postcssLoaderOptions: { + implementation: require('postcss'), + }, + }, + }, + ], + framework: '@storybook/react', + webpackFinal: async (config, { configType }) => { + const cssRuleIdx = config.module.rules.findIndex(({ test }) => test.toString() === '/\\.css$/') + const cssRule = { + test: /\.css$/, + include: path.resolve(__dirname, '../'), + exclude: /\.module\.css$/, + use: [ + { loader: 'style-loader' }, + { loader: 'css-loader', options: { importLoaders: 1, sourceMap: true } }, + { loader: 'postcss-loader', options: {} }, + ], + } + const cssModulesRule = { + test: /\.module.css$/, + include: path.resolve(__dirname, '../'), + use: [ + { loader: 'style-loader' }, + { loader: 'css-loader', options: { importLoaders: 1, modules: true, sourceMap: true } }, + { loader: 'postcss-loader', options: {} }, + ], + } + config.module.rules.splice(cssRuleIdx, 1, cssModulesRule, cssRule) + + return config + }, +} diff --git a/packages/ui/.storybook/preview.css b/packages/ui/.storybook/preview.css new file mode 100644 index 00000000000..2afd110d2e3 --- /dev/null +++ b/packages/ui/.storybook/preview.css @@ -0,0 +1,10 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +.dark, +.light, +.light .docs-story, +.dark .docs-story { + @apply bg-scale-200; +} diff --git a/packages/ui/.storybook/preview.js b/packages/ui/.storybook/preview.js new file mode 100644 index 00000000000..5a63d1e05ba --- /dev/null +++ b/packages/ui/.storybook/preview.js @@ -0,0 +1,16 @@ +import './preview.css' + +export const parameters = { + actions: { argTypesRegex: '^on[A-Z].*' }, + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/, + }, + }, + darkMode: { + darkClass: 'dark', + lightClass: 'light', + stylePreview: true, + }, +} diff --git a/packages/ui/index.tsx b/packages/ui/index.tsx index 515a7c65357..8d7a3e17ac3 100644 --- a/packages/ui/index.tsx +++ b/packages/ui/index.tsx @@ -26,7 +26,6 @@ export * from './src/components/Alert' export * from './src/components/Accordion' export * from './src/components/Collapsible' export * from './src/components/CodeBlock' -// export * from './src/components/Breadcrumb' // NAV @@ -39,14 +38,12 @@ export * from './src/components/SidePanel' export * from './src/components/Dropdown' export * from './src/components/ContextMenu' export * from './src/components/Popover' -// export * from './src/components/Toast' // UTILITIES export * from './src/components/Space' export * from './src/components/Loading' export * from './src/components/Divider' -// export * from './src/components/ThemeProvider' // DATA ENTRY @@ -63,20 +60,7 @@ export * from './src/components/Form' // CMD+K export * from './src/components/Command' -// config - -// export { default as Config } from './../ui.config' - -// ARCHIVE - -// export * from './src/components/Textarea' - -// AUTH - -// export * from './src/components/Auth' - // ICONS - // export icons export * from './src/components/Icon/icons/IconActivity' export * from './src/components/Icon/icons/IconAirplay' diff --git a/packages/ui/package.json b/packages/ui/package.json index 559c3346a85..97a84f67f4e 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -5,7 +5,9 @@ "types": "./index.tsx", "license": "MIT", "scripts": { - "build:icons": "node --experimental-modules internals/populate-icons.js" + "build:icons": "node --experimental-modules internals/populate-icons.js", + "storybook": "start-storybook -p 6006", + "build-storybook": "build-storybook" }, "dependencies": { "@headlessui/react": "^1.0.0", @@ -43,6 +45,8 @@ "tailwindcss-radix": "^1.6.0" }, "devDependencies": { + "@storybook/react": "^6.5.16", + "storybook-dark-mode": "^2.1.1", "@types/common-tags": "^1.8.1", "@types/react": "^17.0.37", "@types/react-dom": "^17.0.11", diff --git a/packages/ui/src/components/Accordion/Accordion.stories.tsx b/packages/ui/src/components/Accordion/Accordion.stories.tsx index 4dcc3d56483..613caccc178 100644 --- a/packages/ui/src/components/Accordion/Accordion.stories.tsx +++ b/packages/ui/src/components/Accordion/Accordion.stories.tsx @@ -1,8 +1,6 @@ import React from 'react' -import { Accordion } from '.' -import { Typography } from '../Typography' -import { IconArrowUp } from '../Icon/icons/IconArrowUp' +import Accordion, { AccordionProps } from './Accordion' import { Badge } from '../Badge' export default { @@ -10,7 +8,7 @@ export default { component: Accordion, } -export const OneItem = (args: any) => ( +export const OneItem = (args: AccordionProps) => ( ( ) -export const MultipleItems = (args: any) => ( +export const MultipleItems = (args: AccordionProps) => ( ( ) -export const Bordered = (args: any) => ( +export const Bordered = (args: AccordionProps) => ( ( +export const LeftAlignedChevron = (args: AccordionProps) => ( -// > & -// Pick +import { IconChevronUp } from '../Icon/icons/IconChevronUp' type Type = 'default' | 'bordered' type Size = 'tiny' | 'small' | 'medium' | 'large' | 'xlarge' @@ -21,17 +15,15 @@ interface ContextValue { type: Type justified: Boolean chevronAlign: Align - // currentItems: string[] } const AccordionContext = createContext({ chevronAlign: 'left', justified: true, type: 'default', - // currentItems: [], }) -interface AccordionProps { +export interface AccordionProps { children?: React.ReactNode className?: string defaultActiveId?: (string | number)[] @@ -49,19 +41,13 @@ interface AccordionProps { function Accordion({ children, className, - defaultActiveId = [], - icon = , - iconPosition = 'right', onChange, openBehaviour = 'multiple', type = 'default', - // size, // TO DO defaultValue = undefined, justified = false, chevronAlign = 'left', }: AccordionProps) { - // const [currentItems, setCurrentItems] = useState(defaultValue || []) - const __styles = styleHandler('accordion') let containerClasses = [__styles.variants[type].base] @@ -70,8 +56,6 @@ function Accordion({ containerClasses.push(className) } - // let currentItems = defaultValue || [] - const contextValue = { chevronAlign, justified, @@ -90,7 +74,8 @@ function Accordion({ return ( <> - {/* @ts-ignore */} + {/* // + @ts-expect-error */} ( +export const Neutral = (args: AlertProps) => ( Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. ) -export const Success = (args: any) => ( +export const Success = (args: AlertProps) => ( Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. ) -export const SuccessWithIcon = (args: any) => ( +export const SuccessWithIcon = (args: AlertProps) => ( Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. ) -export const Danger = (args: any) => ( +export const Danger = (args: AlertProps) => ( Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. ) -export const DangerWithIcon = (args: any) => ( +export const DangerWithIcon = (args: AlertProps) => ( Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. ) -export const Info = (args: any) => ( +export const Info = (args: AlertProps) => ( Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. ) -export const InfoWithIcon = (args: any) => ( +export const InfoWithIcon = (args: AlertProps) => ( Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. ) -export const Warning = (args: any) => ( +export const Warning = (args: AlertProps) => ( Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. ) -export const WarningWithIcon = (args: any) => ( +export const WarningWithIcon = (args: AlertProps) => ( Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. ) -export const Closable = (args: any) => ( +export const Closable = (args: AlertProps) => ( Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. ) -export const WithAction = (args: any) => ( +export const WithAction = (args: AlertProps) => ( Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore. diff --git a/packages/ui/src/components/Alert/Alert.tsx b/packages/ui/src/components/Alert/Alert.tsx index 2ab878f6611..cf0b96fe810 100644 --- a/packages/ui/src/components/Alert/Alert.tsx +++ b/packages/ui/src/components/Alert/Alert.tsx @@ -4,13 +4,11 @@ import { IconAlertTriangle } from '../Icon/icons/IconAlertTriangle' import { IconInfo } from '../Icon/icons/IconInfo' import { IconX } from '../Icon/icons/IconX' -// @ts-ignore -// import AlertStyles from './Alert.module.css' import styleHandler from '../../lib/theme/styleHandler' import { IconAlertOctagon } from '../Icon/icons/IconAlertOctagon' import { IconCheckCircle } from '../Icon/icons/IconCheckCircle' -interface Props { +export interface AlertProps { variant?: 'success' | 'danger' | 'warning' | 'info' | 'neutral' className?: string title: string | React.ReactNode @@ -38,7 +36,7 @@ function Alert({ children, icon, actions, -}: Props) { +}: AlertProps) { let __styles = styleHandler('alert') const [visible, setVisible] = useState(true) diff --git a/packages/ui/src/components/Avatar/Avatar.stories.tsx b/packages/ui/src/components/Avatar/Avatar.stories.tsx index 95d28cdbb8c..a9c73a60ce0 100644 --- a/packages/ui/src/components/Avatar/Avatar.stories.tsx +++ b/packages/ui/src/components/Avatar/Avatar.stories.tsx @@ -1,14 +1,14 @@ import React from 'react' import { IconAirplay } from '../Icon/icons/IconAirplay' -import Avatar from './Avatar' +import Avatar, { AvatarProps } from './Avatar' export default { title: 'General/Avatar', component: Avatar, } -export const Image = (args: any) => { +export const Image = (args: AvatarProps) => { return ( <> @@ -16,7 +16,7 @@ export const Image = (args: any) => { ) } -export const Text = (args: any) => { +export const Text = (args: AvatarProps) => { return ( <> @@ -24,7 +24,7 @@ export const Text = (args: any) => { ) } -export const Icon = (args: any) => { +export const Icon = (args: AvatarProps) => { return ( <> @@ -32,7 +32,7 @@ export const Icon = (args: any) => { ) } -export const Fallback = (args: any) => { +export const Fallback = (args: AvatarProps) => { return ( <> diff --git a/packages/ui/src/components/Avatar/Avatar.tsx b/packages/ui/src/components/Avatar/Avatar.tsx index 2c8714f8529..0eec2a12a02 100644 --- a/packages/ui/src/components/Avatar/Avatar.tsx +++ b/packages/ui/src/components/Avatar/Avatar.tsx @@ -1,18 +1,15 @@ import React from 'react' import { Icon } from '../Icon/IconImportHandler' import { IconUser } from '../Icon/icons/IconUser' -// @ts-ignore import AvatarStyles from './Avatar.module.css' -interface Props { +export interface AvatarProps { children?: React.ReactNode src?: string | undefined style?: React.CSSProperties className?: string alt?: string - responsive?: boolean text?: string - variant?: 'circle' | 'square' AvatarIcon?: Icon size: number } @@ -22,13 +19,11 @@ export default function Avatar({ style, className, alt, - responsive, text, - variant, AvatarIcon, size, children, -}: Props) { +}: AvatarProps) { const classes = [AvatarStyles['sbui-avatar']] classes.push(className) let objectToRender @@ -61,40 +56,28 @@ export default function Avatar({ } else if (AvatarIcon) { classes.push(AvatarStyles['sbui-avatar-icon']) objectToRender = ( -
+
) } else if (text) { classes.push(AvatarStyles['sbui-avatar-text']) objectToRender = ( -
+

{text[0]}

) } else if (children) { classes.push(AvatarStyles['sbui-avatar-children']) objectToRender = ( -
+
{children}
) } else { classes.push(AvatarStyles['sbui-avatar-fallback']) objectToRender = ( -
+
) diff --git a/packages/ui/src/components/Button/Button.stories.tsx b/packages/ui/src/components/Button/Button.stories.tsx index a65e2eefe74..e73cac1cc86 100644 --- a/packages/ui/src/components/Button/Button.stories.tsx +++ b/packages/ui/src/components/Button/Button.stories.tsx @@ -1,48 +1,25 @@ -// import React, { useRef, useState } from 'react' -// import defaultTheme from '../../theme/defaultTheme' -// import { ThemeProvider } from './../ThemeProvider' -// import customThemeExample from '../../lib/theme/customThemeExample' - -import { useRef, useState } from 'react' -import { Button, IconPackage, IconChevronRight } from './../../index' +import { Button } from './' +import { IconPackage } from './../Icon/icons/IconPackage' +import { IconChevronRight } from './../Icon/icons/IconChevronRight' export default { title: 'General/Button', component: Button, } -export const Default = (args: any) => +export const Neutral = (args: any) => +export const Success = (args: any) => + export const withStyles = (args: any) => export const withIcon = (args: any) => -export const withIconRight = (args: any) => ( - -) +export const withIconRight = (args: any) => export const withBlock = (args: any) => export const withOnlyIcon = (args: any) => ) -export const withRef = () => { - const buttonRef = useRef(null) - const [msg, setMsg] = useState('Click button to console.log Ref') - function onClick() { - const message = `button:${buttonRef?.current} ` - setMsg(message) - // console.log(message) - } - - return ( - <> - - -

{msg}

- - ) -} export const allButtons = (args: any) => ( <>
@@ -211,9 +188,7 @@ export const allButtons = (args: any) => ( ) -export const withCustomTag = (args: any) => ( - -) +export const withCustomTag = (args: any) => const icon = diff --git a/packages/ui/src/components/Checkbox/Checkbox.stories.tsx b/packages/ui/src/components/Checkbox/Checkbox.stories.tsx index 75cb24c3ea0..55979991380 100644 --- a/packages/ui/src/components/Checkbox/Checkbox.stories.tsx +++ b/packages/ui/src/components/Checkbox/Checkbox.stories.tsx @@ -1,5 +1,3 @@ -import React from 'react' - import { Checkbox } from '.' export default { @@ -78,9 +76,7 @@ export const size = (args: any) => ( ) -export const withBeforeAndAfterLabels = (args: any) => ( - -) +export const withBeforeAndAfterLabels = (args: any) => Default.args = { label: 'This is the label', @@ -109,8 +105,7 @@ withGroupHorizontal.args = { size.args = { id: 'checkobox-q', label: 'Control the size of the checkboxes', - description: - 'You can add a size just the Group component and it will affect the children', + description: 'You can add a size just the Group component and it will affect the children', disabled: false, className: 'font-sans', layout: 'horizontal', diff --git a/packages/ui/src/components/Collapsible/Collapsible.stories.tsx b/packages/ui/src/components/Collapsible/Collapsible.stories.tsx index 6b723f7a438..8b6ca01742b 100644 --- a/packages/ui/src/components/Collapsible/Collapsible.stories.tsx +++ b/packages/ui/src/components/Collapsible/Collapsible.stories.tsx @@ -1,9 +1,6 @@ -import React from 'react' -// import { AutoForm } from 'uniforms' - -import { Collapsible } from '.' -import { IconChevronUp } from '../..' -import { Button } from '../Button' +import { Collapsible } from './' +import { IconChevronUp } from '../../components/Icon/icons/IconChevronUp' +import { Button } from './../Button' export default { title: 'Displays/Collapsible', @@ -13,14 +10,12 @@ export default { export const Default = (args: any) => { return ( <> - hello all
@@ -44,7 +39,7 @@ export const Default = (args: any) => { - +
diff --git a/packages/ui/src/components/Collapsible/Collapsible.tsx b/packages/ui/src/components/Collapsible/Collapsible.tsx index e137af1003f..9b66de65179 100644 --- a/packages/ui/src/components/Collapsible/Collapsible.tsx +++ b/packages/ui/src/components/Collapsible/Collapsible.tsx @@ -4,7 +4,6 @@ import styleHandler from '../../lib/theme/styleHandler' export interface CollapsibleProps extends RadixCollapsible.CollapsibleProps { children: React.ReactNode - // onChange?: (e: boolean) => void } export const Collapsible = ({ @@ -13,12 +12,6 @@ export const Collapsible = ({ className, ...props }: CollapsibleProps) => { - // const [_open, setOpen] = React.useState(open) - - // function handleOpenChange(e: boolean) { - // console.log(e) - // if (onChange) onChange(e) - // } return ( { const { setIsOpen, project } = useCommandMenu() @@ -21,7 +21,7 @@ const APIKeys = ({ isSubItem = false }) => { return ( {apiKeys?.anon !== undefined && ( - { copyToClipboard(apiKeys?.anon ?? '') @@ -31,10 +31,10 @@ const APIKeys = ({ isSubItem = false }) => { >

Copy anonymous key

Public -
+ )} {apiKeys?.service !== undefined && ( - { copyToClipboard(apiKeys?.service ?? '') @@ -44,7 +44,7 @@ const APIKeys = ({ isSubItem = false }) => { >

Copy service key

Secret -
+ )} {apiKeys?.anon === undefined && apiKeys?.service === undefined && ( diff --git a/packages/ui/src/components/Command/AiCommand.tsx b/packages/ui/src/components/Command/AiCommand.tsx index 0d60868872a..95e94e3f22d 100644 --- a/packages/ui/src/components/Command/AiCommand.tsx +++ b/packages/ui/src/components/Command/AiCommand.tsx @@ -18,7 +18,7 @@ import { SSE } from 'sse.js' import { Alert, Button, IconAlertTriangle, IconCornerDownLeft, IconUser, Input } from 'ui' import { AiIcon, AiIconChat } from './Command.icons' -import { CommandGroup, CommandItem } from './Command.utils' +import { CommandGroup, CommandItem, useAutoInputFocus, useHistoryKeys } from './Command.utils' import { useCommandMenu } from './CommandMenuProvider' import { AiWarning } from './Command.alerts' @@ -252,7 +252,7 @@ export function useAiChat({ setIsLoading?.(true) }, - [currentMessageIndex, messages] + [currentMessageIndex, messages, messageTemplate] ) function reset() { @@ -345,6 +345,16 @@ const AiCommand = () => { setIsLoading, }) + const inputRef = useAutoInputFocus() + + useHistoryKeys({ + enable: !isResponding, + messages: messages + .filter(({ role }) => role === MessageRole.User) + .map(({ content }) => content), + setPrompt: setSearch, + }) + const handleSubmit = useCallback( (message: string) => { setSearch('') @@ -459,6 +469,7 @@ const AiCommand = () => { {messages.length > 0 && !hasError && } state.search) + // if search is empty & items is marked as a subItem, don't show it + // ie: only show these items in search results, not top level + if (!search && isSubItem) return null + return {children} +} diff --git a/packages/ui/src/components/Command/Command.Badges.tsx b/packages/ui/src/components/Command/Command.Badges.tsx new file mode 100644 index 00000000000..b78a1121a9d --- /dev/null +++ b/packages/ui/src/components/Command/Command.Badges.tsx @@ -0,0 +1,10 @@ +import { Badge } from 'ui' +import { Microscope } from 'lucide-react' + +export const BadgeExperimental = () => { + return ( + + Experimental + + ) +} diff --git a/packages/ui/src/components/Command/Command.utils.tsx b/packages/ui/src/components/Command/Command.utils.tsx index c9b2c14b23e..afdd277e26d 100644 --- a/packages/ui/src/components/Command/Command.utils.tsx +++ b/packages/ui/src/components/Command/Command.utils.tsx @@ -180,7 +180,7 @@ type CommandPrimitiveItemProps = React.ComponentPropsWithoutRef( @@ -242,11 +242,7 @@ export const CommandItem = React.forwardRef
{children}
- {badge && ( - - {badge} - - )} + {badge}
) @@ -334,3 +330,94 @@ export const TextHighlighter = ({ text, query, ...props }: TextHighlighterProps) } TextHighlighter.displayName = 'TextHighlighter' + +export interface UseHistoryKeysOptions { + enable: boolean + messages: string[] + setPrompt: (prompt: string) => void +} + +/** + * Enables a shell-style message history when hitting + * up/down on the keyboard + */ +export function useHistoryKeys({ enable, messages, setPrompt }: UseHistoryKeysOptions) { + // Message index when hitting up/down on the keyboard (shell style) + const [, setMessageSelectionIndex] = React.useState(0) + + React.useEffect(() => { + if (enable) { + return + } + + // Note: intentionally setting index to 1 greater than max index + setMessageSelectionIndex(messages.length) + }, [messages, enable]) + + React.useEffect(() => { + function onKeyDown(e: KeyboardEvent) { + switch (e.key) { + case 'ArrowUp': + setMessageSelectionIndex((index) => { + const newIndex = Math.max(index - 1, 0) + setPrompt(messages[newIndex] ?? '') + return newIndex + }) + return + case 'ArrowDown': + setMessageSelectionIndex((index) => { + const newIndex = Math.min(index + 1, messages.length) + setPrompt(messages[newIndex] ?? '') + return newIndex + }) + return + default: + return + } + } + + window.addEventListener('keydown', onKeyDown) + + return () => { + window.removeEventListener('keydown', onKeyDown) + } + }, [messages]) +} + +/** + * Automatically focuses an input on key press + * and on load (after the call stack) + * + * @returns An input ref for the input to focus + */ +export function useAutoInputFocus() { + const [input, setInput] = React.useState() + + // Use a callback-style ref to access the element when it mounts + const inputRef = React.useCallback((inputElement: HTMLInputElement) => { + if (inputElement) { + setInput(inputElement) + + // We need to delay the focus until the end of the call stack + // due to order of operations + setTimeout(() => { + inputElement.focus() + }, 0) + } + }, []) + + // Focus the input when typing from anywhere + React.useEffect(() => { + function onKeyDown() { + input?.focus() + } + + window.addEventListener('keydown', onKeyDown) + + return () => { + window.removeEventListener('keydown', onKeyDown) + } + }, [input]) + + return inputRef +} diff --git a/packages/ui/src/components/Command/CommandMenu.tsx b/packages/ui/src/components/Command/CommandMenu.tsx index 5a133b40668..ce2f288cb69 100644 --- a/packages/ui/src/components/Command/CommandMenu.tsx +++ b/packages/ui/src/components/Command/CommandMenu.tsx @@ -33,6 +33,7 @@ import ThemeOptions from './ThemeOptions' import APIKeys from './APIKeys' import SearchableStudioItems from './SearchableStudioItems' import CommandMenuShortcuts from './CommandMenuShortcuts' +import { BadgeExperimental } from './Command.Badges' export const CHAT_ROUTES = [ COMMAND_ROUTES.AI, // this one is temporary @@ -70,8 +71,12 @@ const CommandMenu = ({ projectRef }: CommandMenuProps) => { { - setIsOpen(!open) + onInteractOutside={(e) => { + // Only hide menu when clicking outside, not focusing outside + // Prevents Firefox dropdown issue that immediately closes menu after opening + if (e.type === 'dismissableLayer.pointerDownOutside') { + setIsOpen(!open) + } }} size={'xlarge'} className={'max-h-[70vh] lg:max-h-[50vh] overflow-hidden overflow-y-auto'} @@ -91,7 +96,7 @@ const CommandMenu = ({ projectRef }: CommandMenuProps) => { } onSelect={() => { setPages([...pages, COMMAND_ROUTES.AI]) }} @@ -175,7 +180,7 @@ const CommandMenu = ({ projectRef }: CommandMenuProps) => { } onSelect={() => setPages([...pages, COMMAND_ROUTES.GENERATE_SQL])} > @@ -205,7 +210,14 @@ const CommandMenu = ({ projectRef }: CommandMenuProps) => { ).split('https://app.supabase.com')[1] return ( - router.push(itemUrl)}> + { + router.push(item.url) + setIsOpen(false) + }} + > Go to {item.label} diff --git a/packages/ui/src/components/Command/CommandMenuShortcuts.tsx b/packages/ui/src/components/Command/CommandMenuShortcuts.tsx index 873c70b93d4..34096855c07 100644 --- a/packages/ui/src/components/Command/CommandMenuShortcuts.tsx +++ b/packages/ui/src/components/Command/CommandMenuShortcuts.tsx @@ -1,6 +1,6 @@ import { IconArrowLeft } from '../Icon/icons/IconArrowLeft' -import { Badge } from 'ui' +import { BadgeExperimental } from './Command.Badges' import { COMMAND_ROUTES } from './Command.constants' import { CommandShortcut } from './Command.utils' import { useCommandMenu } from './CommandMenuProvider' @@ -32,11 +32,7 @@ export default function CommandMenuShortcuts() { ))} - {currentPage && isExperimental(currentPage) && ( - - Experimental - - )} + {currentPage && isExperimental(currentPage) && }
) diff --git a/packages/ui/src/components/Command/GenerateSQL/GenerateSQL.tsx b/packages/ui/src/components/Command/GenerateSQL/GenerateSQL.tsx index d86eeae5de9..e6911f05822 100644 --- a/packages/ui/src/components/Command/GenerateSQL/GenerateSQL.tsx +++ b/packages/ui/src/components/Command/GenerateSQL/GenerateSQL.tsx @@ -13,11 +13,12 @@ import { MessageStatus, useAiChat, Tabs, + UseAiChatOptions, } from 'ui' import { cn } from '../../../utils/cn' import { AiIcon, AiIconChat } from '../Command.icons' -import { CommandItem } from '../Command.utils' +import { CommandItem, useAutoInputFocus, useHistoryKeys } from '../Command.utils' import { useCommandMenu } from '../CommandMenuProvider' import { SAMPLE_QUERIES } from '../Command.constants' import SQLOutputActions from './SQLOutputActions' @@ -25,10 +26,6 @@ import { generatePrompt } from './GenerateSQL.utils' import { ExcludeSchemaAlert, IncludeSchemaAlert, AiWarning } from '../Command.alerts' const GenerateSQL = () => { - // [Joshen] Temp hack to ensure that generatePrompt receives updated value - // of includeSchemaMetadata, needs to be fixed - const includeSchemaMetadataRef = useRef() - const [includeSchemaMetadata, setIncludeSchemaMetadata] = useState(false) const [selectedCategory, setSelectedCategory] = useState(SAMPLE_QUERIES[0].category) @@ -39,20 +36,27 @@ const GenerateSQL = () => { const allowSendingSchemaMetadata = project?.ref !== undefined && flags?.allowCMDKDataOptIn && isOptedInToAI + const messageTemplate = useCallback>( + (message) => + generatePrompt(message, isOptedInToAI && includeSchemaMetadata ? definitions : undefined), + [isOptedInToAI, includeSchemaMetadata, definitions] + ) + const { submit, reset, messages, isResponding, hasError } = useAiChat({ - messageTemplate: (message) => { - // [Joshen] Only pass the schema metadata at the start of the conversation if opted in - // Since the prompts are contextualized to the conversation, no need to keep sending it - return generatePrompt( - message, - isOptedInToAI && includeSchemaMetadataRef.current && messages.length === 0 - ? definitions - : undefined - ) - }, + messageTemplate, setIsLoading, }) + const inputRef = useAutoInputFocus() + + useHistoryKeys({ + enable: !isResponding, + messages: messages + .filter(({ role }) => role === MessageRole.User) + .map(({ content }) => content), + setPrompt: setSearch, + }) + const handleSubmit = useCallback( (message: string) => { setSearch('') @@ -68,7 +72,6 @@ const GenerateSQL = () => { useEffect(() => { if (search) handleSubmit(search) - includeSchemaMetadataRef.current = includeSchemaMetadata }, []) const formatAnswer = (answer: string) => { @@ -267,12 +270,7 @@ const GenerateSQL = () => { - setIncludeSchemaMetadata((prev) => { - includeSchemaMetadataRef.current = !prev - return !prev - }) - } + onChange={() => setIncludeSchemaMetadata((prev) => !prev)} />
) : includeSchemaMetadata ? ( @@ -283,15 +281,7 @@ const GenerateSQL = () => {
)} { - if (inputElement) { - // We need to delay the focus until the end of the call stack - // due to order of operations - setTimeout(() => { - inputElement.focus() - }, 0) - } - }} + inputRef={inputRef} className="bg-scale-100 rounded mx-3 mb-4" autoFocus placeholder={ diff --git a/packages/ui/src/components/Command/SearchOnlyItem.tsx b/packages/ui/src/components/Command/SearchOnlyItem.tsx index 82cd3d16314..f6c13c8e6c6 100644 --- a/packages/ui/src/components/Command/SearchOnlyItem.tsx +++ b/packages/ui/src/components/Command/SearchOnlyItem.tsx @@ -1,10 +1,5 @@ -import { useCommandState } from 'cmdk-supabase' import { CommandItem } from './Command.utils' export default function SearchOnlyItem({ children, isSubItem, ...props }: any) { - const search = useCommandState((state) => state.search) - // if search is empty & items is marked as a subItem, don't show it - // ie: only show these items in search results, not top level - if (!search && isSubItem) return null return {children} } diff --git a/packages/ui/src/components/Command/SearchableStudioItems.tsx b/packages/ui/src/components/Command/SearchableStudioItems.tsx index 0c6e4432fa8..9073944bf08 100644 --- a/packages/ui/src/components/Command/SearchableStudioItems.tsx +++ b/packages/ui/src/components/Command/SearchableStudioItems.tsx @@ -1,4 +1,3 @@ -import React from 'react' import { CommandGroup } from './Command.utils' import SearchOnlyItem from './SearchOnlyItem' import { useRouter } from 'next/router' diff --git a/packages/ui/src/components/Command/ThemeOptions.tsx b/packages/ui/src/components/Command/ThemeOptions.tsx index 1e20213bd70..8732bdf2bdd 100644 --- a/packages/ui/src/components/Command/ThemeOptions.tsx +++ b/packages/ui/src/components/Command/ThemeOptions.tsx @@ -1,12 +1,12 @@ import { CommandGroup } from 'cmdk-supabase' import { useCommandMenu } from './CommandMenuProvider' -import SearchOnlyItem from './SearchOnlyItem' +import ChildItem from './ChildItem' const ThemeOptions = ({ isSubItem = false }) => { const { setIsOpen, actions } = useCommandMenu() return ( - { actions.toggleTheme(true) @@ -14,8 +14,8 @@ const ThemeOptions = ({ isSubItem = false }) => { }} > Change Theme to dark - - + { actions.toggleTheme(false) @@ -23,7 +23,7 @@ const ThemeOptions = ({ isSubItem = false }) => { }} > Change Theme to light - + ) } diff --git a/packages/ui/src/components/ContextMenu/ContextMenu.stories.tsx b/packages/ui/src/components/ContextMenu/ContextMenu.stories.tsx index d2d155e8c47..10b4f3ef8eb 100644 --- a/packages/ui/src/components/ContextMenu/ContextMenu.stories.tsx +++ b/packages/ui/src/components/ContextMenu/ContextMenu.stories.tsx @@ -1,8 +1,8 @@ import React, { useState } from 'react' import { Button } from '../Button' import { Divider } from '../Divider' -import { IconSettings, IconLogOut } from '../../index' -import Typography from '../Typography' +import { IconSettings } from '../Icon/icons/IconSettings' +import { IconLogOut } from '../Icon/icons/IconLogOut' import { ContextMenu } from '.' import { IconLogIn } from '../Icon/icons/IconLogIn' @@ -34,25 +34,16 @@ export const Default = (args: any) => ( overlay={[
- - Signed in as{' '} - - - - tom@example.com{' '} - + Signed in as + tom@example.com
, , Group label, - console.log('clicked')}> - Account - , + console.log('clicked')}>Account, Settings, , - }> - Log out - , + }>Log out, ]} > {triggerArea} @@ -68,8 +59,8 @@ export const doNotcloseOverlay = (args: any) => ( {...args} overlay={[ - Signed in as - tom@example.com + Signed in as + tom@example.com , , Account, @@ -101,8 +92,8 @@ export const withCustomStyles = (args: any) => ( {...args} overlay={[ - Signed in as - tom@example.com + Signed in as + tom@example.com , , Account, @@ -130,9 +121,7 @@ export const Checkbox = (args: any) => { }> - Account - , + }>Account, Settings, , diff --git a/packages/ui/src/components/ContextMenu/ContextMenu.tsx b/packages/ui/src/components/ContextMenu/ContextMenu.tsx index 5a364ca4d5e..20ae5f6f66b 100644 --- a/packages/ui/src/components/ContextMenu/ContextMenu.tsx +++ b/packages/ui/src/components/ContextMenu/ContextMenu.tsx @@ -1,11 +1,7 @@ import React, { useState } from 'react' -// import * as RadixContextMenu from '@radix-ui/react-dropdown-menu' import { IconCheck } from '../Icon/icons/IconCheck' -// @ts-ignore -// import ContextMenuStyles from './ContextMenu.module.css' - import type * as RadixContextMenuTypes from '@radix-ui/react-context-menu/' import * as RadixContextMenu from '@radix-ui/react-context-menu' diff --git a/packages/ui/src/components/Divider/Divider.stories.tsx b/packages/ui/src/components/Divider/Divider.stories.tsx index 8826bebe1e3..eb0c6246ffd 100644 --- a/packages/ui/src/components/Divider/Divider.stories.tsx +++ b/packages/ui/src/components/Divider/Divider.stories.tsx @@ -1,6 +1,4 @@ -import React from 'react' import { Button } from '../Button' -import Typography from '../Typography' import { Divider } from './' export default { @@ -10,17 +8,11 @@ export default { export const Default = (args: any) => -export const withCenterText = (args: any) => ( - Hello world -) +export const withCenterText = (args: any) => Hello world -export const withLeftText = (args: any) => ( - Hello world -) +export const withLeftText = (args: any) => Hello world -export const withRightText = (args: any) => ( - Hello world -) +export const withRightText = (args: any) => Hello world export const lighterColor = (args: any) => @@ -32,7 +24,7 @@ export const vertical = (args: any) => ( - Some text + Some text
diff --git a/packages/ui/src/components/Dropdown/Dropdown.stories.tsx b/packages/ui/src/components/Dropdown/Dropdown.stories.tsx index 36a13dfd86c..d63186651bd 100644 --- a/packages/ui/src/components/Dropdown/Dropdown.stories.tsx +++ b/packages/ui/src/components/Dropdown/Dropdown.stories.tsx @@ -1,19 +1,15 @@ import React, { useState } from 'react' -import { Button } from '../Button' -import { Divider } from '../Divider' -import { - IconSettings, - IconLogOut, - IconChevronDown, - IconChevronRight, - IconHardDrive, -} from './../../index' -import Typography from '../Typography' - import { Dropdown } from './' -import { IconLogIn } from '../Icon/icons/IconLogIn' +import { Button } from '../Button' import { Input } from '../Input' -import { IconSearch } from '../Icon/icons/IconSearch' + +import { IconSettings } from './../Icon/icons/IconSettings' +import { IconLogOut } from './../Icon/icons/IconLogOut' +import { IconChevronDown } from './../Icon/icons/IconChevronDown' +import { IconChevronRight } from './../Icon/icons/IconChevronRight' +import { IconHardDrive } from './../Icon/icons/IconHardDrive' +import { IconLogIn } from './../Icon/icons/IconLogIn' +import { IconSearch } from './../Icon/icons/IconSearch' export default { title: 'Navigation/Dropdown', @@ -37,9 +33,7 @@ const DemoContainer = ({ children }: { children: React.ReactNode }) => ( " >
-

- Shall we nest some components? -

+

Shall we nest some components?

yea sure, go on then.

{children}
@@ -59,20 +53,14 @@ export const DefaultFull = (args: any) => { overlay={[
- - Signed in as{' '} - + Signed in as - - tom@example.com{' '} - + tom@example.com
, , Group label, - console.log('clicked')}> - Account - , + console.log('clicked')}>Account, Settings ⌘+T , @@ -97,9 +85,7 @@ export const DefaultFull = (args: any) => { , , Group label, - console.log('clicked')}> - Account - , + console.log('clicked')}>Account, Settings ⌘+T , @@ -113,9 +99,7 @@ export const DefaultFull = (args: any) => { , , - }> - Log out - , + }>Log out, ]} >
{!isLocked && (
diff --git a/studio/components/interfaces/Auth/Policies/PolicyTableRow/index.tsx b/studio/components/interfaces/Auth/Policies/PolicyTableRow/index.tsx index a1ebc007bff..70c4b48f9cb 100644 --- a/studio/components/interfaces/Auth/Policies/PolicyTableRow/index.tsx +++ b/studio/components/interfaces/Auth/Policies/PolicyTableRow/index.tsx @@ -2,7 +2,6 @@ import { FC } from 'react' import type { PostgresTable, PostgresPolicy } from '@supabase/postgres-meta' import { observer } from 'mobx-react-lite' import { useStore } from 'hooks' - import PolicyTableRowHeader from './PolicyTableRowHeader' import PolicyRow from './PolicyRow' import Panel from 'components/ui/Panel' @@ -44,30 +43,22 @@ const PolicyTableRow: FC = ({ {policies.length === 0 && (

No policies created yet

- {table.rls_enabled ? ( - -

- You need to write an access policy before you can query data from this table. - Without a policy, querying this table will result in an empty array of - results. + {!isLocked && + (table.rls_enabled ? ( +

+ RLS is enabled - create a policy to allow access to this table.

-
- ) : ( - - Anyone with the anon. key can modify or delete your data. You should turn on RLS and - create access policies to keep your data secure. - - )} + ) : ( + + Anyone with the anon. key can modify or delete your data. You should turn on RLS and + create access policies to keep your data secure. + + ))}
)} diff --git a/studio/components/interfaces/Billing/EnterpriseUpdate.tsx b/studio/components/interfaces/Billing/EnterpriseUpdate.tsx index 3e3ec309bfd..d6a7fd01e16 100644 --- a/studio/components/interfaces/Billing/EnterpriseUpdate.tsx +++ b/studio/components/interfaces/Billing/EnterpriseUpdate.tsx @@ -272,7 +272,7 @@ const EnterpriseUpdate: FC = ({
-
+
= ({ +const PaymentSummaryPanel = ({ isRefreshingPreview, isSpendCapEnabled, currentSubscription, @@ -77,8 +78,9 @@ const PaymentSummaryPanel: FC = ({ onConfirmPayment, isSubmitting, captcha, -}) => { +}: PaymentSummaryPanelProps) => { const { ui } = useStore() + const isActive = useIsProjectActive() const projectRegion = ui.selectedProject?.region // [Joshen] Point of refactor: Current plan can just be currentSubscription.tier @@ -444,6 +446,7 @@ const PaymentSummaryPanel: FC = ({ size="medium" loading={isSubmitting} disabled={ + !isActive || isSubmitting || isLoadingPaymentMethods || !hasChangesToPlan || @@ -454,7 +457,7 @@ const PaymentSummaryPanel: FC = ({ Confirm payment - {!hasChangesToPlan ? ( + {!hasChangesToPlan || !selectedPaymentMethod || !isActive ? ( @@ -465,28 +468,18 @@ const PaymentSummaryPanel: FC = ({ ].join(' ')} > - No changes made to your subscription + {!hasChangesToPlan + ? 'No changes made to your subscription' + : !selectedPaymentMethod + ? 'Please select a payment method' + : !isActive + ? 'Unable to update subscription as project is not active' + : ''}
- ) : !selectedPaymentMethod ? ( - - - -
- Please select a payment method -
-
-
- ) : ( - <> - )} + ) : null}
diff --git a/studio/components/interfaces/Billing/PlanSelection/Plans/PlanCTAButton.tsx b/studio/components/interfaces/Billing/PlanSelection/Plans/PlanCTAButton.tsx index 316265f8e2b..8718452e6d1 100644 --- a/studio/components/interfaces/Billing/PlanSelection/Plans/PlanCTAButton.tsx +++ b/studio/components/interfaces/Billing/PlanSelection/Plans/PlanCTAButton.tsx @@ -1,19 +1,20 @@ -import { FC } from 'react' +import Link from 'next/link' import { Button, IconLoader } from 'ui' import * as Tooltip from '@radix-ui/react-tooltip' import { useFlag } from 'hooks' import { STRIPE_PRODUCT_IDS } from 'lib/constants' import { StripeProduct } from 'components/interfaces/Billing' -import Link from 'next/link' +import { useIsProjectActive } from 'components/layouts/ProjectLayout/ProjectContext' -interface Props { +interface PlanCTAButtonProps { plan: any currentPlan?: StripeProduct onSelectPlan: (plan: any) => void } -const PlanCTAButton: FC = ({ plan, currentPlan, onSelectPlan }) => { +const PlanCTAButton = ({ plan, currentPlan, onSelectPlan }: PlanCTAButtonProps) => { + const isActive = useIsProjectActive() const projectUpdateDisabled = useFlag('disableProjectCreationAndUpdate') const getButtonType = (plan: any, currentPlan: any) => { @@ -84,7 +85,8 @@ const PlanCTAButton: FC = ({ plan, currentPlan, onSelectPlan }) => { const type = getButtonType(plan, currentPlan) const ctaText = getButtonText(plan, currentPlan) const disabled = - plan.id === STRIPE_PRODUCT_IDS.FREE && currentPlan.prod_id === STRIPE_PRODUCT_IDS.FREE + (!isActive && plan.name !== 'Enterprise') || + (plan.id === STRIPE_PRODUCT_IDS.FREE && currentPlan.prod_id === STRIPE_PRODUCT_IDS.FREE) if (plan.name === 'Enterprise') { return ( @@ -111,7 +113,7 @@ const PlanCTAButton: FC = ({ plan, currentPlan, onSelectPlan }) => { {ctaText} - {!disabled && projectUpdateDisabled && ( + {(projectUpdateDisabled || !isActive) && ( @@ -123,7 +125,11 @@ const PlanCTAButton: FC = ({ plan, currentPlan, onSelectPlan }) => { ].join(' ')} > - Subscription changes are currently disabled, our engineers are working on a fix + {projectUpdateDisabled + ? 'Subscription changes are currently disabled, our engineers are working on a fix' + : !isActive + ? 'Unable to update subscription as project is not active' + : ''}
diff --git a/studio/components/interfaces/Billing/ProUpgrade.tsx b/studio/components/interfaces/Billing/ProUpgrade.tsx index 5c4e8596d15..fac2c6db074 100644 --- a/studio/components/interfaces/Billing/ProUpgrade.tsx +++ b/studio/components/interfaces/Billing/ProUpgrade.tsx @@ -321,7 +321,7 @@ const ProUpgrade: FC = ({
-
+
= ({ - project, - subscription, - loading = false, - showProjectName = false, - currentPeriodStart, - currentPeriodEnd, -}) => { +const Subscription: FC = ({ showProjectName = false }) => { const router = useRouter() - + const { ui } = useStore() const { ref: projectRef } = useParams() + const isActive = useIsProjectActive() const projectUpdateDisabled = useFlag('disableProjectCreationAndUpdate') const canReadSubscription = checkPermissions(PermissionAction.READ, 'subscriptions') @@ -45,14 +35,23 @@ const Subscription: FC = ({ 'stripe.subscriptions' ) + const project = ui.selectedProject + const { + data: subscription, + isLoading: loading, + error, + } = useProjectSubscriptionQuery({ projectRef: ui.selectedProject?.ref }) const { data: usage, isLoading: loadingUsage } = useProjectUsageQuery({ projectRef }) const isPayg = subscription?.tier.prod_id === STRIPE_PRODUCT_IDS.PAYG - const isEnterprise = subscription.tier.supabase_prod_id === PRICING_TIER_PRODUCT_IDS.ENTERPRISE + const isEnterprise = subscription?.tier.supabase_prod_id === PRICING_TIER_PRODUCT_IDS.ENTERPRISE const addOns = subscription?.addons ?? [] const paid = subscription && subscription.tier.unit_amount > 0 - const basePlanCost = subscription?.tier.unit_amount / 100 + const basePlanCost = (subscription?.tier.unit_amount ?? 0) / 100 + + const currentPeriodStart = subscription?.billing.current_period_start ?? 0 + const currentPeriodEnd = subscription?.billing.current_period_end ?? 0 const deriveTotalCost = (): number => { const totalAddOnCost = addOns @@ -70,14 +69,23 @@ const Subscription: FC = ({ return basePlanCost + totalAddOnCost + totalUsageCost } + useEffect(() => { + if (error) { + ui.setNotification({ + category: 'error', + message: `Failed to get project subscription: ${(error as any)?.message ?? 'unknown'}`, + }) + } + }, [error]) + return ( - +

- {showProjectName ? project.name : 'Current subscription'} + {showProjectName ? project?.name ?? '' : 'Current subscription'}

{subscription?.tier.name ?? '-'}

@@ -85,11 +93,11 @@ const Subscription: FC = ({ - {!canUpdateSubscription || projectUpdateDisabled ? ( + {!canUpdateSubscription || projectUpdateDisabled || !isActive ? ( @@ -116,6 +124,8 @@ const Subscription: FC = ({ ) : !canUpdateSubscription ? ( 'You need additional permissions to amend subscriptions' + ) : !isActive ? ( + 'Unable to update subscription as project is not active' ) : ( '' )} diff --git a/studio/components/interfaces/Billing/TeamUpgrade.tsx b/studio/components/interfaces/Billing/TeamUpgrade.tsx index e067a403a06..55fbb9c3bee 100644 --- a/studio/components/interfaces/Billing/TeamUpgrade.tsx +++ b/studio/components/interfaces/Billing/TeamUpgrade.tsx @@ -291,7 +291,7 @@ const TeamUpgrade: FC = ({
-
+
[] + isEditing: boolean onFormChange: (value: { key: string; value: any }) => void onFormArrayChange: (value: { operation: 'add' | 'delete' | 'update' @@ -740,9 +741,11 @@ const InputDefinition: FC = observer(({}) => {

The language below should be written in `{_localState!.formState.language.value}`.

-

- Change the language in the Advanced Settings below. -

+ {!_localState?.isEditing && ( +

+ Change the language in the Advanced Settings below. +

+ )}
= ({}) => { - const { ui } = useStore() +const Infrastructure = ({}: InfrastructureProps) => { const { ref } = useParams() - - const project = ui.selectedProject + const { project } = useProjectContext() const { data: subscription } = useProjectSubscriptionQuery({ projectRef: ref }) const isFreeProject = subscription?.tier.supabase_prod_id === PRICING_TIER_PRODUCT_IDS.FREE - const { data, isLoading } = useProjectUpgradeEligibilityQuery({ projectRef: ref }) + const { + data, + isLoading: isLoadingUpgradeElibility, + isError, + } = useProjectUpgradeEligibilityQuery({ + projectRef: ref, + }) const { current_app_version, latest_app_version, requires_manual_intervention } = data || {} const isOnLatestVersion = current_app_version === latest_app_version const currentPgVersion = (current_app_version ?? '').split('supabase-postgres-')[1] @@ -87,11 +91,13 @@ const Infrastructure: FC = ({}) => { Postgres}> - + = ({ title, children }) => { if (error) { return ( - + - + ) } return ( - = ({ title, children }) => {
{children}
-
+ ) } diff --git a/studio/components/layouts/DatabaseLayout/DatabaseLayout.tsx b/studio/components/layouts/DatabaseLayout/DatabaseLayout.tsx index 5b45d0b9064..e162c8ed05c 100644 --- a/studio/components/layouts/DatabaseLayout/DatabaseLayout.tsx +++ b/studio/components/layouts/DatabaseLayout/DatabaseLayout.tsx @@ -2,8 +2,8 @@ import { FC, ReactNode, useEffect, useState } from 'react' import { observer } from 'mobx-react-lite' import { useRouter } from 'next/router' +import ProjectLayout from '../' import { useStore, withAuth } from 'hooks' -import BaseLayout from '../' import Error from 'components/ui/Error' import ProductMenu from 'components/ui/ProductMenu' import { generateDatabaseMenu } from './DatabaseMenu.utils' @@ -61,14 +61,14 @@ const DatabaseLayout: FC = ({ title, children }) => { if (error) { return ( - + - + ) } return ( - } @@ -76,7 +76,7 @@ const DatabaseLayout: FC = ({ title, children }) => {
{children}
-
+ ) } diff --git a/studio/components/layouts/DocsLayout/DocsLayout.tsx b/studio/components/layouts/DocsLayout/DocsLayout.tsx index f4d677f2669..a4923f56077 100644 --- a/studio/components/layouts/DocsLayout/DocsLayout.tsx +++ b/studio/components/layouts/DocsLayout/DocsLayout.tsx @@ -2,17 +2,20 @@ import { ReactElement, useEffect } from 'react' import { observer } from 'mobx-react-lite' import { useRouter } from 'next/router' +import ProjectLayout from '../' import { useStore, withAuth } from 'hooks' import Error from 'components/ui/Error' import ProductMenu from 'components/ui/ProductMenu' -import ProjectLayout from 'components/layouts/ProjectLayout/ProjectLayout' import { generateDocsMenu } from './DocsLayout.utils' +import { PROJECT_STATUS } from 'lib/constants' function DocsLayout({ title, children }: { title: string; children: ReactElement }) { const router = useRouter() const { meta, ui } = useStore() const { data, isLoading, error } = meta.openApi + const isPaused = ui.selectedProject?.status === PROJECT_STATUS.INACTIVE + const getPage = () => { if (router.pathname.endsWith('graphiql')) return 'graphiql' @@ -22,14 +25,14 @@ function DocsLayout({ title, children }: { title: string; children: ReactElement } useEffect(() => { - if (ui.selectedProject?.ref) { + if (ui.selectedProject?.ref && !isPaused) { meta.openApi.load() } }, [ui.selectedProject?.ref]) if (error) { return ( - + ) diff --git a/studio/components/layouts/FunctionsLayout.tsx b/studio/components/layouts/FunctionsLayout.tsx index c7271b1d877..f8caaf4780a 100644 --- a/studio/components/layouts/FunctionsLayout.tsx +++ b/studio/components/layouts/FunctionsLayout.tsx @@ -3,10 +3,10 @@ import { FC, ReactNode, useState } from 'react' import { observer } from 'mobx-react-lite' import { Button, IconExternalLink, IconCode, Modal, IconTerminal } from 'ui' +import ProjectLayout from './' import { checkPermissions, withAuth } from 'hooks' import { useParams } from 'common/hooks' import FunctionsNav from '../interfaces/Functions/FunctionsNav' -import BaseLayout from 'components/layouts' import NoPermission from 'components/ui/NoPermission' import { PermissionAction } from '@supabase/shared-types/out/constants' import { TerminalInstructions } from 'components/interfaces/Functions' @@ -27,11 +27,11 @@ const FunctionsLayout: FC = ({ title, children }) => { const canReadFunctions = checkPermissions(PermissionAction.FUNCTIONS_READ, '*') if (!canReadFunctions) { return ( - +
-
+
) } @@ -40,7 +40,7 @@ const FunctionsLayout: FC = ({ title, children }) => { const centered = !hasFunctions return ( - + {centered ? ( <>
@@ -171,7 +171,7 @@ const FunctionsLayout: FC = ({ title, children }) => {
-
+ ) } diff --git a/studio/components/layouts/LogsLayout/LogsLayout.tsx b/studio/components/layouts/LogsLayout/LogsLayout.tsx index 2a8c7c8e116..1d889b1735f 100644 --- a/studio/components/layouts/LogsLayout/LogsLayout.tsx +++ b/studio/components/layouts/LogsLayout/LogsLayout.tsx @@ -3,7 +3,7 @@ import { observer } from 'mobx-react-lite' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useRouter } from 'next/router' import { checkPermissions, useStore, withAuth } from 'hooks' -import BaseLayout from 'components/layouts' +import ProjectLayout from '../' import NoPermission from 'components/ui/NoPermission' import { generateLogsMenu } from './LogsMenu.utils' import ProductMenu from 'components/ui/ProductMenu' @@ -24,16 +24,16 @@ const LogsLayout = ({ title, children }: PropsWithChildren) => if (!canUseLogsExplorer) { return ( - +
-
+ ) } return ( - } @@ -41,7 +41,7 @@ const LogsLayout = ({ title, children }: PropsWithChildren) =>
{children}
-
+ ) } diff --git a/studio/components/layouts/ProjectLayout/NavigationBar/NavigationBar.utils.tsx b/studio/components/layouts/ProjectLayout/NavigationBar/NavigationBar.utils.tsx index 783e7b4aeb9..314f5d16569 100644 --- a/studio/components/layouts/ProjectLayout/NavigationBar/NavigationBar.utils.tsx +++ b/studio/components/layouts/ProjectLayout/NavigationBar/NavigationBar.utils.tsx @@ -17,9 +17,6 @@ import { SHOW_O11Y } from 'components/interfaces/Settings/Logs' export const generateToolRoutes = (ref?: string, project?: ProjectBase): Route[] => { const isProjectBuilding = project?.status === PROJECT_STATUS.COMING_UP - const isProjectPaused = project?.status === PROJECT_STATUS.INACTIVE - - const homeUrl = `/project/${ref}` const buildingUrl = `/project/${ref}/building` return [ @@ -33,9 +30,7 @@ export const generateToolRoutes = (ref?: string, project?: ProjectBase): Route[] preProcessor={(code) => code.replace(/svg/, 'svg class="m-auto text-color-inherit"')} /> ), - link: - ref && - (isProjectPaused ? homeUrl : isProjectBuilding ? buildingUrl : `/project/${ref}/editor`), + link: ref && (isProjectBuilding ? buildingUrl : `/project/${ref}/editor`), }, { key: 'sql', @@ -47,17 +42,12 @@ export const generateToolRoutes = (ref?: string, project?: ProjectBase): Route[] preProcessor={(code) => code.replace(/svg/, 'svg class="m-auto text-color-inherit"')} /> ), - link: - ref && - (isProjectPaused ? homeUrl : isProjectBuilding ? buildingUrl : `/project/${ref}/sql`), + link: ref && (isProjectBuilding ? buildingUrl : `/project/${ref}/sql`), }, ] } export const generateProductRoutes = (ref?: string, project?: ProjectBase): Route[] => { - const isProjectBuilding = project?.status !== PROJECT_STATUS.ACTIVE_HEALTHY - const isProjectPaused = project?.status === PROJECT_STATUS.INACTIVE - - const homeUrl = `/project/${ref}` + const isProjectBuilding = project?.status === PROJECT_STATUS.COMING_UP const buildingUrl = `/project/${ref}/building` return [ @@ -65,37 +55,19 @@ export const generateProductRoutes = (ref?: string, project?: ProjectBase): Rout key: 'database', label: 'Database', icon: , - link: - ref && - (isProjectPaused - ? homeUrl - : isProjectBuilding - ? buildingUrl - : `/project/${ref}/database/tables`), + link: ref && (isProjectBuilding ? buildingUrl : `/project/${ref}/database/tables`), }, { key: 'auth', label: 'Authentication', icon: , - link: - ref && - (isProjectPaused - ? homeUrl - : isProjectBuilding - ? buildingUrl - : `/project/${ref}/auth/users`), + link: ref && (isProjectBuilding ? buildingUrl : `/project/${ref}/auth/users`), }, { key: 'storage', label: 'Storage', icon: , - link: - ref && - (isProjectPaused - ? homeUrl - : isProjectBuilding - ? buildingUrl - : `/project/${ref}/storage/buckets`), + link: ref && (isProjectBuilding ? buildingUrl : `/project/${ref}/storage/buckets`), }, ...(IS_PLATFORM ? [ @@ -103,13 +75,7 @@ export const generateProductRoutes = (ref?: string, project?: ProjectBase): Rout key: 'functions', label: 'Edge Functions', icon: , - link: - ref && - (isProjectPaused - ? homeUrl - : isProjectBuilding - ? buildingUrl - : `/project/${ref}/functions`), + link: ref && (isProjectBuilding ? buildingUrl : `/project/${ref}/functions`), }, ] : []), @@ -118,9 +84,6 @@ export const generateProductRoutes = (ref?: string, project?: ProjectBase): Rout export const generateOtherRoutes = (ref?: string, project?: ProjectBase): Route[] => { const isProjectBuilding = project?.status === PROJECT_STATUS.COMING_UP - const isProjectPaused = project?.status === PROJECT_STATUS.INACTIVE - - const homeUrl = `/project/${ref}` const buildingUrl = `/project/${ref}/building` return [ @@ -130,13 +93,7 @@ export const generateOtherRoutes = (ref?: string, project?: ProjectBase): Route[ key: 'reports', label: 'Reports', icon: , - link: - ref && - (isProjectPaused - ? homeUrl - : isProjectBuilding - ? buildingUrl - : `/project/${ref}/reports`), + link: ref && (isProjectBuilding ? buildingUrl : `/project/${ref}/reports`), }, ] : []), @@ -146,13 +103,7 @@ export const generateOtherRoutes = (ref?: string, project?: ProjectBase): Route[ key: 'logs', label: 'Logs', icon: , - link: - ref && - (isProjectPaused - ? homeUrl - : isProjectBuilding - ? buildingUrl - : `/project/${ref}/logs/explorer`), + link: ref && (isProjectBuilding ? buildingUrl : `/project/${ref}/logs/explorer`), }, ] : []), @@ -160,9 +111,7 @@ export const generateOtherRoutes = (ref?: string, project?: ProjectBase): Route[ key: 'api', label: 'API Docs', icon: , - link: - ref && - (isProjectPaused ? homeUrl : isProjectBuilding ? buildingUrl : `/project/${ref}/api`), + link: ref && (isProjectBuilding ? buildingUrl : `/project/${ref}/api`), }, ...(IS_PLATFORM ? [ diff --git a/studio/components/layouts/ProjectLayout/ProjectContext.tsx b/studio/components/layouts/ProjectLayout/ProjectContext.tsx index 048d714c2f6..8fc28f52926 100644 --- a/studio/components/layouts/ProjectLayout/ProjectContext.tsx +++ b/studio/components/layouts/ProjectLayout/ProjectContext.tsx @@ -1,5 +1,6 @@ import { useParams } from 'common/hooks' import { useStore } from 'hooks' +import { PROJECT_STATUS } from 'lib/constants' import { observer } from 'mobx-react-lite' import { createContext, PropsWithChildren, useContext, useMemo } from 'react' import { Project } from 'types' @@ -51,3 +52,8 @@ export const ProjectContextFromParamsProvider = ({ children }: PropsWithChildren return {children} } + +export const useIsProjectActive = () => { + const { project } = useProjectContext() + return project?.status === PROJECT_STATUS.ACTIVE_HEALTHY +} diff --git a/studio/components/layouts/ProjectLayout/ProjectLayout.tsx b/studio/components/layouts/ProjectLayout/ProjectLayout.tsx index ee40f5c4d7b..11c972561ba 100644 --- a/studio/components/layouts/ProjectLayout/ProjectLayout.tsx +++ b/studio/components/layouts/ProjectLayout/ProjectLayout.tsx @@ -1,5 +1,5 @@ import Head from 'next/head' -import { FC, ReactNode, PropsWithChildren, Fragment } from 'react' +import { ReactNode, Fragment } from 'react' import { observer } from 'mobx-react-lite' import { useRouter } from 'next/router' import { useStore, withAuth, useFlag } from 'hooks' @@ -16,14 +16,16 @@ import BuildingState from './BuildingState' import { ProjectContextProvider } from './ProjectContext' import RestoringState from './RestoringState' import UpgradingState from './UpgradingState' +import ProjectPausedState from './ProjectPausedState' -interface Props { +export interface ProjectLayoutProps { title?: string isLoading?: boolean product?: string productMenu?: ReactNode hideHeader?: boolean hideIconBar?: boolean + children: ReactNode } const ProjectLayout = ({ @@ -34,12 +36,18 @@ const ProjectLayout = ({ children, hideHeader = false, hideIconBar = false, -}: PropsWithChildren) => { - const { ref: projectRef } = useParams() +}: ProjectLayoutProps) => { const { ui } = useStore() + const router = useRouter() + const { ref: projectRef } = useParams() const ongoingIncident = useFlag('ongoingIncident') const projectName = ui.selectedProject?.name + const isPaused = ui.selectedProject?.status === PROJECT_STATUS.INACTIVE + const ignorePausedState = + router.pathname === '/project/[ref]' || router.pathname.includes('/project/[ref]/settings') + const showPausedState = isPaused && !ignorePausedState + return ( @@ -53,16 +61,26 @@ const ProjectLayout = ({ {!hideIconBar && } {/* Product menu bar */} - - {productMenu} - + {!showPausedState && ( + + {productMenu} + + )}
{!hideHeader && } - {children} + {showPausedState ? ( +
+
+ +
+
+ ) : ( + {children} + )}
@@ -76,15 +94,17 @@ export default observer(ProjectLayout) interface MenuBarWrapperProps { isLoading: boolean productMenu?: ReactNode + children: ReactNode } -const MenuBarWrapper: FC = observer(({ isLoading, productMenu, children }) => { +const MenuBarWrapper = observer(({ isLoading, productMenu, children }: MenuBarWrapperProps) => { const { ui } = useStore() return <>{!isLoading && productMenu && ui.selectedProject !== undefined ? children : null} }) interface ContentWrapperProps { isLoading: boolean + children: ReactNode } /** @@ -99,7 +119,7 @@ interface ContentWrapperProps { * * [TODO] Next iteration should scrape long polling and just listen to the project's status */ -const ContentWrapper: FC = observer(({ isLoading, children }) => { +const ContentWrapper = observer(({ isLoading, children }: ContentWrapperProps) => { const { ui } = useStore() const router = useRouter() @@ -143,39 +163,62 @@ const ContentWrapper: FC = observer(({ isLoading, children ) }) -export const ProjectLayoutNonBlocking = ({ - title, - product = '', - productMenu, - children, - hideHeader = false, - hideIconBar = false, -}: PropsWithChildren) => { - const { ref: projectRef } = useParams() - const ongoingIncident = useFlag('ongoingIncident') +/** + * Shows the children irregardless of whether the selected project has loaded or not + * We'll eventually want to use this instead of the current ProjectLayout to prevent + * a catch-all spinner on the dashboard + */ +export const ProjectLayoutNonBlocking = observer( + ({ + title, + product = '', + productMenu, + children, + hideHeader = false, + hideIconBar = false, + }: ProjectLayoutProps) => { + const { ui } = useStore() + const router = useRouter() + const { ref: projectRef } = useParams() + const ongoingIncident = useFlag('ongoingIncident') + const isPaused = ui.selectedProject?.status === PROJECT_STATUS.INACTIVE + const ignorePausedState = + router.pathname === '/project/[ref]' || router.pathname.includes('/project/[ref]/settings') + const showPausedState = isPaused && !ignorePausedState - return ( - - - {title ? `${title} | Supabase` : 'Supabase'} - - - -
- {/* Left-most navigation side bar to access products */} - {!hideIconBar && } + return ( + + + {title ? `${title} | Supabase` : 'Supabase'} + + + +
+ {/* Left-most navigation side bar to access products */} + {!hideIconBar && } - {/* Product menu bar */} - {productMenu && {productMenu}} + {/* Product menu bar */} + {productMenu && !showPausedState && ( + {productMenu} + )} -
- {!hideHeader && } - {children} -
-
-
- ) -} +
+ {!hideHeader && } + {showPausedState ? ( +
+
+ +
+
+ ) : ( + children + )} +
+
+
+ ) + } +) diff --git a/studio/components/layouts/ProjectLayout/ProjectPausedState.tsx b/studio/components/layouts/ProjectLayout/ProjectPausedState.tsx index 0733a2fbc81..f217de7b35e 100644 --- a/studio/components/layouts/ProjectLayout/ProjectPausedState.tsx +++ b/studio/components/layouts/ProjectLayout/ProjectPausedState.tsx @@ -1,22 +1,24 @@ -import { FC, useState } from 'react' +import Link from 'next/link' +import { useState } from 'react' import * as Tooltip from '@radix-ui/react-tooltip' import { Modal, Button, IconPauseCircle } from 'ui' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { Project } from 'types' import { checkPermissions, useStore, useFlag } from 'hooks' import { post } from 'lib/common/fetch' import { API_URL, PROJECT_STATUS } from 'lib/constants' -import { DeleteProjectButton } from 'components/interfaces/Settings/General' import ConfirmModal from 'components/ui/Dialogs/ConfirmDialog' import { useFreeProjectLimitCheckQuery } from 'data/organizations/free-project-limit-check-query' +import { useParams } from 'common' -interface Props { - project: Project +export interface ProjectPausedStateProps { + product?: string } -const ProjectPausedState: FC = ({ project }) => { +const ProjectPausedState = ({ product }: ProjectPausedStateProps) => { const { ui, app } = useStore() + const { ref } = useParams() + const project = ui.selectedProject const orgSlug = ui.selectedOrganization?.slug const kpsEnabled = useFlag('initWithKps') @@ -42,6 +44,14 @@ const ProjectPausedState: FC = ({ project }) => { } const onConfirmRestore = async () => { + if (!project) { + return ui.setNotification({ + error: 'Project is required', + category: 'error', + message: 'Unable to restore: project is required', + }) + } + await post(`${API_URL}/projects/${project.ref}/restore`, { kps_enabled: kpsEnabled }) app.onProjectUpdated({ ...project, status: PROJECT_STATUS.RESTORING }) ui.setNotification({ category: 'success', message: 'Restoring project' }) @@ -52,12 +62,28 @@ const ProjectPausedState: FC = ({ project }) => {
-
+
-

This project is paused.

+
+

+ The project "{project?.name ?? ''}" is currently paused. +

+

+ All of your project's data is still intact, but your project is inaccessible while + paused.{' '} + {product !== undefined ? ( + <> + Restore this project to access the{' '} + {product} page + + ) : ( + 'Restore this project and get back to building the next big thing!' + )} +

+
@@ -89,12 +115,12 @@ const ProjectPausedState: FC = ({ project }) => { )} - + + + + +
- -

- Restore this project and get back to building the next big thing! -

diff --git a/studio/components/layouts/ReportsLayout/ReportsLayout.tsx b/studio/components/layouts/ReportsLayout/ReportsLayout.tsx index 59facd25d12..6c789413f9e 100644 --- a/studio/components/layouts/ReportsLayout/ReportsLayout.tsx +++ b/studio/components/layouts/ReportsLayout/ReportsLayout.tsx @@ -2,7 +2,7 @@ import { PropsWithChildren } from 'react' import { observer } from 'mobx-react-lite' import { useRouter } from 'next/router' import { useStore, withAuth } from 'hooks' -import ProjectLayout from '../ProjectLayout/ProjectLayout' +import ProjectLayout from '../' import ProductMenu from 'components/ui/ProductMenu' import { generateReportsMenu } from './ReportsMenu.utils' diff --git a/studio/components/layouts/SQLEditorLayout/SQLEditorLayout.tsx b/studio/components/layouts/SQLEditorLayout/SQLEditorLayout.tsx index 2900812c16f..035773cf1ed 100644 --- a/studio/components/layouts/SQLEditorLayout/SQLEditorLayout.tsx +++ b/studio/components/layouts/SQLEditorLayout/SQLEditorLayout.tsx @@ -1,6 +1,6 @@ import { ReactNode, useMemo } from 'react' import { withAuth } from 'hooks' -import { ProjectLayoutNonBlocking } from '../ProjectLayout/ProjectLayout' +import { ProjectLayoutNonBlocking } from '../' import SQLEditorMenu from './SQLEditorMenu' export interface SQLEditorLayoutProps { diff --git a/studio/components/layouts/SettingsLayout/SettingsLayout.tsx b/studio/components/layouts/SettingsLayout/SettingsLayout.tsx index d60013f47b0..068a84aa347 100644 --- a/studio/components/layouts/SettingsLayout/SettingsLayout.tsx +++ b/studio/components/layouts/SettingsLayout/SettingsLayout.tsx @@ -4,7 +4,7 @@ import { useRouter } from 'next/router' import { useStore, withAuth } from 'hooks' import { generateSettingsMenu } from './SettingsMenu.utils' -import BaseLayout from '../' +import ProjectLayout from '../' import ProductMenu from 'components/ui/ProductMenu' interface Props { @@ -33,7 +33,7 @@ const SettingsLayout: FC = ({ title, children }) => { }, [ui.selectedProject?.ref]) return ( - } @@ -41,7 +41,7 @@ const SettingsLayout: FC = ({ title, children }) => {
{children}
-
+ ) } diff --git a/studio/components/layouts/SettingsLayout/SettingsMenu.utils.ts b/studio/components/layouts/SettingsLayout/SettingsMenu.utils.ts index ddaed65b6cd..87d133a4b26 100644 --- a/studio/components/layouts/SettingsLayout/SettingsMenu.utils.ts +++ b/studio/components/layouts/SettingsLayout/SettingsMenu.utils.ts @@ -5,8 +5,7 @@ import { ProductMenuGroup } from 'components/ui/ProductMenu/ProductMenu.types' export const generateSettingsMenu = (ref: string, project?: ProjectBase): ProductMenuGroup[] => { const isVaultEnabled = useFlag('vaultExtension') - - const isProjectBuilding = project?.status !== PROJECT_STATUS.ACTIVE_HEALTHY + const isProjectBuilding = project?.status === PROJECT_STATUS.COMING_UP const buildingUrl = `/project/${ref}/building` return [ diff --git a/studio/components/layouts/StorageLayout/StorageLayout.tsx b/studio/components/layouts/StorageLayout/StorageLayout.tsx index 91d6657eb7b..cc753c05347 100644 --- a/studio/components/layouts/StorageLayout/StorageLayout.tsx +++ b/studio/components/layouts/StorageLayout/StorageLayout.tsx @@ -5,11 +5,12 @@ import { observer } from 'mobx-react-lite' import { useStore, withAuth } from 'hooks' import { useParams } from 'common/hooks' import { AutoApiService, useProjectApiQuery } from 'data/config/project-api-query' -import ProjectLayout from '../ProjectLayout/ProjectLayout' +import ProjectLayout from '../' import StorageMenu from './StorageMenu' import { useStorageStore } from 'localStores/storageExplorer/StorageExplorerStore' import { formatPoliciesForStorage } from 'components/to-be-cleaned/Storage/Storage.utils' import DeleteBucketModal from 'components/to-be-cleaned/Storage/DeleteBucketModal' +import { PROJECT_STATUS } from 'lib/constants' interface Props { title: string @@ -19,7 +20,6 @@ interface Props { const StorageLayout: FC = ({ title, children }) => { const { ui, meta } = useStore() const { ref: projectRef } = useParams() - const storageExplorerStore = useStorageStore() const { selectedBucketToEdit, @@ -32,11 +32,15 @@ const StorageLayout: FC = ({ title, children }) => { const { data: settings, isLoading } = useProjectApiQuery({ projectRef }) const apiService = settings?.autoApiService + const isPaused = ui.selectedProject?.status === PROJECT_STATUS.INACTIVE + useEffect(() => { if (!isLoading && apiService) initializeStorageStore(apiService) }, [isLoading]) const initializeStorageStore = async (apiService: AutoApiService) => { + if (isPaused) return + if (apiService.endpoint) { storageExplorerStore.initStore( projectRef, diff --git a/studio/components/layouts/TableEditorLayout/TableEditorLayout.tsx b/studio/components/layouts/TableEditorLayout/TableEditorLayout.tsx index 5af32a7110e..af9d3c9d067 100644 --- a/studio/components/layouts/TableEditorLayout/TableEditorLayout.tsx +++ b/studio/components/layouts/TableEditorLayout/TableEditorLayout.tsx @@ -1,4 +1,4 @@ -import { PropsWithChildren, useEffect, useState } from 'react' +import { PropsWithChildren, useEffect } from 'react' import { useRouter } from 'next/router' import { noop } from 'lodash' import { observer } from 'mobx-react-lite' @@ -9,7 +9,7 @@ import { useParams } from 'common/hooks' import { Entity } from 'data/entity-types/entity-type-query' import { ENTITY_TYPE } from 'data/entity-types/entity-type-constants' import { useIsTableLoaded, useTableEditorStateSnapshot } from 'state/table-editor' -import ProjectLayout from '../ProjectLayout/ProjectLayout' +import ProjectLayout from '../' import TableEditorMenu from './TableEditorMenu' import NoPermission from 'components/ui/NoPermission' import useEntityType from 'hooks/misc/useEntityType' diff --git a/studio/components/layouts/index.ts b/studio/components/layouts/index.ts index 7c64f282032..b5ffd3d933f 100644 --- a/studio/components/layouts/index.ts +++ b/studio/components/layouts/index.ts @@ -1,7 +1,10 @@ import AuthLayout from './AuthLayout/AuthLayout' import SignInLayout from './SignInLayout/SignInLayout' import ForgotPasswordLayout from './SignInLayout/ForgotPasswordLayout' -import ProjectLayout, { ProjectLayoutWithAuth } from './ProjectLayout/ProjectLayout' +import ProjectLayout, { + ProjectLayoutWithAuth, + ProjectLayoutNonBlocking, +} from './ProjectLayout/ProjectLayout' import TableEditorLayout from './TableEditorLayout/TableEditorLayout' import SQLEditorLayout from './SQLEditorLayout/SQLEditorLayout' import DatabaseLayout from './DatabaseLayout/DatabaseLayout' @@ -20,6 +23,7 @@ import OrganizationLayout from './OrganizationLayout' export { ProjectLayoutWithAuth, + ProjectLayoutNonBlocking, AuthLayout, SignInLayout, ForgotPasswordLayout, diff --git a/studio/components/ui/Loading/Loading.anim.json b/studio/components/ui/Loading/Loading.anim.json index e1c5552f0aa..2a3d102ae4f 100644 --- a/studio/components/ui/Loading/Loading.anim.json +++ b/studio/components/ui/Loading/Loading.anim.json @@ -1 +1 @@ -{"v":"5.7.3","fr":30,"ip":0,"op":45,"w":150,"h":150,"nm":"Loading-purple","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Livello forma 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,75,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[50,50,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8.191,0],[0,0],[0,0],[2.859,-3.601],[0,0],[-8.191,0],[0,0],[0,0],[-2.859,3.601],[0,0]],"o":[[0,0],[0,0],[-0.069,-4.598],[0,0],[-5.093,6.415],[0,0],[0,0],[0.069,4.598],[0,0],[5.093,-6.415]],"v":[[44.681,-16.115],[-0.239,-16.115],[-0.469,-51.136],[-9.195,-54.106],[-52.347,0.24],[-44.681,16.115],[-0.055,16.115],[0.469,51.137],[9.195,54.107],[52.347,-0.24]],"c":true},"ix":2},"nm":"Tracciato 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":0,"k":6,"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,0.275,0.208,0.655,0.5,0.429,0.106,0.827,1,0.584,0.004,1,0,0.8,0.5,0.5,1,0.2],"ix":8}},"s":{"a":0,"k":[0,0],"ix":4},"e":{"a":0,"k":[100,0],"ix":5},"t":1,"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":13},"bm":0,"d":[{"n":"d","nm":"trattino","v":{"a":0,"k":400,"ix":1}},{"n":"g","nm":"spazio","v":{"a":0,"k":400,"ix":2}},{"n":"o","nm":"scostamento","v":{"a":0,"k":169.492,"ix":7}}],"nm":"Tratto sfumatura 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Trasformazione"}],"nm":"Forma 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.423],"y":[1]},"o":{"x":[0.501],"y":[0]},"t":9,"s":[100]},{"t":44,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.501],"y":[-0.004]},"t":1,"s":[100]},{"t":22,"s":[0]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100]},{"t":44,"s":[-260]}],"ix":3},"m":1,"ix":2,"nm":"Taglia tracciati 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":45,"st":0,"bm":0}],"markers":[]} \ No newline at end of file +{"v":"5.7.3","fr":30,"ip":0,"op":45,"w":150,"h":150,"nm":"Loading-brand-green 2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Livello forma 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75,75,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[70,70,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[8.191,0],[0,0],[0,0],[2.859,-3.601],[0,0],[-8.191,0],[0,0],[0,0],[-2.859,3.601],[0,0]],"o":[[0,0],[0,0],[-0.069,-4.598],[0,0],[-5.093,6.415],[0,0],[0,0],[0.069,4.598],[0,0],[5.093,-6.415]],"v":[[44.681,-16.115],[-0.239,-16.115],[-0.469,-51.136],[-9.195,-54.106],[-52.347,0.24],[-44.681,16.115],[-0.055,16.115],[0.469,51.137],[9.195,54.107],[52.347,-0.24]],"c":true},"ix":2},"nm":"Tracciato 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.243137255311,0.811764717102,0.556862771511,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":2,"bm":0,"nm":"Traccia 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Trasformazione"}],"nm":"Forma 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.423],"y":[1]},"o":{"x":[0.501],"y":[0]},"t":9,"s":[100]},{"t":44,"s":[2]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.571],"y":[-0.005]},"t":0,"s":[98]},{"t":22,"s":[0]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.676],"y":[1]},"o":{"x":[0.376],"y":[0]},"t":0,"s":[105]},{"t":44,"s":[-260]}],"ix":3},"m":1,"ix":2,"nm":"Taglia tracciati 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":45,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/studio/components/ui/Loading/Loading.tsx b/studio/components/ui/Loading/Loading.tsx index be3ad894d47..f71606fe8ae 100644 --- a/studio/components/ui/Loading/Loading.tsx +++ b/studio/components/ui/Loading/Loading.tsx @@ -6,7 +6,7 @@ interface Props {} const Connecting: FC = () => (
-
+
diff --git a/studio/hooks/misc/useStore.tsx b/studio/hooks/misc/useStore.tsx index 0c7072a0381..2248cda5eee 100644 --- a/studio/hooks/misc/useStore.tsx +++ b/studio/hooks/misc/useStore.tsx @@ -73,23 +73,6 @@ export const StoreProvider: FC = ({ children, rootStore }) => { } } }) - - /** - * get Ga4 client_id when it's available - * */ - // @ts-ignore - if (!!window?.gtag) { - // @ts-ignore - window?.gtag( - 'get', - `${process.env.NEXT_PUBLIC_GA4_MEASUREMENT_ID}`, - 'client_id', - // @ts-ignore - (client_id) => { - ui.setGaClientId(client_id) - } - ) - } }, []) return {children} diff --git a/studio/lib/common/fetch/base.ts b/studio/lib/common/fetch/base.ts index 4116526bf6b..7acd51d1dae 100644 --- a/studio/lib/common/fetch/base.ts +++ b/studio/lib/common/fetch/base.ts @@ -111,10 +111,5 @@ export async function constructHeaders(requestId: string, optionHeaders?: { [pro if (accessToken) headers.Authorization = `Bearer ${accessToken}` } - if (typeof window !== 'undefined') { - const gaClientId = window?.localStorage?.getItem('ga_client_id') - if (gaClientId && gaClientId !== 'undefined') headers['X-GA-Client-Id'] = gaClientId - } - return headers } diff --git a/studio/lib/helpers.ts b/studio/lib/helpers.ts index 253acca7f8f..d11dd083a6e 100644 --- a/studio/lib/helpers.ts +++ b/studio/lib/helpers.ts @@ -153,10 +153,26 @@ export const snakeToCamel = (str: string) => group.toUpperCase().replace('-', '').replace('_', '') ) -export const copyToClipboard = (str: string, callback = () => {}) => { +/** + * Copy text content (string or Promise) into Clipboard. + * Safari doesn't support write text into clipboard async, so if you need to load + * text content async before coping, please use Promise for the 1st arg. + */ +export const copyToClipboard = (str: string | Promise, callback = () => {}) => { const focused = window.document.hasFocus() if (focused) { - window.navigator?.clipboard?.writeText(str).then(callback) + if (window.ClipboardItem) { + const text = new ClipboardItem({ + 'text/plain': Promise.resolve(str).then((text) => new Blob([text], { type: 'text/plain' })), + }) + window.navigator?.clipboard?.write([text]).then(callback) + + return + } + + Promise.resolve(str) + .then((text) => window.navigator?.clipboard?.writeText(text)) + .then(callback) } else { console.warn('Unable to copy to clipboard') } diff --git a/studio/localStores/storageExplorer/StorageExplorerStore.js b/studio/localStores/storageExplorer/StorageExplorerStore.js index 67a69895dd1..4c7ce2f14d5 100644 --- a/studio/localStores/storageExplorer/StorageExplorerStore.js +++ b/studio/localStores/storageExplorer/StorageExplorerStore.js @@ -407,13 +407,15 @@ class StorageExplorerStore { }) } else { // Need to generate signed URL, and might as well save it to cache as well - const signedUrl = await this.fetchFilePreview(file.name, expiresIn) - - try { - let formattedUrl = new URL(signedUrl) + const signedUrlAsync = this.fetchFilePreview(file.name, expiresIn).then((signedUrl) => { + const formattedUrl = new URL(signedUrl) formattedUrl.searchParams.set('t', new Date().toISOString()) - copyToClipboard(formattedUrl.toString(), () => { + return formattedUrl.toString() + }) + + try { + copyToClipboard(signedUrlAsync, () => { this.ui.setNotification({ category: 'success', message: `Copied URL for ${file.name} to clipboard.`, @@ -422,7 +424,7 @@ class StorageExplorerStore { }) const fileCache = { id: file.id, - url: formattedUrl.toString(), + url: await signedUrlAsync, expiresIn: DEFAULT_EXPIRY, fetchedAt: Date.now(), } diff --git a/studio/pages/_app.tsx b/studio/pages/_app.tsx index c800be4a192..8a9144cf26f 100644 --- a/studio/pages/_app.tsx +++ b/studio/pages/_app.tsx @@ -22,7 +22,6 @@ import relativeTime from 'dayjs/plugin/relativeTime' import Prism from 'prism-react-renderer/prism' import Head from 'next/head' -import Script from 'next/script' import { AppPropsWithLayout } from 'types' import { ThemeProvider } from 'common' @@ -133,20 +132,6 @@ function CustomApp({ Component, pageProps }: AppPropsWithLayout) { - - diff --git a/studio/pages/project/[ref]/database/hooks/index.tsx b/studio/pages/project/[ref]/database/hooks/index.tsx index d95c83a440d..4981cae2e65 100644 --- a/studio/pages/project/[ref]/database/hooks/index.tsx +++ b/studio/pages/project/[ref]/database/hooks/index.tsx @@ -1,4 +1,5 @@ import clsx from 'clsx' +import { IconLoader } from 'ui' import { useEffect, useState } from 'react' import { useRouter } from 'next/router' import { observer } from 'mobx-react-lite' @@ -14,8 +15,6 @@ import HooksList from 'components/interfaces/Database/Hooks/HooksList/HooksList' import DeleteHookModal from 'components/interfaces/Database/Hooks/DeleteHookModal' import EditHookPanel from 'components/interfaces/Database/Hooks/EditHookPanel' import ProductEmptyState from 'components/to-be-cleaned/ProductEmptyState' -import AlphaPreview from 'components/to-be-cleaned/AlphaPreview' -import { IconLoader } from 'ui' const HooksPage: NextPageWithLayout = () => { const { meta, ui } = useStore() diff --git a/studio/pages/project/[ref]/index.tsx b/studio/pages/project/[ref]/index.tsx index 44249b8cb22..af738885e0d 100644 --- a/studio/pages/project/[ref]/index.tsx +++ b/studio/pages/project/[ref]/index.tsx @@ -36,7 +36,7 @@ const Home: NextPageWithLayout = () => {
- {project?.status === PROJECT_STATUS.INACTIVE && } + {project?.status === PROJECT_STATUS.INACTIVE && }
{IS_PLATFORM && project?.status !== PROJECT_STATUS.INACTIVE && } diff --git a/studio/pages/project/[ref]/settings/api.tsx b/studio/pages/project/[ref]/settings/api.tsx index 0446e3d361a..6bb7f9064ec 100644 --- a/studio/pages/project/[ref]/settings/api.tsx +++ b/studio/pages/project/[ref]/settings/api.tsx @@ -1,5 +1,4 @@ -import { createContext } from 'react' -import { useRouter } from 'next/router' +import { createContext, useEffect } from 'react' import { observer, useLocalObservable } from 'mobx-react-lite' import { useStore } from 'hooks' @@ -7,15 +6,18 @@ import { useParams } from 'common/hooks' import { NextPageWithLayout } from 'types' import { SettingsLayout } from 'components/layouts' import ServiceList from 'components/interfaces/Settings/API/ServiceList' +import { IconAlertCircle } from 'ui' +import { useIsProjectActive } from 'components/layouts/ProjectLayout/ProjectContext' export const PageContext: any = createContext(null) const ApiSettings: NextPageWithLayout = () => { const { ref } = useParams() - const { meta, ui } = useStore() const project = ui.selectedProject + const isActive = useIsProjectActive() + // [Joshen] Will need to deprecate this const PageState: any = useLocalObservable(() => ({ project: null, projectRef: ref, @@ -24,21 +26,28 @@ const ApiSettings: NextPageWithLayout = () => { PageContext.meta = meta PageContext.project = project + if (meta) PageState.meta = meta - // load schemas - const load = async () => { - await meta.schemas.load() - } - - if (meta) { - PageState.meta = meta - load() - } + useEffect(() => { + if (project?.ref) meta.schemas.load() + }, [project?.ref]) return (
- + {isActive ? ( + + ) : ( +
+

API Settings

+
+ +

+ API settings are unavailable as the project is not active +

+
+
+ )}
) diff --git a/studio/pages/project/[ref]/settings/billing/subscription.tsx b/studio/pages/project/[ref]/settings/billing/subscription.tsx index a47a62ad90d..7fb2343ca1b 100644 --- a/studio/pages/project/[ref]/settings/billing/subscription.tsx +++ b/studio/pages/project/[ref]/settings/billing/subscription.tsx @@ -1,5 +1,4 @@ import { observer } from 'mobx-react-lite' -import { FC, useEffect } from 'react' import { Loading } from 'ui' import { SettingsLayout } from 'components/layouts' @@ -7,18 +6,17 @@ import LoadingUI from 'components/ui/Loading' import OveragesBanner from 'components/ui/OveragesBanner/OveragesBanner' import { useStore } from 'hooks' import { useProjectSubscriptionQuery } from 'data/subscriptions/project-subscription-query' -import { NextPageWithLayout, Project } from 'types' +import { NextPageWithLayout } from 'types' import { Subscription } from 'components/interfaces/Billing' const ProjectBilling: NextPageWithLayout = () => { const { ui } = useStore() - const project = ui.selectedProject return (
- +
) @@ -30,27 +28,12 @@ ProjectBilling.getLayout = (page) => ( export default observer(ProjectBilling) -interface SettingsProps { - project?: Project -} - -const Settings: FC = ({ project }) => { +const Settings = () => { const { ui } = useStore() - const { - data: subscription, - isLoading: loading, - error, - } = useProjectSubscriptionQuery({ projectRef: ui.selectedProject?.ref }) - - useEffect(() => { - if (error) { - ui.setNotification({ - category: 'error', - message: `Failed to get project subscription: ${(error as any)?.message ?? 'unknown'}`, - }) - } - }, [error]) + const { data: subscription, isLoading: loading } = useProjectSubscriptionQuery({ + projectRef: ui.selectedProject?.ref, + }) if (!subscription) { return @@ -60,13 +43,7 @@ const Settings: FC = ({ project }) => {
{/* [Joshen TODO] Temporarily hidden until usage endpoint is sorted out */} {/* {projectTier !== undefined && } */} - + {loading ? (
diff --git a/studio/public/favicon/android-chrome-192x192.png b/studio/public/favicon/android-chrome-192x192.png index f0a2817a744..c0ac2bb1cdb 100644 Binary files a/studio/public/favicon/android-chrome-192x192.png and b/studio/public/favicon/android-chrome-192x192.png differ diff --git a/studio/public/favicon/android-chrome-512x512.png b/studio/public/favicon/android-chrome-512x512.png index 1c658733e6e..1bdeaa23bb8 100644 Binary files a/studio/public/favicon/android-chrome-512x512.png and b/studio/public/favicon/android-chrome-512x512.png differ diff --git a/studio/public/favicon/android-icon-144x144.png b/studio/public/favicon/android-icon-144x144.png new file mode 100644 index 00000000000..4aa46d4d25d Binary files /dev/null and b/studio/public/favicon/android-icon-144x144.png differ diff --git a/studio/public/favicon/android-icon-192x192.png b/studio/public/favicon/android-icon-192x192.png new file mode 100644 index 00000000000..7583d2035e3 Binary files /dev/null and b/studio/public/favicon/android-icon-192x192.png differ diff --git a/studio/public/favicon/android-icon-36x36.png b/studio/public/favicon/android-icon-36x36.png new file mode 100644 index 00000000000..5e4eabec411 Binary files /dev/null and b/studio/public/favicon/android-icon-36x36.png differ diff --git a/studio/public/favicon/android-icon-48x48.png b/studio/public/favicon/android-icon-48x48.png new file mode 100644 index 00000000000..f8d8a7d9c05 Binary files /dev/null and b/studio/public/favicon/android-icon-48x48.png differ diff --git a/studio/public/favicon/android-icon-72x72.png b/studio/public/favicon/android-icon-72x72.png new file mode 100644 index 00000000000..e4418058cef Binary files /dev/null and b/studio/public/favicon/android-icon-72x72.png differ diff --git a/studio/public/favicon/android-icon-96x96.png b/studio/public/favicon/android-icon-96x96.png new file mode 100644 index 00000000000..0f1351f3670 Binary files /dev/null and b/studio/public/favicon/android-icon-96x96.png differ diff --git a/studio/public/favicon/apple-icon-114x114.png b/studio/public/favicon/apple-icon-114x114.png new file mode 100644 index 00000000000..4aa46d4d25d Binary files /dev/null and b/studio/public/favicon/apple-icon-114x114.png differ diff --git a/studio/public/favicon/archive/apple-touch-icon-120x120.png b/studio/public/favicon/apple-icon-120x120.png similarity index 100% rename from studio/public/favicon/archive/apple-touch-icon-120x120.png rename to studio/public/favicon/apple-icon-120x120.png diff --git a/studio/public/favicon/archive/apple-touch-icon-144x144.png b/studio/public/favicon/apple-icon-144x144.png similarity index 100% rename from studio/public/favicon/archive/apple-touch-icon-144x144.png rename to studio/public/favicon/apple-icon-144x144.png diff --git a/studio/public/favicon/archive/apple-touch-icon-152x152.png b/studio/public/favicon/apple-icon-152x152.png similarity index 100% rename from studio/public/favicon/archive/apple-touch-icon-152x152.png rename to studio/public/favicon/apple-icon-152x152.png diff --git a/studio/public/favicon/apple-icon-180x180.png b/studio/public/favicon/apple-icon-180x180.png new file mode 100644 index 00000000000..2a80dbc2f68 Binary files /dev/null and b/studio/public/favicon/apple-icon-180x180.png differ diff --git a/studio/public/favicon/apple-icon-57x57.png b/studio/public/favicon/apple-icon-57x57.png new file mode 100644 index 00000000000..e7b08eb605f Binary files /dev/null and b/studio/public/favicon/apple-icon-57x57.png differ diff --git a/studio/public/favicon/archive/apple-touch-icon-60x60.png b/studio/public/favicon/apple-icon-60x60.png similarity index 100% rename from studio/public/favicon/archive/apple-touch-icon-60x60.png rename to studio/public/favicon/apple-icon-60x60.png diff --git a/studio/public/favicon/apple-icon-72x72.png b/studio/public/favicon/apple-icon-72x72.png new file mode 100644 index 00000000000..e4418058cef Binary files /dev/null and b/studio/public/favicon/apple-icon-72x72.png differ diff --git a/studio/public/favicon/archive/apple-touch-icon-76x76.png b/studio/public/favicon/apple-icon-76x76.png similarity index 100% rename from studio/public/favicon/archive/apple-touch-icon-76x76.png rename to studio/public/favicon/apple-icon-76x76.png diff --git a/studio/public/favicon/apple-icon-precomposed.png b/studio/public/favicon/apple-icon-precomposed.png new file mode 100644 index 00000000000..7583d2035e3 Binary files /dev/null and b/studio/public/favicon/apple-icon-precomposed.png differ diff --git a/studio/public/favicon/apple-icon.png b/studio/public/favicon/apple-icon.png new file mode 100644 index 00000000000..7583d2035e3 Binary files /dev/null and b/studio/public/favicon/apple-icon.png differ diff --git a/studio/public/favicon/apple-touch-icon-114x114.png b/studio/public/favicon/apple-touch-icon-114x114.png index d2ee4b9e139..4aa46d4d25d 100644 Binary files a/studio/public/favicon/apple-touch-icon-114x114.png and b/studio/public/favicon/apple-touch-icon-114x114.png differ diff --git a/studio/public/favicon/apple-touch-icon-120x120.png b/studio/public/favicon/apple-touch-icon-120x120.png index 5bd0e4963a1..d2b0e50ef41 100644 Binary files a/studio/public/favicon/apple-touch-icon-120x120.png and b/studio/public/favicon/apple-touch-icon-120x120.png differ diff --git a/studio/public/favicon/apple-touch-icon-144x144.png b/studio/public/favicon/apple-touch-icon-144x144.png index c73891c985d..00a5d8b5180 100644 Binary files a/studio/public/favicon/apple-touch-icon-144x144.png and b/studio/public/favicon/apple-touch-icon-144x144.png differ diff --git a/studio/public/favicon/apple-touch-icon-152x152.png b/studio/public/favicon/apple-touch-icon-152x152.png index 65f90a02357..310532c4648 100644 Binary files a/studio/public/favicon/apple-touch-icon-152x152.png and b/studio/public/favicon/apple-touch-icon-152x152.png differ diff --git a/studio/public/favicon/apple-touch-icon-57x57.png b/studio/public/favicon/apple-touch-icon-57x57.png index bfa1628afb5..1314e02c744 100644 Binary files a/studio/public/favicon/apple-touch-icon-57x57.png and b/studio/public/favicon/apple-touch-icon-57x57.png differ diff --git a/studio/public/favicon/apple-touch-icon-60x60.png b/studio/public/favicon/apple-touch-icon-60x60.png index 15c5dca8005..0615675e809 100644 Binary files a/studio/public/favicon/apple-touch-icon-60x60.png and b/studio/public/favicon/apple-touch-icon-60x60.png differ diff --git a/studio/public/favicon/apple-touch-icon-72x72.png b/studio/public/favicon/apple-touch-icon-72x72.png index fb0c4fb3663..e4418058cef 100644 Binary files a/studio/public/favicon/apple-touch-icon-72x72.png and b/studio/public/favicon/apple-touch-icon-72x72.png differ diff --git a/studio/public/favicon/apple-touch-icon-76x76.png b/studio/public/favicon/apple-touch-icon-76x76.png index 7d950f0862e..9a76327f94b 100644 Binary files a/studio/public/favicon/apple-touch-icon-76x76.png and b/studio/public/favicon/apple-touch-icon-76x76.png differ diff --git a/studio/public/favicon/archive/android-chrome-192x192.png b/studio/public/favicon/archive/android-chrome-192x192.png deleted file mode 100644 index c0ac2bb1cdb..00000000000 Binary files a/studio/public/favicon/archive/android-chrome-192x192.png and /dev/null differ diff --git a/studio/public/favicon/archive/android-chrome-512x512.png b/studio/public/favicon/archive/android-chrome-512x512.png deleted file mode 100644 index 4de626fcc9e..00000000000 Binary files a/studio/public/favicon/archive/android-chrome-512x512.png and /dev/null differ diff --git a/studio/public/favicon/archive/apple-touch-icon-57x57.png b/studio/public/favicon/archive/apple-touch-icon-57x57.png deleted file mode 100644 index 1314e02c744..00000000000 Binary files a/studio/public/favicon/archive/apple-touch-icon-57x57.png and /dev/null differ diff --git a/studio/public/favicon/archive/favicon-128.png b/studio/public/favicon/archive/favicon-128.png deleted file mode 100644 index d5dca345802..00000000000 Binary files a/studio/public/favicon/archive/favicon-128.png and /dev/null differ diff --git a/studio/public/favicon/archive/favicon-16x16.png b/studio/public/favicon/archive/favicon-16x16.png deleted file mode 100644 index 6361bcecd15..00000000000 Binary files a/studio/public/favicon/archive/favicon-16x16.png and /dev/null differ diff --git a/studio/public/favicon/archive/favicon-196x196.png b/studio/public/favicon/archive/favicon-196x196.png deleted file mode 100644 index adb05b43453..00000000000 Binary files a/studio/public/favicon/archive/favicon-196x196.png and /dev/null differ diff --git a/studio/public/favicon/archive/favicon-32x32.png b/studio/public/favicon/archive/favicon-32x32.png deleted file mode 100644 index 4ea0fba2e3c..00000000000 Binary files a/studio/public/favicon/archive/favicon-32x32.png and /dev/null differ diff --git a/studio/public/favicon/archive/favicon-96x96.png b/studio/public/favicon/archive/favicon-96x96.png deleted file mode 100644 index 92a3d735dff..00000000000 Binary files a/studio/public/favicon/archive/favicon-96x96.png and /dev/null differ diff --git a/studio/public/favicon/archive/favicon.ico b/studio/public/favicon/archive/favicon.ico deleted file mode 100644 index 4e808093c05..00000000000 Binary files a/studio/public/favicon/archive/favicon.ico and /dev/null differ diff --git a/studio/public/favicon/archive/lw7/android-chrome-192x192.png b/studio/public/favicon/archive/lw7/android-chrome-192x192.png new file mode 100644 index 00000000000..f0a2817a744 Binary files /dev/null and b/studio/public/favicon/archive/lw7/android-chrome-192x192.png differ diff --git a/studio/public/favicon/archive/lw7/android-chrome-512x512.png b/studio/public/favicon/archive/lw7/android-chrome-512x512.png new file mode 100644 index 00000000000..1c658733e6e Binary files /dev/null and b/studio/public/favicon/archive/lw7/android-chrome-512x512.png differ diff --git a/studio/public/favicon/archive/lw7/apple-touch-icon-114x114.png b/studio/public/favicon/archive/lw7/apple-touch-icon-114x114.png new file mode 100644 index 00000000000..d2ee4b9e139 Binary files /dev/null and b/studio/public/favicon/archive/lw7/apple-touch-icon-114x114.png differ diff --git a/studio/public/favicon/archive/lw7/apple-touch-icon-120x120.png b/studio/public/favicon/archive/lw7/apple-touch-icon-120x120.png new file mode 100644 index 00000000000..5bd0e4963a1 Binary files /dev/null and b/studio/public/favicon/archive/lw7/apple-touch-icon-120x120.png differ diff --git a/studio/public/favicon/archive/lw7/apple-touch-icon-144x144.png b/studio/public/favicon/archive/lw7/apple-touch-icon-144x144.png new file mode 100644 index 00000000000..c73891c985d Binary files /dev/null and b/studio/public/favicon/archive/lw7/apple-touch-icon-144x144.png differ diff --git a/studio/public/favicon/archive/lw7/apple-touch-icon-152x152.png b/studio/public/favicon/archive/lw7/apple-touch-icon-152x152.png new file mode 100644 index 00000000000..65f90a02357 Binary files /dev/null and b/studio/public/favicon/archive/lw7/apple-touch-icon-152x152.png differ diff --git a/studio/public/favicon/archive/lw7/apple-touch-icon-57x57.png b/studio/public/favicon/archive/lw7/apple-touch-icon-57x57.png new file mode 100644 index 00000000000..bfa1628afb5 Binary files /dev/null and b/studio/public/favicon/archive/lw7/apple-touch-icon-57x57.png differ diff --git a/studio/public/favicon/archive/lw7/apple-touch-icon-60x60.png b/studio/public/favicon/archive/lw7/apple-touch-icon-60x60.png new file mode 100644 index 00000000000..15c5dca8005 Binary files /dev/null and b/studio/public/favicon/archive/lw7/apple-touch-icon-60x60.png differ diff --git a/studio/public/favicon/archive/lw7/apple-touch-icon-72x72.png b/studio/public/favicon/archive/lw7/apple-touch-icon-72x72.png new file mode 100644 index 00000000000..fb0c4fb3663 Binary files /dev/null and b/studio/public/favicon/archive/lw7/apple-touch-icon-72x72.png differ diff --git a/studio/public/favicon/archive/lw7/apple-touch-icon-76x76.png b/studio/public/favicon/archive/lw7/apple-touch-icon-76x76.png new file mode 100644 index 00000000000..7d950f0862e Binary files /dev/null and b/studio/public/favicon/archive/lw7/apple-touch-icon-76x76.png differ diff --git a/studio/public/favicon/archive/lw7/favicon-128.png b/studio/public/favicon/archive/lw7/favicon-128.png new file mode 100644 index 00000000000..2206096f21b Binary files /dev/null and b/studio/public/favicon/archive/lw7/favicon-128.png differ diff --git a/studio/public/favicon/archive/lw7/favicon-16x16.png b/studio/public/favicon/archive/lw7/favicon-16x16.png new file mode 100644 index 00000000000..2e07b15e106 Binary files /dev/null and b/studio/public/favicon/archive/lw7/favicon-16x16.png differ diff --git a/studio/public/favicon/archive/lw7/favicon-196x196.png b/studio/public/favicon/archive/lw7/favicon-196x196.png new file mode 100644 index 00000000000..d10fc7e36d9 Binary files /dev/null and b/studio/public/favicon/archive/lw7/favicon-196x196.png differ diff --git a/studio/public/favicon/archive/lw7/favicon-32x32.png b/studio/public/favicon/archive/lw7/favicon-32x32.png new file mode 100644 index 00000000000..4101a08499b Binary files /dev/null and b/studio/public/favicon/archive/lw7/favicon-32x32.png differ diff --git a/studio/public/favicon/archive/lw7/favicon-96x96.png b/studio/public/favicon/archive/lw7/favicon-96x96.png new file mode 100644 index 00000000000..b23072a2c02 Binary files /dev/null and b/studio/public/favicon/archive/lw7/favicon-96x96.png differ diff --git a/studio/public/favicon/archive/lw7/favicon.ico b/studio/public/favicon/archive/lw7/favicon.ico new file mode 100644 index 00000000000..51b9988fdcb Binary files /dev/null and b/studio/public/favicon/archive/lw7/favicon.ico differ diff --git a/studio/public/favicon/archive/lw7/mstile-144x144.png b/studio/public/favicon/archive/lw7/mstile-144x144.png new file mode 100644 index 00000000000..c73891c985d Binary files /dev/null and b/studio/public/favicon/archive/lw7/mstile-144x144.png differ diff --git a/studio/public/favicon/archive/lw7/mstile-150x150.png b/studio/public/favicon/archive/lw7/mstile-150x150.png new file mode 100644 index 00000000000..bd10ae0a5df Binary files /dev/null and b/studio/public/favicon/archive/lw7/mstile-150x150.png differ diff --git a/studio/public/favicon/archive/lw7/mstile-310x150.png b/studio/public/favicon/archive/lw7/mstile-310x150.png new file mode 100644 index 00000000000..fb4d58022df Binary files /dev/null and b/studio/public/favicon/archive/lw7/mstile-310x150.png differ diff --git a/studio/public/favicon/archive/lw7/mstile-310x310.png b/studio/public/favicon/archive/lw7/mstile-310x310.png new file mode 100644 index 00000000000..0adc45ea0ac Binary files /dev/null and b/studio/public/favicon/archive/lw7/mstile-310x310.png differ diff --git a/studio/public/favicon/archive/lw7/mstile-70x70.png b/studio/public/favicon/archive/lw7/mstile-70x70.png new file mode 100644 index 00000000000..2206096f21b Binary files /dev/null and b/studio/public/favicon/archive/lw7/mstile-70x70.png differ diff --git a/studio/public/favicon/archive/mstile-310x150.png b/studio/public/favicon/archive/mstile-310x150.png deleted file mode 100644 index b1121df62aa..00000000000 Binary files a/studio/public/favicon/archive/mstile-310x150.png and /dev/null differ diff --git a/studio/public/favicon/archive/mstile-70x70.png b/studio/public/favicon/archive/mstile-70x70.png deleted file mode 100644 index d5dca345802..00000000000 Binary files a/studio/public/favicon/archive/mstile-70x70.png and /dev/null differ diff --git a/studio/public/favicon/favicon-128.png b/studio/public/favicon/favicon-128.png index 2206096f21b..d5dca345802 100644 Binary files a/studio/public/favicon/favicon-128.png and b/studio/public/favicon/favicon-128.png differ diff --git a/studio/public/favicon/favicon-16x16.png b/studio/public/favicon/favicon-16x16.png index 2e07b15e106..fa07282ee8d 100644 Binary files a/studio/public/favicon/favicon-16x16.png and b/studio/public/favicon/favicon-16x16.png differ diff --git a/studio/public/favicon/favicon-196x196.png b/studio/public/favicon/favicon-196x196.png index d10fc7e36d9..adb05b43453 100644 Binary files a/studio/public/favicon/favicon-196x196.png and b/studio/public/favicon/favicon-196x196.png differ diff --git a/studio/public/favicon/favicon-32x32.png b/studio/public/favicon/favicon-32x32.png index 4101a08499b..7fa29c547a6 100644 Binary files a/studio/public/favicon/favicon-32x32.png and b/studio/public/favicon/favicon-32x32.png differ diff --git a/studio/public/favicon/favicon-96x96.png b/studio/public/favicon/favicon-96x96.png index b23072a2c02..0f1351f3670 100644 Binary files a/studio/public/favicon/favicon-96x96.png and b/studio/public/favicon/favicon-96x96.png differ diff --git a/studio/public/favicon/favicon.ico b/studio/public/favicon/favicon.ico index 51b9988fdcb..5c4d1dcc5cf 100644 Binary files a/studio/public/favicon/favicon.ico and b/studio/public/favicon/favicon.ico differ diff --git a/studio/public/favicon/archive/mstile-144x144.png b/studio/public/favicon/ms-icon-144x144.png similarity index 100% rename from studio/public/favicon/archive/mstile-144x144.png rename to studio/public/favicon/ms-icon-144x144.png diff --git a/studio/public/favicon/archive/mstile-150x150.png b/studio/public/favicon/ms-icon-150x150.png similarity index 100% rename from studio/public/favicon/archive/mstile-150x150.png rename to studio/public/favicon/ms-icon-150x150.png diff --git a/studio/public/favicon/archive/mstile-310x310.png b/studio/public/favicon/ms-icon-310x310.png similarity index 100% rename from studio/public/favicon/archive/mstile-310x310.png rename to studio/public/favicon/ms-icon-310x310.png diff --git a/studio/public/favicon/ms-icon-70x70.png b/studio/public/favicon/ms-icon-70x70.png new file mode 100644 index 00000000000..48f6391fcdc Binary files /dev/null and b/studio/public/favicon/ms-icon-70x70.png differ diff --git a/studio/public/favicon/mstile-144x144.png b/studio/public/favicon/mstile-144x144.png index c73891c985d..00a5d8b5180 100644 Binary files a/studio/public/favicon/mstile-144x144.png and b/studio/public/favicon/mstile-144x144.png differ diff --git a/studio/public/favicon/mstile-150x150.png b/studio/public/favicon/mstile-150x150.png index bd10ae0a5df..4de1d9b1cc1 100644 Binary files a/studio/public/favicon/mstile-150x150.png and b/studio/public/favicon/mstile-150x150.png differ diff --git a/studio/public/favicon/mstile-310x150.png b/studio/public/favicon/mstile-310x150.png index fb4d58022df..b1121df62aa 100644 Binary files a/studio/public/favicon/mstile-310x150.png and b/studio/public/favicon/mstile-310x150.png differ diff --git a/studio/public/favicon/mstile-310x310.png b/studio/public/favicon/mstile-310x310.png index 0adc45ea0ac..7ea95ae09c0 100644 Binary files a/studio/public/favicon/mstile-310x310.png and b/studio/public/favicon/mstile-310x310.png differ diff --git a/studio/public/favicon/mstile-70x70.png b/studio/public/favicon/mstile-70x70.png index 2206096f21b..d5dca345802 100644 Binary files a/studio/public/favicon/mstile-70x70.png and b/studio/public/favicon/mstile-70x70.png differ diff --git a/studio/stores/UiStore.ts b/studio/stores/UiStore.ts index 46a522e6b21..1b91898ae31 100644 --- a/studio/stores/UiStore.ts +++ b/studio/stores/UiStore.ts @@ -19,7 +19,6 @@ export interface IUiStore { setNotification: (notification: Notification) => string setProfile: (value: User) => void setPermissions: (permissions?: Permission[]) => void - setGaClientId: (clientId?: string) => void } export default class UiStore implements IUiStore { rootStore: IRootStore @@ -117,13 +116,4 @@ export default class UiStore implements IUiStore { setPermissions(permissions?: any) { this.permissions = permissions } - - setGaClientId(clientId?: string) { - /** - * We need to access ga client_id from base.constructHeaders method - * in order to set custom header('ga_client_id). - * TODO: Do we have a better way than storing in local storage? - */ - window.localStorage.setItem('ga_client_id', String(clientId)) - } } diff --git a/studio/stores/pgmeta/MetaStore.ts b/studio/stores/pgmeta/MetaStore.ts index 0f24ae95a07..cbd0f68ff70 100644 --- a/studio/stores/pgmeta/MetaStore.ts +++ b/studio/stores/pgmeta/MetaStore.ts @@ -663,7 +663,6 @@ export default class MetaStore implements IMetaStore { // If the user is importing data via a spreadsheet if (!isUndefined(importContent)) { - console.log({ importContent }) if (importContent.file && importContent.rowCount > 0) { // Via a CSV file const { error }: any = await this.insertRowsViaSpreadsheet(