diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..41df62b --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,45 @@ +name: tests + +on: + push: + branches: [main] + pull_request: + +permissions: {} + +jobs: + tests: + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + contents: read + + steps: + - name: Checkout code + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + + - name: Setup PHP + uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # v2.37.2 + with: + php-version: '8.4' + extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, bcmath, intl + coverage: none + tools: composer:v2 + + - name: Install Composer dependencies + uses: ramsey/composer-install@65e4f84970763564f46a70b8a54b90d033b3bdda # v4.0.0 + + - name: Prepare application + run: | + cp .env.example .env + php artisan key:generate + touch database/database.sqlite + php artisan migrate --force --no-interaction + + - name: Check code style + run: vendor/bin/pint --test + + - name: Run tests + run: php artisan test diff --git a/app/NativeComponents/Home.php b/app/NativeComponents/Home.php index 8895e1c..af2b2f0 100644 --- a/app/NativeComponents/Home.php +++ b/app/NativeComponents/Home.php @@ -29,6 +29,11 @@ public function mount(): void $this->status = 'error'; } + public function navTitle(): string + { + return 'He4rt'; + } + public function render(): View { return view('native.home'); diff --git a/composer.json b/composer.json index cf62d6d..d24cac4 100644 --- a/composer.json +++ b/composer.json @@ -23,9 +23,9 @@ "laravel/boost": "^2.0", "laravel/framework": "^13.0", "laravel/tinker": "^3.0", - "nativephp/mobile": "^4.0", + "nativephp/mobile": "^4.4", "nativephp/mobile-browser": "^1.0", - "nativephp/mobile-ui": "^0.3" + "nativephp/mobile-ui": "^0.4.0" }, "require-dev": { "fakerphp/faker": "^1.23", @@ -96,4 +96,4 @@ }, "minimum-stability": "stable", "prefer-stable": true -} \ No newline at end of file +} diff --git a/composer.lock b/composer.lock index eededc9..97ef889 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": "49a0095d483f1bb4275a375e26a31178", + "content-hash": "9df975a4d2d8879f3dae3b9b91637816", "packages": [ { "name": "bacon/bacon-qr-code", @@ -63,23 +63,24 @@ }, { "name": "brick/math", - "version": "0.18.0", + "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "82944324d1c1bdb2c2618e89978d4e2ad78d69ad" + "reference": "2effe05d2177c451b86c6a073196a4034c02f211" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/82944324d1c1bdb2c2618e89978d4e2ad78d69ad", - "reference": "82944324d1c1bdb2c2618e89978d4e2ad78d69ad", + "url": "https://api.github.com/repos/brick/math/zipball/2effe05d2177c451b86c6a073196a4034c02f211", + "reference": "2effe05d2177c451b86c6a073196a4034c02f211", "shasum": "" }, "require": { "php": "^8.2" }, "require-dev": { - "phpstan/phpstan": "2.1.22", + "phpstan/phpstan": "2.2.13", + "phpstan/phpstan-phpunit": "2.0.18", "phpunit/phpunit": "^11.5" }, "type": "library", @@ -110,7 +111,7 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.18.0" + "source": "https://github.com/brick/math/tree/1.0.0" }, "funding": [ { @@ -118,20 +119,20 @@ "type": "github" } ], - "time": "2026-06-14T18:21:03+00:00" + "time": "2026-09-12T10:28:18+00:00" }, { "name": "carbonphp/carbon-doctrine-types", - "version": "3.2.0", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", - "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d" + "reference": "5fa5eacafd9ef47c8c6ab9143fc901ba0194d3dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d", - "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/5fa5eacafd9ef47c8c6ab9143fc901ba0194d3dc", + "reference": "5fa5eacafd9ef47c8c6ab9143fc901ba0194d3dc", "shasum": "" }, "require": { @@ -146,6 +147,11 @@ "phpunit/phpunit": "^10.3" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, "autoload": { "psr-4": { "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" @@ -171,7 +177,7 @@ ], "support": { "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", - "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.1" }, "funding": [ { @@ -187,7 +193,7 @@ "type": "tidelift" } ], - "time": "2024-02-09T16:56:22+00:00" + "time": "2026-09-06T14:11:38+00:00" }, { "name": "composer/semver", @@ -483,27 +489,25 @@ }, { "name": "doctrine/lexer", - "version": "3.0.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + "reference": "e96fe45e92a54233726014a7cc7340abf29bb14c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", - "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/e96fe45e92a54233726014a7cc7340abf29bb14c", + "reference": "e96fe45e92a54233726014a7cc7340abf29bb14c", "shasum": "" }, "require": { "php": "^8.1" }, "require-dev": { - "doctrine/coding-standard": "^12", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.5", - "psalm/plugin-phpunit": "^0.18.3", - "vimeo/psalm": "^5.21" + "doctrine/coding-standard": "^14", + "phpstan/phpstan": "^2", + "phpunit/phpunit": "^10.5.58 || ^12.5.4" }, "type": "library", "autoload": { @@ -540,7 +544,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/3.0.1" + "source": "https://github.com/doctrine/lexer/tree/3.0.2" }, "funding": [ { @@ -556,7 +560,7 @@ "type": "tidelift" } ], - "time": "2024-02-05T11:56:58+00:00" + "time": "2026-06-14T20:44:06+00:00" }, { "name": "dragonmantank/cron-expression", @@ -943,26 +947,27 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.15.5", + "version": "8.2.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "ee80339fd9177ba44c49cdb653ff02a4d1106b9a" + "reference": "93939470950a9b11e2e84204166ef5e048c55fe4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/ee80339fd9177ba44c49cdb653ff02a4d1106b9a", - "reference": "ee80339fd9177ba44c49cdb653ff02a4d1106b9a", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/93939470950a9b11e2e84204166ef5e048c55fe4", + "reference": "93939470950a9b11e2e84204166ef5e048c55fe4", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^2.5.3", - "guzzlehttp/psr7": "^2.13.1", - "php": "^7.2.5 || ^8.0", + "guzzlehttp/promises": "^3.0.2", + "guzzlehttp/psr7": "^3.1", + "php": "^7.4 || ^8.0", "psr/http-client": "^1.0", - "symfony/deprecation-contracts": "^2.5 || ^3.0", - "symfony/polyfill-php80": "^1.25" + "psr/http-factory": "^1.0", + "symfony/polyfill-php80": "^1.25", + "symfony/polyfill-php82": "^1.27" }, "provide": { "psr/http-client-implementation": "1.0" @@ -970,10 +975,10 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", - "guzzle/client-integration-tests": "3.0.3", - "guzzlehttp/test-server": "^0.7", + "guzzle/client-integration-tests": "4.0.1", + "guzzlehttp/test-server": "^1.0.1", "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.52 || ^9.6.34", + "phpunit/phpunit": "^9.6.34", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -989,9 +994,6 @@ } }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { "GuzzleHttp\\": "src/" } @@ -1051,7 +1053,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.15.5" + "source": "https://github.com/guzzle/guzzle/tree/8.2.0" }, "funding": [ { @@ -1067,29 +1069,28 @@ "type": "tidelift" } ], - "time": "2026-08-24T09:21:06+00:00" + "time": "2026-09-06T13:55:09+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.5.3", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "cde49999552d185d64715fe9c1f77a2aadd2f9f1" + "reference": "42118e66a53c492effaf92bc357e931985d5c6f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/cde49999552d185d64715fe9c1f77a2aadd2f9f1", - "reference": "cde49999552d185d64715fe9c1f77a2aadd2f9f1", + "url": "https://api.github.com/repos/guzzle/promises/zipball/42118e66a53c492effaf92bc357e931985d5c6f9", + "reference": "42118e66a53c492effaf92bc357e931985d5c6f9", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0", - "symfony/deprecation-contracts": "^2.5 || ^3.0" + "php": "^7.4 || ^8.0" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.52 || ^9.6.34" + "phpunit/phpunit": "^9.6.34" }, "type": "library", "extra": { @@ -1135,7 +1136,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.5.3" + "source": "https://github.com/guzzle/promises/tree/3.0.2" }, "funding": [ { @@ -1151,39 +1152,39 @@ "type": "tidelift" } ], - "time": "2026-08-24T09:11:28+00:00" + "time": "2026-08-24T10:00:26+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.13.1", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "95e7828100de18b4e269fb1703be530082d5166d" + "reference": "a3059ba1a84c9139c4ae03cf0f45bea276c97c74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/95e7828100de18b4e269fb1703be530082d5166d", - "reference": "95e7828100de18b4e269fb1703be530082d5166d", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a3059ba1a84c9139c4ae03cf0f45bea276c97c74", + "reference": "a3059ba1a84c9139c4ae03cf0f45bea276c97c74", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.1 || ^2.0", - "ralouphie/getallheaders": "^3.0", - "symfony/deprecation-contracts": "^2.5 || ^3.0", - "symfony/polyfill-php80": "^1.25" + "php": "^7.4 || ^8.0", + "psr/http-factory": "^1.1", + "psr/http-message": "^2.0", + "symfony/polyfill-php80": "^1.25", + "symfony/polyfill-php82": "^1.27" }, "provide": { - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" + "psr/http-factory-implementation": "1.1", + "psr/http-message-implementation": "2.0" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "1.1.0", "jshttp/mime-db": "1.54.0.1", - "phpunit/phpunit": "^8.5.52 || ^9.6.34" + "php-http/psr7-integration-tests": "^1.5.1", + "phpunit/phpunit": "^9.6.34" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -1254,7 +1255,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.13.1" + "source": "https://github.com/guzzle/psr7/tree/3.1.0" }, "funding": [ { @@ -1270,7 +1271,7 @@ "type": "tidelift" } ], - "time": "2026-08-24T09:13:11+00:00" + "time": "2026-08-24T11:02:13+00:00" }, { "name": "guzzlehttp/uri-template", @@ -1426,20 +1427,20 @@ }, { "name": "laravel/framework", - "version": "v13.29.0", + "version": "v13.33.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "6e2c363716964d8238cee7097b258119a984f0cf" + "reference": "91188a17ceaa3dbace6e8a5f7abd0d042e466359" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/6e2c363716964d8238cee7097b258119a984f0cf", - "reference": "6e2c363716964d8238cee7097b258119a984f0cf", + "url": "https://api.github.com/repos/laravel/framework/zipball/91188a17ceaa3dbace6e8a5f7abd0d042e466359", + "reference": "91188a17ceaa3dbace6e8a5f7abd0d042e466359", "shasum": "" }, "require": { - "brick/math": "^0.14.2 || ^0.15 || ^0.16 || ^0.17 || ^0.18 || ^0.19", + "brick/math": "^0.14.2 || ^0.15 || ^0.16 || ^0.17 || ^0.18 || ^0.19 || ^0.20 || ^1.0", "composer-runtime-api": "^2.2", "doctrine/inflector": "^2.0.5", "dragonmantank/cron-expression": "^3.4", @@ -1554,15 +1555,17 @@ "orchestra/testbench-core": "^11.0.0", "pda/pheanstalk": "^7.0.0 || ^8.0.0", "php-http/discovery": "^1.15", - "phpstan/phpstan": "^2.0", + "phpstan/phpstan": "^2.2.14", "phpunit/phpunit": "^11.5.50 || ^12.5.8 || ^13.0.3", "predis/predis": "^2.3 || ^3.0", "rector/rector": "2.6.3", "resend/resend-php": "^1.0", "symfony/cache": "^7.4.0 || ^8.0.0", "symfony/http-client": "^7.4.0 || ^8.0.0", + "symfony/mercure": "^0.8.0", "symfony/psr-http-message-bridge": "^7.4.0 || ^8.0.0", - "symfony/translation": "^7.4.0 || ^8.0.0" + "symfony/translation": "^7.4.0 || ^8.0.0", + "web-token/jwt-library": "^4.1" }, "suggest": { "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", @@ -1598,8 +1601,10 @@ "symfony/filesystem": "Required to enable support for relative symbolic links (^7.4 || ^8.0).", "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.4 || ^8.0).", "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.4 || ^8.0).", + "symfony/mercure": "Required to use the Mercure broadcast driver (^0.8).", "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.4 || ^8.0).", - "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.4 || ^8.0)." + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.4 || ^8.0).", + "web-token/jwt-library": "Required to sign Mercure JWTs and use end-to-end encrypted channels (^4.1)." }, "type": "library", "extra": { @@ -1649,7 +1654,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2026-08-25T20:57:16+00:00" + "time": "2026-09-22T14:12:33+00:00" }, { "name": "laravel/mcp", @@ -1848,16 +1853,16 @@ }, { "name": "laravel/serializable-closure", - "version": "v2.0.16", + "version": "v2.1.0", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "7cfc24e4fa2cca045fb8dd2a797a2b2b13b655ed" + "reference": "2d5869a838bbcf37e0d8b0568fc41914e81374b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/7cfc24e4fa2cca045fb8dd2a797a2b2b13b655ed", - "reference": "7cfc24e4fa2cca045fb8dd2a797a2b2b13b655ed", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/2d5869a838bbcf37e0d8b0568fc41914e81374b5", + "reference": "2d5869a838bbcf37e0d8b0568fc41914e81374b5", "shasum": "" }, "require": { @@ -1905,7 +1910,7 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2026-08-18T20:28:54+00:00" + "time": "2026-09-22T14:32:34+00:00" }, { "name": "laravel/tinker", @@ -1978,16 +1983,16 @@ }, { "name": "league/commonmark", - "version": "2.10.0", + "version": "2.10.3", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "d2d1aa8b35e072966c89bc0c66cf926e56767dc4" + "reference": "6efbd9c472b91db0a3350fcd601c8332c2382e1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d2d1aa8b35e072966c89bc0c66cf926e56767dc4", - "reference": "d2d1aa8b35e072966c89bc0c66cf926e56767dc4", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/6efbd9c472b91db0a3350fcd601c8332c2382e1f", + "reference": "6efbd9c472b91db0a3350fcd601c8332c2382e1f", "shasum": "" }, "require": { @@ -2081,7 +2086,7 @@ "type": "tidelift" } ], - "time": "2026-08-11T16:06:25+00:00" + "time": "2026-09-21T13:07:34+00:00" }, { "name": "league/config", @@ -2167,16 +2172,16 @@ }, { "name": "league/flysystem", - "version": "3.35.3", + "version": "3.36.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "5fc8404762179ae514678487b23494fd69b2309c" + "reference": "f7fb152932f30072d573510cbd4dd657d6475b25" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/5fc8404762179ae514678487b23494fd69b2309c", - "reference": "5fc8404762179ae514678487b23494fd69b2309c", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/f7fb152932f30072d573510cbd4dd657d6475b25", + "reference": "f7fb152932f30072d573510cbd4dd657d6475b25", "shasum": "" }, "require": { @@ -2244,9 +2249,9 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.35.3" + "source": "https://github.com/thephpleague/flysystem/tree/3.36.0" }, - "time": "2026-08-22T12:55:54+00:00" + "time": "2026-09-02T08:00:27+00:00" }, { "name": "league/flysystem-local", @@ -2537,16 +2542,16 @@ }, { "name": "monolog/monolog", - "version": "3.10.0", + "version": "3.12.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0" + "reference": "72c534fc0ab181ef52d92a68382318631e301608" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/b321dd6749f0bf7189444158a3ce785cc16d69b0", - "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/72c534fc0ab181ef52d92a68382318631e301608", + "reference": "72c534fc0ab181ef52d92a68382318631e301608", "shasum": "" }, "require": { @@ -2572,6 +2577,7 @@ "phpstan/phpstan-strict-rules": "^2", "phpunit/phpunit": "^10.5.17 || ^11.0.7", "predis/predis": "^1.1 || ^2", + "psr/clock": "^1.0", "rollbar/rollbar": "^4.0", "ruflin/elastica": "^7 || ^8", "symfony/mailer": "^5.4 || ^6", @@ -2590,6 +2596,7 @@ "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "psr/clock": "Required to pass a clock to the Logger and control the timestamp of log records", "rollbar/rollbar": "Allow sending log messages to Rollbar", "ruflin/elastica": "Allow sending log messages to an Elastic Search server" }, @@ -2624,7 +2631,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.10.0" + "source": "https://github.com/Seldaek/monolog/tree/3.12.0" }, "funding": [ { @@ -2636,33 +2643,35 @@ "type": "tidelift" } ], - "time": "2026-01-02T08:56:05+00:00" + "time": "2026-09-09T08:34:20+00:00" }, { "name": "nativephp/mobile", - "version": "4.3.0", + "version": "4.5.1", "source": { "type": "git", "url": "https://github.com/NativePHP/mobile-air.git", - "reference": "c1664010a4804f5182b64422bed2a6194eae0f99" + "reference": "19e421ba591d6dda1a2ea7cb220b61329d4b2614" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/NativePHP/mobile-air/zipball/c1664010a4804f5182b64422bed2a6194eae0f99", - "reference": "c1664010a4804f5182b64422bed2a6194eae0f99", + "url": "https://api.github.com/repos/NativePHP/mobile-air/zipball/19e421ba591d6dda1a2ea7cb220b61329d4b2614", + "reference": "19e421ba591d6dda1a2ea7cb220b61329d4b2614", "shasum": "" }, "require": { "endroid/qr-code": "^6.0.9", "ext-dom": "*", "ext-simplexml": "*", - "guzzlehttp/guzzle": "^7.9", + "guzzlehttp/guzzle": "^7.9 || ^8.0", "illuminate/contracts": "^10.0|^11.0|^12.0|^13.0", "illuminate/support": "^10.0|^11.0|^12.0|^13.0", "laravel/prompts": "^0.1.1|^0.2|^0.3", - "php": "^8.4", + "laravel/serializable-closure": "^1.3|^2.0", + "php": "^8.3", "react/datagram": "^1.10", "spatie/laravel-package-tools": "^1.14.0", + "symfony/process": "^6.2|^7.0|^8.0", "workerman/workerman": "^4.1" }, "conflict": { @@ -2729,9 +2738,9 @@ ], "support": { "issues": "https://github.com/NativePHP/mobile-air/issues", - "source": "https://github.com/NativePHP/mobile-air/tree/4.3.0" + "source": "https://github.com/NativePHP/mobile-air/tree/4.5.1" }, - "time": "2026-08-26T13:07:17+00:00" + "time": "2026-09-19T15:03:37+00:00" }, { "name": "nativephp/mobile-browser", @@ -2790,16 +2799,16 @@ }, { "name": "nativephp/mobile-ui", - "version": "0.3.0", + "version": "0.4.0", "source": { "type": "git", "url": "https://github.com/NativePHP/mobile-ui.git", - "reference": "548b431ad5c7989c7da766aceb1a1bc02948606f" + "reference": "e7069a95e48aca3ad05be1ea5e061068e4a87c2b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/NativePHP/mobile-ui/zipball/548b431ad5c7989c7da766aceb1a1bc02948606f", - "reference": "548b431ad5c7989c7da766aceb1a1bc02948606f", + "url": "https://api.github.com/repos/NativePHP/mobile-ui/zipball/e7069a95e48aca3ad05be1ea5e061068e4a87c2b", + "reference": "e7069a95e48aca3ad05be1ea5e061068e4a87c2b", "shasum": "" }, "require": { @@ -2807,6 +2816,7 @@ "php": "^8.2" }, "require-dev": { + "laravel/pint": "^1.24", "orchestra/testbench": "^10.0", "pestphp/pest": "^3.0" }, @@ -2839,7 +2849,7 @@ "description": "Native SwiftUI and Jetpack Composer components for NativePHP", "support": { "issues": "https://github.com/NativePHP/mobile-ui/issues", - "source": "https://github.com/NativePHP/mobile-ui/tree/0.3.0" + "source": "https://github.com/NativePHP/mobile-ui/tree/0.4.0" }, "funding": [ { @@ -2847,20 +2857,20 @@ "type": "other" } ], - "time": "2026-07-27T01:37:02+00:00" + "time": "2026-08-03T21:47:30+00:00" }, { "name": "nesbot/carbon", - "version": "3.13.2", + "version": "3.14.0", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "a1c54919f5fff9800cd03c32bd01defd5a4061cb" + "reference": "0023eaa2c9110e47446dd512a263c69c40cd41f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/a1c54919f5fff9800cd03c32bd01defd5a4061cb", - "reference": "a1c54919f5fff9800cd03c32bd01defd5a4061cb", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/0023eaa2c9110e47446dd512a263c69c40cd41f2", + "reference": "0023eaa2c9110e47446dd512a263c69c40cd41f2", "shasum": "" }, "require": { @@ -2952,7 +2962,7 @@ "type": "tidelift" } ], - "time": "2026-08-08T11:40:35+00:00" + "time": "2026-09-12T20:45:19+00:00" }, { "name": "nette/schema", @@ -3822,50 +3832,6 @@ }, "time": "2026-06-29T15:41:09+00:00" }, - { - "name": "ralouphie/getallheaders", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/getallheaders.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" - } - ], - "description": "A polyfill for getallheaders.", - "support": { - "issues": "https://github.com/ralouphie/getallheaders/issues", - "source": "https://github.com/ralouphie/getallheaders/tree/develop" - }, - "time": "2019-03-08T08:55:37+00:00" - }, { "name": "ramsey/collection", "version": "2.1.1", @@ -3944,20 +3910,20 @@ }, { "name": "ramsey/uuid", - "version": "4.9.3", + "version": "4.9.4", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "1df15849d00943a67d677dc9cfd80795f038c9f8" + "reference": "75d73f48d02797c2c285a7e9f348fadc0102ffe2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/1df15849d00943a67d677dc9cfd80795f038c9f8", - "reference": "1df15849d00943a67d677dc9cfd80795f038c9f8", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/75d73f48d02797c2c285a7e9f348fadc0102ffe2", + "reference": "75d73f48d02797c2c285a7e9f348fadc0102ffe2", "shasum": "" }, "require": { - "brick/math": ">=0.8.16 <=0.18", + "brick/math": "^0.8.16 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14 || ^0.15 || ^0.16 || ^0.17 || ^0.18 || ^0.19 || ^0.20 || ^1.0", "php": "^8.0", "ramsey/collection": "^1.2 || ^2.0" }, @@ -4016,9 +3982,9 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.9.3" + "source": "https://github.com/ramsey/uuid/tree/4.9.4" }, - "time": "2026-06-18T03:57:49+00:00" + "time": "2026-09-16T11:39:30+00:00" }, { "name": "react/cache", @@ -4534,16 +4500,16 @@ }, { "name": "symfony/console", - "version": "v8.1.5", + "version": "v8.1.7", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "d07c06839e33047e2c894a6793248f3fb66c8129" + "reference": "29afb89f4e941f68a6e90f28e3f52ff1f6793a7d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/d07c06839e33047e2c894a6793248f3fb66c8129", - "reference": "d07c06839e33047e2c894a6793248f3fb66c8129", + "url": "https://api.github.com/repos/symfony/console/zipball/29afb89f4e941f68a6e90f28e3f52ff1f6793a7d", + "reference": "29afb89f4e941f68a6e90f28e3f52ff1f6793a7d", "shasum": "" }, "require": { @@ -4610,7 +4576,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v8.1.5" + "source": "https://github.com/symfony/console/tree/v8.1.7" }, "funding": [ { @@ -4630,20 +4596,20 @@ "type": "tidelift" } ], - "time": "2026-08-21T14:29:57+00:00" + "time": "2026-09-13T10:55:57+00:00" }, { "name": "symfony/css-selector", - "version": "v8.1.5", + "version": "v8.1.6", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "a291fb5adb65f52a4bb315db2d803698315dc64d" + "reference": "08e2905152a39cf3fd1745d83f8c483e258887d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/a291fb5adb65f52a4bb315db2d803698315dc64d", - "reference": "a291fb5adb65f52a4bb315db2d803698315dc64d", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/08e2905152a39cf3fd1745d83f8c483e258887d9", + "reference": "08e2905152a39cf3fd1745d83f8c483e258887d9", "shasum": "" }, "require": { @@ -4679,7 +4645,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v8.1.5" + "source": "https://github.com/symfony/css-selector/tree/v8.1.6" }, "funding": [ { @@ -4699,7 +4665,7 @@ "type": "tidelift" } ], - "time": "2026-08-21T17:47:34+00:00" + "time": "2026-08-23T10:06:25+00:00" }, { "name": "symfony/deprecation-contracts", @@ -5021,16 +4987,16 @@ }, { "name": "symfony/finder", - "version": "v8.1.5", + "version": "v8.1.7", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "8d7acede2b2ae07605783d1c43e49b5767036474" + "reference": "4fbe46a3eb64abf8a57f0364075b91f4a233e062" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/8d7acede2b2ae07605783d1c43e49b5767036474", - "reference": "8d7acede2b2ae07605783d1c43e49b5767036474", + "url": "https://api.github.com/repos/symfony/finder/zipball/4fbe46a3eb64abf8a57f0364075b91f4a233e062", + "reference": "4fbe46a3eb64abf8a57f0364075b91f4a233e062", "shasum": "" }, "require": { @@ -5065,7 +5031,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v8.1.5" + "source": "https://github.com/symfony/finder/tree/v8.1.7" }, "funding": [ { @@ -5085,20 +5051,20 @@ "type": "tidelift" } ], - "time": "2026-08-21T12:16:08+00:00" + "time": "2026-09-10T19:14:39+00:00" }, { "name": "symfony/http-foundation", - "version": "v8.1.5", + "version": "v8.1.7", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "ee16f97e95cfa011a742714d7c8c8f70fe7423f4" + "reference": "d8fdc670ed510a69e3a9eb4f5eac89f5ed627e17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ee16f97e95cfa011a742714d7c8c8f70fe7423f4", - "reference": "ee16f97e95cfa011a742714d7c8c8f70fe7423f4", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d8fdc670ed510a69e3a9eb4f5eac89f5ed627e17", + "reference": "d8fdc670ed510a69e3a9eb4f5eac89f5ed627e17", "shasum": "" }, "require": { @@ -5146,7 +5112,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.5" + "source": "https://github.com/symfony/http-foundation/tree/v8.1.7" }, "funding": [ { @@ -5166,20 +5132,20 @@ "type": "tidelift" } ], - "time": "2026-08-20T09:59:12+00:00" + "time": "2026-09-14T17:47:24+00:00" }, { "name": "symfony/http-kernel", - "version": "v8.1.5", + "version": "v8.1.7", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "0306e1e65b90023fe40de6c6be95d06396bcb2e6" + "reference": "ec7a3a5832c22cf880cf27d2fdc7ad2e94838e85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/0306e1e65b90023fe40de6c6be95d06396bcb2e6", - "reference": "0306e1e65b90023fe40de6c6be95d06396bcb2e6", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/ec7a3a5832c22cf880cf27d2fdc7ad2e94838e85", + "reference": "ec7a3a5832c22cf880cf27d2fdc7ad2e94838e85", "shasum": "" }, "require": { @@ -5256,7 +5222,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.5" + "source": "https://github.com/symfony/http-kernel/tree/v8.1.7" }, "funding": [ { @@ -5276,20 +5242,20 @@ "type": "tidelift" } ], - "time": "2026-08-22T13:45:00+00:00" + "time": "2026-09-15T07:12:52+00:00" }, { "name": "symfony/mailer", - "version": "v8.1.5", + "version": "v8.1.7", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "89f43137da74b8f1aab37c99926482b7084f51b9" + "reference": "8783380ecdafa23d36fc90c5873fd44b635c6e10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/89f43137da74b8f1aab37c99926482b7084f51b9", - "reference": "89f43137da74b8f1aab37c99926482b7084f51b9", + "url": "https://api.github.com/repos/symfony/mailer/zipball/8783380ecdafa23d36fc90c5873fd44b635c6e10", + "reference": "8783380ecdafa23d36fc90c5873fd44b635c6e10", "shasum": "" }, "require": { @@ -5336,7 +5302,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v8.1.5" + "source": "https://github.com/symfony/mailer/tree/v8.1.7" }, "funding": [ { @@ -5356,20 +5322,20 @@ "type": "tidelift" } ], - "time": "2026-08-21T17:47:34+00:00" + "time": "2026-09-15T06:01:24+00:00" }, { "name": "symfony/mime", - "version": "v8.1.5", + "version": "v8.1.7", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "1b36ccfd7ccb9ad1d6eafb9024b3dd3d9606b15f" + "reference": "773ac57f20e2795bdadb65b5b1b5f4850d498283" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/1b36ccfd7ccb9ad1d6eafb9024b3dd3d9606b15f", - "reference": "1b36ccfd7ccb9ad1d6eafb9024b3dd3d9606b15f", + "url": "https://api.github.com/repos/symfony/mime/zipball/773ac57f20e2795bdadb65b5b1b5f4850d498283", + "reference": "773ac57f20e2795bdadb65b5b1b5f4850d498283", "shasum": "" }, "require": { @@ -5422,7 +5388,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v8.1.5" + "source": "https://github.com/symfony/mime/tree/v8.1.7" }, "funding": [ { @@ -5442,7 +5408,7 @@ "type": "tidelift" } ], - "time": "2026-08-22T09:06:25+00:00" + "time": "2026-09-04T11:02:17+00:00" }, { "name": "symfony/polyfill-ctype", @@ -5950,6 +5916,86 @@ ], "time": "2026-04-10T16:19:22+00:00" }, + { + "name": "symfony/polyfill-php82", + "version": "v1.38.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php82.git", + "reference": "002dc0cfe5fd4ed6033d48f27d4f19a486c4b04b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php82/zipball/002dc0cfe5fd4ed6033d48f27d4f19a486c4b04b", + "reference": "002dc0cfe5fd4ed6033d48f27d4f19a486c4b04b", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php82\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php82/tree/v1.38.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-26T12:45:58+00:00" + }, { "name": "symfony/polyfill-php84", "version": "v1.38.1", @@ -6275,16 +6321,16 @@ }, { "name": "symfony/process", - "version": "v8.1.5", + "version": "v8.1.7", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "d863f5e70d7c87abb906ac11b61f83036093000b" + "reference": "10823b09358e690df4ff943e24e8492bb1019fc3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/d863f5e70d7c87abb906ac11b61f83036093000b", - "reference": "d863f5e70d7c87abb906ac11b61f83036093000b", + "url": "https://api.github.com/repos/symfony/process/zipball/10823b09358e690df4ff943e24e8492bb1019fc3", + "reference": "10823b09358e690df4ff943e24e8492bb1019fc3", "shasum": "" }, "require": { @@ -6316,7 +6362,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v8.1.5" + "source": "https://github.com/symfony/process/tree/v8.1.7" }, "funding": [ { @@ -6336,11 +6382,11 @@ "type": "tidelift" } ], - "time": "2026-08-21T17:47:34+00:00" + "time": "2026-09-02T12:40:29+00:00" }, { "name": "symfony/routing", - "version": "v8.1.5", + "version": "v8.1.6", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", @@ -6396,7 +6442,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v8.1.5" + "source": "https://github.com/symfony/routing/tree/v8.1.6" }, "funding": [ { @@ -6420,16 +6466,16 @@ }, { "name": "symfony/service-contracts", - "version": "v3.7.1", + "version": "v3.7.3", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "c0a284bab1ed8aa0417e3d69250ab437739563a0" + "reference": "15e6a07ec2a2c75ceb1b21dd98105ee8456d2257" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/c0a284bab1ed8aa0417e3d69250ab437739563a0", - "reference": "c0a284bab1ed8aa0417e3d69250ab437739563a0", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/15e6a07ec2a2c75ceb1b21dd98105ee8456d2257", + "reference": "15e6a07ec2a2c75ceb1b21dd98105ee8456d2257", "shasum": "" }, "require": { @@ -6483,7 +6529,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.7.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.7.3" }, "funding": [ { @@ -6503,20 +6549,20 @@ "type": "tidelift" } ], - "time": "2026-06-16T09:55:08+00:00" + "time": "2026-07-27T15:39:01+00:00" }, { "name": "symfony/string", - "version": "v8.1.2", + "version": "v8.1.7", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "286a76b7255e5cc4bf0101a0bc5388ecf1c38ccc" + "reference": "d950140b5f56f31901e5b7a0c04ffc3a3deb943c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/286a76b7255e5cc4bf0101a0bc5388ecf1c38ccc", - "reference": "286a76b7255e5cc4bf0101a0bc5388ecf1c38ccc", + "url": "https://api.github.com/repos/symfony/string/zipball/d950140b5f56f31901e5b7a0c04ffc3a3deb943c", + "reference": "d950140b5f56f31901e5b7a0c04ffc3a3deb943c", "shasum": "" }, "require": { @@ -6573,7 +6619,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v8.1.2" + "source": "https://github.com/symfony/string/tree/v8.1.7" }, "funding": [ { @@ -6593,7 +6639,7 @@ "type": "tidelift" } ], - "time": "2026-07-28T07:35:25+00:00" + "time": "2026-09-11T14:51:16+00:00" }, { "name": "symfony/translation", @@ -6850,16 +6896,16 @@ }, { "name": "symfony/var-dumper", - "version": "v8.1.5", + "version": "v8.1.7", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "61743d9bc7ab23b194527ca1be2fafd7dc93b74a" + "reference": "741a8c4c948b0bb9bd3653daacd3644c73c40ea5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/61743d9bc7ab23b194527ca1be2fafd7dc93b74a", - "reference": "61743d9bc7ab23b194527ca1be2fafd7dc93b74a", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/741a8c4c948b0bb9bd3653daacd3644c73c40ea5", + "reference": "741a8c4c948b0bb9bd3653daacd3644c73c40ea5", "shasum": "" }, "require": { @@ -6913,7 +6959,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v8.1.5" + "source": "https://github.com/symfony/var-dumper/tree/v8.1.7" }, "funding": [ { @@ -6933,7 +6979,7 @@ "type": "tidelift" } ], - "time": "2026-08-21T12:16:08+00:00" + "time": "2026-09-03T16:02:27+00:00" }, { "name": "symfony/yaml", diff --git a/config/native-ui.php b/config/native-ui.php index a067a5b..a0a4924 100644 --- a/config/native-ui.php +++ b/config/native-ui.php @@ -8,10 +8,8 @@ * Published via `php artisan vendor:publish --tag=native-ui-config`. * Edit to customize your app's visual identity in one place. * - * For dynamic per-tenant theming, use Nativephp\NativeUi\Theme::merge([...]) + * For dynamic per-tenant theming, use Native\Mobile\UI\Theme::merge([...]) * from a service provider. Runtime merges deep-merge on top of these values. - * - * Decision log: /docs/NATIVE-UI-REWRITE-PLAN.md (D — theme layer) */ return [ @@ -21,11 +19,19 @@ | Theme |--------------------------------------------------------------------------- | - | 17 color tokens, 4 radii, 4 font sizes, font family. + | Color tokens (open-ended map), 4 radii, 4 font sizes, font family. | | "on-X" means "color of content placed ON a surface of color X" | — i.e., text/icons on that background. | + | The token map is OPEN-ENDED: add any key your design needs (e.g. a + | `warning` pair) to both blocks and `bg-theme-warning` / + | `text-theme-on-warning` / `border-theme-warning` resolve immediately. + | Theme classes also accept opacity modifiers — `bg-theme-primary/15` + | is the tonal-fill idiom (the alpha applies to the dark companion + | too). In PHP (layout chrome builders, dynamic styling) read tokens + | with the appearance-aware `theme()` helper: `theme('primary')`. + | | Color tokens accept: | - CSS hex: '#B91C1C', '#F00', or with alpha '#8B5CF680' (#RRGGBBAA) | - Tailwind palette names: 'red-300', 'orange-800' @@ -37,6 +43,9 @@ | The default pairs meet WCAG AA (4.5:1) — if you customize, keep each | `on-*` color at 4.5:1 contrast against its background token. | + | TODO: trocar pelas cores oficiais da marca He4rt quando definidas — + | por enquanto os tokens são os padrões do pacote nativephp/mobile-ui. + | */ 'theme' => [ @@ -62,12 +71,18 @@ 'on-surface-variant' => '#706F6C', // Outline = neutral borders (text fields, dividers, cards). + // outline-variant = softer edges: hairline dividers, card seams. 'outline' => '#E5E5E5', + 'outline-variant' => '#EFEFEF', // Destructive actions — maps to `variant="destructive"` on components. 'destructive' => '#B91C1C', 'on-destructive' => '#FFFFFF', + // Success / "safe to proceed" — confirmations, verified badges. + 'success' => '#15803D', + 'on-success' => '#FFFFFF', + // Tertiary accent — for highlights, badges, emphasis not covered by primary. 'accent' => '#C2410C', 'on-accent' => '#FFFFFF', @@ -91,10 +106,14 @@ 'on-surface-variant' => '#A1A09A', 'outline' => '#3E3E3A', + 'outline-variant' => '#2A2A28', 'destructive' => '#F87171', 'on-destructive' => '#0F172A', + 'success' => '#4ADE80', + 'on-success' => '#052E16', + 'accent' => '#FDBA74', 'on-accent' => '#0F172A', ], @@ -112,10 +131,28 @@ 'font-xl' => 24, ], + /* + |--------------------------------------------------------------------------- + | Fonts + |--------------------------------------------------------------------------- + | + | Semantic names for bundled fonts (resources/fonts/ file tokens, minus + | the extension). Use an alias anywhere a font token works — the `font` + | attribute (`font="accent"`), chrome ->font() builders, or the layout + | $font property. The `default` alias is the app-wide default font: + | 'System' resolves to the platform face (San Francisco on iOS, Roboto + | on Android); set a bundled token to apply it everywhere. Download one + | with `php artisan native:font Inter --default`. + | + | 'fonts' => [ + | 'default' => 'Inter-Regular', + | 'accent' => 'DynaPuff-Regular', + | ], + | + */ + 'fonts' => [ 'default' => 'System', - 'accent' => 'Archivo+Black-Regular', - 'lobster' => 'Lobster+Two-Regular', ], ]; diff --git a/config/nativephp.php b/config/nativephp.php index f104220..4a59a33 100644 --- a/config/nativephp.php +++ b/config/nativephp.php @@ -69,6 +69,32 @@ 'deeplink_host' => env('NATIVEPHP_DEEPLINK_HOST'), + /* + |-------------------------------------------------------------------------- + | Deeplink Paths + |-------------------------------------------------------------------------- + | + | Restrict which paths on the deeplink host open your app. By default the + | app claims the WHOLE domain, so every link to it — marketing pages, blog + | posts, anything you never routed — is taken away from the browser and + | dead-ends inside the app. + | + | List the path prefixes your app actually handles to claim only those: + | + | 'deeplink_paths' => ['/docs/', '/orders/'], + | + | On iOS this is already handled server-side by the `components` block of + | your apple-app-site-association file, so these values are Android-only: + | Android's assetlinks.json has no path component, which means the scoping + | has to live in the manifest instead. Keep the two lists in sync. + | + */ + + 'deeplink_paths' => array_values(array_filter( + array_map('trim', explode(',', (string) env('NATIVEPHP_DEEPLINK_PATHS', ''))), + fn ($path) => $path !== '', + )), + /* |-------------------------------------------------------------------------- | Start URL @@ -82,6 +108,28 @@ 'start_url' => env('NATIVEPHP_START_URL', '/'), + /* + |-------------------------------------------------------------------------- + | Appearance + |-------------------------------------------------------------------------- + | + | Pins the app to a single interface style, for apps whose identity is + | fixed light or fixed dark. Theme tokens only cover surfaces YOU draw — + | the system's own chrome (Liquid Glass bars, sheets, keyboards, the + | window background behind the safe areas) follows the device unless it + | is locked here. + | + | Options: 'system' - Follow the device (default) + | 'dark' - Always dark + | 'light' - Always light + | + | iOS only for now: written to the Info.plist as UIUserInterfaceStyle at + | build time. + | + */ + + 'appearance' => env('NATIVEPHP_APPEARANCE', 'system'), + /* |-------------------------------------------------------------------------- | Development Team (iOS) @@ -147,17 +195,6 @@ // ], ], - /* - |-------------------------------------------------------------------------- - | Environment Keys to Clean Up - |-------------------------------------------------------------------------- - | - | These are keys that will be removed from the .env file during app - | bundling to prevent secrets or development credentials from being - | leaked. Wildcards are supported (e.g. AWS_* or *_SECRET). - | - */ - /* |-------------------------------------------------------------------------- | Runtime Configuration @@ -166,7 +203,8 @@ | Controls how the PHP interpreter runs on device. In 'persistent' mode, | PHP boots once and stays alive — subsequent requests dispatch through | the running interpreter (~5-30ms instead of ~200-300ms). In 'classic' - | mode, each request does a full php_embed_init/shutdown cycle. + | mode, each request does a full php_embed_init/shutdown cycle. Falls + | back to 'classic' mode if persistent boot fails. | | reset_instances: Clear resolved facade instances between dispatches | gc_between_dispatches: Run gc_collect_cycles() between dispatches @@ -179,6 +217,17 @@ 'gc_between_dispatches' => false, ], + /* + |-------------------------------------------------------------------------- + | Environment Keys to Clean Up + |-------------------------------------------------------------------------- + | + | These are keys that will be removed from the .env file during app + | bundling to prevent secrets or development credentials from being + | leaked. Wildcards are supported (e.g. AWS_* or *_SECRET). + | + */ + 'cleanup_env_keys' => [ 'AWS_*', 'GITHUB_*', @@ -200,46 +249,18 @@ */ 'cleanup_exclude_files' => [ + // Runtime temp / logs (defaults) 'storage/framework/sessions', 'storage/framework/cache', 'storage/framework/testing', 'storage/logs/laravel.log', - ], - - /* - |-------------------------------------------------------------------------- - | Runtime Configuration - |-------------------------------------------------------------------------- - | - | Controls the persistent PHP runtime behavior. In 'persistent' mode, - | Laravel boots once and the kernel is reused across requests (~5-30ms - | per dispatch instead of ~200-300ms). Falls back to 'classic' mode - | (full init/shutdown per request) if persistent boot fails. - | - */ - 'runtime' => [ - 'mode' => 'persistent', // 'classic' or 'persistent' - 'reset_instances' => true, - 'gc_between_dispatches' => false, - ], - - /* - |-------------------------------------------------------------------------- - | Runtime Configuration - |-------------------------------------------------------------------------- - | - | Controls the persistent PHP runtime behavior. In 'persistent' mode, - | Laravel boots once and the kernel is reused across requests (~5-30ms - | per dispatch instead of ~200-300ms). Falls back to 'classic' mode - | (full init/shutdown per request) if persistent boot fails. - | - */ - - 'runtime' => [ - 'mode' => env('NATIVEPHP_RUNTIME_MODE', 'persistent'), - 'reset_instances' => true, - 'gc_between_dispatches' => false, + // Repo / docs / CI — not needed on device + 'docs', + '.github', + 'tests', + 'phpunit.xml', + 'CLAUDE.md', ], /* diff --git a/resources/fonts/Archivo+Black-Regular.ttf b/resources/fonts/Archivo+Black-Regular.ttf deleted file mode 100644 index 37ead57..0000000 Binary files a/resources/fonts/Archivo+Black-Regular.ttf and /dev/null differ diff --git a/resources/fonts/Lobster+Two-Regular.ttf b/resources/fonts/Lobster+Two-Regular.ttf deleted file mode 100644 index e76614d..0000000 Binary files a/resources/fonts/Lobster+Two-Regular.ttf and /dev/null differ diff --git a/resources/views/native/home.blade.php b/resources/views/native/home.blade.php index 8aab9e9..c70de5e 100644 --- a/resources/views/native/home.blade.php +++ b/resources/views/native/home.blade.php @@ -1,11 +1,11 @@ - + @if ($status === 'loading') - - Chamando a API do He4rt... + + Chamando a API do He4rt... @elseif ($status === 'ok') - Pong, {{ $username }}! - /api/mobile/me respondeu via Sanctum + Pong, {{ $username }}! + /api/mobile/me respondeu via Sanctum @else - Falha ao chamar a API + Falha ao chamar a API @endif - + diff --git a/tests/Feature/NativeHomeTest.php b/tests/Feature/NativeHomeTest.php index 7474cd4..1b6133c 100644 --- a/tests/Feature/NativeHomeTest.php +++ b/tests/Feature/NativeHomeTest.php @@ -2,9 +2,14 @@ declare(strict_types=1); +use App\NativeComponents\Home; use Illuminate\Support\Facades\Http; use Native\Mobile\Testing\Native; +it('sets the nav title', function () { + expect((new Home)->navTitle())->toBe('He4rt'); +}); + it('shows the username after a successful API call', function () { Http::fake([ '*/api/mobile/me' => Http::response(['id' => '1', 'username' => 'danielhe4rt']),