diff --git a/app/Http/Controllers/CalendarController.php b/app/Http/Controllers/CalendarController.php index c3c792b..c11d4ea 100644 --- a/app/Http/Controllers/CalendarController.php +++ b/app/Http/Controllers/CalendarController.php @@ -2,36 +2,99 @@ namespace App\Http\Controllers; +use Carbon\Carbon; use Illuminate\Http\Request; +use Illuminate\Support\Collection; use Illuminate\Support\Str; use Illuminate\Support\Facades\DB; use App\Models\Calendar; use App\Models\CalendarMeta; use App\Models\CalendarInstance; +use App\Models\Event; class CalendarController extends Controller { /** - * list calendars owned by the logged-in user + * Consolidated calendar dashboard. + * + * Query params: + * view = month | week | 4day (default: month) + * date = Y-m-d anchor date (default: today, in user TZ) + * + * The view receives a `$payload` array: + * ├─ view current view name + * ├─ range ['start' => Carbon, 'end' => Carbon] + * ├─ calendars keyed by calendar id (for the left-hand toggle list) + * └─ events flat list of VEVENTs in that range */ - public function index() + public function index(Request $request) { + // set the calendar key $principal = auth()->user()->principal_uri; + // get the view and time range + [$view, $range] = $this->resolveRange($request); + + // load the user's calendars $calendars = Calendar::query() - ->select('calendars.*', 'ci.displayname as instance_displayname') // ← add + ->select( + 'calendars.id', + 'ci.displayname', + 'ci.calendarcolor', + 'meta.color as meta_color' + ) ->join('calendarinstances as ci', 'ci.calendarid', '=', 'calendars.id') + ->leftJoin('calendar_meta as meta', 'meta.calendar_id', '=', 'calendars.id') ->where('ci.principaluri', $principal) ->orderBy('ci.displayname') - ->with(['meta']) // no need to eager-load full instances any more ->get(); - return view('calendars.index', compact('calendars')); + // get all the events in one query + $events = Event::forCalendarsInRange( + $calendars->pluck('id'), + $range['start'], + $range['end'] + ); + + // create the calendar grid of days + $grid = $this->buildCalendarGrid($view, $range, $events); + + // format the data for the frontend + $payload = [ + 'view' => $view, + 'range' => $range, + 'calendars' => $calendars->keyBy('id')->map(function ($cal) { + return [ + 'id' => $cal->id, + 'name' => $cal->displayname, + 'color' => $cal->meta_color ?? $cal->calendarcolor ?? '#999', + 'on' => true, // default to visible; the UI can toggle this + ]; + }), + 'events' => $events->map(function ($e) { // just the events map + // fall back to Sabre timestamps if meta is missing + $start = $e->meta->start_at + ?? Carbon::createFromTimestamp($e->firstoccurence); + $end = $e->meta->end_at + ?? ($e->lastoccurence ? Carbon::createFromTimestamp($e->lastoccurence) : null); + + return [ + 'id' => $e->id, + 'calendar_id' => $e->calendarid, + 'title' => $e->meta->title ?? '(no title)', + 'start' => $start->format('c'), + 'end' => optional($end)->format('c'), + ]; + }), + 'grid' => $grid, + ]; + + return view('calendar.index', $payload); } public function create() { - return view('calendars.create'); + return view('calendar.create'); } /** @@ -71,7 +134,7 @@ class CalendarController extends Controller 'updated_at' => now(), ]); - return redirect()->route('calendars.index'); + return redirect()->route('calendar.index'); } /** @@ -97,7 +160,7 @@ class CalendarController extends Controller ->get(); return view( - 'calendars.show', + 'calendar.show', compact('calendar', 'instance', 'events', 'caldavUrl') ); } @@ -117,7 +180,7 @@ class CalendarController extends Controller $instance = $calendar->instances->first(); // may be null but shouldn’t - return view('calendars.edit', compact('calendar', 'instance')); + return view('calendar.edit', compact('calendar', 'instance')); } /** @@ -153,7 +216,7 @@ class CalendarController extends Controller ); return redirect() - ->route('calendars.show', $calendar) + ->route('calendar.show', $calendar) ->with('toast', __('Calendar saved successfully!')); } @@ -164,6 +227,134 @@ class CalendarController extends Controller { $this->authorize('delete', $calendar); $calendar->delete(); // cascades to meta via FK - return redirect()->route('calendars.index'); + return redirect()->route('calendar.index'); + } + + /** + * + * Private helpers + */ + + /** + * normalise $view and $date into a carbon range + * + * @return array [$view, ['start' => Carbon, 'end' => Carbon]] + */ + private function resolveRange(Request $request): array + { + // get the view + $view = in_array($request->query('view'), ['week', '4day']) + ? $request->query('view') + : 'month'; + + // anchor date in the user's timezone + $anchor = Carbon::parse($request->query('date', now()->toDateString())) + ->setTimezone(auth()->user()->timezone ?? config('app.timezone')); + + // set dates based on view + switch ($view) { + case 'week': + $start = $anchor->copy()->startOfWeek(); + $end = $anchor->copy()->endOfWeek(); + break; + + case '4day': + // a rolling 4-day "agenda" view starting at anchor + $start = $anchor->copy()->startOfDay(); + $end = $anchor->copy()->addDays(3)->endOfDay(); + break; + + default: // month + $start = $anchor->copy()->startOfMonth(); + $end = $anchor->copy()->endOfMonth(); + } + + return [$view, ['start' => $start, 'end' => $end]]; + } + + + + + /** + * Assemble an array of day-objects for the requested view. + * + * Day object shape: + * [ + * 'date' => '2025-07-14', + * 'label' => '14', // two-digit day number + * 'in_month' => true|false, // helpful for grey-out styling + * 'events' => [ …event payloads… ] + * ] + * + * For the "month" view the return value also contains + * 'weeks' => [ [7 day-objs], [7 day-objs], … ] + */ + private function buildCalendarGrid(string $view, array $range, Collection $events): array + { + // index events by YYYY-MM-DD for quick lookup */ + $eventsByDay = []; + foreach ($events as $ev) { + $start = $ev->meta->start_at + ?? Carbon::createFromTimestamp($ev->firstoccurence); + $end = $ev->meta->end_at + ?? ($ev->lastoccurence + ? Carbon::createFromTimestamp($ev->lastoccurence) + : $start); + + // spread multi-day events across each day they touch + for ($d = $start->copy()->startOfDay(); + $d->lte($end->copy()->endOfDay()); + $d->addDay()) { + + $key = $d->toDateString(); // e.g. '2025-07-14' + $eventsByDay[$key] ??= []; + $eventsByDay[$key][] = [ + 'id' => $ev->id, + 'calendar_id' => $ev->calendarid, + 'title' => $ev->meta->title ?? '(no title)', + 'start' => $start->format('c'), + 'end' => $end->format('c'), + ]; + } + } + + // determine which individual days belong to this view */ + switch ($view) { + case 'week': + $gridStart = $range['start']->copy(); + $gridEnd = $range['start']->copy()->addDays(6); + break; + + case '4day': + $gridStart = $range['start']->copy(); + $gridEnd = $range['start']->copy()->addDays(3); + break; + + default: // month + $gridStart = $range['start']->copy()->startOfWeek(); // Sunday-start; tweak if needed + $gridEnd = $range['end']->copy()->endOfWeek(); + } + + // walk the span, build the day objects */ + $days = []; + for ($day = $gridStart->copy(); $day->lte($gridEnd); $day->addDay()) { + $iso = $day->toDateString(); + $isToday = $day->isSameDay(Carbon::today()); + $days[] = [ + 'date' => $iso, + 'label' => $day->format('j'), + 'in_month' => $day->month === $range['start']->month, + 'is_today' => $isToday, + 'events' => $eventsByDay[$iso] ?? [], + ]; + } + + // for a month view, also group into weeks + if ($view === 'month') { + $weeks = array_chunk($days, 7); // 7 days per week row + return ['days' => $days, 'weeks' => $weeks]; + } + + return ['days' => $days]; } } diff --git a/app/Models/Event.php b/app/Models/Event.php index 40f3e4c..48579ab 100644 --- a/app/Models/Event.php +++ b/app/Models/Event.php @@ -41,4 +41,30 @@ class Event extends Model { return $this->hasOne(EventMeta::class, 'event_id'); } + + /** + * filter events in event_meta by start and end time + */ + public function scopeInRange($query, $start, $end) + { + return $query->whereHas('meta', function ($q) use ($start, $end) { + $q->where('start_at', '<=', $end) + ->where(function ($qq) use ($start) { + $qq->where('end_at', '>=', $start) + ->orWhereNull('end_at'); // open-ended events + }); + }); + } + + /** + * ccnvenience wrapper for calendar controller + */ + public static function forCalendarsInRange($calendarIds, $start, $end) + { + return static::query() + ->with('meta') // eager-load meta once + ->whereIn('calendarid', $calendarIds) + ->inRange($start, $end) // ← the scope above + ->get(); + } } diff --git a/composer.json b/composer.json index 7d2c1e7..2747689 100644 --- a/composer.json +++ b/composer.json @@ -7,9 +7,9 @@ "license": "MIT", "require": { "php": "^8.2", + "blade-ui-kit/blade-icons": "^1.8", "laravel/framework": "^12.0", "laravel/tinker": "^2.10.1", - "omnia-digital/livewire-calendar": "^3.2", "sabre/dav": "^4.7" }, "require-dev": { diff --git a/composer.lock b/composer.lock index 8e2be02..c8d97f7 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,89 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7376fcf2b57a1242a21836781b34e006", + "content-hash": "d70fc92c0f938b08d8e0050b99c7ed1c", "packages": [ + { + "name": "blade-ui-kit/blade-icons", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/driesvints/blade-icons.git", + "reference": "7b743f27476acb2ed04cb518213d78abe096e814" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/driesvints/blade-icons/zipball/7b743f27476acb2ed04cb518213d78abe096e814", + "reference": "7b743f27476acb2ed04cb518213d78abe096e814", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/filesystem": "^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/support": "^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/view": "^8.0|^9.0|^10.0|^11.0|^12.0", + "php": "^7.4|^8.0", + "symfony/console": "^5.3|^6.0|^7.0", + "symfony/finder": "^5.3|^6.0|^7.0" + }, + "require-dev": { + "mockery/mockery": "^1.5.1", + "orchestra/testbench": "^6.0|^7.0|^8.0|^9.0|^10.0", + "phpunit/phpunit": "^9.0|^10.5|^11.0" + }, + "bin": [ + "bin/blade-icons-generate" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "BladeUI\\Icons\\BladeIconsServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "BladeUI\\Icons\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dries Vints", + "homepage": "https://driesvints.com" + } + ], + "description": "A package to easily make use of icons in your Laravel Blade views.", + "homepage": "https://github.com/blade-ui-kit/blade-icons", + "keywords": [ + "blade", + "icons", + "laravel", + "svg" + ], + "support": { + "issues": "https://github.com/blade-ui-kit/blade-icons/issues", + "source": "https://github.com/blade-ui-kit/blade-icons" + }, + "funding": [ + { + "url": "https://github.com/sponsors/driesvints", + "type": "github" + }, + { + "url": "https://www.paypal.com/paypalme/driesvints", + "type": "paypal" + } + ], + "time": "2025-02-13T20:35:06+00:00" + }, { "name": "brick/math", "version": "0.13.1", @@ -2006,82 +2087,6 @@ ], "time": "2024-12-08T08:18:47+00:00" }, - { - "name": "livewire/livewire", - "version": "v3.6.4", - "source": { - "type": "git", - "url": "https://github.com/livewire/livewire.git", - "reference": "ef04be759da41b14d2d129e670533180a44987dc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/livewire/livewire/zipball/ef04be759da41b14d2d129e670533180a44987dc", - "reference": "ef04be759da41b14d2d129e670533180a44987dc", - "shasum": "" - }, - "require": { - "illuminate/database": "^10.0|^11.0|^12.0", - "illuminate/routing": "^10.0|^11.0|^12.0", - "illuminate/support": "^10.0|^11.0|^12.0", - "illuminate/validation": "^10.0|^11.0|^12.0", - "laravel/prompts": "^0.1.24|^0.2|^0.3", - "league/mime-type-detection": "^1.9", - "php": "^8.1", - "symfony/console": "^6.0|^7.0", - "symfony/http-kernel": "^6.2|^7.0" - }, - "require-dev": { - "calebporzio/sushi": "^2.1", - "laravel/framework": "^10.15.0|^11.0|^12.0", - "mockery/mockery": "^1.3.1", - "orchestra/testbench": "^8.21.0|^9.0|^10.0", - "orchestra/testbench-dusk": "^8.24|^9.1|^10.0", - "phpunit/phpunit": "^10.4|^11.5", - "psy/psysh": "^0.11.22|^0.12" - }, - "type": "library", - "extra": { - "laravel": { - "aliases": { - "Livewire": "Livewire\\Livewire" - }, - "providers": [ - "Livewire\\LivewireServiceProvider" - ] - } - }, - "autoload": { - "files": [ - "src/helpers.php" - ], - "psr-4": { - "Livewire\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Caleb Porzio", - "email": "calebporzio@gmail.com" - } - ], - "description": "A front-end framework for Laravel.", - "support": { - "issues": "https://github.com/livewire/livewire/issues", - "source": "https://github.com/livewire/livewire/tree/v3.6.4" - }, - "funding": [ - { - "url": "https://github.com/livewire", - "type": "github" - } - ], - "time": "2025-07-17T05:12:15+00:00" - }, { "name": "monolog/monolog", "version": "3.9.0", @@ -2583,79 +2588,6 @@ ], "time": "2025-05-08T08:14:37+00:00" }, - { - "name": "omnia-digital/livewire-calendar", - "version": "3.2.0", - "source": { - "type": "git", - "url": "https://github.com/omnia-digital/livewire-calendar.git", - "reference": "9488ebaa84bf96f09c25dfbc2538d394aec365a7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/omnia-digital/livewire-calendar/zipball/9488ebaa84bf96f09c25dfbc2538d394aec365a7", - "reference": "9488ebaa84bf96f09c25dfbc2538d394aec365a7", - "shasum": "" - }, - "require": { - "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "livewire/livewire": "^2.0||^3.0", - "php": "^7.2|^8.0|^8.1|^8.2" - }, - "require-dev": { - "orchestra/testbench": "^5.0|^6.0", - "phpunit/phpunit": "^8.0|^9.0|^10.0|^11.0|^12.0" - }, - "type": "library", - "extra": { - "laravel": { - "aliases": { - "LivewireCalendar": "Omnia\\LivewireCalendar\\LivewireCalendarFacade" - }, - "providers": [ - "Omnia\\LivewireCalendar\\LivewireCalendarServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Omnia\\LivewireCalendar\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Josh Torres", - "email": "josht@omniadigital.io", - "role": "Developer" - }, - { - "name": "Andrés Santibáñez", - "email": "santibanez.andres@gmail.com", - "role": "Developer" - }, - { - "name": "Osei Quashie", - "email": "osei@omniadigital.io", - "role": "Developer" - } - ], - "description": "Laravel Livewire calendar component", - "homepage": "https://github.com/omnia-digital/livewire-calendar", - "keywords": [ - "livewire-calendar", - "omnia", - "omnia-digital" - ], - "support": { - "issues": "https://github.com/omnia-digital/livewire-calendar/issues", - "source": "https://github.com/omnia-digital/livewire-calendar/tree/3.2.0" - }, - "time": "2025-02-28T18:18:23+00:00" - }, { "name": "phpoption/phpoption", "version": "1.9.3", diff --git a/config/blade-icons.php b/config/blade-icons.php new file mode 100644 index 0000000..e107d96 --- /dev/null +++ b/config/blade-icons.php @@ -0,0 +1,114 @@ + [ + + 'default' => [ + /* relative path from app root for svg icons */ + 'path' => 'resources/svg/icons', + /* specific filesystem disk from which to read icons */ + 'disk' => '', + /* default prefix for icon elements */ + 'prefix' => 'icon', + /* fallback when an icon in this set cannot be found */ + 'fallback' => 'home', + /* default classes applied to icons in this set */ + 'class' => '', + /* default set attributes for these icons */ + 'attributes' => [], + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Global Default Classes + |-------------------------------------------------------------------------- + | + | This config option allows you to define some classes which + | will be applied by default to all icons. + | + */ + + 'class' => '', + + /* + |-------------------------------------------------------------------------- + | Global Default Attributes + |-------------------------------------------------------------------------- + | + | This config option allows you to define some attributes which + | will be applied by default to all icons. + | + */ + + 'attributes' => [ + 'width' => 24, + 'height' => 24, + ], + + /* + |-------------------------------------------------------------------------- + | Global Fallback Icon + |-------------------------------------------------------------------------- + | + | This config option allows you to define a global fallback + | icon when an icon in any set cannot be found. It can + | reference any icon from any configured set. + | + */ + + 'fallback' => '', + + /* + |-------------------------------------------------------------------------- + | Components + |-------------------------------------------------------------------------- + | + | These config options allow you to define some + | settings related to Blade Components. + | + */ + + 'components' => [ + + /* + |---------------------------------------------------------------------- + | Disable Components + |---------------------------------------------------------------------- + | + | This config option allows you to disable Blade components + | completely. It's useful to avoid performance problems + | when working with large icon libraries. + | + */ + + 'disabled' => false, + + /* + |---------------------------------------------------------------------- + | Default Icon Component Name + |---------------------------------------------------------------------- + | + | This config option allows you to define the name + | for the default Icon class component. + | + */ + + 'default' => 'icon', + + ], + +]; diff --git a/curl.html b/curl.html deleted file mode 100644 index 8776507..0000000 --- a/curl.html +++ /dev/null @@ -1,3886 +0,0 @@ -HTTP/2 500 -server: nginx/1.27.5 -content-type: text/html; charset=UTF-8 -x-powered-by: PHP/8.4.8 -cache-control: no-cache, private -date: Fri, 18 Jul 2025 18:35:47 GMT -set-cookie: kithkin_session=eyJpdiI6IlRralFpaGgxQWVrYktPaFV3YUdrZlE9PSIsInZhbHVlIjoic055b2ZzTTJGSytjTHBrcXZlTFhIRmZ3c2dTNzhTS0x0dWJweE1JbTdsSHNjdGNsUGdOeWs1K1ZJZ2htSExwY2hiZUk1Q1hhOXJ3L2cwOXdjb1lsa0p4ZklRWk0wWmVVOUVjUFNIMHUvV3ZLVElocW9YUFpDOHA4VHF4Q1kwSEgiLCJtYWMiOiIyZTJmZTAwMDk3ZTZmOWYyYzc5ZWNmOGFlNDU4NDZjMTQ3YzgwZWI1Njk5OGZkMjk2MGNkZDA1OGI0NTIzY2E3IiwidGFnIjoiIn0%3D; expires=Fri, 18 Jul 2025 20:35:47 GMT; Max-Age=7200; path=/; secure; httponly; samesite=lax - - - - - - - - Kithkin - - - - - - - - - - -
-
-
-
-
-
- - - -
- - - Internal Server Error - -
- -
- - -
- - - -
-
-
-
-
- -
-
-
-
-
-
- - - Error - -
-
- Call to undefined method Sabre\DAV\Auth\Plugin::getRealm() -
-
- - -
-
- -
-
-
- -
-
-
-
- - app/Http/Controllers/DavController.php - - :51 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php - - :46 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Routing/Route.php - - :265 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Routing/Route.php - - :211 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Routing/Router.php - - :808 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php - - :169 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php - - :50 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php - - :208 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php - - :48 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php - - :208 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php - - :120 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php - - :63 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php - - :208 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php - - :36 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php - - :208 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php - - :74 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php - - :208 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php - - :126 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Routing/Router.php - - :807 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Routing/Router.php - - :786 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Routing/Router.php - - :750 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Routing/Router.php - - :739 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php - - :200 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php - - :169 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php - - :21 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php - - :31 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php - - :208 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php - - :21 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php - - :51 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php - - :208 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Http/Middleware/ValidatePostSize.php - - :27 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php - - :208 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php - - :109 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php - - :208 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php - - :48 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php - - :208 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php - - :58 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php - - :208 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php - - :22 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php - - :208 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Http/Middleware/ValidatePathEncoding.php - - :26 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php - - :208 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php - - :126 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php - - :175 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php - - :144 -
-
-
-
-
-
-
-
-
-
-
- - vendor/laravel/framework/src/Illuminate/Foundation/Application.php - - :1219 -
-
-
-
-
-
-
-
-
-
-
- - public/index.php - - :20 -
-
-
-
-
-
-
-
-
-
-
- - /Users/andrew/.composer/vendor/laravel/valet/server.php - - :110 -
-
-
-
-
-
-
-
-
-
- -
-
- Request -
- -
- PROPFIND - /dav/principals/andrew@kithkin.lan -
- -
- Headers -
- -
-
- - depth - - -
0
-
-
-
- - accept - - -
*/*
-
-
-
- - user-agent - - -
curl/8.7.1
-
-
-
- - host - - -
kithkin.lan
-
-
-
- -
- Body -
- -
-
- -
No body data
-
-
-
-
- -
-
- Application -
- -
- Routing -
- -
-
- controller - -
App\Http\Controllers\DavController@handle
-
-
-
- middleware - -
web
-
-
-
- -
- Routing Parameters -
- -
-
- -
{
-    "any": "principals/andrew@kithkin.lan"
-}
-
-
-
- -
- Database Queries - - -
- -
-
-
- mysql - -
- -
select * from `sessions` where `id` = 'CKOo0isfBlZMqX4zJbt54MEIGhUE6B1J3V4LxW4c' limit 1
-
-
-
-
-
-
-
- - - - - - diff --git a/database/migrations/0001_01_01_000000_create_users_table.php b/database/migrations/0001_01_01_000000_create_users_table.php index 3ff7250..bf14f89 100644 --- a/database/migrations/0001_01_01_000000_create_users_table.php +++ b/database/migrations/0001_01_01_000000_create_users_table.php @@ -11,10 +11,13 @@ return new class extends Migration Schema::create('users', function (Blueprint $table) { $table->ulid('id')->primary(); // ulid primary key $table->string('uri')->nullable(); // formerly from sabre principals table + $table->string('firstname')->nullable(); + $table->string('lastname')->nullable(); $table->string('displayname')->nullable(); // formerly from sabre principals table - $table->string('name')->nullable(); // custom name if necessary + //$table->string('name')->nullable(); // custom name if necessary $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); + $table->string('timezone', 64)->default('UTC'); $table->string('password'); $table->rememberToken(); $table->timestamps(); diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index fa08930..e977266 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -14,15 +14,19 @@ class DatabaseSeeder extends Seeder public function run(): void { /** credentials from .env (with sensible fall-backs) */ - $email = env('ADMIN_EMAIL', 'admin@example.com'); - $password = env('ADMIN_PASSWORD', 'changeme'); - $name = env('ADMIN_NAME', 'Admin'); + $email = env('ADMIN_EMAIL', 'admin@example.com'); + $password = env('ADMIN_PASSWORD', 'changeme'); + $firstname = env('ADMIN_FIRSTNAME', 'Admin'); + $lastname = env('ADMIN_LASTNAME', 'Account'); + $timezone = env('APP_TIMEZONE', 'UTC'); /** create or update the admin user */ $user = User::updateOrCreate( ['email' => $email], [ - 'name' => $name, + 'firstname' => $firstname, + 'lastname' => $lastname, + 'timezone' => $timezone, 'password' => Hash::make($password), ] ); @@ -30,7 +34,7 @@ class DatabaseSeeder extends Seeder /** fill the sabre-friendly columns */ $user->update([ 'uri' => 'principals/'.$user->email, - 'displayname' => $user->name, + 'displayname' => $firstname.' '.$lastname, ]); /** sample caldav data */ diff --git a/package-lock.json b/package-lock.json index 71dde9f..4b69135 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,13 +6,13 @@ "": { "devDependencies": { "@tailwindcss/forms": "^0.5.2", - "@tailwindcss/vite": "^4.0.0", - "autoprefixer": "^10.4.2", + "@tailwindcss/postcss": "^4.1.11", + "@tailwindcss/vite": "^4.1.11", "axios": "^1.8.2", "concurrently": "^9.0.1", "laravel-vite-plugin": "^1.2.0", "postcss": "^8.4.31", - "tailwindcss": "^3.1.0", + "tailwindcss": "^4.1.11", "vite": "^6.2.4" } }, @@ -485,24 +485,6 @@ "node": ">=18" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@isaacs/fs-minipass": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", @@ -555,55 +537,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.45.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.1.tgz", @@ -913,13 +846,6 @@ "tailwindcss": "4.1.11" } }, - "node_modules/@tailwindcss/node/node_modules/tailwindcss": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz", - "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==", - "dev": true, - "license": "MIT" - }, "node_modules/@tailwindcss/oxide": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.11.tgz", @@ -1166,6 +1092,20 @@ "node": ">= 10" } }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.11.tgz", + "integrity": "sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.11", + "@tailwindcss/oxide": "4.1.11", + "postcss": "^8.4.41", + "tailwindcss": "4.1.11" + } + }, "node_modules/@tailwindcss/vite": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.11.tgz", @@ -1181,13 +1121,6 @@ "vite": "^5.2.0 || ^6 || ^7" } }, - "node_modules/@tailwindcss/vite/node_modules/tailwindcss": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz", - "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -1195,19 +1128,6 @@ "dev": true, "license": "MIT" }, - "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -1224,34 +1144,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "license": "MIT" - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1259,44 +1151,6 @@ "dev": true, "license": "MIT" }, - "node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, "node_modules/axios": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", @@ -1309,82 +1163,6 @@ "proxy-from-env": "^1.1.0" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -1399,37 +1177,6 @@ "node": ">= 0.4" } }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001727", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz", - "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1460,44 +1207,6 @@ "node": ">=8" } }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/chownr": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", @@ -1619,16 +1328,6 @@ "node": ">= 0.8" } }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/concurrently": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.0.tgz", @@ -1655,34 +1354,6 @@ "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1703,20 +1374,6 @@ "node": ">=8" } }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true, - "license": "MIT" - }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -1732,27 +1389,6 @@ "node": ">= 0.4" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.184", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.184.tgz", - "integrity": "sha512-zlaUk/wwnR/27FHNarzOtMgfxD1Q0/2Aby7PnURumQTal7yauqQ3c2HHcG/pjLFTvF3AWv44kMWyArVlfHeDlw==", - "dev": true, - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, "node_modules/enhanced-resolve": { "version": "5.18.2", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", @@ -1868,59 +1504,6 @@ "node": ">=6" } }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/follow-redirects": { "version": "1.15.9", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", @@ -1942,23 +1525,6 @@ } } }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/form-data": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", @@ -1976,20 +1542,6 @@ "node": ">= 6" } }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -2064,40 +1616,6 @@ "node": ">= 0.4" } }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -2170,45 +1688,6 @@ "node": ">= 0.4" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -2219,52 +1698,6 @@ "node": ">=8" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, "node_modules/jiti": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", @@ -2534,26 +1967,6 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -2561,13 +1974,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, "node_modules/magic-string": { "version": "0.30.17", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", @@ -2588,30 +1994,6 @@ "node": ">= 0.4" } }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -2645,22 +2027,6 @@ "mini-svg-data-uri": "cli.js" } }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -2700,18 +2066,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -2731,94 +2085,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -2839,26 +2105,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", @@ -2888,127 +2134,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, - "license": "MIT" - }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -3016,50 +2141,6 @@ "dev": true, "license": "MIT" }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -3070,38 +2151,6 @@ "node": ">=0.10.0" } }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, "node_modules/rollup": { "version": "4.45.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.45.1.tgz", @@ -3142,30 +2191,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -3176,29 +2201,6 @@ "tslib": "^2.1.0" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/shell-quote": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", @@ -3212,19 +2214,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -3235,133 +2224,6 @@ "node": ">=0.10.0" } }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -3378,66 +2240,12 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/tailwindcss": { - "version": "3.4.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", - "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz", + "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==", "dev": true, - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.6.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.6", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss/node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } + "license": "MIT" }, "node_modules/tapable": { "version": "2.2.2", @@ -3467,29 +2275,6 @@ "node": ">=18" } }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/tinyglobby": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", @@ -3535,19 +2320,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -3558,13 +2330,6 @@ "tree-kill": "cli.js" } }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -3572,44 +2337,6 @@ "dev": true, "license": "0BSD" }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, "node_modules/vite": { "version": "6.3.5", "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", @@ -3724,117 +2451,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -3861,6 +2477,8 @@ "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "bin": { "yaml": "bin.mjs" }, diff --git a/package.json b/package.json index e2627b0..b8af6bb 100644 --- a/package.json +++ b/package.json @@ -8,13 +8,13 @@ }, "devDependencies": { "@tailwindcss/forms": "^0.5.2", - "@tailwindcss/vite": "^4.0.0", - "autoprefixer": "^10.4.2", + "@tailwindcss/postcss": "^4.1.11", + "@tailwindcss/vite": "^4.1.11", "axios": "^1.8.2", "concurrently": "^9.0.1", "laravel-vite-plugin": "^1.2.0", "postcss": "^8.4.31", - "tailwindcss": "^3.1.0", + "tailwindcss": "^4.1.11", "vite": "^6.2.4" } } diff --git a/postcss.config.js b/postcss.config.js index 49c0612..8dc11a1 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,6 +1,5 @@ export default { plugins: { - tailwindcss: {}, - autoprefixer: {}, + '@tailwindcss/postcss': {}, }, }; diff --git a/resources/css/app.css b/resources/css/app.css index b5c61c9..7a5a9c2 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -1,3 +1,27 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; +/** tailwind */ +@import 'tailwindcss'; +@import './etc/theme.css'; + +/** kithkin */ +@import './etc/layout.css'; +@import './etc/type.css'; +@import './lib/button.css'; +@import './lib/mini.css'; + +/** plugins */ +@plugin '@tailwindcss/forms'; + +/** laravel package views */ +@source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/**/*.blade.php'; +@source '../../storage/framework/views/**/*.php'; + +/** tailwind v4 corrections */ +@layer base { + *, + ::after, + ::before, + ::backdrop, + ::file-selector-button { + border-color: var(--color-gray-200, currentcolor); + } +} diff --git a/resources/css/etc/layout.css b/resources/css/etc/layout.css new file mode 100644 index 0000000..a5f87a9 --- /dev/null +++ b/resources/css/etc/layout.css @@ -0,0 +1,140 @@ +html { + font-size: 16px; +} + +body { + @apply m-0 p-0 w-dvw h-dvh min-w-dvw min-h-dvh bg-gray-100 font-sans antialiased; + + &#app { + @apply grid; + grid-template-columns: 5rem auto; + grid-template-rows: 1fr 0; + } + + &#auth { + @apply flex items-center justify-center; + + header { + @apply flex flex-row items-center justify-between px-6 fixed top-0 left-0 h-20; + + a { + @apply inline-flex items-center gap-2; + } + } + } +} + +/* primary app navigation on the left */ +nav { + @apply w-20 flex flex-col items-center justify-between; + + /* top items */ + .top { + @apply flex flex-col items-center pt-6 2xl:pt-8 mt-2px; + } + + /* bottom items */ + + .bottom { + @apply pb-6 2xl:pb-8; + } + + /* app buttons */ + menu { + @apply flex flex-col gap-1 items-center mt-6; + + li.app-button { + + a { + @apply flex items-center justify-center p-3 bg-transparent text-black; + transition: background-color 100ms ease-in-out; + border-radius: 70% 50% 70% 30% / 60% 60% 60% 40%; /* blob 1 */ + + &:hover { + @apply bg-gray-200; + } + + &.is-active { + @apply bg-cyan-400; + + &:hover { + @apply bg-cyan-500; + } + } + } + + &:nth-child(2) a { + border-radius: 70% 30% 30% 70% / 60% 40% 60% 40%; /* blob 2 */ + } + + &:nth-child(3) a { + border-radius: 80% 65% 90% 50% / 90% 80% 75% 75%; /* blob 3 */ + } + } + } +} + +/* primary content window defaults */ +main { + @apply rounded-lg bg-white; + + body#app & { + @apply grid m-2 ml-0; + grid-template-rows: 5rem auto; + } + + body#auth & { + @apply w-1/2 mx-auto p-8; + min-width: 16rem; + max-width: 40rem; + } + + /* main content title and actions */ + > header { + @apply flex flex-row items-center justify-between px-6 2xl:px-8; + + h1 { + @apply h-12 max-h-12; + } + + menu { + @apply flex flex-row items-center justify-end gap-2 h-12 max-h-12; + } + } + + /* main content wrapper */ + > article { + @apply grid w-full; + grid-template-columns: minmax(20rem, 20dvw) repeat(3, 1fr); + + /* left column */ + aside { + @apply col-span-1 px-6 2xl:px-8 h-full; + } + + /* calendar page defaults */ + &#calendar { + + aside { + @apply grid pb-6 2xl:pb-8; + grid-template-rows: 1fr min-content; + } + } + } +} +@media (width >= 96rem) { /* 2xl */ + main { + body#app & { + grid-template-rows: 6rem auto; + } + } +} + +/* app logo */ +.logo { + @apply w-10 h-10 flex; + + .overlay { + fill: var(--color-cyan-500); + } +} diff --git a/resources/css/etc/theme.css b/resources/css/etc/theme.css new file mode 100644 index 0000000..f734314 --- /dev/null +++ b/resources/css/etc/theme.css @@ -0,0 +1,47 @@ +@theme { + --font-sans: ui-sans-serif, system-ui, Inter, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + --font-serif: Chewie, ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif; + --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace; + + --color-gray-50: #f6f6f6; + --color-gray-100: #eeeeee; + --color-gray-200: #dddddd; + --color-gray-300: #cfcfcf; + --color-gray-400: #bababa; + --color-gray-500: #a0a0a0; + --color-gray-600: #999999; + --color-gray-700: #777777; + --color-gray-800: #555555; + --color-gray-900: #4a4a4a; + --color-gray-950: #282828; + --color-primary: #151515; + --color-primary-hover: #000000; + --color-cyan-50: oklch(98.97% 0.015 196.79); + --color-cyan-100: oklch(97.92% 0.03 196.61); + --color-cyan-200: oklch(95.79% 0.063 196.12); + --color-cyan-300: oklch(94.76% 0.079 195.87); + --color-cyan-400: oklch(92.6% 0.117 195.31); + --color-cyan-500: oklch(90.54% 0.155 194.76); /* 00ffff */ + --color-cyan-550: oklch(82% 0.2812 194.769); /* 00e3e3 */ + + --border-width-1.5: 1.5px; + + --radius-xs: 0.25rem; + --radius-sm: 0.375rem; + --radius-md: 0.6667rem; + --radius-lg: 1rem; + --radius-xl: 1.25rem; + --radius-2xl: 1.5rem; + --radius-3xl: 2rem; + --radius-4xl: 3rem; + --radius-blob: 80% 65% 90% 50% / 90% 80% 75% 75%; + + --shadow-drop: 2.5px 2.5px 0 0 var(--color-primary); + + --spacing-2px: 2px; + + --text-3xl: 2rem; + --text-3xl--line-height: calc(2.25 / 1.875); + --text-4xl: 3rem; + --text-4xl--line-height: 1; +} diff --git a/resources/css/etc/type.css b/resources/css/etc/type.css new file mode 100644 index 0000000..5fd935c --- /dev/null +++ b/resources/css/etc/type.css @@ -0,0 +1,29 @@ +@font-face { + font-family: 'Fraunces'; + src: url('../font/fraunces-variable.ttf') format('truetype'); +} + +@font-face { + font-family: 'Recoleta'; + src: url('../font/recoleta-bold.woff2') format('woff2'); + font-weight: 700; + font-style: normal; +} + +@font-face { + font-family: 'Chewie'; + src: url('../font/chewie-bold.otf') format('opentype'); + font-weight: 700; + font-style: normal; +} + +@font-face { + font-family: 'Analogue'; + src: url('../font/analogue-bold.woff2') format('woff2'); + font-weight: 700; + font-style: normal; +} + +h1 { + @apply font-serif text-3xl font-extrabold leading-tight; +} diff --git a/resources/css/lib/button.css b/resources/css/lib/button.css new file mode 100644 index 0000000..e65a7c5 --- /dev/null +++ b/resources/css/lib/button.css @@ -0,0 +1,33 @@ +button, +.button { + @apply relative inline-flex items-center cursor-pointer gap-2 rounded-md h-11 px-4 text-lg font-medium; + transition: background-color 100ms ease-in-out; + --button-border: var(--color-primary); + --button-accent: var(--color-primary-hover); + + &.button--primary { + @apply bg-cyan-300; + border: 1.5px solid var(--button-border); + box-shadow: 2.5px 2.5px 0 0 var(--button-border); + + &:hover { + @apply bg-cyan-400; + border-color: var(--button-accent); + } + + &:focus { + box-shadow: none; + left: 2.5px; + top: 2.5px; + } + } + + &.button--icon { + @apply justify-center p-0 h-12 top-px rounded-blob; + aspect-ratio: 1 / 1; + + &:hover { + background-color: rgba(0,0,0,0.075); + } + } +} diff --git a/resources/css/lib/mini.css b/resources/css/lib/mini.css new file mode 100644 index 0000000..56be91c --- /dev/null +++ b/resources/css/lib/mini.css @@ -0,0 +1,74 @@ +.mini { + @apply w-full; + + /* mini controls */ + header{ + @apply flex items-center justify-between px-2 pb-3; + + > span { + @apply font-serif text-lg; + } + } + + /* days wrapper */ + figure { + @apply border-1.5 border-primary shadow-drop rounded-md; + + /* weekdays */ + figcaption { + @apply grid grid-cols-7 p-2 pt-3 pb-0; + + span { + @apply flex items-center justify-center font-semibold; + } + } + + /* day grid wrapper */ + form { + @apply grid grid-cols-7 p-2 pt-1; + } + + /* day */ + .day { + @apply text-base p-0 relative flex items-center justify-center h-auto rounded-blob; + aspect-ratio: 1 / 1; + + &:hover { + @apply bg-gray-50; + } + + &.day--current { + + } + + &.day--outside { + @apply text-gray-500; + } + + &.day--today { + @apply bg-cyan-500 font-bold; + + &:hover { + @apply bg-cyan-550; + } + } + + &.day--with-events { + &::after { + @apply absolute bottom-0 left-1/2 -translate-x-1/2 h-1 rounded-full w-4 bg-yellow-500; + content: ''; + } + &[data-event-count='1']::after { + @apply w-1; + } + &[data-event-count='2']::after { + @apply w-2; + } + &[data-event-count='3']::after { + @apply w-3; + } + } + } + } + +} diff --git a/resources/font/analogue-bold.woff2 b/resources/font/analogue-bold.woff2 new file mode 100644 index 0000000..e99a943 Binary files /dev/null and b/resources/font/analogue-bold.woff2 differ diff --git a/resources/font/chewie-bold.otf b/resources/font/chewie-bold.otf new file mode 100644 index 0000000..8663e3c Binary files /dev/null and b/resources/font/chewie-bold.otf differ diff --git a/resources/font/fraunces-italic.ttf b/resources/font/fraunces-italic.ttf new file mode 100644 index 0000000..7884a1e Binary files /dev/null and b/resources/font/fraunces-italic.ttf differ diff --git a/resources/font/fraunces-variable.ttf b/resources/font/fraunces-variable.ttf new file mode 100644 index 0000000..c3f165a Binary files /dev/null and b/resources/font/fraunces-variable.ttf differ diff --git a/resources/font/recoleta-bold.woff2 b/resources/font/recoleta-bold.woff2 new file mode 100644 index 0000000..b290480 Binary files /dev/null and b/resources/font/recoleta-bold.woff2 differ diff --git a/resources/svg/icons/book-user.svg b/resources/svg/icons/book-user.svg new file mode 100644 index 0000000..eb30215 --- /dev/null +++ b/resources/svg/icons/book-user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/svg/icons/calendar.svg b/resources/svg/icons/calendar.svg new file mode 100644 index 0000000..6917119 --- /dev/null +++ b/resources/svg/icons/calendar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/svg/icons/home.svg b/resources/svg/icons/home.svg new file mode 100644 index 0000000..8e2a689 --- /dev/null +++ b/resources/svg/icons/home.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/svg/icons/notebook.svg b/resources/svg/icons/notebook.svg new file mode 100644 index 0000000..d5ae9f3 --- /dev/null +++ b/resources/svg/icons/notebook.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/svg/icons/plus-circle.svg b/resources/svg/icons/plus-circle.svg new file mode 100644 index 0000000..061817d --- /dev/null +++ b/resources/svg/icons/plus-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/svg/icons/plus.svg b/resources/svg/icons/plus.svg new file mode 100644 index 0000000..12fd70c --- /dev/null +++ b/resources/svg/icons/plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/svg/icons/settings.svg b/resources/svg/icons/settings.svg new file mode 100644 index 0000000..4ede4f6 --- /dev/null +++ b/resources/svg/icons/settings.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/svg/icons/user-circle.svg b/resources/svg/icons/user-circle.svg new file mode 100644 index 0000000..38bfd5f --- /dev/null +++ b/resources/svg/icons/user-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index 78b684f..5587322 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -27,21 +27,21 @@
-
+
@if (Route::has('password.request')) - + {{ __('Forgot your password?') }} @endif - + {{ __('Log in') }} - +
diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php index a857242..c690bfb 100644 --- a/resources/views/auth/register.blade.php +++ b/resources/views/auth/register.blade.php @@ -40,7 +40,7 @@
- + {{ __('Already registered?') }} diff --git a/resources/views/auth/verify-email.blade.php b/resources/views/auth/verify-email.blade.php index eaf811d..612f3c3 100644 --- a/resources/views/auth/verify-email.blade.php +++ b/resources/views/auth/verify-email.blade.php @@ -23,7 +23,7 @@
@csrf -
diff --git a/resources/views/books/index.blade.php b/resources/views/books/index.blade.php index 16a609a..55370fd 100644 --- a/resources/views/books/index.blade.php +++ b/resources/views/books/index.blade.php @@ -9,7 +9,7 @@
{{-- Books list --}} -
+
    @forelse($books as $book)
  • diff --git a/resources/views/calendars/_form.blade.php b/resources/views/calendar/_form.blade.php similarity index 88% rename from resources/views/calendars/_form.blade.php rename to resources/views/calendar/_form.blade.php index 5735f21..45a4b77 100644 --- a/resources/views/calendars/_form.blade.php +++ b/resources/views/calendar/_form.blade.php @@ -18,7 +18,7 @@
    + class="mt-1 block w-full rounded-md shadow-xs border-gray-300 focus:border-indigo-300 focus:ring-3">{{ old('description', $instance?->description ?? '') }}
    @@ -26,7 +26,7 @@
    + + {{ $cal['name'] }} + + @endforeach +
    + + + @foreach ($grid['weeks'] as $week) + @foreach ($week as $day) + + @endforeach + @endforeach + + + + diff --git a/resources/views/calendars/show.blade.php b/resources/views/calendar/show.blade.php similarity index 97% rename from resources/views/calendars/show.blade.php rename to resources/views/calendar/show.blade.php index 99ede30..ac47bbc 100644 --- a/resources/views/calendars/show.blade.php +++ b/resources/views/calendar/show.blade.php @@ -23,7 +23,7 @@
    {{-- Calendar meta --}} -
    +
    {{ __('Description') }}
    @@ -67,7 +67,7 @@
    {{-- Events list --}} -
    +
    {{ __('Events') }}
    diff --git a/resources/views/calendars/index.blade.php b/resources/views/calendars/index.blade.php deleted file mode 100644 index 3dbe09f..0000000 --- a/resources/views/calendars/index.blade.php +++ /dev/null @@ -1,40 +0,0 @@ - - -

    - {{ __('My Calendars') }} -

    -
    - -
    -
    - - {{-- “New Calendar” button --}} - - - {{-- Calendars list --}} -
    - -
    - -
    -
    -
    diff --git a/resources/views/components/application-logo.blade.php b/resources/views/components/application-logo.blade.php index 46579cf..0a1d490 100644 --- a/resources/views/components/application-logo.blade.php +++ b/resources/views/components/application-logo.blade.php @@ -1,3 +1,4 @@ - - + + + diff --git a/resources/views/components/button/icon.blade.php b/resources/views/components/button/icon.blade.php new file mode 100644 index 0000000..7285354 --- /dev/null +++ b/resources/views/components/button/icon.blade.php @@ -0,0 +1,24 @@ +@props([ + 'variant' => '', + 'size' => 'default', + 'type' => 'button', + 'class' => '', + 'label' => 'Icon button' ]) + +@php +$variantClass = match ($variant) { + 'primary' => 'button--primary', + 'secondary' => 'button--secondary', + default => '', +}; + +$sizeClass = match ($size) { + 'sm' => 'button--sm', + 'lg' => 'button--lg', + default => '', +}; +@endphp + + diff --git a/resources/views/components/button/index.blade.php b/resources/views/components/button/index.blade.php new file mode 100644 index 0000000..907cbec --- /dev/null +++ b/resources/views/components/button/index.blade.php @@ -0,0 +1,24 @@ +@props([ + 'variant' => '', + 'size' => 'default', + 'type' => 'button', + 'class' => '', + 'label' => 'Icon button' ]) + +@php +$variantClass = match ($variant) { + 'primary' => 'button--primary', + 'secondary' => 'button--secondary', + default => '', +}; + +$sizeClass = match ($size) { + 'sm' => 'button--sm', + 'lg' => 'button--lg', + default => '', +}; +@endphp + + diff --git a/resources/views/components/calendar/mini-day.blade.php b/resources/views/components/calendar/mini-day.blade.php new file mode 100644 index 0000000..01d5675 --- /dev/null +++ b/resources/views/components/calendar/mini-day.blade.php @@ -0,0 +1,12 @@ +{{ $day['label'] }} +
    diff --git a/resources/views/components/calendar/mini.blade.php b/resources/views/components/calendar/mini.blade.php new file mode 100644 index 0000000..f52402b --- /dev/null +++ b/resources/views/components/calendar/mini.blade.php @@ -0,0 +1,22 @@ +@props(['class' => '']) + +
    +
    + July 2025 + Controls +
    +
    +
    + U + M + T + W + R + F + S +
    +
    + {{ $slot }} +
    +
    +
    diff --git a/resources/views/components/danger-button.blade.php b/resources/views/components/danger-button.blade.php index d17d288..0ce850b 100644 --- a/resources/views/components/danger-button.blade.php +++ b/resources/views/components/danger-button.blade.php @@ -1,3 +1,3 @@ - diff --git a/resources/views/components/dropdown-link.blade.php b/resources/views/components/dropdown-link.blade.php index e0f8ce1..66c4ba4 100644 --- a/resources/views/components/dropdown-link.blade.php +++ b/resources/views/components/dropdown-link.blade.php @@ -1 +1 @@ -merge(['class' => 'block w-full px-4 py-2 text-start text-sm leading-5 text-gray-700 hover:bg-gray-100 focus:outline-none focus:bg-gray-100 transition duration-150 ease-in-out']) }}>{{ $slot }} +merge(['class' => 'block w-full px-4 py-2 text-start text-sm leading-5 text-gray-700 hover:bg-gray-100 focus:outline-hidden focus:bg-gray-100 transition duration-150 ease-in-out']) }}>{{ $slot }} diff --git a/resources/views/components/nav-link.blade.php b/resources/views/components/nav-link.blade.php index 5c101a2..d2bc56d 100644 --- a/resources/views/components/nav-link.blade.php +++ b/resources/views/components/nav-link.blade.php @@ -2,10 +2,12 @@ @php $classes = ($active ?? false) - ? 'inline-flex items-center px-1 pt-1 border-b-2 border-indigo-400 text-sm font-medium leading-5 text-gray-900 focus:outline-none focus:border-indigo-700 transition duration-150 ease-in-out' - : 'inline-flex items-center px-1 pt-1 border-b-2 border-transparent text-sm font-medium leading-5 text-gray-500 hover:text-gray-700 hover:border-gray-300 focus:outline-none focus:text-gray-700 focus:border-gray-300 transition duration-150 ease-in-out'; + ? 'is-active' + : ''; @endphp -merge(['class' => $classes]) }}> - {{ $slot }} - +
  • + merge(['class' => $classes]) }}> + {{ $slot }} + +
  • diff --git a/resources/views/components/primary-button.blade.php b/resources/views/components/primary-button.blade.php index d71f0b6..0cc5558 100644 --- a/resources/views/components/primary-button.blade.php +++ b/resources/views/components/primary-button.blade.php @@ -1,3 +1,3 @@ - diff --git a/resources/views/components/responsive-nav-link.blade.php b/resources/views/components/responsive-nav-link.blade.php index 43b91e7..34640f0 100644 --- a/resources/views/components/responsive-nav-link.blade.php +++ b/resources/views/components/responsive-nav-link.blade.php @@ -2,8 +2,8 @@ @php $classes = ($active ?? false) - ? 'block w-full ps-3 pe-4 py-2 border-l-4 border-indigo-400 text-start text-base font-medium text-indigo-700 bg-indigo-50 focus:outline-none focus:text-indigo-800 focus:bg-indigo-100 focus:border-indigo-700 transition duration-150 ease-in-out' - : 'block w-full ps-3 pe-4 py-2 border-l-4 border-transparent text-start text-base font-medium text-gray-600 hover:text-gray-800 hover:bg-gray-50 hover:border-gray-300 focus:outline-none focus:text-gray-800 focus:bg-gray-50 focus:border-gray-300 transition duration-150 ease-in-out'; + ? 'block w-full ps-3 pe-4 py-2 border-l-4 border-indigo-400 text-start text-base font-medium text-indigo-700 bg-indigo-50 focus:outline-hidden focus:text-indigo-800 focus:bg-indigo-100 focus:border-indigo-700 transition duration-150 ease-in-out' + : 'block w-full ps-3 pe-4 py-2 border-l-4 border-transparent text-start text-base font-medium text-gray-600 hover:text-gray-800 hover:bg-gray-50 hover:border-gray-300 focus:outline-hidden focus:text-gray-800 focus:bg-gray-50 focus:border-gray-300 transition duration-150 ease-in-out'; @endphp merge(['class' => $classes]) }}> diff --git a/resources/views/components/secondary-button.blade.php b/resources/views/components/secondary-button.blade.php index b32b69f..bf7b1d5 100644 --- a/resources/views/components/secondary-button.blade.php +++ b/resources/views/components/secondary-button.blade.php @@ -1,3 +1,3 @@ - diff --git a/resources/views/components/text-input.blade.php b/resources/views/components/text-input.blade.php index da1b12d..51b722e 100644 --- a/resources/views/components/text-input.blade.php +++ b/resources/views/components/text-input.blade.php @@ -1,3 +1,3 @@ @props(['disabled' => false]) -merge(['class' => 'border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 rounded-md shadow-sm']) }}> +merge(['class' => 'border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 rounded-md shadow-xs']) }}> diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php index 66028f2..16712de 100644 --- a/resources/views/dashboard.blade.php +++ b/resources/views/dashboard.blade.php @@ -7,7 +7,7 @@
    -
    +
    {{ __("You're logged in!") }}
    diff --git a/resources/views/events/form.blade.php b/resources/views/events/form.blade.php index 7cda452..36bdafc 100644 --- a/resources/views/events/form.blade.php +++ b/resources/views/events/form.blade.php @@ -15,7 +15,7 @@
    -
    +
    + class="mt-1 block w-full rounded-md shadow-xs border-gray-300 focus:border-indigo-300 focus:ring-3">{{ old('description', $event->meta?->description ?? '') }}
    diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 15a6b54..967f89e 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -4,30 +4,25 @@ - {{ config('app.name', 'Laravel') }} - - @vite(['resources/css/app.css', 'resources/js/app.js']) - -
    - @include('layouts.navigation') + + @include('layouts.navigation') - +
    @isset($header) -
    -
    - {{ $header }} -
    -
    +
    + {{ $header }} +
    @endisset - -
    - {{ $slot }} -
    -
    +
    + {{ $article ?? $slot }} +
    + + + diff --git a/resources/views/layouts/guest.blade.php b/resources/views/layouts/guest.blade.php index 11feb47..db27856 100644 --- a/resources/views/layouts/guest.blade.php +++ b/resources/views/layouts/guest.blade.php @@ -4,27 +4,18 @@ - - {{ config('app.name', 'Laravel') }} - - - - - - + {{ config('app.name', 'Kithkin') }} @vite(['resources/css/app.css', 'resources/js/app.js']) - -
    + +
    + + +
    +
    + {{ $slot }} +
    diff --git a/resources/views/layouts/navigation.blade.php b/resources/views/layouts/navigation.blade.php index db30634..79d0fe1 100644 --- a/resources/views/layouts/navigation.blade.php +++ b/resources/views/layouts/navigation.blade.php @@ -1,110 +1,64 @@ - diff --git a/resources/views/profile/edit.blade.php b/resources/views/profile/edit.blade.php index e0e1d38..57d38a9 100644 --- a/resources/views/profile/edit.blade.php +++ b/resources/views/profile/edit.blade.php @@ -7,19 +7,19 @@
    -
    +
    @include('profile.partials.update-profile-information-form')
    -
    +
    @include('profile.partials.update-password-form')
    -
    +
    @include('profile.partials.delete-user-form')
    diff --git a/resources/views/profile/partials/update-profile-information-form.blade.php b/resources/views/profile/partials/update-profile-information-form.blade.php index 5ae3d35..6bf01e2 100644 --- a/resources/views/profile/partials/update-profile-information-form.blade.php +++ b/resources/views/profile/partials/update-profile-information-form.blade.php @@ -33,7 +33,7 @@

    {{ __('Your email address is unverified.') }} -

    diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php index c893b80..57e5476 100644 --- a/resources/views/welcome.blade.php +++ b/resources/views/welcome.blade.php @@ -15,7 +15,7 @@ @vite(['resources/css/app.css', 'resources/js/app.js']) @else @endif @@ -26,14 +26,14 @@ @auth Dashboard @else Log in @@ -41,7 +41,7 @@ @if (Route::has('register')) + class="inline-block px-5 py-1.5 dark:text-[#EDEDEC] border-[#19140035] hover:border-[#1915014a] border text-[#1b1b18] dark:border-[#3E3E3A] dark:hover:border-[#62605b] rounded-xs text-sm leading-normal"> Register @endif @@ -112,13 +112,13 @@
-
+
{{-- Laravel Logo --}} diff --git a/routes/web.php b/routes/web.php index 7b85ef3..0e04480 100644 --- a/routes/web.php +++ b/routes/web.php @@ -28,6 +28,10 @@ Route::view('/dashboard', 'dashboard') ->middleware(['auth', 'verified']) ->name('dashboard'); +Route::view('/settings', 'settings') + ->middleware(['auth', 'verified']) + ->name('settings'); + Route::middleware('auth')->group(function () { /* User profile (generated by Breeze) */ Route::get ('/profile', [ProfileController::class, 'edit' ])->name('profile.edit'); @@ -35,11 +39,11 @@ Route::middleware('auth')->group(function () { Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy'); /* Calendars CRUD */ - Route::resource('calendars', CalendarController::class); + Route::resource('calendar', CalendarController::class); /* Nested Events CRUD */ - Route::prefix('calendars/{calendar}') - ->name('calendars.') + Route::prefix('calendar/{calendar}') + ->name('calendar.') ->group(function () { Route::get ('events/create', [EventController::class, 'create'])->name('events.create'); Route::post('events', [EventController::class, 'store' ])->name('events.store'); diff --git a/tailwind.config.js b/tailwind.config.js deleted file mode 100644 index c29eb1a..0000000 --- a/tailwind.config.js +++ /dev/null @@ -1,21 +0,0 @@ -import defaultTheme from 'tailwindcss/defaultTheme'; -import forms from '@tailwindcss/forms'; - -/** @type {import('tailwindcss').Config} */ -export default { - content: [ - './vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php', - './storage/framework/views/*.php', - './resources/views/**/*.blade.php', - ], - - theme: { - extend: { - fontFamily: { - sans: ['Figtree', ...defaultTheme.fontFamily.sans], - }, - }, - }, - - plugins: [forms], -};