@@ -33,15 +33,13 @@ const pricingTiers: PricingTier[] = [
3333 name : "Local Explanations" ,
3434 price : "€2.99" ,
3535 priceId : ( process . env . NEXT_PUBLIC_STRIPE_PRICE_LOCAL || "" ) . trim ( ) ,
36- description :
37- "Get AI explanations using your local Ollama setup. Requires some technical setup; best with Firefox (works out of the box) or Chrome/Edge (permission popup). Not supported in Opera or Safari." ,
36+ description : "Get AI explanations using your local Ollama setup." ,
3837 features : [
3938 "Everything in Ads Free" ,
4039 "Ollama explanations" ,
4140 "Privacy-focused (local AI)" ,
4241 "No API costs" ,
4342 "Offline explanations" ,
44- "Browser note: Firefox ✓ · Chrome/Edge ✓ (allow popup) · Opera/Safari ✗" ,
4543 ] ,
4644 } ,
4745 {
@@ -53,9 +51,12 @@ const pricingTiers: PricingTier[] = [
5351 popular : true ,
5452 features : [
5553 "Everything in Local" ,
56- "OpenAI, Gemini, Mistral, DeepSeek access" ,
57- "API key management" ,
54+
5855 "Multiple AI providers" ,
56+ "DeepSeek supported" ,
57+ "Google Gemini supported" ,
58+ "Mistral AI supported" ,
59+ "OpenAI supported" ,
5960 ] ,
6061 } ,
6162 {
@@ -152,11 +153,11 @@ export default function PricingPage() {
152153 </ div >
153154
154155 { /* Pricing Grid */ }
155- < div className = "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8" >
156+ < div className = "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8 items-stretch " >
156157 { pricingTiers . map ( ( tier ) => (
157158 < div
158159 key = { tier . id }
159- className = { `relative bg-white dark:bg-gray-800 rounded-2xl shadow-lg border-2 transition-all duration-200 hover:shadow-xl ${
160+ className = { `relative flex flex-col h-full bg-white dark:bg-gray-800 rounded-2xl shadow-lg border-2 transition-all duration-200 hover:shadow-xl ${
160161 tier . popular
161162 ? "border-primary-500 scale-105"
162163 : "border-gray-200 dark:border-gray-700"
@@ -170,45 +171,47 @@ export default function PricingPage() {
170171 </ div >
171172 ) }
172173
173- < div className = "p-6" >
174- < h3 className = "text-xl font-bold text-gray-900 dark:text-white mb-2" >
175- { tier . name }
176- </ h3 >
177- < p className = "text-gray-600 dark:text-gray-400 text-sm mb-4" >
178- { tier . description }
179- </ p >
174+ < div className = "p-6 flex flex-col flex-1 min-h-0" >
175+ < div className = "flex-1 min-h-0" >
176+ < h3 className = "text-xl font-bold text-gray-900 dark:text-white mb-2" >
177+ { tier . name }
178+ </ h3 >
179+ < p className = "text-gray-600 dark:text-gray-400 text-sm mb-4" >
180+ { tier . description }
181+ </ p >
180182
181- < div className = "mb-6" >
182- < span className = "text-3xl font-bold text-gray-900 dark:text-white" >
183- { tier . price }
184- </ span >
185- < span className = "text-gray-600 dark:text-gray-400" >
186- /month
187- </ span >
188- </ div >
183+ < div className = "mb-6" >
184+ < span className = "text-3xl font-bold text-gray-900 dark:text-white" >
185+ { tier . price }
186+ </ span >
187+ < span className = "text-gray-600 dark:text-gray-400" >
188+ /month
189+ </ span >
190+ </ div >
189191
190- < ul className = "space-y-3 mb-8" >
191- { tier . features . map ( ( feature , index ) => (
192- < li key = { index } className = "flex items-start" >
193- < svg
194- className = "w-5 h-5 text-green-500 mr-3 mt-0.5 flex-shrink-0"
195- fill = "none"
196- stroke = "currentColor"
197- viewBox = "0 0 24 24"
198- >
199- < path
200- strokeLinecap = "round"
201- strokeLinejoin = "round"
202- strokeWidth = { 2 }
203- d = "M5 13l4 4L19 7"
204- />
205- </ svg >
206- < span className = "text-gray-700 dark:text-gray-300 text-sm" >
207- { feature }
208- </ span >
209- </ li >
210- ) ) }
211- </ ul >
192+ < ul className = "space-y-3 mb-8" >
193+ { tier . features . map ( ( feature , index ) => (
194+ < li key = { index } className = "flex items-start" >
195+ < svg
196+ className = "w-5 h-5 text-green-500 mr-3 mt-0.5 flex-shrink-0"
197+ fill = "none"
198+ stroke = "currentColor"
199+ viewBox = "0 0 24 24"
200+ >
201+ < path
202+ strokeLinecap = "round"
203+ strokeLinejoin = "round"
204+ strokeWidth = { 2 }
205+ d = "M5 13l4 4L19 7"
206+ />
207+ </ svg >
208+ < span className = "text-gray-700 dark:text-gray-300 text-sm" >
209+ { feature }
210+ </ span >
211+ </ li >
212+ ) ) }
213+ </ ul >
214+ </ div >
212215
213216 < Button
214217 intent = { tier . popular ? "primary" : "secondary" }
@@ -219,7 +222,7 @@ export default function PricingPage() {
219222 ! tier . priceId ||
220223 tier . priceId . trim ( ) === ""
221224 }
222- className = "w-full"
225+ className = "w-full mt-auto "
223226 >
224227 { loading === tier . id
225228 ? "Processing..."
@@ -266,6 +269,16 @@ export default function PricingPage() {
266269 costs. You just need to install Ollama locally.
267270 </ p >
268271 </ div >
272+ < div >
273+ < h3 className = "font-semibold text-gray-900 dark:text-white mb-2" >
274+ How do I run Ollama?
275+ </ h3 >
276+ < p className = "text-gray-600 dark:text-gray-400 text-sm" >
277+ It requires some technical setup. Ollama works best with Firefox
278+ (works out of the box) or Chrome/Edge (permission popup). Not
279+ supported in Opera or Safari.
280+ </ p >
281+ </ div >
269282 < div >
270283 < h3 className = "font-semibold text-gray-900 dark:text-white mb-2" >
271284 What payment methods do you accept?
0 commit comments