diff --git a/DJANGO-ADMIN-IMPROVEMENT-PLAN.md b/DJANGO-ADMIN-IMPROVEMENT-PLAN.md index b08c8869..4bd50dd4 100644 --- a/DJANGO-ADMIN-IMPROVEMENT-PLAN.md +++ b/DJANGO-ADMIN-IMPROVEMENT-PLAN.md @@ -1,86 +1,176 @@ -# Django Admin Improvement Plan +# Django Admin Improvement Plan - Unfold Edition -**Version:** 1.0.0 -**Created:** December 13, 2025 -**Status:** Planning Phase -**Priority:** πŸ”΄ High - 4-6 weeks implementation -**Dependencies:** After Plan Management Implementation +**Version:** 2.0.0 +**Created:** December 14, 2025 +**Status:** Implementation Phase +**Priority:** πŸ”΄ High - 3-4 weeks implementation +**Dependencies:** After Plan Management Implementation +**Theme:** Django Unfold (Modern Admin Theme) + +--- + +## πŸ”§ CRITICAL FIXES APPLIED (December 14, 2025) + +### Problem: Multiple Conflicting Admin Systems +The system had **3 conflicting admin systems running simultaneously**: +1. Default Django admin +2. Custom IGNY8 admin modifications +3. Unfold theme (partially installed) + +This caused style conflicts, crashes, and inconsistent UI. + +### Solution: Clean Unfold-Only Installation + +**βœ… Fixed Issues:** +1. **Backend Container Crashing** - Missing `unfold` module + - Added `django-unfold==0.73.1` to requirements.txt + - Rebuilt Docker image: `igny8-backend:latest` + - All containers now use new image (backend, celery_worker, celery_beat, flower) + +2. **Admin Apps Configuration Error** - `AttributeError: module 'django.contrib.admin' has no attribute 'apps'` + - Fixed import in `admin/apps.py`: `from django.contrib.admin.apps import AdminConfig` + - Import Unfold AFTER apps are ready in `ready()` method + +3. **Admin Site Inheritance** - Mixed admin systems + - Changed `Igny8AdminSite` from `admin.AdminSite` β†’ `UnfoldAdminSite` + - All admin classes now inherit from Unfold's `ModelAdmin` + +4. **Celery Admin Filters** - Using wrong filter classes + - Changed from `DateRangeFilter` β†’ `RangeDateFilter` (Unfold version) + - Updated `CeleryTaskResultAdmin` to use `ModelAdmin` from Unfold + +5. **Middleware Configuration** + - Added `simple_history.middleware.HistoryRequestMiddleware` + +6. **INSTALLED_APPS Order** + - Unfold apps MUST be before `django.contrib.admin` + - Configured properly in settings.py + +**βœ… Result: Single Clean Admin System** +- **ONLY Unfold** - No more conflicts +- Modern, responsive UI with Tailwind CSS +- Dark mode support +- Advanced filters and bulk operations built-in +- All containers running healthy --- ## Executive Summary -This document outlines a comprehensive improvement plan for the IGNY8 Django Admin interface to transform it from a basic management tool into a powerful operational command center. The plan addresses UI/UX deficiencies, operational inefficiencies, missing monitoring capabilities, and organizational improvements. +This document outlines a comprehensive improvement plan for the IGNY8 Django Admin interface using **Django Unfold**, a modern, feature-rich admin theme. Unfold provides a beautiful UI based on Tailwind CSS, advanced filtering, bulk operations, dark mode, and extensive customization options - eliminating the need for custom CSS/JS while providing enterprise-grade functionality out of the box. **Key Objectives:** -- Enhance UI styling and user experience -- Reorganize sidebar menu for logical grouping +- βœ… **COMPLETED:** Install and configure Unfold theme +- Leverage Unfold's built-in features for UI/UX excellence +- Reorganize sidebar menu using Unfold's navigation system - Remove unused/empty models -- Add bulk operations and data export -- Implement Celery task monitoring -- Create operational dashboards -- Improve search and filtering capabilities +- Implement bulk operations with Unfold's action system +- Add Celery task monitoring with Unfold integration +- Create operational dashboards using Unfold's dashboard tools +- Implement advanced filtering with Unfold's filter extensions + +**What Makes This Different:** +- **Modern UI Out-of-the-Box:** No custom CSS needed - Unfold provides beautiful, responsive design +- **Built-in Features:** Bulk operations, advanced filters, charts, dark mode included +- **Django Integration:** Works seamlessly with django-import-export, django-simple-history, django-celery-results +- **Extensible:** Easy to customize with Unfold's configuration system --- ## Current State Analysis +### βœ… Completed (Phase 0) - December 14, 2025 + +1. βœ… **Unfold Installation** - django-unfold==0.73.1 installed in requirements.txt +2. βœ… **Docker Image Rebuilt** - igny8-backend:latest rebuilt with all dependencies +3. βœ… **Settings Configuration** - UNFOLD settings configured in settings.py +4. βœ… **Admin Site Update** - Igny8AdminSite now inherits from UnfoldAdminSite +5. βœ… **Admin Apps Fixed** - Igny8AdminConfig properly imports Unfold after apps ready +6. βœ… **Celery Admin Updated** - CeleryTaskResultAdmin uses Unfold ModelAdmin & filters +7. βœ… **Supporting Packages** - django-simple-history, django-import-export, django-celery-results installed +8. βœ… **Middleware Updated** - simple_history.middleware.HistoryRequestMiddleware added +9. βœ… **Static Files** - Unfold assets collected via collectstatic +10. βœ… **All Containers Running** - Backend, Celery Worker, Celery Beat, Flower all healthy +11. βœ… **Conflicts Resolved** - No more mixed admin systems (default + custom + Unfold) +12. βœ… **Single Admin System** - **Unfold ONLY** - clean, modern, no conflicts + ### βœ… Strengths -1. **Custom Admin Site** - Igny8AdminSite with logical grouping -2. **Multi-Tenancy Support** - AccountAdminMixin and SiteSectorAdminMixin -3. **Payment Approval Workflow** - Comprehensive payment approval system -4. **Custom Actions** - API key generation, payment approval/rejection -5. **Field Customization** - Custom fieldsets and readonly fields +1. **Modern UI Theme** - Unfold provides beautiful, responsive Tailwind-based design +2. **Custom Admin Site** - Igny8AdminSite with logical grouping (maintained) +3. **Multi-Tenancy Support** - AccountAdminMixin and SiteSectorAdminMixin +4. **Payment Approval Workflow** - Comprehensive payment approval system +5. **Custom Actions** - API key generation, payment approval/rejection +6. **Field Customization** - Custom fieldsets and readonly fields -### ⚠️ Issues Identified +### ⚠️ Issues Remaining -#### 1. **UI/UX Problems** -- No custom styling - uses default Django admin theme -- Basic, dated appearance -- Poor mobile responsiveness -- No dashboard widgets or charts -- Limited visual feedback for actions -- No color coding for statuses - -#### 2. **Sidebar Menu Organization** -- Some groups have unclear purpose -- "Payments" group separated from "Billing & Tenancy" +#### 1. **Sidebar Menu Organization** +- βœ… Current get_app_list() structure works but can be enhanced with Unfold features +- Need to add icons to models for better visual recognition - Missing PlanLimitUsage model (needs to be added) - Some empty groups appearing -- Inconsistent naming conventions -#### 3. **Unused/Empty Models** -- **site_building** models referenced but don't exist: - - BusinessType - - AudienceProfile - - BrandPersonality - - HeroImageryDirection -- Duplicate model registrations: - - Invoice registered in both `business/billing/admin.py` and `modules/billing/admin.py` - - Payment registered twice (with comment noting one shouldn't be used) - - CreditPackage registered twice - - CreditCostConfig registered twice +#### 2. **Unused/Empty Models** (Same as before) +- **site_building** models referenced but don't exist +- Duplicate model registrations need cleanup -#### 4. **Missing Features** -- No CSV/Excel export functionality -- Limited bulk operations (only 3 actions total) -- No Celery task monitoring interface -- No admin dashboard with metrics -- No data quality indicators -- No audit trail beyond basic LogEntry -- No advanced filtering (date ranges, etc.) - -#### 5. **Operational Gaps** -- No at-risk account alerts -- No low credit warnings -- No failed automation alerts -- No WordPress sync status dashboard -- No performance metrics tracking +#### 3. **Missing Features** (Now easier with Unfold) +- CSV/Excel export - Can use Unfold's import_export integration +- Bulk operations - Use Unfold's enhanced action system +- Celery monitoring - Use Unfold's contrib package for better UI +- Admin dashboard - Use Unfold's dashboard widgets +- Advanced filtering - Use Unfold's filter contrib package --- -## Phase 1: Critical Fixes & UI Foundation (Week 1-2) +## Unfold Features Available + +### Built-in Features We'll Use: + +1. **Visual Interface** + - Modern Tailwind CSS-based design + - Dark mode support (automatic) + - Responsive layout (mobile-friendly) + - Beautiful forms and tables + +2. **Advanced Filtering** + - `unfold.contrib.filters` - Enhanced filter UI + - Date range filters with calendar + - Autocomplete filters for foreign keys + - Numeric range filters + +3. **Import/Export** + - `unfold.contrib.import_export` - Styled import/export UI + - Works seamlessly with django-import-export + - Beautiful file upload/download interface + +4. **History/Audit Trail** + - `unfold.contrib.simple_history` - Enhanced history UI + - Timeline view of changes + - User attribution and timestamps + +5. **Actions** + - Enhanced bulk actions UI + - Custom action styling + - Progress indicators + +6. **Dashboard Components** + - Cards for metrics + - Charts (Chart.js integration) + - Custom widgets + - Activity feeds + +7. **Other Features** + - Inline tabs for grouping + - Conditional field visibility + - WYSIWYG editor (Trix) + - Sortable inlines + - Command palette (Cmd+K search) + +--- + +## Phase 1: Critical Fixes & Model Updates (Week 1) ### 1.1 Remove Unused Models from Admin Site @@ -111,295 +201,224 @@ This document outlines a comprehensive improvement plan for the IGNY8 Django Adm **Files to modify:** - `/data/app/igny8/backend/igny8_core/business/billing/admin.py` -### 1.3 Reorganize Sidebar Menu Groups +### 1.3 Update Admin Classes to Use Unfold -**Current Groups:** -1. Billing & Tenancy -2. Sites & Users -3. Global Reference Data -4. Planner -5. Writer Module -6. Thinker Module -7. System Configuration -8. Payments (separate!) -9. Integrations & Sync -10. Publishing -11. Optimization -12. Django Internals +**Current State:** Most admin classes inherit from `admin.ModelAdmin` -**Proposed Reorganization:** +**Action:** Update all admin classes to inherit from Unfold's ModelAdmin: ```python -'πŸ’° Billing & Accounts': { - 'models': [ - ('igny8_core_auth', 'Plan'), - ('billing', 'PlanLimitUsage'), # ADD THIS - ('igny8_core_auth', 'Account'), - ('igny8_core_auth', 'Subscription'), - ('billing', 'Invoice'), - ('billing', 'Payment'), - ('billing', 'CreditTransaction'), - ('billing', 'CreditUsageLog'), - ('billing', 'CreditPackage'), - ('billing', 'PaymentMethodConfig'), - ('billing', 'AccountPaymentMethod'), - ('billing', 'CreditCostConfig'), - ], -}, -'πŸ‘₯ Sites & Users': { - 'models': [ - ('igny8_core_auth', 'Site'), - ('igny8_core_auth', 'Sector'), - ('igny8_core_auth', 'User'), - ('igny8_core_auth', 'SiteUserAccess'), - ('igny8_core_auth', 'PasswordResetToken'), - ], -}, -'πŸ“š Content Management': { - 'models': [ - ('writer', 'Content'), - ('writer', 'Tasks'), - ('writer', 'Images'), - ('writer', 'ContentTaxonomy'), - ('writer', 'ContentAttribute'), - ('writer', 'ContentTaxonomyRelation'), - ('writer', 'ContentClusterMap'), - ], -}, -'🎯 Planning & Strategy': { - 'models': [ - ('planner', 'Clusters'), - ('planner', 'Keywords'), - ('planner', 'ContentIdeas'), - ('system', 'Strategy'), - ], -}, -'πŸ”— Integrations & Publishing': { - 'models': [ - ('integration', 'SiteIntegration'), - ('integration', 'SyncEvent'), - ('publishing', 'PublishingRecord'), - ('publishing', 'DeploymentRecord'), - ], -}, -'πŸ€– AI & Automation': { - 'models': [ - ('ai', 'AITaskLog'), - ('system', 'AIPrompt'), - ('automation', 'AutomationConfig'), - ('automation', 'AutomationRun'), - ('optimization', 'OptimizationTask'), - ], -}, -'🌍 Global Reference Data': { - 'models': [ - ('igny8_core_auth', 'Industry'), - ('igny8_core_auth', 'IndustrySector'), - ('igny8_core_auth', 'SeedKeyword'), - ], -}, -'βš™οΈ System Configuration': { - 'models': [ - ('system', 'IntegrationSettings'), - ('system', 'AuthorProfile'), - ('system', 'SystemSettings'), - ('system', 'AccountSettings'), - ('system', 'UserSettings'), - ('system', 'ModuleSettings'), - ('system', 'AISettings'), - ('system', 'ModuleEnableSettings'), - ('system', 'SystemLog'), - ('system', 'SystemStatus'), - ], -}, -'πŸ”§ Django System': { - 'models': [ - ('admin', 'LogEntry'), - ('auth', 'Group'), - ('auth', 'Permission'), - ('contenttypes', 'ContentType'), - ('sessions', 'Session'), - ], -}, +from unfold.admin import ModelAdmin +from unfold.contrib.filters.admin import RangeDateFilter +from unfold.contrib.import_export.forms import ExportForm, ImportForm + +class TasksAdmin(SiteSectorAdminMixin, ModelAdmin): + # Unfold-specific features + compressed_fields = True # Compact form layout + warn_unsaved_form = True # Warn before leaving unsaved form + + # Standard Django admin + list_display = ['title', 'status', 'cluster', 'created_at'] + list_filter = [ + ('created_at', RangeDateFilter), # Unfold date range filter + 'status', + ] + search_fields = ['title', 'description'] + actions_detail = ['generate_content', 'assign_cluster'] # Actions in detail view ``` -**Benefits:** -- Logical grouping by functionality -- Emoji icons for quick visual recognition -- Combined Billing & Payments into one group -- Separated Content Management from Planning -- Grouped AI, Automation, and Optimization together -- Clearer hierarchy and easier navigation +**Key Files to Update:** +- `/data/app/igny8/backend/igny8_core/modules/writer/admin.py` +- `/data/app/igny8/backend/igny8_core/modules/planner/admin.py` +- `/data/app/igny8/backend/igny8_core/modules/billing/admin.py` +- `/data/app/igny8/backend/igny8_core/business/automation/admin.py` +- `/data/app/igny8/backend/igny8_core/business/integration/admin.py` +- All other admin files -### 1.4 Install Django Admin Enhancement Packages +### 1.4 Add Model Icons for Visual Navigation -**Packages to install:** +**Action:** Add icon declarations to each admin class using Unfold's icon system (Material Symbols): -```bash -# UI Enhancement -pip install django-admin-interface # Modern, customizable theme -# OR -pip install django-grappelli # Alternative mature theme - -# Functionality -pip install django-import-export # CSV/Excel import/export -pip install django-admin-rangefilter # Date range filters -pip install django-advanced-filters # Save filter combinations -pip install django-admin-autocomplete-filter # Better autocomplete +```python +class AccountAdmin(AccountAdminMixin, ModelAdmin): + # Add icon for sidebar + icon = "business" # Material symbol name + +class ContentAdmin(SiteSectorAdminMixin, ModelAdmin): + icon = "article" + +class TasksAdmin(SiteSectorAdminMixin, ModelAdmin): + icon = "task" ``` -**Configuration needed:** -- Add to INSTALLED_APPS -- Configure static files -- Run collectstatic -- Apply migrations if needed +**Icon Mapping:** -### 1.5 Basic UI Styling Improvements +| Model | Icon | Material Symbol | +|-------|------|----------------| +| Account | business | Business/company icon | +| Plan | card_membership | Membership card | +| Site | language | Globe/website icon | +| User | person | Person icon | +| Content | article | Article/document | +| Tasks | task | Checkbox list | +| Clusters | bubble_chart | Cluster diagram | +| Keywords | vpn_key | Key icon | +| Payment | payment | Payment icon | +| Invoice | receipt | Receipt icon | +| Automation | settings_suggest | Automation gear | +| Integration | integration_instructions | Integration icon | -**Without packages (quick wins):** +### 1.5 Configure Unfold Colors and Branding -Create custom CSS file: `backend/igny8_core/static/admin/css/igny8_admin.css` +**Already Done:** Basic UNFOLD configuration in settings.py -```css -/* Status badges */ -.status-active { color: #28a745; font-weight: bold; } -.status-inactive { color: #dc3545; } -.status-pending { color: #ffc107; } +**Additional Customization:** -/* Credit indicators */ -.credits-low { color: #dc3545; font-weight: bold; } -.credits-medium { color: #ffc107; } -.credits-high { color: #28a745; } - -/* Quick action buttons */ -.admin-action-button { - padding: 5px 15px; - border-radius: 4px; - cursor: pointer; - text-decoration: none; - display: inline-block; - margin: 2px; -} - -/* List view enhancements */ -.django-admin-index tr:hover { - background-color: #f8f9fa; -} -``` - -Add custom template: `backend/igny8_core/templates/admin/base_site.html` - -```html -{% extends "admin/base.html" %} -{% load static %} - -{% block title %}{{ title }} | IGNY8 Admin{% endblock %} - -{% block branding %} -

- - IGNY8 Administration - -

-{% endblock %} - -{% block extrastyle %} - {{ block.super }} - -{% endblock %} +```python +# In settings.py UNFOLD dict +"SITE_FAVICONS": [ + { + "rel": "icon", + "sizes": "32x32", + "type": "image/png", + "href": lambda request: static("favicons/favicon-32x32.png"), + }, +], +"SIDEBAR": { + "show_search": True, + "show_all_applications": True, + "navigation": None, # Use get_app_list() from Igny8AdminSite +}, +"THEME": "light", # or "dark" or "auto" ``` --- -## Phase 2: Operational Features (Week 3-4) +## Phase 2: Bulk Operations & Export (Week 2) -### 2.1 Add Bulk Operations +### 2.1 Implement CSV/Excel Export with Unfold -**Priority Models for Bulk Actions:** +**Install Already Complete:** django-import-export and unfold.contrib.import_export + +**Action:** Add ExportMixin and ImportMixin to admin classes: + +```python +from import_export.admin import ImportExportModelAdmin +from unfold.contrib.import_export.forms import ExportForm, ImportForm, SelectableFieldsExportForm + +class TasksAdmin(SiteSectorAdminMixin, ImportExportModelAdmin, ModelAdmin): + import_form_class = ImportForm + export_form_class = ExportForm + + # Define what fields to export + class TaskResource(resources.ModelResource): + class Meta: + model = Tasks + fields = ('id', 'title', 'status', 'cluster__name', 'site__name', 'created_at') + export_order = fields + + resource_class = TaskResource +``` + +**Priority Models for Export:** +- βœ… Tasks +- βœ… Content +- βœ… Keywords +- βœ… Payments +- βœ… CreditTransactions +- βœ… Clusters + +### 2.2 Add Bulk Operations with Unfold Actions + +**Unfold provides enhanced action UI automatically** + +**Action:** Add actions to admin classes: + +```python +from django.contrib import admin +from unfold.decorators import action + +class TasksAdmin(SiteSectorAdminMixin, ModelAdmin): + actions = ['bulk_set_in_progress', 'bulk_set_completed', 'bulk_assign_cluster'] + + @action(description="Mark as In Progress") + def bulk_set_in_progress(self, request, queryset): + updated = queryset.update(status='in_progress') + self.message_user(request, f'{updated} tasks marked as in progress', 'SUCCESS') + + @action(description="Mark as Completed") + def bulk_set_completed(self, request, queryset): + updated = queryset.update(status='completed') + self.message_user(request, f'{updated} tasks completed', 'SUCCESS') + + @action(description="Assign to Cluster", form_class=BulkAssignClusterForm) + def bulk_assign_cluster(self, request, queryset): + # Unfold will show form with cluster selection + if 'cluster' in request.POST: + cluster_id = request.POST['cluster'] + queryset.update(cluster_id=cluster_id) + self.message_user(request, f'Assigned to cluster', 'SUCCESS') +``` + +**Bulk Actions to Add:** #### Tasks Admin -```python -actions = [ - 'bulk_set_status_draft', - 'bulk_set_status_in_progress', - 'bulk_set_status_completed', - 'bulk_assign_cluster', - 'bulk_generate_content', - 'bulk_export_csv', -] -``` +- Mark as Draft +- Mark as In Progress +- Mark as Completed +- Assign to Cluster +- Generate Content (trigger AI) #### Content Admin -```python -actions = [ - 'bulk_publish_to_wordpress', - 'bulk_set_status', - 'bulk_add_taxonomy', - 'bulk_export_with_seo', -] -``` +- Publish to WordPress +- Change Status +- Add Taxonomy +- Update SEO Settings #### Keywords Admin -```python -actions = [ - 'bulk_assign_cluster', - 'bulk_set_priority', - 'bulk_export_csv', -] -``` +- Assign to Cluster +- Set Priority +- Mark for Research -#### Payments Admin (already has some) -```python -actions = [ - 'approve_payments', - 'reject_payments', - 'export_transactions', # ADD -] -``` +#### Payments Admin +- Approve Payments (already exists) +- Reject Payments (already exists) +- Export Transactions (add) -### 2.2 Implement CSV Export +### 2.3 Advanced Filtering with Unfold -**Install django-import-export:** +**Unfold provides beautiful filter UI out of the box** -Add to each admin class: +**Action:** Use Unfold's filter contrib for enhanced filtering: ```python -from import_export.admin import ExportMixin +from unfold.contrib.filters.admin import ( + RangeDateFilter, + RangeDateTimeFilter, + RangeNumericFilter, + SingleNumericFilter, + SliderNumericFilter, +) +from unfold.contrib.filters.admin import RelatedDropdownFilter, ChoicesDropdownFilter -class TasksAdmin(ExportMixin, SiteSectorAdminMixin, admin.ModelAdmin): - resource_class = TaskResource # Define export fields - # ... existing code -``` - -**Create Resource classes for key models:** -- TaskResource -- ContentResource -- KeywordsResource -- CreditTransactionResource -- PaymentResource - -### 2.3 Advanced Filtering - -**Add date range filters:** - -```python -from rangefilter.filters import DateRangeFilter - -class CreditTransactionAdmin(AccountAdminMixin, admin.ModelAdmin): +class CreditTransactionAdmin(AccountAdminMixin, ModelAdmin): list_filter = [ - 'transaction_type', - ('created_at', DateRangeFilter), - 'account', + ('created_at', RangeDateFilter), # Beautiful date range picker + ('amount', RangeNumericFilter), # Numeric range with slider + ('account', RelatedDropdownFilter), # Dropdown with search + ('transaction_type', ChoicesDropdownFilter), # Enhanced dropdown ] ``` -**Add autocomplete filters for large datasets:** +**Filter Types to Implement:** -```python -class TasksAdmin(SiteSectorAdminMixin, admin.ModelAdmin): - autocomplete_fields = ['site', 'sector', 'cluster'] - search_fields = ['title', 'description'] -``` +| Model | Filters | +|-------|---------| +| CreditTransaction | Date range, Amount range, Account dropdown, Type | +| Payment | Date range, Status, Amount range, Method | +| Content | Date range, Status, Site, Sector, Word count range | +| Tasks | Date range, Status, Cluster, Priority | +| AutomationRun | Date range, Status, Site, Success/Fail | --- diff --git a/backend/igny8_core/admin/apps.py b/backend/igny8_core/admin/apps.py index 0840715b..1c2a9258 100644 --- a/backend/igny8_core/admin/apps.py +++ b/backend/igny8_core/admin/apps.py @@ -28,6 +28,9 @@ class Igny8AdminConfig(AdminConfig): def ready(self): super().ready() + # Import Unfold AFTER apps are ready + from unfold.admin import ModelAdmin as UnfoldModelAdmin + # Register Django internals in admin (read-only where appropriate) from django.contrib.admin.models import LogEntry from django.contrib.auth.models import Group, Permission @@ -35,8 +38,8 @@ class Igny8AdminConfig(AdminConfig): from django.contrib.sessions.models import Session _safe_register(LogEntry, ReadOnlyAdmin) - _safe_register(Permission, admin.ModelAdmin) - _safe_register(Group, admin.ModelAdmin) + _safe_register(Permission, UnfoldModelAdmin) + _safe_register(Group, UnfoldModelAdmin) _safe_register(ContentType, ReadOnlyAdmin) _safe_register(Session, ReadOnlyAdmin) diff --git a/backend/igny8_core/admin/celery_admin.py b/backend/igny8_core/admin/celery_admin.py index 3bcb3e56..145cea22 100644 --- a/backend/igny8_core/admin/celery_admin.py +++ b/backend/igny8_core/admin/celery_admin.py @@ -1,15 +1,16 @@ """ -Celery Task Monitoring Admin +Celery Task Monitoring Admin - Unfold Style """ from django.contrib import admin from django.utils.html import format_html from django.contrib import messages from django_celery_results.models import TaskResult -from rangefilter.filters import DateRangeFilter +from unfold.admin import ModelAdmin +from unfold.contrib.filters.admin import RangeDateFilter -class CeleryTaskResultAdmin(admin.ModelAdmin): - """Admin interface for monitoring Celery tasks""" +class CeleryTaskResultAdmin(ModelAdmin): + """Admin interface for monitoring Celery tasks with Unfold styling""" list_display = [ 'task_id', @@ -22,8 +23,8 @@ class CeleryTaskResultAdmin(admin.ModelAdmin): list_filter = [ 'status', 'task_name', - ('date_created', DateRangeFilter), - ('date_done', DateRangeFilter), + ('date_created', RangeDateFilter), + ('date_done', RangeDateFilter), ] search_fields = ['task_id', 'task_name', 'task_args'] readonly_fields = [ diff --git a/backend/igny8_core/admin/site.py b/backend/igny8_core/admin/site.py index 4985acd6..d8a726cd 100644 --- a/backend/igny8_core/admin/site.py +++ b/backend/igny8_core/admin/site.py @@ -1,23 +1,18 @@ """ -Custom AdminSite for IGNY8 to organize models into proper groups +Custom AdminSite for IGNY8 to organize models into proper groups using Unfold """ from django.contrib import admin from django.contrib.admin.apps import AdminConfig from django.apps import apps -from django.urls import path +from django.urls import path, reverse_lazy from django.shortcuts import redirect +from unfold.admin import ModelAdmin as UnfoldModelAdmin +from unfold.sites import UnfoldAdminSite -class Igny8AdminSite(admin.AdminSite): +class Igny8AdminSite(UnfoldAdminSite): """ - Custom AdminSite that organizes models into the planned groups: - 1. Billing & Tenancy - 2. Sites & Users - 3. Global Reference Data - 4. Planner - 5. Writer Module - 6. Thinker Module - 7. System Configuration + Custom AdminSite based on Unfold that organizes models into the planned groups """ site_header = 'IGNY8 Administration' site_title = 'IGNY8 Admin' diff --git a/backend/igny8_core/settings.py b/backend/igny8_core/settings.py index a5318982..47a568be 100644 --- a/backend/igny8_core/settings.py +++ b/backend/igny8_core/settings.py @@ -36,6 +36,11 @@ ALLOWED_HOSTS = [ ] INSTALLED_APPS = [ + # Django Unfold admin theme - MUST be before django.contrib.admin + 'unfold', + 'unfold.contrib.filters', + 'unfold.contrib.import_export', + 'unfold.contrib.simple_history', # Core Django apps - Custom admin with IGNY8 branding 'igny8_core.admin.apps.Igny8AdminConfig', # Custom admin config 'django.contrib.auth', @@ -51,6 +56,7 @@ INSTALLED_APPS = [ 'import_export', 'rangefilter', 'django_celery_results', + 'simple_history', # IGNY8 apps 'igny8_core.auth.apps.Igny8CoreAuthConfig', # Use app config with custom label 'igny8_core.ai.apps.AIConfig', # AI Framework @@ -108,6 +114,7 @@ MIDDLEWARE = [ 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'simple_history.middleware.HistoryRequestMiddleware', # Audit trail 'igny8_core.middleware.request_id.RequestIDMiddleware', # Request ID tracking (must be early) 'igny8_core.auth.middleware.AccountContextMiddleware', # Multi-account support # AccountContextMiddleware sets request.account from JWT @@ -607,6 +614,40 @@ CELERY_CACHE_BACKEND = 'django-cache' # Import/Export Settings IMPORT_EXPORT_USE_TRANSACTIONS = True +# ============================================================================== +# UNFOLD ADMIN CONFIGURATION +# ============================================================================== +# Modern Django admin theme with advanced features +# Documentation: https://unfoldadmin.com/ + +UNFOLD = { + "SITE_TITLE": "IGNY8 Administration", + "SITE_HEADER": "IGNY8 Admin", + "SITE_URL": "/", + "SITE_SYMBOL": "speed", # Symbol from Material icons + "SHOW_HISTORY": True, # Show history for models with simple_history + "SHOW_VIEW_ON_SITE": True, # Show "View on site" button + "COLORS": { + "primary": { + "50": "248 250 252", + "100": "241 245 249", + "200": "226 232 240", + "300": "203 213 225", + "400": "148 163 184", + "500": "100 116 139", + "600": "71 85 105", + "700": "51 65 85", + "800": "30 41 59", + "900": "15 23 42", + "950": "2 6 23", + }, + }, + "SIDEBAR": { + "show_search": True, # Show search in sidebar + "show_all_applications": True, # Show all apps (we'll organize via custom get_app_list) + }, +} + # Billing / Payments configuration STRIPE_PUBLIC_KEY = os.getenv('STRIPE_PUBLIC_KEY', '') STRIPE_SECRET_KEY = os.getenv('STRIPE_SECRET_KEY', '') diff --git a/backend/requirements.txt b/backend/requirements.txt index bc867666..87bad134 100755 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -17,7 +17,8 @@ drf-spectacular>=0.27.0 stripe>=7.10.0 # Django Admin Enhancements -django-admin-interface==0.26.0 +django-unfold==0.73.1 django-import-export==3.3.1 django-admin-rangefilter==0.11.1 django-celery-results==2.5.1 +django-simple-history==3.4.0 diff --git a/backend/staticfiles/admin/js/actions.js b/backend/staticfiles/admin/js/actions.js index 04b25e96..2f0db2d2 100644 --- a/backend/staticfiles/admin/js/actions.js +++ b/backend/staticfiles/admin/js/actions.js @@ -1,204 +1,246 @@ /*global gettext, interpolate, ngettext, Actions*/ -'use strict'; +"use strict"; { - function show(selector) { - document.querySelectorAll(selector).forEach(function(el) { - el.classList.remove('hidden'); - }); - } - - function hide(selector) { - document.querySelectorAll(selector).forEach(function(el) { - el.classList.add('hidden'); - }); - } - - function showQuestion(options) { - hide(options.acrossClears); - show(options.acrossQuestions); - hide(options.allContainer); - } - - function showClear(options) { - show(options.acrossClears); - hide(options.acrossQuestions); - document.querySelector(options.actionContainer).classList.remove(options.selectedClass); - show(options.allContainer); - hide(options.counterContainer); - } - - function reset(options) { - hide(options.acrossClears); - hide(options.acrossQuestions); - hide(options.allContainer); - show(options.counterContainer); - } - - function clearAcross(options) { - reset(options); - const acrossInputs = document.querySelectorAll(options.acrossInput); - acrossInputs.forEach(function(acrossInput) { - acrossInput.value = 0; - }); - document.querySelector(options.actionContainer).classList.remove(options.selectedClass); - } - - function checker(actionCheckboxes, options, checked) { - if (checked) { - showQuestion(options); - } else { - reset(options); - } - actionCheckboxes.forEach(function(el) { - el.checked = checked; - el.closest('tr').classList.toggle(options.selectedClass, checked); - }); - } - - function updateCounter(actionCheckboxes, options) { - const sel = Array.from(actionCheckboxes).filter(function(el) { - return el.checked; - }).length; - const counter = document.querySelector(options.counterContainer); - // data-actions-icnt is defined in the generated HTML - // and contains the total amount of objects in the queryset - const actions_icnt = Number(counter.dataset.actionsIcnt); - counter.textContent = interpolate( - ngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), { - sel: sel, - cnt: actions_icnt - }, true); - const allToggle = document.getElementById(options.allToggleId); - allToggle.checked = sel === actionCheckboxes.length; - if (allToggle.checked) { - showQuestion(options); - } else { - clearAcross(options); - } - } - - const defaults = { - actionContainer: "div.actions", - counterContainer: "span.action-counter", - allContainer: "div.actions span.all", - acrossInput: "div.actions input.select-across", - acrossQuestions: "div.actions span.question", - acrossClears: "div.actions span.clear", - allToggleId: "action-toggle", - selectedClass: "selected" - }; - - window.Actions = function(actionCheckboxes, options) { - options = Object.assign({}, defaults, options); - let list_editable_changed = false; - let lastChecked = null; - let shiftPressed = false; - - document.addEventListener('keydown', (event) => { - shiftPressed = event.shiftKey; - }); - - document.addEventListener('keyup', (event) => { - shiftPressed = event.shiftKey; - }); - - document.getElementById(options.allToggleId).addEventListener('click', function(event) { - checker(actionCheckboxes, options, this.checked); - updateCounter(actionCheckboxes, options); - }); - - document.querySelectorAll(options.acrossQuestions + " a").forEach(function(el) { - el.addEventListener('click', function(event) { - event.preventDefault(); - const acrossInputs = document.querySelectorAll(options.acrossInput); - acrossInputs.forEach(function(acrossInput) { - acrossInput.value = 1; - }); - showClear(options); - }); - }); - - document.querySelectorAll(options.acrossClears + " a").forEach(function(el) { - el.addEventListener('click', function(event) { - event.preventDefault(); - document.getElementById(options.allToggleId).checked = false; - clearAcross(options); - checker(actionCheckboxes, options, false); - updateCounter(actionCheckboxes, options); - }); - }); - - function affectedCheckboxes(target, withModifier) { - const multiSelect = (lastChecked && withModifier && lastChecked !== target); - if (!multiSelect) { - return [target]; - } - const checkboxes = Array.from(actionCheckboxes); - const targetIndex = checkboxes.findIndex(el => el === target); - const lastCheckedIndex = checkboxes.findIndex(el => el === lastChecked); - const startIndex = Math.min(targetIndex, lastCheckedIndex); - const endIndex = Math.max(targetIndex, lastCheckedIndex); - const filtered = checkboxes.filter((el, index) => (startIndex <= index) && (index <= endIndex)); - return filtered; - }; - - Array.from(document.getElementById('result_list').tBodies).forEach(function(el) { - el.addEventListener('change', function(event) { - const target = event.target; - if (target.classList.contains('action-select')) { - const checkboxes = affectedCheckboxes(target, shiftPressed); - checker(checkboxes, options, target.checked); - updateCounter(actionCheckboxes, options); - lastChecked = target; - } else { - list_editable_changed = true; - } - }); - }); - - document.querySelector('#changelist-form button[name=index]').addEventListener('click', function(event) { - if (list_editable_changed) { - const confirmed = confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost.")); - if (!confirmed) { - event.preventDefault(); - } - } - }); - - const el = document.querySelector('#changelist-form input[name=_save]'); - // The button does not exist if no fields are editable. - if (el) { - el.addEventListener('click', function(event) { - if (document.querySelector('[name=action]').value) { - const text = list_editable_changed - ? gettext("You have selected an action, but you haven’t saved your changes to individual fields yet. Please click OK to save. You’ll need to re-run the action.") - : gettext("You have selected an action, and you haven’t made any changes on individual fields. You’re probably looking for the Go button rather than the Save button."); - if (!confirm(text)) { - event.preventDefault(); - } - } - }); - } - // Sync counter when navigating to the page, such as through the back - // button. - window.addEventListener('pageshow', (event) => updateCounter(actionCheckboxes, options)); - }; - - // Call function fn when the DOM is loaded and ready. If it is already - // loaded, call the function now. - // http://youmightnotneedjquery.com/#ready - function ready(fn) { - if (document.readyState !== 'loading') { - fn(); - } else { - document.addEventListener('DOMContentLoaded', fn); - } - } - - ready(function() { - const actionsEls = document.querySelectorAll('tr input.action-select'); - if (actionsEls.length > 0) { - Actions(actionsEls); - } + function show(options, selector) { + options.parent.querySelectorAll(selector).forEach(function (el) { + el.classList.remove("hidden"); }); + } + + function hide(options, selector) { + options.parent.querySelectorAll(selector).forEach(function (el) { + el.classList.add("hidden"); + }); + } + + function showQuestion(options) { + hide(options, options.acrossClears); + show(options, options.acrossQuestions); + hide(options, options.allContainer); + } + + function showClear(options) { + show(options, options.acrossClears); + hide(options, options.acrossQuestions); + options.parent + .querySelector(options.actionContainer) + .classList.remove(options.selectedClass); + show(options, options.allContainer); + hide(options, options.counterContainer); + } + + function reset(options) { + hide(options, options.acrossClears); + hide(options, options.acrossQuestions); + hide(options, options.allContainer); + show(options, options.counterContainer); + } + + function clearAcross(options) { + reset(options); + const acrossInputs = options.parent.querySelectorAll(options.acrossInput); + acrossInputs.forEach(function (acrossInput) { + acrossInput.value = 0; + acrossInput.dispatchEvent(new Event("input")); + }); + options.parent + .querySelector(options.actionContainer) + .classList.remove(options.selectedClass); + } + + function checker(actionCheckboxes, options, checked) { + if (checked) { + showQuestion(options); + } else { + reset(options); + } + actionCheckboxes.forEach(function (el) { + el.checked = checked; + el.closest("tr").classList.toggle(options.selectedClass, checked); + }); + } + + function updateCounter(actionCheckboxes, options) { + const sel = Array.from(actionCheckboxes).filter(function (el) { + return el.checked; + }).length; + const counter = options.parent.querySelector(options.counterContainer); + // data-actions-icnt is defined in the generated HTML + // and contains the total amount of objects in the queryset + const actions_icnt = Number(counter.dataset.actionsIcnt); + counter.textContent = interpolate( + ngettext( + "%(sel)s of %(cnt)s selected", + "%(sel)s of %(cnt)s selected", + sel + ), + { + sel: sel, + cnt: actions_icnt, + }, + true + ); + const allToggle = options.parent.querySelector(".action-toggle"); + allToggle.checked = sel === actionCheckboxes.length; + if (allToggle.checked) { + showQuestion(options); + } else { + clearAcross(options); + } + } + + const defaults = { + actionContainer: "div.actions", + counterContainer: "span.action-counter", + allContainer: "div.actions span.all", + acrossInput: "div.actions input.select-across", + acrossQuestions: "div.actions span.question", + acrossClears: "div.actions span.clear", + allToggleId: "action-toggle", + selectedClass: "selected", + }; + + window.Actions = function (actionCheckboxes, options) { + options = Object.assign({}, defaults, options); + let list_editable_changed = false; + let lastChecked = null; + let shiftPressed = false; + + document.addEventListener("keydown", (event) => { + shiftPressed = event.shiftKey; + }); + + document.addEventListener("keyup", (event) => { + shiftPressed = event.shiftKey; + }); + + const allToggle = options.parent.querySelector(".action-toggle"); + allToggle.addEventListener("click", function (event) { + checker(actionCheckboxes, options, this.checked); + updateCounter(actionCheckboxes, options); + }); + + options.parent + .querySelectorAll(options.acrossQuestions + " a") + .forEach(function (el) { + el.addEventListener("click", function (event) { + event.preventDefault(); + const acrossInputs = options.parent.querySelectorAll( + options.acrossInput + ); + acrossInputs.forEach(function (acrossInput) { + acrossInput.value = 1; + acrossInput.dispatchEvent(new Event("input")); + }); + showClear(options); + }); + }); + + options.parent + .querySelectorAll(options.acrossClears + " a") + .forEach(function (el) { + el.addEventListener("click", function (event) { + event.preventDefault(); + options.parent.querySelector(".action-toggle").checked = false; + clearAcross(options); + checker(actionCheckboxes, options, false); + updateCounter(actionCheckboxes, options); + }); + }); + + function affectedCheckboxes(target, withModifier) { + const multiSelect = lastChecked && withModifier && lastChecked !== target; + if (!multiSelect) { + return [target]; + } + const checkboxes = Array.from(actionCheckboxes); + const targetIndex = checkboxes.findIndex((el) => el === target); + const lastCheckedIndex = checkboxes.findIndex((el) => el === lastChecked); + const startIndex = Math.min(targetIndex, lastCheckedIndex); + const endIndex = Math.max(targetIndex, lastCheckedIndex); + const filtered = checkboxes.filter( + (el, index) => startIndex <= index && index <= endIndex + ); + return filtered; + } + + const resultList = options.parent.querySelector(".result-list").tBodies; + Array.from(resultList).forEach(function (el) { + el.addEventListener("change", function (event) { + const target = event.target; + if (target.classList.contains("action-select")) { + const checkboxes = affectedCheckboxes(target, shiftPressed); + checker(checkboxes, options, target.checked); + updateCounter(actionCheckboxes, options); + lastChecked = target; + } else { + list_editable_changed = true; + } + }); + }); + + options.parent + .querySelector("button[name=index]") + .addEventListener("click", function (event) { + if (list_editable_changed) { + const confirmed = confirm( + gettext( + "You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost." + ) + ); + if (!confirmed) { + event.preventDefault(); + } + } + }); + + const el = options.parent.querySelector("input[name=_save]"); + + // The button does not exist if no fields are editable. + if (el) { + el.addEventListener("click", function (event) { + if (document.querySelector("[name=action]").value) { + const text = list_editable_changed + ? gettext( + "You have selected an action, but you haven’t saved your changes to individual fields yet. Please click OK to save. You’ll need to re-run the action." + ) + : gettext( + "You have selected an action, and you haven’t made any changes on individual fields. You’re probably looking for the Go button rather than the Save button." + ); + if (!confirm(text)) { + event.preventDefault(); + } + } + }); + } + + // Sync counter when navigating to the page, such as through the back + // button. + window.addEventListener("pageshow", (event) => + updateCounter(actionCheckboxes, options) + ); + }; + + // Call function fn when the DOM is loaded and ready. If it is already + // loaded, call the function now. + // http://youmightnotneedjquery.com/#ready + function ready(fn) { + if (document.readyState !== "loading") { + fn(); + } else { + document.addEventListener("DOMContentLoaded", fn); + } + } + + ready(function () { + document.querySelectorAll(".result-list-wrapper").forEach(function (el) { + const actionsEls = el.querySelectorAll("tr input.action-select"); + + if (actionsEls.length > 0) { + Actions(actionsEls, { + parent: el, + }); + } + }); + }); } diff --git a/backend/staticfiles/admin/js/admin/RelatedObjectLookups.js b/backend/staticfiles/admin/js/admin/RelatedObjectLookups.js index 1fc03c62..eddfc031 100644 --- a/backend/staticfiles/admin/js/admin/RelatedObjectLookups.js +++ b/backend/staticfiles/admin/js/admin/RelatedObjectLookups.js @@ -1,252 +1,301 @@ /*global SelectBox, interpolate*/ // Handles related-objects functionality: lookup link for raw_id_fields // and Add Another links. -'use strict'; +"use strict"; { - const $ = django.jQuery; - let popupIndex = 0; - const relatedWindows = []; + const $ = django.jQuery; + let popupIndex = 0; + const relatedWindows = []; - function dismissChildPopups() { - relatedWindows.forEach(function(win) { - if(!win.closed) { - win.dismissChildPopups(); - win.close(); - } - }); - } - - function setPopupIndex() { - if(document.getElementsByName("_popup").length > 0) { - const index = window.name.lastIndexOf("__") + 2; - popupIndex = parseInt(window.name.substring(index)); - } else { - popupIndex = 0; - } - } - - function addPopupIndex(name) { - return name + "__" + (popupIndex + 1); - } - - function removePopupIndex(name) { - return name.replace(new RegExp("__" + (popupIndex + 1) + "$"), ''); - } - - function showAdminPopup(triggeringLink, name_regexp, add_popup) { - const name = addPopupIndex(triggeringLink.id.replace(name_regexp, '')); - const href = new URL(triggeringLink.href); - if (add_popup) { - href.searchParams.set('_popup', 1); - } - const win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes'); - relatedWindows.push(win); - win.focus(); - return false; - } - - function showRelatedObjectLookupPopup(triggeringLink) { - return showAdminPopup(triggeringLink, /^lookup_/, true); - } - - function dismissRelatedLookupPopup(win, chosenId) { - const name = removePopupIndex(win.name); - const elem = document.getElementById(name); - if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) { - elem.value += ',' + chosenId; - } else { - elem.value = chosenId; - } - $(elem).trigger('change'); - const index = relatedWindows.indexOf(win); - if (index > -1) { - relatedWindows.splice(index, 1); - } + function dismissChildPopups() { + relatedWindows.forEach(function (win) { + if (!win.closed) { + win.dismissChildPopups(); win.close(); - } - - function showRelatedObjectPopup(triggeringLink) { - return showAdminPopup(triggeringLink, /^(change|add|delete)_/, false); - } - - function updateRelatedObjectLinks(triggeringLink) { - const $this = $(triggeringLink); - const siblings = $this.nextAll('.view-related, .change-related, .delete-related'); - if (!siblings.length) { - return; - } - const value = $this.val(); - if (value) { - siblings.each(function() { - const elm = $(this); - elm.attr('href', elm.attr('data-href-template').replace('__fk__', value)); - elm.removeAttr('aria-disabled'); - }); - } else { - siblings.removeAttr('href'); - siblings.attr('aria-disabled', true); - } - } - - function updateRelatedSelectsOptions(currentSelect, win, objId, newRepr, newId, skipIds = []) { - // After create/edit a model from the options next to the current - // select (+ or :pencil:) update ForeignKey PK of the rest of selects - // in the page. - - const path = win.location.pathname; - // Extract the model from the popup url '...//add/' or - // '...///change/' depending the action (add or change). - const modelName = path.split('/')[path.split('/').length - (objId ? 4 : 3)]; - // Select elements with a specific model reference and context of "available-source". - const selectsRelated = document.querySelectorAll(`[data-model-ref="${modelName}"] [data-context="available-source"]`); - - selectsRelated.forEach(function(select) { - if (currentSelect === select || skipIds && skipIds.includes(select.id)) { - return; - } - - let option = select.querySelector(`option[value="${objId}"]`); - - if (!option) { - option = new Option(newRepr, newId); - select.options.add(option); - // Update SelectBox cache for related fields. - if (window.SelectBox !== undefined && !SelectBox.cache[currentSelect.id]) { - SelectBox.add_to_cache(select.id, option); - SelectBox.redisplay(select.id); - } - return; - } - - option.textContent = newRepr; - option.value = newId; - }); - } - - function dismissAddRelatedObjectPopup(win, newId, newRepr) { - const name = removePopupIndex(win.name); - const elem = document.getElementById(name); - if (elem) { - const elemName = elem.nodeName.toUpperCase(); - if (elemName === 'SELECT') { - elem.options[elem.options.length] = new Option(newRepr, newId, true, true); - updateRelatedSelectsOptions(elem, win, null, newRepr, newId); - } else if (elemName === 'INPUT') { - if (elem.classList.contains('vManyToManyRawIdAdminField') && elem.value) { - elem.value += ',' + newId; - } else { - elem.value = newId; - } - } - // Trigger a change event to update related links if required. - $(elem).trigger('change'); - } else { - const toId = name + "_to"; - const toElem = document.getElementById(toId); - const o = new Option(newRepr, newId); - SelectBox.add_to_cache(toId, o); - SelectBox.redisplay(toId); - if (toElem && toElem.nodeName.toUpperCase() === 'SELECT') { - const skipIds = [name + "_from"]; - updateRelatedSelectsOptions(toElem, win, null, newRepr, newId, skipIds); - } - } - const index = relatedWindows.indexOf(win); - if (index > -1) { - relatedWindows.splice(index, 1); - } - win.close(); - } - - function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) { - const id = removePopupIndex(win.name.replace(/^edit_/, '')); - const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); - const selects = $(selectsSelector); - selects.find('option').each(function() { - if (this.value === objId) { - this.textContent = newRepr; - this.value = newId; - } - }).trigger('change'); - updateRelatedSelectsOptions(selects[0], win, objId, newRepr, newId); - selects.next().find('.select2-selection__rendered').each(function() { - // The element can have a clear button as a child. - // Use the lastChild to modify only the displayed value. - this.lastChild.textContent = newRepr; - this.title = newRepr; - }); - const index = relatedWindows.indexOf(win); - if (index > -1) { - relatedWindows.splice(index, 1); - } - win.close(); - } - - function dismissDeleteRelatedObjectPopup(win, objId) { - const id = removePopupIndex(win.name.replace(/^delete_/, '')); - const selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); - const selects = $(selectsSelector); - selects.find('option').each(function() { - if (this.value === objId) { - $(this).remove(); - } - }).trigger('change'); - const index = relatedWindows.indexOf(win); - if (index > -1) { - relatedWindows.splice(index, 1); - } - win.close(); - } - - window.showRelatedObjectLookupPopup = showRelatedObjectLookupPopup; - window.dismissRelatedLookupPopup = dismissRelatedLookupPopup; - window.showRelatedObjectPopup = showRelatedObjectPopup; - window.updateRelatedObjectLinks = updateRelatedObjectLinks; - window.dismissAddRelatedObjectPopup = dismissAddRelatedObjectPopup; - window.dismissChangeRelatedObjectPopup = dismissChangeRelatedObjectPopup; - window.dismissDeleteRelatedObjectPopup = dismissDeleteRelatedObjectPopup; - window.dismissChildPopups = dismissChildPopups; - window.relatedWindows = relatedWindows; - - // Kept for backward compatibility - window.showAddAnotherPopup = showRelatedObjectPopup; - window.dismissAddAnotherPopup = dismissAddRelatedObjectPopup; - - window.addEventListener('unload', function(evt) { - window.dismissChildPopups(); + } }); + } - $(document).ready(function() { - setPopupIndex(); - $("a[data-popup-opener]").on('click', function(event) { - event.preventDefault(); - opener.dismissRelatedLookupPopup(window, $(this).data("popup-opener")); - }); - $('body').on('click', '.related-widget-wrapper-link[data-popup="yes"]', function(e) { - e.preventDefault(); - if (this.href) { - const event = $.Event('django:show-related', {href: this.href}); - $(this).trigger(event); - if (!event.isDefaultPrevented()) { - showRelatedObjectPopup(this); - } - } - }); - $('body').on('change', '.related-widget-wrapper select', function(e) { - const event = $.Event('django:update-related'); - $(this).trigger(event); - if (!event.isDefaultPrevented()) { - updateRelatedObjectLinks(this); - } - }); - $('.related-widget-wrapper select').trigger('change'); - $('body').on('click', '.related-lookup', function(e) { - e.preventDefault(); - const event = $.Event('django:lookup-related'); - $(this).trigger(event); - if (!event.isDefaultPrevented()) { - showRelatedObjectLookupPopup(this); - } - }); + function setPopupIndex() { + if (document.getElementsByName("_popup").length > 0) { + const index = window.name.lastIndexOf("__") + 2; + popupIndex = parseInt(window.name.substring(index)); + } else { + popupIndex = 0; + } + } + + function addPopupIndex(name) { + return name + "__" + (popupIndex + 1); + } + + function removePopupIndex(name) { + return name.replace(new RegExp("__" + (popupIndex + 1) + "$"), ""); + } + + function showAdminPopup(triggeringLink, name_regexp, add_popup) { + const name = addPopupIndex(triggeringLink.id.replace(name_regexp, "")); + const href = new URL(triggeringLink.href); + if (add_popup) { + href.searchParams.set("_popup", 1); + } + const win = window.open( + href, + name, + "height=768,width=1024,resizable=yes,scrollbars=yes" + ); + relatedWindows.push(win); + win.focus(); + return false; + } + + function showRelatedObjectLookupPopup(triggeringLink) { + return showAdminPopup(triggeringLink, /^lookup_/, true); + } + + function dismissRelatedLookupPopup(win, chosenId) { + const name = removePopupIndex(win.name); + const elem = document.getElementById(name); + if (elem.classList.contains("vManyToManyRawIdAdminField") && elem.value) { + elem.value += "," + chosenId; + } else { + document.getElementById(name).value = chosenId; + } + const index = relatedWindows.indexOf(win); + if (index > -1) { + relatedWindows.splice(index, 1); + } + win.close(); + } + + function showRelatedObjectPopup(triggeringLink) { + return showAdminPopup(triggeringLink, /^(change|add|delete)_/, false); + } + + function updateRelatedObjectLinks(triggeringLink) { + const $this = $(triggeringLink); + // !CHANGED from original + // const siblings = $this.nextAll( + // ".view-related, .change-related, .delete-related" + // ); + + const siblings = $this + .closest(".related-widget-wrapper") + .find(".view-related, .change-related, .delete-related"); + + if (!siblings.length) { + return; + } + const value = $this.val(); + if (value) { + siblings.each(function () { + const elm = $(this); + elm.attr( + "href", + elm.attr("data-href-template").replace("__fk__", value) + ); + elm.removeAttr("aria-disabled"); + }); + } else { + siblings.removeAttr("href"); + siblings.attr("aria-disabled", true); + } + } + + function updateRelatedSelectsOptions( + currentSelect, + win, + objId, + newRepr, + newId, + skipIds = [] + ) { + // After create/edit a model from the options next to the current + // select (+ or :pencil:) update ForeignKey PK of the rest of selects + // in the page. + + const path = win.location.pathname; + // Extract the model from the popup url '...//add/' or + // '...///change/' depending the action (add or change). + const modelName = path.split("/")[path.split("/").length - (objId ? 4 : 3)]; + // Select elements with a specific model reference and context of "available-source". + const selectsRelated = document.querySelectorAll( + `[data-model-ref="${modelName}"] [data-context="available-source"]` + ); + + selectsRelated.forEach(function (select) { + if ( + currentSelect === select || + (skipIds && skipIds.includes(select.id)) + ) { + return; + } + + let option = select.querySelector(`option[value="${objId}"]`); + + if (!option) { + option = new Option(newRepr, newId); + select.options.add(option); + // Update SelectBox cache for related fields. + if ( + window.SelectBox !== undefined && + !SelectBox.cache[currentSelect.id] + ) { + SelectBox.add_to_cache(select.id, option); + SelectBox.redisplay(select.id); + } + return; + } + + option.textContent = newRepr; + option.value = newId; }); + } + + function dismissAddRelatedObjectPopup(win, newId, newRepr) { + const name = removePopupIndex(win.name); + const elem = document.getElementById(name); + if (elem) { + const elemName = elem.nodeName.toUpperCase(); + if (elemName === "SELECT") { + elem.options[elem.options.length] = new Option( + newRepr, + newId, + true, + true + ); + updateRelatedSelectsOptions(elem, win, null, newRepr, newId); + } else if (elemName === "INPUT") { + if ( + elem.classList.contains("vManyToManyRawIdAdminField") && + elem.value + ) { + elem.value += "," + newId; + } else { + elem.value = newId; + } + } + // Trigger a change event to update related links if required. + $(elem).trigger("change"); + } else { + const toId = name + "_to"; + const toElem = document.getElementById(toId); + const o = new Option(newRepr, newId); + SelectBox.add_to_cache(toId, o); + SelectBox.redisplay(toId); + if (toElem && toElem.nodeName.toUpperCase() === "SELECT") { + const skipIds = [name + "_from"]; + updateRelatedSelectsOptions(toElem, win, null, newRepr, newId, skipIds); + } + } + const index = relatedWindows.indexOf(win); + if (index > -1) { + relatedWindows.splice(index, 1); + } + win.close(); + } + + function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) { + const id = removePopupIndex(win.name.replace(/^edit_/, "")); + const selectsSelector = interpolate("#%s, #%s_from, #%s_to", [id, id, id]); + const selects = $(selectsSelector); + selects + .find("option") + .each(function () { + if (this.value === objId) { + this.textContent = newRepr; + this.value = newId; + } + }) + .trigger("change"); + updateRelatedSelectsOptions(selects[0], win, objId, newRepr, newId); + selects + .next() + .find(".select2-selection__rendered") + .each(function () { + // The element can have a clear button as a child. + // Use the lastChild to modify only the displayed value. + this.lastChild.textContent = newRepr; + this.title = newRepr; + }); + const index = relatedWindows.indexOf(win); + if (index > -1) { + relatedWindows.splice(index, 1); + } + win.close(); + } + + function dismissDeleteRelatedObjectPopup(win, objId) { + const id = removePopupIndex(win.name.replace(/^delete_/, "")); + const selectsSelector = interpolate("#%s, #%s_from, #%s_to", [id, id, id]); + const selects = $(selectsSelector); + selects + .find("option") + .each(function () { + if (this.value === objId) { + $(this).remove(); + } + }) + .trigger("change"); + const index = relatedWindows.indexOf(win); + if (index > -1) { + relatedWindows.splice(index, 1); + } + win.close(); + } + + window.showRelatedObjectLookupPopup = showRelatedObjectLookupPopup; + window.dismissRelatedLookupPopup = dismissRelatedLookupPopup; + window.showRelatedObjectPopup = showRelatedObjectPopup; + window.updateRelatedObjectLinks = updateRelatedObjectLinks; + window.dismissAddRelatedObjectPopup = dismissAddRelatedObjectPopup; + window.dismissChangeRelatedObjectPopup = dismissChangeRelatedObjectPopup; + window.dismissDeleteRelatedObjectPopup = dismissDeleteRelatedObjectPopup; + window.dismissChildPopups = dismissChildPopups; + + // Kept for backward compatibility + window.showAddAnotherPopup = showRelatedObjectPopup; + window.dismissAddAnotherPopup = dismissAddRelatedObjectPopup; + + window.addEventListener("unload", function (evt) { + window.dismissChildPopups(); + }); + + $(document).ready(function () { + setPopupIndex(); + $("a[data-popup-opener]").on("click", function (event) { + event.preventDefault(); + opener.dismissRelatedLookupPopup(window, $(this).data("popup-opener")); + }); + $("body").on( + "click", + '.related-widget-wrapper-link[data-popup="yes"]', + function (e) { + e.preventDefault(); + if (this.href) { + const event = $.Event("django:show-related", { href: this.href }); + $(this).trigger(event); + if (!event.isDefaultPrevented()) { + showRelatedObjectPopup(this); + } + } + } + ); + $("body").on("change", ".related-widget-wrapper select", function (e) { + const event = $.Event("django:update-related"); + $(this).trigger(event); + if (!event.isDefaultPrevented()) { + updateRelatedObjectLinks(this); + } + }); + $(".related-widget-wrapper select").trigger("change"); + $("body").on("click", ".related-lookup", function (e) { + e.preventDefault(); + const event = $.Event("django:lookup-related"); + $(this).trigger(event); + if (!event.isDefaultPrevented()) { + showRelatedObjectLookupPopup(this); + } + }); + }); } diff --git a/backend/staticfiles/admin/js/inlines.js b/backend/staticfiles/admin/js/inlines.js index cd3726cf..17b0d8fa 100644 --- a/backend/staticfiles/admin/js/inlines.js +++ b/backend/staticfiles/admin/js/inlines.js @@ -15,345 +15,485 @@ * Licensed under the New BSD License * See: https://opensource.org/licenses/bsd-license.php */ -'use strict'; +"use strict"; { - const $ = django.jQuery; - $.fn.formset = function(opts) { - const options = $.extend({}, $.fn.formset.defaults, opts); - const $this = $(this); - const $parent = $this.parent(); - const updateElementIndex = function(el, prefix, ndx) { - const id_regex = new RegExp("(" + prefix + "-(\\d+|__prefix__))"); - const replacement = prefix + "-" + ndx; - if ($(el).prop("for")) { - $(el).prop("for", $(el).prop("for").replace(id_regex, replacement)); - } - if (el.id) { - el.id = el.id.replace(id_regex, replacement); - } - if (el.name) { - el.name = el.name.replace(id_regex, replacement); - } - }; - const totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS").prop("autocomplete", "off"); - let nextIndex = parseInt(totalForms.val(), 10); - const maxForms = $("#id_" + options.prefix + "-MAX_NUM_FORMS").prop("autocomplete", "off"); - const minForms = $("#id_" + options.prefix + "-MIN_NUM_FORMS").prop("autocomplete", "off"); - let addButton; + const $ = django.jQuery; + $.fn.formset = function (opts) { + const options = $.extend({}, $.fn.formset.defaults, opts); + const $this = $(this); + const $parent = $this.parent(); + const updateElementIndex = function (el, prefix, ndx) { + const id_regex = new RegExp("(" + prefix + "-(\\d+|__prefix__))"); + const replacement = prefix + "-" + ndx; + if ($(el).prop("for")) { + $(el).prop("for", $(el).prop("for").replace(id_regex, replacement)); + } + if (el.id) { + el.id = el.id.replace(id_regex, replacement); + } + if (el.name) { + // !CHANGED from original + // el.name = el.name.replace(id_regex, replacement); + el.setAttribute("name", el.name.replace(id_regex, replacement)); + } + }; + const totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS").prop( + "autocomplete", + "off" + ); + let nextIndex = parseInt(totalForms.val(), 10); + const maxForms = $("#id_" + options.prefix + "-MAX_NUM_FORMS").prop( + "autocomplete", + "off" + ); + const minForms = $("#id_" + options.prefix + "-MIN_NUM_FORMS").prop( + "autocomplete", + "off" + ); + let addButton; - /** - * The "Add another MyModel" button below the inline forms. - */ - const addInlineAddButton = function() { - if (addButton === null) { - if ($this.prop("tagName") === "TR") { - // If forms are laid out as table rows, insert the - // "add" button in a new table row: - const numCols = $this.eq(-1).children().length; - $parent.append('' + options.addText + ""); - addButton = $parent.find("tr:last a"); - } else { - // Otherwise, insert it immediately after the last form: - $this.filter(":last").after('"); - addButton = $this.filter(":last").next().find("a"); - } - } - addButton.on('click', addInlineClickHandler); - }; - - const addInlineClickHandler = function(e) { - e.preventDefault(); - const template = $("#" + options.prefix + "-empty"); - const row = template.clone(true); - row.removeClass(options.emptyCssClass) - .addClass(options.formCssClass) - .attr("id", options.prefix + "-" + nextIndex); - addInlineDeleteButton(row); - row.find("*").each(function() { - updateElementIndex(this, options.prefix, totalForms.val()); - }); - // Insert the new form when it has been fully edited. - row.insertBefore($(template)); - // Update number of total forms. - $(totalForms).val(parseInt(totalForms.val(), 10) + 1); - nextIndex += 1; - // Hide the add button if there's a limit and it's been reached. - if ((maxForms.val() !== '') && (maxForms.val() - totalForms.val()) <= 0) { - addButton.parent().hide(); - } - // Show the remove buttons if there are more than min_num. - toggleDeleteButtonVisibility(row.closest('.inline-group')); - - // Pass the new form to the post-add callback, if provided. - if (options.added) { - options.added(row); - } - row.get(0).dispatchEvent(new CustomEvent("formset:added", { - bubbles: true, - detail: { - formsetName: options.prefix - } - })); - }; - - /** - * The "X" button that is part of every unsaved inline. - * (When saved, it is replaced with a "Delete" checkbox.) - */ - const addInlineDeleteButton = function(row) { - if (row.is("tr")) { - // If the forms are laid out in table rows, insert - // the remove button into the last table cell: - row.children(":last").append('"); - } else if (row.is("ul") || row.is("ol")) { - // If they're laid out as an ordered/unordered list, - // insert an
  • after the last list item: - row.append('
  • ' + options.deleteText + "
  • "); - } else { - // Otherwise, just insert the remove button as the - // last child element of the form's container: - row.children(":first").append('' + options.deleteText + ""); - } - // Add delete handler for each row. - row.find("a." + options.deleteCssClass).on('click', inlineDeleteHandler.bind(this)); - }; - - const inlineDeleteHandler = function(e1) { - e1.preventDefault(); - const deleteButton = $(e1.target); - const row = deleteButton.closest('.' + options.formCssClass); - const inlineGroup = row.closest('.inline-group'); - // Remove the parent form containing this button, - // and also remove the relevant row with non-field errors: - const prevRow = row.prev(); - if (prevRow.length && prevRow.hasClass('row-form-errors')) { - prevRow.remove(); - } - row.remove(); - nextIndex -= 1; - // Pass the deleted form to the post-delete callback, if provided. - if (options.removed) { - options.removed(row); - } - document.dispatchEvent(new CustomEvent("formset:removed", { - detail: { - formsetName: options.prefix - } - })); - // Update the TOTAL_FORMS form count. - const forms = $("." + options.formCssClass); - $("#id_" + options.prefix + "-TOTAL_FORMS").val(forms.length); - // Show add button again once below maximum number. - if ((maxForms.val() === '') || (maxForms.val() - forms.length) > 0) { - addButton.parent().show(); - } - // Hide the remove buttons if at min_num. - toggleDeleteButtonVisibility(inlineGroup); - // Also, update names and ids for all remaining form controls so - // they remain in sequence: - let i, formCount; - const updateElementCallback = function() { - updateElementIndex(this, options.prefix, i); - }; - for (i = 0, formCount = forms.length; i < formCount; i++) { - updateElementIndex($(forms).get(i), options.prefix, i); - $(forms.get(i)).find("*").each(updateElementCallback); - } - }; - - const toggleDeleteButtonVisibility = function(inlineGroup) { - if ((minForms.val() !== '') && (minForms.val() - totalForms.val()) >= 0) { - inlineGroup.find('.inline-deletelink').hide(); - } else { - inlineGroup.find('.inline-deletelink').show(); - } - }; - - $this.each(function(i) { - $(this).not("." + options.emptyCssClass).addClass(options.formCssClass); - }); - - // Create the delete buttons for all unsaved inlines: - $this.filter('.' + options.formCssClass + ':not(.has_original):not(.' + options.emptyCssClass + ')').each(function() { - addInlineDeleteButton($(this)); - }); - toggleDeleteButtonVisibility($this); - - // Create the add button, initially hidden. - addButton = options.addButton; - addInlineAddButton(); - - // Show the add button if allowed to add more items. - // Note that max_num = None translates to a blank string. - const showAddButton = maxForms.val() === '' || (maxForms.val() - totalForms.val()) > 0; - if ($this.length && showAddButton) { - addButton.parent().show(); + /** + * The "Add another MyModel" button below the inline forms. + */ + const addInlineAddButton = function () { + if (addButton === null) { + if ($this.prop("tagName") === "TR") { + // If forms are laid out as table rows, insert the + // "add" button in a new table row: + const numCols = $this.eq(-1).children().length; + $parent.append( + '' + + options.addText + + "" + ); + addButton = $parent.find("tr:last a"); } else { - addButton.parent().hide(); + // Otherwise, insert it immediately after the last form: + $this + .filter(":last") + .after( + '" + ); + addButton = $this.filter(":last").next().find("a"); + } + } + addButton.on("click", addInlineClickHandler); + }; + + const addInlineClickHandler = function (e) { + e.preventDefault(); + const template = $("#" + options.prefix + "-empty"); + const row = template.clone(true); + row + .removeClass(options.emptyCssClass) + .addClass(options.formCssClass) + .attr("id", options.prefix + "-" + nextIndex); + + addInlineDeleteButton(row); + row.find("*").each(function () { + updateElementIndex(this, options.prefix, totalForms.val()); + }); + + // Insert the new form when it has been fully edited. + // !CHANGED from original + if ($(template).parent().is("tbody")) { + row + .wrap('') + .parent() + .insertBefore($(template).parent()); + } else { + row.insertBefore($(template)); + } + + // Update number of total forms. + $(totalForms).val(parseInt(totalForms.val(), 10) + 1); + nextIndex += 1; + // Hide the add button if there's a limit and it's been reached. + if (maxForms.val() !== "" && maxForms.val() - totalForms.val() <= 0) { + addButton.parent().hide(); + } + // Show the remove buttons if there are more than min_num. + toggleDeleteButtonVisibility(row.closest(".inline-group")); + + // Pass the new form to the post-add callback, if provided. + if (options.added) { + options.added(row); + } + row.get(0).dispatchEvent( + new CustomEvent("formset:added", { + bubbles: true, + detail: { + formsetName: options.prefix, + }, + }) + ); + }; + + /** + * The "X" button that is part of every unsaved inline. + * (When saved, it is replaced with a "Delete" checkbox.) + */ + const addInlineDeleteButton = function (row) { + if (row.is("tr")) { + // If the forms are laid out in table rows, insert + // the remove button into the last table cell: + row + .children(":last") + .append( + '" + ); + } else if (row.is("ul") || row.is("ol")) { + // If they're laid out as an ordered/unordered list, + // insert an
  • after the last list item: + row.append( + '
  • ' + + options.deleteText + + "
  • " + ); + } else { + // Otherwise, just insert the remove button as the + // last child element of the form's container: + row + .children(":first") + .append( + '' + + options.deleteText + + "" + ); + } + // Add delete handler for each row. + row + .find("a." + options.deleteCssClass) + .on("click", inlineDeleteHandler.bind(this)); + }; + + const inlineDeleteHandler = function (e1) { + e1.preventDefault(); + const deleteButton = $(e1.target); + const row = deleteButton.closest("." + options.formCssClass); + const inlineGroup = row.closest(".inline-group"); + // Remove the parent form containing this button, + // and also remove the relevant row with non-field errors: + const prevRow = row.prev(); + if (prevRow.length && prevRow.hasClass("row-form-errors")) { + prevRow.remove(); + } + + // !CHANGED from original + if (deleteButton.parent().parent().parent().parent().is("tbody")) { + row.parent().remove(); + } else { + row.remove(); + } + nextIndex -= 1; + // Pass the deleted form to the post-delete callback, if provided. + if (options.removed) { + options.removed(row); + } + document.dispatchEvent( + new CustomEvent("formset:removed", { + detail: { + formsetName: options.prefix, + }, + }) + ); + // Update the TOTAL_FORMS form count. + const forms = $("." + options.formCssClass); + $("#id_" + options.prefix + "-TOTAL_FORMS").val(forms.length); + // Show add button again once below maximum number. + if (maxForms.val() === "" || maxForms.val() - forms.length > 0) { + addButton.parent().show(); + } + // Hide the remove buttons if at min_num. + toggleDeleteButtonVisibility(inlineGroup); + // Also, update names and ids for all remaining form controls so + // they remain in sequence: + let i, formCount; + const updateElementCallback = function () { + updateElementIndex(this, options.prefix, i); + }; + for (i = 0, formCount = forms.length; i < formCount; i++) { + updateElementIndex($(forms).get(i), options.prefix, i); + $(forms.get(i)).find("*").each(updateElementCallback); + } + }; + + const toggleDeleteButtonVisibility = function (inlineGroup) { + if (minForms.val() !== "" && minForms.val() - totalForms.val() >= 0) { + inlineGroup.find(".inline-deletelink").hide(); + } else { + inlineGroup.find(".inline-deletelink").show(); + } + }; + + // !CHANGED from original. Business logic for tabular inlines is different. + if ($this.parent().is("tbody")) { + $this + .parent() + .parent() + .find("tr.form-row") + .each(function (i) { + $(this) + .not("." + options.emptyCssClass) + .addClass(options.formCssClass); + }); + } else { + $this.each(function (i) { + $(this) + .not("." + options.emptyCssClass) + .addClass(options.formCssClass); + }); + } + + // Create the delete buttons for all unsaved inlines: + // !CHANGED from original, added parent() and used find() instead of filter() + $this + .parent() + .parent() + .find( + "." + + options.formCssClass + + ":not(.has_original):not(." + + options.emptyCssClass + + ")" + ) + .each(function () { + addInlineDeleteButton($(this)); + }); + toggleDeleteButtonVisibility($this); + + // Create the add button, initially hidden. + addButton = options.addButton; + addInlineAddButton(); + + // Show the add button if allowed to add more items. + // Note that max_num = None translates to a blank string. + const showAddButton = + maxForms.val() === "" || maxForms.val() - totalForms.val() > 0; + if ($this.length && showAddButton) { + addButton.parent().show(); + } else { + addButton.parent().hide(); + } + + return this; + }; + + /* Setup plugin defaults */ + $.fn.formset.defaults = { + prefix: "form", // The form prefix for your django formset + addText: "add another", // Text for the add link + deleteText: "remove", // Text for the delete link + addCssClass: "add-row", // CSS class applied to the add link + deleteCssClass: "delete-row", // CSS class applied to the delete link + emptyCssClass: "empty-row", // CSS class applied to the empty row + formCssClass: "dynamic-form", // CSS class applied to each form in a formset + added: null, // Function called each time a new form is added + removed: null, // Function called each time a form is deleted + addButton: null, // Existing add button to use + }; + + // Tabular inlines --------------------------------------------------------- + $.fn.tabularFormset = function (selector, options, callback = null) { + const $rows = $(this); + + const reinitDateTimeShortCuts = function () { + // Reinitialize the calendar and clock widgets by force + if (typeof DateTimeShortcuts !== "undefined") { + $(".datetimeshortcuts").remove(); + DateTimeShortcuts.init(); + } + }; + + const updateSelectFilter = function () { + // If any SelectFilter widgets are a part of the new form, + // instantiate a new SelectFilter instance for it. + if (typeof SelectFilter !== "undefined") { + $(".selectfilter").each(function (index, value) { + SelectFilter.init(value.id, this.dataset.fieldName, false); + }); + $(".selectfilterstacked").each(function (index, value) { + SelectFilter.init(value.id, this.dataset.fieldName, true); + }); + } + }; + + const initPrepopulatedFields = function (row) { + row.find(".prepopulated_field").each(function () { + const field = $(this), + input = field.find("input, select, textarea"), + dependency_list = input.data("dependency_list") || [], + dependencies = []; + $.each(dependency_list, function (i, field_name) { + dependencies.push( + "#" + + row + .find(".field-" + field_name) + .find("input, select, textarea") + .attr("id") + ); + }); + if (dependencies.length) { + input.prepopulate(dependencies, input.attr("maxlength")); + } + }); + }; + + $rows.formset({ + prefix: options.prefix, + addText: options.addText, + formCssClass: "dynamic-" + options.prefix, + deleteCssClass: "inline-deletelink", + deleteText: options.deleteText, + emptyCssClass: "empty-form", + added: function (row) { + initPrepopulatedFields(row); + reinitDateTimeShortCuts(); + updateSelectFilter(); + }, + addButton: options.addButton, + }); + + if (typeof callback === "function") { + callback(); + } + + return $rows; + }; + + // Stacked inlines --------------------------------------------------------- + $.fn.stackedFormset = function (selector, options, callback = null) { + const $rows = $(this); + const updateInlineLabel = function (row) { + $(selector) + .find(".inline_label") + .each(function (i) { + const count = i + 1; + $(this).html( + $(this) + .html() + .replace(/(#\d+)/g, "#" + count) + ); + }); + }; + + const reinitDateTimeShortCuts = function () { + // Reinitialize the calendar and clock widgets by force, yuck. + if (typeof DateTimeShortcuts !== "undefined") { + $(".datetimeshortcuts").remove(); + DateTimeShortcuts.init(); + } + }; + + const updateSelectFilter = function () { + // If any SelectFilter widgets were added, instantiate a new instance. + if (typeof SelectFilter !== "undefined") { + $(".selectfilter").each(function (index, value) { + SelectFilter.init(value.id, this.dataset.fieldName, false); + }); + $(".selectfilterstacked").each(function (index, value) { + SelectFilter.init(value.id, this.dataset.fieldName, true); + }); + } + }; + + const initPrepopulatedFields = function (row) { + row.find(".prepopulated_field").each(function () { + const field = $(this), + input = field.find("input, select, textarea"), + dependency_list = input.data("dependency_list") || [], + dependencies = []; + $.each(dependency_list, function (i, field_name) { + // Dependency in a fieldset. + let field_element = row.find(".form-row .field-" + field_name); + // Dependency without a fieldset. + if (!field_element.length) { + field_element = row.find(".form-row.field-" + field_name); + } + dependencies.push( + "#" + field_element.find("input, select, textarea").attr("id") + ); + }); + if (dependencies.length) { + input.prepopulate(dependencies, input.attr("maxlength")); + } + }); + }; + + $rows.formset({ + prefix: options.prefix, + addText: options.addText, + formCssClass: "dynamic-" + options.prefix, + deleteCssClass: "inline-deletelink", + deleteText: options.deleteText, + emptyCssClass: "empty-form", + removed: updateInlineLabel, + added: function (row) { + initPrepopulatedFields(row); + reinitDateTimeShortCuts(); + updateSelectFilter(); + updateInlineLabel(row); + }, + addButton: options.addButton, + }); + + if (typeof callback === "function") { + callback(); + } + + return $rows; + }; + + $(window).on("htmx:afterSettle", function (event) { + if (event.target.classList.contains("js-inline-admin-formset")) { + initInlines($(event.target), function () { + if (typeof DateTimeShortcuts !== "undefined") { + $(".datetimeshortcuts").remove(); + DateTimeShortcuts.init(); } - return this; - }; + $(event.target).find(".admin-autocomplete").djangoAdminSelect2(); + }); + } + }); - /* Setup plugin defaults */ - $.fn.formset.defaults = { - prefix: "form", // The form prefix for your django formset - addText: "add another", // Text for the add link - deleteText: "remove", // Text for the delete link - addCssClass: "add-row", // CSS class applied to the add link - deleteCssClass: "delete-row", // CSS class applied to the delete link - emptyCssClass: "empty-row", // CSS class applied to the empty row - formCssClass: "dynamic-form", // CSS class applied to each form in a formset - added: null, // Function called each time a new form is added - removed: null, // Function called each time a form is deleted - addButton: null // Existing add button to use - }; - - - // Tabular inlines --------------------------------------------------------- - $.fn.tabularFormset = function(selector, options) { - const $rows = $(this); - - const reinitDateTimeShortCuts = function() { - // Reinitialize the calendar and clock widgets by force - if (typeof DateTimeShortcuts !== "undefined") { - $(".datetimeshortcuts").remove(); - DateTimeShortcuts.init(); - } - }; - - const updateSelectFilter = function() { - // If any SelectFilter widgets are a part of the new form, - // instantiate a new SelectFilter instance for it. - if (typeof SelectFilter !== 'undefined') { - $('.selectfilter').each(function(index, value) { - SelectFilter.init(value.id, this.dataset.fieldName, false); - }); - $('.selectfilterstacked').each(function(index, value) { - SelectFilter.init(value.id, this.dataset.fieldName, true); - }); - } - }; - - const initPrepopulatedFields = function(row) { - row.find('.prepopulated_field').each(function() { - const field = $(this), - input = field.find('input, select, textarea'), - dependency_list = input.data('dependency_list') || [], - dependencies = []; - $.each(dependency_list, function(i, field_name) { - dependencies.push('#' + row.find('.field-' + field_name).find('input, select, textarea').attr('id')); - }); - if (dependencies.length) { - input.prepopulate(dependencies, input.attr('maxlength')); - } - }); - }; - - $rows.formset({ - prefix: options.prefix, - addText: options.addText, - formCssClass: "dynamic-" + options.prefix, - deleteCssClass: "inline-deletelink", - deleteText: options.deleteText, - emptyCssClass: "empty-form", - added: function(row) { - initPrepopulatedFields(row); - reinitDateTimeShortCuts(); - updateSelectFilter(); - }, - addButton: options.addButton - }); - - return $rows; - }; - - // Stacked inlines --------------------------------------------------------- - $.fn.stackedFormset = function(selector, options) { - const $rows = $(this); - const updateInlineLabel = function(row) { - $(selector).find(".inline_label").each(function(i) { - const count = i + 1; - $(this).html($(this).html().replace(/(#\d+)/g, "#" + count)); - }); - }; - - const reinitDateTimeShortCuts = function() { - // Reinitialize the calendar and clock widgets by force, yuck. - if (typeof DateTimeShortcuts !== "undefined") { - $(".datetimeshortcuts").remove(); - DateTimeShortcuts.init(); - } - }; - - const updateSelectFilter = function() { - // If any SelectFilter widgets were added, instantiate a new instance. - if (typeof SelectFilter !== "undefined") { - $(".selectfilter").each(function(index, value) { - SelectFilter.init(value.id, this.dataset.fieldName, false); - }); - $(".selectfilterstacked").each(function(index, value) { - SelectFilter.init(value.id, this.dataset.fieldName, true); - }); - } - }; - - const initPrepopulatedFields = function(row) { - row.find('.prepopulated_field').each(function() { - const field = $(this), - input = field.find('input, select, textarea'), - dependency_list = input.data('dependency_list') || [], - dependencies = []; - $.each(dependency_list, function(i, field_name) { - // Dependency in a fieldset. - let field_element = row.find('.form-row .field-' + field_name); - // Dependency without a fieldset. - if (!field_element.length) { - field_element = row.find('.form-row.field-' + field_name); - } - dependencies.push('#' + field_element.find('input, select, textarea').attr('id')); - }); - if (dependencies.length) { - input.prepopulate(dependencies, input.attr('maxlength')); - } - }); - }; - - $rows.formset({ - prefix: options.prefix, - addText: options.addText, - formCssClass: "dynamic-" + options.prefix, - deleteCssClass: "inline-deletelink", - deleteText: options.deleteText, - emptyCssClass: "empty-form", - removed: updateInlineLabel, - added: function(row) { - initPrepopulatedFields(row); - reinitDateTimeShortCuts(); - updateSelectFilter(); - updateInlineLabel(row); - }, - addButton: options.addButton - }); - - return $rows; - }; - - $(document).ready(function() { - $(".js-inline-admin-formset").each(function() { - const data = $(this).data(), - inlineOptions = data.inlineFormset; - let selector; - switch(data.inlineType) { - case "stacked": - selector = inlineOptions.name + "-group .inline-related"; - $(selector).stackedFormset(selector, inlineOptions.options); - break; - case "tabular": - selector = inlineOptions.name + "-group .tabular.inline-related tbody:first > tr.form-row"; - $(selector).tabularFormset(selector, inlineOptions.options); - break; - } - }); + $(document).ready(function () { + $(".js-inline-admin-formset").each(function () { + initInlines(this); }); + }); + + function initInlines(el, callback = null) { + const data = $(el).data(), + inlineOptions = data.inlineFormset; + let selector; + switch (data.inlineType) { + case "stacked": + selector = inlineOptions.name + "-group .inline-related"; + $(selector).stackedFormset(selector, inlineOptions.options, callback); + break; + case "tabular": + selector = + inlineOptions.name + + "-group .tabular.inline-related tbody:last > tr.form-row"; + $(selector).tabularFormset(selector, inlineOptions.options, callback); + break; + } + } } diff --git a/backend/staticfiles/unfold/css/simplebar/LICENSE b/backend/staticfiles/unfold/css/simplebar/LICENSE new file mode 100644 index 00000000..b206d0ff --- /dev/null +++ b/backend/staticfiles/unfold/css/simplebar/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Jonathan Nicol + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/backend/staticfiles/unfold/css/simplebar/simplebar.css b/backend/staticfiles/unfold/css/simplebar/simplebar.css new file mode 100644 index 00000000..2ff0d26e --- /dev/null +++ b/backend/staticfiles/unfold/css/simplebar/simplebar.css @@ -0,0 +1,230 @@ +[data-simplebar] { + position: relative; + flex-direction: column; + flex-wrap: wrap; + justify-content: flex-start; + align-content: flex-start; + align-items: flex-start; + } + + .simplebar-wrapper { + overflow: hidden; + width: inherit; + height: inherit; + max-width: inherit; + max-height: inherit; + } + + .simplebar-mask { + direction: inherit; + position: absolute; + overflow: hidden; + padding: 0; + margin: 0; + left: 0; + top: 0; + bottom: 0; + right: 0; + width: auto !important; + height: auto !important; + z-index: 0; + } + + .simplebar-offset { + direction: inherit !important; + box-sizing: inherit !important; + resize: none !important; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + padding: 0; + margin: 0; + -webkit-overflow-scrolling: touch; + } + + .simplebar-content-wrapper { + direction: inherit; + box-sizing: border-box !important; + position: relative; + display: block; + height: 100%; /* Required for horizontal native scrollbar to not appear if parent is taller than natural height */ + width: auto; + max-width: 100%; /* Not required for horizontal scroll to trigger */ + max-height: 100%; /* Needed for vertical scroll to trigger */ + overflow: auto; + scrollbar-width: none; + -ms-overflow-style: none; + } + + .simplebar-content-wrapper::-webkit-scrollbar, + .simplebar-hide-scrollbar::-webkit-scrollbar { + display: none; + width: 0; + height: 0; + } + + .simplebar-content:before, + .simplebar-content:after { + content: ' '; + display: table; + } + + .simplebar-placeholder { + max-height: 100%; + max-width: 100%; + width: 100%; + pointer-events: none; + } + + .simplebar-height-auto-observer-wrapper { + box-sizing: inherit !important; + height: 100%; + width: 100%; + max-width: 1px; + position: relative; + float: left; + max-height: 1px; + overflow: hidden; + z-index: -1; + padding: 0; + margin: 0; + pointer-events: none; + flex-grow: inherit; + flex-shrink: 0; + flex-basis: 0; + } + + .simplebar-height-auto-observer { + box-sizing: inherit; + display: block; + opacity: 0; + position: absolute; + top: 0; + left: 0; + height: 1000%; + width: 1000%; + min-height: 1px; + min-width: 1px; + overflow: hidden; + pointer-events: none; + z-index: -1; + } + + .simplebar-track { + z-index: 1; + position: absolute; + right: 0; + bottom: 0; + pointer-events: none; + overflow: hidden; + } + + [data-simplebar].simplebar-dragging { + pointer-events: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + + [data-simplebar].simplebar-dragging .simplebar-content { + pointer-events: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + + [data-simplebar].simplebar-dragging .simplebar-track { + pointer-events: all; + } + + .simplebar-scrollbar { + position: absolute; + left: 0; + right: 0; + min-height: 10px; + } + + .simplebar-scrollbar:before { + position: absolute; + content: ''; + background: black; + border-radius: 7px; + left: 2px; + right: 2px; + opacity: 0; + transition: opacity 0.2s 0.5s linear; + } + + .simplebar-scrollbar.simplebar-visible:before { + opacity: 0.5; + transition-delay: 0s; + transition-duration: 0s; + } + + .simplebar-track.simplebar-vertical { + top: 0; + width: 11px; + } + + .simplebar-scrollbar:before { + top: 2px; + bottom: 2px; + left: 2px; + right: 2px; + } + + .simplebar-track.simplebar-horizontal { + left: 0; + height: 11px; + } + + .simplebar-track.simplebar-horizontal .simplebar-scrollbar { + right: auto; + left: 0; + top: 0; + bottom: 0; + min-height: 0; + min-width: 10px; + width: auto; + } + + /* Rtl support */ + [data-simplebar-direction='rtl'] .simplebar-track.simplebar-vertical { + right: auto; + left: 0; + } + + .simplebar-dummy-scrollbar-size { + direction: rtl; + position: fixed; + opacity: 0; + visibility: hidden; + height: 500px; + width: 500px; + overflow-y: hidden; + overflow-x: scroll; + -ms-overflow-style: scrollbar !important; + } + + .simplebar-dummy-scrollbar-size > div { + width: 200%; + height: 200%; + margin: 10px 0; + } + + .simplebar-hide-scrollbar { + position: fixed; + left: 0; + visibility: hidden; + overflow-y: scroll; + scrollbar-width: none; + -ms-overflow-style: none; + } diff --git a/backend/staticfiles/unfold/css/styles.css b/backend/staticfiles/unfold/css/styles.css new file mode 100644 index 00000000..b8b42082 --- /dev/null +++ b/backend/staticfiles/unfold/css/styles.css @@ -0,0 +1,2 @@ +/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */ +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-text-shadow-color:initial;--tw-text-shadow-alpha:100%;--tw-content:""}}}@layer theme{:root,:host{--font-sans:"Inter",sans-serif;--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-orange-100:oklch(95.4% .038 75.164);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-700:oklch(55.3% .195 38.402);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-600:oklch(66.6% .179 58.318);--color-yellow-200:oklch(94.5% .129 101.54);--color-green-100:oklch(96.2% .044 156.743);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height:calc(1.5/1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--leading-normal:1.5;--leading-relaxed:1.625;--radius-xs:.125rem;--radius-md:.375rem;--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--blur-xs:4px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-primary-50:var(--color-primary-50);--color-primary-100:var(--color-primary-100);--color-primary-200:var(--color-primary-200);--color-primary-300:var(--color-primary-300);--color-primary-400:var(--color-primary-400);--color-primary-500:var(--color-primary-500);--color-primary-600:var(--color-primary-600);--color-primary-700:var(--color-primary-700);--color-primary-800:var(--color-primary-800);--color-primary-900:var(--color-primary-900);--color-primary-950:var(--color-primary-950);--color-base-50:var(--color-base-50);--color-base-100:var(--color-base-100);--color-base-200:var(--color-base-200);--color-base-300:var(--color-base-300);--color-base-400:var(--color-base-400);--color-base-500:var(--color-base-500);--color-base-600:var(--color-base-600);--color-base-700:var(--color-base-700);--color-base-800:var(--color-base-800);--color-base-900:var(--color-base-900);--color-base-950:var(--color-base-950);--color-font-subtle-light:var(--color-font-subtle-light);--color-font-subtle-dark:var(--color-font-subtle-dark);--color-font-default-light:var(--color-font-default-light);--color-font-default-dark:var(--color-font-default-dark);--color-font-important-light:var(--color-font-important-light);--color-font-important-dark:var(--color-font-important-dark)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*,:after,:before,::backdrop{border-color:var(--color-base-200,currentColor)}::file-selector-button{border-color:var(--color-base-200,currentColor)}}@layer components;@layer utilities{.\@container{container-type:inline-size}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.-top-1\/2{top:-50%}.top-0{top:calc(var(--spacing)*0)}.top-1\/2{top:50%}.top-3\!{top:calc(var(--spacing)*3)!important}.top-7{top:calc(var(--spacing)*7)}.top-10{top:calc(var(--spacing)*10)}.top-\[73px\]{top:73px}.-right-1\/2{right:-50%}.-right-2{right:calc(var(--spacing)*-2)}.right-0{right:calc(var(--spacing)*0)}.right-1\/2{right:50%}.right-3{right:calc(var(--spacing)*3)}.-bottom-1\/2{bottom:-50%}.-bottom-px{bottom:-1px}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-1\/2{bottom:50%}.bottom-\[73px\]{bottom:73px}.-left-1\/2{left:-50%}.-left-6{left:calc(var(--spacing)*-6)}.left-0{left:calc(var(--spacing)*0)}.left-1\/2{left:50%}.left-3{left:calc(var(--spacing)*3)}.left-12{left:calc(var(--spacing)*12)}.left-\[65px\]{left:65px}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-100{z-index:100}.z-\[50\]{z-index:50}.z-\[1000\]{z-index:1000}.order-last{order:9999}.col-span-1{grid-column:span 1/span 1}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-4{grid-column:span 4/span 4}.col-span-5{grid-column:span 5/span 5}.col-span-6{grid-column:span 6/span 6}.col-span-7{grid-column:span 7/span 7}.col-span-8{grid-column:span 8/span 8}.col-span-9{grid-column:span 9/span 9}.col-span-10{grid-column:span 10/span 10}.col-span-11{grid-column:span 11/span 11}.col-span-12{grid-column:span 12/span 12}.col-span-13{grid-column:span 13/span 13}.col-span-14{grid-column:span 14/span 14}.col-span-15{grid-column:span 15/span 15}.col-span-16{grid-column:span 16/span 16}.float-left{float:left}.float-right{float:right}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-m-0{margin:calc(var(--spacing)*0)}.-m-1{margin:calc(var(--spacing)*-1)}.-m-2{margin:calc(var(--spacing)*-2)}.-m-3{margin:calc(var(--spacing)*-3)}.-m-4{margin:calc(var(--spacing)*-4)}.-m-5{margin:calc(var(--spacing)*-5)}.-m-6{margin:calc(var(--spacing)*-6)}.-m-7{margin:calc(var(--spacing)*-7)}.-m-8{margin:calc(var(--spacing)*-8)}.-m-9{margin:calc(var(--spacing)*-9)}.-m-10{margin:calc(var(--spacing)*-10)}.-m-11{margin:calc(var(--spacing)*-11)}.-m-12{margin:calc(var(--spacing)*-12)}.-m-13{margin:calc(var(--spacing)*-13)}.-m-14{margin:calc(var(--spacing)*-14)}.-m-15{margin:calc(var(--spacing)*-15)}.-m-16{margin:calc(var(--spacing)*-16)}.-m-17{margin:calc(var(--spacing)*-17)}.-m-18{margin:calc(var(--spacing)*-18)}.-m-19{margin:calc(var(--spacing)*-19)}.-m-20{margin:calc(var(--spacing)*-20)}.-m-21{margin:calc(var(--spacing)*-21)}.-m-22{margin:calc(var(--spacing)*-22)}.-m-23{margin:calc(var(--spacing)*-23)}.-m-24{margin:calc(var(--spacing)*-24)}.m-0{margin:calc(var(--spacing)*0)}.m-0\!{margin:calc(var(--spacing)*0)!important}.m-1{margin:calc(var(--spacing)*1)}.m-2{margin:calc(var(--spacing)*2)}.m-3{margin:calc(var(--spacing)*3)}.m-4{margin:calc(var(--spacing)*4)}.m-5{margin:calc(var(--spacing)*5)}.m-6{margin:calc(var(--spacing)*6)}.m-7{margin:calc(var(--spacing)*7)}.m-8{margin:calc(var(--spacing)*8)}.m-9{margin:calc(var(--spacing)*9)}.m-10{margin:calc(var(--spacing)*10)}.m-11{margin:calc(var(--spacing)*11)}.m-12{margin:calc(var(--spacing)*12)}.m-13{margin:calc(var(--spacing)*13)}.m-14{margin:calc(var(--spacing)*14)}.m-15{margin:calc(var(--spacing)*15)}.m-16{margin:calc(var(--spacing)*16)}.m-17{margin:calc(var(--spacing)*17)}.m-18{margin:calc(var(--spacing)*18)}.m-19{margin:calc(var(--spacing)*19)}.m-20{margin:calc(var(--spacing)*20)}.m-21{margin:calc(var(--spacing)*21)}.m-22{margin:calc(var(--spacing)*22)}.m-23{margin:calc(var(--spacing)*23)}.m-24{margin:calc(var(--spacing)*24)}.-mx-0{margin-inline:calc(var(--spacing)*0)}.-mx-1{margin-inline:calc(var(--spacing)*-1)}.-mx-2{margin-inline:calc(var(--spacing)*-2)}.-mx-3{margin-inline:calc(var(--spacing)*-3)}.-mx-4{margin-inline:calc(var(--spacing)*-4)}.-mx-5{margin-inline:calc(var(--spacing)*-5)}.-mx-6{margin-inline:calc(var(--spacing)*-6)}.-mx-7{margin-inline:calc(var(--spacing)*-7)}.-mx-8{margin-inline:calc(var(--spacing)*-8)}.-mx-9{margin-inline:calc(var(--spacing)*-9)}.-mx-10{margin-inline:calc(var(--spacing)*-10)}.-mx-11{margin-inline:calc(var(--spacing)*-11)}.-mx-12{margin-inline:calc(var(--spacing)*-12)}.-mx-13{margin-inline:calc(var(--spacing)*-13)}.-mx-14{margin-inline:calc(var(--spacing)*-14)}.-mx-15{margin-inline:calc(var(--spacing)*-15)}.-mx-16{margin-inline:calc(var(--spacing)*-16)}.-mx-17{margin-inline:calc(var(--spacing)*-17)}.-mx-18{margin-inline:calc(var(--spacing)*-18)}.-mx-19{margin-inline:calc(var(--spacing)*-19)}.-mx-20{margin-inline:calc(var(--spacing)*-20)}.-mx-21{margin-inline:calc(var(--spacing)*-21)}.-mx-22{margin-inline:calc(var(--spacing)*-22)}.-mx-23{margin-inline:calc(var(--spacing)*-23)}.-mx-24{margin-inline:calc(var(--spacing)*-24)}.mx-0{margin-inline:calc(var(--spacing)*0)}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-3{margin-inline:calc(var(--spacing)*3)}.mx-4{margin-inline:calc(var(--spacing)*4)}.mx-5{margin-inline:calc(var(--spacing)*5)}.mx-6{margin-inline:calc(var(--spacing)*6)}.mx-7{margin-inline:calc(var(--spacing)*7)}.mx-8{margin-inline:calc(var(--spacing)*8)}.mx-9{margin-inline:calc(var(--spacing)*9)}.mx-10{margin-inline:calc(var(--spacing)*10)}.mx-11{margin-inline:calc(var(--spacing)*11)}.mx-12{margin-inline:calc(var(--spacing)*12)}.mx-13{margin-inline:calc(var(--spacing)*13)}.mx-14{margin-inline:calc(var(--spacing)*14)}.mx-15{margin-inline:calc(var(--spacing)*15)}.mx-16{margin-inline:calc(var(--spacing)*16)}.mx-17{margin-inline:calc(var(--spacing)*17)}.mx-18{margin-inline:calc(var(--spacing)*18)}.mx-19{margin-inline:calc(var(--spacing)*19)}.mx-20{margin-inline:calc(var(--spacing)*20)}.mx-21{margin-inline:calc(var(--spacing)*21)}.mx-22{margin-inline:calc(var(--spacing)*22)}.mx-23{margin-inline:calc(var(--spacing)*23)}.mx-24{margin-inline:calc(var(--spacing)*24)}.mx-auto{margin-inline:auto}.-my-0{margin-block:calc(var(--spacing)*0)}.-my-1{margin-block:calc(var(--spacing)*-1)}.-my-2{margin-block:calc(var(--spacing)*-2)}.-my-3{margin-block:calc(var(--spacing)*-3)}.-my-4{margin-block:calc(var(--spacing)*-4)}.-my-5{margin-block:calc(var(--spacing)*-5)}.-my-6{margin-block:calc(var(--spacing)*-6)}.-my-7{margin-block:calc(var(--spacing)*-7)}.-my-8{margin-block:calc(var(--spacing)*-8)}.-my-9{margin-block:calc(var(--spacing)*-9)}.-my-10{margin-block:calc(var(--spacing)*-10)}.-my-11{margin-block:calc(var(--spacing)*-11)}.-my-12{margin-block:calc(var(--spacing)*-12)}.-my-13{margin-block:calc(var(--spacing)*-13)}.-my-14{margin-block:calc(var(--spacing)*-14)}.-my-15{margin-block:calc(var(--spacing)*-15)}.-my-16{margin-block:calc(var(--spacing)*-16)}.-my-17{margin-block:calc(var(--spacing)*-17)}.-my-18{margin-block:calc(var(--spacing)*-18)}.-my-19{margin-block:calc(var(--spacing)*-19)}.-my-20{margin-block:calc(var(--spacing)*-20)}.-my-21{margin-block:calc(var(--spacing)*-21)}.-my-22{margin-block:calc(var(--spacing)*-22)}.-my-23{margin-block:calc(var(--spacing)*-23)}.-my-24{margin-block:calc(var(--spacing)*-24)}.my-0{margin-block:calc(var(--spacing)*0)}.my-1{margin-block:calc(var(--spacing)*1)}.my-2{margin-block:calc(var(--spacing)*2)}.my-3{margin-block:calc(var(--spacing)*3)}.my-4{margin-block:calc(var(--spacing)*4)}.my-5{margin-block:calc(var(--spacing)*5)}.my-6{margin-block:calc(var(--spacing)*6)}.my-7{margin-block:calc(var(--spacing)*7)}.my-8{margin-block:calc(var(--spacing)*8)}.my-9{margin-block:calc(var(--spacing)*9)}.my-10{margin-block:calc(var(--spacing)*10)}.my-11{margin-block:calc(var(--spacing)*11)}.my-12{margin-block:calc(var(--spacing)*12)}.my-13{margin-block:calc(var(--spacing)*13)}.my-14{margin-block:calc(var(--spacing)*14)}.my-15{margin-block:calc(var(--spacing)*15)}.my-16{margin-block:calc(var(--spacing)*16)}.my-17{margin-block:calc(var(--spacing)*17)}.my-18{margin-block:calc(var(--spacing)*18)}.my-19{margin-block:calc(var(--spacing)*19)}.my-20{margin-block:calc(var(--spacing)*20)}.my-21{margin-block:calc(var(--spacing)*21)}.my-22{margin-block:calc(var(--spacing)*22)}.my-23{margin-block:calc(var(--spacing)*23)}.my-24{margin-block:calc(var(--spacing)*24)}.prose-sm{font-size:.875rem;line-height:1.71429}.prose-sm :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em}.prose-sm :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.888889em;margin-bottom:.888889em;font-size:1.28571em;line-height:1.55556}.prose-sm :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.33333em;margin-bottom:1.33333em;padding-inline-start:1.11111em}.prose-sm :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:.8em;font-size:2.14286em;line-height:1.2}.prose-sm :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.6em;margin-bottom:.8em;font-size:1.42857em;line-height:1.4}.prose-sm :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.55556em;margin-bottom:.444444em;font-size:1.28571em;line-height:1.55556}.prose-sm :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.42857em;margin-bottom:.571429em;line-height:1.42857}.prose-sm :where(img):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.prose-sm :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.prose-sm :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.142857em;padding-inline-end:.357143em;padding-bottom:.142857em;border-radius:.3125rem;padding-inline-start:.357143em;font-size:.857143em}.prose-sm :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.857143em}.prose-sm :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.prose-sm :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.888889em}.prose-sm :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.666667em;padding-inline-end:1em;padding-bottom:.666667em;border-radius:.25rem;margin-top:1.66667em;margin-bottom:1.66667em;padding-inline-start:1em;font-size:.857143em;line-height:1.66667}.prose-sm :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em;padding-inline-start:1.57143em}.prose-sm :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.285714em;margin-bottom:.285714em}.prose-sm :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.428571em}.prose-sm :where(.prose-sm>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.571429em;margin-bottom:.571429em}.prose-sm :where(.prose-sm>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.prose-sm :where(.prose-sm>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.14286em}.prose-sm :where(.prose-sm>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.prose-sm :where(.prose-sm>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.14286em}.prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.571429em;margin-bottom:.571429em}.prose-sm :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em}.prose-sm :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.prose-sm :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.285714em;padding-inline-start:1.57143em}.prose-sm :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2.85714em;margin-bottom:2.85714em}.prose-sm :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.857143em;line-height:1.5}.prose-sm :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.666667em;padding-inline-start:1em}.prose-sm :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.666667em;padding-inline-end:1em;padding-bottom:.666667em;padding-inline-start:1em}.prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.prose-sm :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.666667em;font-size:.857143em;line-height:1.33333}.prose-sm :where(.prose-sm>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(.prose-sm>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.-mt-0{margin-top:calc(var(--spacing)*0)}.-mt-1{margin-top:calc(var(--spacing)*-1)}.-mt-2{margin-top:calc(var(--spacing)*-2)}.-mt-3{margin-top:calc(var(--spacing)*-3)}.-mt-4{margin-top:calc(var(--spacing)*-4)}.-mt-5{margin-top:calc(var(--spacing)*-5)}.-mt-6{margin-top:calc(var(--spacing)*-6)}.-mt-7{margin-top:calc(var(--spacing)*-7)}.-mt-8{margin-top:calc(var(--spacing)*-8)}.-mt-9{margin-top:calc(var(--spacing)*-9)}.-mt-10{margin-top:calc(var(--spacing)*-10)}.-mt-11{margin-top:calc(var(--spacing)*-11)}.-mt-12{margin-top:calc(var(--spacing)*-12)}.-mt-13{margin-top:calc(var(--spacing)*-13)}.-mt-14{margin-top:calc(var(--spacing)*-14)}.-mt-15{margin-top:calc(var(--spacing)*-15)}.-mt-16{margin-top:calc(var(--spacing)*-16)}.-mt-17{margin-top:calc(var(--spacing)*-17)}.-mt-18{margin-top:calc(var(--spacing)*-18)}.-mt-19{margin-top:calc(var(--spacing)*-19)}.-mt-20{margin-top:calc(var(--spacing)*-20)}.-mt-21{margin-top:calc(var(--spacing)*-21)}.-mt-22{margin-top:calc(var(--spacing)*-22)}.-mt-23{margin-top:calc(var(--spacing)*-23)}.-mt-24{margin-top:calc(var(--spacing)*-24)}.mt-0{margin-top:calc(var(--spacing)*0)}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-5{margin-top:calc(var(--spacing)*5)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-7{margin-top:calc(var(--spacing)*7)}.mt-8{margin-top:calc(var(--spacing)*8)}.mt-9{margin-top:calc(var(--spacing)*9)}.mt-10{margin-top:calc(var(--spacing)*10)}.mt-11{margin-top:calc(var(--spacing)*11)}.mt-12{margin-top:calc(var(--spacing)*12)}.mt-13{margin-top:calc(var(--spacing)*13)}.mt-14{margin-top:calc(var(--spacing)*14)}.mt-15{margin-top:calc(var(--spacing)*15)}.mt-16{margin-top:calc(var(--spacing)*16)}.mt-17{margin-top:calc(var(--spacing)*17)}.mt-18{margin-top:calc(var(--spacing)*18)}.mt-19{margin-top:calc(var(--spacing)*19)}.mt-20{margin-top:calc(var(--spacing)*20)}.mt-21{margin-top:calc(var(--spacing)*21)}.mt-22{margin-top:calc(var(--spacing)*22)}.mt-23{margin-top:calc(var(--spacing)*23)}.mt-24{margin-top:calc(var(--spacing)*24)}.mt-auto{margin-top:auto}.-mr-0{margin-right:calc(var(--spacing)*0)}.-mr-1{margin-right:calc(var(--spacing)*-1)}.-mr-2{margin-right:calc(var(--spacing)*-2)}.-mr-3{margin-right:calc(var(--spacing)*-3)}.-mr-4{margin-right:calc(var(--spacing)*-4)}.-mr-5{margin-right:calc(var(--spacing)*-5)}.-mr-6{margin-right:calc(var(--spacing)*-6)}.-mr-7{margin-right:calc(var(--spacing)*-7)}.-mr-8{margin-right:calc(var(--spacing)*-8)}.-mr-9{margin-right:calc(var(--spacing)*-9)}.-mr-10{margin-right:calc(var(--spacing)*-10)}.-mr-11{margin-right:calc(var(--spacing)*-11)}.-mr-12{margin-right:calc(var(--spacing)*-12)}.-mr-13{margin-right:calc(var(--spacing)*-13)}.-mr-14{margin-right:calc(var(--spacing)*-14)}.-mr-15{margin-right:calc(var(--spacing)*-15)}.-mr-16{margin-right:calc(var(--spacing)*-16)}.-mr-17{margin-right:calc(var(--spacing)*-17)}.-mr-18{margin-right:calc(var(--spacing)*-18)}.-mr-19{margin-right:calc(var(--spacing)*-19)}.-mr-20{margin-right:calc(var(--spacing)*-20)}.-mr-21{margin-right:calc(var(--spacing)*-21)}.-mr-22{margin-right:calc(var(--spacing)*-22)}.-mr-23{margin-right:calc(var(--spacing)*-23)}.-mr-24{margin-right:calc(var(--spacing)*-24)}.-mr-px{margin-right:-1px}.mr-0{margin-right:calc(var(--spacing)*0)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-2{margin-right:calc(var(--spacing)*2)}.mr-3{margin-right:calc(var(--spacing)*3)}.mr-4{margin-right:calc(var(--spacing)*4)}.mr-5{margin-right:calc(var(--spacing)*5)}.mr-6{margin-right:calc(var(--spacing)*6)}.mr-7{margin-right:calc(var(--spacing)*7)}.mr-8{margin-right:calc(var(--spacing)*8)}.mr-9{margin-right:calc(var(--spacing)*9)}.mr-10{margin-right:calc(var(--spacing)*10)}.mr-11{margin-right:calc(var(--spacing)*11)}.mr-12{margin-right:calc(var(--spacing)*12)}.mr-13{margin-right:calc(var(--spacing)*13)}.mr-14{margin-right:calc(var(--spacing)*14)}.mr-15{margin-right:calc(var(--spacing)*15)}.mr-16{margin-right:calc(var(--spacing)*16)}.mr-17{margin-right:calc(var(--spacing)*17)}.mr-18{margin-right:calc(var(--spacing)*18)}.mr-19{margin-right:calc(var(--spacing)*19)}.mr-20{margin-right:calc(var(--spacing)*20)}.mr-21{margin-right:calc(var(--spacing)*21)}.mr-22{margin-right:calc(var(--spacing)*22)}.mr-23{margin-right:calc(var(--spacing)*23)}.mr-24{margin-right:calc(var(--spacing)*24)}.mr-\[12px\]{margin-right:12px}.mr-auto{margin-right:auto}.-mb-0{margin-bottom:calc(var(--spacing)*0)}.-mb-1{margin-bottom:calc(var(--spacing)*-1)}.-mb-2{margin-bottom:calc(var(--spacing)*-2)}.-mb-3{margin-bottom:calc(var(--spacing)*-3)}.-mb-4{margin-bottom:calc(var(--spacing)*-4)}.-mb-5{margin-bottom:calc(var(--spacing)*-5)}.-mb-6{margin-bottom:calc(var(--spacing)*-6)}.-mb-7{margin-bottom:calc(var(--spacing)*-7)}.-mb-8{margin-bottom:calc(var(--spacing)*-8)}.-mb-9{margin-bottom:calc(var(--spacing)*-9)}.-mb-10{margin-bottom:calc(var(--spacing)*-10)}.-mb-11{margin-bottom:calc(var(--spacing)*-11)}.-mb-12{margin-bottom:calc(var(--spacing)*-12)}.-mb-13{margin-bottom:calc(var(--spacing)*-13)}.-mb-14{margin-bottom:calc(var(--spacing)*-14)}.-mb-15{margin-bottom:calc(var(--spacing)*-15)}.-mb-16{margin-bottom:calc(var(--spacing)*-16)}.-mb-17{margin-bottom:calc(var(--spacing)*-17)}.-mb-18{margin-bottom:calc(var(--spacing)*-18)}.-mb-19{margin-bottom:calc(var(--spacing)*-19)}.-mb-20{margin-bottom:calc(var(--spacing)*-20)}.-mb-21{margin-bottom:calc(var(--spacing)*-21)}.-mb-22{margin-bottom:calc(var(--spacing)*-22)}.-mb-23{margin-bottom:calc(var(--spacing)*-23)}.-mb-24{margin-bottom:calc(var(--spacing)*-24)}.mb-0{margin-bottom:calc(var(--spacing)*0)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-2\.5{margin-bottom:calc(var(--spacing)*2.5)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-5{margin-bottom:calc(var(--spacing)*5)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-7{margin-bottom:calc(var(--spacing)*7)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.mb-9{margin-bottom:calc(var(--spacing)*9)}.mb-10{margin-bottom:calc(var(--spacing)*10)}.mb-11{margin-bottom:calc(var(--spacing)*11)}.mb-12{margin-bottom:calc(var(--spacing)*12)}.mb-13{margin-bottom:calc(var(--spacing)*13)}.mb-14{margin-bottom:calc(var(--spacing)*14)}.mb-15{margin-bottom:calc(var(--spacing)*15)}.mb-16{margin-bottom:calc(var(--spacing)*16)}.mb-17{margin-bottom:calc(var(--spacing)*17)}.mb-18{margin-bottom:calc(var(--spacing)*18)}.mb-19{margin-bottom:calc(var(--spacing)*19)}.mb-20{margin-bottom:calc(var(--spacing)*20)}.mb-21{margin-bottom:calc(var(--spacing)*21)}.mb-22{margin-bottom:calc(var(--spacing)*22)}.mb-23{margin-bottom:calc(var(--spacing)*23)}.mb-24{margin-bottom:calc(var(--spacing)*24)}.-ml-0{margin-left:calc(var(--spacing)*0)}.-ml-1{margin-left:calc(var(--spacing)*-1)}.-ml-2{margin-left:calc(var(--spacing)*-2)}.-ml-3{margin-left:calc(var(--spacing)*-3)}.-ml-4{margin-left:calc(var(--spacing)*-4)}.-ml-5{margin-left:calc(var(--spacing)*-5)}.-ml-6{margin-left:calc(var(--spacing)*-6)}.-ml-7{margin-left:calc(var(--spacing)*-7)}.-ml-8{margin-left:calc(var(--spacing)*-8)}.-ml-9{margin-left:calc(var(--spacing)*-9)}.-ml-10{margin-left:calc(var(--spacing)*-10)}.-ml-11{margin-left:calc(var(--spacing)*-11)}.-ml-12{margin-left:calc(var(--spacing)*-12)}.-ml-13{margin-left:calc(var(--spacing)*-13)}.-ml-14{margin-left:calc(var(--spacing)*-14)}.-ml-15{margin-left:calc(var(--spacing)*-15)}.-ml-16{margin-left:calc(var(--spacing)*-16)}.-ml-17{margin-left:calc(var(--spacing)*-17)}.-ml-18{margin-left:calc(var(--spacing)*-18)}.-ml-19{margin-left:calc(var(--spacing)*-19)}.-ml-20{margin-left:calc(var(--spacing)*-20)}.-ml-21{margin-left:calc(var(--spacing)*-21)}.-ml-22{margin-left:calc(var(--spacing)*-22)}.-ml-23{margin-left:calc(var(--spacing)*-23)}.-ml-24{margin-left:calc(var(--spacing)*-24)}.ml-0{margin-left:calc(var(--spacing)*0)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-3{margin-left:calc(var(--spacing)*3)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-5{margin-left:calc(var(--spacing)*5)}.ml-6{margin-left:calc(var(--spacing)*6)}.ml-7{margin-left:calc(var(--spacing)*7)}.ml-8{margin-left:calc(var(--spacing)*8)}.ml-9{margin-left:calc(var(--spacing)*9)}.ml-10{margin-left:calc(var(--spacing)*10)}.ml-11{margin-left:calc(var(--spacing)*11)}.ml-12{margin-left:calc(var(--spacing)*12)}.ml-13{margin-left:calc(var(--spacing)*13)}.ml-14{margin-left:calc(var(--spacing)*14)}.ml-15{margin-left:calc(var(--spacing)*15)}.ml-16{margin-left:calc(var(--spacing)*16)}.ml-17{margin-left:calc(var(--spacing)*17)}.ml-18{margin-left:calc(var(--spacing)*18)}.ml-19{margin-left:calc(var(--spacing)*19)}.ml-20{margin-left:calc(var(--spacing)*20)}.ml-21{margin-left:calc(var(--spacing)*21)}.ml-22{margin-left:calc(var(--spacing)*22)}.ml-23{margin-left:calc(var(--spacing)*23)}.ml-24{margin-left:calc(var(--spacing)*24)}.ml-auto{margin-left:auto}.material-symbols-outlined{letter-spacing:normal;text-transform:none;white-space:nowrap;word-wrap:normal;-moz-font-feature-settings:"liga";-moz-osx-font-smoothing:grayscale;direction:ltr;font-family:Material Symbols Outlined;font-size:18px;font-style:normal;font-weight:400;line-height:1;display:inline-block}.\!hidden{display:none!important}.block{display:block}.block\!{display:block!important}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.hidden\!{display:none!important}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.field-sizing-content{field-sizing:content;field-sizing:content}.aspect-square{aspect-ratio:1}.size-full{width:100%;height:100%}.h-0{height:calc(var(--spacing)*0)}.h-1{height:calc(var(--spacing)*1)}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-2{height:calc(var(--spacing)*2)}.h-3{height:calc(var(--spacing)*3)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9\.5{height:calc(var(--spacing)*9.5)}.h-12{height:calc(var(--spacing)*12)}.h-16{height:calc(var(--spacing)*16)}.h-24{height:calc(var(--spacing)*24)}.h-72{height:calc(var(--spacing)*72)}.h-\[16px\]{height:16px}.h-\[18px\]{height:18px}.h-\[38px\]{height:38px}.h-\[55px\]{height:55px}.h-\[64px\]{height:64px}.h-\[65px\]{height:65px}.h-\[66px\]{height:66px}.h-full{height:100%}.h-px{height:1px}.max-h-\[30px\]{max-height:30px}.max-h-screen{max-height:100vh}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-1{min-height:calc(var(--spacing)*1)}.min-h-2{min-height:calc(var(--spacing)*2)}.min-h-3{min-height:calc(var(--spacing)*3)}.min-h-4{min-height:calc(var(--spacing)*4)}.min-h-5{min-height:calc(var(--spacing)*5)}.min-h-6{min-height:calc(var(--spacing)*6)}.min-h-7{min-height:calc(var(--spacing)*7)}.min-h-8{min-height:calc(var(--spacing)*8)}.min-h-\[38px\]{min-height:38px}.min-h-\[62\.5px\]{min-height:62.5px}.min-h-\[64px\]{min-height:64px}.min-h-screen{min-height:100vh}.w-0{width:calc(var(--spacing)*0)}.w-0\.5{width:calc(var(--spacing)*.5)}.w-1{width:calc(var(--spacing)*1)}.w-1\/2{width:50%}.w-1\/3{width:33.3333%}.w-1\/4{width:25%}.w-1\/5{width:20%}.w-1\/6{width:16.6667%}.w-1\/7{width:14.2857%}.w-2{width:calc(var(--spacing)*2)}.w-2\/3{width:66.6667%}.w-2\/4{width:50%}.w-2\/5{width:40%}.w-2\/6{width:33.3333%}.w-2\/7{width:28.5714%}.w-3{width:calc(var(--spacing)*3)}.w-3\/4{width:75%}.w-3\/5{width:60%}.w-3\/6{width:50%}.w-3\/7{width:42.8571%}.w-4{width:calc(var(--spacing)*4)}.w-4\/5{width:80%}.w-4\/6{width:66.6667%}.w-4\/7{width:57.1429%}.w-5{width:calc(var(--spacing)*5)}.w-5\/6{width:83.3333%}.w-5\/7{width:71.4286%}.w-6{width:calc(var(--spacing)*6)}.w-6\/7{width:85.7143%}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-16{width:calc(var(--spacing)*16)}.w-24{width:calc(var(--spacing)*24)}.w-32{width:calc(var(--spacing)*32)}.w-40{width:calc(var(--spacing)*40)}.w-48{width:calc(var(--spacing)*48)}.w-52{width:calc(var(--spacing)*52)}.w-80{width:calc(var(--spacing)*80)}.w-\[0px\]{width:0}.w-\[16px\]{width:16px}.w-\[18px\]{width:18px}.w-\[38px\]{width:38px}.w-\[65px\]\!{width:65px!important}.w-\[264px\]{width:264px}.w-\[288px\]{width:288px}.w-full{width:100%}.w-px{width:1px}.w-screen{width:100vw}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-8{max-width:calc(var(--spacing)*8)}.max-w-48{max-width:calc(var(--spacing)*48)}.max-w-full{max-width:100%}.max-w-none{max-width:none}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-1{min-width:calc(var(--spacing)*1)}.min-w-2{min-width:calc(var(--spacing)*2)}.min-w-3{min-width:calc(var(--spacing)*3)}.min-w-4{min-width:calc(var(--spacing)*4)}.min-w-5{min-width:calc(var(--spacing)*5)}.min-w-6{min-width:calc(var(--spacing)*6)}.min-w-7{min-width:calc(var(--spacing)*7)}.min-w-8{min-width:calc(var(--spacing)*8)}.min-w-20{min-width:calc(var(--spacing)*20)}.min-w-32{min-width:calc(var(--spacing)*32)}.min-w-52{min-width:calc(var(--spacing)*52)}.min-w-56{min-width:calc(var(--spacing)*56)}.min-w-72{min-width:calc(var(--spacing)*72)}.min-w-\[18px\]{min-width:18px}.min-w-\[38px\]{min-width:38px}.flex-none{flex:none}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.basis-1\/2{flex-basis:50%}.basis-1\/3{flex-basis:33.3333%}.table-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.border-separate{border-collapse:separate}.border-spacing-none{border-spacing:0}.-translate-x-1\/2{--tw-translate-x:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-x-1\/3{--tw-translate-x:calc(calc(1/3*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-1\/2{--tw-translate-x:calc(1/2*100%);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-1\/2{--tw-translate-y:calc(1/2*100%);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-full{--tw-translate-y:100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.-rotate-90{rotate:-90deg}.-rotate-90\!{rotate:-90deg!important}.rotate-0{rotate:none}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.transform\!{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)!important}.animate-spin{animation:var(--animate-spin)}.cursor-help{cursor:help}.cursor-move{cursor:move}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.appearance-none{appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-13{grid-template-columns:repeat(13,minmax(0,1fr))}.grid-cols-14{grid-template-columns:repeat(14,minmax(0,1fr))}.grid-cols-15{grid-template-columns:repeat(15,minmax(0,1fr))}.grid-cols-16{grid-template-columns:repeat(16,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-5{gap:calc(var(--spacing)*5)}.gap-6{gap:calc(var(--spacing)*6)}.gap-7{gap:calc(var(--spacing)*7)}.gap-8{gap:calc(var(--spacing)*8)}.gap-9{gap:calc(var(--spacing)*9)}.gap-10{gap:calc(var(--spacing)*10)}.gap-11{gap:calc(var(--spacing)*11)}.gap-12{gap:calc(var(--spacing)*12)}.gap-13{gap:calc(var(--spacing)*13)}.gap-14{gap:calc(var(--spacing)*14)}.gap-15{gap:calc(var(--spacing)*15)}.gap-16{gap:calc(var(--spacing)*16)}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}.self-center{align-self:center}.self-end{align-self:flex-end}.self-stretch{align-self:stretch}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.\!rounded-full{border-radius:3.40282e38px!important}.rounded{border-radius:.25rem}.rounded-\[4px\]{border-radius:4px}.rounded-default{border-radius:var(--border-radius,6px)}.rounded-full{border-radius:3.40282e38px}.rounded-md{border-radius:var(--radius-md)}.rounded-xs{border-radius:var(--radius-xs)}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-t-default{border-top-left-radius:var(--border-radius,6px);border-top-right-radius:var(--border-radius,6px)}.rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-l-default{border-top-left-radius:var(--border-radius,6px);border-bottom-left-radius:var(--border-radius,6px)}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-r-default{border-top-right-radius:var(--border-radius,6px);border-bottom-right-radius:var(--border-radius,6px)}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-b-default{border-bottom-right-radius:var(--border-radius,6px);border-bottom-left-radius:var(--border-radius,6px)}.rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.border{border-style:var(--tw-border-style);border-width:1px}.border\!{border-style:var(--tw-border-style)!important;border-width:1px!important}.border-0{border-style:var(--tw-border-style);border-width:0}.border-0\!{border-style:var(--tw-border-style)!important;border-width:0!important}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.border-t-0\!{border-top-style:var(--tw-border-style)!important;border-top-width:0!important}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-r-0{border-right-style:var(--tw-border-style);border-right-width:0}.border-r-2{border-right-style:var(--tw-border-style);border-right-width:2px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-0{border-left-style:var(--tw-border-style);border-left-width:0}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-base-50{border-color:var(--color-base-50)}.border-base-100{border-color:var(--color-base-100)}.border-base-200{border-color:var(--color-base-200)}.border-base-200\!{border-color:var(--color-base-200)!important}.border-base-300{border-color:var(--color-base-300)}.border-base-400,.border-base-400\/10{border-color:var(--color-base-400)}@supports (color:color-mix(in lab, red, red)){.border-base-400\/10{border-color:color-mix(in oklab,var(--color-base-400)10%,transparent)}}.border-base-500{border-color:var(--color-base-500)}.border-base-600{border-color:var(--color-base-600)}.border-base-700{border-color:var(--color-base-700)}.border-base-800{border-color:var(--color-base-800)}.border-base-900{border-color:var(--color-base-900)}.border-base-950{border-color:var(--color-base-950)}.border-blue-200{border-color:var(--color-blue-200)}.border-blue-700{border-color:var(--color-blue-700)}.border-green-700{border-color:var(--color-green-700)}.border-orange-700{border-color:var(--color-orange-700)}.border-primary-600{border-color:var(--color-primary-600)}.border-primary-700{border-color:var(--color-primary-700)}.border-red-200{border-color:var(--color-red-200)}.border-red-700{border-color:var(--color-red-700)}.border-transparent{border-color:#0000}.border-white\/40{border-color:#fff6}@supports (color:color-mix(in lab, red, red)){.border-white\/40{border-color:color-mix(in oklab,var(--color-white)40%,transparent)}}.\!bg-primary-50{background-color:var(--color-primary-50)!important}.\!bg-primary-100{background-color:var(--color-primary-100)!important}.\!bg-primary-200{background-color:var(--color-primary-200)!important}.\!bg-primary-300{background-color:var(--color-primary-300)!important}.\!bg-primary-400{background-color:var(--color-primary-400)!important}.\!bg-primary-500{background-color:var(--color-primary-500)!important}.\!bg-primary-600{background-color:var(--color-primary-600)!important}.\!bg-primary-700{background-color:var(--color-primary-700)!important}.\!bg-primary-800{background-color:var(--color-primary-800)!important}.\!bg-primary-900{background-color:var(--color-primary-900)!important}.\!bg-primary-950{background-color:var(--color-primary-950)!important}.bg-amber-100{background-color:var(--color-amber-100)}.bg-base-50{background-color:var(--color-base-50)}.bg-base-100{background-color:var(--color-base-100)}.bg-base-200,.bg-base-200\/10{background-color:var(--color-base-200)}@supports (color:color-mix(in lab, red, red)){.bg-base-200\/10{background-color:color-mix(in oklab,var(--color-base-200)10%,transparent)}}.bg-base-300{background-color:var(--color-base-300)}.bg-base-400{background-color:var(--color-base-400)}.bg-base-500{background-color:var(--color-base-500)}.bg-base-600{background-color:var(--color-base-600)}.bg-base-700{background-color:var(--color-base-700)}.bg-base-800{background-color:var(--color-base-800)}.bg-base-900,.bg-base-900\/80{background-color:var(--color-base-900)}@supports (color:color-mix(in lab, red, red)){.bg-base-900\/80{background-color:color-mix(in oklab,var(--color-base-900)80%,transparent)}}.bg-base-950{background-color:var(--color-base-950)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-500{background-color:var(--color-green-500)}.bg-green-600{background-color:var(--color-green-600)}.bg-orange-100{background-color:var(--color-orange-100)}.bg-orange-500{background-color:var(--color-orange-500)}.bg-orange-600{background-color:var(--color-orange-600)}.bg-primary-50{background-color:var(--color-primary-50)}.bg-primary-100{background-color:var(--color-primary-100)}.bg-primary-200{background-color:var(--color-primary-200)}.bg-primary-300{background-color:var(--color-primary-300)}.bg-primary-400{background-color:var(--color-primary-400)}.bg-primary-500{background-color:var(--color-primary-500)}.bg-primary-600{background-color:var(--color-primary-600)}.bg-primary-700{background-color:var(--color-primary-700)}.bg-primary-800{background-color:var(--color-primary-800)}.bg-primary-900{background-color:var(--color-primary-900)}.bg-primary-950{background-color:var(--color-primary-950)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-600{background-color:var(--color-red-600)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-white\!{background-color:var(--color-white)!important}.bg-white\/20{background-color:#fff3}@supports (color:color-mix(in lab, red, red)){.bg-white\/20{background-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.bg-white\/80{background-color:#fffc}@supports (color:color-mix(in lab, red, red)){.bg-white\/80{background-color:color-mix(in oklab,var(--color-white)80%,transparent)}}.bg-white\/\[\.06\]{background-color:#ffffff0f}@supports (color:color-mix(in lab, red, red)){.bg-white\/\[\.06\]{background-color:color-mix(in oklab,var(--color-white)6%,transparent)}}.bg-linear-to-b{--tw-gradient-position:to bottom}@supports (background-image:linear-gradient(in lab, red, red)){.bg-linear-to-b{--tw-gradient-position:to bottom in oklab}}.bg-linear-to-b{background-image:linear-gradient(var(--tw-gradient-stops))}.bg-linear-to-bl{--tw-gradient-position:to bottom left}@supports (background-image:linear-gradient(in lab, red, red)){.bg-linear-to-bl{--tw-gradient-position:to bottom left in oklab}}.bg-linear-to-bl{background-image:linear-gradient(var(--tw-gradient-stops))}.bg-linear-to-br{--tw-gradient-position:to bottom right}@supports (background-image:linear-gradient(in lab, red, red)){.bg-linear-to-br{--tw-gradient-position:to bottom right in oklab}}.bg-linear-to-br{background-image:linear-gradient(var(--tw-gradient-stops))}.bg-linear-to-l{--tw-gradient-position:to left}@supports (background-image:linear-gradient(in lab, red, red)){.bg-linear-to-l{--tw-gradient-position:to left in oklab}}.bg-linear-to-l{background-image:linear-gradient(var(--tw-gradient-stops))}.bg-linear-to-r{--tw-gradient-position:to right}@supports (background-image:linear-gradient(in lab, red, red)){.bg-linear-to-r{--tw-gradient-position:to right in oklab}}.bg-linear-to-r{background-image:linear-gradient(var(--tw-gradient-stops))}.bg-linear-to-t{--tw-gradient-position:to top}@supports (background-image:linear-gradient(in lab, red, red)){.bg-linear-to-t{--tw-gradient-position:to top in oklab}}.bg-linear-to-t{background-image:linear-gradient(var(--tw-gradient-stops))}.bg-linear-to-tl{--tw-gradient-position:to top left}@supports (background-image:linear-gradient(in lab, red, red)){.bg-linear-to-tl{--tw-gradient-position:to top left in oklab}}.bg-linear-to-tl{background-image:linear-gradient(var(--tw-gradient-stops))}.bg-linear-to-tr{--tw-gradient-position:to top right}@supports (background-image:linear-gradient(in lab, red, red)){.bg-linear-to-tr{--tw-gradient-position:to top right in oklab}}.bg-linear-to-tr{background-image:linear-gradient(var(--tw-gradient-stops))}.bg-none{background-image:none}.from-base-50{--tw-gradient-from:var(--color-base-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-base-100{--tw-gradient-from:var(--color-base-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-base-200{--tw-gradient-from:var(--color-base-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-base-300{--tw-gradient-from:var(--color-base-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-base-400{--tw-gradient-from:var(--color-base-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-base-500{--tw-gradient-from:var(--color-base-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-base-600{--tw-gradient-from:var(--color-base-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-base-700{--tw-gradient-from:var(--color-base-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-base-800{--tw-gradient-from:var(--color-base-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-base-900{--tw-gradient-from:var(--color-base-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-base-950{--tw-gradient-from:var(--color-base-950);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-primary-50{--tw-gradient-from:var(--color-primary-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-primary-100{--tw-gradient-from:var(--color-primary-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-primary-200{--tw-gradient-from:var(--color-primary-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-primary-300{--tw-gradient-from:var(--color-primary-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-primary-400{--tw-gradient-from:var(--color-primary-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-primary-500{--tw-gradient-from:var(--color-primary-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-primary-600{--tw-gradient-from:var(--color-primary-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-primary-700{--tw-gradient-from:var(--color-primary-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-primary-800{--tw-gradient-from:var(--color-primary-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-primary-900{--tw-gradient-from:var(--color-primary-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-primary-950{--tw-gradient-from:var(--color-primary-950);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-white{--tw-gradient-from:var(--color-white);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-base-50{--tw-gradient-to:var(--color-base-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-base-100{--tw-gradient-to:var(--color-base-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-base-200{--tw-gradient-to:var(--color-base-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-base-300{--tw-gradient-to:var(--color-base-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-base-400{--tw-gradient-to:var(--color-base-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-base-500{--tw-gradient-to:var(--color-base-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-base-600{--tw-gradient-to:var(--color-base-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-base-700{--tw-gradient-to:var(--color-base-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-base-800{--tw-gradient-to:var(--color-base-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-base-900{--tw-gradient-to:var(--color-base-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-base-950{--tw-gradient-to:var(--color-base-950);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-primary-50{--tw-gradient-to:var(--color-primary-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-primary-100{--tw-gradient-to:var(--color-primary-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-primary-200{--tw-gradient-to:var(--color-primary-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-primary-300{--tw-gradient-to:var(--color-primary-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-primary-400{--tw-gradient-to:var(--color-primary-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-primary-500{--tw-gradient-to:var(--color-primary-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-primary-600{--tw-gradient-to:var(--color-primary-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-primary-700{--tw-gradient-to:var(--color-primary-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-primary-800{--tw-gradient-to:var(--color-primary-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-primary-900{--tw-gradient-to:var(--color-primary-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-primary-950{--tw-gradient-to:var(--color-primary-950);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-white{--tw-gradient-to:var(--color-white);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.bg-contain{background-size:contain}.bg-cover{background-size:cover}.bg-center{background-position:50%}.bg-no-repeat{background-repeat:no-repeat}.object-cover{object-fit:cover}.p-0{padding:calc(var(--spacing)*0)}.p-0\!{padding:calc(var(--spacing)*0)!important}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-5{padding:calc(var(--spacing)*5)}.p-6{padding:calc(var(--spacing)*6)}.p-7{padding:calc(var(--spacing)*7)}.p-8{padding:calc(var(--spacing)*8)}.p-9{padding:calc(var(--spacing)*9)}.p-10{padding:calc(var(--spacing)*10)}.p-11{padding:calc(var(--spacing)*11)}.p-12{padding:calc(var(--spacing)*12)}.p-13{padding:calc(var(--spacing)*13)}.p-14{padding:calc(var(--spacing)*14)}.p-15{padding:calc(var(--spacing)*15)}.p-16{padding:calc(var(--spacing)*16)}.p-17{padding:calc(var(--spacing)*17)}.p-18{padding:calc(var(--spacing)*18)}.p-19{padding:calc(var(--spacing)*19)}.p-20{padding:calc(var(--spacing)*20)}.p-21{padding:calc(var(--spacing)*21)}.p-22{padding:calc(var(--spacing)*22)}.p-23{padding:calc(var(--spacing)*23)}.p-24{padding:calc(var(--spacing)*24)}.\!px-0{padding-inline:calc(var(--spacing)*0)!important}.px-0{padding-inline:calc(var(--spacing)*0)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-3\.5{padding-inline:calc(var(--spacing)*3.5)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-7{padding-inline:calc(var(--spacing)*7)}.px-8{padding-inline:calc(var(--spacing)*8)}.px-9{padding-inline:calc(var(--spacing)*9)}.px-10{padding-inline:calc(var(--spacing)*10)}.px-11{padding-inline:calc(var(--spacing)*11)}.px-12{padding-inline:calc(var(--spacing)*12)}.px-13{padding-inline:calc(var(--spacing)*13)}.px-14{padding-inline:calc(var(--spacing)*14)}.px-15{padding-inline:calc(var(--spacing)*15)}.px-16{padding-inline:calc(var(--spacing)*16)}.px-17{padding-inline:calc(var(--spacing)*17)}.px-18{padding-inline:calc(var(--spacing)*18)}.px-19{padding-inline:calc(var(--spacing)*19)}.px-20{padding-inline:calc(var(--spacing)*20)}.px-21{padding-inline:calc(var(--spacing)*21)}.px-22{padding-inline:calc(var(--spacing)*22)}.px-23{padding-inline:calc(var(--spacing)*23)}.px-24{padding-inline:calc(var(--spacing)*24)}.px-px{padding-inline:1px}.py-0{padding-block:calc(var(--spacing)*0)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-4\.5{padding-block:calc(var(--spacing)*4.5)}.py-5{padding-block:calc(var(--spacing)*5)}.py-6{padding-block:calc(var(--spacing)*6)}.py-7{padding-block:calc(var(--spacing)*7)}.py-8{padding-block:calc(var(--spacing)*8)}.py-9{padding-block:calc(var(--spacing)*9)}.py-10{padding-block:calc(var(--spacing)*10)}.py-11{padding-block:calc(var(--spacing)*11)}.py-12{padding-block:calc(var(--spacing)*12)}.py-13{padding-block:calc(var(--spacing)*13)}.py-14{padding-block:calc(var(--spacing)*14)}.py-15{padding-block:calc(var(--spacing)*15)}.py-16{padding-block:calc(var(--spacing)*16)}.py-17{padding-block:calc(var(--spacing)*17)}.py-18{padding-block:calc(var(--spacing)*18)}.py-19{padding-block:calc(var(--spacing)*19)}.py-20{padding-block:calc(var(--spacing)*20)}.py-21{padding-block:calc(var(--spacing)*21)}.py-22{padding-block:calc(var(--spacing)*22)}.py-23{padding-block:calc(var(--spacing)*23)}.py-24{padding-block:calc(var(--spacing)*24)}.py-\[5px\]{padding-block:5px}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-2\.5{padding-top:calc(var(--spacing)*2.5)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-5{padding-top:calc(var(--spacing)*5)}.pt-6{padding-top:calc(var(--spacing)*6)}.pt-7{padding-top:calc(var(--spacing)*7)}.pt-8{padding-top:calc(var(--spacing)*8)}.pt-9{padding-top:calc(var(--spacing)*9)}.pt-10{padding-top:calc(var(--spacing)*10)}.pt-11{padding-top:calc(var(--spacing)*11)}.pt-12{padding-top:calc(var(--spacing)*12)}.pt-13{padding-top:calc(var(--spacing)*13)}.pt-14{padding-top:calc(var(--spacing)*14)}.pt-15{padding-top:calc(var(--spacing)*15)}.pt-16{padding-top:calc(var(--spacing)*16)}.pt-17{padding-top:calc(var(--spacing)*17)}.pt-18{padding-top:calc(var(--spacing)*18)}.pt-19{padding-top:calc(var(--spacing)*19)}.pt-20{padding-top:calc(var(--spacing)*20)}.pt-21{padding-top:calc(var(--spacing)*21)}.pt-22{padding-top:calc(var(--spacing)*22)}.pt-23{padding-top:calc(var(--spacing)*23)}.pt-24{padding-top:calc(var(--spacing)*24)}.pr-0{padding-right:calc(var(--spacing)*0)}.pr-1{padding-right:calc(var(--spacing)*1)}.pr-2{padding-right:calc(var(--spacing)*2)}.pr-3{padding-right:calc(var(--spacing)*3)}.pr-4{padding-right:calc(var(--spacing)*4)}.pr-5{padding-right:calc(var(--spacing)*5)}.pr-6{padding-right:calc(var(--spacing)*6)}.pr-7{padding-right:calc(var(--spacing)*7)}.pr-8{padding-right:calc(var(--spacing)*8)}.pr-8\!{padding-right:calc(var(--spacing)*8)!important}.pr-9{padding-right:calc(var(--spacing)*9)}.pr-10{padding-right:calc(var(--spacing)*10)}.pr-11{padding-right:calc(var(--spacing)*11)}.pr-12{padding-right:calc(var(--spacing)*12)}.pr-13{padding-right:calc(var(--spacing)*13)}.pr-14{padding-right:calc(var(--spacing)*14)}.pr-15{padding-right:calc(var(--spacing)*15)}.pr-16{padding-right:calc(var(--spacing)*16)}.pr-17{padding-right:calc(var(--spacing)*17)}.pr-18{padding-right:calc(var(--spacing)*18)}.pr-19{padding-right:calc(var(--spacing)*19)}.pr-20{padding-right:calc(var(--spacing)*20)}.pr-21{padding-right:calc(var(--spacing)*21)}.pr-22{padding-right:calc(var(--spacing)*22)}.pr-23{padding-right:calc(var(--spacing)*23)}.pr-24{padding-right:calc(var(--spacing)*24)}.pb-0{padding-bottom:calc(var(--spacing)*0)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-2\.5{padding-bottom:calc(var(--spacing)*2.5)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pb-5{padding-bottom:calc(var(--spacing)*5)}.pb-6{padding-bottom:calc(var(--spacing)*6)}.pb-7{padding-bottom:calc(var(--spacing)*7)}.pb-8{padding-bottom:calc(var(--spacing)*8)}.pb-9{padding-bottom:calc(var(--spacing)*9)}.pb-10{padding-bottom:calc(var(--spacing)*10)}.pb-11{padding-bottom:calc(var(--spacing)*11)}.pb-12{padding-bottom:calc(var(--spacing)*12)}.pb-13{padding-bottom:calc(var(--spacing)*13)}.pb-14{padding-bottom:calc(var(--spacing)*14)}.pb-15{padding-bottom:calc(var(--spacing)*15)}.pb-16{padding-bottom:calc(var(--spacing)*16)}.pb-17{padding-bottom:calc(var(--spacing)*17)}.pb-18{padding-bottom:calc(var(--spacing)*18)}.pb-19{padding-bottom:calc(var(--spacing)*19)}.pb-20{padding-bottom:calc(var(--spacing)*20)}.pb-21{padding-bottom:calc(var(--spacing)*21)}.pb-22{padding-bottom:calc(var(--spacing)*22)}.pb-23{padding-bottom:calc(var(--spacing)*23)}.pb-24{padding-bottom:calc(var(--spacing)*24)}.pl-0{padding-left:calc(var(--spacing)*0)}.pl-1{padding-left:calc(var(--spacing)*1)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-3{padding-left:calc(var(--spacing)*3)}.pl-4{padding-left:calc(var(--spacing)*4)}.pl-5{padding-left:calc(var(--spacing)*5)}.pl-6{padding-left:calc(var(--spacing)*6)}.pl-7{padding-left:calc(var(--spacing)*7)}.pl-8{padding-left:calc(var(--spacing)*8)}.pl-9{padding-left:calc(var(--spacing)*9)}.pl-10{padding-left:calc(var(--spacing)*10)}.pl-11{padding-left:calc(var(--spacing)*11)}.pl-12{padding-left:calc(var(--spacing)*12)}.pl-13{padding-left:calc(var(--spacing)*13)}.pl-14{padding-left:calc(var(--spacing)*14)}.pl-15{padding-left:calc(var(--spacing)*15)}.pl-16{padding-left:calc(var(--spacing)*16)}.pl-17{padding-left:calc(var(--spacing)*17)}.pl-18{padding-left:calc(var(--spacing)*18)}.pl-19{padding-left:calc(var(--spacing)*19)}.pl-20{padding-left:calc(var(--spacing)*20)}.pl-21{padding-left:calc(var(--spacing)*21)}.pl-22{padding-left:calc(var(--spacing)*22)}.pl-23{padding-left:calc(var(--spacing)*23)}.pl-24{padding-left:calc(var(--spacing)*24)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.align-text-top{vertical-align:text-top}.align-top{vertical-align:top}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-5xl\!{font-size:var(--text-5xl)!important;line-height:var(--tw-leading,var(--text-5xl--line-height))!important}.text-6xl\!{font-size:var(--text-6xl)!important;line-height:var(--tw-leading,var(--text-6xl--line-height))!important}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.md-16{font-size:16px}.md-18{font-size:18px}.text-\[11px\]{font-size:11px}.text-\[15px\]{font-size:15px}.\!leading-\[38px\]{--tw-leading:38px!important;line-height:38px!important}.leading-5{--tw-leading:calc(var(--spacing)*5);line-height:calc(var(--spacing)*5)}.leading-6{--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}.leading-7\!{--tw-leading:calc(var(--spacing)*7)!important;line-height:calc(var(--spacing)*7)!important}.leading-\[18px\]{--tw-leading:18px;line-height:18px}.leading-\[36px\]{--tw-leading:36px;line-height:36px}.leading-\[38px\]{--tw-leading:38px;line-height:38px}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.break-words{overflow-wrap:break-word}.text-ellipsis{text-overflow:ellipsis}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.text-default{color:var(--color-font-default-light)}@media not print{.text-default:where(.dark,.dark *){color:var(--color-font-default-dark)}}.text-important{color:var(--color-font-important-light)}@media not print{.text-important:where(.dark,.dark *){color:var(--color-font-important-dark)}}.text-subtle{color:var(--color-font-subtle-light)}@media not print{.text-subtle:where(.dark,.dark *){color:var(--color-font-subtle-dark)}}.text-amber-600{color:var(--color-amber-600)}.text-base-50{color:var(--color-base-50)}.text-base-100{color:var(--color-base-100)}.text-base-200{color:var(--color-base-200)}.text-base-300{color:var(--color-base-300)}.text-base-400{color:var(--color-base-400)}.text-base-500{color:var(--color-base-500)}.text-base-600{color:var(--color-base-600)}.text-base-700{color:var(--color-base-700)}.text-base-800{color:var(--color-base-800)}.text-base-900{color:var(--color-base-900)}.text-base-950{color:var(--color-base-950)}.text-blue-500{color:var(--color-blue-500)}.text-blue-700{color:var(--color-blue-700)}.text-font-default-light{color:var(--color-font-default-light)}.text-font-important-light{color:var(--color-font-important-light)}.text-font-important-light\!{color:var(--color-font-important-light)!important}.text-font-subtle-light{color:var(--color-font-subtle-light)}.text-green-700{color:var(--color-green-700)}.text-orange-700{color:var(--color-orange-700)}.text-primary-600{color:var(--color-primary-600)}.text-primary-700{color:var(--color-primary-700)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.italic{font-style:italic}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-base-400::placeholder{color:var(--color-base-400)}.placeholder-font-subtle-light::placeholder{color:var(--color-font-subtle-light)}.opacity-0{opacity:0}.opacity-50{opacity:.5}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-base-500\/20{--tw-shadow-color:var(--color-base-500)}@supports (color:color-mix(in lab, red, red)){.shadow-base-500\/20{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-base-500)20%,transparent)var(--tw-shadow-alpha),transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter\!{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)!important}.backdrop-blur-xs{--tw-backdrop-blur:blur(var(--blur-xs));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-75{--tw-duration:75ms;transition-duration:75ms}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.select-none{-webkit-user-select:none;user-select:none}.text-shadow-xs{text-shadow:0px 1px 1px var(--tw-text-shadow-color,#0003)}:is(.\*\:mx-1>*){margin-inline:calc(var(--spacing)*1)}:is(.\*\:mb-0>*){margin-bottom:calc(var(--spacing)*0)}:is(.\*\:mb-0\!>*){margin-bottom:calc(var(--spacing)*0)!important}:is(.\*\:flex>*){display:flex}:is(.\*\:max-h-\[30px\]>*){max-height:30px}:is(.\*\:flex-row>*){flex-direction:row}:is(.\*\:items-center>*){align-items:center}:is(.\*\:truncate>*){text-overflow:ellipsis;white-space:nowrap;overflow:hidden}:is(.\*\:rounded-default>*){border-radius:var(--border-radius,6px)}:is(.\*\:px-2\.5>*){padding-inline:calc(var(--spacing)*2.5)}:is(.\*\:px-3>*){padding-inline:calc(var(--spacing)*3)}:is(.\*\:py-2>*){padding-block:calc(var(--spacing)*2)}:is(.\*\:py-\[5px\]>*){padding-block:5px}:is(.\*\:text-left>*){text-align:left}:is(.\*\:align-middle>*){vertical-align:middle}:is(.\*\:font-medium>*){--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}:is(.\*\:font-semibold>*){--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}:is(.\*\:whitespace-nowrap>*){white-space:nowrap}:is(.\*\:text-font-important-light>*){color:var(--color-font-important-light)}:is(.\*\:transition-colors>*){transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.group-hover\:-right-1:is(:where(.group):hover *){right:calc(var(--spacing)*-1)}.group-hover\:-left-1:is(:where(.group):hover *){left:calc(var(--spacing)*-1)}.group-hover\:text-primary-600:is(:where(.group):hover *){color:var(--color-primary-600)}.group-hover\/action\:bg-base-100:is(:where(.group\/action):hover *){background-color:var(--color-base-100)}.group-hover\/action\:text-base-700:is(:where(.group\/action):hover *){color:var(--color-base-700)}}.group-has-\[input\.action-select\:checked\]\:flex:is(:where(.group):has(:is(input.action-select:checked)) *){display:flex}.group-\[\.active\]\:-translate-x-\[2px\]:is(:where(.group).active *){--tw-translate-x:calc(2px*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-\[\.active\]\:border-white\/40:is(:where(.group).active *){border-color:#fff6}@supports (color:color-mix(in lab, red, red)){.group-\[\.active\]\:border-white\/40:is(:where(.group).active *){border-color:color-mix(in oklab,var(--color-white)40%,transparent)}}.group-\[\.active\]\:bg-primary-600:is(:where(.group).active *){background-color:var(--color-primary-600)}.group-\[\.active\]\:bg-transparent:is(:where(.group).active *){background-color:#0000}.group-\[\.active\]\:text-white:is(:where(.group).active *){color:var(--color-white)}.group-\[\.changelist-actions\]\:grow:is(:where(.group).changelist-actions *){flex-grow:1}.group-\[\.changelist-actions\]\:appearance-none:is(:where(.group).changelist-actions *){appearance:none}.group-\[\.changelist-actions\]\:truncate:is(:where(.group).changelist-actions *){text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.group-\[\.changelist-actions\]\:rounded-default:is(:where(.group).changelist-actions *){border-radius:var(--border-radius,6px)}.group-\[\.changelist-actions\]\:\!bg-white\/20:is(:where(.group).changelist-actions *){background-color:#fff3!important}@supports (color:color-mix(in lab, red, red)){.group-\[\.changelist-actions\]\:\!bg-white\/20:is(:where(.group).changelist-actions *){background-color:color-mix(in oklab,var(--color-white)20%,transparent)!important}}.group-\[\.changelist-actions\]\:px-3:is(:where(.group).changelist-actions *){padding-inline:calc(var(--spacing)*3)}.group-\[\.changelist-actions\]\:py-2:is(:where(.group).changelist-actions *){padding-block:calc(var(--spacing)*2)}.group-\[\.changelist-actions\]\:pr-8:is(:where(.group).changelist-actions *){padding-right:calc(var(--spacing)*8)}.group-\[\.changelist-actions\]\:font-medium:is(:where(.group).changelist-actions *){--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.group-\[\.changelist-actions\]\:\!text-current:is(:where(.group).changelist-actions *){color:currentColor!important}.group-\[\.changelist-actions\]\:\!outline-primary-400:is(:where(.group).changelist-actions *){outline-color:var(--color-primary-400)!important}:is(.group-\[\.changelist-actions\]\:\*\:text-base-700:is(:where(.group).changelist-actions *)>*){color:var(--color-base-700)}.group-\[\.errors\]\:border-red-600:is(:where(.group).errors *){border-color:var(--color-red-600)}.group-\[\.errors\]\:border-x-red-600:is(:where(.group).errors *){border-inline-color:var(--color-red-600)}.group-\[\.errors\]\:border-t-red-600:is(:where(.group).errors *){border-top-color:var(--color-red-600)}.group-\[\.field-row\]\:grow:is(:where(.group).field-row *){flex-grow:1}.group-\[\.field-row\]\:gap-2:is(:where(.group).field-row *){gap:calc(var(--spacing)*2)}.group-\[\.field-tabular\]\:grow:is(:where(.group).field-tabular *){flex-grow:1}.group-\[\.field-tabular\]\:gap-2:is(:where(.group).field-tabular *){gap:calc(var(--spacing)*2)}.group-\[\.fieldset\]\:-mx-3:is(:where(.group).fieldset *){margin-inline:calc(var(--spacing)*-3)}.group-\[\.fieldset\]\:flex:is(:where(.group).fieldset *){display:flex}.group-\[\.fieldset\]\:flex-row:is(:where(.group).fieldset *){flex-direction:row}.group-\[\.fieldset\]\:justify-end:is(:where(.group).fieldset *){justify-content:flex-end}.group-\[\.fieldset\]\:border-t:is(:where(.group).fieldset *){border-top-style:var(--tw-border-style);border-top-width:1px}.group-\[\.fieldset\]\:border-base-200:is(:where(.group).fieldset *){border-color:var(--color-base-200)}.group-\[\.fieldset\]\:px-3:is(:where(.group).fieldset *){padding-inline:calc(var(--spacing)*3)}.group-\[\.fieldset\]\:pt-3:is(:where(.group).fieldset *){padding-top:calc(var(--spacing)*3)}.group-\[\.htmx-request\]\:block:is(:where(.group).htmx-request *){display:block}.group-\[\.htmx-request\]\:hidden:is(:where(.group).htmx-request *){display:none}.group-\[\.inline-stacked\]\:mx-3:is(:where(.group).inline-stacked *){margin-inline:calc(var(--spacing)*3)}.group-\[\.inline-stacked\]\:mt-3:is(:where(.group).inline-stacked *){margin-top:calc(var(--spacing)*3)}.group-\[\.inline-stacked\]\:mb-3:is(:where(.group).inline-stacked *){margin-bottom:calc(var(--spacing)*3)}.group-\[\.inline-tabular\]\:mx-3:is(:where(.group).inline-tabular *){margin-inline:calc(var(--spacing)*3)}.group-\[\.inline-tabular\]\:mt-3:is(:where(.group).inline-tabular *){margin-top:calc(var(--spacing)*3)}.group-\[\.inline-tabular\]\:mb-0:is(:where(.group).inline-tabular *){margin-bottom:calc(var(--spacing)*0)}.group-\[\.last\]\/row\:border-b-0:is(:where(.group\/row).last *){border-bottom-style:var(--tw-border-style);border-bottom-width:0}.group-\[\.primary\]\:border-transparent:is(:where(.group).primary *){border-color:#0000}.group-\[\.primary\]\:text-white:is(:where(.group).primary *){color:var(--color-white)}.before\:mr-auto:before{content:var(--tw-content);margin-right:auto}.before\:block:before{content:var(--tw-content);display:block}.before\:flex:before{content:var(--tw-content);display:flex}.before\:items-center:before{content:var(--tw-content);align-items:center}.before\:pr-4:before{content:var(--tw-content);padding-right:calc(var(--spacing)*4)}.before\:font-semibold:before{content:var(--tw-content);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.before\:text-font-important-light:before{content:var(--tw-content);color:var(--color-font-important-light)}.before\:capitalize:before{content:var(--tw-content);text-transform:capitalize}.before\:content-\[attr\(data-label\)\]:before{--tw-content:attr(data-label);content:var(--tw-content)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:top-1:after{content:var(--tw-content);top:calc(var(--spacing)*1)}.after\:top-1\/2:after{content:var(--tw-content);top:50%}.after\:left-1:after{content:var(--tw-content);left:calc(var(--spacing)*1)}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:-mt-px:after{content:var(--tw-content);margin-top:-1px}.after\:-ml-px:after{content:var(--tw-content);margin-left:-1px}.after\:material-symbols-outlined:after{content:var(--tw-content);letter-spacing:normal;text-transform:none;white-space:nowrap;word-wrap:normal;-moz-font-feature-settings:"liga";-moz-osx-font-smoothing:grayscale;direction:ltr;font-family:Material Symbols Outlined;font-size:18px;font-style:normal;font-weight:400;line-height:1;display:inline-block}.after\:flex:after{content:var(--tw-content);display:flex}.after\:flex\!:after{content:var(--tw-content);display:flex!important}.after\:h-2:after{content:var(--tw-content);height:calc(var(--spacing)*2)}.after\:h-3:after{content:var(--tw-content);height:calc(var(--spacing)*3)}.after\:h-4:after{content:var(--tw-content);height:calc(var(--spacing)*4)}.after\:w-2:after{content:var(--tw-content);width:calc(var(--spacing)*2)}.after\:w-3:after{content:var(--tw-content);width:calc(var(--spacing)*3)}.after\:w-4:after{content:var(--tw-content);width:calc(var(--spacing)*4)}.after\:-translate-x-1\/2:after{content:var(--tw-content);--tw-translate-x:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.after\:-translate-y-1\/2:after{content:var(--tw-content);--tw-translate-y:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.after\:items-center:after{content:var(--tw-content);align-items:center}.after\:justify-center:after{content:var(--tw-content);justify-content:center}.after\:rounded-full:after{content:var(--tw-content);border-radius:3.40282e38px}.after\:bg-red-300:after{content:var(--tw-content);background-color:var(--color-red-300)}.after\:bg-transparent:after{content:var(--tw-content);background-color:#0000}.after\:bg-white:after{content:var(--tw-content);background-color:var(--color-white)}.after\:text-sm:after{content:var(--tw-content);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.after\:leading-none:after{content:var(--tw-content);--tw-leading:1;line-height:1}.after\:text-white:after{content:var(--tw-content);color:var(--color-white)}.after\:shadow-xs:after{content:var(--tw-content);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.after\:transition-all:after{content:var(--tw-content);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.after\:content-\[\'\'\]:after{--tw-content:"";content:var(--tw-content)}.after\:content-\[\'check\\_small\'\]:after{--tw-content:"check_small";content:var(--tw-content)}.first\:-mt-5:first-child{margin-top:calc(var(--spacing)*-5)}.first\:border-t-0:first-child{border-top-style:var(--tw-border-style);border-top-width:0}.first\:pl-3:first-child{padding-left:calc(var(--spacing)*3)}.first\:pl-6:first-child{padding-left:calc(var(--spacing)*6)}.last\:-mb-3:last-child{margin-bottom:calc(var(--spacing)*-3)}.last\:mb-0:last-child{margin-bottom:calc(var(--spacing)*0)}.last\:mb-4:last-child{margin-bottom:calc(var(--spacing)*4)}.last\:mb-8:last-child{margin-bottom:calc(var(--spacing)*8)}.last\:rounded-r-default:last-child{border-top-right-radius:var(--border-radius,6px);border-bottom-right-radius:var(--border-radius,6px)}.last\:border-r-0:last-child{border-right-style:var(--tw-border-style);border-right-width:0}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.last\:pr-3:last-child{padding-right:calc(var(--spacing)*3)}.last\:pr-6:last-child{padding-right:calc(var(--spacing)*6)}:is(.\*\:last\:mb-0>*):last-child{margin-bottom:calc(var(--spacing)*0)}.checked\:border-primary-600:checked{border-color:var(--color-primary-600)}.checked\:bg-green-500:checked{background-color:var(--color-green-500)}.checked\:bg-primary-600:checked{background-color:var(--color-primary-600)}.checked\:transition-all:checked{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.checked\:after\:left-4:checked:after{content:var(--tw-content);left:calc(var(--spacing)*4)}.checked\:after\:bg-white:checked:after{content:var(--tw-content);background-color:var(--color-white)}.empty\:hidden:empty{display:none}.focus-within\:outline-2:focus-within{outline-style:var(--tw-outline-style);outline-width:2px}.focus-within\:-outline-offset-2:focus-within{outline-offset:calc(2px*-1)}.focus-within\:outline-primary-600:focus-within{outline-color:var(--color-primary-600)}.focus-within\:group-\[\.errors\]\:outline-red-500:focus-within:is(:where(.group).errors *){outline-color:var(--color-red-500)}@media (hover:hover){.hover\:z-20:hover{z-index:20}.hover\:border-base-50:hover{border-color:var(--color-base-50)}.hover\:border-base-100:hover{border-color:var(--color-base-100)}.hover\:border-base-200:hover{border-color:var(--color-base-200)}.hover\:border-base-300:hover{border-color:var(--color-base-300)}.hover\:border-base-400:hover{border-color:var(--color-base-400)}.hover\:border-base-500:hover{border-color:var(--color-base-500)}.hover\:border-base-600:hover{border-color:var(--color-base-600)}.hover\:border-base-700:hover{border-color:var(--color-base-700)}.hover\:border-base-800:hover{border-color:var(--color-base-800)}.hover\:border-base-900:hover{border-color:var(--color-base-900)}.hover\:border-base-950:hover{border-color:var(--color-base-950)}.hover\:border-transparent:hover{border-color:#0000}.hover\:bg-base-50:hover{background-color:var(--color-base-50)}.hover\:bg-base-100:hover{background-color:var(--color-base-100)}.hover\:bg-base-200:hover{background-color:var(--color-base-200)}.hover\:bg-base-300:hover{background-color:var(--color-base-300)}.hover\:bg-base-400:hover{background-color:var(--color-base-400)}.hover\:bg-base-500:hover{background-color:var(--color-base-500)}.hover\:bg-base-600:hover{background-color:var(--color-base-600)}.hover\:bg-base-700:hover,.hover\:bg-base-700\/\[\.04\]:hover{background-color:var(--color-base-700)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-base-700\/\[\.04\]:hover{background-color:color-mix(in oklab,var(--color-base-700)4%,transparent)}}.hover\:bg-base-800:hover{background-color:var(--color-base-800)}.hover\:bg-base-900:hover{background-color:var(--color-base-900)}.hover\:bg-base-950:hover{background-color:var(--color-base-950)}.hover\:bg-primary-50:hover{background-color:var(--color-primary-50)}.hover\:bg-primary-100:hover{background-color:var(--color-primary-100)}.hover\:bg-primary-200:hover{background-color:var(--color-primary-200)}.hover\:bg-primary-300:hover{background-color:var(--color-primary-300)}.hover\:bg-primary-400:hover{background-color:var(--color-primary-400)}.hover\:bg-primary-500:hover{background-color:var(--color-primary-500)}.hover\:bg-primary-600:hover{background-color:var(--color-primary-600)}.hover\:bg-primary-700:hover{background-color:var(--color-primary-700)}.hover\:bg-primary-800:hover{background-color:var(--color-primary-800)}.hover\:bg-primary-900:hover{background-color:var(--color-primary-900)}.hover\:bg-primary-950:hover{background-color:var(--color-primary-950)}.hover\:bg-red-100:hover{background-color:var(--color-red-100)}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:bg-white\/30:hover{background-color:#ffffff4d}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/30:hover{background-color:color-mix(in oklab,var(--color-white)30%,transparent)}}.hover\:text-base-500:hover{color:var(--color-base-500)}.hover\:text-base-700:hover{color:var(--color-base-700)}.hover\:text-font-important-light:hover{color:var(--color-font-important-light)}.hover\:text-primary-600:hover{color:var(--color-primary-600)}.hover\:text-primary-600\!:hover{color:var(--color-primary-600)!important}.hover\:text-red-700:hover{color:var(--color-red-700)}.hover\:opacity-50:hover{opacity:.5}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-raised:hover{--tw-shadow:0 2px 12px var(--tw-shadow-color,var(--color-base-300));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}:is(.\*\:hover\:bg-base-100>*):hover{background-color:var(--color-base-100)}:is(.\*\:hover\:bg-base-700\/\[\.04\]>*):hover{background-color:var(--color-base-700)}@supports (color:color-mix(in lab, red, red)){:is(.\*\:hover\:bg-base-700\/\[\.04\]>*):hover{background-color:color-mix(in oklab,var(--color-base-700)4%,transparent)}}:is(.\*\:hover\:text-base-700>*):hover{color:var(--color-base-700)}.checked\:hover\:border-base-900\/20:checked:hover{border-color:var(--color-base-900)}@supports (color:color-mix(in lab, red, red)){.checked\:hover\:border-base-900\/20:checked:hover{border-color:color-mix(in oklab,var(--color-base-900)20%,transparent)}}.checked\:hover\:border-primary-600:checked:hover{border-color:var(--color-primary-600)}}.focus\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.focus\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}.focus\:outline:focus{outline-style:var(--tw-outline-style);outline-width:1px}.focus\:outline-2:focus{outline-style:var(--tw-outline-style);outline-width:2px}.focus\:-outline-offset-2:focus{outline-offset:calc(2px*-1)}.focus\:outline-offset-2:focus{outline-offset:2px}.focus\:outline-primary-500:focus{outline-color:var(--color-primary-500)}.focus\:outline-primary-600:focus{outline-color:var(--color-primary-600)}.focus\:outline-red-500:focus{outline-color:var(--color-red-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus\:group-\[\.errors\]\:outline-red-600:focus:is(:where(.group).errors *){outline-color:var(--color-red-600)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:\!bg-base-50:disabled{background-color:var(--color-base-50)!important}.disabled\:opacity-50:disabled{opacity:.5}.has-\[ol\]\:has-\[li\]\:block:has(:is(ol)):has(:is(li)){display:block}@media not all and (min-width:64rem){.max-lg\:absolute{position:absolute}.max-lg\:top-16{top:calc(var(--spacing)*16)}.max-lg\:-mt-px{margin-top:-1px}.max-lg\:flex{display:flex}.max-lg\:flex-row-reverse{flex-direction:row-reverse}.max-lg\:justify-end{justify-content:flex-end}.max-lg\:first\:rounded-t-default:first-child{border-top-left-radius:var(--border-radius,6px);border-top-right-radius:var(--border-radius,6px)}.max-lg\:last\:rounded-b-default:last-child{border-bottom-right-radius:var(--border-radius,6px);border-bottom-left-radius:var(--border-radius,6px)}}@media not all and (min-width:48rem){.max-md\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}}@media (min-width:40rem){.sm\:mt-0{margin-top:calc(var(--spacing)*0)}.sm\:ml-auto{margin-left:auto}.sm\:w-96{width:calc(var(--spacing)*96)}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}}@media (min-width:48rem){.md\:absolute{position:absolute}.md\:relative{position:relative}.md\:sticky{position:sticky}.md\:left-72{left:calc(var(--spacing)*72)}.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-3{grid-column:span 3/span 3}.md\:col-span-4{grid-column:span 4/span 4}.md\:col-span-5{grid-column:span 5/span 5}.md\:col-span-6{grid-column:span 6/span 6}.md\:col-span-7{grid-column:span 7/span 7}.md\:col-span-8{grid-column:span 8/span 8}.md\:col-span-9{grid-column:span 9/span 9}.md\:col-span-10{grid-column:span 10/span 10}.md\:col-span-11{grid-column:span 11/span 11}.md\:col-span-12{grid-column:span 12/span 12}.md\:col-span-13{grid-column:span 13/span 13}.md\:col-span-14{grid-column:span 14/span 14}.md\:col-span-15{grid-column:span 15/span 15}.md\:col-span-16{grid-column:span 16/span 16}.md\:mt-0{margin-top:calc(var(--spacing)*0)}.md\:flex{display:flex}.md\:inline-flex{display:inline-flex}.md\:h-1{height:calc(var(--spacing)*1)}.md\:h-2{height:calc(var(--spacing)*2)}.md\:h-3{height:calc(var(--spacing)*3)}.md\:h-4{height:calc(var(--spacing)*4)}.md\:h-5{height:calc(var(--spacing)*5)}.md\:h-6{height:calc(var(--spacing)*6)}.md\:h-7{height:calc(var(--spacing)*7)}.md\:h-8{height:calc(var(--spacing)*8)}.md\:min-h-1{min-height:calc(var(--spacing)*1)}.md\:min-h-2{min-height:calc(var(--spacing)*2)}.md\:min-h-3{min-height:calc(var(--spacing)*3)}.md\:min-h-4{min-height:calc(var(--spacing)*4)}.md\:min-h-5{min-height:calc(var(--spacing)*5)}.md\:min-h-6{min-height:calc(var(--spacing)*6)}.md\:min-h-7{min-height:calc(var(--spacing)*7)}.md\:min-h-8{min-height:calc(var(--spacing)*8)}.md\:w-1{width:calc(var(--spacing)*1)}.md\:w-1\/2{width:50%}.md\:w-1\/3{width:33.3333%}.md\:w-1\/4{width:25%}.md\:w-1\/5{width:20%}.md\:w-1\/6{width:16.6667%}.md\:w-1\/7{width:14.2857%}.md\:w-2{width:calc(var(--spacing)*2)}.md\:w-2\/3{width:66.6667%}.md\:w-2\/4{width:50%}.md\:w-2\/5{width:40%}.md\:w-2\/6{width:33.3333%}.md\:w-2\/7{width:28.5714%}.md\:w-3{width:calc(var(--spacing)*3)}.md\:w-3\/4{width:75%}.md\:w-3\/5{width:60%}.md\:w-3\/6{width:50%}.md\:w-3\/7{width:42.8571%}.md\:w-4{width:calc(var(--spacing)*4)}.md\:w-4\/5{width:80%}.md\:w-4\/6{width:66.6667%}.md\:w-4\/7{width:57.1429%}.md\:w-5{width:calc(var(--spacing)*5)}.md\:w-5\/6{width:83.3333%}.md\:w-5\/7{width:71.4286%}.md\:w-6{width:calc(var(--spacing)*6)}.md\:w-6\/7{width:85.7143%}.md\:w-7{width:calc(var(--spacing)*7)}.md\:w-8{width:calc(var(--spacing)*8)}.md\:w-auto{width:auto}.md\:min-w-1{min-width:calc(var(--spacing)*1)}.md\:min-w-2{min-width:calc(var(--spacing)*2)}.md\:min-w-3{min-width:calc(var(--spacing)*3)}.md\:min-w-4{min-width:calc(var(--spacing)*4)}.md\:min-w-5{min-width:calc(var(--spacing)*5)}.md\:min-w-6{min-width:calc(var(--spacing)*6)}.md\:min-w-7{min-width:calc(var(--spacing)*7)}.md\:min-w-8{min-width:calc(var(--spacing)*8)}.md\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.md\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.md\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.md\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.md\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.md\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.md\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\:grid-cols-13{grid-template-columns:repeat(13,minmax(0,1fr))}.md\:grid-cols-14{grid-template-columns:repeat(14,minmax(0,1fr))}.md\:grid-cols-15{grid-template-columns:repeat(15,minmax(0,1fr))}.md\:grid-cols-16{grid-template-columns:repeat(16,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:gap-0\.5{gap:calc(var(--spacing)*.5)}.md\:gap-1{gap:calc(var(--spacing)*1)}.md\:gap-2{gap:calc(var(--spacing)*2)}.md\:gap-3{gap:calc(var(--spacing)*3)}.md\:gap-4{gap:calc(var(--spacing)*4)}.md\:gap-5{gap:calc(var(--spacing)*5)}.md\:gap-6{gap:calc(var(--spacing)*6)}.md\:gap-7{gap:calc(var(--spacing)*7)}.md\:gap-8{gap:calc(var(--spacing)*8)}.md\:gap-9{gap:calc(var(--spacing)*9)}.md\:gap-10{gap:calc(var(--spacing)*10)}.md\:gap-11{gap:calc(var(--spacing)*11)}.md\:gap-12{gap:calc(var(--spacing)*12)}.md\:gap-13{gap:calc(var(--spacing)*13)}.md\:gap-14{gap:calc(var(--spacing)*14)}.md\:gap-15{gap:calc(var(--spacing)*15)}.md\:gap-16{gap:calc(var(--spacing)*16)}.md\:border-0{border-style:var(--tw-border-style);border-width:0}.md\:border-2{border-style:var(--tw-border-style);border-width:2px}.md\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.md\:border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.md\:border-r-0{border-right-style:var(--tw-border-style);border-right-width:0}.md\:border-r-2{border-right-style:var(--tw-border-style);border-right-width:2px}.md\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.md\:border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.md\:border-l-0{border-left-style:var(--tw-border-style);border-left-width:0}.md\:border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}}@media (min-width:64rem){.lg\:scrollable-top:after{content:var(--tw-content);content:var(--tw-content);content:var(--tw-content);top:-1px;right:calc(var(--spacing)*0);content:var(--tw-content);left:calc(var(--spacing)*0);content:var(--tw-content);height:calc(var(--spacing)*4);content:var(--tw-content);--tw-translate-y:-100%;translate:var(--tw-translate-x)var(--tw-translate-y);content:var(--tw-content);--tw-gradient-position:to top;position:absolute}@supports (background-image:linear-gradient(in lab, red, red)){.lg\:scrollable-top:after{--tw-gradient-position:to top in oklab}}.lg\:scrollable-top:after{background-image:linear-gradient(var(--tw-gradient-stops));content:var(--tw-content);--tw-gradient-from:var(--color-base-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position));--tw-content:"";content:var(--tw-content)}@media not print{.lg\:scrollable-top:where(.dark,.dark *):after{content:var(--tw-content);background-image:none}}.lg\:absolute{position:absolute}.lg\:relative{position:relative}.lg\:sticky{position:sticky}.lg\:right-0{right:calc(var(--spacing)*0)}.lg\:bottom-0{bottom:calc(var(--spacing)*0)}.lg\:left-0{left:calc(var(--spacing)*0)}.lg\:order-none{order:0}.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-5{grid-column:span 5/span 5}.lg\:col-span-6{grid-column:span 6/span 6}.lg\:col-span-7{grid-column:span 7/span 7}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:col-span-9{grid-column:span 9/span 9}.lg\:col-span-10{grid-column:span 10/span 10}.lg\:col-span-11{grid-column:span 11/span 11}.lg\:col-span-12{grid-column:span 12/span 12}.lg\:col-span-13{grid-column:span 13/span 13}.lg\:col-span-14{grid-column:span 14/span 14}.lg\:col-span-15{grid-column:span 15/span 15}.lg\:col-span-16{grid-column:span 16/span 16}.lg\:m-0{margin:calc(var(--spacing)*0)}.lg\:m-1{margin:calc(var(--spacing)*1)}.lg\:m-2{margin:calc(var(--spacing)*2)}.lg\:m-3{margin:calc(var(--spacing)*3)}.lg\:m-4{margin:calc(var(--spacing)*4)}.lg\:m-5{margin:calc(var(--spacing)*5)}.lg\:m-6{margin:calc(var(--spacing)*6)}.lg\:m-7{margin:calc(var(--spacing)*7)}.lg\:m-8{margin:calc(var(--spacing)*8)}.lg\:m-9{margin:calc(var(--spacing)*9)}.lg\:m-10{margin:calc(var(--spacing)*10)}.lg\:m-11{margin:calc(var(--spacing)*11)}.lg\:m-12{margin:calc(var(--spacing)*12)}.lg\:m-13{margin:calc(var(--spacing)*13)}.lg\:m-14{margin:calc(var(--spacing)*14)}.lg\:m-15{margin:calc(var(--spacing)*15)}.lg\:m-16{margin:calc(var(--spacing)*16)}.lg\:m-17{margin:calc(var(--spacing)*17)}.lg\:m-18{margin:calc(var(--spacing)*18)}.lg\:m-19{margin:calc(var(--spacing)*19)}.lg\:m-20{margin:calc(var(--spacing)*20)}.lg\:m-21{margin:calc(var(--spacing)*21)}.lg\:m-22{margin:calc(var(--spacing)*22)}.lg\:m-23{margin:calc(var(--spacing)*23)}.lg\:m-24{margin:calc(var(--spacing)*24)}.lg\:mx-0{margin-inline:calc(var(--spacing)*0)}.lg\:mx-1{margin-inline:calc(var(--spacing)*1)}.lg\:mx-2{margin-inline:calc(var(--spacing)*2)}.lg\:mx-3{margin-inline:calc(var(--spacing)*3)}.lg\:mx-4{margin-inline:calc(var(--spacing)*4)}.lg\:mx-5{margin-inline:calc(var(--spacing)*5)}.lg\:mx-6{margin-inline:calc(var(--spacing)*6)}.lg\:mx-7{margin-inline:calc(var(--spacing)*7)}.lg\:mx-8{margin-inline:calc(var(--spacing)*8)}.lg\:mx-9{margin-inline:calc(var(--spacing)*9)}.lg\:mx-10{margin-inline:calc(var(--spacing)*10)}.lg\:mx-11{margin-inline:calc(var(--spacing)*11)}.lg\:mx-12{margin-inline:calc(var(--spacing)*12)}.lg\:mx-13{margin-inline:calc(var(--spacing)*13)}.lg\:mx-14{margin-inline:calc(var(--spacing)*14)}.lg\:mx-15{margin-inline:calc(var(--spacing)*15)}.lg\:mx-16{margin-inline:calc(var(--spacing)*16)}.lg\:mx-17{margin-inline:calc(var(--spacing)*17)}.lg\:mx-18{margin-inline:calc(var(--spacing)*18)}.lg\:mx-19{margin-inline:calc(var(--spacing)*19)}.lg\:mx-20{margin-inline:calc(var(--spacing)*20)}.lg\:mx-21{margin-inline:calc(var(--spacing)*21)}.lg\:mx-22{margin-inline:calc(var(--spacing)*22)}.lg\:mx-23{margin-inline:calc(var(--spacing)*23)}.lg\:mx-24{margin-inline:calc(var(--spacing)*24)}.lg\:my-0{margin-block:calc(var(--spacing)*0)}.lg\:my-1{margin-block:calc(var(--spacing)*1)}.lg\:my-2{margin-block:calc(var(--spacing)*2)}.lg\:my-3{margin-block:calc(var(--spacing)*3)}.lg\:my-4{margin-block:calc(var(--spacing)*4)}.lg\:my-5{margin-block:calc(var(--spacing)*5)}.lg\:my-6{margin-block:calc(var(--spacing)*6)}.lg\:my-7{margin-block:calc(var(--spacing)*7)}.lg\:my-8{margin-block:calc(var(--spacing)*8)}.lg\:my-9{margin-block:calc(var(--spacing)*9)}.lg\:my-10{margin-block:calc(var(--spacing)*10)}.lg\:my-11{margin-block:calc(var(--spacing)*11)}.lg\:my-12{margin-block:calc(var(--spacing)*12)}.lg\:my-13{margin-block:calc(var(--spacing)*13)}.lg\:my-14{margin-block:calc(var(--spacing)*14)}.lg\:my-15{margin-block:calc(var(--spacing)*15)}.lg\:my-16{margin-block:calc(var(--spacing)*16)}.lg\:my-17{margin-block:calc(var(--spacing)*17)}.lg\:my-18{margin-block:calc(var(--spacing)*18)}.lg\:my-19{margin-block:calc(var(--spacing)*19)}.lg\:my-20{margin-block:calc(var(--spacing)*20)}.lg\:my-21{margin-block:calc(var(--spacing)*21)}.lg\:my-22{margin-block:calc(var(--spacing)*22)}.lg\:my-23{margin-block:calc(var(--spacing)*23)}.lg\:my-24{margin-block:calc(var(--spacing)*24)}.lg\:-mt-2{margin-top:calc(var(--spacing)*-2)}.lg\:mt-0{margin-top:calc(var(--spacing)*0)}.lg\:mt-1{margin-top:calc(var(--spacing)*1)}.lg\:mt-2{margin-top:calc(var(--spacing)*2)}.lg\:mt-3{margin-top:calc(var(--spacing)*3)}.lg\:mt-4{margin-top:calc(var(--spacing)*4)}.lg\:mt-5{margin-top:calc(var(--spacing)*5)}.lg\:mt-6{margin-top:calc(var(--spacing)*6)}.lg\:mt-7{margin-top:calc(var(--spacing)*7)}.lg\:mt-8{margin-top:calc(var(--spacing)*8)}.lg\:mt-9{margin-top:calc(var(--spacing)*9)}.lg\:mt-10{margin-top:calc(var(--spacing)*10)}.lg\:mt-11{margin-top:calc(var(--spacing)*11)}.lg\:mt-12{margin-top:calc(var(--spacing)*12)}.lg\:mt-13{margin-top:calc(var(--spacing)*13)}.lg\:mt-14{margin-top:calc(var(--spacing)*14)}.lg\:mt-15{margin-top:calc(var(--spacing)*15)}.lg\:mt-16{margin-top:calc(var(--spacing)*16)}.lg\:mt-17{margin-top:calc(var(--spacing)*17)}.lg\:mt-18{margin-top:calc(var(--spacing)*18)}.lg\:mt-19{margin-top:calc(var(--spacing)*19)}.lg\:mt-20{margin-top:calc(var(--spacing)*20)}.lg\:mt-21{margin-top:calc(var(--spacing)*21)}.lg\:mt-22{margin-top:calc(var(--spacing)*22)}.lg\:mt-23{margin-top:calc(var(--spacing)*23)}.lg\:mt-24{margin-top:calc(var(--spacing)*24)}.lg\:mr-0{margin-right:calc(var(--spacing)*0)}.lg\:mr-1{margin-right:calc(var(--spacing)*1)}.lg\:mr-2{margin-right:calc(var(--spacing)*2)}.lg\:mr-3{margin-right:calc(var(--spacing)*3)}.lg\:mr-4{margin-right:calc(var(--spacing)*4)}.lg\:mr-5{margin-right:calc(var(--spacing)*5)}.lg\:mr-6{margin-right:calc(var(--spacing)*6)}.lg\:mr-7{margin-right:calc(var(--spacing)*7)}.lg\:mr-8{margin-right:calc(var(--spacing)*8)}.lg\:mr-9{margin-right:calc(var(--spacing)*9)}.lg\:mr-10{margin-right:calc(var(--spacing)*10)}.lg\:mr-11{margin-right:calc(var(--spacing)*11)}.lg\:mr-12{margin-right:calc(var(--spacing)*12)}.lg\:mr-13{margin-right:calc(var(--spacing)*13)}.lg\:mr-14{margin-right:calc(var(--spacing)*14)}.lg\:mr-15{margin-right:calc(var(--spacing)*15)}.lg\:mr-16{margin-right:calc(var(--spacing)*16)}.lg\:mr-17{margin-right:calc(var(--spacing)*17)}.lg\:mr-18{margin-right:calc(var(--spacing)*18)}.lg\:mr-19{margin-right:calc(var(--spacing)*19)}.lg\:mr-20{margin-right:calc(var(--spacing)*20)}.lg\:mr-21{margin-right:calc(var(--spacing)*21)}.lg\:mr-22{margin-right:calc(var(--spacing)*22)}.lg\:mr-23{margin-right:calc(var(--spacing)*23)}.lg\:mr-24{margin-right:calc(var(--spacing)*24)}.lg\:-mb-8{margin-bottom:calc(var(--spacing)*-8)}.lg\:mb-0{margin-bottom:calc(var(--spacing)*0)}.lg\:mb-1{margin-bottom:calc(var(--spacing)*1)}.lg\:mb-2{margin-bottom:calc(var(--spacing)*2)}.lg\:mb-3{margin-bottom:calc(var(--spacing)*3)}.lg\:mb-4{margin-bottom:calc(var(--spacing)*4)}.lg\:mb-5{margin-bottom:calc(var(--spacing)*5)}.lg\:mb-6{margin-bottom:calc(var(--spacing)*6)}.lg\:mb-7{margin-bottom:calc(var(--spacing)*7)}.lg\:mb-8{margin-bottom:calc(var(--spacing)*8)}.lg\:mb-9{margin-bottom:calc(var(--spacing)*9)}.lg\:mb-10{margin-bottom:calc(var(--spacing)*10)}.lg\:mb-11{margin-bottom:calc(var(--spacing)*11)}.lg\:mb-12{margin-bottom:calc(var(--spacing)*12)}.lg\:mb-13{margin-bottom:calc(var(--spacing)*13)}.lg\:mb-14{margin-bottom:calc(var(--spacing)*14)}.lg\:mb-15{margin-bottom:calc(var(--spacing)*15)}.lg\:mb-16{margin-bottom:calc(var(--spacing)*16)}.lg\:mb-17{margin-bottom:calc(var(--spacing)*17)}.lg\:mb-18{margin-bottom:calc(var(--spacing)*18)}.lg\:mb-19{margin-bottom:calc(var(--spacing)*19)}.lg\:mb-20{margin-bottom:calc(var(--spacing)*20)}.lg\:mb-21{margin-bottom:calc(var(--spacing)*21)}.lg\:mb-22{margin-bottom:calc(var(--spacing)*22)}.lg\:mb-23{margin-bottom:calc(var(--spacing)*23)}.lg\:mb-24{margin-bottom:calc(var(--spacing)*24)}.lg\:ml-0{margin-left:calc(var(--spacing)*0)}.lg\:ml-1{margin-left:calc(var(--spacing)*1)}.lg\:ml-2{margin-left:calc(var(--spacing)*2)}.lg\:ml-3{margin-left:calc(var(--spacing)*3)}.lg\:ml-4{margin-left:calc(var(--spacing)*4)}.lg\:ml-5{margin-left:calc(var(--spacing)*5)}.lg\:ml-6{margin-left:calc(var(--spacing)*6)}.lg\:ml-7{margin-left:calc(var(--spacing)*7)}.lg\:ml-8{margin-left:calc(var(--spacing)*8)}.lg\:ml-9{margin-left:calc(var(--spacing)*9)}.lg\:ml-10{margin-left:calc(var(--spacing)*10)}.lg\:ml-11{margin-left:calc(var(--spacing)*11)}.lg\:ml-12{margin-left:calc(var(--spacing)*12)}.lg\:ml-13{margin-left:calc(var(--spacing)*13)}.lg\:ml-14{margin-left:calc(var(--spacing)*14)}.lg\:ml-15{margin-left:calc(var(--spacing)*15)}.lg\:ml-16{margin-left:calc(var(--spacing)*16)}.lg\:ml-17{margin-left:calc(var(--spacing)*17)}.lg\:ml-18{margin-left:calc(var(--spacing)*18)}.lg\:ml-19{margin-left:calc(var(--spacing)*19)}.lg\:ml-20{margin-left:calc(var(--spacing)*20)}.lg\:ml-21{margin-left:calc(var(--spacing)*21)}.lg\:ml-22{margin-left:calc(var(--spacing)*22)}.lg\:ml-23{margin-left:calc(var(--spacing)*23)}.lg\:ml-24{margin-left:calc(var(--spacing)*24)}.lg\:ml-auto{margin-left:auto}.min-lg\:-ml-px{margin-left:-1px}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:table{display:table}.lg\:table-cell{display:table-cell}.lg\:table-header-group{display:table-header-group}.lg\:table-row{display:table-row}.lg\:table-row-group{display:table-row-group}.lg\:h-1{height:calc(var(--spacing)*1)}.lg\:h-2{height:calc(var(--spacing)*2)}.lg\:h-3{height:calc(var(--spacing)*3)}.lg\:h-4{height:calc(var(--spacing)*4)}.lg\:h-5{height:calc(var(--spacing)*5)}.lg\:h-6{height:calc(var(--spacing)*6)}.lg\:h-7{height:calc(var(--spacing)*7)}.lg\:h-8{height:calc(var(--spacing)*8)}.lg\:h-\[64px\]{height:64px}.lg\:min-h-1{min-height:calc(var(--spacing)*1)}.lg\:min-h-2{min-height:calc(var(--spacing)*2)}.lg\:min-h-3{min-height:calc(var(--spacing)*3)}.lg\:min-h-4{min-height:calc(var(--spacing)*4)}.lg\:min-h-5{min-height:calc(var(--spacing)*5)}.lg\:min-h-6{min-height:calc(var(--spacing)*6)}.lg\:min-h-7{min-height:calc(var(--spacing)*7)}.lg\:min-h-8{min-height:calc(var(--spacing)*8)}.lg\:w-1{width:calc(var(--spacing)*1)}.lg\:w-1\/2{width:50%}.lg\:w-1\/3{width:33.3333%}.lg\:w-1\/4{width:25%}.lg\:w-1\/5{width:20%}.lg\:w-1\/6{width:16.6667%}.lg\:w-1\/7{width:14.2857%}.lg\:w-2{width:calc(var(--spacing)*2)}.lg\:w-2\/3{width:66.6667%}.lg\:w-2\/4{width:50%}.lg\:w-2\/5{width:40%}.lg\:w-2\/6{width:33.3333%}.lg\:w-2\/7{width:28.5714%}.lg\:w-3{width:calc(var(--spacing)*3)}.lg\:w-3\/4{width:75%}.lg\:w-3\/5{width:60%}.lg\:w-3\/6{width:50%}.lg\:w-3\/7{width:42.8571%}.lg\:w-4{width:calc(var(--spacing)*4)}.lg\:w-4\/5{width:80%}.lg\:w-4\/6{width:66.6667%}.lg\:w-4\/7{width:57.1429%}.lg\:w-5{width:calc(var(--spacing)*5)}.lg\:w-5\/6{width:83.3333%}.lg\:w-5\/7{width:71.4286%}.lg\:w-6{width:calc(var(--spacing)*6)}.lg\:w-6\/7{width:85.7143%}.lg\:w-7{width:calc(var(--spacing)*7)}.lg\:w-8{width:calc(var(--spacing)*8)}.lg\:w-10{width:calc(var(--spacing)*10)}.lg\:w-56{width:calc(var(--spacing)*56)}.lg\:w-96{width:calc(var(--spacing)*96)}.lg\:w-auto{width:auto}.lg\:w-px{width:1px}.lg\:min-w-1{min-width:calc(var(--spacing)*1)}.lg\:min-w-2{min-width:calc(var(--spacing)*2)}.lg\:min-w-3{min-width:calc(var(--spacing)*3)}.lg\:min-w-4{min-width:calc(var(--spacing)*4)}.lg\:min-w-5{min-width:calc(var(--spacing)*5)}.lg\:min-w-6{min-width:calc(var(--spacing)*6)}.lg\:min-w-7{min-width:calc(var(--spacing)*7)}.lg\:min-w-8{min-width:calc(var(--spacing)*8)}.lg\:min-w-56{min-width:calc(var(--spacing)*56)}.lg\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.lg\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.lg\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.lg\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lg\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-13{grid-template-columns:repeat(13,minmax(0,1fr))}.lg\:grid-cols-14{grid-template-columns:repeat(14,minmax(0,1fr))}.lg\:grid-cols-15{grid-template-columns:repeat(15,minmax(0,1fr))}.lg\:grid-cols-16{grid-template-columns:repeat(16,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:flex-row-reverse{flex-direction:row-reverse}.lg\:items-center{align-items:center}.lg\:justify-start{justify-content:flex-start}.lg\:gap-0{gap:calc(var(--spacing)*0)}.lg\:gap-0\.5{gap:calc(var(--spacing)*.5)}.lg\:gap-1{gap:calc(var(--spacing)*1)}.lg\:gap-2{gap:calc(var(--spacing)*2)}.lg\:gap-3{gap:calc(var(--spacing)*3)}.lg\:gap-4{gap:calc(var(--spacing)*4)}.lg\:gap-5{gap:calc(var(--spacing)*5)}.lg\:gap-6{gap:calc(var(--spacing)*6)}.lg\:gap-7{gap:calc(var(--spacing)*7)}.lg\:gap-8{gap:calc(var(--spacing)*8)}.lg\:gap-9{gap:calc(var(--spacing)*9)}.lg\:gap-10{gap:calc(var(--spacing)*10)}.lg\:gap-11{gap:calc(var(--spacing)*11)}.lg\:gap-12{gap:calc(var(--spacing)*12)}.lg\:gap-13{gap:calc(var(--spacing)*13)}.lg\:gap-14{gap:calc(var(--spacing)*14)}.lg\:gap-15{gap:calc(var(--spacing)*15)}.lg\:gap-16{gap:calc(var(--spacing)*16)}.lg\:overflow-hidden{overflow:hidden}.lg\:rounded-default{border-radius:var(--border-radius,6px)}.lg\:rounded-none{border-radius:0}.lg\:rounded-t-default{border-top-left-radius:var(--border-radius,6px);border-top-right-radius:var(--border-radius,6px)}.lg\:rounded-b-default{border-bottom-right-radius:var(--border-radius,6px);border-bottom-left-radius:var(--border-radius,6px)}.lg\:border{border-style:var(--tw-border-style);border-width:1px}.lg\:border-0{border-style:var(--tw-border-style);border-width:0}.lg\:border-2{border-style:var(--tw-border-style);border-width:2px}.lg\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.lg\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.lg\:border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.lg\:border-r-0{border-right-style:var(--tw-border-style);border-right-width:0}.lg\:border-r-2{border-right-style:var(--tw-border-style);border-right-width:2px}.lg\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.lg\:border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.lg\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.lg\:border-l-0{border-left-style:var(--tw-border-style);border-left-width:0}.lg\:border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.lg\:border-none{--tw-border-style:none;border-style:none}.lg\:border-base-200{border-color:var(--color-base-200)}.lg\:bg-transparent{background-color:#0000}.lg\:bg-white{background-color:var(--color-white)}.lg\:bg-white\/80{background-color:#fffc}@supports (color:color-mix(in lab, red, red)){.lg\:bg-white\/80{background-color:color-mix(in oklab,var(--color-white)80%,transparent)}}.lg\:p-0{padding:calc(var(--spacing)*0)}.lg\:p-1{padding:calc(var(--spacing)*1)}.lg\:p-2{padding:calc(var(--spacing)*2)}.lg\:p-3{padding:calc(var(--spacing)*3)}.lg\:p-4{padding:calc(var(--spacing)*4)}.lg\:p-5{padding:calc(var(--spacing)*5)}.lg\:p-6{padding:calc(var(--spacing)*6)}.lg\:p-7{padding:calc(var(--spacing)*7)}.lg\:p-8{padding:calc(var(--spacing)*8)}.lg\:p-9{padding:calc(var(--spacing)*9)}.lg\:p-10{padding:calc(var(--spacing)*10)}.lg\:p-11{padding:calc(var(--spacing)*11)}.lg\:p-12{padding:calc(var(--spacing)*12)}.lg\:p-13{padding:calc(var(--spacing)*13)}.lg\:p-14{padding:calc(var(--spacing)*14)}.lg\:p-15{padding:calc(var(--spacing)*15)}.lg\:p-16{padding:calc(var(--spacing)*16)}.lg\:p-17{padding:calc(var(--spacing)*17)}.lg\:p-18{padding:calc(var(--spacing)*18)}.lg\:p-19{padding:calc(var(--spacing)*19)}.lg\:p-20{padding:calc(var(--spacing)*20)}.lg\:p-21{padding:calc(var(--spacing)*21)}.lg\:p-22{padding:calc(var(--spacing)*22)}.lg\:p-23{padding:calc(var(--spacing)*23)}.lg\:p-24{padding:calc(var(--spacing)*24)}.lg\:p-32{padding:calc(var(--spacing)*32)}.lg\:px-0{padding-inline:calc(var(--spacing)*0)}.lg\:px-1{padding-inline:calc(var(--spacing)*1)}.lg\:px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.lg\:px-2{padding-inline:calc(var(--spacing)*2)}.lg\:px-3{padding-inline:calc(var(--spacing)*3)}.lg\:px-4{padding-inline:calc(var(--spacing)*4)}.lg\:px-5{padding-inline:calc(var(--spacing)*5)}.lg\:px-6{padding-inline:calc(var(--spacing)*6)}.lg\:px-7{padding-inline:calc(var(--spacing)*7)}.lg\:px-8{padding-inline:calc(var(--spacing)*8)}.lg\:px-9{padding-inline:calc(var(--spacing)*9)}.lg\:px-10{padding-inline:calc(var(--spacing)*10)}.lg\:px-11{padding-inline:calc(var(--spacing)*11)}.lg\:px-12{padding-inline:calc(var(--spacing)*12)}.lg\:px-13{padding-inline:calc(var(--spacing)*13)}.lg\:px-14{padding-inline:calc(var(--spacing)*14)}.lg\:px-15{padding-inline:calc(var(--spacing)*15)}.lg\:px-16{padding-inline:calc(var(--spacing)*16)}.lg\:px-17{padding-inline:calc(var(--spacing)*17)}.lg\:px-18{padding-inline:calc(var(--spacing)*18)}.lg\:px-19{padding-inline:calc(var(--spacing)*19)}.lg\:px-20{padding-inline:calc(var(--spacing)*20)}.lg\:px-21{padding-inline:calc(var(--spacing)*21)}.lg\:px-22{padding-inline:calc(var(--spacing)*22)}.lg\:px-23{padding-inline:calc(var(--spacing)*23)}.lg\:px-24{padding-inline:calc(var(--spacing)*24)}.lg\:py-0{padding-block:calc(var(--spacing)*0)}.lg\:py-1{padding-block:calc(var(--spacing)*1)}.lg\:py-2{padding-block:calc(var(--spacing)*2)}.lg\:py-3{padding-block:calc(var(--spacing)*3)}.lg\:py-4{padding-block:calc(var(--spacing)*4)}.lg\:py-5{padding-block:calc(var(--spacing)*5)}.lg\:py-6{padding-block:calc(var(--spacing)*6)}.lg\:py-7{padding-block:calc(var(--spacing)*7)}.lg\:py-8{padding-block:calc(var(--spacing)*8)}.lg\:py-9{padding-block:calc(var(--spacing)*9)}.lg\:py-10{padding-block:calc(var(--spacing)*10)}.lg\:py-11{padding-block:calc(var(--spacing)*11)}.lg\:py-12{padding-block:calc(var(--spacing)*12)}.lg\:py-13{padding-block:calc(var(--spacing)*13)}.lg\:py-14{padding-block:calc(var(--spacing)*14)}.lg\:py-15{padding-block:calc(var(--spacing)*15)}.lg\:py-16{padding-block:calc(var(--spacing)*16)}.lg\:py-17{padding-block:calc(var(--spacing)*17)}.lg\:py-18{padding-block:calc(var(--spacing)*18)}.lg\:py-19{padding-block:calc(var(--spacing)*19)}.lg\:py-20{padding-block:calc(var(--spacing)*20)}.lg\:py-21{padding-block:calc(var(--spacing)*21)}.lg\:py-22{padding-block:calc(var(--spacing)*22)}.lg\:py-23{padding-block:calc(var(--spacing)*23)}.lg\:py-24{padding-block:calc(var(--spacing)*24)}.lg\:pt-0{padding-top:calc(var(--spacing)*0)}.lg\:pt-1{padding-top:calc(var(--spacing)*1)}.lg\:pt-2{padding-top:calc(var(--spacing)*2)}.lg\:pt-3{padding-top:calc(var(--spacing)*3)}.lg\:pt-4{padding-top:calc(var(--spacing)*4)}.lg\:pt-5{padding-top:calc(var(--spacing)*5)}.lg\:pt-6{padding-top:calc(var(--spacing)*6)}.lg\:pt-7{padding-top:calc(var(--spacing)*7)}.lg\:pt-8{padding-top:calc(var(--spacing)*8)}.lg\:pt-9{padding-top:calc(var(--spacing)*9)}.lg\:pt-10{padding-top:calc(var(--spacing)*10)}.lg\:pt-11{padding-top:calc(var(--spacing)*11)}.lg\:pt-12{padding-top:calc(var(--spacing)*12)}.lg\:pt-13{padding-top:calc(var(--spacing)*13)}.lg\:pt-14{padding-top:calc(var(--spacing)*14)}.lg\:pt-15{padding-top:calc(var(--spacing)*15)}.lg\:pt-16{padding-top:calc(var(--spacing)*16)}.lg\:pt-17{padding-top:calc(var(--spacing)*17)}.lg\:pt-18{padding-top:calc(var(--spacing)*18)}.lg\:pt-19{padding-top:calc(var(--spacing)*19)}.lg\:pt-20{padding-top:calc(var(--spacing)*20)}.lg\:pt-21{padding-top:calc(var(--spacing)*21)}.lg\:pt-22{padding-top:calc(var(--spacing)*22)}.lg\:pt-23{padding-top:calc(var(--spacing)*23)}.lg\:pt-24{padding-top:calc(var(--spacing)*24)}.lg\:pr-0{padding-right:calc(var(--spacing)*0)}.lg\:pr-1{padding-right:calc(var(--spacing)*1)}.lg\:pr-2{padding-right:calc(var(--spacing)*2)}.lg\:pr-3{padding-right:calc(var(--spacing)*3)}.lg\:pr-4{padding-right:calc(var(--spacing)*4)}.lg\:pr-5{padding-right:calc(var(--spacing)*5)}.lg\:pr-6{padding-right:calc(var(--spacing)*6)}.lg\:pr-7{padding-right:calc(var(--spacing)*7)}.lg\:pr-8{padding-right:calc(var(--spacing)*8)}.lg\:pr-9{padding-right:calc(var(--spacing)*9)}.lg\:pr-10{padding-right:calc(var(--spacing)*10)}.lg\:pr-11{padding-right:calc(var(--spacing)*11)}.lg\:pr-12{padding-right:calc(var(--spacing)*12)}.lg\:pr-13{padding-right:calc(var(--spacing)*13)}.lg\:pr-14{padding-right:calc(var(--spacing)*14)}.lg\:pr-15{padding-right:calc(var(--spacing)*15)}.lg\:pr-16{padding-right:calc(var(--spacing)*16)}.lg\:pr-17{padding-right:calc(var(--spacing)*17)}.lg\:pr-18{padding-right:calc(var(--spacing)*18)}.lg\:pr-19{padding-right:calc(var(--spacing)*19)}.lg\:pr-20{padding-right:calc(var(--spacing)*20)}.lg\:pr-21{padding-right:calc(var(--spacing)*21)}.lg\:pr-22{padding-right:calc(var(--spacing)*22)}.lg\:pr-23{padding-right:calc(var(--spacing)*23)}.lg\:pr-24{padding-right:calc(var(--spacing)*24)}.lg\:pb-0{padding-bottom:calc(var(--spacing)*0)}.lg\:pb-1{padding-bottom:calc(var(--spacing)*1)}.lg\:pb-2{padding-bottom:calc(var(--spacing)*2)}.lg\:pb-3{padding-bottom:calc(var(--spacing)*3)}.lg\:pb-4{padding-bottom:calc(var(--spacing)*4)}.lg\:pb-5{padding-bottom:calc(var(--spacing)*5)}.lg\:pb-6{padding-bottom:calc(var(--spacing)*6)}.lg\:pb-7{padding-bottom:calc(var(--spacing)*7)}.lg\:pb-8{padding-bottom:calc(var(--spacing)*8)}.lg\:pb-9{padding-bottom:calc(var(--spacing)*9)}.lg\:pb-10{padding-bottom:calc(var(--spacing)*10)}.lg\:pb-11{padding-bottom:calc(var(--spacing)*11)}.lg\:pb-12{padding-bottom:calc(var(--spacing)*12)}.lg\:pb-13{padding-bottom:calc(var(--spacing)*13)}.lg\:pb-14{padding-bottom:calc(var(--spacing)*14)}.lg\:pb-15{padding-bottom:calc(var(--spacing)*15)}.lg\:pb-16{padding-bottom:calc(var(--spacing)*16)}.lg\:pb-17{padding-bottom:calc(var(--spacing)*17)}.lg\:pb-18{padding-bottom:calc(var(--spacing)*18)}.lg\:pb-19{padding-bottom:calc(var(--spacing)*19)}.lg\:pb-20{padding-bottom:calc(var(--spacing)*20)}.lg\:pb-21{padding-bottom:calc(var(--spacing)*21)}.lg\:pb-22{padding-bottom:calc(var(--spacing)*22)}.lg\:pb-23{padding-bottom:calc(var(--spacing)*23)}.lg\:pb-24{padding-bottom:calc(var(--spacing)*24)}.lg\:pl-0{padding-left:calc(var(--spacing)*0)}.lg\:pl-1{padding-left:calc(var(--spacing)*1)}.lg\:pl-2{padding-left:calc(var(--spacing)*2)}.lg\:pl-3{padding-left:calc(var(--spacing)*3)}.lg\:pl-4{padding-left:calc(var(--spacing)*4)}.lg\:pl-5{padding-left:calc(var(--spacing)*5)}.lg\:pl-6{padding-left:calc(var(--spacing)*6)}.lg\:pl-7{padding-left:calc(var(--spacing)*7)}.lg\:pl-8{padding-left:calc(var(--spacing)*8)}.lg\:pl-9{padding-left:calc(var(--spacing)*9)}.lg\:pl-10{padding-left:calc(var(--spacing)*10)}.lg\:pl-11{padding-left:calc(var(--spacing)*11)}.lg\:pl-12{padding-left:calc(var(--spacing)*12)}.lg\:pl-13{padding-left:calc(var(--spacing)*13)}.lg\:pl-14{padding-left:calc(var(--spacing)*14)}.lg\:pl-15{padding-left:calc(var(--spacing)*15)}.lg\:pl-16{padding-left:calc(var(--spacing)*16)}.lg\:pl-17{padding-left:calc(var(--spacing)*17)}.lg\:pl-18{padding-left:calc(var(--spacing)*18)}.lg\:pl-19{padding-left:calc(var(--spacing)*19)}.lg\:pl-20{padding-left:calc(var(--spacing)*20)}.lg\:pl-21{padding-left:calc(var(--spacing)*21)}.lg\:pl-22{padding-left:calc(var(--spacing)*22)}.lg\:pl-23{padding-left:calc(var(--spacing)*23)}.lg\:pl-24{padding-left:calc(var(--spacing)*24)}.lg\:text-left{text-align:left}.lg\:align-top{vertical-align:top}.lg\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.lg\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.lg\:shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.lg\:backdrop-blur-xs{--tw-backdrop-blur:blur(var(--blur-xs));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.group-\[\.changelist-actions\]\:lg\:w-72:is(:where(.group).changelist-actions *){width:calc(var(--spacing)*72)}.lg\:group-\[\.field-row\]\:flex-row:is(:where(.group).field-row *){flex-direction:row}.lg\:group-\[\.field-row\]\:items-center:is(:where(.group).field-row *){align-items:center}.lg\:group-\[\.field-tabular\]\:flex-row:is(:where(.group).field-tabular *){flex-direction:row}.lg\:group-\[\.field-tabular\]\:items-center:is(:where(.group).field-tabular *){align-items:center}.lg\:group-\[\.first-row\]\:border-t-0:is(:where(.group).first-row *){border-top-style:var(--tw-border-style);border-top-width:0}.lg\:before\:hidden:before{content:var(--tw-content);display:none}.min-lg\:first\:rounded-l-default:first-child{border-top-left-radius:var(--border-radius,6px);border-bottom-left-radius:var(--border-radius,6px)}.lg\:first\:border-t:first-child{border-top-style:var(--tw-border-style);border-top-width:1px}.lg\:first\:border-l-0:first-child{border-left-style:var(--tw-border-style);border-left-width:0}.lg\:first\:pl-3:first-child{padding-left:calc(var(--spacing)*3)}.lg\:first\:pl-6:first-child{padding-left:calc(var(--spacing)*6)}.min-lg\:last\:rounded-r-default:last-child{border-top-right-radius:var(--border-radius,6px);border-bottom-right-radius:var(--border-radius,6px)}.lg\:last\:pr-3:last-child{padding-right:calc(var(--spacing)*3)}.lg\:last\:pr-6:last-child{padding-right:calc(var(--spacing)*6)}@media (hover:hover){.lg\:hover\:z-20:hover{z-index:20}.lg\:hover\:shadow-raised:hover{--tw-shadow:0 2px 12px var(--tw-shadow-color,var(--color-base-300));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}}@media (min-width:80rem){.xl\:relative{position:relative}.xl\:col-span-1{grid-column:span 1/span 1}.xl\:col-span-2{grid-column:span 2/span 2}.xl\:col-span-3{grid-column:span 3/span 3}.xl\:col-span-4{grid-column:span 4/span 4}.xl\:col-span-5{grid-column:span 5/span 5}.xl\:col-span-6{grid-column:span 6/span 6}.xl\:col-span-7{grid-column:span 7/span 7}.xl\:col-span-8{grid-column:span 8/span 8}.xl\:col-span-9{grid-column:span 9/span 9}.xl\:col-span-10{grid-column:span 10/span 10}.xl\:col-span-11{grid-column:span 11/span 11}.xl\:col-span-12{grid-column:span 12/span 12}.xl\:col-span-13{grid-column:span 13/span 13}.xl\:col-span-14{grid-column:span 14/span 14}.xl\:col-span-15{grid-column:span 15/span 15}.xl\:col-span-16{grid-column:span 16/span 16}.xl\:ml-0{margin-left:calc(var(--spacing)*0)}.xl\:ml-72{margin-left:calc(var(--spacing)*72)}.xl\:block{display:block}.xl\:block\!{display:block!important}.xl\:hidden\!{display:none!important}.xl\:max-w-4xl{max-width:var(--container-4xl)}.xl\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xl\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.xl\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.xl\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.xl\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.xl\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.xl\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.xl\:grid-cols-13{grid-template-columns:repeat(13,minmax(0,1fr))}.xl\:grid-cols-14{grid-template-columns:repeat(14,minmax(0,1fr))}.xl\:grid-cols-15{grid-template-columns:repeat(15,minmax(0,1fr))}.xl\:grid-cols-16{grid-template-columns:repeat(16,minmax(0,1fr))}.xl\:gap-0\.5{gap:calc(var(--spacing)*.5)}.xl\:gap-1{gap:calc(var(--spacing)*1)}.xl\:gap-2{gap:calc(var(--spacing)*2)}.xl\:gap-3{gap:calc(var(--spacing)*3)}.xl\:gap-4{gap:calc(var(--spacing)*4)}.xl\:gap-5{gap:calc(var(--spacing)*5)}.xl\:gap-6{gap:calc(var(--spacing)*6)}.xl\:gap-7{gap:calc(var(--spacing)*7)}.xl\:gap-8{gap:calc(var(--spacing)*8)}.xl\:gap-9{gap:calc(var(--spacing)*9)}.xl\:gap-10{gap:calc(var(--spacing)*10)}.xl\:gap-11{gap:calc(var(--spacing)*11)}.xl\:gap-12{gap:calc(var(--spacing)*12)}.xl\:gap-13{gap:calc(var(--spacing)*13)}.xl\:gap-14{gap:calc(var(--spacing)*14)}.xl\:gap-15{gap:calc(var(--spacing)*15)}.xl\:gap-16{gap:calc(var(--spacing)*16)}.xl\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.xl\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media (min-width:96rem){.\32 xl\:absolute{position:absolute}.\32 xl\:relative{position:relative}.\32 xl\:sticky{position:sticky}.\32 xl\:top-4{top:calc(var(--spacing)*4)}.\32 xl\:z-10{z-index:10}.\32 xl\:m-0{margin:calc(var(--spacing)*0)}.\32 xl\:-mx-1{margin-inline:calc(var(--spacing)*-1)}.\32 xl\:block\!{display:block!important}.\32 xl\:flex{display:flex}.\32 xl\:hidden{display:none}.\32 xl\:overflow-visible{overflow:visible}.\32 xl\:border-0{border-style:var(--tw-border-style);border-width:0}.\32 xl\:border-t-0\!{border-top-style:var(--tw-border-style)!important;border-top-width:0!important}.\32 xl\:bg-transparent{background-color:#0000}.\32 xl\:bg-transparent\!{background-color:#0000!important}.\32 xl\:px-0{padding-inline:calc(var(--spacing)*0)}.\32 xl\:px-1{padding-inline:calc(var(--spacing)*1)}.\32 xl\:py-0{padding-block:calc(var(--spacing)*0)}.\32 xl\:pb-1{padding-bottom:calc(var(--spacing)*1)}.\32 xl\:pb-24{padding-bottom:calc(var(--spacing)*24)}.\32 xl\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}@media not print{.dark\:block:where(.dark,.dark *){display:block}.dark\:hidden:where(.dark,.dark *){display:none}.dark\:border:where(.dark,.dark *){border-style:var(--tw-border-style);border-width:1px}.dark\:border-r:where(.dark,.dark *){border-right-style:var(--tw-border-style);border-right-width:1px}.dark\:border-amber-600\/10:where(.dark,.dark *){border-color:#dd74001a}@supports (color:color-mix(in lab, red, red)){.dark\:border-amber-600\/10:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-amber-600)10%,transparent)}}.dark\:border-base-50:where(.dark,.dark *){border-color:var(--color-base-50)}.dark\:border-base-100:where(.dark,.dark *){border-color:var(--color-base-100)}.dark\:border-base-200:where(.dark,.dark *){border-color:var(--color-base-200)}.dark\:border-base-300:where(.dark,.dark *){border-color:var(--color-base-300)}.dark\:border-base-400:where(.dark,.dark *){border-color:var(--color-base-400)}.dark\:border-base-500:where(.dark,.dark *){border-color:var(--color-base-500)}.dark\:border-base-600:where(.dark,.dark *){border-color:var(--color-base-600)}.dark\:border-base-700:where(.dark,.dark *){border-color:var(--color-base-700)}.dark\:border-base-700\!:where(.dark,.dark *){border-color:var(--color-base-700)!important}.dark\:border-base-800:where(.dark,.dark *){border-color:var(--color-base-800)}.dark\:border-base-900:where(.dark,.dark *){border-color:var(--color-base-900)}.dark\:border-base-950:where(.dark,.dark *){border-color:var(--color-base-950)}.dark\:border-blue-500:where(.dark,.dark *){border-color:var(--color-blue-500)}.dark\:border-blue-500\/10:where(.dark,.dark *){border-color:#3080ff1a}@supports (color:color-mix(in lab, red, red)){.dark\:border-blue-500\/10:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-blue-500)10%,transparent)}}.dark\:border-green-500:where(.dark,.dark *){border-color:var(--color-green-500)}.dark\:border-orange-500:where(.dark,.dark *){border-color:var(--color-orange-500)}.dark\:border-primary-500:where(.dark,.dark *){border-color:var(--color-primary-500)}.dark\:border-red-500:where(.dark,.dark *){border-color:var(--color-red-500)}.dark\:border-red-500\/20:where(.dark,.dark *){border-color:#fb2c3633}@supports (color:color-mix(in lab, red, red)){.dark\:border-red-500\/20:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.dark\:border-transparent:where(.dark,.dark *){border-color:#0000}.dark\:border-r-base-700:where(.dark,.dark *){border-right-color:var(--color-base-700)}.dark\:bg-amber-600\/20:where(.dark,.dark *){background-color:#dd740033}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-600\/20:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-amber-600)20%,transparent)}}.dark\:bg-base-50:where(.dark,.dark *){background-color:var(--color-base-50)}.dark\:bg-base-100:where(.dark,.dark *){background-color:var(--color-base-100)}.dark\:bg-base-200:where(.dark,.dark *){background-color:var(--color-base-200)}.dark\:bg-base-300:where(.dark,.dark *){background-color:var(--color-base-300)}.dark\:bg-base-400:where(.dark,.dark *){background-color:var(--color-base-400)}.dark\:bg-base-500:where(.dark,.dark *),.dark\:bg-base-500\/20:where(.dark,.dark *){background-color:var(--color-base-500)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-base-500\/20:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-base-500)20%,transparent)}}.dark\:bg-base-600:where(.dark,.dark *){background-color:var(--color-base-600)}.dark\:bg-base-700:where(.dark,.dark *){background-color:var(--color-base-700)}.dark\:bg-base-800:where(.dark,.dark *){background-color:var(--color-base-800)}.dark\:bg-base-800\!:where(.dark,.dark *){background-color:var(--color-base-800)!important}.dark\:bg-base-900:where(.dark,.dark *),.dark\:bg-base-900\/80:where(.dark,.dark *){background-color:var(--color-base-900)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-base-900\/80:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-base-900)80%,transparent)}}.dark\:bg-base-950:where(.dark,.dark *),.dark\:bg-base-950\/20:where(.dark,.dark *){background-color:var(--color-base-950)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-base-950\/20:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-base-950)20%,transparent)}}.dark\:bg-blue-500\/20:where(.dark,.dark *){background-color:#3080ff33}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-500\/20:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.dark\:bg-green-500\/20:where(.dark,.dark *){background-color:#00c75833}@supports (color:color-mix(in lab, red, red)){.dark\:bg-green-500\/20:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-green-500)20%,transparent)}}.dark\:bg-orange-500\/20:where(.dark,.dark *){background-color:#fe6e0033}@supports (color:color-mix(in lab, red, red)){.dark\:bg-orange-500\/20:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-orange-500)20%,transparent)}}.dark\:bg-primary-50:where(.dark,.dark *){background-color:var(--color-primary-50)}.dark\:bg-primary-100:where(.dark,.dark *){background-color:var(--color-primary-100)}.dark\:bg-primary-200:where(.dark,.dark *){background-color:var(--color-primary-200)}.dark\:bg-primary-300:where(.dark,.dark *){background-color:var(--color-primary-300)}.dark\:bg-primary-400:where(.dark,.dark *){background-color:var(--color-primary-400)}.dark\:bg-primary-500:where(.dark,.dark *),.dark\:bg-primary-500\/20:where(.dark,.dark *){background-color:var(--color-primary-500)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-primary-500\/20:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-primary-500)20%,transparent)}}.dark\:bg-primary-600:where(.dark,.dark *){background-color:var(--color-primary-600)}.dark\:bg-primary-700:where(.dark,.dark *){background-color:var(--color-primary-700)}.dark\:bg-primary-800:where(.dark,.dark *){background-color:var(--color-primary-800)}.dark\:bg-primary-900:where(.dark,.dark *){background-color:var(--color-primary-900)}.dark\:bg-primary-950:where(.dark,.dark *){background-color:var(--color-primary-950)}.dark\:bg-red-500\/20:where(.dark,.dark *){background-color:#fb2c3633}@supports (color:color-mix(in lab, red, red)){.dark\:bg-red-500\/20:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.dark\:bg-transparent:where(.dark,.dark *){background-color:#0000}.dark\:bg-white\/\[\.02\]:where(.dark,.dark *){background-color:#ffffff05}@supports (color:color-mix(in lab, red, red)){.dark\:bg-white\/\[\.02\]:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)2%,transparent)}}.dark\:bg-white\/\[\.04\]:where(.dark,.dark *){background-color:#ffffff0a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-white\/\[\.04\]:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)4%,transparent)}}.dark\:bg-white\/\[\.06\]:where(.dark,.dark *){background-color:#ffffff0f}@supports (color:color-mix(in lab, red, red)){.dark\:bg-white\/\[\.06\]:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)6%,transparent)}}.dark\:from-base-50:where(.dark,.dark *){--tw-gradient-from:var(--color-base-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-base-100:where(.dark,.dark *){--tw-gradient-from:var(--color-base-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-base-200:where(.dark,.dark *){--tw-gradient-from:var(--color-base-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-base-300:where(.dark,.dark *){--tw-gradient-from:var(--color-base-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-base-400:where(.dark,.dark *){--tw-gradient-from:var(--color-base-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-base-500:where(.dark,.dark *){--tw-gradient-from:var(--color-base-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-base-600:where(.dark,.dark *){--tw-gradient-from:var(--color-base-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-base-700:where(.dark,.dark *){--tw-gradient-from:var(--color-base-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-base-800:where(.dark,.dark *){--tw-gradient-from:var(--color-base-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-base-900:where(.dark,.dark *){--tw-gradient-from:var(--color-base-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-base-950:where(.dark,.dark *){--tw-gradient-from:var(--color-base-950);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-primary-50:where(.dark,.dark *){--tw-gradient-from:var(--color-primary-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-primary-100:where(.dark,.dark *){--tw-gradient-from:var(--color-primary-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-primary-200:where(.dark,.dark *){--tw-gradient-from:var(--color-primary-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-primary-300:where(.dark,.dark *){--tw-gradient-from:var(--color-primary-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-primary-400:where(.dark,.dark *){--tw-gradient-from:var(--color-primary-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-primary-500:where(.dark,.dark *){--tw-gradient-from:var(--color-primary-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-primary-600:where(.dark,.dark *){--tw-gradient-from:var(--color-primary-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-primary-700:where(.dark,.dark *){--tw-gradient-from:var(--color-primary-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-primary-800:where(.dark,.dark *){--tw-gradient-from:var(--color-primary-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-primary-900:where(.dark,.dark *){--tw-gradient-from:var(--color-primary-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-primary-950:where(.dark,.dark *){--tw-gradient-from:var(--color-primary-950);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-white:where(.dark,.dark *){--tw-gradient-from:var(--color-white);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-base-50:where(.dark,.dark *){--tw-gradient-to:var(--color-base-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-base-100:where(.dark,.dark *){--tw-gradient-to:var(--color-base-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-base-200:where(.dark,.dark *){--tw-gradient-to:var(--color-base-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-base-300:where(.dark,.dark *){--tw-gradient-to:var(--color-base-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-base-400:where(.dark,.dark *){--tw-gradient-to:var(--color-base-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-base-500:where(.dark,.dark *){--tw-gradient-to:var(--color-base-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-base-600:where(.dark,.dark *){--tw-gradient-to:var(--color-base-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-base-700:where(.dark,.dark *){--tw-gradient-to:var(--color-base-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-base-800:where(.dark,.dark *){--tw-gradient-to:var(--color-base-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-base-900:where(.dark,.dark *){--tw-gradient-to:var(--color-base-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-base-950:where(.dark,.dark *){--tw-gradient-to:var(--color-base-950);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-primary-50:where(.dark,.dark *){--tw-gradient-to:var(--color-primary-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-primary-100:where(.dark,.dark *){--tw-gradient-to:var(--color-primary-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-primary-200:where(.dark,.dark *){--tw-gradient-to:var(--color-primary-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-primary-300:where(.dark,.dark *){--tw-gradient-to:var(--color-primary-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-primary-400:where(.dark,.dark *){--tw-gradient-to:var(--color-primary-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-primary-500:where(.dark,.dark *){--tw-gradient-to:var(--color-primary-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-primary-600:where(.dark,.dark *){--tw-gradient-to:var(--color-primary-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-primary-700:where(.dark,.dark *){--tw-gradient-to:var(--color-primary-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-primary-800:where(.dark,.dark *){--tw-gradient-to:var(--color-primary-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-primary-900:where(.dark,.dark *){--tw-gradient-to:var(--color-primary-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-primary-950:where(.dark,.dark *){--tw-gradient-to:var(--color-primary-950);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-white:where(.dark,.dark *){--tw-gradient-to:var(--color-white);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:text-base-50:where(.dark,.dark *){color:var(--color-base-50)}.dark\:text-base-100:where(.dark,.dark *){color:var(--color-base-100)}.dark\:text-base-200:where(.dark,.dark *){color:var(--color-base-200)}.dark\:text-base-300:where(.dark,.dark *){color:var(--color-base-300)}.dark\:text-base-300\!:where(.dark,.dark *){color:var(--color-base-300)!important}.dark\:text-base-400:where(.dark,.dark *){color:var(--color-base-400)}.dark\:text-base-500:where(.dark,.dark *){color:var(--color-base-500)}.dark\:text-base-600:where(.dark,.dark *){color:var(--color-base-600)}.dark\:text-base-700:where(.dark,.dark *){color:var(--color-base-700)}.dark\:text-base-800:where(.dark,.dark *){color:var(--color-base-800)}.dark\:text-base-900:where(.dark,.dark *){color:var(--color-base-900)}.dark\:text-base-950:where(.dark,.dark *){color:var(--color-base-950)}.dark\:text-blue-400:where(.dark,.dark *){color:var(--color-blue-400)}.dark\:text-font-default-dark:where(.dark,.dark *){color:var(--color-font-default-dark)}.dark\:text-font-important-dark:where(.dark,.dark *){color:var(--color-font-important-dark)}.dark\:text-font-important-dark\!:where(.dark,.dark *){color:var(--color-font-important-dark)!important}.dark\:text-font-subtle-dark:where(.dark,.dark *){color:var(--color-font-subtle-dark)}.dark\:text-green-400:where(.dark,.dark *){color:var(--color-green-400)}.dark\:text-orange-400:where(.dark,.dark *){color:var(--color-orange-400)}.dark\:text-primary-400:where(.dark,.dark *){color:var(--color-primary-400)}.dark\:text-primary-500:where(.dark,.dark *){color:var(--color-primary-500)}.dark\:text-red-400:where(.dark,.dark *){color:var(--color-red-400)}.dark\:text-red-500:where(.dark,.dark *){color:var(--color-red-500)}.dark\:text-white:where(.dark,.dark *){color:var(--color-white)}.dark\:placeholder-font-subtle-dark:where(.dark,.dark *)::placeholder{color:var(--color-font-subtle-dark)}.dark\:scheme-dark:where(.dark,.dark *){color-scheme:dark}:is(.dark\:\*\:text-font-important-dark:where(.dark,.dark *)>*){color:var(--color-font-important-dark)}@media (hover:hover){.dark\:group-hover\:text-primary-500:where(.dark,.dark *):is(:where(.group):hover *){color:var(--color-primary-500)}.dark\:group-hover\/action\:bg-base-800:where(.dark,.dark *):is(:where(.group\/action):hover *){background-color:var(--color-base-800)}.dark\:group-hover\/action\:text-white:where(.dark,.dark *):is(:where(.group\/action):hover *){color:var(--color-white)}}.dark\:group-\[\.active\]\:bg-primary-600:where(.dark,.dark *):is(:where(.group).active *){background-color:var(--color-primary-600)}.dark\:group-\[\.active\]\:text-white:where(.dark,.dark *):is(:where(.group).active *){color:var(--color-white)}.group-\[\.changelist-actions\]\:dark\:\!outline-primary-700:is(:where(.group).changelist-actions *):where(.dark,.dark *){outline-color:var(--color-primary-700)!important}.dark\:group-\[\.errors\]\:border-red-500:where(.dark,.dark *):is(:where(.group).errors *){border-color:var(--color-red-500)}.dark\:group-\[\.errors\]\:border-red-500\!:where(.dark,.dark *):is(:where(.group).errors *){border-color:var(--color-red-500)!important}.dark\:group-\[\.errors\]\:border-x-red-500:where(.dark,.dark *):is(:where(.group).errors *){border-inline-color:var(--color-red-500)}.dark\:group-\[\.errors\]\:border-t-red-500:where(.dark,.dark *):is(:where(.group).errors *){border-top-color:var(--color-red-500)}.dark\:before\:text-font-important-dark:where(.dark,.dark *):before{content:var(--tw-content);color:var(--color-font-important-dark)}.dark\:after\:bg-transparent:where(.dark,.dark *):after{content:var(--tw-content);background-color:#0000}.dark\:after\:text-base-700:where(.dark,.dark *):after{content:var(--tw-content);color:var(--color-base-700)}.dark\:checked\:border-primary-600:where(.dark,.dark *):checked{border-color:var(--color-primary-600)}.dark\:checked\:bg-green-700:where(.dark,.dark *):checked{background-color:var(--color-green-700)}.dark\:checked\:bg-primary-600:where(.dark,.dark *):checked{background-color:var(--color-primary-600)}.dark\:checked\:after\:bg-base-900:where(.dark,.dark *):checked:after{content:var(--tw-content);background-color:var(--color-base-900)}.dark\:checked\:after\:text-white:where(.dark,.dark *):checked:after{content:var(--tw-content);color:var(--color-white)}.dark\:focus-within\:group-\[\.errors\]\:outline-red-500:where(.dark,.dark *):focus-within:is(:where(.group).errors *){outline-color:var(--color-red-500)}@media (hover:hover){.dark\:hover\:border-base-700:where(.dark,.dark *):hover{border-color:var(--color-base-700)}.dark\:hover\:bg-base-700:where(.dark,.dark *):hover{background-color:var(--color-base-700)}.dark\:hover\:bg-base-800:where(.dark,.dark *):hover{background-color:var(--color-base-800)}.dark\:hover\:bg-base-900:where(.dark,.dark *):hover{background-color:var(--color-base-900)}.dark\:hover\:bg-red-500\/20:where(.dark,.dark *):hover{background-color:#fb2c3633}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-red-500\/20:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.dark\:hover\:bg-white\/\[\.04\]:where(.dark,.dark *):hover{background-color:#ffffff0a}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-white\/\[\.04\]:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)4%,transparent)}}.dark\:hover\:bg-white\/\[\.06\]:where(.dark,.dark *):hover{background-color:#ffffff0f}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-white\/\[\.06\]:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)6%,transparent)}}.dark\:hover\:text-base-200:where(.dark,.dark *):hover{color:var(--color-base-200)}.dark\:hover\:text-base-400:where(.dark,.dark *):hover{color:var(--color-base-400)}.dark\:hover\:text-font-important-dark:where(.dark,.dark *):hover{color:var(--color-font-important-dark)}.dark\:hover\:text-primary-500:where(.dark,.dark *):hover{color:var(--color-primary-500)}.dark\:hover\:text-primary-500\!:where(.dark,.dark *):hover{color:var(--color-primary-500)!important}.dark\:hover\:text-red-500:where(.dark,.dark *):hover{color:var(--color-red-500)}.dark\:hover\:text-white:where(.dark,.dark *):hover{color:var(--color-white)}.dark\:hover\:shadow-raised-dark:where(.dark,.dark *):hover{--tw-shadow:0 2px 12px var(--tw-shadow-color,var(--color-base-700));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark\:hover\:shadow-base-800\/50:where(.dark,.dark *):hover{--tw-shadow-color:var(--color-base-800)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:shadow-base-800\/50:where(.dark,.dark *):hover{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-base-800)50%,transparent)var(--tw-shadow-alpha),transparent)}}:is(.\*\:dark\:hover\:bg-base-700>*):where(.dark,.dark *):hover{background-color:var(--color-base-700)}:is(.\*\:dark\:hover\:bg-white\/\[\.04\]>*):where(.dark,.dark *):hover{background-color:#ffffff0a}@supports (color:color-mix(in lab, red, red)){:is(.\*\:dark\:hover\:bg-white\/\[\.04\]>*):where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)4%,transparent)}}:is(.\*\:dark\:hover\:text-base-200>*):where(.dark,.dark *):hover{color:var(--color-base-200)}}.dark\:focus\:group-\[\.errors\]\:outline-red-500:where(.dark,.dark *):focus:is(:where(.group).errors *){outline-color:var(--color-red-500)}.dark\:disabled\:\!bg-base-800:where(.dark,.dark *):disabled{background-color:var(--color-base-800)!important}@media (min-width:64rem){.dark\:lg\:border-base-800:where(.dark,.dark *){border-color:var(--color-base-800)}}}@media (min-width:64rem){@media not print{.lg\:dark\:border-base-800:where(.dark,.dark *){border-color:var(--color-base-800)}}}@media not print{@media (min-width:64rem){.dark\:lg\:\!bg-transparent:where(.dark,.dark *),.dark\:lg\:bg-transparent\!:where(.dark,.dark *){background-color:#0000!important}}}@media (min-width:64rem){@media not print{.lg\:dark\:bg-base-900:where(.dark,.dark *),.lg\:dark\:bg-base-900\/80:where(.dark,.dark *){background-color:var(--color-base-900)}@supports (color:color-mix(in lab, red, red)){.lg\:dark\:bg-base-900\/80:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-base-900)80%,transparent)}}@media (hover:hover){.lg\:dark\:hover\:shadow-raised-dark:where(.dark,.dark *):hover{--tw-shadow:0 2px 12px var(--tw-shadow-color,var(--color-base-700));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}}}@media (min-width:96rem){@media not print{.\32 xl\:dark\:border-base-800:where(.dark,.dark *){border-color:var(--color-base-800)}.\32 xl\:dark\:bg-transparent\!:where(.dark,.dark *){background-color:#0000!important}}}.prose-headings\:font-medium :where(h1,h2,h3,h4,h5,h6,th):not(:where([class~=not-prose],[class~=not-prose] *)){--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.prose-headings\:text-base-700 :where(h1,h2,h3,h4,h5,h6,th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--color-base-700)}@media not print{.dark\:prose-headings\:text-base-200:where(.dark,.dark *) :where(h1,h2,h3,h4,h5,h6,th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--color-base-200)}}.prose-a\:text-primary-600 :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--color-primary-600)}.prose-blockquote\:border-l-4 :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){border-left-style:var(--tw-border-style);border-left-width:4px}.prose-blockquote\:not-italic :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-style:normal}@media not print{.dark\:prose-blockquote\:border-base-700:where(.dark,.dark *) :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--color-base-700)}.dark\:prose-blockquote\:text-base-300:where(.dark,.dark *) :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--color-base-300)}}.prose-strong\:text-base-700 :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--color-base-700)}@media not print{.dark\:prose-strong\:text-base-200:where(.dark,.dark *) :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--color-base-200)}}.prose-pre\:rounded-default :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:var(--border-radius,6px)}.prose-pre\:bg-base-50 :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:var(--color-base-50)}@media not print{.dark\:prose-pre\:bg-base-800:where(.dark,.dark *) :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:var(--color-base-800)}}.prose-ol\:list-decimal :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose-ul\:list-disc :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc}.\[\&\.htmx-request\]\:flex.htmx-request{display:flex}.\[\&\.htmx-request\+div\]\:hidden.htmx-request+div{display:none}.\[\&\>\.active\]\:bg-white>.active{background-color:var(--color-white)}.\[\&\>\.active\]\:shadow-xs>.active{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media (hover:hover){.\[\&\>\.active\]\:hover\:bg-white>.active:hover{background-color:var(--color-white)}}@media not print{.\[\&\>\.active\]\:dark\:bg-base-900>.active:where(.dark,.dark *){background-color:var(--color-base-900)}@media (hover:hover){.\[\&\>\.active\]\:dark\:hover\:bg-base-900>.active:where(.dark,.dark *):hover{background-color:var(--color-base-900)}}}.\[\&\>tbody\:nth-child\(odd\)\]\:bg-base-50>tbody:nth-child(odd){background-color:var(--color-base-50)}@media not print{.dark\:\[\&\>tbody\:nth-child\(odd\)\]\:bg-white\/\[\.02\]:where(.dark,.dark *)>tbody:nth-child(odd){background-color:#ffffff05}@supports (color:color-mix(in lab, red, red)){.dark\:\[\&\>tbody\:nth-child\(odd\)\]\:bg-white\/\[\.02\]:where(.dark,.dark *)>tbody:nth-child(odd){background-color:color-mix(in oklab,var(--color-white)2%,transparent)}}}}:is(.errorlist>*):before{content:var(--tw-content);margin-right:calc(var(--spacing)*1);content:var(--tw-content);letter-spacing:normal;text-transform:none;white-space:nowrap;word-wrap:normal;-moz-font-feature-settings:"liga";-moz-osx-font-smoothing:grayscale;content:var(--tw-content);vertical-align:bottom;--tw-content:"warning";content:var(--tw-content);direction:ltr;font-family:Material Symbols Outlined;font-size:18px;font-style:normal;font-weight:400;line-height:1;display:inline-block}[x-cloak]{display:none!important}.asteriskField{color:var(--color-red-600)}.sortable-ghost{opacity:.5}input[type=search]::-webkit-search-cancel-button{z-index:10}@media not print{input[type=search]::-webkit-search-cancel-button:where(.dark,.dark *){--tw-invert:invert(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}}select:not([class*=bg-none]):not([multiple]){background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 48'%3e%3cpath fill='#6B7280' d='M24 31.4 11.3 18.7l2.85-2.8L24 25.8l9.85-9.85 2.85 2.8Z'/%3e%3c/svg%3e");background-position:right .7rem center;background-repeat:no-repeat;background-size:1.125rem 1.125rem}#changelist-actions select:not([class*=bg-none]):not([multiple]){background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 48'%3e%3cpath fill='#ffffff' d='M24 31.4 11.3 18.7l2.85-2.8L24 25.8l9.85-9.85 2.85 2.8Z'/%3e%3c/svg%3e")}select:after{content:"";display:block}table tr.selected td,table tr.selected th{background-color:#fff0851a}@supports (color:color-mix(in lab, red, red)){table tr.selected td,table tr.selected th{background-color:color-mix(in oklab,var(--color-yellow-200)10%,transparent)}}@media not print{:is(table tr.selected td,table tr.selected th):where(.dark,.dark *){background-color:#ffffff08}@supports (color:color-mix(in lab, red, red)){:is(table tr.selected td,table tr.selected th):where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)3%,transparent)}}}.datetimeshortcuts{flex-direction:row-reverse;align-items:center;font-size:0;display:flex;position:absolute;top:1px;right:1px}.datetimeshortcuts a{height:calc(var(--spacing)*9);color:var(--color-base-400);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));align-items:center;font-size:0;display:flex}@media (hover:hover){.datetimeshortcuts a:hover{color:var(--color-base-700)}}.datetimeshortcuts a:first-child{display:none}.datetimeshortcuts a:first-child:after{letter-spacing:normal;text-transform:none;white-space:nowrap;word-wrap:normal;-moz-font-feature-settings:"liga";-moz-osx-font-smoothing:grayscale;height:calc(var(--spacing)*9);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);text-align:center;--tw-leading:1;--tw-content:"update";content:var(--tw-content);direction:ltr;justify-content:center;align-items:center;font-family:Material Symbols Outlined;font-size:18px;font-style:normal;font-weight:400;line-height:1;display:flex}@media (hover:hover){.datetimeshortcuts a:first-child:after:hover{color:var(--color-base-700)}}@media not print{.datetimeshortcuts a:first-child:after:where(){border-color:var(--color-base-700)}@media (hover:hover){.datetimeshortcuts a:first-child:after:where():hover{color:var(--color-base-700)}}}.datetimeshortcuts a:first-child:after{display:flex}.clock-icon,.date-icon{color:var(--color-base-400);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));display:block}@media (hover:hover){:is(.clock-icon,.date-icon):hover{color:var(--color-base-700)}}@media not print{:is(.clock-icon,.date-icon):where(.dark,.dark *){color:var(--color-base-500)}@media (hover:hover){:is(.clock-icon,.date-icon):where(.dark,.dark *):hover{color:var(--color-base-200)}}}:is(.clock-icon,.date-icon):after{content:var(--tw-content);letter-spacing:normal;text-transform:none;white-space:nowrap;word-wrap:normal;-moz-font-feature-settings:"liga";-moz-osx-font-smoothing:grayscale;content:var(--tw-content);border-color:var(--color-base-200);content:var(--tw-content);padding-inline:calc(var(--spacing)*3);direction:ltr;font-family:Material Symbols Outlined;font-size:18px;font-style:normal;font-weight:400;line-height:1;display:inline-block}@media not print{:is(.clock-icon,.date-icon):where(.dark,.dark *):after{content:var(--tw-content);border-color:var(--color-base-700)}}.date-icon:after{content:"calendar_today"}.clock-icon:after{content:"schedule"}.timezonewarning{top:calc(var(--spacing)*2);right:calc(var(--spacing)*11);text-overflow:ellipsis;white-space:nowrap;color:var(--color-base-500);align-items:center;font-size:0;display:block;position:absolute;overflow:hidden}.timezonewarning:hover{border-radius:var(--border-radius,6px);background-color:var(--color-white);padding-inline:calc(var(--spacing)*3);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-leading:calc(var(--spacing)*9);line-height:calc(var(--spacing)*9);inset:1px}@media not print{.timezonewarning:hover:where(.dark,.dark *){background-color:var(--color-base-900)}}.timezonewarning:hover:before{margin-right:calc(var(--spacing)*2);display:none}.timezonewarning:before{letter-spacing:normal;text-transform:none;white-space:nowrap;word-wrap:normal;-moz-font-feature-settings:"liga";-moz-osx-font-smoothing:grayscale;cursor:pointer;border-color:var(--color-base-200);text-align:center;font-family:Material Symbols Outlined;font-size:18px;font-style:normal;font-weight:400;line-height:1;font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));color:var(--color-red-600);direction:ltr;justify-content:center;align-items:center;display:block}@media not print{.timezonewarning:before:where(){border-color:var(--color-base-700)}}.timezonewarning:before{content:"warning"}.selector{max-width:var(--container-5xl);flex-direction:column;flex-grow:1;align-items:center;display:flex}@media (min-width:48rem){.selector{flex-direction:row}}.selector .selector-available-title label,.selector .selector-chosen-title label{margin-bottom:calc(var(--spacing)*3);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-base-200);padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--color-font-important-light);display:block}@media not print{:is(.selector .selector-available-title label,.selector .selector-chosen-title label):where(.dark,.dark *){border-color:var(--color-base-700);color:var(--color-font-important-dark)}}.selector .helptext{margin-bottom:calc(var(--spacing)*3);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-base-200);padding-inline:calc(var(--spacing)*4);padding-bottom:calc(var(--spacing)*3)}@media not print{.selector .helptext:where(.dark,.dark *){border-color:var(--color-base-700)}}.selector select{background-image:none;flex-grow:1;width:100%}@media not print{.selector select:where(.dark,.dark *){background-color:var(--color-base-900);color-scheme:dark}}.selector option{text-overflow:ellipsis;white-space:nowrap;padding-inline:calc(var(--spacing)*3);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-base-500);overflow:hidden}@media not print{.selector option:where(.dark,.dark *){color:var(--color-base-300)}}.selector .list-footer-display{border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--color-base-200);padding-block:calc(var(--spacing)*2);text-align:center;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}@media not print{.selector .list-footer-display:where(.dark,.dark *){border-color:var(--color-base-700)}}.selector-chosen,.selector-available{border-radius:var(--border-radius,6px);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-base-200);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);flex-direction:column;flex-grow:1;align-self:stretch;display:flex}@media (min-width:48rem){.selector-chosen,.selector-available{width:calc(var(--spacing)*72)}}@media (min-width:64rem){.selector-chosen,.selector-available{width:calc(var(--spacing)*96)}}@media not print{:is(.selector-chosen,.selector-available):where(.dark,.dark *){border-color:var(--color-base-700)}}.selector-chosen h2,.selector-available h2{margin-bottom:calc(var(--spacing)*3);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-base-200);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-base-500)}@media not print{:is(.selector-chosen h2,.selector-available h2):where(.dark,.dark *){border-color:var(--color-base-700);color:var(--color-base-200)}}.selector-filter{display:flex}.selector-filter input{margin-inline:calc(var(--spacing)*3);margin-bottom:calc(var(--spacing)*3);border-radius:var(--border-radius,6px);background-color:var(--color-base-100);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-base-500);flex-grow:1;display:block}.selector-filter input:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.selector-filter input:focus{outline-offset:2px;outline:2px solid #0000}}@media not print{.selector-filter input:where(.dark,.dark *){background-color:var(--color-base-800);color:var(--color-base-300)}}.selector-chooseall,.selector-clearall{cursor:pointer;border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--color-base-200);padding-block:calc(var(--spacing)*2);text-align:center;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-font-default-light);display:block}@media not print{:is(.selector-chooseall,.selector-clearall):where(.dark,.dark *){color:var(--color-font-default-dark);border-color:var(--color-base-700)}}.selector-clearall{color:var(--color-red-600)}@media not print{.selector-clearall:where(.dark,.dark *){color:var(--color-red-500)}}.selector-chooser{margin-block:calc(var(--spacing)*4);width:calc(var(--spacing)*14);flex-direction:column;font-size:0;display:flex}.selector-chooser li{padding-block:calc(var(--spacing)*1);text-align:center}.selector-add:after,.selector-remove:after{letter-spacing:normal;text-transform:none;white-space:nowrap;word-wrap:normal;-moz-font-feature-settings:"liga";-moz-osx-font-smoothing:grayscale;width:calc(var(--spacing)*5);color:var(--color-base-400);direction:ltr;font-family:Material Symbols Outlined;font-size:18px;font-style:normal;font-weight:400;line-height:1;display:inline-block}.selector-add:after{content:"arrow_forward"}.selector-remove:after{content:"arrow_back"}.related-widget-wrapper{flex-wrap:nowrap!important}.related-widget-wrapper-link{order:9999}.empty-form{display:none}.tabular-table tbody.has_original,.tabular-table .template tr{border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--color-base-200)}@media not print{:is(.tabular-table tbody.has_original,.tabular-table .template tr):where(.dark,.dark *){border-color:var(--color-base-800)}}.tabular-table tbody.has_original:first-of-type{border-top-style:var(--tw-border-style);border-top-width:0}.add-row{background-color:var(--color-white);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*5);text-align:right;vertical-align:middle;--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}@media not print{.add-row:where(.dark,.dark *){background-color:var(--color-base-900)}}[data-inline-type=stacked] .add-row{overflow:hidden}.add-row td{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*4)}.add-row a{border-radius:var(--border-radius,6px);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-base-200);background-color:var(--color-white);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);text-align:center;--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);display:block}@media (hover:hover){.add-row a:hover{color:var(--color-base-700)}}@media (min-width:64rem){.add-row a{float:right}}@media not print{.add-row a:where(.dark,.dark *){border-color:var(--color-base-700);background-color:var(--color-base-900)}@media (hover:hover){.add-row a:where(.dark,.dark *):hover{color:var(--color-base-200)}}}.inline-deletelink{--tw-leading:1;color:var(--color-red-600);line-height:1;display:block}@media not print{.inline-deletelink:where(.dark,.dark *){color:var(--color-red-500)}}td .inline-deletelink{display:block}@media (min-width:64rem){td .inline-deletelink{margin-top:calc(var(--spacing)*2.5)}}.select2.select2-container{max-width:var(--container-2xl);border-radius:var(--border-radius,6px);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-base-200);background-color:var(--color-white);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);position:relative;width:100%!important;min-height:38px!important}@media not print{.select2.select2-container:where(.dark,.dark *){border-color:var(--color-base-700);background-color:var(--color-base-900)}}.select2-selection{--tw-outline-style:none;outline-style:none}.select2.select2-container--open{border-bottom-style:var(--tw-border-style);border-bottom-width:0;border-color:var(--color-primary-600);outline-style:var(--tw-outline-style);outline-offset:calc(2px*-1);outline-width:2px;outline-color:var(--color-primary-600);position:relative}.select2.select2-container.select2-container--focus{outline-style:var(--tw-outline-style);outline-offset:calc(2px*-1);outline-width:2px;outline-color:var(--color-primary-600)}.errors .select2.select2-container{border-color:var(--color-red-600)}.select2-container.select2-container--admin-autocomplete .select2-selection--single{height:auto}.select2-container.select2-container--admin-autocomplete .select2-selection--single .select2-selection__rendered{height:calc(var(--spacing)*9);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-font-default-light)}@media not print{.select2-container.select2-container--admin-autocomplete .select2-selection--single .select2-selection__rendered:where(.dark,.dark *){color:var(--color-font-default-dark)}}.select2-container.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__clear,.select2-container.select2-container--admin-autocomplete .select2-selection--single .select2-selection__clear{margin-top:calc(var(--spacing)*-2);height:calc(var(--spacing)*9);align-items:center;font-size:0;display:flex}:is(.select2-container.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__clear,.select2-container.select2-container--admin-autocomplete .select2-selection--single .select2-selection__clear):after{content:var(--tw-content);color:var(--color-base-400)}@media (hover:hover){:is(.select2-container.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__clear,.select2-container.select2-container--admin-autocomplete .select2-selection--single .select2-selection__clear):hover:after{content:var(--tw-content);color:var(--color-base-700)}}@media not print{:is(.select2-container.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__clear,.select2-container.select2-container--admin-autocomplete .select2-selection--single .select2-selection__clear):where(.dark,.dark *):after{content:var(--tw-content);color:var(--color-base-500)}@media (hover:hover){:is(.select2-container.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__clear,.select2-container.select2-container--admin-autocomplete .select2-selection--single .select2-selection__clear):where(.dark,.dark *):hover:after{content:var(--tw-content);color:var(--color-base-200)}}}.select2-container.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__clear:after,.select2-container.select2-container--admin-autocomplete .select2-selection--single .select2-selection__clear:after{letter-spacing:normal;text-transform:none;white-space:nowrap;word-wrap:normal;-moz-font-feature-settings:"liga";-moz-osx-font-smoothing:grayscale;transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-content:"close_small";content:var(--tw-content);direction:ltr;font-family:Material Symbols Outlined;font-size:18px;font-style:normal;font-weight:400;line-height:1;display:inline-block}.select2-container.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow{margin-top:-1px;margin-right:calc(var(--spacing)*2);height:calc(var(--spacing)*9);align-items:center;display:flex}.select2-container.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow:after{content:var(--tw-content);left:calc(var(--spacing)*0);content:var(--tw-content);margin:calc(var(--spacing)*0);content:var(--tw-content);letter-spacing:normal;text-transform:none;white-space:nowrap;word-wrap:normal;-moz-font-feature-settings:"liga";-moz-osx-font-smoothing:grayscale;content:var(--tw-content);font-family:Material Symbols Outlined;font-size:18px;font-style:normal;font-weight:400;line-height:1;font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height));content:var(--tw-content);--tw-leading:1;content:var(--tw-content);color:var(--color-base-400);direction:ltr;line-height:1;display:inline-block}@media not print{.select2-container.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow:where(.dark,.dark *):after{content:var(--tw-content);color:var(--color-base-500)}}.select2-container.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow:after{content:"expand_more"}.select2-container.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow b{display:none}.select2-container.select2-container--admin-autocomplete .select2-search--dropdown{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-base-200);padding-inline:calc(var(--spacing)*1);padding-block:calc(var(--spacing)*1.5);position:relative}.select2-container.select2-container--admin-autocomplete .select2-search--dropdown:before{content:var(--tw-content);content:var(--tw-content);top:calc(var(--spacing)*2.5);content:var(--tw-content);left:calc(var(--spacing)*4);content:var(--tw-content);letter-spacing:normal;text-transform:none;white-space:nowrap;word-wrap:normal;-moz-font-feature-settings:"liga";-moz-osx-font-smoothing:grayscale;content:var(--tw-content);font-family:Material Symbols Outlined;font-size:18px;font-style:normal;font-weight:400;line-height:1;font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height));content:var(--tw-content);color:var(--color-base-400);--tw-content:"search";content:var(--tw-content);direction:ltr;display:inline-block;position:absolute}@media not print{.select2-container.select2-container--admin-autocomplete .select2-search--dropdown:where(.dark,.dark *){border-color:var(--color-base-700)}.select2-container.select2-container--admin-autocomplete .select2-search--dropdown:where(.dark,.dark *):before{content:var(--tw-content);color:var(--color-base-500)}}.select2-container.select2-container--admin-autocomplete .select2-search--dropdown .select2-search__field{margin-inline:calc(var(--spacing)*0);border-radius:var(--border-radius,6px);border-style:var(--tw-border-style);--tw-border-style:solid;border-style:solid;border-width:0;border-color:var(--color-base-200);background-color:var(--color-base-100);width:100%;padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);padding-left:calc(var(--spacing)*9);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-font-default-light);--tw-outline-style:none;outline-style:none;flex-grow:1}@media (forced-colors:active){.select2-container.select2-container--admin-autocomplete .select2-search--dropdown .select2-search__field{outline-offset:2px;outline:2px solid #0000}}@media not print{.select2-container.select2-container--admin-autocomplete .select2-search--dropdown .select2-search__field:where(.dark,.dark *){border-color:var(--color-base-800);background-color:var(--color-base-800);color:var(--color-font-default-dark)}}.select2-container .select2-results__options{padding-block:calc(var(--spacing)*1)}.select2-container .select2-results__option--highlighted[aria-selected]{background-color:var(--color-base-100)!important}@media not print{.select2-container .select2-results__option--highlighted[aria-selected]:where(.dark,.dark *){background-color:var(--color-base-800)!important}}.select2-container.select2-container--open .select2-dropdown{border-radius:var(--border-radius,6px);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-base-200);background-color:var(--color-white);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media not print{.select2-container.select2-container--open .select2-dropdown:where(.dark,.dark *){border-color:var(--color-base-700);background-color:var(--color-base-900)}}.select2-container.select2-container--open .select2-dropdown--below{margin-top:calc(var(--spacing)*1)}.select2-container.select2-container--open .select2-dropdown--above{margin-bottom:calc(var(--spacing)*1)}.select2-container.select2-container--admin-autocomplete .select2-results__option{margin-inline:calc(var(--spacing)*1);margin-bottom:calc(var(--spacing)*.5);border-radius:var(--border-radius,6px);padding-inline:calc(var(--spacing)*2);padding-block:calc(var(--spacing)*2);color:var(--color-font-default-light);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));display:block}.select2-container.select2-container--admin-autocomplete .select2-results__option:last-child{margin-bottom:calc(var(--spacing)*0)}@media (hover:hover){.select2-container.select2-container--admin-autocomplete .select2-results__option:hover{background-color:var(--color-base-100);color:var(--color-base-700)}}@media not print{.select2-container.select2-container--admin-autocomplete .select2-results__option:where(.dark,.dark *){color:var(--color-font-default-dark)}@media (hover:hover){.select2-container.select2-container--admin-autocomplete .select2-results__option:where(.dark,.dark *):hover{background-color:var(--color-base-800);color:var(--color-base-200)}}}.select2-container.select2-container--admin-autocomplete .select2-results__option[aria-selected=true]{color:var(--color-primary-600);align-items:center;display:flex}.select2-container.select2-container--admin-autocomplete .select2-results__option[aria-selected=true]:after{content:var(--tw-content);content:var(--tw-content);letter-spacing:normal;text-transform:none;white-space:nowrap;word-wrap:normal;-moz-font-feature-settings:"liga";-moz-osx-font-smoothing:grayscale;--tw-content:"check";content:var(--tw-content);direction:ltr;margin-left:auto;font-family:Material Symbols Outlined;font-size:18px;font-style:normal;font-weight:400;line-height:1;display:inline-block}@media not print{.select2-container.select2-container--admin-autocomplete .select2-results__option[aria-selected=true]:where(.dark,.dark *){color:var(--color-primary-500)}}.select2-container.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__clear{top:calc(var(--spacing)*0);margin:calc(var(--spacing)*0);margin-right:calc(var(--spacing)*3)}.select2-container.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered{padding-block:calc(var(--spacing)*0);padding-top:calc(var(--spacing)*1);padding-right:calc(var(--spacing)*6);padding-left:calc(var(--spacing)*1)}.select2-container.select2-container--admin-autocomplete .select2-selection--single .select2-selection__rendered{padding-right:calc(var(--spacing)*8)}.select2-container--admin-autocomplete .select2-selection--multiple li.select2-selection__choice{margin:calc(var(--spacing)*0);margin-right:calc(var(--spacing)*1);margin-bottom:calc(var(--spacing)*1);height:calc(var(--spacing)*7);text-overflow:ellipsis;white-space:nowrap;background-color:var(--color-base-100);padding-inline:calc(var(--spacing)*2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing)*7);line-height:calc(var(--spacing)*7);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-base-600);--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);display:block;overflow:hidden}@media (hover:hover){.select2-container--admin-autocomplete .select2-selection--multiple li.select2-selection__choice:hover{color:var(--color-base-700)}}@media not print{.select2-container--admin-autocomplete .select2-selection--multiple li.select2-selection__choice:where(.dark,.dark *){background-color:var(--color-base-800);color:var(--color-base-300)}@media (hover:hover){.select2-container--admin-autocomplete .select2-selection--multiple li.select2-selection__choice:where(.dark,.dark *):hover{color:var(--color-base-200)}}}.select2-container--admin-autocomplete .select2-selection--multiple li.select2-selection__choice .select2-selection__choice__remove{vertical-align:top;font-size:0}@media (hover:hover){.select2-container--admin-autocomplete .select2-selection--multiple li.select2-selection__choice .select2-selection__choice__remove:hover{color:var(--color-base-600)}}@media not print{@media (hover:hover){.select2-container--admin-autocomplete .select2-selection--multiple li.select2-selection__choice .select2-selection__choice__remove:where(.dark,.dark *):hover{color:var(--color-base-200)}}}.select2-container--admin-autocomplete .select2-selection--multiple li.select2-selection__choice .select2-selection__choice__remove:after{letter-spacing:normal;text-transform:none;white-space:nowrap;word-wrap:normal;-moz-font-feature-settings:"liga";-moz-osx-font-smoothing:grayscale;height:calc(var(--spacing)*7);--tw-content:"close_small";content:var(--tw-content);direction:ltr;font-family:Material Symbols Outlined;font-size:14px;font-style:normal;font-weight:400;line-height:1;display:inline-block;--tw-leading:calc(var(--spacing)*7)!important;line-height:calc(var(--spacing)*7)!important}.select2-container--admin-autocomplete .select2-selection--multiple li.select2-search--inline .select2-search__field{margin:calc(var(--spacing)*0);margin-left:calc(var(--spacing)*2);height:calc(var(--spacing)*7);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-base-500)}fieldset.collapsed>div{display:none}fieldset.collapse{visibility:visible}fieldset.collapsed h2,fieldset.collapsed{display:block}fieldset.collapsed .collapse-toggle{display:inline}fieldset details>summary{list-style-type:none}fieldset details>summary:after{top:calc(var(--spacing)*3.5);right:calc(var(--spacing)*3);letter-spacing:normal;text-transform:none;white-space:nowrap;word-wrap:normal;-moz-font-feature-settings:"liga";-moz-osx-font-smoothing:grayscale;cursor:pointer;content:"expand_more";direction:ltr;font-family:Material Symbols Outlined;font-size:18px;font-style:normal;font-weight:400;line-height:1;display:inline-block;position:absolute}fieldset details[open]>summary:after{rotate:180deg}.calendarbox .calendar{min-height:320px}.calendarbox,.clockbox{z-index:50;width:calc(var(--spacing)*80);--tw-translate-x:calc(calc(1/2*100%)*-1);--tw-translate-y:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y);border-radius:var(--border-radius,6px);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-base-200);background-color:var(--color-white);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);position:fixed!important;top:50%!important;left:50%!important}@media not print{:is(.calendarbox,.clockbox):where(.dark,.dark *){border-color:var(--color-base-700);background-color:var(--color-base-800)}}.calendar caption{margin-bottom:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*3);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--color-font-important-light)}@media not print{.calendar caption:where(.dark,.dark *){color:var(--color-font-important-dark)}}.calendar table{margin-bottom:calc(var(--spacing)*3);width:100%}.calendar table th{text-align:center;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--color-font-important-light)}@media not print{.calendar table th:where(.dark,.dark *){color:var(--color-font-important-dark)}}.calendar table td{height:calc(var(--spacing)*10);width:calc(var(--spacing)*10);padding:calc(var(--spacing)*1);text-align:center}.calendar table td a{height:calc(var(--spacing)*8);width:calc(var(--spacing)*8);border-radius:3.40282e38px;justify-content:center;align-items:center;display:flex}@media not print{.calendar table td a:where(.dark,.dark *){color:var(--color-base-300)}}.calendar table td a:hover{background-color:var(--color-base-100);color:var(--color-base-700)}.calendar table td.today a{background-color:var(--color-primary-600);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-white)}.calendar-shortcuts{margin-bottom:calc(var(--spacing)*3);padding-inline:calc(var(--spacing)*1);border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem;flex-direction:row;justify-content:center;font-size:0;display:flex}.calendar-shortcuts a{margin-inline:calc(var(--spacing)*1);border-radius:var(--border-radius,6px);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-base-200);width:33.3333%;padding-inline:calc(var(--spacing)*2);padding-block:calc(var(--spacing)*2);text-align:center;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-leading:1;--tw-font-weight:var(--font-weight-medium);line-height:1;font-weight:var(--font-weight-medium);color:var(--color-base-500);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media not print{.calendar-shortcuts a:where(.dark,.dark *){border-color:var(--color-base-700);color:var(--color-base-300)}}.calendar-cancel{border-top-style:var(--tw-border-style);border-top-width:1px;border-color:var(--color-base-200);padding-block:calc(var(--spacing)*2);text-align:center;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-red-600);display:block}@media not print{.calendar-cancel:where(.dark,.dark *){border-color:var(--color-base-700);color:var(--color-red-500)}}.calendarnav-previous{top:calc(var(--spacing)*0);left:calc(var(--spacing)*0);margin-top:calc(var(--spacing)*2);margin-left:calc(var(--spacing)*2);font-size:0;display:block;position:absolute}:is(.calendarnav-next,.calendarnav-previous):after{content:var(--tw-content);letter-spacing:normal;text-transform:none;white-space:nowrap;word-wrap:normal;-moz-font-feature-settings:"liga";-moz-osx-font-smoothing:grayscale;content:var(--tw-content);content:var(--tw-content);height:calc(var(--spacing)*7);content:var(--tw-content);width:calc(var(--spacing)*7);content:var(--tw-content);content:var(--tw-content);content:var(--tw-content);content:var(--tw-content);border-style:var(--tw-border-style);content:var(--tw-content);border-width:1px;border-color:var(--color-base-200);content:var(--tw-content);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));direction:ltr;border-radius:3.40282e38px;justify-content:center;align-items:center;font-family:Material Symbols Outlined;font-size:18px;font-style:normal;font-weight:400;line-height:1;display:flex}@media not print{:is(.calendarnav-next,.calendarnav-previous):where(.dark,.dark *):after{content:var(--tw-content);border-color:var(--color-base-700);content:var(--tw-content);background-color:var(--color-base-800)}}.calendarnav-previous:after{content:"navigate_before";display:flex}.calendarnav-next:after{content:"navigate_next";display:flex}.calendarnav-next{top:calc(var(--spacing)*0);right:calc(var(--spacing)*0);margin-top:calc(var(--spacing)*2);margin-right:calc(var(--spacing)*2);font-size:0;display:block;position:absolute}.clockbox{z-index:50;border-radius:var(--border-radius,6px);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-base-200);background-color:var(--color-white);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media not print{.clockbox:where(.dark,.dark *){border-color:var(--color-base-700);background-color:var(--color-base-800)}}.clockbox h2{padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*2);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-base-700)}@media not print{.clockbox h2:where(.dark,.dark *){color:var(--color-base-200)}}.clockbox .timelist{padding-inline:calc(var(--spacing)*3);padding-bottom:calc(var(--spacing)*2);color:var(--color-base-500)}@media not print{.clockbox .timelist:where(.dark,.dark *){color:var(--color-base-300)}}.clockbox .timelist li{padding-bottom:calc(var(--spacing)*1);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));display:block}.clockbox .timelist li:hover{color:var(--color-primary-500)}.htmx-indicator.htmx-swapping:before{top:calc(var(--spacing)*0);right:calc(var(--spacing)*0);bottom:calc(var(--spacing)*0);left:calc(var(--spacing)*0);background-color:var(--color-white);opacity:.8;transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));content:"";position:absolute}.htmx-indicator.htmx-swapping:after{letter-spacing:normal;text-transform:none;white-space:nowrap;word-wrap:normal;-moz-font-feature-settings:"liga";-moz-osx-font-smoothing:grayscale;height:calc(var(--spacing)*4);width:calc(var(--spacing)*4);animation:var(--animate-spin);color:var(--color-base-400);content:"sync";direction:ltr;font-family:Material Symbols Outlined;font-size:16px;font-style:normal;font-weight:400;line-height:1;display:inline-block;position:absolute;inset:50%}#changelist-filter .admin-numeric-filter-slider .noUi-handle{right:calc(var(--spacing)*-4);height:calc(var(--spacing)*4);width:calc(var(--spacing)*4);cursor:pointer;border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-base-200);background-color:var(--color-white);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-radius:3.40282e38px}@media not print{#changelist-filter .admin-numeric-filter-slider .noUi-handle:where(.dark,.dark *){border-color:var(--color-base-200);background-color:var(--color-base-200)}}#changelist-filter .admin-numeric-filter-slider .noUi-handle-upper{right:calc(var(--spacing)*0)}#changelist-filter .admin-numeric-filter-slider .noUi-handle:after,#changelist-filter .admin-numeric-filter-slider .noUi-handle:before{content:none}#changelist-filter .admin-numeric-filter-slider.noUi-target{height:calc(var(--spacing)*1);border-style:var(--tw-border-style);background-color:var(--color-base-200);--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-width:0}@media not print{#changelist-filter .admin-numeric-filter-slider.noUi-target:where(.dark,.dark *){background-color:var(--color-base-600)}}#changelist-filter .admin-numeric-filter-slider .noUi-connect{height:calc(var(--spacing)*1);border-style:var(--tw-border-style);background-color:var(--color-primary-600);border-width:0}trix-toolbar[id^=trix-toolbar-]{top:calc(var(--spacing)*0);position:sticky}@media not print{trix-toolbar[id^=trix-toolbar-]:where(.dark,.dark *){background-color:var(--color-base-900)}}.trix-active{color:var(--color-primary-600)}.ui-tabs{flex-direction:column;display:flex}.ui-tabs.ui-widget .ui-tabs-nav{margin:calc(var(--spacing)*0);margin-top:calc(var(--spacing)*3);margin-right:auto;margin-bottom:calc(var(--spacing)*0);margin-left:calc(var(--spacing)*3);gap:calc(var(--spacing)*2);border-radius:var(--border-radius,6px);border-style:var(--tw-border-style);background-color:var(--color-base-100);padding:calc(var(--spacing)*1);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));border-width:0;display:flex}.ui-tabs.ui-widget .ui-tabs-nav:after{content:var(--tw-content);display:none}@media not print{.ui-tabs.ui-widget .ui-tabs-nav:where(.dark,.dark *){background-color:#ffffff0a}@supports (color:color-mix(in lab, red, red)){.ui-tabs.ui-widget .ui-tabs-nav:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)4%,transparent)}}}.ui-tabs.ui-widget .ui-tabs-nav li{top:calc(var(--spacing)*0);border-style:var(--tw-border-style);border-width:0}.ui-tabs.ui-widget .ui-tabs-nav li a{margin:calc(var(--spacing)*0);border-radius:var(--border-radius,6px);border-style:var(--tw-border-style);padding-inline:calc(var(--spacing)*2.5);padding-block:calc(var(--spacing)*1);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-base-400);background-color:#0000;border-width:0;flex-direction:row;align-items:center;display:flex}@media (hover:hover){.ui-tabs.ui-widget .ui-tabs-nav li a:hover{background-color:var(--color-base-700)}@supports (color:color-mix(in lab, red, red)){.ui-tabs.ui-widget .ui-tabs-nav li a:hover{background-color:color-mix(in oklab,var(--color-base-700)4%,transparent)}}.ui-tabs.ui-widget .ui-tabs-nav li a:hover{color:var(--color-base-700)}}@media not print{@media (hover:hover){.ui-tabs.ui-widget .ui-tabs-nav li a:where(.dark,.dark *):hover{background-color:#ffffff0a}@supports (color:color-mix(in lab, red, red)){.ui-tabs.ui-widget .ui-tabs-nav li a:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)4%,transparent)}}.ui-tabs.ui-widget .ui-tabs-nav li a:where(.dark,.dark *):hover{color:var(--color-white)}}}.ui-tabs.ui-widget .ui-tabs-nav li.ui-tabs-active a{border-radius:var(--border-radius,6px);background-color:var(--color-white);padding-inline:calc(var(--spacing)*2.5);padding-block:calc(var(--spacing)*1);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-base-700);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);flex-direction:row;align-items:center;display:flex}@media (hover:hover){.ui-tabs.ui-widget .ui-tabs-nav li.ui-tabs-active a:hover{background-color:var(--color-white)}}@media not print{.ui-tabs.ui-widget .ui-tabs-nav li.ui-tabs-active a:where(.dark,.dark *){background-color:var(--color-base-900);color:var(--color-white)}@media (hover:hover){.ui-tabs.ui-widget .ui-tabs-nav li.ui-tabs-active a:where(.dark,.dark *):hover{background-color:var(--color-base-900)}}}.simplebar-track .simplebar-scrollbar:before{background-color:var(--color-base-900)}@supports (color:color-mix(in lab, red, red)){.simplebar-track .simplebar-scrollbar:before{background-color:color-mix(in oklab,var(--color-base-900)80%,transparent)}}@media not print{.simplebar-track .simplebar-scrollbar:before:where(){background-color:var(--color-base-400)}@supports (color:color-mix(in lab, red, red)){.simplebar-track .simplebar-scrollbar:before:where(){background-color:color-mix(in oklab,var(--color-base-400)80%,transparent)}}}.simplebar-horizontal-scrollbar-top .simplebar-track.simplebar-horizontal{top:calc(var(--spacing)*9)}textarea#searchbar{--tw-leading:35px;--tw-font-weight:var(--font-weight-medium);min-height:35px;max-height:35px;line-height:35px;font-weight:var(--font-weight-medium);white-space:nowrap;width:100%!important}textarea#searchbar::placeholder{color:var(--color-base-400)}textarea#searchbar:focus{--tw-outline-style:none;outline-style:none}div.djangoql-completion{z-index:40;border-radius:var(--border-radius,6px);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-base-200);background-color:var(--color-white);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);width:384px;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);margin-top:6px;margin-left:-39px}@media not print{div.djangoql-completion:where(.dark,.dark *){border-color:var(--color-base-700);background-color:var(--color-base-800)}}div.djangoql-completion ul{padding-block:calc(var(--spacing)*1)}div.djangoql-completion li{margin-inline:calc(var(--spacing)*1);border-radius:var(--border-radius,6px);height:30px;padding-inline:calc(var(--spacing)*3);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:1;align-items:center;line-height:1;display:flex}@media (hover:hover){div.djangoql-completion li:hover{background-color:var(--color-base-100);color:var(--color-font-important-light)}@media not print{div.djangoql-completion li:hover:where(.dark,.dark *){color:var(--color-font-important-dark)}}div.djangoql-completion li:hover{color:var(--color-base-700)}}@media not print{@media (hover:hover){div.djangoql-completion li:where(.dark,.dark *):hover{background-color:var(--color-base-700);color:var(--color-base-200)}}}div.djangoql-completion li.active{background-color:var(--color-base-100);color:var(--color-font-important-light)}@media not print{div.djangoql-completion li.active:where(.dark,.dark *){color:var(--color-font-important-dark);background-color:var(--color-base-700)}}div.djangoql-completion li i{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-font-default-light);margin-left:auto}@media not print{div.djangoql-completion li i:where(.dark,.dark *){color:var(--color-font-default-dark)}}div.djangoql-completion .syntax-help{display:none}.djangoql-toggle{height:calc(var(--spacing)*4);width:calc(var(--spacing)*4);min-width:calc(var(--spacing)*4);cursor:pointer;appearance:none;border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-base-300);background-color:var(--color-white);--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-radius:4px;display:block}.djangoql-toggle:after{content:var(--tw-content);content:var(--tw-content);content:var(--tw-content);content:var(--tw-content);letter-spacing:normal;text-transform:none;white-space:nowrap;word-wrap:normal;-moz-font-feature-settings:"liga";-moz-osx-font-smoothing:grayscale;content:var(--tw-content);content:var(--tw-content);height:calc(var(--spacing)*4);content:var(--tw-content);width:calc(var(--spacing)*4);content:var(--tw-content);content:var(--tw-content);content:var(--tw-content);--tw-leading:1;content:var(--tw-content);color:var(--color-white);content:var(--tw-content);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-content:"check_small";content:var(--tw-content);direction:ltr;justify-content:center;align-items:center;margin-top:-1px;margin-left:-1px;font-family:Material Symbols Outlined;font-size:18px;font-style:normal;font-weight:400;line-height:1;display:inline-block;position:absolute;display:flex!important}.djangoql-toggle:checked{border-color:var(--color-primary-600);background-color:var(--color-primary-600);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.djangoql-toggle:hover{border-color:var(--color-base-400)}.djangoql-toggle:checked:hover{border-color:var(--color-primary-600)}}.djangoql-toggle:focus{outline-style:var(--tw-outline-style);outline-width:1px;outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--color-primary-500)}@media not print{.djangoql-toggle:where(.dark,.dark *){border-color:var(--color-base-500);background-color:var(--color-base-700)}.djangoql-toggle:where(.dark,.dark *):after{content:var(--tw-content);color:var(--color-base-700)}.djangoql-toggle:where(.dark,.dark *):checked{border-color:var(--color-primary-600);background-color:var(--color-primary-600)}.djangoql-toggle:where(.dark,.dark *):checked:after{content:var(--tw-content);color:var(--color-white)}}.djangoql-toggle{margin-left:calc(var(--spacing)*-4.5);position:relative}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-text-shadow-color{syntax:"*";inherits:false}@property --tw-text-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}} diff --git a/backend/staticfiles/unfold/filters/css/nouislider/LICENSE b/backend/staticfiles/unfold/filters/css/nouislider/LICENSE new file mode 100644 index 00000000..98f4ca25 --- /dev/null +++ b/backend/staticfiles/unfold/filters/css/nouislider/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 LΓ©on Gersen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/backend/staticfiles/unfold/filters/css/nouislider/nouislider.min.css b/backend/staticfiles/unfold/filters/css/nouislider/nouislider.min.css new file mode 100644 index 00000000..977dc04d --- /dev/null +++ b/backend/staticfiles/unfold/filters/css/nouislider/nouislider.min.css @@ -0,0 +1 @@ +.noUi-target,.noUi-target *{-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-ms-touch-action:none;touch-action:none;-ms-user-select:none;-moz-user-select:none;user-select:none;-moz-box-sizing:border-box;box-sizing:border-box}.noUi-target{position:relative}.noUi-base,.noUi-connects{width:100%;height:100%;position:relative;z-index:1}.noUi-connects{overflow:hidden;z-index:0}.noUi-connect,.noUi-origin{will-change:transform;position:absolute;z-index:1;top:0;right:0;height:100%;width:100%;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;-webkit-transform-style:preserve-3d;transform-origin:0 0;transform-style:flat}.noUi-txt-dir-rtl.noUi-horizontal .noUi-origin{left:0;right:auto}.noUi-vertical .noUi-origin{top:-100%;width:0}.noUi-horizontal .noUi-origin{height:0}.noUi-handle{-webkit-backface-visibility:hidden;backface-visibility:hidden;position:absolute}.noUi-touch-area{height:100%;width:100%}.noUi-state-tap .noUi-connect,.noUi-state-tap .noUi-origin{-webkit-transition:transform .3s;transition:transform .3s}.noUi-state-drag *{cursor:inherit!important}.noUi-horizontal{height:18px}.noUi-horizontal .noUi-handle{width:34px;height:28px;right:-17px;top:-6px}.noUi-vertical{width:18px}.noUi-vertical .noUi-handle{width:28px;height:34px;right:-6px;bottom:-17px}.noUi-txt-dir-rtl.noUi-horizontal .noUi-handle{left:-17px;right:auto}.noUi-target{background:#FAFAFA;border-radius:4px;border:1px solid #D3D3D3;box-shadow:inset 0 1px 1px #F0F0F0,0 3px 6px -5px #BBB}.noUi-connects{border-radius:3px}.noUi-connect{background:#3FB8AF}.noUi-draggable{cursor:ew-resize}.noUi-vertical .noUi-draggable{cursor:ns-resize}.noUi-handle{border:1px solid #D9D9D9;border-radius:3px;background:#FFF;cursor:default;box-shadow:inset 0 0 1px #FFF,inset 0 1px 7px #EBEBEB,0 3px 6px -3px #BBB}.noUi-active{box-shadow:inset 0 0 1px #FFF,inset 0 1px 7px #DDD,0 3px 6px -3px #BBB}.noUi-handle:after,.noUi-handle:before{content:"";display:block;position:absolute;height:14px;width:1px;background:#E8E7E6;left:14px;top:6px}.noUi-handle:after{left:17px}.noUi-vertical .noUi-handle:after,.noUi-vertical .noUi-handle:before{width:14px;height:1px;left:6px;top:14px}.noUi-vertical .noUi-handle:after{top:17px}[disabled] .noUi-connect{background:#B8B8B8}[disabled] .noUi-handle,[disabled].noUi-handle,[disabled].noUi-target{cursor:not-allowed}.noUi-pips,.noUi-pips *{-moz-box-sizing:border-box;box-sizing:border-box}.noUi-pips{position:absolute;color:#999}.noUi-value{position:absolute;white-space:nowrap;text-align:center}.noUi-value-sub{color:#ccc;font-size:10px}.noUi-marker{position:absolute;background:#CCC}.noUi-marker-sub{background:#AAA}.noUi-marker-large{background:#AAA}.noUi-pips-horizontal{padding:10px 0;height:80px;top:100%;left:0;width:100%}.noUi-value-horizontal{-webkit-transform:translate(-50%,50%);transform:translate(-50%,50%)}.noUi-rtl .noUi-value-horizontal{-webkit-transform:translate(50%,50%);transform:translate(50%,50%)}.noUi-marker-horizontal.noUi-marker{margin-left:-1px;width:2px;height:5px}.noUi-marker-horizontal.noUi-marker-sub{height:10px}.noUi-marker-horizontal.noUi-marker-large{height:15px}.noUi-pips-vertical{padding:0 10px;height:100%;top:0;left:100%}.noUi-value-vertical{-webkit-transform:translate(0,-50%);transform:translate(0,-50%);padding-left:25px}.noUi-rtl .noUi-value-vertical{-webkit-transform:translate(0,50%);transform:translate(0,50%)}.noUi-marker-vertical.noUi-marker{width:5px;height:2px;margin-top:-1px}.noUi-marker-vertical.noUi-marker-sub{width:10px}.noUi-marker-vertical.noUi-marker-large{width:15px}.noUi-tooltip{display:block;position:absolute;border:1px solid #D9D9D9;border-radius:3px;background:#fff;color:#000;padding:5px;text-align:center;white-space:nowrap}.noUi-horizontal .noUi-tooltip{-webkit-transform:translate(-50%,0);transform:translate(-50%,0);left:50%;bottom:120%}.noUi-vertical .noUi-tooltip{-webkit-transform:translate(0,-50%);transform:translate(0,-50%);top:50%;right:120%}.noUi-horizontal .noUi-origin>.noUi-tooltip{-webkit-transform:translate(50%,0);transform:translate(50%,0);left:auto;bottom:10px}.noUi-vertical .noUi-origin>.noUi-tooltip{-webkit-transform:translate(0,-18px);transform:translate(0,-18px);top:auto;right:28px} diff --git a/backend/staticfiles/unfold/filters/js/DateTimeShortcuts.js b/backend/staticfiles/unfold/filters/js/DateTimeShortcuts.js new file mode 100644 index 00000000..9f330001 --- /dev/null +++ b/backend/staticfiles/unfold/filters/js/DateTimeShortcuts.js @@ -0,0 +1,408 @@ +/*global Calendar, findPosX, findPosY, get_format, gettext, gettext_noop, interpolate, ngettext, quickElement*/ +// Inserts shortcut buttons after all of the following: +// +// +'use strict'; +{ + const DateTimeShortcuts = { + calendars: [], + calendarInputs: [], + clockInputs: [], + clockHours: { + default_: [ + [gettext_noop('Now'), -1], + [gettext_noop('Midnight'), 0], + [gettext_noop('6 a.m.'), 6], + [gettext_noop('Noon'), 12], + [gettext_noop('6 p.m.'), 18] + ] + }, + dismissClockFunc: [], + dismissCalendarFunc: [], + calendarDivName1: 'calendarbox', // name of calendar
    that gets toggled + calendarDivName2: 'calendarin', // name of
    that contains calendar + calendarLinkName: 'calendarlink', // name of the link that is used to toggle + clockDivName: 'clockbox', // name of clock
    that gets toggled + clockLinkName: 'clocklink', // name of the link that is used to toggle + shortCutsClass: 'datetimeshortcuts', // class of the clock and cal shortcuts + timezoneWarningClass: 'timezonewarning', // class of the warning for timezone mismatch + timezoneOffset: 0, + init: function() { + const serverOffset = document.body.dataset.adminUtcOffset; + if (serverOffset) { + const localOffset = new Date().getTimezoneOffset() * -60; + DateTimeShortcuts.timezoneOffset = localOffset - serverOffset; + } + + for (const inp of document.getElementsByTagName('input')) { + if (inp.type === 'text' && inp.classList.contains('vCustomTimeField')) { + DateTimeShortcuts.addClock(inp); + DateTimeShortcuts.addTimezoneWarning(inp); + } + else if (inp.type === 'text' && inp.classList.contains('vCustomDateField')) { + DateTimeShortcuts.addCalendar(inp); + DateTimeShortcuts.addTimezoneWarning(inp); + } + } + }, + // Return the current time while accounting for the server timezone. + now: function() { + const serverOffset = document.body.dataset.adminUtcOffset; + if (serverOffset) { + const localNow = new Date(); + const localOffset = localNow.getTimezoneOffset() * -60; + localNow.setTime(localNow.getTime() + 1000 * (serverOffset - localOffset)); + return localNow; + } else { + return new Date(); + } + }, + // Add a warning when the time zone in the browser and backend do not match. + addTimezoneWarning: function(inp) { + const warningClass = DateTimeShortcuts.timezoneWarningClass; + let timezoneOffset = DateTimeShortcuts.timezoneOffset / 3600; + + // Only warn if there is a time zone mismatch. + if (!timezoneOffset) { + return; + } + + // Check if warning is already there. + if (inp.parentNode.querySelectorAll('.' + warningClass).length) { + return; + } + + let message; + if (timezoneOffset > 0) { + message = ngettext( + 'Note: You are %s hour ahead of server time.', + 'Note: You are %s hours ahead of server time.', + timezoneOffset + ); + } + else { + timezoneOffset *= -1; + message = ngettext( + 'Note: You are %s hour behind server time.', + 'Note: You are %s hours behind server time.', + timezoneOffset + ); + } + message = interpolate(message, [timezoneOffset]); + + const warning = document.createElement('div'); + warning.classList.add('help', warningClass); + warning.textContent = message; + inp.parentNode.appendChild(warning); + }, + // Add clock widget to a given field + addClock: function(inp) { + const num = DateTimeShortcuts.clockInputs.length; + DateTimeShortcuts.clockInputs[num] = inp; + DateTimeShortcuts.dismissClockFunc[num] = function() { DateTimeShortcuts.dismissClock(num); return true; }; + + // Shortcut links (clock icon and "Now" link) + const shortcuts_span = document.createElement('span'); + shortcuts_span.className = DateTimeShortcuts.shortCutsClass; + inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); + const now_link = document.createElement('a'); + now_link.href = "#"; + now_link.textContent = gettext('Now'); + now_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.handleClockQuicklink(num, -1); + }); + const clock_link = document.createElement('a'); + clock_link.href = '#'; + clock_link.id = DateTimeShortcuts.clockLinkName + num; + clock_link.addEventListener('click', function(e) { + e.preventDefault(); + // avoid triggering the document click handler to dismiss the clock + e.stopPropagation(); + DateTimeShortcuts.openClock(num); + }); + + quickElement( + 'span', clock_link, '', + 'class', 'clock-icon', + 'title', gettext('Choose a Time') + ); + shortcuts_span.appendChild(document.createTextNode('\u00A0')); + shortcuts_span.appendChild(now_link); + shortcuts_span.appendChild(document.createTextNode('\u00A0|\u00A0')); + shortcuts_span.appendChild(clock_link); + + // Create clock link div + // + // Markup looks like: + //
    + //

    Choose a time

    + // + //

    Cancel

    + //
    + + const clock_box = document.createElement('div'); + clock_box.style.display = 'none'; + clock_box.style.position = 'absolute'; + clock_box.className = 'clockbox module'; + clock_box.id = DateTimeShortcuts.clockDivName + num; + document.body.appendChild(clock_box); + clock_box.addEventListener('click', function(e) { e.stopPropagation(); }); + + quickElement('h2', clock_box, gettext('Choose a time')); + const time_list = quickElement('ul', clock_box); + time_list.className = 'timelist'; + // The list of choices can be overridden in JavaScript like this: + // DateTimeShortcuts.clockHours.name = [['3 a.m.', 3]]; + // where name is the name attribute of the . + const name = typeof DateTimeShortcuts.clockHours[inp.name] === 'undefined' ? 'default_' : inp.name; + DateTimeShortcuts.clockHours[name].forEach(function(element) { + const time_link = quickElement('a', quickElement('li', time_list), gettext(element[0]), 'href', '#'); + time_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.handleClockQuicklink(num, element[1]); + }); + }); + + const cancel_p = quickElement('p', clock_box); + cancel_p.className = 'calendar-cancel'; + const cancel_link = quickElement('a', cancel_p, gettext('Cancel'), 'href', '#'); + cancel_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.dismissClock(num); + }); + + document.addEventListener('keyup', function(event) { + if (event.which === 27) { + // ESC key closes popup + DateTimeShortcuts.dismissClock(num); + event.preventDefault(); + } + }); + }, + openClock: function(num) { + const clock_box = document.getElementById(DateTimeShortcuts.clockDivName + num); + const clock_link = document.getElementById(DateTimeShortcuts.clockLinkName + num); + + // Recalculate the clockbox position + // is it left-to-right or right-to-left layout ? + if (window.getComputedStyle(document.body).direction !== 'rtl') { + clock_box.style.left = findPosX(clock_link) + 17 + 'px'; + } + else { + // since style's width is in em, it'd be tough to calculate + // px value of it. let's use an estimated px for now + clock_box.style.left = findPosX(clock_link) - 110 + 'px'; + } + clock_box.style.top = Math.max(0, findPosY(clock_link) - 30) + 'px'; + + // Show the clock box + clock_box.style.display = 'block'; + document.addEventListener('click', DateTimeShortcuts.dismissClockFunc[num]); + }, + dismissClock: function(num) { + document.getElementById(DateTimeShortcuts.clockDivName + num).style.display = 'none'; + document.removeEventListener('click', DateTimeShortcuts.dismissClockFunc[num]); + }, + handleClockQuicklink: function(num, val) { + let d; + if (val === -1) { + d = DateTimeShortcuts.now(); + } + else { + d = new Date(1970, 1, 1, val, 0, 0, 0); + } + DateTimeShortcuts.clockInputs[num].value = d.strftime(get_format('TIME_INPUT_FORMATS')[0]); + DateTimeShortcuts.clockInputs[num].focus(); + DateTimeShortcuts.dismissClock(num); + }, + // Add calendar widget to a given field. + addCalendar: function(inp) { + const num = DateTimeShortcuts.calendars.length; + + DateTimeShortcuts.calendarInputs[num] = inp; + DateTimeShortcuts.dismissCalendarFunc[num] = function() { DateTimeShortcuts.dismissCalendar(num); return true; }; + + // Shortcut links (calendar icon and "Today" link) + const shortcuts_span = document.createElement('span'); + shortcuts_span.className = DateTimeShortcuts.shortCutsClass; + inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); + const today_link = document.createElement('a'); + today_link.href = '#'; + today_link.appendChild(document.createTextNode(gettext('Today'))); + today_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.handleCalendarQuickLink(num, 0); + }); + const cal_link = document.createElement('a'); + cal_link.href = '#'; + cal_link.id = DateTimeShortcuts.calendarLinkName + num; + cal_link.addEventListener('click', function(e) { + e.preventDefault(); + // avoid triggering the document click handler to dismiss the calendar + e.stopPropagation(); + DateTimeShortcuts.openCalendar(num); + }); + quickElement( + 'span', cal_link, '', + 'class', 'date-icon', + 'title', gettext('Choose a Date') + ); + shortcuts_span.appendChild(document.createTextNode('\u00A0')); + shortcuts_span.appendChild(today_link); + shortcuts_span.appendChild(document.createTextNode('\u00A0|\u00A0')); + shortcuts_span.appendChild(cal_link); + + // Create calendarbox div. + // + // Markup looks like: + // + //
    + //

    + // + // February 2003 + //

    + //
    + // + //
    + //
    + // Yesterday | Today | Tomorrow + //
    + //

    Cancel

    + //
    + const cal_box = document.createElement('div'); + cal_box.style.display = 'none'; + cal_box.style.position = 'absolute'; + cal_box.className = 'calendarbox module'; + cal_box.id = DateTimeShortcuts.calendarDivName1 + num; + document.body.appendChild(cal_box); + cal_box.addEventListener('click', function(e) { e.stopPropagation(); }); + + // next-prev links + const cal_nav = quickElement('div', cal_box); + const cal_nav_prev = quickElement('a', cal_nav, '<', 'href', '#'); + cal_nav_prev.className = 'calendarnav-previous'; + cal_nav_prev.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.drawPrev(num); + }); + + const cal_nav_next = quickElement('a', cal_nav, '>', 'href', '#'); + cal_nav_next.className = 'calendarnav-next'; + cal_nav_next.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.drawNext(num); + }); + + // main box + const cal_main = quickElement('div', cal_box, '', 'id', DateTimeShortcuts.calendarDivName2 + num); + cal_main.className = 'calendar'; + DateTimeShortcuts.calendars[num] = new Calendar(DateTimeShortcuts.calendarDivName2 + num, DateTimeShortcuts.handleCalendarCallback(num)); + DateTimeShortcuts.calendars[num].drawCurrent(); + + // calendar shortcuts + const shortcuts = quickElement('div', cal_box); + shortcuts.className = 'calendar-shortcuts'; + let day_link = quickElement('a', shortcuts, gettext('Yesterday'), 'href', '#'); + day_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.handleCalendarQuickLink(num, -1); + }); + shortcuts.appendChild(document.createTextNode('\u00A0|\u00A0')); + day_link = quickElement('a', shortcuts, gettext('Today'), 'href', '#'); + day_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.handleCalendarQuickLink(num, 0); + }); + shortcuts.appendChild(document.createTextNode('\u00A0|\u00A0')); + day_link = quickElement('a', shortcuts, gettext('Tomorrow'), 'href', '#'); + day_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.handleCalendarQuickLink(num, +1); + }); + + // cancel bar + const cancel_p = quickElement('p', cal_box); + cancel_p.className = 'calendar-cancel'; + const cancel_link = quickElement('a', cancel_p, gettext('Cancel'), 'href', '#'); + cancel_link.addEventListener('click', function(e) { + e.preventDefault(); + DateTimeShortcuts.dismissCalendar(num); + }); + document.addEventListener('keyup', function(event) { + if (event.which === 27) { + // ESC key closes popup + DateTimeShortcuts.dismissCalendar(num); + event.preventDefault(); + } + }); + }, + openCalendar: function(num) { + const cal_box = document.getElementById(DateTimeShortcuts.calendarDivName1 + num); + const cal_link = document.getElementById(DateTimeShortcuts.calendarLinkName + num); + const inp = DateTimeShortcuts.calendarInputs[num]; + + // Determine if the current value in the input has a valid date. + // If so, draw the calendar with that date's year and month. + if (inp.value) { + const format = get_format('DATE_INPUT_FORMATS')[0]; + const selected = inp.value.strptime(format); + const year = selected.getUTCFullYear(); + const month = selected.getUTCMonth() + 1; + const re = /\d{4}/; + if (re.test(year.toString()) && month >= 1 && month <= 12) { + DateTimeShortcuts.calendars[num].drawDate(month, year, selected); + } + } + + // Recalculate the clockbox position + // is it left-to-right or right-to-left layout ? + if (window.getComputedStyle(document.body).direction !== 'rtl') { + cal_box.style.left = findPosX(cal_link) - 228 + 'px'; + } + else { + // since style's width is in em, it'd be tough to calculate + // px value of it. let's use an estimated px for now + cal_box.style.left = findPosX(cal_link) - 180 + 'px'; + } + cal_box.style.top = Math.max(0, findPosY(cal_link) + 44) + 'px'; + + cal_box.style.display = 'block'; + document.addEventListener('click', DateTimeShortcuts.dismissCalendarFunc[num]); + }, + dismissCalendar: function(num) { + document.getElementById(DateTimeShortcuts.calendarDivName1 + num).style.display = 'none'; + document.removeEventListener('click', DateTimeShortcuts.dismissCalendarFunc[num]); + }, + drawPrev: function(num) { + DateTimeShortcuts.calendars[num].drawPreviousMonth(); + }, + drawNext: function(num) { + DateTimeShortcuts.calendars[num].drawNextMonth(); + }, + handleCalendarCallback: function(num) { + const format = get_format('DATE_INPUT_FORMATS')[0]; + return function(y, m, d) { + DateTimeShortcuts.calendarInputs[num].value = new Date(y, m - 1, d).strftime(format); + DateTimeShortcuts.calendarInputs[num].focus(); + document.getElementById(DateTimeShortcuts.calendarDivName1 + num).style.display = 'none'; + }; + }, + handleCalendarQuickLink: function(num, offset) { + const d = DateTimeShortcuts.now(); + d.setDate(d.getDate() + offset); + DateTimeShortcuts.calendarInputs[num].value = d.strftime(get_format('DATE_INPUT_FORMATS')[0]); + DateTimeShortcuts.calendarInputs[num].focus(); + DateTimeShortcuts.dismissCalendar(num); + } + }; + + window.addEventListener('load', DateTimeShortcuts.init); + window.DateTimeShortcuts = DateTimeShortcuts; +} diff --git a/backend/staticfiles/unfold/filters/js/admin-numeric-filter.js b/backend/staticfiles/unfold/filters/js/admin-numeric-filter.js new file mode 100644 index 00000000..46d108ca --- /dev/null +++ b/backend/staticfiles/unfold/filters/js/admin-numeric-filter.js @@ -0,0 +1,69 @@ +document.addEventListener("DOMContentLoaded", function () { + Array.from( + document.getElementsByClassName("admin-numeric-filter-slider") + ).forEach(function (slider) { + if (Array.from(slider.classList).includes("noUi-target")) { + return; + } + + const fromInput = slider + .closest(".admin-numeric-filter-wrapper") + .querySelectorAll(".admin-numeric-filter-wrapper-group input")[0]; + + const toInput = slider + .closest(".admin-numeric-filter-wrapper") + .querySelectorAll(".admin-numeric-filter-wrapper-group input")[1]; + + noUiSlider.create(slider, { + start: [parseFloat(fromInput.value), parseFloat(toInput.value)], + step: parseFloat(slider.getAttribute("data-step")), + connect: true, + format: wNumb({ + decimals: parseFloat(slider.getAttribute("data-decimals")), + }), + range: { + min: parseFloat(slider.getAttribute("data-min")), + max: parseFloat(slider.getAttribute("data-max")), + }, + }); + + /************************************************************* + * Update slider when input values change + *************************************************************/ + fromInput.addEventListener("keyup", function () { + clearTimeout(this._sliderUpdateTimeout); + this._sliderUpdateTimeout = setTimeout(() => { + slider.noUiSlider.set([ + parseFloat(this.value), + parseFloat(toInput.value), + ]); + }, 500); + }); + + toInput.addEventListener("keyup", function () { + clearTimeout(this._sliderUpdateTimeout); + this._sliderUpdateTimeout = setTimeout(() => { + slider.noUiSlider.set([ + parseFloat(fromInput.value), + parseFloat(this.value), + ]); + }, 500); + }); + + /************************************************************* + * Updated inputs when slider is moved + *************************************************************/ + slider.noUiSlider.on("update", function (values, handle) { + const parent = this.target.closest(".admin-numeric-filter-wrapper"); + const from = parent.querySelectorAll( + ".admin-numeric-filter-wrapper-group input" + )[0]; + const to = parent.querySelectorAll( + ".admin-numeric-filter-wrapper-group input" + )[1]; + + from.value = values[0]; + to.value = values[1]; + }); + }); +}); diff --git a/backend/staticfiles/unfold/filters/js/nouislider/LICENSE b/backend/staticfiles/unfold/filters/js/nouislider/LICENSE new file mode 100644 index 00000000..98f4ca25 --- /dev/null +++ b/backend/staticfiles/unfold/filters/js/nouislider/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 LΓ©on Gersen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/backend/staticfiles/unfold/filters/js/nouislider/nouislider.min.js b/backend/staticfiles/unfold/filters/js/nouislider/nouislider.min.js new file mode 100644 index 00000000..a365d9d9 --- /dev/null +++ b/backend/staticfiles/unfold/filters/js/nouislider/nouislider.min.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).noUiSlider={})}(this,function(ot){"use strict";function n(t){return"object"==typeof t&&"function"==typeof t.to}function st(t){t.parentElement.removeChild(t)}function at(t){return null!=t}function lt(t){t.preventDefault()}function i(t){return"number"==typeof t&&!isNaN(t)&&isFinite(t)}function ut(t,e,r){0=e[r];)r+=1;return r}function r(t,e,r){if(r>=t.slice(-1)[0])return 100;var n=l(r,t),i=t[n-1],o=t[n],t=e[n-1],n=e[n];return t+(r=r,a(o=[i,o],o[0]<0?r+Math.abs(o[0]):r-o[0],0)/s(t,n))}function o(t,e,r,n){if(100===n)return n;var i=l(n,t),o=t[i-1],s=t[i];return r?(s-o)/2this.xPct[n+1];)n++;else t===this.xPct[this.xPct.length-1]&&(n=this.xPct.length-2);r||t!==this.xPct[n+1]||n++;for(var i,o=1,s=(e=null===e?[]:e)[n],a=0,l=0,u=0,c=r?(t-this.xPct[n])/(this.xPct[n+1]-this.xPct[n]):(this.xPct[n+1]-t)/(this.xPct[n+1]-this.xPct[n]);0= 2) required for mode 'count'.");for(var e=t.values-1,r=100/e,n=[];e--;)n[e]=e*r;return n.push(100),U(n,t.stepped)}(d),m={},t=S.xVal[0],e=S.xVal[S.xVal.length-1],g=!1,v=!1,b=0;return(h=h.slice().sort(function(t,e){return t-e}).filter(function(t){return!this[t]&&(this[t]=!0)},{}))[0]!==t&&(h.unshift(t),g=!0),h[h.length-1]!==e&&(h.push(e),v=!0),h.forEach(function(t,e){var r,n,i,o,s,a,l,u,t=t,c=h[e+1],p=d.mode===ot.PipsMode.Steps,f=(f=p?S.xNumSteps[e]:f)||c-t;for(void 0===c&&(c=t),f=Math.max(f,1e-7),r=t;r<=c;r=Number((r+f).toFixed(7))){for(a=(o=(i=S.toStepping(r))-b)/(d.density||1),u=o/(l=Math.round(a)),n=1;n<=l;n+=1)m[(s=b+n*u).toFixed(5)]=[S.fromStepping(s),0];a=-1ot.PipsType.NoValue&&((t=P(a,!1)).className=p(n,f.cssClasses.value),t.setAttribute("data-value",String(r)),t.style[f.style]=e+"%",t.innerHTML=String(s.to(r))))}),a}function L(){n&&(st(n),n=null)}function T(t){L();var e=D(t),r=t.filter,t=t.format||{to:function(t){return String(Math.round(t))}};return n=d.appendChild(O(e,r,t))}function j(){var t=i.getBoundingClientRect(),e="offset"+["Width","Height"][f.ort];return 0===f.ort?t.width||i[e]:t.height||i[e]}function z(n,i,o,s){function e(t){var e,r=function(e,t,r){var n=0===e.type.indexOf("touch"),i=0===e.type.indexOf("mouse"),o=0===e.type.indexOf("pointer"),s=0,a=0;0===e.type.indexOf("MSPointer")&&(o=!0);if("mousedown"===e.type&&!e.buttons&&!e.touches)return!1;if(n){var l=function(t){t=t.target;return t===r||r.contains(t)||e.composed&&e.composedPath().shift()===r};if("touchstart"===e.type){n=Array.prototype.filter.call(e.touches,l);if(1r.stepAfter.startValue&&(i=r.stepAfter.startValue-n),t=n>r.thisStep.startValue?r.thisStep.step:!1!==r.stepBefore.step&&n-r.stepBefore.highestStep,100===e?i=null:0===e&&(t=null);e=S.countStepDecimals();return null!==i&&!1!==i&&(i=Number(i.toFixed(e))),[t=null!==t&&!1!==t?Number(t.toFixed(e)):t,i]}ft(t=d,f.cssClasses.target),0===f.dir?ft(t,f.cssClasses.ltr):ft(t,f.cssClasses.rtl),0===f.ort?ft(t,f.cssClasses.horizontal):ft(t,f.cssClasses.vertical),ft(t,"rtl"===getComputedStyle(t).direction?f.cssClasses.textDirectionRtl:f.cssClasses.textDirectionLtr),i=P(t,f.cssClasses.base),function(t,e){var r=P(e,f.cssClasses.connects);l=[],(a=[]).push(N(r,t[0]));for(var n=0;n{var V=Math.min,S=Math.max,X=Math.round,U=Math.floor,T=t=>({x:t,y:t}),Ht={left:"right",right:"left",bottom:"top",top:"bottom"},zt={start:"end",end:"start"};function ot(t,e,n){return S(t,V(e,n))}function q(t,e){return typeof t=="function"?t(e):t}function L(t){return t.split("-")[0]}function J(t){return t.split("-")[1]}function it(t){return t==="x"?"y":"x"}function st(t){return t==="y"?"height":"width"}function K(t){return["top","bottom"].includes(L(t))?"y":"x"}function rt(t){return it(K(t))}function pt(t,e,n){n===void 0&&(n=!1);let o=J(t),i=rt(t),s=st(i),r=i==="x"?o===(n?"end":"start")?"right":"left":o==="start"?"bottom":"top";return e.reference[s]>e.floating[s]&&(r=$(r)),[r,$(r)]}function xt(t){let e=$(t);return[tt(t),e,tt(e)]}function tt(t){return t.replace(/start|end/g,e=>zt[e])}function It(t,e,n){let o=["left","right"],i=["right","left"],s=["top","bottom"],r=["bottom","top"];switch(t){case"top":case"bottom":return n?e?i:o:e?o:i;case"left":case"right":return e?s:r;default:return[]}}function wt(t,e,n,o){let i=J(t),s=It(L(t),n==="start",o);return i&&(s=s.map(r=>r+"-"+i),e&&(s=s.concat(s.map(tt)))),s}function $(t){return t.replace(/left|right|bottom|top/g,e=>Ht[e])}function jt(t){return{top:0,right:0,bottom:0,left:0,...t}}function yt(t){return typeof t!="number"?jt(t):{top:t,right:t,bottom:t,left:t}}function _(t){return{...t,top:t.y,left:t.x,right:t.x+t.width,bottom:t.y+t.height}}function vt(t,e,n){let{reference:o,floating:i}=t,s=K(e),r=rt(e),c=st(r),l=L(e),f=s==="y",m=o.x+o.width/2-i.width/2,u=o.y+o.height/2-i.height/2,p=o[c]/2-i[c]/2,a;switch(l){case"top":a={x:m,y:o.y-i.height};break;case"bottom":a={x:m,y:o.y+o.height};break;case"right":a={x:o.x+o.width,y:u};break;case"left":a={x:o.x-i.width,y:u};break;default:a={x:o.x,y:o.y}}switch(J(e)){case"start":a[r]-=p*(n&&f?-1:1);break;case"end":a[r]+=p*(n&&f?-1:1);break}return a}var bt=async(t,e,n)=>{let{placement:o="bottom",strategy:i="absolute",middleware:s=[],platform:r}=n,c=s.filter(Boolean),l=await(r.isRTL==null?void 0:r.isRTL(e)),f=await r.getElementRects({reference:t,floating:e,strategy:i}),{x:m,y:u}=vt(f,o,l),p=o,a={},d=0;for(let g=0;gk<=0)){var dt,mt;let k=(((dt=s.flip)==null?void 0:dt.index)||0)+1,ht=v[k];if(ht)return{data:{index:k,overflows:I},reset:{placement:ht}};let j=(mt=I.filter(B=>B.overflows[0]<=0).sort((B,F)=>B.overflows[1]-F.overflows[1])[0])==null?void 0:mt.placement;if(!j)switch(a){case"bestFit":{var gt;let B=(gt=I.map(F=>[F.placement,F.overflows.filter(Y=>Y>0).reduce((Y,Wt)=>Y+Wt,0)]).sort((F,Y)=>F[1]-Y[1])[0])==null?void 0:gt[0];B&&(j=B);break}case"initialPlacement":j=c;break}if(i!==j)return{reset:{placement:j}}}return{}}}};async function Yt(t,e){let{placement:n,platform:o,elements:i}=t,s=await(o.isRTL==null?void 0:o.isRTL(i.floating)),r=L(n),c=J(n),l=K(n)==="y",f=["left","top"].includes(r)?-1:1,m=s&&l?-1:1,u=q(e,t),{mainAxis:p,crossAxis:a,alignmentAxis:d}=typeof u=="number"?{mainAxis:u,crossAxis:0,alignmentAxis:null}:{mainAxis:0,crossAxis:0,alignmentAxis:null,...u};return c&&typeof d=="number"&&(a=c==="end"?d*-1:d),l?{x:a*m,y:p*f}:{x:p*f,y:a*m}}var ft=function(t){return t===void 0&&(t=0),{name:"offset",options:t,async fn(e){let{x:n,y:o}=e,i=await Yt(e,t);return{x:n+i.x,y:o+i.y,data:i}}}},at=function(t){return t===void 0&&(t={}),{name:"shift",options:t,async fn(e){let{x:n,y:o,placement:i}=e,{mainAxis:s=!0,crossAxis:r=!1,limiter:c={fn:x=>{let{x:h,y:w}=x;return{x:h,y:w}}},...l}=q(t,e),f={x:n,y:o},m=await ct(e,l),u=K(L(i)),p=it(u),a=f[p],d=f[u];if(s){let x=p==="y"?"top":"left",h=p==="y"?"bottom":"right",w=a+m[x],y=a-m[h];a=ot(w,a,y)}if(r){let x=u==="y"?"top":"left",h=u==="y"?"bottom":"right",w=d+m[x],y=d-m[h];d=ot(w,d,y)}let g=c.fn({...e,[p]:a,[u]:d});return{...g,data:{x:g.x-n,y:g.y-o}}}}};function P(t){return Ot(t)?(t.nodeName||"").toLowerCase():"#document"}function b(t){var e;return(t==null||(e=t.ownerDocument)==null?void 0:e.defaultView)||window}function C(t){var e;return(e=(Ot(t)?t.ownerDocument:t.document)||window.document)==null?void 0:e.documentElement}function Ot(t){return t instanceof Node||t instanceof b(t).Node}function E(t){return t instanceof Element||t instanceof b(t).Element}function R(t){return t instanceof HTMLElement||t instanceof b(t).HTMLElement}function At(t){return typeof ShadowRoot>"u"?!1:t instanceof ShadowRoot||t instanceof b(t).ShadowRoot}function H(t){let{overflow:e,overflowX:n,overflowY:o,display:i}=A(t);return/auto|scroll|overlay|hidden|clip/.test(e+o+n)&&!["inline","contents"].includes(i)}function Rt(t){return["table","td","th"].includes(P(t))}function et(t){let e=nt(),n=A(t);return n.transform!=="none"||n.perspective!=="none"||(n.containerType?n.containerType!=="normal":!1)||!e&&(n.backdropFilter?n.backdropFilter!=="none":!1)||!e&&(n.filter?n.filter!=="none":!1)||["transform","perspective","filter"].some(o=>(n.willChange||"").includes(o))||["paint","layout","strict","content"].some(o=>(n.contain||"").includes(o))}function Ct(t){let e=M(t);for(;R(e)&&!G(e);){if(et(e))return e;e=M(e)}return null}function nt(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-webkit-backdrop-filter","none")}function G(t){return["html","body","#document"].includes(P(t))}function A(t){return b(t).getComputedStyle(t)}function Q(t){return E(t)?{scrollLeft:t.scrollLeft,scrollTop:t.scrollTop}:{scrollLeft:t.pageXOffset,scrollTop:t.pageYOffset}}function M(t){if(P(t)==="html")return t;let e=t.assignedSlot||t.parentNode||At(t)&&t.host||C(t);return At(e)?e.host:e}function Et(t){let e=M(t);return G(e)?t.ownerDocument?t.ownerDocument.body:t.body:R(e)&&H(e)?e:Et(e)}function W(t,e,n){var o;e===void 0&&(e=[]),n===void 0&&(n=!0);let i=Et(t),s=i===((o=t.ownerDocument)==null?void 0:o.body),r=b(i);return s?e.concat(r,r.visualViewport||[],H(i)?i:[],r.frameElement&&n?W(r.frameElement):[]):e.concat(i,W(i,[],n))}function Pt(t){let e=A(t),n=parseFloat(e.width)||0,o=parseFloat(e.height)||0,i=R(t),s=i?t.offsetWidth:n,r=i?t.offsetHeight:o,c=X(n)!==s||X(o)!==r;return c&&(n=s,o=r),{width:n,height:o,$:c}}function ut(t){return E(t)?t:t.contextElement}function z(t){let e=ut(t);if(!R(e))return T(1);let n=e.getBoundingClientRect(),{width:o,height:i,$:s}=Pt(e),r=(s?X(n.width):n.width)/o,c=(s?X(n.height):n.height)/i;return(!r||!Number.isFinite(r))&&(r=1),(!c||!Number.isFinite(c))&&(c=1),{x:r,y:c}}var $t=T(0);function Lt(t){let e=b(t);return!nt()||!e.visualViewport?$t:{x:e.visualViewport.offsetLeft,y:e.visualViewport.offsetTop}}function Xt(t,e,n){return e===void 0&&(e=!1),!n||e&&n!==b(t)?!1:e}function N(t,e,n,o){e===void 0&&(e=!1),n===void 0&&(n=!1);let i=t.getBoundingClientRect(),s=ut(t),r=T(1);e&&(o?E(o)&&(r=z(o)):r=z(t));let c=Xt(s,n,o)?Lt(s):T(0),l=(i.left+c.x)/r.x,f=(i.top+c.y)/r.y,m=i.width/r.x,u=i.height/r.y;if(s){let p=b(s),a=o&&E(o)?b(o):o,d=p.frameElement;for(;d&&o&&a!==p;){let g=z(d),x=d.getBoundingClientRect(),h=A(d),w=x.left+(d.clientLeft+parseFloat(h.paddingLeft))*g.x,y=x.top+(d.clientTop+parseFloat(h.paddingTop))*g.y;l*=g.x,f*=g.y,m*=g.x,u*=g.y,l+=w,f+=y,d=b(d).frameElement}}return _({width:m,height:u,x:l,y:f})}function Ut(t){let{rect:e,offsetParent:n,strategy:o}=t,i=R(n),s=C(n);if(n===s)return e;let r={scrollLeft:0,scrollTop:0},c=T(1),l=T(0);if((i||!i&&o!=="fixed")&&((P(n)!=="body"||H(s))&&(r=Q(n)),R(n))){let f=N(n);c=z(n),l.x=f.x+n.clientLeft,l.y=f.y+n.clientTop}return{width:e.width*c.x,height:e.height*c.y,x:e.x*c.x-r.scrollLeft*c.x+l.x,y:e.y*c.y-r.scrollTop*c.y+l.y}}function qt(t){return Array.from(t.getClientRects())}function Dt(t){return N(C(t)).left+Q(t).scrollLeft}function Jt(t){let e=C(t),n=Q(t),o=t.ownerDocument.body,i=S(e.scrollWidth,e.clientWidth,o.scrollWidth,o.clientWidth),s=S(e.scrollHeight,e.clientHeight,o.scrollHeight,o.clientHeight),r=-n.scrollLeft+Dt(t),c=-n.scrollTop;return A(o).direction==="rtl"&&(r+=S(e.clientWidth,o.clientWidth)-i),{width:i,height:s,x:r,y:c}}function Kt(t,e){let n=b(t),o=C(t),i=n.visualViewport,s=o.clientWidth,r=o.clientHeight,c=0,l=0;if(i){s=i.width,r=i.height;let f=nt();(!f||f&&e==="fixed")&&(c=i.offsetLeft,l=i.offsetTop)}return{width:s,height:r,x:c,y:l}}function Gt(t,e){let n=N(t,!0,e==="fixed"),o=n.top+t.clientTop,i=n.left+t.clientLeft,s=R(t)?z(t):T(1),r=t.clientWidth*s.x,c=t.clientHeight*s.y,l=i*s.x,f=o*s.y;return{width:r,height:c,x:l,y:f}}function St(t,e,n){let o;if(e==="viewport")o=Kt(t,n);else if(e==="document")o=Jt(C(t));else if(E(e))o=Gt(e,n);else{let i=Lt(t);o={...e,x:e.x-i.x,y:e.y-i.y}}return _(o)}function kt(t,e){let n=M(t);return n===e||!E(n)||G(n)?!1:A(n).position==="fixed"||kt(n,e)}function Qt(t,e){let n=e.get(t);if(n)return n;let o=W(t,[],!1).filter(c=>E(c)&&P(c)!=="body"),i=null,s=A(t).position==="fixed",r=s?M(t):t;for(;E(r)&&!G(r);){let c=A(r),l=et(r);!l&&c.position==="fixed"&&(i=null),(s?!l&&!i:!l&&c.position==="static"&&!!i&&["absolute","fixed"].includes(i.position)||H(r)&&!l&&kt(t,r))?o=o.filter(m=>m!==r):i=c,r=M(r)}return e.set(t,o),o}function Zt(t){let{element:e,boundary:n,rootBoundary:o,strategy:i}=t,r=[...n==="clippingAncestors"?Qt(e,this._c):[].concat(n),o],c=r[0],l=r.reduce((f,m)=>{let u=St(e,m,i);return f.top=S(u.top,f.top),f.right=V(u.right,f.right),f.bottom=V(u.bottom,f.bottom),f.left=S(u.left,f.left),f},St(e,c,i));return{width:l.right-l.left,height:l.bottom-l.top,x:l.left,y:l.top}}function te(t){return Pt(t)}function ee(t,e,n){let o=R(e),i=C(e),s=n==="fixed",r=N(t,!0,s,e),c={scrollLeft:0,scrollTop:0},l=T(0);if(o||!o&&!s)if((P(e)!=="body"||H(i))&&(c=Q(e)),o){let f=N(e,!0,s,e);l.x=f.x+e.clientLeft,l.y=f.y+e.clientTop}else i&&(l.x=Dt(i));return{x:r.left+c.scrollLeft-l.x,y:r.top+c.scrollTop-l.y,width:r.width,height:r.height}}function Tt(t,e){return!R(t)||A(t).position==="fixed"?null:e?e(t):t.offsetParent}function _t(t,e){let n=b(t);if(!R(t))return n;let o=Tt(t,e);for(;o&&Rt(o)&&A(o).position==="static";)o=Tt(o,e);return o&&(P(o)==="html"||P(o)==="body"&&A(o).position==="static"&&!et(o))?n:o||Ct(t)||n}var ne=async function(t){let{reference:e,floating:n,strategy:o}=t,i=this.getOffsetParent||_t,s=this.getDimensions;return{reference:ee(e,await i(n),o),floating:{x:0,y:0,...await s(n)}}};function oe(t){return A(t).direction==="rtl"}var ie={convertOffsetParentRelativeRectToViewportRelativeRect:Ut,getDocumentElement:C,getClippingRect:Zt,getOffsetParent:_t,getElementRects:ne,getClientRects:qt,getDimensions:te,getScale:z,isElement:E,isRTL:oe};function se(t,e){let n=null,o,i=C(t);function s(){clearTimeout(o),n&&n.disconnect(),n=null}function r(c,l){c===void 0&&(c=!1),l===void 0&&(l=1),s();let{left:f,top:m,width:u,height:p}=t.getBoundingClientRect();if(c||e(),!u||!p)return;let a=U(m),d=U(i.clientWidth-(f+u)),g=U(i.clientHeight-(m+p)),x=U(f),w={rootMargin:-a+"px "+-d+"px "+-g+"px "+-x+"px",threshold:S(0,V(1,l))||1},y=!0;function O(v){let D=v[0].intersectionRatio;if(D!==l){if(!y)return r();D?r(!1,D):o=setTimeout(()=>{r(!1,1e-7)},100)}y=!1}try{n=new IntersectionObserver(O,{...w,root:i.ownerDocument})}catch{n=new IntersectionObserver(O,w)}n.observe(t)}return r(!0),s}function Mt(t,e,n,o){o===void 0&&(o={});let{ancestorScroll:i=!0,ancestorResize:s=!0,elementResize:r=typeof ResizeObserver=="function",layoutShift:c=typeof IntersectionObserver=="function",animationFrame:l=!1}=o,f=ut(t),m=i||s?[...f?W(f):[],...W(e)]:[];m.forEach(h=>{i&&h.addEventListener("scroll",n,{passive:!0}),s&&h.addEventListener("resize",n)});let u=f&&c?se(f,n):null,p=-1,a=null;r&&(a=new ResizeObserver(h=>{let[w]=h;w&&w.target===f&&a&&(a.unobserve(e),cancelAnimationFrame(p),p=requestAnimationFrame(()=>{a&&a.observe(e)})),n()}),f&&!l&&a.observe(f),a.observe(e));let d,g=l?N(t):null;l&&x();function x(){let h=N(t);g&&(h.x!==g.x||h.y!==g.y||h.width!==g.width||h.height!==g.height)&&n(),g=h,d=requestAnimationFrame(x)}return n(),()=>{m.forEach(h=>{i&&h.removeEventListener("scroll",n),s&&h.removeEventListener("resize",n)}),u&&u(),a&&a.disconnect(),a=null,l&&cancelAnimationFrame(d)}}var Nt=(t,e,n)=>{let o=new Map,i={platform:ie,...n},s={...i.platform,_c:o};return bt(t,e,{...i,platform:s})};function Vt(t){t.magic("anchor",e=>{if(!e._x_anchor)throw"Alpine: No x-anchor directive found on element using $anchor...";return e._x_anchor}),t.interceptClone((e,n)=>{e&&e._x_anchor&&!n._x_anchor&&(n._x_anchor=e._x_anchor)}),t.directive("anchor",t.skipDuringClone((e,{expression:n,modifiers:o,value:i},{cleanup:s,evaluate:r})=>{let{placement:c,offsetValue:l,unstyled:f}=Ft(o);e._x_anchor=t.reactive({x:0,y:0});let m=r(n);if(!m)throw"Alpine: no element provided to x-anchor...";let u=()=>{let a;Nt(m,e,{placement:c,middleware:[lt(),at({padding:5}),ft(l)]}).then(({x:d,y:g})=>{f||Bt(e,d,g),JSON.stringify({x:d,y:g})!==a&&(e._x_anchor.x=d,e._x_anchor.y=g),a=JSON.stringify({x:d,y:g})})},p=Mt(m,e,()=>u());s(()=>p())},(e,{expression:n,modifiers:o,value:i},{cleanup:s,evaluate:r})=>{let{placement:c,offsetValue:l,unstyled:f}=Ft(o);e._x_anchor&&(f||Bt(e,e._x_anchor.x,e._x_anchor.y))}))}function Bt(t,e,n){Object.assign(t.style,{left:e+"px",top:n+"px",position:"absolute"})}function Ft(t){let n=["top","top-start","top-end","right","right-start","right-end","bottom","bottom-start","bottom-end","left","left-start","left-end"].find(s=>t.includes(s)),o=0;if(t.includes("offset")){let s=t.findIndex(r=>r==="offset");o=t[s+1]!==void 0?Number(t[s+1]):o}let i=t.includes("no-style");return{placement:n,offsetValue:o,unstyled:i}}document.addEventListener("alpine:init",()=>{window.Alpine.plugin(Vt)});})(); diff --git a/backend/staticfiles/unfold/js/alpine/alpine.js b/backend/staticfiles/unfold/js/alpine/alpine.js new file mode 100644 index 00000000..2fdd6ecf --- /dev/null +++ b/backend/staticfiles/unfold/js/alpine/alpine.js @@ -0,0 +1,5 @@ +(()=>{var nt=!1,it=!1,W=[],ot=-1;function Ut(e){Rn(e)}function Rn(e){W.includes(e)||W.push(e),Mn()}function Wt(e){let t=W.indexOf(e);t!==-1&&t>ot&&W.splice(t,1)}function Mn(){!it&&!nt&&(nt=!0,queueMicrotask(Nn))}function Nn(){nt=!1,it=!0;for(let e=0;ee.effect(t,{scheduler:r=>{st?Ut(r):r()}}),at=e.raw}function ct(e){N=e}function Yt(e){let t=()=>{};return[n=>{let i=N(n);return e._x_effects||(e._x_effects=new Set,e._x_runEffects=()=>{e._x_effects.forEach(o=>o())}),e._x_effects.add(i),t=()=>{i!==void 0&&(e._x_effects.delete(i),$(i))},i},()=>{t()}]}function ve(e,t){let r=!0,n,i=N(()=>{let o=e();JSON.stringify(o),r?n=o:queueMicrotask(()=>{t(o,n),n=o}),r=!1});return()=>$(i)}var Xt=[],Zt=[],Qt=[];function er(e){Qt.push(e)}function te(e,t){typeof t=="function"?(e._x_cleanups||(e._x_cleanups=[]),e._x_cleanups.push(t)):(t=e,Zt.push(t))}function Ae(e){Xt.push(e)}function Oe(e,t,r){e._x_attributeCleanups||(e._x_attributeCleanups={}),e._x_attributeCleanups[t]||(e._x_attributeCleanups[t]=[]),e._x_attributeCleanups[t].push(r)}function lt(e,t){e._x_attributeCleanups&&Object.entries(e._x_attributeCleanups).forEach(([r,n])=>{(t===void 0||t.includes(r))&&(n.forEach(i=>i()),delete e._x_attributeCleanups[r])})}function tr(e){for(e._x_effects?.forEach(Wt);e._x_cleanups?.length;)e._x_cleanups.pop()()}var ut=new MutationObserver(mt),ft=!1;function ue(){ut.observe(document,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0}),ft=!0}function dt(){kn(),ut.disconnect(),ft=!1}var le=[];function kn(){let e=ut.takeRecords();le.push(()=>e.length>0&&mt(e));let t=le.length;queueMicrotask(()=>{if(le.length===t)for(;le.length>0;)le.shift()()})}function m(e){if(!ft)return e();dt();let t=e();return ue(),t}var pt=!1,Se=[];function rr(){pt=!0}function nr(){pt=!1,mt(Se),Se=[]}function mt(e){if(pt){Se=Se.concat(e);return}let t=[],r=new Set,n=new Map,i=new Map;for(let o=0;o{s.nodeType===1&&s._x_marker&&r.add(s)}),e[o].addedNodes.forEach(s=>{if(s.nodeType===1){if(r.has(s)){r.delete(s);return}s._x_marker||t.push(s)}})),e[o].type==="attributes")){let s=e[o].target,a=e[o].attributeName,c=e[o].oldValue,l=()=>{n.has(s)||n.set(s,[]),n.get(s).push({name:a,value:s.getAttribute(a)})},u=()=>{i.has(s)||i.set(s,[]),i.get(s).push(a)};s.hasAttribute(a)&&c===null?l():s.hasAttribute(a)?(u(),l()):u()}i.forEach((o,s)=>{lt(s,o)}),n.forEach((o,s)=>{Xt.forEach(a=>a(s,o))});for(let o of r)t.some(s=>s.contains(o))||Zt.forEach(s=>s(o));for(let o of t)o.isConnected&&Qt.forEach(s=>s(o));t=null,r=null,n=null,i=null}function Ce(e){return z(B(e))}function k(e,t,r){return e._x_dataStack=[t,...B(r||e)],()=>{e._x_dataStack=e._x_dataStack.filter(n=>n!==t)}}function B(e){return e._x_dataStack?e._x_dataStack:typeof ShadowRoot=="function"&&e instanceof ShadowRoot?B(e.host):e.parentNode?B(e.parentNode):[]}function z(e){return new Proxy({objects:e},Dn)}var Dn={ownKeys({objects:e}){return Array.from(new Set(e.flatMap(t=>Object.keys(t))))},has({objects:e},t){return t==Symbol.unscopables?!1:e.some(r=>Object.prototype.hasOwnProperty.call(r,t)||Reflect.has(r,t))},get({objects:e},t,r){return t=="toJSON"?Pn:Reflect.get(e.find(n=>Reflect.has(n,t))||{},t,r)},set({objects:e},t,r,n){let i=e.find(s=>Object.prototype.hasOwnProperty.call(s,t))||e[e.length-1],o=Object.getOwnPropertyDescriptor(i,t);return o?.set&&o?.get?o.set.call(n,r)||!0:Reflect.set(i,t,r)}};function Pn(){return Reflect.ownKeys(this).reduce((t,r)=>(t[r]=Reflect.get(this,r),t),{})}function Te(e){let t=n=>typeof n=="object"&&!Array.isArray(n)&&n!==null,r=(n,i="")=>{Object.entries(Object.getOwnPropertyDescriptors(n)).forEach(([o,{value:s,enumerable:a}])=>{if(a===!1||s===void 0||typeof s=="object"&&s!==null&&s.__v_skip)return;let c=i===""?o:`${i}.${o}`;typeof s=="object"&&s!==null&&s._x_interceptor?n[o]=s.initialize(e,c,o):t(s)&&s!==n&&!(s instanceof Element)&&r(s,c)})};return r(e)}function Re(e,t=()=>{}){let r={initialValue:void 0,_x_interceptor:!0,initialize(n,i,o){return e(this.initialValue,()=>In(n,i),s=>ht(n,i,s),i,o)}};return t(r),n=>{if(typeof n=="object"&&n!==null&&n._x_interceptor){let i=r.initialize.bind(r);r.initialize=(o,s,a)=>{let c=n.initialize(o,s,a);return r.initialValue=c,i(o,s,a)}}else r.initialValue=n;return r}}function In(e,t){return t.split(".").reduce((r,n)=>r[n],e)}function ht(e,t,r){if(typeof t=="string"&&(t=t.split(".")),t.length===1)e[t[0]]=r;else{if(t.length===0)throw error;return e[t[0]]||(e[t[0]]={}),ht(e[t[0]],t.slice(1),r)}}var ir={};function y(e,t){ir[e]=t}function fe(e,t){let r=Ln(t);return Object.entries(ir).forEach(([n,i])=>{Object.defineProperty(e,`$${n}`,{get(){return i(t,r)},enumerable:!1})}),e}function Ln(e){let[t,r]=_t(e),n={interceptor:Re,...t};return te(e,r),n}function or(e,t,r,...n){try{return r(...n)}catch(i){re(i,e,t)}}function re(e,t,r=void 0){e=Object.assign(e??{message:"No error message given."},{el:t,expression:r}),console.warn(`Alpine Expression Error: ${e.message} + +${r?'Expression: "'+r+`" + +`:""}`,t),setTimeout(()=>{throw e},0)}var Me=!0;function ke(e){let t=Me;Me=!1;let r=e();return Me=t,r}function R(e,t,r={}){let n;return x(e,t)(i=>n=i,r),n}function x(...e){return sr(...e)}var sr=xt;function ar(e){sr=e}function xt(e,t){let r={};fe(r,e);let n=[r,...B(e)],i=typeof t=="function"?$n(n,t):Fn(n,t,e);return or.bind(null,e,t,i)}function $n(e,t){return(r=()=>{},{scope:n={},params:i=[]}={})=>{let o=t.apply(z([n,...e]),i);Ne(r,o)}}var gt={};function jn(e,t){if(gt[e])return gt[e];let r=Object.getPrototypeOf(async function(){}).constructor,n=/^[\n\s]*if.*\(.*\)/.test(e.trim())||/^(let|const)\s/.test(e.trim())?`(async()=>{ ${e} })()`:e,o=(()=>{try{let s=new r(["__self","scope"],`with (scope) { __self.result = ${n} }; __self.finished = true; return __self.result;`);return Object.defineProperty(s,"name",{value:`[Alpine] ${e}`}),s}catch(s){return re(s,t,e),Promise.resolve()}})();return gt[e]=o,o}function Fn(e,t,r){let n=jn(t,r);return(i=()=>{},{scope:o={},params:s=[]}={})=>{n.result=void 0,n.finished=!1;let a=z([o,...e]);if(typeof n=="function"){let c=n(n,a).catch(l=>re(l,r,t));n.finished?(Ne(i,n.result,a,s,r),n.result=void 0):c.then(l=>{Ne(i,l,a,s,r)}).catch(l=>re(l,r,t)).finally(()=>n.result=void 0)}}}function Ne(e,t,r,n,i){if(Me&&typeof t=="function"){let o=t.apply(r,n);o instanceof Promise?o.then(s=>Ne(e,s,r,n)).catch(s=>re(s,i,t)):e(o)}else typeof t=="object"&&t instanceof Promise?t.then(o=>e(o)):e(t)}var wt="x-";function C(e=""){return wt+e}function cr(e){wt=e}var De={};function d(e,t){return De[e]=t,{before(r){if(!De[r]){console.warn(String.raw`Cannot find directive \`${r}\`. \`${e}\` will use the default order of execution`);return}let n=G.indexOf(r);G.splice(n>=0?n:G.indexOf("DEFAULT"),0,e)}}}function lr(e){return Object.keys(De).includes(e)}function pe(e,t,r){if(t=Array.from(t),e._x_virtualDirectives){let o=Object.entries(e._x_virtualDirectives).map(([a,c])=>({name:a,value:c})),s=Et(o);o=o.map(a=>s.find(c=>c.name===a.name)?{name:`x-bind:${a.name}`,value:`"${a.value}"`}:a),t=t.concat(o)}let n={};return t.map(dr((o,s)=>n[o]=s)).filter(mr).map(zn(n,r)).sort(Kn).map(o=>Bn(e,o))}function Et(e){return Array.from(e).map(dr()).filter(t=>!mr(t))}var yt=!1,de=new Map,ur=Symbol();function fr(e){yt=!0;let t=Symbol();ur=t,de.set(t,[]);let r=()=>{for(;de.get(t).length;)de.get(t).shift()();de.delete(t)},n=()=>{yt=!1,r()};e(r),n()}function _t(e){let t=[],r=a=>t.push(a),[n,i]=Yt(e);return t.push(i),[{Alpine:K,effect:n,cleanup:r,evaluateLater:x.bind(x,e),evaluate:R.bind(R,e)},()=>t.forEach(a=>a())]}function Bn(e,t){let r=()=>{},n=De[t.type]||r,[i,o]=_t(e);Oe(e,t.original,o);let s=()=>{e._x_ignore||e._x_ignoreSelf||(n.inline&&n.inline(e,t,i),n=n.bind(n,e,t,i),yt?de.get(ur).push(n):n())};return s.runCleanups=o,s}var Pe=(e,t)=>({name:r,value:n})=>(r.startsWith(e)&&(r=r.replace(e,t)),{name:r,value:n}),Ie=e=>e;function dr(e=()=>{}){return({name:t,value:r})=>{let{name:n,value:i}=pr.reduce((o,s)=>s(o),{name:t,value:r});return n!==t&&e(n,t),{name:n,value:i}}}var pr=[];function ne(e){pr.push(e)}function mr({name:e}){return hr().test(e)}var hr=()=>new RegExp(`^${wt}([^:^.]+)\\b`);function zn(e,t){return({name:r,value:n})=>{let i=r.match(hr()),o=r.match(/:([a-zA-Z0-9\-_:]+)/),s=r.match(/\.[^.\]]+(?=[^\]]*$)/g)||[],a=t||e[r]||r;return{type:i?i[1]:null,value:o?o[1]:null,modifiers:s.map(c=>c.replace(".","")),expression:n,original:a}}}var bt="DEFAULT",G=["ignore","ref","data","id","anchor","bind","init","for","model","modelable","transition","show","if",bt,"teleport"];function Kn(e,t){let r=G.indexOf(e.type)===-1?bt:e.type,n=G.indexOf(t.type)===-1?bt:t.type;return G.indexOf(r)-G.indexOf(n)}function J(e,t,r={}){e.dispatchEvent(new CustomEvent(t,{detail:r,bubbles:!0,composed:!0,cancelable:!0}))}function D(e,t){if(typeof ShadowRoot=="function"&&e instanceof ShadowRoot){Array.from(e.children).forEach(i=>D(i,t));return}let r=!1;if(t(e,()=>r=!0),r)return;let n=e.firstElementChild;for(;n;)D(n,t,!1),n=n.nextElementSibling}function E(e,...t){console.warn(`Alpine Warning: ${e}`,...t)}var _r=!1;function gr(){_r&&E("Alpine has already been initialized on this page. Calling Alpine.start() more than once can cause problems."),_r=!0,document.body||E("Unable to initialize. Trying to load Alpine before `` is available. Did you forget to add `defer` in Alpine's `