diff --git a/app/Filament/Resources/InviteLayouts/InviteLayoutResource.php b/app/Filament/Resources/InviteLayouts/InviteLayoutResource.php deleted file mode 100644 index e87f978..0000000 --- a/app/Filament/Resources/InviteLayouts/InviteLayoutResource.php +++ /dev/null @@ -1,141 +0,0 @@ - ListInviteLayouts::route('/'), - 'create' => CreateInviteLayout::route('/create'), - 'edit' => EditInviteLayout::route('/{record}/edit'), - ]; - } - - public static function normalizePayload(array $data): array - { - $data['slug'] = Str::slug($data['slug'] ?? $data['name'] ?? 'layout'); - - $preview = $data['preview'] ?? []; - $qrSize = Arr::get($preview, 'qr.size_px', Arr::get($preview, 'qr_size_px')); - $svgWidth = Arr::get($preview, 'svg.width', Arr::get($preview, 'svg_width')); - $svgHeight = Arr::get($preview, 'svg.height', Arr::get($preview, 'svg_height')); - - $data['preview'] = array_filter([ - 'background' => $preview['background'] ?? null, - 'background_gradient' => $preview['background_gradient'] ?? null, - 'accent' => $preview['accent'] ?? null, - 'secondary' => $preview['secondary'] ?? null, - 'text' => $preview['text'] ?? null, - 'badge' => $preview['badge'] ?? null, - 'qr' => array_filter([ - 'size_px' => $qrSize !== null ? (int) $qrSize : null, - ]), - 'svg' => array_filter([ - 'width' => $svgWidth !== null ? (int) $svgWidth : null, - 'height' => $svgHeight !== null ? (int) $svgHeight : null, - ]), - ], fn ($value) => $value !== null && (! is_array($value) || ! empty($value))); - - if (empty($data['preview']['qr'])) { - unset($data['preview']['qr']); - } - - if (empty($data['preview']['svg'])) { - unset($data['preview']['svg']); - } - - $layoutOptions = $data['layout_options'] ?? []; - $formats = $layoutOptions['formats'] ?? ['pdf', 'png']; - if (is_string($formats)) { - $formats = array_values(array_filter(array_map('trim', explode(',', $formats)))); - } - $normalizedFormats = []; - foreach ($formats ?: ['pdf', 'png'] as $format) { - $value = strtolower((string) $format); - if ($value === 'svg') { - $value = 'png'; - } - - if (in_array($value, ['pdf', 'png'], true) && ! in_array($value, $normalizedFormats, true)) { - $normalizedFormats[] = $value; - } - } - - $layoutOptions['formats'] = $normalizedFormats ?: ['pdf', 'png']; - - $data['layout_options'] = array_filter([ - 'badge_label' => $layoutOptions['badge_label'] ?? null, - 'instructions_heading' => $layoutOptions['instructions_heading'] ?? null, - 'link_heading' => $layoutOptions['link_heading'] ?? null, - 'cta_label' => $layoutOptions['cta_label'] ?? null, - 'cta_caption' => $layoutOptions['cta_caption'] ?? null, - 'link_label' => $layoutOptions['link_label'] ?? null, - 'logo_url' => $layoutOptions['logo_url'] ?? null, - 'formats' => $layoutOptions['formats'], - ], fn ($value) => $value !== null && $value !== []); - - if (empty($data['layout_options']['logo_url'])) { - unset($data['layout_options']['logo_url']); - } - - $instructions = $data['instructions'] ?? []; - if (is_array($instructions) && isset($instructions[0]) && is_array($instructions[0]) && array_key_exists('value', $instructions[0])) { - $instructions = array_map(fn ($item) => $item['value'] ?? null, $instructions); - } - $data['instructions'] = array_values(array_filter(array_map(fn ($value) => is_string($value) ? trim($value) : null, $instructions))); - - return $data; - } -} diff --git a/app/Filament/Resources/InviteLayouts/Pages/CreateInviteLayout.php b/app/Filament/Resources/InviteLayouts/Pages/CreateInviteLayout.php deleted file mode 100644 index c3498ae..0000000 --- a/app/Filament/Resources/InviteLayouts/Pages/CreateInviteLayout.php +++ /dev/null @@ -1,20 +0,0 @@ -schema([ - Section::make('Grunddaten') - ->columns(2) - ->schema([ - TextInput::make('name') - ->label('Name') - ->required() - ->maxLength(255) - ->afterStateUpdated(fn (callable $set, $state) => $set('slug', Str::slug((string) $state ?? ''))) - ->reactive(), - TextInput::make('slug') - ->label('Slug') - ->required() - ->maxLength(191) - ->unique(ignoreRecord: true), - TextInput::make('subtitle') - ->label('Unterzeile') - ->maxLength(255) - ->columnSpanFull(), - Textarea::make('description') - ->label('Beschreibung') - ->rows(4) - ->columnSpanFull(), - Toggle::make('is_active') - ->label('Aktiv') - ->default(true), - ]), - - Section::make('Papier & Format') - ->columns(3) - ->schema([ - Select::make('paper') - ->label('Papierformat') - ->options([ - 'a4' => 'A4 (210 × 297 mm)', - 'a5' => 'A5 (148 × 210 mm)', - 'a3' => 'A3 (297 × 420 mm)', - 'custom' => 'Benutzerdefiniert', - ]) - ->default('a4'), - Select::make('orientation') - ->label('Ausrichtung') - ->options([ - 'portrait' => 'Hochformat', - 'landscape' => 'Querformat', - ]) - ->default('portrait'), - TextInput::make('layout_options.formats') - ->label('Formate (Komma getrennt)') - ->default('pdf,svg') - ->helperText('Bestimmt, welche Downloads angeboten werden.') - ->dehydrateStateUsing(fn ($state) => collect(explode(',', (string) $state)) - ->map(fn ($value) => trim((string) $value)) - ->filter() - ->values() - ->all()) - ->afterStateHydrated(function (TextInput $component, $state) { - if (is_array($state)) { - $component->state(implode(',', $state)); - } - }), - ]), - - Section::make('Farben') - ->columns(5) - ->schema([ - ColorPicker::make('preview.background') - ->label('Hintergrund') - ->default('#F9FAFB'), - ColorPicker::make('preview.accent') - ->label('Akzent') - ->default('#6366F1'), - ColorPicker::make('preview.text') - ->label('Text') - ->default('#0F172A'), - ColorPicker::make('preview.secondary') - ->label('Sekundär') - ->default('#CBD5F5'), - ColorPicker::make('preview.badge') - ->label('Badge') - ->default('#2563EB'), - TextInput::make('preview.qr.size_px') - ->label('QR-Größe (px)') - ->numeric() - ->default(320) - ->columnSpan(2), - TextInput::make('preview.svg.width') - ->label('SVG Breite') - ->numeric() - ->default(1080), - TextInput::make('preview.svg.height') - ->label('SVG Höhe') - ->numeric() - ->default(1520), - ]), - - Section::make('Texte & Hinweise') - ->columns(2) - ->schema([ - TextInput::make('layout_options.badge_label') - ->label('Badge-Label') - ->default('Digitale Gästebox'), - TextInput::make('layout_options.instructions_heading') - ->label('Anleitungstitel') - ->default("So funktioniert's"), - TextInput::make('layout_options.link_heading') - ->label('Link-Titel') - ->default('Alternative zum Einscannen'), - TextInput::make('layout_options.cta_label') - ->label('CTA Label') - ->default('Scan mich & starte direkt'), - TextInput::make('layout_options.cta_caption') - ->label('CTA Untertitel') - ->default('Scan mich & starte direkt'), - TextInput::make('layout_options.link_label') - ->label('Link Text (optional)') - ->helperText('Überschreibt den standardmäßigen Einladungslink.'), - TextInput::make('layout_options.logo_url') - ->label('Logo URL') - ->columnSpanFull(), - Repeater::make('instructions') - ->label('Hinweise') - ->maxItems(6) - ->schema([ - Textarea::make('value') - ->label('Hinweistext') - ->rows(2) - ->required() - ->maxLength(180), - ]) - ->afterStateHydrated(function (Repeater $component, $state): void { - if (is_array($state) && ! empty($state) && ! is_array(current($state))) { - $component->state(array_map(fn ($value) => ['value' => $value], $state)); - } - }) - ->dehydrateStateUsing(fn ($state) => collect($state)->pluck('value')->filter()->values()->all()), - ]), - ]); - } -} diff --git a/app/Filament/Resources/InviteLayouts/Tables/InviteLayoutsTable.php b/app/Filament/Resources/InviteLayouts/Tables/InviteLayoutsTable.php deleted file mode 100644 index 3572c8c..0000000 --- a/app/Filament/Resources/InviteLayouts/Tables/InviteLayoutsTable.php +++ /dev/null @@ -1,73 +0,0 @@ -columns([ - TextColumn::make('name') - ->label('Name') - ->searchable() - ->sortable(), - TextColumn::make('slug') - ->label('Slug') - ->copyable() - ->searchable() - ->sortable(), - TextColumn::make('paper') - ->label('Papier') - ->sortable(), - TextColumn::make('orientation') - ->label('Ausrichtung') - ->sortable(), - BadgeColumn::make('is_active') - ->label('Status') - ->colors([ - 'success' => fn ($state) => $state === true, - 'gray' => fn ($state) => $state === false, - ]) - ->getStateUsing(fn ($record) => $record->is_active) - ->formatStateUsing(fn ($state) => $state ? 'Aktiv' : 'Inaktiv'), - TextColumn::make('updated_at') - ->label('Aktualisiert') - ->dateTime('d.m.Y H:i') - ->sortable(), - ]) - ->filters([ - SelectFilter::make('is_active') - ->label('Status') - ->options([ - '1' => 'Aktiv', - '0' => 'Inaktiv', - ]) - ->query(function ($query, $state) { - if ($state === '1') { - $query->where('is_active', true); - } elseif ($state === '0') { - $query->where('is_active', false); - } - }), - ]) - ->recordActions([ - EditAction::make(), - DeleteAction::make(), - ]) - ->toolbarActions([ - BulkActionGroup::make([ - DeleteBulkAction::make(), - ]), - ]); - } -} diff --git a/app/Http/Controllers/Api/Tenant/EventJoinTokenLayoutController.php b/app/Http/Controllers/Api/Tenant/EventJoinTokenLayoutController.php index 8143f84..47dc55b 100644 --- a/app/Http/Controllers/Api/Tenant/EventJoinTokenLayoutController.php +++ b/app/Http/Controllers/Api/Tenant/EventJoinTokenLayoutController.php @@ -244,22 +244,22 @@ class EventJoinTokenLayoutController extends Controller private function buildAdvancedLayout(array $layout, $customization, string $qrPngDataUri, string $tokenUrl, string $eventName): ?array { - if (! is_array($customization)) { + $customization = is_array($customization) ? $customization : []; + $hasLayoutElements = is_array($layout['elements'] ?? null) && ! empty($layout['elements']); + $isAdvancedRequested = ($customization['mode'] ?? null) === 'advanced'; + + if (! $isAdvancedRequested && ! $hasLayoutElements) { return null; } - if (($customization['mode'] ?? null) !== 'advanced') { - return null; - } - - $elements = $customization['elements'] ?? null; + $elements = $customization['elements'] ?? ($layout['elements'] ?? null); if (! is_array($elements) || empty($elements)) { return null; } - $width = (int) ($layout['svg']['width'] ?? 1080); - $height = (int) ($layout['svg']['height'] ?? 1520); + $width = (int) ($layout['canvas_width'] ?? $layout['svg']['width'] ?? 1080); + $height = (int) ($layout['canvas_height'] ?? $layout['svg']['height'] ?? 1520); $accent = $layout['accent'] ?? '#6366F1'; $text = $layout['text'] ?? '#0F172A'; $secondary = $layout['secondary'] ?? '#1F2937'; @@ -273,11 +273,11 @@ class EventJoinTokenLayoutController extends Controller $resolved = []; foreach ($elements as $element) { - if (! is_array($element) || empty($element['id']) || empty($element['type'])) { + if (! is_array($element) || empty($element['id']) || (! isset($element['type']) && ! isset($element['role']))) { continue; } - $type = (string) $element['type']; + $type = (string) ($element['role'] ?? $element['type']); $dimensions = $this->normalizeElementDimensions($type, $element, $width, $height); $content = $this->resolveElementContent($type, $customization, $layout, $eventName, $tokenUrl, $element['content'] ?? null); diff --git a/app/Models/InviteLayout.php b/app/Models/InviteLayout.php deleted file mode 100644 index 680c969..0000000 --- a/app/Models/InviteLayout.php +++ /dev/null @@ -1,38 +0,0 @@ - 'array', - 'layout_options' => 'array', - 'instructions' => 'array', - 'is_active' => 'bool', - ]; - - public function creator(): BelongsTo - { - return $this->belongsTo(User::class, 'created_by'); - } -} diff --git a/app/Support/JoinTokenLayoutRegistry.php b/app/Support/JoinTokenLayoutRegistry.php index e34b51a..775056d 100644 --- a/app/Support/JoinTokenLayoutRegistry.php +++ b/app/Support/JoinTokenLayoutRegistry.php @@ -2,8 +2,6 @@ namespace App\Support; -use App\Models\InviteLayout; - class JoinTokenLayoutRegistry { private const DEFAULT_DESCRIPTION = 'Helft uns, diesen besonderen Tag mit euren schönen Momenten festzuhalten.'; @@ -41,16 +39,16 @@ class JoinTokenLayoutRegistry 'name' => 'Foldable Table Card (A5)', 'subtitle' => 'Doppelseitige Tischkarte zum Falten – QR vorn & hinten.', 'description' => self::DEFAULT_DESCRIPTION, - 'paper' => 'a4', - 'orientation' => 'landscape', - 'panel_mode' => 'double-mirror', - 'format_hint' => 'foldable-a5', - 'slots' => self::SLOTS_FOLDABLE, - 'container_padding_px' => 28, - 'background' => '#F8FAFC', - 'background_gradient' => [ - 'angle' => 180, - 'stops' => ['#F8FAFC', '#EEF2FF', '#F8FAFC'], + 'paper' => 'a4', + 'orientation' => 'landscape', + 'panel_mode' => 'double-mirror', + 'format_hint' => 'foldable-a5', + 'slots' => self::SLOTS_FOLDABLE, + 'container_padding_px' => 28, + 'background' => '#F8FAFC', + 'background_gradient' => [ + 'angle' => 180, + 'stops' => ['#F8FAFC', '#EEF2FF', '#F8FAFC'], ], 'text' => '#0F172A', 'accent' => '#2563EB', @@ -70,16 +68,16 @@ class JoinTokenLayoutRegistry 'id' => 'evergreen-vows', 'name' => 'Evergreen Vows', 'subtitle' => 'Romantische Einladung für Trauung & Empfang.', - 'description' => self::DEFAULT_DESCRIPTION, - 'paper' => 'a4', - 'orientation' => 'portrait', - 'format_hint' => 'poster-a4', - 'slots' => self::SLOTS_PORTRAIT, - 'background' => '#FBF7F2', - 'background_gradient' => [ - 'angle' => 165, - 'stops' => ['#FBF7F2', '#FDECEF', '#F4F0FF'], - ], + 'description' => self::DEFAULT_DESCRIPTION, + 'paper' => 'a4', + 'orientation' => 'portrait', + 'format_hint' => 'poster-a4', + 'slots' => self::SLOTS_PORTRAIT, + 'background' => '#FBF7F2', + 'background_gradient' => [ + 'angle' => 165, + 'stops' => ['#FBF7F2', '#FDECEF', '#F4F0FF'], + ], 'text' => '#2C1A27', 'accent' => '#B85C76', 'secondary' => '#E7D6DC', @@ -98,16 +96,16 @@ class JoinTokenLayoutRegistry 'id' => 'midnight-gala', 'name' => 'Midnight Gala', 'subtitle' => 'Eleganter Auftritt für Corporate Events & Galas.', - 'description' => self::DEFAULT_DESCRIPTION, - 'paper' => 'a4', - 'orientation' => 'portrait', - 'format_hint' => 'poster-a4', - 'slots' => self::SLOTS_PORTRAIT, - 'background' => '#0B132B', - 'background_gradient' => [ - 'angle' => 200, - 'stops' => ['#0B132B', '#1C2541', '#274690'], - ], + 'description' => self::DEFAULT_DESCRIPTION, + 'paper' => 'a4', + 'orientation' => 'portrait', + 'format_hint' => 'poster-a4', + 'slots' => self::SLOTS_PORTRAIT, + 'background' => '#0B132B', + 'background_gradient' => [ + 'angle' => 200, + 'stops' => ['#0B132B', '#1C2541', '#274690'], + ], 'text' => '#F8FAFC', 'accent' => '#F9C74F', 'secondary' => '#4E5D8F', @@ -126,16 +124,16 @@ class JoinTokenLayoutRegistry 'id' => 'garden-brunch', 'name' => 'Garden Brunch', 'subtitle' => 'Luftiges Layout für Tages-Events & Familienfeiern.', - 'description' => self::DEFAULT_DESCRIPTION, - 'paper' => 'a4', - 'orientation' => 'portrait', - 'format_hint' => 'poster-a4', - 'slots' => self::SLOTS_PORTRAIT, - 'background' => '#F6F9F4', - 'background_gradient' => [ - 'angle' => 120, - 'stops' => ['#F6F9F4', '#EEF5E7', '#F8FAF0'], - ], + 'description' => self::DEFAULT_DESCRIPTION, + 'paper' => 'a4', + 'orientation' => 'portrait', + 'format_hint' => 'poster-a4', + 'slots' => self::SLOTS_PORTRAIT, + 'background' => '#F6F9F4', + 'background_gradient' => [ + 'angle' => 120, + 'stops' => ['#F6F9F4', '#EEF5E7', '#F8FAF0'], + ], 'text' => '#2F4030', 'accent' => '#6BAA75', 'secondary' => '#DDE9D8', @@ -154,16 +152,16 @@ class JoinTokenLayoutRegistry 'id' => 'sparkler-soiree', 'name' => 'Sparkler Soirée', 'subtitle' => 'Abendliches Layout mit funkelndem Verlauf.', - 'description' => self::DEFAULT_DESCRIPTION, - 'paper' => 'a4', - 'orientation' => 'portrait', - 'format_hint' => 'poster-a4', - 'slots' => self::SLOTS_PORTRAIT, - 'background' => '#1B1A44', - 'background_gradient' => [ - 'angle' => 205, - 'stops' => ['#1B1A44', '#42275A', '#734B8F'], - ], + 'description' => self::DEFAULT_DESCRIPTION, + 'paper' => 'a4', + 'orientation' => 'portrait', + 'format_hint' => 'poster-a4', + 'slots' => self::SLOTS_PORTRAIT, + 'background' => '#1B1A44', + 'background_gradient' => [ + 'angle' => 205, + 'stops' => ['#1B1A44', '#42275A', '#734B8F'], + ], 'text' => '#FDF7FF', 'accent' => '#F9A826', 'secondary' => '#DDB7FF', @@ -182,16 +180,16 @@ class JoinTokenLayoutRegistry 'id' => 'confetti-bash', 'name' => 'Confetti Bash', 'subtitle' => 'Verspielter Look für Geburtstage & Jubiläen.', - 'description' => self::DEFAULT_DESCRIPTION, - 'paper' => 'a4', - 'orientation' => 'portrait', - 'format_hint' => 'poster-a4', - 'slots' => self::SLOTS_PORTRAIT, - 'background' => '#FFF9F0', - 'background_gradient' => [ - 'angle' => 145, - 'stops' => ['#FFF9F0', '#FFEFEF', '#FFF5D6'], - ], + 'description' => self::DEFAULT_DESCRIPTION, + 'paper' => 'a4', + 'orientation' => 'portrait', + 'format_hint' => 'poster-a4', + 'slots' => self::SLOTS_PORTRAIT, + 'background' => '#FFF9F0', + 'background_gradient' => [ + 'angle' => 145, + 'stops' => ['#FFF9F0', '#FFEFEF', '#FFF5D6'], + ], 'text' => '#31291F', 'accent' => '#FF6F61', 'secondary' => '#F9D6A5', @@ -215,18 +213,6 @@ class JoinTokenLayoutRegistry */ public static function all(): array { - $customLayouts = InviteLayout::query() - ->where('is_active', true) - ->orderBy('name') - ->get(); - - if ($customLayouts->isNotEmpty()) { - return $customLayouts - ->map(fn (InviteLayout $layout) => self::normalize(self::fromModel($layout))) - ->values() - ->all(); - } - return array_values(array_map(fn ($layout) => self::normalize($layout), self::LAYOUTS)); } @@ -235,15 +221,6 @@ class JoinTokenLayoutRegistry */ public static function find(string $id): ?array { - $custom = InviteLayout::query() - ->where('slug', $id) - ->where('is_active', true) - ->first(); - - if ($custom) { - return self::normalize(self::fromModel($custom)); - } - $layout = self::LAYOUTS[$id] ?? null; return $layout ? self::normalize($layout) : null; @@ -260,6 +237,8 @@ class JoinTokenLayoutRegistry 'paper' => 'a4', 'orientation' => 'portrait', 'panel_mode' => null, + 'canvas_width' => null, + 'canvas_height' => null, 'container_padding_px' => 48, 'background' => '#F9FAFB', 'text' => '#0F172A', @@ -287,6 +266,11 @@ class JoinTokenLayoutRegistry $normalized = array_replace_recursive($defaults, $layout); + if (($normalized['canvas_width'] === null || $normalized['canvas_height'] === null) && isset($normalized['svg']['width'], $normalized['svg']['height'])) { + $normalized['canvas_width'] = $normalized['canvas_width'] ?? $normalized['svg']['width']; + $normalized['canvas_height'] = $normalized['canvas_height'] ?? $normalized['svg']['height']; + } + $formats = $normalized['formats'] ?? ['pdf', 'png']; if (! is_array($formats)) { $formats = [$formats]; @@ -319,47 +303,6 @@ class JoinTokenLayoutRegistry return self::SLOTS_FOLDABLE; } - private static function fromModel(InviteLayout $layout): array - { - $preview = $layout->preview ?? []; - $options = $layout->layout_options ?? []; - $instructions = $layout->instructions ?? []; - $slots = $options['slots'] ?? null; - - return array_filter([ - 'id' => $layout->slug, - 'name' => $layout->name, - 'subtitle' => $layout->subtitle, - 'description' => $layout->description, - 'paper' => $layout->paper, - 'orientation' => $layout->orientation, - 'format_hint' => self::resolveFormatHint($layout->paper, $layout->orientation, $layout->panel_mode), - 'background' => $preview['background'] ?? null, - 'background_gradient' => $preview['background_gradient'] ?? null, - 'text' => $preview['text'] ?? null, - 'accent' => $preview['accent'] ?? null, - 'secondary' => $preview['secondary'] ?? null, - 'badge' => $preview['badge'] ?? null, - 'badge_label' => $options['badge_label'] ?? null, - 'instructions_heading' => $options['instructions_heading'] ?? null, - 'link_heading' => $options['link_heading'] ?? null, - 'cta_label' => $options['cta_label'] ?? null, - 'cta_caption' => $options['cta_caption'] ?? null, - 'link_label' => $options['link_label'] ?? null, - 'logo_url' => $options['logo_url'] ?? null, - 'slots' => is_array($slots) ? $slots : null, - 'qr' => array_filter([ - 'size_px' => $preview['qr']['size_px'] ?? $options['qr']['size_px'] ?? $preview['qr_size_px'] ?? $options['qr_size_px'] ?? null, - ]), - 'svg' => array_filter([ - 'width' => $preview['svg']['width'] ?? $options['svg']['width'] ?? $preview['svg_width'] ?? $options['svg_width'] ?? null, - 'height' => $preview['svg']['height'] ?? $options['svg']['height'] ?? $preview['svg_height'] ?? $options['svg_height'] ?? null, - ]), - 'formats' => $options['formats'] ?? ['pdf', 'png'], - 'instructions' => $instructions, - ], fn ($value) => $value !== null && $value !== []); - } - private static function resolveFormatHint(?string $paper, ?string $orientation, ?string $panelMode): ?string { $paperVal = strtolower((string) $paper); @@ -397,6 +340,8 @@ class JoinTokenLayoutRegistry 'orientation' => $layout['orientation'] ?? 'portrait', 'panel_mode' => $layout['panel_mode'] ?? null, 'format_hint' => $layout['format_hint'] ?? self::resolveFormatHint($layout['paper'] ?? null, $layout['orientation'] ?? null, $layout['panel_mode'] ?? null), + 'canvas_width' => $layout['canvas_width'] ?? ($layout['svg']['width'] ?? null), + 'canvas_height' => $layout['canvas_height'] ?? ($layout['svg']['height'] ?? null), 'badge_label' => $layout['badge_label'] ?? null, 'instructions_heading' => $layout['instructions_heading'] ?? null, 'link_heading' => $layout['link_heading'] ?? null, @@ -404,6 +349,7 @@ class JoinTokenLayoutRegistry 'cta_caption' => $layout['cta_caption'] ?? null, 'instructions' => $layout['instructions'] ?? [], 'slots' => $layout['slots'] ?? null, + 'elements' => $layout['elements'] ?? null, 'preview' => [ 'background' => $layout['background'], 'background_gradient' => $layout['background_gradient'], diff --git a/database/migrations/2025_10_28_140104_create_invite_layouts_table.php b/database/migrations/2025_10_28_140104_create_invite_layouts_table.php deleted file mode 100644 index 20bbc7d..0000000 --- a/database/migrations/2025_10_28_140104_create_invite_layouts_table.php +++ /dev/null @@ -1,40 +0,0 @@ -id(); - $table->string('slug')->unique(); - $table->string('name'); - $table->string('subtitle')->nullable(); - $table->text('description')->nullable(); - $table->string('paper')->default('a4'); - $table->string('orientation')->default('portrait'); - $table->json('preview')->nullable(); - $table->json('layout_options')->nullable(); - $table->json('instructions')->nullable(); - $table->boolean('is_active')->default(true); - $table->unsignedBigInteger('created_by')->nullable(); - $table->timestamps(); - - $table->foreign('created_by')->references('id')->on('users')->nullOnDelete(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('invite_layouts'); - } -}; diff --git a/database/seeders/InviteLayoutSeeder.php b/database/seeders/InviteLayoutSeeder.php deleted file mode 100644 index 4e0abf5..0000000 --- a/database/seeders/InviteLayoutSeeder.php +++ /dev/null @@ -1,77 +0,0 @@ -getReflectionConstant('LAYOUTS'); - $fallbackLayouts = $layoutsConst ? $layoutsConst->getValue() : []; - $qrSizeOverrides = [ - 'evergreen-vows' => 640, - 'midnight-gala' => 640, - 'garden-brunch' => 660, - 'sparkler-soiree' => 680, - 'confetti-bash' => 680, - ]; - $defaultQrSize = 640; - $targetSvgWidth = 1240; - $targetSvgHeight = 1754; - - foreach ($fallbackLayouts as $layout) { - $layoutId = $layout['id'] ?? null; - $forcedQrSize = $qrSizeOverrides[$layoutId] ?? $defaultQrSize; - $existingQrSize = (int) ($layout['qr']['size_px'] ?? $layout['qr_size_px'] ?? 0); - $qrSize = max($existingQrSize, $forcedQrSize); - - $existingSvgWidth = (int) ($layout['svg']['width'] ?? $layout['svg_width'] ?? 0); - $existingSvgHeight = (int) ($layout['svg']['height'] ?? $layout['svg_height'] ?? 0); - $svgWidth = max($existingSvgWidth, $targetSvgWidth); - $svgHeight = max($existingSvgHeight, $targetSvgHeight); - - $preview = [ - 'background' => $layout['background'] ?? null, - 'background_gradient' => $layout['background_gradient'] ?? null, - 'accent' => $layout['accent'] ?? null, - 'secondary' => $layout['secondary'] ?? null, - 'text' => $layout['text'] ?? null, - 'badge' => $layout['badge'] ?? null, - 'qr' => ['size_px' => $qrSize], - 'svg' => ['width' => $svgWidth, 'height' => $svgHeight], - ]; - - $options = [ - 'badge_label' => $layout['badge_label'] ?? 'Digitale Gästebox', - 'instructions_heading' => $layout['instructions_heading'] ?? "So funktioniert's", - 'link_heading' => $layout['link_heading'] ?? 'Alternative zum Einscannen', - 'cta_label' => $layout['cta_label'] ?? 'Scan mich & starte direkt', - 'cta_caption' => $layout['cta_caption'] ?? 'Scan mich & starte direkt', - 'link_label' => $layout['link_label'] ?? null, - 'logo_url' => $layout['logo_url'] ?? null, - 'formats' => $layout['formats'] ?? ['pdf', 'png'], - ]; - - InviteLayout::updateOrCreate( - ['slug' => $layout['id']], - [ - 'name' => $layout['name'], - 'subtitle' => $layout['subtitle'] ?? null, - 'description' => $layout['description'] ?? null, - 'paper' => $layout['paper'] ?? 'a4', - 'orientation' => $layout['orientation'] ?? 'portrait', - 'preview' => $preview, - 'layout_options' => $options, - 'instructions' => $layout['instructions'] ?? [], - 'is_active' => true, - ] - ); - } - } -} diff --git a/public/vendor/livewire/livewire.esm.js b/public/vendor/livewire/livewire.esm.js index e45b045..516f2f9 100644 --- a/public/vendor/livewire/livewire.esm.js +++ b/public/vendor/livewire/livewire.esm.js @@ -17,9 +17,9 @@ var __copyProps = (to, from, except, desc) => { }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod)); -// ../alpine/packages/alpinejs/dist/module.cjs.js +// node_modules/alpinejs/dist/module.cjs.js var require_module_cjs = __commonJS({ - "../alpine/packages/alpinejs/dist/module.cjs.js"(exports, module) { + "node_modules/alpinejs/dist/module.cjs.js"(exports, module) { var __create2 = Object.create; var __defProp2 = Object.defineProperty; var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; @@ -1290,8 +1290,8 @@ var require_module_cjs = __commonJS({ }); var module_exports = {}; __export(module_exports, { - Alpine: () => src_default, - default: () => module_default + Alpine: () => src_default2, + default: () => module_default2 }); module.exports = __toCommonJS(module_exports); var flushPending = false; @@ -1699,7 +1699,14 @@ var require_module_cjs = __commonJS({ handleError(e, el, expression); } } - function handleError(error2, el, expression = void 0) { + function handleError(...args) { + return errorHandler(...args); + } + var errorHandler = normalErrorHandler; + function setErrorHandler(handler4) { + errorHandler = handler4; + } + function normalErrorHandler(error2, el, expression = void 0) { error2 = Object.assign(error2 != null ? error2 : { message: "No error message given." }, { el, expression }); console.warn(`Alpine Expression Error: ${error2.message} @@ -1737,7 +1744,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); } function generateEvaluatorFromFunction(dataStack, func) { return (receiver = () => { - }, { scope: scope2 = {}, params = [] } = {}) => { + }, { scope: scope2 = {}, params = [], context } = {}) => { let result = func.apply(mergeProxies([scope2, ...dataStack]), params); runIfTypeOfFunction(receiver, result); }; @@ -1769,12 +1776,12 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); function generateEvaluatorFromString(dataStack, expression, el) { let func = generateFunctionFromString(expression, el); return (receiver = () => { - }, { scope: scope2 = {}, params = [] } = {}) => { + }, { scope: scope2 = {}, params = [], context } = {}) => { func.result = void 0; func.finished = false; let completeScope = mergeProxies([scope2, ...dataStack]); if (typeof func === "function") { - let promise = func(func, completeScope).catch((error2) => handleError(error2, el, expression)); + let promise = func.call(context, func, completeScope).catch((error2) => handleError(error2, el, expression)); if (func.finished) { runIfTypeOfFunction(receiver, func.result, completeScope, params, el); func.result = void 0; @@ -2724,10 +2731,10 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); return el.type === "radio" || el.localName === "ui-radio"; } function debounce2(func, wait) { - var timeout; + let timeout; return function() { - var context = this, args = arguments; - var later = function() { + const context = this, args = arguments; + const later = function() { timeout = null; func.apply(context, args); }; @@ -2876,7 +2883,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); get raw() { return raw; }, - version: "3.14.9", + version: "3.15.2", flushAndStopDeferringMutations, dontAutoEvaluateFunctions, disableEffectScheduling, @@ -2890,6 +2897,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); onlyDuringClone, addRootSelector, addInitSelector, + setErrorHandler, interceptClone, addScopeToNode, deferMutations, @@ -3208,7 +3216,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); } function isListeningForASpecificKeyThatHasntBeenPressed(e, modifiers) { let keyModifiers = modifiers.filter((i) => { - return !["window", "document", "prevent", "stop", "once", "capture", "self", "away", "outside", "passive"].includes(i); + return !["window", "document", "prevent", "stop", "once", "capture", "self", "away", "outside", "passive", "preserve-scroll"].includes(i); }); if (keyModifiers.includes("debounce")) { let debounceIndex = keyModifiers.indexOf("debounce"); @@ -3305,7 +3313,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); el.setAttribute("name", expression); }); } - var event = el.tagName.toLowerCase() === "select" || ["checkbox", "radio"].includes(el.type) || modifiers.includes("lazy") ? "change" : "input"; + let event = el.tagName.toLowerCase() === "select" || ["checkbox", "radio"].includes(el.type) || modifiers.includes("lazy") ? "change" : "input"; let removeListener = isCloning ? () => { } : on3(el, event, modifiers, (e) => { setValue(getInputValue(el, modifiers, e, getValue())); @@ -3826,14 +3834,14 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); } alpine_default.setEvaluator(normalEvaluator); alpine_default.setReactivityEngine({ reactive: import_reactivity10.reactive, effect: import_reactivity10.effect, release: import_reactivity10.stop, raw: import_reactivity10.toRaw }); - var src_default = alpine_default; - var module_default = src_default; + var src_default2 = alpine_default; + var module_default2 = src_default2; } }); -// ../alpine/packages/collapse/dist/module.cjs.js +// node_modules/@alpinejs/collapse/dist/module.cjs.js var require_module_cjs2 = __commonJS({ - "../alpine/packages/collapse/dist/module.cjs.js"(exports, module) { + "node_modules/@alpinejs/collapse/dist/module.cjs.js"(exports, module) { var __defProp2 = Object.defineProperty; var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; var __getOwnPropNames2 = Object.getOwnPropertyNames; @@ -3853,11 +3861,11 @@ var require_module_cjs2 = __commonJS({ var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); var module_exports = {}; __export(module_exports, { - collapse: () => src_default, - default: () => module_default + collapse: () => src_default2, + default: () => module_default2 }); module.exports = __toCommonJS(module_exports); - function src_default(Alpine23) { + function src_default2(Alpine23) { Alpine23.directive("collapse", collapse3); collapse3.inline = (el, { modifiers }) => { if (!modifiers.includes("min")) @@ -3948,13 +3956,13 @@ var require_module_cjs2 = __commonJS({ } return rawValue; } - var module_default = src_default; + var module_default2 = src_default2; } }); -// ../alpine/packages/focus/dist/module.cjs.js +// node_modules/@alpinejs/focus/dist/module.cjs.js var require_module_cjs3 = __commonJS({ - "../alpine/packages/focus/dist/module.cjs.js"(exports, module) { + "node_modules/@alpinejs/focus/dist/module.cjs.js"(exports, module) { var __create2 = Object.create; var __defProp2 = Object.defineProperty; var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; @@ -4745,13 +4753,13 @@ var require_module_cjs3 = __commonJS({ }); var module_exports = {}; __export(module_exports, { - default: () => module_default, - focus: () => src_default + default: () => module_default2, + focus: () => src_default2 }); module.exports = __toCommonJS(module_exports); var import_focus_trap = __toESM2(require_focus_trap()); var import_tabbable = __toESM2(require_dist()); - function src_default(Alpine23) { + function src_default2(Alpine23) { let lastFocused; let currentFocused; window.addEventListener("focusin", () => { @@ -4870,6 +4878,8 @@ var require_module_cjs3 = __commonJS({ allowOutsideClick: true, fallbackFocus: () => el }; + let undoInert = () => { + }; if (modifiers.includes("noautofocus")) { options.initialFocus = false; } else { @@ -4877,9 +4887,14 @@ var require_module_cjs3 = __commonJS({ if (autofocusEl) options.initialFocus = autofocusEl; } + if (modifiers.includes("inert")) { + options.onPostActivate = () => { + Alpine23.nextTick(() => { + undoInert = setInert(el); + }); + }; + } let trap = (0, import_focus_trap.createFocusTrap)(el, options); - let undoInert = () => { - }; let undoDisableScrolling = () => { }; const releaseFocus = () => { @@ -4899,8 +4914,6 @@ var require_module_cjs3 = __commonJS({ if (value && !oldValue) { if (modifiers.includes("noscroll")) undoDisableScrolling = disableScrolling(); - if (modifiers.includes("inert")) - undoInert = setInert(el); setTimeout(() => { trap.activate(); }, 15); @@ -4950,13 +4963,13 @@ var require_module_cjs3 = __commonJS({ document.documentElement.style.paddingRight = paddingRight; }; } - var module_default = src_default; + var module_default2 = src_default2; } }); -// ../alpine/packages/persist/dist/module.cjs.js +// node_modules/@alpinejs/intersect/dist/module.cjs.js var require_module_cjs4 = __commonJS({ - "../alpine/packages/persist/dist/module.cjs.js"(exports, module) { + "node_modules/@alpinejs/intersect/dist/module.cjs.js"(exports, module) { var __defProp2 = Object.defineProperty; var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; var __getOwnPropNames2 = Object.getOwnPropertyNames; @@ -4976,100 +4989,11 @@ var require_module_cjs4 = __commonJS({ var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); var module_exports = {}; __export(module_exports, { - default: () => module_default, - persist: () => src_default + default: () => module_default2, + intersect: () => src_default2 }); module.exports = __toCommonJS(module_exports); - function src_default(Alpine23) { - let persist3 = () => { - let alias; - let storage; - try { - storage = localStorage; - } catch (e) { - console.error(e); - console.warn("Alpine: $persist is using temporary storage since localStorage is unavailable."); - let dummy = /* @__PURE__ */ new Map(); - storage = { - getItem: dummy.get.bind(dummy), - setItem: dummy.set.bind(dummy) - }; - } - return Alpine23.interceptor((initialValue, getter, setter, path, key) => { - let lookup = alias || `_x_${path}`; - let initial = storageHas(lookup, storage) ? storageGet(lookup, storage) : initialValue; - setter(initial); - Alpine23.effect(() => { - let value = getter(); - storageSet(lookup, value, storage); - setter(value); - }); - return initial; - }, (func) => { - func.as = (key) => { - alias = key; - return func; - }, func.using = (target) => { - storage = target; - return func; - }; - }); - }; - Object.defineProperty(Alpine23, "$persist", { get: () => persist3() }); - Alpine23.magic("persist", persist3); - Alpine23.persist = (key, { get, set }, storage = localStorage) => { - let initial = storageHas(key, storage) ? storageGet(key, storage) : get(); - set(initial); - Alpine23.effect(() => { - let value = get(); - storageSet(key, value, storage); - set(value); - }); - }; - } - function storageHas(key, storage) { - return storage.getItem(key) !== null; - } - function storageGet(key, storage) { - let value = storage.getItem(key, storage); - if (value === void 0) - return; - return JSON.parse(value); - } - function storageSet(key, value, storage) { - storage.setItem(key, JSON.stringify(value)); - } - var module_default = src_default; - } -}); - -// ../alpine/packages/intersect/dist/module.cjs.js -var require_module_cjs5 = __commonJS({ - "../alpine/packages/intersect/dist/module.cjs.js"(exports, module) { - var __defProp2 = Object.defineProperty; - var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; - var __getOwnPropNames2 = Object.getOwnPropertyNames; - var __hasOwnProp2 = Object.prototype.hasOwnProperty; - var __export = (target, all2) => { - for (var name in all2) - __defProp2(target, name, { get: all2[name], enumerable: true }); - }; - var __copyProps2 = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames2(from)) - if (!__hasOwnProp2.call(to, key) && key !== except) - __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable }); - } - return to; - }; - var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); - var module_exports = {}; - __export(module_exports, { - default: () => module_default, - intersect: () => src_default - }); - module.exports = __toCommonJS(module_exports); - function src_default(Alpine23) { + function src_default2(Alpine23) { Alpine23.directive("intersect", Alpine23.skipDuringClone((el, { value, expression, modifiers }, { evaluateLater, cleanup }) => { let evaluate = evaluateLater(expression); let options = { @@ -5121,12 +5045,12 @@ var require_module_cjs5 = __commonJS({ values = values.filter((v) => v !== void 0); return values.length ? values.join(" ").trim() : fallback2; } - var module_default = src_default; + var module_default2 = src_default2; } }); // node_modules/@alpinejs/resize/dist/module.cjs.js -var require_module_cjs6 = __commonJS({ +var require_module_cjs5 = __commonJS({ "node_modules/@alpinejs/resize/dist/module.cjs.js"(exports, module) { var __defProp2 = Object.defineProperty; var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; @@ -5147,11 +5071,11 @@ var require_module_cjs6 = __commonJS({ var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); var module_exports = {}; __export(module_exports, { - default: () => module_default, - resize: () => src_default + default: () => module_default2, + resize: () => src_default2 }); module.exports = __toCommonJS(module_exports); - function src_default(Alpine23) { + function src_default2(Alpine23) { Alpine23.directive("resize", Alpine23.skipDuringClone((el, { value, expression, modifiers }, { evaluateLater, cleanup }) => { let evaluator = evaluateLater(expression); let evaluate = (width, height) => { @@ -5193,13 +5117,13 @@ var require_module_cjs6 = __commonJS({ } return [width, height]; } - var module_default = src_default; + var module_default2 = src_default2; } }); -// ../alpine/packages/anchor/dist/module.cjs.js -var require_module_cjs7 = __commonJS({ - "../alpine/packages/anchor/dist/module.cjs.js"(exports, module) { +// node_modules/@alpinejs/anchor/dist/module.cjs.js +var require_module_cjs6 = __commonJS({ + "node_modules/@alpinejs/anchor/dist/module.cjs.js"(exports, module) { var __defProp2 = Object.defineProperty; var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; var __getOwnPropNames2 = Object.getOwnPropertyNames; @@ -5219,8 +5143,8 @@ var require_module_cjs7 = __commonJS({ var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); var module_exports = {}; __export(module_exports, { - anchor: () => src_default, - default: () => module_default + anchor: () => src_default2, + default: () => module_default2 }); module.exports = __toCommonJS(module_exports); var min = Math.min; @@ -6396,7 +6320,7 @@ var require_module_cjs7 = __commonJS({ platform: platformWithCache }); }; - function src_default(Alpine23) { + function src_default2(Alpine23) { Alpine23.magic("anchor", (el) => { if (!el._x_anchor) throw "Alpine: No x-anchor directive found on element using $anchor..."; @@ -6454,7 +6378,7 @@ var require_module_cjs7 = __commonJS({ let unstyled = modifiers.includes("no-style"); return { placement, offsetValue, unstyled }; } - var module_default = src_default; + var module_default2 = src_default2; } }); @@ -6735,9 +6659,9 @@ var require_nprogress = __commonJS({ } }); -// ../alpine/packages/morph/dist/module.cjs.js -var require_module_cjs8 = __commonJS({ - "../alpine/packages/morph/dist/module.cjs.js"(exports, module) { +// node_modules/@alpinejs/morph/dist/module.cjs.js +var require_module_cjs7 = __commonJS({ + "node_modules/@alpinejs/morph/dist/module.cjs.js"(exports, module) { var __defProp2 = Object.defineProperty; var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; var __getOwnPropNames2 = Object.getOwnPropertyNames; @@ -6757,119 +6681,161 @@ var require_module_cjs8 = __commonJS({ var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); var module_exports = {}; __export(module_exports, { - default: () => module_default, - morph: () => src_default + default: () => module_default2, + morph: () => src_default2 }); module.exports = __toCommonJS(module_exports); function morph3(from, toHtml, options) { monkeyPatchDomSetAttributeToAllowAtSymbols(); - let fromEl; - let toEl; - let key, lookahead, updating, updated, removing, removed, adding, added; - function assignOptions(options2 = {}) { - let defaultGetKey = (el) => el.getAttribute("key"); - let noop = () => { - }; - updating = options2.updating || noop; - updated = options2.updated || noop; - removing = options2.removing || noop; - removed = options2.removed || noop; - adding = options2.adding || noop; - added = options2.added || noop; - key = options2.key || defaultGetKey; - lookahead = options2.lookahead || false; + let context = createMorphContext(options); + let toEl = typeof toHtml === "string" ? createElement(toHtml) : toHtml; + if (window.Alpine && window.Alpine.closestDataStack && !from._x_dataStack) { + toEl._x_dataStack = window.Alpine.closestDataStack(from); + toEl._x_dataStack && window.Alpine.cloneNode(from, toEl); } - function patch(from2, to) { - if (differentElementNamesTypesOrKeys(from2, to)) { - return swapElements(from2, to); + context.patch(from, toEl); + return from; + } + function morphBetween(startMarker, endMarker, toHtml, options = {}) { + monkeyPatchDomSetAttributeToAllowAtSymbols(); + let context = createMorphContext(options); + let fromContainer = startMarker.parentNode; + let fromBlock = new Block(startMarker, endMarker); + let toContainer = typeof toHtml === "string" ? (() => { + let container = document.createElement("div"); + container.insertAdjacentHTML("beforeend", toHtml); + return container; + })() : toHtml; + let toStartMarker = document.createComment("[morph-start]"); + let toEndMarker = document.createComment("[morph-end]"); + toContainer.insertBefore(toStartMarker, toContainer.firstChild); + toContainer.appendChild(toEndMarker); + let toBlock = new Block(toStartMarker, toEndMarker); + if (window.Alpine && window.Alpine.closestDataStack) { + toContainer._x_dataStack = window.Alpine.closestDataStack(fromContainer); + toContainer._x_dataStack && window.Alpine.cloneNode(fromContainer, toContainer); + } + context.patchChildren(fromBlock, toBlock); + } + function createMorphContext(options = {}) { + let defaultGetKey = (el) => el.getAttribute("key"); + let noop = () => { + }; + let context = { + key: options.key || defaultGetKey, + lookahead: options.lookahead || false, + updating: options.updating || noop, + updated: options.updated || noop, + removing: options.removing || noop, + removed: options.removed || noop, + adding: options.adding || noop, + added: options.added || noop + }; + context.patch = function(from, to) { + if (context.differentElementNamesTypesOrKeys(from, to)) { + return context.swapElements(from, to); } let updateChildrenOnly = false; let skipChildren = false; - if (shouldSkipChildren(updating, () => skipChildren = true, from2, to, () => updateChildrenOnly = true)) + let skipUntil = (predicate) => context.skipUntilCondition = predicate; + if (shouldSkipChildren(context.updating, () => skipChildren = true, skipUntil, from, to, () => updateChildrenOnly = true)) return; - if (from2.nodeType === 1 && window.Alpine) { - window.Alpine.cloneNode(from2, to); - if (from2._x_teleport && to._x_teleport) { - patch(from2._x_teleport, to._x_teleport); + if (from.nodeType === 1 && window.Alpine) { + window.Alpine.cloneNode(from, to); + if (from._x_teleport && to._x_teleport) { + context.patch(from._x_teleport, to._x_teleport); } } if (textOrComment(to)) { - patchNodeValue(from2, to); - updated(from2, to); + context.patchNodeValue(from, to); + context.updated(from, to); return; } if (!updateChildrenOnly) { - patchAttributes(from2, to); + context.patchAttributes(from, to); } - updated(from2, to); + context.updated(from, to); if (!skipChildren) { - patchChildren(from2, to); + context.patchChildren(from, to); } - } - function differentElementNamesTypesOrKeys(from2, to) { - return from2.nodeType != to.nodeType || from2.nodeName != to.nodeName || getKey(from2) != getKey(to); - } - function swapElements(from2, to) { - if (shouldSkip(removing, from2)) + }; + context.differentElementNamesTypesOrKeys = function(from, to) { + return from.nodeType != to.nodeType || from.nodeName != to.nodeName || context.getKey(from) != context.getKey(to); + }; + context.swapElements = function(from, to) { + if (shouldSkip(context.removing, from)) return; let toCloned = to.cloneNode(true); - if (shouldSkip(adding, toCloned)) + if (shouldSkip(context.adding, toCloned)) return; - from2.replaceWith(toCloned); - removed(from2); - added(toCloned); - } - function patchNodeValue(from2, to) { + from.replaceWith(toCloned); + context.removed(from); + context.added(toCloned); + }; + context.patchNodeValue = function(from, to) { let value = to.nodeValue; - if (from2.nodeValue !== value) { - from2.nodeValue = value; + if (from.nodeValue !== value) { + from.nodeValue = value; } - } - function patchAttributes(from2, to) { - if (from2._x_transitioning) + }; + context.patchAttributes = function(from, to) { + if (from._x_transitioning) return; - if (from2._x_isShown && !to._x_isShown) { + if (from._x_isShown && !to._x_isShown) { return; } - if (!from2._x_isShown && to._x_isShown) { + if (!from._x_isShown && to._x_isShown) { return; } - let domAttributes = Array.from(from2.attributes); + let domAttributes = Array.from(from.attributes); let toAttributes = Array.from(to.attributes); for (let i = domAttributes.length - 1; i >= 0; i--) { let name = domAttributes[i].name; if (!to.hasAttribute(name)) { - from2.removeAttribute(name); + from.removeAttribute(name); } } for (let i = toAttributes.length - 1; i >= 0; i--) { let name = toAttributes[i].name; let value = toAttributes[i].value; - if (from2.getAttribute(name) !== value) { - from2.setAttribute(name, value); + if (from.getAttribute(name) !== value) { + from.setAttribute(name, value); } } - } - function patchChildren(from2, to) { - let fromKeys = keyToMap(from2.children); + }; + context.patchChildren = function(from, to) { + let fromKeys = context.keyToMap(from.children); let fromKeyHoldovers = {}; let currentTo = getFirstNode(to); - let currentFrom = getFirstNode(from2); + let currentFrom = getFirstNode(from); while (currentTo) { seedingMatchingId(currentTo, currentFrom); - let toKey = getKey(currentTo); - let fromKey = getKey(currentFrom); + let toKey = context.getKey(currentTo); + let fromKey = context.getKey(currentFrom); + if (context.skipUntilCondition) { + let fromDone = !currentFrom || context.skipUntilCondition(currentFrom); + let toDone = !currentTo || context.skipUntilCondition(currentTo); + if (fromDone && toDone) { + context.skipUntilCondition = null; + } else { + if (!fromDone) + currentFrom = currentFrom && getNextSibling(from, currentFrom); + if (!toDone) + currentTo = currentTo && getNextSibling(to, currentTo); + continue; + } + } if (!currentFrom) { if (toKey && fromKeyHoldovers[toKey]) { let holdover = fromKeyHoldovers[toKey]; - from2.appendChild(holdover); + from.appendChild(holdover); currentFrom = holdover; - fromKey = getKey(currentFrom); + fromKey = context.getKey(currentFrom); } else { - if (!shouldSkip(adding, currentTo)) { + if (!shouldSkip(context.adding, currentTo)) { let clone = currentTo.cloneNode(true); - from2.appendChild(clone); - added(clone); + from.appendChild(clone); + context.added(clone); } currentTo = getNextSibling(to, currentTo); continue; @@ -6881,7 +6847,7 @@ var require_module_cjs8 = __commonJS({ let nestedIfCount = 0; let fromBlockStart = currentFrom; while (currentFrom) { - let next = getNextSibling(from2, currentFrom); + let next = getNextSibling(from, currentFrom); if (isIf(next)) { nestedIfCount++; } else if (isEnd(next) && nestedIfCount > 0) { @@ -6910,17 +6876,17 @@ var require_module_cjs8 = __commonJS({ let toBlockEnd = currentTo; let fromBlock = new Block(fromBlockStart, fromBlockEnd); let toBlock = new Block(toBlockStart, toBlockEnd); - patchChildren(fromBlock, toBlock); + context.patchChildren(fromBlock, toBlock); continue; } - if (currentFrom.nodeType === 1 && lookahead && !currentFrom.isEqualNode(currentTo)) { + if (currentFrom.nodeType === 1 && context.lookahead && !currentFrom.isEqualNode(currentTo)) { let nextToElementSibling = getNextSibling(to, currentTo); let found = false; while (!found && nextToElementSibling) { if (nextToElementSibling.nodeType === 1 && currentFrom.isEqualNode(nextToElementSibling)) { found = true; - currentFrom = addNodeBefore(from2, currentTo, currentFrom); - fromKey = getKey(currentFrom); + currentFrom = context.addNodeBefore(from, currentTo, currentFrom); + fromKey = context.getKey(currentFrom); } nextToElementSibling = getNextSibling(to, nextToElementSibling); } @@ -6928,9 +6894,9 @@ var require_module_cjs8 = __commonJS({ if (toKey !== fromKey) { if (!toKey && fromKey) { fromKeyHoldovers[fromKey] = currentFrom; - currentFrom = addNodeBefore(from2, currentTo, currentFrom); + currentFrom = context.addNodeBefore(from, currentTo, currentFrom); fromKeyHoldovers[fromKey].remove(); - currentFrom = getNextSibling(from2, currentFrom); + currentFrom = getNextSibling(from, currentFrom); currentTo = getNextSibling(to, currentTo); continue; } @@ -6938,7 +6904,7 @@ var require_module_cjs8 = __commonJS({ if (fromKeys[toKey]) { currentFrom.replaceWith(fromKeys[toKey]); currentFrom = fromKeys[toKey]; - fromKey = getKey(currentFrom); + fromKey = context.getKey(currentFrom); } } if (toKey && fromKey) { @@ -6947,67 +6913,57 @@ var require_module_cjs8 = __commonJS({ fromKeyHoldovers[fromKey] = currentFrom; currentFrom.replaceWith(fromKeyNode); currentFrom = fromKeyNode; - fromKey = getKey(currentFrom); + fromKey = context.getKey(currentFrom); } else { fromKeyHoldovers[fromKey] = currentFrom; - currentFrom = addNodeBefore(from2, currentTo, currentFrom); + currentFrom = context.addNodeBefore(from, currentTo, currentFrom); fromKeyHoldovers[fromKey].remove(); - currentFrom = getNextSibling(from2, currentFrom); + currentFrom = getNextSibling(from, currentFrom); currentTo = getNextSibling(to, currentTo); continue; } } } - let currentFromNext = currentFrom && getNextSibling(from2, currentFrom); - patch(currentFrom, currentTo); + let currentFromNext = currentFrom && getNextSibling(from, currentFrom); + context.patch(currentFrom, currentTo); currentTo = currentTo && getNextSibling(to, currentTo); currentFrom = currentFromNext; } let removals = []; while (currentFrom) { - if (!shouldSkip(removing, currentFrom)) + if (!shouldSkip(context.removing, currentFrom)) removals.push(currentFrom); - currentFrom = getNextSibling(from2, currentFrom); + currentFrom = getNextSibling(from, currentFrom); } while (removals.length) { let domForRemoval = removals.shift(); domForRemoval.remove(); - removed(domForRemoval); + context.removed(domForRemoval); } - } - function getKey(el) { - return el && el.nodeType === 1 && key(el); - } - function keyToMap(els2) { + }; + context.getKey = function(el) { + return el && el.nodeType === 1 && context.key(el); + }; + context.keyToMap = function(els2) { let map = {}; for (let el of els2) { - let theKey = getKey(el); + let theKey = context.getKey(el); if (theKey) { map[theKey] = el; } } return map; - } - function addNodeBefore(parent, node, beforeMe) { - if (!shouldSkip(adding, node)) { + }; + context.addNodeBefore = function(parent, node, beforeMe) { + if (!shouldSkip(context.adding, node)) { let clone = node.cloneNode(true); parent.insertBefore(clone, beforeMe); - added(clone); + context.added(clone); return clone; } return node; - } - assignOptions(options); - fromEl = from; - toEl = typeof toHtml === "string" ? createElement(toHtml) : toHtml; - if (window.Alpine && window.Alpine.closestDataStack && !from._x_dataStack) { - toEl._x_dataStack = window.Alpine.closestDataStack(from); - toEl._x_dataStack && window.Alpine.cloneNode(from, toEl); - } - patch(from, toEl); - fromEl = void 0; - toEl = void 0; - return from; + }; + return context; } morph3.step = () => { }; @@ -7018,9 +6974,9 @@ var require_module_cjs8 = __commonJS({ hook(...args, () => skip = true); return skip; } - function shouldSkipChildren(hook, skipChildren, ...args) { + function shouldSkipChildren(hook, skipChildren, skipUntil, ...args) { let skip = false; - hook(...args, () => skip = true, skipChildren); + hook(...args, () => skip = true, skipChildren, skipUntil); return skip; } var patched = false; @@ -7103,16 +7059,17 @@ var require_module_cjs8 = __commonJS({ to.setAttribute("id", fromId); to.id = fromId; } - function src_default(Alpine23) { + function src_default2(Alpine23) { Alpine23.morph = morph3; + Alpine23.morphBetween = morphBetween; } - var module_default = src_default; + var module_default2 = src_default2; } }); -// ../alpine/packages/mask/dist/module.cjs.js -var require_module_cjs9 = __commonJS({ - "../alpine/packages/mask/dist/module.cjs.js"(exports, module) { +// node_modules/@alpinejs/mask/dist/module.cjs.js +var require_module_cjs8 = __commonJS({ + "node_modules/@alpinejs/mask/dist/module.cjs.js"(exports, module) { var __defProp2 = Object.defineProperty; var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; var __getOwnPropNames2 = Object.getOwnPropertyNames; @@ -7132,12 +7089,12 @@ var require_module_cjs9 = __commonJS({ var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod); var module_exports = {}; __export(module_exports, { - default: () => module_default, - mask: () => src_default, + default: () => module_default2, + mask: () => src_default2, stripDown: () => stripDown }); module.exports = __toCommonJS(module_exports); - function src_default(Alpine23) { + function src_default2(Alpine23) { Alpine23.directive("mask", (el, { value, expression }, { effect, evaluateLater, cleanup }) => { let templateFn = () => expression; let lastInputValue = ""; @@ -7304,7 +7261,7 @@ var require_module_cjs9 = __commonJS({ }); return template; } - var module_default = src_default; + var module_default2 = src_default2; } }); @@ -7498,7 +7455,8 @@ function handleFileUpload(el, property, component, cleanup) { return; start2(); if (e.target.multiple) { - manager.uploadMultiple(property, e.target.files, finish, error2, progress, cancel); + let append = ["ui-file-upload"].includes(e.target.tagName.toLowerCase()); + manager.uploadMultiple(property, e.target.files, finish, error2, progress, cancel, append); } else { manager.upload(property, e.target.files[0], finish, error2, progress, cancel); } @@ -7550,17 +7508,19 @@ var UploadManager = class { finishCallback, errorCallback, progressCallback, - cancelledCallback + cancelledCallback, + append: false }); } - uploadMultiple(name, files, finishCallback, errorCallback, progressCallback, cancelledCallback) { + uploadMultiple(name, files, finishCallback, errorCallback, progressCallback, cancelledCallback, append = false) { this.setUpload(name, { files: Array.from(files), multiple: true, finishCallback, errorCallback, progressCallback, - cancelledCallback + cancelledCallback, + append }); } removeUpload(name, tmpFilename, finishCallback) { @@ -7613,7 +7573,7 @@ var UploadManager = class { request.addEventListener("load", () => { if ((request.status + "")[0] === "2") { let paths = retrievePaths(request.response && JSON.parse(request.response)); - this.component.$wire.call("_finishUpload", name, paths, this.uploadBag.first(name).multiple); + this.component.$wire.call("_finishUpload", name, paths, this.uploadBag.first(name).multiple, this.uploadBag.first(name).append); return; } let errors = null; @@ -7710,9 +7670,9 @@ function uploadMultiple(component, name, files, finishCallback = () => { }, errorCallback = () => { }, progressCallback = () => { }, cancelledCallback = () => { -}) { +}, append = false) { let uploadManager = getUploadManager(component); - uploadManager.uploadMultiple(name, files, finishCallback, errorCallback, progressCallback, cancelledCallback); + uploadManager.uploadMultiple(name, files, finishCallback, errorCallback, progressCallback, cancelledCallback, append); } function removeUpload(component, name, tmpFilename, finishCallback = () => { }, errorCallback = () => { @@ -7828,14 +7788,13 @@ function showHtmlModal(html) { if (typeof modal != "undefined" && modal != null) { modal.innerHTML = ""; } else { - modal = document.createElement("div"); + modal = document.createElement("dialog"); modal.id = "livewire-error"; - modal.style.position = "fixed"; - modal.style.width = "100vw"; - modal.style.height = "100vh"; - modal.style.padding = "50px"; - modal.style.backgroundColor = "rgba(0, 0, 0, .6)"; - modal.style.zIndex = 2e5; + modal.style.margin = "50px"; + modal.style.width = "calc(100% - 100px)"; + modal.style.height = "calc(100% - 100px)"; + modal.style.borderRadius = "5px"; + modal.style.padding = "0px"; } let iframe = document.createElement("iframe"); iframe.style.backgroundColor = "#17161A"; @@ -7849,14 +7808,15 @@ function showHtmlModal(html) { iframe.contentWindow.document.write(page.outerHTML); iframe.contentWindow.document.close(); modal.addEventListener("click", () => hideHtmlModal(modal)); - modal.setAttribute("tabindex", 0); - modal.addEventListener("keydown", (e) => { - if (e.key === "Escape") - hideHtmlModal(modal); - }); + modal.addEventListener("close", () => cleanupModal(modal)); + modal.showModal(); modal.focus(); + modal.blur(); } function hideHtmlModal(modal) { + modal.close(); +} +function cleanupModal(modal) { modal.outerHTML = ""; document.body.style.overflow = "visible"; } @@ -7935,11 +7895,18 @@ var Commit = class { prepare() { trigger("commit.prepare", { component: this.component }); } + getEncodedSnapshotWithLatestChildrenMergedIn() { + let { snapshotEncoded, children, snapshot } = this.component; + let childIds = children.map((child) => child.id); + let filteredChildren = Object.fromEntries(Object.entries(snapshot.memo.children).filter(([key, value]) => childIds.includes(value[1]))); + return snapshotEncoded.replace(/"children":\{[^}]*\}/, `"children":${JSON.stringify(filteredChildren)}`); + } toRequestPayload() { let propertiesDiff = diff(this.component.canonical, this.component.ephemeral); let updates = this.component.mergeQueuedUpdates(propertiesDiff); + let snapshotEncoded = this.getEncodedSnapshotWithLatestChildrenMergedIn(); let payload = { - snapshot: this.component.snapshotEncoded, + snapshot: snapshotEncoded, updates, calls: this.calls.map((i) => ({ path: i.path, @@ -8028,7 +7995,6 @@ var CommitBus = class { createAndSendNewPool() { trigger("commit.pooling", { commits: this.commits }); let pools = this.corraleCommitsIntoPools(); - this.commits.clear(); trigger("commit.pooled", { pools }); pools.forEach((pool) => { if (pool.empty()) @@ -8036,13 +8002,17 @@ var CommitBus = class { this.pools.add(pool); pool.send().then(() => { this.pools.delete(pool); - this.sendAnyQueuedCommits(); + queueMicrotask(() => { + this.sendAnyQueuedCommits(); + }); }); }); } corraleCommitsIntoPools() { let pools = /* @__PURE__ */ new Set(); for (let [idx, commit] of this.commits.entries()) { + if (this.findPoolWithComponent(commit.component)) + continue; let hasFoundPool = false; pools.forEach((pool) => { if (pool.shouldHoldCommit(commit)) { @@ -8055,6 +8025,7 @@ var CommitBus = class { newPool.add(commit); pools.add(newPool); } + this.commits.delete(commit); } return pools; } @@ -8430,7 +8401,7 @@ var Component = class { get children() { let meta = this.snapshot.memo; let childIds = Object.values(meta.children).map((i) => i[1]); - return childIds.map((id) => findComponent(id)); + return childIds.filter((id) => hasComponent(id)).map((id) => findComponent(id)); } get parent() { return closestComponent(this.el.parentElement); @@ -8488,6 +8459,9 @@ function destroyComponent(id) { component.cleanup(); delete components[id]; } +function hasComponent(id) { + return !!components[id]; +} function findComponent(id) { let component = components[id]; if (!component) @@ -8555,6 +8529,9 @@ function on2(eventName, callback) { }; } function dispatchEvent(target, name, params, bubbles = true) { + if (typeof params === "string") { + params = [params]; + } let e = new CustomEvent(name, { bubbles, detail: params }); e.__livewire = { name, params, receivedBy: [] }; target.dispatchEvent(e); @@ -8632,38 +8609,172 @@ var Directive = class { this.expression = this.el.getAttribute(this.rawName); } get method() { - const { method } = this.parseOutMethodAndParams(this.expression); - return method; + const methods = this.parseOutMethodsAndParams(this.expression); + return methods[0].method; + } + get methods() { + return this.parseOutMethodsAndParams(this.expression); } get params() { - const { params } = this.parseOutMethodAndParams(this.expression); - return params; + const methods = this.parseOutMethodsAndParams(this.expression); + return methods[0].params; } - parseOutMethodAndParams(rawMethod) { - let method = rawMethod; - let params = []; - const methodAndParamString = method.match(/(.*?)\((.*)\)/s); - if (methodAndParamString) { - method = methodAndParamString[1]; - let func = new Function("$event", `return (function () { - for (var l=arguments.length, p=new Array(l), k=0; k 0) { + let argumentsToArray = function() { + for (var l = arguments.length, p = new Array(l), k = 0; k < l; k++) { + p[k] = arguments[k]; + } + return [].concat(p); + }; + try { + params = Alpine.evaluate(document, "argumentsToArray(" + paramString + ")", { + scope: { argumentsToArray } + }); + } catch (error2) { + console.warn("Failed to parse parameters:", paramString, error2); + params = []; + } + } + methods.push({ method, params }); } - return { method, params }; + return methods; + } + splitAndParseMethods(methodExpression) { + let methods = []; + let current = ""; + let parenCount = 0; + let inString = false; + let stringChar = null; + let trimmedExpression = methodExpression.trim(); + for (let i = 0; i < trimmedExpression.length; i++) { + let char = trimmedExpression[i]; + if (!inString) { + if (char === '"' || char === "'") { + inString = true; + stringChar = char; + current += char; + } else if (char === "(") { + parenCount++; + current += char; + } else if (char === ")") { + parenCount--; + current += char; + } else if (char === "," && parenCount === 0) { + methods.push(this.parseMethodCall(current.trim())); + current = ""; + } else { + current += char; + } + } else { + if (char === stringChar && trimmedExpression[i - 1] !== "\\") { + inString = false; + stringChar = null; + } + current += char; + } + } + if (current.trim().length > 0) { + methods.push(this.parseMethodCall(current.trim())); + } + return methods; + } + parseMethodCall(methodString) { + let methodMatch = methodString.match(/^([^(]+)\(/); + if (!methodMatch) { + return { + method: methodString.trim(), + paramString: "" + }; + } + let method = methodMatch[1].trim(); + let paramStart = methodMatch[0].length - 1; + let lastParenIndex = methodString.lastIndexOf(")"); + if (lastParenIndex === -1) { + throw new Error(`Missing closing parenthesis for method "${method}"`); + } + let paramString = methodString.slice(paramStart + 1, lastParenIndex).trim(); + return { + method, + paramString + }; } }; // js/lifecycle.js var import_collapse = __toESM(require_module_cjs2()); var import_focus = __toESM(require_module_cjs3()); -var import_persist2 = __toESM(require_module_cjs4()); -var import_intersect = __toESM(require_module_cjs5()); -var import_resize = __toESM(require_module_cjs6()); -var import_anchor = __toESM(require_module_cjs7()); + +// node_modules/@alpinejs/persist/dist/module.esm.js +function src_default(Alpine23) { + let persist = () => { + let alias; + let storage; + try { + storage = localStorage; + } catch (e) { + console.error(e); + console.warn("Alpine: $persist is using temporary storage since localStorage is unavailable."); + let dummy = /* @__PURE__ */ new Map(); + storage = { + getItem: dummy.get.bind(dummy), + setItem: dummy.set.bind(dummy) + }; + } + return Alpine23.interceptor((initialValue, getter, setter, path, key) => { + let lookup = alias || `_x_${path}`; + let initial = storageHas(lookup, storage) ? storageGet(lookup, storage) : initialValue; + setter(initial); + Alpine23.effect(() => { + let value = getter(); + storageSet(lookup, value, storage); + setter(value); + }); + return initial; + }, (func) => { + func.as = (key) => { + alias = key; + return func; + }, func.using = (target) => { + storage = target; + return func; + }; + }); + }; + Object.defineProperty(Alpine23, "$persist", { get: () => persist() }); + Alpine23.magic("persist", persist); + Alpine23.persist = (key, { get, set }, storage = localStorage) => { + let initial = storageHas(key, storage) ? storageGet(key, storage) : get(); + set(initial); + Alpine23.effect(() => { + let value = get(); + storageSet(key, value, storage); + set(value); + }); + }; +} +function storageHas(key, storage) { + return storage.getItem(key) !== null; +} +function storageGet(key, storage) { + let value = storage.getItem(key); + if (value === void 0) + return; + return JSON.parse(value); +} +function storageSet(key, value, storage) { + storage.setItem(key, JSON.stringify(value)); +} +var module_default = src_default; + +// js/lifecycle.js +var import_intersect = __toESM(require_module_cjs4()); +var import_resize = __toESM(require_module_cjs5()); +var import_anchor = __toESM(require_module_cjs6()); // js/plugins/navigate/history.js var Snapshot = class { @@ -8852,12 +8963,12 @@ function performFetch(uri, callback) { // js/plugins/navigate/prefetch.js var prefetches = {}; +var cacheDuration = 3e4; function prefetchHtml(destination, callback) { let uri = getUriStringFromUrlObject(destination); if (prefetches[uri]) return; - prefetches[uri] = { finished: false, html: null, whenFinished: () => { - } }; + prefetches[uri] = { finished: false, html: null, whenFinished: () => setTimeout(() => delete prefetches[uri], cacheDuration) }; performFetch(uri, (html, routedUri) => { callback(html, routedUri); }); @@ -9137,6 +9248,7 @@ function isPopoverSupported() { var oldBodyScriptTagHashes = []; var attributesExemptFromScriptTagHashing = [ "data-csrf", + "nonce", "aria-hidden" ]; function swapCurrentPageWithNewHtml(html, andThen) { @@ -9288,7 +9400,8 @@ var showProgressBar = true; var restoreScroll = true; var autofocus = false; function navigate_default(Alpine23) { - Alpine23.navigate = (url) => { + Alpine23.navigate = (url, options = {}) => { + let { preserveScroll = false } = options; let destination = createUrlObjectFromString(url); let prevented = fireEventForOtherLibrariesToHookInto("alpine:navigate", { url: destination, @@ -9297,7 +9410,7 @@ function navigate_default(Alpine23) { }); if (prevented) return; - navigateTo(destination); + navigateTo(destination, { preserveScroll }); }; Alpine23.navigate.disableProgressBar = () => { showProgressBar = false; @@ -9305,6 +9418,7 @@ function navigate_default(Alpine23) { Alpine23.addInitSelector(() => `[${Alpine23.prefixed("navigate")}]`); Alpine23.directive("navigate", (el, { modifiers }) => { let shouldPrefetchOnHover = modifiers.includes("hover"); + let preserveScroll = modifiers.includes("preserve-scroll"); shouldPrefetchOnHover && whenThisLinkIsHoveredFor(el, 60, () => { let destination = extractDestinationFromLink(el); if (!destination) @@ -9328,16 +9442,15 @@ function navigate_default(Alpine23) { }); if (prevented) return; - navigateTo(destination); + navigateTo(destination, { preserveScroll }); }); }); }); - function navigateTo(destination, shouldPushToHistoryState = true) { + function navigateTo(destination, { preserveScroll = false, shouldPushToHistoryState = true }) { showProgressBar && showAndStartProgressBar(); fetchHtmlOrUsePrefetchedHtml(destination, (html, finalDestination) => { fireEventForOtherLibrariesToHookInto("alpine:navigating"); restoreScroll && storeScrollInformationInHtmlBeforeNavigatingAway(); - showProgressBar && finishAndHideProgressBar(); cleanupAlpineElementsOnThePageThatArentInsideAPersistedElement(); updateCurrentPageHtmlInHistoryStateForLaterBackButtonClicks(); preventAlpineFromPickingUpDomChanges(Alpine23, (andAfterAllThis) => { @@ -9356,7 +9469,7 @@ function navigate_default(Alpine23) { unPackPersistedTeleports(persistedEl); unPackPersistedPopovers(persistedEl); }); - restoreScrollPositionOrScrollToTop(); + !preserveScroll && restoreScrollPositionOrScrollToTop(); afterNewScriptsAreDoneLoading(() => { andAfterAllThis(() => { setTimeout(() => { @@ -9364,6 +9477,7 @@ function navigate_default(Alpine23) { }); nowInitializeAlpineOnTheNewPage(Alpine23); fireEventForOtherLibrariesToHookInto("alpine:navigated"); + showProgressBar && finishAndHideProgressBar(); }); }); }); @@ -9380,8 +9494,7 @@ function navigate_default(Alpine23) { }); if (prevented) return; - let shouldPushToHistoryState = false; - navigateTo(destination, shouldPushToHistoryState); + navigateTo(destination, { shouldPushToHistoryState: false }); }); }, (html, url, currentPageUrl, currentPageKey) => { let destination = createUrlObjectFromString(url); @@ -9679,8 +9792,8 @@ function fromQueryString(search, queryKey) { } // js/lifecycle.js -var import_morph = __toESM(require_module_cjs8()); -var import_mask = __toESM(require_module_cjs9()); +var import_morph = __toESM(require_module_cjs7()); +var import_mask = __toESM(require_module_cjs8()); var import_alpinejs5 = __toESM(require_module_cjs()); function start() { setTimeout(() => ensureLivewireScriptIsntMisplaced()); @@ -9693,7 +9806,7 @@ function start() { import_alpinejs5.default.plugin(import_collapse.default); import_alpinejs5.default.plugin(import_anchor.default); import_alpinejs5.default.plugin(import_focus.default); - import_alpinejs5.default.plugin(import_persist2.default); + import_alpinejs5.default.plugin(module_default); import_alpinejs5.default.plugin(navigate_default); import_alpinejs5.default.plugin(import_mask.default); import_alpinejs5.default.addRootSelector(() => "[wire\\:id]"); @@ -9715,7 +9828,7 @@ function start() { import_alpinejs5.default.interceptInit(import_alpinejs5.default.skipDuringClone((el) => { if (!Array.from(el.attributes).some((attribute) => matchesForLivewireDirective(attribute.name))) return; - if (el.hasAttribute("wire:id")) { + if (el.hasAttribute("wire:id") && !el.__livewire && !hasComponent(el.getAttribute("wire:id"))) { let component2 = initComponent(el); import_alpinejs5.default.onAttributeRemoved(el, "wire:id", () => { destroyComponent(component2.id); @@ -9736,6 +9849,15 @@ function start() { } }); }); } + }, (el) => { + if (!Array.from(el.attributes).some((attribute) => matchesForLivewireDirective(attribute.name))) + return; + let directives = Array.from(el.getAttributeNames()).filter((name) => matchesForLivewireDirective(name)).map((name) => extractDirective(el, name)); + directives.forEach((directive2) => { + trigger("directive.global.init", { el, directive: directive2, cleanup: (callback) => { + import_alpinejs5.default.onAttributeRemoved(el, directive2.raw, callback); + } }); + }); })); import_alpinejs5.default.start(); setTimeout(() => window.Livewire.initialRenderIsFinished = true); @@ -9908,6 +10030,8 @@ on("effect", ({ component, effects }) => { var import_alpinejs8 = __toESM(require_module_cjs()); function morph2(component, el, html) { let wrapperTag = el.parentElement ? el.parentElement.tagName.toLowerCase() : "div"; + let customElement = customElements.get(wrapperTag); + wrapperTag = customElement ? customElement.name : wrapperTag; let wrapper = document.createElement(wrapperTag); wrapper.innerHTML = html; let parentComponent; @@ -9917,8 +10041,25 @@ function morph2(component, el, html) { } parentComponent && (wrapper.__livewire = parentComponent); let to = wrapper.firstElementChild; + to.setAttribute("wire:snapshot", component.snapshotEncoded); + let effects = { ...component.effects }; + delete effects.html; + to.setAttribute("wire:effects", JSON.stringify(effects)); to.__livewire = component; trigger("morph", { el, toEl: to, component }); + let existingComponentsMap = {}; + el.querySelectorAll("[wire\\:id]").forEach((component2) => { + existingComponentsMap[component2.getAttribute("wire:id")] = component2; + }); + to.querySelectorAll("[wire\\:id]").forEach((child) => { + if (child.hasAttribute("wire:snapshot")) + return; + let wireId = child.getAttribute("wire:id"); + let existingComponent = existingComponentsMap[wireId]; + if (existingComponent) { + child.replaceWith(existingComponent.cloneNode(true)); + } + }); import_alpinejs8.default.morph(el, to, { updating: (el2, toEl, childrenOnly, skip, skipChildren) => { if (isntElement(el2)) @@ -9995,7 +10136,13 @@ on("effect", ({ component, effects }) => { // js/features/supportDispatches.js on("effect", ({ component, effects }) => { - dispatchEvents(component, effects.dispatches || []); + queueMicrotask(() => { + queueMicrotask(() => { + queueMicrotask(() => { + dispatchEvents(component, effects.dispatches || []); + }); + }); + }); }); function dispatchEvents(component, dispatches) { dispatches.forEach(({ name, params = {}, self: self2 = false, to }) => { @@ -10451,11 +10598,20 @@ on("directive.init", ({ el, directive: directive2, cleanup, component }) => { var import_alpinejs13 = __toESM(require_module_cjs()); import_alpinejs13.default.addInitSelector(() => `[wire\\:navigate]`); import_alpinejs13.default.addInitSelector(() => `[wire\\:navigate\\.hover]`); +import_alpinejs13.default.addInitSelector(() => `[wire\\:navigate\\.preserve-scroll]`); +import_alpinejs13.default.addInitSelector(() => `[wire\\:navigate\\.preserve-scroll\\.hover]`); +import_alpinejs13.default.addInitSelector(() => `[wire\\:navigate\\.hover\\.preserve-scroll]`); import_alpinejs13.default.interceptInit(import_alpinejs13.default.skipDuringClone((el) => { if (el.hasAttribute("wire:navigate")) { import_alpinejs13.default.bind(el, { ["x-navigate"]: true }); } else if (el.hasAttribute("wire:navigate.hover")) { import_alpinejs13.default.bind(el, { ["x-navigate.hover"]: true }); + } else if (el.hasAttribute("wire:navigate.preserve-scroll")) { + import_alpinejs13.default.bind(el, { ["x-navigate.preserve-scroll"]: true }); + } else if (el.hasAttribute("wire:navigate.preserve-scroll.hover")) { + import_alpinejs13.default.bind(el, { ["x-navigate.preserve-scroll.hover"]: true }); + } else if (el.hasAttribute("wire:navigate.hover.preserve-scroll")) { + import_alpinejs13.default.bind(el, { ["x-navigate.hover.preserve-scroll"]: true }); } })); document.addEventListener("alpine:navigating", () => { @@ -10708,18 +10864,14 @@ function getTargets(el) { let inverted = false; if (directives.has("target")) { let directive2 = directives.get("target"); - let raw = directive2.expression; if (directive2.modifiers.includes("except")) inverted = true; - if (raw.includes("(") && raw.includes(")")) { - targets.push({ target: directive2.method, params: quickHash(JSON.stringify(directive2.params)) }); - } else if (raw.includes(",")) { - raw.split(",").map((i) => i.trim()).forEach((target) => { - targets.push({ target }); + directive2.methods.forEach(({ method, params }) => { + targets.push({ + target: method, + params: params && params.length > 0 ? quickHash(JSON.stringify(params)) : void 0 }); - } else { - targets.push({ target: raw }); - } + }); } else { let nonActionOrModelLivewireDirectives = ["init", "dirty", "offline", "target", "loading", "poll", "ignore", "key", "id"]; directives.all().filter((i) => !nonActionOrModelLivewireDirectives.includes(i.value)).map((i) => i.expression.split("(")[0]).forEach((target) => targets.push({ target })); @@ -10739,7 +10891,7 @@ directive("stream", ({ el, directive: directive2, cleanup }) => { if (modifiers.includes("replace") || replace2) { el.innerHTML = content; } else { - el.innerHTML = el.innerHTML + content; + el.insertAdjacentHTML("beforeend", content); } }); cleanup(off); @@ -10888,7 +11040,7 @@ directive("model", ({ el, directive: directive2, component, cleanup }) => { let onBlur = modifiers.includes("blur"); let isDebounced = modifiers.includes("debounce"); let update = expression.startsWith("$parent") ? () => component.$wire.$parent.$commit() : () => component.$wire.$commit(); - let debouncedUpdate = isTextInput(el) && !isDebounced && isLive ? debounce(update, 150) : update; + let debouncedUpdate = isRealtimeInput(el) && !isDebounced && isLive ? debounce(update, 150) : update; import_alpinejs16.default.bind(el, { ["@change"]() { isLazy && update(); @@ -10918,8 +11070,8 @@ function getModifierTail(modifiers) { return ""; return "." + modifiers.join("."); } -function isTextInput(el) { - return ["INPUT", "TEXTAREA"].includes(el.tagName.toUpperCase()) && !["checkbox", "radio"].includes(el.type); +function isRealtimeInput(el) { + return ["INPUT", "TEXTAREA"].includes(el.tagName.toUpperCase()) && !["checkbox", "radio"].includes(el.type) || el.tagName.toUpperCase() === "UI-SLIDER"; } function componentIsMissingProperty(component, property) { if (property.startsWith("$parent")) { diff --git a/public/vendor/livewire/livewire.esm.js.map b/public/vendor/livewire/livewire.esm.js.map index 939cd00..ac70fab 100644 --- a/public/vendor/livewire/livewire.esm.js.map +++ b/public/vendor/livewire/livewire.esm.js.map @@ -1,7 +1,7 @@ { "version": 3, - "sources": ["../../alpine/packages/alpinejs/dist/module.cjs.js", "../../alpine/packages/collapse/dist/module.cjs.js", "../../alpine/packages/focus/dist/module.cjs.js", "../../alpine/packages/persist/dist/module.cjs.js", "../../alpine/packages/intersect/dist/module.cjs.js", "../node_modules/@alpinejs/resize/dist/module.cjs.js", "../../alpine/packages/anchor/dist/module.cjs.js", "../node_modules/nprogress/nprogress.js", "../../alpine/packages/morph/dist/module.cjs.js", "../../alpine/packages/mask/dist/module.cjs.js", "../js/utils.js", "../js/features/supportFileUploads.js", "../js/features/supportEntangle.js", "../js/hooks.js", "../js/request/modal.js", "../js/request/pool.js", "../js/request/commit.js", "../js/request/bus.js", "../js/request/index.js", "../js/$wire.js", "../js/component.js", "../js/store.js", "../js/events.js", "../js/directives.js", "../js/lifecycle.js", "../js/plugins/navigate/history.js", "../js/plugins/navigate/links.js", "../js/plugins/navigate/fetch.js", "../js/plugins/navigate/prefetch.js", "../js/plugins/navigate/teleport.js", "../js/plugins/navigate/scroll.js", "../js/plugins/navigate/persist.js", "../js/plugins/navigate/bar.js", "../js/plugins/navigate/popover.js", "../js/plugins/navigate/page.js", "../js/plugins/navigate/index.js", "../js/plugins/history/index.js", "../js/index.js", "../js/features/supportListeners.js", "../js/features/supportScriptsAndAssets.js", "../js/features/supportJsEvaluation.js", "../js/morph.js", "../js/features/supportMorphDom.js", "../js/features/supportDispatches.js", "../js/features/supportDisablingFormsDuringRequest.js", "../js/features/supportPropsAndModelables.js", "../js/features/supportFileDownloads.js", "../js/features/supportLazyLoading.js", "../js/features/supportQueryString.js", "../js/features/supportLaravelEcho.js", "../js/features/supportIsolating.js", "../js/features/supportNavigate.js", "../js/features/supportRedirects.js", "../js/directives/wire-transition.js", "../js/debounce.js", "../js/directives/wire-wildcard.js", "../js/directives/wire-navigate.js", "../js/directives/wire-confirm.js", "../js/directives/wire-current.js", "../js/directives/shared.js", "../js/directives/wire-offline.js", "../js/directives/wire-loading.js", "../js/directives/wire-stream.js", "../js/directives/wire-replace.js", "../js/directives/wire-ignore.js", "../js/directives/wire-cloak.js", "../js/directives/wire-dirty.js", "../js/directives/wire-model.js", "../js/directives/wire-init.js", "../js/directives/wire-poll.js", "../js/directives/wire-show.js", "../js/directives/wire-text.js"], - "sourcesContent": ["var __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __commonJS = (cb, mod) => function __require() {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n};\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n // If the importer is in node compatibility mode or this is not an ESM\n // file that has been converted to a CommonJS file using a Babel-\n // compatible transform (i.e. \"__esModule\" has not been set), then set\n // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// node_modules/@vue/shared/dist/shared.cjs.js\nvar require_shared_cjs = __commonJS({\n \"node_modules/@vue/shared/dist/shared.cjs.js\"(exports) {\n \"use strict\";\n Object.defineProperty(exports, \"__esModule\", { value: true });\n function makeMap(str, expectsLowerCase) {\n const map = /* @__PURE__ */ Object.create(null);\n const list = str.split(\",\");\n for (let i = 0; i < list.length; i++) {\n map[list[i]] = true;\n }\n return expectsLowerCase ? (val) => !!map[val.toLowerCase()] : (val) => !!map[val];\n }\n var PatchFlagNames = {\n [\n 1\n /* TEXT */\n ]: `TEXT`,\n [\n 2\n /* CLASS */\n ]: `CLASS`,\n [\n 4\n /* STYLE */\n ]: `STYLE`,\n [\n 8\n /* PROPS */\n ]: `PROPS`,\n [\n 16\n /* FULL_PROPS */\n ]: `FULL_PROPS`,\n [\n 32\n /* HYDRATE_EVENTS */\n ]: `HYDRATE_EVENTS`,\n [\n 64\n /* STABLE_FRAGMENT */\n ]: `STABLE_FRAGMENT`,\n [\n 128\n /* KEYED_FRAGMENT */\n ]: `KEYED_FRAGMENT`,\n [\n 256\n /* UNKEYED_FRAGMENT */\n ]: `UNKEYED_FRAGMENT`,\n [\n 512\n /* NEED_PATCH */\n ]: `NEED_PATCH`,\n [\n 1024\n /* DYNAMIC_SLOTS */\n ]: `DYNAMIC_SLOTS`,\n [\n 2048\n /* DEV_ROOT_FRAGMENT */\n ]: `DEV_ROOT_FRAGMENT`,\n [\n -1\n /* HOISTED */\n ]: `HOISTED`,\n [\n -2\n /* BAIL */\n ]: `BAIL`\n };\n var slotFlagsText = {\n [\n 1\n /* STABLE */\n ]: \"STABLE\",\n [\n 2\n /* DYNAMIC */\n ]: \"DYNAMIC\",\n [\n 3\n /* FORWARDED */\n ]: \"FORWARDED\"\n };\n var GLOBALS_WHITE_LISTED = \"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt\";\n var isGloballyWhitelisted = /* @__PURE__ */ makeMap(GLOBALS_WHITE_LISTED);\n var range = 2;\n function generateCodeFrame(source, start2 = 0, end = source.length) {\n let lines = source.split(/(\\r?\\n)/);\n const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\n lines = lines.filter((_, idx) => idx % 2 === 0);\n let count = 0;\n const res = [];\n for (let i = 0; i < lines.length; i++) {\n count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);\n if (count >= start2) {\n for (let j = i - range; j <= i + range || end > count; j++) {\n if (j < 0 || j >= lines.length)\n continue;\n const line = j + 1;\n res.push(`${line}${\" \".repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}`);\n const lineLength = lines[j].length;\n const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;\n if (j === i) {\n const pad = start2 - (count - (lineLength + newLineSeqLength));\n const length = Math.max(1, end > count ? lineLength - pad : end - start2);\n res.push(` | ` + \" \".repeat(pad) + \"^\".repeat(length));\n } else if (j > i) {\n if (end > count) {\n const length = Math.max(Math.min(end - count, lineLength), 1);\n res.push(` | ` + \"^\".repeat(length));\n }\n count += lineLength + newLineSeqLength;\n }\n }\n break;\n }\n }\n return res.join(\"\\n\");\n }\n var specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\n var isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);\n var isBooleanAttr2 = /* @__PURE__ */ makeMap(specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`);\n var unsafeAttrCharRE = /[>/=\"'\\u0009\\u000a\\u000c\\u0020]/;\n var attrValidationCache = {};\n function isSSRSafeAttrName(name) {\n if (attrValidationCache.hasOwnProperty(name)) {\n return attrValidationCache[name];\n }\n const isUnsafe = unsafeAttrCharRE.test(name);\n if (isUnsafe) {\n console.error(`unsafe attribute name: ${name}`);\n }\n return attrValidationCache[name] = !isUnsafe;\n }\n var propsToAttrMap = {\n acceptCharset: \"accept-charset\",\n className: \"class\",\n htmlFor: \"for\",\n httpEquiv: \"http-equiv\"\n };\n var isNoUnitNumericStyleProp = /* @__PURE__ */ makeMap(`animation-iteration-count,border-image-outset,border-image-slice,border-image-width,box-flex,box-flex-group,box-ordinal-group,column-count,columns,flex,flex-grow,flex-positive,flex-shrink,flex-negative,flex-order,grid-row,grid-row-end,grid-row-span,grid-row-start,grid-column,grid-column-end,grid-column-span,grid-column-start,font-weight,line-clamp,line-height,opacity,order,orphans,tab-size,widows,z-index,zoom,fill-opacity,flood-opacity,stop-opacity,stroke-dasharray,stroke-dashoffset,stroke-miterlimit,stroke-opacity,stroke-width`);\n var isKnownAttr = /* @__PURE__ */ makeMap(`accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`);\n function normalizeStyle(value) {\n if (isArray(value)) {\n const res = {};\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const normalized = normalizeStyle(isString(item) ? parseStringStyle(item) : item);\n if (normalized) {\n for (const key in normalized) {\n res[key] = normalized[key];\n }\n }\n }\n return res;\n } else if (isObject(value)) {\n return value;\n }\n }\n var listDelimiterRE = /;(?![^(]*\\))/g;\n var propertyDelimiterRE = /:(.+)/;\n function parseStringStyle(cssText) {\n const ret = {};\n cssText.split(listDelimiterRE).forEach((item) => {\n if (item) {\n const tmp = item.split(propertyDelimiterRE);\n tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\n }\n });\n return ret;\n }\n function stringifyStyle(styles) {\n let ret = \"\";\n if (!styles) {\n return ret;\n }\n for (const key in styles) {\n const value = styles[key];\n const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\n if (isString(value) || typeof value === \"number\" && isNoUnitNumericStyleProp(normalizedKey)) {\n ret += `${normalizedKey}:${value};`;\n }\n }\n return ret;\n }\n function normalizeClass(value) {\n let res = \"\";\n if (isString(value)) {\n res = value;\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const normalized = normalizeClass(value[i]);\n if (normalized) {\n res += normalized + \" \";\n }\n }\n } else if (isObject(value)) {\n for (const name in value) {\n if (value[name]) {\n res += name + \" \";\n }\n }\n }\n return res.trim();\n }\n var HTML_TAGS = \"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\";\n var SVG_TAGS = \"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistanceLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\";\n var VOID_TAGS = \"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\";\n var isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);\n var isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);\n var isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);\n var escapeRE = /[\"'&<>]/;\n function escapeHtml(string) {\n const str = \"\" + string;\n const match = escapeRE.exec(str);\n if (!match) {\n return str;\n }\n let html = \"\";\n let escaped;\n let index;\n let lastIndex = 0;\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34:\n escaped = \""\";\n break;\n case 38:\n escaped = \"&\";\n break;\n case 39:\n escaped = \"'\";\n break;\n case 60:\n escaped = \"<\";\n break;\n case 62:\n escaped = \">\";\n break;\n default:\n continue;\n }\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n lastIndex = index + 1;\n html += escaped;\n }\n return lastIndex !== index ? html + str.substring(lastIndex, index) : html;\n }\n var commentStripRE = /^-?>||--!>| looseEqual(item, val));\n }\n var toDisplayString = (val) => {\n return val == null ? \"\" : isObject(val) ? JSON.stringify(val, replacer, 2) : String(val);\n };\n var replacer = (_key, val) => {\n if (isMap(val)) {\n return {\n [`Map(${val.size})`]: [...val.entries()].reduce((entries, [key, val2]) => {\n entries[`${key} =>`] = val2;\n return entries;\n }, {})\n };\n } else if (isSet(val)) {\n return {\n [`Set(${val.size})`]: [...val.values()]\n };\n } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {\n return String(val);\n }\n return val;\n };\n var babelParserDefaultPlugins = [\n \"bigInt\",\n \"optionalChaining\",\n \"nullishCoalescingOperator\"\n ];\n var EMPTY_OBJ = Object.freeze({});\n var EMPTY_ARR = Object.freeze([]);\n var NOOP = () => {\n };\n var NO = () => false;\n var onRE = /^on[^a-z]/;\n var isOn = (key) => onRE.test(key);\n var isModelListener = (key) => key.startsWith(\"onUpdate:\");\n var extend = Object.assign;\n var remove = (arr, el) => {\n const i = arr.indexOf(el);\n if (i > -1) {\n arr.splice(i, 1);\n }\n };\n var hasOwnProperty = Object.prototype.hasOwnProperty;\n var hasOwn = (val, key) => hasOwnProperty.call(val, key);\n var isArray = Array.isArray;\n var isMap = (val) => toTypeString(val) === \"[object Map]\";\n var isSet = (val) => toTypeString(val) === \"[object Set]\";\n var isDate = (val) => val instanceof Date;\n var isFunction = (val) => typeof val === \"function\";\n var isString = (val) => typeof val === \"string\";\n var isSymbol = (val) => typeof val === \"symbol\";\n var isObject = (val) => val !== null && typeof val === \"object\";\n var isPromise = (val) => {\n return isObject(val) && isFunction(val.then) && isFunction(val.catch);\n };\n var objectToString = Object.prototype.toString;\n var toTypeString = (value) => objectToString.call(value);\n var toRawType = (value) => {\n return toTypeString(value).slice(8, -1);\n };\n var isPlainObject = (val) => toTypeString(val) === \"[object Object]\";\n var isIntegerKey = (key) => isString(key) && key !== \"NaN\" && key[0] !== \"-\" && \"\" + parseInt(key, 10) === key;\n var isReservedProp = /* @__PURE__ */ makeMap(\n // the leading comma is intentional so empty string \"\" is also included\n \",key,ref,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"\n );\n var cacheStringFunction = (fn) => {\n const cache = /* @__PURE__ */ Object.create(null);\n return (str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n };\n };\n var camelizeRE = /-(\\w)/g;\n var camelize = cacheStringFunction((str) => {\n return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : \"\");\n });\n var hyphenateRE = /\\B([A-Z])/g;\n var hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, \"-$1\").toLowerCase());\n var capitalize = cacheStringFunction((str) => str.charAt(0).toUpperCase() + str.slice(1));\n var toHandlerKey = cacheStringFunction((str) => str ? `on${capitalize(str)}` : ``);\n var hasChanged = (value, oldValue) => value !== oldValue && (value === value || oldValue === oldValue);\n var invokeArrayFns = (fns, arg) => {\n for (let i = 0; i < fns.length; i++) {\n fns[i](arg);\n }\n };\n var def = (obj, key, value) => {\n Object.defineProperty(obj, key, {\n configurable: true,\n enumerable: false,\n value\n });\n };\n var toNumber = (val) => {\n const n = parseFloat(val);\n return isNaN(n) ? val : n;\n };\n var _globalThis;\n var getGlobalThis = () => {\n return _globalThis || (_globalThis = typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : {});\n };\n exports.EMPTY_ARR = EMPTY_ARR;\n exports.EMPTY_OBJ = EMPTY_OBJ;\n exports.NO = NO;\n exports.NOOP = NOOP;\n exports.PatchFlagNames = PatchFlagNames;\n exports.babelParserDefaultPlugins = babelParserDefaultPlugins;\n exports.camelize = camelize;\n exports.capitalize = capitalize;\n exports.def = def;\n exports.escapeHtml = escapeHtml;\n exports.escapeHtmlComment = escapeHtmlComment;\n exports.extend = extend;\n exports.generateCodeFrame = generateCodeFrame;\n exports.getGlobalThis = getGlobalThis;\n exports.hasChanged = hasChanged;\n exports.hasOwn = hasOwn;\n exports.hyphenate = hyphenate;\n exports.invokeArrayFns = invokeArrayFns;\n exports.isArray = isArray;\n exports.isBooleanAttr = isBooleanAttr2;\n exports.isDate = isDate;\n exports.isFunction = isFunction;\n exports.isGloballyWhitelisted = isGloballyWhitelisted;\n exports.isHTMLTag = isHTMLTag;\n exports.isIntegerKey = isIntegerKey;\n exports.isKnownAttr = isKnownAttr;\n exports.isMap = isMap;\n exports.isModelListener = isModelListener;\n exports.isNoUnitNumericStyleProp = isNoUnitNumericStyleProp;\n exports.isObject = isObject;\n exports.isOn = isOn;\n exports.isPlainObject = isPlainObject;\n exports.isPromise = isPromise;\n exports.isReservedProp = isReservedProp;\n exports.isSSRSafeAttrName = isSSRSafeAttrName;\n exports.isSVGTag = isSVGTag;\n exports.isSet = isSet;\n exports.isSpecialBooleanAttr = isSpecialBooleanAttr;\n exports.isString = isString;\n exports.isSymbol = isSymbol;\n exports.isVoidTag = isVoidTag;\n exports.looseEqual = looseEqual;\n exports.looseIndexOf = looseIndexOf;\n exports.makeMap = makeMap;\n exports.normalizeClass = normalizeClass;\n exports.normalizeStyle = normalizeStyle;\n exports.objectToString = objectToString;\n exports.parseStringStyle = parseStringStyle;\n exports.propsToAttrMap = propsToAttrMap;\n exports.remove = remove;\n exports.slotFlagsText = slotFlagsText;\n exports.stringifyStyle = stringifyStyle;\n exports.toDisplayString = toDisplayString;\n exports.toHandlerKey = toHandlerKey;\n exports.toNumber = toNumber;\n exports.toRawType = toRawType;\n exports.toTypeString = toTypeString;\n }\n});\n\n// node_modules/@vue/shared/index.js\nvar require_shared = __commonJS({\n \"node_modules/@vue/shared/index.js\"(exports, module2) {\n \"use strict\";\n if (false) {\n module2.exports = null;\n } else {\n module2.exports = require_shared_cjs();\n }\n }\n});\n\n// node_modules/@vue/reactivity/dist/reactivity.cjs.js\nvar require_reactivity_cjs = __commonJS({\n \"node_modules/@vue/reactivity/dist/reactivity.cjs.js\"(exports) {\n \"use strict\";\n Object.defineProperty(exports, \"__esModule\", { value: true });\n var shared = require_shared();\n var targetMap = /* @__PURE__ */ new WeakMap();\n var effectStack = [];\n var activeEffect;\n var ITERATE_KEY = Symbol(\"iterate\");\n var MAP_KEY_ITERATE_KEY = Symbol(\"Map key iterate\");\n function isEffect(fn) {\n return fn && fn._isEffect === true;\n }\n function effect3(fn, options = shared.EMPTY_OBJ) {\n if (isEffect(fn)) {\n fn = fn.raw;\n }\n const effect4 = createReactiveEffect(fn, options);\n if (!options.lazy) {\n effect4();\n }\n return effect4;\n }\n function stop2(effect4) {\n if (effect4.active) {\n cleanup(effect4);\n if (effect4.options.onStop) {\n effect4.options.onStop();\n }\n effect4.active = false;\n }\n }\n var uid = 0;\n function createReactiveEffect(fn, options) {\n const effect4 = function reactiveEffect() {\n if (!effect4.active) {\n return fn();\n }\n if (!effectStack.includes(effect4)) {\n cleanup(effect4);\n try {\n enableTracking();\n effectStack.push(effect4);\n activeEffect = effect4;\n return fn();\n } finally {\n effectStack.pop();\n resetTracking();\n activeEffect = effectStack[effectStack.length - 1];\n }\n }\n };\n effect4.id = uid++;\n effect4.allowRecurse = !!options.allowRecurse;\n effect4._isEffect = true;\n effect4.active = true;\n effect4.raw = fn;\n effect4.deps = [];\n effect4.options = options;\n return effect4;\n }\n function cleanup(effect4) {\n const { deps } = effect4;\n if (deps.length) {\n for (let i = 0; i < deps.length; i++) {\n deps[i].delete(effect4);\n }\n deps.length = 0;\n }\n }\n var shouldTrack = true;\n var trackStack = [];\n function pauseTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = false;\n }\n function enableTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = true;\n }\n function resetTracking() {\n const last = trackStack.pop();\n shouldTrack = last === void 0 ? true : last;\n }\n function track(target, type, key) {\n if (!shouldTrack || activeEffect === void 0) {\n return;\n }\n let depsMap = targetMap.get(target);\n if (!depsMap) {\n targetMap.set(target, depsMap = /* @__PURE__ */ new Map());\n }\n let dep = depsMap.get(key);\n if (!dep) {\n depsMap.set(key, dep = /* @__PURE__ */ new Set());\n }\n if (!dep.has(activeEffect)) {\n dep.add(activeEffect);\n activeEffect.deps.push(dep);\n if (activeEffect.options.onTrack) {\n activeEffect.options.onTrack({\n effect: activeEffect,\n target,\n type,\n key\n });\n }\n }\n }\n function trigger(target, type, key, newValue, oldValue, oldTarget) {\n const depsMap = targetMap.get(target);\n if (!depsMap) {\n return;\n }\n const effects = /* @__PURE__ */ new Set();\n const add2 = (effectsToAdd) => {\n if (effectsToAdd) {\n effectsToAdd.forEach((effect4) => {\n if (effect4 !== activeEffect || effect4.allowRecurse) {\n effects.add(effect4);\n }\n });\n }\n };\n if (type === \"clear\") {\n depsMap.forEach(add2);\n } else if (key === \"length\" && shared.isArray(target)) {\n depsMap.forEach((dep, key2) => {\n if (key2 === \"length\" || key2 >= newValue) {\n add2(dep);\n }\n });\n } else {\n if (key !== void 0) {\n add2(depsMap.get(key));\n }\n switch (type) {\n case \"add\":\n if (!shared.isArray(target)) {\n add2(depsMap.get(ITERATE_KEY));\n if (shared.isMap(target)) {\n add2(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n } else if (shared.isIntegerKey(key)) {\n add2(depsMap.get(\"length\"));\n }\n break;\n case \"delete\":\n if (!shared.isArray(target)) {\n add2(depsMap.get(ITERATE_KEY));\n if (shared.isMap(target)) {\n add2(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n }\n break;\n case \"set\":\n if (shared.isMap(target)) {\n add2(depsMap.get(ITERATE_KEY));\n }\n break;\n }\n }\n const run = (effect4) => {\n if (effect4.options.onTrigger) {\n effect4.options.onTrigger({\n effect: effect4,\n target,\n key,\n type,\n newValue,\n oldValue,\n oldTarget\n });\n }\n if (effect4.options.scheduler) {\n effect4.options.scheduler(effect4);\n } else {\n effect4();\n }\n };\n effects.forEach(run);\n }\n var isNonTrackableKeys = /* @__PURE__ */ shared.makeMap(`__proto__,__v_isRef,__isVue`);\n var builtInSymbols = new Set(Object.getOwnPropertyNames(Symbol).map((key) => Symbol[key]).filter(shared.isSymbol));\n var get2 = /* @__PURE__ */ createGetter();\n var shallowGet = /* @__PURE__ */ createGetter(false, true);\n var readonlyGet = /* @__PURE__ */ createGetter(true);\n var shallowReadonlyGet = /* @__PURE__ */ createGetter(true, true);\n var arrayInstrumentations = /* @__PURE__ */ createArrayInstrumentations();\n function createArrayInstrumentations() {\n const instrumentations = {};\n [\"includes\", \"indexOf\", \"lastIndexOf\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw2(this);\n for (let i = 0, l = this.length; i < l; i++) {\n track(arr, \"get\", i + \"\");\n }\n const res = arr[key](...args);\n if (res === -1 || res === false) {\n return arr[key](...args.map(toRaw2));\n } else {\n return res;\n }\n };\n });\n [\"push\", \"pop\", \"shift\", \"unshift\", \"splice\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n pauseTracking();\n const res = toRaw2(this)[key].apply(this, args);\n resetTracking();\n return res;\n };\n });\n return instrumentations;\n }\n function createGetter(isReadonly2 = false, shallow = false) {\n return function get3(target, key, receiver) {\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_raw\" && receiver === (isReadonly2 ? shallow ? shallowReadonlyMap : readonlyMap : shallow ? shallowReactiveMap : reactiveMap).get(target)) {\n return target;\n }\n const targetIsArray = shared.isArray(target);\n if (!isReadonly2 && targetIsArray && shared.hasOwn(arrayInstrumentations, key)) {\n return Reflect.get(arrayInstrumentations, key, receiver);\n }\n const res = Reflect.get(target, key, receiver);\n if (shared.isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {\n return res;\n }\n if (!isReadonly2) {\n track(target, \"get\", key);\n }\n if (shallow) {\n return res;\n }\n if (isRef(res)) {\n const shouldUnwrap = !targetIsArray || !shared.isIntegerKey(key);\n return shouldUnwrap ? res.value : res;\n }\n if (shared.isObject(res)) {\n return isReadonly2 ? readonly(res) : reactive3(res);\n }\n return res;\n };\n }\n var set2 = /* @__PURE__ */ createSetter();\n var shallowSet = /* @__PURE__ */ createSetter(true);\n function createSetter(shallow = false) {\n return function set3(target, key, value, receiver) {\n let oldValue = target[key];\n if (!shallow) {\n value = toRaw2(value);\n oldValue = toRaw2(oldValue);\n if (!shared.isArray(target) && isRef(oldValue) && !isRef(value)) {\n oldValue.value = value;\n return true;\n }\n }\n const hadKey = shared.isArray(target) && shared.isIntegerKey(key) ? Number(key) < target.length : shared.hasOwn(target, key);\n const result = Reflect.set(target, key, value, receiver);\n if (target === toRaw2(receiver)) {\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (shared.hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n }\n return result;\n };\n }\n function deleteProperty(target, key) {\n const hadKey = shared.hasOwn(target, key);\n const oldValue = target[key];\n const result = Reflect.deleteProperty(target, key);\n if (result && hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n }\n function has(target, key) {\n const result = Reflect.has(target, key);\n if (!shared.isSymbol(key) || !builtInSymbols.has(key)) {\n track(target, \"has\", key);\n }\n return result;\n }\n function ownKeys(target) {\n track(target, \"iterate\", shared.isArray(target) ? \"length\" : ITERATE_KEY);\n return Reflect.ownKeys(target);\n }\n var mutableHandlers = {\n get: get2,\n set: set2,\n deleteProperty,\n has,\n ownKeys\n };\n var readonlyHandlers = {\n get: readonlyGet,\n set(target, key) {\n {\n console.warn(`Set operation on key \"${String(key)}\" failed: target is readonly.`, target);\n }\n return true;\n },\n deleteProperty(target, key) {\n {\n console.warn(`Delete operation on key \"${String(key)}\" failed: target is readonly.`, target);\n }\n return true;\n }\n };\n var shallowReactiveHandlers = /* @__PURE__ */ shared.extend({}, mutableHandlers, {\n get: shallowGet,\n set: shallowSet\n });\n var shallowReadonlyHandlers = /* @__PURE__ */ shared.extend({}, readonlyHandlers, {\n get: shallowReadonlyGet\n });\n var toReactive = (value) => shared.isObject(value) ? reactive3(value) : value;\n var toReadonly = (value) => shared.isObject(value) ? readonly(value) : value;\n var toShallow = (value) => value;\n var getProto = (v) => Reflect.getPrototypeOf(v);\n function get$1(target, key, isReadonly2 = false, isShallow = false) {\n target = target[\n \"__v_raw\"\n /* RAW */\n ];\n const rawTarget = toRaw2(target);\n const rawKey = toRaw2(key);\n if (key !== rawKey) {\n !isReadonly2 && track(rawTarget, \"get\", key);\n }\n !isReadonly2 && track(rawTarget, \"get\", rawKey);\n const { has: has2 } = getProto(rawTarget);\n const wrap = isShallow ? toShallow : isReadonly2 ? toReadonly : toReactive;\n if (has2.call(rawTarget, key)) {\n return wrap(target.get(key));\n } else if (has2.call(rawTarget, rawKey)) {\n return wrap(target.get(rawKey));\n } else if (target !== rawTarget) {\n target.get(key);\n }\n }\n function has$1(key, isReadonly2 = false) {\n const target = this[\n \"__v_raw\"\n /* RAW */\n ];\n const rawTarget = toRaw2(target);\n const rawKey = toRaw2(key);\n if (key !== rawKey) {\n !isReadonly2 && track(rawTarget, \"has\", key);\n }\n !isReadonly2 && track(rawTarget, \"has\", rawKey);\n return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);\n }\n function size(target, isReadonly2 = false) {\n target = target[\n \"__v_raw\"\n /* RAW */\n ];\n !isReadonly2 && track(toRaw2(target), \"iterate\", ITERATE_KEY);\n return Reflect.get(target, \"size\", target);\n }\n function add(value) {\n value = toRaw2(value);\n const target = toRaw2(this);\n const proto = getProto(target);\n const hadKey = proto.has.call(target, value);\n if (!hadKey) {\n target.add(value);\n trigger(target, \"add\", value, value);\n }\n return this;\n }\n function set$1(key, value) {\n value = toRaw2(value);\n const target = toRaw2(this);\n const { has: has2, get: get3 } = getProto(target);\n let hadKey = has2.call(target, key);\n if (!hadKey) {\n key = toRaw2(key);\n hadKey = has2.call(target, key);\n } else {\n checkIdentityKeys(target, has2, key);\n }\n const oldValue = get3.call(target, key);\n target.set(key, value);\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (shared.hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n return this;\n }\n function deleteEntry(key) {\n const target = toRaw2(this);\n const { has: has2, get: get3 } = getProto(target);\n let hadKey = has2.call(target, key);\n if (!hadKey) {\n key = toRaw2(key);\n hadKey = has2.call(target, key);\n } else {\n checkIdentityKeys(target, has2, key);\n }\n const oldValue = get3 ? get3.call(target, key) : void 0;\n const result = target.delete(key);\n if (hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n }\n function clear() {\n const target = toRaw2(this);\n const hadItems = target.size !== 0;\n const oldTarget = shared.isMap(target) ? new Map(target) : new Set(target);\n const result = target.clear();\n if (hadItems) {\n trigger(target, \"clear\", void 0, void 0, oldTarget);\n }\n return result;\n }\n function createForEach(isReadonly2, isShallow) {\n return function forEach(callback, thisArg) {\n const observed = this;\n const target = observed[\n \"__v_raw\"\n /* RAW */\n ];\n const rawTarget = toRaw2(target);\n const wrap = isShallow ? toShallow : isReadonly2 ? toReadonly : toReactive;\n !isReadonly2 && track(rawTarget, \"iterate\", ITERATE_KEY);\n return target.forEach((value, key) => {\n return callback.call(thisArg, wrap(value), wrap(key), observed);\n });\n };\n }\n function createIterableMethod(method, isReadonly2, isShallow) {\n return function(...args) {\n const target = this[\n \"__v_raw\"\n /* RAW */\n ];\n const rawTarget = toRaw2(target);\n const targetIsMap = shared.isMap(rawTarget);\n const isPair = method === \"entries\" || method === Symbol.iterator && targetIsMap;\n const isKeyOnly = method === \"keys\" && targetIsMap;\n const innerIterator = target[method](...args);\n const wrap = isShallow ? toShallow : isReadonly2 ? toReadonly : toReactive;\n !isReadonly2 && track(rawTarget, \"iterate\", isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY);\n return {\n // iterator protocol\n next() {\n const { value, done } = innerIterator.next();\n return done ? { value, done } : {\n value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\n done\n };\n },\n // iterable protocol\n [Symbol.iterator]() {\n return this;\n }\n };\n };\n }\n function createReadonlyMethod(type) {\n return function(...args) {\n {\n const key = args[0] ? `on key \"${args[0]}\" ` : ``;\n console.warn(`${shared.capitalize(type)} operation ${key}failed: target is readonly.`, toRaw2(this));\n }\n return type === \"delete\" ? false : this;\n };\n }\n function createInstrumentations() {\n const mutableInstrumentations2 = {\n get(key) {\n return get$1(this, key);\n },\n get size() {\n return size(this);\n },\n has: has$1,\n add,\n set: set$1,\n delete: deleteEntry,\n clear,\n forEach: createForEach(false, false)\n };\n const shallowInstrumentations2 = {\n get(key) {\n return get$1(this, key, false, true);\n },\n get size() {\n return size(this);\n },\n has: has$1,\n add,\n set: set$1,\n delete: deleteEntry,\n clear,\n forEach: createForEach(false, true)\n };\n const readonlyInstrumentations2 = {\n get(key) {\n return get$1(this, key, true);\n },\n get size() {\n return size(this, true);\n },\n has(key) {\n return has$1.call(this, key, true);\n },\n add: createReadonlyMethod(\n \"add\"\n /* ADD */\n ),\n set: createReadonlyMethod(\n \"set\"\n /* SET */\n ),\n delete: createReadonlyMethod(\n \"delete\"\n /* DELETE */\n ),\n clear: createReadonlyMethod(\n \"clear\"\n /* CLEAR */\n ),\n forEach: createForEach(true, false)\n };\n const shallowReadonlyInstrumentations2 = {\n get(key) {\n return get$1(this, key, true, true);\n },\n get size() {\n return size(this, true);\n },\n has(key) {\n return has$1.call(this, key, true);\n },\n add: createReadonlyMethod(\n \"add\"\n /* ADD */\n ),\n set: createReadonlyMethod(\n \"set\"\n /* SET */\n ),\n delete: createReadonlyMethod(\n \"delete\"\n /* DELETE */\n ),\n clear: createReadonlyMethod(\n \"clear\"\n /* CLEAR */\n ),\n forEach: createForEach(true, true)\n };\n const iteratorMethods = [\"keys\", \"values\", \"entries\", Symbol.iterator];\n iteratorMethods.forEach((method) => {\n mutableInstrumentations2[method] = createIterableMethod(method, false, false);\n readonlyInstrumentations2[method] = createIterableMethod(method, true, false);\n shallowInstrumentations2[method] = createIterableMethod(method, false, true);\n shallowReadonlyInstrumentations2[method] = createIterableMethod(method, true, true);\n });\n return [\n mutableInstrumentations2,\n readonlyInstrumentations2,\n shallowInstrumentations2,\n shallowReadonlyInstrumentations2\n ];\n }\n var [mutableInstrumentations, readonlyInstrumentations, shallowInstrumentations, shallowReadonlyInstrumentations] = /* @__PURE__ */ createInstrumentations();\n function createInstrumentationGetter(isReadonly2, shallow) {\n const instrumentations = shallow ? isReadonly2 ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly2 ? readonlyInstrumentations : mutableInstrumentations;\n return (target, key, receiver) => {\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_raw\") {\n return target;\n }\n return Reflect.get(shared.hasOwn(instrumentations, key) && key in target ? instrumentations : target, key, receiver);\n };\n }\n var mutableCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, false)\n };\n var shallowCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, true)\n };\n var readonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, false)\n };\n var shallowReadonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, true)\n };\n function checkIdentityKeys(target, has2, key) {\n const rawKey = toRaw2(key);\n if (rawKey !== key && has2.call(target, rawKey)) {\n const type = shared.toRawType(target);\n console.warn(`Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`);\n }\n }\n var reactiveMap = /* @__PURE__ */ new WeakMap();\n var shallowReactiveMap = /* @__PURE__ */ new WeakMap();\n var readonlyMap = /* @__PURE__ */ new WeakMap();\n var shallowReadonlyMap = /* @__PURE__ */ new WeakMap();\n function targetTypeMap(rawType) {\n switch (rawType) {\n case \"Object\":\n case \"Array\":\n return 1;\n case \"Map\":\n case \"Set\":\n case \"WeakMap\":\n case \"WeakSet\":\n return 2;\n default:\n return 0;\n }\n }\n function getTargetType(value) {\n return value[\n \"__v_skip\"\n /* SKIP */\n ] || !Object.isExtensible(value) ? 0 : targetTypeMap(shared.toRawType(value));\n }\n function reactive3(target) {\n if (target && target[\n \"__v_isReadonly\"\n /* IS_READONLY */\n ]) {\n return target;\n }\n return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers, reactiveMap);\n }\n function shallowReactive(target) {\n return createReactiveObject(target, false, shallowReactiveHandlers, shallowCollectionHandlers, shallowReactiveMap);\n }\n function readonly(target) {\n return createReactiveObject(target, true, readonlyHandlers, readonlyCollectionHandlers, readonlyMap);\n }\n function shallowReadonly(target) {\n return createReactiveObject(target, true, shallowReadonlyHandlers, shallowReadonlyCollectionHandlers, shallowReadonlyMap);\n }\n function createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {\n if (!shared.isObject(target)) {\n {\n console.warn(`value cannot be made reactive: ${String(target)}`);\n }\n return target;\n }\n if (target[\n \"__v_raw\"\n /* RAW */\n ] && !(isReadonly2 && target[\n \"__v_isReactive\"\n /* IS_REACTIVE */\n ])) {\n return target;\n }\n const existingProxy = proxyMap.get(target);\n if (existingProxy) {\n return existingProxy;\n }\n const targetType = getTargetType(target);\n if (targetType === 0) {\n return target;\n }\n const proxy = new Proxy(target, targetType === 2 ? collectionHandlers : baseHandlers);\n proxyMap.set(target, proxy);\n return proxy;\n }\n function isReactive2(value) {\n if (isReadonly(value)) {\n return isReactive2(value[\n \"__v_raw\"\n /* RAW */\n ]);\n }\n return !!(value && value[\n \"__v_isReactive\"\n /* IS_REACTIVE */\n ]);\n }\n function isReadonly(value) {\n return !!(value && value[\n \"__v_isReadonly\"\n /* IS_READONLY */\n ]);\n }\n function isProxy(value) {\n return isReactive2(value) || isReadonly(value);\n }\n function toRaw2(observed) {\n return observed && toRaw2(observed[\n \"__v_raw\"\n /* RAW */\n ]) || observed;\n }\n function markRaw(value) {\n shared.def(value, \"__v_skip\", true);\n return value;\n }\n var convert = (val) => shared.isObject(val) ? reactive3(val) : val;\n function isRef(r) {\n return Boolean(r && r.__v_isRef === true);\n }\n function ref(value) {\n return createRef(value);\n }\n function shallowRef(value) {\n return createRef(value, true);\n }\n var RefImpl = class {\n constructor(value, _shallow = false) {\n this._shallow = _shallow;\n this.__v_isRef = true;\n this._rawValue = _shallow ? value : toRaw2(value);\n this._value = _shallow ? value : convert(value);\n }\n get value() {\n track(toRaw2(this), \"get\", \"value\");\n return this._value;\n }\n set value(newVal) {\n newVal = this._shallow ? newVal : toRaw2(newVal);\n if (shared.hasChanged(newVal, this._rawValue)) {\n this._rawValue = newVal;\n this._value = this._shallow ? newVal : convert(newVal);\n trigger(toRaw2(this), \"set\", \"value\", newVal);\n }\n }\n };\n function createRef(rawValue, shallow = false) {\n if (isRef(rawValue)) {\n return rawValue;\n }\n return new RefImpl(rawValue, shallow);\n }\n function triggerRef(ref2) {\n trigger(toRaw2(ref2), \"set\", \"value\", ref2.value);\n }\n function unref(ref2) {\n return isRef(ref2) ? ref2.value : ref2;\n }\n var shallowUnwrapHandlers = {\n get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)),\n set: (target, key, value, receiver) => {\n const oldValue = target[key];\n if (isRef(oldValue) && !isRef(value)) {\n oldValue.value = value;\n return true;\n } else {\n return Reflect.set(target, key, value, receiver);\n }\n }\n };\n function proxyRefs(objectWithRefs) {\n return isReactive2(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);\n }\n var CustomRefImpl = class {\n constructor(factory) {\n this.__v_isRef = true;\n const { get: get3, set: set3 } = factory(() => track(this, \"get\", \"value\"), () => trigger(this, \"set\", \"value\"));\n this._get = get3;\n this._set = set3;\n }\n get value() {\n return this._get();\n }\n set value(newVal) {\n this._set(newVal);\n }\n };\n function customRef(factory) {\n return new CustomRefImpl(factory);\n }\n function toRefs(object) {\n if (!isProxy(object)) {\n console.warn(`toRefs() expects a reactive object but received a plain one.`);\n }\n const ret = shared.isArray(object) ? new Array(object.length) : {};\n for (const key in object) {\n ret[key] = toRef(object, key);\n }\n return ret;\n }\n var ObjectRefImpl = class {\n constructor(_object, _key) {\n this._object = _object;\n this._key = _key;\n this.__v_isRef = true;\n }\n get value() {\n return this._object[this._key];\n }\n set value(newVal) {\n this._object[this._key] = newVal;\n }\n };\n function toRef(object, key) {\n return isRef(object[key]) ? object[key] : new ObjectRefImpl(object, key);\n }\n var ComputedRefImpl = class {\n constructor(getter, _setter, isReadonly2) {\n this._setter = _setter;\n this._dirty = true;\n this.__v_isRef = true;\n this.effect = effect3(getter, {\n lazy: true,\n scheduler: () => {\n if (!this._dirty) {\n this._dirty = true;\n trigger(toRaw2(this), \"set\", \"value\");\n }\n }\n });\n this[\n \"__v_isReadonly\"\n /* IS_READONLY */\n ] = isReadonly2;\n }\n get value() {\n const self2 = toRaw2(this);\n if (self2._dirty) {\n self2._value = this.effect();\n self2._dirty = false;\n }\n track(self2, \"get\", \"value\");\n return self2._value;\n }\n set value(newValue) {\n this._setter(newValue);\n }\n };\n function computed(getterOrOptions) {\n let getter;\n let setter;\n if (shared.isFunction(getterOrOptions)) {\n getter = getterOrOptions;\n setter = () => {\n console.warn(\"Write operation failed: computed value is readonly\");\n };\n } else {\n getter = getterOrOptions.get;\n setter = getterOrOptions.set;\n }\n return new ComputedRefImpl(getter, setter, shared.isFunction(getterOrOptions) || !getterOrOptions.set);\n }\n exports.ITERATE_KEY = ITERATE_KEY;\n exports.computed = computed;\n exports.customRef = customRef;\n exports.effect = effect3;\n exports.enableTracking = enableTracking;\n exports.isProxy = isProxy;\n exports.isReactive = isReactive2;\n exports.isReadonly = isReadonly;\n exports.isRef = isRef;\n exports.markRaw = markRaw;\n exports.pauseTracking = pauseTracking;\n exports.proxyRefs = proxyRefs;\n exports.reactive = reactive3;\n exports.readonly = readonly;\n exports.ref = ref;\n exports.resetTracking = resetTracking;\n exports.shallowReactive = shallowReactive;\n exports.shallowReadonly = shallowReadonly;\n exports.shallowRef = shallowRef;\n exports.stop = stop2;\n exports.toRaw = toRaw2;\n exports.toRef = toRef;\n exports.toRefs = toRefs;\n exports.track = track;\n exports.trigger = trigger;\n exports.triggerRef = triggerRef;\n exports.unref = unref;\n }\n});\n\n// node_modules/@vue/reactivity/index.js\nvar require_reactivity = __commonJS({\n \"node_modules/@vue/reactivity/index.js\"(exports, module2) {\n \"use strict\";\n if (false) {\n module2.exports = null;\n } else {\n module2.exports = require_reactivity_cjs();\n }\n }\n});\n\n// packages/alpinejs/builds/module.js\nvar module_exports = {};\n__export(module_exports, {\n Alpine: () => src_default,\n default: () => module_default\n});\nmodule.exports = __toCommonJS(module_exports);\n\n// packages/alpinejs/src/scheduler.js\nvar flushPending = false;\nvar flushing = false;\nvar queue = [];\nvar lastFlushedIndex = -1;\nfunction scheduler(callback) {\n queueJob(callback);\n}\nfunction queueJob(job) {\n if (!queue.includes(job))\n queue.push(job);\n queueFlush();\n}\nfunction dequeueJob(job) {\n let index = queue.indexOf(job);\n if (index !== -1 && index > lastFlushedIndex)\n queue.splice(index, 1);\n}\nfunction queueFlush() {\n if (!flushing && !flushPending) {\n flushPending = true;\n queueMicrotask(flushJobs);\n }\n}\nfunction flushJobs() {\n flushPending = false;\n flushing = true;\n for (let i = 0; i < queue.length; i++) {\n queue[i]();\n lastFlushedIndex = i;\n }\n queue.length = 0;\n lastFlushedIndex = -1;\n flushing = false;\n}\n\n// packages/alpinejs/src/reactivity.js\nvar reactive;\nvar effect;\nvar release;\nvar raw;\nvar shouldSchedule = true;\nfunction disableEffectScheduling(callback) {\n shouldSchedule = false;\n callback();\n shouldSchedule = true;\n}\nfunction setReactivityEngine(engine) {\n reactive = engine.reactive;\n release = engine.release;\n effect = (callback) => engine.effect(callback, { scheduler: (task) => {\n if (shouldSchedule) {\n scheduler(task);\n } else {\n task();\n }\n } });\n raw = engine.raw;\n}\nfunction overrideEffect(override) {\n effect = override;\n}\nfunction elementBoundEffect(el) {\n let cleanup = () => {\n };\n let wrappedEffect = (callback) => {\n let effectReference = effect(callback);\n if (!el._x_effects) {\n el._x_effects = /* @__PURE__ */ new Set();\n el._x_runEffects = () => {\n el._x_effects.forEach((i) => i());\n };\n }\n el._x_effects.add(effectReference);\n cleanup = () => {\n if (effectReference === void 0)\n return;\n el._x_effects.delete(effectReference);\n release(effectReference);\n };\n return effectReference;\n };\n return [wrappedEffect, () => {\n cleanup();\n }];\n}\nfunction watch(getter, callback) {\n let firstTime = true;\n let oldValue;\n let effectReference = effect(() => {\n let value = getter();\n JSON.stringify(value);\n if (!firstTime) {\n queueMicrotask(() => {\n callback(value, oldValue);\n oldValue = value;\n });\n } else {\n oldValue = value;\n }\n firstTime = false;\n });\n return () => release(effectReference);\n}\n\n// packages/alpinejs/src/mutation.js\nvar onAttributeAddeds = [];\nvar onElRemoveds = [];\nvar onElAddeds = [];\nfunction onElAdded(callback) {\n onElAddeds.push(callback);\n}\nfunction onElRemoved(el, callback) {\n if (typeof callback === \"function\") {\n if (!el._x_cleanups)\n el._x_cleanups = [];\n el._x_cleanups.push(callback);\n } else {\n callback = el;\n onElRemoveds.push(callback);\n }\n}\nfunction onAttributesAdded(callback) {\n onAttributeAddeds.push(callback);\n}\nfunction onAttributeRemoved(el, name, callback) {\n if (!el._x_attributeCleanups)\n el._x_attributeCleanups = {};\n if (!el._x_attributeCleanups[name])\n el._x_attributeCleanups[name] = [];\n el._x_attributeCleanups[name].push(callback);\n}\nfunction cleanupAttributes(el, names) {\n if (!el._x_attributeCleanups)\n return;\n Object.entries(el._x_attributeCleanups).forEach(([name, value]) => {\n if (names === void 0 || names.includes(name)) {\n value.forEach((i) => i());\n delete el._x_attributeCleanups[name];\n }\n });\n}\nfunction cleanupElement(el) {\n var _a, _b;\n (_a = el._x_effects) == null ? void 0 : _a.forEach(dequeueJob);\n while ((_b = el._x_cleanups) == null ? void 0 : _b.length)\n el._x_cleanups.pop()();\n}\nvar observer = new MutationObserver(onMutate);\nvar currentlyObserving = false;\nfunction startObservingMutations() {\n observer.observe(document, { subtree: true, childList: true, attributes: true, attributeOldValue: true });\n currentlyObserving = true;\n}\nfunction stopObservingMutations() {\n flushObserver();\n observer.disconnect();\n currentlyObserving = false;\n}\nvar queuedMutations = [];\nfunction flushObserver() {\n let records = observer.takeRecords();\n queuedMutations.push(() => records.length > 0 && onMutate(records));\n let queueLengthWhenTriggered = queuedMutations.length;\n queueMicrotask(() => {\n if (queuedMutations.length === queueLengthWhenTriggered) {\n while (queuedMutations.length > 0)\n queuedMutations.shift()();\n }\n });\n}\nfunction mutateDom(callback) {\n if (!currentlyObserving)\n return callback();\n stopObservingMutations();\n let result = callback();\n startObservingMutations();\n return result;\n}\nvar isCollecting = false;\nvar deferredMutations = [];\nfunction deferMutations() {\n isCollecting = true;\n}\nfunction flushAndStopDeferringMutations() {\n isCollecting = false;\n onMutate(deferredMutations);\n deferredMutations = [];\n}\nfunction onMutate(mutations) {\n if (isCollecting) {\n deferredMutations = deferredMutations.concat(mutations);\n return;\n }\n let addedNodes = [];\n let removedNodes = /* @__PURE__ */ new Set();\n let addedAttributes = /* @__PURE__ */ new Map();\n let removedAttributes = /* @__PURE__ */ new Map();\n for (let i = 0; i < mutations.length; i++) {\n if (mutations[i].target._x_ignoreMutationObserver)\n continue;\n if (mutations[i].type === \"childList\") {\n mutations[i].removedNodes.forEach((node) => {\n if (node.nodeType !== 1)\n return;\n if (!node._x_marker)\n return;\n removedNodes.add(node);\n });\n mutations[i].addedNodes.forEach((node) => {\n if (node.nodeType !== 1)\n return;\n if (removedNodes.has(node)) {\n removedNodes.delete(node);\n return;\n }\n if (node._x_marker)\n return;\n addedNodes.push(node);\n });\n }\n if (mutations[i].type === \"attributes\") {\n let el = mutations[i].target;\n let name = mutations[i].attributeName;\n let oldValue = mutations[i].oldValue;\n let add = () => {\n if (!addedAttributes.has(el))\n addedAttributes.set(el, []);\n addedAttributes.get(el).push({ name, value: el.getAttribute(name) });\n };\n let remove = () => {\n if (!removedAttributes.has(el))\n removedAttributes.set(el, []);\n removedAttributes.get(el).push(name);\n };\n if (el.hasAttribute(name) && oldValue === null) {\n add();\n } else if (el.hasAttribute(name)) {\n remove();\n add();\n } else {\n remove();\n }\n }\n }\n removedAttributes.forEach((attrs, el) => {\n cleanupAttributes(el, attrs);\n });\n addedAttributes.forEach((attrs, el) => {\n onAttributeAddeds.forEach((i) => i(el, attrs));\n });\n for (let node of removedNodes) {\n if (addedNodes.some((i) => i.contains(node)))\n continue;\n onElRemoveds.forEach((i) => i(node));\n }\n for (let node of addedNodes) {\n if (!node.isConnected)\n continue;\n onElAddeds.forEach((i) => i(node));\n }\n addedNodes = null;\n removedNodes = null;\n addedAttributes = null;\n removedAttributes = null;\n}\n\n// packages/alpinejs/src/scope.js\nfunction scope(node) {\n return mergeProxies(closestDataStack(node));\n}\nfunction addScopeToNode(node, data2, referenceNode) {\n node._x_dataStack = [data2, ...closestDataStack(referenceNode || node)];\n return () => {\n node._x_dataStack = node._x_dataStack.filter((i) => i !== data2);\n };\n}\nfunction closestDataStack(node) {\n if (node._x_dataStack)\n return node._x_dataStack;\n if (typeof ShadowRoot === \"function\" && node instanceof ShadowRoot) {\n return closestDataStack(node.host);\n }\n if (!node.parentNode) {\n return [];\n }\n return closestDataStack(node.parentNode);\n}\nfunction mergeProxies(objects) {\n return new Proxy({ objects }, mergeProxyTrap);\n}\nvar mergeProxyTrap = {\n ownKeys({ objects }) {\n return Array.from(\n new Set(objects.flatMap((i) => Object.keys(i)))\n );\n },\n has({ objects }, name) {\n if (name == Symbol.unscopables)\n return false;\n return objects.some(\n (obj) => Object.prototype.hasOwnProperty.call(obj, name) || Reflect.has(obj, name)\n );\n },\n get({ objects }, name, thisProxy) {\n if (name == \"toJSON\")\n return collapseProxies;\n return Reflect.get(\n objects.find(\n (obj) => Reflect.has(obj, name)\n ) || {},\n name,\n thisProxy\n );\n },\n set({ objects }, name, value, thisProxy) {\n const target = objects.find(\n (obj) => Object.prototype.hasOwnProperty.call(obj, name)\n ) || objects[objects.length - 1];\n const descriptor = Object.getOwnPropertyDescriptor(target, name);\n if ((descriptor == null ? void 0 : descriptor.set) && (descriptor == null ? void 0 : descriptor.get))\n return descriptor.set.call(thisProxy, value) || true;\n return Reflect.set(target, name, value);\n }\n};\nfunction collapseProxies() {\n let keys = Reflect.ownKeys(this);\n return keys.reduce((acc, key) => {\n acc[key] = Reflect.get(this, key);\n return acc;\n }, {});\n}\n\n// packages/alpinejs/src/interceptor.js\nfunction initInterceptors(data2) {\n let isObject = (val) => typeof val === \"object\" && !Array.isArray(val) && val !== null;\n let recurse = (obj, basePath = \"\") => {\n Object.entries(Object.getOwnPropertyDescriptors(obj)).forEach(([key, { value, enumerable }]) => {\n if (enumerable === false || value === void 0)\n return;\n if (typeof value === \"object\" && value !== null && value.__v_skip)\n return;\n let path = basePath === \"\" ? key : `${basePath}.${key}`;\n if (typeof value === \"object\" && value !== null && value._x_interceptor) {\n obj[key] = value.initialize(data2, path, key);\n } else {\n if (isObject(value) && value !== obj && !(value instanceof Element)) {\n recurse(value, path);\n }\n }\n });\n };\n return recurse(data2);\n}\nfunction interceptor(callback, mutateObj = () => {\n}) {\n let obj = {\n initialValue: void 0,\n _x_interceptor: true,\n initialize(data2, path, key) {\n return callback(this.initialValue, () => get(data2, path), (value) => set(data2, path, value), path, key);\n }\n };\n mutateObj(obj);\n return (initialValue) => {\n if (typeof initialValue === \"object\" && initialValue !== null && initialValue._x_interceptor) {\n let initialize = obj.initialize.bind(obj);\n obj.initialize = (data2, path, key) => {\n let innerValue = initialValue.initialize(data2, path, key);\n obj.initialValue = innerValue;\n return initialize(data2, path, key);\n };\n } else {\n obj.initialValue = initialValue;\n }\n return obj;\n };\n}\nfunction get(obj, path) {\n return path.split(\".\").reduce((carry, segment) => carry[segment], obj);\n}\nfunction set(obj, path, value) {\n if (typeof path === \"string\")\n path = path.split(\".\");\n if (path.length === 1)\n obj[path[0]] = value;\n else if (path.length === 0)\n throw error;\n else {\n if (obj[path[0]])\n return set(obj[path[0]], path.slice(1), value);\n else {\n obj[path[0]] = {};\n return set(obj[path[0]], path.slice(1), value);\n }\n }\n}\n\n// packages/alpinejs/src/magics.js\nvar magics = {};\nfunction magic(name, callback) {\n magics[name] = callback;\n}\nfunction injectMagics(obj, el) {\n let memoizedUtilities = getUtilities(el);\n Object.entries(magics).forEach(([name, callback]) => {\n Object.defineProperty(obj, `$${name}`, {\n get() {\n return callback(el, memoizedUtilities);\n },\n enumerable: false\n });\n });\n return obj;\n}\nfunction getUtilities(el) {\n let [utilities, cleanup] = getElementBoundUtilities(el);\n let utils = { interceptor, ...utilities };\n onElRemoved(el, cleanup);\n return utils;\n}\n\n// packages/alpinejs/src/utils/error.js\nfunction tryCatch(el, expression, callback, ...args) {\n try {\n return callback(...args);\n } catch (e) {\n handleError(e, el, expression);\n }\n}\nfunction handleError(error2, el, expression = void 0) {\n error2 = Object.assign(\n error2 != null ? error2 : { message: \"No error message given.\" },\n { el, expression }\n );\n console.warn(`Alpine Expression Error: ${error2.message}\n\n${expression ? 'Expression: \"' + expression + '\"\\n\\n' : \"\"}`, el);\n setTimeout(() => {\n throw error2;\n }, 0);\n}\n\n// packages/alpinejs/src/evaluator.js\nvar shouldAutoEvaluateFunctions = true;\nfunction dontAutoEvaluateFunctions(callback) {\n let cache = shouldAutoEvaluateFunctions;\n shouldAutoEvaluateFunctions = false;\n let result = callback();\n shouldAutoEvaluateFunctions = cache;\n return result;\n}\nfunction evaluate(el, expression, extras = {}) {\n let result;\n evaluateLater(el, expression)((value) => result = value, extras);\n return result;\n}\nfunction evaluateLater(...args) {\n return theEvaluatorFunction(...args);\n}\nvar theEvaluatorFunction = normalEvaluator;\nfunction setEvaluator(newEvaluator) {\n theEvaluatorFunction = newEvaluator;\n}\nfunction normalEvaluator(el, expression) {\n let overriddenMagics = {};\n injectMagics(overriddenMagics, el);\n let dataStack = [overriddenMagics, ...closestDataStack(el)];\n let evaluator = typeof expression === \"function\" ? generateEvaluatorFromFunction(dataStack, expression) : generateEvaluatorFromString(dataStack, expression, el);\n return tryCatch.bind(null, el, expression, evaluator);\n}\nfunction generateEvaluatorFromFunction(dataStack, func) {\n return (receiver = () => {\n }, { scope: scope2 = {}, params = [] } = {}) => {\n let result = func.apply(mergeProxies([scope2, ...dataStack]), params);\n runIfTypeOfFunction(receiver, result);\n };\n}\nvar evaluatorMemo = {};\nfunction generateFunctionFromString(expression, el) {\n if (evaluatorMemo[expression]) {\n return evaluatorMemo[expression];\n }\n let AsyncFunction = Object.getPrototypeOf(async function() {\n }).constructor;\n let rightSideSafeExpression = /^[\\n\\s]*if.*\\(.*\\)/.test(expression.trim()) || /^(let|const)\\s/.test(expression.trim()) ? `(async()=>{ ${expression} })()` : expression;\n const safeAsyncFunction = () => {\n try {\n let func2 = new AsyncFunction(\n [\"__self\", \"scope\"],\n `with (scope) { __self.result = ${rightSideSafeExpression} }; __self.finished = true; return __self.result;`\n );\n Object.defineProperty(func2, \"name\", {\n value: `[Alpine] ${expression}`\n });\n return func2;\n } catch (error2) {\n handleError(error2, el, expression);\n return Promise.resolve();\n }\n };\n let func = safeAsyncFunction();\n evaluatorMemo[expression] = func;\n return func;\n}\nfunction generateEvaluatorFromString(dataStack, expression, el) {\n let func = generateFunctionFromString(expression, el);\n return (receiver = () => {\n }, { scope: scope2 = {}, params = [] } = {}) => {\n func.result = void 0;\n func.finished = false;\n let completeScope = mergeProxies([scope2, ...dataStack]);\n if (typeof func === \"function\") {\n let promise = func(func, completeScope).catch((error2) => handleError(error2, el, expression));\n if (func.finished) {\n runIfTypeOfFunction(receiver, func.result, completeScope, params, el);\n func.result = void 0;\n } else {\n promise.then((result) => {\n runIfTypeOfFunction(receiver, result, completeScope, params, el);\n }).catch((error2) => handleError(error2, el, expression)).finally(() => func.result = void 0);\n }\n }\n };\n}\nfunction runIfTypeOfFunction(receiver, value, scope2, params, el) {\n if (shouldAutoEvaluateFunctions && typeof value === \"function\") {\n let result = value.apply(scope2, params);\n if (result instanceof Promise) {\n result.then((i) => runIfTypeOfFunction(receiver, i, scope2, params)).catch((error2) => handleError(error2, el, value));\n } else {\n receiver(result);\n }\n } else if (typeof value === \"object\" && value instanceof Promise) {\n value.then((i) => receiver(i));\n } else {\n receiver(value);\n }\n}\n\n// packages/alpinejs/src/directives.js\nvar prefixAsString = \"x-\";\nfunction prefix(subject = \"\") {\n return prefixAsString + subject;\n}\nfunction setPrefix(newPrefix) {\n prefixAsString = newPrefix;\n}\nvar directiveHandlers = {};\nfunction directive(name, callback) {\n directiveHandlers[name] = callback;\n return {\n before(directive2) {\n if (!directiveHandlers[directive2]) {\n console.warn(String.raw`Cannot find directive \\`${directive2}\\`. \\`${name}\\` will use the default order of execution`);\n return;\n }\n const pos = directiveOrder.indexOf(directive2);\n directiveOrder.splice(pos >= 0 ? pos : directiveOrder.indexOf(\"DEFAULT\"), 0, name);\n }\n };\n}\nfunction directiveExists(name) {\n return Object.keys(directiveHandlers).includes(name);\n}\nfunction directives(el, attributes, originalAttributeOverride) {\n attributes = Array.from(attributes);\n if (el._x_virtualDirectives) {\n let vAttributes = Object.entries(el._x_virtualDirectives).map(([name, value]) => ({ name, value }));\n let staticAttributes = attributesOnly(vAttributes);\n vAttributes = vAttributes.map((attribute) => {\n if (staticAttributes.find((attr) => attr.name === attribute.name)) {\n return {\n name: `x-bind:${attribute.name}`,\n value: `\"${attribute.value}\"`\n };\n }\n return attribute;\n });\n attributes = attributes.concat(vAttributes);\n }\n let transformedAttributeMap = {};\n let directives2 = attributes.map(toTransformedAttributes((newName, oldName) => transformedAttributeMap[newName] = oldName)).filter(outNonAlpineAttributes).map(toParsedDirectives(transformedAttributeMap, originalAttributeOverride)).sort(byPriority);\n return directives2.map((directive2) => {\n return getDirectiveHandler(el, directive2);\n });\n}\nfunction attributesOnly(attributes) {\n return Array.from(attributes).map(toTransformedAttributes()).filter((attr) => !outNonAlpineAttributes(attr));\n}\nvar isDeferringHandlers = false;\nvar directiveHandlerStacks = /* @__PURE__ */ new Map();\nvar currentHandlerStackKey = Symbol();\nfunction deferHandlingDirectives(callback) {\n isDeferringHandlers = true;\n let key = Symbol();\n currentHandlerStackKey = key;\n directiveHandlerStacks.set(key, []);\n let flushHandlers = () => {\n while (directiveHandlerStacks.get(key).length)\n directiveHandlerStacks.get(key).shift()();\n directiveHandlerStacks.delete(key);\n };\n let stopDeferring = () => {\n isDeferringHandlers = false;\n flushHandlers();\n };\n callback(flushHandlers);\n stopDeferring();\n}\nfunction getElementBoundUtilities(el) {\n let cleanups = [];\n let cleanup = (callback) => cleanups.push(callback);\n let [effect3, cleanupEffect] = elementBoundEffect(el);\n cleanups.push(cleanupEffect);\n let utilities = {\n Alpine: alpine_default,\n effect: effect3,\n cleanup,\n evaluateLater: evaluateLater.bind(evaluateLater, el),\n evaluate: evaluate.bind(evaluate, el)\n };\n let doCleanup = () => cleanups.forEach((i) => i());\n return [utilities, doCleanup];\n}\nfunction getDirectiveHandler(el, directive2) {\n let noop = () => {\n };\n let handler4 = directiveHandlers[directive2.type] || noop;\n let [utilities, cleanup] = getElementBoundUtilities(el);\n onAttributeRemoved(el, directive2.original, cleanup);\n let fullHandler = () => {\n if (el._x_ignore || el._x_ignoreSelf)\n return;\n handler4.inline && handler4.inline(el, directive2, utilities);\n handler4 = handler4.bind(handler4, el, directive2, utilities);\n isDeferringHandlers ? directiveHandlerStacks.get(currentHandlerStackKey).push(handler4) : handler4();\n };\n fullHandler.runCleanups = cleanup;\n return fullHandler;\n}\nvar startingWith = (subject, replacement) => ({ name, value }) => {\n if (name.startsWith(subject))\n name = name.replace(subject, replacement);\n return { name, value };\n};\nvar into = (i) => i;\nfunction toTransformedAttributes(callback = () => {\n}) {\n return ({ name, value }) => {\n let { name: newName, value: newValue } = attributeTransformers.reduce((carry, transform) => {\n return transform(carry);\n }, { name, value });\n if (newName !== name)\n callback(newName, name);\n return { name: newName, value: newValue };\n };\n}\nvar attributeTransformers = [];\nfunction mapAttributes(callback) {\n attributeTransformers.push(callback);\n}\nfunction outNonAlpineAttributes({ name }) {\n return alpineAttributeRegex().test(name);\n}\nvar alpineAttributeRegex = () => new RegExp(`^${prefixAsString}([^:^.]+)\\\\b`);\nfunction toParsedDirectives(transformedAttributeMap, originalAttributeOverride) {\n return ({ name, value }) => {\n let typeMatch = name.match(alpineAttributeRegex());\n let valueMatch = name.match(/:([a-zA-Z0-9\\-_:]+)/);\n let modifiers = name.match(/\\.[^.\\]]+(?=[^\\]]*$)/g) || [];\n let original = originalAttributeOverride || transformedAttributeMap[name] || name;\n return {\n type: typeMatch ? typeMatch[1] : null,\n value: valueMatch ? valueMatch[1] : null,\n modifiers: modifiers.map((i) => i.replace(\".\", \"\")),\n expression: value,\n original\n };\n };\n}\nvar DEFAULT = \"DEFAULT\";\nvar directiveOrder = [\n \"ignore\",\n \"ref\",\n \"data\",\n \"id\",\n \"anchor\",\n \"bind\",\n \"init\",\n \"for\",\n \"model\",\n \"modelable\",\n \"transition\",\n \"show\",\n \"if\",\n DEFAULT,\n \"teleport\"\n];\nfunction byPriority(a, b) {\n let typeA = directiveOrder.indexOf(a.type) === -1 ? DEFAULT : a.type;\n let typeB = directiveOrder.indexOf(b.type) === -1 ? DEFAULT : b.type;\n return directiveOrder.indexOf(typeA) - directiveOrder.indexOf(typeB);\n}\n\n// packages/alpinejs/src/utils/dispatch.js\nfunction dispatch(el, name, detail = {}) {\n el.dispatchEvent(\n new CustomEvent(name, {\n detail,\n bubbles: true,\n // Allows events to pass the shadow DOM barrier.\n composed: true,\n cancelable: true\n })\n );\n}\n\n// packages/alpinejs/src/utils/walk.js\nfunction walk(el, callback) {\n if (typeof ShadowRoot === \"function\" && el instanceof ShadowRoot) {\n Array.from(el.children).forEach((el2) => walk(el2, callback));\n return;\n }\n let skip = false;\n callback(el, () => skip = true);\n if (skip)\n return;\n let node = el.firstElementChild;\n while (node) {\n walk(node, callback, false);\n node = node.nextElementSibling;\n }\n}\n\n// packages/alpinejs/src/utils/warn.js\nfunction warn(message, ...args) {\n console.warn(`Alpine Warning: ${message}`, ...args);\n}\n\n// packages/alpinejs/src/lifecycle.js\nvar started = false;\nfunction start() {\n if (started)\n warn(\"Alpine has already been initialized on this page. Calling Alpine.start() more than once can cause problems.\");\n started = true;\n if (!document.body)\n warn(\"Unable to initialize. Trying to load Alpine before `` is available. Did you forget to add `defer` in Alpine's `