Snapshot of main at 9f39a6e1e (2026-11-02)

This commit is contained in:
Ronald Huynen committed 2026-11-02 10:41:47 +01:00
commit 6ccf1792d7
2580 files changed
+1040202

No files matched your search

@@ -0,0 +1,15 @@
@php
$layout = Auth::check() ? 'app-layout' : 'guest-layout';
@endphp
<x-dynamic-component :component="$layout">
<x-slot name="header">
{{ __('Amsterdam, Brussels and Lisbon') }}
</x-slot>
<div class="py-6">
<div class="mx-auto max-w-7xl sm:px-6 lg:px-8">
@livewire('static-post', ['type' => 'SiteContents\Static\AmstBrusLisb' ?? null, 'limit' => timebank_config('posts.static.press-media.limit'), 'hideAuthor' => timebank_config('posts.static.press-media.limit')])
</div>
</div>
</x-dynamic-layout>
@@ -0,0 +1,61 @@
@php
abort_unless(timebank_config('android_app.enabled', true), 404);
$layout = Auth::check() ? 'app-layout' : 'guest-layout';
$fallbackTexts = [
'en' => 'The :platform Android app lets you quickly access your account using biometric login. Check your balance, make payments, chat with other members, and get push notifications — all from your phone. Download the APK below to install the app directly on your Android device.',
'nl' => 'De :platform Android-app geeft je snel toegang tot je account via biometrische login. Bekijk je saldo, doe betalingen, chat met andere leden en ontvang pushmeldingen — allemaal vanaf je telefoon. Download de APK hieronder om de app direct op je Android-apparaat te installeren.',
'fr' => 'L\'application Android :platform te permet d\'accéder rapidement à ton compte grâce à la connexion biométrique. Consulte ton solde, effectue des paiements, discute avec d\'autres membres et reçois des notifications push — tout depuis ton téléphone. Télécharge l\'APK ci-dessous pour installer l\'application directement sur ton appareil Android.',
'de' => 'Die :platform Android-App ermöglicht dir den schnellen Zugriff auf dein Konto per biometrischem Login. Sieh deinen Kontostand ein, tätige Zahlungen, chatte mit anderen Mitgliedern und erhalte Push-Benachrichtigungen – alles von deinem Telefon aus. Lade die APK unten herunter, um die App direkt auf deinem Android-Gerät zu installieren.',
'es' => 'La app Android de :platform te permite acceder rápidamente a tu cuenta mediante inicio de sesión biométrico. Consulta tu saldo, realiza pagos, chatea con otros miembros y recibe notificaciones push — todo desde tu teléfono. Descarga el APK a continuación para instalar la app directamente en tu dispositivo Android.',
];
$locale = app()->getLocale();
$fallbackText = str_replace(':platform', platform_name(), $fallbackTexts[$locale] ?? $fallbackTexts['en']);
$apkUrl = \App\Http\Controllers\AppVersionController::latest()['apkUrl'];
$hasPost = \App\Models\Post::whereHas('category', fn($q) => $q->where('type', 'SiteContents\Static\AndroidApp'))
->whereHas('translations', fn($q) => $q
->where('locale', 'like', $locale . '%')
->whereDate('from', '<=', now())
->where(fn($q2) => $q2->whereDate('till', '>', now())->orWhereNull('till'))
)->exists();
@endphp
<x-dynamic-component :component="$layout">
<x-slot name="header">
{{ __('Android app') }}
</x-slot>
<div class="py-6">
<div class="mx-auto max-w-7xl sm:px-6 lg:px-8">
@if($hasPost)
@livewire('static-post', [
'type' => 'SiteContents\Static\AndroidApp',
'limit' => timebank_config('posts.static.android-app.limit'),
'hideAuthor' => timebank_config('posts.static.android-app.hideAuthor'),
])
@endif
{{-- Fallback text (when no post) and Download APK button (always shown) --}}
<div class="overflow-hidden bg-theme-background shadow-xl sm:rounded-lg mb-3">
<div class="px-3 sm:px-0">
<div class="max-w-4xl mx-auto my-12 p-4">
@if(!$hasPost)
<p class="text-theme-primary mb-8">{{ $fallbackText }}</p>
@endif
<div class="flex justify-center">
<a href="{{ $apkUrl }}" download>
<x-jetstream.button>
{{ __('Download APK') }}
</x-jetstream.button>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</x-dynamic-component>
+17
View File
@@ -0,0 +1,17 @@
@php
$layout = Auth::check() ? 'app-layout' : 'guest-layout';
@endphp
<x-dynamic-component :component="$layout">
<x-slot name="header">
{{ __('Events') }}
</x-slot>
<div class="py-6">
<div class="mx-auto max-w-7xl sm:px-6 lg:px-8">
@livewire('static-post', ['type' => 'SiteContents\Static\Events' ?? null, 'limit' => timebank_config('posts.static.events.limit'), 'hideAuthor' => timebank_config('posts.static.events.hideAuthor')])
@livewire('event-calendar-post', ['type' => 'App\Models\Meeting' ?? null, 'limit' => timebank_config('posts.static.events.limit'), 'hideAuthor' => timebank_config('posts.static.events.hideAuthor')])
</div>
</div>
</x-dynamic-layout>
+15
View File
@@ -0,0 +1,15 @@
@php
$layout = Auth::check() ? 'app-layout' : 'guest-layout';
@endphp
<x-dynamic-component :component="$layout">
<x-slot name="header">
{{ __('FAQ') }}
</x-slot>
<div class="py-6">
<div class="mx-auto max-w-7xl sm:px-6 lg:px-8">
@livewire('static-post', ['type' => 'SiteContents\Static\Faq' ?? null, 'limit' => timebank_config('posts.static.press-media.limit'), 'hideAuthor' => timebank_config('posts.static.press-media.limit')])
</div>
</div>
</x-dynamic-layout>
@@ -0,0 +1,15 @@
@php
$layout = Auth::check() ? 'app-layout' : 'guest-layout';
@endphp
<x-dynamic-component :component="$layout">
<x-slot name="header">
{{ __('Getting started') }}
</x-slot>
<div class="py-6">
<div class="mx-auto max-w-7xl sm:px-6 lg:px-8">
@livewire('static-post', ['type' => 'SiteContents\Static\GettingStarted' ?? null, 'limit' => 1 ])
</div>
</div>
</x-dynamic-layout>
+15
View File
@@ -0,0 +1,15 @@
@php
$layout = Auth::check() ? 'app-layout' : 'guest-layout';
@endphp
<x-dynamic-component :component="$layout">
<x-slot name="header">
{{ __('History') }}
</x-slot>
<div class="py-6">
<div class="mx-auto max-w-7xl sm:px-6 lg:px-8">
@livewire('static-post', ['type' => 'SiteContents\Static\History' ?? null, 'limit' => timebank_config('posts.static.press-media.limit'), 'hideAuthor' => timebank_config('posts.static.press-media.limit')] )
</div>
</div>
</x-dynamic-layout>
@@ -0,0 +1,16 @@
@php
$layout = Auth::check() ? 'app-layout' : 'guest-layout';
@endphp
<x-dynamic-component :component="$layout">
<x-slot name="header">
{{ __('Lekkernassûh') }}
</x-slot>
<div class="py-6">
<div class="mx-auto max-w-7xl sm:px-6 lg:px-8">
@livewire('static-post', ['type' => 'SiteContents\Static\Lekkernassuh' ?? null, 'limit' => timebank_config('posts.static.press-media.limit'), 'hideAuthor' => timebank_config('posts.static.press-media.limit')])
</div>
</div>
</x-dynamic-component>
@@ -0,0 +1,40 @@
@php
$layout = Auth::check() ? 'app-layout' : 'guest-layout';
@endphp
<x-dynamic-component :component="$layout">
<x-slot name="header">
{{ __('Chat messenger') }}
</x-slot>
@auth
@if(userHasMultipleProfiles() && session('activeProfileName'))
@php
$photoUrl = session('activeProfilePhoto') ? \Illuminate\Support\Facades\Storage::url(session('activeProfilePhoto')) : null;
$translatedRole = session('activeProfileRoleLabel') ? __(session('activeProfileRoleLabel')) : null;
@endphp
<div style="background-color: #f3f4f6; border-bottom: 1px solid #e5e7eb; padding: 12px 16px;">
<div style="max-width: 100%; margin: 0 auto; display: flex; align-items: center; gap: 12px;">
@if($photoUrl)
<img src="{{ $photoUrl }}" alt="{{ session('activeProfileName') }}" style="width: 40px; height: 40px; border-radius: 50%; object-fit: cover; flex-shrink: 0; box-shadow: 0 1px 3px rgba(0,0,0,0.1);">
@endif
<div style="flex: 1;">
<div style="color: #6b7280; font-size: 12px; margin-bottom: 2px;">{{ __('You are now acting as') }}</div>
<div style="display: flex; align-items: center; gap: 8px;">
<span style="font-weight: 600; color: #111827; font-size: 14px;">{{ session('activeProfileName') }}</span>
@if($translatedRole)
<span style="font-size: 11px; color: #6b7280; background-color: #e5e7eb; padding: 2px 8px; border-radius: 4px;">{{ $translatedRole }}</span>
@endif
</div>
</div>
</div>
</div>
@endif
@endauth
<div class="py-6">
<div class="mx-auto max-w-7xl sm:px-6 lg:px-8">
@livewire('static-post', ['type' => 'SiteContents\Static\Messenger' ?? null, 'limit' => timebank_config('posts.static.press-media.limit'), 'hideAuthor' => timebank_config('posts.static.press-media.limit')])
</div>
</div>
</x-dynamic-layout>
@@ -0,0 +1,25 @@
@php
$layout = Auth::check() ? 'app-layout' : 'guest-layout';
@endphp
<x-dynamic-component :component="$layout">
<x-slot name="header">
{{ __('Open source') }}
</x-slot>
<div class="py-6">
<div class="mx-auto max-w-7xl sm:px-6 lg:px-8">
@livewire('static-post', [
'type' => 'SiteContents\Static\OpenSource' ?? null,
'limit' => timebank_config('posts.static.open-source.limit'),
'hideAuthor' => timebank_config('posts.static.open-source.hideAuthor'),
'versionInfo' => [
'version' => config('app.name') . ' ' . config('app.version'),
'release_date' => config('app.release_date'),
'licence' => 'AGPL v3',
'changelog_url' => config('app.changelog_url'),
],
])
</div>
</div>
</x-dynamic-layout>
@@ -0,0 +1,15 @@
@php
$layout = Auth::check() ? 'app-layout' : 'guest-layout';
@endphp
<x-dynamic-component :component="$layout">
<x-slot name="header">
{{ __('Organizations') }}
</x-slot>
<div class="py-6">
<div class="mx-auto max-w-7xl sm:px-6 lg:px-8">
@livewire('static-post', ['type' => 'SiteContents\Static\Organizations' ?? null, 'limit' => timebank_config('posts.static.press-media.limit'), 'hideAuthor' => timebank_config('posts.static.press-media.limit')])
</div>
</div>
</x-dynamic-layout>
@@ -0,0 +1,15 @@
@php
$layout = Auth::check() ? 'app-layout' : 'guest-layout';
@endphp
<x-dynamic-component :component="$layout">
<x-slot name="header">
{{ __('Our philosophy') }}
</x-slot>
<div class="py-6">
<div class="mx-auto max-w-7xl sm:px-6 lg:px-8">
@livewire('static-post', ['type' => 'SiteContents\Static\Philosophy' ?? null, 'limit' => timebank_config('posts.static.press-media.limit'), 'hideAuthor' => timebank_config('posts.static.press-media.limit')])
</div>
</div>
</x-dynamic-layout>
@@ -0,0 +1,15 @@
@php
$layout = Auth::check() ? 'app-layout' : 'guest-layout';
@endphp
<x-dynamic-component :component="$layout">
<x-slot name="header">
{{ __('Press and media') }}
</x-slot>
<div class="py-6">
<div class="mx-auto max-w-7xl sm:px-6 lg:px-8">
@livewire('static-post', ['type' => 'SiteContents\Static\Press' ?? null, 'limit' => timebank_config('posts.static.press-media.limit'), 'hideAuthor' => timebank_config('posts.static.press-media.hideAuthor')])
</div>
</div>
</x-dynamic-layout>
@@ -0,0 +1,17 @@
@php
$layout = Auth::check() ? 'app-layout' : 'guest-layout';
@endphp
<x-dynamic-component :component="$layout">
<x-slot name="header">
{{ platform_principles() }}
</x-slot>
<div class="py-6">
<div class="mx-auto max-w-7xl sm:px-6 lg:px-8">
@livewire('static-post', ['type' => 'SiteContents\Static\Principles' ?? null, 'limit' => timebank_config('posts.static.press-media.limit'), 'hideAuthor' => timebank_config('posts.static.press-media.limit')])
@livewire('accept-principles')
</div>
</div>
</x-dynamic-layout>
+30
View File
@@ -0,0 +1,30 @@
@php
$layout = Auth::check() ? 'app-layout' : 'guest-layout';
@endphp
<x-dynamic-component :component="$layout">
<x-slot name="header">
{{ __('Privacy policy') }}
</x-slot>
<div class="py-6">
<div class="mx-auto max-w-7xl sm:px-6 lg:px-8">
@livewire('static-post', ['type' => 'SiteContents\PrivacyPolicy' ?? null, 'limit' => 1])
<div class="overflow-hidden bg-theme-background shadow-xl sm:rounded-lg mb-3">
<div class="px-3 sm:px-0">
<div class="max-w-4xl mx-auto my-12 p-4">
<p class="text-theme-primary dark:text-theme-muted">
{{ __('This is a condensed version of the') }}
<a href="{{ route('static-privacy-download') }}"
class="font-medium text-theme-primary hover:text-theme-primary-hover underline dark:text-white"
download>
{{ __('full privacy policy') }}
</a>.
</p>
</div>
</div>
</div>
</div>
</div>
</x-dynamic-component>
@@ -0,0 +1,30 @@
@php
$layout = Auth::check() ? 'app-layout' : 'guest-layout';
@endphp
<x-dynamic-component :component="$layout">
<x-slot name="header">
{{ __('Report an error') }}
</x-slot>
<div class="mx-auto max-w-7xl py-6 sm:px-6 lg:px-8">
<div class="md:grid md:grid-cols-3 md:gap-6">
{{-- Left sidebar with static content --}}
<div class="md:col-span-1">
<div class="px-3 sm:px-0">
@livewire('side-post', [
'type' => 'SiteContents\Static\ReportError' ?? null,
'sticky' => true,
'fallbackTitle' => __('Found a bug or technical issue?'),
'fallbackDescription' => __('Let us know about any errors or website issues. Thank you for your feedback!')
])
</div>
</div>
{{-- Right side with contact form --}}
<div class="mt-5 md:col-span-2 md:mt-0">
@livewire('contact-form', ['context' => 'report-error'])
</div>
</div>
</div>
</x-dynamic-component>
@@ -0,0 +1,30 @@
@php
$layout = Auth::check() ? 'app-layout' : 'guest-layout';
@endphp
<x-dynamic-component :component="$layout">
<x-slot name="header">
{{ __('Report an issue') }}
</x-slot>
<div class="mx-auto max-w-7xl py-6 sm:px-6 lg:px-8">
<div class="md:grid md:grid-cols-3 md:gap-6">
{{-- Left sidebar with static content --}}
<div class="md:col-span-1">
<div class="px-3 sm:px-0">
@livewire('side-post', [
'type' => 'SiteContents\Static\ReportIssue' ?? null,
'sticky' => true,
'fallbackTitle' => __('Notice something wrong?'),
'fallbackDescription' => __('Report misuse of our non-profit currency, inappropriate behavior, or website issues. We\'ll look into it! Your feedback is essential for improving our platform for all.')
])
</div>
</div>
{{-- Right side with contact form --}}
<div class="mt-5 md:col-span-2 md:mt-0">
@livewire('contact-form', ['context' => 'report-issue'])
</div>
</div>
</div>
</x-dynamic-component>
+15
View File
@@ -0,0 +1,15 @@
@php
$layout = Auth::check() ? 'app-layout' : 'guest-layout';
@endphp
<x-dynamic-component :component="$layout">
<x-slot name="header">
{{ __('Economics and research') }}
</x-slot>
<div class="py-6">
<div class="mx-auto max-w-7xl sm:px-6 lg:px-8">
@livewire('static-post', ['type' => 'SiteContents\Static\EconomicsAndResearch' ?? null, 'limit' => timebank_config('posts.static.economics-and-research.limit'), 'hideAuthor' => timebank_config('posts.static.economics-and-research.hideAuthor', false)])
</div>
</div>
</x-dynamic-layout>
+15
View File
@@ -0,0 +1,15 @@
@php
$layout = Auth::check() ? 'app-layout' : 'guest-layout';
@endphp
<x-dynamic-component :component="$layout">
<x-slot name="header">
{{ __('Meet the team') }}
</x-slot>
<div class="py-6">
<div class="mx-auto max-w-7xl sm:px-6 lg:px-8">
@livewire('static-post', ['type' => 'SiteContents\Static\Team' ?? null, 'limit' => timebank_config('posts.static.press-media.limit'), 'hideAuthor' => timebank_config('posts.static.press-media.limit')])
</div>
</div>
</x-dynamic-layout>
@@ -0,0 +1,15 @@
@php
$layout = Auth::check() ? 'app-layout' : 'guest-layout';
@endphp
<x-dynamic-component :component="$layout">
<x-slot name="header">
{{ __('The Hague') }}
</x-slot>
<div class="py-6">
<div class="mx-auto max-w-7xl sm:px-6 lg:px-8">
@livewire('static-post', ['type' => 'SiteContents\Static\TheHague' ?? null, 'limit' => timebank_config('posts.static.press-media.limit'), 'hideAuthor' => timebank_config('posts.static.press-media.limit')])
</div>
</div>
</x-dynamic-layout>
@@ -0,0 +1,15 @@
@php
$layout = Auth::check() ? 'app-layout' : 'guest-layout';
@endphp
<x-dynamic-component :component="$layout">
<x-slot name="header">
{{ trans_with_platform('@PLATFORM_NAME_SHORT@ organization') }}
</x-slot>
<div class="py-6">
<div class="mx-auto max-w-7xl sm:px-6 lg:px-8">
@livewire('static-post', ['type' => 'SiteContents\Static\TimebankOrganization' ?? null, 'limit' => timebank_config('posts.static.timebank-organization.limit'), 'hideAuthor' => timebank_config('posts.static.timebank-organization.hideAuthor')])
</div>
</div>
</x-dynamic-layout>
@@ -0,0 +1,15 @@
@php
$layout = Auth::check() ? 'app-layout' : 'guest-layout';
@endphp
<x-dynamic-component :component="$layout">
<x-slot name="header">
{{ __('Work with us') }}
</x-slot>
<div class="py-6">
<div class="mx-auto max-w-7xl sm:px-6 lg:px-8">
@livewire('static-post', ['type' => 'SiteContents\Static\WorkWithUs' ?? null, 'limit' => timebank_config('posts.static.press-media.limit'), 'hideAuthor' => timebank_config('posts.static.press-media.limit')])
</div>
</div>
</x-dynamic-layout>