Add Laravel IDE discovery files for VS Code integration
- Introduced multiple discovery files to enhance Laravel IDE support in Visual Studio Code. - Implemented functionality to retrieve and parse test cases, translations, Livewire components, and middleware information. - Enhanced error handling and logging configurations for better debugging experience. - Utilized Laravel's service provider for bootstrapping necessary configurations.
This commit is contained in:
@@ -19,25 +19,86 @@
|
||||
</script>
|
||||
|
||||
<style>
|
||||
/* ── Brand text animated gradient ── */
|
||||
.text-flow-effect {
|
||||
background: linear-gradient(75deg,
|
||||
hsl(178, 46.40%, 11.00%) 0%,
|
||||
hsl(211, 57.80%, 17.60%) 30%,
|
||||
hsl(220, 98%, 61%) 45%,
|
||||
hsl(207, 53.00%, 50.80%) 55%,
|
||||
hsl(214, 82.50%, 31.40%) 70%,
|
||||
hsl(222, 47%, 11%) 100%);
|
||||
background-size: 400% auto;
|
||||
background: linear-gradient(
|
||||
90deg,
|
||||
hsl(220, 98%, 61%) 0%,
|
||||
hsl(260, 80%, 65%) 25%,
|
||||
hsl(220, 98%, 61%) 50%,
|
||||
hsl(190, 90%, 50%) 75%,
|
||||
hsl(220, 98%, 61%) 100%
|
||||
);
|
||||
background-size: 300% auto;
|
||||
background-clip: text;
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
animation: textFlowAnimation 8s linear infinite;
|
||||
animation: textFlowAnimation 6s ease-in-out infinite;
|
||||
}
|
||||
|
||||
@keyframes textFlowAnimation {
|
||||
to {
|
||||
background-position: 400% center;
|
||||
}
|
||||
0% { background-position: 0% center; }
|
||||
50% { background-position: 300% center; }
|
||||
100% { background-position: 0% center; }
|
||||
}
|
||||
|
||||
/* ── Nav link animated underline ── */
|
||||
.nav-link-underline {
|
||||
position: relative;
|
||||
}
|
||||
.nav-link-underline::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
bottom: -2px;
|
||||
left: 50%;
|
||||
width: 0;
|
||||
height: 2px;
|
||||
border-radius: 1px;
|
||||
background: linear-gradient(90deg, hsl(220,98%,61%), hsl(260,80%,65%));
|
||||
transition: width 0.25s ease, left 0.25s ease;
|
||||
}
|
||||
.nav-link-underline:hover::after,
|
||||
.nav-link-underline.active::after {
|
||||
width: 60%;
|
||||
left: 20%;
|
||||
}
|
||||
|
||||
/* ── Register button subtle glow ── */
|
||||
.btn-glow {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
isolation: isolate;
|
||||
}
|
||||
.btn-glow::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
inset: -1px;
|
||||
border-radius: inherit;
|
||||
background: linear-gradient(135deg, hsl(220,98%,61%), hsl(260,80%,65%));
|
||||
opacity: 0;
|
||||
transition: opacity 0.3s ease;
|
||||
z-index: -1;
|
||||
filter: blur(12px);
|
||||
}
|
||||
.btn-glow:hover::before {
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
/* ── Avatar ring gradient ── */
|
||||
.avatar-ring {
|
||||
padding: 2px;
|
||||
background: linear-gradient(135deg, hsl(220,98%,61%), hsl(260,80%,65%));
|
||||
border-radius: 9999px;
|
||||
transition: transform 0.2s ease, box-shadow 0.2s ease;
|
||||
}
|
||||
.avatar-ring:hover {
|
||||
transform: scale(1.05);
|
||||
box-shadow: 0 0 12px hsl(220 98% 61% / 0.35);
|
||||
}
|
||||
.avatar-ring img {
|
||||
display: block;
|
||||
border-radius: 9999px;
|
||||
border: 2px solid hsl(var(--color-background-secondary));
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -47,29 +108,29 @@
|
||||
$watch('slideOverOpen', value => { document.documentElement.style.overflow = value ? 'hidden' : '' });
|
||||
"
|
||||
:class="{
|
||||
'shadow-lg shadow-black/10 border-neutral/80': scrolled,
|
||||
'border-neutral': !scrolled
|
||||
'bg-background-secondary/80 backdrop-blur-xl shadow-lg shadow-black/[0.06] border-neutral/60': scrolled,
|
||||
'bg-background-secondary/50 backdrop-blur-md border-transparent': !scrolled
|
||||
}"
|
||||
class="w-full px-4 lg:px-8 bg-background-secondary border-b flex flex-col lg:flex-row justify-between fixed top-0 z-20 h-auto transition-all duration-300">
|
||||
class="w-full px-4 lg:px-8 border-b flex flex-col lg:flex-row justify-between fixed top-0 z-20 h-auto transition-all duration-500 ease-out">
|
||||
<div class="relative z-50 w-full h-auto">
|
||||
|
||||
<div class="flex flex-row items-center justify-between w-full h-16">
|
||||
|
||||
<!-- Logo -->
|
||||
<div class="flex flex-row items-center">
|
||||
<a href="{{ route('home') }}" class="flex items-center h-10 gap-2" wire:navigate>
|
||||
<x-logo class="h-10" />
|
||||
<span class="text-xl font-bold leading-none flex items-center text-flow-effect">{{ config('app.name') }}</span>
|
||||
<div class="flex flex-row items-center gap-0">
|
||||
<a href="{{ route('home') }}" class="flex items-center h-10 gap-2.5 group" wire:navigate>
|
||||
<x-logo class="h-10 transition-transform duration-300 group-hover:scale-105" />
|
||||
<span class="text-xl font-extrabold tracking-tight leading-none flex items-center text-flow-effect">{{ config('app.name') }}</span>
|
||||
</a>
|
||||
|
||||
<!-- Desktop menu: lg and above -->
|
||||
<div class="hidden lg:flex flex-row ml-7">
|
||||
<div class="hidden lg:flex flex-row items-center ml-8 gap-1">
|
||||
@foreach (\App\Classes\Navigation::getLinks() as $nav)
|
||||
@if (isset($nav['children']) && count($nav['children']) > 0)
|
||||
<div class="relative">
|
||||
<x-dropdown>
|
||||
<x-slot:trigger>
|
||||
<span class="flex flex-row items-center p-3 text-sm font-semibold whitespace-nowrap text-base hover:text-base/80">{{ $nav['name'] }}</span>
|
||||
<span class="nav-link-underline flex flex-row items-center px-3 py-2 text-sm font-medium whitespace-nowrap text-base/80 hover:text-base transition-colors duration-200">{{ $nav['name'] }}</span>
|
||||
</x-slot:trigger>
|
||||
<x-slot:content>
|
||||
@foreach ($nav['children'] as $child)
|
||||
@@ -84,7 +145,7 @@
|
||||
@else
|
||||
<x-navigation.link :href="route($nav['route'], $nav['params'] ?? null)"
|
||||
:spa="isset($nav['spa']) ? $nav['spa'] : true"
|
||||
class="flex items-center px-4 py-2">
|
||||
class="nav-link-underline flex items-center px-3 py-2">
|
||||
{{ $nav['name'] }}
|
||||
</x-navigation.link>
|
||||
@endif
|
||||
@@ -93,22 +154,7 @@
|
||||
</div>
|
||||
|
||||
<!-- Right-side controls -->
|
||||
<div class="flex items-center gap-3">
|
||||
|
||||
<!-- Desktop-only: md/lg controls -->
|
||||
<!--<div class="hidden lg:flex items-center gap-2">
|
||||
<x-dropdown>
|
||||
<x-slot:trigger>
|
||||
<span class="text-sm font-semibold">{{ strtoupper(app()->getLocale()) }} <span class="text-base/50">|</span> {{ session('currency', config('settings.default_currency')) }}</span>
|
||||
</x-slot:trigger>
|
||||
<x-slot:content>
|
||||
<strong class="block p-2 text-xs font-semibold uppercase text-base/50">Language</strong>
|
||||
<livewire:components.language-switch />
|
||||
<livewire:components.currency-switch />
|
||||
</x-slot:content>
|
||||
</x-dropdown>
|
||||
<x-theme-toggle />
|
||||
</div>-->
|
||||
<div class="flex items-center gap-2">
|
||||
|
||||
<livewire:components.cart />
|
||||
|
||||
@@ -117,9 +163,11 @@
|
||||
<div class="hidden lg:block">
|
||||
<x-dropdown>
|
||||
<x-slot:trigger>
|
||||
<div class="flex items-center gap-3">
|
||||
<img src="{{ auth()->user()->avatar }}" class="w-8 h-8 rounded-full border-2 border-background-secondary" alt="avatar" />
|
||||
<span class="text-sm font-bold">{{ Auth::user()->first_name }}</span>
|
||||
<div class="flex items-center gap-2.5 cursor-pointer">
|
||||
<div class="avatar-ring">
|
||||
<img src="{{ auth()->user()->avatar }}" class="w-8 h-8" alt="avatar" />
|
||||
</div>
|
||||
<span class="text-sm font-semibold text-base/90">{{ Auth::user()->first_name }}</span>
|
||||
</div>
|
||||
</x-slot:trigger>
|
||||
<x-slot:content>
|
||||
@@ -135,15 +183,15 @@
|
||||
</x-dropdown>
|
||||
</div>
|
||||
@else
|
||||
<div class="hidden lg:flex items-center gap-3">
|
||||
<div class="hidden lg:flex items-center gap-2.5">
|
||||
<a href="{{ route('login') }}" wire:navigate>
|
||||
<button class="px-4 py-2 text-sm font-medium text-base border border-neutral hover:text-white hover:bg-primary rounded-lg transition-all duration-200">
|
||||
<button class="px-4 py-2 text-sm font-medium text-base/80 hover:text-base rounded-lg transition-all duration-200 hover:bg-neutral/20">
|
||||
{{ __('navigation.login') }}
|
||||
</button>
|
||||
</a>
|
||||
@if(!config('settings.registration_disabled', false))
|
||||
<a href="{{ route('register') }}" wire:navigate>
|
||||
<button class="px-4 py-2 text-sm font-medium text-white bg-gradient-to-r from-primary to-secondary hover:from-primary/50 hover:to-secondary/50 rounded-lg transition-all duration-200 shadow-lg hover:shadow-xl transform hover:scale-105">
|
||||
<button class="btn-glow px-5 py-2 text-sm font-semibold text-white bg-gradient-to-r from-primary to-secondary rounded-lg transition-all duration-300 shadow-md shadow-primary/20 hover:shadow-lg hover:shadow-primary/30 hover:brightness-110 active:scale-[0.97]">
|
||||
{{ __('navigation.register') }}
|
||||
</button>
|
||||
</a>
|
||||
@@ -152,12 +200,14 @@
|
||||
@endif
|
||||
|
||||
<!-- Mobile menu toggle -->
|
||||
<button @click="slideOverOpen = !slideOverOpen" class="relative w-12 h-12 flex lg:hidden items-center justify-center rounded-xl bg-background hover:bg-neutral/50 transition-all duration-300 group" aria-label="Toggle Menu">
|
||||
<span x-show="!slideOverOpen" x-transition.opacity class="absolute inset-0 flex items-center justify-center">
|
||||
<x-ri-menu-fill class="size-6 text-base/80 group-hover:text-foreground transition-colors duration-200" />
|
||||
<button @click="slideOverOpen = !slideOverOpen"
|
||||
class="relative w-10 h-10 flex lg:hidden items-center justify-center rounded-lg hover:bg-neutral/20 transition-all duration-200 group"
|
||||
aria-label="Toggle Menu">
|
||||
<span x-show="!slideOverOpen" x-transition:enter="transition ease-out duration-200" x-transition:enter-start="opacity-0 rotate-90 scale-75" x-transition:enter-end="opacity-100 rotate-0 scale-100" class="absolute inset-0 flex items-center justify-center">
|
||||
<x-ri-menu-fill class="size-5 text-base/70 group-hover:text-base transition-colors duration-200" />
|
||||
</span>
|
||||
<span x-show="slideOverOpen" x-transition.opacity class="absolute inset-0 flex items-center justify-center">
|
||||
<x-ri-close-fill class="size-6 text-base/80 group-hover:text-foreground transition-colors duration-200" />
|
||||
<span x-show="slideOverOpen" x-transition:enter="transition ease-out duration-200" x-transition:enter-start="opacity-0 -rotate-90 scale-75" x-transition:enter-end="opacity-100 rotate-0 scale-100" class="absolute inset-0 flex items-center justify-center">
|
||||
<x-ri-close-fill class="size-5 text-base/70 group-hover:text-base transition-colors duration-200" />
|
||||
</span>
|
||||
</button>
|
||||
|
||||
@@ -176,7 +226,7 @@
|
||||
x-transition:leave-start="opacity-100"
|
||||
x-transition:leave-end="opacity-0"
|
||||
@click="slideOverOpen = false"
|
||||
class="absolute inset-0 bg-black/40 backdrop-blur-sm"></div>
|
||||
class="absolute inset-0 bg-black/50 backdrop-blur-md"></div>
|
||||
|
||||
{{-- Slide-over panel --}}
|
||||
<div x-show="slideOverOpen"
|
||||
@@ -187,12 +237,12 @@
|
||||
x-transition:leave-start="opacity-100 translate-y-0"
|
||||
x-transition:leave-end="opacity-0 translate-y-full"
|
||||
@click.stop
|
||||
class="absolute left-0 right-0 top-16 bg-background-secondary/95 backdrop-blur-xl border-t border-neutral/50 shadow-2xl overflow-y-auto flex flex-col rounded-t-3xl"
|
||||
class="absolute left-0 right-0 top-16 bg-background-secondary/90 backdrop-blur-2xl border-t border-neutral/30 shadow-2xl overflow-y-auto flex flex-col rounded-t-2xl"
|
||||
style="height:calc(100dvh - 4rem);">
|
||||
<div class="flex flex-col h-full p-6">
|
||||
{{-- Swipe handle indicator --}}
|
||||
<div class="flex justify-center mb-4">
|
||||
<div class="w-12 h-1.5 bg-neutral/50 rounded-full"></div>
|
||||
<div class="flex justify-center mb-5">
|
||||
<div class="w-10 h-1 bg-neutral/40 rounded-full"></div>
|
||||
</div>
|
||||
<div class="flex-1 min-h-0 overflow-y-auto">
|
||||
<x-navigation.sidebar-links />
|
||||
|
||||
Reference in New Issue
Block a user