From 8a68d64ad0941ea01924e1af2b5d802c75be74a6 Mon Sep 17 00:00:00 2001 From: Simon Hamp Date: Wed, 8 Jul 2026 12:12:49 +0100 Subject: [PATCH 1/2] feat(the-vibes): add Jump24 sponsor, event logo, schedule & prospectus partners - Add Jump24 as a sponsor on /the-vibes (new logo component) - Extract the sponsor grid into a shared, data-driven component so /the-vibes and the prospectus share one source of truth - Prospectus: add a "Current Partners" logo wall and a "Food & Venue Partners" in-kind callout - Add "The Vibes" logo (light/dark variants) to both page headers - Add an event-day Schedule section to /the-vibes (centered timeline) - Point the sponsor CTA to the prospectus instead of a mailto - Add feature tests covering the pages, logo, schedule and CTA Co-Authored-By: Claude Opus 4.8 (1M context) --- public/img/the-vibes/logo-dark.svg | 12 + public/img/the-vibes/logo.svg | 12 + .../sponsors/logos/jump24.blade.php | 9 + .../sponsors/vibes-partners.blade.php | 115 +++++++ .../views/the-vibes-prospectus.blade.php | 72 ++++- resources/views/the-vibes.blade.php | 291 ++++++++---------- tests/Feature/TheVibesTest.php | 115 +++++++ 7 files changed, 455 insertions(+), 171 deletions(-) create mode 100644 public/img/the-vibes/logo-dark.svg create mode 100644 public/img/the-vibes/logo.svg create mode 100644 resources/views/components/sponsors/logos/jump24.blade.php create mode 100644 resources/views/components/sponsors/vibes-partners.blade.php create mode 100644 tests/Feature/TheVibesTest.php diff --git a/public/img/the-vibes/logo-dark.svg b/public/img/the-vibes/logo-dark.svg new file mode 100644 index 00000000..cd8e3539 --- /dev/null +++ b/public/img/the-vibes/logo-dark.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/img/the-vibes/logo.svg b/public/img/the-vibes/logo.svg new file mode 100644 index 00000000..aae80ddb --- /dev/null +++ b/public/img/the-vibes/logo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/resources/views/components/sponsors/logos/jump24.blade.php b/resources/views/components/sponsors/logos/jump24.blade.php new file mode 100644 index 00000000..757c9949 --- /dev/null +++ b/resources/views/components/sponsors/logos/jump24.blade.php @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/resources/views/components/sponsors/vibes-partners.blade.php b/resources/views/components/sponsors/vibes-partners.blade.php new file mode 100644 index 00000000..1b8119ae --- /dev/null +++ b/resources/views/components/sponsors/vibes-partners.blade.php @@ -0,0 +1,115 @@ +@php + $partners = [ + [ + 'url' => 'https://www.webmavens.com/?ref=nativephp', + 'name' => 'Web Mavens', + 'component' => 'sponsors.logos.webmavens', + 'class' => 'dark:fill-white', + ], + [ + 'url' => 'https://www.nexcalia.com/?ref=nativephp', + 'name' => 'Nexcalia', + 'component' => 'sponsors.logos.nexcalia', + 'class' => 'text-black dark:text-white', + ], + [ + 'url' => 'https://bifrost.nativephp.com/', + 'name' => 'Bifrost Technology', + 'component' => 'logos.bifrost', + 'class' => 'h-6', + ], + [ + 'url' => 'https://beyondco.de/?utm_source=nativephp&utm_medium=logo&utm_campaign=the-vibes', + 'name' => 'Beyond Code', + 'image' => '/img/sponsors/beyondcode.webp', + 'imageDark' => '/img/sponsors/beyondcode-dark.webp', + 'width' => 160, + 'height' => 40, + ], + [ + 'url' => 'https://mostlytechnical.com/', + 'name' => 'Mostly Technical', + 'image' => '/img/sponsors/mostly-technical.webp', + 'class' => 'h-15 w-15 rounded', + 'width' => 60, + 'height' => 60, + ], + [ + 'url' => 'https://www.geocod.io/?utm_source=nativephp&utm_medium=sponsorship&utm_campaign=thevibes', + 'name' => 'Geocodio', + 'component' => 'sponsors.logos.geocodio', + ], + [ + 'url' => 'https://thephp.foundation/?utm_source=nativephp&utm_medium=sponsorship&utm_campaign=thevibes', + 'name' => 'The PHP Foundation', + 'component' => 'sponsors.logos.php-foundation', + 'class' => 'h-15 w-15 rounded', + ], + [ + 'url' => 'https://artisan.build/?utm_source=nativephp&utm_medium=sponsorship&utm_campaign=thevibes', + 'name' => 'Artisan Build', + 'image' => '/img/sponsors/artisan-build.webp', + 'imageDark' => '/img/sponsors/artisan-build-dark.webp', + 'width' => 160, + 'height' => 20, + ], + [ + 'url' => 'https://nopticon.com/?ref=nativephp', + 'name' => 'Nopticon', + 'component' => 'sponsors.logos.nopticon', + 'class' => 'text-black dark:text-white', + ], + [ + 'url' => 'https://jump24.co.uk/?ref=nativephp', + 'name' => 'Jump24', + 'component' => 'sponsors.logos.jump24', + 'class' => 'h-10 text-black dark:text-white', + ], + ]; +@endphp + +@foreach ($partners as $partner) + +
+ @if (isset($partner['component'])) +
+ {{ $partner['name'] }} +
+@endforeach diff --git a/resources/views/the-vibes-prospectus.blade.php b/resources/views/the-vibes-prospectus.blade.php index 2d5bee7e..13e4a5e8 100644 --- a/resources/views/the-vibes-prospectus.blade.php +++ b/resources/views/the-vibes-prospectus.blade.php @@ -7,9 +7,22 @@ PARTNER PROSPECTUS · 2026

-

- The - Vibes +

+ The Vibes, hosted by NativePHP + +

@@ -122,6 +135,17 @@ + {{-- ═══ CURRENT PARTNERS ═══ --}} +

+

Already On Board

+

The partners already backing the first-ever NativePHP meetup. Join them.

+
+ +
+ +
+
+ {{-- ═══ PARTNERSHIP TIERS ═══ --}}

Partnership Tiers

@@ -230,6 +254,48 @@
+ {{-- ═══ IN-KIND PARTNERS: FOOD & VENUE ═══ --}} +
+
+
+
+

Now Seeking

+

Food & Venue Partners

+

+ Beyond the tiers above, we're looking for in-kind partners to help feed and host the room. + Cover the catering or provide the venue and we'll give you headline-level recognition to + match — prominent logo placement, day-of call-outs, and our lasting gratitude. +

+
+ + + + + Food & Drink Partner + + + + + + + Venue Partner + +
+
+ + + + + + Discuss a Partnership + +
+
+
+ {{-- ═══ CONTACT / CTA ═══ --}}

Let's Make

diff --git a/resources/views/the-vibes.blade.php b/resources/views/the-vibes.blade.php index d8b4d9c3..48c88659 100644 --- a/resources/views/the-vibes.blade.php +++ b/resources/views/the-vibes.blade.php @@ -75,10 +75,23 @@ class="inline-flex items-center gap-2 rounded-full bg-violet-100 px-4 py-1.5 tex }) } " - class="mt-5 text-4xl font-extrabold md:text-5xl lg:text-6xl" + class="mt-5" > - The - Vibes + The Vibes, hosted by NativePHP + + {{-- Subtitle --}} @@ -767,7 +780,7 @@ class="mt-10 grid gap-6 md:grid-cols-2"
- {{-- Sponsors Section --}} + {{-- Schedule Section --}}

- Sponsored By + Schedule

+

+ A full day of talks, great food, and time to build together. +

+ + @php + $schedule = [ + ['time' => '9:00', 'title' => 'Doors open & Breakfast', 'detail' => 'Coffee and pastries in The Assembly'], + ['time' => '9:30', 'title' => 'The Future is Here', 'detail' => 'Simon & Shane', 'highlight' => true], + ['time' => '11:00', 'title' => 'Coffee break'], + ['time' => '11:15', 'title' => 'Lightning talks', 'detail' => 'Special guests'], + ['time' => '12:00', 'title' => 'Lunch', 'detail' => 'The Atrium'], + ['time' => '13:00', 'title' => 'Chill, network, vibecode, hack'], + ['time' => '17:00', 'title' => 'Close'], + ]; + @endphp +
- {{-- Web Mavens --}} - -
-
- Web Mavens -
- - {{-- Nexcalia --}} - -
-
- Nexcalia -
- - {{-- Bifrost Technology --}} - -
- -
- Bifrost Technology -
- - {{-- Beyond Code --}} - -
- BeyondCode logo - -
- Beyond Code -
- - {{-- Mostly Technical --}} - -
- Mostly Technical logo -
- Mostly Technical -
+ @foreach ($schedule as $item) +
+ {{-- Time --}} +
+ +
- {{-- Geocodio --}} - -
-
- Geocodio -
+ {{-- Rail --}} +
+ $loop->first, + 'bg-gray-200 dark:bg-white/10' => ! $loop->first, + ])> + $item['highlight'] ?? false, + 'border-2 border-violet-400 bg-white dark:border-violet-500/60 dark:bg-[#050714]' => ! ($item['highlight'] ?? false), + ])> + $loop->last, + 'bg-gray-200 dark:bg-white/10' => ! $loop->last, + ])> +
- {{-- The PHP Foundation --}} - -
-
- The PHP Foundation -
+ @endforeach +
+
- {{-- Artisan Build --}} - -
- Artisan Build logo - -
- Artisan Build -
+ {{-- Sponsors Section --}} +
+

+ Sponsored By +

- {{-- Nopticon --}} - -
-
- Nopticon -
+
+
{{-- Become a Sponsor CTA --}} @@ -1002,14 +954,17 @@ class="mt-8 text-center" Interested in sponsoring The Vibes?

- - + + + + + - Get in Touch + View the Prospectus
diff --git a/tests/Feature/TheVibesTest.php b/tests/Feature/TheVibesTest.php new file mode 100644 index 00000000..3211ab90 --- /dev/null +++ b/tests/Feature/TheVibesTest.php @@ -0,0 +1,115 @@ +get(route('the-vibes')); + + $response->assertStatus(200); + $response->assertSee('Jump24'); + $response->assertSee('jump24.co.uk'); + } + + /** @test */ + public function the_vibes_page_still_lists_existing_sponsors(): void + { + $response = $this->get(route('the-vibes')); + + $response->assertSee('Web Mavens'); + $response->assertSee('Nexcalia'); + $response->assertSee('Nopticon'); + } + + /** @test */ + public function prospectus_shows_current_partners_including_jump24(): void + { + $response = $this->get(route('the-vibes-prospectus')); + + $response->assertStatus(200); + $response->assertSee('Already On Board'); + $response->assertSee('Jump24'); + $response->assertSee('jump24.co.uk'); + $response->assertSee('Web Mavens'); + } + + /** @test */ + public function prospectus_advertises_food_and_venue_partners(): void + { + $response = $this->get(route('the-vibes-prospectus')); + + $response->assertSee('Food & Venue Partners'); + $response->assertSee('Food & Drink Partner'); + $response->assertSee('Venue Partner'); + } + + /** @test */ + public function both_pages_render_the_vibes_header_logo(): void + { + foreach (['the-vibes', 'the-vibes-prospectus'] as $route) { + $this->get(route($route)) + ->assertOk() + ->assertSee('/img/the-vibes/logo.svg') + ->assertSee('/img/the-vibes/logo-dark.svg') + ->assertSee('The Vibes, hosted by NativePHP'); + } + } + + /** @test */ + public function header_logo_assets_exist(): void + { + $this->assertFileExists(public_path('img/the-vibes/logo.svg')); + $this->assertFileExists(public_path('img/the-vibes/logo-dark.svg')); + } + + /** @test */ + public function the_vibes_sponsor_cta_links_to_the_prospectus(): void + { + $response = $this->get(route('the-vibes')); + + $response->assertOk(); + $response->assertSee('Interested in sponsoring The Vibes?'); + $response->assertSee('View the Prospectus'); + $response->assertSee(route('the-vibes-prospectus'), false); + $response->assertDontSee('The%20Vibes%20-%20Sponsorship%20Inquiry'); + } + + /** @test */ + public function the_vibes_page_shows_the_event_schedule(): void + { + $response = $this->get(route('the-vibes')); + + $response->assertOk(); + $response->assertSee('Schedule'); + $response->assertSee('9:00'); + $response->assertSee('Doors open & Breakfast'); + $response->assertSee('Coffee and pastries in The Assembly'); + $response->assertSee('The Future is Here'); + $response->assertSee('Simon & Shane'); + $response->assertSee('Lightning talks'); + $response->assertSee('Special guests'); + $response->assertSee('Lunch'); + $response->assertSee('The Atrium'); + $response->assertSee('Chill, network, vibecode, hack'); + $response->assertSee('17:00'); + } +} From 241de1be5139395f1d9f833124fd3fb81d0500d9 Mon Sep 17 00:00:00 2001 From: Simon Hamp Date: Wed, 8 Jul 2026 15:49:44 +0100 Subject: [PATCH 2/2] feat(the-vibes): add PhpStorm sponsor; remove Vibes feature tests - Add PhpStorm (JetBrains) as a sponsor via the shared vibes-partners component, so it appears on both /the-vibes and the prospectus - Add PhpStorm logo assets (light + dark wordmark variants) - Remove tests/Feature/TheVibesTest.php Co-Authored-By: Claude Opus 4.8 (1M context) --- public/img/sponsors/phpstorm-dark.svg | 20 +++ public/img/sponsors/phpstorm.svg | 20 +++ .../sponsors/vibes-partners.blade.php | 8 ++ tests/Feature/TheVibesTest.php | 115 ------------------ 4 files changed, 48 insertions(+), 115 deletions(-) create mode 100644 public/img/sponsors/phpstorm-dark.svg create mode 100644 public/img/sponsors/phpstorm.svg delete mode 100644 tests/Feature/TheVibesTest.php diff --git a/public/img/sponsors/phpstorm-dark.svg b/public/img/sponsors/phpstorm-dark.svg new file mode 100644 index 00000000..19408e54 --- /dev/null +++ b/public/img/sponsors/phpstorm-dark.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/public/img/sponsors/phpstorm.svg b/public/img/sponsors/phpstorm.svg new file mode 100644 index 00000000..ce562bae --- /dev/null +++ b/public/img/sponsors/phpstorm.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/resources/views/components/sponsors/vibes-partners.blade.php b/resources/views/components/sponsors/vibes-partners.blade.php index 1b8119ae..670fe8bf 100644 --- a/resources/views/components/sponsors/vibes-partners.blade.php +++ b/resources/views/components/sponsors/vibes-partners.blade.php @@ -65,6 +65,14 @@ 'component' => 'sponsors.logos.jump24', 'class' => 'h-10 text-black dark:text-white', ], + [ + 'url' => 'https://www.jetbrains.com/phpstorm/?utm_source=nativephp&utm_medium=sponsorship&utm_campaign=thevibes', + 'name' => 'PhpStorm', + 'image' => '/img/sponsors/phpstorm.svg', + 'imageDark' => '/img/sponsors/phpstorm-dark.svg', + 'width' => 275, + 'height' => 79, + ], ]; @endphp diff --git a/tests/Feature/TheVibesTest.php b/tests/Feature/TheVibesTest.php deleted file mode 100644 index 3211ab90..00000000 --- a/tests/Feature/TheVibesTest.php +++ /dev/null @@ -1,115 +0,0 @@ -get(route('the-vibes')); - - $response->assertStatus(200); - $response->assertSee('Jump24'); - $response->assertSee('jump24.co.uk'); - } - - /** @test */ - public function the_vibes_page_still_lists_existing_sponsors(): void - { - $response = $this->get(route('the-vibes')); - - $response->assertSee('Web Mavens'); - $response->assertSee('Nexcalia'); - $response->assertSee('Nopticon'); - } - - /** @test */ - public function prospectus_shows_current_partners_including_jump24(): void - { - $response = $this->get(route('the-vibes-prospectus')); - - $response->assertStatus(200); - $response->assertSee('Already On Board'); - $response->assertSee('Jump24'); - $response->assertSee('jump24.co.uk'); - $response->assertSee('Web Mavens'); - } - - /** @test */ - public function prospectus_advertises_food_and_venue_partners(): void - { - $response = $this->get(route('the-vibes-prospectus')); - - $response->assertSee('Food & Venue Partners'); - $response->assertSee('Food & Drink Partner'); - $response->assertSee('Venue Partner'); - } - - /** @test */ - public function both_pages_render_the_vibes_header_logo(): void - { - foreach (['the-vibes', 'the-vibes-prospectus'] as $route) { - $this->get(route($route)) - ->assertOk() - ->assertSee('/img/the-vibes/logo.svg') - ->assertSee('/img/the-vibes/logo-dark.svg') - ->assertSee('The Vibes, hosted by NativePHP'); - } - } - - /** @test */ - public function header_logo_assets_exist(): void - { - $this->assertFileExists(public_path('img/the-vibes/logo.svg')); - $this->assertFileExists(public_path('img/the-vibes/logo-dark.svg')); - } - - /** @test */ - public function the_vibes_sponsor_cta_links_to_the_prospectus(): void - { - $response = $this->get(route('the-vibes')); - - $response->assertOk(); - $response->assertSee('Interested in sponsoring The Vibes?'); - $response->assertSee('View the Prospectus'); - $response->assertSee(route('the-vibes-prospectus'), false); - $response->assertDontSee('The%20Vibes%20-%20Sponsorship%20Inquiry'); - } - - /** @test */ - public function the_vibes_page_shows_the_event_schedule(): void - { - $response = $this->get(route('the-vibes')); - - $response->assertOk(); - $response->assertSee('Schedule'); - $response->assertSee('9:00'); - $response->assertSee('Doors open & Breakfast'); - $response->assertSee('Coffee and pastries in The Assembly'); - $response->assertSee('The Future is Here'); - $response->assertSee('Simon & Shane'); - $response->assertSee('Lightning talks'); - $response->assertSee('Special guests'); - $response->assertSee('Lunch'); - $response->assertSee('The Atrium'); - $response->assertSee('Chill, network, vibecode, hack'); - $response->assertSee('17:00'); - } -}