diff --git a/app/Actions/ViewDataAction.php b/app/Actions/ViewDataAction.php index ab1abb6..403b1ad 100644 --- a/app/Actions/ViewDataAction.php +++ b/app/Actions/ViewDataAction.php @@ -82,9 +82,7 @@ public function contacts(string $locale): object ->get(); return (object) collect([ - ContactSectionEnum::EMPLOYEE_SERVICES, - ContactSectionEnum::EMPLOYEE_PRODUCTS, - ContactSectionEnum::EMPLOYEE_ADMINISTRATION, + ContactSectionEnum::EMPLOYEES, ContactSectionEnum::COLLABORATIONS, ContactSectionEnum::BOARD_MEMBERS, ])->mapWithKeys(function (string $section) use ($publishedContacts, $locale): array { diff --git a/app/Enums/ContactSectionEnum.php b/app/Enums/ContactSectionEnum.php index 6c4be53..c3fdfc2 100644 --- a/app/Enums/ContactSectionEnum.php +++ b/app/Enums/ContactSectionEnum.php @@ -4,11 +4,7 @@ enum ContactSectionEnum: string { - const string EMPLOYEE_SERVICES = 'employee_services'; - - const string EMPLOYEE_PRODUCTS = 'employee_products'; - - const string EMPLOYEE_ADMINISTRATION = 'employee_administration'; + const string EMPLOYEES = 'employees'; const string COLLABORATIONS = 'collaborations'; diff --git a/app/Http/Controllers/News/NewsIndexController.php b/app/Http/Controllers/News/NewsIndexController.php new file mode 100644 index 0000000..cf464dc --- /dev/null +++ b/app/Http/Controllers/News/NewsIndexController.php @@ -0,0 +1,24 @@ +getLocale(); + + return view('app.news.index')->with([ + 'page' => (new PageAction(locale: null, routeName: 'news.index'))->default(), + 'news' => (new ViewDataAction)->news($locale), + ]); + } +} diff --git a/app/Http/Controllers/Sitemap/SitemapController.php b/app/Http/Controllers/Sitemap/SitemapController.php index f086be4..43074e6 100644 --- a/app/Http/Controllers/Sitemap/SitemapController.php +++ b/app/Http/Controllers/Sitemap/SitemapController.php @@ -11,6 +11,7 @@ use App\Models\Service; use App\Sitemap\SitemapBuilder; use Illuminate\Http\Response; +use Illuminate\Support\Collection; use Illuminate\Support\Facades\Cache; class SitemapController extends Controller @@ -44,35 +45,46 @@ public function __invoke(): Response }); return response(content: $content) - ->header('Content-Type', 'application/xml'); + ->header('Content-Type', 'application/xml') + ->header('Cache-Control', 'public, max-age=3600'); // Cache for 1 hour } private function builder(): void { $this->addDefaultRoutesToSitemap(); + // Use chunked queries to prevent memory issues News::whereNotNull('published_at') ->with('references') - ->each(function (News $news): void { - $this->addLocalizedPageSet( - page: (new PageAction(locale: null, routeName: null))->news(news: $news, withReferences: true), - ); + ->chunk(100, function (Collection $news): void { + /** @var News $item */ + foreach ($news as $item) { + $this->addLocalizedPageSet( + page: (new PageAction(locale: null, routeName: null))->news(news: $item, withReferences: true), + ); + } }); Service::where('published', true) ->with('references') - ->each(function (Service $service): void { - $this->addLocalizedPageSet( - page: (new PageAction(locale: null, routeName: null))->service(service: $service, withReferences: true), - ); + ->chunk(100, function (Collection $services): void { + /** @var Service $item */ + foreach ($services as $item) { + $this->addLocalizedPageSet( + page: (new PageAction(locale: null, routeName: null))->service(service: $item, withReferences: true), + ); + } }); Product::where('published', true) ->with('references') - ->each(function (Product $product): void { - $this->addLocalizedPageSet( - page: (new PageAction(locale: null, routeName: null))->product(product: $product, withReferences: true), - ); + ->chunk(100, function (Collection $products): void { + /** @var Product $item */ + foreach ($products as $item) { + $this->addLocalizedPageSet( + page: (new PageAction(locale: null, routeName: null))->product(product: $item, withReferences: true), + ); + } }); } diff --git a/app/Models/Configuration.php b/app/Models/Configuration.php index afc2906..bab2bd9 100644 --- a/app/Models/Configuration.php +++ b/app/Models/Configuration.php @@ -10,6 +10,8 @@ class Configuration extends Model use HasFactory; protected $casts = [ + 'component_intro' => 'json', + 'section_news' => 'boolean', 'section_services' => 'boolean', 'section_products' => 'boolean', 'section_technologies' => 'boolean', diff --git a/config/database.php b/config/database.php index 66b1fbd..0b33740 100644 --- a/config/database.php +++ b/config/database.php @@ -42,48 +42,13 @@ 'mysql' => [ 'driver' => 'mysql', 'url' => env('DB_URL'), - 'host' => env('DB_HOST', '127.0.0.1'), - 'port' => env('DB_PORT', '3306'), - 'database' => env('DB_DATABASE', 'laravel'), - 'username' => env('DB_USERNAME', 'root'), - 'password' => env('DB_PASSWORD', ''), - 'unix_socket' => env('DB_SOCKET', ''), - 'charset' => env('DB_CHARSET', 'utf8mb4'), - 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), - 'prefix' => '', - 'prefix_indexes' => true, - 'strict' => true, - 'engine' => null, - 'options' => extension_loaded('pdo_mysql') ? array_filter([ - PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), - ]) : [], - ], - - 'logs' => [ - 'driver' => 'mysql', - 'url' => env('LOGS_DATABASE_URL'), - 'host' => env('LOGS_DB_HOST', '127.0.0.1'), - 'port' => env('LOGS_DB_PORT', '3306'), - 'database' => env('LOGS_DB_DATABASE', 'forge'), - 'username' => env('LOGS_DB_USERNAME', 'forge'), - 'password' => env('LOGS_DB_PASSWORD', ''), - 'unix_socket' => env('LOGS_DB_SOCKET', ''), - 'charset' => 'utf8mb4', - 'collation' => 'utf8mb4_unicode_ci', - 'prefix' => '', - 'prefix_indexes' => true, - 'strict' => true, - 'engine' => null, - 'options' => extension_loaded('pdo_mysql') ? array_filter([ - PDO::MYSQL_ATTR_SSL_CA => env('LOGS_MYSQL_ATTR_SSL_CA'), - ]) : [], - 'ssl_mode' => env('LOGS_SSL_MODE', 'required'), - ], - - 'mariadb' => [ - 'driver' => 'mariadb', - 'url' => env('DB_URL'), - 'host' => env('DB_HOST', '127.0.0.1'), + 'read' => [ + 'host' => env('DB_READ_HOST', env('DB_HOST')), + ], + 'write' => [ + 'host' => env('DB_WRITE_HOST', env('DB_HOST')), + ], + // 'host' => env('DB_HOST'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'laravel'), 'username' => env('DB_USERNAME', 'root'), @@ -103,7 +68,13 @@ 'pgsql' => [ 'driver' => 'pgsql', 'url' => env('DB_URL'), - 'host' => env('DB_HOST', '127.0.0.1'), + 'read' => [ + 'host' => env('DB_READ_HOST', env('DB_HOST')), + ], + 'write' => [ + 'host' => env('DB_WRITE_HOST', env('DB_HOST')), + ], + // 'host' => env('DB_HOST'), 'port' => env('DB_PORT', '5432'), 'database' => env('DB_DATABASE', 'laravel'), 'username' => env('DB_USERNAME', 'root'), @@ -114,22 +85,6 @@ 'search_path' => 'public', 'sslmode' => 'prefer', ], - - 'sqlsrv' => [ - 'driver' => 'sqlsrv', - 'url' => env('DB_URL'), - 'host' => env('DB_HOST', 'localhost'), - 'port' => env('DB_PORT', '1433'), - 'database' => env('DB_DATABASE', 'laravel'), - 'username' => env('DB_USERNAME', 'root'), - 'password' => env('DB_PASSWORD', ''), - 'charset' => env('DB_CHARSET', 'utf8'), - 'prefix' => '', - 'prefix_indexes' => true, - // 'encrypt' => env('DB_ENCRYPT', 'yes'), - // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), - ], - ], /* diff --git a/database/migrations/2025_06_23_225051_create_configurations_table.php b/database/migrations/2025_06_23_225051_create_configurations_table.php index 567deb5..982e831 100644 --- a/database/migrations/2025_06_23_225051_create_configurations_table.php +++ b/database/migrations/2025_06_23_225051_create_configurations_table.php @@ -15,7 +15,11 @@ public function up(): void $table->id(); $table->string('company')->nullable(); + $table->string('company_primary_color')->nullable(); + $table->json('component_intro'); + + $table->boolean('section_news')->default(false); $table->boolean('section_services')->default(false); $table->boolean('section_products')->default(false); $table->boolean('section_technologies')->default(false); diff --git a/database/seeders/Codebar/ConfigurationsTableSeeder.php b/database/seeders/Codebar/ConfigurationsTableSeeder.php index 48f3fc6..5e16918 100644 --- a/database/seeders/Codebar/ConfigurationsTableSeeder.php +++ b/database/seeders/Codebar/ConfigurationsTableSeeder.php @@ -2,6 +2,7 @@ namespace Database\Seeders\Codebar; +use App\Enums\LocaleEnum; use App\Models\Configuration; use Illuminate\Database\Seeder; @@ -15,7 +16,14 @@ public function run(): void Configuration::updateOrCreate([], [ 'company' => 'codebar Solutions AG', + 'company_primary_color' => '#500472', + 'component_intro' => [ + LocaleEnum::DE->value => file_get_contents(database_path('seeders/files/codebar_intro_de.md')), + LocaleEnum::EN->value => file_get_contents(database_path('seeders/files/codebar_intro_en.md')), + ], + + 'section_news' => false, 'section_services' => false, 'section_products' => false, 'section_technologies' => true, diff --git a/database/seeders/Codebar/ContactsTableSeeder.php b/database/seeders/Codebar/ContactsTableSeeder.php index f43aa95..7e2b4c4 100644 --- a/database/seeders/Codebar/ContactsTableSeeder.php +++ b/database/seeders/Codebar/ContactsTableSeeder.php @@ -16,8 +16,8 @@ public function run(): void 'name' => 'Sebastian Bürgin-Fix', 'published' => true, 'sections' => [ - ContactSectionEnum::EMPLOYEE_SERVICES => [ - 'key' => ContactSectionEnum::EMPLOYEE_SERVICES, + ContactSectionEnum::EMPLOYEES => [ + 'key' => ContactSectionEnum::EMPLOYEES, 'role' => [ 'de_CH' => 'Software-Architekt', 'en_CH' => 'Software-Engineer', @@ -38,45 +38,93 @@ public function run(): void Contact::updateOrCreate( ['id' => 2], [ - 'name' => 'Rhys Lees', - 'published' => false, + 'name' => 'Melanie Bürgin-Fix', + 'published' => true, 'sections' => [ - ContactSectionEnum::EMPLOYEE_SERVICES => [ - 'key' => ContactSectionEnum::EMPLOYEE_SERVICES, + ContactSectionEnum::EMPLOYEES => [ + 'key' => ContactSectionEnum::EMPLOYEES, 'role' => [ - 'de_CH' => 'Entwickler', - 'en_CH' => 'Developer', + 'de_CH' => 'Administration', + 'en_CH' => 'Administration', ], ], + ContactSectionEnum::BOARD_MEMBERS => [ + 'key' => ContactSectionEnum::BOARD_MEMBERS, + ], ], 'icons' => [ - 'email' => 'rhys.leess@codebar.ch', - 'linkedin' => 'https://www.linkedin.com/in/rhys-lees', + 'email' => 'melanie.buergin@codebar.ch', + 'linkedin' => 'https://www.linkedin.com/in/melanie-buergin', ], - 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/r_lees_e_background_removal_f_png.webp', + 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/codebar.webp', ] ); Contact::updateOrCreate( - ['id' => 7], + ['id' => 3], [ - 'name' => 'Sebastian Bürgin-Fix', + 'name' => 'Tobias Brogle', 'published' => true, + 'sections' => [ + ContactSectionEnum::EMPLOYEES => [ + 'key' => ContactSectionEnum::EMPLOYEES, + 'role' => [ + 'de_CH' => 'Applikationsentwickler', + 'en_CH' => 'Application Developer', + ], + ], + ], + 'icons' => [ + 'email' => 'tobias.brogle@codebar.ch', + 'linkedin' => null, + ], + 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/codebar.webp', + ] + ); + + Contact::updateOrCreate( + ['id' => 4], + [ + 'name' => 'Alexander Christoph Boll', + 'published' => false, + 'sections' => [ + ContactSectionEnum::EMPLOYEES => [ + 'key' => ContactSectionEnum::EMPLOYEES, + 'role' => [ + 'de_CH' => 'Produktentwickler', + 'en_CH' => 'Product Developer', + ], + ], + ], + 'icons' => [ + 'email' => 'alexander.boll@codebar.ch', + 'linkedin' => 'https://www.linkedin.com/in/alexanderboll', + ], + 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/codebar.webp', + ] + ); + + Contact::updateOrCreate( + ['id' => 6], + [ + 'name' => 'PST GmbH', + 'published' => false, 'sections' => [ ContactSectionEnum::COLLABORATIONS => [ 'key' => ContactSectionEnum::COLLABORATIONS, 'role' => [ - 'de_CH' => 'paperflakes AG', - 'en_CH' => 'paperflakes AG', + 'de_CH' => 'Finanzen', + 'en_CH' => 'Finance', ], ], ], 'icons' => [ - 'email' => 'info@paperflakes.ch', - 'website' => 'https://www.paperflakes.ch', + 'email' => 'info@pstgmbh.ch', + 'website' => 'https://www.pstgmbh.ch', ], - 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/paperflakes.webp', + 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/codebar.webp', ] ); + } } diff --git a/database/seeders/Paperflakes/ConfigurationsTableSeeder.php b/database/seeders/Paperflakes/ConfigurationsTableSeeder.php index 9c371a0..93a3662 100644 --- a/database/seeders/Paperflakes/ConfigurationsTableSeeder.php +++ b/database/seeders/Paperflakes/ConfigurationsTableSeeder.php @@ -2,6 +2,7 @@ namespace Database\Seeders\Paperflakes; +use App\Enums\LocaleEnum; use App\Models\Configuration; use Illuminate\Database\Seeder; @@ -14,7 +15,14 @@ public function run(): void { Configuration::updateOrCreate([], [ 'company' => 'paperflakes AG', + 'company_primary_color' => '#69b3a1', + 'component_intro' => [ + LocaleEnum::DE->value => file_get_contents(database_path('seeders/files/paperflakes_intro_de.md')), + LocaleEnum::EN->value => file_get_contents(database_path('seeders/files/paperflakes_intro_en.md')), + ], + + 'section_news' => true, 'section_services' => true, 'section_products' => true, 'section_technologies' => false, diff --git a/database/seeders/Paperflakes/ContactsTableSeeder.php b/database/seeders/Paperflakes/ContactsTableSeeder.php index bbe2b89..eefd049 100644 --- a/database/seeders/Paperflakes/ContactsTableSeeder.php +++ b/database/seeders/Paperflakes/ContactsTableSeeder.php @@ -16,20 +16,13 @@ public function run(): void 'name' => 'Sebastian Bürgin-Fix', 'published' => true, 'sections' => [ - ContactSectionEnum::EMPLOYEE_SERVICES => [ - 'key' => ContactSectionEnum::EMPLOYEE_SERVICES, - 'role' => [ - 'de_CH' => 'DMS/ECM Spezialist', - 'en_CH' => 'DMS/ECM Specialist', - ], - ], - /* ContactSectionEnum::EMPLOYEE_PRODUCTS => [ - 'key' => ContactSectionEnum::EMPLOYEE_PRODUCTS, + ContactSectionEnum::EMPLOYEES => [ + 'key' => ContactSectionEnum::EMPLOYEES, 'role' => [ 'de_CH' => 'Software-Architekt', 'en_CH' => 'Software-Engineer', ], - ],*/ + ], ContactSectionEnum::BOARD_MEMBERS => [ 'key' => ContactSectionEnum::BOARD_MEMBERS, ], @@ -48,8 +41,8 @@ public function run(): void 'name' => 'Mischa Lanz', 'published' => true, 'sections' => [ - ContactSectionEnum::EMPLOYEE_SERVICES => [ - 'key' => ContactSectionEnum::EMPLOYEE_SERVICES, + ContactSectionEnum::EMPLOYEES => [ + 'key' => ContactSectionEnum::EMPLOYEES, 'role' => [ 'de_CH' => 'zunscan.ch', 'en_CH' => 'zunscan.ch', @@ -73,6 +66,13 @@ public function run(): void 'name' => 'Dominique Ernst', 'published' => true, 'sections' => [ + /* ContactSectionEnum::EMPLOYEES => [ + 'key' => ContactSectionEnum::EMPLOYEES, + 'role' => [ + 'de_CH' => 'DMS/ECM Berater', + 'en_CH' => 'DMS/ECM Consultant', + ], + ], */ ContactSectionEnum::BOARD_MEMBERS => [ 'key' => ContactSectionEnum::BOARD_MEMBERS, ], @@ -88,44 +88,47 @@ public function run(): void Contact::updateOrCreate( ['id' => 4], [ - 'name' => 'Rhys Lees', - 'published' => false, + 'name' => 'Katja Lanz', + 'published' => true, 'sections' => [ - ContactSectionEnum::EMPLOYEE_PRODUCTS => [ - 'key' => ContactSectionEnum::EMPLOYEE_PRODUCTS, + ContactSectionEnum::EMPLOYEES => [ + 'key' => ContactSectionEnum::EMPLOYEES, 'role' => [ - 'de_CH' => 'Entwickler', - 'en_CH' => 'Developer', + 'de_CH' => 'HR', + 'en_CH' => 'HR', ], ], ], 'icons' => [ - 'email' => 'rhys.leess@paperflakes.ch', - 'linkedin' => 'https://www.linkedin.com/in/rhys-lees', + 'email' => 'katja.lanz@paperflakes.ch', + 'linkedin' => 'https://www.linkedin.com/in/katja-lanz-a92372149/', ], - 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/r_lees_e_background_removal_f_png.webp', + 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/652d4179a3494dedacf6555a_Katja_Jacke.webp', ] ); Contact::updateOrCreate( ['id' => 5], [ - 'name' => 'Katja Lanz', + 'name' => 'Melanie Bürgin-Fix', 'published' => true, 'sections' => [ - ContactSectionEnum::EMPLOYEE_ADMINISTRATION => [ - 'key' => ContactSectionEnum::EMPLOYEE_ADMINISTRATION, + ContactSectionEnum::EMPLOYEES => [ + 'key' => ContactSectionEnum::EMPLOYEES, 'role' => [ - 'de_CH' => 'Finanzen & HR', - 'en_CH' => 'Finance & HR', + 'de_CH' => 'Administration', + 'en_CH' => 'Administration', ], ], + ContactSectionEnum::BOARD_MEMBERS => [ + 'key' => ContactSectionEnum::BOARD_MEMBERS, + ], ], 'icons' => [ - 'email' => 'katja.lanz@paperflakes.ch', - 'linkedin' => 'https://www.linkedin.com/in/katja-lanz-a92372149/', + 'email' => 'melanie.buergin@paperflakes.ch', + 'linkedin' => 'https://www.linkedin.com/in/melanie-buergin', ], - 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/652d4179a3494dedacf6555a_Katja_Jacke.webp', + 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/paperflakes.webp', ] ); @@ -135,8 +138,8 @@ public function run(): void 'name' => 'DR-G2110', 'published' => true, 'sections' => [ - ContactSectionEnum::EMPLOYEE_ADMINISTRATION => [ - 'key' => ContactSectionEnum::EMPLOYEE_ADMINISTRATION, + ContactSectionEnum::EMPLOYEES => [ + 'key' => ContactSectionEnum::EMPLOYEES, 'role' => [ 'de_CH' => 'Digitalisierungs-Beauftragter', 'en_CH' => 'Head of Digital Transformation', @@ -149,29 +152,29 @@ public function run(): void ); Contact::updateOrCreate( - ['id' => 7], + ['id' => 6], [ - 'name' => 'Sebastian Bürgin-Fix', - 'published' => true, + 'name' => 'PST GmbH', + 'published' => false, 'sections' => [ ContactSectionEnum::COLLABORATIONS => [ 'key' => ContactSectionEnum::COLLABORATIONS, 'role' => [ - 'de_CH' => 'codebar Solutions AG', - 'en_CH' => 'codebar Solutions AG', + 'de_CH' => 'Finanzen', + 'en_CH' => 'Finance', ], ], ], 'icons' => [ - 'email' => 'info@codebar.ch', - 'website' => 'https://www.codebar.ch', + 'email' => 'info@pstgmbh.ch', + 'website' => 'https://www.pstgmbh.ch', ], - 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/codebar.webp', + 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/paperflakes.webp', ] ); Contact::updateOrCreate( - ['id' => 8], + ['id' => 7], [ 'name' => 'Dario Wieland', 'published' => true, diff --git a/database/seeders/Paperflakes/PagesTableSeeder.php b/database/seeders/Paperflakes/PagesTableSeeder.php index 79c8334..fb4d5f3 100644 --- a/database/seeders/Paperflakes/PagesTableSeeder.php +++ b/database/seeders/Paperflakes/PagesTableSeeder.php @@ -31,7 +31,21 @@ private function enCH() 'title' => 'Your Digital Partner', 'description' => 'We support you with smart digital solutions that move your business forward.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', - ]); + ] + ); + + Page::updateOrCreate( + [ + 'key' => 'news.index', + 'locale' => $locale, + ], + [ + 'robots' => 'index,follow', + 'title' => 'News & Insights', + 'description' => 'Stay up to date with the latest news, expert insights and trends on DMS, ECM and digital transformation from paperflakes.', + 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', + ] + ); Page::updateOrCreate( [ @@ -43,7 +57,8 @@ private function enCH() 'title' => 'About Us – paperflakes AG', 'description' => 'Get to know paperflakes AG – your Swiss partner for digital transformation and innovative software solutions.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', - ]); + ] + ); Page::updateOrCreate( [ @@ -55,7 +70,8 @@ private function enCH() 'title' => 'Services that Support You', 'description' => 'From strategy to implementation - we\'re here to support you all the way.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', - ]); + ] + ); Page::updateOrCreate( [ @@ -67,7 +83,8 @@ private function enCH() 'title' => 'Tools That Empower You', 'description' => 'Our products are built to help you work smarter, faster and better.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', - ]); + ] + ); Page::updateOrCreate( [ @@ -79,7 +96,8 @@ private function enCH() 'title' => 'Legal Notice', 'description' => 'All legal details about paperflakes AG.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', - ]); + ] + ); Page::updateOrCreate( [ @@ -91,7 +109,8 @@ private function enCH() 'title' => 'Let\'s Talk', 'description' => 'Have a question? We\'re here to support you - just reach out.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', - ]); + ] + ); } private function deCH() @@ -108,7 +127,21 @@ private function deCH() 'title' => 'Dein digitaler Partner', 'description' => 'Wir unterstützen dich mit cleveren Lösungen für deinen digitalen Erfolg.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', - ]); + ] + ); + + Page::updateOrCreate( + [ + 'key' => 'news.index', + 'locale' => $locale, + ], + [ + 'robots' => 'index,follow', + 'title' => 'Neuigkeiten & Insights', + 'description' => 'Aktuelle News, Fachbeiträge und Trends rund um DMS, ECM und digitale Transformation mit paperflakes.', + 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', + ] + ); Page::updateOrCreate( [ @@ -120,7 +153,8 @@ private function deCH() 'title' => 'Über uns – paperflakes AG', 'description' => 'Lerne die paperflakes AG kennen – dein Schweizer Partner für digitale Transformation und innovative Softwarelösungen.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', - ]); + ] + ); Page::updateOrCreate( [ @@ -132,7 +166,8 @@ private function deCH() 'title' => 'Dienstleistungen für dich', 'description' => 'Von der Strategie bis zur Umsetzung - wir stehen dir zur Seite.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', - ]); + ] + ); Page::updateOrCreate( [ @@ -144,7 +179,8 @@ private function deCH() 'title' => 'Tools, die dich stärken', 'description' => 'Unsere Produkte helfen dir, effizienter, schneller und einfacher zu arbeiten.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', - ]); + ] + ); Page::updateOrCreate( [ @@ -156,7 +192,8 @@ private function deCH() 'title' => 'Rechtliches', 'description' => 'Alle rechtlichen Informationen zur paperflakes AG.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', - ]); + ] + ); Page::updateOrCreate( [ @@ -169,6 +206,7 @@ private function deCH() 'title' => 'Lass uns sprechen', 'description' => 'Fragen? Wir sind fürr dich da - melde dich jederzeit bei uns.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', - ]); + ] + ); } } diff --git a/database/seeders/files/codebar_intro_de.md b/database/seeders/files/codebar_intro_de.md new file mode 100644 index 0000000..ce4e505 --- /dev/null +++ b/database/seeders/files/codebar_intro_de.md @@ -0,0 +1,5 @@ +
Das Team von **codebar** versteht es, innovative Ideen mit digitalen Hilfsmitteln zum Leben zu erwecken. Wir denken wirtschaftlich, arbeiten gerne konzeptionell und setzen auf offene Technologien und Standards. Das alles ermöglicht es uns, Software zu entwickeln, die sich an den Bedürfnissen der Nutzer:innen orientiert – und dir echten Mehrwert bietet.
+ +Am Anfang hören wir dir zu. Denn um effiziente Software zu entwickeln, muss man zunächst im Detail verstehen, wofür sie gedacht ist. Anschliessend erarbeiten wir gemeinsam ein Konzept, das sich an den Anforderungen der künftigen Nutzer:innen orientiert. Fällt der definierte Lösungsansatz in unseren Kompetenzbereich, unterstützen wir dich gerne auch bei der Realisierung. Andernfalls freuen wir uns, wenn andere unsere Pläne in die Tat umsetzen.
diff --git a/database/seeders/files/codebar_intro_en.md b/database/seeders/files/codebar_intro_en.md new file mode 100644 index 0000000..4c1dc97 --- /dev/null +++ b/database/seeders/files/codebar_intro_en.md @@ -0,0 +1,5 @@ +The team at codebar knows how to bring innovative ideas to life using digital tools. We think economically, enjoy working conceptually, and rely on open technologies and standards. This allows us to develop software that's built around the needs of its users – and delivers real value to you.
+ +We start by listening. Because to develop effective software, you first need to understand exactly what it's meant to do. Next, we work with you to develop a concept based on the needs of future users. If the proposed solution fits our area of expertise, we're happy to support you through implementation as well. If not, we're just as pleased when others turn our plans into reality.
diff --git a/database/seeders/files/paperflakes_intro_de.md b/database/seeders/files/paperflakes_intro_de.md new file mode 100644 index 0000000..9944506 --- /dev/null +++ b/database/seeders/files/paperflakes_intro_de.md @@ -0,0 +1,5 @@ +Bei paperflakes unterstützen wir dich dabei, deine Informationsflüsse zu strukturieren und Dokumentenprozesse digital abzubilden – effizient, sicher und zukunftsorientiert. Wir beraten dich individuell, denken ganzheitlich und setzen Lösungen um, die exakt zu deinen Anforderungen passen. Unser Ziel: messbarer Mehrwert im Alltag – durch mehr Transparenz, klare Abläufe und spürbare Entlastung bei der täglichen Arbeit.
+ +Am Anfang nehmen wir uns Zeit, deine Abläufe, Herausforderungen und Ziele genau zu verstehen. Denn nur wer wirklich durchblickt, kann sinnvolle und nachhaltige Lösungen entwickeln. Gemeinsam mit dir erstellen wir ein Umsetzungskonzept, das auf deine konkreten Anforderungen abgestimmt ist – fachlich fundiert und praxisnah. Auf dieser Basis erhältst du ein klar strukturiertes Angebot. Wenn du dich dafür entscheidest, setzen wir die Lösung gemeinsam mit dir um – von der Planung bis zur erfolgreichen Einführung.
diff --git a/database/seeders/files/paperflakes_intro_en.md b/database/seeders/files/paperflakes_intro_en.md new file mode 100644 index 0000000..c96dc38 --- /dev/null +++ b/database/seeders/files/paperflakes_intro_en.md @@ -0,0 +1,5 @@ +At paperflakes, we help you structure your information flows and digitise document-related processes – efficiently, securely, and with a future-focused approach. We offer tailored consulting, take a holistic perspective, and implement solutions that fit your specific requirements. Our goal: measurable added value in your day-to-day operations – through greater transparency, streamlined processes, and noticeable relief in your daily workload.
+ +We start by taking the time to fully understand your workflows, challenges, and goals. Because only with real insight can effective and sustainable solutions be created. Together, we develop an implementation concept that is tailored to your specific needs – technically sound and grounded in real-world practice. Based on this, you'll receive a clearly structured proposal. If you decide to proceed, we'll implement the solution together – from planning to successful rollout.
diff --git a/lang/de_CH.json b/lang/de_CH.json index 5cb7e7e..b9f64b8 100644 --- a/lang/de_CH.json +++ b/lang/de_CH.json @@ -14,10 +14,12 @@ "Deutsch": "Deutsch", "DocuWare Silver Partner": "DocuWare Silber Partner", "Email": "E-Mail", + "Employees": "Mitarbeitende", "EN": "EN", "English": "English", "Google Maps": "Google Maps", "Headquarter": "Hauptsitz", + "Home": "Start", "Imprint": "Impressum", "Info(at)paperflakes.ch": "Info(at)paperflakes.ch", "Jobs": "Stellen", @@ -43,5 +45,6 @@ "Technologies": "Technologien", "Update to english language": "Auf Englisch wechseln", "Update to german language": "Auf Deutsch wechseln", + "Welcome": "Willkommen", "Zefix": "Zefix" -} \ No newline at end of file +} diff --git a/lang/de_CH/components.php b/lang/de_CH/components.php index 1d13551..d2f8665 100644 --- a/lang/de_CH/components.php +++ b/lang/de_CH/components.php @@ -1,7 +1,11 @@ [ + 'buttons' => [ + 'more' => 'Mehr über uns', + ], + ], 'docuware' => [ 'showme' => [ 'title' => 'Erleben Sie DocuWare in Aktion', diff --git a/lang/en_CH/components.php b/lang/en_CH/components.php index 768a885..c57056f 100644 --- a/lang/en_CH/components.php +++ b/lang/en_CH/components.php @@ -1,7 +1,11 @@ [ + 'buttons' => [ + 'more' => 'More about us', + ], + ], 'docuware' => [ 'showme' => [ 'title' => 'Experience DocuWare in Action', diff --git a/package-lock.json b/package-lock.json index d616955..1fc7fc0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,9 @@ "laravel-vite-plugin": "^1.2.0", "tailwindcss": "^4.1.2", "vite": "^6.3.4" + }, + "devDependencies": { + "terser": "^5.43.1" } }, "node_modules/@alloc/quick-lru": { @@ -467,6 +470,16 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.10.tgz", + "integrity": "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==", + "devOptional": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", @@ -1023,6 +1036,18 @@ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.1.5.tgz", "integrity": "sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==" }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "devOptional": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1127,6 +1152,12 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "devOptional": true + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -1232,6 +1263,12 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "devOptional": true + }, "node_modules/concurrently": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.0.tgz", @@ -2097,6 +2134,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -2105,6 +2151,16 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "devOptional": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -2172,6 +2228,24 @@ "node": ">=18" } }, + "node_modules/terser": { + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", + "devOptional": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.14.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/tinyglobby": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", diff --git a/package.json b/package.json index 82a6418..08fbd4d 100644 --- a/package.json +++ b/package.json @@ -17,5 +17,8 @@ "laravel-vite-plugin": "^1.2.0", "tailwindcss": "^4.1.2", "vite": "^6.3.4" + }, + "devDependencies": { + "terser": "^5.43.1" } } diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 0947e46..cee3423 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -8,4 +8,4 @@ parameters: ignoreErrors: - excludePaths: \ No newline at end of file + excludePaths: diff --git a/resources/css/app.css b/resources/css/app.css index 8bc6b27..30ea9e6 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -5,19 +5,45 @@ @source '../views'; @source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php'; +@safelist mb-2 mb-4 text-lg md:text-xl font-semibold; + [x-cloak] { display: none !important; } +/* Optimize font loading */ @font-face { font-family: 'Poppins'; font-style: normal; font-weight: 400; font-display: swap; + font-preload: true; src: url('../fonts/poppins/poppins-regular.woff2') format('woff2'); } +/* Critical CSS for above-the-fold content */ body { font-family: 'Poppins', ui-sans-serif, system-ui, sans-serif; @apply text-gray-800; -} \ No newline at end of file + /* Optimize text rendering */ + text-rendering: optimizeSpeed; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* Optimize images */ +img { + max-width: 100%; + height: auto; +} + +/* Optimize animations */ +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + } +} diff --git a/resources/js/app.js b/resources/js/app.js index 2b1e019..5cbb46f 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -15,4 +15,4 @@ Alpine.data('navigation', () => ({ }, })) -Alpine.start() \ No newline at end of file +Alpine.start() diff --git a/resources/views/app/about-us/index.blade.php b/resources/views/app/about-us/index.blade.php index c0ed588..e19355d 100644 --- a/resources/views/app/about-us/index.blade.php +++ b/resources/views/app/about-us/index.blade.php @@ -7,14 +7,13 @@- {{ __('components.docuware.showme.teaser') }} -
- -+ {{ __('components.docuware.showme.teaser') }} +
+/', '
', $htmlContent); +@endphp + +