diff --git a/web/docs/handbook/contributing.mdx b/web/docs/handbook/contributing.mdx
index f84312bc73c..ec6732f0b52 100644
--- a/web/docs/handbook/contributing.mdx
+++ b/web/docs/handbook/contributing.mdx
@@ -17,4 +17,22 @@ Want to contribute? Why not jump into our github and:
- [vote on a new connector](https://github.com/supabase/supabase/issues/4) for a tool that you use
- [vote on a new database](https://github.com/supabase/supabase/issues/6)
- spread the word if you like what we are doing
+- add your project or company to our showcase
+## How to add a your project to our showcase
+
+1. Add your project/company/service's logo in `supabase/web/static/img/showcase-logo/`.
+2. Add a new entry in `supabase/web/src/data/showcase.json` (you can replace and use the next one):
+```
+{
+ "project_or_company": {
+ "name": "Amazing project",
+ "description": "This is an amazing description for an amazing project 😄",
+ "web_site": "my-powerful.site",
+ "image": "img-name.extension"
+ },
+ "is_open_source": true/false,
+ "public_repo": "my-repo"
+}
+```
+3. Make a `pull request` to our [repository](https://github.com/supabase/supabase) labeled with... (@todo).
diff --git a/web/docusaurus.config.js b/web/docusaurus.config.js
index 2b8632197cb..732435ca2cc 100755
--- a/web/docusaurus.config.js
+++ b/web/docusaurus.config.js
@@ -4,7 +4,6 @@
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
-
module.exports = {
title: 'Supabase',
tagline: 'The open source Firebase alternative.',
@@ -135,6 +134,11 @@ module.exports = {
},
],
},
+ {
+ to: '/showcase',
+ label: 'Showcase',
+ position: 'right',
+ },
// { to: '/docs/pricing', label: 'Pricing', position: 'right' },
{ href: 'https://app.supabase.io', label: 'Login', position: 'right' },
],
diff --git a/web/src/components/Section.js b/web/src/components/Section.js
new file mode 100644
index 00000000000..ffbc7f3e0df
--- /dev/null
+++ b/web/src/components/Section.js
@@ -0,0 +1,68 @@
+import React, { useRef, useEffect } from 'react'
+import PropTypes from 'prop-types';
+
+
+export default function Section({ title, id, style, children }) {
+ const hash = String(id ? id : title).trim().replace(/\s/g, "-").toLowerCase();
+ const sectionRef = useRef(null);
+
+ useEffect(() => {
+ function scrollOnHash() {
+ const clearedLocationHash = window.location.hash.substring(1);
+
+ if (clearedLocationHash == hash) {
+ sectionRef.current.scrollIntoView({ behavior: 'smooth' });
+ }
+ }
+
+ function changeHash() {
+ const el = document.getElementById(hash);
+
+ if (el) {
+ const elementPos = el.getBoundingClientRect();
+
+ if (elementPos.top <= 80 && elementPos.top >= 0)
+ replaceHistoryHash();
+ }
+ }
+ scrollOnHash();
+ window.addEventListener("scroll", changeHash);
+
+ return () => {
+ window.removeEventListener("scroll", changeHash);
+ };
+ }, [])
+
+ function replaceHistoryHash() {
+ history.replaceState(history.state, '', `#${hash}`);
+ }
+
+ function handleHashClick() {
+ replaceHistoryHash();
+ sectionRef.current.scrollIntoView({ behavior: 'smooth' });
+ }
+
+ return (
+
+