From 8a563ed0765661d04a0678f6c1ea921ecc643b66 Mon Sep 17 00:00:00 2001 From: "Irsyad A. Panjaitan" Date: Fri, 7 Feb 2025 15:23:24 +0700 Subject: [PATCH 1/2] refactor: sync and bump --- .../Auth/RegisteredUserController.php | 5 +- .../Auth/VerifyEmailController.php | 4 +- app/Http/Requests/Auth/LoginRequest.php | 2 +- app/Models/User.php | 2 +- bootstrap/app.php | 4 +- bun.lockb | Bin 301980 -> 309377 bytes composer.json | 3 +- composer.lock | 341 ++++++++---------- config/cache.php | 2 +- config/database.php | 2 +- config/filesystems.php | 2 +- config/logging.php | 2 +- config/session.php | 2 +- package.json | 26 +- public/index.php | 6 +- resources/css/app.css | 132 +++---- resources/js/app.tsx | 2 +- resources/js/components/footer.tsx | 5 +- resources/js/components/providers.tsx | 2 +- resources/js/components/theme-switcher.tsx | 32 +- resources/js/components/theme-toggle.tsx | 40 -- resources/js/components/ui/avatar.tsx | 2 +- resources/js/components/ui/dropdown.tsx | 24 +- resources/js/components/ui/field.tsx | 4 +- resources/js/components/ui/grid.tsx | 300 --------------- resources/js/components/ui/index.ts | 1 - resources/js/components/ui/link.tsx | 2 +- resources/js/components/ui/list-box.tsx | 2 +- resources/js/components/ui/menu.tsx | 61 ++-- resources/js/components/ui/modal.tsx | 4 +- resources/js/components/ui/navbar.tsx | 4 +- resources/js/components/ui/pagination.tsx | 2 +- resources/js/components/ui/popover.tsx | 2 +- resources/js/components/ui/select.tsx | 2 +- resources/js/components/ui/sheet.tsx | 4 +- resources/js/components/ui/table.tsx | 2 +- resources/js/layouts/app-layout.tsx | 6 +- resources/js/layouts/app-navbar.tsx | 165 ++++++--- resources/js/layouts/guest-layout.tsx | 20 +- resources/js/layouts/index.ts | 2 - resources/js/pages/about.tsx | 4 +- resources/js/pages/auth/confirm-password.tsx | 2 +- resources/js/pages/auth/forgot-password.tsx | 2 +- resources/js/pages/auth/login.tsx | 22 +- resources/js/pages/auth/register.tsx | 77 ++-- resources/js/pages/auth/reset-password.tsx | 2 +- resources/js/pages/auth/verify-email.tsx | 2 +- resources/js/pages/dashboard.tsx | 2 +- resources/js/pages/home.tsx | 81 ++--- resources/js/pages/profile/edit.tsx | 6 +- .../profile/partials/update-password-form.tsx | 2 - .../update-profile-information-form.tsx | 2 - routes/web.php | 4 +- tests/Feature/Auth/EmailVerificationTest.php | 2 +- tests/Feature/Auth/PasswordResetTest.php | 2 +- tsconfig.json | 2 - vite.config.js | 2 - 57 files changed, 522 insertions(+), 919 deletions(-) delete mode 100644 resources/js/components/theme-toggle.tsx delete mode 100644 resources/js/components/ui/grid.tsx delete mode 100644 resources/js/layouts/index.ts diff --git a/app/Http/Controllers/Auth/RegisteredUserController.php b/app/Http/Controllers/Auth/RegisteredUserController.php index 307e949..f2526d0 100644 --- a/app/Http/Controllers/Auth/RegisteredUserController.php +++ b/app/Http/Controllers/Auth/RegisteredUserController.php @@ -10,6 +10,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; use Illuminate\Validation\Rules; +use Illuminate\Validation\ValidationException; use Inertia\Inertia; use Inertia\Response; @@ -26,13 +27,13 @@ public function create(): Response /** * Handle an incoming registration request. * - * @throws \Illuminate\Validation\ValidationException + * @throws ValidationException */ public function store(Request $request): RedirectResponse { $request->validate([ 'name' => 'required|string|max:255', - 'email' => 'required|string|lowercase|email|max:255|unique:' . User::class, + 'email' => 'required|string|lowercase|email|max:255|unique:'.User::class, 'password' => ['required', 'confirmed', Rules\Password::defaults()], ]); diff --git a/app/Http/Controllers/Auth/VerifyEmailController.php b/app/Http/Controllers/Auth/VerifyEmailController.php index aed2efd..784765e 100644 --- a/app/Http/Controllers/Auth/VerifyEmailController.php +++ b/app/Http/Controllers/Auth/VerifyEmailController.php @@ -15,13 +15,13 @@ class VerifyEmailController extends Controller public function __invoke(EmailVerificationRequest $request): RedirectResponse { if ($request->user()->hasVerifiedEmail()) { - return redirect()->intended(route('dashboard', absolute: false) . '?verified=1'); + return redirect()->intended(route('dashboard', absolute: false).'?verified=1'); } if ($request->user()->markEmailAsVerified()) { event(new Verified($request->user())); } - return redirect()->intended(route('dashboard', absolute: false) . '?verified=1'); + return redirect()->intended(route('dashboard', absolute: false).'?verified=1'); } } diff --git a/app/Http/Requests/Auth/LoginRequest.php b/app/Http/Requests/Auth/LoginRequest.php index c1b3a3e..2b92f65 100644 --- a/app/Http/Requests/Auth/LoginRequest.php +++ b/app/Http/Requests/Auth/LoginRequest.php @@ -80,6 +80,6 @@ public function ensureIsNotRateLimited(): void */ public function throttleKey(): string { - return Str::transliterate(Str::lower($this->string('email')) . '|' . $this->ip()); + return Str::transliterate(Str::lower($this->string('email')).'|'.$this->ip()); } } diff --git a/app/Models/User.php b/app/Models/User.php index 323553d..58bb2a6 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -53,6 +53,6 @@ protected function casts(): array protected function avatar($size = 200): string { - return 'https://www.gravatar.com/avatar/' . md5(strtolower(trim($this->email))) . '?s=' . $size . '&d=mp'; + return 'https://www.gravatar.com/avatar/'.md5(strtolower(trim($this->email))).'?s='.$size.'&d=mp'; } } diff --git a/bootstrap/app.php b/bootstrap/app.php index 8e473ba..113955b 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -6,8 +6,8 @@ return Application::configure(basePath: dirname(__DIR__)) ->withRouting( - web: __DIR__ . '/../routes/web.php', - commands: __DIR__ . '/../routes/console.php', + web: __DIR__.'/../routes/web.php', + commands: __DIR__.'/../routes/console.php', health: '/up', ) ->withMiddleware(function (Middleware $middleware) { diff --git a/bun.lockb b/bun.lockb index cd2b7db66e8eecd5bebcd787b14f6e29edc75243..b74f310c1a07036e64013b2d06b068dbff7cddff 100755 GIT binary patch delta 54647 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 delta 50970 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

dH_GP%%RMVvoOW1@C$1!gMEDdbLFwi(Q zhlsHd23pEaK+0E+IS$vBaCD2|J+UbAWYLCsmROa_SmL9kPYi209Mkk58$BFPjdh9R zSB62?yB+Azt6UQp;>jx-m^{vu6VBL}pikT%hhZp4lVNjueBCQ{+g70x5xb1EkeL(Z&^i-uLll9Sis8o3WqG)tPnom=04cl*S_ZvsPr_l?PN+ZGE`sh=L#&0R_3DDUK*0!+oMT^~@1ROv@P+M+6j9 zGEl-4MO4&cIWw4OqJSi#W-=<6f|xU!fti{kmie+w-*26LZnrO?zQ;f3p0j>??X}ll zd+oK?-seC|0lL?b&#LFoSOgPOjFYOzXh3yT7 z>?6s`sg|bkX%+~)gtlX->b)X`yz3e`-%SbIbr~Fx7vb)E3luGQFV3^8va_*&4vIRS zMn+Q0yIsMjN5^t|(TLZd-ZWkArm9QvQM zM947UsLwdNc(>L7sQv`bDs?&BTIXmHD!CtUDYBihm&cFdL~&|1nra}6W<)fd`4W?1 zAdq}!sl(>14(?q|yDLb=9K)%{3XJs*F%-W7UFjJk~X0 z(*mmK4lMgh*L7P>_P6>3Sat_cqDj9PY7~p=(J%2w!F42%T)nkz@A;N_wgVKdioOG4 zXgrYk2I7KP42L1hXm2cr-wOIB7S5~jN5UGOTeZru@10zuF*Q@4n7;1&F$&PjCabB> z7s4cr4$)C}V!1HUDf3)<^loU~6%wdZoZSlgc%>BW6a%B-@n8~jd{1e=`6rDsDn8ZG z=O_T&T+L#uLvgLN3jk0%tX8ANuwh9>QL&dD>@H#*`KjaUtqku+yD z%6E*XWZ*S#$J5c(C_glw9`SWdJY^h%s-vlUJVsi=8ezzJowinXf5%~v!p@V=q9s#E zJc5RF+R2wE^ePd|XVMdtGR>fdYoJ||b<}nZM7~e&tpO&K*5IjAX@cmk*!mrI4B45z zTVdISbDTKT&BgrJ)AcoQ2Uj)-E9-n}Zpmop>VW{_039pLX(LTs3yTTZC=foQPu}f! zxcP7(#OlQ)U?Xi<%bpPai$~U_q5XE>Usvr7ggOvw=-agrwQe`2cAM(P^g6gN_SFl= zcs5@XIrJ-V;vfyu)Z*CGXaJ5aa-HO-^G*~}Y#Dy;$Fb#!7K)sTqv(-Hx7I=J0~5(1 z0jgR@gA<^tWLla42lFM$*`UtF*IH=LOzr$W$|0uV9CkJdGkX@C7-MIV#={<#&E4E< z6O|`GH+*cJEj4V_fR_h%xkM^um4P>4Q{t!aK+V?UH1f&K!s654csKRe<*!_fsPi;z zJvt*`3(Z~+!SZN3Zk^6-6@hi^&HVY2E_^QVSmUu4?$9~L%iHL|df3lK>hm$wn@24+ zV2D<36R~4TcAv6uT~G08NVV8QP_z(J8!_)d+S@JO1_k>(%`PMNCdFnrPnHGo?7#aHJeBc#+K~P%P0TTzvKc$C35Qn;&uaV@+poo*Vl7ftYhV&Z)+NO&2*M%{a+2zqA zGL3+@s2YHd69M3JyNpw?3XaA< zVBzXG8V`gx8t4R~pvkGPF0DV($0%GKC*@IAoRn9DtK&#KK(08;&Wt^6qDEIA z9XZ9wxKBMgmIUGII1-Pt;z+!Mu8#BYK#243_RjcOw;_l*#%Inx;W3ZQ?SNs4JcJ}Kw_n-Nr(_VK_R4=21`d&`Q0pJK@*rJX}KIbxDDn&gwt^9pM zePHj(XEMDp;IZ(TnL*B*>UPQSFpDy1;b$N?U$a{J*&w2-~Fyx_jt&06>8%}VFf5`R+byy9%b{@(`?x&v6$&Jsu+A#3e+kN z`)(5;#;1Vg+#Jz>sAK-o-3wyBF|yotfD%%q2$wt{xJkJXkHdl{wzvJ-uN=TT6{;eO zvZ+%lc%1>V5fJ@v2EE;}AeR@!DxxxnCIg}QA%})yMt1rING*`}XMeE5yqiABh+Ic` z`z8Bs+&>Kt3GLs%yJd^NdyyYN>a^Aj6nhjmnSQ+ZVZyxY3I#O0cz1|ia79B8QInl8 zv!!!{71R_*g>Jii<~)!*r@|10ncJCR+?bp{L`!y})c1#I6G|Dx)TJL5^TNcdHEu(b zo2?RJvW2Mn7CLHzmqKdS4nswo{kTsQjn~>IFi0;GRZDeh#|vR5Ylj?mA+`3;{B|Cp z&@}YR(Iete$NNumu3YPNYzdmd*%VJ7lU7G5c^4Y)dz2pSlA1Vsn{@j^sJ8lLSw?$r zt4+YFFJB3agT5|q-hZP5Sjd}@1VJCmZ^mj-h5Mh`v1O==`bXn+AdB77P<=|Cu;8)@ zUYLr{vL96qDFYN9l=p5pb?sUeeFYSC(O;ZLYj;C4)p@id9aDEc7-@RvlXedt9?GW& z{P3+kSlSll(?ouFBcCGnz<5-U?rMQ}C+9-v|12$89aIM1YOoAs6_-HCU%5n75xIQ^ z=dra&WSmEB{q$RhT=edYF73(4Tj>Kbw;+W-1U5OwDj1BoLx%gKQG9J*mn%cI^)=-siKm;MQ!hwH zr845Gig3EL*kjE5-koHTTk^)&Z@!`$AUKU0zaLVyKTSPx)h~nmY;V8$PjtL`Bkl%x zs`fT8Q7mF+`bWk|-aE}TY99(9glF+k;OTzJ zQ(w0_JH{s5ZKAdG%SCcKuC;d!zwTiw{ONm)9Ex6ER$eoTGl3lBbUumiBB2rytgPw@=$Vy;?ik_U<{MrjWwb zS^KyC!1)+vrN_&$v_BJZjqYnP);qo&)FxzSV}FgQnrAe@`u}Do`nSW^mbtVGq;(pFIf~b>fxoABYwo-BXS9iBMr%dh zR<{xWR>$$U0q;*dG@eg0sf|*zzD~hF*Z}eAv`JB^ej#YJf-kqFzfciS+5L-D#k^FWx}SmM=;c9Xj}*I{cX->2 z=QAIelBi9i^3?p#CH3bniGb}5t0$??&6`b$b7rOLYZEV5QOY{e{^rsZOivA;~wxlm$D6`t6pG;l#&1S3xDkL$Z!7ja$R zr`9>?r}8))>Ei3g`N4mK!eQaFuP3)&y9%G`P$)d(`(LMHV6B^~BEJ23PYd%#4o8h; zMde%m$g%p45na$@M#Z$q*x8)#K|Yj2zqIR=k1VWD4tTMd-TG!k$*hOXCo)3BhPCW% zsS}adPjc>p&vpa|{(suu;$$;o&{{LDni)4J;R`6mprjL}RQ!c>P=D!Lu|63+;`Gn} z?ZFaAfuNcBRI8N!k+vyQCRXnTMV(s3RN$w%R7Ee4!qkng7XJLq?~i;^eDAThRy7(? zO&&;i>k@$ADc)qwv!dN^{l9> z_G)g+)?;}e1;-m%Of{#jD+PjWKKQxsFGFUJ01U>VUUhbNMbpm|-AuW4dfzqh;*~bE?sAuogO}c0MeGcf)`zQkJc7o>MOiQ*9)*9_P;NX6Yi6?@J~L#&>`btW(HL$HfN#b zZyDlGn?VN)rM~p65P_5JXzExbIR}gl5eg`c%YIQbd_>x8-1A)dU3kna?X-c{!f|hl z`(1O!t)AY$kM2vA{(f2Ji=%PutBT5`;7Uo71+mEq^Rko8F^ zj2tG(PBgwkvQs{pksDSa=`1Mbr1YlDA2guClTtfME|nV7*;1()T|FyV(xa1-E8jMt z-X(bUxKwhXx>4dL`G&PqO;j+$LzG&ISEqun}-ctgm z1O~ZNfrZ?Pw6Q3>*+R~ekn<^}vW=|O{h4`S@XUbVse#iv z&kqa>30fFPlC3B;V4_sh`Oi|YRCGcMl`gZCZ7GU5E59Nv_bBUxLcC;D08S5Gb4sr>rQ61@+IIZd&Wd(cd4xe=>WM_Sa$w;j!dkQ5!m3gV}c zR>})*8<)C`oMvOZ2S7t+g7sMU!OLnah9lUgN^L) zI;o3|?DG0k=%@YbPp@c=RVIv=-=I)?*)n&wt$bpHgNI@xhA(KlhXyT}F)O%p=mPpG zP;N^u)1jZRg@Hlgfm9VJ_oe;Q<%X0QD0ia4f#`~$K-rmkPM2HO?>#FZcwv}3eK;Mo z;OXd+xInp0ZuxY1l&J)VM{Q=xgQ#_g+$nd_Lis-!2@a59(M&(L0az0!Z?nUH2u(*=10.17.0 <10.25.0" }, "require-dev": { - "illuminate/collections": "^10.0|^11.0", + "illuminate/collections": "^10.0|^11.0|^12.0", "mockery/mockery": "^1.5", "pestphp/pest": "^2.3|^3.4", "phpstan/phpstan": "^1.11", @@ -2137,38 +2138,38 @@ "description": "Add beautiful and user-friendly forms to your command-line applications.", "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.3.3" + "source": "https://github.com/laravel/prompts/tree/v0.3.4" }, - "time": "2024-12-30T15:53:31+00:00" + "time": "2025-01-24T15:41:01+00:00" }, { "name": "laravel/sanctum", - "version": "v4.0.7", + "version": "v4.0.8", "source": { "type": "git", "url": "https://github.com/laravel/sanctum.git", - "reference": "698064236a46df016e64a7eb059b1414e0b281df" + "reference": "ec1dd9ddb2ab370f79dfe724a101856e0963f43c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sanctum/zipball/698064236a46df016e64a7eb059b1414e0b281df", - "reference": "698064236a46df016e64a7eb059b1414e0b281df", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/ec1dd9ddb2ab370f79dfe724a101856e0963f43c", + "reference": "ec1dd9ddb2ab370f79dfe724a101856e0963f43c", "shasum": "" }, "require": { "ext-json": "*", - "illuminate/console": "^11.0", - "illuminate/contracts": "^11.0", - "illuminate/database": "^11.0", - "illuminate/support": "^11.0", + "illuminate/console": "^11.0|^12.0", + "illuminate/contracts": "^11.0|^12.0", + "illuminate/database": "^11.0|^12.0", + "illuminate/support": "^11.0|^12.0", "php": "^8.2", "symfony/console": "^7.0" }, "require-dev": { "mockery/mockery": "^1.6", - "orchestra/testbench": "^9.0", + "orchestra/testbench": "^9.0|^10.0", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.5" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { @@ -2195,29 +2196,29 @@ "issues": "https://github.com/laravel/sanctum/issues", "source": "https://github.com/laravel/sanctum" }, - "time": "2024-12-11T16:40:21+00:00" + "time": "2025-01-26T19:34:36+00:00" }, { "name": "laravel/serializable-closure", - "version": "v2.0.1", + "version": "v2.0.2", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "613b2d4998f85564d40497e05e89cb6d9bd1cbe8" + "reference": "2e1a362527783bcab6c316aad51bf36c5513ae44" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/613b2d4998f85564d40497e05e89cb6d9bd1cbe8", - "reference": "613b2d4998f85564d40497e05e89cb6d9bd1cbe8", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/2e1a362527783bcab6c316aad51bf36c5513ae44", + "reference": "2e1a362527783bcab6c316aad51bf36c5513ae44", "shasum": "" }, "require": { "php": "^8.1" }, "require-dev": { - "illuminate/support": "^10.0|^11.0", + "illuminate/support": "^10.0|^11.0|^12.0", "nesbot/carbon": "^2.67|^3.0", - "pestphp/pest": "^2.36", + "pestphp/pest": "^2.36|^3.0", "phpstan/phpstan": "^2.0", "symfony/var-dumper": "^6.2.0|^7.0.0" }, @@ -2250,26 +2251,26 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2024-12-16T15:26:28+00:00" + "time": "2025-01-24T15:42:37+00:00" }, { "name": "laravel/tinker", - "version": "v2.10.0", + "version": "v2.10.1", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5" + "reference": "22177cc71807d38f2810c6204d8f7183d88a57d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/ba4d51eb56de7711b3a37d63aa0643e99a339ae5", - "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5", + "url": "https://api.github.com/repos/laravel/tinker/zipball/22177cc71807d38f2810c6204d8f7183d88a57d3", + "reference": "22177cc71807d38f2810c6204d8f7183d88a57d3", "shasum": "" }, "require": { - "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", - "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", "php": "^7.2.5|^8.0", "psy/psysh": "^0.11.1|^0.12.0", "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0" @@ -2277,10 +2278,10 @@ "require-dev": { "mockery/mockery": "~1.3.3|^1.4.2", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^8.5.8|^9.3.3" + "phpunit/phpunit": "^8.5.8|^9.3.3|^10.0" }, "suggest": { - "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0)." + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0)." }, "type": "library", "extra": { @@ -2305,9 +2306,9 @@ "keywords": ["REPL", "Tinker", "laravel", "psysh"], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.10.0" + "source": "https://github.com/laravel/tinker/tree/v2.10.1" }, - "time": "2024-09-23T13:32:56+00:00" + "time": "2025-01-27T14:24:01+00:00" }, { "name": "league/commonmark", @@ -4291,16 +4292,16 @@ }, { "name": "spatie/laravel-data", - "version": "4.11.1", + "version": "4.13.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-data.git", - "reference": "df5b58baebae34475ca35338b4e9a131c9e2a8e0" + "reference": "64fe3024b668c2f0d0ce2ecf666edccc8f8bd55f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-data/zipball/df5b58baebae34475ca35338b4e9a131c9e2a8e0", - "reference": "df5b58baebae34475ca35338b4e9a131c9e2a8e0", + "url": "https://api.github.com/repos/spatie/laravel-data/zipball/64fe3024b668c2f0d0ce2ecf666edccc8f8bd55f", + "reference": "64fe3024b668c2f0d0ce2ecf666edccc8f8bd55f", "shasum": "" }, "require": { @@ -4314,10 +4315,10 @@ "fakerphp/faker": "^1.14", "friendsofphp/php-cs-fixer": "^3.0", "inertiajs/inertia-laravel": "^1.2", + "larastan/larastan": "^2.7", "livewire/livewire": "^3.0", "mockery/mockery": "^1.6", "nesbot/carbon": "^2.63", - "nunomaduro/larastan": "^2.0", "orchestra/testbench": "^8.0|^9.0", "pestphp/pest": "^2.31", "pestphp/pest-plugin-laravel": "^2.0", @@ -4355,7 +4356,7 @@ "keywords": ["laravel", "laravel-data", "spatie"], "support": { "issues": "https://github.com/spatie/laravel-data/issues", - "source": "https://github.com/spatie/laravel-data/tree/4.11.1" + "source": "https://github.com/spatie/laravel-data/tree/4.13.0" }, "funding": [ { @@ -4363,31 +4364,31 @@ "type": "github" } ], - "time": "2024-10-23T07:14:53+00:00" + "time": "2025-01-24T15:20:19+00:00" }, { "name": "spatie/laravel-package-tools", - "version": "1.18.2", + "version": "1.19.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "d41c44a7eab604c3eb0cad93210612d4c1429c20" + "reference": "1c9c30ac6a6576b8d15c6c37b6cf23d748df2faa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/d41c44a7eab604c3eb0cad93210612d4c1429c20", - "reference": "d41c44a7eab604c3eb0cad93210612d4c1429c20", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/1c9c30ac6a6576b8d15c6c37b6cf23d748df2faa", + "reference": "1c9c30ac6a6576b8d15c6c37b6cf23d748df2faa", "shasum": "" }, "require": { - "illuminate/contracts": "^9.28|^10.0|^11.0", + "illuminate/contracts": "^9.28|^10.0|^11.0|^12.0", "php": "^8.0" }, "require-dev": { "mockery/mockery": "^1.5", - "orchestra/testbench": "^7.7|^8.0|^9.0", - "pestphp/pest": "^1.22|^2", - "phpunit/phpunit": "^9.5.24|^10.5", + "orchestra/testbench": "^7.7|^8.0|^9.0|^10.0", + "pestphp/pest": "^1.23|^2.1|^3.1", + "phpunit/phpunit": "^9.5.24|^10.5|^11.5", "spatie/pest-plugin-test-time": "^1.1|^2.2" }, "type": "library", @@ -4410,7 +4411,7 @@ "keywords": ["laravel-package-tools", "spatie"], "support": { "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.18.2" + "source": "https://github.com/spatie/laravel-package-tools/tree/1.19.0" }, "funding": [ { @@ -4418,7 +4419,7 @@ "type": "github" } ], - "time": "2025-01-20T14:14:17+00:00" + "time": "2025-02-06T14:58:20+00:00" }, { "name": "spatie/laravel-typescript-transformer", @@ -4906,16 +4907,16 @@ }, { "name": "symfony/error-handler", - "version": "v7.2.1", + "version": "v7.2.3", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "6150b89186573046167796fa5f3f76601d5145f8" + "reference": "959a74d044a6db21f4caa6d695648dcb5584cb49" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/6150b89186573046167796fa5f3f76601d5145f8", - "reference": "6150b89186573046167796fa5f3f76601d5145f8", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/959a74d044a6db21f4caa6d695648dcb5584cb49", + "reference": "959a74d044a6db21f4caa6d695648dcb5584cb49", "shasum": "" }, "require": { @@ -4955,7 +4956,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/v7.2.1" + "source": "https://github.com/symfony/error-handler/tree/v7.2.3" }, "funding": [ { @@ -4971,7 +4972,7 @@ "type": "tidelift" } ], - "time": "2024-12-07T08:50:44+00:00" + "time": "2025-01-07T09:39:55+00:00" }, { "name": "symfony/event-dispatcher", @@ -5178,16 +5179,16 @@ }, { "name": "symfony/http-foundation", - "version": "v7.2.2", + "version": "v7.2.3", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "62d1a43796ca3fea3f83a8470dfe63a4af3bc588" + "reference": "ee1b504b8926198be89d05e5b6fc4c3810c090f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/62d1a43796ca3fea3f83a8470dfe63a4af3bc588", - "reference": "62d1a43796ca3fea3f83a8470dfe63a4af3bc588", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ee1b504b8926198be89d05e5b6fc4c3810c090f0", + "reference": "ee1b504b8926198be89d05e5b6fc4c3810c090f0", "shasum": "" }, "require": { @@ -5232,7 +5233,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.2.2" + "source": "https://github.com/symfony/http-foundation/tree/v7.2.3" }, "funding": [ { @@ -5248,20 +5249,20 @@ "type": "tidelift" } ], - "time": "2024-12-30T19:00:17+00:00" + "time": "2025-01-17T10:56:55+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.2.2", + "version": "v7.2.3", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "3c432966bd8c7ec7429663105f5a02d7e75b4306" + "reference": "caae9807f8e25a9b43ce8cc6fafab6cf91f0cc9b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/3c432966bd8c7ec7429663105f5a02d7e75b4306", - "reference": "3c432966bd8c7ec7429663105f5a02d7e75b4306", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/caae9807f8e25a9b43ce8cc6fafab6cf91f0cc9b", + "reference": "caae9807f8e25a9b43ce8cc6fafab6cf91f0cc9b", "shasum": "" }, "require": { @@ -5342,7 +5343,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/v7.2.2" + "source": "https://github.com/symfony/http-kernel/tree/v7.2.3" }, "funding": [ { @@ -5358,20 +5359,20 @@ "type": "tidelift" } ], - "time": "2024-12-31T14:59:40+00:00" + "time": "2025-01-29T07:40:13+00:00" }, { "name": "symfony/mailer", - "version": "v7.2.0", + "version": "v7.2.3", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "e4d358702fb66e4c8a2af08e90e7271a62de39cc" + "reference": "f3871b182c44997cf039f3b462af4a48fb85f9d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/e4d358702fb66e4c8a2af08e90e7271a62de39cc", - "reference": "e4d358702fb66e4c8a2af08e90e7271a62de39cc", + "url": "https://api.github.com/repos/symfony/mailer/zipball/f3871b182c44997cf039f3b462af4a48fb85f9d3", + "reference": "f3871b182c44997cf039f3b462af4a48fb85f9d3", "shasum": "" }, "require": { @@ -5418,7 +5419,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.2.0" + "source": "https://github.com/symfony/mailer/tree/v7.2.3" }, "funding": [ { @@ -5434,20 +5435,20 @@ "type": "tidelift" } ], - "time": "2024-11-25T15:21:05+00:00" + "time": "2025-01-27T11:08:17+00:00" }, { "name": "symfony/mime", - "version": "v7.2.1", + "version": "v7.2.3", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "7f9617fcf15cb61be30f8b252695ed5e2bfac283" + "reference": "2fc3b4bd67e4747e45195bc4c98bea4628476204" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/7f9617fcf15cb61be30f8b252695ed5e2bfac283", - "reference": "7f9617fcf15cb61be30f8b252695ed5e2bfac283", + "url": "https://api.github.com/repos/symfony/mime/zipball/2fc3b4bd67e4747e45195bc4c98bea4628476204", + "reference": "2fc3b4bd67e4747e45195bc4c98bea4628476204", "shasum": "" }, "require": { @@ -5495,7 +5496,7 @@ "homepage": "https://symfony.com", "keywords": ["mime", "mime-type"], "support": { - "source": "https://github.com/symfony/mime/tree/v7.2.1" + "source": "https://github.com/symfony/mime/tree/v7.2.3" }, "funding": [ { @@ -5511,7 +5512,7 @@ "type": "tidelift" } ], - "time": "2024-12-07T08:50:44+00:00" + "time": "2025-01-27T11:08:17+00:00" }, { "name": "symfony/polyfill-ctype", @@ -6123,16 +6124,16 @@ }, { "name": "symfony/routing", - "version": "v7.2.0", + "version": "v7.2.3", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "e10a2450fa957af6c448b9b93c9010a4e4c0725e" + "reference": "ee9a67edc6baa33e5fae662f94f91fd262930996" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/e10a2450fa957af6c448b9b93c9010a4e4c0725e", - "reference": "e10a2450fa957af6c448b9b93c9010a4e4c0725e", + "url": "https://api.github.com/repos/symfony/routing/zipball/ee9a67edc6baa33e5fae662f94f91fd262930996", + "reference": "ee9a67edc6baa33e5fae662f94f91fd262930996", "shasum": "" }, "require": { @@ -6175,7 +6176,7 @@ "homepage": "https://symfony.com", "keywords": ["router", "routing", "uri", "url"], "support": { - "source": "https://github.com/symfony/routing/tree/v7.2.0" + "source": "https://github.com/symfony/routing/tree/v7.2.3" }, "funding": [ { @@ -6191,7 +6192,7 @@ "type": "tidelift" } ], - "time": "2024-11-25T11:08:51+00:00" + "time": "2025-01-17T10:56:55+00:00" }, { "name": "symfony/service-contracts", @@ -6563,16 +6564,16 @@ }, { "name": "symfony/var-dumper", - "version": "v7.2.0", + "version": "v7.2.3", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c" + "reference": "82b478c69745d8878eb60f9a049a4d584996f73a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c6a22929407dec8765d6e2b6ff85b800b245879c", - "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/82b478c69745d8878eb60f9a049a4d584996f73a", + "reference": "82b478c69745d8878eb60f9a049a4d584996f73a", "shasum": "" }, "require": { @@ -6615,7 +6616,7 @@ "homepage": "https://symfony.com", "keywords": ["debug", "dump"], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.2.0" + "source": "https://github.com/symfony/var-dumper/tree/v7.2.3" }, "funding": [ { @@ -6631,78 +6632,20 @@ "type": "tidelift" } ], - "time": "2024-11-08T15:48:14+00:00" - }, - { - "name": "tightenco/duster", - "version": "v3.1.0", - "source": { - "type": "git", - "url": "https://github.com/tighten/duster.git", - "reference": "687ef98dc5c348162ba418012e6277d520c71178" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/tighten/duster/zipball/687ef98dc5c348162ba418012e6277d520c71178", - "reference": "687ef98dc5c348162ba418012e6277d520c71178", - "shasum": "" - }, - "require": { - "php": "^8.2.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.65", - "laravel-zero/framework": "^11.0", - "laravel/pint": "^1.18", - "nunomaduro/termwind": "^2.0", - "spatie/invade": "^1.1", - "squizlabs/php_codesniffer": "^3.11", - "tightenco/tlint": "^9.4" - }, - "bin": ["builds/duster"], - "type": "project", - "autoload": { - "psr-4": { - "App\\": "app/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": ["MIT"], - "authors": [ - { - "name": "Matt Stauffer", - "email": "matt@tighten.com", - "homepage": "https://tighten.com", - "role": "Developer" - }, - { - "name": "Anthony Clark", - "email": "anthony@tighten.com", - "homepage": "https://tighten.com", - "role": "Developer" - } - ], - "description": "Automatic configuration for Laravel apps to apply Tighten's standard linting & code standards.", - "homepage": "https://github.com/tighten/duster", - "keywords": ["Code style", "duster", "laravel", "php", "tightenco"], - "support": { - "issues": "https://github.com/tighten/duster/issues", - "source": "https://github.com/tighten/duster" - }, - "time": "2024-12-06T22:30:18+00:00" + "time": "2025-01-17T11:39:41+00:00" }, { "name": "tightenco/ziggy", - "version": "v2.4.2", + "version": "v2.5.1", "source": { "type": "git", "url": "https://github.com/tighten/ziggy.git", - "reference": "6612c8c9b2d5b3e74fd67c58c11465df1273f384" + "reference": "40df446f6053787edb245381c3b3d80b031b5fc0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tighten/ziggy/zipball/6612c8c9b2d5b3e74fd67c58c11465df1273f384", - "reference": "6612c8c9b2d5b3e74fd67c58c11465df1273f384", + "url": "https://api.github.com/repos/tighten/ziggy/zipball/40df446f6053787edb245381c3b3d80b031b5fc0", + "reference": "40df446f6053787edb245381c3b3d80b031b5fc0", "shasum": "" }, "require": { @@ -6748,9 +6691,9 @@ "keywords": ["Ziggy", "javascript", "laravel", "routes"], "support": { "issues": "https://github.com/tighten/ziggy/issues", - "source": "https://github.com/tighten/ziggy/tree/v2.4.2" + "source": "https://github.com/tighten/ziggy/tree/v2.5.1" }, - "time": "2025-01-02T20:06:52+00:00" + "time": "2025-01-31T19:23:01+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -7201,16 +7144,16 @@ }, { "name": "filp/whoops", - "version": "2.16.0", + "version": "2.17.0", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "befcdc0e5dce67252aa6322d82424be928214fa2" + "reference": "075bc0c26631110584175de6523ab3f1652eb28e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/befcdc0e5dce67252aa6322d82424be928214fa2", - "reference": "befcdc0e5dce67252aa6322d82424be928214fa2", + "url": "https://api.github.com/repos/filp/whoops/zipball/075bc0c26631110584175de6523ab3f1652eb28e", + "reference": "075bc0c26631110584175de6523ab3f1652eb28e", "shasum": "" }, "require": { @@ -7251,7 +7194,7 @@ "keywords": ["error", "exception", "handling", "library", "throwable", "whoops"], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.16.0" + "source": "https://github.com/filp/whoops/tree/2.17.0" }, "funding": [ { @@ -7259,7 +7202,7 @@ "type": "github" } ], - "time": "2024-09-25T12:00:00+00:00" + "time": "2025-01-25T12:00:00+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -7416,28 +7359,28 @@ }, { "name": "laravel/sail", - "version": "v1.40.0", + "version": "v1.41.0", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "237e70656d8eface4839de51d101284bd5d0cf71" + "reference": "fe1a4ada0abb5e4bd99eb4e4b0d87906c00cdeec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/237e70656d8eface4839de51d101284bd5d0cf71", - "reference": "237e70656d8eface4839de51d101284bd5d0cf71", + "url": "https://api.github.com/repos/laravel/sail/zipball/fe1a4ada0abb5e4bd99eb4e4b0d87906c00cdeec", + "reference": "fe1a4ada0abb5e4bd99eb4e4b0d87906c00cdeec", "shasum": "" }, "require": { - "illuminate/console": "^9.52.16|^10.0|^11.0", - "illuminate/contracts": "^9.52.16|^10.0|^11.0", - "illuminate/support": "^9.52.16|^10.0|^11.0", + "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0", + "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0", + "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0", "php": "^8.0", "symfony/console": "^6.0|^7.0", "symfony/yaml": "^6.0|^7.0" }, "require-dev": { - "orchestra/testbench": "^7.0|^8.0|^9.0", + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", "phpstan/phpstan": "^1.10" }, "bin": ["bin/sail"], @@ -7466,7 +7409,7 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2025-01-13T16:57:11+00:00" + "time": "2025-01-24T15:45:36+00:00" }, { "name": "mockery/mockery", @@ -9279,16 +9222,16 @@ }, { "name": "symfony/yaml", - "version": "v7.2.0", + "version": "v7.2.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "099581e99f557e9f16b43c5916c26380b54abb22" + "reference": "ac238f173df0c9c1120f862d0f599e17535a87ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/099581e99f557e9f16b43c5916c26380b54abb22", - "reference": "099581e99f557e9f16b43c5916c26380b54abb22", + "url": "https://api.github.com/repos/symfony/yaml/zipball/ac238f173df0c9c1120f862d0f599e17535a87ec", + "reference": "ac238f173df0c9c1120f862d0f599e17535a87ec", "shasum": "" }, "require": { @@ -9325,7 +9268,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.2.0" + "source": "https://github.com/symfony/yaml/tree/v7.2.3" }, "funding": [ { @@ -9341,7 +9284,7 @@ "type": "tidelift" } ], - "time": "2024-10-23T06:56:12+00:00" + "time": "2025-01-07T12:55:42+00:00" }, { "name": "ta-tikoma/phpunit-architecture-test", diff --git a/config/cache.php b/config/cache.php index 2dbc452..925f7d2 100644 --- a/config/cache.php +++ b/config/cache.php @@ -103,6 +103,6 @@ | */ - 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_cache_'), + 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'), ]; diff --git a/config/database.php b/config/database.php index 25e064c..125949e 100644 --- a/config/database.php +++ b/config/database.php @@ -147,7 +147,7 @@ 'options' => [ 'cluster' => env('REDIS_CLUSTER', 'redis'), - 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_database_'), + 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), ], 'default' => [ diff --git a/config/filesystems.php b/config/filesystems.php index 8009a25..c5f244d 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -39,7 +39,7 @@ 'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), - 'url' => env('APP_URL') . '/storage', + 'url' => env('APP_URL').'/storage', 'visibility' => 'public', 'throw' => false, ], diff --git a/config/logging.php b/config/logging.php index 54bb171..8d94292 100644 --- a/config/logging.php +++ b/config/logging.php @@ -89,7 +89,7 @@ 'handler_with' => [ 'host' => env('PAPERTRAIL_URL'), 'port' => env('PAPERTRAIL_PORT'), - 'connectionString' => 'tls://' . env('PAPERTRAIL_URL') . ':' . env('PAPERTRAIL_PORT'), + 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), ], 'processors' => [PsrLogMessageProcessor::class], ], diff --git a/config/session.php b/config/session.php index 4683a9b..f0b6541 100644 --- a/config/session.php +++ b/config/session.php @@ -129,7 +129,7 @@ 'cookie' => env( 'SESSION_COOKIE', - Str::slug(env('APP_NAME', 'laravel'), '_') . '_session' + Str::slug(env('APP_NAME', 'laravel'), '_').'_session' ), /* diff --git a/package.json b/package.json index 2da7914..ce94f48 100644 --- a/package.json +++ b/package.json @@ -9,40 +9,40 @@ "preview": "tsc && npm run build && php artisan inertia:start-ssr" }, "devDependencies": { - "@commitlint/cli": "^19.6.1", - "@commitlint/config-conventional": "^19.6.0", - "@inertiajs/react": "^2.0.2", + "@commitlint/cli": "^19.7.1", + "@commitlint/config-conventional": "^19.7.1", + "@inertiajs/react": "^2.0.3", "@release-it/bumper": "^6.0.1", "@release-it/conventional-changelog": "^9.0.4", - "@types/react": "^19.0.7", + "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^4.3.4", "autoprefixer": "^10.4.20", "axios": "^1.7.9", "husky": "^9.1.7", - "laravel-vite-plugin": "^1.1.1", + "laravel-vite-plugin": "^1.2.0", "prettier": "^3.4.2", "prettier-plugin-organize-imports": "^4.1.0", - "prettier-plugin-tailwindcss": "^0.6.10", + "prettier-plugin-tailwindcss": "^0.6.11", "release-it": "^17.11.0", - "tailwindcss": "^4.0.0-beta.9", + "tailwindcss": "^4.0.4", "typescript": "^5.7.3", "vite-plugin-watch": "^0.3.1" }, "dependencies": { - "@tailwindcss/vite": "^4.0.0-beta.9", - "@types/node": "^22.10.7", + "@tailwindcss/vite": "^4.0.4", + "@types/node": "^22.13.1", "clsx": "^2.1.1", - "justd-icons": "^1.10.21", - "motion": "^12.0.0", + "justd-icons": "^1.10.24", + "motion": "^12.4.0", "react": "^19.0.0", "react-aria-components": "^1.6.0", "react-dom": "^19.0.0", - "sonner": "^1.7.2", + "sonner": "^1.7.4", "tailwind-merge": "^2.6.0", "tailwind-variants": "^0.3.1", "tailwindcss-animate": "^1.0.7", - "vite": "^6.0.11" + "vite": "^6.1.0" }, "version": "1.3.14" } diff --git a/public/index.php b/public/index.php index 74a0960..947d989 100644 --- a/public/index.php +++ b/public/index.php @@ -5,13 +5,13 @@ define('LARAVEL_START', microtime(true)); // Determine if the application is in maintenance mode... -if (file_exists($maintenance = __DIR__ . '/../storage/framework/maintenance.php')) { +if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) { require $maintenance; } // Register the Composer autoloader... -require __DIR__ . '/../vendor/autoload.php'; +require __DIR__.'/../vendor/autoload.php'; // Bootstrap Laravel and handle the request... -(require_once __DIR__ . '/../bootstrap/app.php') +(require_once __DIR__.'/../bootstrap/app.php') ->handleRequest(Request::capture()); diff --git a/resources/css/app.css b/resources/css/app.css index c42577a..970fb0e 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -4,9 +4,7 @@ @variant dark (&:is(.dark *)); @theme { - --font-sans: 'var(--font-sans)', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', - 'Segoe UI Symbol', 'Noto Color Emoji'; - --font-mono: var(--font-mono), ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', + --font-sans: 'Figtree', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; --color-border: var(--border); @@ -52,66 +50,52 @@ --color-chart-3: var(--chart-3); --color-chart-4: var(--chart-4); --color-chart-5: var(--chart-5); - - --animate-blink: blink 1.4s both infinite; - - @keyframes blink { - 0% { - opacity: 0.2; - } - 20% { - opacity: 1; - } - 100% { - opacity: 0.2; - } - } } @layer base { :root { - --bg: oklch(1 0 0); - --fg: oklch(0.141 0.005 285.823); + --bg: var(--color-white); + --fg: var(--color-zinc-950); - --primary: oklch(0.546 0.245 262.881); - --primary-fg: oklch(1 0 0); + --primary: var(--color-blue-600); + --primary-fg: var(--color-white); - --secondary: oklch(0.92 0.004 286.32); - --secondary-fg: oklch(0.141 0.005 285.823); + --secondary: var(--color-zinc-100); + --secondary-fg: var(--color-zinc-950); - --overlay: oklch(1 0 0); - --overlay-fg: oklch(0.141 0.005 285.823); + --overlay: var(--color-white); + --overlay-fg: var(--color-zinc-950); - --accent: oklch(0.546 0.245 262.881); - --accent-fg: oklch(1 0 0); + --accent: var(--color-blue-600); + --accent-fg: var(--color-white); - --muted: oklch(0.967 0.001 286.375); - --muted-fg: oklch(0.552 0.016 285.938); + --muted: var(--color-zinc-100); + --muted-fg: var(--color-zinc-600); - --success: oklch(0.596 0.145 163.225); - --success-fg: oklch(1 0 0); + --success: var(--color-emerald-600); + --success-fg: var(--color-white); - --warning: oklch(0.828 0.189 84.429); - --warning-fg: oklch(0.279 0.077 45.635); + --warning: var(--color-amber-400); + --warning-fg: var(--color-amber-950); - --danger: oklch(0.577 0.245 27.325); - --danger-fg: oklch(0.971 0.013 17.38); + --danger: var(--color-red-600); + --danger-fg: var(--color-red-50); - --border: oklch(0.911 0.006 286.286); - --input: oklch(0.871 0.006 286.286); - --ring: oklch(0.546 0.245 262.881); + --border: var(--color-zinc-200); + --input: var(--color-zinc-300); + --ring: var(--color-blue-600); - --navbar: oklch(0.967 0.001 286.375); - --navbar-fg: oklch(0.141 0.005 285.823); + --navbar: var(--color-zinc-50); + --navbar-fg: var(--color-zinc-950); - --sidebar: oklch(0.967 0.001 286.375); - --sidebar-fg: oklch(0.141 0.005 285.823); + --sidebar: var(--color-zinc-50); + --sidebar-fg: var(--color-zinc-950); - --chart-1: oklch(0.546 0.245 262.881); - --chart-2: oklch(0.707 0.165 254.624); - --chart-3: oklch(0.809 0.105 251.813); - --chart-4: oklch(0.882 0.059 254.128); - --chart-5: oklch(0.932 0.032 255.585); + --chart-1: var(--color-blue-600); + --chart-2: var(--color-blue-400); + --chart-3: var(--color-blue-300); + --chart-4: var(--color-blue-200); + --chart-5: var(--color-blue-100); --radius-lg: 0.5rem; --radius-xs: calc(var(--radius-lg) * 0.5); @@ -124,48 +108,48 @@ } .dark { - --bg: oklch(0.091 0.005 285.823); - --fg: oklch(0.985 0 0); + --bg: var(--color-zinc-950); + --fg: var(--color-zinc-50); - --primary: oklch(0.546 0.245 262.881); - --primary-fg: oklch(1 0 0); + --primary: var(--color-blue-600); + --primary-fg: var(--color-white); - --secondary: oklch(0.234 0.006 286.033); - --secondary-fg: oklch(0.985 0 0); + --secondary: oklch(0.244 0.006 286.033); + --secondary-fg: var(--color-zinc-50); - --accent: oklch(0.546 0.245 262.881); - --accent-fg: oklch(1 0 0); + --accent: var(--color-blue-600); + --accent-fg: var(--color-white); - --muted: oklch(0.21 0.006 285.885); - --muted-fg: oklch(0.705 0.015 286.067); + --muted: var(--color-zinc-900); + --muted-fg: var(--color-zinc-400); --overlay: oklch(0.17 0.006 285.885); - --overlay-fg: oklch(0.985 0 0); + --overlay-fg: var(--color-zinc-50); - --success: oklch(0.596 0.145 163.225); - --success-fg: oklch(1 0 0); + --success: var(--color-emerald-600); + --success-fg: var(--color-white); - --warning: oklch(0.828 0.189 84.429); - --warning-fg: oklch(0.279 0.077 45.635); + --warning: var(--color-amber-400); + --warning-fg: var(--color-amber-950); - --danger: oklch(0.577 0.245 27.325); - --danger-fg: oklch(0.971 0.013 17.38); + --danger: var(--color-red-600); + --danger-fg: var(--color-red-50); - --border: oklch(0.274 0.006 286.033); - --input: oklch(0.274 0.006 286.033); - --ring: oklch(0.546 0.245 262.881); + --border: oklch(0.27 0.013 285.805); + --input: oklch(0.29 0.013 285.805); + --ring: var(--color-blue-600); --navbar: oklch(0.17 0.006 285.885); - --navbar-fg: oklch(0.985 0 0); + --navbar-fg: var(--color-zinc-50); --sidebar: oklch(0.16 0.006 285.885); - --sidebar-fg: oklch(0.985 0 0); + --sidebar-fg: var(--color-zinc-50); - --chart-1: oklch(0.488 0.243 264.376); - --chart-2: oklch(0.623 0.214 259.815); - --chart-3: oklch(0.707 0.165 254.624); - --chart-4: oklch(0.809 0.105 251.813); - --chart-5: oklch(0.882 0.059 254.128); + --chart-1: var(--color-blue-700); + --chart-2: var(--color-blue-500); + --chart-3: var(--color-blue-400); + --chart-4: var(--color-blue-300); + --chart-5: var(--color-blue-200); } } diff --git a/resources/js/app.tsx b/resources/js/app.tsx index dbab5b7..9ee4d5c 100644 --- a/resources/js/app.tsx +++ b/resources/js/app.tsx @@ -1,9 +1,9 @@ import '../css/app.css'; import './bootstrap'; +import { Providers } from '@/components/providers'; import { Ziggy } from '@/ziggy'; import { createInertiaApp } from '@inertiajs/react'; -import { Providers } from 'components/providers'; import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers'; import { createRoot, hydrateRoot } from 'react-dom/client'; import { useRoute } from 'ziggy-js'; diff --git a/resources/js/components/footer.tsx b/resources/js/components/footer.tsx index b2f81d7..4dee121 100644 --- a/resources/js/components/footer.tsx +++ b/resources/js/components/footer.tsx @@ -1,4 +1,4 @@ -import { ThemeToggle } from 'components/theme-toggle'; +import { ThemeSwitcher } from '@/components/theme-switcher'; import { SVGProps } from 'react'; import { Button, Link, TextField } from 'ui'; @@ -161,6 +161,7 @@ export function Footer() {

- +
diff --git a/resources/js/components/providers.tsx b/resources/js/components/providers.tsx index 7d70585..dc5b4be 100644 --- a/resources/js/components/providers.tsx +++ b/resources/js/components/providers.tsx @@ -1,5 +1,5 @@ +import { ThemeProvider } from '@/components/theme-provider'; import { router } from '@inertiajs/react'; -import { ThemeProvider } from 'components/theme-provider'; import React from 'react'; import { RouterProvider } from 'react-aria-components'; diff --git a/resources/js/components/theme-switcher.tsx b/resources/js/components/theme-switcher.tsx index 242598c..1e4034f 100644 --- a/resources/js/components/theme-switcher.tsx +++ b/resources/js/components/theme-switcher.tsx @@ -1,19 +1,31 @@ -import { useTheme } from 'components/theme-provider'; -import { IconMoon, IconSun } from 'justd-icons'; -import { Button } from 'ui'; +import { useTheme } from '@/components/theme-provider'; +import { IconDeviceDesktop2, IconMoon, IconSun } from 'justd-icons'; +import { Button, composeTailwindRenderProps } from 'ui'; -export function ThemeSwitcher() { +export function ThemeSwitcher({ + shape = 'square', + appearance = 'plain', + className, + ...props +}: React.ComponentProps) { const { theme, setTheme } = useTheme(); + + const toggleTheme = () => { + const nextTheme = theme === 'light' ? 'dark' : theme === 'dark' ? 'system' : 'light'; + setTheme(nextTheme); + }; + return ( ); } diff --git a/resources/js/components/theme-toggle.tsx b/resources/js/components/theme-toggle.tsx deleted file mode 100644 index 5319d10..0000000 --- a/resources/js/components/theme-toggle.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { cn } from '@/utils/classes'; -import { useTheme } from 'components/theme-provider'; -import { IconDeviceDesktop, IconMoon, IconSun } from 'justd-icons'; -import { Button } from 'ui'; - -export function ThemeToggle() { - const { theme, setTheme } = useTheme(); - - return ( -
- - - -
- ); -} diff --git a/resources/js/components/ui/avatar.tsx b/resources/js/components/ui/avatar.tsx index 70da228..3d0eda8 100644 --- a/resources/js/components/ui/avatar.tsx +++ b/resources/js/components/ui/avatar.tsx @@ -1,4 +1,4 @@ -import { type VariantProps, tv } from 'tailwind-variants'; +import { tv, type VariantProps } from 'tailwind-variants'; const avatar = tv({ base: [ diff --git a/resources/js/components/ui/dropdown.tsx b/resources/js/components/ui/dropdown.tsx index a2b3458..4898dfa 100644 --- a/resources/js/components/ui/dropdown.tsx +++ b/resources/js/components/ui/dropdown.tsx @@ -2,6 +2,7 @@ import { cn } from '@/utils/classes'; import { IconCheck } from 'justd-icons'; import { Collection, + composeRenderProps, Header, ListBoxItem as ListBoxItemPrimitive, type ListBoxItemProps, @@ -10,8 +11,7 @@ import { Separator, type SeparatorProps, Text, - type TextProps, - composeRenderProps + type TextProps } from 'react-aria-components'; import { tv } from 'tailwind-variants'; import { Keyboard } from './keyboard'; @@ -19,9 +19,9 @@ import { Keyboard } from './keyboard'; const dropdownItemStyles = tv({ base: [ 'col-span-full grid grid-cols-[auto_1fr_1.5rem_0.5rem_auto] not-has-data-[slot=dropdown-item-details]:items-center has-data-[slot=dropdown-item-details]:**:data-[slot=checked-icon]:mt-[1.5px] supports-[grid-template-columns:subgrid]:grid-cols-subgrid', - 'group relative cursor-default select-none rounded-[calc(var(--radius-lg)-1px)] px-2.5 py-1.5 forced-color:text-[Highlight] text-base text-fg outline outline-0 forced-color-adjust-none sm:text-sm/6 forced-colors:text-[LinkText]', + 'group relative cursor-default select-none rounded-[calc(var(--radius-lg)-1px)] px-[calc(var(--spacing)*2.3)] py-[calc(var(--spacing)*1.3)] forced-color:text-[Highlight] text-base text-fg outline-0 forced-color-adjust-none sm:text-sm/6 forced-colors:text-[LinkText]', '**:data-[slot=avatar]:*:mr-2 **:data-[slot=avatar]:*:size-6 **:data-[slot=avatar]:mr-2 **:data-[slot=avatar]:size-6 sm:**:data-[slot=avatar]:*:size-5 sm:**:data-[slot=avatar]:size-5', - 'data-danger:**:data-[slot=icon]:text-danger/70 **:data-[slot=icon]:size-4 **:data-[slot=icon]:shrink-0 **:data-[slot=icon]:text-muted-fg data-focused:data-danger:**:data-[slot=icon]:text-danger-fg', + 'data-danger:**:data-[slot=icon]:text-danger/60 **:data-[slot=icon]:size-4 **:data-[slot=icon]:shrink-0 **:data-[slot=icon]:text-muted-fg data-focused:data-danger:**:data-[slot=icon]:text-danger', 'data-[slot=menu-radio]:*:data-[slot=icon]:size-3 *:data-[slot=icon]:mr-2', 'forced-colors:**:data-[slot=icon]:text-[CanvasText] forced-colors:group-data-focused:**:data-[slot=icon]:text-[Canvas] ', '[&>[slot=label]+[data-slot=icon]]:absolute [&>[slot=label]+[data-slot=icon]]:right-0' @@ -38,7 +38,7 @@ const dropdownItemStyles = tv({ true: [ '**:data-[slot=icon]:text-accent-fg **:[kbd]:text-accent-fg', 'bg-accent text-accent-fg forced-colors:bg-[Highlight] forced-colors:text-[HighlightText]', - 'data-danger:bg-danger data-danger:text-danger-fg', + 'data-danger:bg-danger/10 data-danger:text-danger', 'data-[slot=description]:text-accent-fg data-[slot=label]:text-accent-fg [&_.text-muted-fg]:text-accent-fg/80' ] } @@ -47,10 +47,8 @@ const dropdownItemStyles = tv({ const dropdownSectionStyles = tv({ slots: { - section: - "first:-mt-[5px] xss3 col-span-full grid grid-cols-[auto_1fr] gap-y-0.5 after:block after:h-[4px] after:content-['']", - header: - '-top-[5px] -mb-0.5 -mx-1.5 sticky z-10 col-span-full min-w-(--trigger-width) truncate border-y bg-bg px-4 py-2 font-medium text-muted-fg text-sm supports-[-moz-appearance:none]:bg-bg [&+*]:mt-1' + section: 'col-span-full grid grid-cols-[auto_1fr]', + header: 'col-span-full px-2.5 py-1 font-medium text-muted-fg text-sm sm:text-xs' } }); @@ -84,7 +82,7 @@ const DropdownItem = ({ className, ...props }: DropdownItemProps) => { {composeRenderProps(props.children, (children, { isSelected }) => ( <> {isSelected && } - {children} + {typeof children === 'string' ? {children} : children} ))} @@ -147,11 +145,11 @@ const DropdownKeyboard = ({ className, ...props }: React.ComponentProps, VariantProps { - className?: string; - debug?: boolean; -} - -const Grid = ({ className, gap, gapX, gapY, flow, columns, rows, ...props }: GridProps) => { - return ( -
- {props.children} -
- ); -}; - -const gridItemStyles = tv( - { - base: 'grid-cell data-focused:outline-hidden', - variants: { - colSpan: { - auto: 'col-auto', - 1: 'col-span-1', - 2: 'col-span-2', - 3: 'col-span-3', - 4: 'col-span-4', - 5: 'col-span-5', - 6: 'col-span-6', - 7: 'col-span-7', - 8: 'col-span-8', - 9: 'col-span-9', - 10: 'col-span-10', - 11: 'col-span-11', - 12: 'col-span-12', - full: 'col-span-full' - }, - colStart: { - 1: 'col-start-1', - 2: 'col-start-2', - 3: 'col-start-3', - 4: 'col-start-4', - 5: 'col-start-5', - 6: 'col-start-6', - 7: 'col-start-7', - 8: 'col-start-8', - 9: 'col-start-9', - 10: 'col-start-10', - 11: 'col-start-11', - 12: 'col-start-12', - 13: 'col-start-13', - auto: 'col-start-auto' - }, - colEnd: { - 1: 'col-end-1', - 2: 'col-end-2', - 3: 'col-end-3', - 4: 'col-end-4', - 5: 'col-end-5', - 6: 'col-end-6', - 7: 'col-end-7', - 8: 'col-end-8', - 9: 'col-end-9', - 10: 'col-end-10', - 11: 'col-end-11', - 12: 'col-end-12', - 13: 'col-end-13', - auto: 'col-end-auto' - }, - rowSpan: { - auto: 'row-auto', - 1: 'row-span-1', - 2: 'row-span-2', - 3: 'row-span-3', - 4: 'row-span-4', - 5: 'row-span-5', - 6: 'row-span-6', - 7: 'row-span-7', - 8: 'row-span-8', - 9: 'row-span-9', - 10: 'row-span-10', - 11: 'row-span-11', - 12: 'row-span-12', - full: 'row-span-full' - }, - rowStart: { - 1: 'row-start-1', - 2: 'row-start-2', - 3: 'row-start-3', - 4: 'row-start-4', - 5: 'row-start-5', - 6: 'row-start-6', - 7: 'row-start-7', - 8: 'row-start-8', - 9: 'row-start-9', - 10: 'row-start-10', - 11: 'row-start-11', - 12: 'row-start-12', - 13: 'row-start-13', - auto: 'row-start-auto' - }, - rowEnd: { - 1: 'row-end-1', - 2: 'row-end-2', - 3: 'row-end-3', - 4: 'row-end-4', - 5: 'row-end-5', - 6: 'row-end-6', - 7: 'row-end-7', - 8: 'row-end-8', - 9: 'row-end-9', - 10: 'row-end-10', - 11: 'row-end-11', - 12: 'row-end-12', - 13: 'row-end-13', - auto: 'row-end-auto' - } - } - }, - { - responsiveVariants: ['sm', 'md', 'lg', 'xl', '2xl'] - } -); - -interface GridItemProps extends React.HTMLAttributes, VariantProps { - className?: string; -} - -const GridItem = ({ - children, - className, - colSpan, - rowSpan, - colStart, - colEnd, - rowStart, - rowEnd, - ...props -}: GridItemProps) => { - return ( -
- {children} -
- ); -}; - -Grid.Item = GridItem; - -export { Grid, gridItemStyles, gridStyles }; diff --git a/resources/js/components/ui/index.ts b/resources/js/components/ui/index.ts index 14b13de..01a66c0 100644 --- a/resources/js/components/ui/index.ts +++ b/resources/js/components/ui/index.ts @@ -7,7 +7,6 @@ export * from './dialog'; export * from './dropdown'; export * from './field'; export * from './form'; -export * from './grid'; export * from './heading'; export * from './keyboard'; export * from './link'; diff --git a/resources/js/components/ui/link.tsx b/resources/js/components/ui/link.tsx index 4fe65c2..117e0b1 100644 --- a/resources/js/components/ui/link.tsx +++ b/resources/js/components/ui/link.tsx @@ -1,4 +1,4 @@ -import { Link as LinkPrimitive, type LinkProps as LinkPrimitiveProps, composeRenderProps } from 'react-aria-components'; +import { composeRenderProps, Link as LinkPrimitive, type LinkProps as LinkPrimitiveProps } from 'react-aria-components'; import { tv } from 'tailwind-variants'; import { focusButtonStyles } from './primitive'; diff --git a/resources/js/components/ui/list-box.tsx b/resources/js/components/ui/list-box.tsx index 900614b..1e460ea 100644 --- a/resources/js/components/ui/list-box.tsx +++ b/resources/js/components/ui/list-box.tsx @@ -1,6 +1,6 @@ import { IconCheck, IconHamburger } from 'justd-icons'; import type { ListBoxItemProps as ListBoxItemPrimitiveProps, ListBoxProps } from 'react-aria-components'; -import { ListBoxItem, ListBox as ListBoxPrimitive, composeRenderProps } from 'react-aria-components'; +import { composeRenderProps, ListBoxItem, ListBox as ListBoxPrimitive } from 'react-aria-components'; import { tv } from 'tailwind-variants'; import { cn } from '@/utils/classes'; diff --git a/resources/js/components/ui/menu.tsx b/resources/js/components/ui/menu.tsx index 48dc403..59e67ad 100644 --- a/resources/js/components/ui/menu.tsx +++ b/resources/js/components/ui/menu.tsx @@ -12,13 +12,13 @@ import type { import { Button, Collection, + composeRenderProps, Header, - MenuItem, + MenuItem as MenuItemPrimitive, Menu as MenuPrimitive, - MenuSection, + MenuSection as MenuSectionPrimitive, MenuTrigger as MenuTriggerPrimitive, - SubmenuTrigger as SubmenuTriggerPrimitive, - composeRenderProps + SubmenuTrigger as SubmenuTriggerPrimitive } from 'react-aria-components'; import type { VariantProps } from 'tailwind-variants'; import { tv } from 'tailwind-variants'; @@ -26,11 +26,11 @@ import { tv } from 'tailwind-variants'; import { cn } from '@/utils/classes'; import { DropdownItemDetails, + dropdownItemStyles, DropdownKeyboard, DropdownLabel, - DropdownSeparator, - dropdownItemStyles, - dropdownSectionStyles + dropdownSectionStyles, + DropdownSeparator } from './dropdown'; import { Popover } from './popover'; @@ -52,7 +52,7 @@ const Menu = ({ respectScreen = true, ...props }: MenuProps) => { ); }; -const SubMenu = ({ delay = 0, ...props }) => ( +const MenuSubMenu = ({ delay = 0, ...props }) => ( {props.children} @@ -60,11 +60,9 @@ const SubMenu = ({ delay = 0, ...props }) => ( const menuStyles = tv({ slots: { - menu: 'grid max-h-[calc(var(--visual-viewport-height)-10rem)] grid-cols-[auto_1fr] overflow-auto rounded-xl p-1 outline-hidden [clip-path:inset(0_0_0_0_round_calc(var(--radius-lg)-2px))] sm:max-h-[inherit]', + menu: "grid max-h-[calc(var(--visual-viewport-height)-10rem)] grid-cols-[auto_1fr] overflow-auto rounded-xl p-1 outline-hidden [clip-path:inset(0_0_0_0_round_calc(var(--radius-lg)-2px))] sm:max-h-[inherit] *:[[role='group']+[role=group]]:mt-4 *:[[role='group']+[role=separator]]:mt-1", popover: 'z-50 p-0 shadow-xs outline-hidden sm:min-w-40', - trigger: [ - 'relative inline text-left data-focused:outline-hidden data-pressed:outline-hidden data-focus-visible:ring-1 data-focus-visible:ring-primary' - ] + trigger: ['relative inline text-left outline-hidden data-focus-visible:ring-1 data-focus-visible:ring-primary'] } }); @@ -113,16 +111,16 @@ interface MenuItemProps extends MenuItemPrimitiveProps, VariantProps { +const MenuItem = ({ className, isDanger = false, children, ...props }: MenuItemProps) => { const textValue = props.textValue || (typeof children === 'string' ? children : undefined); return ( - dropdownItemStyles({ ...renderProps, className: renderProps.hasSubmenu ? cn([ - 'data-open:data-danger:bg-danger/20 data-open:data-danger:text-danger', + 'data-open:data-danger:bg-danger/10 data-open:data-danger:text-danger', 'data-open:bg-accent data-open:text-accent-fg data-open:*:data-[slot=icon]:text-accent-fg data-open:*:[.text-muted-fg]:text-accent-fg', className ]) @@ -140,7 +138,7 @@ const Item = ({ className, isDanger = false, children, ...props }: MenuItemProps {values.selectionMode === 'single' && ( @@ -156,7 +154,7 @@ const Item = ({ className, isDanger = false, children, ...props }: MenuItemProps {values.hasSubmenu && } )} - + ); }; @@ -168,7 +166,7 @@ const MenuHeader = ({ className, separator = false, ...props }: MenuHeaderProps)
extends MenuSectionPrimitiveProps { title?: string; } -const Section = ({ className, ref, ...props }: MenuSectionProps) => { +const MenuSection = ({ className, ref, ...props }: MenuSectionProps) => { return ( - + {'title' in props &&
{props.title}
} {props.children} -
+ ); }; -Menu.Keyboard = DropdownKeyboard; -Menu.Primitive = MenuPrimitive; +const MenuSeparator = DropdownSeparator; +const MenuItemDetails = DropdownItemDetails; +const MenuKeyboard = DropdownKeyboard; +const MenuLabel = DropdownLabel; + +Menu.Keyboard = MenuKeyboard; Menu.Content = MenuContent; Menu.Header = MenuHeader; -Menu.Item = Item; -Menu.Content = MenuContent; -Menu.Section = Section; -Menu.Separator = DropdownSeparator; +Menu.Item = MenuItem; +Menu.Section = MenuSection; +Menu.Separator = MenuSeparator; +Menu.ItemDetails = MenuItemDetails; +Menu.Label = MenuLabel; Menu.Trigger = MenuTrigger; -Menu.ItemDetails = DropdownItemDetails; -Menu.Submenu = SubMenu; -Menu.Label = DropdownLabel; +Menu.Submenu = MenuSubMenu; export { Menu }; export type { MenuContentProps, MenuItemProps, MenuProps, MenuSectionProps, MenuTriggerProps }; diff --git a/resources/js/components/ui/modal.tsx b/resources/js/components/ui/modal.tsx index bed58cc..1bc88a0 100644 --- a/resources/js/components/ui/modal.tsx +++ b/resources/js/components/ui/modal.tsx @@ -1,6 +1,6 @@ import type { DialogProps, DialogTriggerProps, ModalOverlayProps } from 'react-aria-components'; -import { DialogTrigger, ModalOverlay, Modal as ModalPrimitive, composeRenderProps } from 'react-aria-components'; -import { type VariantProps, tv } from 'tailwind-variants'; +import { composeRenderProps, DialogTrigger, ModalOverlay, Modal as ModalPrimitive } from 'react-aria-components'; +import { tv, type VariantProps } from 'tailwind-variants'; import { Dialog } from './dialog'; diff --git a/resources/js/components/ui/navbar.tsx b/resources/js/components/ui/navbar.tsx index 4025809..de9478a 100644 --- a/resources/js/components/ui/navbar.tsx +++ b/resources/js/components/ui/navbar.tsx @@ -3,8 +3,8 @@ import { createContext, use, useCallback, useId, useMemo, useState } from 'react import { IconHamburger } from 'justd-icons'; import { LayoutGroup, motion } from 'motion/react'; import type { LinkProps } from 'react-aria-components'; -import { Link, composeRenderProps } from 'react-aria-components'; -import { type VariantProps, tv } from 'tailwind-variants'; +import { composeRenderProps, Link } from 'react-aria-components'; +import { tv, type VariantProps } from 'tailwind-variants'; import { cn } from '@/utils/classes'; import { useMediaQuery } from '@/utils/use-media-query'; diff --git a/resources/js/components/ui/pagination.tsx b/resources/js/components/ui/pagination.tsx index e7a24a5..dc214aa 100644 --- a/resources/js/components/ui/pagination.tsx +++ b/resources/js/components/ui/pagination.tsx @@ -6,7 +6,7 @@ import { IconDotsHorizontal } from 'justd-icons'; import type { ListBoxItemProps, ListBoxProps, ListBoxSectionProps } from 'react-aria-components'; -import { ListBox, ListBoxItem, ListBoxSection, Separator, composeRenderProps } from 'react-aria-components'; +import { composeRenderProps, ListBox, ListBoxItem, ListBoxSection, Separator } from 'react-aria-components'; import { cn } from '@/utils/classes'; import { tv } from 'tailwind-variants'; diff --git a/resources/js/components/ui/popover.tsx b/resources/js/components/ui/popover.tsx index 9de920b..30e93b7 100644 --- a/resources/js/components/ui/popover.tsx +++ b/resources/js/components/ui/popover.tsx @@ -4,6 +4,7 @@ import type { PopoverProps as PopoverPrimitiveProps } from 'react-aria-components'; import { + composeRenderProps, type DialogProps, DialogTrigger, Modal, @@ -11,7 +12,6 @@ import { OverlayArrow, PopoverContext, Popover as PopoverPrimitive, - composeRenderProps, useSlottedContext } from 'react-aria-components'; import { tv } from 'tailwind-variants'; diff --git a/resources/js/components/ui/select.tsx b/resources/js/components/ui/select.tsx index 849870e..67055a9 100644 --- a/resources/js/components/ui/select.tsx +++ b/resources/js/components/ui/select.tsx @@ -1,6 +1,6 @@ import { IconChevronLgDown } from 'justd-icons'; import type { ListBoxProps, SelectProps as SelectPrimitiveProps, ValidationResult } from 'react-aria-components'; -import { Button, Select as SelectPrimitive, SelectValue, composeRenderProps } from 'react-aria-components'; +import { Button, composeRenderProps, Select as SelectPrimitive, SelectValue } from 'react-aria-components'; import { tv } from 'tailwind-variants'; import type { Placement } from '@react-types/overlays'; diff --git a/resources/js/components/ui/sheet.tsx b/resources/js/components/ui/sheet.tsx index 8823aad..d5966c3 100644 --- a/resources/js/components/ui/sheet.tsx +++ b/resources/js/components/ui/sheet.tsx @@ -1,6 +1,6 @@ import type { DialogProps, DialogTriggerProps, ModalOverlayProps } from 'react-aria-components'; -import { DialogTrigger, Modal, ModalOverlay, composeRenderProps } from 'react-aria-components'; -import { type VariantProps, tv } from 'tailwind-variants'; +import { composeRenderProps, DialogTrigger, Modal, ModalOverlay } from 'react-aria-components'; +import { tv, type VariantProps } from 'tailwind-variants'; import { Dialog } from './dialog'; diff --git a/resources/js/components/ui/table.tsx b/resources/js/components/ui/table.tsx index 83d47b3..b3a9393 100644 --- a/resources/js/components/ui/table.tsx +++ b/resources/js/components/ui/table.tsx @@ -16,12 +16,12 @@ import { Collection, Column, ColumnResizer as ColumnResizerPrimitive, + composeRenderProps, ResizableTableContainer, Row, TableBody, TableHeader, Table as TablePrimitive, - composeRenderProps, useTableOptions } from 'react-aria-components'; import { tv } from 'tailwind-variants'; diff --git a/resources/js/layouts/app-layout.tsx b/resources/js/layouts/app-layout.tsx index 7b8eb4e..eb2e94d 100644 --- a/resources/js/layouts/app-layout.tsx +++ b/resources/js/layouts/app-layout.tsx @@ -1,9 +1,9 @@ +import { FlashMessage } from '@/components/flash-message'; +import { Footer } from '@/components/footer'; import { AppNavbar } from '@/layouts/app-navbar'; -import { FlashMessage } from 'components/flash-message'; -import { Footer } from 'components/footer'; import { PropsWithChildren } from 'react'; -export function AppLayout({ children }: PropsWithChildren) { +export default function AppLayout({ children }: PropsWithChildren) { return (
diff --git a/resources/js/layouts/app-navbar.tsx b/resources/js/layouts/app-navbar.tsx index 7563df2..c672518 100644 --- a/resources/js/layouts/app-navbar.tsx +++ b/resources/js/layouts/app-navbar.tsx @@ -1,20 +1,20 @@ +import { useTheme } from '@/components/theme-provider'; +import { ThemeSwitcher } from '@/components/theme-switcher'; import { PagePropsData } from '@/types'; import { usePage } from '@inertiajs/react'; -import { useTheme } from 'components/theme-provider'; -import { ThemeSwitcher } from 'components/theme-switcher'; import { IconArrowUpRight, IconBrandJustd, IconBrandLaravel, - IconChevronDown, - IconColors, + IconChevronLgDown, + IconColorPalette, IconColorSwatch, - IconPackage, + IconLogout, IconSettings } from 'justd-icons'; import React from 'react'; import { Selection } from 'react-aria-components'; -import { Avatar, Button, Menu, Navbar, Separator } from 'ui'; +import { Avatar, buttonStyles, Link, Menu, Navbar, Separator } from 'ui'; const navigations = [ { @@ -49,28 +49,43 @@ export function AppNavbar({ children, ...props }: React.ComponentProps Resources... - + - - + + + Blocks + + + + + Premium Blocks + + + + Basic Blocks + + + + + Components - + - - - Icons - + + + Colors + - - + + Themes - + - - - Colors - + + + Laravel + @@ -82,7 +97,10 @@ export function AppNavbar({ children, ...props }: React.ComponentProps ) : ( <> - Login + + + Login + Register )} @@ -99,7 +117,18 @@ export function AppNavbar({ children, ...props }: React.ComponentProps {!auth.user && } - {auth.user ? : } + {auth.user ? ( + + ) : ( + <> + + Login + + + )} @@ -115,23 +144,35 @@ function UserMenu() { const [selectedTheme, setSelectedTheme] = React.useState(new Set([currentTheme])); return ( - - + + +
+ {auth.user.name} + {auth.user.email} +
+
- +
{auth.user.name}
{auth.user.email}
- Dashboard + + Dashboard + - Settings + Settings - Preferences + + Preferences + {(item) => ( - {item.name} + {item.name} )} - - - Documentation - - - - Components - - - - Colors - - + - Logout + Logout +
); } -function LoginMenu() { +export function IconBrandJustdBlocks() { return ( - - - - Login - Register - - + + + + + + + + + + + + + + + + + + + + + ); } diff --git a/resources/js/layouts/guest-layout.tsx b/resources/js/layouts/guest-layout.tsx index b6c53c2..569c57c 100644 --- a/resources/js/layouts/guest-layout.tsx +++ b/resources/js/layouts/guest-layout.tsx @@ -1,6 +1,6 @@ -import { FlashMessage } from 'components/flash-message'; -import { Logo } from 'components/logo'; -import { Card } from 'components/ui/card'; +import { FlashMessage } from '@/components/flash-message'; +import { Logo } from '@/components/logo'; +import { Card } from '@/components/ui/card'; import { PropsWithChildren, ReactNode } from 'react'; import { Link } from 'ui'; @@ -9,7 +9,11 @@ interface GuestLayoutProps { description?: string | ReactNode | null; } -export function GuestLayout({ description = null, header = null, children }: PropsWithChildren) { +export default function GuestLayout({ + description = null, + header = null, + children +}: PropsWithChildren) { return (
@@ -19,11 +23,9 @@ export function GuestLayout({ description = null, header = null, children }: Pro
- -
- {header} - {description} -
+ + {header} + {description} {children}
diff --git a/resources/js/layouts/index.ts b/resources/js/layouts/index.ts deleted file mode 100644 index 948598c..0000000 --- a/resources/js/layouts/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './app-layout'; -export * from './guest-layout'; diff --git a/resources/js/pages/about.tsx b/resources/js/pages/about.tsx index 3f33884..7af1231 100644 --- a/resources/js/pages/about.tsx +++ b/resources/js/pages/about.tsx @@ -1,6 +1,6 @@ +import { Header } from '@/components/header'; +import AppLayout from '@/layouts/app-layout'; import { Head } from '@inertiajs/react'; -import { Header } from 'components/header'; -import { AppLayout } from 'layouts'; import React from 'react'; import { Card, Container } from 'ui'; diff --git a/resources/js/pages/auth/confirm-password.tsx b/resources/js/pages/auth/confirm-password.tsx index 65bb657..4a7aec7 100644 --- a/resources/js/pages/auth/confirm-password.tsx +++ b/resources/js/pages/auth/confirm-password.tsx @@ -1,5 +1,5 @@ +import GuestLayout from '@/layouts/guest-layout'; import { Head, useForm } from '@inertiajs/react'; -import { GuestLayout } from 'layouts'; import { useEffect } from 'react'; import { Button, Form, TextField } from 'ui'; diff --git a/resources/js/pages/auth/forgot-password.tsx b/resources/js/pages/auth/forgot-password.tsx index 535c9a6..48a7a09 100644 --- a/resources/js/pages/auth/forgot-password.tsx +++ b/resources/js/pages/auth/forgot-password.tsx @@ -1,5 +1,5 @@ +import GuestLayout from '@/layouts/guest-layout'; import { Head, useForm } from '@inertiajs/react'; -import { GuestLayout } from 'layouts'; import { Button, Form, TextField } from 'ui'; interface ForgotPasswordProps { diff --git a/resources/js/pages/auth/login.tsx b/resources/js/pages/auth/login.tsx index 6313a07..e8b4389 100644 --- a/resources/js/pages/auth/login.tsx +++ b/resources/js/pages/auth/login.tsx @@ -1,7 +1,7 @@ +import GuestLayout from '@/layouts/guest-layout'; import { Head, useForm } from '@inertiajs/react'; -import { GuestLayout } from 'layouts'; import React, { useEffect } from 'react'; -import { Button, buttonStyles, Checkbox, Form, Link, TextField } from 'ui'; +import { Button, Checkbox, Form, Link, TextField } from 'ui'; interface LoginProps { status: string; @@ -34,7 +34,7 @@ export default function Login(args: LoginProps) { {status &&
{status}
} -
+ {canResetPassword && ( - + Forgot your password? )}
- -
- - Register + +
+ + Dont have account? Register - -
diff --git a/resources/js/pages/auth/register.tsx b/resources/js/pages/auth/register.tsx index 75a435c..8717f86 100644 --- a/resources/js/pages/auth/register.tsx +++ b/resources/js/pages/auth/register.tsx @@ -1,7 +1,7 @@ +import GuestLayout from '@/layouts/guest-layout'; import { Head, useForm } from '@inertiajs/react'; -import { GuestLayout } from 'layouts'; import React, { useEffect } from 'react'; -import { Button, buttonStyles, Checkbox, Form, Link, TextField } from 'ui'; +import { Button, Form, Link, TextField } from 'ui'; export default function Register() { const { data, setData, post, processing, errors, reset } = useForm({ @@ -23,18 +23,16 @@ export default function Register() { post('/register'); }; - console.log(import.meta.env.VITE_HAS_TERMS_AND_PRIVACY_POLICY_FEATURE); return ( <> -
+ setData('name', v)} @@ -46,57 +44,40 @@ export default function Register() { name="email" label="Email" value={data.email} - className="mt-1" autoComplete="username" onChange={(v) => setData('email', v)} errorMessage={errors.email} isRequired /> - setData('password', v)} - errorMessage={errors.password} - isRequired - /> - - setData('password_confirmation', v)} - errorMessage={errors.password_confirmation} - isRequired - /> - - {import.meta.env.VITE_HAS_TERMS_AND_PRIVACY_POLICY_FEATURE && ( -
- setData('terms', e)} isRequired> - I agree to the{' '} - - - terms of service - {' '} - and{' '} - - privacy policy - -
- )} +
+ setData('password', v)} + errorMessage={errors.password} + isRequired + /> -
- + setData('password_confirmation', v)} + errorMessage={errors.password_confirmation} + isRequired + /> +
+ +
+ Already registered? - -
diff --git a/resources/js/pages/auth/reset-password.tsx b/resources/js/pages/auth/reset-password.tsx index 396bb3d..f0d16fa 100644 --- a/resources/js/pages/auth/reset-password.tsx +++ b/resources/js/pages/auth/reset-password.tsx @@ -1,5 +1,5 @@ +import GuestLayout from '@/layouts/guest-layout'; import { Head, useForm } from '@inertiajs/react'; -import { GuestLayout } from 'layouts'; import { useEffect } from 'react'; import { Button, Form, TextField } from 'ui'; diff --git a/resources/js/pages/auth/verify-email.tsx b/resources/js/pages/auth/verify-email.tsx index 5f457b4..0913b26 100644 --- a/resources/js/pages/auth/verify-email.tsx +++ b/resources/js/pages/auth/verify-email.tsx @@ -1,4 +1,4 @@ -import { GuestLayout } from '@/layouts/guest-layout'; +import GuestLayout from '@/layouts/guest-layout'; import { Head, useForm } from '@inertiajs/react'; import { Button, Form, Link } from 'ui'; diff --git a/resources/js/pages/dashboard.tsx b/resources/js/pages/dashboard.tsx index c3bbbcc..46db103 100644 --- a/resources/js/pages/dashboard.tsx +++ b/resources/js/pages/dashboard.tsx @@ -1,6 +1,6 @@ +import AppLayout from '@/layouts/app-layout'; import { PagePropsData } from '@/types'; import { Head } from '@inertiajs/react'; -import { AppLayout } from 'layouts'; import { Card, Container } from 'ui'; export default function Dashboard({ auth }: PagePropsData) { diff --git a/resources/js/pages/home.tsx b/resources/js/pages/home.tsx index 0cfa79f..6b842eb 100644 --- a/resources/js/pages/home.tsx +++ b/resources/js/pages/home.tsx @@ -1,16 +1,10 @@ +import { Header } from '@/components/header'; +import { Logo } from '@/components/logo'; +import AppLayout from '@/layouts/app-layout'; +import { IconBrandJustdBlocks } from '@/layouts/app-navbar'; import { Head } from '@inertiajs/react'; -import { Header } from 'components/header'; -import { Logo } from 'components/logo'; -import { - IconBrandGithub, - IconBrandJustd, - IconBrandKarteil, - IconBrandParanoid, - IconBrandParsinta, - IconCube -} from 'justd-icons'; -import { AppLayout } from 'layouts'; -import { Card, Container, Grid, Link } from 'ui'; +import { IconBrandJustd, IconBrandParanoid, IconBrandParsinta, IconWindowVisitFill } from 'justd-icons'; +import { Card, Container, Link } from 'ui'; const items = [ { @@ -21,11 +15,11 @@ const items = [ ' Justd is a chill set of React components, built on top of React Aria Components, all about keeping the web accessible.' }, { - name: 'Inertia.ts', - url: 'https://github.com/irsyadadl/inertia.ts', - icon: IconBrandGithub, + name: 'Blocks', + url: 'https://blocks.getjustd.com', + icon: IconBrandJustdBlocks, description: - 'This project is developed by IrsyadAdl, if you want to contribute to this project, please visit the Github Repository.' + 'Create stunning, professional-grade layouts that not only save time but also elevate the quality of your projects.' }, { name: 'Icons', @@ -35,9 +29,9 @@ const items = [ 'A library of beautifully crafted react icons, perfect for enhancing the visual appeal and user experience of your web applications.' }, { - name: 'Next.js Template', - url: 'https://irsyad.co/s', - icon: IconCube, + name: 'Templates', + url: 'https://blocks.getjustd.com/templates', + icon: IconWindowVisitFill, description: 'Explore the next.js templates from web apps to design systems, all here.' }, { @@ -46,13 +40,6 @@ const items = [ icon: IconBrandParsinta, description: 'Improve your skills with Parsinta by pushing your skills to the next level, through the series here such as Laravel, Vue, React, Tailwind CSS and Much more.' - }, - { - name: 'Karteil', - url: 'https://karteil.com', - icon: IconBrandKarteil, - description: - 'Improve your skills with Karteil by pushing your skills to the next level, through the online books here such as Laravel, Vue, React, Tailwind CSS and Much more.' } ]; @@ -80,32 +67,24 @@ export default function Home() {
- - - {items.map((item) => ( - - - -
-
- -
+
+ {items.map((item) => ( +
+ + +
+
+
- - {item.name} - {item.description} - - - - ))} - - +
+ + {item.name} + {item.description} + +
+
+ ))} +
diff --git a/resources/js/pages/profile/edit.tsx b/resources/js/pages/profile/edit.tsx index 7c504dd..8b39626 100644 --- a/resources/js/pages/profile/edit.tsx +++ b/resources/js/pages/profile/edit.tsx @@ -1,6 +1,6 @@ +import { Header } from '@/components/header'; +import AppLayout from '@/layouts/app-layout'; import { Head } from '@inertiajs/react'; -import { Header } from 'components/header'; -import { AppLayout } from 'layouts'; import { Container } from 'ui'; import { DeleteUserForm, UpdatePasswordForm, UpdateProfileInformationForm } from './partials'; @@ -17,7 +17,7 @@ export default function Edit({ mustVerifyEmail, status }: Props) {
-
+
diff --git a/resources/js/pages/profile/partials/update-password-form.tsx b/resources/js/pages/profile/partials/update-password-form.tsx index 0b1e968..e17f338 100644 --- a/resources/js/pages/profile/partials/update-password-form.tsx +++ b/resources/js/pages/profile/partials/update-password-form.tsx @@ -46,7 +46,6 @@ export function UpdatePasswordForm() { setData('current_password', v)} type="password" autoComplete="current-password" @@ -69,7 +68,6 @@ export function UpdatePasswordForm() { label="Confirm Password" name="password_confirmation" value={data.password_confirmation} - className="mt-1" onChange={(v) => setData('password_confirmation', v)} errorMessage={errors.password_confirmation} isRequired diff --git a/resources/js/pages/profile/partials/update-profile-information-form.tsx b/resources/js/pages/profile/partials/update-profile-information-form.tsx index ac8c638..0222e8e 100644 --- a/resources/js/pages/profile/partials/update-profile-information-form.tsx +++ b/resources/js/pages/profile/partials/update-profile-information-form.tsx @@ -35,7 +35,6 @@ export function UpdateProfileInformationForm({ mustVerifyEmail, status, classNam label="Name" type="text" value={data.name} - className="mt-1" onChange={(v) => setData('name', v)} isRequired errorMessage={errors.name} @@ -47,7 +46,6 @@ export function UpdateProfileInformationForm({ mustVerifyEmail, status, classNam type="email" label="Email" value={data.email} - className="mt-1" onChange={(v) => setData('email', v)} isRequired errorMessage={errors.email} diff --git a/routes/web.php b/routes/web.php index a28f285..e17bd84 100644 --- a/routes/web.php +++ b/routes/web.php @@ -15,5 +15,5 @@ Route::delete('profile', [ProfileController::class, 'destroy'])->name('profile.destroy'); }); -require __DIR__ . '/auth.php'; -require __DIR__ . '/dev.php'; +require __DIR__.'/auth.php'; +require __DIR__.'/dev.php'; diff --git a/tests/Feature/Auth/EmailVerificationTest.php b/tests/Feature/Auth/EmailVerificationTest.php index e8799b9..f282dff 100644 --- a/tests/Feature/Auth/EmailVerificationTest.php +++ b/tests/Feature/Auth/EmailVerificationTest.php @@ -28,7 +28,7 @@ Event::assertDispatched(Verified::class); expect($user->fresh()->hasVerifiedEmail())->toBeTrue(); - $response->assertRedirect(route('dashboard', absolute: false) . '?verified=1'); + $response->assertRedirect(route('dashboard', absolute: false).'?verified=1'); }); test('email is not verified with invalid hash', function () { diff --git a/tests/Feature/Auth/PasswordResetTest.php b/tests/Feature/Auth/PasswordResetTest.php index 25c7d24..0504276 100644 --- a/tests/Feature/Auth/PasswordResetTest.php +++ b/tests/Feature/Auth/PasswordResetTest.php @@ -28,7 +28,7 @@ $this->post('/forgot-password', ['email' => $user->email]); Notification::assertSentTo($user, ResetPassword::class, function ($notification) { - $response = $this->get('/reset-password/' . $notification->token); + $response = $this->get('/reset-password/'.$notification->token); $response->assertStatus(200); diff --git a/tsconfig.json b/tsconfig.json index 2de5b03..3cd29d2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,8 +14,6 @@ "noEmit": true, "paths": { "@/*": ["./resources/js/*"], - "components/*": ["./resources/js/components/*"], - "layouts": ["./resources/js/layouts/index.ts"], "ziggy-js": ["./vendor/tightenco/ziggy"], "ui": ["./resources/js/components/ui/index.ts"] } diff --git a/vite.config.js b/vite.config.js index 0460c48..7412280 100644 --- a/vite.config.js +++ b/vite.config.js @@ -26,8 +26,6 @@ export default defineConfig({ resolve: { alias: { ui: resolve('resources/js/components/ui/index.ts'), - layouts: resolve('resources/js/layouts/index.ts'), - components: resolve('resources/js/components'), 'ziggy-js': resolve('vendor/tightenco/ziggy') } } From df732e1843d68363530f028160590235587d068d Mon Sep 17 00:00:00 2001 From: "Irsyad A. Panjaitan" Date: Fri, 7 Feb 2025 15:23:38 +0700 Subject: [PATCH 2/2] chore: release v1.3.15 --- CHANGELOG.md | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4274879..5077cba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Changelog +## [1.3.15](https://github.com/justdlabs/inertia.ts/compare/v1.3.14...v1.3.15) (2025-02-07) + ## [1.3.14](https://github.com/justdlabs/inertia.ts/compare/v1.3.13...v1.3.14) (2025-01-21) ## [1.3.13](https://github.com/justdlabs/inertia.ts/compare/v1.3.12...v1.3.13) (2025-01-18) diff --git a/package.json b/package.json index ce94f48..bd72742 100644 --- a/package.json +++ b/package.json @@ -44,5 +44,5 @@ "tailwindcss-animate": "^1.0.7", "vite": "^6.1.0" }, - "version": "1.3.14" + "version": "1.3.15" }