"{text}"
++ — {attribution} + {source && ({source})} +
+diff --git a/pkgs/website/astro.config.mjs b/pkgs/website/astro.config.mjs
index 1d0e284bd..3564aad56 100644
--- a/pkgs/website/astro.config.mjs
+++ b/pkgs/website/astro.config.mjs
@@ -121,29 +121,6 @@ export default defineConfig({
content: 'website',
},
},
- {
- tag: 'script',
- content: `
- document.addEventListener('DOMContentLoaded', function() {
- if (!window.location.pathname.startsWith('/author')) {
- const sticker = document.createElement('a');
- sticker.href = '/author/';
- sticker.className = 'hire-sticker';
- sticker.textContent = 'Chat with Author';
- document.body.appendChild(sticker);
-
- // Trigger one-time attention nudge after 5 seconds
- setTimeout(function() {
- sticker.classList.add('nudge');
- // Remove the class after animation completes
- setTimeout(function() {
- sticker.classList.remove('nudge');
- }, 800);
- }, 5000);
- }
- });
- `,
- },
],
plugins: [
starlightBlog({
@@ -468,6 +445,7 @@ export default defineConfig({
],
components: {
Hero: './src/components/ConditionalHero.astro',
+ PageFrame: './src/components/PageFrame.astro',
},
}),
robotsTxt({
diff --git a/pkgs/website/src/assets/quote-left.svg b/pkgs/website/src/assets/quote-left.svg
new file mode 100644
index 000000000..24c772853
--- /dev/null
+++ b/pkgs/website/src/assets/quote-left.svg
@@ -0,0 +1,5 @@
+
+
\ No newline at end of file
diff --git a/pkgs/website/src/assets/quote-right.svg b/pkgs/website/src/assets/quote-right.svg
new file mode 100644
index 000000000..55dc3572e
--- /dev/null
+++ b/pkgs/website/src/assets/quote-right.svg
@@ -0,0 +1,5 @@
+
+
\ No newline at end of file
diff --git a/pkgs/website/src/components/CodeOverlay.astro b/pkgs/website/src/components/CodeOverlay.astro
index 31cf11138..e931cf924 100644
--- a/pkgs/website/src/components/CodeOverlay.astro
+++ b/pkgs/website/src/components/CodeOverlay.astro
@@ -408,7 +408,7 @@
setTimeout(() => {
const resetButton = document.querySelector('.reset-overlay-button') as HTMLElement;
if (resetButton) resetButton.style.display = 'block';
- }, 2000);
+ }, 1700);
});
};
@@ -439,8 +439,25 @@
scrollableInner.addEventListener('scroll', updateButtonVisibility, { passive: true });
button.addEventListener('click', () => {
+ // Cancel any ongoing scroll animation
+ if (isAnimating) {
+ isAnimating = false;
+ if (scrollAnimationFrame) {
+ cancelAnimationFrame(scrollAnimationFrame);
+ scrollAnimationFrame = null;
+ }
+ }
+
+ // Show the reset overlay button immediately
+ const resetButton = document.querySelector('.reset-overlay-button') as HTMLElement;
+ if (resetButton) {
+ resetButton.style.display = 'block';
+ }
+
// Mark as programmatic scroll to avoid tracking
isProgrammaticScroll = true;
+
+ // Scroll to top smoothly
scrollableInner.scrollTo({ top: 0, behavior: 'smooth' });
// Reset flag after scroll completes
@@ -463,22 +480,31 @@
// Cancel any ongoing animation
isAnimating = false;
- isProgrammaticScroll = false; // Reset programmatic flag
if (scrollAnimationFrame) {
cancelAnimationFrame(scrollAnimationFrame);
scrollAnimationFrame = null;
}
+ // Mark as programmatic scroll to avoid tracking
+ isProgrammaticScroll = true;
+
+ // Scroll to top smoothly
+ scrollableInner.scrollTo({ top: 0, behavior: 'smooth' });
+
// Reset to initial state
overlay.classList.remove('hidden');
overlay.style.opacity = '1';
scrollableContainer.classList.remove('scrollable-enabled');
- scrollableInner.scrollTop = 0;
button.style.display = 'none';
if (scrollTopButton) {
scrollTopButton.style.display = 'none';
}
+ // Reset flag after scroll completes
+ setTimeout(() => {
+ isProgrammaticScroll = false;
+ }, 1000);
+
// Note: hasTrackedManualScroll is NOT reset here
// This means we track manual scroll only once per page session,
// even if user reveals, resets, and reveals again
diff --git a/pkgs/website/src/components/HeroWithSlot.astro b/pkgs/website/src/components/HeroWithSlot.astro
index fb3607a0e..0a14c9b16 100644
--- a/pkgs/website/src/components/HeroWithSlot.astro
+++ b/pkgs/website/src/components/HeroWithSlot.astro
@@ -52,7 +52,7 @@ const { title = data.title, tagline, actions = [] } = data.hero || {};
order: 2;
justify-content: center;
}
-
+
.stack {
order: 1;
flex-direction: column;
@@ -93,7 +93,8 @@ const { title = data.title, tagline, actions = [] } = data.hero || {};
.hero {
grid-template-columns: 4fr 5fr;
gap: 3%;
- padding-block: clamp(1.5rem, calc(0.5rem + 8vmin), 8rem);
+ padding-top: clamp(1.5rem, calc(0.5rem + 8vmin), 8rem);
+ padding-bottom: 0;
}
.hero > .hero-html {
diff --git a/pkgs/website/src/components/PageFrame.astro b/pkgs/website/src/components/PageFrame.astro
new file mode 100644
index 000000000..dd6db2e48
--- /dev/null
+++ b/pkgs/website/src/components/PageFrame.astro
@@ -0,0 +1,259 @@
+---
+import type { Props } from '@astrojs/starlight/props';
+import Default from '@astrojs/starlight/components/PageFrame.astro';
+import { LinkButton } from '@astrojs/starlight/components';
+
+const isAuthorPage = Astro.url.pathname.startsWith('/author');
+const isLandingPage = Astro.url.pathname === '/';
+const showFooter = isLandingPage || isAuthorPage;
+---
+
+
"{text}"
++ — {attribution} + {source && ({source})} +
+"{text}"
++ — {attribution} + {source && ({source})} +
+Parallel execution with automatic retry. - How it works? + How it works?
)} diff --git a/pkgs/website/src/components/TestimonialCarousel.astro b/pkgs/website/src/components/TestimonialCarousel.astro deleted file mode 100644 index b1761b2e1..000000000 --- a/pkgs/website/src/components/TestimonialCarousel.astro +++ /dev/null @@ -1,234 +0,0 @@ ---- -const heroTestimonial = { - author: 'cpursley', - source: 'Discord', - message: - 'Got a flow up and running, this is bad ass. I love that everything just goes into Postgres.', -}; - -const testimonials = [ - { - author: 'nel', - source: 'Discord', - message: - 'EdgeWorker is clearly a building block missing from supabase. I toyed with it locally for several days and it worked great.', - }, - { - author: 'Alipio Pereira', - source: 'Discord', - message: - "I'm really enjoying PQFlow — this is incredibly powerful! I'm implementing it in a flow with RAG.", - }, - { - author: 'Jie', - source: 'Discord', - message: - "I've been through hell and back with Airflow, Windmill, Inngest, etc and to be honest i haven't find anything I really love yet.", - }, - { - author: '_perhaps', - source: 'Discord', - message: - 'I was for a while now feeling like there had to be a better way of handling workflows on a supabase project without needing to add something like inngest or n8n to my tech stack. It clicked really hard when I found out about your project', - }, - { - author: 'TapTap2121', - source: 'Reddit', - message: - "I was searching through the docs for something like this and I'm quite surprised it's not part of Supabase already. A queue feels kinda useless with serverless runners if I need to trigger them manually", - }, - { - author: 'Revolutionary-Fact28', - source: 'Reddit', - message: - 'I built a system to this on edge functions but it was very complicated and took so much time this will be amazing! I will be probably switch to this.', - }, - { - author: 'CjHuber', - source: 'Hacker News', - message: - 'Exactly what I was looking for without even knowing it :) well I knew I need smt like this, but I thought I\'d had to build a very rudimentary version myself. Thank you for saving me tons of time', - }, - { - author: 'enciso', - source: 'Discord', - message: - 'I was trying to build my own after having a couple of pgmq queues... you found a problem and you are giving a very good solution', - }, -]; ---- - -+
+ ))} +