From e40ba1efa78a20e1b2026f7bf4bddfb87cb3cbd9 Mon Sep 17 00:00:00 2001 From: Simon Hamp Date: Wed, 29 Jan 2025 16:04:09 +0000 Subject: [PATCH 001/251] Fix logo --- public/logo.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/logo.svg b/public/logo.svg index 4feba779..2b60ec2a 100644 --- a/public/logo.svg +++ b/public/logo.svg @@ -1,6 +1,6 @@ - + From 5b50b2c078dec19606bbdbeb4753c386ba63df6c Mon Sep 17 00:00:00 2001 From: Simon Hamp Date: Wed, 29 Jan 2025 16:08:25 +0000 Subject: [PATCH 002/251] More logo fixes --- public/logo-dark.svg | 2 +- resources/views/welcome.blade.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/logo-dark.svg b/public/logo-dark.svg index e0cf79fb..9e1b33e5 100644 --- a/public/logo-dark.svg +++ b/public/logo-dark.svg @@ -1,6 +1,6 @@ - + diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php index 921b2aa0..8b71d8fe 100644 --- a/resources/views/welcome.blade.php +++ b/resources/views/welcome.blade.php @@ -25,7 +25,7 @@
- +

NativePHP

NativePHP is a new way to build native applications, From 58beb37c235e4fe5b2e1308a81236dd62e06bd42 Mon Sep 17 00:00:00 2001 From: Eser DENIZ Date: Sat, 1 Feb 2025 11:00:04 +0100 Subject: [PATCH 003/251] style: new background (#81) --- resources/assets/bg.svg | 405 ++++++++++++++++++++++++++++++++++++++++ resources/css/app.css | 12 +- 2 files changed, 411 insertions(+), 6 deletions(-) create mode 100644 resources/assets/bg.svg diff --git a/resources/assets/bg.svg b/resources/assets/bg.svg new file mode 100644 index 00000000..b27f86a1 --- /dev/null +++ b/resources/assets/bg.svg @@ -0,0 +1,405 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/css/app.css b/resources/css/app.css index d2c3d212..d7d940a4 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -12,14 +12,14 @@ } .background-pattern { - background-image: url('../assets/background-pattern.svg'); + background-image: url('../assets/bg.svg'); } -@media(prefers-color-scheme: dark) { - .background-pattern { - background-image: url('../assets/background-pattern-dark.svg'); - } -} +/*@media(prefers-color-scheme: dark) {*/ +/* .background-pattern {*/ +/* background-image: url('../assets/background-pattern-dark.svg');*/ +/* }*/ +/*}*/ /* Whole menu */ From 4c69127f56f0bcf297f1d788df90ae58eca4179a Mon Sep 17 00:00:00 2001 From: Simon Hamp Date: Mon, 3 Feb 2025 16:26:05 +0100 Subject: [PATCH 004/251] NativePHP for iOS commit 98a6168ff79a5ac85027775bfd274b2e34199ebc Merge: 115fd50 9838f1d Author: Simon Hamp Date: Sun Feb 2 10:55:16 2025 +0100 Merge branch 'mobile-documentation' into mobile-documentation-simon commit 115fd50819f5583046709f6f355f75978324da27 Author: Simon Hamp Date: Sat Feb 1 21:31:11 2025 +0000 Notifications commit 912081696dac908ed686b45075704448b6efa562 Author: Simon Hamp Date: Sat Feb 1 21:28:31 2025 +0000 Dialogs commit 1a62132db923e3671e71f933b08c59d7d1b24949 Author: Simon Hamp Date: Sat Feb 1 21:20:10 2025 +0000 Update desktop docs commit 21b83f3a77ebf7c80f3e527b5d135b7843265536 Author: Simon Hamp Date: Sat Feb 1 21:19:54 2025 +0000 Add mobile docs commit 9838f1d756d4dab51a5cc5e363c35c72f87eb02e Author: Eser DENIZ Date: Sat Feb 1 13:35:54 2025 +0100 fix: bug very large screen commit e4154c621b87013dba388e36809151a1caf216db Author: Eser DENIZ Date: Mon Jan 27 17:06:08 2025 +0100 refactor: linting commit 4e55fa4bd9c34d339cb08a1176869248fd7a1d22 Author: Eser DENIZ Date: Mon Jan 27 17:05:43 2025 +0100 feat: seo title commit ddcbbfa9efba13eb0ba09b53a22bb72fb035b380 Author: Eser DENIZ Date: Mon Jan 27 17:00:21 2025 +0100 feat: separating platforms into two distinct folders commit 33d61ffd65e0b3278ecf34498188d36282279a98 Author: Eser DENIZ Date: Sun Jan 26 23:48:35 2025 +0100 feat: mobile/desktop docs --- .../ShowDocumentationController.php | 42 +++--- package-lock.json | 2 +- .../icons/computer-desktop.blade.php | 4 + .../icons/monitor-smartphone.blade.php | 1 + .../icons/tablet-smartphone.blade.php | 1 + .../components/platform-switcher.blade.php | 21 +++ .../sidebar-left-navigation.blade.php | 9 +- .../views/docs/{ => desktop}/1/_index.md | 0 .../{ => desktop}/1/digging-deeper/_index.md | 0 .../1/digging-deeper/broadcasting.md | 0 .../1/digging-deeper/child-processes.md | 6 +- .../1/digging-deeper/databases.md | 18 +-- .../{ => desktop}/1/digging-deeper/files.md | 0 .../1/digging-deeper/php-binaries.md | 0 .../{ => desktop}/1/digging-deeper/queues.md | 0 .../1/digging-deeper/security.md | 3 + .../{ => desktop}/1/getting-started/_index.md | 0 .../1/getting-started/configuration.md | 0 .../1/getting-started/debugging.md | 0 .../1/getting-started/development.md | 0 .../1/getting-started/env-files.md | 0 .../1/getting-started/installation.md | 3 +- .../1/getting-started/introduction.md | 25 ++-- .../1/getting-started/sponsoring.md | 0 .../{ => desktop}/1/getting-started/status.md | 2 +- .../docs/{ => desktop}/1/publishing/_index.md | 0 .../{ => desktop}/1/publishing/building.md | 0 .../{ => desktop}/1/publishing/publishing.md | 0 .../{ => desktop}/1/publishing/updating.md | 0 .../docs/{ => desktop}/1/testing/_index.md | 0 .../docs/{ => desktop}/1/testing/basics.md | 0 .../{ => desktop}/1/testing/child-process.md | 0 .../1/testing/global-shortcut.md | 0 .../{ => desktop}/1/testing/power-monitor.md | 0 .../{ => desktop}/1/testing/queue-worker.md | 0 .../docs/{ => desktop}/1/testing/windows.md | 0 .../docs/{ => desktop}/1/the-basics/_index.md | 0 .../1/the-basics/app-lifecycle.md | 0 .../1/the-basics/application-menu.md | 0 .../{ => desktop}/1/the-basics/clipboard.md | 0 .../{ => desktop}/1/the-basics/dialogs.md | 0 .../1/the-basics/global-hotkeys.md | 0 .../{ => desktop}/1/the-basics/menu-bar.md | 0 .../1/the-basics/notifications.md | 0 .../1/the-basics/power-monitor.md | 0 .../{ => desktop}/1/the-basics/screens.md | 0 .../{ => desktop}/1/the-basics/settings.md | 0 .../docs/{ => desktop}/1/the-basics/shell.md | 0 .../docs/{ => desktop}/1/the-basics/system.md | 0 .../{ => desktop}/1/the-basics/windows.md | 0 resources/views/docs/mobile/1/_index.md | 0 .../docs/mobile/1/digging-deeper/_index.md | 4 + .../mobile/1/digging-deeper/broadcasting.md | 6 + .../docs/mobile/1/digging-deeper/databases.md | 33 +++++ .../docs/mobile/1/digging-deeper/files.md | 6 + .../docs/mobile/1/digging-deeper/security.md | 30 ++++ .../docs/mobile/1/getting-started/_index.md | 4 + .../mobile/1/getting-started/configuration.md | 6 + .../mobile/1/getting-started/debugging.md | 6 + .../mobile/1/getting-started/development.md | 7 + .../mobile/1/getting-started/env-files.md | 6 + .../mobile/1/getting-started/installation.md | 94 ++++++++++++ .../mobile/1/getting-started/introduction.md | 53 +++++++ .../docs/mobile/1/getting-started/status.md | 15 ++ .../views/docs/mobile/1/the-basics/_index.md | 4 + .../docs/mobile/1/the-basics/app-lifecycle.md | 6 + .../views/docs/mobile/1/the-basics/dialogs.md | 37 +++++ .../docs/mobile/1/the-basics/notifications.md | 30 ++++ .../views/docs/mobile/1/the-basics/system.md | 140 ++++++++++++++++++ routes/web.php | 7 +- 70 files changed, 578 insertions(+), 53 deletions(-) create mode 100644 resources/views/components/icons/computer-desktop.blade.php create mode 100644 resources/views/components/icons/monitor-smartphone.blade.php create mode 100644 resources/views/components/icons/tablet-smartphone.blade.php create mode 100644 resources/views/components/platform-switcher.blade.php rename resources/views/docs/{ => desktop}/1/_index.md (100%) rename resources/views/docs/{ => desktop}/1/digging-deeper/_index.md (100%) rename resources/views/docs/{ => desktop}/1/digging-deeper/broadcasting.md (100%) rename resources/views/docs/{ => desktop}/1/digging-deeper/child-processes.md (95%) rename resources/views/docs/{ => desktop}/1/digging-deeper/databases.md (86%) rename resources/views/docs/{ => desktop}/1/digging-deeper/files.md (100%) rename resources/views/docs/{ => desktop}/1/digging-deeper/php-binaries.md (100%) rename resources/views/docs/{ => desktop}/1/digging-deeper/queues.md (100%) rename resources/views/docs/{ => desktop}/1/digging-deeper/security.md (99%) rename resources/views/docs/{ => desktop}/1/getting-started/_index.md (100%) rename resources/views/docs/{ => desktop}/1/getting-started/configuration.md (100%) rename resources/views/docs/{ => desktop}/1/getting-started/debugging.md (100%) rename resources/views/docs/{ => desktop}/1/getting-started/development.md (100%) rename resources/views/docs/{ => desktop}/1/getting-started/env-files.md (100%) rename resources/views/docs/{ => desktop}/1/getting-started/installation.md (94%) rename resources/views/docs/{ => desktop}/1/getting-started/introduction.md (72%) rename resources/views/docs/{ => desktop}/1/getting-started/sponsoring.md (100%) rename resources/views/docs/{ => desktop}/1/getting-started/status.md (97%) rename resources/views/docs/{ => desktop}/1/publishing/_index.md (100%) rename resources/views/docs/{ => desktop}/1/publishing/building.md (100%) rename resources/views/docs/{ => desktop}/1/publishing/publishing.md (100%) rename resources/views/docs/{ => desktop}/1/publishing/updating.md (100%) rename resources/views/docs/{ => desktop}/1/testing/_index.md (100%) rename resources/views/docs/{ => desktop}/1/testing/basics.md (100%) rename resources/views/docs/{ => desktop}/1/testing/child-process.md (100%) rename resources/views/docs/{ => desktop}/1/testing/global-shortcut.md (100%) rename resources/views/docs/{ => desktop}/1/testing/power-monitor.md (100%) rename resources/views/docs/{ => desktop}/1/testing/queue-worker.md (100%) rename resources/views/docs/{ => desktop}/1/testing/windows.md (100%) rename resources/views/docs/{ => desktop}/1/the-basics/_index.md (100%) rename resources/views/docs/{ => desktop}/1/the-basics/app-lifecycle.md (100%) rename resources/views/docs/{ => desktop}/1/the-basics/application-menu.md (100%) rename resources/views/docs/{ => desktop}/1/the-basics/clipboard.md (100%) rename resources/views/docs/{ => desktop}/1/the-basics/dialogs.md (100%) rename resources/views/docs/{ => desktop}/1/the-basics/global-hotkeys.md (100%) rename resources/views/docs/{ => desktop}/1/the-basics/menu-bar.md (100%) rename resources/views/docs/{ => desktop}/1/the-basics/notifications.md (100%) rename resources/views/docs/{ => desktop}/1/the-basics/power-monitor.md (100%) rename resources/views/docs/{ => desktop}/1/the-basics/screens.md (100%) rename resources/views/docs/{ => desktop}/1/the-basics/settings.md (100%) rename resources/views/docs/{ => desktop}/1/the-basics/shell.md (100%) rename resources/views/docs/{ => desktop}/1/the-basics/system.md (100%) rename resources/views/docs/{ => desktop}/1/the-basics/windows.md (100%) create mode 100644 resources/views/docs/mobile/1/_index.md create mode 100644 resources/views/docs/mobile/1/digging-deeper/_index.md create mode 100644 resources/views/docs/mobile/1/digging-deeper/broadcasting.md create mode 100644 resources/views/docs/mobile/1/digging-deeper/databases.md create mode 100644 resources/views/docs/mobile/1/digging-deeper/files.md create mode 100644 resources/views/docs/mobile/1/digging-deeper/security.md create mode 100644 resources/views/docs/mobile/1/getting-started/_index.md create mode 100644 resources/views/docs/mobile/1/getting-started/configuration.md create mode 100644 resources/views/docs/mobile/1/getting-started/debugging.md create mode 100644 resources/views/docs/mobile/1/getting-started/development.md create mode 100644 resources/views/docs/mobile/1/getting-started/env-files.md create mode 100644 resources/views/docs/mobile/1/getting-started/installation.md create mode 100644 resources/views/docs/mobile/1/getting-started/introduction.md create mode 100644 resources/views/docs/mobile/1/getting-started/status.md create mode 100644 resources/views/docs/mobile/1/the-basics/_index.md create mode 100644 resources/views/docs/mobile/1/the-basics/app-lifecycle.md create mode 100644 resources/views/docs/mobile/1/the-basics/dialogs.md create mode 100644 resources/views/docs/mobile/1/the-basics/notifications.md create mode 100644 resources/views/docs/mobile/1/the-basics/system.md diff --git a/app/Http/Controllers/ShowDocumentationController.php b/app/Http/Controllers/ShowDocumentationController.php index f5d11b06..fef533f7 100644 --- a/app/Http/Controllers/ShowDocumentationController.php +++ b/app/Http/Controllers/ShowDocumentationController.php @@ -20,42 +20,42 @@ class ShowDocumentationController extends Controller { - public function __invoke(Request $request, string $version, ?string $page = null) + public function __invoke(Request $request, string $platform, string $version, ?string $page = null) { if (config('app.env') === 'local') { Cache::flush(); } - abort_unless(is_dir(resource_path('views/docs/'.$version)), 404); + abort_unless(is_dir(resource_path('views/docs/'.$platform.'/'.$version)), 404); session(['viewing_docs_version' => $version]); + session(['viewing_docs_platform' => $platform]); - $navigation = Cache::remember("docs_nav_{$version}", now()->addDay(), function () use ($version) { - return $this->getNavigation($version); - }); + $navigation = Cache::remember("docs_nav_{$platform}_{$version}", now()->addDay(), + fn () => $this->getNavigation($platform, $version) + ); if (is_null($page)) { return $this->redirectToFirstNavigationPage($navigation); } try { - $pageProperties = Cache::remember("docs_{$version}_{$page}", now()->addDay(), - function () use ($version, $page) { - return $this->getPageProperties($version, $page); - }); + $pageProperties = Cache::remember("docs_{$platform}_{$version}_{$page}", now()->addDay(), + fn () => $this->getPageProperties($platform, $version, $page) + ); } catch (InvalidArgumentException $e) { return $this->redirectToFirstNavigationPage($navigation, $page); } - SEOTools::setTitle($pageProperties['title']); + SEOTools::setTitle($pageProperties['title'].' - NativePHP '.$platform.' v'.$version); SEOTools::setDescription(Arr::exists($pageProperties, 'description') ? $pageProperties['description'] : ''); return view('docs.index')->with($pageProperties); } - protected function getPageProperties($version, $page = null): array + protected function getPageProperties($platform, $version, $page = null): array { - $markdownFileName = $version.'.'.($page ?? 'index'); + $markdownFileName = $platform.'.'.$version.'.'.($page ?? 'index'); $content = $this->getMarkdownView("docs.{$markdownFileName}", [ 'user' => auth()->user(), @@ -64,16 +64,17 @@ protected function getPageProperties($version, $page = null): array $document = YamlFrontMatter::parse($content); $pageProperties = $document->matter(); - $versionProperties = YamlFrontMatter::parseFile(resource_path("views/docs/{$version}/_index.md")); + $versionProperties = YamlFrontMatter::parseFile(resource_path("views/docs/{$platform}/{$version}/_index.md")); $pageProperties = array_merge($pageProperties, $versionProperties->matter()); + $pageProperties['platform'] = $platform; $pageProperties['version'] = $version; $pageProperties['pagePath'] = request()->path(); - $pageProperties['content'] = CommonMark::convertToHtml($document->body(), $version); + $pageProperties['content'] = CommonMark::convertToHtml($document->body()); $pageProperties['tableOfContents'] = $this->extractTableOfContents($document->body()); - $navigation = $this->getNavigation($version); + $navigation = $this->getNavigation($platform, $version); $pageProperties['navigation'] = Menu::build($navigation, function (Menu $menu, $nav) { if (array_key_exists('path', $nav)) { $menu->link($nav['path'], $nav['title']); @@ -110,7 +111,7 @@ protected function getPageProperties($version, $page = null): array ->setActive(\request()->path()) ->__toString(); - $pageProperties['editUrl'] = "https://github.com/NativePHP/nativephp.com/tree/main/resources/views/docs/{$version}/{$page}.md"; + $pageProperties['editUrl'] = "https://github.com/NativePHP/nativephp.com/tree/main/resources/views/docs/{$platform}/{$version}/{$page}.md"; // Find the next & previous page in the navigation $pageProperties['nextPage'] = null; @@ -149,10 +150,10 @@ protected function getPageProperties($version, $page = null): array return $pageProperties; } - protected function getNavigation(string $version): array + protected function getNavigation(string $platform, string $version): array { $basePath = resource_path('views'); - $path = "$basePath/docs/$version"; + $path = "$basePath/docs/$platform/$version"; $mainNavigation = (new Finder) ->files() @@ -238,7 +239,6 @@ protected function extractTableOfContents(string $document): array // Only search for level 2 and 3 headings. return ! Str::startsWith($line, '## ') && ! Str::startsWith($line, '### '); }) - ->map(function (string $line) { return [ 'level' => strlen(trim(Str::before($line, '# '))) + 1, @@ -259,9 +259,9 @@ protected function extractTitle(string $document): string return $matches[1] ?? ''; } - protected function markdownViewExists($version, $page): bool + protected function markdownViewExists($platform, $version, $page): bool { - $markdownFileName = $version.'.'.($page ?? 'index'); + $markdownFileName = $platform.'.'.$version.'.'.($page ?? 'index'); try { $this->getMarkdownView("docs.{$markdownFileName}", [ diff --git a/package-lock.json b/package-lock.json index b42e3336..3a1513f8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "fork-nativephp.com", + "name": "nativephp.com", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/resources/views/components/icons/computer-desktop.blade.php b/resources/views/components/icons/computer-desktop.blade.php new file mode 100644 index 00000000..7a1f9c0a --- /dev/null +++ b/resources/views/components/icons/computer-desktop.blade.php @@ -0,0 +1,4 @@ + + + + diff --git a/resources/views/components/icons/monitor-smartphone.blade.php b/resources/views/components/icons/monitor-smartphone.blade.php new file mode 100644 index 00000000..57c11860 --- /dev/null +++ b/resources/views/components/icons/monitor-smartphone.blade.php @@ -0,0 +1 @@ + diff --git a/resources/views/components/icons/tablet-smartphone.blade.php b/resources/views/components/icons/tablet-smartphone.blade.php new file mode 100644 index 00000000..6856b5a7 --- /dev/null +++ b/resources/views/components/icons/tablet-smartphone.blade.php @@ -0,0 +1 @@ + diff --git a/resources/views/components/platform-switcher.blade.php b/resources/views/components/platform-switcher.blade.php new file mode 100644 index 00000000..6d735e4d --- /dev/null +++ b/resources/views/components/platform-switcher.blade.php @@ -0,0 +1,21 @@ +@php + $isMobile = request()->is('docs/mobile/*'); + $href= $isMobile ? '/docs/desktop/1' : '/docs/mobile/1'; +@endphp + +
class(['mb-6 p-3 text-sm space-y-2.5 rounded-md + text-gray-600 bg-gray-50/85 border border-gray-200 + dark:text-gray-300 dark:bg-gray-800 dark:border-none + ']) }}> +
You're reading the documentation of NativePHP for {{ $isMobile? 'mobile' : 'desktop' }}.
+ + @if($isMobile) + + Switch to desktop + @else + + Switch to mobile + @endif + + +
diff --git a/resources/views/components/sidebar-left-navigation.blade.php b/resources/views/components/sidebar-left-navigation.blade.php index 4e06eb34..c2881318 100644 --- a/resources/views/components/sidebar-left-navigation.blade.php +++ b/resources/views/components/sidebar-left-navigation.blade.php @@ -11,7 +11,9 @@ border-r border-[#00aaa6] border-opacity-10 dark:border-gray-800 dark:text-gray-200 "> -

Development of NativePHP for iOS has already started
and you can get access right now!

- Join the Early Access Program by
becoming a sponsor at $250 (one-off) or above. + Join the Early Access Program by
purchasing a license $250 + $200.

+ +

Laracon EU exclusive 20% off!

+

Until midnight UTC 2025-02-06

+ @@ -40,7 +45,7 @@ class="rounded-md bg-teal-500 px-8 py-4 text-2xl font-semibold text-white shadow

Why Join the Early Access Program?

Up to now, NativePHP has focused on Windows, Mac, and Linux. But we believe that breaking the mobile - frontier is what makes the project truly compelling... and cross-platform. + frontier is what makes the project truly compelling... and truly cross-platform.

With significant progress already made towards enabling @@ -83,7 +88,6 @@ class="rounded-md bg-teal-500 px-8 py-4 text-2xl font-semibold text-white shadow

Program Benefits

- {{--

Quis tellus eget adipiscing convallis sit sit eget aliquet quis. Suspendisse eget egestas a elementum pulvinar et feugiat blandit at. In mi viverra elit nunc.

--}}
@@ -108,8 +112,8 @@ class="rounded-md bg-teal-500 px-8 py-4 text-2xl font-semibold text-white shadow

- Decide the direction of the project and what gets worked on next. Plus have a direct - line of with the creators of NativePHP and other EAP members. + Decide the direction of the project and what gets implemented next. Plus a direct + line to the creators of NativePHP and other EAP members.

@@ -122,7 +126,7 @@ class="rounded-md bg-teal-500 px-8 py-4 text-2xl font-semibold text-white shadow

The NativePHP ecosystem is about to explode! There will be premium tools and - packages, starter kits and more. As an EAP member, you'll get you exclusive discounts + packages, starter kits and more. As an EAP member, you'll get exclusive discounts not available to anyone else.

@@ -137,14 +141,14 @@ class="rounded-md bg-teal-500 px-8 py-4 text-2xl font-semibold text-white shadow

All EAP members will be immortalized across the NativePHP ecosystem, showing the rest of the community the valuable part you've played in supporting this project's - creation and and ongoing development. + creation and ongoing development.

- From 9a8bd77e2690be08411ed40c103608c64cef8ee5 Mon Sep 17 00:00:00 2001 From: Simon Hamp Date: Tue, 4 Feb 2025 13:55:36 +0100 Subject: [PATCH 007/251] Update installation.md --- .../views/docs/mobile/1/getting-started/installation.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/resources/views/docs/mobile/1/getting-started/installation.md b/resources/views/docs/mobile/1/getting-started/installation.md index 96c4ad01..df83aff3 100644 --- a/resources/views/docs/mobile/1/getting-started/installation.md +++ b/resources/views/docs/mobile/1/getting-started/installation.md @@ -12,7 +12,9 @@ Apple's tooling for building iOS apps requires that you compile your application 1. PHP 8.3+ 2. Laravel 10 or higher 3. An Apple Silicon Mac running macOS 12+ with Xcode 16+ -4. An active [Apple Developer account]() +4. An active [Apple Developer account](https://developer.apple.com/) +5. [A NativePHP for iOS license](https://checkout.anystack.sh/nativephp-ios) +6. _Optional_ iOS device You don't _need_ a physical iOS device to compile your application and test it for iOS, as NativePHP for mobile supports the iOS Simulator. However, we highly recommend that you test your application on a real device before submitting to the @@ -34,7 +36,7 @@ To make NativePHP for mobile a reality has taken a lot of work and will continue it's not open source and you are not free to distribute or modify its source code. Before you begin, you will need to purchase a license. -Licenses can be obtained via [Anystack](https://nativephp.anystack.sh). +Licenses can be obtained via [Anystack](https://checkout.anystack.sh/nativephp-ios). Instructions on how to prepare your application to use this private package are made available to you after purchase. From da7336a70f4c380473d6ceb7747db7ec95117ad1 Mon Sep 17 00:00:00 2001 From: Simon Hamp Date: Fri, 7 Feb 2025 15:02:50 +0100 Subject: [PATCH 008/251] End Laracon sale --- resources/views/early-adopter.blade.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/resources/views/early-adopter.blade.php b/resources/views/early-adopter.blade.php index 09198fdc..0b18ca0e 100644 --- a/resources/views/early-adopter.blade.php +++ b/resources/views/early-adopter.blade.php @@ -11,14 +11,12 @@ Android is coming! -

- Development of NativePHP for iOS has already started
and you can get access right now!

- Join the Early Access Program by
purchasing a license $250 - $200. +

+ Development of NativePHP for iOS has already started and you can get access right now!

+ Join the Early Access Program by purchasing a license.

-

Laracon EU exclusive 20% off!

-

Until midnight UTC 2025-02-06

+

Annual license — $250

Date: Mon, 10 Feb 2025 17:08:21 +0000 Subject: [PATCH 009/251] Fix opengraph data --- config/seotools.php | 16 +++++++++------- public/img/og.png | Bin 0 -> 62880 bytes resources/views/welcome.blade.php | 3 ++- 3 files changed, 11 insertions(+), 8 deletions(-) create mode 100644 public/img/og.png diff --git a/config/seotools.php b/config/seotools.php index 062d06d4..28c15a59 100644 --- a/config/seotools.php +++ b/config/seotools.php @@ -12,7 +12,7 @@ 'defaults' => [ 'title' => 'NativePHP', // set false to total remove 'titleBefore' => false, // Put defaults.title before page title, like 'It's Over 9000! - Dashboard' - 'description' => 'Turn your Laravel app into a desktop app', // set false to total remove + 'description' => 'Turn your Laravel apps into native desktop and mobile apps', // set false to total remove 'separator' => ' - ', 'keywords' => [], 'canonical' => false, // Set to null or 'full' to use Url::full(), set to 'current' to use Url::current(), set false to total remove @@ -37,12 +37,14 @@ * The default configurations to be used by the opengraph generator. */ 'defaults' => [ - 'title' => 'Herd', // set false to total remove - 'description' => 'Launch Laravel faster than ever before.', // set false to total remove - 'url' => false, // Set null for using Url::current(), set false to total remove + 'title' => 'NativePHP', // set false to total remove + 'description' => 'Build native applications, with the tools you already know.', // set false to total remove + 'url' => null, // Set null for using Url::current(), set false to total remove 'type' => false, 'site_name' => false, - 'images' => [], + 'images' => [ + asset('img/og.png'), + ], ], ], 'twitter' => [ @@ -59,8 +61,8 @@ * The default configurations to be used by the json-ld generator. */ 'defaults' => [ - 'title' => 'Herd', // set false to total remove - 'description' => 'Launch Laravel faster than ever before.', // set false to total remove + 'title' => 'NativePHP', // set false to total remove + 'description' => 'Build native applications, with the tools you already know.', // set false to total remove 'url' => false, // Set to null or 'full' to use Url::full(), set to 'current' to use Url::current(), set false to total remove 'type' => 'WebPage', 'images' => [], diff --git a/public/img/og.png b/public/img/og.png new file mode 100644 index 0000000000000000000000000000000000000000..4a80491724cc272a0032d88357a93fd60b79d1df GIT binary patch literal 62880 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 literal 0 HcmV?d00001 diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php index 8b71d8fe..c6e12175 100644 --- a/resources/views/welcome.blade.php +++ b/resources/views/welcome.blade.php @@ -5,7 +5,8 @@ NativePHP | Baking Delicious Native Apps - + {!! OpenGraph::generate() !!} + {!! Twitter::generate() !!} Date: Mon, 10 Feb 2025 17:24:03 +0000 Subject: [PATCH 010/251] Remove asset helper --- config/seotools.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/seotools.php b/config/seotools.php index 28c15a59..0b9d92d2 100644 --- a/config/seotools.php +++ b/config/seotools.php @@ -43,7 +43,7 @@ 'type' => false, 'site_name' => false, 'images' => [ - asset('img/og.png'), + '/img/og.png', ], ], ], From 61d858e691c3b79c253bf5ae38948d383be8d5e6 Mon Sep 17 00:00:00 2001 From: Peter Bishop <9081809+PeteBishwhip@users.noreply.github.com> Date: Fri, 14 Feb 2025 11:22:39 +0000 Subject: [PATCH 011/251] Include link to awesome-nativephp repo (#82) - Added a link to https://github.com/NativePHP/awesome-nativephp --- resources/views/docs/desktop/1/getting-started/introduction.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/views/docs/desktop/1/getting-started/introduction.md b/resources/views/docs/desktop/1/getting-started/introduction.md index 2e03a8d1..cf52de92 100644 --- a/resources/views/docs/desktop/1/getting-started/introduction.md +++ b/resources/views/docs/desktop/1/getting-started/introduction.md @@ -61,6 +61,8 @@ that puts cowboy hats on every smiley-face emoji it sees. (You should totally build that last one.) +Need some inspiration? [Check out our repository of awesome projects](https://github.com/NativePHP/awesome-nativephp) created by people like you! + ## What's next? Go read the docs! We've tried to make them as comprehensive as possible, but if you find something missing, please From 7ddb84fb54007f189eb2b7a6df93b62527e8ff1d Mon Sep 17 00:00:00 2001 From: Simon Hamp Date: Mon, 17 Feb 2025 14:03:31 +0000 Subject: [PATCH 012/251] Update ios installation instructions --- .../mobile/1/getting-started/installation.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/resources/views/docs/mobile/1/getting-started/installation.md b/resources/views/docs/mobile/1/getting-started/installation.md index df83aff3..919b3853 100644 --- a/resources/views/docs/mobile/1/getting-started/installation.md +++ b/resources/views/docs/mobile/1/getting-started/installation.md @@ -38,17 +38,31 @@ it's not open source and you are not free to distribute or modify its source cod Before you begin, you will need to purchase a license. Licenses can be obtained via [Anystack](https://checkout.anystack.sh/nativephp-ios). -Instructions on how to prepare your application to use this private package are made available to you after purchase. +Once you have your license, you will need to add the following to your `composer.json`: + +```json +"repositories": [ + { + "type": "composer", + "url": "https://nativephp-ios.composer.sh" + } +], +``` ## Install NativePHP for iOS ```shell composer require nativephp/ios ``` - This package contains all the libraries, classes, commands, and interfaces that your application will need to work with iOS. +If this is the first time you're installing the package, you will be prompted to authenticate. + +Your username is the email address you registered with Anystack. + +Your password is your license key. + ## Run the NativePHP installer ```shell From 3d624498a09a0464119d0c43db798d9e3e2a90e2 Mon Sep 17 00:00:00 2001 From: Simon Hamp Date: Fri, 21 Feb 2025 12:21:19 +0000 Subject: [PATCH 013/251] PHP is great --- .../docs/desktop/1/getting-started/introduction.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/resources/views/docs/desktop/1/getting-started/introduction.md b/resources/views/docs/desktop/1/getting-started/introduction.md index cf52de92..b28ae448 100644 --- a/resources/views/docs/desktop/1/getting-started/introduction.md +++ b/resources/views/docs/desktop/1/getting-started/introduction.md @@ -14,7 +14,18 @@ Whatever your path, we think you're going to be productive quickly. NativePHP is taking the world by storm, enabling PHP developers to create true cross-platform, native apps using the tools and technologies they already know: HTML, CSS, Javascript, and, of course, PHP. -And they said PHP was dead. +## Why PHP? + +**PHP is great.** It's a mature language that has been honed for 30 years in one of the most ruthless environments: +the web. + +Despite the odds, it remains one of the most used languages worldwide and continues to grow in usage every day. + +Its shared-nothing approach to memory safety makes it an unexpectedly productive candidate for building native +applications. + +Its focus on HTTP as a paradigm for building applications lends itself towards using the incredibly +accessible web technologies to build rich UIs that can feel at home on any platform. ## What exactly is NativePHP? From 24853886d4c9a4ac21de249f9b0616f5f5439c57 Mon Sep 17 00:00:00 2001 From: Simon Hamp Date: Sun, 23 Feb 2025 16:31:56 +0000 Subject: [PATCH 014/251] Change /ios to /mobile --- resources/views/components/alert.blade.php | 2 +- .../views/docs/desktop/1/getting-started/sponsoring.md | 6 +++--- resources/views/early-adopter.blade.php | 5 +++-- routes/web.php | 3 ++- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/resources/views/components/alert.blade.php b/resources/views/components/alert.blade.php index 91ff09be..f668487c 100644 --- a/resources/views/components/alert.blade.php +++ b/resources/views/components/alert.blade.php @@ -1,6 +1,6 @@ diff --git a/resources/views/docs/desktop/1/getting-started/sponsoring.md b/resources/views/docs/desktop/1/getting-started/sponsoring.md index 0162a5f9..89137da6 100644 --- a/resources/views/docs/desktop/1/getting-started/sponsoring.md +++ b/resources/views/docs/desktop/1/getting-started/sponsoring.md @@ -26,10 +26,10 @@ goes a long way in defraying the expenses of working for free to keep this proje Together, we can continue to grow NativePHP and ensure it remains a valuable tool for the community. -## Early Access Program +## NativePHP for mobile -If you're interested in NativePHP for mobile, you can get access right now via the [Early Access Program](/ios). We are -already working on NativePHP for iOS and your support will help us speed up development. +If you're interested in NativePHP for mobile, you can get access right now via the [Early Access Program](/mobile). +NativePHP is already working on iOS and Android is in active development. Your support will help us continue. ## Corporate Partners diff --git a/resources/views/early-adopter.blade.php b/resources/views/early-adopter.blade.php index 0b18ca0e..15617930 100644 --- a/resources/views/early-adopter.blade.php +++ b/resources/views/early-adopter.blade.php @@ -12,7 +12,8 @@ is coming!

- Development of NativePHP for iOS has already started and you can get access right now!

+ Development of NativePHP for mobile has already started and you can get access + and start building apps right now!

Join the Early Access Program by purchasing a license.

@@ -47,7 +48,7 @@ class="rounded-md bg-teal-500 px-8 py-4 text-2xl font-semibold text-white shadow

With significant progress already made towards enabling - NativePHP on iOS, we are excited about the possibilities that lie ahead. + NativePHP for mobile, we are excited about the possibilities that lie ahead.

However, to make this vision a reality for both iOS and Android, we need your support. diff --git a/routes/web.php b/routes/web.php index 054cc114..4c1d00c9 100644 --- a/routes/web.php +++ b/routes/web.php @@ -19,7 +19,8 @@ Route::redirect('/sponsor', '/docs/1/getting-started/sponsoring'); Route::view('/', 'welcome')->name('welcome'); -Route::view('ios', 'early-adopter')->name('early-adopter'); +Route::view('mobile', 'early-adopter')->name('early-adopter'); +Route::redirect('ios', 'mobile'); Route::redirect('/docs/{version}/{page?}', '/docs/desktop/{version}/{page?}') ->where('page', '(.*)') From 1bb00dc7aa70a8d0881c70799c84bf8395232058 Mon Sep 17 00:00:00 2001 From: Pete Bishop Date: Tue, 25 Feb 2025 10:42:04 +0000 Subject: [PATCH 015/251] Implement Support Policy - Updated AppServiceProvider to share social links to all views - Implemented new page for desktop docs to provide overview of support policy --- app/Providers/AppServiceProvider.php | 11 ++++++- .../views/components/header-banner.blade.php | 8 ++--- .../1/getting-started/support-policy.md | 33 +++++++++++++++++++ 3 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 resources/views/docs/desktop/1/getting-started/support-policy.md diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 452e6b65..d87eefc8 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,6 +2,7 @@ namespace App\Providers; +use Illuminate\Support\Facades\View; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider @@ -11,7 +12,7 @@ class AppServiceProvider extends ServiceProvider */ public function register(): void { - // + $this->registerSharedViewVariables(); } /** @@ -21,4 +22,12 @@ public function boot(): void { // } + + private function registerSharedViewVariables() + { + View::share('discordLink', 'https://discord.gg/X62tWNStZK'); + View::share('bskyLink', 'https://bsky.app/profile/nativephp.bsky.social'); + View::share('openCollectiveLink', 'https://opencollective.com/nativephp'); + View::share('githubLink', 'https://github.com/NativePHP'); + } } diff --git a/resources/views/components/header-banner.blade.php b/resources/views/components/header-banner.blade.php index 50a1c4d3..e4ebc690 100644 --- a/resources/views/components/header-banner.blade.php +++ b/resources/views/components/header-banner.blade.php @@ -34,19 +34,19 @@ class="inline-flex items-center transition rounded hover:text-white/80 focus:out

diff --git a/resources/views/docs/desktop/1/getting-started/support-policy.md b/resources/views/docs/desktop/1/getting-started/support-policy.md new file mode 100644 index 00000000..85b0686c --- /dev/null +++ b/resources/views/docs/desktop/1/getting-started/support-policy.md @@ -0,0 +1,33 @@ +--- +title: Support Policy +order: 500 +--- + +## Support Policy + +NativePHP for Desktop is an open-source project dedicated to providing robust and reliable releases. + +We are committed to supporting the two latest PHP versions, ensuring that our users benefit from the latest features, security updates, and performance improvements. + +__We do not remove support for a PHP version without a major version release.__ + +Additionally, we support each Laravel version until it reaches its official end of life (EOL), ensuring that your applications can remain up-to-date. + +Our support policy reflects our commitment to maintaining high standards of quality and security, providing our users with the confidence they need to build and deploy their applications using NativePHP for Desktop. + +### PHP Versions +| NativePHP Version | Supported PHP Versions | +|-------------------|------------------------| +| 1.0.0 and earlier | 8.2, 8.3, 8.4 | + +NativePHP provides methods of bundling your own static PHP binaries. Support is not provided for these. + +### Laravel Versions +| NativePHP Version | Supported PHP Versions | +|-------------------|------------------------| +| 1.0.0 and earlier | 11.x, 12.x | + +## Requesting Support +Support can be obtained by opening an issue on the [NativePHP/laravel]({{ $githubLink }}/laravel/issues) repository or by joining the [Discord]({{ $discordLink }}). + +When requesting support, it is requested that you are using a supported version. If you are not, you will be asked to upgrade to a supported version before any support is provided. From c3623f346acb32fe8d7889063634684e532c0bb6 Mon Sep 17 00:00:00 2001 From: Pete Bishop Date: Tue, 25 Feb 2025 11:55:23 +0000 Subject: [PATCH 016/251] Links to support policies --- app/Providers/AppServiceProvider.php | 2 +- .../docs/desktop/1/getting-started/support-policy.md | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index d87eefc8..efdb3cf0 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -23,7 +23,7 @@ public function boot(): void // } - private function registerSharedViewVariables() + private function registerSharedViewVariables(): void { View::share('discordLink', 'https://discord.gg/X62tWNStZK'); View::share('bskyLink', 'https://bsky.app/profile/nativephp.bsky.social'); diff --git a/resources/views/docs/desktop/1/getting-started/support-policy.md b/resources/views/docs/desktop/1/getting-started/support-policy.md index 85b0686c..8ecf3036 100644 --- a/resources/views/docs/desktop/1/getting-started/support-policy.md +++ b/resources/views/docs/desktop/1/getting-started/support-policy.md @@ -18,14 +18,18 @@ Our support policy reflects our commitment to maintaining high standards of qual ### PHP Versions | NativePHP Version | Supported PHP Versions | |-------------------|------------------------| -| 1.0.0 and earlier | 8.2, 8.3, 8.4 | +| ^1.0 | 8.3, 8.4 | + +[PHP: Supported Versions](https://www.php.net/supported-versions.php) NativePHP provides methods of bundling your own static PHP binaries. Support is not provided for these. ### Laravel Versions | NativePHP Version | Supported PHP Versions | |-------------------|------------------------| -| 1.0.0 and earlier | 11.x, 12.x | +| ^1.0 | 11.x, 12.x | + +[Laravel: Support Policy](https://laravel.com/docs/master/releases#support-policy) ## Requesting Support Support can be obtained by opening an issue on the [NativePHP/laravel]({{ $githubLink }}/laravel/issues) repository or by joining the [Discord]({{ $discordLink }}). From ce40e1ed68c544f93338b8cfc8a83dae0181a1b7 Mon Sep 17 00:00:00 2001 From: Pete Bishop Date: Tue, 25 Feb 2025 12:16:41 +0000 Subject: [PATCH 017/251] Provide documentation on pre and postbuild hooks --- .../docs/desktop/1/publishing/building.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/resources/views/docs/desktop/1/publishing/building.md b/resources/views/docs/desktop/1/publishing/building.md index 18af3bdc..cb71d2d0 100644 --- a/resources/views/docs/desktop/1/publishing/building.md +++ b/resources/views/docs/desktop/1/publishing/building.md @@ -25,6 +25,25 @@ your app to provide automatic updates. You should build your application for each platform you intend to support and test it on each platform _before_ publishing to make sure that everything works as expected. +### Running commands before and after builds +Many applications rely on a tool such as [Vite](https://vitejs.dev/) or [Webpack](https://webpack.js.org/) to compile their CSS and JS assets before a production build. + +To facilitate this, NativePHP provides two hooks that you can use to run commands before and after the build process. + +To utilise these hooks, add the following to your `config/nativephp.php` file: + +```php +'prebuild' => [ + 'npm run build:js', // Run a command before the build + 'npm run build:css', // Run another command before the build +], +'postbuild' => [ + 'npm run release', // Run a command after the build +], +``` + +These commands will be run in the root of your project directory and you can specify as many as required. + ## Versioning For every build you create, you should change the version of your application in your app's `config/nativephp.php` file. From 80e4a92dc6608b0e8ea658fedca0720f236e8d49 Mon Sep 17 00:00:00 2001 From: Andreas Creten Date: Wed, 26 Feb 2025 12:41:52 +0100 Subject: [PATCH 018/251] Update Notifications docs (#83) * Update Notifications docs * Correct docs for ID instead of timestamp * Fix typo * Add examples of notification handling * Simplified --------- Co-authored-by: Simon Hamp --- .../desktop/1/the-basics/notifications.md | 135 ++++++++++++++++++ 1 file changed, 135 insertions(+) diff --git a/resources/views/docs/desktop/1/the-basics/notifications.md b/resources/views/docs/desktop/1/the-basics/notifications.md index f2406603..1e855efa 100644 --- a/resources/views/docs/desktop/1/the-basics/notifications.md +++ b/resources/views/docs/desktop/1/the-basics/notifications.md @@ -10,6 +10,7 @@ NativePHP allows you to send system notifications using an elegant PHP API. Thes When used sparingly, notifications can be a great way to inform the user about events that are occurring in your application and to bring their attention back to it, especially if further input from them is required. Notifications are sent using the `Notification` facade. + ```php use Native\Laravel\Facades\Notification; ``` @@ -40,8 +41,142 @@ Notification::title('Hello from NativePHP') ->show(); ``` +### Notification References + +To keep track of different notifications, you may use the notification's `$reference` property. + +By default, a unique reference is generated for you, but you may manually set a reference by [chaining the `reference()`](#notification-reference) method when creating +the notification. + +## Configuring Notifications + +### Notification Title + +You may set the notification's title using the `title()` method. + +```php +Notification::title('Hello from NativePHP') + ->show(); +``` + +### Notification Reference + +You can access the `$reference` property of a notification after it has been created: + +``` +$notification = Notification::title('Hello from NativePHP')->show(); + +$notification->reference; +``` + +You may chain the `reference()` method to set a custom reference when creating a notification: + +```php +Notification::title('Hello from NativePHP') + ->reference(Str::uuid()) + ->show(); +``` + +The reference will be sent along with any event triggered by the notification and can be used to track which specific notification was clicked: + +```php +use App\Events\PostNotificationClicked; +use App\Models\Post; + +Post::recentlyCreated() + ->get() + ->each(function(Post $post) { + Notification::title('New post: ' . $post->title) + ->reference($post->id) + ->event(PostNotificationClicked::class) + ->show(); + }); + +Event::listen(PostNotificationClicked::class, function (PostNotificationClicked $event) { + $post = Post::findOrFail($event->reference); + + Window::open()->url($post->url); +}); +``` + +### Notification Message + +You may set the notification's message using the `message()` method. + +```php +Notification::title('Hello from NativePHP') + ->message('This is a detail message coming from your Laravel app.') + ->show(); +``` + +### Notification Reply + +On macOS, you can allow the user to reply to a notification using the `hasReply()` method. + +```php +Notification::title('Hello from NativePHP') + ->hasReply() + ->show(); +``` + +The `hasReply()` method accepts a placeholder reply message as an argument. + +```php +Notification::title('Hello from NativePHP') + ->hasReply('This is a placeholder') + ->show(); +``` + +### Notification Actions + +On macOS, you can add action buttons to a notification using the `addAction()` method. + +```php +Notification::title('Hello from NativePHP') + ->addAction('Click here') + ->show(); +``` + +You can call the `addAction()` method multiple times if you need to add multiple buttons. + +```php +Notification::title('Hello from NativePHP') + ->addAction('Button One') + ->addAction('Button Two') + ->show(); +``` + +When an action button is clicked, it will trigger the [`NotificationActionClicked`](#codenotificationactionclickedcode) event. + +This event contains an `$index` property, which refers to the index of the action button that was clicked. Action button indexes start at `0`: + +```php +use Native\Laravel\Events\Notifications\NotificationActionClicked; + +Notification::title('Do you accept?') + ->addAction('Accept') // This action will be $index = 0 + ->addAction('Decline') // This action will be $index = 1 + ->show(); + +Event::listen(NotificationActionClicked::class, function (NotificationActionClicked $event) { + if ($event->index === 0) { + // 'Accept' clicked + } elseif ($event->index === 1) { + // 'Decline' clicked + } +}); +``` + ## Events ### `NotificationClicked` The `Native\Laravel\Events\Notifications\NotificationClicked` event is dispatched when a user clicks on a notification. +### `NotificationClosed` +The `Native\Laravel\Events\Notifications\NotificationClosed` event is dispatched when a user closes a notification. + +### `NotificationReply` +The `Native\Laravel\Events\Notifications\NotificationReply` event is dispatched when a user replies to a notification. + +### `NotificationActionClicked` +The `Native\Laravel\Events\Notifications\NotificationActionClicked` event is dispatched when a user clicks an action button on a notification. From bc3fb99e004f4b31954847ad8573494a53b4fe23 Mon Sep 17 00:00:00 2001 From: Peter Bishop <9081809+PeteBishwhip@users.noreply.github.com> Date: Wed, 26 Feb 2025 11:43:03 +0000 Subject: [PATCH 019/251] Update demo commands to legit use cases (#86) Co-authored-by: Pete Bishop --- resources/views/docs/desktop/1/publishing/building.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/views/docs/desktop/1/publishing/building.md b/resources/views/docs/desktop/1/publishing/building.md index cb71d2d0..d18b166c 100644 --- a/resources/views/docs/desktop/1/publishing/building.md +++ b/resources/views/docs/desktop/1/publishing/building.md @@ -34,8 +34,8 @@ To utilise these hooks, add the following to your `config/nativephp.php` file: ```php 'prebuild' => [ - 'npm run build:js', // Run a command before the build - 'npm run build:css', // Run another command before the build + 'npm run build', // Run a command before the build + 'php artisan optimize', // Run another command before the build ], 'postbuild' => [ 'npm run release', // Run a command after the build From e7a2d6b089a2a035a0bf20380d22b3546a1b5786 Mon Sep 17 00:00:00 2001 From: Simon Hamp Date: Wed, 26 Feb 2025 11:44:35 +0000 Subject: [PATCH 020/251] Add code block language --- resources/views/docs/desktop/1/the-basics/notifications.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/docs/desktop/1/the-basics/notifications.md b/resources/views/docs/desktop/1/the-basics/notifications.md index 1e855efa..f3ecf303 100644 --- a/resources/views/docs/desktop/1/the-basics/notifications.md +++ b/resources/views/docs/desktop/1/the-basics/notifications.md @@ -63,7 +63,7 @@ Notification::title('Hello from NativePHP') You can access the `$reference` property of a notification after it has been created: -``` +```php $notification = Notification::title('Hello from NativePHP')->show(); $notification->reference; From 4724574c710a767b605eeeb406b8a5be6b93c690 Mon Sep 17 00:00:00 2001 From: Daniel Haven Date: Sat, 8 Mar 2025 21:14:35 -0500 Subject: [PATCH 021/251] Add instructions for Torchlight --- .env.example | 2 ++ README.md | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/.env.example b/.env.example index 898fd326..6886b6d1 100644 --- a/.env.example +++ b/.env.example @@ -56,3 +56,5 @@ VITE_PUSHER_HOST="${PUSHER_HOST}" VITE_PUSHER_PORT="${PUSHER_PORT}" VITE_PUSHER_SCHEME="${PUSHER_SCHEME}" VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" + +TORCHLIGHT_TOKEN= diff --git a/README.md b/README.md index a8e3fadc..e418f74d 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,14 @@ We welcome any contributions to improve the documentation. Please feel free to o ## Issues Please raise any issues on the [NativePHP/laravel](https://github.com/NativePHP/laravel/issues) repo. + +## Torchlight + +The documentation uses [torchlight.dev](torchlight.dev) to generate a token. + +1. Create an account and then make a new API token [here](https://torchlight.dev/account/api-tokens). +2. Then set the API token in the .env. + +``` +TORCHLIGHT_TOKEN= +``` From a608db8b59c039998787e22f9a9f42a4c975756b Mon Sep 17 00:00:00 2001 From: Daniel Haven Date: Sun, 9 Mar 2025 09:24:00 -0400 Subject: [PATCH 022/251] Include note to update `minimum-stability` to "dev" (#87) --- resources/views/docs/desktop/1/getting-started/installation.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/views/docs/desktop/1/getting-started/installation.md b/resources/views/docs/desktop/1/getting-started/installation.md index d225825e..e711a85b 100644 --- a/resources/views/docs/desktop/1/getting-started/installation.md +++ b/resources/views/docs/desktop/1/getting-started/installation.md @@ -34,6 +34,8 @@ composer require nativephp/electron This package contains all the classes, commands, and interfaces that your application will need to work with the Electron runtime. +**Note**: If this fails, try setting the `minimum-stability` in your composer.json to "dev". NativePHP is in beta at this point in time. + ## Run the NativePHP installer ```shell From 1c8c1a5953b6d4c4034bb3306e281725ddc51309 Mon Sep 17 00:00:00 2001 From: Daniel Haven Date: Sun, 9 Mar 2025 14:09:43 -0400 Subject: [PATCH 023/251] Add a CONTRIBUTING.md and move Torchlight instructions --- CONTRIBUTING.md | 22 ++++++++++++++++++++++ README.md | 13 ++----------- 2 files changed, 24 insertions(+), 11 deletions(-) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..cc8a1a84 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,22 @@ +Thank you for contributing! + +## Getting Started + +Be sure to fork and clone the repo: `gh repo clone NativePHP/nativephp.com` + +Make a branch for what change you want to contribute and open a pull request to the upstream main branch. + +## Torchlight + +The documentation uses [torchlight.dev](torchlight.dev) for syntax highlighting. + +Without a token, you will run into an error on pages like "/docs/desktop/1/getting-started/introduction". + +To get set up: + +1. Create an account and then make a new API token [here](https://torchlight.dev/account/api-tokens). +2. Then set the API token in the .env. + +``` +TORCHLIGHT_TOKEN= +``` diff --git a/README.md b/README.md index e418f74d..8808870c 100644 --- a/README.md +++ b/README.md @@ -6,17 +6,8 @@ This repo contains the content of the nativephp.com website. We welcome any contributions to improve the documentation. Please feel free to open a PR. +Also, be sure to read our [contributing guidelines](CONTRIBUTING.md) for help getting set up. + ## Issues Please raise any issues on the [NativePHP/laravel](https://github.com/NativePHP/laravel/issues) repo. - -## Torchlight - -The documentation uses [torchlight.dev](torchlight.dev) to generate a token. - -1. Create an account and then make a new API token [here](https://torchlight.dev/account/api-tokens). -2. Then set the API token in the .env. - -``` -TORCHLIGHT_TOKEN= -``` From b1f2771c716f29c794de16ca74375fc6218e6608 Mon Sep 17 00:00:00 2001 From: HassanZahirnia Date: Sun, 16 Mar 2025 16:15:18 +0330 Subject: [PATCH 024/251] =?UTF-8?q?=E2=9C=A8=20Add=20Prettier=20configurat?= =?UTF-8?q?ion,=20update=20dependencies,=20and=20enhance=20project=20struc?= =?UTF-8?q?ture?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 54 +++++++-- .prettierignore | 3 + .prettierrc | 16 +++ package-lock.json | 262 +++++++++++++++++++++++++++++++++++++----- package.json | 25 ++-- resources/css/app.css | 39 +++---- resources/js/app.js | 55 ++++++++- resources/js/fonts.js | 1 + vite.config.js | 9 +- 9 files changed, 389 insertions(+), 75 deletions(-) create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 resources/js/fonts.js diff --git a/.gitignore b/.gitignore index 7fe978f8..9713846c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,19 +1,55 @@ +# php unit /.phpunit.cache +.phpunit.result.cache + +# auth +auth.json + +# node_modules /node_modules -/public/build + +# public /public/hot /public/storage +/public/build +/public/sitemap.xml + +# storage /storage/*.key + +# vendor /vendor -.env -.env.backup -.env.production -.phpunit.result.cache + +# ide +/.fleet +/.idea +/.vscode +_ide_helper* +.phpstorm.meta.php + +# .env +.env* + +# cache +*.cache + +# homestead Homestead.json Homestead.yaml -auth.json + +# docker +docker-compose.override.yml + +# package managers npm-debug.log yarn-error.log -/.fleet -/.idea -/.vscode + +# logs +worker.log + +# windows +*:Zone.Identifier +Thumbs.db + +# mac +.DS_Store \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..705d41a7 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,3 @@ +**/dist +**/package-lock.json +public/build \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..2ea9bc71 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,16 @@ +{ + "plugins": ["prettier-plugin-blade", "prettier-plugin-tailwindcss"], + "overrides": [ + { + "files": ["*.blade.php"], + "options": { + "parser": "blade" + } + } + ], + "tailwindConfig": "./tailwind.config.js", + "singleQuote": true, + "semi": false, + "trailingComma": "all", + "singleAttributePerLine": true +} diff --git a/package-lock.json b/package-lock.json index 3a1513f8..cdd853ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,14 +5,20 @@ "packages": { "": { "devDependencies": { - "@tailwindcss/typography": "^0.5.9", - "alpinejs": "^3.12.2", - "autoprefixer": "^10.4.14", - "axios": "^1.1.2", - "laravel-vite-plugin": "^0.7.5", - "postcss": "^8.4.24", - "tailwindcss": "^3.3.2", - "vite": "^4.0.0" + "@fontsource/poppins": "^5.2.5", + "@tailwindcss/typography": "^0.5.16", + "alpinejs": "^3.14.9", + "autoprefixer": "^10.4.21", + "axios": "^1.8.3", + "gsap": "^3.12.5", + "laravel-vite-plugin": "^0.7.8", + "motion": "^12.5.0", + "postcss": "^8.5.3", + "prettier": "^3.3.3", + "prettier-plugin-blade": "^2.1.16", + "prettier-plugin-tailwindcss": "^0.6.5", + "tailwindcss": "^3.4.17", + "vite": "^4.5.9" } }, "node_modules/@alloc/quick-lru": { @@ -402,6 +408,16 @@ "node": ">=12" } }, + "node_modules/@fontsource/poppins": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@fontsource/poppins/-/poppins-5.2.5.tgz", + "integrity": "sha512-1S3k45pZOz2jqGPPqKw0in3uxFwnB+d5jSU8Tp9YwH/dIJptE3jdkQbYN0QD861GtuOpn6QhPW/yKt1w7hVRBQ==", + "dev": true, + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -556,9 +572,9 @@ "license": "MIT" }, "node_modules/alpinejs": { - "version": "3.14.8", - "resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.14.8.tgz", - "integrity": "sha512-wT2fuP2DXpGk/jKaglwy7S/IJpm1FD+b7U6zUrhwErjoq5h27S4dxkJEXVvhbdwyPv9U+3OkUuNLkZT4h2Kfrg==", + "version": "3.14.9", + "resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.14.9.tgz", + "integrity": "sha512-gqSOhTEyryU9FhviNqiHBHzgjkvtukq9tevew29fTj+ofZtfsYriw4zPirHHOAy9bw8QoL3WGhyk7QqCh5AYlw==", "dev": true, "license": "MIT", "dependencies": { @@ -627,9 +643,9 @@ "license": "MIT" }, "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", "dev": true, "funding": [ { @@ -647,11 +663,11 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", + "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -665,9 +681,9 @@ } }, "node_modules/axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.3.tgz", + "integrity": "sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==", "dev": true, "license": "MIT", "dependencies": { @@ -763,9 +779,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001695", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz", - "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==", + "version": "1.0.30001705", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001705.tgz", + "integrity": "sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg==", "dev": true, "funding": [ { @@ -1105,6 +1121,34 @@ "url": "https://github.com/sponsors/rawify" } }, + "node_modules/framer-motion": { + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.5.0.tgz", + "integrity": "sha512-buPlioFbH9/W7rDzYh1C09AuZHAk2D1xTA1BlounJ2Rb9aRg84OXexP0GLd+R83v0khURdMX7b5MKnGTaSg5iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "motion-dom": "^12.5.0", + "motion-utils": "^12.5.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1164,6 +1208,13 @@ "node": ">=10.13.0" } }, + "node_modules/gsap": { + "version": "3.12.7", + "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.12.7.tgz", + "integrity": "sha512-V4GsyVamhmKefvcAKaoy0h6si0xX7ogwBoBSs2CTJwt7luW0oZzC0LhdkyuKV8PJAXr7Yaj8pMjCKD4GJ+eEMg==", + "dev": true, + "license": "Standard 'no charge' license: https://gsap.com/standard-license. Club GSAP members get more: https://gsap.com/licensing/. Why GreenSock doesn't employ an MIT license: https://gsap.com/why-license/" + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -1420,6 +1471,50 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/motion": { + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/motion/-/motion-12.5.0.tgz", + "integrity": "sha512-BTAYKszMmTvXSsIyeHNMPSicjWgUA4j7OmZv1xPpthm4sPub3ch66fy9U7BhJ1uXNL3YeprsIegzuvps3FkEMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "framer-motion": "^12.5.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/motion-dom": { + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.5.0.tgz", + "integrity": "sha512-uH2PETDh7m+Hjd1UQQ56yHqwn83SAwNjimNPE/kC+Kds0t4Yh7+29rfo5wezVFpPOv57U4IuWved5d1x0kNhbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "motion-utils": "^12.5.0" + } + }, + "node_modules/motion-utils": { + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.5.0.tgz", + "integrity": "sha512-+hFFzvimn0sBMP9iPxBa9OtRX35ZQ3py0UHnb8U29VD+d8lQ8zH3dTygJWqK7av2v6yhg7scj9iZuvTS0f4+SA==", + "dev": true, + "license": "MIT" + }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -1580,9 +1675,9 @@ } }, "node_modules/postcss": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", - "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "dev": true, "funding": [ { @@ -1743,6 +1838,114 @@ "dev": true, "license": "MIT" }, + "node_modules/prettier": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-blade": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/prettier-plugin-blade/-/prettier-plugin-blade-2.1.21.tgz", + "integrity": "sha512-+BPBPvla/Ppr0MVrqMAO+FTwxpXUYo8zhQPIGC7psNuMbB24y84cGrJ4Uc02GHTQN0q8txeG4Y4MxyJWgOujyQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "prettier": ">=3" + } + }, + "node_modules/prettier-plugin-tailwindcss": { + "version": "0.6.11", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.11.tgz", + "integrity": "sha512-YxaYSIvZPAqhrrEpRtonnrXdghZg1irNg4qrjboCXrpybLWVs55cW2N3juhspVJiO0JBvYJT8SYsJpc8OQSnsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-pug": "*", + "@shopify/prettier-plugin-liquid": "*", + "@trivago/prettier-plugin-sort-imports": "*", + "@zackad/prettier-plugin-twig": "*", + "prettier": "^3.0", + "prettier-plugin-astro": "*", + "prettier-plugin-css-order": "*", + "prettier-plugin-import-sort": "*", + "prettier-plugin-jsdoc": "*", + "prettier-plugin-marko": "*", + "prettier-plugin-multiline-arrays": "*", + "prettier-plugin-organize-attributes": "*", + "prettier-plugin-organize-imports": "*", + "prettier-plugin-sort-imports": "*", + "prettier-plugin-style-order": "*", + "prettier-plugin-svelte": "*" + }, + "peerDependenciesMeta": { + "@ianvs/prettier-plugin-sort-imports": { + "optional": true + }, + "@prettier/plugin-pug": { + "optional": true + }, + "@shopify/prettier-plugin-liquid": { + "optional": true + }, + "@trivago/prettier-plugin-sort-imports": { + "optional": true + }, + "@zackad/prettier-plugin-twig": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-css-order": { + "optional": true + }, + "prettier-plugin-import-sort": { + "optional": true + }, + "prettier-plugin-jsdoc": { + "optional": true + }, + "prettier-plugin-marko": { + "optional": true + }, + "prettier-plugin-multiline-arrays": { + "optional": true + }, + "prettier-plugin-organize-attributes": { + "optional": true + }, + "prettier-plugin-organize-imports": { + "optional": true + }, + "prettier-plugin-sort-imports": { + "optional": true + }, + "prettier-plugin-style-order": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + } + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -2148,6 +2351,13 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/update-browserslist-db": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", diff --git a/package.json b/package.json index a15000bd..d9276202 100644 --- a/package.json +++ b/package.json @@ -6,14 +6,19 @@ "build": "vite build" }, "devDependencies": { - "@tailwindcss/typography": "^0.5.9", - "alpinejs": "^3.12.2", - "autoprefixer": "^10.4.14", - "axios": "^1.1.2", - "laravel-vite-plugin": "^0.7.5", - "postcss": "^8.4.24", - "tailwindcss": "^3.3.2", - "vite": "^4.0.0" - }, - "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" + "@fontsource/poppins": "^5.2.5", + "@tailwindcss/typography": "^0.5.16", + "alpinejs": "^3.14.9", + "autoprefixer": "^10.4.21", + "axios": "^1.8.3", + "gsap": "^3.12.5", + "laravel-vite-plugin": "^0.7.8", + "motion": "^12.5.0", + "postcss": "^8.5.3", + "prettier": "^3.3.3", + "prettier-plugin-blade": "^2.1.16", + "prettier-plugin-tailwindcss": "^0.6.5", + "tailwindcss": "^3.4.17", + "vite": "^4.5.9" + } } diff --git a/resources/css/app.css b/resources/css/app.css index d7d940a4..baa32682 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -2,8 +2,10 @@ @tailwind components; @tailwind utilities; -[x-cloak] { - display: none; +@layer base { + html { + -webkit-tap-highlight-color: transparent; + } } /* Look cool on safari */ @@ -21,10 +23,9 @@ /* }*/ /*}*/ - /* Whole menu */ nav ul { - @apply text-xl md:text-sm list-none; + @apply list-none text-xl md:text-sm; } /* Categories */ @@ -33,8 +34,8 @@ nav > ul > li { & > a { @apply font-semibold; - @apply no-underline px-3 py-1.5 mb-1.5; - @apply border rounded-lg dark:border-white/15; + @apply mb-1.5 px-3 py-1.5 no-underline; + @apply rounded-lg border dark:border-white/15; } } @@ -60,7 +61,7 @@ nav > ul > li > ul { @apply font-normal; & a { - @apply w-full block; + @apply block w-full; @apply py-1.5; @apply border-l pl-3 dark:border-white/10; @apply ml-3; @@ -76,7 +77,6 @@ nav > ul > li > ul { /*@apply text-[#00aaa6];*/ @apply border-[#00aaa6] dark:border-[#00aaa6]/90; } - } } @@ -97,7 +97,7 @@ nav > ul > li > ul { } .prose pre { - @apply p-6 shadow-lg rounded-xl; + @apply rounded-xl p-6 shadow-lg; } .prose pre code { @@ -117,7 +117,7 @@ nav > ul > li > ul { } .prose img { - @apply shadow-md rounded-xl; + @apply rounded-xl shadow-md; } .prose img.no-format { @@ -129,7 +129,7 @@ nav > ul > li > ul { overflow-x-auto is recommended. */ .prose pre { - @apply p-0 my-4 overflow-x-auto bg-transparent rounded-md; + @apply my-4 overflow-x-auto rounded-md bg-transparent p-0; } /* @@ -139,7 +139,7 @@ nav > ul > li > ul { colors extend edge to edge. */ .prose pre code.torchlight { - @apply block py-4 min-w-max; + @apply block min-w-max py-4; } /* @@ -158,27 +158,23 @@ nav > ul > li > ul { @apply mr-4; } - - - - :root { --docsearch-container-background: rgba(0, 0, 0, 0.5); --docsearch-primary-color: #00aaa6; } -[id=docsearch] { +[id='docsearch'] { width: 100%; @apply md:w-auto; } .DocSearch-Button { - @apply border border-solid border-gray-400/50 dark:border-white/10 dark:bg-black/10 flex items-center w-full rounded; + @apply flex w-full items-center rounded border border-solid border-gray-400/50 dark:border-white/10 dark:bg-black/10; } .DocSearch-Button:hover { box-shadow: none; - @apply text-gray-400 border-gray-400/70 bg-transparent dark:border-white/20; + @apply border-gray-400/70 bg-transparent text-gray-400 dark:border-white/20; } .DocSearch-Button .DocSearch-Search-Icon { @@ -187,7 +183,7 @@ nav > ul > li > ul { } .DocSearch-Button-Placeholder { - @apply dark:text-white/60 pr-44 text-xs; + @apply pr-44 text-xs dark:text-white/60; } .DocSearch-Button-Keys { @@ -202,7 +198,7 @@ nav > ul > li > ul { box-shadow: none; width: auto; - @apply font-sans mr-0.5; + @apply mr-0.5 font-sans; } .DocSearch-Modal { @@ -216,4 +212,3 @@ nav > ul > li > ul { .DocSearch-Input { @apply focus-visible:outline-none; } - diff --git a/resources/js/app.js b/resources/js/app.js index 8781af5c..42f50852 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -1,8 +1,57 @@ -import './bootstrap'; +import { gsap } from 'gsap' +import { ScrollTrigger } from 'gsap/ScrollTrigger' +import './bootstrap' import Alpine from 'alpinejs' -import codeBlock from "./alpine/codeBlock.js"; +import codeBlock from './alpine/codeBlock.js' +import.meta.glob(['../images/**', '../svg/**']) +import { + animate, + hover, + inView, + easeIn, + easeOut, + easeInOut, + backIn, + backOut, + backInOut, + circIn, + circOut, + circInOut, + anticipate, + spring, +} from 'motion' -window.Alpine = Alpine; +// GSAP +gsap.registerPlugin(ScrollTrigger) +window.ScrollTrigger = ScrollTrigger +window.gsap = gsap + +// Motion +window.motion = { + animate: animate, + hover: hover, + inView: inView, + easeIn: easeIn, + easeOut: easeOut, + easeInOut: easeInOut, + backOut: backOut, + backIn: backIn, + backInOut: backInOut, + circIn: circIn, + circOut: circOut, + circInOut: circInOut, + anticipate: anticipate, + spring: spring, +} + +// Alpine +window.Alpine = Alpine Alpine.data('codeBlock', codeBlock) +Alpine.magic('refAll', (el) => { + return (refName) => { + return Array.from(document.querySelectorAll(`[x-ref="${refName}"]`)) + } +}) + Alpine.start() diff --git a/resources/js/fonts.js b/resources/js/fonts.js new file mode 100644 index 00000000..df6779fe --- /dev/null +++ b/resources/js/fonts.js @@ -0,0 +1 @@ +import '@fontsource/poppins' diff --git a/vite.config.js b/vite.config.js index 67bdbe16..03e1a688 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,13 +1,12 @@ -import {defineConfig} from 'vite'; -import laravel from 'laravel-vite-plugin'; +import { defineConfig } from 'vite' +import laravel from 'laravel-vite-plugin' export default defineConfig({ - server: { cors: { origin: [ /^https?:\/\/(?:(?:[^:]+\.)?localhost|127\.0\.0\.1|\[::1\])(?::\d+)?$/, - /^https?:\/\/.*\.test(:\d+)?$/, // Valet / Herd (SCHEME://*.test:PORT) + /^https?:\/\/.*\.test(:\d+)?$/, // Valet / Herd (SCHEME://*.test:PORT) ], }, }, @@ -17,4 +16,4 @@ export default defineConfig({ refresh: true, }), ], -}); +}) From f421610f430bb0bc8273c9355317834a5b04e69e Mon Sep 17 00:00:00 2001 From: HassanZahirnia Date: Sun, 16 Mar 2025 16:53:42 +0330 Subject: [PATCH 025/251] =?UTF-8?q?=E2=9C=A8=20Refactor=20layout=20and=20a?= =?UTF-8?q?lert=20components,=20update=20Tailwind=20CSS=20configuration,?= =?UTF-8?q?=20and=20clean=20up=20unused=20styles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/assets/background-pattern-dark.svg | 1 - resources/assets/background-pattern.svg | 1 - resources/assets/bg.svg | 405 ------------------ resources/css/app.css | 15 - resources/views/components/alert.blade.php | 14 +- .../views/components/header-banner.blade.php | 106 +++-- resources/views/components/layout.blade.php | 110 +++-- resources/views/early-adopter.blade.php | 231 ++++++---- resources/views/welcome.blade.php | 123 +++--- tailwind.config.js | 24 +- 10 files changed, 373 insertions(+), 657 deletions(-) delete mode 100644 resources/assets/background-pattern-dark.svg delete mode 100644 resources/assets/background-pattern.svg delete mode 100644 resources/assets/bg.svg diff --git a/resources/assets/background-pattern-dark.svg b/resources/assets/background-pattern-dark.svg deleted file mode 100644 index 461b3bc4..00000000 --- a/resources/assets/background-pattern-dark.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/resources/assets/background-pattern.svg b/resources/assets/background-pattern.svg deleted file mode 100644 index 9f543b8f..00000000 --- a/resources/assets/background-pattern.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/resources/assets/bg.svg b/resources/assets/bg.svg deleted file mode 100644 index b27f86a1..00000000 --- a/resources/assets/bg.svg +++ /dev/null @@ -1,405 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/css/app.css b/resources/css/app.css index baa32682..9a77ade9 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -8,21 +8,6 @@ } } -/* Look cool on safari */ -.blur-background { - backdrop-filter: blur(20px); -} - -.background-pattern { - background-image: url('../assets/bg.svg'); -} - -/*@media(prefers-color-scheme: dark) {*/ -/* .background-pattern {*/ -/* background-image: url('../assets/background-pattern-dark.svg');*/ -/* }*/ -/*}*/ - /* Whole menu */ nav ul { @apply list-none text-xl md:text-sm; diff --git a/resources/views/components/alert.blade.php b/resources/views/components/alert.blade.php index f668487c..5d350503 100644 --- a/resources/views/components/alert.blade.php +++ b/resources/views/components/alert.blade.php @@ -1,6 +1,12 @@ -
- - 📲  Join the NativePHP for mobile Early Access Program → + diff --git a/resources/views/components/header-banner.blade.php b/resources/views/components/header-banner.blade.php index e4ebc690..93464240 100644 --- a/resources/views/components/header-banner.blade.php +++ b/resources/views/components/header-banner.blade.php @@ -1,69 +1,95 @@ @props(['hasMenu' => false]) -
- +
-
+
- - + + NativePHP
-
- -
+
-
- +
diff --git a/resources/views/components/layout.blade.php b/resources/views/components/layout.blade.php index 76d2be6a..3e5fccf8 100644 --- a/resources/views/components/layout.blade.php +++ b/resources/views/components/layout.blade.php @@ -1,47 +1,75 @@ - - - - - + + + + + + + - + NativePHP{{ isset($title) ? ' | ' . $title : '' }} - {!! SEOMeta::generate() !!} - {!! OpenGraph::generate() !!} - {!! Twitter::generate() !!} - - - - - - @vite(["resources/css/app.css", "resources/js/app.js"]) + {{-- Favicon --}} + - - - - - + {!! SEOMeta::generate() !!} + {!! OpenGraph::generate() !!} + {!! Twitter::generate() !!} + - -{{ $slot }} - - - + + + + + {{-- Styles --}} + + @vite('resources/css/app.css') + + + + {{ $slot }} + + + @vite('resources/js/app.js') + diff --git a/resources/views/early-adopter.blade.php b/resources/views/early-adopter.blade.php index 15617930..ae33663c 100644 --- a/resources/views/early-adopter.blade.php +++ b/resources/views/early-adopter.blade.php @@ -1,78 +1,111 @@ - - + -
+
- -

+

NativePHP for - iOS + + iOS + and - Android + + Android + is coming!

-

- Development of NativePHP for mobile has already started and you can get access - and start building apps right now!

- Join the Early Access Program by purchasing a license. +

+ Development of NativePHP for mobile has already started and you + can get access and start building apps right now! +
+
+ Join the + Early Access Program + by purchasing a license.

-

Annual license — $250

+

Annual license — $250

-
- + -

- Not ready to join the EAP?
- Sign up for the newsletter to keep up with the - latest developments. +

+ Not ready to join the EAP? +
+ + Sign up for the newsletter + + to keep up with the latest developments.

-
-
-
+
+
+

Why Join the Early Access Program?

- Up to now, NativePHP has focused on Windows, Mac, and Linux. But we believe that breaking the mobile - frontier is what makes the project truly compelling... and truly cross-platform. + Up to now, NativePHP has focused on Windows, Mac, and Linux. + But we believe that breaking the mobile frontier is what + makes the project truly compelling... and truly + cross-platform.

- With significant progress already made towards enabling - NativePHP for mobile, we are excited about the possibilities that lie ahead. + With + significant progress + already made towards enabling + NativePHP for mobile + , we are excited about the possibilities that lie ahead.

- However, to make this vision a reality for both iOS and Android, we need your support. + However, to make this vision a reality for both iOS and + Android, we need your support.

- As an EAP member, you will be supporting the continued development of all of NativePHP, but - especially of NativePHP for mobile. + As an EAP member, you will be supporting the continued + development of all of NativePHP, but especially of NativePHP + for mobile.

- You'll have the opportunity to influence the direction of the project and provide critical - feedback right from an early stage. + You'll have the opportunity to influence the direction of + the project and provide critical feedback right from an + early stage.

- You'll get exclusive access to all the latest features first and special treatment for the life of - the NativePHP project, a project we plan to be working on for a long time to come! + You'll get exclusive access to all the latest features first + and special treatment for the life of the NativePHP project, + a project we plan to be working on for a long time to come!

- Please join us on this exciting journey to expand NativePHP onto mobile platforms. -

-

- We can't wait to see what you build! + Please join us on this exciting journey to expand NativePHP + onto mobile platforms.

+

We can't wait to see what you build!

- Simon & Marcel
+ Simon & Marcel +
Creators of NativePHP

@@ -83,80 +116,122 @@ class="rounded-md bg-teal-500 px-8 py-4 text-2xl font-semibold text-white shadow
-

Early Access Program

-

+

+ Early Access Program +

+

Program Benefits

-
- -
-

- +
+
+

+ Get the code!

-
+

- You'll get early access to the code, documentation and more, and watch closely as it - evolves and start to build your projects before anyone else. + You'll get early access to the code, documentation + and more, and watch closely as it evolves and start + to build your projects before anyone else.

-
-

- +
+

+ Access to an exclusive Discord channel

-
+

- Decide the direction of the project and what gets implemented next. Plus a direct - line to the creators of NativePHP and other EAP members. + Decide the direction of the project and what gets + implemented next. Plus a direct line to the creators + of NativePHP and other EAP members.

-
-

- +
+

+ A lifetime of rewards and discounts

-
+

- The NativePHP ecosystem is about to explode! There will be premium tools and - packages, starter kits and more. As an EAP member, you'll get exclusive discounts - not available to anyone else. + The NativePHP ecosystem is about to explode! There + will be premium tools and packages, starter kits and + more. As an EAP member, you'll get exclusive + discounts not available to anyone else.

-
-

- +
+

+ Your name in NativePHP's history

-
+

- All EAP members will be immortalized across the NativePHP ecosystem, showing the - rest of the community the valuable part you've played in supporting this project's - creation and ongoing development. + All EAP members will be immortalized across the + NativePHP ecosystem, showing the rest of the + community the valuable part you've played in + supporting this project's creation and ongoing + development.

-

- + diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php index c6e12175..0df2c82f 100644 --- a/resources/views/welcome.blade.php +++ b/resources/views/welcome.blade.php @@ -1,68 +1,69 @@ - - - - - - - NativePHP | Baking Delicious Native Apps - {!! OpenGraph::generate() !!} - {!! Twitter::generate() !!} - - - - - @vite(["resources/css/app.css", "resources/js/app.js"]) - - - - - - - + +
+
+ + +

NativePHP

+

+ NativePHP is a new way to build native applications, + + using the tools you already know. +

+ -
-
- - -

NativePHP

-

- NativePHP is a new way to build native applications, - - using the tools you already know. -

- +
+

Featured Sponsors

-
-

Featured Sponsors

+
+ +
-
- -
+

Corporate Sponsors

-

Corporate Sponsors

+
+ +
- +
- - Want your logo here? - -
-

- - -
- - - + + + diff --git a/tailwind.config.js b/tailwind.config.js index edee5462..7cd5e7b8 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,24 +1,26 @@ -import defaultTheme from "tailwindcss/defaultTheme"; - /** @type {import('tailwindcss').Config} */ +const { fontFamily } = require('tailwindcss/defaultTheme') + export default { content: [ - "./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php", - "./storage/framework/views/*.php", - "./resources/views/**/*.blade.php", - "./app/**/*.php", - // "./app/Extensions/**/*.php", + './resources/**/*.{js,blade.php}', + './vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php', + './storage/framework/views/*.php', + './app/**/*.php', ], safelist: ['inline', 'text-red-600', 'mr-2', 'font-bold', 'no-underline'], theme: { + extend: { + fontFamily: { + poppins: "'Poppins', Verdana, sans-serif", + }, + }, container: { center: true, }, }, - plugins: [ - require('@tailwindcss/typography'), - ], -}; + plugins: [require('@tailwindcss/typography')], +} From d07ba04e6da367ef02034135ed20ec9b6e9c7cce Mon Sep 17 00:00:00 2001 From: HassanZahirnia Date: Mon, 17 Mar 2025 02:13:27 +0330 Subject: [PATCH 026/251] =?UTF-8?q?=E2=9C=A8=20Add=20EAP=20banner=20compon?= =?UTF-8?q?ent,=20update=20font=20import,=20and=20remove=20old=20alert=20c?= =?UTF-8?q?omponent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/js/app.js | 1 + resources/js/fonts.js | 2 +- resources/views/components/alert.blade.php | 12 -- .../views/components/eap-banner.blade.php | 47 ++++++++ .../views/components/header-banner.blade.php | 4 +- resources/views/welcome.blade.php | 104 ++++++++++++------ 6 files changed, 123 insertions(+), 47 deletions(-) delete mode 100644 resources/views/components/alert.blade.php create mode 100644 resources/views/components/eap-banner.blade.php diff --git a/resources/js/app.js b/resources/js/app.js index 42f50852..0af9ac72 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -1,3 +1,4 @@ +import './fonts' import { gsap } from 'gsap' import { ScrollTrigger } from 'gsap/ScrollTrigger' import './bootstrap' diff --git a/resources/js/fonts.js b/resources/js/fonts.js index df6779fe..6b6da022 100644 --- a/resources/js/fonts.js +++ b/resources/js/fonts.js @@ -1 +1 @@ -import '@fontsource/poppins' +import '@fontsource/poppins/latin.css' diff --git a/resources/views/components/alert.blade.php b/resources/views/components/alert.blade.php deleted file mode 100644 index 5d350503..00000000 --- a/resources/views/components/alert.blade.php +++ /dev/null @@ -1,12 +0,0 @@ - diff --git a/resources/views/components/eap-banner.blade.php b/resources/views/components/eap-banner.blade.php new file mode 100644 index 00000000..63b4b1d5 --- /dev/null +++ b/resources/views/components/eap-banner.blade.php @@ -0,0 +1,47 @@ + + + {{-- Text --}} +
+ Join our Mobile Early Access Program +
+ + {{-- Arrow --}} + + + +
diff --git a/resources/views/components/header-banner.blade.php b/resources/views/components/header-banner.blade.php index 93464240..3bd975fd 100644 --- a/resources/views/components/header-banner.blade.php +++ b/resources/views/components/header-banner.blade.php @@ -3,7 +3,7 @@ class="sticky top-0 z-50 border-b border-gray-100 bg-gray-50/85 text-white dark:border-0 dark:bg-gray-800/85" >
- +
diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php index 0df2c82f..a56600a2 100644 --- a/resources/views/welcome.blade.php +++ b/resources/views/welcome.blade.php @@ -1,4 +1,76 @@ + {{-- Hero --}} +
+ {{-- Header --}} +
+

Build

+

Native

+

PHP Apps

+
+ + {{-- Description --}} +

+ Bring your + + PHP + + & + + Laravel + + skills to the world of + desktop & mobile apps + . You can build cross-platform applications effortlessly—no extra + tools, just the stack you love. +

+ + {{-- Button --}} + +
- - -

NativePHP

-

- NativePHP is a new way to build native applications, - - using the tools you already know. -

- -

Featured Sponsors

From d3a7e400a35f874fbd84eb2123b2cdc09cc79c1b Mon Sep 17 00:00:00 2001 From: HassanZahirnia Date: Mon, 17 Mar 2025 04:12:30 +0330 Subject: [PATCH 027/251] =?UTF-8?q?=E2=9C=A8=20Update=20layout=20component?= =?UTF-8?q?s=20to=20include=20footer,=20enhance=20sponsor=20links=20with?= =?UTF-8?q?=20improved=20styling,=20and=20clean=20up=20unused=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/layout-three-columns.blade.php | 14 +-- resources/views/components/layout.blade.php | 3 +- .../components/sponsors-corporate.blade.php | 44 ++++++--- .../components/sponsors-featured.blade.php | 29 ++++-- .../components/sponsors/laradir.blade.php | 25 ++++- resources/views/early-adopter.blade.php | 2 - resources/views/welcome.blade.php | 99 +++++++++++++------ 7 files changed, 154 insertions(+), 62 deletions(-) diff --git a/resources/views/components/layout-three-columns.blade.php b/resources/views/components/layout-three-columns.blade.php index 496b7447..fdb67dd4 100644 --- a/resources/views/components/layout-three-columns.blade.php +++ b/resources/views/components/layout-three-columns.blade.php @@ -1,28 +1,24 @@
-
- - @if(!empty($sidebarLeft)) + @if (! empty($sidebarLeft)) {{ $sidebarLeft }} @endif -
-
- - @if(!empty($sidebarRight)) +
+ @if (! empty($sidebarRight)) {{ $sidebarRight }} @endif {{ $slot }} - -
diff --git a/resources/views/components/layout.blade.php b/resources/views/components/layout.blade.php index 3e5fccf8..7ad84dc2 100644 --- a/resources/views/components/layout.blade.php +++ b/resources/views/components/layout.blade.php @@ -55,10 +55,11 @@ {{ $slot }} + diff --git a/resources/views/components/navigation-bar.blade.php b/resources/views/components/navigation-bar.blade.php new file mode 100644 index 00000000..6a8f9939 --- /dev/null +++ b/resources/views/components/navigation-bar.blade.php @@ -0,0 +1,98 @@ +@props(['hasMenu' => false]) + + From 22a59d6d2ae377e44142536f7c17498bd37bfd53 Mon Sep 17 00:00:00 2001 From: HassanZahirnia Date: Tue, 18 Mar 2025 22:50:14 +0330 Subject: [PATCH 043/251] =?UTF-8?q?=E2=9C=A8=20Improve=20navigation=20bar?= =?UTF-8?q?=20responsiveness=20and=20styling;=20adjust=20logo=20size=20and?= =?UTF-8?q?=20enhance=20search=20button=20visibility?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/css/app.css | 11 ++- .../views/components/navigation-bar.blade.php | 83 +++++++++---------- 2 files changed, 48 insertions(+), 46 deletions(-) diff --git a/resources/css/app.css b/resources/css/app.css index 3558e3fc..c452de83 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -167,15 +167,22 @@ nav > ul > li > ul { @apply text-gray-500 dark:text-white/60; } +@media (max-width: 768px) { + .DocSearch-Button-Keys, + .DocSearch-Button-Placeholder { + display: block; + } +} + .DocSearch-Button-Placeholder { - @apply pr-20 text-sm dark:text-white/60; + @apply hidden pr-20 text-sm min-[500px]:block dark:text-white/60; } .DocSearch-Button-Keys { display: flex; min-width: auto; - @apply mt-1 text-sm leading-none; + @apply ml-1 mt-1 text-sm leading-none; } .DocSearch-Button-Key { diff --git a/resources/views/components/navigation-bar.blade.php b/resources/views/components/navigation-bar.blade.php index 6a8f9939..6802f5c7 100644 --- a/resources/views/components/navigation-bar.blade.php +++ b/resources/views/components/navigation-bar.blade.php @@ -14,19 +14,19 @@ class="mx-auto flex w-full max-w-5xl items-center justify-between gap-5 rounded- {{-- Logo --}}
- + NativePHP
1.0.0-beta.2
-
+
{{-- Doc search --}} - From 1b6fd1fb775514394285f66b04a637d9aec1556b Mon Sep 17 00:00:00 2001 From: HassanZahirnia Date: Tue, 18 Mar 2025 22:57:33 +0330 Subject: [PATCH 044/251] =?UTF-8?q?=E2=9C=A8=20Enhance=20navigation=20comp?= =?UTF-8?q?onents=20with=20improved=20layout,=20add=20Docs=20link,=20and?= =?UTF-8?q?=20refine=20transition=20effects?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/components/navigation-bar.blade.php | 12 ++++- .../sidebar-left-navigation.blade.php | 45 +++++++------------ 2 files changed, 27 insertions(+), 30 deletions(-) diff --git a/resources/views/components/navigation-bar.blade.php b/resources/views/components/navigation-bar.blade.php index 6802f5c7..a7cbd1dd 100644 --- a/resources/views/components/navigation-bar.blade.php +++ b/resources/views/components/navigation-bar.blade.php @@ -64,7 +64,7 @@ class="hidden size-[3px] rotate-45 rounded-sm bg-gray-400 lg:block" + request()->is('docs*'), + 'opacity-60 hover:opacity-100' => ! request()->is('docs*'), + ]) + > + Docs + @else
{{-- Line --}} Play introduction video
-

Video

+

Video

@@ -204,10 +218,12 @@ class="font-normal text-gray-600 dark:text-white/40" Laracon EU 2025 : Simon Hamp // Building Mobile Apps with PHP @@ -215,7 +231,7 @@ class="mt-2 w-40 rounded-xl"

{{-- PHP Apps --}} -

PHP Apps -

+ {{-- Shiny line --}} {{-- Image --}} @@ -1106,7 +1086,7 @@ class="group relative" class="absolute right-1/2 top-1/2 grid size-16 -translate-y-1/2 translate-x-1/2 place-items-center rounded-full bg-white/10 text-white ring-1 ring-white/10 backdrop-blur transition duration-300 ease-in-out will-change-transform group-hover:scale-110 group-hover:text-[#d4fd7d]" aria-hidden="true" > - + /> Play video {{-- Image --}} From 5d1694d76bc2b8815ba9efed90abf0f11d52b666 Mon Sep 17 00:00:00 2001 From: HassanZahirnia Date: Tue, 25 Mar 2025 15:59:45 +0330 Subject: [PATCH 137/251] =?UTF-8?q?=E2=9C=A8=20Refactor=20footer=20and=20w?= =?UTF-8?q?elcome=20views=20for=20improved=20layout=20and=20responsiveness?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/views/components/footer.blade.php | 21 +++++++++++---------- resources/views/welcome.blade.php | 4 ++-- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/resources/views/components/footer.blade.php b/resources/views/components/footer.blade.php index 9196668f..a90f720f 100644 --- a/resources/views/components/footer.blade.php +++ b/resources/views/components/footer.blade.php @@ -8,9 +8,11 @@ class="sr-only" > Footer -
+
{{-- Left side --}} -
+
{{-- Logo --}}
diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php index e5b80ec9..77df749b 100644 --- a/resources/views/welcome.blade.php +++ b/resources/views/welcome.blade.php @@ -1136,7 +1136,7 @@ class="sr-only"
{{-- Featured sponsors --}}

{{-- Corporate sponsors --}}

Date: Tue, 25 Mar 2025 16:02:46 +0330 Subject: [PATCH 138/251] =?UTF-8?q?=E2=9C=A8=20Update=20primary=20color=20?= =?UTF-8?q?for=20DocSearch=20and=20add=20rounded=20corners=20to=20the=20fo?= =?UTF-8?q?rm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/css/app.css | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/resources/css/app.css b/resources/css/app.css index d66f29b8..e3ce6ae6 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -139,7 +139,7 @@ nav > ul > li > ul { :root { --docsearch-container-background: rgba(0, 0, 0, 0.5); - --docsearch-primary-color: #a78bfa; + --docsearch-primary-color: #987af1; } [id='docsearch'] { @@ -202,3 +202,7 @@ nav > ul > li > ul { .DocSearch-Input { @apply focus-visible:outline-none; } + +.DocSearch-Form { + @apply rounded-lg; +} From 0e1a10d4179e8a56b3519f617796f64e59012895 Mon Sep 17 00:00:00 2001 From: HassanZahirnia Date: Tue, 25 Mar 2025 16:05:11 +0330 Subject: [PATCH 139/251] =?UTF-8?q?=E2=9C=A8=20Adjust=20gap=20spacing=20in?= =?UTF-8?q?=20navigation=20bar=20for=20improved=20layout=20consistency?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/views/components/navigation-bar.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/components/navigation-bar.blade.php b/resources/views/components/navigation-bar.blade.php index 3b5d4bea..362ff009 100644 --- a/resources/views/components/navigation-bar.blade.php +++ b/resources/views/components/navigation-bar.blade.php @@ -29,7 +29,7 @@ class="hidden rounded-full bg-gray-200/60 px-2 py-1 text-xs text-gray-600 lg:blo

{{-- Right side --}} -
+
{{-- Doc search --}}
Date: Tue, 25 Mar 2025 16:10:13 +0330 Subject: [PATCH 140/251] =?UTF-8?q?=E2=9C=A8=20Update=20theme=20toggle=20c?= =?UTF-8?q?omponent=20styles=20for=20improved=20consistency=20and=20respon?= =?UTF-8?q?siveness?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/components/theme-toggle.blade.php | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/resources/views/components/theme-toggle.blade.php b/resources/views/components/theme-toggle.blade.php index ea2d8410..5187bb9b 100644 --- a/resources/views/components/theme-toggle.blade.php +++ b/resources/views/components/theme-toggle.blade.php @@ -1,5 +1,5 @@
@@ -205,7 +199,9 @@ class="grid size-7 place-items-center rounded-xl bg-[#D4FD7D] dark:bg-[#d68ffe] >
-
Your name in NativePHP's history
+
+ Your name in NativePHP's history +
Increases to - $750 - + $750 + after the EAP.

@@ -306,11 +302,9 @@ class="size-5 shrink-0" />
Build - - unlimited - + + unlimited + apps
@@ -321,11 +315,9 @@ class="size-5 shrink-0" />
Release - - 10 - + + 10 + production apps
@@ -335,11 +327,9 @@ class="size-5 shrink-0" aria-hidden="true" />
- - 10 - + + 10 + developer seats
@@ -372,7 +362,9 @@ class="grid size-7 place-items-center rounded-xl bg-[#D4FD7D] dark:bg-[#d68ffe] >
-
Your name in NativePHP's history
+
+ Your name in NativePHP's history +

Increases to - $2,500 - + $2,500 + after the EAP.

@@ -481,11 +473,9 @@ class="size-5 shrink-0" />
Build - - unlimited - + + unlimited + apps
@@ -496,11 +486,9 @@ class="size-5 shrink-0" />
Release - - unlimited - + + unlimited + production apps
@@ -510,11 +498,9 @@ class="size-5 shrink-0" aria-hidden="true" />
- - Unlimited - + + Unlimited + developer seats
@@ -538,7 +524,9 @@ class="grid size-7 place-items-center rounded-xl bg-[#D4FD7D] dark:bg-[#d68ffe] >
-
Exclusive access to private Discord channels
+
+ Exclusive access to private Discord channels +
-
- Business hours support (GMT) -
+
Business hours support (GMT)
Date: Tue, 25 Mar 2025 16:21:24 +0330 Subject: [PATCH 142/251] =?UTF-8?q?=E2=9C=A8=20Refactor=20EAP=20banner=20f?= =?UTF-8?q?or=20improved=20text=20animation=20and=20layout?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/components/eap-banner.blade.php | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/resources/views/components/eap-banner.blade.php b/resources/views/components/eap-banner.blade.php index c5326835..d9e514bc 100644 --- a/resources/views/components/eap-banner.blade.php +++ b/resources/views/components/eap-banner.blade.php @@ -15,23 +15,27 @@ class="group relative z-30 flex items-center justify-center gap-2 bg-gradient-to {{-- Text --}}
- Join our Mobile Early Access Program +
+ Join our Mobile Early Access Program +
{{-- Arrow --}} From aa8b5631ff7ca3dde16479c36ca95a4e3731f63d Mon Sep 17 00:00:00 2001 From: HassanZahirnia Date: Tue, 25 Mar 2025 17:03:58 +0330 Subject: [PATCH 143/251] =?UTF-8?q?=E2=9C=A8=20Add=20new=20color=20palette?= =?UTF-8?q?=20and=20update=20components=20for=20dark=20mode=20consistency?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/components/alert-beta.blade.php | 2 +- resources/views/components/footer.blade.php | 2 +- .../views/components/icons/pinkary.blade.php | 17 +++- .../views/components/link-button.blade.php | 2 +- .../views/components/mobile-pricing.blade.php | 38 +++---- .../components/platform-switcher.blade.php | 14 +-- .../components/social-networks-all.blade.php | 16 +-- .../lists/docs/corporate-sponsors.blade.php | 10 +- .../lists/docs/featured-sponsors.blade.php | 4 +- .../lists/home/corporate-sponsors.blade.php | 10 +- .../lists/home/featured-sponsors.blade.php | 4 +- .../views/components/testimonial.blade.php | 2 +- resources/views/early-adopter.blade.php | 98 +++++++++---------- resources/views/welcome.blade.php | 2 +- tailwind.config.js | 5 + 15 files changed, 120 insertions(+), 106 deletions(-) diff --git a/resources/views/components/alert-beta.blade.php b/resources/views/components/alert-beta.blade.php index 08783af6..d6502166 100644 --- a/resources/views/components/alert-beta.blade.php +++ b/resources/views/components/alert-beta.blade.php @@ -1,5 +1,5 @@