|
1 | 1 | --- |
| 2 | +const heroTestimonial = { |
| 3 | + author: 'cpursley', |
| 4 | + source: 'Discord', |
| 5 | + message: |
| 6 | + 'Got a flow up and running, this is bad ass. I love that everything just goes into Postgres.', |
| 7 | +}; |
| 8 | +
|
2 | 9 | const testimonials = [ |
3 | 10 | { |
4 | | - author: 'Revolutionary-Fact28', |
5 | | - source: 'Reddit', |
| 11 | + author: 'nel', |
| 12 | + source: 'Discord', |
6 | 13 | message: |
7 | | - 'This looks amazing! I built a system on edge functions but it was very complicated and took so much time. I will probably switch to this.', |
| 14 | + 'EdgeWorker is clearly a building block missing from supabase. I toyed with it locally for several days and it worked great.', |
8 | 15 | }, |
9 | 16 | { |
10 | | - author: 'CjHuber', |
11 | | - source: 'Hacker News', |
| 17 | + author: 'Alipio Pereira', |
| 18 | + source: 'Discord', |
12 | 19 | message: |
13 | | - 'Exactly what I was looking for without even knowing it. Thank you for saving me tons of time in my project.', |
| 20 | + "I'm really enjoying PQFlow — this is incredibly powerful! I'm implementing it in a flow with RAG.", |
14 | 21 | }, |
15 | 22 | { |
16 | | - author: 'bctreehugger', |
17 | | - source: 'Reddit', |
| 23 | + author: 'Jie', |
| 24 | + source: 'Discord', |
18 | 25 | message: |
19 | | - 'Amazing work on taking the initiative to build this out. Watching closely and looking forward to using it once my project has a need for it.', |
| 26 | + "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.", |
20 | 27 | }, |
21 | 28 | { |
22 | | - author: 'bota01', |
| 29 | + author: '_perhaps', |
| 30 | + source: 'Discord', |
| 31 | + message: |
| 32 | + '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', |
| 33 | + }, |
| 34 | + { |
| 35 | + author: 'TapTap2121', |
23 | 36 | source: 'Reddit', |
24 | 37 | message: |
25 | | - "This is very needed and the product looks nice. Can't wait for it to be production ready.", |
| 38 | + "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", |
26 | 39 | }, |
27 | 40 | { |
28 | | - author: 'Danish', |
29 | | - source: 'Discord', |
30 | | - message: 'Waiting for your amazing work to be production ready!', |
| 41 | + author: 'Revolutionary-Fact28', |
| 42 | + source: 'Reddit', |
| 43 | + message: |
| 44 | + '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.', |
31 | 45 | }, |
32 | 46 | { |
33 | | - author: 'tomaspozo_', |
34 | | - source: 'Discord', |
35 | | - message: 'This sounds awesome! Looking forward to see it.', |
| 47 | + author: 'CjHuber', |
| 48 | + source: 'Hacker News', |
| 49 | + message: |
| 50 | + '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', |
36 | 51 | }, |
37 | 52 | { |
38 | | - author: 'homj', |
| 53 | + author: 'enciso', |
39 | 54 | source: 'Discord', |
40 | | - message: "Sounds good, I'm looking forward to it!", |
| 55 | + message: |
| 56 | + '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', |
41 | 57 | }, |
42 | 58 | ]; |
43 | | -
|
44 | | -// Duplicate testimonials for seamless infinite scroll |
45 | | -const duplicatedTestimonials = [...testimonials, ...testimonials]; |
46 | 59 | --- |
47 | 60 |
|
48 | | -<div class="testimonial-carousel-wrapper"> |
49 | | - <div class="testimonial-track"> |
50 | | - {duplicatedTestimonials.map((testimonial, i) => ( |
| 61 | +<div class="testimonials-section"> |
| 62 | + <!-- Hero Testimonial --> |
| 63 | + <div class="testimonial-card hero"> |
| 64 | + <blockquote class="testimonial-message"> |
| 65 | + {heroTestimonial.message} |
| 66 | + </blockquote> |
| 67 | + <div class="testimonial-header"> |
| 68 | + <div class="testimonial-author">@{heroTestimonial.author}</div> |
| 69 | + <div class="testimonial-source">{heroTestimonial.source}</div> |
| 70 | + </div> |
| 71 | + </div> |
| 72 | + |
| 73 | + <!-- Grid of Remaining Testimonials --> |
| 74 | + <div class="testimonials-grid"> |
| 75 | + {testimonials.map((testimonial) => ( |
51 | 76 | <div class="testimonial-card"> |
52 | | - <div class="testimonial-header"> |
53 | | - <div class="testimonial-author">@{testimonial.author}</div> |
54 | | - <div class="testimonial-source">({testimonial.source})</div> |
55 | | - </div> |
56 | 77 | <blockquote class="testimonial-message"> |
57 | 78 | {testimonial.message} |
58 | 79 | </blockquote> |
| 80 | + <div class="testimonial-header"> |
| 81 | + <div class="testimonial-author">@{testimonial.author}</div> |
| 82 | + <div class="testimonial-source">{testimonial.source}</div> |
| 83 | + </div> |
59 | 84 | </div> |
60 | 85 | ))} |
61 | 86 | </div> |
62 | 87 | </div> |
63 | 88 |
|
64 | 89 | <style> |
65 | | - .testimonial-carousel-wrapper { |
66 | | - width: 100vw; |
67 | | - max-width: 100vw; |
68 | | - position: relative; |
69 | | - left: 50%; |
70 | | - transform: translateX(-50%); |
71 | | - overflow: hidden; |
72 | | - padding: 2rem 0; |
73 | | - margin-left: 0; |
74 | | - margin-right: 0; |
75 | | - mask-image: linear-gradient( |
76 | | - to right, |
77 | | - transparent, |
78 | | - black 5%, |
79 | | - black 95%, |
80 | | - transparent |
81 | | - ); |
82 | | - -webkit-mask-image: linear-gradient( |
83 | | - to right, |
84 | | - transparent, |
85 | | - black 5%, |
86 | | - black 95%, |
87 | | - transparent |
88 | | - ); |
| 90 | + .testimonials-section { |
| 91 | + width: 100%; |
| 92 | + max-width: 1200px; |
| 93 | + margin: 0 auto; |
| 94 | + padding: 2rem 1rem; |
89 | 95 | } |
90 | 96 |
|
91 | | - .testimonial-track { |
92 | | - display: flex; |
93 | | - align-items: stretch; |
94 | | - gap: 2rem; |
95 | | - animation: scroll-left 120s linear infinite; |
96 | | - width: fit-content; |
| 97 | + /* Hero Testimonial */ |
| 98 | + .testimonial-card.hero { |
| 99 | + margin: 0 auto 3rem auto; |
| 100 | + max-width: 700px; |
| 101 | + padding: 2rem 2.5rem; |
| 102 | + } |
| 103 | + |
| 104 | + /* Grid Layout */ |
| 105 | + .testimonials-grid { |
| 106 | + display: grid; |
| 107 | + grid-template-columns: repeat(3, 1fr); |
| 108 | + gap: 1.25rem; |
| 109 | + align-items: start; |
| 110 | + } |
| 111 | + |
| 112 | + .testimonials-grid > .testimonial-card { |
| 113 | + height: 100%; |
| 114 | + align-self: stretch; |
97 | 115 | } |
98 | 116 |
|
99 | | - @keyframes scroll-left { |
100 | | - 0% { |
101 | | - transform: translateX(0); |
| 117 | + @media (max-width: 968px) { |
| 118 | + .testimonials-grid { |
| 119 | + grid-template-columns: repeat(2, 1fr); |
102 | 120 | } |
103 | | - 100% { |
104 | | - transform: translateX(-50%); |
| 121 | + } |
| 122 | + |
| 123 | + @media (max-width: 640px) { |
| 124 | + .testimonials-grid { |
| 125 | + grid-template-columns: 1fr; |
| 126 | + gap: 1rem; |
105 | 127 | } |
106 | 128 | } |
107 | 129 |
|
| 130 | + /* Base Card Styles - Starlight Aside inspired */ |
108 | 131 | .testimonial-card { |
109 | | - min-width: 400px; |
110 | | - max-width: 400px; |
111 | | - padding: 1.5rem; |
112 | 132 | background: linear-gradient( |
113 | 133 | 135deg, |
114 | 134 | color-mix(in srgb, var(--sl-color-accent-high) 4%, transparent) 0%, |
115 | 135 | color-mix(in srgb, var(--sl-color-accent-high) 1%, transparent) 100% |
116 | 136 | ); |
117 | | - border: 1px solid color-mix(in srgb, var(--sl-color-accent-high) 16%, transparent); |
118 | | - border-radius: 8px; |
119 | | - box-shadow: 0 4px 12px color-mix(in srgb, var(--sl-color-accent-high) 3%, transparent); |
120 | | - flex-shrink: 0; |
| 137 | + border-left: 3px solid color-mix(in srgb, var(--sl-color-accent-high) 50%, transparent); |
| 138 | + padding: 1.5rem 1.75rem; |
121 | 139 | display: flex; |
122 | 140 | flex-direction: column; |
123 | | - justify-content: flex-start; |
124 | | - align-items: flex-start; |
| 141 | + transition: border-left-color 0.2s ease; |
| 142 | + margin: 0; |
| 143 | + } |
| 144 | + |
| 145 | + .testimonial-card:hover { |
| 146 | + border-left-color: var(--sl-color-accent-high); |
125 | 147 | } |
126 | 148 |
|
| 149 | + /* Hero card with less prominent border */ |
| 150 | + .testimonial-card.hero { |
| 151 | + border-left-width: 4px; |
| 152 | + border-left-color: color-mix(in srgb, var(--sl-color-accent-high) 50%, transparent); |
| 153 | + } |
| 154 | + |
| 155 | + /* Message Styles - Quote first */ |
| 156 | + .testimonial-message { |
| 157 | + margin: 0; |
| 158 | + padding: 0 0 0.5rem 0; |
| 159 | + font-size: 1.1rem; |
| 160 | + line-height: 1.7; |
| 161 | + color: var(--sl-color-gray-2); |
| 162 | + font-style: italic; |
| 163 | + flex: 1; |
| 164 | + border: none; |
| 165 | + border-left: none; |
| 166 | + } |
| 167 | + |
| 168 | + .testimonial-card.hero .testimonial-message { |
| 169 | + font-size: 1.45rem; |
| 170 | + line-height: 1.7; |
| 171 | + font-weight: 500; |
| 172 | + } |
| 173 | + |
| 174 | + /* Header Styles - Author bottom right */ |
127 | 175 | .testimonial-header { |
128 | 176 | display: flex; |
129 | | - align-items: center; |
130 | | - margin-bottom: 0.75rem; |
| 177 | + align-items: baseline; |
| 178 | + gap: 0.5rem; |
| 179 | + flex-wrap: wrap; |
| 180 | + justify-content: flex-end; |
| 181 | + flex-shrink: 0; |
131 | 182 | } |
132 | 183 |
|
133 | 184 | .testimonial-author { |
134 | | - font-weight: bold; |
135 | | - font-size: 0.95rem; |
| 185 | + font-weight: 600; |
| 186 | + font-size: 1rem; |
| 187 | + color: var(--sl-color-white); |
136 | 188 | } |
137 | 189 |
|
138 | 190 | .testimonial-source { |
139 | | - font-size: 0.85rem; |
| 191 | + font-size: 0.9rem; |
140 | 192 | color: var(--sl-color-gray-3); |
141 | | - margin-left: 0.5rem; |
142 | 193 | } |
143 | 194 |
|
144 | | - .testimonial-message { |
145 | | - font-size: 1.05rem; |
146 | | - font-style: italic; |
147 | | - margin: 0; |
148 | | - line-height: 1.6; |
149 | | - color: var(--sl-color-gray-2); |
| 195 | + .testimonial-source::before { |
| 196 | + content: "·"; |
| 197 | + margin-right: 0.5rem; |
| 198 | + color: var(--sl-color-gray-4); |
150 | 199 | } |
151 | 200 |
|
152 | | - /* Pause animation on hover */ |
153 | | - .testimonial-carousel-wrapper:hover .testimonial-track { |
154 | | - animation-play-state: paused; |
| 201 | + .testimonial-card.hero .testimonial-author { |
| 202 | + font-size: 1.1rem; |
155 | 203 | } |
156 | 204 |
|
157 | | - @media (max-width: 768px) { |
158 | | - .testimonial-card { |
159 | | - min-width: 300px; |
160 | | - max-width: 300px; |
161 | | - padding: 1.25rem; |
162 | | - } |
163 | | - |
164 | | - .testimonial-message { |
165 | | - font-size: 0.95rem; |
166 | | - } |
167 | | - |
168 | | - .testimonial-track { |
169 | | - animation-duration: 80s; |
170 | | - } |
| 205 | + .testimonial-card.hero .testimonial-source { |
| 206 | + font-size: 1rem; |
171 | 207 | } |
172 | 208 |
|
173 | | - @media (max-width: 480px) { |
| 209 | + @media (max-width: 640px) { |
174 | 210 | .testimonial-card { |
175 | | - min-width: 260px; |
176 | | - max-width: 260px; |
177 | | - padding: 1rem; |
| 211 | + padding: 1rem 1.25rem; |
| 212 | + } |
| 213 | + |
| 214 | + .testimonial-card.hero { |
| 215 | + padding: 1.25rem 1.5rem; |
178 | 216 | } |
179 | 217 |
|
180 | 218 | .testimonial-message { |
181 | 219 | font-size: 0.9rem; |
182 | 220 | } |
| 221 | + |
| 222 | + .testimonial-card.hero .testimonial-message { |
| 223 | + font-size: 1rem; |
| 224 | + } |
183 | 225 | } |
184 | 226 | </style> |
0 commit comments