diff --git a/README.fr.md b/README.fr.md index a6b7d3a..d10fc95 100644 --- a/README.fr.md +++ b/README.fr.md @@ -255,6 +255,12 @@ node packages/server/scripts/acceptance-p4.mjs # Web Push + commande WS `answe node packages/server/scripts/acceptance-p5.mjs # groupes de travail : CRUD + broadcast WS + CASCADE ``` +## Soutenir le projet + +Arboretum est un projet personnel libre et auto-financé. S'il vous fait gagner du temps, vous pouvez soutenir son développement : + +[![Buy Me a Coffee](https://img.shields.io/badge/Buy%20Me%20a%20Coffee-johanleroy-FFDD00?logo=buymeacoffee&logoColor=black)](https://buymeacoffee.com/johanleroy) + ## Licence MIT — voir [LICENSE](LICENSE). diff --git a/README.md b/README.md index 5273761..20825a2 100644 --- a/README.md +++ b/README.md @@ -255,6 +255,12 @@ node packages/server/scripts/acceptance-p4.mjs # Web Push + WS `answer` comman node packages/server/scripts/acceptance-p5.mjs # work groups: CRUD + WS broadcast + CASCADE ``` +## Support + +Arboretum is a free, self-funded side project. If it saves you time, you can support its development: + +[![Buy Me a Coffee](https://img.shields.io/badge/Buy%20Me%20a%20Coffee-johanleroy-FFDD00?logo=buymeacoffee&logoColor=black)](https://buymeacoffee.com/johanleroy) + ## License MIT — see [LICENSE](LICENSE). diff --git a/packages/server/package.json b/packages/server/package.json index 6c6eb9b..235fa42 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -14,6 +14,10 @@ "bugs": { "url": "https://git.lidge.fr/johanleroy/arboretum/issues" }, + "funding": { + "type": "buymeacoffee", + "url": "https://buymeacoffee.com/johanleroy" + }, "keywords": [ "git", "worktree", diff --git a/packages/web/src/composables/useNav.ts b/packages/web/src/composables/useNav.ts index 8fd9609..56f6912 100644 --- a/packages/web/src/composables/useNav.ts +++ b/packages/web/src/composables/useNav.ts @@ -1,10 +1,10 @@ import { computed, type Component } from 'vue'; import { useRoute, type RouteLocationRaw } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import { Boxes, GitBranch, LifeBuoy, Settings, TerminalSquare } from '@lucide/vue'; +import { Boxes, Coffee, GitBranch, LifeBuoy, Settings, TerminalSquare } from '@lucide/vue'; import { useSessionsStore } from '../stores/sessions'; import GiteaIcon from '../components/ui/GiteaIcon.vue'; -import { REPO_SOURCE_URL } from '../lib/constants'; +import { BUYMEACOFFEE_URL, REPO_SOURCE_URL } from '../lib/constants'; export interface NavEntry { key: string; @@ -41,6 +41,7 @@ export function useNav() { { key: 'settings', to: { name: 'settings' }, icon: Settings, label: t('nav.settings'), match: ['settings'], badge: 0 }, { key: 'help', to: { name: 'help' }, icon: LifeBuoy, label: t('nav.help'), match: ['help'], badge: 0 }, { key: 'gitea', href: REPO_SOURCE_URL, icon: GiteaIcon, label: t('nav.gitea'), match: [], badge: 0 }, + { key: 'buymeacoffee', href: BUYMEACOFFEE_URL, icon: Coffee, label: t('nav.buymeacoffee'), match: [], badge: 0 }, ]); const isActive = (match: string[]): boolean => match.includes(String(route.name)); diff --git a/packages/web/src/i18n/en.ts b/packages/web/src/i18n/en.ts index b76486e..748f385 100644 --- a/packages/web/src/i18n/en.ts +++ b/packages/web/src/i18n/en.ts @@ -182,6 +182,7 @@ export default { help: 'Help', more: 'More', gitea: 'Source code', + buymeacoffee: 'Buy me a coffee', waiting: 'waiting', }, controls: { @@ -364,6 +365,10 @@ export default { vapidContact: 'VAPID contact', none: 'none', flagHint: 'CLI flag: {flag}', + // Support + support: 'Support', + supportHint: 'Arboretum is a free, self-funded side project. If it saves you time, you can support its development.', + supportCta: 'Buy me a coffee', }, help: { title: 'Help', diff --git a/packages/web/src/i18n/fr.ts b/packages/web/src/i18n/fr.ts index 3d4e3ae..7b880da 100644 --- a/packages/web/src/i18n/fr.ts +++ b/packages/web/src/i18n/fr.ts @@ -185,6 +185,7 @@ const fr: typeof en = { help: 'Aide', more: 'Plus', gitea: 'Code source', + buymeacoffee: 'Offrez-moi un café', waiting: 'en attente', }, controls: { @@ -367,6 +368,10 @@ const fr: typeof en = { vapidContact: 'Contact VAPID', none: 'aucune', flagHint: 'Flag CLI : {flag}', + // Soutien + support: 'Soutenir le projet', + supportHint: 'Arboretum est un projet personnel libre et auto-financé. S’il vous fait gagner du temps, vous pouvez soutenir son développement.', + supportCta: 'Offrez-moi un café', }, help: { title: 'Aide', diff --git a/packages/web/src/lib/constants.ts b/packages/web/src/lib/constants.ts index 8693503..f9e2913 100644 --- a/packages/web/src/lib/constants.ts +++ b/packages/web/src/lib/constants.ts @@ -6,3 +6,9 @@ * tous les utilisateurs de la solution. */ export const REPO_SOURCE_URL = 'https://git.lidge.fr/johanleroy/arboretum'; + +/** + * Lien « Buy me a coffee » affiché dans la navigation et la page Réglages. + * En dur (pas un réglage) : page de don personnelle, identique pour tous. + */ +export const BUYMEACOFFEE_URL = 'https://buymeacoffee.com/johanleroy'; diff --git a/packages/web/src/style.css b/packages/web/src/style.css index 2779f31..80308b7 100644 --- a/packages/web/src/style.css +++ b/packages/web/src/style.css @@ -18,6 +18,15 @@ body { -webkit-font-smoothing: antialiased; } +@layer base { + /* Tailwind v4 ne met plus cursor:pointer sur les boutons → on le rétablit + (sauf désactivés, qui gardent le curseur par défaut / not-allowed). */ + button:not(:disabled), + [role='button']:not([aria-disabled='true']) { + cursor: pointer; + } +} + @layer components { /* Champs : rayon unifié + anneau de focus visible (absent auparavant). */ .input { diff --git a/packages/web/src/views/SettingsView.vue b/packages/web/src/views/SettingsView.vue index 6a72867..d093936 100644 --- a/packages/web/src/views/SettingsView.vue +++ b/packages/web/src/views/SettingsView.vue @@ -178,13 +178,31 @@ + + +
+

+ {{ t('settings.support') }} +

+

{{ t('settings.supportHint') }}

+
+ + {{ t('settings.supportCta') }} + +
+