From f9abde586fbc98ec5be58bd93d4ff8bbade18780 Mon Sep 17 00:00:00 2001 From: Shane Rosenthal Date: Mon, 3 Aug 2026 11:05:33 -0400 Subject: [PATCH 1/2] Refresh demo catalog: polish social demos, add Theme Lab, prune stale demos - Rework the social demo screens (Twitter, Facebook, Instagram, Spotify, YouTube) with stack-layered headers, top-bar back navigation, and safe-area/background fixes, with feature tests guarding the tricky renderer conventions (non-zero bottom insets, flex-grow-0 struts). - Add Theme Lab (living style guide for theme tokens, opacity ramps, button/badge variants, and font aliases), Game Pad, Explore Pickers, and stack-positioning/edge-child test screens. - Add Space Grotesk and Unbounded fonts. - Remove retired demos: Ikea, iHerb, SyncUp (classic), Vibe, drawer & native-tabs chrome, perf/phase test screens, and Skia showcase. - Track composer.lock; stop tracking .DS_Store (already gitignored). Co-Authored-By: Claude Fable 5 --- .DS_Store | Bin 12292 -> 0 bytes .claude/skills/pest-testing/SKILL.md | 59 +- .junie/skills/pest-testing/SKILL.md | 59 +- AGENTS.md | 11 +- CLAUDE.md | 11 +- README.md | 2 +- app/NativeComponents/Concerns/HasIkeaData.php | 274 ---- app/NativeComponents/Counter.php | 11 - app/NativeComponents/DemoLauncher.php | 16 +- app/NativeComponents/DoomGame.php | 13 +- app/NativeComponents/DrawerHome.php | 29 - app/NativeComponents/DrawerReveal.php | 29 - app/NativeComponents/EdgeChildTest.php | 33 + app/NativeComponents/EdgeChildTestCard.php | 43 + app/NativeComponents/Explore.php | 13 +- app/NativeComponents/ExploreForms.php | 14 +- app/NativeComponents/ExploreIcons.php | 2 +- app/NativeComponents/ExplorePickers.php | 54 + app/NativeComponents/FacebookFeed.php | 61 +- app/NativeComponents/FacebookProfile.php | 17 +- app/NativeComponents/GamePad.php | 204 +++ app/NativeComponents/GeoWatchDemo.php | 91 -- app/NativeComponents/IkeaCart.php | 80 - app/NativeComponents/IkeaHome.php | 82 - app/NativeComponents/IkeaProduct.php | 60 - app/NativeComponents/IkeaSearch.php | 62 - app/NativeComponents/InstagramFeed.php | 34 +- app/NativeComponents/InstagramProfile.php | 13 +- app/NativeComponents/InstagramSearch.php | 8 +- app/NativeComponents/JustifyRepro.php | 33 + app/NativeComponents/Layouts/DrawerLayout.php | 39 - .../Layouts/NativeTabsLayout.php | 72 - app/NativeComponents/ListingDetail.php | 16 +- app/NativeComponents/NativeChromeDemo.php | 93 -- app/NativeComponents/NativeChromeDetail.php | 47 - app/NativeComponents/NativeTabsHome.php | 145 -- app/NativeComponents/NativeTabsProfile.php | 18 - app/NativeComponents/PerfDemo.php | 108 -- app/NativeComponents/PerfShowdown.php | 95 -- app/NativeComponents/Phase1KeyTest.php | 188 --- app/NativeComponents/Phase2MemoTest.php | 207 --- .../Phase4VirtualListTest.php | 126 -- app/NativeComponents/SkiaShowcase.php | 56 - app/NativeComponents/SpotifyArtist.php | 18 +- app/NativeComponents/SpotifyHome.php | 18 +- app/NativeComponents/SpotifyPlaylist.php | 20 +- app/NativeComponents/SpotifySearch.php | 18 +- app/NativeComponents/StackPositioningDemo.php | 71 + app/NativeComponents/SyncUpChat.php | 135 -- app/NativeComponents/SyncUpChats.php | 119 -- app/NativeComponents/SyncUpFriends.php | 54 - app/NativeComponents/SyncUpLogin.php | 66 - .../Layouts/SyncUpNativeTabsLayout.php | 2 - app/NativeComponents/SyncUpProfile.php | 53 - app/NativeComponents/ThemeLab.php | 98 ++ app/NativeComponents/TweetDetail.php | 13 +- app/NativeComponents/TwitterFeed.php | 52 +- app/NativeComponents/TwitterProfile.php | 12 +- app/NativeComponents/VibeDemo.php | 72 - app/NativeComponents/VibeLogin.php | 104 -- app/NativeComponents/VibePresenceDemo.php | 111 -- app/NativeComponents/VibePrivateDemo.php | 56 - app/NativeComponents/YouTubeChannel.php | 16 +- app/NativeComponents/YouTubeHome.php | 26 +- app/NativeComponents/YouTubeSearch.php | 15 +- app/NativeComponents/YouTubeVideo.php | 24 +- app/Providers/NativeServiceProvider.php | 12 +- bootstrap/app.php | 2 +- composer.json | 30 +- composer.lock | 1445 +++++++++-------- config/native-ui.php | 22 +- config/view.php | 40 + resources/animations/jump.lottie | Bin 0 -> 8455 bytes resources/animations/jump2.lottie | Bin 0 -> 13533 bytes resources/fonts/SpaceGrotesk-Bold.ttf | Bin 0 -> 69308 bytes resources/fonts/SpaceGrotesk-Regular.ttf | Bin 0 -> 69360 bytes resources/fonts/Unbounded-Bold.ttf | Bin 0 -> 349248 bytes .../views/native/_vibe-account.blade.php | 14 - resources/views/native/animate.blade.php | 40 +- resources/views/native/buttons-form.blade.php | 37 +- resources/views/native/checkbox.blade.php | 2 +- .../views/native/compose-tweet.blade.php | 56 +- resources/views/native/counter.blade.php | 9 +- .../views/native/demo-launcher.blade.php | 4 +- resources/views/native/demo.blade.php | 28 +- resources/views/native/doom-game.blade.php | 141 -- resources/views/native/drawer-demo.blade.php | 34 - resources/views/native/drawer-menu.blade.php | 31 - .../views/native/event-channel-test.blade.php | 2 +- .../views/native/explore-icons-row.blade.php | 2 +- resources/views/native/explore.blade.php | 103 +- .../views/native/explore/buttons.blade.php | 46 +- .../views/native/explore/cards.blade.php | 2 +- .../views/native/explore/forms.blade.php | 8 +- .../views/native/explore/pickers.blade.php | 104 ++ .../views/native/explore/sheets.blade.php | 34 +- .../views/native/facebook-create.blade.php | 74 +- .../views/native/facebook-feed.blade.php | 332 ++-- .../views/native/facebook-post.blade.php | 260 +-- .../views/native/facebook-profile.blade.php | 299 ++-- resources/views/native/game-pad.blade.php | 118 ++ .../views/native/geo-watch-demo.blade.php | 56 - resources/views/native/gesture-demo.blade.php | 2 +- resources/views/native/home.blade.php | 2 +- resources/views/native/iherb-cart.blade.php | 91 -- .../views/native/iherb-category.blade.php | 97 -- .../views/native/iherb-product.blade.php | 161 -- resources/views/native/iherb-store.blade.php | 164 -- resources/views/native/ikea-cart.blade.php | 103 -- resources/views/native/ikea-home.blade.php | 164 -- resources/views/native/ikea-product.blade.php | 152 -- resources/views/native/ikea-search.blade.php | 94 -- .../views/native/instagram-feed.blade.php | 188 ++- .../views/native/instagram-post.blade.php | 220 +-- .../views/native/instagram-profile.blade.php | 89 +- .../views/native/instagram-search.blade.php | 80 +- resources/views/native/item-detail.blade.php | 2 +- .../views/native/listing-detail.blade.php | 12 +- resources/views/native/mail-demo.blade.php | 2 +- .../views/native/native-chrome-demo.blade.php | 50 - .../native/native-chrome-detail.blade.php | 29 - .../views/native/native-tabs-home.blade.php | 48 - .../native/native-tabs-profile.blade.php | 21 - .../views/native/partials/demo-nav.blade.php | 1 - .../native/partials/search-sheet.blade.php | 2 +- resources/views/native/perf-demo.blade.php | 101 -- resources/views/native/perf-row.blade.php | 5 - .../views/native/perf-showdown.blade.php | 93 -- .../views/native/reactivity-demo.blade.php | 4 +- .../views/native/search-post-row.blade.php | 2 +- .../views/native/skia-showcase.blade.php | 342 ---- .../views/native/spotify-artist.blade.php | 93 +- resources/views/native/spotify-home.blade.php | 140 +- .../views/native/spotify-playlist.blade.php | 60 +- .../views/native/spotify-search.blade.php | 80 +- .../native/stack-positioning-demo.blade.php | 406 +++++ .../views/native/syncup-native/chat.blade.php | 12 +- resources/views/native/syncup/chat.blade.php | 120 -- resources/views/native/syncup/chats.blade.php | 10 +- .../views/native/syncup/friends.blade.php | 10 +- resources/views/native/syncup/login.blade.php | 14 +- .../views/native/syncup/profile.blade.php | 10 +- resources/views/native/test-layout.blade.php | 21 - resources/views/native/testing.blade.php | 3 - resources/views/native/theme-lab.blade.php | 134 ++ resources/views/native/tweet-detail.blade.php | 274 ++-- resources/views/native/twitter-feed.blade.php | 193 ++- .../views/native/twitter-profile.blade.php | 215 +-- resources/views/native/vibe-demo.blade.php | 38 - resources/views/native/vibe-login.blade.php | 34 - .../views/native/vibe-presence-demo.blade.php | 83 - .../views/native/youtube-channel.blade.php | 115 +- resources/views/native/youtube-home.blade.php | 156 +- .../views/native/youtube-search.blade.php | 158 +- .../views/native/youtube-video.blade.php | 298 ++-- routes/{web.php => mobile.php} | 115 +- tests/Feature/Native/AccessibilityTest.php | 47 +- tests/Feature/Native/CounterTest.php | 12 - tests/Feature/Native/DemoLauncherTest.php | 2 +- tests/Feature/Native/DemoScreensSmokeTest.php | 16 +- tests/Feature/Native/ExplorePickersTest.php | 170 ++ tests/Feature/Native/FacebookProfileTest.php | 76 + tests/Feature/Native/GamePadTest.php | 99 ++ .../Native/NavigationTransitionsTest.php | 25 +- tests/Feature/Native/SpotifyScreensTest.php | 100 ++ tests/Feature/Native/ThemeLabTest.php | 50 + tests/Feature/Native/TwitterProfileTest.php | 85 + tests/Feature/Native/YouTubeScreensTest.php | 107 ++ tests/Feature/StackPositioningDemoTest.php | 45 + 169 files changed, 5482 insertions(+), 7653 deletions(-) delete mode 100644 .DS_Store delete mode 100644 app/NativeComponents/Concerns/HasIkeaData.php delete mode 100644 app/NativeComponents/DrawerHome.php delete mode 100644 app/NativeComponents/DrawerReveal.php create mode 100644 app/NativeComponents/EdgeChildTest.php create mode 100644 app/NativeComponents/EdgeChildTestCard.php create mode 100644 app/NativeComponents/ExplorePickers.php create mode 100644 app/NativeComponents/GamePad.php delete mode 100644 app/NativeComponents/GeoWatchDemo.php delete mode 100644 app/NativeComponents/IkeaCart.php delete mode 100644 app/NativeComponents/IkeaHome.php delete mode 100644 app/NativeComponents/IkeaProduct.php delete mode 100644 app/NativeComponents/IkeaSearch.php create mode 100644 app/NativeComponents/JustifyRepro.php delete mode 100644 app/NativeComponents/Layouts/DrawerLayout.php delete mode 100644 app/NativeComponents/Layouts/NativeTabsLayout.php delete mode 100644 app/NativeComponents/NativeChromeDemo.php delete mode 100644 app/NativeComponents/NativeChromeDetail.php delete mode 100644 app/NativeComponents/NativeTabsHome.php delete mode 100644 app/NativeComponents/NativeTabsProfile.php delete mode 100644 app/NativeComponents/PerfDemo.php delete mode 100644 app/NativeComponents/PerfShowdown.php delete mode 100644 app/NativeComponents/Phase1KeyTest.php delete mode 100644 app/NativeComponents/Phase2MemoTest.php delete mode 100644 app/NativeComponents/Phase4VirtualListTest.php delete mode 100644 app/NativeComponents/SkiaShowcase.php create mode 100644 app/NativeComponents/StackPositioningDemo.php delete mode 100644 app/NativeComponents/SyncUpChat.php delete mode 100644 app/NativeComponents/SyncUpChats.php delete mode 100644 app/NativeComponents/SyncUpFriends.php delete mode 100644 app/NativeComponents/SyncUpLogin.php delete mode 100644 app/NativeComponents/SyncUpProfile.php create mode 100644 app/NativeComponents/ThemeLab.php delete mode 100644 app/NativeComponents/VibeDemo.php delete mode 100644 app/NativeComponents/VibeLogin.php delete mode 100644 app/NativeComponents/VibePresenceDemo.php delete mode 100644 app/NativeComponents/VibePrivateDemo.php create mode 100644 config/view.php create mode 100644 resources/animations/jump.lottie create mode 100644 resources/animations/jump2.lottie create mode 100644 resources/fonts/SpaceGrotesk-Bold.ttf create mode 100644 resources/fonts/SpaceGrotesk-Regular.ttf create mode 100644 resources/fonts/Unbounded-Bold.ttf delete mode 100644 resources/views/native/_vibe-account.blade.php delete mode 100644 resources/views/native/doom-game.blade.php delete mode 100644 resources/views/native/drawer-demo.blade.php delete mode 100644 resources/views/native/drawer-menu.blade.php create mode 100644 resources/views/native/explore/pickers.blade.php create mode 100644 resources/views/native/game-pad.blade.php delete mode 100644 resources/views/native/geo-watch-demo.blade.php delete mode 100644 resources/views/native/iherb-cart.blade.php delete mode 100644 resources/views/native/iherb-category.blade.php delete mode 100644 resources/views/native/iherb-product.blade.php delete mode 100644 resources/views/native/iherb-store.blade.php delete mode 100644 resources/views/native/ikea-cart.blade.php delete mode 100644 resources/views/native/ikea-home.blade.php delete mode 100644 resources/views/native/ikea-product.blade.php delete mode 100644 resources/views/native/ikea-search.blade.php delete mode 100644 resources/views/native/native-chrome-demo.blade.php delete mode 100644 resources/views/native/native-chrome-detail.blade.php delete mode 100644 resources/views/native/native-tabs-home.blade.php delete mode 100644 resources/views/native/native-tabs-profile.blade.php delete mode 100644 resources/views/native/perf-demo.blade.php delete mode 100644 resources/views/native/perf-row.blade.php delete mode 100644 resources/views/native/perf-showdown.blade.php delete mode 100644 resources/views/native/skia-showcase.blade.php create mode 100644 resources/views/native/stack-positioning-demo.blade.php delete mode 100644 resources/views/native/syncup/chat.blade.php delete mode 100644 resources/views/native/test-layout.blade.php delete mode 100644 resources/views/native/testing.blade.php create mode 100644 resources/views/native/theme-lab.blade.php delete mode 100644 resources/views/native/vibe-demo.blade.php delete mode 100644 resources/views/native/vibe-login.blade.php delete mode 100644 resources/views/native/vibe-presence-demo.blade.php rename routes/{web.php => mobile.php} (61%) create mode 100644 tests/Feature/Native/ExplorePickersTest.php create mode 100644 tests/Feature/Native/FacebookProfileTest.php create mode 100644 tests/Feature/Native/GamePadTest.php create mode 100644 tests/Feature/Native/SpotifyScreensTest.php create mode 100644 tests/Feature/Native/ThemeLabTest.php create mode 100644 tests/Feature/Native/TwitterProfileTest.php create mode 100644 tests/Feature/Native/YouTubeScreensTest.php create mode 100644 tests/Feature/StackPositioningDemoTest.php diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 9816c96dc6baad6a01a6a864af976e5113d5ae39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12292 zcmeHNYit}>6~1TIj~S9l#?H%|2ibI8+JJHF*rZ8H+qJ!E6OzVmY{!oCaA$YM-od*w z+nwEY9)wy&B27yLDi6_8HT^*ap;9GOT1AM^6k0XEN=e*MT7e=|A+-gy0Rf_-66fAK zYv0+2f1nBk%&g|#nS0K?=eysWb00HH2!Y;$(MiaSgb*1|nrn+O`7$AqMVJc*mD980 z2w@4}c^95|tr6l9hZIPTB#Bv}U0EPu5v^Z`r-HRiUwt>@#N&yylR&Bboij(@dEtjI z_YnE)sm^QfJc(Dq5ik%i5HJuh5HJuh@UJjH=UzPIviY8u25G=Rz`*}C19W_d;7RkC zm(TE=4IP-!B|MeWB|JOu8utOLEaK%cFQ4H#tBQ44Rm^!+@U|Ght7CbDs$(AW@)@4< z>I8Uo0-j~?b|}ECW4#DdClKR#kOm9{3{*0(5{s(ty^YGfcU8@7s&g>uWU{Pj^$D6a z;9j1-2guVMeR@)mlN-*L%f(&(_C4^}TbJ41-q%LPnMYGg$A^OqP#lf;J|T}tazrPS z#7s=PS?_(qxkNT?x%rNcDKhv6MtPBZcrfKm59alJ!R^&^2kG6A^g+BT>y^l_^x?77RW#gU zAMbZ4Uh4OorG6_PTeMhRq7LsL9vMBLj%&?D>|%d5Z#lNR-^{s~k84X^q+(anu?KP{ zm5(HybRlEA<62WvPbUj$J#Y4;(}UJ=(;d@~4w*;u^qN*o=A3kTz;P|w;(^h8Ez#(h z>*Vr%tld!yP4Nb_f@|(Gv3;v(#?gwqe2xo#0m{=$Th?9oiBENWX8WyuckJ$;)tZ`@ zEnlIkV@SW9w2{dziK!vWtoVlTMs>)= z{>z%q72DKyb!ZCxL(yDb(y4ZZhtqn(Oe>nft8G!YhDVB=az)$C3vX6eghw&FGT0SY z;bpgld%{Pk**&_O@6Vbxg>;e2;wT$)Q+m$qpGN=m5beZL_7t(4R@z}$d4~#FuOs2T zvV4Fx*kc%`!TK-|-iI|b%Pv|N5BTVKSjgHXS&7ElIrq`hvxr_Wud-`KXf)Qr1q#mT z>q$4co$MtEk|Fn!`^lr^N%Ay#fm|Y&$?wR!Ux#nPx8MwX555mSfT!R`a2|dN z&%;Id6}%2_z?<+Eya(^YHTXbUEUD5GX_eF>g{7#}Cfz2*q+Y2{ic5D&`=xQokTM*+ zREoia{JxY*HeQv-pj-4t7U_Jg2-~@9=jV3s`LB$yUoYh`wQ^O<1{!GFZtb1(N$$iY zzZIi_g@7+`SO_o|DRbZ1@ai>d*Qx6xrNEpIRUW#-7(3=sS;1J<8a?gS>t&1`t=_xc z_({Cotu^r5b?uvEj8jcwx9YmCZUv)J3wgKgTk#h7jr!SJ6pTx)ZZ^DT^;&hk+Jm>m zYi7so*vv)kBXs)TllRD9$cLby)31RDx_URbBtN8vGeoVom2=JLa%!Hl@-o*Jr|0JyPPINV%ckcFt@#PMww5?Whky+dW$hFPb9UOX zClL<~zk0rez_e@`G4Kn&R77d~(fd^3t1m7gs%wbon0304DdG~wCI($Zh!btS^YEV$ zfln@CSlj&D)?Kf83mKse5k)N>5l7=OZzx4$!4WVJFc2^hFc2{C(J`a|gERq+QlFod37mDX(B9^mj;w|3tLy*rSs3sTfN8>&m$8yqA2s)r<`)Rh#}KGw0Yx?nBp!_u;XAXMJ z1Tr}3dukARrCcszIvsswYEfw$A+#Z~RZGW*1DM~)7&|&Lq$6KCa^?47sdWWnsn8Me zT>04tW64(;M^*IZ8Cposhl~D$jQW?&a9M1-mBrB}J7KuV1ipKvyTB@9k;JXB;peMs ziO_HQ#@kVE?^>ljkb|d}%zoYj5|F~9=1`GrY{7*6fb@9P? zFLuov7b-eQUmQm8yc +```shell +./vendor/bin/pest --parallel --tia +``` + +- Replayed tests are not skipped — cached tests store everything they produced, including covered lines and branches. +- Detects Laravel, Symfony, Livewire, and Inertia automatically. + +### New Validation Expectations + +Pest 5 ships eight new validation matchers, all supporting `.not` negation: + + +```php +expect('nuno@pestphp.com')->toBeEmail(); +expect('01ARZ3NDEKTSV4RRFFQ69G5FAV')->toBeUlid(); +expect('192.168.1.1')->toBeIpAddress(); +expect('00:1a:2b:3c:4d:5e')->toBeMacAddress(); +expect('example.com')->toBeHostname(); +expect('example.co.uk')->toBeDomain(); +expect('Zm9vYmFy')->toBeBase64(); +expect('deadbeef')->toBeHexadecimal(); +``` + +### Time-Balanced Sharding + +Distribute tests across CI shards by execution time rather than count: + + +```shell +./vendor/bin/pest --update-shards +./vendor/bin/pest --shard=1/4 +``` + +Commit `tests/.pest/shards.json` to the repository so CI shards stay consistent. + ### Browser Test Example Browser tests run in real browsers for full integration testing: @@ -140,14 +183,8 @@ $pages->assertNoJavaScriptErrors()->assertNoConsoleLogs(); Capture and compare screenshots to detect visual changes. -### Test Sharding - -Split tests across parallel processes for faster CI runs. - ### Architecture Testing -Pest 4 includes architecture testing (from Pest 3): - ```php arch('controllers') diff --git a/.junie/skills/pest-testing/SKILL.md b/.junie/skills/pest-testing/SKILL.md index ab27161..79cd0bc 100644 --- a/.junie/skills/pest-testing/SKILL.md +++ b/.junie/skills/pest-testing/SKILL.md @@ -1,16 +1,16 @@ --- name: pest-testing -description: "Use this skill for Pest PHP testing in Laravel projects only. Trigger whenever any test is being written, edited, fixed, or refactored — including fixing tests that broke after a code change, adding assertions, converting PHPUnit to Pest, adding datasets, and TDD workflows. Always activate when the user asks how to write something in Pest, mentions test files or directories (tests/Feature, tests/Unit, tests/Browser), or needs browser testing, smoke testing multiple pages for JS errors, or architecture tests. Covers: test()/it()/expect() syntax, datasets, mocking, browser testing (visit/click/fill), smoke testing, arch(), Livewire component tests, RefreshDatabase, and all Pest 4 features. Do not use for factories, seeders, migrations, controllers, models, or non-test PHP code." +description: "Use this skill for Pest PHP testing in Laravel projects only. Trigger whenever any test is being written, edited, fixed, or refactored — including fixing tests that broke after a code change, adding assertions, converting PHPUnit to Pest, adding datasets, and TDD workflows. Always activate when the user asks how to write something in Pest, mentions test files or directories (tests/Feature, tests/Unit, tests/Browser), or needs browser testing, smoke testing multiple pages for JS errors, architecture tests, or faster test runs with Test Impact Analysis. Covers: test()/it()/expect() syntax, datasets, mocking, browser testing (visit/click/fill), smoke testing, arch(), Livewire component tests, RefreshDatabase, Tia (--tia), sharding, and all Pest 5 features. Do not use for factories, seeders, migrations, controllers, models, or non-test PHP code." license: MIT metadata: author: laravel --- -# Pest Testing 4 +# Pest Testing 5 ## Documentation -Use `search-docs` for detailed Pest 4 patterns and documentation. +Use `search-docs` for detailed Pest 5 patterns and documentation. ## Basic Usage @@ -46,6 +46,7 @@ it('is true', function () { - Run minimal tests with filter before finalizing: `php artisan test --compact --filter=testName`. - Run all tests: `php artisan test --compact`. - Run file: `php artisan test --compact tests/Feature/ExampleTest.php`. +- Run only tests affected by recent changes (Tia): `./vendor/bin/pest --parallel --tia`. ## Assertions @@ -82,16 +83,58 @@ it('has emails', function (string $email) { ]); ``` -## Pest 4 Features +## Pest 5 Features | Feature | Purpose | |---------|---------| +| Tia (Test Impact Analysis) | Rerun only tests affected by recent changes | +| Time-Balanced Sharding | Split tests across CI shards by execution time | +| New Validation Expectations | `toBeEmail()`, `toBeUlid()`, `toBeIpAddress()`, and more | | Browser Testing | Full integration tests in real browsers | | Smoke Testing | Validate multiple pages quickly | | Visual Regression | Compare screenshots for visual changes | -| Test Sharding | Parallel CI runs | | Architecture Testing | Enforce code conventions | +### Tia (Test Impact Analysis) + +Tia reruns only tests affected by recent changes and replays cached results for the rest, dramatically reducing suite duration: + + +```shell +./vendor/bin/pest --parallel --tia +``` + +- Replayed tests are not skipped — cached tests store everything they produced, including covered lines and branches. +- Detects Laravel, Symfony, Livewire, and Inertia automatically. + +### New Validation Expectations + +Pest 5 ships eight new validation matchers, all supporting `.not` negation: + + +```php +expect('nuno@pestphp.com')->toBeEmail(); +expect('01ARZ3NDEKTSV4RRFFQ69G5FAV')->toBeUlid(); +expect('192.168.1.1')->toBeIpAddress(); +expect('00:1a:2b:3c:4d:5e')->toBeMacAddress(); +expect('example.com')->toBeHostname(); +expect('example.co.uk')->toBeDomain(); +expect('Zm9vYmFy')->toBeBase64(); +expect('deadbeef')->toBeHexadecimal(); +``` + +### Time-Balanced Sharding + +Distribute tests across CI shards by execution time rather than count: + + +```shell +./vendor/bin/pest --update-shards +./vendor/bin/pest --shard=1/4 +``` + +Commit `tests/.pest/shards.json` to the repository so CI shards stay consistent. + ### Browser Test Example Browser tests run in real browsers for full integration testing: @@ -140,14 +183,8 @@ $pages->assertNoJavaScriptErrors()->assertNoConsoleLogs(); Capture and compare screenshots to detect visual changes. -### Test Sharding - -Split tests across parallel processes for faster CI runs. - ### Architecture Testing -Pest 4 includes architecture testing (from Pest 3): - ```php arch('controllers') diff --git a/AGENTS.md b/AGENTS.md index fbf2d02..e4c2ca3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -17,8 +17,8 @@ This application is a Laravel application and its main Laravel ecosystems packag - laravel/pail (PAIL) - v1 - laravel/pint (PINT) - v1 - laravel/sail (SAIL) - v1 -- pestphp/pest (PEST) - v4 -- phpunit/phpunit (PHPUNIT) - v12 +- pestphp/pest (PEST) - v5 +- phpunit/phpunit (PHPUNIT) - v13 - tailwindcss (TAILWINDCSS) - v4 ## Skills Activation @@ -107,13 +107,6 @@ This project has domain-specific skills available in `**/skills/**`. You MUST ac - Laravel can be deployed using [Laravel Cloud](https://cloud.laravel.com/), which is the fastest way to deploy and scale production Laravel applications. -=== herd rules === - -# Laravel Herd - -- The application is served by Laravel Herd at `https?://[kebab-case-project-dir].test`. Use the `get-absolute-url` tool to generate valid URLs. Never run commands to serve the site. It is always available. -- Use the `herd` CLI to manage services, PHP versions, and sites (e.g. `herd sites`, `herd services:start `, `herd php:list`). Run `herd list` to discover all available commands. - === tests rules === # Test Enforcement diff --git a/CLAUDE.md b/CLAUDE.md index fbf2d02..e4c2ca3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -17,8 +17,8 @@ This application is a Laravel application and its main Laravel ecosystems packag - laravel/pail (PAIL) - v1 - laravel/pint (PINT) - v1 - laravel/sail (SAIL) - v1 -- pestphp/pest (PEST) - v4 -- phpunit/phpunit (PHPUNIT) - v12 +- pestphp/pest (PEST) - v5 +- phpunit/phpunit (PHPUNIT) - v13 - tailwindcss (TAILWINDCSS) - v4 ## Skills Activation @@ -107,13 +107,6 @@ This project has domain-specific skills available in `**/skills/**`. You MUST ac - Laravel can be deployed using [Laravel Cloud](https://cloud.laravel.com/), which is the fastest way to deploy and scale production Laravel applications. -=== herd rules === - -# Laravel Herd - -- The application is served by Laravel Herd at `https?://[kebab-case-project-dir].test`. Use the `get-absolute-url` tool to generate valid URLs. Never run commands to serve the site. It is always available. -- Use the `herd` CLI to manage services, PHP versions, and sites (e.g. `herd sites`, `herd services:start `, `herd php:list`). Run `herd list` to discover all available commands. - === tests rules === # Test Enforcement diff --git a/README.md b/README.md index b49210c..c384cad 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ php artisan native:run android -W --no-vite ``` app/NativeComponents/Explore.php # The kitchen sink component resources/views/native/explore.blade.php # Blade template with <*> elements -routes/web.php # Single route: / → Explore +routes/mobile.php # All native routes (Route::native / nativeGroup) ``` ## License diff --git a/app/NativeComponents/Concerns/HasIkeaData.php b/app/NativeComponents/Concerns/HasIkeaData.php deleted file mode 100644 index 87126eb..0000000 --- a/app/NativeComponents/Concerns/HasIkeaData.php +++ /dev/null @@ -1,274 +0,0 @@ - - */ - public static function ikeaCategories(): array - { - return [ - ['name' => 'Living Room', 'icon' => 'weekend'], - ['name' => 'Bedroom', 'icon' => 'bed'], - ['name' => 'Kitchen', 'icon' => 'countertops'], - ['name' => 'Bathroom', 'icon' => 'bathroom'], - ['name' => 'Office', 'icon' => 'desk'], - ['name' => 'Dining', 'icon' => 'dining'], - ['name' => 'Outdoor', 'icon' => 'deck'], - ['name' => 'Storage', 'icon' => 'shelves'], - ]; - } - - /** - * @return array - */ - public static function ikeaProducts(): array - { - return [ - [ - 'name' => 'Sofa, 3-seat', - 'seriesName' => 'KLIPPAN', - 'imageUrl' => 'https://picsum.photos/seed/klippan/400/400', - 'price' => 349.00, - 'originalPrice' => null, - 'rating' => 4.5, - 'reviewCount' => 2847, - 'category' => 'Living Room', - 'badge' => null, - 'inStock' => true, - 'description' => 'A comfy sofa with a simple design that works well in various room settings. The cover is easy to keep clean since it is removable and machine washable.', - 'dimensions' => '180x88x66 cm', - 'material' => 'Cotton/polyester cover, wood frame', - 'color' => 'Vissle gray', - 'articleNumber' => '494.178.93', - 'isNew' => false, - ], - [ - 'name' => 'Bookcase', - 'seriesName' => 'KALLAX', - 'imageUrl' => 'https://picsum.photos/seed/kallax/400/400', - 'price' => 84.99, - 'originalPrice' => null, - 'rating' => 4.7, - 'reviewCount' => 5102, - 'category' => 'Storage', - 'badge' => 'Popular', - 'inStock' => true, - 'description' => 'You can use the furniture as a room divider because it looks good from every angle. Choose whether you want to hang it on the wall or stand it on the floor.', - 'dimensions' => '77x39x147 cm', - 'material' => 'Particleboard, fiberboard', - 'color' => 'White', - 'articleNumber' => '802.758.87', - 'isNew' => false, - ], - [ - 'name' => 'Bed frame with storage', - 'seriesName' => 'MALM', - 'imageUrl' => 'https://picsum.photos/seed/malm/400/400', - 'price' => 449.00, - 'originalPrice' => 549.00, - 'rating' => 4.3, - 'reviewCount' => 1893, - 'category' => 'Bedroom', - 'badge' => 'Last chance', - 'inStock' => true, - 'description' => 'Ample storage space is hidden neatly under the bed. A clean design that is just as beautiful on all sides. Place the bed on its own or with the headboard against a wall.', - 'dimensions' => '209x176x100 cm', - 'material' => 'Particleboard, fiberboard, solid wood', - 'color' => 'White stained oak veneer', - 'articleNumber' => '191.573.21', - 'isNew' => false, - ], - [ - 'name' => 'Desk', - 'seriesName' => 'BEKANT', - 'imageUrl' => 'https://picsum.photos/seed/bekant/400/400', - 'price' => 299.00, - 'originalPrice' => null, - 'rating' => 4.4, - 'reviewCount' => 1245, - 'category' => 'Office', - 'badge' => null, - 'inStock' => true, - 'description' => 'Sit/stand desk with a deep table top that provides a generous work surface. The net underneath keeps cables in place but is easily accessible.', - 'dimensions' => '160x80x65-125 cm', - 'material' => 'Particleboard, linoleum, steel', - 'color' => 'White/white', - 'articleNumber' => '490.228.08', - 'isNew' => false, - ], - [ - 'name' => 'Kitchen island', - 'seriesName' => 'VADHOLMA', - 'imageUrl' => 'https://picsum.photos/seed/vadholma/400/400', - 'price' => 499.00, - 'originalPrice' => null, - 'rating' => 4.6, - 'reviewCount' => 832, - 'category' => 'Kitchen', - 'badge' => null, - 'inStock' => true, - 'description' => 'Gives you extra storage, utility and work space. Perfect as a kitchen island in a bigger kitchen or against a wall in a smaller one.', - 'dimensions' => '126x79x90 cm', - 'material' => 'Solid birch, stainless steel', - 'color' => 'Black/oak', - 'articleNumber' => '303.508.22', - 'isNew' => false, - ], - [ - 'name' => 'LED floor lamp', - 'seriesName' => 'HEKTOGRAM', - 'imageUrl' => 'https://picsum.photos/seed/hekto/400/400', - 'price' => 39.99, - 'originalPrice' => 49.99, - 'rating' => 4.2, - 'reviewCount' => 612, - 'category' => 'Living Room', - 'badge' => 'Lower price', - 'inStock' => true, - 'description' => 'Provides soft ambient lighting. You can easily aim the light where you need it because the lamp head is adjustable. Uses LEDs, which consume up to 85% less energy.', - 'dimensions' => '176 cm', - 'material' => 'Steel, polycarbonate', - 'color' => 'Dark gray', - 'articleNumber' => '004.601.81', - 'isNew' => false, - ], - [ - 'name' => 'Dining table', - 'seriesName' => 'LISABO', - 'imageUrl' => 'https://picsum.photos/seed/lisabo/400/400', - 'price' => 199.00, - 'originalPrice' => null, - 'rating' => 4.5, - 'reviewCount' => 976, - 'category' => 'Dining', - 'badge' => null, - 'inStock' => true, - 'description' => 'Each table has its own unique character due to the distinctive grain pattern. The table top and legs are made of ash veneer and solid birch, durable materials.', - 'dimensions' => '140x78x74 cm', - 'material' => 'Ash veneer, solid birch', - 'color' => 'Ash veneer', - 'articleNumber' => '502.943.39', - 'isNew' => false, - ], - [ - 'name' => 'Outdoor lounge chair', - 'seriesName' => 'APPLARO', - 'imageUrl' => 'https://picsum.photos/seed/applaro/400/400', - 'price' => 130.00, - 'originalPrice' => 165.00, - 'rating' => 4.3, - 'reviewCount' => 543, - 'category' => 'Outdoor', - 'badge' => 'Lower price', - 'inStock' => true, - 'description' => 'Perfect for relaxing outdoors. The back can be adjusted to five different positions. Foldable, easy to store when not in use.', - 'dimensions' => '63x80x101 cm', - 'material' => 'Acacia wood', - 'color' => 'Brown stained', - 'articleNumber' => '202.085.29', - 'isNew' => false, - ], - [ - 'name' => 'Mirror cabinet with 2 doors', - 'seriesName' => 'HEMNES', - 'imageUrl' => 'https://picsum.photos/seed/hemnes/400/400', - 'price' => 189.00, - 'originalPrice' => null, - 'rating' => 4.6, - 'reviewCount' => 1134, - 'category' => 'Bathroom', - 'badge' => null, - 'inStock' => true, - 'description' => 'Shallow cabinet to keep all your smaller bathroom items organized. The mirror comes with safety film on the back, which reduces the risk of injury.', - 'dimensions' => '83x16x98 cm', - 'material' => 'Solid pine, mirror glass', - 'color' => 'White', - 'articleNumber' => '302.176.68', - 'isNew' => false, - ], - [ - 'name' => 'Armchair', - 'seriesName' => 'STRANDMON', - 'imageUrl' => 'https://picsum.photos/seed/strandmon/400/400', - 'price' => 329.00, - 'originalPrice' => null, - 'rating' => 4.8, - 'reviewCount' => 3421, - 'category' => 'Living Room', - 'badge' => 'Top seller', - 'inStock' => true, - 'description' => 'A classic wing chair with a timeless design. The high back provides extra support for your neck. Year after year it becomes one of the most beloved armchairs.', - 'dimensions' => '82x96x101 cm', - 'material' => 'Cotton/polyester, birch frame', - 'color' => 'Nordvalla dark gray', - 'articleNumber' => '903.432.24', - 'isNew' => false, - ], - [ - 'name' => 'Wardrobe', - 'seriesName' => 'PAX', - 'imageUrl' => 'https://picsum.photos/seed/pax/400/400', - 'price' => 570.00, - 'originalPrice' => null, - 'rating' => 4.4, - 'reviewCount' => 2156, - 'category' => 'Bedroom', - 'badge' => null, - 'inStock' => true, - 'description' => 'The PAX wardrobe can be customized to meet all your storage needs. Combine frames, doors, and interior organizers for a personalized solution.', - 'dimensions' => '150x60x236 cm', - 'material' => 'Particleboard, fiberboard', - 'color' => 'White', - 'articleNumber' => '290.235.17', - 'isNew' => false, - ], - [ - 'name' => 'Rug, flatwoven', - 'seriesName' => 'STOCKHOLM', - 'imageUrl' => 'https://picsum.photos/seed/stockholm/400/400', - 'price' => 249.00, - 'originalPrice' => null, - 'rating' => 4.7, - 'reviewCount' => 789, - 'category' => 'Living Room', - 'badge' => 'New', - 'inStock' => true, - 'description' => 'The rug is hand-woven by skilled craftspeople. The striped pattern with bold colors makes it a statement piece in any living room.', - 'dimensions' => '170x240 cm', - 'material' => '100% wool', - 'color' => 'Striped black/off-white', - 'articleNumber' => '902.290.06', - 'isNew' => true, - ], - ]; - } - - /** - * @return array - */ - public static function ikeaRoomIdeas(): array - { - return ['Small spaces', 'Scandinavian style', 'Budget friendly', 'Sustainable living', 'Student life', 'Family home']; - } - - public static function formatIkeaPrice(float $price): string - { - if ($price == floor($price)) { - return '$' . number_format($price, 0); - } - - return '$' . number_format($price, 2); - } - - public static function formatIkeaReviewCount(int $count): string - { - if ($count >= 1000) { - return number_format($count / 1000, 1) . 'k'; - } - - return (string) $count; - } -} diff --git a/app/NativeComponents/Counter.php b/app/NativeComponents/Counter.php index aa792f7..b2321a6 100644 --- a/app/NativeComponents/Counter.php +++ b/app/NativeComponents/Counter.php @@ -5,15 +5,11 @@ use Illuminate\View\View; use Native\Mobile\Edge\Layouts\Builders\NavBarOptions; use Native\Mobile\Edge\NativeComponent; -use Native\Mobile\Edge\Transition; -use Native\Mobile\Facades\Camera; class Counter extends NativeComponent { public $count = 0; - public $photo = ''; - public function navTitle(): string { return 'Counter'; @@ -29,13 +25,6 @@ public function decrement() $this->count--; } - public function testCamera() - { - Camera::getPhoto()->photoTaken(function ($photo) { - $this->photo = $photo->path; - }); - } - public function navigationOptions(): ?NavBarOptions { return NavBarOptions::make() diff --git a/app/NativeComponents/DemoLauncher.php b/app/NativeComponents/DemoLauncher.php index b7d2c71..ab3fcda 100644 --- a/app/NativeComponents/DemoLauncher.php +++ b/app/NativeComponents/DemoLauncher.php @@ -27,7 +27,9 @@ class DemoLauncher extends NativeComponent 'title' => 'Fundamentals', 'demos' => [ ['id' => 'counter', 'title' => 'Counter', 'subtitle' => 'Minimal Livewire-style counter', 'icon' => 'add', 'color' => '#10B981', 'url' => '/counter'], + ['id' => 'forms', 'title' => 'Slider', 'subtitle' => 'Text input, slider, toggle, checkbox, select, radio', 'icon' => 'square.text.square', 'color' => '#10B981', 'url' => '/explore/forms'], ['id' => 'typography', 'title' => 'Typography & Colors', 'subtitle' => 'Sizes, theme tokens, tailwind palette', 'icon' => 'textformat.alt', 'color' => '#A855F7', 'url' => '/explore/typography'], + ['id' => 'themelab', 'title' => 'Theme Lab', 'subtitle' => 'Design tokens, opacity ramps, variants, font aliases — live in light & dark', 'icon' => 'paintpalette.fill', 'color' => '#8B5CF6', 'url' => '/theme-lab'], ['id' => 'buttons', 'title' => 'Buttons', 'subtitle' => 'Variants, sizes, icons, states, pressable', 'icon' => 'square.and.pencil', 'color' => '#0EA5E9', 'url' => '/explore/buttons'], ['id' => 'buttonsform', 'title' => 'Buttons (Form)', 'subtitle' => 'Variants, sizes, extras in a NavigationStack + grouped form', 'icon' => 'list.bullet.rectangle', 'color' => '#0EA5E9', 'url' => '/buttons-form'], ['id' => 'icons', 'title' => 'Icons', 'subtitle' => 'IconHelper catalog + direct SF Symbols', 'icon' => 'star.fill', 'color' => '#EC4899', 'url' => '/explore/icons'], @@ -38,37 +40,27 @@ class DemoLauncher extends NativeComponent 'title' => 'Components & Patterns', 'demos' => [ ['id' => 'cards', 'title' => 'Cards & Chips', 'subtitle' => 'Card variants, chips, badges, list items', 'icon' => 'rectangle.stack.fill', 'color' => '#F59E0B', 'url' => '/explore/cards'], - ['id' => 'forms', 'title' => 'Slider', 'subtitle' => 'Text input, slider, toggle, checkbox, select, radio', 'icon' => 'square.text.square', 'color' => '#10B981', 'url' => '/explore/forms'], + ['id' => 'pickers', 'title' => 'Date & Time Pickers', 'subtitle' => 'Date/time/datetime, bounds, timezones, locales, inline & wheel', 'icon' => 'calendar', 'color' => '#F43F5E', 'url' => '/explore/pickers'], ['id' => 'sheets', 'title' => 'Sheets & Modals', 'subtitle' => 'Bottom-sheet detents, dismissible + blocking modals', 'icon' => 'square.on.square', 'color' => '#A855F7', 'url' => '/explore/sheets'], ['id' => 'menus', 'title' => 'Menus', 'subtitle' => 'Tap-to-open dropdowns on Pressable, Button, ListItem.trailing', 'icon' => 'ellipsis.circle', 'color' => '#0891B2', 'url' => '/explore/menus'], ['id' => 'mail', 'title' => 'Mail Inbox', 'subtitle' => 'Pull-to-refresh + leading/trailing swipe actions', 'icon' => 'envelope.fill', 'color' => '#0EA5E9', 'url' => '/mail-demo'], ['id' => 'refresh', 'title' => 'Pull to refresh', 'subtitle' => 'Native pull-to-refresh on custom card content', 'icon' => 'arrow.clockwise', 'color' => '#10B981', 'url' => '/refreshable-demo'], ['id' => 'reactivity', 'title' => 'Reactivity', 'subtitle' => '#[Computed], #[Poll] and #[Lazy] placeholder in one screen', 'icon' => 'bolt.fill', 'color' => '#8B5CF6', 'url' => '/reactivity'], - // ['id' => 'eventchannel', 'title' => 'Event Channel Test', 'subtitle' => 'Native → PHP payload > 4KB (growable event buffer)', 'icon' => 'arrow.up.arrow.down', 'color' => '#EF4444', 'url' => '/event-channel-test'], - // ['id' => 'vibe', 'title' => 'Vibe — Live Events', 'subtitle' => 'Websocket broadcast events (Vask/Reverb) into a component', 'icon' => 'antenna.radiowaves.left.and.right', 'color' => '#22C55E', 'url' => '/vibe'], - // ['id' => 'vibe-private', 'title' => 'Vibe — Private Channel', 'subtitle' => 'Authenticated private-channel subscription (bearer + /broadcasting/auth)', 'icon' => 'lock.fill', 'color' => '#16A34A', 'url' => '/vibe-private'], - // ['id' => 'vibe-presence', 'title' => 'Vibe — Presence', 'subtitle' => 'Who\'s online + live join/leave (here/joining/leaving)', 'icon' => 'person.2.fill', 'color' => '#15803D', 'url' => '/vibe-presence'], -// ['id' => 'geo-watch', 'title' => 'Geo — Watch Position', 'subtitle' => 'Streaming GPS fixes (watchPosition/clearWatch)', 'icon' => 'location.fill', 'color' => '#F97316', 'url' => '/geo-watch'], ], ], [ 'title' => 'Motion & Chrome', 'demos' => [ ['id' => 'gestures', 'title' => 'Gestures', 'subtitle' => 'Double-tap (@doubleTap) ', 'icon' => 'hand.tap.fill', 'color' => '#6366F1', 'url' => '/gestures'], + ['id' => 'gamepad', 'title' => 'Game Pad', 'subtitle' => 'Held-press d-pad, auto-fire + shield (@tapDown / @tapUp)', 'icon' => 'gamecontroller.fill', 'color' => '#22C55E', 'url' => '/game-pad'], ['id' => 'transitions', 'title' => 'Page Transitions', 'subtitle' => 'Fade, slide, scale - every @navigate animation', 'icon' => 'arrow.left.arrow.right', 'color' => '#14B8A6', 'url' => '/transitions'], ['id' => 'animate', 'title' => 'Animations', 'subtitle' => 'Awesome native animations', 'icon' => 'sparkles', 'color' => '#F59E0B', 'url' => '/animate'], -// ['id' => 'glass', 'title' => 'Glass', 'subtitle' => 'Liquid Glass Demo', 'icon' => 'drop.fill', 'color' => '#0EA5E9', 'url' => '/glass'], - ['id' => 'nativetabs', 'title' => 'Native Tabs', 'subtitle' => 'TabView-rendered bottom bar; Liquid Glass on iOS 26+', 'icon' => 'rectangle.split.3x1', 'color' => '#A855F7', 'url' => '/native-tabs'], - ['id' => 'drawer', 'title' => 'Side Drawer', 'subtitle' => 'X-style slide-out nav — modal + reveal, declared once on the layout', 'icon' => 'line.3.horizontal', 'color' => '#6366F1', 'url' => '/drawer'], - ['id' => 'syncupnative', 'title' => 'SyncUp Messaging', 'subtitle' => 'Login, chat threads, friends, profile (5 screens) — custom chrome', 'icon' => 'bubble.left.fill', 'color' => '#0891b2', 'url' => '/syncup-native'], ], ], [ 'title' => 'Mini Apps', 'demos' => [ - ['id' => 'tabs', 'title' => 'Search Demo', 'subtitle' => 'TabsLayout + StackLayout (Home / Browse / Profile + push detail)', 'icon' => 'dashboard', 'color' => '#6366F1', 'url' => '/tabs'], ['id' => 'twitter', 'title' => 'Twitter / X', 'subtitle' => 'Feed, tweet detail, profile, compose', 'icon' => 'bubble.left.and.bubble.right.fill', 'color' => '#1D9BF0', 'url' => '/twitter'], - ['id' => 'ikea', 'title' => 'IKEA', 'subtitle' => 'Home, product detail, cart, search', 'icon' => 'bed.double.fill', 'color' => '#0058A3', 'url' => '/ikea'], ['id' => 'facebook', 'title' => 'Facebook', 'subtitle' => 'Feed, post, profile, create', 'icon' => 'person.2.fill', 'color' => '#1877F2', 'url' => '/facebook'], ['id' => 'instagram', 'title' => 'Instagram', 'subtitle' => 'Feed, post, profile, search', 'icon' => 'camera', 'color' => '#E1306C', 'url' => '/instagram'], ['id' => 'spotify', 'title' => 'Spotify', 'subtitle' => 'Home, playlist, artist, search', 'icon' => 'music.note', 'color' => '#1DB954', 'url' => '/spotify'], diff --git a/app/NativeComponents/DoomGame.php b/app/NativeComponents/DoomGame.php index c728083..712e5e9 100644 --- a/app/NativeComponents/DoomGame.php +++ b/app/NativeComponents/DoomGame.php @@ -2,6 +2,7 @@ namespace App\NativeComponents; +use Illuminate\View\View; use Local\DoomGame\Models\Enemy; use Local\DoomGame\Models\Player; use Local\DoomGame\Services\GameEngine; @@ -41,6 +42,16 @@ public function mount(): void $this->checkServer(); } + public function unmount(): void + { + // UI.SetBackground is app-global sticky native state — without + // this clear it leaks the window color into every screen visited + // after this one. Empty color = restore the platform default. + nativephp_call('UI.SetBackground', json_encode(['color' => null])); + + parent::unmount(); + } + public function checkServer(): void { $host = config('doom.server_host', '127.0.0.1'); @@ -196,7 +207,7 @@ public function checkResults(): void $this->isMultiplayer = false; } - public function render(): \Illuminate\View\View + public function render(): View { return view('doom-game'); } diff --git a/app/NativeComponents/DrawerHome.php b/app/NativeComponents/DrawerHome.php deleted file mode 100644 index 07f5792..0000000 --- a/app/NativeComponents/DrawerHome.php +++ /dev/null @@ -1,29 +0,0 @@ - 'modal']); - } -} diff --git a/app/NativeComponents/DrawerReveal.php b/app/NativeComponents/DrawerReveal.php deleted file mode 100644 index 8b5aceb..0000000 --- a/app/NativeComponents/DrawerReveal.php +++ /dev/null @@ -1,29 +0,0 @@ - 'reveal']); - } -} diff --git a/app/NativeComponents/EdgeChildTest.php b/app/NativeComponents/EdgeChildTest.php new file mode 100644 index 0000000..065ff9f --- /dev/null +++ b/app/NativeComponents/EdgeChildTest.php @@ -0,0 +1,33 @@ +) — a regression fixture for child-owned + * callback dispatch. Tapping the child's button must run + * EdgeChildTestCard::childTapped(), which emits back here and increments + * $childEvents (screen state, so it persists via the sealed snapshot). + */ +class EdgeChildTest extends NativeComponent +{ + public int $childEvents = 0; + + public function navTitle(): string + { + return 'Edge Child Test'; + } + + public function recordChildTap(int $taps = 0): void + { + $this->childEvents++; + } + + public function render(): View + { + return view('native.edge-child-test'); + } +} diff --git a/app/NativeComponents/EdgeChildTestCard.php b/app/NativeComponents/EdgeChildTestCard.php new file mode 100644 index 0000000..448edc1 --- /dev/null +++ b/app/NativeComponents/EdgeChildTestCard.php @@ -0,0 +1,43 @@ +. + * The @tap lives INSIDE this child, so its callback registers in the + * child's own registry rather than the mounting screen's. + */ +class EdgeChildTestCard extends NativeComponent +{ + /** Prop assigned from the mounting tag. */ + public string $label = 'Child'; + + /** Child-local state; bumps within the request's dispatch → render cycle. */ + public int $taps = 0; + + public function childTapped(): void + { + $this->taps++; + + // Bubbles to the parent's @child-tapped tag binding (screen state + // is snapshotted, so this survives across renders). + $this->emit('child-tapped', $this->taps); + } + + public function render(): Element + { + return Column::make( + Text::make("{$this->label}: child taps {$this->taps}")->fontSize(15), + Pressable::make( + Text::make('Tap child')->fontSize(16)->fontWeight(7), + )->onTap('childTapped')->padding(8), + )->gap(8)->padding(12); + } +} diff --git a/app/NativeComponents/Explore.php b/app/NativeComponents/Explore.php index a63ae0c..0370706 100644 --- a/app/NativeComponents/Explore.php +++ b/app/NativeComponents/Explore.php @@ -3,6 +3,7 @@ namespace App\NativeComponents; use Illuminate\Support\Str; +use Illuminate\View\View; use Native\Mobile\Attributes\OnNative; use Native\Mobile\Edge\NativeComponent; use Native\Mobile\Events\Alert\ButtonPressed; @@ -54,6 +55,16 @@ public function mount(): void $this->items = $this->fetchUsers($this->page); } + public function unmount(): void + { + // UI.SetBackground is app-global sticky native state — without + // this clear it leaks the window color into every screen visited + // after this one. Empty color = restore the platform default. + nativephp_call('UI.SetBackground', json_encode(['color' => null])); + + parent::unmount(); + } + public function showAlert() { Dialog::alert('Hello', 'Pick an option', ['Cancel', 'OK']); @@ -162,7 +173,7 @@ private function fetchUsers(int $page): array } } - public function render(): \Illuminate\View\View + public function render(): View { return view('explore'); } diff --git a/app/NativeComponents/ExploreForms.php b/app/NativeComponents/ExploreForms.php index d83ec6f..c1ec7ec 100644 --- a/app/NativeComponents/ExploreForms.php +++ b/app/NativeComponents/ExploreForms.php @@ -2,19 +2,29 @@ namespace App\NativeComponents; +use Illuminate\View\View; use Native\Mobile\Edge\NativeComponent; class ExploreForms extends NativeComponent { public string $name = ''; + public string $email = ''; + public float $slideValue = 0.0; + public float $slideDebounced = 50.0; - public float $slideBlur = 25.0; + + public float $slideBlur = 2.0; + public bool $subscribed = true; + public bool $termsAccepted = false; + public string $favoriteLanguage = 'PHP'; + public string $pricingPlan = 'pro'; + public bool $notificationsOn = true; public function navTitle(): string @@ -34,7 +44,7 @@ public function selectPricingPlan(string $value): void $this->pricingPlan = $value; } - public function render(): \Illuminate\View\View + public function render(): View { return view('native.explore.forms'); } diff --git a/app/NativeComponents/ExploreIcons.php b/app/NativeComponents/ExploreIcons.php index ce6d84b..c36c4ad 100644 --- a/app/NativeComponents/ExploreIcons.php +++ b/app/NativeComponents/ExploreIcons.php @@ -5,9 +5,9 @@ use App\Icons\Android; use App\Icons\Ios; use Illuminate\View\View; +use Native\Mobile\Edge\Concerns\HasVirtualListWindow; use Native\Mobile\Edge\Layouts\Builders\NavBarOptions; use Native\Mobile\Edge\NativeComponent; -use Native\Mobile\Edge\Traits\HasVirtualListWindow; use Native\Mobile\Platform; /** diff --git a/app/NativeComponents/ExplorePickers.php b/app/NativeComponents/ExplorePickers.php new file mode 100644 index 0000000..112c727 --- /dev/null +++ b/app/NativeComponents/ExplorePickers.php @@ -0,0 +1,54 @@ +lastEvent = $value === '' ? '(cleared)' : $value; + } + + public function render(): View + { + return view('native.explore.pickers'); + } +} diff --git a/app/NativeComponents/FacebookFeed.php b/app/NativeComponents/FacebookFeed.php index d20e809..851b666 100644 --- a/app/NativeComponents/FacebookFeed.php +++ b/app/NativeComponents/FacebookFeed.php @@ -3,6 +3,7 @@ namespace App\NativeComponents; use App\NativeComponents\Concerns\HasFacebookData; +use Illuminate\View\View; use Native\Mobile\Edge\NativeComponent; use Native\Mobile\Edge\Transition; @@ -10,17 +11,27 @@ class FacebookFeed extends NativeComponent { use HasFacebookData; - /** @var array */ + /** @var array Keyed by post id, stable across refresh rotation. */ public array $likedPosts = []; + public int $refreshCount = 0; + + /** Post id whose "more actions" sheet is open, or null. */ + public ?int $menuPostId = null; + public function navTitle(): string { return 'Facebook'; } - public function viewPost(int $index): void + public function refresh(): void + { + $this->refreshCount++; + } + + public function viewPost(int $id): void { - $this->navigate($this->route('facebook.post', $index)) + $this->navigate($this->route('facebook.post', $id)) ->transition(Transition::SlideFromRight); } @@ -36,32 +47,56 @@ public function createPost(): void ->transition(Transition::SlideFromBottom); } - public function toggleLike(int $index): void + public function toggleLike(int $id): void { - if (isset($this->likedPosts[$index])) { - unset($this->likedPosts[$index]); + if (isset($this->likedPosts[$id])) { + unset($this->likedPosts[$id]); } else { - $this->likedPosts[$index] = true; + $this->likedPosts[$id] = true; } } - public function render(): \Illuminate\View\View + public function openPostMenu(int $id): void + { + $this->menuPostId = $id; + } + + public function closePostMenu(): void + { + $this->menuPostId = null; + } + + public function render(): View { $users = self::fbUsers(); $posts = self::fbPosts(); - $stories = array_filter($users, fn (array $u): bool => $u['hasStory']); - foreach ($posts as $i => &$post) { + $stories = []; + foreach ($users as $userId => $user) { + if ($user['hasStory']) { + $user['id'] = $userId; + $stories[] = $user; + } + } + + foreach ($posts as $id => &$post) { + $post['id'] = $id; $post['user'] = $users[$post['userId']]; $post['reactionsFormatted'] = self::formatFbCount( - $post['reactions'] + (isset($this->likedPosts[$i]) ? 1 : 0) + $post['reactions'] + (isset($this->likedPosts[$id]) ? 1 : 0) ); - $post['isLiked'] = isset($this->likedPosts[$i]); + $post['isLiked'] = isset($this->likedPosts[$id]); + } + unset($post); + + if ($this->refreshCount > 0 && count($posts) > 1) { + $offset = $this->refreshCount % count($posts); + $posts = array_merge(array_slice($posts, $offset), array_slice($posts, 0, $offset)); } return view('facebook-feed', [ 'posts' => $posts, - 'stories' => array_values($stories), + 'stories' => $stories, ]); } } diff --git a/app/NativeComponents/FacebookProfile.php b/app/NativeComponents/FacebookProfile.php index a9549e2..1430c48 100644 --- a/app/NativeComponents/FacebookProfile.php +++ b/app/NativeComponents/FacebookProfile.php @@ -3,6 +3,7 @@ namespace App\NativeComponents; use App\NativeComponents\Concerns\HasFacebookData; +use Illuminate\View\View; use Native\Mobile\Edge\NativeComponent; use Native\Mobile\Edge\Transition; @@ -10,7 +11,6 @@ class FacebookProfile extends NativeComponent { use HasFacebookData; - /** @var array */ public array $user = []; /** @var array */ @@ -18,6 +18,8 @@ class FacebookProfile extends NativeComponent public int $selectedTab = 0; + public bool $friendRequested = false; + public function mount(): void { $id = (int) $this->param('id'); @@ -35,13 +37,18 @@ public function selectTab(int $index): void $this->selectedTab = $index; } + public function toggleFriendRequest(): void + { + $this->friendRequested = ! $this->friendRequested; + } + public function viewPost(int $postId): void { $this->navigate($this->route('facebook.post', $postId)) ->transition(Transition::SlideFromRight); } - public function render(): \Illuminate\View\View + public function render(): View { $users = self::fbUsers(); $allPosts = self::fbPosts(); @@ -55,9 +62,15 @@ public function render(): \Illuminate\View\View $postsWithMeta[] = $post; } + $photos = array_values(array_filter(array_map( + fn (array $post): ?string => $post['imageUrl'], + $allPosts + ))); + return view('facebook-profile', [ 'postsWithMeta' => $postsWithMeta, 'friendsFormatted' => self::formatFbCount($this->user['friendCount']), + 'photos' => $photos, ]); } } diff --git a/app/NativeComponents/GamePad.php b/app/NativeComponents/GamePad.php new file mode 100644 index 0000000..03a00dd --- /dev/null +++ b/app/NativeComponents/GamePad.php @@ -0,0 +1,204 @@ + + */ + public array $shots = []; + + public int $wallHits = 0; + + /** Wall side currently flashing from a hit (up/down/left/right), or null. */ + public ?string $flashingWall = null; + + public int $nextShotId = 1; + + public int $fireCooldown = 0; + + public int $flashTicksLeft = 0; + + public function navTitle(): string + { + return 'Game Pad'; + } + + /** `@tapDown` on a d-pad button — move immediately, then keep moving each tick. */ + public function startMove(string $direction): void + { + $this->moving = $direction; + $this->facing = $direction; + $this->stepPlayer(); + } + + /** `@tapUp` on every d-pad button. */ + public function stopMove(): void + { + $this->moving = null; + } + + /** `@tapDown` on FIRE — first shot is instant, the tick loop keeps firing. */ + public function startFire(): void + { + $this->firing = true; + $this->fireShot(); + $this->fireCooldown = self::FIRE_COOLDOWN; + } + + /** `@tapUp` on FIRE. */ + public function stopFire(): void + { + $this->firing = false; + } + + /** `@tapDown` on SHIELD. */ + public function raiseShield(): void + { + $this->shieldRaised = true; + } + + /** `@tapUp` on SHIELD. */ + public function lowerShield(): void + { + $this->shieldRaised = false; + } + + /** The game loop — held movement, held auto-fire, shot flight, wall flash decay. */ + #[Poll(50)] + public function tick(): void + { + if ($this->moving !== null) { + $this->stepPlayer(); + } + + if ($this->firing && --$this->fireCooldown <= 0) { + $this->fireShot(); + $this->fireCooldown = self::FIRE_COOLDOWN; + } + + $this->advanceShots(); + + if ($this->flashTicksLeft > 0 && --$this->flashTicksLeft === 0) { + $this->flashingWall = null; + } + } + + private function stepPlayer(): void + { + [$dx, $dy] = $this->vector($this->moving ?? $this->facing); + $limit = (self::ARENA - self::PLAYER_SIZE) / 2; + + $this->x = max(-$limit, min($limit, $this->x + $dx * self::PLAYER_SPEED)); + $this->y = max(-$limit, min($limit, $this->y + $dy * self::PLAYER_SPEED)); + } + + private function fireShot(): void + { + [$dx, $dy] = $this->vector($this->facing); + + $this->shots[] = [ + 'id' => $this->nextShotId++, + 'x' => $this->x, + 'y' => $this->y, + 'dx' => $dx * self::SHOT_SPEED, + 'dy' => $dy * self::SHOT_SPEED, + ]; + } + + private function advanceShots(): void + { + $limit = (self::ARENA - self::SHOT_SIZE) / 2; + $surviving = []; + + foreach ($this->shots as $shot) { + $shot['x'] += $shot['dx']; + $shot['y'] += $shot['dy']; + + if (abs($shot['x']) > $limit || abs($shot['y']) > $limit) { + $this->wallHits++; + $this->flashingWall = match (true) { + $shot['y'] < -$limit => 'up', + $shot['y'] > $limit => 'down', + $shot['x'] < -$limit => 'left', + default => 'right', + }; + $this->flashTicksLeft = self::FLASH_TICKS; + + continue; + } + + $surviving[] = $shot; + } + + $this->shots = $surviving; + } + + /** + * Unit vector for a d-pad direction (screen coordinates — up is negative y). + * + * @return array{float, float} + */ + private function vector(string $direction): array + { + return match ($direction) { + 'up' => [0.0, -1.0], + 'down' => [0.0, 1.0], + 'left' => [-1.0, 0.0], + default => [1.0, 0.0], + }; + } + + public function render(): View + { + return view('native.game-pad'); + } +} diff --git a/app/NativeComponents/GeoWatchDemo.php b/app/NativeComponents/GeoWatchDemo.php deleted file mode 100644 index 8d3d823..0000000 --- a/app/NativeComponents/GeoWatchDemo.php +++ /dev/null @@ -1,91 +0,0 @@ -locationUpdated() handler and re-renders. - * The watch auto-stops on unmount (walk away from the screen = GPS off); - * Stop exercises Geolocation::clearWatch() manually. - */ -class GeoWatchDemo extends NativeComponent -{ - public string $watchId = ''; - - public bool $watching = false; - - public int $updates = 0; - - public ?float $latitude = null; - - public ?float $longitude = null; - - public ?float $accuracy = null; - - public ?float $speed = null; - - public ?float $heading = null; - - public ?string $error = null; - - public function navTitle(): string - { - return 'Geo — Watch Position'; - } - - public function startSteaming() - { - $this->error = null; - - // Ask first; start streaming only once permission is settled. - Geolocation::requestPermissions() - ->permissionRequestResult(function ($event) { - if (($event->location ?? 'denied') !== 'granted') { - $this->error = 'Location permission '.($event->location ?? 'denied'); - - return; - } - - $this->watchId = Geolocation::watchPosition(fineAccuracy: true) - ->interval(2000) - ->minDistance(1) - ->locationUpdated(function ($event) { - if (! $event->success) { - $this->error = $event->error; - - return; - } - - $this->updates++; - $this->latitude = $event->latitude; - $this->longitude = $event->longitude; - $this->accuracy = $event->accuracy; - $this->speed = $event->speed ?? null; - $this->heading = $event->heading ?? null; - }) - ->getId(); - - $this->watching = true; - }); - } - - public function stopStreaming() - { - if ($this->watchId !== '') { - Geolocation::clearWatch($this->watchId); - } - - $this->watching = false; - } - - public function render(): View - { - return view('native.geo-watch-demo'); - } -} diff --git a/app/NativeComponents/IkeaCart.php b/app/NativeComponents/IkeaCart.php deleted file mode 100644 index 9e06db0..0000000 --- a/app/NativeComponents/IkeaCart.php +++ /dev/null @@ -1,80 +0,0 @@ - */ - public array $cartItems = [0 => 1, 1 => 1, 5 => 2]; - - public function incrementItem(int $productIndex): void - { - if (isset($this->cartItems[$productIndex]) && $this->cartItems[$productIndex] < 10) { - $this->cartItems[$productIndex]++; - } - } - - public function decrementItem(int $productIndex): void - { - if (isset($this->cartItems[$productIndex])) { - if ($this->cartItems[$productIndex] <= 1) { - unset($this->cartItems[$productIndex]); - } else { - $this->cartItems[$productIndex]--; - } - } - } - - public function removeItem(int $productIndex): void - { - unset($this->cartItems[$productIndex]); - } - - public function checkout(): void - { - Dialog::alert('Order Placed!', 'Your order has been submitted. You will receive a confirmation email shortly.'); - } - - public function render(): \Illuminate\View\View - { - $allProducts = self::ikeaProducts(); - $items = []; - $subtotal = 0.0; - - foreach ($this->cartItems as $productIndex => $qty) { - if (isset($allProducts[$productIndex])) { - $product = $allProducts[$productIndex]; - $lineTotal = $product['price'] * $qty; - $subtotal += $lineTotal; - $items[] = [ - 'productIndex' => $productIndex, - 'seriesName' => $product['seriesName'], - 'name' => $product['name'], - 'imageUrl' => $product['imageUrl'], - 'price' => $product['price'], - 'priceFormatted' => self::formatIkeaPrice($product['price']), - 'color' => $product['color'], - 'qty' => $qty, - 'lineTotalFormatted' => self::formatIkeaPrice($lineTotal), - ]; - } - } - - $deliveryFee = $subtotal >= 500 ? 0.0 : 49.00; - - return view('ikea-cart', [ - 'items' => $items, - 'subtotalFormatted' => self::formatIkeaPrice($subtotal), - 'deliveryFeeFormatted' => $deliveryFee > 0 ? self::formatIkeaPrice($deliveryFee) : 'FREE', - 'totalFormatted' => self::formatIkeaPrice($subtotal + $deliveryFee), - 'freeDelivery' => $deliveryFee === 0.0, - 'itemCount' => array_sum($this->cartItems), - ]); - } -} diff --git a/app/NativeComponents/IkeaHome.php b/app/NativeComponents/IkeaHome.php deleted file mode 100644 index 2dd5dab..0000000 --- a/app/NativeComponents/IkeaHome.php +++ /dev/null @@ -1,82 +0,0 @@ -selectedCategory = $category; - } - - public function viewProduct(int $index): void - { - $this->navigate($this->route('ikea.product', $index)) - ->transition(Transition::SlideFromRight); - } - - public function viewCart(): void - { - $this->navigate($this->route('ikea.cart')) - ->transition(Transition::SlideFromRight); - } - - public function viewSearch(): void - { - $this->navigate($this->route('ikea.search')) - ->transition(Transition::SlideFromRight); - } - - public function render(): \Illuminate\View\View - { - $products = self::ikeaProducts(); - $categories = self::ikeaCategories(); - - $newArrivals = []; - $categoryProducts = []; - - foreach ($products as $i => $product) { - $product['originalIndex'] = $i; - $product['priceFormatted'] = self::formatIkeaPrice($product['price']); - $product['originalPriceFormatted'] = $product['originalPrice'] ? self::formatIkeaPrice($product['originalPrice']) : null; - $product['reviewFormatted'] = self::formatIkeaReviewCount($product['reviewCount']); - - if ($product['isNew'] || $product['badge'] === 'Top seller') { - $newArrivals[] = $product; - } - - if ($product['category'] === $this->selectedCategory) { - $categoryProducts[] = $product; - } - } - - $popular = array_slice($products, 0, 6); - foreach ($popular as $i => &$p) { - $p['originalIndex'] = $i; - $p['priceFormatted'] = self::formatIkeaPrice($p['price']); - $p['originalPriceFormatted'] = $p['originalPrice'] ? self::formatIkeaPrice($p['originalPrice']) : null; - $p['reviewFormatted'] = self::formatIkeaReviewCount($p['reviewCount']); - } - - return view('ikea-home', [ - 'categories' => $categories, - 'popular' => $popular, - 'newArrivals' => $newArrivals, - 'categoryProducts' => $categoryProducts, - 'roomIdeas' => self::ikeaRoomIdeas(), - ]); - } -} diff --git a/app/NativeComponents/IkeaProduct.php b/app/NativeComponents/IkeaProduct.php deleted file mode 100644 index e24a9ae..0000000 --- a/app/NativeComponents/IkeaProduct.php +++ /dev/null @@ -1,60 +0,0 @@ -param('id'); - $products = self::ikeaProducts(); - $this->product = $products[$id] ?? $products[0]; - } - - public function incrementQty(): void - { - if ($this->quantity < 10) { - $this->quantity++; - } - } - - public function decrementQty(): void - { - if ($this->quantity > 1) { - $this->quantity--; - } - } - - public function toggleFavorite(): void - { - $this->isFavorited = ! $this->isFavorited; - } - - public function addToCart(): void - { - Dialog::alert('Added to bag', $this->quantity . 'x ' . $this->product['seriesName'] . ' ' . $this->product['name'] . ' added to your shopping bag.'); - } - - public function render(): \Illuminate\View\View - { - return view('ikea-product', [ - 'priceFormatted' => self::formatIkeaPrice($this->product['price']), - 'originalPriceFormatted' => $this->product['originalPrice'] ? self::formatIkeaPrice($this->product['originalPrice']) : null, - 'reviewFormatted' => self::formatIkeaReviewCount($this->product['reviewCount']), - 'totalFormatted' => self::formatIkeaPrice($this->product['price'] * $this->quantity), - ]); - } -} \ No newline at end of file diff --git a/app/NativeComponents/IkeaSearch.php b/app/NativeComponents/IkeaSearch.php deleted file mode 100644 index 2bf629d..0000000 --- a/app/NativeComponents/IkeaSearch.php +++ /dev/null @@ -1,62 +0,0 @@ -searchQuery = $value; - } - - public function selectRoom(string $room): void - { - $this->selectedRoom = $this->selectedRoom === $room ? '' : $room; - } - - public function viewProduct(int $index): void - { - $this->navigate($this->route('ikea.product', $index)) - ->transition(Transition::SlideFromRight); - } - - public function render(): \Illuminate\View\View - { - $allProducts = self::ikeaProducts(); - $categories = self::ikeaCategories(); - - $results = []; - foreach ($allProducts as $i => $product) { - $matchesSearch = $this->searchQuery === '' || - str_contains(strtolower($product['name']), strtolower($this->searchQuery)) || - str_contains(strtolower($product['seriesName']), strtolower($this->searchQuery)) || - str_contains(strtolower($product['category']), strtolower($this->searchQuery)); - - $matchesRoom = $this->selectedRoom === '' || $product['category'] === $this->selectedRoom; - - if ($matchesSearch && $matchesRoom) { - $product['originalIndex'] = $i; - $product['priceFormatted'] = self::formatIkeaPrice($product['price']); - $product['originalPriceFormatted'] = $product['originalPrice'] ? self::formatIkeaPrice($product['originalPrice']) : null; - $product['reviewFormatted'] = self::formatIkeaReviewCount($product['reviewCount']); - $results[] = $product; - } - } - - return view('ikea-search', [ - 'categories' => $categories, - 'results' => $results, - 'resultCount' => count($results), - ]); - } -} diff --git a/app/NativeComponents/InstagramFeed.php b/app/NativeComponents/InstagramFeed.php index ad1ef1f..998f638 100644 --- a/app/NativeComponents/InstagramFeed.php +++ b/app/NativeComponents/InstagramFeed.php @@ -3,6 +3,7 @@ namespace App\NativeComponents; use App\NativeComponents\Concerns\HasInstagramData; +use Illuminate\View\View; use Native\Mobile\Edge\Layouts\Builders\NavAction; use Native\Mobile\Edge\Layouts\Builders\NavBarOptions; use Native\Mobile\Edge\NativeComponent; @@ -44,6 +45,13 @@ public function viewMessages(): void /** @var array */ public array $savedPosts = []; + public int $refreshCount = 0; + + public function refresh(): void + { + $this->refreshCount++; + } + public function viewPost(int $index): void { $this->navigate($this->route('instagram.post', $index)) @@ -74,19 +82,35 @@ public function toggleSave(int $index): void } } - public function render(): \Illuminate\View\View + public function render(): View { $users = self::igUsers(); $posts = self::igPosts(); - $stories = array_values(array_filter($users, fn (array $u): bool => $u['hasStory'])); - foreach ($posts as $i => &$post) { + $stories = []; + foreach ($users as $userId => $user) { + if ($user['hasStory']) { + $user['id'] = $userId; + $stories[] = $user; + } + } + + foreach ($posts as $id => &$post) { + $post['id'] = $id; $post['user'] = $users[$post['userId']]; - $post['isLiked'] = isset($this->likedPosts[$i]); - $post['isSaved'] = isset($this->savedPosts[$i]); + $post['isLiked'] = isset($this->likedPosts[$id]); + $post['isSaved'] = isset($this->savedPosts[$id]); $post['likesFormatted'] = self::formatIgCount( $post['likes'] + ($post['isLiked'] ? 1 : 0) ); + $post['commentsFormatted'] = self::formatIgCount($post['commentCount']); + $post['sharesFormatted'] = self::formatIgCount(intdiv($post['likes'], 12)); + } + unset($post); + + if ($this->refreshCount > 0 && count($posts) > 1) { + $offset = $this->refreshCount % count($posts); + $posts = array_merge(array_slice($posts, $offset), array_slice($posts, 0, $offset)); } return view('instagram-feed', [ diff --git a/app/NativeComponents/InstagramProfile.php b/app/NativeComponents/InstagramProfile.php index 88bf2a6..8a63e05 100644 --- a/app/NativeComponents/InstagramProfile.php +++ b/app/NativeComponents/InstagramProfile.php @@ -3,6 +3,7 @@ namespace App\NativeComponents; use App\NativeComponents\Concerns\HasInstagramData; +use Illuminate\View\View; use Native\Mobile\Edge\NativeComponent; use Native\Mobile\Edge\Transition; @@ -10,12 +11,13 @@ class InstagramProfile extends NativeComponent { use HasInstagramData; - /** @var array */ public array $user = []; /** @var array */ public array $userPosts = []; + public bool $isFollowing = false; + public function mount(): void { $id = (int) $this->param('id'); @@ -28,13 +30,18 @@ public function mount(): void ); } + public function toggleFollow(): void + { + $this->isFollowing = ! $this->isFollowing; + } + public function viewPost(int $postId): void { $this->navigate($this->route('instagram.post', $postId)) ->transition(Transition::SlideFromRight); } - public function render(): \Illuminate\View\View + public function render(): View { $allPosts = self::igPosts(); @@ -48,7 +55,7 @@ public function render(): \Illuminate\View\View return view('instagram-profile', [ 'postsWithIndex' => $postsWithIndex, 'postsFormatted' => self::formatIgCount($this->user['postCount']), - 'followersFormatted' => self::formatIgCount($this->user['followers']), + 'followersFormatted' => self::formatIgCount($this->user['followers'] + ($this->isFollowing ? 1 : 0)), 'followingFormatted' => self::formatIgCount($this->user['following']), 'highlights' => self::igStoryHighlights(), ]); diff --git a/app/NativeComponents/InstagramSearch.php b/app/NativeComponents/InstagramSearch.php index 0e6bdf8..5c7e8a8 100644 --- a/app/NativeComponents/InstagramSearch.php +++ b/app/NativeComponents/InstagramSearch.php @@ -3,6 +3,7 @@ namespace App\NativeComponents; use App\NativeComponents\Concerns\HasInstagramData; +use Illuminate\View\View; use Native\Mobile\Edge\NativeComponent; use Native\Mobile\Edge\Transition; @@ -16,10 +17,15 @@ public function viewPost(int $index): void ->transition(Transition::SlideFromRight); } - public function render(): \Illuminate\View\View + public function render(): View { $posts = self::igPosts(); + foreach ($posts as $id => &$post) { + $post['id'] = $id; + } + unset($post); + return view('instagram-search', [ 'posts' => $posts, ]); diff --git a/app/NativeComponents/JustifyRepro.php b/app/NativeComponents/JustifyRepro.php new file mode 100644 index 0000000..2e78870 --- /dev/null +++ b/app/NativeComponents/JustifyRepro.php @@ -0,0 +1,33 @@ +long = ! $this->long; + } + + #[Poll(3000)] + public function tick() + { + $this->toggle(); + } + + public function render(): View + { + return view('native.justify-repro'); + } +} diff --git a/app/NativeComponents/Layouts/DrawerLayout.php b/app/NativeComponents/Layouts/DrawerLayout.php deleted file mode 100644 index 4643c0d..0000000 --- a/app/NativeComponents/Layouts/DrawerLayout.php +++ /dev/null @@ -1,39 +0,0 @@ -width(300); - - $mode = method_exists($screen, 'drawerMode') ? $screen->drawerMode() : 'modal'; - - return $mode === 'reveal' ? $drawer->reveal() : $drawer->modal(); - } -} diff --git a/app/NativeComponents/Layouts/NativeTabsLayout.php b/app/NativeComponents/Layouts/NativeTabsLayout.php deleted file mode 100644 index d2f5476..0000000 --- a/app/NativeComponents/Layouts/NativeTabsLayout.php +++ /dev/null @@ -1,72 +0,0 @@ -back() - ->title($screen->navTitle()); - } - - public function tabBar(NativeComponent $screen): ?TabBar - { - return TabBar::make() - ->activeColor('#A855F7') - ->minimizeOnScroll() - ->add(Tab::link('Home', '/native-tabs', - ios: Ios::House, android: Android::Home)->badge('3')) - ->add(Tab::search( - 'Search', - placeholder: 'Search articles, songs, people…', - ios: Ios::Magnifyingglass, - android: Android::Search, - )) - ->add(Tab::link('Profile', '/native-tabs/profile', - ios: Ios::Person, android: Android::Person)); - } - - /** - * Persistent MiniPlayer-style accessory pinned above the tab bar. - * On iOS 26+ it inhabits the new `tabViewBottomAccessory` slot and - * tucks inline with the active tab on scroll-down (paired with the - * `minimizeOnScroll()` flag above). On older iOS this returns null - * so nothing renders. - */ - public function tabBarAccessory(NativeComponent $screen): ?Element - { - $row = Row::make()->center()->gap(8); - $row->addChild(Icon::make('music.note')); - $row->addChild(Text::make('Liquid Glass demo — scroll to minimize')); - - return $row; - } -} diff --git a/app/NativeComponents/ListingDetail.php b/app/NativeComponents/ListingDetail.php index 114b0ad..640ee36 100644 --- a/app/NativeComponents/ListingDetail.php +++ b/app/NativeComponents/ListingDetail.php @@ -3,6 +3,7 @@ namespace App\NativeComponents; use App\NativeComponents\Concerns\HasListingData; +use Illuminate\View\View; use Native\Mobile\Edge\NativeComponent; use Native\Mobile\Facades\Dialog; @@ -10,7 +11,6 @@ class ListingDetail extends NativeComponent { use HasListingData; - /** @var array */ public array $listing = []; /** @var array */ @@ -36,6 +36,16 @@ public function mount(): void $this->listingReviews = $allReviews[$this->listingId] ?? $allReviews[0] ?? []; } + public function unmount(): void + { + // UI.SetBackground is app-global sticky native state — without + // this clear it leaks the window color into every screen visited + // after this one. Empty color = restore the platform default. + nativephp_call('UI.SetBackground', json_encode(['color' => null])); + + parent::unmount(); + } + public function toggleWishlist(): void { $this->isWishlisted = ! $this->isWishlisted; @@ -60,10 +70,10 @@ public function prevImage(): void public function reserve(): void { - Dialog::alert('Reservation Requested', 'Your reservation for ' . $this->listing['title'] . ' has been submitted!'); + Dialog::alert('Reservation Requested', 'Your reservation for '.$this->listing['title'].' has been submitted!'); } - public function render(): \Illuminate\View\View + public function render(): View { $bathroomsFormatted = $this->listing['bathrooms'] == floor($this->listing['bathrooms']) ? (int) $this->listing['bathrooms'] diff --git a/app/NativeComponents/NativeChromeDemo.php b/app/NativeComponents/NativeChromeDemo.php deleted file mode 100644 index 616e70b..0000000 --- a/app/NativeComponents/NativeChromeDemo.php +++ /dev/null @@ -1,93 +0,0 @@ -subtitle('NavigationStack toolbar') - // A plain icon — fires its press handler directly. - ->action(NavAction::make('share')->icon('share')->a11yLabel('Share')->press('shareIt')) - // A pull-down menu — tap to reveal sub-items. Each sub-item - // is itself a NavAction with its own icon / label / press - // handler, plus an optional `destructive()` flag for red - // styling on iOS. - ->action( - NavAction::make('more') - ->icon('ellipsis') - ->a11yLabel('More options') - ->items([ - NavAction::make('mark_read') - ->icon('checkmark.circle') - ->label('Mark all read') - ->press('markAllRead'), - NavAction::make('mute') - ->icon(ios: Ios::BellSlash, android: AndroidOutlined::VolumeMute) - ->label('Mute notifications') - ->press('mute'), - NavAction::make('archive') - ->icon('archivebox') - ->label('Archive') - ->press('archive'), - NavAction::make('delete') - ->icon('trash') - ->label('Delete') - ->destructive() - ->press('deleteIt'), - ]) - ); - } - - public function shareIt(): void - { - $this->shareCount++; - $this->lastAction = 'Share tapped'; - } - - public function markAllRead(): void { $this->lastAction = 'Mark all read'; } - public function mute(): void { $this->lastAction = 'Mute notifications'; } - public function archive(): void { $this->lastAction = 'Archive'; } - public function deleteIt(): void { $this->lastAction = 'Delete (destructive)'; } - - /** Push the detail screen — exercises the multi-level NavigationStack. */ - public function pushDetail(): void - { - $this->navigate('/native-chrome/detail') - ->transition(Transition::SlideFromRight); - } - - public function render(): \Illuminate\View\View - { - return view('native-chrome-demo'); - } -} diff --git a/app/NativeComponents/NativeChromeDetail.php b/app/NativeComponents/NativeChromeDetail.php deleted file mode 100644 index ff23cf9..0000000 --- a/app/NativeComponents/NativeChromeDetail.php +++ /dev/null @@ -1,47 +0,0 @@ -subtitle('Pushed via NavigationStack') - ->action(NavAction::make('star')->icon('star')->a11yLabel('Favorite')->press('toggleStar')); - } - - public bool $starred = false; - - public function toggleStar(): void - { - $this->starred = ! $this->starred; - } - - public function render(): \Illuminate\View\View - { - return view('native-chrome-detail'); - } -} diff --git a/app/NativeComponents/NativeTabsHome.php b/app/NativeComponents/NativeTabsHome.php deleted file mode 100644 index 48cb138..0000000 --- a/app/NativeComponents/NativeTabsHome.php +++ /dev/null @@ -1,145 +0,0 @@ - 'Ada Lovelace', 'subtitle' => 'Analytical Engine programmer', 'url' => '/'], -// ['title' => 'Brian Kernighan', 'subtitle' => 'Co-author of C', 'url' => '/'], -// ['title' => 'Charlie Munger', 'subtitle' => 'Investor', 'url' => '/'], -// ['title' => 'Dana Scott', 'subtitle' => 'Domain theory', 'url' => '/'], -// ['title' => 'Edsger Dijkstra', 'subtitle' => 'Algorithms', 'url' => '/'], -// ['title' => 'Fei-Fei Li', 'subtitle' => 'Computer vision', 'url' => '/'], -// ['title' => 'Grace Hopper', 'subtitle' => 'COBOL pioneer', 'url' => '/'], -// ['title' => 'Hedy Lamarr', 'subtitle' => 'Frequency hopping', 'url' => '/'], -// ['title' => 'Ivan Sutherland', 'subtitle' => 'Sketchpad / 3D graphics', 'url' => '/'], -// ['title' => 'James Gosling', 'subtitle' => 'Java', 'url' => '/'], -// ['title' => 'Katherine Johnson', 'subtitle' => 'NASA mathematician', 'url' => '/'], -// ['title' => 'Linus Torvalds', 'subtitle' => 'Linux & Git', 'url' => '/'], -// ]; -// } - - -// public function onSearchQuery(string $query): array -// { -// $needle = trim($query); -// if ($needle === '') { -// return []; -// } -// -// $posts = Http::timeout(5) -// ->get('https://jsonplaceholder.typicode.com/posts', ['q' => $needle]) -// ->json() ?? []; -// -// return collect($posts) -// ->take(20) -// ->map(fn($p) => Row::make() -// ->class('items-start gap-3 px-4 py-3') -// ->onPress("openPost({$p['id']})") -// ->addChild( -// // Tinted "P" avatar — could be Image::make($u->avatar_url) for real users. -// Column::make() -// ->class('w-10 h-10 rounded-full bg-purple-100 items-center justify-center') -// ->addChild(Text::make(str($p['title'])->limit(1, '')->upper())->class('text-purple-700 font-semibold')) -// ) -// ->addChild( -// Column::make() -// ->class('flex-1 gap-1') -// ->addChild( -// Text::make($p['title'] ?? '(no title)') -// ->class('font-semibold') -// ) -// ->addChild( -// Text::make(str(($p['body'] ?? ''))->limit(120)->value()) -// ->class('text-sm text-gray-500') -// ) -// ) -// ->addChild( -// Text::make("#{$p['id']}") -// ->class('text-xs text-gray-400 px-2 py-1 rounded bg-gray-100') -// ) -// ) -// ->values() -// ->toArray(); -// } - - - public function onSearchQuery(string $query): array - { - $needle = trim($query); - if ($needle === '') { - return []; - } - - $posts = Http::timeout(5) - ->get('https://jsonplaceholder.typicode.com/posts', ['q' => $needle]) - ->json() ?? []; - - return collect($posts) - ->take(20) - ->map(fn ($p) => view('search-post-row', ['post' => $p])) - ->values() - ->toArray(); - } - - - -// public function onSearchQuery(string $query): array -// { -// $needle = trim($query); -// if ($needle === '') { -// return []; -// } -// -// try { -// $posts = Http::timeout(5) -// ->get('https://jsonplaceholder.typicode.com/posts', ['q' => $needle]) -// ->json() ?? []; -// } catch (\Throwable) { -// return []; -// } -// -// return collect($posts) -// ->take(20) -// ->map(fn ($p) => [ -// 'title' => $p['title'] ?? '(no title)', -// 'subtitle' => str(($p['body'] ?? ''))->limit(90)->value(), -// 'leading' => 'article', -// 'url' => '/', -// ]) -// ->values() -// ->toArray(); -// } - - public function tap(): void - { - $this->taps++; - } - - public function render(): \Illuminate\View\View - { - return view('native.native-tabs-home'); - } -} diff --git a/app/NativeComponents/NativeTabsProfile.php b/app/NativeComponents/NativeTabsProfile.php deleted file mode 100644 index 17a28d3..0000000 --- a/app/NativeComponents/NativeTabsProfile.php +++ /dev/null @@ -1,18 +0,0 @@ -format(H:i:s.v)` for display. */ - public string $lastRenderAt = ''; - - /** Set when a user-initiated handler enters PHP (tap, setRows). - * Cleared after render so subsequent un-tracked renders don't - * show stale wall-clock numbers. */ - private float $actionStartMicro = 0.0; - - public function navTitle(): string - { - return 'Performance'; - } - - public function tap(): void - { - $this->actionStartMicro = microtime(true); - } - - public function setRows(int $count): void - { - $this->actionStartMicro = microtime(true); - $this->rowCount = $count; - // Reset the window when the count changes so we don't try to emit - // rows above the new total. Native will report the real visible - // range on first scroll/appear. - $this->virtualWindowFrom = 0; - $this->virtualWindowTo = min(79, $count - 1); - } - - public function reset(): void - { - $this->actionStartMicro = microtime(true); - $this->renderCount = 0; - $this->lastBuildMs = 0.0; - $this->lastActionToRenderMs = 0.0; - $this->lastElementCount = 0; - } - - public function render(): \Illuminate\View\View - { - $buildStart = microtime(true); - - $this->renderCount++; - $this->lastRenderAt = now()->format('H:i:s.v'); - - // Element count is deterministic from the tree we're about to - // render — header chrome + N list-items + 5 row-count buttons. - // Hardcoding the chrome (8 elements) keeps the count honest; - // it's the rowCount that dominates anyway. - // Element count is now bounded by the visible window — that's the - // whole point of . The full `rowCount` is a - // logical total ridden by the native LazyColumn, not a tree size. - $chromeElementCount = 8; - $buttonElementCount = 6; - $windowSize = max(0, $this->virtualWindowTo - $this->virtualWindowFrom + 1); - $this->lastElementCount = $chromeElementCount + $buttonElementCount + $windowSize; - - $view = view('native.perf-demo'); - - $this->lastBuildMs = round((microtime(true) - $buildStart) * 1000, 2); - - if ($this->actionStartMicro > 0) { - $this->lastActionToRenderMs = round((microtime(true) - $this->actionStartMicro) * 1000, 2); - $this->actionStartMicro = 0.0; - } - - return $view; - } -} diff --git a/app/NativeComponents/PerfShowdown.php b/app/NativeComponents/PerfShowdown.php deleted file mode 100644 index 33b9309..0000000 --- a/app/NativeComponents/PerfShowdown.php +++ /dev/null @@ -1,95 +0,0 @@ -subtitle('Real numbers from the C extension'); - } - - public function tap(): void - { - $this->counter++; - } - - public function tap10(): void - { - $this->counter += 10; - } - - public function toggleMemo(): void - { - $flags = nativephp_runtime_flags(); - nativephp_set_runtime_flags($flags ^ 0x02); - } - - public function render(): View - { - $stats = function_exists('nativephp_last_publish_stats') - ? nativephp_last_publish_stats() - : [ - 'node_count' => 0, 'full_count' => 0, 'reuse_count' => 0, - 'flat_size' => 0, 'was_skip' => false, - 'build_ms' => 0.0, 'total_ms' => 0.0, - 'runtime_flags' => function_exists('nativephp_runtime_flags') - ? nativephp_runtime_flags() - : 0, - ]; - - $memoOn = ((int) $stats['runtime_flags'] & 0x02) !== 0; - - $rows = []; - for ($i = 0; $i < self::ROW_COUNT; $i++) { - $rows[] = [ - 'key' => "row-{$i}", - 'label' => "row #{$i}", - 'value' => sprintf('%.2f ms', $i * 0.01), - ]; - } - - return view('native.perf-showdown', [ - 'stats' => $stats, - 'flatBytes' => $this->formatBytes((int) $stats['flat_size']), - 'memoOn' => $memoOn, - 'counter' => $this->counter, - 'rowCount' => self::ROW_COUNT, - 'rows' => $rows, - ]); - } - - private function formatBytes(int $bytes): string - { - if ($bytes < 1024) { - return $bytes.' B'; - } - if ($bytes < 1024 * 1024) { - return number_format($bytes / 1024, 1).' KB'; - } - - return number_format($bytes / 1024 / 1024, 2).' MB'; - } -} diff --git a/app/NativeComponents/Phase1KeyTest.php b/app/NativeComponents/Phase1KeyTest.php deleted file mode 100644 index 682db96..0000000 --- a/app/NativeComponents/Phase1KeyTest.php +++ /dev/null @@ -1,188 +0,0 @@ -key($domainId)` makes node ids - * stable across renders even when siblings reorder. Tinker can't drive - * the custom on-device libphp.a, so we run the same checks inside a - * demo screen and render their results. - * - * Tests: - * 1. Unkeyed children get sequential positional ids (legacy behavior). - * 2. Keyed children get hash ids (large, non-sequential). - * 3. Reordering keyed children preserves their ids (the Phase 1 win). - */ -class Phase1KeyTest extends NativeComponent -{ - public function navTitle(): string - { - return 'Phase 1 — Keys'; - } - - public function navigationOptions(): ?NavBarOptions - { - return NavBarOptions::make() - ->displayMode('large') - ->subtitle('Stable keyed-identity verification'); - } - - public function backToLauncher(): void - { - $this->back(); - } - - public function render(): Element - { - $results = $this->runTests(); - - $column = Column::make()->fillWidth()->padding(16)->gap(16); - - $column->addChild( - Pressable::make( - Row::make( - Text::make('<')->fontSize(20)->fontWeight(7)->color('#94A3B8'), - Spacer::make()->width(8), - Text::make('Back')->fontSize(15)->color('#94A3B8'), - )->gap(0) - )->onPress('backToLauncher')->padding(4, 0, 4, 0) - ); - - $column->addChild( - Text::make('Phase 1 verification') - ->fontSize(22)->fontWeight(7)->color('#F1F5F9') - ); - $column->addChild( - Text::make('Calls Element::toArray() three times and inspects the ids.') - ->fontSize(13)->color('#94A3B8') - ); - - foreach ($results as $r) { - $column->addChild($this->renderResultCard($r)); - } - - $allPassed = array_reduce($results, fn ($carry, $r) => $carry && $r['pass'], true); - $column->addChild( - Text::make($allPassed ? 'All tests passed.' : 'One or more tests failed — check ids above.') - ->fontSize(15) - ->fontWeight(6) - ->color($allPassed ? '#10B981' : '#EF4444') - ); - $column->addChild(Spacer::make()->height(24)); - - return ScrollView::make() - ->fill()->safeArea()->bg('#0F172A') - ->addChild($column); - } - - /** - * Runs the three Phase 1 checks and returns a normalized result - * list. Pure PHP — no native calls, no side effects on the wider - * runtime — so it's safe to call from render() every frame. - */ - private function runTests(): array - { - $results = []; - - // ── Test 1: unkeyed → sequential positional ids ── - $reg = new CallbackRegistry; - $t1 = Column::make( - Text::make('A'), - Text::make('B'), - Text::make('C'), - )->toArray($reg); - $unkeyedIds = array_map(fn ($c) => $c['id'], $t1['children']); - // Expect [2, 3, 4] — root is 1, children fall to $nextId++. - $results[] = [ - 'name' => 'Test 1 — unkeyed children get sequential ids', - 'detail' => 'Three unkeyed Text children under unkeyed Column. Expect [2, 3, 4].', - 'observed' => 'root='.$t1['id'].', children=['.implode(', ', $unkeyedIds).']', - 'pass' => $t1['id'] === 1 && $unkeyedIds === [2, 3, 4], - ]; - - // ── Test 2: keyed children → hash ids (non-sequential, > 2^16) ── - $reg = new CallbackRegistry; - $t2 = Column::make( - Text::make('A')->key('item-a'), - Text::make('B')->key('item-b'), - )->toArray($reg); - $keyedIds = array_map(fn ($c) => $c['id'], $t2['children']); - $hashShape = array_reduce( - $keyedIds, - fn ($carry, $id) => $carry && $id > 0xFFFF && $id <= 0xFFFFFFFF, - true, - ); - $results[] = [ - 'name' => 'Test 2 — keyed children get hash ids', - 'detail' => "Two Text children with ->key('item-a') and ->key('item-b').", - 'observed' => 'root='.$t2['id'].', children=['.implode(', ', $keyedIds).']', - 'pass' => $t2['id'] === 1 - && $hashShape - && $keyedIds[0] !== $keyedIds[1], - ]; - - // ── Test 3: reordering keyed children preserves ids ── - // Phase 1 win: same key → same id regardless of position. - $reg = new CallbackRegistry; - $t3 = Column::make( - Text::make('B')->key('item-b'), - Text::make('A')->key('item-a'), - )->toArray($reg); - $reorderedIds = array_map(fn ($c) => $c['id'], $t3['children']); - // 'item-b' was at index 1 in Test 2, now at index 0. Same id. - $itemBSame = $reorderedIds[0] === $keyedIds[1]; - $itemASame = $reorderedIds[1] === $keyedIds[0]; - $results[] = [ - 'name' => 'Test 3 — reorder preserves ids', - 'detail' => 'Same two keys as Test 2, swapped order. Each id follows its key.', - 'observed' => "before=[item-a:{$keyedIds[0]}, item-b:{$keyedIds[1]}], " - ."after=[item-b:{$reorderedIds[0]}, item-a:{$reorderedIds[1]}]", - 'pass' => $itemBSame && $itemASame, - ]; - - return $results; - } - - private function renderResultCard(array $r): Element - { - $passColor = $r['pass'] ? '#10B981' : '#EF4444'; - $passLabel = $r['pass'] ? 'PASS' : 'FAIL'; - - $card = Column::make() - ->fillWidth()->padding(14)->gap(6) - ->bg('#1E293B')->borderRadius(10); - - $card->addChild( - Row::make( - Text::make($passLabel) - ->fontSize(11)->fontWeight(7)->color('#FFFFFF') - ->bg($passColor)->borderRadius(4)->padding(2, 8), - Spacer::make()->width(10), - Text::make($r['name']) - ->fontSize(14)->fontWeight(6)->color('#F1F5F9'), - )->fillWidth()->alignItems(2) - ); - - $card->addChild( - Text::make($r['detail'])->fontSize(12)->color('#94A3B8') - ); - $card->addChild( - Text::make($r['observed'])->fontSize(12)->color('#CBD5E1') - ); - - return $card; - } -} diff --git a/app/NativeComponents/Phase2MemoTest.php b/app/NativeComponents/Phase2MemoTest.php deleted file mode 100644 index 6258426..0000000 --- a/app/NativeComponents/Phase2MemoTest.php +++ /dev/null @@ -1,207 +0,0 @@ -displayMode('large') - ->subtitle('REUSE-marker verification'); - } - - public function increment(): void - { - $this->counter++; - } - - public function decrement(): void - { - if ($this->counter > 0) { - $this->counter--; - } - } - - /** - * Toggle the NPHP_FLAG_SUBTREE_MEMO bit on the region. Effect kicks in - * on the next publish (this method's callback returns, runLoop loops, - * memoizedToArray() consults the new flag value). - */ - public function toggleMemo(): void - { - $now = nativephp_runtime_flags(); - $next = $now ^ 0x02; // flip bit 1 - nativephp_set_runtime_flags($next); - error_log(sprintf( - 'Phase2MemoTest: memo flipped 0x%08x → 0x%08x', - $now, - $next, - )); - } - - public function backToLauncher(): void - { - $this->back(); - } - - public function render(): Element - { - $this->currentFlags = nativephp_runtime_flags(); - $memoOn = ($this->currentFlags & 0x02) !== 0; - - $root = Column::make()->fillWidth()->padding(16)->gap(12); - - $root->addChild( - Pressable::make( - Row::make( - Text::make('<')->fontSize(20)->fontWeight(7)->color('#94A3B8'), - Spacer::make()->width(8), - Text::make('Back')->fontSize(15)->color('#94A3B8'), - )->gap(0) - )->onPress('backToLauncher')->padding(4, 0, 4, 0) - ); - - // ── Header / toggle ── - $root->addChild( - Text::make('Phase 2 verification') - ->fontSize(22)->fontWeight(7)->color('#F1F5F9') - ); - $root->addChild( - Text::make('Watch BENCH_C `flat=...` in the logs as you tap.') - ->fontSize(13)->color('#94A3B8') - ); - - $root->addChild($this->renderFlagsCard($memoOn)); - - // ── Counter ── - $root->addChild( - Row::make( - Pressable::make( - Text::make('-1')->fontSize(16)->fontWeight(7)->color('#FFFFFF') - )->onPress('decrement')->bg('#475569')->borderRadius(8)->padding(10, 18), - Spacer::make()->width(12), - Text::make((string) $this->counter) - ->fontSize(28)->fontWeight(7)->color('#38BDF8'), - Spacer::make()->width(12), - Pressable::make( - Text::make('+1')->fontSize(16)->fontWeight(7)->color('#FFFFFF') - )->onPress('increment')->bg('#0EA5E9')->borderRadius(8)->padding(10, 18), - )->fillWidth()->alignItems(2)->justifyContent(1) - ); - - // ── Big keyed list ── - // Keys are stable per Phase 1 — every row keeps its id across renders, - // so Phase 2's contentHash check can detect unchanged rows and emit - // REUSE markers. Without keys, every row would get a fresh positional - // id and never qualify as unchanged. - $list = Column::make()->fillWidth()->gap(2)->key('rows-container'); - for ($i = 0; $i < self::ROW_COUNT; $i++) { - // Static rows — content never changes. With memo on, these - // should all be REUSE on every publish after the first. - $list->addChild( - Row::make( - Text::make("row #{$i}")->fontSize(13)->color('#CBD5E1'), - Spacer::make()->flexGrow(1), - Text::make(sprintf('%.2f ms', $i * 0.1)) - ->fontSize(12)->color('#64748B'), - ) - ->key("row-{$i}") - ->fillWidth()->padding(8, 12)->bg('#1E293B')->borderRadius(6) - ); - } - $root->addChild($list); - - $root->addChild(Spacer::make()->height(24)); - - return ScrollView::make() - ->fill()->safeArea()->bg('#0F172A') - ->addChild($root); - } - - private function renderFlagsCard(bool $memoOn): Element - { - $statusColor = $memoOn ? '#10B981' : '#64748B'; - $statusLabel = $memoOn ? 'MEMO ON' : 'MEMO OFF'; - - $card = Column::make() - ->fillWidth()->padding(12)->gap(8) - ->bg('#1E293B')->borderRadius(10); - - $card->addChild( - Row::make( - Text::make($statusLabel) - ->fontSize(11)->fontWeight(7)->color('#FFFFFF') - ->bg($statusColor)->borderRadius(4)->padding(2, 8), - Spacer::make()->width(10), - Text::make(sprintf('runtime_flags = 0x%08x', $this->currentFlags)) - ->fontSize(12)->color('#CBD5E1')->fontWeight(6), - )->fillWidth()->alignItems(2) - ); - - $card->addChild( - Pressable::make( - Text::make('Toggle memo') - ->fontSize(13)->fontWeight(6)->color('#0F172A') - ) - ->onPress('toggleMemo') - ->bg('#F59E0B')->borderRadius(6)->padding(8, 14) - ); - - $card->addChild( - Text::make( - $memoOn - ? 'REUSE markers active. Static rows below should not re-serialize on +1.' - : 'All nodes emit FULL. Every +1 re-serializes the full tree.' - )->fontSize(11)->color('#94A3B8') - ); - - return $card; - } -} diff --git a/app/NativeComponents/Phase4VirtualListTest.php b/app/NativeComponents/Phase4VirtualListTest.php deleted file mode 100644 index de31b06..0000000 --- a/app/NativeComponents/Phase4VirtualListTest.php +++ /dev/null @@ -1,126 +0,0 @@ -displayMode('large') - ->subtitle('Windowed materialization'); - } - - public function backToLauncher(): void - { - $this->back(); - } - - public function render(): Element - { - // The trait's defaults are [0..79] — clamp to our real total. - $from = max(0, $this->virtualWindowFrom); - $to = min(self::TOTAL_ITEMS - 1, $this->virtualWindowTo); - - // Materialize only the rows inside [from..to]. For 10k logical - // items with a window of ~80, that's ~80 Element constructions - // per render — vs. 10000 for a naive list. - $rows = []; - for ($i = $from; $i <= $to; $i++) { - $rows[] = Row::make( - Text::make("row #{$i}")->fontSize(13)->color('#CBD5E1'), - Spacer::make()->flexGrow(1), - Text::make(sprintf('%.2f ms', $i * 0.001)) - ->fontSize(12)->color('#64748B'), - ) - ->key("row-{$i}") - ->fillWidth()->padding(8, 12)->bg('#1E293B')->borderRadius(6); - } - - $list = NativeVirtualList::make(...$rows) - ->fillWidth() - ->flexGrow(1); - - // The element's window/count/handler attrs are set via the - // applyAttributes hook the Blade precompiler also uses — this is - // the canonical API; there's no fluent setter on the plugin - // element. - $list->applyAttributes([ - 'count' => self::TOTAL_ITEMS, - 'window_from' => $from, - 'window_to' => $to, - 'estimated_row_height' => 48, - 'overscan' => 40, - 'on_window_change' => 'setVirtualWindow', - ]); - - $header = Column::make()->fillWidth()->padding(16)->gap(12); - - $header->addChild( - Pressable::make( - Row::make( - Text::make('<')->fontSize(20)->fontWeight(7)->color('#94A3B8'), - Spacer::make()->width(8), - Text::make('Back')->fontSize(15)->color('#94A3B8'), - )->gap(0) - )->onPress('backToLauncher')->padding(4, 0, 4, 0) - ); - - $header->addChild( - Text::make('Phase 4 verification') - ->fontSize(22)->fontWeight(7)->color('#F1F5F9') - ); - $header->addChild( - Text::make(sprintf( - '%d logical items, current window = [%d..%d]. Scroll the list — '. - 'native fires on_window_change when the visible range drifts past '. - 'the materialized slice, and the next render emits the new slice.', - self::TOTAL_ITEMS, - $from, - $to, - ))->fontSize(13)->color('#94A3B8') - ); - - $root = Column::make()->fill()->safeArea()->bg('#0F172A'); - $root->addChild($header); - $root->addChild($list); - - return $root; - } -} diff --git a/app/NativeComponents/SkiaShowcase.php b/app/NativeComponents/SkiaShowcase.php deleted file mode 100644 index 7853d4b..0000000 --- a/app/NativeComponents/SkiaShowcase.php +++ /dev/null @@ -1,56 +0,0 @@ - '#0f0f1e'])); - } - - public function togglePulse(): void - { - $this->pulseRunning = ! $this->pulseRunning; - } - - public function toggleSpin(): void - { - $this->spinRunning = ! $this->spinRunning; - } - - public function toggleTimer(): void - { - $this->timerRunning = ! $this->timerRunning; - } - - public function setTimerSeconds(int $seconds): void - { - $this->timerSeconds = $seconds; - $this->timerRunning = false; - } - - public function toggleBars(): void - { - $this->barAnimRunning = $this->barAnimRunning === 1 ? 0 : 1; - } - - public function toggleWave(): void - { - $this->waveRunning = $this->waveRunning === 1 ? 0 : 1; - } - - public function render(): \Illuminate\View\View - { - return view('skia-showcase'); - } -} \ No newline at end of file diff --git a/app/NativeComponents/SpotifyArtist.php b/app/NativeComponents/SpotifyArtist.php index 116c12f..32f12aa 100644 --- a/app/NativeComponents/SpotifyArtist.php +++ b/app/NativeComponents/SpotifyArtist.php @@ -3,6 +3,7 @@ namespace App\NativeComponents; use App\NativeComponents\Concerns\HasSpotifyData; +use Illuminate\View\View; use Native\Mobile\Edge\NativeComponent; use Native\Mobile\Facades\Dialog; @@ -10,7 +11,6 @@ class SpotifyArtist extends NativeComponent { use HasSpotifyData; - /** @var array */ public array $artist = []; /** @var array */ @@ -20,6 +20,8 @@ class SpotifyArtist extends NativeComponent public function mount(): void { + nativephp_call('UI.SetBackground', json_encode(['color' => '#121212'])); + $id = (int) $this->param('id'); $artists = self::spotifyArtists(); $this->artist = $artists[$id] ?? $artists[0]; @@ -30,6 +32,16 @@ public function mount(): void ); } + public function unmount(): void + { + // UI.SetBackground is app-global sticky native state — without + // this clear it leaks the window color into every screen visited + // after this one. Empty color = restore the platform default. + nativephp_call('UI.SetBackground', json_encode(['color' => null])); + + parent::unmount(); + } + public function toggleFollow(): void { $this->isFollowing = ! $this->isFollowing; @@ -39,11 +51,11 @@ public function playTrack(int $index): void { $track = $this->topTracks[$index] ?? null; if ($track) { - Dialog::alert('Now Playing', $track['title'] . ' by ' . $this->artist['name']); + Dialog::alert('Now Playing', $track['title'].' by '.$this->artist['name']); } } - public function render(): \Illuminate\View\View + public function render(): View { $tracksWithMeta = []; foreach ($this->topTracks as $track) { diff --git a/app/NativeComponents/SpotifyHome.php b/app/NativeComponents/SpotifyHome.php index a88b25d..3a2c971 100644 --- a/app/NativeComponents/SpotifyHome.php +++ b/app/NativeComponents/SpotifyHome.php @@ -3,6 +3,7 @@ namespace App\NativeComponents; use App\NativeComponents\Concerns\HasSpotifyData; +use Illuminate\View\View; use Native\Mobile\Edge\NativeComponent; use Native\Mobile\Edge\Transition; @@ -10,6 +11,21 @@ class SpotifyHome extends NativeComponent { use HasSpotifyData; + public function mount(): void + { + nativephp_call('UI.SetBackground', json_encode(['color' => '#121212'])); + } + + public function unmount(): void + { + // UI.SetBackground is app-global sticky native state — without + // this clear it leaks the window color into every screen visited + // after this one. Empty color = restore the platform default. + nativephp_call('UI.SetBackground', json_encode(['color' => null])); + + parent::unmount(); + } + public function navTitle(): string { return 'Spotify'; @@ -33,7 +49,7 @@ public function viewSearch(): void ->transition(Transition::SlideFromRight); } - public function render(): \Illuminate\View\View + public function render(): View { $playlists = self::spotifyPlaylists(); $artists = self::spotifyArtists(); diff --git a/app/NativeComponents/SpotifyPlaylist.php b/app/NativeComponents/SpotifyPlaylist.php index 5922588..1107e8c 100644 --- a/app/NativeComponents/SpotifyPlaylist.php +++ b/app/NativeComponents/SpotifyPlaylist.php @@ -3,6 +3,7 @@ namespace App\NativeComponents; use App\NativeComponents\Concerns\HasSpotifyData; +use Illuminate\View\View; use Native\Mobile\Edge\NativeComponent; use Native\Mobile\Edge\Transition; use Native\Mobile\Facades\Dialog; @@ -11,7 +12,6 @@ class SpotifyPlaylist extends NativeComponent { use HasSpotifyData; - /** @var array */ public array $playlist = []; /** @var array */ @@ -19,6 +19,8 @@ class SpotifyPlaylist extends NativeComponent public function mount(): void { + nativephp_call('UI.SetBackground', json_encode(['color' => '#121212'])); + $id = (int) $this->param('id'); $playlists = self::spotifyPlaylists(); $this->playlist = $playlists[$id] ?? $playlists[0]; @@ -32,6 +34,16 @@ public function mount(): void } } + public function unmount(): void + { + // UI.SetBackground is app-global sticky native state — without + // this clear it leaks the window color into every screen visited + // after this one. Empty color = restore the platform default. + nativephp_call('UI.SetBackground', json_encode(['color' => null])); + + parent::unmount(); + } + public function viewArtist(int $artistId): void { $this->navigate($this->route('spotify.artist', $artistId)) @@ -42,16 +54,16 @@ public function playTrack(int $index): void { $track = $this->tracks[$index] ?? null; if ($track) { - Dialog::alert('Now Playing', $track['title'] . ' by ' . $track['artistName']); + Dialog::alert('Now Playing', $track['title'].' by '.$track['artistName']); } } public function shufflePlay(): void { - Dialog::alert('Shuffle Play', 'Playing ' . $this->playlist['name'] . ' on shuffle.'); + Dialog::alert('Shuffle Play', 'Playing '.$this->playlist['name'].' on shuffle.'); } - public function render(): \Illuminate\View\View + public function render(): View { $tracksWithMeta = []; foreach ($this->tracks as $track) { diff --git a/app/NativeComponents/SpotifySearch.php b/app/NativeComponents/SpotifySearch.php index 844c6c2..8e13631 100644 --- a/app/NativeComponents/SpotifySearch.php +++ b/app/NativeComponents/SpotifySearch.php @@ -3,6 +3,7 @@ namespace App\NativeComponents; use App\NativeComponents\Concerns\HasSpotifyData; +use Illuminate\View\View; use Native\Mobile\Edge\NativeComponent; use Native\Mobile\Edge\Transition; @@ -10,6 +11,21 @@ class SpotifySearch extends NativeComponent { use HasSpotifyData; + public function mount(): void + { + nativephp_call('UI.SetBackground', json_encode(['color' => '#121212'])); + } + + public function unmount(): void + { + // UI.SetBackground is app-global sticky native state — without + // this clear it leaks the window color into every screen visited + // after this one. Empty color = restore the platform default. + nativephp_call('UI.SetBackground', json_encode(['color' => null])); + + parent::unmount(); + } + public function viewPlaylist(int $index): void { $this->navigate($this->route('spotify.playlist', $index)) @@ -22,7 +38,7 @@ public function viewArtist(int $index): void ->transition(Transition::SlideFromRight); } - public function render(): \Illuminate\View\View + public function render(): View { return view('spotify-search', [ 'genres' => self::spotifyGenres(), diff --git a/app/NativeComponents/StackPositioningDemo.php b/app/NativeComponents/StackPositioningDemo.php new file mode 100644 index 0000000..8cad889 --- /dev/null +++ b/app/NativeComponents/StackPositioningDemo.php @@ -0,0 +1,71 @@ + + */ + public array $show = [11]; + + /** + * The nine anchor/origin points, in wire-enum order. Drives the anchor + * and origin grids so the blade stays declarative and we exercise the + * bound-attribute path (`:anchor="$point"`) as well as the literal one. + * + * @var array + */ + public array $points = [ + ['name' => 'top-left', 'enum' => 1], + ['name' => 'top', 'enum' => 2], + ['name' => 'top-right', 'enum' => 3], + ['name' => 'left', 'enum' => 4], + ['name' => 'center', 'enum' => 0], + ['name' => 'right', 'enum' => 5], + ['name' => 'bottom-left', 'enum' => 6], + ['name' => 'bottom', 'enum' => 7], + ['name' => 'bottom-right', 'enum' => 8], + ]; + + public function navTitle(): string + { + return 'Stack & Positioning'; + } + + public function toggleBounds(): void + { + $this->showBounds = ! $this->showBounds; + } + + /** Rows of three, so the 9-point grids lay out as a 3x3. */ + public function pointRows(): array + { + return array_chunk($this->points, 3); + } + + public function render(): View + { + return view('native.stack-positioning-demo'); + } +} diff --git a/app/NativeComponents/SyncUpChat.php b/app/NativeComponents/SyncUpChat.php deleted file mode 100644 index 1e8bc85..0000000 --- a/app/NativeComponents/SyncUpChat.php +++ /dev/null @@ -1,135 +0,0 @@ - */ - public array $messages = []; - - public string $draft = ''; - - /** Tracks whether we've seeded $messages from the conversation id yet. */ - public bool $seeded = false; - - /** Modal visibility for the more-actions overlay. */ - public bool $showMoreActions = false; - - /** Confirmation modal for clear-history (dismissible=false). */ - public bool $showClearConfirm = false; - - public bool $isMuted = false; - - public function mount(): void - { - $id = (int) $this->param('id', 1); - $this->messages = self::suMessages($id); - $this->seeded = true; - } - - public function navTitle(): string - { - return $this->friend()['name']; - } - - public function navigationOptions(): ?NavBarOptions - { - return NavBarOptions::make() - ->action(NavAction::make('video')->icon('video.fill')->a11yLabel('Video call')->press('startVideo')) - ->action(NavAction::make('call')->icon('phone.fill')->a11yLabel('Voice call')->press('startCall')) - ->action(NavAction::make('more')->icon('ellipsis')->a11yLabel('More options')->press('openMenu')); - } - - public function setDraft(string $value): void - { - $this->draft = $value; - } - - public function send(): void - { - $text = trim($this->draft); - if ($text === '') { - return; - } - - $this->messages[] = [ - 'id' => count($this->messages) + 1, - 'fromMe' => true, - 'text' => $text, - 'time' => date('g:i A'), - 'status' => 'sent', - ]; - $this->draft = ''; - } - - public function attachFile(): void { /* stub */ } - public function attachPhoto(): void { /* stub */ } - public function openEmoji(): void { /* stub */ } - public function openMore(): void { /* stub */ } - public function startCall(): void { /* stub */ } - public function startVideo(): void { - Dialog::toast('Starting Video'); - } - - /** Tapped from the NavBar ellipsis — opens the more-actions modal. */ - public function openMenu(): void - { - $this->showMoreActions = true; - } - - public function closeMoreActions(): void - { - $this->showMoreActions = false; - } - - public function toggleMute(): void - { - $this->isMuted = ! $this->isMuted; - $this->showMoreActions = false; - } - - /** Bridges from more-actions modal → blocking confirm modal. */ - public function askClearHistory(): void - { - $this->showMoreActions = false; - $this->showClearConfirm = true; - } - - public function confirmClearHistory(): void - { - $this->messages = []; - $this->showClearConfirm = false; - } - - public function cancelClearHistory(): void - { - $this->showClearConfirm = false; - } - - /** Resolve the friend (other party) for the conversation. */ - private function friend(): array - { - $id = (int) $this->param('id', 1); - $conv = self::suConversation($id); - if ($conv && ! $conv['isGroup']) { - return self::suUser($conv['userId']); - } - // Fallback for the demo — Alex Rivera matches the mockup. - return self::suUser(5); - } - - public function render(): \Illuminate\View\View - { - return view('syncup.chat', [ - 'friend' => $this->friend(), - ]); - } -} diff --git a/app/NativeComponents/SyncUpChats.php b/app/NativeComponents/SyncUpChats.php deleted file mode 100644 index 6ff3cfe..0000000 --- a/app/NativeComponents/SyncUpChats.php +++ /dev/null @@ -1,119 +0,0 @@ -action(NavAction::make('more')->icon('ellipsis')->a11yLabel('More options')->press('openMenu')); - } - - public function setFilter(string $name): void - { - $this->activeFilter = $name; - } - - public function updateSearch(string $value): void - { - $this->search = $value; - } - - public function openChat(int $id): void - { - $this->navigate("/syncup/chat/{$id}") - ->transition(Transition::SlideFromRight); - } - - public function newMessage(): void - { - $this->showNewMessage = true; - } - - public function closeNewMessage(): void - { - $this->showNewMessage = false; - } - - public function startChatWith(int $userId): void - { - $this->showNewMessage = false; - $this->navigate("/syncup/chat/{$userId}") - ->transition(Transition::SlideFromRight); - } - - public function addSuggestion(int $id): void - { - // Demo stub. - } - - public function openSearch(): void - { - // Demo stub. - } - - public function openMenu(): void - { - // Demo stub. - } - - public function render(): \Illuminate\View\View - { - $users = self::suUsers(); - $conversations = self::suConversations(); - - // Decorate each conversation with the related user (or a synthetic - // 'group' avatar for is-group rows). - $rows = []; - foreach ($conversations as $c) { - if ($c['isGroup']) { - $rows[] = $c + [ - 'displayName' => $c['name'], - 'avatarUrl' => null, - ]; - } else { - $u = self::suUser($c['userId']); - $rows[] = $c + [ - 'displayName' => $u['name'], - 'avatarUrl' => $u['avatarUrl'], - 'status' => $u['status'], - ]; - } - } - - // Friends for the "new message" bottom-sheet (skip "You" at id 0). - $friends = array_values(array_filter($users, fn ($u) => $u['id'] !== 0)); - - return view('native.syncup.chats', [ - 'rows' => $rows, - 'filters' => self::suFilters(), - 'suggestions' => self::suSuggestions(), - 'friends' => $friends, - ]); - } -} diff --git a/app/NativeComponents/SyncUpFriends.php b/app/NativeComponents/SyncUpFriends.php deleted file mode 100644 index d414111..0000000 --- a/app/NativeComponents/SyncUpFriends.php +++ /dev/null @@ -1,54 +0,0 @@ -navigate("/syncup/chat/{$id}") - ->transition(Transition::SlideFromRight); - } - - public function addSuggestion(int $id): void - { - // Stub. - } - - public function render(): \Illuminate\View\View - { - $users = self::suUsers(); - - // Take 3 friends for the list (skip "You" at id=0); the remaining are - // suggestions (overlap with suSuggestions for the demo). The mockup - // shows 3 visible friends and 2+ suggestions. - $friends = array_slice(array_filter($users, fn ($u) => $u['id'] !== 0), 0, 3); - $onlineCount = count(array_filter($users, fn ($u) => $u['status'] === 'online')); - - return view('syncup.friends', [ - 'friends' => array_values($friends), - 'onlineCount' => $onlineCount, - 'suggestions' => self::suSuggestions(), - ]); - } -} diff --git a/app/NativeComponents/SyncUpLogin.php b/app/NativeComponents/SyncUpLogin.php deleted file mode 100644 index 05814bf..0000000 --- a/app/NativeComponents/SyncUpLogin.php +++ /dev/null @@ -1,66 +0,0 @@ -email = $value; - } - - public function updatePassword(string $value): void - { - $this->password = $value; - } - - public function toggleVisibility(): void - { - $this->showPassword = ! $this->showPassword; - } - - public function login(): void - { - $this->replace('/syncup')->transition(Transition::Fade); - } - - /** Skip the form entirely — convenient for demo browsing. */ - public function skipLogin(): void - { - $this->login(); - } - - public function forgotPassword(): void - { - // Demo stub — would push a password reset flow. - } - - public function createAccount(): void - { - // Demo stub — would push the registration flow. - } - - public function loginWithGoogle(): void - { - $this->login(); - } - - public function loginWithApple(): void - { - $this->login(); - } - - public function render(): \Illuminate\View\View - { - return view('syncup.login'); - } -} diff --git a/app/NativeComponents/SyncUpNative/Layouts/SyncUpNativeTabsLayout.php b/app/NativeComponents/SyncUpNative/Layouts/SyncUpNativeTabsLayout.php index 37df7e4..4fca713 100644 --- a/app/NativeComponents/SyncUpNative/Layouts/SyncUpNativeTabsLayout.php +++ b/app/NativeComponents/SyncUpNative/Layouts/SyncUpNativeTabsLayout.php @@ -9,8 +9,6 @@ use Native\Mobile\Edge\Layouts\Builders\TabBar; use Native\Mobile\Edge\Layouts\NativeLayout; use Native\Mobile\Edge\NativeComponent; -use Nativephp\NativeUi\Builders\FloatingOverlay; -use Nativephp\NativeUi\Concerns\HasFloatingOverlay; /** * Native-chrome variant of SyncUp's tabs layout. Same shape as the diff --git a/app/NativeComponents/SyncUpProfile.php b/app/NativeComponents/SyncUpProfile.php deleted file mode 100644 index b865f7c..0000000 --- a/app/NativeComponents/SyncUpProfile.php +++ /dev/null @@ -1,53 +0,0 @@ -name = $value; - $this->saved = false; - } - - public function updateBio(string $value): void - { - $this->bio = $value; - $this->saved = false; - } - - public function editPhoto(): void { /* stub */ } - public function copyLink(): void { /* stub */ } - public function shareLink(): void { /* stub */ } - - public function saveProfile(): void - { - $this->saved = true; - } - - public function signOut(): void - { - $this->navigate('/syncup/login'); - } - - public function render(): \Illuminate\View\View - { - return view('syncup.profile'); - } -} diff --git a/app/NativeComponents/ThemeLab.php b/app/NativeComponents/ThemeLab.php new file mode 100644 index 0000000..104434c --- /dev/null +++ b/app/NativeComponents/ThemeLab.php @@ -0,0 +1,98 @@ +presses++; + } + + /** + * Token pairs rendered as swatches: bg token → its on-* companion. + * + * @return array + */ + public function swatchTokens(): array + { + return [ + 'primary' => 'Primary — brand violet', + 'secondary' => 'Secondary — teal / fuchsia', + 'surface' => 'Surface — cards & sheets', + 'surface-variant' => 'Surface Variant — tonal fills', + 'destructive' => 'Destructive — errors', + 'success' => 'Success — custom token', + 'accent' => 'Accent — highlights', + ]; + } + + /** + * Button variants including the success case. + * + * @return array + */ + public function buttonVariants(): array + { + return ['primary', 'secondary', 'success', 'destructive', 'ghost']; + } + + /** + * Badge variants including the success case. + * + * @return array + */ + public function badgeVariants(): array + { + return ['destructive', 'primary', 'success', 'accent']; + } + + /** + * Opacity steps for the theme-class tonal-fill ramp. + * + * @return array + */ + public function opacitySteps(): array + { + return [10, 25, 50, 75, 100]; + } + + /** + * Font aliases from config/native-ui.php with sample copy. + * + * @return array + */ + public function fontSamples(): array + { + return [ + 'display' => 'SUPERNATIVE', + 'grotesk' => 'Space Grotesk — clean UI copy with personality.', + 'grotesk-bold' => 'Space Grotesk Bold — headlines that mean it.', + 'accent' => 'Lobster — when the moment calls for flair.', + 'default' => 'Geist Pixel — the app-wide default face.', + ]; + } + + public function render(): View + { + return view('native.theme-lab'); + } +} diff --git a/app/NativeComponents/TweetDetail.php b/app/NativeComponents/TweetDetail.php index 22ef88a..001ea11 100644 --- a/app/NativeComponents/TweetDetail.php +++ b/app/NativeComponents/TweetDetail.php @@ -3,6 +3,7 @@ namespace App\NativeComponents; use App\NativeComponents\Concerns\HasTweetData; +use Illuminate\View\View; use Native\Mobile\Edge\NativeComponent; use Native\Mobile\Edge\Transition; @@ -20,6 +21,8 @@ class TweetDetail extends NativeComponent public bool $isRetweeted = false; + public bool $isBookmarked = false; + public function mount(): void { $id = (int) $this->param('id'); @@ -54,15 +57,23 @@ public function toggleRetweet(): void $this->isRetweeted = ! $this->isRetweeted; } - public function render(): \Illuminate\View\View + public function toggleBookmark(): void + { + $this->isBookmarked = ! $this->isBookmarked; + } + + public function render(): View { $likeCount = $this->tweet['likeCount'] + ($this->isLiked ? 1 : 0); $retweetCount = $this->tweet['retweetCount'] + ($this->isRetweeted ? 1 : 0); + $bookmarkCount = intdiv($this->tweet['likeCount'], 9) + ($this->isBookmarked ? 1 : 0); return view('tweet-detail', [ 'likeFormatted' => self::formatCount($likeCount), 'retweetFormatted' => self::formatCount($retweetCount), 'replyFormatted' => self::formatCount($this->tweet['replyCount']), + 'bookmarkFormatted' => self::formatCount($bookmarkCount), + 'viewFormatted' => self::formatCount($this->tweet['likeCount'] * 41 + $this->tweet['replyCount'] * 173), ]); } } diff --git a/app/NativeComponents/TwitterFeed.php b/app/NativeComponents/TwitterFeed.php index a065332..21cb1aa 100644 --- a/app/NativeComponents/TwitterFeed.php +++ b/app/NativeComponents/TwitterFeed.php @@ -3,6 +3,7 @@ namespace App\NativeComponents; use App\NativeComponents\Concerns\HasTweetData; +use Illuminate\View\View; use Native\Mobile\Edge\NativeComponent; use Native\Mobile\Edge\Transition; @@ -10,24 +11,34 @@ class TwitterFeed extends NativeComponent { use HasTweetData; + /** User ids shown on the Following tab. */ + private const FOLLOWING_USER_IDS = [0, 1, 2, 7]; + public int $selectedTab = 0; + public int $refreshCount = 0; + + /** @var array Keyed by tweet id, stable across tab filters and refresh rotation. */ + public array $likedTweets = []; + public function navTitle(): string { return 'Twitter / X'; } - /** @var array */ - public array $likedTweets = []; - public function selectTab(int $index): void { $this->selectedTab = $index; } - public function viewTweet(int $index): void + public function refresh(): void { - $this->navigate($this->route('twitter.tweet', $index)) + $this->refreshCount++; + } + + public function viewTweet(int $id): void + { + $this->navigate($this->route('twitter.tweet', $id)) ->transition(Transition::SlideFromRight); } @@ -43,28 +54,43 @@ public function composeTweet(): void ->transition(Transition::SlideFromBottom); } - public function toggleLike(int $index): void + public function toggleLike(int $id): void { - if (isset($this->likedTweets[$index])) { - unset($this->likedTweets[$index]); + if (isset($this->likedTweets[$id])) { + unset($this->likedTweets[$id]); } else { - $this->likedTweets[$index] = true; + $this->likedTweets[$id] = true; } } - public function render(): \Illuminate\View\View + public function render(): View { $users = self::tweetUsers(); $tweets = self::tweets(); - foreach ($tweets as $i => &$tweet) { + foreach ($tweets as $id => &$tweet) { + $tweet['id'] = $id; $tweet['user'] = $users[$tweet['userId']]; $tweet['replyFormatted'] = self::formatCount($tweet['replyCount']); $tweet['retweetFormatted'] = self::formatCount($tweet['retweetCount']); + $tweet['viewFormatted'] = self::formatCount($tweet['likeCount'] * 41 + $tweet['replyCount'] * 173); $tweet['likeFormatted'] = self::formatCount( - $tweet['likeCount'] + (isset($this->likedTweets[$i]) ? 1 : 0) + $tweet['likeCount'] + (isset($this->likedTweets[$id]) ? 1 : 0) ); - $tweet['isLiked'] = isset($this->likedTweets[$i]); + $tweet['isLiked'] = isset($this->likedTweets[$id]); + } + unset($tweet); + + if ($this->selectedTab === 1) { + $tweets = array_values(array_filter( + $tweets, + fn (array $tweet): bool => in_array($tweet['userId'], self::FOLLOWING_USER_IDS, true) + )); + } + + if ($this->refreshCount > 0 && count($tweets) > 1) { + $offset = $this->refreshCount % count($tweets); + $tweets = array_merge(array_slice($tweets, $offset), array_slice($tweets, 0, $offset)); } return view('twitter-feed', [ diff --git a/app/NativeComponents/TwitterProfile.php b/app/NativeComponents/TwitterProfile.php index 6ffb5ad..0c5fdbe 100644 --- a/app/NativeComponents/TwitterProfile.php +++ b/app/NativeComponents/TwitterProfile.php @@ -3,6 +3,7 @@ namespace App\NativeComponents; use App\NativeComponents\Concerns\HasTweetData; +use Illuminate\View\View; use Native\Mobile\Edge\NativeComponent; use Native\Mobile\Edge\Transition; @@ -18,6 +19,8 @@ class TwitterProfile extends NativeComponent public int $selectedTab = 0; + public bool $isFollowing = false; + public function mount(): void { $id = (int) $this->param('id'); @@ -35,13 +38,18 @@ public function selectTab(int $index): void $this->selectedTab = $index; } + public function toggleFollow(): void + { + $this->isFollowing = ! $this->isFollowing; + } + public function viewTweet(int $tweetId): void { $this->navigate($this->route('twitter.tweet', $tweetId)) ->transition(Transition::SlideFromRight); } - public function render(): \Illuminate\View\View + public function render(): View { $users = self::tweetUsers(); $allTweets = self::tweets(); @@ -59,7 +67,7 @@ public function render(): \Illuminate\View\View return view('twitter-profile', [ 'tweetsWithMeta' => $tweetsWithMeta, - 'followersFormatted' => self::formatCount($this->user['followers']), + 'followersFormatted' => self::formatCount($this->user['followers'] + ($this->isFollowing ? 1 : 0)), 'followingFormatted' => self::formatCount($this->user['following']), ]); } diff --git a/app/NativeComponents/VibeDemo.php b/app/NativeComponents/VibeDemo.php deleted file mode 100644 index f9dea09..0000000 --- a/app/NativeComponents/VibeDemo.php +++ /dev/null @@ -1,72 +0,0 @@ -on() closure and the #[OnEcho] attribute method — - * so this screen exercises the two listener paths side by side. PHP never - * broadcasts — it is purely a client subscriber. - * - * Also wires the connection lifecycle: a live/reconnecting badge - * (onDisconnect/onReconnect) and the last native error (onError — e.g. a - * failed subscription), which would otherwise be invisible on-device. - */ -class VibeDemo extends NativeComponent -{ - public string $channel = 'test-channel'; - - public string $lastMessage = '(waiting for a broadcast...)'; - - public int $count = 0; - - /** Same event, delivered via the #[OnEcho] attribute path. */ - public int $viaAttribute = 0; - - public bool $live = true; - - public ?string $lastError = null; - - public function navTitle(): string - { - return 'Vibe — Live Events'; - } - - public function mount(): void - { - Vibe::channel($this->channel) - ->on('TestEvent', function ($event) { - $this->lastMessage = $event->message; - $this->count++; - }) - ->onDisconnect(fn () => $this->live = false) - ->onReconnect(function () { - // Websockets don't replay missed messages — refetch - // authoritative state here in a real app. - $this->live = true; - $this->lastError = null; // transient errors are moot once we're back - }) - ->onError(fn ($event) => $this->lastError = "{$event->type}: {$event->message}"); - } - - /** The attribute path: channel-scoped, auto-torn-down on unmount. */ - #[OnEcho('TestEvent', channel: 'test-channel')] - public function onTestEvent(string $message): void - { - $this->viaAttribute++; - } - - public function render(): View - { - return view('native.vibe-demo'); - } -} diff --git a/app/NativeComponents/VibeLogin.php b/app/NativeComponents/VibeLogin.php deleted file mode 100644 index ad53c2e..0000000 --- a/app/NativeComponents/VibeLogin.php +++ /dev/null @@ -1,104 +0,0 @@ -loggedInAs = SecureStorage::get('vibe_user_name') ?: null; - } - - public function setEmail(string $value): void - { - $this->email = trim($value); - } - - public function setPassword(string $value): void - { - $this->password = $value; - } - - public function login(): void - { - if ($this->loading) { - return; - } - - // The HTTP call blocks the handler and the loop only re-renders after it - // returns — so flip to the loading state and publish this frame NOW, - // before the blocking call, so the spinner actually shows. - $this->loading = true; - $this->status = 'Logging in…'; - $this->publishFinalState(); - - // Reuse the single configured tunnel: swap the broadcasting-auth path - // for the login path so there's one URL to configure. - $loginUrl = str_replace('/broadcasting/auth', '/auth/login', (string) config('vibe.auth.endpoint')); - - try { - $response = Http::acceptJson() - ->withHeaders(['ngrok-skip-browser-warning' => 'true']) - ->post($loginUrl, ['email' => $this->email, 'password' => $this->password]); - - if ($response->successful()) { - SecureStorage::set('vibe_token', (string) $response->json('data.token')); - SecureStorage::set('vibe_user_name', (string) $response->json('data.user.name')); - - // Straight into the demo. replace() (not navigate()) so Back from - // the presence screen returns to the launcher, skipping login. - $this->replace('/vibe-presence'); - - return; - } else { - $this->status = 'Login failed ('.$response->status().'). Check your credentials.'; - } - } catch (\Throwable $e) { - $this->status = 'Error: '.$e->getMessage(); - } - - // Only reached on failure (success replace()s away above). - $this->loading = false; - } - - public function logout(): void - { - SecureStorage::delete('vibe_token'); - SecureStorage::delete('vibe_user_name'); - $this->loggedInAs = null; - $this->status = 'Logged out.'; - } - - public function render(): View - { - return view('native.vibe-login'); - } -} diff --git a/app/NativeComponents/VibePresenceDemo.php b/app/NativeComponents/VibePresenceDemo.php deleted file mode 100644 index 2f75e4a..0000000 --- a/app/NativeComponents/VibePresenceDemo.php +++ /dev/null @@ -1,111 +0,0 @@ - online members: user id => display name */ - public array $members = []; - - /** @var array ephemeral chat log ("Name: body") */ - public array $messages = []; - - public string $draft = ''; - - /** Ephemeral "X is typing" state — driven by whispers, auto-cleared by a poll. */ - public ?string $typistName = null; - - public int $typingUntil = 0; - - protected ?PendingSubscription $sub = null; - - public function navTitle(): string - { - return 'Vibe — Presence'; - } - - public function mount(): void - { - if (! $this->requireVibeAuth()) { - return; - } - - $this->sub = Vibe::presence($this->channel) - ->here(function (array $members) { - $this->members = []; - foreach ($members as $m) { - $this->members[(string) ($m['id'] ?? '')] = $this->name($m); - } - }) - ->joining(function (array $member) { - Dialog::toast($this->name($member).' has joined'); - $this->members[(string) ($member['id'] ?? '')] = $this->name($member); - }) - ->leaving(function (array $member) { - Dialog::toast($this->name($member).' has left'); - unset($this->members[(string) ($member['id'] ?? '')]); - }) - ->listenForWhisper('chat', function ($event) { - $this->messages[] = ['from' => $event->from ?? '?', 'body' => $event->body ?? '', 'mine' => false]; - $this->typingUntil = 0; // they sent → no longer typing - }) - ->listenForWhisper('typing', function ($event) { - $this->typistName = $event->from ?? 'Someone'; - $this->typingUntil = time() + 3; - }); - } - - /** Fires on each keystroke — whisper a transient "typing" signal to peers. */ - public function onType(string $text): void - { - $this->draft = $text; - $this->sub?->whisper('typing', ['from' => $this->vibeIdentity]); - } - - public function send(): void - { - $body = trim($this->draft); - if ($body === '' || $this->sub === null) { - return; - } - - // Whisper to the others; the sender never receives its own, so echo it. - $this->sub->whisper('chat', ['from' => $this->vibeIdentity, 'body' => $body]); - $this->messages[] = ['from' => $this->vibeIdentity ?? 'me', 'body' => $body, 'mine' => true]; - $this->draft = ''; - } - - /** Prefer the member's user_info name, fall back to their id. */ - protected function name(array $member): string - { - return $member['info']['name'] ?? ('user '.($member['id'] ?? '?')); - } - - public function render(): View - { - return view('native.vibe-presence-demo'); - } -} diff --git a/app/NativeComponents/VibePrivateDemo.php b/app/NativeComponents/VibePrivateDemo.php deleted file mode 100644 index bc09b45..0000000 --- a/app/NativeComponents/VibePrivateDemo.php +++ /dev/null @@ -1,56 +0,0 @@ -requireVibeAuth()) { - return; - } - - Vibe::private($this->channel) - ->on('OrderShipped', function ($event) { - $this->lastMessage = $event->message; - $this->count++; - }) - // Auth rejections (bad token, dead VIBE_AUTH_ENDPOINT tunnel) used - // to fail silently; now they land here as vibe:error. - ->onError(fn ($event) => $this->lastError = "{$event->type}: {$event->message}"); - } - - public function render(): View - { - return view('native.vibe-demo'); - } -} diff --git a/app/NativeComponents/YouTubeChannel.php b/app/NativeComponents/YouTubeChannel.php index 0992b62..4d45a6b 100644 --- a/app/NativeComponents/YouTubeChannel.php +++ b/app/NativeComponents/YouTubeChannel.php @@ -3,6 +3,7 @@ namespace App\NativeComponents; use App\NativeComponents\Concerns\HasYouTubeData; +use Illuminate\View\View; use Native\Mobile\Edge\NativeComponent; use Native\Mobile\Edge\Transition; @@ -10,7 +11,6 @@ class YouTubeChannel extends NativeComponent { use HasYouTubeData; - /** @var array */ public array $channel = []; /** @var array */ @@ -34,6 +34,16 @@ public function mount(): void ); } + public function unmount(): void + { + // UI.SetBackground is app-global sticky native state — without + // this clear it leaks the window color into every screen visited + // after this one. Empty color = restore the platform default. + nativephp_call('UI.SetBackground', json_encode(['color' => null])); + + parent::unmount(); + } + public function toggleSubscribe(): void { $this->isSubscribed = ! $this->isSubscribed; @@ -49,7 +59,7 @@ public function viewVideo(int $index): void } } - public function render(): \Illuminate\View\View + public function render(): View { $videosWithMeta = []; foreach ($this->channelVideos as $video) { @@ -62,4 +72,4 @@ public function render(): \Illuminate\View\View 'subscribersFormatted' => self::formatYtCount($this->channel['subscribers']), ]); } -} \ No newline at end of file +} diff --git a/app/NativeComponents/YouTubeHome.php b/app/NativeComponents/YouTubeHome.php index a1f9293..36733cc 100644 --- a/app/NativeComponents/YouTubeHome.php +++ b/app/NativeComponents/YouTubeHome.php @@ -3,8 +3,7 @@ namespace App\NativeComponents; use App\NativeComponents\Concerns\HasYouTubeData; -use Native\Mobile\Edge\Layouts\Builders\NavAction; -use Native\Mobile\Edge\Layouts\Builders\NavBarOptions; +use Illuminate\View\View; use Native\Mobile\Edge\NativeComponent; use Native\Mobile\Edge\Transition; @@ -14,22 +13,19 @@ class YouTubeHome extends NativeComponent public string $activeCategory = 'All'; - public function navTitle(): string + public function mount(): void { - return 'YouTube'; + nativephp_call('UI.SetBackground', json_encode(['color' => '#0F0F0F'])); } - /** - * Surface YouTube's right-side actions in the framework NavBar instead - * of a duplicate inline top row. StackLayout reads this and merges into - * its NavBar. - */ - public function navigationOptions(): ?NavBarOptions + public function unmount(): void { - return NavBarOptions::make() - ->action(NavAction::make('cast')->icon('cart')->a11yLabel('Cast')->press('castDevice')) - ->action(NavAction::make('alerts')->icon('notifications')->a11yLabel('Notifications')->press('viewNotifications')) - ->action(NavAction::make('search')->icon('search')->a11yLabel('Search')->press('viewSearch')); + // UI.SetBackground is app-global sticky native state — without + // this clear it leaks the window color into every screen visited + // after this one. Empty color = restore the platform default. + nativephp_call('UI.SetBackground', json_encode(['color' => null])); + + parent::unmount(); } public function castDevice(): void @@ -65,7 +61,7 @@ public function selectCategory(string $category): void $this->activeCategory = $category; } - public function render(): \Illuminate\View\View + public function render(): View { $videos = self::ytVideos(); $channels = self::ytChannels(); diff --git a/app/NativeComponents/YouTubeSearch.php b/app/NativeComponents/YouTubeSearch.php index 3aa3846..a8e8047 100644 --- a/app/NativeComponents/YouTubeSearch.php +++ b/app/NativeComponents/YouTubeSearch.php @@ -3,6 +3,7 @@ namespace App\NativeComponents; use App\NativeComponents\Concerns\HasYouTubeData; +use Illuminate\View\View; use Native\Mobile\Edge\NativeComponent; use Native\Mobile\Edge\Transition; @@ -20,6 +21,16 @@ public function mount(): void nativephp_call('UI.SetBackground', json_encode(['color' => '#0F0F0F'])); } + public function unmount(): void + { + // UI.SetBackground is app-global sticky native state — without + // this clear it leaks the window color into every screen visited + // after this one. Empty color = restore the platform default. + nativephp_call('UI.SetBackground', json_encode(['color' => null])); + + parent::unmount(); + } + public function search(): void { if (trim($this->query) === '') { @@ -56,7 +67,7 @@ public function viewChannel(int $channelId): void ->transition(Transition::SlideFromRight); } - public function render(): \Illuminate\View\View + public function render(): View { $videos = self::ytVideos(); $channels = self::ytChannels(); @@ -77,4 +88,4 @@ public function render(): \Illuminate\View\View 'channels' => $channels, ]); } -} \ No newline at end of file +} diff --git a/app/NativeComponents/YouTubeVideo.php b/app/NativeComponents/YouTubeVideo.php index b147b31..18c8197 100644 --- a/app/NativeComponents/YouTubeVideo.php +++ b/app/NativeComponents/YouTubeVideo.php @@ -3,6 +3,7 @@ namespace App\NativeComponents; use App\NativeComponents\Concerns\HasYouTubeData; +use Illuminate\View\View; use Native\Mobile\Edge\NativeComponent; use Native\Mobile\Edge\Transition; @@ -10,10 +11,8 @@ class YouTubeVideo extends NativeComponent { use HasYouTubeData; - /** @var array */ public array $video = []; - /** @var array */ public array $channel = []; /** @var array */ @@ -27,8 +26,12 @@ class YouTubeVideo extends NativeComponent public bool $showDescription = false; + public bool $showComments = false; + public function mount(): void { + nativephp_call('UI.SetBackground', json_encode(['color' => '#0F0F0F'])); + $id = (int) $this->param('id'); $videos = self::ytVideos(); $channels = self::ytChannels(); @@ -39,6 +42,16 @@ public function mount(): void $this->comments = $allComments[$id] ?? $allComments[0] ?? []; } + public function unmount(): void + { + // UI.SetBackground is app-global sticky native state — without + // this clear it leaks the window color into every screen visited + // after this one. Empty color = restore the platform default. + nativephp_call('UI.SetBackground', json_encode(['color' => null])); + + parent::unmount(); + } + public function toggleLike(): void { $this->isLiked = ! $this->isLiked; @@ -65,6 +78,11 @@ public function toggleDescription(): void $this->showDescription = ! $this->showDescription; } + public function toggleComments(): void + { + $this->showComments = ! $this->showComments; + } + public function viewChannel(int $id): void { $this->navigate($this->route('youtube.channel', $id)) @@ -76,7 +94,7 @@ public function viewVideo(int $index): void $this->replace($this->route('youtube.video', $index)); } - public function render(): \Illuminate\View\View + public function render(): View { $videos = self::ytVideos(); $channels = self::ytChannels(); diff --git a/app/Providers/NativeServiceProvider.php b/app/Providers/NativeServiceProvider.php index 06d329f..54b6e16 100644 --- a/app/Providers/NativeServiceProvider.php +++ b/app/Providers/NativeServiceProvider.php @@ -4,11 +4,8 @@ use Illuminate\Support\ServiceProvider; use Native\Mobile\Providers\CameraServiceProvider; -use Native\Mobile\Providers\DeviceServiceProvider; -use Native\Mobile\Providers\DialogServiceProvider; -use Native\Mobile\Providers\GeolocationServiceProvider; -use Native\Mobile\Providers\SecureStorageServiceProvider; -use Nativephp\NativeUi\NativeUIServiceProvider; +use Native\Mobile\UI\NativeUIServiceProvider; +use S2BR\MobileSplashscreen\MobileSplashscreenServiceProvider; class NativeServiceProvider extends ServiceProvider { @@ -40,7 +37,10 @@ public function boot(): void public function plugins(): array { return [ - NativeUIServiceProvider::class + NativeUIServiceProvider::class, + MobileSplashscreenServiceProvider::class, + CameraServiceProvider::class, + ]; } } diff --git a/bootstrap/app.php b/bootstrap/app.php index c183276..0e1cfcc 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -6,7 +6,7 @@ return Application::configure(basePath: dirname(__DIR__)) ->withRouting( - web: __DIR__.'/../routes/web.php', + web: __DIR__.'/../routes/mobile.php', commands: __DIR__.'/../routes/console.php', health: '/up', ) diff --git a/composer.json b/composer.json index 50e311f..1894c5c 100644 --- a/composer.json +++ b/composer.json @@ -7,29 +7,13 @@ "laravel", "framework" ], - "repositories": { - - "mobile": { - "type": "vcs", - "url": "https://github.com/nativephp/mobile-air" - }, - "ui": { - "type": "vcs", - "url": "https://github.com/nativephp/native-ui" - }, - "plugins": { - "type": "composer", - "url": "https://plugins.nativephp.com" - } - }, "license": "MIT", "require": { "php": "^8.4", "laravel/framework": "^13.0", "laravel/tinker": "^3.0", - "nativephp/mobile": "dev-element", - "nativephp/mobile-camera": "*", - "nativephp/native-ui": "*" + "nativephp/mobile": "dev-main as 4.9.9", + "nativephp/mobile-ui": "^0.3.0" }, "require-dev": { "fakerphp/faker": "^1.23", @@ -39,8 +23,8 @@ "laravel/sail": "^1.41", "mockery/mockery": "^1.6", "nunomaduro/collision": "^8.6", - "pestphp/pest": "^4.4", - "pestphp/pest-plugin-laravel": "^4.1" + "pestphp/pest": "^5.0", + "pestphp/pest-plugin-laravel": "^5.0" }, "autoload": { "psr-4": { @@ -112,6 +96,12 @@ "php-http/discovery": true } }, + "repositories": [ + { + "type": "vcs", + "url": "https://github.com/NativePHP/mobile-air" + } + ], "minimum-stability": "dev", "prefer-stable": true } diff --git a/composer.lock b/composer.lock index 34bf683..a3c6280 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e7b0dda36b28548b4a4d12ba69d4a897", + "content-hash": "1928a8c84cbfa8cad20150dfab7fe730", "packages": [ { "name": "bacon/bacon-qr-code", @@ -866,22 +866,22 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.14.0", + "version": "7.15.2", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "aef242412e13128b5049864867bb49fc37dd39de" + "reference": "744101956d78b7c1384d0cbf379db13e859167bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/aef242412e13128b5049864867bb49fc37dd39de", - "reference": "aef242412e13128b5049864867bb49fc37dd39de", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/744101956d78b7c1384d0cbf379db13e859167bf", + "reference": "744101956d78b7c1384d0cbf379db13e859167bf", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/promises": "^2.5.1", - "guzzlehttp/psr7": "^2.12.4", + "guzzlehttp/psr7": "^2.13", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.5 || ^3.0", @@ -894,7 +894,7 @@ "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", "guzzle/client-integration-tests": "3.0.3", - "guzzlehttp/test-server": "^0.6", + "guzzlehttp/test-server": "^0.7", "php-http/message-factory": "^1.1", "phpunit/phpunit": "^8.5.52 || ^9.6.34", "psr/log": "^1.1 || ^2.0 || ^3.0" @@ -974,7 +974,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.14.0" + "source": "https://github.com/guzzle/guzzle/tree/7.15.2" }, "funding": [ { @@ -990,7 +990,7 @@ "type": "tidelift" } ], - "time": "2026-07-08T22:54:09+00:00" + "time": "2026-07-26T23:23:20+00:00" }, { "name": "guzzlehttp/promises", @@ -1078,16 +1078,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.12.4", + "version": "2.13.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "51e27f9e2b332ab3e72f4520d5ff4f3c68c3577c" + "reference": "dad89620b7a6edb60c15858442eb2e408b45d8f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/51e27f9e2b332ab3e72f4520d5ff4f3c68c3577c", - "reference": "51e27f9e2b332ab3e72f4520d5ff4f3c68c3577c", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/dad89620b7a6edb60c15858442eb2e408b45d8f4", + "reference": "dad89620b7a6edb60c15858442eb2e408b45d8f4", "shasum": "" }, "require": { @@ -1177,7 +1177,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.12.4" + "source": "https://github.com/guzzle/psr7/tree/2.13.0" }, "funding": [ { @@ -1193,20 +1193,20 @@ "type": "tidelift" } ], - "time": "2026-07-08T15:56:20+00:00" + "time": "2026-07-16T22:23:49+00:00" }, { "name": "guzzlehttp/uri-template", - "version": "v1.0.9", + "version": "v1.0.10", "source": { "type": "git", "url": "https://github.com/guzzle/uri-template.git", - "reference": "d7580af6d3f8384325d9cd3e99b21c3ed1848176" + "reference": "f6c24c21f42b990e9a58912b332d0874df6ba839" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/uri-template/zipball/d7580af6d3f8384325d9cd3e99b21c3ed1848176", - "reference": "d7580af6d3f8384325d9cd3e99b21c3ed1848176", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/f6c24c21f42b990e9a58912b332d0874df6ba839", + "reference": "f6c24c21f42b990e9a58912b332d0874df6ba839", "shasum": "" }, "require": { @@ -1263,7 +1263,7 @@ ], "support": { "issues": "https://github.com/guzzle/uri-template/issues", - "source": "https://github.com/guzzle/uri-template/tree/v1.0.9" + "source": "https://github.com/guzzle/uri-template/tree/v1.0.10" }, "funding": [ { @@ -1279,20 +1279,20 @@ "type": "tidelift" } ], - "time": "2026-07-08T16:19:22+00:00" + "time": "2026-07-17T13:53:03+00:00" }, { "name": "laravel/framework", - "version": "v13.19.0", + "version": "v13.23.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "514502b38e11bd676ecf83b271c9452cc7500f16" + "reference": "92a707229148e57f08a249211c8a5a194159c619" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/514502b38e11bd676ecf83b271c9452cc7500f16", - "reference": "514502b38e11bd676ecf83b271c9452cc7500f16", + "url": "https://api.github.com/repos/laravel/framework/zipball/92a707229148e57f08a249211c8a5a194159c619", + "reference": "92a707229148e57f08a249211c8a5a194159c619", "shasum": "" }, "require": { @@ -1318,7 +1318,7 @@ "league/flysystem": "^3.25.1", "league/flysystem-local": "^3.25.1", "league/uri": "^7.5.1", - "monolog/monolog": "^3.0", + "monolog/monolog": "^3.10", "nesbot/carbon": "^3.8.4", "nunomaduro/termwind": "^2.0", "php": "^8.3", @@ -1371,6 +1371,7 @@ "illuminate/filesystem": "self.version", "illuminate/hashing": "self.version", "illuminate/http": "self.version", + "illuminate/image": "self.version", "illuminate/json-schema": "self.version", "illuminate/log": "self.version", "illuminate/macroable": "self.version", @@ -1397,6 +1398,7 @@ "ext-gmp": "*", "fakerphp/faker": "^1.24", "guzzlehttp/psr7": "^2.9", + "intervention/image": "^4.0", "laravel/pint": "^1.18", "league/flysystem-aws-s3-v3": "^3.25.1", "league/flysystem-ftp": "^3.25.1", @@ -1433,6 +1435,7 @@ "ext-redis": "Required to use the Redis cache and queue drivers (^4.0 || ^5.0 || ^6.0).", "fakerphp/faker": "Required to generate fake data using the fake() helper (^1.23).", "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "intervention/image": "Required to use the image processing features (^4.0).", "laravel/tinker": "Required to use the tinker console command (^2.0).", "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).", "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).", @@ -1503,7 +1506,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2026-07-07T14:13:33+00:00" + "time": "2026-07-27T14:48:58+00:00" }, { "name": "laravel/prompts", @@ -1566,16 +1569,16 @@ }, { "name": "laravel/serializable-closure", - "version": "v2.0.13", + "version": "v2.0.15", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "b566ee0dd251f3c4078bed003a7ce015f5ea6dce" + "reference": "dccd8bcb851bb03fcc005df650b708b57cc52661" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/b566ee0dd251f3c4078bed003a7ce015f5ea6dce", - "reference": "b566ee0dd251f3c4078bed003a7ce015f5ea6dce", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/dccd8bcb851bb03fcc005df650b708b57cc52661", + "reference": "dccd8bcb851bb03fcc005df650b708b57cc52661", "shasum": "" }, "require": { @@ -1623,7 +1626,7 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2026-04-16T14:03:50+00:00" + "time": "2026-07-21T16:49:22+00:00" }, { "name": "laravel/tinker", @@ -1696,16 +1699,16 @@ }, { "name": "league/commonmark", - "version": "2.8.2", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "59fb075d2101740c337c7216e3f32b36c204218b" + "reference": "5703d83ba3da3b2e356a5fedc848ed6d8ffb6529" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/59fb075d2101740c337c7216e3f32b36c204218b", - "reference": "59fb075d2101740c337c7216e3f32b36c204218b", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/5703d83ba3da3b2e356a5fedc848ed6d8ffb6529", + "reference": "5703d83ba3da3b2e356a5fedc848ed6d8ffb6529", "shasum": "" }, "require": { @@ -1727,8 +1730,8 @@ "github/gfm": "0.29.0", "michelf/php-markdown": "^1.4 || ^2.0", "nyholm/psr7": "^1.5", - "phpstan/phpstan": "^1.8.2", - "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", + "phpstan/phpstan": "^2.0.0", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0 || ^12.0.0 || ^13.0.0", "scrutinizer/ocular": "^1.8.1", "symfony/finder": "^5.3 | ^6.0 | ^7.0 || ^8.0", "symfony/process": "^5.4 | ^6.0 | ^7.0 || ^8.0", @@ -1742,7 +1745,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.9-dev" + "dev-main": "2.10-dev" } }, "autoload": { @@ -1799,7 +1802,7 @@ "type": "tidelift" } ], - "time": "2026-03-19T13:16:38+00:00" + "time": "2026-08-03T13:42:31+00:00" }, { "name": "league/config", @@ -2358,16 +2361,16 @@ }, { "name": "nativephp/mobile", - "version": "dev-element", + "version": "dev-main", "source": { "type": "git", "url": "https://github.com/NativePHP/mobile-air.git", - "reference": "b9e8d2fb271ff35add8a8066414191da914ba885" + "reference": "0bea0469f276e8ca01245fa762379af4efee2736" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/NativePHP/mobile-air/zipball/b9e8d2fb271ff35add8a8066414191da914ba885", - "reference": "b9e8d2fb271ff35add8a8066414191da914ba885", + "url": "https://api.github.com/repos/NativePHP/mobile-air/zipball/0bea0469f276e8ca01245fa762379af4efee2736", + "reference": "0bea0469f276e8ca01245fa762379af4efee2736", "shasum": "" }, "require": { @@ -2402,6 +2405,10 @@ "phpstan/phpstan-phpunit": "^1.0", "spatie/laravel-ray": "^1.26" }, + "suggest": { + "ext-zip": "Required by native:install to validate and extract the downloaded Android PHP binary archives" + }, + "default-branch": true, "type": "library", "extra": { "laravel": { @@ -2469,34 +2476,38 @@ "nativephp" ], "support": { - "source": "https://github.com/NativePHP/mobile-air/tree/element", + "source": "https://github.com/NativePHP/mobile-air/tree/main", "issues": "https://github.com/NativePHP/mobile-air/issues" }, - "time": "2026-07-12T01:48:26+00:00" + "time": "2026-08-03T14:24:26+00:00" }, { - "name": "nativephp/mobile-camera", - "version": "1.0.3", + "name": "nativephp/mobile-ui", + "version": "0.3.0", "source": { "type": "git", - "url": "https://github.com/NativePHP/mobile-camera.git", - "reference": "b01139ea47029b6eae695d1a16c41e00f265fd54" + "url": "https://github.com/NativePHP/mobile-ui.git", + "reference": "548b431ad5c7989c7da766aceb1a1bc02948606f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/NativePHP/mobile-camera/zipball/b01139ea47029b6eae695d1a16c41e00f265fd54", - "reference": "b01139ea47029b6eae695d1a16c41e00f265fd54", + "url": "https://api.github.com/repos/NativePHP/mobile-ui/zipball/548b431ad5c7989c7da766aceb1a1bc02948606f", + "reference": "548b431ad5c7989c7da766aceb1a1bc02948606f", "shasum": "" }, "require": { - "nativephp/mobile": "*", + "nativephp/mobile": "^4.0", "php": "^8.2" }, + "require-dev": { + "orchestra/testbench": "^10.0", + "pestphp/pest": "^3.0" + }, "type": "nativephp-plugin", "extra": { "laravel": { "providers": [ - "Native\\Mobile\\Providers\\CameraServiceProvider" + "Native\\Mobile\\UI\\NativeUIServiceProvider" ] }, "nativephp": { @@ -2505,7 +2516,7 @@ }, "autoload": { "psr-4": { - "Native\\Mobile\\Providers\\": "src/" + "Native\\Mobile\\UI\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2515,74 +2526,21 @@ "authors": [ { "name": "NativePHP", - "email": "info@nativephp.com" + "email": "support@nativephp.com" } ], - "description": "Camera plugin for NativePHP Mobile (Photo capture, Video recording, Gallery picker)", + "description": "Native SwiftUI and Jetpack Composer components for NativePHP", "support": { - "issues": "https://github.com/NativePHP/mobile-camera/issues", - "source": "https://github.com/NativePHP/mobile-camera/tree/1.0.3" - }, - "time": "2026-06-04T12:43:58+00:00" - }, - { - "name": "nativephp/native-ui", - "version": "dev-main", - "source": { - "type": "git", - "url": "https://github.com/NativePHP/native-ui.git", - "reference": "42bcf7a9e311fb0ac02ba8809d2846a485a5f51f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/NativePHP/native-ui/zipball/42bcf7a9e311fb0ac02ba8809d2846a485a5f51f", - "reference": "42bcf7a9e311fb0ac02ba8809d2846a485a5f51f", - "shasum": "" - }, - "require": { - "nativephp/mobile": "*", - "php": "^8.2" - }, - "require-dev": { - "pestphp/pest": "^3.0" - }, - "default-branch": true, - "type": "nativephp-ui-plugin", - "extra": { - "laravel": { - "providers": [ - "Nativephp\\NativeUi\\NativeUIServiceProvider" - ] - }, - "nativephp": { - "manifest": "nativephp.json" - } + "issues": "https://github.com/NativePHP/mobile-ui/issues", + "source": "https://github.com/NativePHP/mobile-ui/tree/0.3.0" }, - "autoload": { - "psr-4": { - "Nativephp\\NativeUi\\": "src/" - } - }, - "scripts": { - "test": [ - "pest" - ] - }, - "license": [ - "MIT" - ], - "authors": [ + "funding": [ { - "name": "Your Name", - "email": "you@example.com" + "url": "https://nativephp.com/sponsor", + "type": "other" } ], - "description": "A NativePHP Mobile plugin", - "support": { - "source": "https://github.com/NativePHP/native-ui/tree/main", - "issues": "https://github.com/NativePHP/native-ui/issues" - }, - "time": "2026-07-12T02:06:40+00:00" + "time": "2026-07-27T01:37:02+00:00" }, { "name": "nesbot/carbon", @@ -2758,16 +2716,16 @@ }, { "name": "nette/utils", - "version": "v4.1.4", + "version": "v4.1.5", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "7da6c396d7ebe142bc857c20479d5e70a5e1aac7" + "reference": "b043439dbdf954e6c28b5ea7e34b0100f83165e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/7da6c396d7ebe142bc857c20479d5e70a5e1aac7", - "reference": "7da6c396d7ebe142bc857c20479d5e70a5e1aac7", + "url": "https://api.github.com/repos/nette/utils/zipball/b043439dbdf954e6c28b5ea7e34b0100f83165e0", + "reference": "b043439dbdf954e6c28b5ea7e34b0100f83165e0", "shasum": "" }, "require": { @@ -2787,7 +2745,7 @@ }, "suggest": { "ext-gd": "to use Image", - "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-iconv": "to use Strings::chr(), ord() and reverse()", "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", "ext-json": "to use Nette\\Utils\\Json", "ext-mbstring": "to use Strings::lower() etc...", @@ -2843,9 +2801,9 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.1.4" + "source": "https://github.com/nette/utils/tree/v4.1.5" }, - "time": "2026-05-11T20:49:54+00:00" + "time": "2026-07-17T23:02:45+00:00" }, { "name": "nikic/php-parser", @@ -4269,16 +4227,16 @@ }, { "name": "symfony/console", - "version": "v8.1.1", + "version": "v8.1.2", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "b711a8ab808b6c074c6b8caef70d0fd8d6b6d07d" + "reference": "535e18a1b8925f6c01a55b171d157ab66c2ace15" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/b711a8ab808b6c074c6b8caef70d0fd8d6b6d07d", - "reference": "b711a8ab808b6c074c6b8caef70d0fd8d6b6d07d", + "url": "https://api.github.com/repos/symfony/console/zipball/535e18a1b8925f6c01a55b171d157ab66c2ace15", + "reference": "535e18a1b8925f6c01a55b171d157ab66c2ace15", "shasum": "" }, "require": { @@ -4345,7 +4303,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v8.1.1" + "source": "https://github.com/symfony/console/tree/v8.1.2" }, "funding": [ { @@ -4365,7 +4323,7 @@ "type": "tidelift" } ], - "time": "2026-06-16T12:55:20+00:00" + "time": "2026-07-27T13:58:19+00:00" }, { "name": "symfony/css-selector", @@ -4509,16 +4467,16 @@ }, { "name": "symfony/error-handler", - "version": "v8.1.0", + "version": "v8.1.2", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "d8aeb1abd3fef84795567850d3a567bdb5945ee5" + "reference": "dc98404be5e8c949815e23fee1928f5de4f3f5d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/d8aeb1abd3fef84795567850d3a567bdb5945ee5", - "reference": "d8aeb1abd3fef84795567850d3a567bdb5945ee5", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/dc98404be5e8c949815e23fee1928f5de4f3f5d3", + "reference": "dc98404be5e8c949815e23fee1928f5de4f3f5d3", "shasum": "" }, "require": { @@ -4566,7 +4524,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v8.1.0" + "source": "https://github.com/symfony/error-handler/tree/v8.1.2" }, "funding": [ { @@ -4586,20 +4544,20 @@ "type": "tidelift" } ], - "time": "2026-05-29T05:06:50+00:00" + "time": "2026-07-22T15:42:13+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v8.1.1", + "version": "v8.1.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "abd6c11dc468725d1627302ad10f6cd486e9e3d0" + "reference": "c14c05a9e6da7f5e375e6efc28952c7e7dbddffb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/abd6c11dc468725d1627302ad10f6cd486e9e3d0", - "reference": "abd6c11dc468725d1627302ad10f6cd486e9e3d0", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/c14c05a9e6da7f5e375e6efc28952c7e7dbddffb", + "reference": "c14c05a9e6da7f5e375e6efc28952c7e7dbddffb", "shasum": "" }, "require": { @@ -4652,7 +4610,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v8.1.1" + "source": "https://github.com/symfony/event-dispatcher/tree/v8.1.2" }, "funding": [ { @@ -4672,7 +4630,7 @@ "type": "tidelift" } ], - "time": "2026-06-09T12:28:30+00:00" + "time": "2026-07-22T15:42:13+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -4824,16 +4782,16 @@ }, { "name": "symfony/http-foundation", - "version": "v8.1.1", + "version": "v8.1.2", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "6a168c8fcee806b57ac020244da14293d1f9a883" + "reference": "9943adbf5a64e2951a8d9eb0485310d55624f0e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6a168c8fcee806b57ac020244da14293d1f9a883", - "reference": "6a168c8fcee806b57ac020244da14293d1f9a883", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9943adbf5a64e2951a8d9eb0485310d55624f0e8", + "reference": "9943adbf5a64e2951a8d9eb0485310d55624f0e8", "shasum": "" }, "require": { @@ -4881,7 +4839,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v8.1.1" + "source": "https://github.com/symfony/http-foundation/tree/v8.1.2" }, "funding": [ { @@ -4901,20 +4859,20 @@ "type": "tidelift" } ], - "time": "2026-06-12T08:43:41+00:00" + "time": "2026-07-29T07:22:54+00:00" }, { "name": "symfony/http-kernel", - "version": "v8.1.1", + "version": "v8.1.2", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "89d8d6e7fbab3d9eda89ccb5ecdf44a74c4ec9d2" + "reference": "c7bb08dc26a7a7da68fb7ac1ce9de925e6464dbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/89d8d6e7fbab3d9eda89ccb5ecdf44a74c4ec9d2", - "reference": "89d8d6e7fbab3d9eda89ccb5ecdf44a74c4ec9d2", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/c7bb08dc26a7a7da68fb7ac1ce9de925e6464dbc", + "reference": "c7bb08dc26a7a7da68fb7ac1ce9de925e6464dbc", "shasum": "" }, "require": { @@ -4930,6 +4888,7 @@ "symfony/dependency-injection": "<8.1", "symfony/flex": "<2.10", "symfony/http-client-contracts": "<2.5", + "symfony/serializer": "<7.4.15|>=8.0,<8.0.15|>=8.1,<8.1.2", "symfony/translation-contracts": "<2.5", "symfony/var-dumper": "<8.1", "symfony/web-profiler-bundle": "<8.1", @@ -4962,7 +4921,7 @@ "symfony/validator": "^7.4|^8.0", "symfony/var-dumper": "^8.1", "symfony/var-exporter": "^7.4|^8.0", - "twig/twig": "^3.21" + "twig/twig": "^3.21|^4.0" }, "type": "library", "autoload": { @@ -4990,7 +4949,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v8.1.1" + "source": "https://github.com/symfony/http-kernel/tree/v8.1.2" }, "funding": [ { @@ -5010,20 +4969,20 @@ "type": "tidelift" } ], - "time": "2026-06-27T09:27:36+00:00" + "time": "2026-07-29T11:54:54+00:00" }, { "name": "symfony/mailer", - "version": "v8.1.1", + "version": "v8.1.2", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "4fa583a7377f28d54e4de442fba76375b2e20a12" + "reference": "221c7f326ace1ac2baee8331d829d5b7f04f4d53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/4fa583a7377f28d54e4de442fba76375b2e20a12", - "reference": "4fa583a7377f28d54e4de442fba76375b2e20a12", + "url": "https://api.github.com/repos/symfony/mailer/zipball/221c7f326ace1ac2baee8331d829d5b7f04f4d53", + "reference": "221c7f326ace1ac2baee8331d829d5b7f04f4d53", "shasum": "" }, "require": { @@ -5070,7 +5029,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v8.1.1" + "source": "https://github.com/symfony/mailer/tree/v8.1.2" }, "funding": [ { @@ -5090,20 +5049,20 @@ "type": "tidelift" } ], - "time": "2026-06-16T12:55:20+00:00" + "time": "2026-07-28T07:35:25+00:00" }, { "name": "symfony/mime", - "version": "v8.1.0", + "version": "v8.1.2", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "b164ae7e3f7915aacfe9ee155f2f358502440664" + "reference": "75f4779d4ec2e13f24a3a7e5d0347c340c7ca627" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/b164ae7e3f7915aacfe9ee155f2f358502440664", - "reference": "b164ae7e3f7915aacfe9ee155f2f358502440664", + "url": "https://api.github.com/repos/symfony/mime/zipball/75f4779d4ec2e13f24a3a7e5d0347c340c7ca627", + "reference": "75f4779d4ec2e13f24a3a7e5d0347c340c7ca627", "shasum": "" }, "require": { @@ -5156,7 +5115,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v8.1.0" + "source": "https://github.com/symfony/mime/tree/v8.1.2" }, "funding": [ { @@ -5176,7 +5135,7 @@ "type": "tidelift" } ], - "time": "2026-05-29T05:06:50+00:00" + "time": "2026-07-29T08:00:47+00:00" }, { "name": "symfony/polyfill-ctype", @@ -5263,16 +5222,16 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.38.1", + "version": "v1.41.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "e9247d281d694a5120554d9afaf54e070e88a603" + "reference": "bb899c1db0aa8127dc3afe8cda4a67eb24915f8d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/e9247d281d694a5120554d9afaf54e070e88a603", - "reference": "e9247d281d694a5120554d9afaf54e070e88a603", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/bb899c1db0aa8127dc3afe8cda4a67eb24915f8d", + "reference": "bb899c1db0aa8127dc3afe8cda4a67eb24915f8d", "shasum": "" }, "require": { @@ -5321,7 +5280,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.38.1" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.41.0" }, "funding": [ { @@ -5341,7 +5300,7 @@ "type": "tidelift" } ], - "time": "2026-05-26T05:58:03+00:00" + "time": "2026-07-28T08:25:59+00:00" }, { "name": "symfony/polyfill-intl-idn", @@ -5766,16 +5725,16 @@ }, { "name": "symfony/polyfill-php85", - "version": "v1.38.1", + "version": "v1.41.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php85.git", - "reference": "ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1" + "reference": "255fab485aaa1006ed411040c42aecd7b5302d7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1", - "reference": "ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/255fab485aaa1006ed411040c42aecd7b5302d7a", + "reference": "255fab485aaa1006ed411040c42aecd7b5302d7a", "shasum": "" }, "require": { @@ -5822,7 +5781,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php85/tree/v1.38.1" + "source": "https://github.com/symfony/polyfill-php85/tree/v1.41.0" }, "funding": [ { @@ -5842,20 +5801,20 @@ "type": "tidelift" } ], - "time": "2026-05-26T02:25:22+00:00" + "time": "2026-07-01T12:47:55+00:00" }, { "name": "symfony/polyfill-php86", - "version": "v1.38.0", + "version": "v1.41.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php86.git", - "reference": "fcec68d64f46dc84e1f6ffcf2c6dda40ff3143ad" + "reference": "6bc356ed3d8dbfeea8f0de235e34d670704e880e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php86/zipball/fcec68d64f46dc84e1f6ffcf2c6dda40ff3143ad", - "reference": "fcec68d64f46dc84e1f6ffcf2c6dda40ff3143ad", + "url": "https://api.github.com/repos/symfony/polyfill-php86/zipball/6bc356ed3d8dbfeea8f0de235e34d670704e880e", + "reference": "6bc356ed3d8dbfeea8f0de235e34d670704e880e", "shasum": "" }, "require": { @@ -5902,7 +5861,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php86/tree/v1.38.0" + "source": "https://github.com/symfony/polyfill-php86/tree/v1.41.0" }, "funding": [ { @@ -5922,7 +5881,7 @@ "type": "tidelift" } ], - "time": "2026-05-25T11:52:35+00:00" + "time": "2026-07-02T13:42:24+00:00" }, { "name": "symfony/polyfill-uuid", @@ -6074,16 +6033,16 @@ }, { "name": "symfony/routing", - "version": "v8.1.0", + "version": "v8.1.2", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "fe0bfec72c8a806109fb9c3a5f2b898fe0c76eb3" + "reference": "1058d4e13bb81dd9a6f7565686df7e13b880cdbd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/fe0bfec72c8a806109fb9c3a5f2b898fe0c76eb3", - "reference": "fe0bfec72c8a806109fb9c3a5f2b898fe0c76eb3", + "url": "https://api.github.com/repos/symfony/routing/zipball/1058d4e13bb81dd9a6f7565686df7e13b880cdbd", + "reference": "1058d4e13bb81dd9a6f7565686df7e13b880cdbd", "shasum": "" }, "require": { @@ -6130,7 +6089,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v8.1.0" + "source": "https://github.com/symfony/routing/tree/v8.1.2" }, "funding": [ { @@ -6150,7 +6109,7 @@ "type": "tidelift" } ], - "time": "2026-05-29T05:06:50+00:00" + "time": "2026-07-22T15:42:13+00:00" }, { "name": "symfony/service-contracts", @@ -6241,16 +6200,16 @@ }, { "name": "symfony/string", - "version": "v8.1.0", + "version": "v8.1.2", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "afd5944f4005862d961efb85c8bbd5c523c4e3c9" + "reference": "286a76b7255e5cc4bf0101a0bc5388ecf1c38ccc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/afd5944f4005862d961efb85c8bbd5c523c4e3c9", - "reference": "afd5944f4005862d961efb85c8bbd5c523c4e3c9", + "url": "https://api.github.com/repos/symfony/string/zipball/286a76b7255e5cc4bf0101a0bc5388ecf1c38ccc", + "reference": "286a76b7255e5cc4bf0101a0bc5388ecf1c38ccc", "shasum": "" }, "require": { @@ -6307,7 +6266,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v8.1.0" + "source": "https://github.com/symfony/string/tree/v8.1.2" }, "funding": [ { @@ -6327,7 +6286,7 @@ "type": "tidelift" } ], - "time": "2026-05-29T05:06:50+00:00" + "time": "2026-07-28T07:35:25+00:00" }, { "name": "symfony/translation", @@ -6584,16 +6543,16 @@ }, { "name": "symfony/var-dumper", - "version": "v8.1.1", + "version": "v8.1.2", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "40096a2515a979f3125c5c928603995b8664c62a" + "reference": "865103cf742a039f34645b971fc3ace308d6c167" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/40096a2515a979f3125c5c928603995b8664c62a", - "reference": "40096a2515a979f3125c5c928603995b8664c62a", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/865103cf742a039f34645b971fc3ace308d6c167", + "reference": "865103cf742a039f34645b971fc3ace308d6c167", "shasum": "" }, "require": { @@ -6609,7 +6568,7 @@ "symfony/http-kernel": "^7.4|^8.0", "symfony/process": "^7.4|^8.0", "symfony/uid": "^7.4|^8.0", - "twig/twig": "^3.12" + "twig/twig": "^3.12|^4.0" }, "bin": [ "Resources/bin/var-dump-server" @@ -6647,7 +6606,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v8.1.1" + "source": "https://github.com/symfony/var-dumper/tree/v8.1.2" }, "funding": [ { @@ -6667,7 +6626,7 @@ "type": "tidelift" } ], - "time": "2026-06-09T10:54:51+00:00" + "time": "2026-07-22T15:42:13+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -6949,16 +6908,16 @@ "packages-dev": [ { "name": "brianium/paratest", - "version": "v7.20.0", + "version": "v7.23.1", "source": { "type": "git", "url": "https://github.com/paratestphp/paratest.git", - "reference": "81c80677c9ec0ed4ef16b246167f11dec81a6e3d" + "reference": "6b2aaf7d0e8d5220710d78921f28e5464a816596" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paratestphp/paratest/zipball/81c80677c9ec0ed4ef16b246167f11dec81a6e3d", - "reference": "81c80677c9ec0ed4ef16b246167f11dec81a6e3d", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/6b2aaf7d0e8d5220710d78921f28e5464a816596", + "reference": "6b2aaf7d0e8d5220710d78921f28e5464a816596", "shasum": "" }, "require": { @@ -6968,25 +6927,25 @@ "ext-simplexml": "*", "fidry/cpu-core-counter": "^1.3.0", "jean85/pretty-package-versions": "^2.1.1", - "php": "~8.3.0 || ~8.4.0 || ~8.5.0", - "phpunit/php-code-coverage": "^12.5.3 || ^13.0.1", - "phpunit/php-file-iterator": "^6.0.1 || ^7", - "phpunit/php-timer": "^8 || ^9", - "phpunit/phpunit": "^12.5.14 || ^13.0.5", - "sebastian/environment": "^8.0.3 || ^9", - "symfony/console": "^7.4.7 || ^8.0.7", - "symfony/process": "^7.4.5 || ^8.0.5" + "php": "~8.4.0 || ~8.5.0", + "phpunit/php-code-coverage": "^14.2.3", + "phpunit/php-file-iterator": "^7", + "phpunit/php-timer": "^9", + "phpunit/phpunit": "^13.2.5", + "sebastian/environment": "^9.3.2", + "symfony/console": "^7.4.8 || ^8.1.1", + "symfony/process": "^7.4.8 || ^8.1.0" }, "require-dev": { "doctrine/coding-standard": "^14.0.0", "ext-pcntl": "*", "ext-pcov": "*", "ext-posix": "*", - "phpstan/phpstan": "^2.1.44", - "phpstan/phpstan-deprecation-rules": "^2.0.4", - "phpstan/phpstan-phpunit": "^2.0.16", - "phpstan/phpstan-strict-rules": "^2.0.10", - "symfony/filesystem": "^7.4.6 || ^8.0.6" + "phpstan/phpstan": "^2.2.6", + "phpstan/phpstan-deprecation-rules": "^2.0.5", + "phpstan/phpstan-phpunit": "^2.0.18", + "phpstan/phpstan-strict-rules": "^2.0.12", + "symfony/filesystem": "^7.4.8 || ^8.1.0" }, "bin": [ "bin/paratest", @@ -7026,7 +6985,7 @@ ], "support": { "issues": "https://github.com/paratestphp/paratest/issues", - "source": "https://github.com/paratestphp/paratest/tree/v7.20.0" + "source": "https://github.com/paratestphp/paratest/tree/v7.23.1" }, "funding": [ { @@ -7038,149 +6997,7 @@ "type": "paypal" } ], - "time": "2026-03-29T15:46:14+00:00" - }, - { - "name": "composer/pcre", - "version": "3.4.0", - "source": { - "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "d5a341b3fb61f3001970940afb1d332968a183ed" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/d5a341b3fb61f3001970940afb1d332968a183ed", - "reference": "d5a341b3fb61f3001970940afb1d332968a183ed", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0" - }, - "conflict": { - "phpstan/phpstan": "<2.2.2" - }, - "require-dev": { - "phpstan/phpstan": "^2", - "phpstan/phpstan-deprecation-rules": "^2", - "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "^9" - }, - "type": "library", - "extra": { - "phpstan": { - "includes": [ - "extension.neon" - ] - }, - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Pcre\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", - "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" - ], - "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.4.0" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - } - ], - "time": "2026-06-07T11:47:49+00:00" - }, - { - "name": "composer/xdebug-handler", - "version": "3.0.5", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", - "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", - "shasum": "" - }, - "require": { - "composer/pcre": "^1 || ^2 || ^3", - "php": "^7.2.5 || ^8.0", - "psr/log": "^1 || ^2 || ^3" - }, - "require-dev": { - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-strict-rules": "^1.1", - "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "description": "Restarts a process without Xdebug.", - "keywords": [ - "Xdebug", - "performance" - ], - "support": { - "irc": "ircs://irc.libera.chat:6697/composer", - "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2024-05-06T16:37:16+00:00" + "time": "2026-07-28T13:47:02+00:00" }, { "name": "doctrine/deprecations", @@ -7538,16 +7355,16 @@ }, { "name": "laravel/boost", - "version": "v2.4.12", + "version": "v2.4.13", "source": { "type": "git", "url": "https://github.com/laravel/boost.git", - "reference": "d43bdf901fee8d216145cb062c9847c892844908" + "reference": "f55e08f5afa89ac72f23f574175005b67878f466" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/boost/zipball/d43bdf901fee8d216145cb062c9847c892844908", - "reference": "d43bdf901fee8d216145cb062c9847c892844908", + "url": "https://api.github.com/repos/laravel/boost/zipball/f55e08f5afa89ac72f23f574175005b67878f466", + "reference": "f55e08f5afa89ac72f23f574175005b67878f466", "shasum": "" }, "require": { @@ -7556,7 +7373,7 @@ "illuminate/contracts": "^11.45.3|^12.41.1|^13.0", "illuminate/routing": "^11.45.3|^12.41.1|^13.0", "illuminate/support": "^11.45.3|^12.41.1|^13.0", - "laravel/mcp": "^0.7.1|^0.8.0", + "laravel/mcp": "^0.7.1|^0.8.0|^0.9.0", "laravel/prompts": "^0.3.10", "laravel/roster": "^0.5.0", "php": "^8.2" @@ -7600,20 +7417,20 @@ "issues": "https://github.com/laravel/boost/issues", "source": "https://github.com/laravel/boost" }, - "time": "2026-07-08T09:53:34+00:00" + "time": "2026-07-17T14:28:57+00:00" }, { "name": "laravel/mcp", - "version": "v0.8.2", + "version": "v0.9.1", "source": { "type": "git", "url": "https://github.com/laravel/mcp.git", - "reference": "0c32bf369c6432cab21458f9f4479da33a49ba37" + "reference": "a08884d79a95c5143498507aec5badf751cdbec4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/mcp/zipball/0c32bf369c6432cab21458f9f4479da33a49ba37", - "reference": "0c32bf369c6432cab21458f9f4479da33a49ba37", + "url": "https://api.github.com/repos/laravel/mcp/zipball/a08884d79a95c5143498507aec5badf751cdbec4", + "reference": "a08884d79a95c5143498507aec5badf751cdbec4", "shasum": "" }, "require": { @@ -7674,7 +7491,7 @@ "issues": "https://github.com/laravel/mcp/issues", "source": "https://github.com/laravel/mcp" }, - "time": "2026-06-25T14:00:45+00:00" + "time": "2026-07-21T13:23:52+00:00" }, { "name": "laravel/pail", @@ -7758,16 +7575,16 @@ }, { "name": "laravel/pint", - "version": "v1.29.3", + "version": "v1.30.3", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "da1d1111a6aa2e082d2a388b194afe1ba0a05d14" + "reference": "19ca6de4ce07869f61f09863e37e81562ebc0a9b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/da1d1111a6aa2e082d2a388b194afe1ba0a05d14", - "reference": "da1d1111a6aa2e082d2a388b194afe1ba0a05d14", + "url": "https://api.github.com/repos/laravel/pint/zipball/19ca6de4ce07869f61f09863e37e81562ebc0a9b", + "reference": "19ca6de4ce07869f61f09863e37e81562ebc0a9b", "shasum": "" }, "require": { @@ -7778,14 +7595,16 @@ "php": "^8.2.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.95.8", - "illuminate/view": "^12.62.0", + "composer/semver": "^3.4.4", + "friendsofphp/php-cs-fixer": "^3.95.18", + "illuminate/view": "^12.64.0", "larastan/larastan": "^3.10.0", "laravel-zero/framework": "^12.1.0", "laravel/agent-detector": "^2.0.2", + "laravel/prompts": "^0.3.21", "mockery/mockery": "^1.6.12", "nunomaduro/termwind": "^2.4.0", - "pestphp/pest": "^3.8.6" + "pestphp/pest": "^3.8.7" }, "bin": [ "builds/pint" @@ -7822,7 +7641,7 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2026-06-16T15:34:04+00:00" + "time": "2026-08-02T01:28:21+00:00" }, { "name": "laravel/roster", @@ -7887,16 +7706,16 @@ }, { "name": "laravel/sail", - "version": "v1.63.0", + "version": "v1.64.0", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "51bbce3f803c1d386cabbb44e618c955a12ff5fc" + "reference": "08cacd3e72d6798df3fa8bd4b5d55d0f7f920625" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/51bbce3f803c1d386cabbb44e618c955a12ff5fc", - "reference": "51bbce3f803c1d386cabbb44e618c955a12ff5fc", + "url": "https://api.github.com/repos/laravel/sail/zipball/08cacd3e72d6798df3fa8bd4b5d55d0f7f920625", + "reference": "08cacd3e72d6798df3fa8bd4b5d55d0f7f920625", "shasum": "" }, "require": { @@ -7946,7 +7765,7 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2026-06-18T08:54:14+00:00" + "time": "2026-07-17T15:09:35+00:00" }, { "name": "mockery/mockery", @@ -8093,23 +7912,23 @@ }, { "name": "nunomaduro/collision", - "version": "v8.9.4", + "version": "v8.9.5", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "716af8f95a470e9094cfca09ed897b023be191a5" + "reference": "fb53eacd509a1d303858e2d20cfebf2d630254ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/716af8f95a470e9094cfca09ed897b023be191a5", - "reference": "716af8f95a470e9094cfca09ed897b023be191a5", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/fb53eacd509a1d303858e2d20cfebf2d630254ec", + "reference": "fb53eacd509a1d303858e2d20cfebf2d630254ec", "shasum": "" }, "require": { "filp/whoops": "^2.18.4", "nunomaduro/termwind": "^2.4.0", "php": "^8.2.0", - "symfony/console": "^7.4.8 || ^8.0.8" + "symfony/console": "^7.4.14 || ^8.1.1" }, "conflict": { "laravel/framework": "<11.48.0 || >=14.0.0", @@ -8117,12 +7936,12 @@ }, "require-dev": { "brianium/paratest": "^7.8.5", - "larastan/larastan": "^3.9.6", - "laravel/framework": "^11.48.0 || ^12.56.0 || ^13.5.0", - "laravel/pint": "^1.29.1", - "orchestra/testbench-core": "^9.12.0 || ^10.12.1 || ^11.2.1", - "pestphp/pest": "^3.8.5 || ^4.4.3 || ^5.0.0", - "sebastian/environment": "^7.2.1 || ^8.0.4 || ^9.3.0" + "larastan/larastan": "^3.10.0", + "laravel/framework": "^11.48.0 || ^12.56.0 || ^13.20.0", + "laravel/pint": "^1.29.3", + "orchestra/testbench-core": "^9.12.0 || ^10.12.1 || ^11.3.5", + "pestphp/pest": "^3.8.5 || ^4.7.5 || ^5.0.0", + "sebastian/environment": "^7.2.1 || ^8.1.2 || ^9.3.2" }, "type": "library", "extra": { @@ -8185,46 +8004,47 @@ "type": "patreon" } ], - "time": "2026-04-21T14:04:20+00:00" + "time": "2026-07-15T19:09:14+00:00" }, { "name": "pestphp/pest", - "version": "v4.7.5", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/pestphp/pest.git", - "reference": "5dc49a71d63602a9b98fed0f2017c4679ef9f8e0" + "reference": "585de259a2e59d01ece1340f040d60bb52d2fb14" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest/zipball/5dc49a71d63602a9b98fed0f2017c4679ef9f8e0", - "reference": "5dc49a71d63602a9b98fed0f2017c4679ef9f8e0", + "url": "https://api.github.com/repos/pestphp/pest/zipball/585de259a2e59d01ece1340f040d60bb52d2fb14", + "reference": "585de259a2e59d01ece1340f040d60bb52d2fb14", "shasum": "" }, "require": { - "brianium/paratest": "^7.20.0", - "composer/xdebug-handler": "^3.0.5", - "nunomaduro/collision": "^8.9.4", + "brianium/paratest": "^7.23.1", + "nunomaduro/collision": "^8.9.5", "nunomaduro/termwind": "^2.4.0", - "pestphp/pest-plugin": "^4.0.0", - "pestphp/pest-plugin-arch": "^4.0.2", - "pestphp/pest-plugin-mutate": "^4.0.1", - "pestphp/pest-plugin-profanity": "^4.2.1", - "php": "^8.3.0", - "phpunit/phpunit": "^12.5.30", - "symfony/process": "^7.4.13|^8.1.0" + "pestphp/pest-plugin": "^5.0.0", + "pestphp/pest-plugin-arch": "^5.0.0", + "pestphp/pest-plugin-mutate": "^5.0.0", + "pestphp/pest-plugin-profanity": "^5.0.0", + "php": "^8.4", + "phpunit/phpunit": "^13.2.6", + "symfony/process": "^8.1.0" }, "conflict": { "filp/whoops": "<2.18.3", - "phpunit/phpunit": ">12.5.30", + "phpunit/phpunit": ">13.2.6", "sebastian/exporter": "<7.0.0", "webmozart/assert": "<1.11.0" }, "require-dev": { - "mrpunyapal/peststan": "^0.2.11", - "pestphp/pest-dev-tools": "^4.1.0", - "pestphp/pest-plugin-browser": "^4.3.1", - "pestphp/pest-plugin-type-coverage": "^4.0.4", + "laravel/pao": "^1.1.3", + "pestphp/pest-dev-tools": "^5.0.0", + "pestphp/pest-plugin-browser": "^5.0.0", + "pestphp/pest-plugin-phpstan": "^5.0.0", + "pestphp/pest-plugin-rector": "^5.0.0", + "pestphp/pest-plugin-type-coverage": "^5.0.0", "psy/psysh": "^0.12.24" }, "bin": [ @@ -8292,7 +8112,7 @@ ], "support": { "issues": "https://github.com/pestphp/pest/issues", - "source": "https://github.com/pestphp/pest/tree/v4.7.5" + "source": "https://github.com/pestphp/pest/tree/v5.0.3" }, "funding": [ { @@ -8304,34 +8124,34 @@ "type": "github" } ], - "time": "2026-07-06T17:06:29+00:00" + "time": "2026-08-03T02:26:34+00:00" }, { "name": "pestphp/pest-plugin", - "version": "v4.0.0", + "version": "v5.0.0", "source": { "type": "git", "url": "https://github.com/pestphp/pest-plugin.git", - "reference": "9d4b93d7f73d3f9c3189bb22c220fef271cdf568" + "reference": "87283f41aafa2561b7618be53eab00f2d06f4140" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/9d4b93d7f73d3f9c3189bb22c220fef271cdf568", - "reference": "9d4b93d7f73d3f9c3189bb22c220fef271cdf568", + "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/87283f41aafa2561b7618be53eab00f2d06f4140", + "reference": "87283f41aafa2561b7618be53eab00f2d06f4140", "shasum": "" }, "require": { "composer-plugin-api": "^2.0.0", "composer-runtime-api": "^2.2.2", - "php": "^8.3" + "php": "^8.4" }, "conflict": { - "pestphp/pest": "<4.0.0" + "pestphp/pest": "<5.0.0" }, "require-dev": { - "composer/composer": "^2.8.10", - "pestphp/pest": "^4.0.0", - "pestphp/pest-dev-tools": "^4.0.0" + "composer/composer": "^2.10.2", + "pestphp/pest": "^5.0.0", + "pestphp/pest-dev-tools": "^5.0.0" }, "type": "composer-plugin", "extra": { @@ -8358,7 +8178,7 @@ "unit" ], "support": { - "source": "https://github.com/pestphp/pest-plugin/tree/v4.0.0" + "source": "https://github.com/pestphp/pest-plugin/tree/v5.0.0" }, "funding": [ { @@ -8374,30 +8194,33 @@ "type": "patreon" } ], - "time": "2025-08-20T12:35:58+00:00" + "time": "2026-07-18T17:10:45+00:00" }, { "name": "pestphp/pest-plugin-arch", - "version": "v4.0.2", + "version": "v5.0.0", "source": { "type": "git", "url": "https://github.com/pestphp/pest-plugin-arch.git", - "reference": "3fb0d02a91b9da504b139dc7ab2a31efb7c3215c" + "reference": "244465d5dc9ea9fb5ac5c9badb7eb47d1594e4c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/3fb0d02a91b9da504b139dc7ab2a31efb7c3215c", - "reference": "3fb0d02a91b9da504b139dc7ab2a31efb7c3215c", + "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/244465d5dc9ea9fb5ac5c9badb7eb47d1594e4c1", + "reference": "244465d5dc9ea9fb5ac5c9badb7eb47d1594e4c1", "shasum": "" }, "require": { - "pestphp/pest-plugin": "^4.0.0", - "php": "^8.3", + "pestphp/pest-plugin": "^5.0.0", + "php": "^8.4", "ta-tikoma/phpunit-architecture-test": "^0.8.7" }, + "conflict": { + "pestphp/pest": "<5.0.0" + }, "require-dev": { - "pestphp/pest": "^4.4.6", - "pestphp/pest-dev-tools": "^4.1.0" + "pestphp/pest": "^5.0.0", + "pestphp/pest-dev-tools": "^5.0.0" }, "type": "library", "extra": { @@ -8432,7 +8255,7 @@ "unit" ], "support": { - "source": "https://github.com/pestphp/pest-plugin-arch/tree/v4.0.2" + "source": "https://github.com/pestphp/pest-plugin-arch/tree/v5.0.0" }, "funding": [ { @@ -8444,31 +8267,34 @@ "type": "github" } ], - "time": "2026-04-10T17:20:19+00:00" + "time": "2026-07-21T07:48:55+00:00" }, { "name": "pestphp/pest-plugin-laravel", - "version": "v4.1.0", + "version": "v5.0.1", "source": { "type": "git", "url": "https://github.com/pestphp/pest-plugin-laravel.git", - "reference": "3057a36669ff11416cc0dc2b521b3aec58c488d0" + "reference": "d1564646e3198f1b607e64a36501d6edff7d104e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin-laravel/zipball/3057a36669ff11416cc0dc2b521b3aec58c488d0", - "reference": "3057a36669ff11416cc0dc2b521b3aec58c488d0", + "url": "https://api.github.com/repos/pestphp/pest-plugin-laravel/zipball/d1564646e3198f1b607e64a36501d6edff7d104e", + "reference": "d1564646e3198f1b607e64a36501d6edff7d104e", "shasum": "" }, "require": { - "laravel/framework": "^11.45.2|^12.52.0|^13.0", - "pestphp/pest": "^4.4.1", - "php": "^8.3.0" + "laravel/framework": "^13.23.0", + "pestphp/pest": "^5.0.1", + "php": "^8.4" + }, + "conflict": { + "pestphp/pest": "<5.0.0" }, "require-dev": { - "laravel/dusk": "^8.3.6", - "orchestra/testbench": "^9.13.0|^10.9.0|^11.0", - "pestphp/pest-dev-tools": "^4.1.0" + "laravel/dusk": "^8.6.0", + "orchestra/testbench": "^11.1", + "pestphp/pest-dev-tools": "^5.0.0" }, "type": "library", "extra": { @@ -8506,7 +8332,7 @@ "unit" ], "support": { - "source": "https://github.com/pestphp/pest-plugin-laravel/tree/v4.1.0" + "source": "https://github.com/pestphp/pest-plugin-laravel/tree/v5.0.1" }, "funding": [ { @@ -8518,32 +8344,35 @@ "type": "github" } ], - "time": "2026-02-21T00:29:45+00:00" + "time": "2026-07-29T18:19:36+00:00" }, { "name": "pestphp/pest-plugin-mutate", - "version": "v4.0.1", + "version": "v5.0.0", "source": { "type": "git", "url": "https://github.com/pestphp/pest-plugin-mutate.git", - "reference": "d9b32b60b2385e1688a68cc227594738ec26d96c" + "reference": "fc4a0b3d3bc75bad1148d4c046cf0fa66c508f77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin-mutate/zipball/d9b32b60b2385e1688a68cc227594738ec26d96c", - "reference": "d9b32b60b2385e1688a68cc227594738ec26d96c", + "url": "https://api.github.com/repos/pestphp/pest-plugin-mutate/zipball/fc4a0b3d3bc75bad1148d4c046cf0fa66c508f77", + "reference": "fc4a0b3d3bc75bad1148d4c046cf0fa66c508f77", "shasum": "" }, "require": { - "nikic/php-parser": "^5.6.1", - "pestphp/pest-plugin": "^4.0.0", - "php": "^8.3", + "nikic/php-parser": "^5.8.0", + "pestphp/pest-plugin": "^5.0.0", + "php": "^8.4", "psr/simple-cache": "^3.0.0" }, + "conflict": { + "pestphp/pest": "<5.0.0" + }, "require-dev": { - "pestphp/pest": "^4.0.0", - "pestphp/pest-dev-tools": "^4.0.0", - "pestphp/pest-plugin-type-coverage": "^4.0.0" + "pestphp/pest": "^5.0.0", + "pestphp/pest-dev-tools": "^5.0.0", + "pestphp/pest-plugin-type-coverage": "^5.0.0" }, "type": "library", "autoload": { @@ -8578,7 +8407,7 @@ "unit" ], "support": { - "source": "https://github.com/pestphp/pest-plugin-mutate/tree/v4.0.1" + "source": "https://github.com/pestphp/pest-plugin-mutate/tree/v5.0.0" }, "funding": [ { @@ -8594,30 +8423,33 @@ "type": "github" } ], - "time": "2025-08-21T20:19:25+00:00" + "time": "2026-07-21T07:48:56+00:00" }, { "name": "pestphp/pest-plugin-profanity", - "version": "v4.2.1", + "version": "v5.0.0", "source": { "type": "git", "url": "https://github.com/pestphp/pest-plugin-profanity.git", - "reference": "343cfa6f3564b7e35df0ebb77b7fa97039f72b27" + "reference": "3dedf9ea6e2876b5b31f7733d3eacbd86f4653b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin-profanity/zipball/343cfa6f3564b7e35df0ebb77b7fa97039f72b27", - "reference": "343cfa6f3564b7e35df0ebb77b7fa97039f72b27", + "url": "https://api.github.com/repos/pestphp/pest-plugin-profanity/zipball/3dedf9ea6e2876b5b31f7733d3eacbd86f4653b9", + "reference": "3dedf9ea6e2876b5b31f7733d3eacbd86f4653b9", "shasum": "" }, "require": { - "pestphp/pest-plugin": "^4.0.0", - "php": "^8.3" + "pestphp/pest-plugin": "^5.0.0", + "php": "^8.4" + }, + "conflict": { + "pestphp/pest": "<5.0.0" }, "require-dev": { - "faissaloux/pest-plugin-inside": "^1.9", - "pestphp/pest": "^4.0.0", - "pestphp/pest-dev-tools": "^4.0.0" + "faissaloux/pest-plugin-inside": "^1.11", + "pestphp/pest": "^5.0.0", + "pestphp/pest-dev-tools": "^5.0.0" }, "type": "library", "extra": { @@ -8648,9 +8480,9 @@ "unit" ], "support": { - "source": "https://github.com/pestphp/pest-plugin-profanity/tree/v4.2.1" + "source": "https://github.com/pestphp/pest-plugin-profanity/tree/v5.0.0" }, - "time": "2025-12-08T00:13:17+00:00" + "time": "2026-07-21T07:48:56+00:00" }, { "name": "phar-io/manifest", @@ -8995,33 +8827,35 @@ }, { "name": "phpunit/php-code-coverage", - "version": "12.5.7", + "version": "14.2.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "186dab580576598076de6818596d12b61801880e" + "reference": "048a5c12bdb4580f4767ce2761793a16b170fbe4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/186dab580576598076de6818596d12b61801880e", - "reference": "186dab580576598076de6818596d12b61801880e", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/048a5c12bdb4580f4767ce2761793a16b170fbe4", + "reference": "048a5c12bdb4580f4767ce2761793a16b170fbe4", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", + "ext-mbstring": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^5.7.0", - "php": ">=8.3", - "phpunit/php-text-template": "^5.0", - "sebastian/complexity": "^5.0", - "sebastian/environment": "^8.1.2", - "sebastian/lines-of-code": "^4.0.1", - "sebastian/version": "^6.0", + "nikic/php-parser": "^5.8.0", + "php": ">=8.4", + "phpunit/php-text-template": "^6.0", + "sebastian/complexity": "^6.0", + "sebastian/environment": "^9.3.2", + "sebastian/git-state": "^1.0", + "sebastian/lines-of-code": "^5.0.1", + "sebastian/version": "^7.0", "theseer/tokenizer": "^2.0.1" }, "require-dev": { - "phpunit/phpunit": "^12.5.28" + "phpunit/phpunit": "^13.2.2" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -9030,7 +8864,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "12.5.x-dev" + "dev-main": "14.2.x-dev" } }, "autoload": { @@ -9059,7 +8893,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.7" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/14.2.4" }, "funding": [ { @@ -9079,32 +8913,32 @@ "type": "tidelift" } ], - "time": "2026-06-01T13:24:19+00:00" + "time": "2026-07-30T17:01:07+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "6.0.1", + "version": "7.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5" + "reference": "6e5aa1fb0a95b1703d83e721299ee18bb4e2de50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", - "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6e5aa1fb0a95b1703d83e721299ee18bb4e2de50", + "reference": "6e5aa1fb0a95b1703d83e721299ee18bb4e2de50", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^13.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -9132,7 +8966,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.1" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/7.0.0" }, "funding": [ { @@ -9152,28 +8986,28 @@ "type": "tidelift" } ], - "time": "2026-02-02T14:04:18+00:00" + "time": "2026-02-06T04:33:26+00:00" }, { "name": "phpunit/php-invoker", - "version": "6.0.0", + "version": "7.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406" + "reference": "42e5c5cae0c65df12d1b1a3ab52bf3f50f244d88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/12b54e689b07a25a9b41e57736dfab6ec9ae5406", - "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/42e5c5cae0c65df12d1b1a3ab52bf3f50f244d88", + "reference": "42e5c5cae0c65df12d1b1a3ab52bf3f50f244d88", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.4" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^13.0" }, "suggest": { "ext-pcntl": "*" @@ -9181,7 +9015,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -9208,40 +9042,52 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/6.0.0" + "source": "https://github.com/sebastianbergmann/php-invoker/tree/7.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-invoker", + "type": "tidelift" } ], - "time": "2025-02-07T04:58:58+00:00" + "time": "2026-02-06T04:34:47+00:00" }, { "name": "phpunit/php-text-template", - "version": "5.0.0", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53" + "reference": "a47af19f93f76aa3368303d752aa5272ca3299f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/e1367a453f0eda562eedb4f659e13aa900d66c53", - "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/a47af19f93f76aa3368303d752aa5272ca3299f4", + "reference": "a47af19f93f76aa3368303d752aa5272ca3299f4", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^13.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -9268,40 +9114,52 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/5.0.0" + "source": "https://github.com/sebastianbergmann/php-text-template/tree/6.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-text-template", + "type": "tidelift" } ], - "time": "2025-02-07T04:59:16+00:00" + "time": "2026-02-06T04:36:37+00:00" }, { "name": "phpunit/php-timer", - "version": "8.0.0", + "version": "9.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc" + "reference": "a0e12065831f6ab0d83120dc61513eb8d9a966f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", - "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/a0e12065831f6ab0d83120dc61513eb8d9a966f6", + "reference": "a0e12065831f6ab0d83120dc61513eb8d9a966f6", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^13.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "8.0-dev" + "dev-main": "9.0-dev" } }, "autoload": { @@ -9328,56 +9186,70 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", "security": "https://github.com/sebastianbergmann/php-timer/security/policy", - "source": "https://github.com/sebastianbergmann/php-timer/tree/8.0.0" + "source": "https://github.com/sebastianbergmann/php-timer/tree/9.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-timer", + "type": "tidelift" } ], - "time": "2025-02-07T04:59:38+00:00" + "time": "2026-02-06T04:37:53+00:00" }, { "name": "phpunit/phpunit", - "version": "12.5.30", + "version": "13.2.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "900400a5b616d6fb306f9549f6da33ba615d3fbb" + "reference": "5d2afe181339a56348ef9a80fa7eb806b7eae508" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/900400a5b616d6fb306f9549f6da33ba615d3fbb", - "reference": "900400a5b616d6fb306f9549f6da33ba615d3fbb", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5d2afe181339a56348ef9a80fa7eb806b7eae508", + "reference": "5d2afe181339a56348ef9a80fa7eb806b7eae508", "shasum": "" }, "require": { "ext-dom": "*", + "ext-filter": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", - "ext-xml": "*", "ext-xmlwriter": "*", "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", - "php": ">=8.3", - "phpunit/php-code-coverage": "^12.5.7", - "phpunit/php-file-iterator": "^6.0.1", - "phpunit/php-invoker": "^6.0.0", - "phpunit/php-text-template": "^5.0.0", - "phpunit/php-timer": "^8.0.0", - "sebastian/cli-parser": "^4.2.1", - "sebastian/comparator": "^7.1.8", - "sebastian/diff": "^7.0.0", - "sebastian/environment": "^8.1.2", - "sebastian/exporter": "^7.0.3", - "sebastian/global-state": "^8.0.3", - "sebastian/object-enumerator": "^7.0.0", - "sebastian/recursion-context": "^7.0.1", - "sebastian/type": "^6.0.4", - "sebastian/version": "^6.0.0", + "php": ">=8.4.1", + "phpunit/php-code-coverage": "^14.2.3", + "phpunit/php-file-iterator": "^7.0.0", + "phpunit/php-invoker": "^7.0.0", + "phpunit/php-text-template": "^6.0.0", + "phpunit/php-timer": "^9.0.0", + "sebastian/cli-parser": "^5.0.0", + "sebastian/comparator": "^8.3.0", + "sebastian/diff": "^9.0", + "sebastian/environment": "^9.3.2", + "sebastian/exporter": "^8.1.1", + "sebastian/file-filter": "^1.0", + "sebastian/git-state": "^1.0", + "sebastian/global-state": "^9.0.1", + "sebastian/object-enumerator": "^8.0.0", + "sebastian/recursion-context": "^8.0.0", + "sebastian/type": "^7.0.1", + "sebastian/version": "^7.0.0", "staabm/side-effects-detector": "^1.0.5" }, "bin": [ @@ -9386,7 +9258,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "12.5-dev" + "dev-main": "13.2-dev" } }, "autoload": { @@ -9418,7 +9290,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.30" + "source": "https://github.com/sebastianbergmann/phpunit/tree/13.2.6" }, "funding": [ { @@ -9426,32 +9298,32 @@ "type": "other" } ], - "time": "2026-06-15T13:12:30+00:00" + "time": "2026-07-28T14:00:09+00:00" }, { "name": "sebastian/cli-parser", - "version": "4.2.1", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "7d05781b13f7dec9043a629a21d086ed74582a15" + "reference": "eeb759ad3146b7096fb59c3195d39e071cd409e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/7d05781b13f7dec9043a629a21d086ed74582a15", - "reference": "7d05781b13f7dec9043a629a21d086ed74582a15", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/eeb759ad3146b7096fb59c3195d39e071cd409e3", + "reference": "eeb759ad3146b7096fb59c3195d39e071cd409e3", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.5.25" + "phpunit/phpunit": "^13.2.6" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.2-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -9475,7 +9347,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/4.2.1" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/5.0.1" }, "funding": [ { @@ -9495,31 +9367,31 @@ "type": "tidelift" } ], - "time": "2026-05-17T05:29:34+00:00" + "time": "2026-08-01T04:27:14+00:00" }, { "name": "sebastian/comparator", - "version": "7.1.8", + "version": "8.3.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "7c65c1e79836812819705b473a90c12399542485" + "reference": "c025fc7604afab3f195fab7cdaf72327331af241" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/7c65c1e79836812819705b473a90c12399542485", - "reference": "7c65c1e79836812819705b473a90c12399542485", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/c025fc7604afab3f195fab7cdaf72327331af241", + "reference": "c025fc7604afab3f195fab7cdaf72327331af241", "shasum": "" }, "require": { "ext-dom": "*", "ext-mbstring": "*", - "php": ">=8.3", - "sebastian/diff": "^7.0", - "sebastian/exporter": "^7.0.3" + "php": ">=8.4", + "sebastian/diff": "^9.0", + "sebastian/exporter": "^8.1.0" }, "require-dev": { - "phpunit/phpunit": "^12.5.25" + "phpunit/phpunit": "^13.2" }, "suggest": { "ext-bcmath": "For comparing BcMath\\Number objects" @@ -9527,7 +9399,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "7.1-dev" + "dev-main": "8.3-dev" } }, "autoload": { @@ -9567,7 +9439,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.8" + "source": "https://github.com/sebastianbergmann/comparator/tree/8.3.0" }, "funding": [ { @@ -9587,33 +9459,33 @@ "type": "tidelift" } ], - "time": "2026-05-21T04:45:25+00:00" + "time": "2026-06-05T03:06:45+00:00" }, { "name": "sebastian/complexity", - "version": "5.0.0", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb" + "reference": "c5651c795c98093480df79350cb050813fc7a2f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/bad4316aba5303d0221f43f8cee37eb58d384bbb", - "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/c5651c795c98093480df79350cb050813fc7a2f3", + "reference": "c5651c795c98093480df79350cb050813fc7a2f3", "shasum": "" }, "require": { "nikic/php-parser": "^5.0", - "php": ">=8.3" + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^13.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -9637,41 +9509,53 @@ "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/5.0.0" + "source": "https://github.com/sebastianbergmann/complexity/tree/6.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/complexity", + "type": "tidelift" } ], - "time": "2025-02-07T04:55:25+00:00" + "time": "2026-02-06T04:41:32+00:00" }, { "name": "sebastian/diff", - "version": "7.0.0", + "version": "9.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "7ab1ea946c012266ca32390913653d844ecd085f" + "reference": "a3fb6a298a265ff487a91bbea46e03cd01dbb226" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f", - "reference": "7ab1ea946c012266ca32390913653d844ecd085f", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/a3fb6a298a265ff487a91bbea46e03cd01dbb226", + "reference": "a3fb6a298a265ff487a91bbea46e03cd01dbb226", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.0", - "symfony/process": "^7.2" + "phpunit/phpunit": "^13.2", + "symfony/process": "^7.4.13" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "9.0-dev" } }, "autoload": { @@ -9704,35 +9588,47 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/7.0.0" + "source": "https://github.com/sebastianbergmann/diff/tree/9.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/diff", + "type": "tidelift" } ], - "time": "2025-02-07T04:55:46+00:00" + "time": "2026-06-05T03:04:51+00:00" }, { "name": "sebastian/environment", - "version": "8.1.2", + "version": "9.3.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "9d32c685773823b1983e256ae4ecd48a10d6e439" + "reference": "6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/9d32c685773823b1983e256ae4ecd48a10d6e439", - "reference": "9d32c685773823b1983e256ae4ecd48a10d6e439", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e", + "reference": "6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.5.26" + "phpunit/phpunit": "^13.1.11" }, "suggest": { "ext-posix": "*" @@ -9740,7 +9636,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "8.1-dev" + "dev-main": "9.3-dev" } }, "autoload": { @@ -9768,7 +9664,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/8.1.2" + "source": "https://github.com/sebastianbergmann/environment/tree/9.3.2" }, "funding": [ { @@ -9788,34 +9684,34 @@ "type": "tidelift" } ], - "time": "2026-05-25T13:40:20+00:00" + "time": "2026-05-25T13:41:38+00:00" }, { "name": "sebastian/exporter", - "version": "7.0.3", + "version": "8.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23" + "reference": "cfaa77c750dcad6f44c9bac8f62ac486e1c82c26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23", - "reference": "c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/cfaa77c750dcad6f44c9bac8f62ac486e1c82c26", + "reference": "cfaa77c750dcad6f44c9bac8f62ac486e1c82c26", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": ">=8.3", - "sebastian/recursion-context": "^7.0.1" + "php": ">=8.4", + "sebastian/recursion-context": "^8.0" }, "require-dev": { - "phpunit/phpunit": "^12.5.25" + "phpunit/phpunit": "^13.2.4" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "8.1-dev" } }, "autoload": { @@ -9858,7 +9754,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/7.0.3" + "source": "https://github.com/sebastianbergmann/exporter/tree/8.1.1" }, "funding": [ { @@ -9878,35 +9774,173 @@ "type": "tidelift" } ], - "time": "2026-05-20T04:37:17+00:00" + "time": "2026-07-13T11:35:11+00:00" + }, + { + "name": "sebastian/file-filter", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/file-filter.git", + "reference": "33a26f394330f6faa7684bb9cc73afb7727aae93" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/file-filter/zipball/33a26f394330f6faa7684bb9cc73afb7727aae93", + "reference": "33a26f394330f6faa7684bb9cc73afb7727aae93", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for filtering files", + "homepage": "https://github.com/sebastianbergmann/file-filter", + "support": { + "issues": "https://github.com/sebastianbergmann/file-filter/issues", + "security": "https://github.com/sebastianbergmann/file-filter/security/policy", + "source": "https://github.com/sebastianbergmann/file-filter/tree/1.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/file-filter", + "type": "tidelift" + } + ], + "time": "2026-04-22T07:20:04+00:00" + }, + { + "name": "sebastian/git-state", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/git-state.git", + "reference": "792a952e0eba55b6960a48aeceb9f371aad1f76b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/git-state/zipball/792a952e0eba55b6960a48aeceb9f371aad1f76b", + "reference": "792a952e0eba55b6960a48aeceb9f371aad1f76b", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for describing the state of a Git checkout", + "homepage": "https://github.com/sebastianbergmann/git-state", + "support": { + "issues": "https://github.com/sebastianbergmann/git-state/issues", + "security": "https://github.com/sebastianbergmann/git-state/security/policy", + "source": "https://github.com/sebastianbergmann/git-state/tree/1.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/git-state", + "type": "tidelift" + } + ], + "time": "2026-03-21T12:54:28+00:00" }, { "name": "sebastian/global-state", - "version": "8.0.3", + "version": "9.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "b164d3274d6537ab462591c5755f76a8f5b1aae9" + "reference": "ba68ba79da690cf7eddefd3ce5b78b20b9ba9945" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/b164d3274d6537ab462591c5755f76a8f5b1aae9", - "reference": "b164d3274d6537ab462591c5755f76a8f5b1aae9", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/ba68ba79da690cf7eddefd3ce5b78b20b9ba9945", + "reference": "ba68ba79da690cf7eddefd3ce5b78b20b9ba9945", "shasum": "" }, "require": { - "php": ">=8.3", - "sebastian/object-reflector": "^5.0", - "sebastian/recursion-context": "^7.0.1" + "php": ">=8.4", + "sebastian/object-reflector": "^6.0", + "sebastian/recursion-context": "^8.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^12.5.28" + "phpunit/phpunit": "^13.1.13" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "8.0-dev" + "dev-main": "9.0-dev" } }, "autoload": { @@ -9932,7 +9966,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/8.0.3" + "source": "https://github.com/sebastianbergmann/global-state/tree/9.0.1" }, "funding": [ { @@ -9952,33 +9986,33 @@ "type": "tidelift" } ], - "time": "2026-06-01T15:10:33+00:00" + "time": "2026-06-01T15:11:33+00:00" }, { "name": "sebastian/lines-of-code", - "version": "4.0.1", + "version": "5.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "d543b8ef219dcd8da262cbb958639a96bedba10e" + "reference": "d1b6f8fce682505dbd048977f1abedf1b8ad3ff8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d543b8ef219dcd8da262cbb958639a96bedba10e", - "reference": "d543b8ef219dcd8da262cbb958639a96bedba10e", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d1b6f8fce682505dbd048977f1abedf1b8ad3ff8", + "reference": "d1b6f8fce682505dbd048977f1abedf1b8ad3ff8", "shasum": "" }, "require": { - "nikic/php-parser": "^5.7.0", - "php": ">=8.3" + "nikic/php-parser": "^5.8.0", + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.5.25" + "phpunit/phpunit": "^13.2.4" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -10002,7 +10036,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/4.0.1" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/5.0.2" }, "funding": [ { @@ -10022,34 +10056,34 @@ "type": "tidelift" } ], - "time": "2026-05-19T16:22:07+00:00" + "time": "2026-07-09T08:42:34+00:00" }, { "name": "sebastian/object-enumerator", - "version": "7.0.0", + "version": "8.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894" + "reference": "b39ab125fd9a7434b0ecbc4202eebce11a98cfc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1effe8e9b8e068e9ae228e542d5d11b5d16db894", - "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/b39ab125fd9a7434b0ecbc4202eebce11a98cfc5", + "reference": "b39ab125fd9a7434b0ecbc4202eebce11a98cfc5", "shasum": "" }, "require": { - "php": ">=8.3", - "sebastian/object-reflector": "^5.0", - "sebastian/recursion-context": "^7.0" + "php": ">=8.4", + "sebastian/object-reflector": "^6.0", + "sebastian/recursion-context": "^8.0" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^13.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -10072,40 +10106,52 @@ "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/7.0.0" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/8.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/object-enumerator", + "type": "tidelift" } ], - "time": "2025-02-07T04:57:48+00:00" + "time": "2026-02-06T04:46:36+00:00" }, { "name": "sebastian/object-reflector", - "version": "5.0.0", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "4bfa827c969c98be1e527abd576533293c634f6a" + "reference": "3ca042c2c60b0eab094f8a1b6a7093f4d4c72200" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/4bfa827c969c98be1e527abd576533293c634f6a", - "reference": "4bfa827c969c98be1e527abd576533293c634f6a", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/3ca042c2c60b0eab094f8a1b6a7093f4d4c72200", + "reference": "3ca042c2c60b0eab094f8a1b6a7093f4d4c72200", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^13.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -10128,40 +10174,52 @@ "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/5.0.0" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/6.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/object-reflector", + "type": "tidelift" } ], - "time": "2025-02-07T04:58:17+00:00" + "time": "2026-02-06T04:47:13+00:00" }, { "name": "sebastian/recursion-context", - "version": "7.0.1", + "version": "8.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c" + "reference": "32dba72f2b4642d6a93db22d6c0a9280ff2e3ca0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", - "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/32dba72f2b4642d6a93db22d6c0a9280ff2e3ca0", + "reference": "32dba72f2b4642d6a93db22d6c0a9280ff2e3ca0", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^13.2.6" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -10192,7 +10250,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/7.0.1" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/8.0.1" }, "funding": [ { @@ -10212,32 +10270,32 @@ "type": "tidelift" } ], - "time": "2025-08-13T04:44:59+00:00" + "time": "2026-08-03T05:58:12+00:00" }, { "name": "sebastian/type", - "version": "6.0.4", + "version": "7.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "82ff822c2edc46724be9f7411d3163021f602773" + "reference": "fee0309275847fefd7636167085e379c1dbf6990" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/82ff822c2edc46724be9f7411d3163021f602773", - "reference": "82ff822c2edc46724be9f7411d3163021f602773", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fee0309275847fefd7636167085e379c1dbf6990", + "reference": "fee0309275847fefd7636167085e379c1dbf6990", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^12.5.25" + "phpunit/phpunit": "^13.1.10" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -10261,7 +10319,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/type/issues", "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/tree/6.0.4" + "source": "https://github.com/sebastianbergmann/type/tree/7.0.1" }, "funding": [ { @@ -10281,29 +10339,29 @@ "type": "tidelift" } ], - "time": "2026-05-20T06:45:45+00:00" + "time": "2026-05-20T06:49:11+00:00" }, { "name": "sebastian/version", - "version": "6.0.0", + "version": "7.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c" + "reference": "ad37a5552c8e2b88572249fdc19b6da7792e021b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/3e6ccf7657d4f0a59200564b08cead899313b53c", - "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/ad37a5552c8e2b88572249fdc19b6da7792e021b", + "reference": "ad37a5552c8e2b88572249fdc19b6da7792e021b", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.4" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -10327,15 +10385,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/version/issues", "security": "https://github.com/sebastianbergmann/version/security/policy", - "source": "https://github.com/sebastianbergmann/version/tree/6.0.0" + "source": "https://github.com/sebastianbergmann/version/tree/7.0.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/version", + "type": "tidelift" } ], - "time": "2025-02-07T05:00:38+00:00" + "time": "2026-02-06T04:52:52+00:00" }, { "name": "staabm/side-effects-detector", @@ -10391,16 +10461,16 @@ }, { "name": "symfony/yaml", - "version": "v8.1.1", + "version": "v8.1.2", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "8e4cdd4311683516be06944f4b85244063cdb886" + "reference": "faabdbe998e8c5c599dceffa27aa265b185c0736" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/8e4cdd4311683516be06944f4b85244063cdb886", - "reference": "8e4cdd4311683516be06944f4b85244063cdb886", + "url": "https://api.github.com/repos/symfony/yaml/zipball/faabdbe998e8c5c599dceffa27aa265b185c0736", + "reference": "faabdbe998e8c5c599dceffa27aa265b185c0736", "shasum": "" }, "require": { @@ -10443,7 +10513,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v8.1.1" + "source": "https://github.com/symfony/yaml/tree/v8.1.2" }, "funding": [ { @@ -10463,7 +10533,7 @@ "type": "tidelift" } ], - "time": "2026-06-09T11:06:24+00:00" + "time": "2026-07-22T15:42:13+00:00" }, { "name": "ta-tikoma/phpunit-architecture-test", @@ -10641,7 +10711,14 @@ "time": "2026-06-15T15:31:57+00:00" } ], - "aliases": [], + "aliases": [ + { + "package": "nativephp/mobile", + "version": "dev-main", + "alias": "4.9.9", + "alias_normalized": "4.9.9.0" + } + ], "minimum-stability": "dev", "stability-flags": { "nativephp/mobile": 20 diff --git a/config/native-ui.php b/config/native-ui.php index 11ea93f..157bcf7 100644 --- a/config/native-ui.php +++ b/config/native-ui.php @@ -54,12 +54,18 @@ 'on-surface-variant' => 'slate-800', // Outline = neutral borders (text fields, dividers, cards). + // outline-variant = softer edges: hairline dividers, card seams. 'outline' => 'slate-200', + 'outline-variant' => 'slate-100', // Destructive / error actions and messages. 'destructive' => 'red-600', 'on-destructive' => 'white', + // Success / "all systems go" — confirmations, verified badges. + 'success' => 'emerald-600', + 'on-success' => 'white', + // Tertiary accent — for highlights, badges, emphasis not covered by primary. 'accent' => 'yellow-400', 'on-accent' => 'white', @@ -68,6 +74,7 @@ // Matched to nativephp.com's dark theme: #050714 page, slate-950 cards, // "cloud" navy (#2B2E53) tonal fills, violet-500 accents, teal #3EDAD7. 'dark' => [ + 'shane' => 'yellow-400', 'primary' => 'violet-500', 'on-primary' => 'white', @@ -83,10 +90,14 @@ 'on-surface-variant' => 'gray-400', 'outline' => 'slate-700', + 'outline-variant' => 'slate-800', 'destructive' => 'red-500', 'on-destructive' => 'white', + 'success' => 'emerald-400', + 'on-success' => '#052E16', + 'accent' => '#3EDAD7', 'on-accent' => '#050714', ], @@ -103,7 +114,16 @@ 'font-lg' => 20, 'font-xl' => 24, - 'font-family' => 'Geist+Pixel-Regular', + ], + + 'fonts' => [ + 'default' => 'Geist+Pixel-Regular', + 'accent' => 'Lobster-Regular', + + // Theme Lab display faces. + 'display' => 'Unbounded-Bold', + 'grotesk' => 'SpaceGrotesk-Regular', + 'grotesk-bold' => 'SpaceGrotesk-Bold', ], ]; diff --git a/config/view.php b/config/view.php new file mode 100644 index 0000000..52fb738 --- /dev/null +++ b/config/view.php @@ -0,0 +1,40 @@ + [ + resource_path('views'), + ], + + /* + |-------------------------------------------------------------------------- + | Compiled View Path + |-------------------------------------------------------------------------- + | + | This option determines where all the compiled Blade templates will be + | stored for your application. Unlike the framework default this does not + | wrap the path in realpath(), which returns false when the directory is + | absent and leaves Blade with a null cache path. The NativePHP build + | excludes storage/framework when it copies the app, so the directory does + | not exist when composer install boots the app inside the platform build + | directory. Blade creates the directory itself on first write. + | + */ + + 'compiled' => env( + 'VIEW_COMPILED_PATH', + storage_path('framework/views') + ), + +]; diff --git a/resources/animations/jump.lottie b/resources/animations/jump.lottie new file mode 100644 index 0000000000000000000000000000000000000000..a0b4811a7770278fb0261cdc3e3ea8721a77ce16 GIT binary patch literal 8455 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 A`~Uy| literal 0 HcmV?d00001 diff --git a/resources/fonts/SpaceGrotesk-Bold.ttf b/resources/fonts/SpaceGrotesk-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f4f80025b75c29d644acc3a7e06cce169ccb9ac4 GIT binary patch literal 69308 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

8%yeaK}pHv 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 MbrNgskchtf-yPq~?EnA( literal 0 HcmV?d00001 diff --git a/resources/views/native/_vibe-account.blade.php b/resources/views/native/_vibe-account.blade.php deleted file mode 100644 index 65653f0..0000000 --- a/resources/views/native/_vibe-account.blade.php +++ /dev/null @@ -1,14 +0,0 @@ -@if(! empty($vibeIdentity ?? null)) - - - - - Signed in as - {{ $vibeIdentity }} - - - - Log out - - -@endif diff --git a/resources/views/native/animate.blade.php b/resources/views/native/animate.blade.php index a631e54..739c2a9 100644 --- a/resources/views/native/animate.blade.php +++ b/resources/views/native/animate.blade.php @@ -28,13 +28,13 @@ class="flex-1 h-[120] rounded-2xl items-center justify-center bg-theme-surface-v - + Secondary - + Destructive - + Accent - + Ghost - + @@ -43,19 +43,19 @@ Small - + Medium - + Large - + @@ -66,19 +66,19 @@ With leading icon - + With trailing icon - + Loading - + @@ -90,31 +90,31 @@ glass - + glass:prominent - + glass:prominent + destructive - + glass:prominent + accent - + glass:prominent:interactive - + @@ -131,7 +131,7 @@ Pressable + interactive - + Tap me @@ -145,7 +145,7 @@ Glass · clear:interactive (pressable) - + Tap @@ -201,6 +201,5 @@ class="w-[2400] h-[1600]"/> @endios - diff --git a/resources/views/native/checkbox.blade.php b/resources/views/native/checkbox.blade.php index b5800ae..784e8dc 100644 --- a/resources/views/native/checkbox.blade.php +++ b/resources/views/native/checkbox.blade.php @@ -1,5 +1,5 @@ @ios - + diff --git a/resources/views/native/compose-tweet.blade.php b/resources/views/native/compose-tweet.blade.php index 1d768d1..f9a9ff8 100644 --- a/resources/views/native/compose-tweet.blade.php +++ b/resources/views/native/compose-tweet.blade.php @@ -1,21 +1,20 @@ +@php + $hasText = trim($tweetText) !== ''; + $remaining = 280 - mb_strlen($tweetText); +@endphp + {{-- Top Bar --}} - - - - - + + Taps: {{ $tapCount }} Long: {{ $longPressCount }} - Sheet visible: {{ $sheetVisible ? 'YES' : 'NO' }} @@ -601,7 +601,7 @@ leadingIcon="settings" trailingIconButton="more_vert" headlineColor="{{ $fg }}" supportingColor="{{ $muted }}" @trailingPress="onTrailingPress"/> - @@ -657,9 +657,9 @@ dd() & Exceptions - - diff --git a/resources/views/native/doom-game.blade.php b/resources/views/native/doom-game.blade.php deleted file mode 100644 index 5b08972..0000000 --- a/resources/views/native/doom-game.blade.php +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - {{-- Title --}} - - DOOM - PHP Edition - - - Every enemy is an Eloquent model - - - - {{-- Server Status --}} - - - SERVER - - REFRESH - - - - - - - {{ $serverOnline ? 'ONLINE' : 'OFFLINE' }} - {{ config('doom.server_host', '127.0.0.1') }}:{{ config('doom.server_port', 9001) }} - - - - - {{-- Player Name --}} - - PLAYER NAME - {{ $playerName }} - - - - - {{-- Multiplayer --}} - - FIND MATCH - @if(!$serverOnline) - Server offline - @endif - - - {{-- Solo --}} - - SOLO (vs AI) - - - @if($matchStatus !== '') - - {{ $matchStatus }} - - @endif - - @if($isMultiplayer) - - DISCONNECT - - @endif - - - - {{-- Stats --}} - - - - CAREER - - - - - {{ $gamesPlayed }} - Games - - - {{ $totalKills }} - Kills - - - - - - @if($mpKills > 0 || $mpDeaths > 0) - {{-- PvP Stats --}} - - - LAST MATCH (PvP) - - - - {{ $mpKills }} - Kills - - - {{ $mpDeaths }} - Deaths - - - {{ $lastScore }} - Score - - - - - @elseif($lastScore > 0) - {{-- Solo Stats --}} - - - LAST GAME - - - - {{ $lastScore }} - Score - - - {{ $lastKills }} - Kills - - - - - @endif - - {{-- Sync Button --}} - - SYNC RESULTS - - - - - - - diff --git a/resources/views/native/drawer-demo.blade.php b/resources/views/native/drawer-demo.blade.php deleted file mode 100644 index 65380a3..0000000 --- a/resources/views/native/drawer-demo.blade.php +++ /dev/null @@ -1,34 +0,0 @@ - - {{-- Header. The left padding (pl-16) clears the drawer host's floating - ☰ button, which is drawn as an overlay at the top-leading corner. --}} - - - {{ $mode === 'reveal' ? 'Reveal' : 'Modal' }} Drawer - - - - - - - Open the drawer with the ☰ button (top-left) or swipe in from the left edge. - - - - - {{ $mode === 'reveal' - ? 'Reveal mode pushes this content aside to expose the drawer sitting behind it.' - : 'Modal mode slides the drawer over this content with a dim scrim.' }} - - - - - Declared once - - The same drawer is defined on DrawerLayout::drawer() and appears on every screen - routed under it — no per-screen markup. Switch between Modal and Reveal from inside - the drawer to see both presentations share one declaration. - - - - - diff --git a/resources/views/native/drawer-menu.blade.php b/resources/views/native/drawer-menu.blade.php deleted file mode 100644 index 13f1000..0000000 --- a/resources/views/native/drawer-menu.blade.php +++ /dev/null @@ -1,31 +0,0 @@ -{{-- Arbitrary drawer content — any elements you want. Declared once on - DrawerLayout::drawer() and rendered into the side drawer on every screen. --}} - - {{-- Header --}} - - - - - Ada Lovelace - Side drawer demo - - - {{-- Menu items — plain rows that navigate() --}} - - - - Modal drawer - - - - Reveal drawer - - - - - - - All demos - - - diff --git a/resources/views/native/event-channel-test.blade.php b/resources/views/native/event-channel-test.blade.php index ffe429b..02579da 100644 --- a/resources/views/native/event-channel-test.blade.php +++ b/resources/views/native/event-channel-test.blade.php @@ -34,7 +34,7 @@ starts with: {{ $sample }}… @endif - + Reset counter diff --git a/resources/views/native/explore-icons-row.blade.php b/resources/views/native/explore-icons-row.blade.php index 7f9acaf..80bdd41 100644 --- a/resources/views/native/explore-icons-row.blade.php +++ b/resources/views/native/explore-icons-row.blade.php @@ -4,7 +4,7 @@ @php($cases = array_slice($iconCatalog['cases'], $index * 3, 3)) @foreach ($cases as $case) - ` component — see - resources/views/components/layouts/app.blade.php published from the - nativephp/native-ui plugin. --}} +{{-- Page wrapper: scroll-view with theme.background + safe-area. --}} @@ -45,10 +42,10 @@ {{-- Overlays--}} {{-- --}} -{{-- --}} -{{-- --}} {{-- --}} @@ -59,7 +56,7 @@ {{-- This is a full-screen modal overlay. Tap the X or press back to dismiss.--}} {{-- --}} {{-- You can put any content here — forms, lists, images, anything.--}} -{{-- --}} {{-- --}} @@ -84,7 +81,7 @@ {{-- --}} {{-- --}} {{-- @endforeach--}} -{{-- --}} +{{-- --}} {{-- --}} {{-- --}} @@ -445,18 +442,18 @@ {{-- --}}{{-- Variants (primary / secondary / destructive / ghost) --}} {{-- Variants--}} {{-- --}} -{{-- --}} -{{-- --}} -{{-- --}} -{{-- --}} +{{-- --}} +{{-- --}} +{{-- --}} +{{-- --}} {{-- --}} {{-- --}}{{-- Sizes --}} {{-- Sizes--}} {{-- --}} -{{-- --}} -{{-- --}} -{{-- --}} +{{-- --}} +{{-- --}} +{{-- --}} {{-- --}} {{-- --}}{{-- Icons (leading + trailing) --}} @@ -467,26 +464,26 @@ {{-- through directly. --}} {{-- With icons--}} {{-- --}} -{{-- --}} -{{-- --}} -{{-- --}} +{{-- --}} +{{-- --}} +{{-- --}} {{-- --}} {{-- --}}{{-- Icon-only (needs a11y-label) --}} {{-- Icon-only--}} {{-- --}} -{{-- --}} -{{-- --}} -{{-- --}} +{{-- --}} +{{-- --}} +{{-- --}} {{-- --}} {{-- --}}{{-- Custom look — escape hatch via --}} @@ -494,19 +491,19 @@ {{-- Custom look (via pressable)--}} {{-- --}} {{-- --}} -{{-- --}} +{{-- --}} {{-- Pink Pill--}} {{-- --}} -{{-- --}} +{{-- --}} {{-- Teal Pill--}} {{-- --}} -{{-- --}} +{{-- --}} {{-- Rose Pill--}} {{-- --}} -{{-- --}} +{{-- --}} {{-- Outlined blue--}} {{-- --}} -{{-- --}} +{{-- --}} {{-- Outlined red--}} {{-- --}} {{-- --}} @@ -514,23 +511,23 @@ {{-- --}}{{-- Icon circles — still via pressable (custom shape + color) --}} {{-- --}} -{{-- --}} {{-- --}} {{-- --}} -{{-- --}} {{-- --}} {{-- --}} -{{-- --}} {{-- --}} {{-- --}} -{{-- --}} {{-- --}} {{-- --}} -{{-- --}} {{-- --}} {{-- --}} @@ -590,18 +587,18 @@ {{-- --}}{{-- ============================================= --}} {{-- Interactive Counter--}} {{-- --}} -{{-- --}} +{{-- --}} {{-- @if($lastButton)--}} {{-- You pressed: {{ $lastButton }}--}} {{-- @endif--}} @@ -1007,7 +1004,7 @@ {{-- ];--}} {{-- @endphp--}} {{-- @foreach ($checkboxRows as $row)--}} -{{-- --}} +{{-- --}} {{-- --}} {{-- 'team', 'label' => 'Team — $49/mo'],--}} {{-- ] as $row)--}} {{-- @php $checked = $pricingPlan === $row['value']; @endphp--}} -{{-- --}} +{{-- --}} {{-- --}} {{-- 'termsAccepted', 'label' => 'Terms accepted', 'icon' => 'check'],--}} {{-- ] as $row)--}} {{-- @php $sel = $this->{$row['field']}; @endphp--}} -{{-- --}} +{{-- --}} {{-- --}} {{-- --}} {{-- {{ $row['label'] }}--}} @@ -1207,7 +1204,7 @@ {{-- ['label' => 'About', 'icon' => 'info'],--}} {{-- ] as $i => $tab)--}} {{-- @php $isActive = $activeTab === $i; @endphp--}} -{{-- --}} +{{-- --}} {{-- --}} {{-- --}} {{-- --}} @@ -1237,7 +1234,7 @@ {{-- $isFirst = $i === 0;--}} {{-- $isLast = $i === count($planOptions) - 1;--}} {{-- @endphp--}} -{{-- --}} +{{-- --}} {{-- --}} {{-- {{ $opt }}--}} {{-- --}} @@ -1417,10 +1414,10 @@ {{-- clean architecture, Tailwind, and strong coffee.--}} {{-- --}} {{-- --}} -{{-- --}} +{{-- --}} {{-- Follow--}} {{-- --}} -{{-- --}} {{-- Message--}} {{-- --}} @@ -1454,7 +1451,7 @@ {{-- List Items--}} {{-- --}} {{-- --}}{{-- Item 1 --}} -{{-- --}} +{{-- --}} {{-- --}} {{-- --}} {{-- --}} @@ -1471,7 +1468,7 @@ {{-- --}} {{-- --}} {{-- --}}{{-- Item 2 --}} -{{-- --}} +{{-- --}} {{-- --}} {{-- --}} {{-- --}} @@ -1485,7 +1482,7 @@ {{-- --}} {{-- --}} {{-- --}}{{-- Item 3 --}} -{{-- --}} +{{-- --}} {{-- --}} {{-- --}} {{-- --}} @@ -1499,7 +1496,7 @@ {{-- --}} {{-- --}} {{-- --}}{{-- Item 4 --}} -{{-- --}} +{{-- --}} {{-- --}} {{-- --}} {{-- --}} @@ -1620,19 +1617,19 @@ {{-- Bottom Navigation --}} {{----}} -{{-- --}} +{{-- --}} {{-- --}} {{-- Home--}} {{-- --}} -{{-- --}} +{{-- --}} {{-- --}} {{-- Search--}} {{-- --}} -{{-- --}} +{{-- --}} {{-- --}} {{-- Favorites--}} {{-- --}} -{{-- --}} +{{-- --}} {{-- --}} {{-- Profile--}} {{-- --}} diff --git a/resources/views/native/explore/buttons.blade.php b/resources/views/native/explore/buttons.blade.php index d2fd552..7e9e938 100644 --- a/resources/views/native/explore/buttons.blade.php +++ b/resources/views/native/explore/buttons.blade.php @@ -4,34 +4,34 @@ {{-- Variants --}} Variants - - - - + + + + {{-- Sizes --}} Sizes - - - + + + {{-- With icons --}} With icons - - - + + + {{-- States --}} States - - - + + + @@ -39,36 +39,36 @@ {{-- Pressable escape hatch — bright accent pills stay vivid in both modes --}} Pressable (custom) - + Pink Pill - + Teal Pill - Outlined - - - - - @@ -80,11 +80,11 @@ class="w-[48] h-[48] rounded-full bg-amber-500 items-center justify-center"> Interactive Counter - - {{-- Favorite Button --}} - - - {{ $isFavorited ? 'Saved to favorites' : 'Save to favorites' }} - - - - - - - diff --git a/resources/views/native/ikea-search.blade.php b/resources/views/native/ikea-search.blade.php deleted file mode 100644 index 4458aed..0000000 --- a/resources/views/native/ikea-search.blade.php +++ /dev/null @@ -1,94 +0,0 @@ - - - {{-- Top Bar --}} - - - - - - Search - - - - {{-- Search Input --}} - - - - - {{-- Room Filter Chips --}} - - - @foreach ($categories as $cat) - - @endforeach - - - - - - {{-- Result Count --}} - - {{ $resultCount }} {{ $resultCount === 1 ? 'result' : 'results' }} - - - {{-- Product Results --}} - - - @foreach ($results as $product) - - - {{-- Product Image --}} - - - - - {{-- Product Info --}} - - @if ($product['badge']) - {{ $product['badge'] }} - @endif - {{ $product['seriesName'] }} - {{ $product['name'] }} - {{ $product['color'] }} - - {{ $product['priceFormatted'] }} - @if ($product['originalPriceFormatted']) - {{ $product['originalPriceFormatted'] }} - @endif - - - - {{ $product['rating'] }} ({{ $product['reviewFormatted'] }}) - - - - - @endforeach - - - @if (count($results) === 0) - - - - No products found - Try a different search or room filter - - @endif - - - diff --git a/resources/views/native/instagram-feed.blade.php b/resources/views/native/instagram-feed.blade.php index be57e07..f24816b 100644 --- a/resources/views/native/instagram-feed.blade.php +++ b/resources/views/native/instagram-feed.blade.php @@ -1,43 +1,51 @@ -{{-- @include('native.partials.demo-nav', ['title' => 'Instagram']) --}} - {{-- Header is provided by the framework NavBar (StackLayout) — back arrow + "Instagram" title. - Action icons (heart, chat) move into navigationOptions() on the screen if needed. --}} + Action icons (heart, chat) live in navigationOptions() on the component. --}} - - + + {{-- Stories --}} - + {{-- Your Story --}} - - - Your story - - Your story + + + + Your story + + + + + + + + Your story + {{-- Other Stories — `linear-gradient` via inline style doesn't - render natively; use a chunky 4-px Instagram-pink ring + render natively; use a chunky Instagram-pink ring as a single-color approximation of the gradient. --}} @foreach ($stories as $story) - - - - {{ $story['username'] }}'s story + + + + + {{ $story['username'] }}'s story + + {{ explode('.', $story['username'])[0] }} - {{ explode('.', $story['username'])[0] }} - + @endforeach @@ -45,84 +53,94 @@ class="w-[56] h-[56] rounded-full" {{-- Posts --}} - @foreach ($posts as $index => $post) - + @foreach ($posts as $post) + {{-- Post Header --}} - {{ $post['user']['username'] }}'s profile - - - {{ $post['user']['username'] }} - @if ($post['user']['isVerified']) - + + + {{ $post['user']['username'] }}'s profile + + + + + + {{ $post['user']['username'] }} + @if ($post['user']['isVerified']) + + @endif + + @if ($post['location']) + {{ $post['location'] }} @endif - - @if ($post['location']) - {{ $post['location'] }} - @endif - - + + + {{-- Post Image --}} - Photo by {{ $post['user']['username'] }}: {{ \Illuminate\Support\Str::limit($post['caption'], 60) }} + + Photo by {{ $post['user']['username'] }}: {{ \Illuminate\Support\Str::limit($post['caption'], 60) }} + - {{-- Action Bar --}} - + {{-- Action Bar — counts sit beside their icons, reels-era style --}} + - - - - - - - + + + + {{ $post['likesFormatted'] }} + + + + + + {{ $post['commentsFormatted'] }} + + + + + {{ $post['sharesFormatted'] }} + - + - + - {{-- Likes --}} - - {{ $post['likesFormatted'] }} likes - - {{-- Caption --}} - - {{ $post['user']['username'] }} {{ $post['caption'] }} + + {{ $post['user']['username'] }} {{ $post['caption'] }} {{-- View Comments --}} @if ($post['commentCount'] > 0) - - View all {{ number_format($post['commentCount']) }} comments - + + View all {{ number_format($post['commentCount']) }} comments + @endif {{-- Time --}} - - {{ $post['time'] }} ago + + {{ $post['time'] }} ago @endforeach @@ -130,4 +148,4 @@ class="w-full h-[375]" - + diff --git a/resources/views/native/instagram-post.blade.php b/resources/views/native/instagram-post.blade.php index 0f564b4..d1b1ec3 100644 --- a/resources/views/native/instagram-post.blade.php +++ b/resources/views/native/instagram-post.blade.php @@ -1,123 +1,147 @@ - - + - {{-- Top Bar --}} - - - - - Post - + {{-- Top Bar --}} + + + + + + {{ strtoupper($post['user']['username']) }} + Posts + + + + + + + - + {{-- Post Header --}} + + + + {{ $post['user']['username'] }}'s profile + + + + + + {{ $post['user']['username'] }} + @if ($post['user']['isVerified']) + + @endif + + @if ($post['location']) + {{ $post['location'] }} + @endif + + + + - {{-- Post Header --}} - + {{-- Post Image --}} {{ $post['user']['username'] }}'s profile - - - {{ $post['user']['username'] }} - @if ($post['user']['isVerified']) - - @endif - - @if ($post['location']) - {{ $post['location'] }} - @endif - - - - {{-- Post Image --}} - Photo by {{ $post['user']['username'] }}: {{ \Illuminate\Support\Str::limit($post['caption'], 60) }} - {{-- Action Bar --}} - - - + {{-- Action Bar --}} + + + + + + {{ $likesFormatted }} + + + + + {{ count($comments) }} + + + + - - - + - - + + {{-- Caption --}} + + {{ $post['user']['username'] }} {{ $post['caption'] }} - - {{-- Likes --}} - - {{ $likesFormatted }} likes - + {{-- Time --}} + + {{ $post['time'] }} ago + - {{-- Caption --}} - - {{ $post['user']['username'] }} {{ $post['caption'] }} - + - {{-- Time --}} - - {{ $post['time'] }} ago - + {{-- Comments --}} + + @foreach ($comments as $comment) + + + {{ $comment['user']['username'] }}'s profile + + + {{ $comment['user']['username'] }} {{ $comment['text'] }} + + {{ $comment['time'] }} + {{ $comment['likes'] }} likes + Reply + + + + + @endforeach + - + - {{-- Comments --}} - - @foreach ($comments as $comment) - - {{ $comment['user']['username'] }}'s profile - - {{ $comment['user']['username'] }} {{ $comment['text'] }} - - {{ $comment['time'] }} - {{ $comment['likes'] }} likes - Reply - - - - - @endforeach + - - - {{-- Comment Input --}} - + {{-- Pinned comment composer --}} + + + {{-- Emoji quick-reactions --}} + + @foreach (['❤️', '🙌', '🔥', '👏', '😢', '😍', '😮', '😂'] as $emoji) + {{ $emoji }} + @endforeach + + Your profile - Add a comment... + + Add a comment for {{ $post['user']['username'] }}... + - - - - + + diff --git a/resources/views/native/instagram-profile.blade.php b/resources/views/native/instagram-profile.blade.php index 502190d..74d3e8a 100644 --- a/resources/views/native/instagram-profile.blade.php +++ b/resources/views/native/instagram-profile.blade.php @@ -1,32 +1,31 @@ - - + + {{-- Top Bar --}} - - - + + + - {{ $user['username'] }} + {{ $user['username'] }} @if ($user['isVerified']) @endif - + {{-- Profile Header — gradient classes don't render natively; fall back to a solid Instagram-pink ring around the avatar. --}} - {{-- Avatar — 4-px Instagram-pink ring matches the feed stories. --}} - - + + {{ $user['username'] }} @@ -35,33 +34,43 @@ class="w-[76] h-[76] rounded-full" {{-- Stats — flex-1 row so each column splits remaining width evenly. --}} - {{ $postsFormatted }} - Posts + {{ $postsFormatted }} + posts - {{ $followersFormatted }} - Followers + {{ $followersFormatted }} + followers - {{ $followingFormatted }} - Following + {{ $followingFormatted }} + following {{-- Bio --}} - {{ $user['displayName'] }} - {{ $user['bio'] }} + {{ $user['displayName'] }} + {{ $user['bio'] }} @if ($user['website']) - {{ $user['website'] }} + + + {{ $user['website'] }} + @endif {{-- Action Buttons --}} - + - + diff --git a/resources/views/native/search-post-row.blade.php b/resources/views/native/search-post-row.blade.php index d6f24c0..ba60a1d 100644 --- a/resources/views/native/search-post-row.blade.php +++ b/resources/views/native/search-post-row.blade.php @@ -1,4 +1,4 @@ - + P diff --git a/resources/views/native/skia-showcase.blade.php b/resources/views/native/skia-showcase.blade.php deleted file mode 100644 index 9b7d142..0000000 --- a/resources/views/native/skia-showcase.blade.php +++ /dev/null @@ -1,342 +0,0 @@ -@include('native.partials.demo-nav', ['title' => 'Skia Canvas']) - - - - - {{-- 1. BASIC SHAPES --}} - Basic Shapes - - - - - - - - - - {{-- 2. LINES & PATHS --}} - Lines & Paths - - - - - - - - - - {{-- 3. TEXT --}} - Text - - - - - - - - - {{-- 4. GRADIENTS --}} - Gradients - - - - - - - - - - - - - - - {{-- 5. ANIMATIONS --}} - Animations - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {{-- 6. TIMER RING --}} - Timer Ring - - @php $totalSec = $timerSeconds; @endphp - - - - - - - - - - - - - - - - - - - - - - - - - - @if($timerRunning) - - @else - - @endif - - - {{-- 7. BAR CHART --}} - Animated Bar Chart - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {{-- 8. GAUGE --}} - Gauge - - - - - - - - - - - - - - - - - - {{-- 9. PIE CHART --}} - Pie Chart - - - - - - - - - - - - - - - - - - - - - - - - - - - - {{-- 10. GROUP TRANSFORMS --}} - Group Transforms - - - - - - - - - - - - - - - - - - - - - - - - - - - {{-- 11. COLOR ANIMATION --}} - Color Animation - - - - - - - - - - - - - - - - - - - - - - - {{-- React Native Skia "Hello World" — overlapping circles with multiply blend --}} - Multiply Blend - - - - - - - - - - - {{-- Screen blend --}} - Screen Blend - - - - - - - - - - - {{-- Overlay blend --}} - Overlay Blend - - - - - - - - - - - - diff --git a/resources/views/native/spotify-artist.blade.php b/resources/views/native/spotify-artist.blade.php index 6445fa5..ba3af29 100644 --- a/resources/views/native/spotify-artist.blade.php +++ b/resources/views/native/spotify-artist.blade.php @@ -1,62 +1,77 @@ +{{-- Full-bleed artist header with the name overlaid at the bottom of + the image, like the app. Overlays use `absolute` with NON-ZERO + insets only — both stack renderers read a zero bottom/right inset + as "unset" and pin to the top/left. `shuffle` isn't in the iOS + Material→SF icon map, so shuffle affordances use `repeat`. --}} - + - {{-- Top Bar --}} - - - + {{-- Artist Image + overlaid name + floating back button --}} + + + {{ $artist['name'] }} + + + + {{ $artist['name'] }} - - {{-- Artist Image --}} - + {{-- LAST stack child so it draws (and hit-tests) on top --}} + + + + - {{-- Artist Info --}} - - {{ $artist['name'] }} + {{-- Listeners + Action Row --}} + {{ $listenersFormatted }} monthly listeners - {{-- Action Row --}} - - {{ $isFollowing ? 'Following' : 'Follow' }} - + + {{ $isFollowing ? 'Following' : 'Follow' }} + - - - - + + + + - {{-- Popular Tracks --}} - + {{-- Popular Tracks — ranked, like the app's artist page --}} + Popular @foreach ($tracksWithMeta as $trackIndex => $track) - - - {{ $trackIndex + 1 }} - - - {{ $track['title'] }} - {{ $track['playsFormatted'] }} plays - - - {{ $track['duration'] }} - - + + + + {{ $trackIndex + 1 }} + + + {{ $track['title'] }} + {{ $track['playsFormatted'] }} plays + + {{ $track['duration'] }} + + + @endforeach - + {{-- About --}} @@ -70,7 +85,7 @@ class="w-full h-[280]" - + diff --git a/resources/views/native/spotify-home.blade.php b/resources/views/native/spotify-home.blade.php index 9403084..6916ef1 100644 --- a/resources/views/native/spotify-home.blade.php +++ b/resources/views/native/spotify-home.blade.php @@ -1,34 +1,59 @@ -{{-- @include('native.partials.demo-nav', ['title' => 'Spotify']) --}} +{{-- Icon names must exist in the iOS Material→SF map + (IconHelper.swift) as well as the Android set — e.g. `shuffle` and + `notifications_none` are Android-only and render blank on iOS. --}} +{{-- Plain full-screen root (outside the NavBar stack group — see + routes/mobile.php): stack screens sit inside a NavigationStack whose + container background is the white systemBackground with no override, + which showed as a white bar in the bottom inset. As a plain screen + the root fills the window edge-to-edge, so `safe-area` pads the + content while the dark bg covers the insets. --}} + + - - - - {{-- Top Bar --}} - - Good evening - - - - - - - + {{-- Top Bar — back + filter chips + search. Chips are + flex-shrink-0 with single-line labels: when the row runs out + of width, flex shrink squeezes them and the text wraps + mid-word ("Podcast s"). Keep the item set narrow enough for + small phones. --}} + + + + + + All + + + Music + + + Podcasts + + + + + {{-- Recently Played Grid --}} - @foreach (array_chunk($recentlyPlayed, 2) as $row) + @foreach (array_chunk($recentlyPlayed, 2, true) as $chunk) - @foreach ($row as $index => $playlist) - - - {{ $playlist['name'] }} - + @foreach ($chunk as $index => $playlist) + + + {{ $playlist['name'] }} + {{ $playlist['name'] }} + + @endforeach + @if (count($chunk) === 1) + + @endif @endforeach @@ -40,59 +65,68 @@ class="w-[56] h-[56] rounded-l" @foreach ($madeForYou as $index => $playlist) - - - {{ $playlist['description'] }} - + + + {{ $playlist['name'] }} + {{ $playlist['description'] }} + + @endforeach {{-- Popular Artists --}} - + Popular artists @foreach ($artists as $artistIndex => $artist) - - - {{ $artist['name'] }} - Artist - + + + {{ $artist['name'] }} + {{ $artist['name'] }} + Artist + + @endforeach {{-- Your Top Mixes --}} - + Your top mixes @foreach (array_slice($recentlyPlayed, 0, 4) as $pIndex => $playlist) - - - {{ $playlist['name'] }} - {{ $playlist['creator'] }} - + + + {{ $playlist['name'] }} + {{ $playlist['name'] }} + {{ $playlist['creator'] }} + + @endforeach - + diff --git a/resources/views/native/spotify-playlist.blade.php b/resources/views/native/spotify-playlist.blade.php index 0b87ba7..e6e7c9e 100644 --- a/resources/views/native/spotify-playlist.blade.php +++ b/resources/views/native/spotify-playlist.blade.php @@ -1,9 +1,12 @@ +{{-- Icon names must exist in the iOS Material→SF map + (IconHelper.swift) as well as the Android set — `shuffle` is + Android-only, so shuffle affordances use the mapped `repeat`. --}} - + {{-- Top Bar --}} - + @@ -12,56 +15,59 @@ {{ $playlist['name'] }} {{-- Playlist Info --}} - {{ $playlist['name'] }} + {{ $playlist['name'] }} {{ $playlist['description'] }} - - {{ $playlist['creator'] }} - · {{ $playlist['trackCount'] }} songs + + + + {{ $playlist['creator'] }} + {{ $playlist['trackCount'] }} songs {{-- Action Row --}} - + + - - - - - + + + + + - {{-- Track List --}} + {{-- Track List — title/artist flex, like the app (no numbers on + playlist pages) --}} @foreach ($tracksWithMeta as $trackIndex => $track) - - - {{ $trackIndex + 1 }} - - - {{ $track['title'] }} - {{ $track['artistName'] }} · {{ $track['playsFormatted'] }} plays - - - {{ $track['duration'] }} - - + + + + {{ $track['title'] }} + {{ $track['artistName'] }} · {{ $track['playsFormatted'] }} plays + + {{ $track['duration'] }} + + + @endforeach - + diff --git a/resources/views/native/spotify-search.blade.php b/resources/views/native/spotify-search.blade.php index d206054..b71fc3f 100644 --- a/resources/views/native/spotify-search.blade.php +++ b/resources/views/native/spotify-search.blade.php @@ -1,42 +1,43 @@ - + {{-- Top Bar --}} - - - - - - Search - + + + + + Search {{-- Search Bar --}} - + What do you want to listen to? - {{-- Top Genres --}} + {{-- Browse all — flexed 2-up colored genre cards --}} Browse all - - @foreach (array_chunk(array_keys($genres), 2) as $row) - - @foreach ($row as $genreName) - + + @foreach (array_chunk(array_keys($genres), 2) as $chunk) + + @foreach ($chunk as $genreName) + {{ $genreName }} @endforeach + @if (count($chunk) === 1) + + @endif @endforeach - {{-- Top Results / Popular --}} + {{-- Popular playlists --}} Popular playlists @@ -44,14 +45,17 @@ @foreach (array_slice($playlists, 0, 4) as $pIndex => $playlist) - - - {{ $playlist['name'] }} - + + + {{ $playlist['name'] }} + {{ $playlist['name'] }} + + @endforeach @@ -63,21 +67,25 @@ class="w-[140] h-[140] rounded" @foreach (array_slice($artists, 0, 4) as $aIndex => $artist) - - - - {{ $artist['name'] }} - Artist · {{ $artist['genre'] }} - - + + + {{ $artist['name'] }} + + {{ $artist['name'] }} + Artist · {{ $artist['genre'] }} + + + + @endforeach - + diff --git a/resources/views/native/stack-positioning-demo.blade.php b/resources/views/native/stack-positioning-demo.blade.php new file mode 100644 index 0000000..9c07edd --- /dev/null +++ b/resources/views/native/stack-positioning-demo.blade.php @@ -0,0 +1,406 @@ +@php + // Outline colour for the container being measured, and for the anchored child. + $box = $showBounds ? 'border border-red-500' : ''; + $chip = $showBounds ? 'border border-blue-500' : ''; +@endphp + + + + + + Stack & Positioning + + Red outline = the container's measured box. Blue = the anchored child. + Compare iOS and Android side by side — sections marked ⚠️ are expected to differ today. + + + + + @if($show === [] || in_array(1, $show, true)) + {{-- ───────────────────────────────────────────────────────────── + 1. Stack sizing — does a bare stack wrap its largest child? + This is the headline claim: "the stack sizes to its largest + child (ZStack/wrap-content), so no explicit size is needed." + + iOS `sizeThatFits` does `width: proposal.width ?? maxWidth`. + A column parent proposes (width: crossAvail, height: nil), so + width is FINITE and the union is discarded → the stack fills + the column's width. Height has a nil proposal, so it wraps. + Android's Box carries no size modifier in WRAP mode → wraps + on BOTH axes. + + Expected on device: the red outline hugs the text on Android + and spans the full width on iOS. + ───────────────────────────────────────────────────────────────── --}} + + 1. Stack sizing — wrap vs fill ⚠️ + + A bare stack with one child. If wrap-content holds, the red box hugs the text. + + + + Pinkary + + + + The README example — a dot anchored to the wordmark's top-right corner, + drawing half outside it. If the stack fills instead of wrapping, the dot + lands at the far right of the screen rather than on the letter "y". + + + + Pinkary + + + + Same stack, but given an explicit size — should fill regardless. + + + Pinkary + + + + + @endif + + @if($show === [] || in_array(2, $show, true)) + {{-- ───────────────────────────────────────────────────────────── + 2. Attribute ↔ class parity. All three rows must be identical. + NOTE: the short attribute spellings are read by + buildLayoutArray(), which only runs for the six builtin + streaming types (column/row/stack/scroll_view/pressable/canvas). + The row below therefore does NOT position — it's here + deliberately to show the gap. + ───────────────────────────────────────────────────────────────── --}} + + 2. Attribute ↔ class parity + Three spellings of the same thing — the blue chips must land identically. + + + + + + + + + + + + + + class="absolute top-0 right-0" + absolute top="0" right="0" + position="absolute" :top :right + + + + ⚠️ Same short attributes on a non-container element. `applyLayout()` (the Element + path) never learned them, so this one does NOT move — it should sit top-left. + + + text absolute + + + + @endif + + @if($show === [] || in_array(3, $show, true)) + {{-- ───────────────────────────────────────────────────────────── + 3. All nine anchors, origin defaulting to center. + The child's CENTRE lands on the parent's anchor point, so + every chip draws half outside the box. That's intended. + ───────────────────────────────────────────────────────────────── --}} + + 3. Nine anchors (origin = center) + + Child centre pinned to the parent point, so each chip straddles the edge. + + + @foreach($this->pointRows() as $rowIndex => $row) + + @foreach($row as $point) + + + + + {{ $point['name'] }} ({{ $point['enum'] }}) + + @endforeach + + @endforeach + + + @endif + + @if($show === [] || in_array(4, $show, true)) + {{-- ───────────────────────────────────────────────────────────── + 4. All nine origins with the anchor pinned to center. The chip + pivots around the parent's centre point. + ───────────────────────────────────────────────────────────────── --}} + + 4. Nine origins (anchor = center) + + Which point ON THE CHILD lands on the parent's centre. origin="top-left" + pushes the chip down-right; origin="bottom-right" pushes it up-left. + + + @foreach($this->pointRows() as $rowIndex => $row) + + @foreach($row as $point) + + + + + {{ $point['name'] }} + + @endforeach + + @endforeach + + + @endif + + @if($show === [] || in_array(5, $show, true)) + {{-- ───────────────────────────────────────────────────────────── + 5. The two-point combos that motivate the feature — a badge + hooked onto a corner three different ways. + ───────────────────────────────────────────────────────────────── --}} + + 5. Two-point badge combos + Same anchor (top-right), three different origins. + + + + + + + origin=top-right + fully inside + + + + + + origin=center + half outside (default) + + + + + + origin=bottom-left + fully outside + + + + + @endif + + @if($show === [] || in_array(6, $show, true)) + {{-- ───────────────────────────────────────────────────────────── + 6. Utility-class form must equal the attribute form. + ───────────────────────────────────────────────────────────────── --}} + + 6. anchor-* / origin-* classes + Class form vs attribute form — these two must be identical. + + + + + + + classes + + + + + + attributes + + + + + + mixed + + + + + @endif + + @if($show === [] || in_array(7, $show, true)) + {{-- ───────────────────────────────────────────────────────────── + 7. Insets as a nudge on top of the anchor. + + iOS placeAbsolute (two-point branch): x += left - right + Android stack: offsetX = if (right > 0) -right else left + + Identical when only one side is set. They diverge when BOTH + are set (iOS +6, Android −4 from centre) and on a negative + `right` (iOS shifts +6, Android ignores it entirely). + ───────────────────────────────────────────────────────────────── --}} + + 7. Inset nudge on an anchor ⚠️ + + Anchor is center for all four. The last two are where iOS and Android disagree. + + + + + + + + left=10 + agree + + + + + + right=4 + agree + + + + + + left=10 right=4 + iOS +6 / Android −4 + + + + + + right=-6 + iOS +6 / Android 0 + + + + + @endif + + @if($show === [] || in_array(8, $show, true)) + {{-- ───────────────────────────────────────────────────────────── + 8. Regression guard — a NON-stack container with absolute + children and no anchor/origin must keep the legacy + inset-corner behaviour byte for byte. The fourth chip opts + into the two-point model from inside a non-stack parent. + ───────────────────────────────────────────────────────────────── --}} + + 8. Legacy absolute (non-stack) — unchanged + + No anchor/origin anywhere, so these keep the historical corner logic. + + + + + + + + + + + Opting in from a non-stack parent — this one should centre, not corner. + + + + + + + @endif + + @if($show === [] || in_array(9, $show, true)) + {{-- ───────────────────────────────────────────────────────────── + 9. z-order should follow document order — first child at the + back. Offsets are staggered so the overlap is visible. + ───────────────────────────────────────────────────────────────── --}} + + 9. z-order = document order + Red is first in the markup, so it should be at the back; blue on top. + + + + + + + + + @endif + + @if($show === [] || in_array(10, $show, true)) + {{-- ───────────────────────────────────────────────────────────── + 10. A misspelt anchor resolves to null and the prop is dropped + silently, so the child falls back to centre. Both chips below + should look the same — which is exactly the problem. + ───────────────────────────────────────────────────────────────── --}} + + 10. Unknown anchor name ⚠️ + + A typo is dropped silently and centres. These two are indistinguishable at runtime. + + + + + + + + anchor="top-rigth" (typo) + + + + + + anchor="center" + + + + + @endif + + @if($show === [] || in_array(11, $show, true)) + {{-- Diagnostic: isolate WHY anchors centre inside a stack. --}} + + 11. Diagnostic + All four ask for top-right. Which ones obey? + + + + + + + A stack+anchor + + + + + + B stack+abs+anchor + + + + + + C col+abs+anchor + + + + + + D stack+legacy + + + + Two flow children, no anchor — does the stack overlay them? + + Pinkary + XX + + + + @endif + + + + diff --git a/resources/views/native/syncup-native/chat.blade.php b/resources/views/native/syncup-native/chat.blade.php index bd3c158..42f826f 100644 --- a/resources/views/native/syncup-native/chat.blade.php +++ b/resources/views/native/syncup-native/chat.blade.php @@ -113,7 +113,7 @@ class="glass:interactive android:dark:bg-white text-slate-700 rounded-full p-1 i @else - @@ -124,7 +124,7 @@ class="glass:interactive android:dark:bg-white text-slate-700 rounded-full p-1 {{-- More-actions modal — opened by the NavBar ellipsis. Dismissible. --}} - + @@ -137,7 +137,7 @@ class="text-[12] text-theme-on-surface-variant">{{ $isMuted ? 'You will hear not - + @@ -149,7 +149,7 @@ class="text-[12] text-theme-on-surface-variant">{{ $isMuted ? 'You will hear not - + Cancel @@ -165,11 +165,11 @@ class="text-[12] text-theme-on-surface-variant">{{ $isMuted ? 'You will hear not There's no undo. - Cancel - Delete diff --git a/resources/views/native/syncup/chat.blade.php b/resources/views/native/syncup/chat.blade.php deleted file mode 100644 index e021e40..0000000 --- a/resources/views/native/syncup/chat.blade.php +++ /dev/null @@ -1,120 +0,0 @@ - - - {{-- Message thread --}} - - - - {{-- Date divider --}} - - - TODAY - - - - {{-- Messages --}} - @foreach ($messages as $m) - @if ($m['fromMe']) - {{-- Outgoing — primary bubble, right-aligned --}} - - - {{ $m['text'] }} - - {{ $m['time'] }} - @if (($m['status'] ?? null) === 'read') - - @elseif (($m['status'] ?? null) === 'sent') - - @endif - - - - @else - {{-- Incoming — light gray bubble, left-aligned --}} - - - @if (! empty($m['imageUrl'])) - - @endif - {{ $m['text'] }} - - {{ $m['time'] }} - - - - @endif - @endforeach - - {{-- Typing indicator --}} - - - - - - - - - - - - - - - - {{-- More-actions modal — opened by the NavBar ellipsis. Dismissible - (tap backdrop to close). --}} - - - - - - - {{ $isMuted ? 'Unmute notifications' : 'Mute notifications' }} - {{ $isMuted ? 'You will hear notifications again.' : 'No banners or sounds for this chat.' }} - - - - - - - - - Clear history - Removes every message in this chat. Cannot be undone. - - - - - - - Cancel - - - - - - {{-- Blocking clear-history confirmation. dismissible=false so the user - must explicitly choose. --}} - - - Clear chat history? - This permanently deletes the message thread. There's no undo. - - - Cancel - - - Delete - - - - - - diff --git a/resources/views/native/syncup/chats.blade.php b/resources/views/native/syncup/chats.blade.php index 97065d8..d88bee2 100644 --- a/resources/views/native/syncup/chats.blade.php +++ b/resources/views/native/syncup/chats.blade.php @@ -21,7 +21,7 @@ class="flex-1 bg-white" @foreach ($filters as $name) @php $active = $activeFilter === $name; @endphp {{ $name }} @@ -42,7 +42,7 @@ class="px-5 py-2 rounded-full {{ $active ? 'bg-[#00b4d8]' : 'bg-theme-surface-va keep per-row state (any pending swipe, animations, focus) attached to the right chat instead of bleeding to whatever chat happens to occupy the same screen position next frame. --}} - + {{-- Avatar (or group icon) with status dot --}} @if ($row['isGroup']) @@ -99,7 +99,7 @@ class="px-5 py-2 rounded-full {{ $active ? 'bg-[#00b4d8]' : 'bg-theme-surface-va {{ $s['name'] }} - + Add @@ -114,7 +114,7 @@ class="px-5 py-2 rounded-full {{ $active ? 'bg-[#00b4d8]' : 'bg-theme-surface-va {{-- Floating Action Button — absolutely positioned at the bottom-right of the screen content. The absolute child only occupies its placed (56x56) bounds, so it overlays without blocking scroll touches. --}} - @@ -131,7 +131,7 @@ class="absolute bottom-[20] right-[20] w-[56] h-[56] rounded-full shadow-xl bg-c @foreach ($friends as $f) - + @if ($f['status'] === 'online') diff --git a/resources/views/native/syncup/friends.blade.php b/resources/views/native/syncup/friends.blade.php index f1c85ad..4f9912d 100644 --- a/resources/views/native/syncup/friends.blade.php +++ b/resources/views/native/syncup/friends.blade.php @@ -8,7 +8,7 @@ {{-- Top row: QR + Find by ID --}} {{-- QR Code card --}} - + @@ -16,7 +16,7 @@ {{-- Find by ID card --}} - + @@ -35,7 +35,7 @@ syncup.me/u/johndoe - + Copy @@ -65,7 +65,7 @@ {{ $f['statusText'] }} - + @@ -85,7 +85,7 @@ {{ $s['name'] }} {{ $s['mutuals'] }} mutual friends - + Add diff --git a/resources/views/native/syncup/login.blade.php b/resources/views/native/syncup/login.blade.php index 746cc39..d90b365 100644 --- a/resources/views/native/syncup/login.blade.php +++ b/resources/views/native/syncup/login.blade.php @@ -32,7 +32,7 @@ class="flex-1" Password - Forgot? + Forgot? @@ -44,14 +44,14 @@ class="flex-1" :variant="0" class="flex-1" /> - + {{-- Login button --}} - + Login @@ -64,10 +64,10 @@ class="flex-1" {{-- Social buttons --}} - + Google - + Apple @@ -77,11 +77,11 @@ class="flex-1" Don't have an account? - Create Account + Create Account {{-- Demo-only: skip past login and jump straight into the app. --}} - Skip login → + Skip login → Privacy Policy diff --git a/resources/views/native/syncup/profile.blade.php b/resources/views/native/syncup/profile.blade.php index 971bdf2..ea3d464 100644 --- a/resources/views/native/syncup/profile.blade.php +++ b/resources/views/native/syncup/profile.blade.php @@ -12,7 +12,7 @@ {{-- Camera FAB pinned bottom-right --}} - + @@ -66,7 +66,7 @@ class="w-full" {{-- Share Link primary --}} - + Share Link @@ -81,19 +81,19 @@ class="w-full" {{-- Copy field --}} syncup.me/elena_rod - + {{-- Save button --}} - + {{ $saved ? 'Saved ✓' : 'Save Changes' }} {{-- Sign out --}} - + Sign out diff --git a/resources/views/native/test-layout.blade.php b/resources/views/native/test-layout.blade.php deleted file mode 100644 index b15958a..0000000 --- a/resources/views/native/test-layout.blade.php +++ /dev/null @@ -1,21 +0,0 @@ - - - Main area - - - - - - - - - - - diff --git a/resources/views/native/testing.blade.php b/resources/views/native/testing.blade.php deleted file mode 100644 index e572f1a..0000000 --- a/resources/views/native/testing.blade.php +++ /dev/null @@ -1,3 +0,0 @@ - - Testing - \ No newline at end of file diff --git a/resources/views/native/theme-lab.blade.php b/resources/views/native/theme-lab.blade.php new file mode 100644 index 0000000..6610bba --- /dev/null +++ b/resources/views/native/theme-lab.blade.php @@ -0,0 +1,134 @@ +@use('App\Icons\Ios') +@use('App\Icons\Android') + + + + + + {{-- ── Hero ────────────────────────────────────────────── --}} + + THEME LAB + + One config file drives every color, radius, and typeface on this screen. + Flip system dark mode right now — every token re-resolves live. + + + + {{-- ── Interactivity proof ─────────────────────────────── --}} + + Button presses recorded + + {{ $presses }} + + + {{-- ── Theme token swatches ────────────────────────────── --}} + Theme Tokens + + @foreach ($this->swatchTokens() as $token => $label) + + {{ $label }} + + bg-theme-{{ $token }} + + @endforeach + + + {{-- ── Outline vs outline-variant ──────────────────────── --}} + Outline vs Outline-Variant + + + outline + Field & card borders + + + outline-variant + Hairline seams + + + + {{-- ── Opacity modifiers on theme classes ──────────────── --}} + Opacity Ramps + + + @foreach ($this->opacitySteps() as $step) + + /{{ $step }} + + @endforeach + + + @foreach ($this->opacitySteps() as $step) + + /{{ $step }} + + @endforeach + + + bg-theme-primary/N and bg-theme-success/N — tonal fills straight from the tokens, + dark companions included. + + + + {{-- ── Button variants (incl. success) ─────────────────── --}} + Button Variants + + @foreach ($this->buttonVariants() as $buttonVariant) + + variant="{{ $buttonVariant }}" + + @endforeach + + success + disabled + + + success + glass:prominent (iOS 26) + + + + {{-- ── Badge variants (incl. success) ──────────────────── --}} + Badge Variants + + @foreach ($this->badgeVariants() as $badgeVariant) + + + + + @endforeach + + + {{-- ── Status pattern from the success token ───────────── --}} + Status Patterns + + + + ALL SYSTEMS GO + + + text-theme-success + status bar + + + + + LIVE + + + + + {{-- ── Font aliases ────────────────────────────────────── --}} + Font Aliases + + @foreach ($this->fontSamples() as $alias => $sample) + + font="{{ $alias }}" + {{ $sample }} + + @endforeach + + Semantic names from config/native-ui.php — swap a typeface app-wide with a one-line change. + + + + + diff --git a/resources/views/native/tweet-detail.blade.php b/resources/views/native/tweet-detail.blade.php index f9c613e..00b065d 100644 --- a/resources/views/native/tweet-detail.blade.php +++ b/resources/views/native/tweet-detail.blade.php @@ -1,136 +1,174 @@ - - + - {{-- Top Bar --}} - - - - - Post - - - - - {{-- Author Info --}} - - {{ $tweet['user']['name'] }}'s profile - - - {{ $tweet['user']['name'] }} - @if ($tweet['user']['isVerified']) - - @endif - - {{ $tweet['user']['handle'] }} - - + {{-- Top Bar --}} + + + + + Post + - {{-- Tweet Text --}} - - {{ $tweet['text'] }} - + - {{-- Optional Image --}} - @if ($tweet['imageUrl']) - - Photo by {{ $tweet['user']['name'] }} - - @endif + + - {{-- Timestamp --}} - - {{ $tweet['time'] }} ago - - - - - {{-- Engagement Stats --}} - - - {{ $retweetFormatted }} - Reposts - - - {{ $likeFormatted }} - Likes + {{-- Author Info --}} + + + {{ $tweet['user']['name'] }}'s profile + + + + + {{ $tweet['user']['name'] }} + @if ($tweet['user']['isVerified']) + + @endif + + {{ $tweet['user']['handle'] }} + + + - - - - {{-- Action Bar --}} - - - - - - - + {{-- Tweet Text --}} + + {{ $tweet['text'] }} - - - - - - {{-- Replies --}} - @foreach ($replies as $reply) - - - {{-- Reply Avatar --}} + {{-- Optional Image --}} + @if ($tweet['imageUrl']) + {{ $reply['user']['name'] }}'s profile + + @endif + + {{-- Timestamp + Views --}} + + {{ $tweet['time'] }} ago + · + {{ $viewFormatted }} + Views + - {{-- Reply Content --}} - - - {{ $reply['user']['name'] }} - @if ($reply['user']['isVerified']) - - @endif - {{ $reply['user']['handle'] }} - · {{ $reply['time'] }} - + + + {{-- Engagement Stats --}} + + + {{ $retweetFormatted }} + Reposts + + + {{ $likeFormatted }} + Likes + + + {{ $bookmarkFormatted }} + Bookmarks + + + + + + {{-- Action Bar --}} + + + + + + + + + + + + + - {{ $reply['text'] }} + + + {{-- Replies --}} + @foreach ($replies as $reply) + + + + {{ $reply['user']['name'] }}'s profile + + + + + {{ $reply['user']['name'] }} + @if ($reply['user']['isVerified']) + + @endif + {{ $reply['user']['handle'] }} · {{ $reply['time'] }} + - {{-- Reply Actions --}} - - - - - {{ $reply['likeFormatted'] }} + Replying to + {{ $tweet['user']['handle'] }} - - - - - - - @endforeach - + {{ $reply['text'] }} + + {{-- Reply Actions --}} + + + + + + {{ $reply['likeFormatted'] }} + + + + + + + + @endforeach + + + + + + + {{-- Pinned reply composer --}} + + + Your profile + + Post your reply + + - - + diff --git a/resources/views/native/twitter-feed.blade.php b/resources/views/native/twitter-feed.blade.php index 482d3be..13e69ba 100644 --- a/resources/views/native/twitter-feed.blade.php +++ b/resources/views/native/twitter-feed.blade.php @@ -1,99 +1,118 @@ -{{--@include('native.partials.demo-nav', ['title' => 'Twitter / X'])--}} + - - + + - {{-- Top Bar --}} - - Your profile - 𝕏 - - - - + {{-- Top Bar --}} + + Your profile + 𝕏 + + + + - {{-- Tab Row --}} - - - - + {{-- Tab Row --}} + + + + - + - {{-- Tweet Feed --}} - @foreach ($tweets as $index => $tweet) - - - {{-- Avatar --}} - {{ $tweet['user']['name'] }}'s profile - - {{-- Tweet Content --}} - - {{-- Name Row --}} - - {{ $tweet['user']['name'] }} - @if ($tweet['user']['isVerified']) - - @endif - {{ $tweet['user']['handle'] }} - · {{ $tweet['time'] }} - - - {{-- Tweet Text --}} - {{ $tweet['text'] }} - - {{-- Optional Image --}} - @if ($tweet['imageUrl']) + {{-- Tweet Feed --}} + @foreach ($tweets as $tweet) + + + {{-- Avatar --}} + Photo by {{ $tweet['user']['name'] }} - @endif + - {{-- Action Bar --}} - - {{-- Reply --}} - - - {{ $tweet['replyFormatted'] }} - - {{-- Retweet --}} - - - {{ $tweet['retweetFormatted'] }} - - {{-- Like --}} - - - {{ $tweet['likeFormatted'] }} + {{-- Tweet Content --}} + + + + {{-- Name Row --}} + + {{ $tweet['user']['name'] }} + @if ($tweet['user']['isVerified']) + + @endif + {{ $tweet['user']['handle'] }} · {{ $tweet['time'] }} + + + + + {{-- Tweet Text --}} + {{ $tweet['text'] }} + + {{-- Optional Image --}} + @if ($tweet['imageUrl']) + Photo by {{ $tweet['user']['name'] }} + @endif + + + + {{-- Action Bar --}} + + {{-- Reply --}} + + + {{ $tweet['replyFormatted'] }} + + {{-- Repost --}} + + + {{ $tweet['retweetFormatted'] }} + + {{-- Like --}} + + + {{ $tweet['likeFormatted'] }} + + {{-- Views --}} + + + {{ $tweet['viewFormatted'] }} + + {{-- Share --}} + - {{-- Share --}} - - - - - - - @endforeach + + + + + @endforeach + + + + + - + {{-- Compose FAB — `absolute` insets, not stack anchor/origin props, + which the current runtime drops (see StackPositioningDemoTest). --}} + + + - - + diff --git a/resources/views/native/twitter-profile.blade.php b/resources/views/native/twitter-profile.blade.php index 43a3067..f345755 100644 --- a/resources/views/native/twitter-profile.blade.php +++ b/resources/views/native/twitter-profile.blade.php @@ -1,66 +1,87 @@ - {{-- Top Bar --}} - - - - - - {{ $user['name'] }} - {{ count($tweetsWithMeta) }} posts - - - - {{-- Banner + Avatar Overlap --}} + {{-- Banner + floating back button + overlapping avatar. + `absolute` insets, not stack anchor/origin props, which the + current runtime drops (see StackPositioningDemoTest). Both + stack renderers only anchor to the bottom/right edges when + that inset is NON-ZERO (`bottom-0` reads as "unset" and pins + to the top), and zero opposing insets don't stretch — so + layers anchor from the top with computed offsets and size + themselves explicitly. --}} - {{-- Banner layer --}} + {{-- Banner layer — sizes the stack: 150 banner + 44 breathing room --}} {{ $user['name'] }}'s banner - + {{-- flex-grow-0: spacer defaults to flex_grow=1, and the + flex measurer sizes ANY grow child at 0 under the + indefinite proposal a stack measures its layers with — + the fixed height only sticks on a non-grow child. --}} + - {{-- Avatar layer --}} - - - + + {{-- Avatar + follow row: 82 tall (74 avatar + 4 ring pad each + side), top inset 112 = 194 stack − 82 row → flush with the + stack bottom. --}} + + {{ $user['name'] }} -