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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Light
-
-
-
-
-
- Dark
-
-
-
-
-
- System
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Error
-
-
- Error
-
-
-
- Call to undefined method Sabre\DAV\Auth\Plugin::getRealm()
-
-
-
-
-
-
- PROPFIND kithkin.lan
-
-
-
- PHP 8.4.8 — Laravel 12.20.0
-
-
-
-
-
-
-
-
-
-
-
-
- Collapse
- Expand
- vendor frames
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 45 vendor frames collapsed
-
-
-
-
-
-
-
-
-
- 1 vendor
- frame collapsed
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- app/Http/Controllers/DavController.php
-
- :51
-
-
-
-
-
- $server->on('beforeMethod', function () {
- \Log::info('SabreDAV beforeMethod triggered');
- });
- $authPlugin = new \Sabre\DAV\Auth\Plugin($authBackend);
- \Log::info('AuthPlugin realm is', ['realm' => $authPlugin->getRealm()]);
- $server->exec();
- exit;
- }
-}
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php
-
- :46
-
-
-
-
-
- if (method_exists($controller, 'callAction')) {
- return $controller->callAction($method, $parameters);
- }
-
- return $controller->{$method}(...array_values($parameters));
- }
-
- /**
- * Resolve the parameters for the controller.
- *
- * @param \Illuminate\Routing\Route $route
- * @param mixed $controller
- * @param string $method
- * @return array
- */
- protected function resolveParameters(Route $route, $controller, $method)
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Routing/Route.php
-
- :265
-
-
-
-
-
*
- * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
- */
- protected function runController()
- {
- return $this->controllerDispatcher()->dispatch(
- $this, $this->getController(), $this->getControllerMethod()
- );
- }
-
- /**
- * Get the controller instance for the route.
- *
- * @return mixed
- *
- * @throws \Illuminate\Contracts\Container\BindingResolutionException
- */
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Routing/Route.php
-
- :211
-
-
-
-
-
{
- $this->container = $this->container ?: new Container;
-
- try {
- if ($this->isControllerAction()) {
- return $this->runController();
- }
-
- return $this->runCallable();
- } catch (HttpResponseException $e) {
- return $e->getResponse();
- }
- }
-
- /**
- * Checks whether the route's action is a controller.
- *
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Routing/Router.php
-
- :808
-
-
-
-
-
- return (new Pipeline($this->container))
- ->send($request)
- ->through($middleware)
- ->then(fn ($request) => $this->prepareResponse(
- $request, $route->run()
- ));
- }
-
- /**
- * Gather the middleware for the given route with resolved class names.
- *
- * @param \Illuminate\Routing\Route $route
- * @return array
- */
- public function gatherRouteMiddleware(Route $route)
- {
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php
-
- :169
-
-
-
-
-
*/
- protected function prepareDestination(Closure $destination)
- {
- return function ($passable) use ($destination) {
- try {
- return $destination($passable);
- } catch (Throwable $e) {
- return $this->handleException($passable, $e);
- }
- };
- }
-
- /**
- * Get a Closure that represents a slice of the application onion.
- *
- * @return \Closure
- */
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php
-
- :50
-
-
-
-
-
}
-
- throw $exception;
- }
-
- return $next($request);
- }
-}
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php
-
- :208
-
-
-
-
-
// since the object we're given was already a fully instantiated object.
- $parameters = [$passable, $stack];
- }
-
- $carry = method_exists($pipe, $this->method)
- ? $pipe->{$this->method}(...$parameters)
- : $pipe(...$parameters);
-
- return $this->handleCarry($carry);
- } catch (Throwable $e) {
- return $this->handleException($passable, $e);
- }
- };
- };
- }
-
- /**
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php
-
- :48
-
-
-
-
-
- // Putting the errors in the view for every view allows the developer to just
- // assume that some errors are always available, which is convenient since
- // they don't have to continually run checks for the presence of errors.
-
- return $next($request);
- }
-}
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php
-
- :208
-
-
-
-
-
// since the object we're given was already a fully instantiated object.
- $parameters = [$passable, $stack];
- }
-
- $carry = method_exists($pipe, $this->method)
- ? $pipe->{$this->method}(...$parameters)
- : $pipe(...$parameters);
-
- return $this->handleCarry($carry);
- } catch (Throwable $e) {
- return $this->handleException($passable, $e);
- }
- };
- };
- }
-
- /**
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php
-
- :120
-
-
-
-
-
$this->startSession($request, $session)
- );
-
- $this->collectGarbage($session);
-
- $response = $next($request);
-
- $this->storeCurrentUrl($request, $session);
-
- $this->addCookieToResponse($response, $session);
-
- // Again, if the session has been configured we will need to close out the session
- // so that the attributes may be persisted to some storage medium. We will also
- // add the session identifier cookie to the application response headers now.
- $this->saveSession($request);
-
- return $response;
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php
-
- :63
-
-
-
-
-
if ($this->manager->shouldBlock() ||
- ($request->route() instanceof Route && $request->route()->locksFor())) {
- return $this->handleRequestWhileBlocking($request, $session, $next);
- }
-
- return $this->handleStatefulRequest($request, $session, $next);
- }
-
- /**
- * Handle the given request within session state.
- *
- * @param \Illuminate\Http\Request $request
- * @param \Illuminate\Contracts\Session\Session $session
- * @param \Closure $next
- * @return mixed
- */
- protected function handleRequestWhileBlocking(Request $request, $session, Closure $next)
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php
-
- :208
-
-
-
-
-
// since the object we're given was already a fully instantiated object.
- $parameters = [$passable, $stack];
- }
-
- $carry = method_exists($pipe, $this->method)
- ? $pipe->{$this->method}(...$parameters)
- : $pipe(...$parameters);
-
- return $this->handleCarry($carry);
- } catch (Throwable $e) {
- return $this->handleException($passable, $e);
- }
- };
- };
- }
-
- /**
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php
-
- :36
-
-
-
-
-
* @param \Closure $next
- * @return mixed
- */
- public function handle($request, Closure $next)
- {
- $response = $next($request);
-
- foreach ($this->cookies->getQueuedCookies() as $cookie) {
- $response->headers->setCookie($cookie);
- }
-
- return $response;
- }
-}
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php
-
- :208
-
-
-
-
-
// since the object we're given was already a fully instantiated object.
- $parameters = [$passable, $stack];
- }
-
- $carry = method_exists($pipe, $this->method)
- ? $pipe->{$this->method}(...$parameters)
- : $pipe(...$parameters);
-
- return $this->handleCarry($carry);
- } catch (Throwable $e) {
- return $this->handleException($passable, $e);
- }
- };
- };
- }
-
- /**
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php
-
- :74
-
-
-
-
-
* @param \Closure $next
- * @return \Symfony\Component\HttpFoundation\Response
- */
- public function handle($request, Closure $next)
- {
- return $this->encrypt($next($this->decrypt($request)));
- }
-
- /**
- * Decrypt the cookies on the request.
- *
- * @param \Symfony\Component\HttpFoundation\Request $request
- * @return \Symfony\Component\HttpFoundation\Request
- */
- protected function decrypt(Request $request)
- {
- foreach ($request->cookies as $key => $cookie) {
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php
-
- :208
-
-
-
-
-
// since the object we're given was already a fully instantiated object.
- $parameters = [$passable, $stack];
- }
-
- $carry = method_exists($pipe, $this->method)
- ? $pipe->{$this->method}(...$parameters)
- : $pipe(...$parameters);
-
- return $this->handleCarry($carry);
- } catch (Throwable $e) {
- return $this->handleException($passable, $e);
- }
- };
- };
- }
-
- /**
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php
-
- :126
-
-
-
-
-
$pipeline = array_reduce(
- array_reverse($this->pipes()), $this->carry(), $this->prepareDestination($destination)
- );
-
- try {
- return $pipeline($this->passable);
- } finally {
- if ($this->finally) {
- ($this->finally)($this->passable);
- }
- }
- }
-
- /**
- * Run the pipeline and return the result.
- *
- * @return mixed
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Routing/Router.php
-
- :807
-
-
-
-
-
$middleware = $shouldSkipMiddleware ? [] : $this->gatherRouteMiddleware($route);
-
- return (new Pipeline($this->container))
- ->send($request)
- ->through($middleware)
- ->then(fn ($request) => $this->prepareResponse(
- $request, $route->run()
- ));
- }
-
- /**
- * Gather the middleware for the given route with resolved class names.
- *
- * @param \Illuminate\Routing\Route $route
- * @return array
- */
- public function gatherRouteMiddleware(Route $route)
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Routing/Router.php
-
- :786
-
-
-
-
-
$request->setRouteResolver(fn () => $route);
-
- $this->events->dispatch(new RouteMatched($route, $request));
-
- return $this->prepareResponse($request,
- $this->runRouteWithinStack($route, $request)
- );
- }
-
- /**
- * Run the given route within a Stack "onion" instance.
- *
- * @param \Illuminate\Routing\Route $route
- * @param \Illuminate\Http\Request $request
- * @return mixed
- */
- protected function runRouteWithinStack(Route $route, Request $request)
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Routing/Router.php
-
- :750
-
-
-
-
-
* @param \Illuminate\Http\Request $request
- * @return \Symfony\Component\HttpFoundation\Response
- */
- public function dispatchToRoute(Request $request)
- {
- return $this->runRoute($request, $this->findRoute($request));
- }
-
- /**
- * Find the route matching a given request.
- *
- * @param \Illuminate\Http\Request $request
- * @return \Illuminate\Routing\Route
- */
- protected function findRoute($request)
- {
- $this->events->dispatch(new Routing($request));
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Routing/Router.php
-
- :739
-
-
-
-
-
*/
- public function dispatch(Request $request)
- {
- $this->currentRequest = $request;
-
- return $this->dispatchToRoute($request);
- }
-
- /**
- * Dispatch the request to a route and return the response.
- *
- * @param \Illuminate\Http\Request $request
- * @return \Symfony\Component\HttpFoundation\Response
- */
- public function dispatchToRoute(Request $request)
- {
- return $this->runRoute($request, $this->findRoute($request));
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php
-
- :200
-
-
-
-
-
protected function dispatchToRouter()
- {
- return function ($request) {
- $this->app->instance('request', $request);
-
- return $this->router->dispatch($request);
- };
- }
-
- /**
- * Call the terminate method on any terminable middleware.
- *
- * @param \Illuminate\Http\Request $request
- * @param \Illuminate\Http\Response $response
- * @return void
- */
- public function terminate($request, $response)
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php
-
- :169
-
-
-
-
-
*/
- protected function prepareDestination(Closure $destination)
- {
- return function ($passable) use ($destination) {
- try {
- return $destination($passable);
- } catch (Throwable $e) {
- return $this->handleException($passable, $e);
- }
- };
- }
-
- /**
- * Get a Closure that represents a slice of the application onion.
- *
- * @return \Closure
- */
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php
-
- :21
-
-
-
-
-
*/
- public function handle($request, Closure $next)
- {
- $this->clean($request);
-
- return $next($request);
- }
-
- /**
- * Clean the request's data.
- *
- * @param \Illuminate\Http\Request $request
- * @return void
- */
- protected function clean($request)
- {
- $this->cleanParameterBag($request->query);
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php
-
- :31
-
-
-
-
-
if ($callback($request)) {
- return $next($request);
- }
- }
-
- return parent::handle($request, $next);
- }
-
- /**
- * Transform the given value.
- *
- * @param string $key
- * @param mixed $value
- * @return mixed
- */
- protected function transform($key, $value)
- {
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php
-
- :208
-
-
-
-
-
// since the object we're given was already a fully instantiated object.
- $parameters = [$passable, $stack];
- }
-
- $carry = method_exists($pipe, $this->method)
- ? $pipe->{$this->method}(...$parameters)
- : $pipe(...$parameters);
-
- return $this->handleCarry($carry);
- } catch (Throwable $e) {
- return $this->handleException($passable, $e);
- }
- };
- };
- }
-
- /**
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php
-
- :21
-
-
-
-
-
*/
- public function handle($request, Closure $next)
- {
- $this->clean($request);
-
- return $next($request);
- }
-
- /**
- * Clean the request's data.
- *
- * @param \Illuminate\Http\Request $request
- * @return void
- */
- protected function clean($request)
- {
- $this->cleanParameterBag($request->query);
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php
-
- :51
-
-
-
-
-
if ($callback($request)) {
- return $next($request);
- }
- }
-
- return parent::handle($request, $next);
- }
-
- /**
- * Transform the given value.
- *
- * @param string $key
- * @param mixed $value
- * @return mixed
- */
- protected function transform($key, $value)
- {
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php
-
- :208
-
-
-
-
-
// since the object we're given was already a fully instantiated object.
- $parameters = [$passable, $stack];
- }
-
- $carry = method_exists($pipe, $this->method)
- ? $pipe->{$this->method}(...$parameters)
- : $pipe(...$parameters);
-
- return $this->handleCarry($carry);
- } catch (Throwable $e) {
- return $this->handleException($passable, $e);
- }
- };
- };
- }
-
- /**
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Http/Middleware/ValidatePostSize.php
-
- :27
-
-
-
-
-
- if ($max > 0 && $request->server('CONTENT_LENGTH') > $max) {
- throw new PostTooLargeException('The POST data is too large.');
- }
-
- return $next($request);
- }
-
- /**
- * Determine the server 'post_max_size' as bytes.
- *
- * @return int
- */
- protected function getPostMaxSize()
- {
- if (is_numeric($postMaxSize = ini_get('post_max_size'))) {
- return (int) $postMaxSize;
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php
-
- :208
-
-
-
-
-
// since the object we're given was already a fully instantiated object.
- $parameters = [$passable, $stack];
- }
-
- $carry = method_exists($pipe, $this->method)
- ? $pipe->{$this->method}(...$parameters)
- : $pipe(...$parameters);
-
- return $this->handleCarry($carry);
- } catch (Throwable $e) {
- return $this->handleException($passable, $e);
- }
- };
- };
- }
-
- /**
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php
-
- :109
-
-
-
-
-
null,
- $this->getHeaders($data)
- );
- }
-
- return $next($request);
- }
-
- /**
- * Determine if the incoming request has a maintenance mode bypass cookie.
- *
- * @param \Illuminate\Http\Request $request
- * @param array $data
- * @return bool
- */
- protected function hasValidBypassCookie($request, array $data)
- {
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php
-
- :208
-
-
-
-
-
// since the object we're given was already a fully instantiated object.
- $parameters = [$passable, $stack];
- }
-
- $carry = method_exists($pipe, $this->method)
- ? $pipe->{$this->method}(...$parameters)
- : $pipe(...$parameters);
-
- return $this->handleCarry($carry);
- } catch (Throwable $e) {
- return $this->handleException($passable, $e);
- }
- };
- };
- }
-
- /**
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php
-
- :48
-
-
-
-
-
* @return \Illuminate\Http\Response
- */
- public function handle($request, Closure $next)
- {
- if (! $this->hasMatchingPath($request)) {
- return $next($request);
- }
-
- $this->cors->setOptions($this->container['config']->get('cors', []));
-
- if ($this->cors->isPreflightRequest($request)) {
- $response = $this->cors->handlePreflightRequest($request);
-
- $this->cors->varyHeader($response, 'Access-Control-Request-Method');
-
- return $response;
- }
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php
-
- :208
-
-
-
-
-
// since the object we're given was already a fully instantiated object.
- $parameters = [$passable, $stack];
- }
-
- $carry = method_exists($pipe, $this->method)
- ? $pipe->{$this->method}(...$parameters)
- : $pipe(...$parameters);
-
- return $this->handleCarry($carry);
- } catch (Throwable $e) {
- return $this->handleException($passable, $e);
- }
- };
- };
- }
-
- /**
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php
-
- :58
-
-
-
-
-
{
- $request::setTrustedProxies([], $this->getTrustedHeaderNames());
-
- $this->setTrustedProxyIpAddresses($request);
-
- return $next($request);
- }
-
- /**
- * Sets the trusted proxies on the request.
- *
- * @param \Illuminate\Http\Request $request
- * @return void
- */
- protected function setTrustedProxyIpAddresses(Request $request)
- {
- $trustedIps = $this->proxies() ?: config('trustedproxy.proxies');
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php
-
- :208
-
-
-
-
-
// since the object we're given was already a fully instantiated object.
- $parameters = [$passable, $stack];
- }
-
- $carry = method_exists($pipe, $this->method)
- ? $pipe->{$this->method}(...$parameters)
- : $pipe(...$parameters);
-
- return $this->handleCarry($carry);
- } catch (Throwable $e) {
- return $this->handleException($passable, $e);
- }
- };
- };
- }
-
- /**
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php
-
- :22
-
-
-
-
-
* @param \Closure $next
- * @return \Symfony\Component\HttpFoundation\Response
- */
- public function handle(Request $request, Closure $next)
- {
- return $next($request);
- }
-
- /**
- * Invoke the deferred callbacks.
- *
- * @param \Illuminate\Http\Request $request
- * @param \Symfony\Component\HttpFoundation\Response $response
- * @return void
- */
- public function terminate(Request $request, Response $response)
- {
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php
-
- :208
-
-
-
-
-
// since the object we're given was already a fully instantiated object.
- $parameters = [$passable, $stack];
- }
-
- $carry = method_exists($pipe, $this->method)
- ? $pipe->{$this->method}(...$parameters)
- : $pipe(...$parameters);
-
- return $this->handleCarry($carry);
- } catch (Throwable $e) {
- return $this->handleException($passable, $e);
- }
- };
- };
- }
-
- /**
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Http/Middleware/ValidatePathEncoding.php
-
- :26
-
-
-
-
-
- if (! mb_check_encoding($decodedPath, 'UTF-8')) {
- throw new MalformedUrlException;
- }
-
- return $next($request);
- }
-}
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php
-
- :208
-
-
-
-
-
// since the object we're given was already a fully instantiated object.
- $parameters = [$passable, $stack];
- }
-
- $carry = method_exists($pipe, $this->method)
- ? $pipe->{$this->method}(...$parameters)
- : $pipe(...$parameters);
-
- return $this->handleCarry($carry);
- } catch (Throwable $e) {
- return $this->handleException($passable, $e);
- }
- };
- };
- }
-
- /**
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php
-
- :126
-
-
-
-
-
$pipeline = array_reduce(
- array_reverse($this->pipes()), $this->carry(), $this->prepareDestination($destination)
- );
-
- try {
- return $pipeline($this->passable);
- } finally {
- if ($this->finally) {
- ($this->finally)($this->passable);
- }
- }
- }
-
- /**
- * Run the pipeline and return the result.
- *
- * @return mixed
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php
-
- :175
-
-
-
-
-
$this->bootstrap();
-
- return (new Pipeline($this->app))
- ->send($request)
- ->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)
- ->then($this->dispatchToRouter());
- }
-
- /**
- * Bootstrap the application for HTTP requests.
- *
- * @return void
- */
- public function bootstrap()
- {
- if (! $this->app->hasBeenBootstrapped()) {
- $this->app->bootstrapWith($this->bootstrappers());
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php
-
- :144
-
-
-
-
-
$this->requestStartedAt = Carbon::now();
-
- try {
- $request->enableHttpMethodParameterOverride();
-
- $response = $this->sendRequestThroughRouter($request);
- } catch (Throwable $e) {
- $this->reportException($e);
-
- $response = $this->renderException($request, $e);
- }
-
- $this->app['events']->dispatch(
- new RequestHandled($request, $response)
- );
-
- return $response;
-
-
-
-
-
-
-
-
- vendor/laravel/framework/src/Illuminate/Foundation/Application.php
-
- :1219
-
-
-
-
-
*/
- public function handleRequest(Request $request)
- {
- $kernel = $this->make(HttpKernelContract::class);
-
- $response = $kernel->handle($request)->send();
-
- $kernel->terminate($request, $response);
- }
-
- /**
- * Handle the incoming Artisan command.
- *
- * @param \Symfony\Component\Console\Input\InputInterface $input
- * @return int
- */
- public function handleCommand(InputInterface $input)
-
-
-
-
-
-
-
-
- public/index.php
-
- :20
-
-
-
-
-
-// Bootstrap Laravel and handle the request...
-/** @var Application $app */
-$app = require_once __DIR__.'/../bootstrap/app.php';
-
-$app->handleRequest(Request::capture());
-
-
-
-
-
-
-
-
- /Users/andrew/.composer/vendor/laravel/valet/server.php
-
- :110
-
-
-
-
-
Server::show404();
-}
-
-chdir(dirname($frontControllerPath));
-
-require $frontControllerPath;
-
-
-
-
-
-
-
-
-
- Request
-
-
-
- PROPFIND
- /dav/principals/andrew@kithkin.lan
-
-
-
- Headers
-
-
-
-
-
-
-
- user-agent
-
-
- curl/8.7.1
-
-
-
-
- host
-
-
- kithkin.lan
-
-
-
-
-
- Body
-
-
-
-
-
-
-
- Application
-
-
-
- Routing
-
-
-
-
-
controller
-
- App\Http\Controllers\DavController@handle
-
-
-
-
-
-
- Routing Parameters
-
-
-
-
-
- {
- "any": "principals/andrew@kithkin.lan"
-}
-
-
-
-
-
- Database Queries
-
-
-
-
-
-
-
- mysql
- (2.02 ms)
-
-
- 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 @@
-
+
{{ __('Remember me') }}
-
+
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 @@
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 @@
+ class="mt-1 block w-full rounded-md border-gray-300 focus:border-indigo-300 focus:ring-3">
@foreach(timezone_identifiers_list() as $tz)
timezone ?? config('app.timezone')) === $tz)>
diff --git a/resources/views/calendars/create.blade.php b/resources/views/calendar/create.blade.php
similarity index 76%
rename from resources/views/calendars/create.blade.php
rename to resources/views/calendar/create.blade.php
index dd2bffe..c70e3c4 100644
--- a/resources/views/calendars/create.blade.php
+++ b/resources/views/calendar/create.blade.php
@@ -7,8 +7,8 @@