Просмотр исходного кода

feat(settings): prominent sponsor banner on General tab

  Matomo shows only 1.18% of website visitors reach /sponsors despite
  29% hitting /installation. The ask was discoverable on the marketing
  site but invisible in-app where users actually live.

  Full-width gradient banner sits above the three-column layout on the
  default landing tab and links to bambuddy.cool/sponsors.html with a
  ?from=app-settings tracking param so conversion lift is measurable
  in Matomo. Three new sponsors.* keys translated to all 11 locales.
maziggy 2 месяцев назад
Родитель
Сommit
0d4b9d4e91

+ 7 - 0
frontend/src/i18n/locales/de.ts

@@ -3605,6 +3605,13 @@ export default {
     architecture: 'Architektur',
     architecture: 'Architektur',
   },
   },
 
 
+  // Sponsor surface (System page)
+  sponsors: {
+    sectionTitle: 'Unabhängig & von der Community finanziert',
+    tagline: 'Bambuddy ist kostenlos und bleibt es, weil Menschen es freiwillig unterstützen. Kein VC, kein Cloud-Zwang.',
+    viewSupporters: 'Unterstützer ansehen',
+  },
+
   // Library (K Profiles)
   // Library (K Profiles)
   library: {
   library: {
     title: 'Filament-Bibliothek',
     title: 'Filament-Bibliothek',

+ 7 - 0
frontend/src/i18n/locales/en.ts

@@ -3617,6 +3617,13 @@ export default {
     architecture: 'Architecture',
     architecture: 'Architecture',
   },
   },
 
 
+  // Sponsor surface (System page)
+  sponsors: {
+    sectionTitle: 'Independent & community-funded',
+    tagline: 'Bambuddy is free and stays that way because people choose to support it. No VC, no cloud lock-in.',
+    viewSupporters: 'View supporters',
+  },
+
   // Library (K Profiles)
   // Library (K Profiles)
   library: {
   library: {
     title: 'Filament Library',
     title: 'Filament Library',

+ 7 - 0
frontend/src/i18n/locales/es.ts

@@ -3608,6 +3608,13 @@ export default {
     architecture: 'Arquitectura',
     architecture: 'Arquitectura',
   },
   },
 
 
+  // Sponsor surface (System page)
+  sponsors: {
+    sectionTitle: 'Independiente y financiado por la comunidad',
+    tagline: 'Bambuddy es gratuito y seguirá siéndolo porque hay quien decide apoyarlo. Sin VC, sin dependencia de la nube.',
+    viewSupporters: 'Ver patrocinadores',
+  },
+
   // Library (K Profiles)
   // Library (K Profiles)
   library: {
   library: {
     title: 'Biblioteca de filamentos',
     title: 'Biblioteca de filamentos',

+ 7 - 0
frontend/src/i18n/locales/fr.ts

@@ -3594,6 +3594,13 @@ export default {
     architecture: 'Architecture',
     architecture: 'Architecture',
   },
   },
 
 
+  // Sponsor surface (System page)
+  sponsors: {
+    sectionTitle: 'Indépendant & financé par la communauté',
+    tagline: 'Bambuddy est gratuit et le reste parce que des personnes choisissent de le soutenir. Pas de VC, pas de verrouillage cloud.',
+    viewSupporters: 'Voir les soutiens',
+  },
+
   // Library (K Profiles)
   // Library (K Profiles)
   library: {
   library: {
     title: 'Bibliothèque Filament',
     title: 'Bibliothèque Filament',

+ 7 - 0
frontend/src/i18n/locales/it.ts

@@ -3593,6 +3593,13 @@ export default {
     architecture: 'Architettura',
     architecture: 'Architettura',
   },
   },
 
 
+  // Sponsor surface (System page)
+  sponsors: {
+    sectionTitle: 'Indipendente e finanziato dalla community',
+    tagline: 'Bambuddy è gratuito e resta tale perché qualcuno sceglie di sostenerlo. Niente VC, niente lock-in cloud.',
+    viewSupporters: 'Vedi i sostenitori',
+  },
+
   // Library (K Profiles)
   // Library (K Profiles)
   library: {
   library: {
     title: 'Libreria filamenti',
     title: 'Libreria filamenti',

+ 7 - 0
frontend/src/i18n/locales/ja.ts

@@ -3605,6 +3605,13 @@ export default {
     architecture: 'アーキテクチャ',
     architecture: 'アーキテクチャ',
   },
   },
 
 
+  // Sponsor surface (System page)
+  sponsors: {
+    sectionTitle: '独立・コミュニティ運営',
+    tagline: 'Bambuddyは無料で、これからも無料です。支援してくださる方々のおかげで、VCもクラウドロックインもありません。',
+    viewSupporters: 'サポーター一覧',
+  },
+
   // Library (K Profiles)
   // Library (K Profiles)
   library: {
   library: {
     title: 'フィラメントライブラリ',
     title: 'フィラメントライブラリ',

+ 5 - 0
frontend/src/i18n/locales/ko.ts

@@ -3404,6 +3404,11 @@ export default {
     platform: '플랫폼',
     platform: '플랫폼',
     architecture: '아키텍처'
     architecture: '아키텍처'
   },
   },
+  sponsors: {
+    sectionTitle: '독립적·커뮤니티 후원',
+    tagline: 'Bambuddy는 무료이며, 자발적으로 후원하는 사용자 덕분에 계속 무료로 유지됩니다. VC도 없고, 클라우드 종속도 없습니다.',
+    viewSupporters: '후원자 보기'
+  },
   library: {
   library: {
     title: '필라멘트 라이브러리',
     title: '필라멘트 라이브러리',
     addFilament: '필라멘트 추가',
     addFilament: '필라멘트 추가',

+ 7 - 0
frontend/src/i18n/locales/pt-BR.ts

@@ -3593,6 +3593,13 @@ export default {
     architecture: 'Arquitetura',
     architecture: 'Arquitetura',
   },
   },
 
 
+  // Sponsor surface (System page)
+  sponsors: {
+    sectionTitle: 'Independente e financiado pela comunidade',
+    tagline: 'O Bambuddy é gratuito e continua assim porque há quem escolha apoiá-lo. Sem VC, sem dependência de nuvem.',
+    viewSupporters: 'Ver apoiadores',
+  },
+
   // Library (K Profiles)
   // Library (K Profiles)
   library: {
   library: {
     title: 'Biblioteca de Filamentos',
     title: 'Biblioteca de Filamentos',

+ 7 - 0
frontend/src/i18n/locales/tr.ts

@@ -3594,6 +3594,13 @@ export default {
     architecture: 'Mimari',
     architecture: 'Mimari',
   },
   },
 
 
+  // Sponsor yüzeyi (Sistem sayfası)
+  sponsors: {
+    sectionTitle: 'Bağımsız ve topluluk destekli',
+    tagline: 'Bambuddy ücretsizdir ve böyle kalır çünkü insanlar onu desteklemeyi seçer. VC yok, bulut bağımlılığı yok.',
+    viewSupporters: 'Destekçileri görüntüle',
+  },
+
   // Kütüphane (K Profilleri)
   // Kütüphane (K Profilleri)
   library: {
   library: {
     title: 'Filament Kütüphanesi',
     title: 'Filament Kütüphanesi',

+ 7 - 0
frontend/src/i18n/locales/zh-CN.ts

@@ -3593,6 +3593,13 @@ export default {
     architecture: '架构',
     architecture: '架构',
   },
   },
 
 
+  // Sponsor surface (System page)
+  sponsors: {
+    sectionTitle: '独立运营·社区支持',
+    tagline: 'Bambuddy 完全免费,并将持续免费——这要感谢主动支持的用户。没有风投,也没有云端绑定。',
+    viewSupporters: '查看支持者',
+  },
+
   // Library (K Profiles)
   // Library (K Profiles)
   library: {
   library: {
     title: '耗材库',
     title: '耗材库',

+ 7 - 0
frontend/src/i18n/locales/zh-TW.ts

@@ -3593,6 +3593,13 @@ export default {
     architecture: '架構',
     architecture: '架構',
   },
   },
 
 
+  // Sponsor surface (System page)
+  sponsors: {
+    sectionTitle: '獨立運作·社群支持',
+    tagline: 'Bambuddy 完全免費,並將持續免費——感謝主動支持的使用者。沒有創投,也沒有雲端綁定。',
+    viewSupporters: '查看支持者',
+  },
+
   // Library (K Profiles)
   // Library (K Profiles)
   library: {
   library: {
     title: '耗材庫',
     title: '耗材庫',

+ 32 - 1
frontend/src/pages/SettingsPage.tsx

@@ -1,5 +1,5 @@
 import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
 import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
-import { Loader2, Plus, Plug, AlertTriangle, RotateCcw, Bell, Download, RefreshCw, ExternalLink, Globe, Droplets, Thermometer, FileText, Edit2, Send, CheckCircle, XCircle, History, Trash2, Zap, TrendingUp, Calendar, DollarSign, Power, PowerOff, Key, Copy, Database, X, Shield, Printer, Cylinder, Wifi, Home, Video, Users, Lock, Unlock, ChevronDown, Save, Mail, Flame, Layers, ListOrdered, Code, Search, Scale, Settings as SettingsIcon, ScanEye, Cog, QrCode } from 'lucide-react';
+import { Loader2, Plus, Plug, AlertTriangle, RotateCcw, Bell, Download, RefreshCw, ExternalLink, Globe, Droplets, Thermometer, FileText, Edit2, Send, CheckCircle, XCircle, History, Trash2, Zap, TrendingUp, Calendar, DollarSign, Power, PowerOff, Key, Copy, Database, X, Shield, Printer, Cylinder, Wifi, Home, Video, Users, Lock, Unlock, ChevronDown, Save, Mail, Flame, Layers, ListOrdered, Code, Search, Scale, Settings as SettingsIcon, ScanEye, Cog, QrCode, Heart } from 'lucide-react';
 import { useTranslation } from 'react-i18next';
 import { useTranslation } from 'react-i18next';
 import { useNavigate, useSearchParams } from 'react-router-dom';
 import { useNavigate, useSearchParams } from 'react-router-dom';
 import { api } from '../api/client';
 import { api } from '../api/client';
@@ -1459,6 +1459,36 @@ export function SettingsPage() {
       </nav>
       </nav>
       <div className="flex-1 min-w-0">
       <div className="flex-1 min-w-0">
       {activeTab === 'general' && (
       {activeTab === 'general' && (
+      <>
+      {/* Sponsor banner — prominent independence callout */}
+      <a
+        href="https://bambuddy.cool/sponsors.html?from=app-settings"
+        target="_blank"
+        rel="noopener noreferrer"
+        className="group block mb-4 lg:mb-6 rounded-xl border border-bambu-green/30 bg-gradient-to-br from-bambu-green/15 via-bambu-green/5 to-transparent hover:border-bambu-green/50 hover:from-bambu-green/20 transition-colors"
+      >
+        <div className="flex flex-col md:flex-row items-start md:items-center gap-4 p-4 md:p-5">
+          <div className="p-3 rounded-lg bg-bambu-green/20 text-bambu-green flex-shrink-0">
+            <Heart className="w-6 h-6" />
+          </div>
+          <div className="flex-1 min-w-0">
+            <p className="text-base font-semibold text-white">
+              {t('sponsors.sectionTitle', 'Independent & community-funded')}
+            </p>
+            <p className="text-sm text-bambu-gray mt-0.5">
+              {t(
+                'sponsors.tagline',
+                'Bambuddy is free and stays that way because people choose to support it. No VC, no cloud lock-in.'
+              )}
+            </p>
+          </div>
+          <div className="flex items-center gap-2 px-4 py-2 rounded-lg bg-bambu-green/20 text-bambu-green group-hover:bg-bambu-green/30 text-sm font-medium whitespace-nowrap self-start md:self-auto">
+            {t('sponsors.viewSupporters', 'View supporters')}
+            <ExternalLink className="w-4 h-4" />
+          </div>
+        </div>
+      </a>
+
       <div className="flex flex-col lg:flex-row gap-4 lg:gap-6">
       <div className="flex flex-col lg:flex-row gap-4 lg:gap-6">
         {/* Left Column - General Settings */}
         {/* Left Column - General Settings */}
         <div className="space-y-3 flex-1 lg:max-w-xl">
         <div className="space-y-3 flex-1 lg:max-w-xl">
@@ -2551,6 +2581,7 @@ export function SettingsPage() {
           <ExternalLinksSettings />
           <ExternalLinksSettings />
         </div>
         </div>
       </div>
       </div>
+      </>
       )}
       )}
 
 
       {/* Network Tab */}
       {/* Network Tab */}

Разница между файлами не показана из-за своего большого размера
+ 1 - 0
static/assets/index-7mua31Zk.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 1
static/assets/index-CEe69URA.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/index-CLr67hk0.js


+ 2 - 2
static/index.html

@@ -26,8 +26,8 @@
 
 
     <!-- Splash screens for iOS -->
     <!-- Splash screens for iOS -->
     <link rel="apple-touch-startup-image" href="/img/android-chrome-512x512.png" />
     <link rel="apple-touch-startup-image" href="/img/android-chrome-512x512.png" />
-    <script type="module" crossorigin src="/assets/index-DUIDqBr8.js"></script>
-    <link rel="stylesheet" crossorigin href="/assets/index-CEe69URA.css">
+    <script type="module" crossorigin src="/assets/index-CLr67hk0.js"></script>
+    <link rel="stylesheet" crossorigin href="/assets/index-7mua31Zk.css">
   </head>
   </head>
   <body>
   <body>
     <div id="root"></div>
     <div id="root"></div>

Некоторые файлы не были показаны из-за большого количества измененных файлов