Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .cursor/rules/laravel-boost.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ The Laravel Boost guidelines are specifically curated by Laravel maintainers for
## Foundational Context
This application is a Laravel application and its main Laravel ecosystems package & versions are below. You are an expert with them all. Ensure you abide by these specific packages & versions.

- php - 8.4.19
- php - 8.4.20
- filament/filament (FILAMENT) - v5
- laravel/cashier (CASHIER) - v15
- laravel/framework (LARAVEL) - v12
Expand Down
2 changes: 1 addition & 1 deletion .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ The Laravel Boost guidelines are specifically curated by Laravel maintainers for
## Foundational Context
This application is a Laravel application and its main Laravel ecosystems package & versions are below. You are an expert with them all. Ensure you abide by these specific packages & versions.

- php - 8.4.19
- php - 8.4.20
- filament/filament (FILAMENT) - v5
- laravel/cashier (CASHIER) - v15
- laravel/framework (LARAVEL) - v12
Expand Down
2 changes: 1 addition & 1 deletion .junie/guidelines.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ The Laravel Boost guidelines are specifically curated by Laravel maintainers for
## Foundational Context
This application is a Laravel application and its main Laravel ecosystems package & versions are below. You are an expert with them all. Ensure you abide by these specific packages & versions.

- php - 8.4.19
- php - 8.4.20
- filament/filament (FILAMENT) - v5
- laravel/cashier (CASHIER) - v15
- laravel/framework (LARAVEL) - v12
Expand Down
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ The Laravel Boost guidelines are specifically curated by Laravel maintainers for
## Foundational Context
This application is a Laravel application and its main Laravel ecosystems package & versions are below. You are an expert with them all. Ensure you abide by these specific packages & versions.

- php - 8.4.19
- php - 8.4.20
- filament/filament (FILAMENT) - v5
- laravel/cashier (CASHIER) - v15
- laravel/framework (LARAVEL) - v12
Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ The Laravel Boost guidelines are specifically curated by Laravel maintainers for
## Foundational Context
This application is a Laravel application and its main Laravel ecosystems package & versions are below. You are an expert with them all. Ensure you abide by these specific packages & versions.

- php - 8.4.19
- php - 8.4.20
- filament/filament (FILAMENT) - v5
- laravel/cashier (CASHIER) - v15
- laravel/framework (LARAVEL) - v12
Expand Down
9 changes: 8 additions & 1 deletion app/Livewire/LeadSubmissionForm.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ class LeadSubmissionForm extends Component

public string $description = '';

public string $budget = '';

public string $turnstileToken = '';

#[Locked]
Expand All @@ -33,6 +35,7 @@ protected function rules(): array
'email' => ['required', 'email', 'max:255'],
'company' => ['required', 'string', 'max:255'],
'description' => ['required', 'string', 'max:5000'],
'budget' => ['required', 'string', 'in:'.implode(',', array_keys(Lead::BUDGETS))],
];

if (config('services.turnstile.secret_key')) {
Expand All @@ -45,6 +48,7 @@ protected function rules(): array
public function messages(): array
{
return [
'budget.in' => 'Please select a budget range.',
'turnstileToken.required' => 'Please complete the security check.',
];
}
Expand All @@ -69,6 +73,7 @@ public function submit(): void
'email' => $this->email,
'company' => $this->company,
'description' => $this->description,
'budget' => $this->budget,
'ip_address' => request()->ip(),
]);

Expand All @@ -82,6 +87,8 @@ public function submit(): void

public function render()
{
return view('livewire.lead-submission-form');
return view('livewire.lead-submission-form', [
'budgets' => Lead::BUDGETS,
]);
}
}
2 changes: 1 addition & 1 deletion app/Notifications/NewLeadSubmitted.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public function via(object $notifiable): array
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->subject('New Consulting Enquiry: '.$this->lead->company)
->subject('New App Build Enquiry: '.$this->lead->company)
->replyTo($this->lead->email, $this->lead->name)
->greeting('New lead received!')
->line("**Name:** {$this->lead->name}")
Expand Down
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

161 changes: 161 additions & 0 deletions resources/views/build-my-app.blade.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
<x-layout title="Build My App">
@push('head')
<style>html { scroll-behavior: smooth; }</style>
@if (config('services.turnstile.site_key'))
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
@endif
@endpush

<div class="mx-auto max-w-5xl">
{{-- Hero --}}
<section class="mt-12">
<div class="text-center">
<h1
x-init="
() => {
motion.inView($el, (element) => {
motion.animate(
$el,
{
opacity: [0, 1],
x: [-10, 0],
},
{
duration: 0.7,
ease: motion.easeOut,
},
)
})
}
"
class="text-4xl md:text-5xl"
>
<span class="text-[#99ceb2] dark:text-indigo-500">{</span>
<span class="font-bold">Build My App</span>
<span class="text-[#99ceb2] dark:text-indigo-500">}</span>
</h1>

<p
x-init="
() => {
motion.inView($el, (element) => {
motion.animate(
$el,
{
opacity: [0, 1],
x: [10, 0],
},
{
duration: 0.7,
ease: motion.easeOut,
},
)
})
}
"
class="mx-auto mt-6 max-w-2xl text-lg text-gray-600 dark:text-zinc-400"
>
Got an app idea? Let's build it together. The NativePHP core team partners with founders and businesses
to design, build, and ship cross-platform apps with PHP and Laravel.
</p>
</div>
</section>

{{-- What We Build --}}
<section class="mt-20">
<div
x-init="
() => {
motion.inView($el, (element) => {
motion.animate(
Array.from($el.children),
{
y: [10, 0],
opacity: [0, 1],
scale: [0.9, 1],
},
{
duration: 0.7,
ease: motion.backOut,
delay: motion.stagger(0.1),
},
)
})
}
"
class="grid gap-6 md:grid-cols-3"
>
<div class="rounded-2xl bg-gray-100 p-6 text-center dark:bg-[#1a1a2e]">
<div class="mx-auto grid size-12 place-items-center rounded-full bg-white text-black ring-1 ring-black/5 dark:bg-gray-900 dark:text-white dark:ring-white/10">
<x-icons.device-mobile-phone class="size-6" />
</div>
<h3 class="mt-4 text-lg font-semibold">Mobile Apps</h3>
<p class="mt-2 text-sm text-gray-600 dark:text-zinc-400">
iOS and Android apps built with NativePHP for Mobile, ready for the App Store and Play Store.
</p>
</div>

<div class="rounded-2xl bg-gray-100 p-6 text-center dark:bg-[#1a1a2e]">
<div class="mx-auto grid size-12 place-items-center rounded-full bg-white text-black ring-1 ring-black/5 dark:bg-gray-900 dark:text-white dark:ring-white/10">
<x-icons.pc class="size-6" />
</div>
<h3 class="mt-4 text-lg font-semibold">Desktop Apps</h3>
<p class="mt-2 text-sm text-gray-600 dark:text-zinc-400">
Native desktop apps for macOS, Windows, and Linux using NativePHP for Desktop.
</p>
</div>

<div class="rounded-2xl bg-gray-100 p-6 text-center dark:bg-[#1a1a2e]">
<div class="mx-auto grid size-12 place-items-center rounded-full bg-white text-black ring-1 ring-black/5 dark:bg-gray-900 dark:text-white dark:ring-white/10">
<x-heroicon-o-rocket-launch class="size-6" />
</div>
<h3 class="mt-4 text-lg font-semibold">End-to-End Delivery</h3>
<p class="mt-2 text-sm text-gray-600 dark:text-zinc-400">
From idea and design through to launch, marketing, and ongoing iteration. We sweat the details.
</p>
</div>
</div>
</section>

{{-- Form --}}
<section id="enquiry-form" class="mt-24 scroll-mt-24 pb-24">
<h2
x-init="
() => {
motion.inView($el, (element) => {
motion.animate(
$el,
{
opacity: [0, 1],
x: [-10, 0],
},
{
duration: 0.7,
ease: motion.easeOut,
},
)
})
}
"
class="text-center text-3xl font-semibold"
>
Tell Us About Your App
</h2>
<p class="mx-auto mt-4 max-w-2xl text-center text-gray-600 dark:text-zinc-400">
Share your idea and rough budget. We'll be in touch to plan the next steps.
</p>

<div class="mx-auto mt-8 max-w-2xl rounded-2xl bg-gray-100 p-8 dark:bg-[#1a1a2e] md:p-12">
<livewire:lead-submission-form />
</div>

<p class="mx-auto mt-6 max-w-2xl text-center text-sm text-gray-500 dark:text-gray-400">
Just need a quick technical session?
<a href="{{ route('consulting') }}" class="font-medium text-blue-600 hover:underline dark:text-blue-400">
Book a consulting slot
</a>
instead.
</p>
</section>
</div>
</x-layout>
11 changes: 11 additions & 0 deletions resources/views/components/footer.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,17 @@ class="inline-block px-px py-1.5 transition duration-300 will-change-transform h
</span>
</a>
</li>
<li>
<a
href="{{ route('build-my-app') }}"
class="inline-block px-px py-1.5 transition duration-300 will-change-transform hover:translate-x-1 hover:text-gray-700 dark:hover:text-gray-300"
>
<span class="inline-flex items-center gap-1.5">
Build
<span class="rounded-full bg-emerald-500 px-1.5 py-px text-[10px] font-bold leading-tight text-white">New</span>
</span>
</a>
</li>
<li>
<a
href="{{ route('course') }}"
Expand Down
27 changes: 27 additions & 0 deletions resources/views/components/navbar/mobile-menu.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ class="@md:grid-cols-3 grid grid-cols-2 text-xl"
$isBlogActive = request()->routeIs('blog*');
$isPartnersActive = request()->routeIs('partners*');
$isServicesActive = request()->routeIs('consulting');
$isBuildActive = request()->routeIs('build-my-app');
$isCourseActive = request()->routeIs('course');
$isSupportActive = request()->routeIs('support.*');
$isSponsorActive = request()->routeIs('sponsoring*');
Expand Down Expand Up @@ -257,6 +258,32 @@ class="size-4 shrink-0"
</a>
</div>

{{-- Build Link (mobile only, shown in navbar on desktop) --}}
<div class="lg:hidden">
<a
href="{{ route('build-my-app') }}"
@class([
'flex items-center gap-2 py-3 transition duration-200',
'font-medium' => $isBuildActive,
'opacity-70 hover:translate-x-1 hover:opacity-100 dark:opacity-50' => ! $isBuildActive,
])
aria-current="{{ $isBuildActive ? 'page' : 'false' }}"
>
@if ($isBuildActive)
<x-icons.right-arrow
class="size-4 shrink-0"
aria-hidden="true"
focusable="false"
/>
@endif

<div class="inline-flex items-center gap-2">
Build
<span class="rounded-full bg-emerald-500 px-1.5 py-px text-[10px] font-bold leading-tight text-white">New</span>
</div>
</a>
</div>

{{-- Course Link (mobile only, shown in navbar on desktop) --}}
<div class="lg:hidden">
<a
Expand Down
10 changes: 9 additions & 1 deletion resources/views/components/navigation-bar.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ class="-mt-px size-3.5"
{{-- Ultra link (desktop only) --}}
<a
href="{{ route('pricing') }}"
class="hidden items-center gap-1.5 rounded-full bg-violet-500/10 px-3 py-1.5 text-sm font-medium text-violet-600 transition duration-200 hover:bg-violet-500/20 lg:inline-flex dark:text-violet-400 dark:hover:bg-violet-500/20"
class="hidden items-center gap-1.5 rounded-full bg-orange-500/10 px-3 py-1.5 text-sm font-medium text-orange-600 transition duration-200 hover:bg-orange-500/20 lg:inline-flex dark:text-orange-400 dark:hover:bg-orange-500/20"
>
Ultra
</a>
Expand All @@ -102,6 +102,14 @@ class="hidden items-center gap-1.5 rounded-full bg-blue-500/10 px-3 py-1.5 text-
Consulting
</a>

{{-- Build link (desktop only) --}}
<a
href="{{ route('build-my-app') }}"
class="hidden items-center gap-1.5 rounded-full bg-violet-500/10 px-3 py-1.5 text-sm font-medium text-violet-600 transition duration-200 hover:bg-violet-500/20 lg:inline-flex dark:text-violet-400 dark:hover:bg-violet-500/20"
>
Build
</a>

{{-- Bifrost button (visible on large screens) --}}
<div class="hidden lg:block">
<x-bifrost-button small />
Expand Down
Loading
Loading