diff --git a/backend/app/api/routes/cloud.py b/backend/app/api/routes/cloud.py index e9a5c85f6..b285014ad 100644 --- a/backend/app/api/routes/cloud.py +++ b/backend/app/api/routes/cloud.py @@ -5,33 +5,36 @@ Handles authentication and profile management with Bambu Cloud. """ import json +import logging from pathlib import Path from typing import Literal -from fastapi import APIRouter, HTTPException, Depends -from sqlalchemy.ext.asyncio import AsyncSession +from fastapi import APIRouter, Body, Depends, HTTPException from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession from backend.app.core.database import get_db from backend.app.models.settings import Settings -from backend.app.services.bambu_cloud import ( - get_cloud_service, - BambuCloudError, - BambuCloudAuthError, -) from backend.app.schemas.cloud import ( - CloudLoginRequest, - CloudVerifyRequest, - CloudLoginResponse, CloudAuthStatus, - CloudTokenRequest, - SlicerSettingsResponse, - SlicerSetting, CloudDevice, + CloudLoginRequest, + CloudLoginResponse, + CloudTokenRequest, + CloudVerifyRequest, + SlicerSetting, SlicerSettingCreate, - SlicerSettingUpdate, SlicerSettingDeleteResponse, + SlicerSettingsResponse, + SlicerSettingUpdate, ) +from backend.app.services.bambu_cloud import ( + BambuCloudAuthError, + BambuCloudError, + get_cloud_service, +) + +logger = logging.getLogger(__name__) router = APIRouter(prefix="/cloud", tags=["cloud"]) @@ -43,9 +46,7 @@ CLOUD_EMAIL_KEY = "bambu_cloud_email" async def get_stored_token(db: AsyncSession) -> tuple[str | None, str | None]: """Get stored cloud token and email from database.""" - result = await db.execute( - select(Settings).where(Settings.key.in_([CLOUD_TOKEN_KEY, CLOUD_EMAIL_KEY])) - ) + result = await db.execute(select(Settings).where(Settings.key.in_([CLOUD_TOKEN_KEY, CLOUD_EMAIL_KEY]))) settings = {s.key: s.value for s in result.scalars().all()} return settings.get(CLOUD_TOKEN_KEY), settings.get(CLOUD_EMAIL_KEY) @@ -64,9 +65,7 @@ async def store_token(db: AsyncSession, token: str, email: str) -> None: async def clear_token(db: AsyncSession) -> None: """Clear stored cloud token and email.""" - result = await db.execute( - select(Settings).where(Settings.key.in_([CLOUD_TOKEN_KEY, CLOUD_EMAIL_KEY])) - ) + result = await db.execute(select(Settings).where(Settings.key.in_([CLOUD_TOKEN_KEY, CLOUD_EMAIL_KEY]))) for setting in result.scalars().all(): await db.delete(setting) await db.commit() @@ -213,14 +212,16 @@ async def get_slicer_settings( parsed = [] for s in all_settings: - parsed.append(SlicerSetting( - setting_id=s.get("setting_id", s.get("id", "")), - name=s.get("name", "Unknown"), - type=our_type, - version=s.get("version"), - user_id=s.get("user_id"), - updated_time=s.get("updated_time"), - )) + parsed.append( + SlicerSetting( + setting_id=s.get("setting_id", s.get("id", "")), + name=s.get("name", "Unknown"), + type=our_type, + version=s.get("version"), + user_id=s.get("user_id"), + updated_time=s.get("updated_time"), + ) + ) setattr(result, our_type, parsed) return result @@ -258,6 +259,80 @@ async def get_setting_detail(setting_id: str, db: AsyncSession = Depends(get_db) raise HTTPException(status_code=500, detail=str(e)) +# Cache for filament preset info (setting_id -> {name, k}) +_filament_cache: dict[str, dict] = {} +_filament_cache_time: float = 0 +FILAMENT_CACHE_TTL = 300 # 5 minutes + + +@router.post("/filament-info") +async def get_filament_info(setting_ids: list[str] = Body(...), db: AsyncSession = Depends(get_db)): + """ + Get filament preset info (name and K value) for multiple setting IDs. + + Used to enrich AMS tray tooltips with cloud preset data. + """ + import time + + logger.info(f"get_filament_info called with {len(setting_ids)} IDs: {setting_ids}") + + global _filament_cache, _filament_cache_time + + # Clear stale cache + if time.time() - _filament_cache_time > FILAMENT_CACHE_TTL: + _filament_cache = {} + _filament_cache_time = time.time() + + token, _ = await get_stored_token(db) + if not token: + logger.info("get_filament_info: Not authenticated, returning empty") + # Return empty results if not authenticated (graceful degradation) + return {} + + cloud = get_cloud_service() + cloud.set_token(token) + + if not cloud.is_authenticated: + return {} + + result = {} + for setting_id in setting_ids: + if not setting_id: + continue + + # Check cache first + if setting_id in _filament_cache: + result[setting_id] = _filament_cache[setting_id] + continue + + try: + data = await cloud.get_setting_detail(setting_id) + setting = data.get("setting", {}) + + # Extract name (e.g., "Bambu PLA Basic Jade White") + name = data.get("name", "") + + # Extract K value (pressure_advance) + k_value = setting.get("pressure_advance") + if k_value is not None: + try: + k_value = float(k_value) + except (ValueError, TypeError): + k_value = None + + info = {"name": name, "k": k_value} + _filament_cache[setting_id] = info + result[setting_id] = info + + except Exception as e: + logger.warning(f"Failed to get cloud preset {setting_id}: {e}") + # Cache the failure to avoid repeated requests + _filament_cache[setting_id] = {"name": "", "k": None} + result[setting_id] = {"name": "", "k": None} + + return result + + @router.get("/devices", response_model=list[CloudDevice]) async def get_devices(db: AsyncSession = Depends(get_db)): """ @@ -425,7 +500,7 @@ def _load_fields(preset_type: str) -> dict: if not file_path.exists(): raise HTTPException(status_code=404, detail=f"Field definitions not found for: {preset_type}") - with open(file_path, "r") as f: + with open(file_path) as f: data = json.load(f) _fields_cache[preset_type] = data diff --git a/backend/app/api/routes/printers.py b/backend/app/api/routes/printers.py index 2f12c9ddc..30ecdbf34 100644 --- a/backend/app/api/routes/printers.py +++ b/backend/app/api/routes/printers.py @@ -169,6 +169,16 @@ async def get_printer_status(printer_id: int, db: AsyncSession = Depends(get_db) ams_exists = False raw_data = state.raw_data or {} + # Build K-profile lookup map: cali_idx -> k_value + # This allows looking up the calibrated K value for each AMS slot + kprofile_map: dict[int, float] = {} + for kp in state.kprofiles or []: + if kp.slot_id is not None and kp.k_value: + try: + kprofile_map[kp.slot_id] = float(kp.k_value) + except (ValueError, TypeError): + pass + if "ams" in raw_data and isinstance(raw_data["ams"], list): ams_exists = True for ams_data in raw_data["ams"]: @@ -184,6 +194,13 @@ async def get_printer_status(printer_id: int, db: AsyncSession = Depends(get_db) tray_uuid = tray_data.get("tray_uuid", "") if tray_uuid in ("", "00000000000000000000000000000000"): tray_uuid = None + + # Get K value: first try tray's k field, then lookup from K-profiles + k_value = tray_data.get("k") + cali_idx = tray_data.get("cali_idx") + if k_value is None and cali_idx is not None and cali_idx in kprofile_map: + k_value = kprofile_map[cali_idx] + trays.append( AMSTray( id=tray_data.get("id", 0), @@ -193,7 +210,8 @@ async def get_printer_status(printer_id: int, db: AsyncSession = Depends(get_db) tray_id_name=tray_data.get("tray_id_name"), tray_info_idx=tray_data.get("tray_info_idx"), remain=tray_data.get("remain", 0), - k=tray_data.get("k"), + k=k_value, + cali_idx=cali_idx, tag_uid=tag_uid, tray_uuid=tray_uuid, nozzle_temp_min=tray_data.get("nozzle_temp_min"), @@ -239,13 +257,23 @@ async def get_printer_status(printer_id: int, db: AsyncSession = Depends(get_db) vt_tray_uuid = vt_data.get("tray_uuid", "") if vt_tray_uuid in ("", "00000000000000000000000000000000"): vt_tray_uuid = None + + # Get K value: first try tray's k field, then lookup from K-profiles + vt_k_value = vt_data.get("k") + vt_cali_idx = vt_data.get("cali_idx") + if vt_k_value is None and vt_cali_idx is not None and vt_cali_idx in kprofile_map: + vt_k_value = kprofile_map[vt_cali_idx] + vt_tray = AMSTray( id=254, # Virtual tray ID tray_color=vt_data.get("tray_color"), tray_type=vt_data.get("tray_type"), tray_sub_brands=vt_data.get("tray_sub_brands"), + tray_id_name=vt_data.get("tray_id_name"), + tray_info_idx=vt_data.get("tray_info_idx"), remain=vt_data.get("remain", 0), - k=vt_data.get("k"), + k=vt_k_value, + cali_idx=vt_cali_idx, tag_uid=vt_tag_uid, tray_uuid=vt_tray_uuid, nozzle_temp_min=vt_data.get("nozzle_temp_min"), @@ -977,7 +1005,7 @@ async def debug_simulate_print_complete( "timelapse_was_active": False, } - logger.info(f"[DEBUG] Simulating print complete for printer {printer_id}, archive {archive.id}") + logger.info(f"Simulating print complete for printer {printer_id}, archive {archive.id}") # Call the actual on_print_complete handler await on_print_complete(printer_id, data) diff --git a/backend/app/schemas/printer.py b/backend/app/schemas/printer.py index bd29ecf8f..f46065646 100644 --- a/backend/app/schemas/printer.py +++ b/backend/app/schemas/printer.py @@ -1,4 +1,5 @@ from datetime import datetime + from pydantic import BaseModel, Field @@ -54,7 +55,8 @@ class AMSTray(BaseModel): tray_id_name: str | None = None # Bambu filament ID like "A00-Y2" (can decode to color) tray_info_idx: str | None = None # Filament preset ID like "GFA00" remain: int = 0 - k: float | None = None # Pressure advance value + k: float | None = None # Pressure advance value (from tray or K-profile lookup) + cali_idx: int | None = None # Calibration index for K-profile lookup tag_uid: str | None = None # RFID tag UID (any tag) tray_uuid: str | None = None # Bambu Lab spool UUID (32-char hex) nozzle_temp_min: int | None = None # Min nozzle temperature @@ -76,6 +78,7 @@ class NozzleInfoResponse(BaseModel): class PrintOptionsResponse(BaseModel): """AI detection and print options from xcam data.""" + # Core AI detectors spaghetti_detector: bool = False print_halt: bool = False diff --git a/backend/app/services/bambu_mqtt.py b/backend/app/services/bambu_mqtt.py index 777d05407..358698138 100644 --- a/backend/app/services/bambu_mqtt.py +++ b/backend/app/services/bambu_mqtt.py @@ -733,9 +733,9 @@ class BambuMQTTClient: parsed_tray_now = raw_tray_now if raw_tray_now is not None else 255 # H2D dual-nozzle printers report only slot number (0-3), not global tray ID - # Use pending_tray_target from our load command tracking for disambiguation + # Use active_extruder + ams_extruder_map to determine which AMS the slot belongs to if parsed_tray_now >= 0 and parsed_tray_now <= 3: - # Check if we have a pending target that matches this slot + # First, check if we have a pending target that matches this slot pending_target = self.state.pending_tray_target if pending_target is not None: pending_slot = pending_target % 4 @@ -758,28 +758,45 @@ class BambuMQTTClient: # Clear pending target since it's stale self.state.pending_tray_target = None else: - # No pending target - check if we already have a resolved global ID - # that matches this slot (from a previous successful disambiguation) - current_tray = self.state.tray_now - if current_tray > 3 and current_tray != 255 and (current_tray % 4) == parsed_tray_now: - # Current tray_now is already a valid global ID that matches this slot - # Keep it (don't overwrite with raw slot number) - logger.debug( - f"[{self.serial_number}] H2D tray_now: keeping existing global ID {current_tray} " - f"(matches incoming slot {parsed_tray_now})" + # No pending target - use active_extruder + ams_extruder_map to disambiguate + # Find which AMS is connected to the active extruder + active_ext = self.state.active_extruder # 0=right, 1=left + ams_map = self.state.ams_extruder_map # {ams_id: extruder_id} + + # Find the AMS connected to the active extruder + active_ams_id = None + for ams_id_str, ext_id in ams_map.items(): + if ext_id == active_ext: + try: + active_ams_id = int(ams_id_str) + except ValueError: + pass + break + + if active_ams_id is not None: + # Calculate global tray ID using the active AMS + global_tray_id = active_ams_id * 4 + parsed_tray_now + logger.info( + f"[{self.serial_number}] H2D tray_now disambiguation: " + f"slot {parsed_tray_now} + active_extruder {active_ext} -> AMS {active_ams_id} -> global ID {global_tray_id}" ) + self.state.tray_now = global_tray_id else: - # No pending target and no valid existing global ID - # For H2D with multiple AMS units, we can't reliably determine which AMS - # the slot belongs to without a pending_tray_target from our load command. - # Use slot number as-is - this may be incorrect for multi-AMS setups, - # but it's better than guessing wrong based on unreliable heuristics. - # The user can load filament via our API to get correct tracking. - logger.warning( - f"[{self.serial_number}] H2D tray_now: no pending target, " - f"using slot {parsed_tray_now} as global ID (may be incorrect for multi-AMS)" - ) - self.state.tray_now = parsed_tray_now + # No AMS found for active extruder - check if we already have a resolved global ID + current_tray = self.state.tray_now + if current_tray > 3 and current_tray != 255 and (current_tray % 4) == parsed_tray_now: + # Current tray_now is already a valid global ID that matches this slot + logger.debug( + f"[{self.serial_number}] H2D tray_now: keeping existing global ID {current_tray} " + f"(matches incoming slot {parsed_tray_now})" + ) + else: + # Fallback: use slot as-is + logger.warning( + f"[{self.serial_number}] H2D tray_now: no ams_extruder_map for active_extruder {active_ext}, " + f"using slot {parsed_tray_now} as global ID (may be incorrect for multi-AMS)" + ) + self.state.tray_now = parsed_tray_now else: # tray_now > 3 means it's already a global ID, or 255 means unloaded # Note: Do NOT clear pending_tray_target on tray_now=255 here. @@ -806,15 +823,6 @@ class BambuMQTTClient: # Extract ams_extruder_map from each AMS unit's info field # According to OpenBambuAPI: info field bit 8 indicates which extruder (0=right, 1=left) - # Log AMS unit fields once to discover available fields - if not hasattr(self, "_ams_fields_logged") and ams_list: - first_unit = ams_list[0] - logger.info(f"[{self.serial_number}] AMS unit fields: {sorted(first_unit.keys())}") - for ams_unit in ams_list: - ams_id = ams_unit.get("id") - unit_info = {k: v for k, v in ams_unit.items() if k != "tray"} - logger.info(f"[{self.serial_number}] AMS {ams_id} data: {unit_info}") - self._ams_fields_logged = True ams_extruder_map = {} for ams_unit in ams_list: diff --git a/backend/app/services/printer_manager.py b/backend/app/services/printer_manager.py index 27d11eb4b..f4e115c87 100644 --- a/backend/app/services/printer_manager.py +++ b/backend/app/services/printer_manager.py @@ -338,6 +338,15 @@ def printer_state_to_dict(state: PrinterState, printer_id: int | None = None) -> vt_tray = None raw_data = state.raw_data or {} + # Build K-profile lookup map: cali_idx -> k_value + kprofile_map: dict[int, float] = {} + for kp in state.kprofiles or []: + if kp.slot_id is not None and kp.k_value: + try: + kprofile_map[kp.slot_id] = float(kp.k_value) + except (ValueError, TypeError): + pass + if "ams" in raw_data and isinstance(raw_data["ams"], list): for ams_data in raw_data["ams"]: trays = [] @@ -348,16 +357,28 @@ def printer_state_to_dict(state: PrinterState, printer_id: int | None = None) -> tray_uuid = tray.get("tray_uuid") if tray_uuid in ("", "00000000000000000000000000000000"): tray_uuid = None + + # Get K value: first try tray's k field, then lookup from K-profiles + k_value = tray.get("k") + cali_idx = tray.get("cali_idx") + if k_value is None and cali_idx is not None and cali_idx in kprofile_map: + k_value = kprofile_map[cali_idx] + trays.append( { "id": tray.get("id", 0), "tray_color": tray.get("tray_color"), "tray_type": tray.get("tray_type"), "tray_sub_brands": tray.get("tray_sub_brands"), + "tray_id_name": tray.get("tray_id_name"), + "tray_info_idx": tray.get("tray_info_idx"), "remain": tray.get("remain", 0), - "k": tray.get("k"), + "k": k_value, + "cali_idx": cali_idx, "tag_uid": tag_uid, "tray_uuid": tray_uuid, + "nozzle_temp_min": tray.get("nozzle_temp_min"), + "nozzle_temp_max": tray.get("nozzle_temp_max"), } ) # Prefer humidity_raw (actual percentage) over humidity (index 1-5) @@ -396,13 +417,30 @@ def printer_state_to_dict(state: PrinterState, printer_id: int | None = None) -> vt_tag_uid = vt_data.get("tag_uid") if vt_tag_uid in ("", "0000000000000000"): vt_tag_uid = None + vt_tray_uuid = vt_data.get("tray_uuid") + if vt_tray_uuid in ("", "00000000000000000000000000000000"): + vt_tray_uuid = None + + # Get K value for vt_tray + vt_k_value = vt_data.get("k") + vt_cali_idx = vt_data.get("cali_idx") + if vt_k_value is None and vt_cali_idx is not None and vt_cali_idx in kprofile_map: + vt_k_value = kprofile_map[vt_cali_idx] + vt_tray = { "id": 254, "tray_color": vt_data.get("tray_color"), "tray_type": vt_data.get("tray_type"), "tray_sub_brands": vt_data.get("tray_sub_brands"), + "tray_id_name": vt_data.get("tray_id_name"), + "tray_info_idx": vt_data.get("tray_info_idx"), "remain": vt_data.get("remain", 0), + "k": vt_k_value, + "cali_idx": vt_cali_idx, "tag_uid": vt_tag_uid, + "tray_uuid": vt_tray_uuid, + "nozzle_temp_min": vt_data.get("nozzle_temp_min"), + "nozzle_temp_max": vt_data.get("nozzle_temp_max"), } # Get ams_extruder_map from raw_data (populated by MQTT handler from AMS info field) diff --git a/frontend/mockups/ams-redesign.html b/frontend/mockups/ams-redesign.html new file mode 100644 index 000000000..6df5e2405 --- /dev/null +++ b/frontend/mockups/ams-redesign.html @@ -0,0 +1,1299 @@ + + + + + + AMS Section Redesign Mockup + + + + + + + + +
+ +
+ + +
+ +
+
+ + + + + +
+
+
+ H2D-1 + +
+
H2D • 0.4mm • 632h
+
+
+ + +
+ + + + + + Connected + + -53dBm + + + + + + OK + + + + + + OK + +
+ + +
+
+
+ + + + + +
+
+
Status
+
Idle
+
+
Ready to print
+
+
+
+ + +
+
+ + + +
Left / Right
+
20°C / 19°C
+
+
+ + + +
Bed
+
20°C
+
+
+ + + +
Chamber
+
21°C
+
+
+ + +
+
+ +
+
+ + + + + + + + + +
+
+
AMS-A
+
PLA Basic · PETG HF · PLA Basic · PLA Basic
+
71% · 50% · 87% · 23%
+
+
+
+ + + + 21% +
+
20.7°C
+
+
+ + +
+
+ + + + + + + + + +
+
+
AMS-B
+
PETG HF · PLA · PLA-S · PLA-S
+
45% · 92% · 15% · 68%
+
+
+
+ + + + 16% +
+
22.7°C
+
+
+ + +
+
+ + + + + + + + + +
+
+
AMS-C
+
PLA-S · PLA-S · PETG · PLA
+
33% · 78% · 55% · 41%
+
+
+
+ + + + 16% +
+
22.9°C
+
+
+ + +
+
+ + + + + + +
+
+
HT-A
+
—
+
+
+
+ + + + 47% +
+
19.7°C
+
+
+
+
+ + +
+
+ + + + bamnbuswitch3 + ON + 18W +
+ + +
+ Auto-off +
+
+
+
+ +
+ +
4 AMS rows + 1 HT row = 5 rows in AMS section
+
+
+ + +
+ + +
+ +
+
+ + + + + +
+
+
+ H2D-1 + +
+
H2D • 0.4mm • 632h
+
+
+ + +
+ + + + + + Connected + + -53dBm + + + + + + OK + + + + + + OK + +
+ + +
+
+
+ + + + + +
+
+
Status
+
Idle
+
+
Ready to print
+
+
+
+ + +
+
+ + + +
Left / Right
+
20°C / 19°C
+
+
+ + + +
Bed
+
20°C
+
+
+ + + +
Chamber
+
21°C
+
+
+ + +
+ +
+ +
+
+
+ + + + + + + + + AMS-A +
+
+
+ + + + 21% +
+
20.6°
+
+
+
+
+
+
PLA Basic
+
71%
+
+
+
+
PETG HF
+
50%
+
+
+
+
PLA
+
87%
+
+
+
+
PLA Basic
+
23%
+
+
+
+ + +
+
+
+ + + + + + + + + AMS-B +
+
+
+ + + + 16% +
+
20.7°
+
+
+
+
+
+
PETG HF
+
45%
+
+
+
+
PLA
+
92%
+
+
+
+
PLA-S
+
15%
+
+
+
+
PLA-S
+
68%
+
+
+
+ + +
+
+
+ + + + + + + + + AMS-C +
+
+
+ + + + 17% +
+
22.0°
+
+
+
+
+
+
PLA-S
+
33%
+
+
+
+
PLA-S
+
78%
+
+
+
+
PETG
+
55%
+
+
+
+
PLA
+
41%
+
+
+
+ + +
+
+
+ + + + + + + + + AMS-D +
+
+
+ + + + 9% +
+
21.2°
+
+
+
+
+
+
PLA
+
88%
+
+
+
+
ABS
+
62%
+
+
+
+
PETG
+
29%
+
+
+
+
PLA
+
95%
+
+
+
+
+ + +
+ +
+ + + + + +
+
HT-A
+
Empty
+
+
+
+ + + + 44% +
+
+
+ + +
+ + + + + +
+
HT-B
+
PA-CF
+
+
+
+ + + + 12% +
+
+
+ + +
+
+
+
Ext-1
+
PLA
+
+
+ + +
+
+
+
Ext-2
+
TPU
+
+
+
+
+ + +
+
+ + + + bamnbuswitch3 + ON + 18W +
+ + +
+ Auto-off +
+
+
+
+ +
+ +
3 rows total: Row 1-2 for 4x AMS, Row 3 for 2x HT + 2x Ext (half-size)
+
+
+
+ + diff --git a/frontend/src/api/client.ts b/frontend/src/api/client.ts index 8bcdc3484..435bfaf6d 100644 --- a/frontend/src/api/client.ts +++ b/frontend/src/api/client.ts @@ -21,7 +21,7 @@ async function request( throw new Error(message); } - return response.json(); + return await response.json(); } // Printer types @@ -55,7 +55,8 @@ export interface AMSTray { tray_id_name: string | null; // Bambu filament ID like "A00-Y2" (can decode to color) tray_info_idx: string | null; // Filament preset ID like "GFA00" - maps to cloud setting_id remain: number; - k: number | null; // Pressure advance value + k: number | null; // Pressure advance value (from tray or K-profile lookup) + cali_idx: number | null; // Calibration index for K-profile lookup tag_uid: string | null; // RFID tag UID (any tag) tray_uuid: string | null; // Bambu Lab spool UUID (32-char hex, only valid for Bambu Lab spools) nozzle_temp_min: number | null; // Min nozzle temperature @@ -1764,6 +1765,11 @@ export const api = { request(`/cloud/fields/${presetType}`), getAllCloudFields: () => request>('/cloud/fields'), + getFilamentInfo: (settingIds: string[]) => + request>('/cloud/filament-info', { + method: 'POST', + body: JSON.stringify(settingIds), + }), // Smart Plugs getSmartPlugs: () => request('/smart-plugs/'), diff --git a/frontend/src/components/FilamentHoverCard.tsx b/frontend/src/components/FilamentHoverCard.tsx new file mode 100644 index 000000000..9977fd018 --- /dev/null +++ b/frontend/src/components/FilamentHoverCard.tsx @@ -0,0 +1,267 @@ +import { useState, useRef, useEffect, type ReactNode } from 'react'; +import { Droplets } from 'lucide-react'; + +interface FilamentData { + vendor: 'Bambu Lab' | 'Generic'; + profile: string; + colorName: string; + colorHex: string | null; + kFactor: string; + fillLevel: number | null; // null = unknown +} + +interface FilamentHoverCardProps { + data: FilamentData; + children: ReactNode; + disabled?: boolean; + className?: string; +} + +/** + * A hover card that displays filament details when hovering over AMS slots. + * Replaces the basic browser tooltip with a styled popover. + */ +export function FilamentHoverCard({ data, children, disabled, className = '' }: FilamentHoverCardProps) { + const [isVisible, setIsVisible] = useState(false); + const [position, setPosition] = useState<'top' | 'bottom'>('top'); + const triggerRef = useRef(null); + const cardRef = useRef(null); + const timeoutRef = useRef | null>(null); + + // Calculate position when showing + useEffect(() => { + if (isVisible && triggerRef.current && cardRef.current) { + const triggerRect = triggerRef.current.getBoundingClientRect(); + const cardHeight = cardRef.current.offsetHeight; + const spaceAbove = triggerRect.top; + const spaceBelow = window.innerHeight - triggerRect.bottom; + + // Prefer top, but flip to bottom if not enough space + if (spaceAbove < cardHeight + 12 && spaceBelow > spaceAbove) { + setPosition('bottom'); + } else { + setPosition('top'); + } + } + }, [isVisible]); + + const handleMouseEnter = () => { + if (disabled) return; + if (timeoutRef.current) clearTimeout(timeoutRef.current); + // Small delay to prevent flicker on quick mouse movements + timeoutRef.current = setTimeout(() => setIsVisible(true), 80); + }; + + const handleMouseLeave = () => { + if (timeoutRef.current) clearTimeout(timeoutRef.current); + timeoutRef.current = setTimeout(() => setIsVisible(false), 100); + }; + + // Cleanup timeout on unmount + useEffect(() => { + return () => { + if (timeoutRef.current) clearTimeout(timeoutRef.current); + }; + }, []); + + // Get fill bar color based on percentage + const getFillColor = (fill: number): string => { + if (fill <= 15) return '#ef4444'; // red + if (fill <= 30) return '#f97316'; // orange + if (fill <= 50) return '#eab308'; // yellow + return '#22c55e'; // green + }; + + // Determine if color is light (for text contrast on swatch) + const isLightColor = (hex: string | null): boolean => { + if (!hex) return false; + const cleanHex = hex.replace('#', ''); + const r = parseInt(cleanHex.slice(0, 2), 16); + const g = parseInt(cleanHex.slice(2, 4), 16); + const b = parseInt(cleanHex.slice(4, 6), 16); + const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255; + return luminance > 0.6; + }; + + const colorHex = data.colorHex ? `#${data.colorHex.replace('#', '')}` : null; + + return ( +
+ {children} + + {/* Hover Card */} + {isVisible && ( +
+ {/* Card container */} +
+ {/* Color swatch header - the hero element */} +
+ {/* Subtle gradient overlay for depth */} +
+ + {/* Color name on swatch */} +
+ {data.colorName} +
+ + {/* Vendor badge - solid background for visibility on any color */} +
+ {data.vendor === 'Bambu Lab' ? 'BBL' : 'GEN'} +
+
+ + {/* Details section */} +
+ {/* Profile name */} +
+ + Profile + + + {data.profile} + +
+ + {/* K Factor */} +
+ + K Factor + + + {data.kFactor} + +
+ + {/* Fill Level */} +
+
+ + + Fill + + + {data.fillLevel !== null ? `${data.fillLevel}%` : '—'} + +
+ {/* Fill bar */} +
+ {data.fillLevel !== null ? ( +
+ ) : ( +
+ )} +
+
+
+
+ + {/* Arrow pointer */} +
+
+ )} +
+ ); +} + +/** + * Wrapper for empty slots - just shows "Empty" on hover + */ +export function EmptySlotHoverCard({ children, className = '' }: { children: ReactNode; className?: string }) { + const [isVisible, setIsVisible] = useState(false); + const timeoutRef = useRef | null>(null); + + const handleMouseEnter = () => { + if (timeoutRef.current) clearTimeout(timeoutRef.current); + timeoutRef.current = setTimeout(() => setIsVisible(true), 80); + }; + + const handleMouseLeave = () => { + if (timeoutRef.current) clearTimeout(timeoutRef.current); + timeoutRef.current = setTimeout(() => setIsVisible(false), 100); + }; + + useEffect(() => { + return () => { + if (timeoutRef.current) clearTimeout(timeoutRef.current); + }; + }, []); + + return ( +
+ {children} + + {isVisible && ( +
+
+ Empty slot +
+
+
+ )} +
+ ); +} diff --git a/frontend/src/pages/PrintersPage.tsx b/frontend/src/pages/PrintersPage.tsx index 8a906eee7..c2ac79b3d 100644 --- a/frontend/src/pages/PrintersPage.tsx +++ b/frontend/src/pages/PrintersPage.tsx @@ -40,6 +40,148 @@ import { MQTTDebugModal } from '../components/MQTTDebugModal'; import { HMSErrorModal, filterKnownHMSErrors } from '../components/HMSErrorModal'; import { PrinterQueueWidget } from '../components/PrinterQueueWidget'; import { AMSHistoryModal } from '../components/AMSHistoryModal'; +import { FilamentHoverCard, EmptySlotHoverCard } from '../components/FilamentHoverCard'; + +// Bambu Lab color code mapping (color suffix from tray_id_name -> color name) +// tray_id_name format: "A00-Y2" where Y2 is the color code +const BAMBU_COLOR_CODES: Record = { + // Yellows + 'Y0': 'Yellow', + 'Y1': 'Savana Yellow', + 'Y2': 'Sunflower Yellow', + 'Y3': 'Lemon Yellow', + // Oranges + 'O0': 'Orange', + 'O1': 'Mandarin Orange', + 'O2': 'Coral Orange', + // Reds + 'R0': 'Red', + 'R1': 'Scarlet Red', + 'R2': 'Magenta', + 'R3': 'Sakura Pink', + 'R4': 'Raspberry Red', + // Pinks + 'P0': 'Pink', + 'P1': 'Sakura Pink', + // Purples + 'V0': 'Purple', + 'V1': 'Violet', + 'V2': 'Lilac Purple', + // Blues + 'B0': 'Blue', + 'B1': 'Sky Blue', + 'B2': 'Navy Blue', + 'B3': 'Ice Blue', + 'B4': 'Cyan', + // Greens + 'G0': 'Green', + 'G1': 'Grass Green', + 'G2': 'Lime Green', + 'G3': 'Mint Green', + 'G4': 'Olive Green', + 'G5': 'Jungle Green', + 'G6': 'Bambu Green', + // Browns + 'N0': 'Brown', + 'N1': 'Peanut Brown', + 'N2': 'Coffee Brown', + 'N3': 'Caramel Brown', + // Grays + 'A0': 'Gray', + 'A1': 'Charcoal Gray', + 'A2': 'Silver Gray', + 'A3': 'Titan Gray', + // Blacks + 'K0': 'Black', + 'K1': 'Black', + // Whites + 'W0': 'White', + 'W1': 'Jade White', + 'W2': 'Ivory White', + // Special + 'T0': 'Transparent', + 'C0': 'Marble', + 'X0': 'Bronze', + 'X1': 'Gold', + 'X2': 'Silver', +}; + +// Get color name from Bambu Lab tray_id_name (e.g., "A00-Y2" -> "Sunflower Yellow") +function getBambuColorName(trayIdName: string | null | undefined): string | null { + if (!trayIdName) return null; + // Extract color code after the dash (e.g., "A00-Y2" -> "Y2") + const parts = trayIdName.split('-'); + if (parts.length < 2) return null; + const colorCode = parts[1]; + return BAMBU_COLOR_CODES[colorCode] || null; +} + +// Convert hex color to basic color name +function hexToBasicColorName(hex: string | null | undefined): string { + if (!hex || hex.length < 6) return 'Unknown'; + + // Parse RGB from hex (format: RRGGBBAA or RRGGBB) + const r = parseInt(hex.substring(0, 2), 16); + const g = parseInt(hex.substring(2, 4), 16); + const b = parseInt(hex.substring(4, 6), 16); + + // Calculate HSL for better color classification + const max = Math.max(r, g, b) / 255; + const min = Math.min(r, g, b) / 255; + const l = (max + min) / 2; + + let h = 0; + let s = 0; + + if (max !== min) { + const d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + + const rNorm = r / 255; + const gNorm = g / 255; + const bNorm = b / 255; + + if (max === rNorm) { + h = ((gNorm - bNorm) / d + (gNorm < bNorm ? 6 : 0)) / 6; + } else if (max === gNorm) { + h = ((bNorm - rNorm) / d + 2) / 6; + } else { + h = ((rNorm - gNorm) / d + 4) / 6; + } + } + + // Convert to degrees + h = h * 360; + + // Classify by lightness first + if (l < 0.15) return 'Black'; + if (l > 0.85) return 'White'; + + // Low saturation = gray + if (s < 0.15) { + if (l < 0.4) return 'Dark Gray'; + if (l > 0.6) return 'Light Gray'; + return 'Gray'; + } + + // Classify by hue + if (h < 15 || h >= 345) return 'Red'; + if (h < 45) return 'Orange'; + if (h < 70) return 'Yellow'; + if (h < 150) return 'Green'; + if (h < 200) return 'Cyan'; + if (h < 260) return 'Blue'; + if (h < 290) return 'Purple'; + if (h < 345) return 'Pink'; + + return 'Unknown'; +} + +// Format K value with 3 decimal places, default to 0.020 if null +function formatKValue(k: number | null | undefined): string { + const value = k ?? 0.020; + return value.toFixed(3); +} // Nozzle side indicators (Bambu Lab style - square badge with L/R) function NozzleBadge({ side }: { side: 'L' | 'R' }) { @@ -56,88 +198,6 @@ function NozzleBadge({ side }: { side: 'L' | 'R' }) { ); } -// AMS 4-tray device icon with fillable colored spool slots (Bambu Studio style) -interface AMS4TrayIconProps { - colors: (string | null)[]; // Array of 4 colors (hex) or null for empty - className?: string; -} - -function AMS4TrayIcon({ colors, className }: AMS4TrayIconProps) { - // Spool positions: x start, centered at 12.5, 21.5, 30.5, 39.5 - // Each spool slot is 6 units wide (from 9.5-15.5, 18.5-24.5, etc.) - const spoolSlots = [ - { x: 9.5, cx: 12.5 }, - { x: 18.5, cx: 21.5 }, - { x: 27.5, cx: 30.5 }, - { x: 36.5, cx: 39.5 }, - ]; - - return ( - - {/* Outer casing with window */} - - {/* Spool color fills - rectangles that fill the visible window area */} - {spoolSlots.map((slot, i) => ( - colors[i] ? ( - - ) : ( - - - - - ) - ))} - {/* Bottom half overlay (spool holders - creates rounded bottom edges) */} - - {/* Top half overlay (spool tops - creates rounded top edges) */} - - - ); -} - -// AMS 1-tray device icon (AMS-HT) with fillable colored slot (Bambu Studio style) -interface AMS1TrayIconProps { - color: string | null; // Hex color or null for empty - className?: string; -} - -function AMS1TrayIcon({ color, className }: AMS1TrayIconProps) { - return ( - - {/* Filament color fill */} - {color ? ( - - ) : ( - - - - - )} - {/* Device outline - top housing */} - - {/* Bottom base */} - - {/* Inner tray outline */} - - - ); -} - // Water drop SVG - empty outline (Bambu Lab style from bambu-humidity) function WaterDropEmpty({ className }: { className?: string }) { return ( @@ -247,9 +307,10 @@ interface HumidityIndicatorProps { goodThreshold?: number; // <= this is green fairThreshold?: number; // <= this is orange, > is red onClick?: () => void; + compact?: boolean; // Smaller version for grid layout } -function HumidityIndicator({ humidity, goodThreshold = 40, fairThreshold = 60, onClick }: HumidityIndicatorProps) { +function HumidityIndicator({ humidity, goodThreshold = 40, fairThreshold = 60, onClick, compact }: HumidityIndicatorProps) { const humidityValue = typeof humidity === 'string' ? parseInt(humidity, 10) : humidity; const good = typeof goodThreshold === 'number' ? goodThreshold : 40; const fair = typeof fairThreshold === 'number' ? fairThreshold : 60; @@ -289,11 +350,11 @@ function HumidityIndicator({ humidity, goodThreshold = 40, fairThreshold = 60, o ); } @@ -304,9 +365,10 @@ interface TemperatureIndicatorProps { goodThreshold?: number; // <= this is blue fairThreshold?: number; // <= this is orange, > is red onClick?: () => void; + compact?: boolean; // Smaller version for grid layout } -function TemperatureIndicator({ temp, goodThreshold = 28, fairThreshold = 35, onClick }: TemperatureIndicatorProps) { +function TemperatureIndicator({ temp, goodThreshold = 28, fairThreshold = 35, onClick, compact }: TemperatureIndicatorProps) { // Ensure thresholds are numbers const good = typeof goodThreshold === 'number' ? goodThreshold : 28; const fair = typeof fairThreshold === 'number' ? fairThreshold : 35; @@ -336,8 +398,8 @@ function TemperatureIndicator({ temp, goodThreshold = 28, fairThreshold = 35, on className={`flex items-center gap-1 ${onClick ? 'cursor-pointer hover:opacity-80 transition-opacity' : ''}`} title={`Temperature: ${temp}°C - ${statusText}${onClick ? ' (click for history)' : ''}`} > - - {temp}°C + + {temp}°C ); } @@ -356,6 +418,13 @@ function getAmsLabel(amsId: number | string, trayCount: number): string { return isHt ? `HT-${letter}` : `AMS-${letter}`; } +// Get fill bar color based on spool fill level +function getFillBarColor(fillLevel: number): string { + if (fillLevel > 50) return '#00ae42'; // Green - good + if (fillLevel >= 15) return '#f59e0b'; // Amber - warning (<= 50%) + return '#ef4444'; // Red - critical (< 15%) +} + function formatTime(seconds: number): string { const hours = Math.floor(seconds / 3600); const minutes = Math.floor((seconds % 3600) / 60); @@ -615,6 +684,32 @@ function PrinterCard({ refetchInterval: 30000, // Fallback polling, WebSocket handles real-time }); + // Collect unique tray_info_idx values for cloud filament info lookup + const trayInfoIds = useMemo(() => { + const ids = new Set(); + if (status?.ams) { + for (const ams of status.ams) { + for (const tray of ams.tray || []) { + if (tray.tray_info_idx) { + ids.add(tray.tray_info_idx); + } + } + } + } + if (status?.vt_tray?.tray_info_idx) { + ids.add(status.vt_tray.tray_info_idx); + } + return Array.from(ids); + }, [status?.ams, status?.vt_tray]); + + // Fetch cloud filament info for tooltips (name includes color, also has K value) + const { data: filamentInfo } = useQuery({ + queryKey: ['filamentInfo', trayInfoIds], + queryFn: () => api.getFilamentInfo(trayInfoIds), + enabled: trayInfoIds.length > 0, + staleTime: 5 * 60 * 1000, // 5 minutes + }); + // Cache WiFi signal to prevent it disappearing on updates const [cachedWifiSignal, setCachedWifiSignal] = useState(null); useEffect(() => { @@ -653,6 +748,19 @@ function PrinterCard({ }, [status?.ams]); const amsData = (status?.ams && status.ams.length > 0) ? status.ams : cachedAmsData.current; + // Cache tray_now to prevent flickering when 255 (unloaded) or undefined values come in + // Only update cache when we get a valid tray ID (0-253 or 254 for external) + const cachedTrayNow = useRef(255); + const currentTrayNow = status?.tray_now; + // Update cache synchronously during render if we have a valid value + if (currentTrayNow !== undefined && currentTrayNow !== 255) { + cachedTrayNow.current = currentTrayNow; + } + // Use cached value if current is 255/undefined but we had a valid value before + const effectiveTrayNow = (currentTrayNow === undefined || currentTrayNow === 255) + ? cachedTrayNow.current + : currentTrayNow; + // Fetch smart plug for this printer const { data: smartPlug } = useQuery({ queryKey: ['smartPlugByPrinter', printer.id], @@ -1135,132 +1243,328 @@ function PrinterCard({ ); })()} - {/* AMS Units with Device Icons, Humidity & Temperature */} - {amsData && amsData.length > 0 && viewMode === 'expanded' && ( -
- {amsData.map((ams) => { - // For dual nozzle printers, determine which nozzle this AMS is connected to - // Use actual ams.id for map lookup (map uses real IDs: 0-3 for AMS, 128+ for AMS-HT) - const mappedExtruderId = amsExtruderMap[String(ams.id)]; - // Fallback: normalize ID for conventional mapping (0=R, 1=L) - const normalizedId = ams.id >= 128 ? ams.id - 128 : ams.id; - const extruderId = mappedExtruderId !== undefined - ? mappedExtruderId - : normalizedId; // Fallback: AMS 0 → extruder 0 (R), AMS 1 → extruder 1 (L) - // Use printer.nozzle_count as primary source (stable), fallback to nozzle_2 temp - const isDualNozzle = printer.nozzle_count === 2 || status?.temperatures?.nozzle_2 !== undefined; - // extruder 0 = Right, extruder 1 = Left - const isLeftNozzle = extruderId === 1; - const isRightNozzle = extruderId === 0; + {/* AMS Units - 2-Column Grid Layout */} + {amsData && amsData.length > 0 && viewMode === 'expanded' && (() => { + // Separate regular AMS (4-tray) from HT AMS (1-tray) + const regularAms = amsData.filter(ams => ams.tray.length > 1); + const htAms = amsData.filter(ams => ams.tray.length === 1); + const isDualNozzle = printer.nozzle_count === 2 || status?.temperatures?.nozzle_2 !== undefined; - // Get colors for the AMS icon (null for empty slots) - const slotColors = ams.tray.map(tray => - tray.tray_color ? `#${tray.tray_color}` : (tray.tray_type ? '#333' : null) - ); - const isHtAms = ams.tray.length === 1; + return ( +
+ {/* Section Header */} +
+ + Filaments + +
+
- return ( -
-
- {/* Nozzle badge + AMS device icon */} -
- {isDualNozzle && (isLeftNozzle || isRightNozzle) && ( - - )} - {isHtAms ? ( - - ) : ( - - )} -
+ {/* AMS Content */} +
+ {/* Row 1-2: Regular AMS (4-tray) in 2-column grid */} + {regularAms.length > 0 && ( +
+ {regularAms.map((ams) => { + const mappedExtruderId = amsExtruderMap[String(ams.id)]; + const normalizedId = ams.id >= 128 ? ams.id - 128 : ams.id; + const extruderId = mappedExtruderId !== undefined ? mappedExtruderId : normalizedId; + const isLeftNozzle = extruderId === 1; + const isRightNozzle = extruderId === 0; - {/* Label and filament info */} -
- - {getAmsLabel(ams.id, ams.tray.length)} - - {/* Filament types and fill levels */} -
- {ams.tray.map((tray, i) => ( -
-
- - {tray.tray_type ? (tray.tray_sub_brands || tray.tray_type) : '—'} - - - {tray.tray_type && tray.remain >= 0 ? `${tray.remain}%` : '—'} - -
- {i < ams.tray.length - 1 && ( - - · - · - + return ( +
+ {/* Header: Label + Stats (no icon) */} +
+
+ + {getAmsLabel(ams.id, ams.tray.length)} + + {isDualNozzle && (isLeftNozzle || isRightNozzle) && ( + )}
- ))} + {(ams.humidity != null || ams.temp != null) && ( +
+ {ams.humidity != null && ( + setAmsHistoryModal({ + amsId: ams.id, + amsLabel: getAmsLabel(ams.id, ams.tray.length), + mode: 'humidity', + })} + compact + /> + )} + {ams.temp != null && ( + setAmsHistoryModal({ + amsId: ams.id, + amsLabel: getAmsLabel(ams.id, ams.tray.length), + mode: 'temperature', + })} + compact + /> + )} +
+ )} +
+ {/* Slots grid: 4 columns - always render 4 slots */} +
+ {[0, 1, 2, 3].map((slotIdx) => { + // Find tray data for this slot (may be undefined if data incomplete) + // Use array index if available, as tray.id may not always be set + const tray = ams.tray[slotIdx] || ams.tray.find(t => t.id === slotIdx); + const hasFillLevel = tray?.tray_type && tray.remain >= 0; + const isEmpty = !tray?.tray_type; + // Check if this is the currently loaded tray + // Global tray ID = ams.id * 4 + slot index (for standard AMS) + const globalTrayId = ams.id * 4 + slotIdx; + const isActive = effectiveTrayNow === globalTrayId; + // Get cloud preset info if available + const cloudInfo = tray?.tray_info_idx ? filamentInfo?.[tray.tray_info_idx] : null; + + // Build filament data for hover card + const filamentData = tray?.tray_type ? { + vendor: (tray.tray_uuid ? 'Bambu Lab' : 'Generic') as 'Bambu Lab' | 'Generic', + profile: cloudInfo?.name || tray.tray_sub_brands || tray.tray_type, + colorName: getBambuColorName(tray.tray_id_name) || hexToBasicColorName(tray.tray_color), + colorHex: tray.tray_color || null, + kFactor: formatKValue(tray.k), + fillLevel: hasFillLevel ? tray.remain : null, + } : null; + + const slotContent = ( +
+
+
+ {tray?.tray_type || '—'} +
+ {/* Fill bar */} +
+ {hasFillLevel && tray ? ( +
+ ) : tray?.tray_type ? ( +
+ ) : null} +
+
+ ); + + return filamentData ? ( + + {slotContent} + + ) : ( + + {slotContent} + + ); + })} +
-
- {/* Humidity/temp - responsive positioning */} - {(ams.humidity != null || ams.temp != null) && ( -
- {ams.humidity != null && ( - setAmsHistoryModal({ - amsId: ams.id, - amsLabel: getAmsLabel(ams.id, ams.tray.length), - mode: 'humidity', - })} - /> - )} - {ams.temp != null && ( - setAmsHistoryModal({ - amsId: ams.id, - amsLabel: getAmsLabel(ams.id, ams.tray.length), - mode: 'temperature', - })} - /> - )} + ); + })} +
+ )} + + {/* Row 3: HT AMS + External spools (same style as regular AMS, 4 across) */} + {(htAms.length > 0 || (status.vt_tray && status.vt_tray.tray_type)) && ( +
+ {/* HT AMS units - name/badge top, slot left, stats right */} + {htAms.map((ams) => { + const mappedExtruderId = amsExtruderMap[String(ams.id)]; + const normalizedId = ams.id >= 128 ? ams.id - 128 : ams.id; + const extruderId = mappedExtruderId !== undefined ? mappedExtruderId : normalizedId; + const isLeftNozzle = extruderId === 1; + const isRightNozzle = extruderId === 0; + const tray = ams.tray[0]; + const hasFillLevel = tray?.tray_type && tray.remain >= 0; + const isEmpty = !tray?.tray_type; + // Check if this is the currently loaded tray + // Global tray ID = ams.id * 4 + tray.id + const globalTrayId = ams.id * 4 + (tray?.id ?? 0); + const isActive = effectiveTrayNow === globalTrayId; + // Get cloud preset info if available + const cloudInfo = tray?.tray_info_idx ? filamentInfo?.[tray.tray_info_idx] : null; + + // Build filament data for hover card + const filamentData = tray?.tray_type ? { + vendor: (tray.tray_uuid ? 'Bambu Lab' : 'Generic') as 'Bambu Lab' | 'Generic', + profile: cloudInfo?.name || tray.tray_sub_brands || tray.tray_type, + colorName: getBambuColorName(tray.tray_id_name) || hexToBasicColorName(tray.tray_color), + colorHex: tray.tray_color || null, + kFactor: formatKValue(tray.k), + fillLevel: hasFillLevel ? tray.remain : null, + } : null; + + const slotContent = ( +
+
+
+ {tray?.tray_type || '—'} +
+ {/* Fill bar */} +
+ {hasFillLevel ? ( +
+ ) : tray?.tray_type ? ( +
+ ) : null} +
- )} + ); + + return ( +
+ {/* Row 1: Label + Nozzle */} +
+ + {getAmsLabel(ams.id, ams.tray.length)} + + {isDualNozzle && (isLeftNozzle || isRightNozzle) && ( + + )} +
+ {/* Row 2: Slot (left) + Stats (right stacked) */} +
+ {/* Slot - takes remaining width */} + {filamentData ? ( + + {slotContent} + + ) : ( + + {slotContent} + + )} + {/* Stats stacked vertically: Temp on top, Humidity below */} + {(ams.humidity != null || ams.temp != null) && ( +
+ {ams.temp != null && ( + setAmsHistoryModal({ + amsId: ams.id, + amsLabel: getAmsLabel(ams.id, ams.tray.length), + mode: 'temperature', + })} + compact + /> + )} + {ams.humidity != null && ( + setAmsHistoryModal({ + amsId: ams.id, + amsLabel: getAmsLabel(ams.id, ams.tray.length), + mode: 'humidity', + })} + compact + /> + )} +
+ )} +
+
+ ); + })} + {/* External spool - name top, slot below (no stats) */} + {status.vt_tray && status.vt_tray.tray_type && (() => { + const extTray = status.vt_tray; + // Check if external spool is active (tray_now = 254) + const isExtActive = effectiveTrayNow === 254; + // Get cloud preset info if available + const extCloudInfo = extTray.tray_info_idx ? filamentInfo?.[extTray.tray_info_idx] : null; + + // Build filament data for hover card + const extFilamentData = { + vendor: (extTray.tray_uuid ? 'Bambu Lab' : 'Generic') as 'Bambu Lab' | 'Generic', + profile: extCloudInfo?.name || extTray.tray_sub_brands || extTray.tray_type || 'Unknown', + colorName: getBambuColorName(extTray.tray_id_name) || hexToBasicColorName(extTray.tray_color), + colorHex: extTray.tray_color || null, + kFactor: formatKValue(extTray.k), + fillLevel: null, // External spool has unknown fill level + }; + + const extSlotContent = ( +
+
+
+ {extTray.tray_type || 'Spool'} +
+ {/* Unknown fill level - subtle bar */} +
+
+
+
+ ); + + return ( +
+ {/* Row 1: Label */} +
+ External +
+ {/* Row 2: Slot (full width since no stats) */} + + {extSlotContent} + +
+ ); + })()}
-
- ); - })} - {/* External spool indicator */} - {status.vt_tray && status.vt_tray.tray_type && ( -
-
-
-
- External -

- {status.vt_tray.tray_sub_brands || status.vt_tray.tray_type || 'Spool'} -

-
-
+ )}
- )} -
- )} +
+ ); + })()} )} diff --git a/static/assets/index-BmBv9fEm.css b/static/assets/index-BmBv9fEm.css deleted file mode 100644 index 91b419015..000000000 --- a/static/assets/index-BmBv9fEm.css +++ /dev/null @@ -1 +0,0 @@ -@import"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap";@layer properties,theme,base,components,utilities;@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--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-200:oklch(90.1% .076 70.697);--color-orange-300:oklch(83.7% .128 66.29);--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-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-cyan-300:oklch(86.5% .127 207.078);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-500:oklch(71.5% .143 215.221);--color-cyan-600:oklch(60.9% .126 221.723);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--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-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-900:oklch(21% .034 264.665);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--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: 1.5 ;--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-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--tracking-widest:.1em;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-sm:8px;--aspect-video:16/9;--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-bambu-green:var(--accent);--color-bambu-green-light:var(--accent-light);--color-bambu-green-dark:var(--accent-dark);--color-bambu-dark:var(--bg-primary);--color-bambu-dark-secondary:var(--bg-secondary);--color-bambu-dark-tertiary:var(--bg-tertiary);--color-bambu-gray:var(--text-muted);--color-bambu-gray-light:var(--text-secondary);--color-bambu-gray-dark:var(--text-tertiary)}}@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;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}}@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.inset-x-0{inset-inline:calc(var(--spacing)*0)}.inset-y-0{inset-block:calc(var(--spacing)*0)}.-top-1{top:calc(var(--spacing)*-1)}.top-0{top:calc(var(--spacing)*0)}.top-1{top:calc(var(--spacing)*1)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing)*2)}.top-4{top:calc(var(--spacing)*4)}.top-8{top:calc(var(--spacing)*8)}.top-\[2px\]{top:2px}.top-\[3px\]{top:3px}.top-full{top:100%}.-right-1{right:calc(var(--spacing)*-1)}.right-0{right:calc(var(--spacing)*0)}.right-1{right:calc(var(--spacing)*1)}.right-2{right:calc(var(--spacing)*2)}.right-4{right:calc(var(--spacing)*4)}.right-6{right:calc(var(--spacing)*6)}.right-10{right:calc(var(--spacing)*10)}.right-12{right:calc(var(--spacing)*12)}.right-full{right:100%}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-1{bottom:calc(var(--spacing)*1)}.bottom-2{bottom:calc(var(--spacing)*2)}.bottom-4{bottom:calc(var(--spacing)*4)}.bottom-6{bottom:calc(var(--spacing)*6)}.bottom-full{bottom:100%}.left-0{left:calc(var(--spacing)*0)}.left-1{left:calc(var(--spacing)*1)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing)*2)}.left-2\.5{left:calc(var(--spacing)*2.5)}.left-3{left:calc(var(--spacing)*3)}.left-4{left:calc(var(--spacing)*4)}.left-12{left:calc(var(--spacing)*12)}.left-\[2px\]{left:2px}.left-\[3px\]{left:3px}.left-full{left:100%}.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-60,.z-\[60\]{z-index:60}.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}.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}}.-mx-4{margin-inline:calc(var(--spacing)*-4)}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-4{margin-inline:calc(var(--spacing)*4)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing)*1)}.my-8{margin-block:calc(var(--spacing)*8)}.-mt-2{margin-top:calc(var(--spacing)*-2)}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\.5{margin-top:calc(var(--spacing)*1.5)}.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-6{margin-top:calc(var(--spacing)*6)}.mt-14{margin-top:calc(var(--spacing)*14)}.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)}.-mb-px{margin-bottom:-1px}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\.5{margin-bottom:calc(var(--spacing)*1.5)}.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-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.-ml-1{margin-left:calc(var(--spacing)*-1)}.-ml-2{margin-left:calc(var(--spacing)*-2)}.ml-0\.5{margin-left:calc(var(--spacing)*.5)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-1\.5{margin-left:calc(var(--spacing)*1.5)}.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-8{margin-left:calc(var(--spacing)*8)}.ml-14{margin-left:calc(var(--spacing)*14)}.ml-16{margin-left:calc(var(--spacing)*16)}.ml-64{margin-left:calc(var(--spacing)*64)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.h-1{height:calc(var(--spacing)*1)}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-2{height:calc(var(--spacing)*2)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.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-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-14{height:calc(var(--spacing)*14)}.h-16{height:calc(var(--spacing)*16)}.h-20{height:calc(var(--spacing)*20)}.h-28{height:calc(var(--spacing)*28)}.h-64{height:calc(var(--spacing)*64)}.h-80{height:calc(var(--spacing)*80)}.h-\[80vh\]{height:80vh}.h-\[160px\]{height:160px}.h-\[300px\]{height:300px}.h-full{height:100%}.max-h-40{max-height:calc(var(--spacing)*40)}.max-h-60{max-height:calc(var(--spacing)*60)}.max-h-64{max-height:calc(var(--spacing)*64)}.max-h-80{max-height:calc(var(--spacing)*80)}.max-h-96{max-height:calc(var(--spacing)*96)}.max-h-\[60vh\]{max-height:60vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[85vh\]{max-height:85vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[300px\]{max-height:300px}.max-h-\[400px\]{max-height:400px}.max-h-\[calc\(90vh-80px\)\]{max-height:calc(90vh - 80px)}.max-h-\[calc\(100vh-320px\)\]{max-height:calc(100vh - 320px)}.max-h-full{max-height:100%}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-\[44px\]{min-height:44px}.min-h-\[48px\]{min-height:48px}.min-h-\[120px\]{min-height:120px}.min-h-\[400px\]{min-height:400px}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-0\.5{width:calc(var(--spacing)*.5)}.w-1\.5{width:calc(var(--spacing)*1.5)}.w-1\/3{width:33.3333%}.w-2{width:calc(var(--spacing)*2)}.w-2\.5{width:calc(var(--spacing)*2.5)}.w-3{width:calc(var(--spacing)*3)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-10{width:calc(var(--spacing)*10)}.w-11{width:calc(var(--spacing)*11)}.w-12{width:calc(var(--spacing)*12)}.w-14{width:calc(var(--spacing)*14)}.w-16{width:calc(var(--spacing)*16)}.w-20{width:calc(var(--spacing)*20)}.w-24{width:calc(var(--spacing)*24)}.w-28{width:calc(var(--spacing)*28)}.w-32{width:calc(var(--spacing)*32)}.w-36{width:calc(var(--spacing)*36)}.w-40{width:calc(var(--spacing)*40)}.w-48{width:calc(var(--spacing)*48)}.w-56{width:calc(var(--spacing)*56)}.w-64{width:calc(var(--spacing)*64)}.w-72{width:calc(var(--spacing)*72)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.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-5xl{max-width:var(--container-5xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-32{max-width:calc(var(--spacing)*32)}.max-w-\[60px\]{max-width:60px}.max-w-\[90vw\]{max-width:90vw}.max-w-\[100px\]{max-width:100px}.max-w-\[120px\]{max-width:120px}.max-w-\[150px\]{max-width:150px}.max-w-\[200px\]{max-width:200px}.max-w-\[280px\]{max-width:280px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.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-48{min-width:calc(var(--spacing)*48)}.min-w-\[80px\]{min-width:80px}.min-w-\[100px\]{min-width:100px}.min-w-\[120px\]{min-width:120px}.min-w-\[150px\]{min-width:150px}.min-w-\[160px\]{min-width:160px}.min-w-\[180px\]{min-width:180px}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-0{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-0\.5{--tw-translate-x:calc(var(--spacing)*.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-3\.5{--tw-translate-x:calc(var(--spacing)*3.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-4{--tw-translate-x:calc(var(--spacing)*4);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-6{--tw-translate-x:calc(var(--spacing)*6);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.scale-110{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-\[1\.02\]{scale:1.02}.-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,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-ew-resize{cursor:ew-resize}.cursor-grab{cursor:grab}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-manipulation{touch-action:manipulation}.resize{resize:both}.resize-none{resize:none}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.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-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.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-6{gap:calc(var(--spacing)*6)}.gap-8{gap:calc(var(--spacing)*8)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}: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)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-6{column-gap:calc(var(--spacing)*6)}.gap-y-3{row-gap:calc(var(--spacing)*3)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-bambu-dark-tertiary>:not(:last-child)){border-color:var(--color-bambu-dark-tertiary)}:where(.divide-bambu-gray\/20>:not(:last-child)){border-color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){:where(.divide-bambu-gray\/20>:not(:last-child)){border-color:color-mix(in oklab,var(--color-bambu-gray)20%,transparent)}}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.rounded-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-b-lg{border-bottom-right-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-4{border-style:var(--tw-border-style);border-width:4px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-500\/20{border-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/20{border-color:color-mix(in oklab,var(--color-amber-500)20%,transparent)}}.border-bambu-dark-tertiary{border-color:var(--color-bambu-dark-tertiary)}.border-bambu-gray,.border-bambu-gray\/30{border-color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.border-bambu-gray\/30{border-color:color-mix(in oklab,var(--color-bambu-gray)30%,transparent)}}.border-bambu-green,.border-bambu-green\/20{border-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.border-bambu-green\/20{border-color:color-mix(in oklab,var(--color-bambu-green)20%,transparent)}}.border-bambu-green\/30{border-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.border-bambu-green\/30{border-color:color-mix(in oklab,var(--color-bambu-green)30%,transparent)}}.border-bambu-green\/50{border-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.border-bambu-green\/50{border-color:color-mix(in oklab,var(--color-bambu-green)50%,transparent)}}.border-blue-400\/20{border-color:#54a2ff33}@supports (color:color-mix(in lab,red,red)){.border-blue-400\/20{border-color:color-mix(in oklab,var(--color-blue-400)20%,transparent)}}.border-blue-500\/20{border-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.border-blue-500\/20{border-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.border-blue-500\/30{border-color:#3080ff4d}@supports (color:color-mix(in lab,red,red)){.border-blue-500\/30{border-color:color-mix(in oklab,var(--color-blue-500)30%,transparent)}}.border-blue-500\/50{border-color:#3080ff80}@supports (color:color-mix(in lab,red,red)){.border-blue-500\/50{border-color:color-mix(in oklab,var(--color-blue-500)50%,transparent)}}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-400\/20{border-color:#99a1af33}@supports (color:color-mix(in lab,red,red)){.border-gray-400\/20{border-color:color-mix(in oklab,var(--color-gray-400)20%,transparent)}}.border-gray-500\/20{border-color:#6a728233}@supports (color:color-mix(in lab,red,red)){.border-gray-500\/20{border-color:color-mix(in oklab,var(--color-gray-500)20%,transparent)}}.border-gray-700{border-color:var(--color-gray-700)}.border-green-400\/20{border-color:#05df7233}@supports (color:color-mix(in lab,red,red)){.border-green-400\/20{border-color:color-mix(in oklab,var(--color-green-400)20%,transparent)}}.border-green-500\/30{border-color:#00c7584d}@supports (color:color-mix(in lab,red,red)){.border-green-500\/30{border-color:color-mix(in oklab,var(--color-green-500)30%,transparent)}}.border-green-500\/50{border-color:#00c75880}@supports (color:color-mix(in lab,red,red)){.border-green-500\/50{border-color:color-mix(in oklab,var(--color-green-500)50%,transparent)}}.border-orange-400\/20{border-color:#ff8b1a33}@supports (color:color-mix(in lab,red,red)){.border-orange-400\/20{border-color:color-mix(in oklab,var(--color-orange-400)20%,transparent)}}.border-orange-400\/50{border-color:#ff8b1a80}@supports (color:color-mix(in lab,red,red)){.border-orange-400\/50{border-color:color-mix(in oklab,var(--color-orange-400)50%,transparent)}}.border-orange-500\/20{border-color:#fe6e0033}@supports (color:color-mix(in lab,red,red)){.border-orange-500\/20{border-color:color-mix(in oklab,var(--color-orange-500)20%,transparent)}}.border-orange-500\/30{border-color:#fe6e004d}@supports (color:color-mix(in lab,red,red)){.border-orange-500\/30{border-color:color-mix(in oklab,var(--color-orange-500)30%,transparent)}}.border-red-400\/20{border-color:#ff656833}@supports (color:color-mix(in lab,red,red)){.border-red-400\/20{border-color:color-mix(in oklab,var(--color-red-400)20%,transparent)}}.border-red-500{border-color:var(--color-red-500)}.border-red-500\/20{border-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.border-red-500\/20{border-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.border-red-500\/30{border-color:#fb2c364d}@supports (color:color-mix(in lab,red,red)){.border-red-500\/30{border-color:color-mix(in oklab,var(--color-red-500)30%,transparent)}}.border-red-500\/50{border-color:#fb2c3680}@supports (color:color-mix(in lab,red,red)){.border-red-500\/50{border-color:color-mix(in oklab,var(--color-red-500)50%,transparent)}}.border-transparent{border-color:#0000}.border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.border-white\/10{border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.border-white\/20{border-color:#fff3}@supports (color:color-mix(in lab,red,red)){.border-white\/20{border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.border-yellow-400\/20{border-color:#fac80033}@supports (color:color-mix(in lab,red,red)){.border-yellow-400\/20{border-color:color-mix(in oklab,var(--color-yellow-400)20%,transparent)}}.border-yellow-500{border-color:var(--color-yellow-500)}.border-yellow-500\/20{border-color:#edb20033}@supports (color:color-mix(in lab,red,red)){.border-yellow-500\/20{border-color:color-mix(in oklab,var(--color-yellow-500)20%,transparent)}}.border-yellow-500\/30{border-color:#edb2004d}@supports (color:color-mix(in lab,red,red)){.border-yellow-500\/30{border-color:color-mix(in oklab,var(--color-yellow-500)30%,transparent)}}.border-yellow-500\/50{border-color:#edb20080}@supports (color:color-mix(in lab,red,red)){.border-yellow-500\/50{border-color:color-mix(in oklab,var(--color-yellow-500)50%,transparent)}}.border-t-transparent{border-top-color:#0000}.border-l-yellow-500{border-left-color:var(--color-yellow-500)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/5{background-color:#f99c000d}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/5{background-color:color-mix(in oklab,var(--color-amber-500)5%,transparent)}}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500)10%,transparent)}}.bg-amber-500\/20{background-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/20{background-color:color-mix(in oklab,var(--color-amber-500)20%,transparent)}}.bg-amber-600\/20{background-color:#dd740033}@supports (color:color-mix(in lab,red,red)){.bg-amber-600\/20{background-color:color-mix(in oklab,var(--color-amber-600)20%,transparent)}}.bg-bambu-dark{background-color:var(--color-bambu-dark)}.bg-bambu-dark-secondary,.bg-bambu-dark-secondary\/50{background-color:var(--color-bambu-dark-secondary)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark-secondary\/50{background-color:color-mix(in oklab,var(--color-bambu-dark-secondary)50%,transparent)}}.bg-bambu-dark-secondary\/90{background-color:var(--color-bambu-dark-secondary)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark-secondary\/90{background-color:color-mix(in oklab,var(--color-bambu-dark-secondary)90%,transparent)}}.bg-bambu-dark-tertiary,.bg-bambu-dark-tertiary\/50{background-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark-tertiary\/50{background-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)50%,transparent)}}.bg-bambu-dark\/20{background-color:var(--color-bambu-dark)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark\/20{background-color:color-mix(in oklab,var(--color-bambu-dark)20%,transparent)}}.bg-bambu-dark\/30{background-color:var(--color-bambu-dark)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark\/30{background-color:color-mix(in oklab,var(--color-bambu-dark)30%,transparent)}}.bg-bambu-dark\/50{background-color:var(--color-bambu-dark)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark\/50{background-color:color-mix(in oklab,var(--color-bambu-dark)50%,transparent)}}.bg-bambu-dark\/80{background-color:var(--color-bambu-dark)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark\/80{background-color:color-mix(in oklab,var(--color-bambu-dark)80%,transparent)}}.bg-bambu-dark\/90{background-color:var(--color-bambu-dark)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-dark\/90{background-color:color-mix(in oklab,var(--color-bambu-dark)90%,transparent)}}.bg-bambu-gray\/10{background-color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-gray\/10{background-color:color-mix(in oklab,var(--color-bambu-gray)10%,transparent)}}.bg-bambu-gray\/20{background-color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-gray\/20{background-color:color-mix(in oklab,var(--color-bambu-gray)20%,transparent)}}.bg-bambu-gray\/30{background-color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-gray\/30{background-color:color-mix(in oklab,var(--color-bambu-gray)30%,transparent)}}.bg-bambu-green,.bg-bambu-green\/5{background-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-green\/5{background-color:color-mix(in oklab,var(--color-bambu-green)5%,transparent)}}.bg-bambu-green\/10{background-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-green\/10{background-color:color-mix(in oklab,var(--color-bambu-green)10%,transparent)}}.bg-bambu-green\/20{background-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-green\/20{background-color:color-mix(in oklab,var(--color-bambu-green)20%,transparent)}}.bg-bambu-green\/30{background-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-green\/30{background-color:color-mix(in oklab,var(--color-bambu-green)30%,transparent)}}.bg-bambu-green\/50{background-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-green\/50{background-color:color-mix(in oklab,var(--color-bambu-green)50%,transparent)}}.bg-bambu-green\/75{background-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.bg-bambu-green\/75{background-color:color-mix(in oklab,var(--color-bambu-green)75%,transparent)}}.bg-black{background-color:var(--color-black)}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black)30%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black)60%,transparent)}}.bg-black\/70{background-color:#000000b3}@supports (color:color-mix(in lab,red,red)){.bg-black\/70{background-color:color-mix(in oklab,var(--color-black)70%,transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.bg-black\/80{background-color:color-mix(in oklab,var(--color-black)80%,transparent)}}.bg-black\/90{background-color:#000000e6}@supports (color:color-mix(in lab,red,red)){.bg-black\/90{background-color:color-mix(in oklab,var(--color-black)90%,transparent)}}.bg-blue-400{background-color:var(--color-blue-400)}.bg-blue-400\/10{background-color:#54a2ff1a}@supports (color:color-mix(in lab,red,red)){.bg-blue-400\/10{background-color:color-mix(in oklab,var(--color-blue-400)10%,transparent)}}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-500\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/10{background-color:color-mix(in oklab,var(--color-blue-500)10%,transparent)}}.bg-blue-500\/20{background-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/20{background-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.bg-blue-500\/30{background-color:#3080ff4d}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/30{background-color:color-mix(in oklab,var(--color-blue-500)30%,transparent)}}.bg-blue-600{background-color:var(--color-blue-600)}.bg-blue-600\/20{background-color:#155dfc33}@supports (color:color-mix(in lab,red,red)){.bg-blue-600\/20{background-color:color-mix(in oklab,var(--color-blue-600)20%,transparent)}}.bg-cyan-500\/20{background-color:#00b7d733}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/20{background-color:color-mix(in oklab,var(--color-cyan-500)20%,transparent)}}.bg-cyan-600\/20{background-color:#0092b533}@supports (color:color-mix(in lab,red,red)){.bg-cyan-600\/20{background-color:color-mix(in oklab,var(--color-cyan-600)20%,transparent)}}.bg-emerald-500\/20{background-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/20{background-color:color-mix(in oklab,var(--color-emerald-500)20%,transparent)}}.bg-gray-400{background-color:var(--color-gray-400)}.bg-gray-400\/10{background-color:#99a1af1a}@supports (color:color-mix(in lab,red,red)){.bg-gray-400\/10{background-color:color-mix(in oklab,var(--color-gray-400)10%,transparent)}}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-500\/20{background-color:#6a728233}@supports (color:color-mix(in lab,red,red)){.bg-gray-500\/20{background-color:color-mix(in oklab,var(--color-gray-500)20%,transparent)}}.bg-gray-900{background-color:var(--color-gray-900)}.bg-green-400{background-color:var(--color-green-400)}.bg-green-400\/10{background-color:#05df721a}@supports (color:color-mix(in lab,red,red)){.bg-green-400\/10{background-color:color-mix(in oklab,var(--color-green-400)10%,transparent)}}.bg-green-500{background-color:var(--color-green-500)}.bg-green-500\/10{background-color:#00c7581a}@supports (color:color-mix(in lab,red,red)){.bg-green-500\/10{background-color:color-mix(in oklab,var(--color-green-500)10%,transparent)}}.bg-green-500\/20{background-color:#00c75833}@supports (color:color-mix(in lab,red,red)){.bg-green-500\/20{background-color:color-mix(in oklab,var(--color-green-500)20%,transparent)}}.bg-indigo-500\/20{background-color:#625fff33}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/20{background-color:color-mix(in oklab,var(--color-indigo-500)20%,transparent)}}.bg-orange-400\/10{background-color:#ff8b1a1a}@supports (color:color-mix(in lab,red,red)){.bg-orange-400\/10{background-color:color-mix(in oklab,var(--color-orange-400)10%,transparent)}}.bg-orange-500\/10{background-color:#fe6e001a}@supports (color:color-mix(in lab,red,red)){.bg-orange-500\/10{background-color:color-mix(in oklab,var(--color-orange-500)10%,transparent)}}.bg-orange-500\/20{background-color:#fe6e0033}@supports (color:color-mix(in lab,red,red)){.bg-orange-500\/20{background-color:color-mix(in oklab,var(--color-orange-500)20%,transparent)}}.bg-orange-600{background-color:var(--color-orange-600)}.bg-orange-600\/20{background-color:#f0510033}@supports (color:color-mix(in lab,red,red)){.bg-orange-600\/20{background-color:color-mix(in oklab,var(--color-orange-600)20%,transparent)}}.bg-purple-500\/20{background-color:#ac4bff33}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/20{background-color:color-mix(in oklab,var(--color-purple-500)20%,transparent)}}.bg-purple-500\/80{background-color:#ac4bffcc}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/80{background-color:color-mix(in oklab,var(--color-purple-500)80%,transparent)}}.bg-red-400{background-color:var(--color-red-400)}.bg-red-400\/10{background-color:#ff65681a}@supports (color:color-mix(in lab,red,red)){.bg-red-400\/10{background-color:color-mix(in oklab,var(--color-red-400)10%,transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-red-500\/5{background-color:#fb2c360d}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/5{background-color:color-mix(in oklab,var(--color-red-500)5%,transparent)}}.bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/10{background-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.bg-red-500\/15{background-color:#fb2c3626}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/15{background-color:color-mix(in oklab,var(--color-red-500)15%,transparent)}}.bg-red-500\/20{background-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/20{background-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.bg-red-500\/30{background-color:#fb2c364d}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/30{background-color:color-mix(in oklab,var(--color-red-500)30%,transparent)}}.bg-red-500\/40{background-color:#fb2c3666}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/40{background-color:color-mix(in oklab,var(--color-red-500)40%,transparent)}}.bg-red-500\/80{background-color:#fb2c36cc}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/80{background-color:color-mix(in oklab,var(--color-red-500)80%,transparent)}}.bg-red-600{background-color:var(--color-red-600)}.bg-rose-500\/20{background-color:#ff235733}@supports (color:color-mix(in lab,red,red)){.bg-rose-500\/20{background-color:color-mix(in oklab,var(--color-rose-500)20%,transparent)}}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-yellow-400{background-color:var(--color-yellow-400)}.bg-yellow-400\/10{background-color:#fac8001a}@supports (color:color-mix(in lab,red,red)){.bg-yellow-400\/10{background-color:color-mix(in oklab,var(--color-yellow-400)10%,transparent)}}.bg-yellow-400\/20{background-color:#fac80033}@supports (color:color-mix(in lab,red,red)){.bg-yellow-400\/20{background-color:color-mix(in oklab,var(--color-yellow-400)20%,transparent)}}.bg-yellow-500{background-color:var(--color-yellow-500)}.bg-yellow-500\/5{background-color:#edb2000d}@supports (color:color-mix(in lab,red,red)){.bg-yellow-500\/5{background-color:color-mix(in oklab,var(--color-yellow-500)5%,transparent)}}.bg-yellow-500\/10{background-color:#edb2001a}@supports (color:color-mix(in lab,red,red)){.bg-yellow-500\/10{background-color:color-mix(in oklab,var(--color-yellow-500)10%,transparent)}}.bg-yellow-500\/20{background-color:#edb20033}@supports (color:color-mix(in lab,red,red)){.bg-yellow-500\/20{background-color:color-mix(in oklab,var(--color-yellow-500)20%,transparent)}}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-bambu-green\/10{--tw-gradient-from:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.from-bambu-green\/10{--tw-gradient-from:color-mix(in oklab,var(--color-bambu-green)10%,transparent)}}.from-bambu-green\/10{--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-black\/80{--tw-gradient-from:#000c}@supports (color:color-mix(in lab,red,red)){.from-black\/80{--tw-gradient-from:color-mix(in oklab,var(--color-black)80%,transparent)}}.from-black\/80{--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-blue-500{--tw-gradient-from:var(--color-blue-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-blue-500\/5{--tw-gradient-from:#3080ff0d}@supports (color:color-mix(in lab,red,red)){.from-blue-500\/5{--tw-gradient-from:color-mix(in oklab,var(--color-blue-500)5%,transparent)}}.from-blue-500\/5{--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-blue-500\/10{--tw-gradient-from:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.from-blue-500\/10{--tw-gradient-from:color-mix(in oklab,var(--color-blue-500)10%,transparent)}}.from-blue-500\/10{--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-gray-500\/10{--tw-gradient-from:#6a72821a}@supports (color:color-mix(in lab,red,red)){.from-gray-500\/10{--tw-gradient-from:color-mix(in oklab,var(--color-gray-500)10%,transparent)}}.from-gray-500\/10{--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-yellow-500\/10{--tw-gradient-from:#edb2001a}@supports (color:color-mix(in lab,red,red)){.from-yellow-500\/10{--tw-gradient-from:color-mix(in oklab,var(--color-yellow-500)10%,transparent)}}.from-yellow-500\/10{--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-bambu-dark-secondary{--tw-gradient-to:var(--color-bambu-dark-secondary);--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-blue-400{--tw-gradient-to:var(--color-blue-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-transparent{--tw-gradient-to:transparent;--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-cover{background-size:cover}.bg-center{background-position:50%}.fill-yellow-400{fill:var(--color-yellow-400)}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.object-left{object-position:left}.p-0{padding:calc(var(--spacing)*0)}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-2\.5{padding:calc(var(--spacing)*2.5)}.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-8{padding:calc(var(--spacing)*8)}.p-12{padding:calc(var(--spacing)*12)}.\!px-3{padding-inline:calc(var(--spacing)*3)!important}.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-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.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-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.py-12{padding-block:calc(var(--spacing)*12)}.py-16{padding-block:calc(var(--spacing)*16)}.py-20{padding-block:calc(var(--spacing)*20)}.py-24{padding-block:calc(var(--spacing)*24)}.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-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.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-8{padding-right:calc(var(--spacing)*8)}.pr-10{padding-right:calc(var(--spacing)*10)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pl-4{padding-left:calc(var(--spacing)*4)}.pl-6{padding-left:calc(var(--spacing)*6)}.pl-8{padding-left:calc(var(--spacing)*8)}.pl-10{padding-left:calc(var(--spacing)*10)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.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-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.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))}.text-\[10px\]{font-size:10px}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.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-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-300{color:var(--color-amber-300)}.text-amber-400{color:var(--color-amber-400)}.text-amber-400\/70{color:#fcbb00b3}@supports (color:color-mix(in lab,red,red)){.text-amber-400\/70{color:color-mix(in oklab,var(--color-amber-400)70%,transparent)}}.text-amber-600{color:var(--color-amber-600)}.text-bambu-dark-tertiary{color:var(--color-bambu-dark-tertiary)}.text-bambu-gray{color:var(--color-bambu-gray)}.text-bambu-gray-dark{color:var(--color-bambu-gray-dark)}.text-bambu-gray-light{color:var(--color-bambu-gray-light)}.text-bambu-gray\/30{color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.text-bambu-gray\/30{color:color-mix(in oklab,var(--color-bambu-gray)30%,transparent)}}.text-bambu-gray\/50{color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.text-bambu-gray\/50{color:color-mix(in oklab,var(--color-bambu-gray)50%,transparent)}}.text-bambu-gray\/60{color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.text-bambu-gray\/60{color:color-mix(in oklab,var(--color-bambu-gray)60%,transparent)}}.text-bambu-gray\/70{color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.text-bambu-gray\/70{color:color-mix(in oklab,var(--color-bambu-gray)70%,transparent)}}.text-bambu-gray\/80{color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.text-bambu-gray\/80{color:color-mix(in oklab,var(--color-bambu-gray)80%,transparent)}}.text-bambu-green,.text-bambu-green\/70{color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.text-bambu-green\/70{color:color-mix(in oklab,var(--color-bambu-green)70%,transparent)}}.text-blue-300{color:var(--color-blue-300)}.text-blue-400{color:var(--color-blue-400)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-cyan-300{color:var(--color-cyan-300)}.text-cyan-400{color:var(--color-cyan-400)}.text-emerald-400{color:var(--color-emerald-400)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-900{color:var(--color-gray-900)}.text-green-300{color:var(--color-green-300)}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-indigo-400{color:var(--color-indigo-400)}.text-orange-300{color:var(--color-orange-300)}.text-orange-400{color:var(--color-orange-400)}.text-orange-500{color:var(--color-orange-500)}.text-orange-600{color:var(--color-orange-600)}.text-orange-700{color:var(--color-orange-700)}.text-purple-400{color:var(--color-purple-400)}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-red-400\/70{color:#ff6568b3}@supports (color:color-mix(in lab,red,red)){.text-red-400\/70{color:color-mix(in oklab,var(--color-red-400)70%,transparent)}}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-rose-400{color:var(--color-rose-400)}.text-white{color:var(--color-white)}.text-white\/80{color:#fffc}@supports (color:color-mix(in lab,red,red)){.text-white\/80{color:color-mix(in oklab,var(--color-white)80%,transparent)}}.text-yellow-200{color:var(--color-yellow-200)}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-400\/80{color:#fac800cc}@supports (color:color-mix(in lab,red,red)){.text-yellow-400\/80{color:color-mix(in oklab,var(--color-yellow-400)80%,transparent)}}.text-yellow-500{color:var(--color-yellow-500)}.text-yellow-500\/70{color:#edb200b3}@supports (color:color-mix(in lab,red,red)){.text-yellow-500\/70{color:color-mix(in oklab,var(--color-yellow-500)70%,transparent)}}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.placeholder-bambu-gray::placeholder{color:var(--color-bambu-gray)}.placeholder-bambu-gray-dark::placeholder{color:var(--color-bambu-gray-dark)}.placeholder-bambu-gray\/50::placeholder{color:var(--color-bambu-gray)}@supports (color:color-mix(in lab,red,red)){.placeholder-bambu-gray\/50::placeholder{color:color-mix(in oklab,var(--color-bambu-gray)50%,transparent)}}.accent-bambu-green{accent-color:var(--color-bambu-green)}.opacity-0{opacity:0}.opacity-20{opacity:.2}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-80{opacity:.8}.opacity-\[0\.65\]{opacity:.65}.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-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);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-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px 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)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-bambu-green\/25{--tw-shadow-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.shadow-bambu-green\/25{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-bambu-green)25%,transparent)var(--tw-shadow-alpha),transparent)}}.ring-bambu-green{--tw-ring-color:var(--color-bambu-green)}.ring-white{--tw-ring-color:var(--color-white)}.ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.ring-offset-bambu-dark-secondary{--tw-ring-offset-color:var(--color-bambu-dark-secondary)}.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,)}.invert{--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,)}.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,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-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-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-opacity{transition-property:opacity;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-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}@media(hover:hover){.group-hover\:bg-bambu-green\/20:is(:where(.group):hover *){background-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.group-hover\:bg-bambu-green\/20:is(:where(.group):hover *){background-color:color-mix(in oklab,var(--color-bambu-green)20%,transparent)}}.group-hover\:text-bambu-gray:is(:where(.group):hover *){color:var(--color-bambu-gray)}.group-hover\:text-bambu-green:is(:where(.group):hover *){color:var(--color-bambu-green)}.group-hover\:opacity-50:is(:where(.group):hover *){opacity:.5}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.peer-checked\:bg-bambu-green:is(:where(.peer):checked~*){background-color:var(--color-bambu-green)}.peer-focus\:outline-none:is(:where(.peer):focus~*){--tw-outline-style:none;outline-style:none}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:top-0:before{content:var(--tw-content);top:calc(var(--spacing)*0)}.before\:right-0:before{content:var(--tw-content);right:calc(var(--spacing)*0)}.before\:left-0:before{content:var(--tw-content);left:calc(var(--spacing)*0)}.before\:h-0\.5:before{content:var(--tw-content);height:calc(var(--spacing)*.5)}.before\:bg-bambu-green:before{content:var(--tw-content);background-color:var(--color-bambu-green)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:top-\[2px\]:after{content:var(--tw-content);top:2px}.after\:left-\[2px\]:after{content:var(--tw-content);left:2px}.after\:h-4:after{content:var(--tw-content);height:calc(var(--spacing)*4)}.after\:h-5:after{content:var(--tw-content);height:calc(var(--spacing)*5)}.after\:w-4:after{content:var(--tw-content);width:calc(var(--spacing)*4)}.after\:w-5:after{content:var(--tw-content);width:calc(var(--spacing)*5)}.after\:rounded-full:after{content:var(--tw-content);border-radius:3.40282e38px}.after\:bg-white:after{content:var(--tw-content);background-color:var(--color-white)}.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)}.peer-checked\:after\:translate-x-full:is(:where(.peer):checked~*):after{content:var(--tw-content);--tw-translate-x:100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.peer-checked\:after\:border-white:is(:where(.peer):checked~*):after{content:var(--tw-content);border-color:var(--color-white)}@media(hover:hover){.hover\:border-bambu-dark-tertiary\/80:hover{border-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.hover\:border-bambu-dark-tertiary\/80:hover{border-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)80%,transparent)}}.hover\:border-bambu-gray:hover{border-color:var(--color-bambu-gray)}.hover\:border-bambu-gray-dark:hover{border-color:var(--color-bambu-gray-dark)}.hover\:border-bambu-green:hover,.hover\:border-bambu-green\/50:hover{border-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.hover\:border-bambu-green\/50:hover{border-color:color-mix(in oklab,var(--color-bambu-green)50%,transparent)}}.hover\:border-white\/40:hover{border-color:#fff6}@supports (color:color-mix(in lab,red,red)){.hover\:border-white\/40:hover{border-color:color-mix(in oklab,var(--color-white)40%,transparent)}}.hover\:bg-bambu-dark:hover{background-color:var(--color-bambu-dark)}.hover\:bg-bambu-dark-secondary:hover{background-color:var(--color-bambu-dark-secondary)}.hover\:bg-bambu-dark-tertiary:hover,.hover\:bg-bambu-dark-tertiary\/30:hover{background-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-dark-tertiary\/30:hover{background-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)30%,transparent)}}.hover\:bg-bambu-dark-tertiary\/50:hover{background-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-dark-tertiary\/50:hover{background-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)50%,transparent)}}.hover\:bg-bambu-dark-tertiary\/70:hover{background-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-dark-tertiary\/70:hover{background-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)70%,transparent)}}.hover\:bg-bambu-dark-tertiary\/80:hover{background-color:var(--color-bambu-dark-tertiary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-dark-tertiary\/80:hover{background-color:color-mix(in oklab,var(--color-bambu-dark-tertiary)80%,transparent)}}.hover\:bg-bambu-dark\/50:hover{background-color:var(--color-bambu-dark)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-dark\/50:hover{background-color:color-mix(in oklab,var(--color-bambu-dark)50%,transparent)}}.hover\:bg-bambu-gray-dark:hover{background-color:var(--color-bambu-gray-dark)}.hover\:bg-bambu-green:hover{background-color:var(--color-bambu-green)}.hover\:bg-bambu-green-dark:hover{background-color:var(--color-bambu-green-dark)}.hover\:bg-bambu-green-light:hover{background-color:var(--color-bambu-green-light)}.hover\:bg-bambu-green\/10:hover{background-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-green\/10:hover{background-color:color-mix(in oklab,var(--color-bambu-green)10%,transparent)}}.hover\:bg-bambu-green\/20:hover{background-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-green\/20:hover{background-color:color-mix(in oklab,var(--color-bambu-green)20%,transparent)}}.hover\:bg-bambu-green\/30:hover{background-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-green\/30:hover{background-color:color-mix(in oklab,var(--color-bambu-green)30%,transparent)}}.hover\:bg-bambu-green\/80:hover{background-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-bambu-green\/80:hover{background-color:color-mix(in oklab,var(--color-bambu-green)80%,transparent)}}.hover\:bg-black\/40:hover{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/40:hover{background-color:color-mix(in oklab,var(--color-black)40%,transparent)}}.hover\:bg-black\/70:hover{background-color:#000000b3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/70:hover{background-color:color-mix(in oklab,var(--color-black)70%,transparent)}}.hover\:bg-black\/80:hover{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/80:hover{background-color:color-mix(in oklab,var(--color-black)80%,transparent)}}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.hover\:bg-orange-400\/20:hover{background-color:#ff8b1a33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-orange-400\/20:hover{background-color:color-mix(in oklab,var(--color-orange-400)20%,transparent)}}.hover\:bg-red-400\/10:hover{background-color:#ff65681a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-400\/10:hover{background-color:color-mix(in oklab,var(--color-red-400)10%,transparent)}}.hover\:bg-red-500\/10:hover{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/10:hover{background-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.hover\:bg-red-500\/20:hover{background-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-500\/20:hover{background-color:color-mix(in oklab,var(--color-red-500)20%,transparent)}}.hover\:bg-red-600:hover{background-color:var(--color-red-600)}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:bg-yellow-600:hover{background-color:var(--color-yellow-600)}.hover\:text-bambu-green:hover{color:var(--color-bambu-green)}.hover\:text-bambu-green-light:hover{color:var(--color-bambu-green-light)}.hover\:text-bambu-green\/70:hover{color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.hover\:text-bambu-green\/70:hover{color:color-mix(in oklab,var(--color-bambu-green)70%,transparent)}}.hover\:text-bambu-green\/80:hover{color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.hover\:text-bambu-green\/80:hover{color:color-mix(in oklab,var(--color-bambu-green)80%,transparent)}}.hover\:text-blue-300:hover{color:var(--color-blue-300)}.hover\:text-gray-900:hover{color:var(--color-gray-900)}.hover\:text-orange-300:hover{color:var(--color-orange-300)}.hover\:text-red-300:hover{color:var(--color-red-300)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:text-white:hover{color:var(--color-white)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-70:hover{opacity:.7}.hover\:opacity-80:hover{opacity:.8}.hover\:shadow-lg:hover{--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)}.hover\:shadow-bambu-green\/5:hover{--tw-shadow-color:var(--color-bambu-green)}@supports (color:color-mix(in lab,red,red)){.hover\:shadow-bambu-green\/5:hover{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-bambu-green)5%,transparent)var(--tw-shadow-alpha),transparent)}}}.focus\:border-bambu-green:focus{border-color:var(--color-bambu-green)}.focus\:border-red-500:focus{border-color:var(--color-red-500)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-bambu-gray:focus{--tw-ring-color:var(--color-bambu-gray)}.focus\:ring-bambu-green:focus{--tw-ring-color:var(--color-bambu-green)}.focus\:ring-red-500:focus{--tw-ring-color:var(--color-red-500)}.focus\:ring-offset-0:focus{--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:ring-offset-bambu-dark:focus{--tw-ring-offset-color:var(--color-bambu-dark)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:cursor-grabbing:active{cursor:grabbing}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:40rem){.sm\:inline{display:inline}.sm\:h-4{height:calc(var(--spacing)*4)}.sm\:w-4{width:calc(var(--spacing)*4)}.sm\:w-auto{width:auto}.sm\:max-w-none{max-width:none}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:gap-3{gap:calc(var(--spacing)*3)}.sm\:p-1\.5{padding:calc(var(--spacing)*1.5)}}@media(min-width:48rem){.md\:top-\[2px\]{top:2px}.md\:left-\[2px\]{left:2px}.md\:mx-0{margin-inline:calc(var(--spacing)*0)}.md\:block{display:block}.md\:inline{display:inline}.md\:h-4{height:calc(var(--spacing)*4)}.md\:h-5{height:calc(var(--spacing)*5)}.md\:h-8{height:calc(var(--spacing)*8)}.md\:min-h-0{min-height:calc(var(--spacing)*0)}.md\:w-4{width:calc(var(--spacing)*4)}.md\:w-8{width:calc(var(--spacing)*8)}.md\:w-9{width:calc(var(--spacing)*9)}.md\:min-w-\[200px\]{min-width:200px}.md\:flex-1{flex:1}.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\:flex-row{flex-direction:row}.md\:flex-wrap{flex-wrap:wrap}.md\:items-center{align-items:center}.md\:gap-4{gap:calc(var(--spacing)*4)}.md\:p-8{padding:calc(var(--spacing)*8)}.md\:px-0{padding-inline:calc(var(--spacing)*0)}.md\:py-2{padding-block:calc(var(--spacing)*2)}.md\:pb-0{padding-bottom:calc(var(--spacing)*0)}}@media(min-width:64rem){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:w-80{width:calc(var(--spacing)*80)}.lg\:w-\[480px\]{width:480px}.lg\:max-w-md{max-width:var(--container-md)}.lg\:max-w-sm{max-width:var(--container-sm)}.lg\:max-w-xl{max-width:var(--container-xl)}.lg\:flex-shrink-0{flex-shrink:0}.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\:flex-row{flex-direction:row}.lg\:gap-8{gap:calc(var(--spacing)*8)}.lg\:p-8{padding:calc(var(--spacing)*8)}}@media(min-width:80rem){.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-6{grid-template-columns:repeat(6,minmax(0,1fr))}}.dark\:border-bambu-dark-tertiary:where(.dark,.dark *){border-color:var(--color-bambu-dark-tertiary)}.dark\:bg-bambu-dark-secondary:where(.dark,.dark *){background-color:var(--color-bambu-dark-secondary)}.dark\:text-bambu-gray:where(.dark,.dark *){color:var(--color-bambu-gray)}.dark\:text-blue-200:where(.dark,.dark *){color:var(--color-blue-200)}.dark\:text-blue-200\/80:where(.dark,.dark *){color:#bedbffcc}@supports (color:color-mix(in lab,red,red)){.dark\:text-blue-200\/80:where(.dark,.dark *){color:color-mix(in oklab,var(--color-blue-200)80%,transparent)}}.dark\:text-blue-300:where(.dark,.dark *){color:var(--color-blue-300)}.dark\:text-blue-400:where(.dark,.dark *){color:var(--color-blue-400)}.dark\:text-orange-200:where(.dark,.dark *){color:var(--color-orange-200)}.dark\:text-orange-400:where(.dark,.dark *){color:var(--color-orange-400)}.dark\:text-white:where(.dark,.dark *){color:var(--color-white)}.dark\:text-yellow-200:where(.dark,.dark *){color:var(--color-yellow-200)}.dark\:text-yellow-200\/70:where(.dark,.dark *){color:#fff085b3}@supports (color:color-mix(in lab,red,red)){.dark\:text-yellow-200\/70:where(.dark,.dark *){color:color-mix(in oklab,var(--color-yellow-200)70%,transparent)}}@media(hover:hover){.dark\:hover\:bg-bambu-dark-tertiary:where(.dark,.dark *):hover{background-color:var(--color-bambu-dark-tertiary)}.dark\:hover\:text-white:where(.dark,.dark *):hover{color:var(--color-white)}}.\[\&\:\:-webkit-slider-thumb\]\:h-3::-webkit-slider-thumb{height:calc(var(--spacing)*3)}.\[\&\:\:-webkit-slider-thumb\]\:w-3::-webkit-slider-thumb{width:calc(var(--spacing)*3)}.\[\&\:\:-webkit-slider-thumb\]\:cursor-pointer::-webkit-slider-thumb{cursor:pointer}.\[\&\:\:-webkit-slider-thumb\]\:appearance-none::-webkit-slider-thumb{appearance:none}.\[\&\:\:-webkit-slider-thumb\]\:rounded-full::-webkit-slider-thumb{border-radius:3.40282e38px}.\[\&\:\:-webkit-slider-thumb\]\:bg-bambu-green::-webkit-slider-thumb{background-color:var(--color-bambu-green)}}:root{--accent:#00ae42;--accent-light:#00c64d;--accent-dark:#009438;--bg-primary:#f5f5f5;--bg-secondary:#fff;--bg-tertiary:#e5e5e5;--text-primary:#1a1a1a;--text-secondary:#4a4a4a;--text-muted:#6b6b6b;--text-tertiary:gray;--border-color:#d4d4d4;--card-shadow:0 2px 8px #00000014;--glow-color:transparent;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Inter,system-ui,sans-serif;font-weight:400;line-height:1.5}.dark{--bg-primary:#1a1a1a;--bg-secondary:#2d2d2d;--bg-tertiary:#3d3d3d;--text-primary:#fff;--text-secondary:#a0a0a0;--text-muted:gray;--text-tertiary:#4a4a4a;--border-color:#3d3d3d;--card-shadow:0 4px 16px #0006}.bg-warm{--bg-primary:#faf8f5;--bg-secondary:#fffefa;--bg-tertiary:#e8e4dd;--text-primary:#2d2a26;--text-secondary:#5c5750;--text-muted:#7a756c;--text-tertiary:#9a9590;--border-color:#d8d4cc}.bg-cool{--bg-primary:#f0f4f8;--bg-secondary:#fff;--bg-tertiary:#dce4ec;--text-primary:#1a2530;--text-secondary:#4a5568;--text-muted:#6b7a8a;--text-tertiary:#8a9aaa;--border-color:#c8d4e0}.dark.bg-neutral{--bg-primary:#1a1a1a;--bg-secondary:#2d2d2d;--bg-tertiary:#3d3d3d;--text-primary:#fff;--text-secondary:#a0a0a0;--text-muted:gray;--text-tertiary:#4a4a4a;--border-color:#3d3d3d}.dark.bg-warm{--bg-primary:#1c1a18;--bg-secondary:#2e2a26;--bg-tertiary:#3e3a36;--text-primary:#f5f0ea;--text-secondary:#b0a898;--text-muted:#8a8278;--text-tertiary:#5a5248;--border-color:#3e3a36}.dark.bg-cool{--bg-primary:#181c20;--bg-secondary:#262c32;--bg-tertiary:#363e46;--text-primary:#f0f4f8;--text-secondary:#98a8b8;--text-muted:#788898;--text-tertiary:#4a5a6a;--border-color:#363e46}.dark.bg-oled{--bg-primary:#000;--bg-secondary:#141414;--bg-tertiary:#1f1f1f;--text-primary:#fff;--text-secondary:#a0a0a0;--text-muted:#707070;--text-tertiary:#404040;--border-color:#2a2a2a}.dark.bg-slate{--bg-primary:#0f172a;--bg-secondary:#1e293b;--bg-tertiary:#334155;--text-primary:#f1f5f9;--text-secondary:#94a3b8;--text-muted:#64748b;--text-tertiary:#475569;--border-color:#334155}.dark.bg-forest{--bg-primary:#121a16;--bg-secondary:#1c2a22;--bg-tertiary:#2a3d30;--text-primary:#e8f5ec;--text-secondary:#8aa894;--text-muted:#6a8874;--text-tertiary:#4a6854;--border-color:#2a3d30}.style-glow{--card-shadow:0 2px 8px #00000014,0 0 25px var(--accent)}@supports (color:color-mix(in lab,red,red)){.style-glow{--card-shadow:0 2px 8px #00000014,0 0 25px color-mix(in srgb,var(--accent)12%,transparent)}}.dark.style-glow{--card-shadow:0 4px 20px #00000080,0 0 40px var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark.style-glow{--card-shadow:0 4px 20px #00000080,0 0 40px color-mix(in srgb,var(--accent)15%,transparent)}}.style-vibrant{--card-shadow:0 8px 30px #00000026,0 2px 8px #0000001a}.dark.style-vibrant{--card-shadow:0 10px 40px #0009,0 4px 12px #0006}.accent-green{--accent:#00ae42;--accent-light:#00c64d;--accent-dark:#009438}.accent-teal{--accent:#14b8a6;--accent-light:#2dd4bf;--accent-dark:#0d9488}.accent-blue{--accent:#3b82f6;--accent-light:#60a5fa;--accent-dark:#2563eb}.accent-orange{--accent:#f97316;--accent-light:#fb923c;--accent-dark:#ea580c}.accent-purple{--accent:#8b5cf6;--accent-light:#a78bfa;--accent-dark:#7c3aed}.accent-red{--accent:#ef4444;--accent-light:#f87171;--accent-dark:#dc2626}body{background-color:var(--bg-primary);color:var(--text-primary);min-height:100vh;margin:0;transition:background-color .2s,color .2s}#root{min-height:100vh}.text-white{color:var(--text-primary)}.bg-bambu-dark,.bg-bambu-dark-secondary,.bg-bambu-dark-tertiary,.border-bambu-dark-tertiary{transition:background-color .2s,border-color .2s}@keyframes slide-in{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}.animate-slide-in{animation:.2s ease-out slide-in}.icon-theme{opacity:.5}.dark .icon-theme{filter:invert();opacity:.4}.icon-green{filter:invert(48%)sepia(89%)saturate(459%)hue-rotate(93deg)brightness(95%)contrast(92%);opacity:1}.icon-heating{filter:invert(50%)sepia()saturate(1000%)hue-rotate(360deg)brightness()contrast();opacity:1}.dark .jogpad-theme{filter:brightness(.35)contrast(1.2)}.ams-empty-slot{background:repeating-linear-gradient(45deg,#444,#444 2px,#222 2px 4px)}.dark .ams-empty-slot{background:repeating-linear-gradient(45deg,#555,#555 2px,#333 2px 4px)}.touch-manipulation{touch-action:manipulation}.safe-area-bottom{padding-bottom:env(safe-area-inset-bottom,0)}.safe-area-top{padding-top:env(safe-area-inset-top,0)}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}.scrollbar-hide::-webkit-scrollbar{display:none}@keyframes slide-in-left{0%{transform:translate(-100%)}to{transform:translate(0)}}.animate-slide-in-left{animation:.3s ease-out slide-in-left}.card-shadow{box-shadow:var(--card-shadow)}@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-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@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-divide-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-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{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-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@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-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--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-divide-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-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction: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-content:""}}} diff --git a/static/assets/index-DNsmdSrp.js b/static/assets/index-CA7HMY_J.js similarity index 64% rename from static/assets/index-DNsmdSrp.js rename to static/assets/index-CA7HMY_J.js index e602b2d83..5b870cf76 100644 --- a/static/assets/index-DNsmdSrp.js +++ b/static/assets/index-CA7HMY_J.js @@ -1,20 +1,20 @@ -function Hre(t,e){for(var n=0;nr[i]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const a of i)if(a.type==="childList")for(const s of a.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&r(s)}).observe(document,{childList:!0,subtree:!0});function n(i){const a={};return i.integrity&&(a.integrity=i.integrity),i.referrerPolicy&&(a.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?a.credentials="include":i.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function r(i){if(i.ep)return;i.ep=!0;const a=n(i);fetch(i.href,a)}})();var _v=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function bo(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var PA={exports:{}},hx={};var bF;function $re(){if(bF)return hx;bF=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.fragment");function n(r,i,a){var s=null;if(a!==void 0&&(s=""+a),i.key!==void 0&&(s=""+i.key),"key"in i){a={};for(var l in i)l!=="key"&&(a[l]=i[l])}else a=i;return i=a.ref,{$$typeof:t,type:r,key:s,ref:i!==void 0?i:null,props:a}}return hx.Fragment=e,hx.jsx=n,hx.jsxs=n,hx}var yF;function Vre(){return yF||(yF=1,PA.exports=$re()),PA.exports}var o=Vre(),jA={exports:{}},tn={};var vF;function Gre(){if(vF)return tn;vF=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.portal"),n=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),a=Symbol.for("react.consumer"),s=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),c=Symbol.for("react.suspense"),u=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),f=Symbol.for("react.activity"),g=Symbol.iterator;function p(B){return B===null||typeof B!="object"?null:(B=g&&B[g]||B["@@iterator"],typeof B=="function"?B:null)}var x={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},v=Object.assign,y={};function b(B,$,Q){this.props=B,this.context=$,this.refs=y,this.updater=Q||x}b.prototype.isReactComponent={},b.prototype.setState=function(B,$){if(typeof B!="object"&&typeof B!="function"&&B!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,B,$,"setState")},b.prototype.forceUpdate=function(B){this.updater.enqueueForceUpdate(this,B,"forceUpdate")};function E(){}E.prototype=b.prototype;function w(B,$,Q){this.props=B,this.context=$,this.refs=y,this.updater=Q||x}var A=w.prototype=new E;A.constructor=w,v(A,b.prototype),A.isPureReactComponent=!0;var T=Array.isArray;function C(){}var N={H:null,A:null,T:null,S:null},F=Object.prototype.hasOwnProperty;function k(B,$,Q){var te=Q.ref;return{$$typeof:t,type:B,key:$,ref:te!==void 0?te:null,props:Q}}function R(B,$){return k(B.type,$,B.props)}function I(B){return typeof B=="object"&&B!==null&&B.$$typeof===t}function L(B){var $={"=":"=0",":":"=2"};return"$"+B.replace(/[=:]/g,function(Q){return $[Q]})}var q=/\/+/g;function j(B,$){return typeof B=="object"&&B!==null&&B.key!=null?L(""+B.key):$.toString(36)}function V(B){switch(B.status){case"fulfilled":return B.value;case"rejected":throw B.reason;default:switch(typeof B.status=="string"?B.then(C,C):(B.status="pending",B.then(function($){B.status==="pending"&&(B.status="fulfilled",B.value=$)},function($){B.status==="pending"&&(B.status="rejected",B.reason=$)})),B.status){case"fulfilled":return B.value;case"rejected":throw B.reason}}throw B}function K(B,$,Q,te,he){var ue=typeof B;(ue==="undefined"||ue==="boolean")&&(B=null);var ge=!1;if(B===null)ge=!0;else switch(ue){case"bigint":case"string":case"number":ge=!0;break;case"object":switch(B.$$typeof){case t:case e:ge=!0;break;case d:return ge=B._init,K(ge(B._payload),$,Q,te,he)}}if(ge)return he=he(B),ge=te===""?"."+j(B,0):te,T(he)?(Q="",ge!=null&&(Q=ge.replace(q,"$&/")+"/"),K(he,$,Q,"",function(ce){return ce})):he!=null&&(I(he)&&(he=R(he,Q+(he.key==null||B&&B.key===he.key?"":(""+he.key).replace(q,"$&/")+"/")+ge)),$.push(he)),1;ge=0;var Ae=te===""?".":te+":";if(T(B))for(var pe=0;pe>>1,Z=K[ee];if(0>>1;eei(Q,J))tei(he,Q)?(K[ee]=he,K[te]=J,ee=te):(K[ee]=Q,K[$]=J,ee=$);else if(tei(he,J))K[ee]=he,K[te]=J,ee=te;else break e}}return W}function i(K,W){var J=K.sortIndex-W.sortIndex;return J!==0?J:K.id-W.id}if(t.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var a=performance;t.unstable_now=function(){return a.now()}}else{var s=Date,l=s.now();t.unstable_now=function(){return s.now()-l}}var c=[],u=[],d=1,f=null,g=3,p=!1,x=!1,v=!1,y=!1,b=typeof setTimeout=="function"?setTimeout:null,E=typeof clearTimeout=="function"?clearTimeout:null,w=typeof setImmediate<"u"?setImmediate:null;function A(K){for(var W=n(u);W!==null;){if(W.callback===null)r(u);else if(W.startTime<=K)r(u),W.sortIndex=W.expirationTime,e(c,W);else break;W=n(u)}}function T(K){if(v=!1,A(K),!x)if(n(c)!==null)x=!0,C||(C=!0,L());else{var W=n(u);W!==null&&V(T,W.startTime-K)}}var C=!1,N=-1,F=5,k=-1;function R(){return y?!0:!(t.unstable_now()-kK&&R());){var ee=f.callback;if(typeof ee=="function"){f.callback=null,g=f.priorityLevel;var Z=ee(f.expirationTime<=K);if(K=t.unstable_now(),typeof Z=="function"){f.callback=Z,A(K),W=!0;break t}f===n(c)&&r(c),A(K)}else r(c);f=n(c)}if(f!==null)W=!0;else{var B=n(u);B!==null&&V(T,B.startTime-K),W=!1}}break e}finally{f=null,g=J,p=!1}W=void 0}}finally{W?L():C=!1}}}var L;if(typeof w=="function")L=function(){w(I)};else if(typeof MessageChannel<"u"){var q=new MessageChannel,j=q.port2;q.port1.onmessage=I,L=function(){j.postMessage(null)}}else L=function(){b(I,0)};function V(K,W){N=b(function(){K(t.unstable_now())},W)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(K){K.callback=null},t.unstable_forceFrameRate=function(K){0>K||125ee?(K.sortIndex=J,e(u,K),n(c)===null&&K===n(u)&&(v?(E(N),N=-1):v=!0,V(T,J-ee))):(K.sortIndex=Z,e(c,K),x||p||(x=!0,C||(C=!0,L()))),K},t.unstable_shouldYield=R,t.unstable_wrapCallback=function(K){var W=g;return function(){var J=g;g=W;try{return K.apply(this,arguments)}finally{g=J}}}})(OA)),OA}var SF;function Kre(){return SF||(SF=1,DA.exports=qre()),DA.exports}var LA={exports:{}},ca={};var MF;function Xre(){if(MF)return ca;MF=1;var t=Qp();function e(c){var u="https://react.dev/errors/"+c;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),LA.exports=Xre(),LA.exports}var AF;function Yre(){if(AF)return fx;AF=1;var t=Kre(),e=Qp(),n=U9();function r(h){var m="https://react.dev/errors/"+h;if(1Z||(h.current=ee[Z],ee[Z]=null,Z--)}function Q(h,m){Z++,ee[Z]=h.current,h.current=m}var te=B(null),he=B(null),ue=B(null),ge=B(null);function Ae(h,m){switch(Q(ue,m),Q(he,h),Q(te,null),m.nodeType){case 9:case 11:h=(h=m.documentElement)&&(h=h.namespaceURI)?B5(h):0;break;default:if(h=m.tagName,m=m.namespaceURI)m=B5(m),h=H5(m,h);else switch(h){case"svg":h=1;break;case"math":h=2;break;default:h=0}}$(te),Q(te,h)}function pe(){$(te),$(he),$(ue)}function ce(h){h.memoizedState!==null&&Q(ge,h);var m=te.current,_=H5(m,h.type);m!==_&&(Q(he,h),Q(te,_))}function Pe(h){he.current===h&&($(te),$(he)),ge.current===h&&($(ge),lx._currentValue=J)}var se,Oe;function z(h){if(se===void 0)try{throw Error()}catch(_){var m=_.stack.trim().match(/\n( *(at )?)/);se=m&&m[1]||"",Oe=-1<_.stack.indexOf(` +function Zre(t,e){for(var n=0;nr[i]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const a of i)if(a.type==="childList")for(const s of a.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&r(s)}).observe(document,{childList:!0,subtree:!0});function n(i){const a={};return i.integrity&&(a.integrity=i.integrity),i.referrerPolicy&&(a.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?a.credentials="include":i.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function r(i){if(i.ep)return;i.ep=!0;const a=n(i);fetch(i.href,a)}})();var wv=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function bo(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var jT={exports:{}},fx={};var SF;function Qre(){if(SF)return fx;SF=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.fragment");function n(r,i,a){var s=null;if(a!==void 0&&(s=""+a),i.key!==void 0&&(s=""+i.key),"key"in i){a={};for(var l in i)l!=="key"&&(a[l]=i[l])}else a=i;return i=a.ref,{$$typeof:t,type:r,key:s,ref:i!==void 0?i:null,props:a}}return fx.Fragment=e,fx.jsx=n,fx.jsxs=n,fx}var MF;function Jre(){return MF||(MF=1,jT.exports=Qre()),jT.exports}var o=Jre(),RT={exports:{}},tn={};var EF;function eie(){if(EF)return tn;EF=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.portal"),n=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),a=Symbol.for("react.consumer"),s=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),c=Symbol.for("react.suspense"),u=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),f=Symbol.for("react.activity"),g=Symbol.iterator;function p(B){return B===null||typeof B!="object"?null:(B=g&&B[g]||B["@@iterator"],typeof B=="function"?B:null)}var x={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},v=Object.assign,y={};function b(B,G,Q){this.props=B,this.context=G,this.refs=y,this.updater=Q||x}b.prototype.isReactComponent={},b.prototype.setState=function(B,G){if(typeof B!="object"&&typeof B!="function"&&B!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,B,G,"setState")},b.prototype.forceUpdate=function(B){this.updater.enqueueForceUpdate(this,B,"forceUpdate")};function E(){}E.prototype=b.prototype;function w(B,G,Q){this.props=B,this.context=G,this.refs=y,this.updater=Q||x}var T=w.prototype=new E;T.constructor=w,v(T,b.prototype),T.isPureReactComponent=!0;var A=Array.isArray;function C(){}var N={H:null,A:null,T:null,S:null},F=Object.prototype.hasOwnProperty;function k(B,G,Q){var te=Q.ref;return{$$typeof:t,type:B,key:G,ref:te!==void 0?te:null,props:Q}}function R(B,G){return k(B.type,G,B.props)}function I(B){return typeof B=="object"&&B!==null&&B.$$typeof===t}function L(B){var G={"=":"=0",":":"=2"};return"$"+B.replace(/[=:]/g,function(Q){return G[Q]})}var q=/\/+/g;function j(B,G){return typeof B=="object"&&B!==null&&B.key!=null?L(""+B.key):G.toString(36)}function V(B){switch(B.status){case"fulfilled":return B.value;case"rejected":throw B.reason;default:switch(typeof B.status=="string"?B.then(C,C):(B.status="pending",B.then(function(G){B.status==="pending"&&(B.status="fulfilled",B.value=G)},function(G){B.status==="pending"&&(B.status="rejected",B.reason=G)})),B.status){case"fulfilled":return B.value;case"rejected":throw B.reason}}throw B}function K(B,G,Q,te,he){var oe=typeof B;(oe==="undefined"||oe==="boolean")&&(B=null);var xe=!1;if(B===null)xe=!0;else switch(oe){case"bigint":case"string":case"number":xe=!0;break;case"object":switch(B.$$typeof){case t:case e:xe=!0;break;case d:return xe=B._init,K(xe(B._payload),G,Q,te,he)}}if(xe)return he=he(B),xe=te===""?"."+j(B,0):te,A(he)?(Q="",xe!=null&&(Q=xe.replace(q,"$&/")+"/"),K(he,G,Q,"",function(ce){return ce})):he!=null&&(I(he)&&(he=R(he,Q+(he.key==null||B&&B.key===he.key?"":(""+he.key).replace(q,"$&/")+"/")+xe)),G.push(he)),1;xe=0;var Te=te===""?".":te+":";if(A(B))for(var me=0;me>>1,Z=K[ee];if(0>>1;eei(Q,J))tei(he,Q)?(K[ee]=he,K[te]=J,ee=te):(K[ee]=Q,K[G]=J,ee=G);else if(tei(he,J))K[ee]=he,K[te]=J,ee=te;else break e}}return W}function i(K,W){var J=K.sortIndex-W.sortIndex;return J!==0?J:K.id-W.id}if(t.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var a=performance;t.unstable_now=function(){return a.now()}}else{var s=Date,l=s.now();t.unstable_now=function(){return s.now()-l}}var c=[],u=[],d=1,f=null,g=3,p=!1,x=!1,v=!1,y=!1,b=typeof setTimeout=="function"?setTimeout:null,E=typeof clearTimeout=="function"?clearTimeout:null,w=typeof setImmediate<"u"?setImmediate:null;function T(K){for(var W=n(u);W!==null;){if(W.callback===null)r(u);else if(W.startTime<=K)r(u),W.sortIndex=W.expirationTime,e(c,W);else break;W=n(u)}}function A(K){if(v=!1,T(K),!x)if(n(c)!==null)x=!0,C||(C=!0,L());else{var W=n(u);W!==null&&V(A,W.startTime-K)}}var C=!1,N=-1,F=5,k=-1;function R(){return y?!0:!(t.unstable_now()-kK&&R());){var ee=f.callback;if(typeof ee=="function"){f.callback=null,g=f.priorityLevel;var Z=ee(f.expirationTime<=K);if(K=t.unstable_now(),typeof Z=="function"){f.callback=Z,T(K),W=!0;break t}f===n(c)&&r(c),T(K)}else r(c);f=n(c)}if(f!==null)W=!0;else{var B=n(u);B!==null&&V(A,B.startTime-K),W=!1}}break e}finally{f=null,g=J,p=!1}W=void 0}}finally{W?L():C=!1}}}var L;if(typeof w=="function")L=function(){w(I)};else if(typeof MessageChannel<"u"){var q=new MessageChannel,j=q.port2;q.port1.onmessage=I,L=function(){j.postMessage(null)}}else L=function(){b(I,0)};function V(K,W){N=b(function(){K(t.unstable_now())},W)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(K){K.callback=null},t.unstable_forceFrameRate=function(K){0>K||125ee?(K.sortIndex=J,e(u,K),n(c)===null&&K===n(u)&&(v?(E(N),N=-1):v=!0,V(A,J-ee))):(K.sortIndex=Z,e(c,K),x||p||(x=!0,C||(C=!0,L()))),K},t.unstable_shouldYield=R,t.unstable_wrapCallback=function(K){var W=g;return function(){var J=g;g=W;try{return K.apply(this,arguments)}finally{g=J}}}})(LT)),LT}var NF;function rie(){return NF||(NF=1,OT.exports=nie()),OT.exports}var IT={exports:{}},ca={};var CF;function iie(){if(CF)return ca;CF=1;var t=Jp();function e(c){var u="https://react.dev/errors/"+c;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),IT.exports=iie(),IT.exports}var PF;function aie(){if(PF)return mx;PF=1;var t=rie(),e=Jp(),n=X9();function r(h){var m="https://react.dev/errors/"+h;if(1Z||(h.current=ee[Z],ee[Z]=null,Z--)}function Q(h,m){Z++,ee[Z]=h.current,h.current=m}var te=B(null),he=B(null),oe=B(null),xe=B(null);function Te(h,m){switch(Q(oe,m),Q(he,h),Q(te,null),m.nodeType){case 9:case 11:h=(h=m.documentElement)&&(h=h.namespaceURI)?W5(h):0;break;default:if(h=m.tagName,m=m.namespaceURI)m=W5(m),h=q5(m,h);else switch(h){case"svg":h=1;break;case"math":h=2;break;default:h=0}}G(te),Q(te,h)}function me(){G(te),G(he),G(oe)}function ce(h){h.memoizedState!==null&&Q(xe,h);var m=te.current,_=q5(m,h.type);m!==_&&(Q(he,h),Q(te,_))}function Ce(h){he.current===h&&(G(te),G(he)),xe.current===h&&(G(xe),cx._currentValue=J)}var fe,Ie;function z(h){if(fe===void 0)try{throw Error()}catch(_){var m=_.stack.trim().match(/\n( *(at )?)/);fe=m&&m[1]||"",Ie=-1<_.stack.indexOf(` at`)?" ()":-1<_.stack.indexOf("@")?"@unknown:0:0":""}return` -`+se+h+Oe}var H=!1;function re(h,m){if(!h||H)return"";H=!0;var _=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var S={DetermineComponentFrameRoot:function(){try{if(m){var ft=function(){throw Error()};if(Object.defineProperty(ft.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(ft,[])}catch(st){var tt=st}Reflect.construct(h,[],ft)}else{try{ft.call()}catch(st){tt=st}h.call(ft.prototype)}}else{try{throw Error()}catch(st){tt=st}(ft=h())&&typeof ft.catch=="function"&&ft.catch(function(){})}}catch(st){if(st&&tt&&typeof st.stack=="string")return[st.stack,tt.stack]}return[null,null]}};S.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var P=Object.getOwnPropertyDescriptor(S.DetermineComponentFrameRoot,"name");P&&P.configurable&&Object.defineProperty(S.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var D=S.DetermineComponentFrameRoot(),X=D[0],le=D[1];if(X&&le){var Ne=X.split(` -`),Qe=le.split(` -`);for(P=S=0;SP||Ne[S]!==Qe[P]){var ct=` -`+Ne[S].replace(" at new "," at ");return h.displayName&&ct.includes("")&&(ct=ct.replace("",h.displayName)),ct}while(1<=S&&0<=P);break}}}finally{H=!1,Error.prepareStackTrace=_}return(_=h?h.displayName||h.name:"")?z(_):""}function G(h,m){switch(h.tag){case 26:case 27:case 5:return z(h.type);case 16:return z("Lazy");case 13:return h.child!==m&&m!==null?z("Suspense Fallback"):z("Suspense");case 19:return z("SuspenseList");case 0:case 15:return re(h.type,!1);case 11:return re(h.type.render,!1);case 1:return re(h.type,!0);case 31:return z("Activity");default:return""}}function Y(h){try{var m="",_=null;do m+=G(h,_),_=h,h=h.return;while(h);return m}catch(S){return` +`+fe+h+Ie}var H=!1;function re(h,m){if(!h||H)return"";H=!0;var _=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var S={DetermineComponentFrameRoot:function(){try{if(m){var ft=function(){throw Error()};if(Object.defineProperty(ft.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(ft,[])}catch(st){var tt=st}Reflect.construct(h,[],ft)}else{try{ft.call()}catch(st){tt=st}h.call(ft.prototype)}}else{try{throw Error()}catch(st){tt=st}(ft=h())&&typeof ft.catch=="function"&&ft.catch(function(){})}}catch(st){if(st&&tt&&typeof st.stack=="string")return[st.stack,tt.stack]}return[null,null]}};S.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var P=Object.getOwnPropertyDescriptor(S.DetermineComponentFrameRoot,"name");P&&P.configurable&&Object.defineProperty(S.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var D=S.DetermineComponentFrameRoot(),X=D[0],le=D[1];if(X&&le){var Ne=X.split(` +`),Je=le.split(` +`);for(P=S=0;SP||Ne[S]!==Je[P]){var ut=` +`+Ne[S].replace(" at new "," at ");return h.displayName&&ut.includes("")&&(ut=ut.replace("",h.displayName)),ut}while(1<=S&&0<=P);break}}}finally{H=!1,Error.prepareStackTrace=_}return(_=h?h.displayName||h.name:"")?z(_):""}function $(h,m){switch(h.tag){case 26:case 27:case 5:return z(h.type);case 16:return z("Lazy");case 13:return h.child!==m&&m!==null?z("Suspense Fallback"):z("Suspense");case 19:return z("SuspenseList");case 0:case 15:return re(h.type,!1);case 11:return re(h.type.render,!1);case 1:return re(h.type,!0);case 31:return z("Activity");default:return""}}function Y(h){try{var m="",_=null;do m+=$(h,_),_=h,h=h.return;while(h);return m}catch(S){return` Error generating stack: `+S.message+` -`+S.stack}}var oe=Object.prototype.hasOwnProperty,be=t.unstable_scheduleCallback,Ee=t.unstable_cancelCallback,Me=t.unstable_shouldYield,U=t.unstable_requestPaint,O=t.unstable_now,ne=t.unstable_getCurrentPriorityLevel,_e=t.unstable_ImmediatePriority,ve=t.unstable_UserBlockingPriority,ye=t.unstable_NormalPriority,Ke=t.unstable_LowPriority,Ve=t.unstable_IdlePriority,Je=t.log,ut=t.unstable_setDisableYieldValue,de=null,ae=null;function Be(h){if(typeof Je=="function"&&ut(h),ae&&typeof ae.setStrictMode=="function")try{ae.setStrictMode(de,h)}catch{}}var Ue=Math.clz32?Math.clz32:fe,et=Math.log,dt=Math.LN2;function fe(h){return h>>>=0,h===0?32:31-(et(h)/dt|0)|0}var nt=256,xe=262144,He=4194304;function je(h){var m=h&42;if(m!==0)return m;switch(h&-h){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return h&261888;case 262144:case 524288:case 1048576:case 2097152:return h&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return h&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return h}}function we(h,m,_){var S=h.pendingLanes;if(S===0)return 0;var P=0,D=h.suspendedLanes,X=h.pingedLanes;h=h.warmLanes;var le=S&134217727;return le!==0?(S=le&~D,S!==0?P=je(S):(X&=le,X!==0?P=je(X):_||(_=le&~h,_!==0&&(P=je(_))))):(le=S&~D,le!==0?P=je(le):X!==0?P=je(X):_||(_=S&~h,_!==0&&(P=je(_)))),P===0?0:m!==0&&m!==P&&(m&D)===0&&(D=P&-P,_=m&-m,D>=_||D===32&&(_&4194048)!==0)?m:P}function Xe(h,m){return(h.pendingLanes&~(h.suspendedLanes&~h.pingedLanes)&m)===0}function ot(h,m){switch(h){case 1:case 2:case 4:case 8:case 64:return m+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return m+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function St(){var h=He;return He<<=1,(He&62914560)===0&&(He=4194304),h}function Dt(h){for(var m=[],_=0;31>_;_++)m.push(h);return m}function qt(h,m){h.pendingLanes|=m,m!==268435456&&(h.suspendedLanes=0,h.pingedLanes=0,h.warmLanes=0)}function Ft(h,m,_,S,P,D){var X=h.pendingLanes;h.pendingLanes=_,h.suspendedLanes=0,h.pingedLanes=0,h.warmLanes=0,h.expiredLanes&=_,h.entangledLanes&=_,h.errorRecoveryDisabledLanes&=_,h.shellSuspendCounter=0;var le=h.entanglements,Ne=h.expirationTimes,Qe=h.hiddenUpdates;for(_=X&~_;0<_;){var ct=31-Ue(_),ft=1<"u")return null;try{return h.activeElement||h.body}catch{return h.body}}var Wr=/[\n"\\]/g;function Fn(h){return h.replace(Wr,function(m){return"\\"+m.charCodeAt(0).toString(16)+" "})}function vo(h,m,_,S,P,D,X,le){h.name="",X!=null&&typeof X!="function"&&typeof X!="symbol"&&typeof X!="boolean"?h.type=X:h.removeAttribute("type"),m!=null?X==="number"?(m===0&&h.value===""||h.value!=m)&&(h.value=""+pn(m)):h.value!==""+pn(m)&&(h.value=""+pn(m)):X!=="submit"&&X!=="reset"||h.removeAttribute("value"),m!=null?ki(h,X,pn(m)):_!=null?ki(h,X,pn(_)):S!=null&&h.removeAttribute("value"),P==null&&D!=null&&(h.defaultChecked=!!D),P!=null&&(h.checked=P&&typeof P!="function"&&typeof P!="symbol"),le!=null&&typeof le!="function"&&typeof le!="symbol"&&typeof le!="boolean"?h.name=""+pn(le):h.removeAttribute("name")}function zn(h,m,_,S,P,D,X,le){if(D!=null&&typeof D!="function"&&typeof D!="symbol"&&typeof D!="boolean"&&(h.type=D),m!=null||_!=null){if(!(D!=="submit"&&D!=="reset"||m!=null)){en(h);return}_=_!=null?""+pn(_):"",m=m!=null?""+pn(m):_,le||m===h.value||(h.value=m),h.defaultValue=m}S=S??P,S=typeof S!="function"&&typeof S!="symbol"&&!!S,h.checked=le?h.checked:!!S,h.defaultChecked=!!S,X!=null&&typeof X!="function"&&typeof X!="symbol"&&typeof X!="boolean"&&(h.name=X),en(h)}function ki(h,m,_){m==="number"&&Ir(h.ownerDocument)===h||h.defaultValue===""+_||(h.defaultValue=""+_)}function mi(h,m,_,S){if(h=h.options,m){m={};for(var P=0;P<_.length;P++)m["$"+_[P]]=!0;for(_=0;_"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),PE=!1;if(Il)try{var Ag={};Object.defineProperty(Ag,"passive",{get:function(){PE=!0}}),window.addEventListener("test",Ag,Ag),window.removeEventListener("test",Ag,Ag)}catch{PE=!1}var tu=null,jE=null,fy=null;function HL(){if(fy)return fy;var h,m=jE,_=m.length,S,P="value"in tu?tu.value:tu.textContent,D=P.length;for(h=0;h<_&&m[h]===P[h];h++);var X=_-h;for(S=1;S<=X&&m[_-S]===P[D-S];S++);return fy=P.slice(h,1=Cg),KL=" ",XL=!1;function YL(h,m){switch(h){case"keyup":return une.indexOf(m.keyCode)!==-1;case"keydown":return m.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function ZL(h){return h=h.detail,typeof h=="object"&&"data"in h?h.data:null}var Nf=!1;function hne(h,m){switch(h){case"compositionend":return ZL(m);case"keypress":return m.which!==32?null:(XL=!0,KL);case"textInput":return h=m.data,h===KL&&XL?null:h;default:return null}}function fne(h,m){if(Nf)return h==="compositionend"||!IE&&YL(h,m)?(h=HL(),fy=jE=tu=null,Nf=!1,h):null;switch(h){case"paste":return null;case"keypress":if(!(m.ctrlKey||m.altKey||m.metaKey)||m.ctrlKey&&m.altKey){if(m.char&&1=m)return{node:_,offset:m-h};h=S}e:{for(;_;){if(_.nextSibling){_=_.nextSibling;break e}_=_.parentNode}_=void 0}_=a4(_)}}function o4(h,m){return h&&m?h===m?!0:h&&h.nodeType===3?!1:m&&m.nodeType===3?o4(h,m.parentNode):"contains"in h?h.contains(m):h.compareDocumentPosition?!!(h.compareDocumentPosition(m)&16):!1:!1}function l4(h){h=h!=null&&h.ownerDocument!=null&&h.ownerDocument.defaultView!=null?h.ownerDocument.defaultView:window;for(var m=Ir(h.document);m instanceof h.HTMLIFrameElement;){try{var _=typeof m.contentWindow.location.href=="string"}catch{_=!1}if(_)h=m.contentWindow;else break;m=Ir(h.document)}return m}function zE(h){var m=h&&h.nodeName&&h.nodeName.toLowerCase();return m&&(m==="input"&&(h.type==="text"||h.type==="search"||h.type==="tel"||h.type==="url"||h.type==="password")||m==="textarea"||h.contentEditable==="true")}var _ne=Il&&"documentMode"in document&&11>=document.documentMode,Cf=null,BE=null,Rg=null,HE=!1;function c4(h,m,_){var S=_.window===_?_.document:_.nodeType===9?_:_.ownerDocument;HE||Cf==null||Cf!==Ir(S)||(S=Cf,"selectionStart"in S&&zE(S)?S={start:S.selectionStart,end:S.selectionEnd}:(S=(S.ownerDocument&&S.ownerDocument.defaultView||window).getSelection(),S={anchorNode:S.anchorNode,anchorOffset:S.anchorOffset,focusNode:S.focusNode,focusOffset:S.focusOffset}),Rg&&jg(Rg,S)||(Rg=S,S=sv(BE,"onSelect"),0>=X,P-=X,Xo=1<<32-Ue(m)+P|_<sn?(Sn=It,It=null):Sn=It.sibling;var jn=tt($e,It,Ze[sn],ht);if(jn===null){It===null&&(It=Sn);break}h&&It&&jn.alternate===null&&m($e,It),Re=D(jn,Re,sn),Pn===null?Bt=jn:Pn.sibling=jn,Pn=jn,It=Sn}if(sn===Ze.length)return _($e,It),An&&Ul($e,sn),Bt;if(It===null){for(;snsn?(Sn=It,It=null):Sn=It.sibling;var Su=tt($e,It,jn.value,ht);if(Su===null){It===null&&(It=Sn);break}h&&It&&Su.alternate===null&&m($e,It),Re=D(Su,Re,sn),Pn===null?Bt=Su:Pn.sibling=Su,Pn=Su,It=Sn}if(jn.done)return _($e,It),An&&Ul($e,sn),Bt;if(It===null){for(;!jn.done;sn++,jn=Ze.next())jn=ft($e,jn.value,ht),jn!==null&&(Re=D(jn,Re,sn),Pn===null?Bt=jn:Pn.sibling=jn,Pn=jn);return An&&Ul($e,sn),Bt}for(It=S(It);!jn.done;sn++,jn=Ze.next())jn=st(It,$e,sn,jn.value,ht),jn!==null&&(h&&jn.alternate!==null&&It.delete(jn.key===null?sn:jn.key),Re=D(jn,Re,sn),Pn===null?Bt=jn:Pn.sibling=jn,Pn=jn);return h&&It.forEach(function(Bre){return m($e,Bre)}),An&&Ul($e,sn),Bt}function Yn($e,Re,Ze,ht){if(typeof Ze=="object"&&Ze!==null&&Ze.type===v&&Ze.key===null&&(Ze=Ze.props.children),typeof Ze=="object"&&Ze!==null){switch(Ze.$$typeof){case p:e:{for(var Bt=Ze.key;Re!==null;){if(Re.key===Bt){if(Bt=Ze.type,Bt===v){if(Re.tag===7){_($e,Re.sibling),ht=P(Re,Ze.props.children),ht.return=$e,$e=ht;break e}}else if(Re.elementType===Bt||typeof Bt=="object"&&Bt!==null&&Bt.$$typeof===F&&Gd(Bt)===Re.type){_($e,Re.sibling),ht=P(Re,Ze.props),Ug(ht,Ze),ht.return=$e,$e=ht;break e}_($e,Re);break}else m($e,Re);Re=Re.sibling}Ze.type===v?(ht=zd(Ze.props.children,$e.mode,ht,Ze.key),ht.return=$e,$e=ht):(ht=Sy(Ze.type,Ze.key,Ze.props,null,$e.mode,ht),Ug(ht,Ze),ht.return=$e,$e=ht)}return X($e);case x:e:{for(Bt=Ze.key;Re!==null;){if(Re.key===Bt)if(Re.tag===4&&Re.stateNode.containerInfo===Ze.containerInfo&&Re.stateNode.implementation===Ze.implementation){_($e,Re.sibling),ht=P(Re,Ze.children||[]),ht.return=$e,$e=ht;break e}else{_($e,Re);break}else m($e,Re);Re=Re.sibling}ht=XE(Ze,$e.mode,ht),ht.return=$e,$e=ht}return X($e);case F:return Ze=Gd(Ze),Yn($e,Re,Ze,ht)}if(V(Ze))return Ot($e,Re,Ze,ht);if(L(Ze)){if(Bt=L(Ze),typeof Bt!="function")throw Error(r(150));return Ze=Bt.call(Ze),Wt($e,Re,Ze,ht)}if(typeof Ze.then=="function")return Yn($e,Re,ky(Ze),ht);if(Ze.$$typeof===w)return Yn($e,Re,Ay($e,Ze),ht);Py($e,Ze)}return typeof Ze=="string"&&Ze!==""||typeof Ze=="number"||typeof Ze=="bigint"?(Ze=""+Ze,Re!==null&&Re.tag===6?(_($e,Re.sibling),ht=P(Re,Ze),ht.return=$e,$e=ht):(_($e,Re),ht=KE(Ze,$e.mode,ht),ht.return=$e,$e=ht),X($e)):_($e,Re)}return function($e,Re,Ze,ht){try{Fg=0;var Bt=Yn($e,Re,Ze,ht);return zf=null,Bt}catch(It){if(It===Uf||It===Ny)throw It;var Pn=ds(29,It,null,$e.mode);return Pn.lanes=ht,Pn.return=$e,Pn}finally{}}}var qd=j4(!0),R4=j4(!1),su=!1;function o2(h){h.updateQueue={baseState:h.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function l2(h,m){h=h.updateQueue,m.updateQueue===h&&(m.updateQueue={baseState:h.baseState,firstBaseUpdate:h.firstBaseUpdate,lastBaseUpdate:h.lastBaseUpdate,shared:h.shared,callbacks:null})}function ou(h){return{lane:h,tag:0,payload:null,callback:null,next:null}}function lu(h,m,_){var S=h.updateQueue;if(S===null)return null;if(S=S.shared,(Ln&2)!==0){var P=S.pending;return P===null?m.next=m:(m.next=P.next,P.next=m),S.pending=m,m=wy(h),g4(h,null,_),m}return _y(h,S,m,_),wy(h)}function zg(h,m,_){if(m=m.updateQueue,m!==null&&(m=m.shared,(_&4194048)!==0)){var S=m.lanes;S&=h.pendingLanes,_|=S,m.lanes=_,Nn(h,_)}}function c2(h,m){var _=h.updateQueue,S=h.alternate;if(S!==null&&(S=S.updateQueue,_===S)){var P=null,D=null;if(_=_.firstBaseUpdate,_!==null){do{var X={lane:_.lane,tag:_.tag,payload:_.payload,callback:null,next:null};D===null?P=D=X:D=D.next=X,_=_.next}while(_!==null);D===null?P=D=m:D=D.next=m}else P=D=m;_={baseState:S.baseState,firstBaseUpdate:P,lastBaseUpdate:D,shared:S.shared,callbacks:S.callbacks},h.updateQueue=_;return}h=_.lastBaseUpdate,h===null?_.firstBaseUpdate=m:h.next=m,_.lastBaseUpdate=m}var u2=!1;function Bg(){if(u2){var h=Ff;if(h!==null)throw h}}function Hg(h,m,_,S){u2=!1;var P=h.updateQueue;su=!1;var D=P.firstBaseUpdate,X=P.lastBaseUpdate,le=P.shared.pending;if(le!==null){P.shared.pending=null;var Ne=le,Qe=Ne.next;Ne.next=null,X===null?D=Qe:X.next=Qe,X=Ne;var ct=h.alternate;ct!==null&&(ct=ct.updateQueue,le=ct.lastBaseUpdate,le!==X&&(le===null?ct.firstBaseUpdate=Qe:le.next=Qe,ct.lastBaseUpdate=Ne))}if(D!==null){var ft=P.baseState;X=0,ct=Qe=Ne=null,le=D;do{var tt=le.lane&-536870913,st=tt!==le.lane;if(st?(wn&tt)===tt:(S&tt)===tt){tt!==0&&tt===If&&(u2=!0),ct!==null&&(ct=ct.next={lane:0,tag:le.tag,payload:le.payload,callback:null,next:null});e:{var Ot=h,Wt=le;tt=m;var Yn=_;switch(Wt.tag){case 1:if(Ot=Wt.payload,typeof Ot=="function"){ft=Ot.call(Yn,ft,tt);break e}ft=Ot;break e;case 3:Ot.flags=Ot.flags&-65537|128;case 0:if(Ot=Wt.payload,tt=typeof Ot=="function"?Ot.call(Yn,ft,tt):Ot,tt==null)break e;ft=f({},ft,tt);break e;case 2:su=!0}}tt=le.callback,tt!==null&&(h.flags|=64,st&&(h.flags|=8192),st=P.callbacks,st===null?P.callbacks=[tt]:st.push(tt))}else st={lane:tt,tag:le.tag,payload:le.payload,callback:le.callback,next:null},ct===null?(Qe=ct=st,Ne=ft):ct=ct.next=st,X|=tt;if(le=le.next,le===null){if(le=P.shared.pending,le===null)break;st=le,le=st.next,st.next=null,P.lastBaseUpdate=st,P.shared.pending=null}}while(!0);ct===null&&(Ne=ft),P.baseState=Ne,P.firstBaseUpdate=Qe,P.lastBaseUpdate=ct,D===null&&(P.shared.lanes=0),fu|=X,h.lanes=X,h.memoizedState=ft}}function D4(h,m){if(typeof h!="function")throw Error(r(191,h));h.call(m)}function O4(h,m){var _=h.callbacks;if(_!==null)for(h.callbacks=null,h=0;h<_.length;h++)D4(_[h],m)}var Bf=B(null),jy=B(0);function L4(h,m){h=Yl,Q(jy,h),Q(Bf,m),Yl=h|m.baseLanes}function d2(){Q(jy,Yl),Q(Bf,Bf.current)}function h2(){Yl=jy.current,$(Bf),$(jy)}var hs=B(null),Us=null;function cu(h){var m=h.alternate;Q(qr,qr.current&1),Q(hs,h),Us===null&&(m===null||Bf.current!==null||m.memoizedState!==null)&&(Us=h)}function f2(h){Q(qr,qr.current),Q(hs,h),Us===null&&(Us=h)}function I4(h){h.tag===22?(Q(qr,qr.current),Q(hs,h),Us===null&&(Us=h)):uu()}function uu(){Q(qr,qr.current),Q(hs,hs.current)}function fs(h){$(hs),Us===h&&(Us=null),$(qr)}var qr=B(0);function Ry(h){for(var m=h;m!==null;){if(m.tag===13){var _=m.memoizedState;if(_!==null&&(_=_.dehydrated,_===null||yA(_)||vA(_)))return m}else if(m.tag===19&&(m.memoizedProps.revealOrder==="forwards"||m.memoizedProps.revealOrder==="backwards"||m.memoizedProps.revealOrder==="unstable_legacy-backwards"||m.memoizedProps.revealOrder==="together")){if((m.flags&128)!==0)return m}else if(m.child!==null){m.child.return=m,m=m.child;continue}if(m===h)break;for(;m.sibling===null;){if(m.return===null||m.return===h)return null;m=m.return}m.sibling.return=m.return,m=m.sibling}return null}var Hl=0,an=null,Kn=null,ni=null,Dy=!1,Hf=!1,Kd=!1,Oy=0,$g=0,$f=null,Pne=0;function Fr(){throw Error(r(321))}function m2(h,m){if(m===null)return!1;for(var _=0;_D?D:8;var X=K.T,le={};K.T=le,C2(h,!1,m,_);try{var Ne=P(),Qe=K.S;if(Qe!==null&&Qe(le,Ne),Ne!==null&&typeof Ne=="object"&&typeof Ne.then=="function"){var ct=kne(Ne,S);Gg(h,m,ct,gs(h))}else Gg(h,m,S,gs(h))}catch(ft){Gg(h,m,{then:function(){},status:"rejected",reason:ft},gs())}finally{W.p=D,X!==null&&le.types!==null&&(X.types=le.types),K.T=X}}function Lne(){}function T2(h,m,_,S){if(h.tag!==5)throw Error(r(476));var P=fI(h).queue;hI(h,P,m,J,_===null?Lne:function(){return mI(h),_(S)})}function fI(h){var m=h.memoizedState;if(m!==null)return m;m={memoizedState:J,baseState:J,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:$l,lastRenderedState:J},next:null};var _={};return m.next={memoizedState:_,baseState:_,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:$l,lastRenderedState:_},next:null},h.memoizedState=m,h=h.alternate,h!==null&&(h.memoizedState=m),m}function mI(h){var m=fI(h);m.next===null&&(m=h.alternate.memoizedState),Gg(h,m.next.queue,{},gs())}function N2(){return Ki(lx)}function pI(){return Kr().memoizedState}function gI(){return Kr().memoizedState}function Ine(h){for(var m=h.return;m!==null;){switch(m.tag){case 24:case 3:var _=gs();h=ou(_);var S=lu(m,h,_);S!==null&&(Wa(S,m,_),zg(S,m,_)),m={cache:r2()},h.payload=m;return}m=m.return}}function Fne(h,m,_){var S=gs();_={lane:S,revertLane:0,gesture:null,action:_,hasEagerState:!1,eagerState:null,next:null},By(h)?bI(m,_):(_=WE(h,m,_,S),_!==null&&(Wa(_,h,S),yI(_,m,S)))}function xI(h,m,_){var S=gs();Gg(h,m,_,S)}function Gg(h,m,_,S){var P={lane:S,revertLane:0,gesture:null,action:_,hasEagerState:!1,eagerState:null,next:null};if(By(h))bI(m,P);else{var D=h.alternate;if(h.lanes===0&&(D===null||D.lanes===0)&&(D=m.lastRenderedReducer,D!==null))try{var X=m.lastRenderedState,le=D(X,_);if(P.hasEagerState=!0,P.eagerState=le,us(le,X))return _y(h,m,P,0),ar===null&&vy(),!1}catch{}finally{}if(_=WE(h,m,P,S),_!==null)return Wa(_,h,S),yI(_,m,S),!0}return!1}function C2(h,m,_,S){if(S={lane:2,revertLane:oA(),gesture:null,action:S,hasEagerState:!1,eagerState:null,next:null},By(h)){if(m)throw Error(r(479))}else m=WE(h,_,S,2),m!==null&&Wa(m,h,2)}function By(h){var m=h.alternate;return h===an||m!==null&&m===an}function bI(h,m){Hf=Dy=!0;var _=h.pending;_===null?m.next=m:(m.next=_.next,_.next=m),h.pending=m}function yI(h,m,_){if((_&4194048)!==0){var S=m.lanes;S&=h.pendingLanes,_|=S,m.lanes=_,Nn(h,_)}}var Wg={readContext:Ki,use:Iy,useCallback:Fr,useContext:Fr,useEffect:Fr,useImperativeHandle:Fr,useLayoutEffect:Fr,useInsertionEffect:Fr,useMemo:Fr,useReducer:Fr,useRef:Fr,useState:Fr,useDebugValue:Fr,useDeferredValue:Fr,useTransition:Fr,useSyncExternalStore:Fr,useId:Fr,useHostTransitionStatus:Fr,useFormState:Fr,useActionState:Fr,useOptimistic:Fr,useMemoCache:Fr,useCacheRefresh:Fr};Wg.useEffectEvent=Fr;var vI={readContext:Ki,use:Iy,useCallback:function(h,m){return Ea().memoizedState=[h,m===void 0?null:m],h},useContext:Ki,useEffect:rI,useImperativeHandle:function(h,m,_){_=_!=null?_.concat([h]):null,Uy(4194308,4,oI.bind(null,m,h),_)},useLayoutEffect:function(h,m){return Uy(4194308,4,h,m)},useInsertionEffect:function(h,m){Uy(4,2,h,m)},useMemo:function(h,m){var _=Ea();m=m===void 0?null:m;var S=h();if(Kd){Be(!0);try{h()}finally{Be(!1)}}return _.memoizedState=[S,m],S},useReducer:function(h,m,_){var S=Ea();if(_!==void 0){var P=_(m);if(Kd){Be(!0);try{_(m)}finally{Be(!1)}}}else P=m;return S.memoizedState=S.baseState=P,h={pending:null,lanes:0,dispatch:null,lastRenderedReducer:h,lastRenderedState:P},S.queue=h,h=h.dispatch=Fne.bind(null,an,h),[S.memoizedState,h]},useRef:function(h){var m=Ea();return h={current:h},m.memoizedState=h},useState:function(h){h=w2(h);var m=h.queue,_=xI.bind(null,an,m);return m.dispatch=_,[h.memoizedState,_]},useDebugValue:E2,useDeferredValue:function(h,m){var _=Ea();return A2(_,h,m)},useTransition:function(){var h=w2(!1);return h=hI.bind(null,an,h.queue,!0,!1),Ea().memoizedState=h,[!1,h]},useSyncExternalStore:function(h,m,_){var S=an,P=Ea();if(An){if(_===void 0)throw Error(r(407));_=_()}else{if(_=m(),ar===null)throw Error(r(349));(wn&127)!==0||B4(S,m,_)}P.memoizedState=_;var D={value:_,getSnapshot:m};return P.queue=D,rI($4.bind(null,S,D,h),[h]),S.flags|=2048,Vf(9,{destroy:void 0},H4.bind(null,S,D,_,m),null),_},useId:function(){var h=Ea(),m=ar.identifierPrefix;if(An){var _=Yo,S=Xo;_=(S&~(1<<32-Ue(S)-1)).toString(32)+_,m="_"+m+"R_"+_,_=Oy++,0<_&&(m+="H"+_.toString(32)),m+="_"}else _=Pne++,m="_"+m+"r_"+_.toString(32)+"_";return h.memoizedState=m},useHostTransitionStatus:N2,useFormState:Q4,useActionState:Q4,useOptimistic:function(h){var m=Ea();m.memoizedState=m.baseState=h;var _={pending:null,lanes:0,dispatch:null,lastRenderedReducer:null,lastRenderedState:null};return m.queue=_,m=C2.bind(null,an,!0,_),_.dispatch=m,[h,m]},useMemoCache:y2,useCacheRefresh:function(){return Ea().memoizedState=Ine.bind(null,an)},useEffectEvent:function(h){var m=Ea(),_={impl:h};return m.memoizedState=_,function(){if((Ln&2)!==0)throw Error(r(440));return _.impl.apply(void 0,arguments)}}},k2={readContext:Ki,use:Iy,useCallback:cI,useContext:Ki,useEffect:M2,useImperativeHandle:lI,useInsertionEffect:aI,useLayoutEffect:sI,useMemo:uI,useReducer:Fy,useRef:nI,useState:function(){return Fy($l)},useDebugValue:E2,useDeferredValue:function(h,m){var _=Kr();return dI(_,Kn.memoizedState,h,m)},useTransition:function(){var h=Fy($l)[0],m=Kr().memoizedState;return[typeof h=="boolean"?h:Vg(h),m]},useSyncExternalStore:z4,useId:pI,useHostTransitionStatus:N2,useFormState:J4,useActionState:J4,useOptimistic:function(h,m){var _=Kr();return W4(_,Kn,h,m)},useMemoCache:y2,useCacheRefresh:gI};k2.useEffectEvent=iI;var _I={readContext:Ki,use:Iy,useCallback:cI,useContext:Ki,useEffect:M2,useImperativeHandle:lI,useInsertionEffect:aI,useLayoutEffect:sI,useMemo:uI,useReducer:_2,useRef:nI,useState:function(){return _2($l)},useDebugValue:E2,useDeferredValue:function(h,m){var _=Kr();return Kn===null?A2(_,h,m):dI(_,Kn.memoizedState,h,m)},useTransition:function(){var h=_2($l)[0],m=Kr().memoizedState;return[typeof h=="boolean"?h:Vg(h),m]},useSyncExternalStore:z4,useId:pI,useHostTransitionStatus:N2,useFormState:tI,useActionState:tI,useOptimistic:function(h,m){var _=Kr();return Kn!==null?W4(_,Kn,h,m):(_.baseState=h,[h,_.queue.dispatch])},useMemoCache:y2,useCacheRefresh:gI};_I.useEffectEvent=iI;function P2(h,m,_,S){m=h.memoizedState,_=_(S,m),_=_==null?m:f({},m,_),h.memoizedState=_,h.lanes===0&&(h.updateQueue.baseState=_)}var j2={enqueueSetState:function(h,m,_){h=h._reactInternals;var S=gs(),P=ou(S);P.payload=m,_!=null&&(P.callback=_),m=lu(h,P,S),m!==null&&(Wa(m,h,S),zg(m,h,S))},enqueueReplaceState:function(h,m,_){h=h._reactInternals;var S=gs(),P=ou(S);P.tag=1,P.payload=m,_!=null&&(P.callback=_),m=lu(h,P,S),m!==null&&(Wa(m,h,S),zg(m,h,S))},enqueueForceUpdate:function(h,m){h=h._reactInternals;var _=gs(),S=ou(_);S.tag=2,m!=null&&(S.callback=m),m=lu(h,S,_),m!==null&&(Wa(m,h,_),zg(m,h,_))}};function wI(h,m,_,S,P,D,X){return h=h.stateNode,typeof h.shouldComponentUpdate=="function"?h.shouldComponentUpdate(S,D,X):m.prototype&&m.prototype.isPureReactComponent?!jg(_,S)||!jg(P,D):!0}function SI(h,m,_,S){h=m.state,typeof m.componentWillReceiveProps=="function"&&m.componentWillReceiveProps(_,S),typeof m.UNSAFE_componentWillReceiveProps=="function"&&m.UNSAFE_componentWillReceiveProps(_,S),m.state!==h&&j2.enqueueReplaceState(m,m.state,null)}function Xd(h,m){var _=m;if("ref"in m){_={};for(var S in m)S!=="ref"&&(_[S]=m[S])}if(h=h.defaultProps){_===m&&(_=f({},_));for(var P in h)_[P]===void 0&&(_[P]=h[P])}return _}function MI(h){yy(h)}function EI(h){console.error(h)}function AI(h){yy(h)}function Hy(h,m){try{var _=h.onUncaughtError;_(m.value,{componentStack:m.stack})}catch(S){setTimeout(function(){throw S})}}function TI(h,m,_){try{var S=h.onCaughtError;S(_.value,{componentStack:_.stack,errorBoundary:m.tag===1?m.stateNode:null})}catch(P){setTimeout(function(){throw P})}}function R2(h,m,_){return _=ou(_),_.tag=3,_.payload={element:null},_.callback=function(){Hy(h,m)},_}function NI(h){return h=ou(h),h.tag=3,h}function CI(h,m,_,S){var P=_.type.getDerivedStateFromError;if(typeof P=="function"){var D=S.value;h.payload=function(){return P(D)},h.callback=function(){TI(m,_,S)}}var X=_.stateNode;X!==null&&typeof X.componentDidCatch=="function"&&(h.callback=function(){TI(m,_,S),typeof P!="function"&&(mu===null?mu=new Set([this]):mu.add(this));var le=S.stack;this.componentDidCatch(S.value,{componentStack:le!==null?le:""})})}function Une(h,m,_,S,P){if(_.flags|=32768,S!==null&&typeof S=="object"&&typeof S.then=="function"){if(m=_.alternate,m!==null&&Lf(m,_,P,!0),_=hs.current,_!==null){switch(_.tag){case 31:case 13:return Us===null?ev():_.alternate===null&&Ur===0&&(Ur=3),_.flags&=-257,_.flags|=65536,_.lanes=P,S===Cy?_.flags|=16384:(m=_.updateQueue,m===null?_.updateQueue=new Set([S]):m.add(S),iA(h,S,P)),!1;case 22:return _.flags|=65536,S===Cy?_.flags|=16384:(m=_.updateQueue,m===null?(m={transitions:null,markerInstances:null,retryQueue:new Set([S])},_.updateQueue=m):(_=m.retryQueue,_===null?m.retryQueue=new Set([S]):_.add(S)),iA(h,S,P)),!1}throw Error(r(435,_.tag))}return iA(h,S,P),ev(),!1}if(An)return m=hs.current,m!==null?((m.flags&65536)===0&&(m.flags|=256),m.flags|=65536,m.lanes=P,S!==QE&&(h=Error(r(422),{cause:S}),Og(Os(h,_)))):(S!==QE&&(m=Error(r(423),{cause:S}),Og(Os(m,_))),h=h.current.alternate,h.flags|=65536,P&=-P,h.lanes|=P,S=Os(S,_),P=R2(h.stateNode,S,P),c2(h,P),Ur!==4&&(Ur=2)),!1;var D=Error(r(520),{cause:S});if(D=Os(D,_),ex===null?ex=[D]:ex.push(D),Ur!==4&&(Ur=2),m===null)return!0;S=Os(S,_),_=m;do{switch(_.tag){case 3:return _.flags|=65536,h=P&-P,_.lanes|=h,h=R2(_.stateNode,S,h),c2(_,h),!1;case 1:if(m=_.type,D=_.stateNode,(_.flags&128)===0&&(typeof m.getDerivedStateFromError=="function"||D!==null&&typeof D.componentDidCatch=="function"&&(mu===null||!mu.has(D))))return _.flags|=65536,P&=-P,_.lanes|=P,P=NI(P),CI(P,h,_,S),c2(_,P),!1}_=_.return}while(_!==null);return!1}var D2=Error(r(461)),ri=!1;function Xi(h,m,_,S){m.child=h===null?R4(m,null,_,S):qd(m,h.child,_,S)}function kI(h,m,_,S,P){_=_.render;var D=m.ref;if("ref"in S){var X={};for(var le in S)le!=="ref"&&(X[le]=S[le])}else X=S;return $d(m),S=p2(h,m,_,X,D,P),le=g2(),h!==null&&!ri?(x2(h,m,P),Vl(h,m,P)):(An&&le&&YE(m),m.flags|=1,Xi(h,m,S,P),m.child)}function PI(h,m,_,S,P){if(h===null){var D=_.type;return typeof D=="function"&&!qE(D)&&D.defaultProps===void 0&&_.compare===null?(m.tag=15,m.type=D,jI(h,m,D,S,P)):(h=Sy(_.type,null,S,m,m.mode,P),h.ref=m.ref,h.return=m,m.child=h)}if(D=h.child,!H2(h,P)){var X=D.memoizedProps;if(_=_.compare,_=_!==null?_:jg,_(X,S)&&h.ref===m.ref)return Vl(h,m,P)}return m.flags|=1,h=Fl(D,S),h.ref=m.ref,h.return=m,m.child=h}function jI(h,m,_,S,P){if(h!==null){var D=h.memoizedProps;if(jg(D,S)&&h.ref===m.ref)if(ri=!1,m.pendingProps=S=D,H2(h,P))(h.flags&131072)!==0&&(ri=!0);else return m.lanes=h.lanes,Vl(h,m,P)}return O2(h,m,_,S,P)}function RI(h,m,_,S){var P=S.children,D=h!==null?h.memoizedState:null;if(h===null&&m.stateNode===null&&(m.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),S.mode==="hidden"){if((m.flags&128)!==0){if(D=D!==null?D.baseLanes|_:_,h!==null){for(S=m.child=h.child,P=0;S!==null;)P=P|S.lanes|S.childLanes,S=S.sibling;S=P&~D}else S=0,m.child=null;return DI(h,m,D,_,S)}if((_&536870912)!==0)m.memoizedState={baseLanes:0,cachePool:null},h!==null&&Ty(m,D!==null?D.cachePool:null),D!==null?L4(m,D):d2(),I4(m);else return S=m.lanes=536870912,DI(h,m,D!==null?D.baseLanes|_:_,_,S)}else D!==null?(Ty(m,D.cachePool),L4(m,D),uu(),m.memoizedState=null):(h!==null&&Ty(m,null),d2(),uu());return Xi(h,m,P,_),m.child}function qg(h,m){return h!==null&&h.tag===22||m.stateNode!==null||(m.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),m.sibling}function DI(h,m,_,S,P){var D=a2();return D=D===null?null:{parent:ti._currentValue,pool:D},m.memoizedState={baseLanes:_,cachePool:D},h!==null&&Ty(m,null),d2(),I4(m),h!==null&&Lf(h,m,S,!0),m.childLanes=P,null}function $y(h,m){return m=Gy({mode:m.mode,children:m.children},h.mode),m.ref=h.ref,h.child=m,m.return=h,m}function OI(h,m,_){return qd(m,h.child,null,_),h=$y(m,m.pendingProps),h.flags|=2,fs(m),m.memoizedState=null,h}function zne(h,m,_){var S=m.pendingProps,P=(m.flags&128)!==0;if(m.flags&=-129,h===null){if(An){if(S.mode==="hidden")return h=$y(m,S),m.lanes=536870912,qg(null,h);if(f2(m),(h=hr)?(h=q5(h,Fs),h=h!==null&&h.data==="&"?h:null,h!==null&&(m.memoizedState={dehydrated:h,treeContext:nu!==null?{id:Xo,overflow:Yo}:null,retryLane:536870912,hydrationErrors:null},_=b4(h),_.return=m,m.child=_,qi=m,hr=null)):h=null,h===null)throw iu(m);return m.lanes=536870912,null}return $y(m,S)}var D=h.memoizedState;if(D!==null){var X=D.dehydrated;if(f2(m),P)if(m.flags&256)m.flags&=-257,m=OI(h,m,_);else if(m.memoizedState!==null)m.child=h.child,m.flags|=128,m=null;else throw Error(r(558));else if(ri||Lf(h,m,_,!1),P=(_&h.childLanes)!==0,ri||P){if(S=ar,S!==null&&(X=Lr(S,_),X!==0&&X!==D.retryLane))throw D.retryLane=X,Ud(h,X),Wa(S,h,X),D2;ev(),m=OI(h,m,_)}else h=D.treeContext,hr=zs(X.nextSibling),qi=m,An=!0,ru=null,Fs=!1,h!==null&&_4(m,h),m=$y(m,S),m.flags|=4096;return m}return h=Fl(h.child,{mode:S.mode,children:S.children}),h.ref=m.ref,m.child=h,h.return=m,h}function Vy(h,m){var _=m.ref;if(_===null)h!==null&&h.ref!==null&&(m.flags|=4194816);else{if(typeof _!="function"&&typeof _!="object")throw Error(r(284));(h===null||h.ref!==_)&&(m.flags|=4194816)}}function O2(h,m,_,S,P){return $d(m),_=p2(h,m,_,S,void 0,P),S=g2(),h!==null&&!ri?(x2(h,m,P),Vl(h,m,P)):(An&&S&&YE(m),m.flags|=1,Xi(h,m,_,P),m.child)}function LI(h,m,_,S,P,D){return $d(m),m.updateQueue=null,_=U4(m,S,_,P),F4(h),S=g2(),h!==null&&!ri?(x2(h,m,D),Vl(h,m,D)):(An&&S&&YE(m),m.flags|=1,Xi(h,m,_,D),m.child)}function II(h,m,_,S,P){if($d(m),m.stateNode===null){var D=jf,X=_.contextType;typeof X=="object"&&X!==null&&(D=Ki(X)),D=new _(S,D),m.memoizedState=D.state!==null&&D.state!==void 0?D.state:null,D.updater=j2,m.stateNode=D,D._reactInternals=m,D=m.stateNode,D.props=S,D.state=m.memoizedState,D.refs={},o2(m),X=_.contextType,D.context=typeof X=="object"&&X!==null?Ki(X):jf,D.state=m.memoizedState,X=_.getDerivedStateFromProps,typeof X=="function"&&(P2(m,_,X,S),D.state=m.memoizedState),typeof _.getDerivedStateFromProps=="function"||typeof D.getSnapshotBeforeUpdate=="function"||typeof D.UNSAFE_componentWillMount!="function"&&typeof D.componentWillMount!="function"||(X=D.state,typeof D.componentWillMount=="function"&&D.componentWillMount(),typeof D.UNSAFE_componentWillMount=="function"&&D.UNSAFE_componentWillMount(),X!==D.state&&j2.enqueueReplaceState(D,D.state,null),Hg(m,S,D,P),Bg(),D.state=m.memoizedState),typeof D.componentDidMount=="function"&&(m.flags|=4194308),S=!0}else if(h===null){D=m.stateNode;var le=m.memoizedProps,Ne=Xd(_,le);D.props=Ne;var Qe=D.context,ct=_.contextType;X=jf,typeof ct=="object"&&ct!==null&&(X=Ki(ct));var ft=_.getDerivedStateFromProps;ct=typeof ft=="function"||typeof D.getSnapshotBeforeUpdate=="function",le=m.pendingProps!==le,ct||typeof D.UNSAFE_componentWillReceiveProps!="function"&&typeof D.componentWillReceiveProps!="function"||(le||Qe!==X)&&SI(m,D,S,X),su=!1;var tt=m.memoizedState;D.state=tt,Hg(m,S,D,P),Bg(),Qe=m.memoizedState,le||tt!==Qe||su?(typeof ft=="function"&&(P2(m,_,ft,S),Qe=m.memoizedState),(Ne=su||wI(m,_,Ne,S,tt,Qe,X))?(ct||typeof D.UNSAFE_componentWillMount!="function"&&typeof D.componentWillMount!="function"||(typeof D.componentWillMount=="function"&&D.componentWillMount(),typeof D.UNSAFE_componentWillMount=="function"&&D.UNSAFE_componentWillMount()),typeof D.componentDidMount=="function"&&(m.flags|=4194308)):(typeof D.componentDidMount=="function"&&(m.flags|=4194308),m.memoizedProps=S,m.memoizedState=Qe),D.props=S,D.state=Qe,D.context=X,S=Ne):(typeof D.componentDidMount=="function"&&(m.flags|=4194308),S=!1)}else{D=m.stateNode,l2(h,m),X=m.memoizedProps,ct=Xd(_,X),D.props=ct,ft=m.pendingProps,tt=D.context,Qe=_.contextType,Ne=jf,typeof Qe=="object"&&Qe!==null&&(Ne=Ki(Qe)),le=_.getDerivedStateFromProps,(Qe=typeof le=="function"||typeof D.getSnapshotBeforeUpdate=="function")||typeof D.UNSAFE_componentWillReceiveProps!="function"&&typeof D.componentWillReceiveProps!="function"||(X!==ft||tt!==Ne)&&SI(m,D,S,Ne),su=!1,tt=m.memoizedState,D.state=tt,Hg(m,S,D,P),Bg();var st=m.memoizedState;X!==ft||tt!==st||su||h!==null&&h.dependencies!==null&&Ey(h.dependencies)?(typeof le=="function"&&(P2(m,_,le,S),st=m.memoizedState),(ct=su||wI(m,_,ct,S,tt,st,Ne)||h!==null&&h.dependencies!==null&&Ey(h.dependencies))?(Qe||typeof D.UNSAFE_componentWillUpdate!="function"&&typeof D.componentWillUpdate!="function"||(typeof D.componentWillUpdate=="function"&&D.componentWillUpdate(S,st,Ne),typeof D.UNSAFE_componentWillUpdate=="function"&&D.UNSAFE_componentWillUpdate(S,st,Ne)),typeof D.componentDidUpdate=="function"&&(m.flags|=4),typeof D.getSnapshotBeforeUpdate=="function"&&(m.flags|=1024)):(typeof D.componentDidUpdate!="function"||X===h.memoizedProps&&tt===h.memoizedState||(m.flags|=4),typeof D.getSnapshotBeforeUpdate!="function"||X===h.memoizedProps&&tt===h.memoizedState||(m.flags|=1024),m.memoizedProps=S,m.memoizedState=st),D.props=S,D.state=st,D.context=Ne,S=ct):(typeof D.componentDidUpdate!="function"||X===h.memoizedProps&&tt===h.memoizedState||(m.flags|=4),typeof D.getSnapshotBeforeUpdate!="function"||X===h.memoizedProps&&tt===h.memoizedState||(m.flags|=1024),S=!1)}return D=S,Vy(h,m),S=(m.flags&128)!==0,D||S?(D=m.stateNode,_=S&&typeof _.getDerivedStateFromError!="function"?null:D.render(),m.flags|=1,h!==null&&S?(m.child=qd(m,h.child,null,P),m.child=qd(m,null,_,P)):Xi(h,m,_,P),m.memoizedState=D.state,h=m.child):h=Vl(h,m,P),h}function FI(h,m,_,S){return Bd(),m.flags|=256,Xi(h,m,_,S),m.child}var L2={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function I2(h){return{baseLanes:h,cachePool:T4()}}function F2(h,m,_){return h=h!==null?h.childLanes&~_:0,m&&(h|=ps),h}function UI(h,m,_){var S=m.pendingProps,P=!1,D=(m.flags&128)!==0,X;if((X=D)||(X=h!==null&&h.memoizedState===null?!1:(qr.current&2)!==0),X&&(P=!0,m.flags&=-129),X=(m.flags&32)!==0,m.flags&=-33,h===null){if(An){if(P?cu(m):uu(),(h=hr)?(h=q5(h,Fs),h=h!==null&&h.data!=="&"?h:null,h!==null&&(m.memoizedState={dehydrated:h,treeContext:nu!==null?{id:Xo,overflow:Yo}:null,retryLane:536870912,hydrationErrors:null},_=b4(h),_.return=m,m.child=_,qi=m,hr=null)):h=null,h===null)throw iu(m);return vA(h)?m.lanes=32:m.lanes=536870912,null}var le=S.children;return S=S.fallback,P?(uu(),P=m.mode,le=Gy({mode:"hidden",children:le},P),S=zd(S,P,_,null),le.return=m,S.return=m,le.sibling=S,m.child=le,S=m.child,S.memoizedState=I2(_),S.childLanes=F2(h,X,_),m.memoizedState=L2,qg(null,S)):(cu(m),U2(m,le))}var Ne=h.memoizedState;if(Ne!==null&&(le=Ne.dehydrated,le!==null)){if(D)m.flags&256?(cu(m),m.flags&=-257,m=z2(h,m,_)):m.memoizedState!==null?(uu(),m.child=h.child,m.flags|=128,m=null):(uu(),le=S.fallback,P=m.mode,S=Gy({mode:"visible",children:S.children},P),le=zd(le,P,_,null),le.flags|=2,S.return=m,le.return=m,S.sibling=le,m.child=S,qd(m,h.child,null,_),S=m.child,S.memoizedState=I2(_),S.childLanes=F2(h,X,_),m.memoizedState=L2,m=qg(null,S));else if(cu(m),vA(le)){if(X=le.nextSibling&&le.nextSibling.dataset,X)var Qe=X.dgst;X=Qe,S=Error(r(419)),S.stack="",S.digest=X,Og({value:S,source:null,stack:null}),m=z2(h,m,_)}else if(ri||Lf(h,m,_,!1),X=(_&h.childLanes)!==0,ri||X){if(X=ar,X!==null&&(S=Lr(X,_),S!==0&&S!==Ne.retryLane))throw Ne.retryLane=S,Ud(h,S),Wa(X,h,S),D2;yA(le)||ev(),m=z2(h,m,_)}else yA(le)?(m.flags|=192,m.child=h.child,m=null):(h=Ne.treeContext,hr=zs(le.nextSibling),qi=m,An=!0,ru=null,Fs=!1,h!==null&&_4(m,h),m=U2(m,S.children),m.flags|=4096);return m}return P?(uu(),le=S.fallback,P=m.mode,Ne=h.child,Qe=Ne.sibling,S=Fl(Ne,{mode:"hidden",children:S.children}),S.subtreeFlags=Ne.subtreeFlags&65011712,Qe!==null?le=Fl(Qe,le):(le=zd(le,P,_,null),le.flags|=2),le.return=m,S.return=m,S.sibling=le,m.child=S,qg(null,S),S=m.child,le=h.child.memoizedState,le===null?le=I2(_):(P=le.cachePool,P!==null?(Ne=ti._currentValue,P=P.parent!==Ne?{parent:Ne,pool:Ne}:P):P=T4(),le={baseLanes:le.baseLanes|_,cachePool:P}),S.memoizedState=le,S.childLanes=F2(h,X,_),m.memoizedState=L2,qg(h.child,S)):(cu(m),_=h.child,h=_.sibling,_=Fl(_,{mode:"visible",children:S.children}),_.return=m,_.sibling=null,h!==null&&(X=m.deletions,X===null?(m.deletions=[h],m.flags|=16):X.push(h)),m.child=_,m.memoizedState=null,_)}function U2(h,m){return m=Gy({mode:"visible",children:m},h.mode),m.return=h,h.child=m}function Gy(h,m){return h=ds(22,h,null,m),h.lanes=0,h}function z2(h,m,_){return qd(m,h.child,null,_),h=U2(m,m.pendingProps.children),h.flags|=2,m.memoizedState=null,h}function zI(h,m,_){h.lanes|=m;var S=h.alternate;S!==null&&(S.lanes|=m),t2(h.return,m,_)}function B2(h,m,_,S,P,D){var X=h.memoizedState;X===null?h.memoizedState={isBackwards:m,rendering:null,renderingStartTime:0,last:S,tail:_,tailMode:P,treeForkCount:D}:(X.isBackwards=m,X.rendering=null,X.renderingStartTime=0,X.last=S,X.tail=_,X.tailMode=P,X.treeForkCount=D)}function BI(h,m,_){var S=m.pendingProps,P=S.revealOrder,D=S.tail;S=S.children;var X=qr.current,le=(X&2)!==0;if(le?(X=X&1|2,m.flags|=128):X&=1,Q(qr,X),Xi(h,m,S,_),S=An?Dg:0,!le&&h!==null&&(h.flags&128)!==0)e:for(h=m.child;h!==null;){if(h.tag===13)h.memoizedState!==null&&zI(h,_,m);else if(h.tag===19)zI(h,_,m);else if(h.child!==null){h.child.return=h,h=h.child;continue}if(h===m)break e;for(;h.sibling===null;){if(h.return===null||h.return===m)break e;h=h.return}h.sibling.return=h.return,h=h.sibling}switch(P){case"forwards":for(_=m.child,P=null;_!==null;)h=_.alternate,h!==null&&Ry(h)===null&&(P=_),_=_.sibling;_=P,_===null?(P=m.child,m.child=null):(P=_.sibling,_.sibling=null),B2(m,!1,P,_,D,S);break;case"backwards":case"unstable_legacy-backwards":for(_=null,P=m.child,m.child=null;P!==null;){if(h=P.alternate,h!==null&&Ry(h)===null){m.child=P;break}h=P.sibling,P.sibling=_,_=P,P=h}B2(m,!0,_,null,D,S);break;case"together":B2(m,!1,null,null,void 0,S);break;default:m.memoizedState=null}return m.child}function Vl(h,m,_){if(h!==null&&(m.dependencies=h.dependencies),fu|=m.lanes,(_&m.childLanes)===0)if(h!==null){if(Lf(h,m,_,!1),(_&m.childLanes)===0)return null}else return null;if(h!==null&&m.child!==h.child)throw Error(r(153));if(m.child!==null){for(h=m.child,_=Fl(h,h.pendingProps),m.child=_,_.return=m;h.sibling!==null;)h=h.sibling,_=_.sibling=Fl(h,h.pendingProps),_.return=m;_.sibling=null}return m.child}function H2(h,m){return(h.lanes&m)!==0?!0:(h=h.dependencies,!!(h!==null&&Ey(h)))}function Bne(h,m,_){switch(m.tag){case 3:Ae(m,m.stateNode.containerInfo),au(m,ti,h.memoizedState.cache),Bd();break;case 27:case 5:ce(m);break;case 4:Ae(m,m.stateNode.containerInfo);break;case 10:au(m,m.type,m.memoizedProps.value);break;case 31:if(m.memoizedState!==null)return m.flags|=128,f2(m),null;break;case 13:var S=m.memoizedState;if(S!==null)return S.dehydrated!==null?(cu(m),m.flags|=128,null):(_&m.child.childLanes)!==0?UI(h,m,_):(cu(m),h=Vl(h,m,_),h!==null?h.sibling:null);cu(m);break;case 19:var P=(h.flags&128)!==0;if(S=(_&m.childLanes)!==0,S||(Lf(h,m,_,!1),S=(_&m.childLanes)!==0),P){if(S)return BI(h,m,_);m.flags|=128}if(P=m.memoizedState,P!==null&&(P.rendering=null,P.tail=null,P.lastEffect=null),Q(qr,qr.current),S)break;return null;case 22:return m.lanes=0,RI(h,m,_,m.pendingProps);case 24:au(m,ti,h.memoizedState.cache)}return Vl(h,m,_)}function HI(h,m,_){if(h!==null)if(h.memoizedProps!==m.pendingProps)ri=!0;else{if(!H2(h,_)&&(m.flags&128)===0)return ri=!1,Bne(h,m,_);ri=(h.flags&131072)!==0}else ri=!1,An&&(m.flags&1048576)!==0&&v4(m,Dg,m.index);switch(m.lanes=0,m.tag){case 16:e:{var S=m.pendingProps;if(h=Gd(m.elementType),m.type=h,typeof h=="function")qE(h)?(S=Xd(h,S),m.tag=1,m=II(null,m,h,S,_)):(m.tag=0,m=O2(null,m,h,S,_));else{if(h!=null){var P=h.$$typeof;if(P===A){m.tag=11,m=kI(null,m,h,S,_);break e}else if(P===N){m.tag=14,m=PI(null,m,h,S,_);break e}}throw m=j(h)||h,Error(r(306,m,""))}}return m;case 0:return O2(h,m,m.type,m.pendingProps,_);case 1:return S=m.type,P=Xd(S,m.pendingProps),II(h,m,S,P,_);case 3:e:{if(Ae(m,m.stateNode.containerInfo),h===null)throw Error(r(387));S=m.pendingProps;var D=m.memoizedState;P=D.element,l2(h,m),Hg(m,S,null,_);var X=m.memoizedState;if(S=X.cache,au(m,ti,S),S!==D.cache&&n2(m,[ti],_,!0),Bg(),S=X.element,D.isDehydrated)if(D={element:S,isDehydrated:!1,cache:X.cache},m.updateQueue.baseState=D,m.memoizedState=D,m.flags&256){m=FI(h,m,S,_);break e}else if(S!==P){P=Os(Error(r(424)),m),Og(P),m=FI(h,m,S,_);break e}else{switch(h=m.stateNode.containerInfo,h.nodeType){case 9:h=h.body;break;default:h=h.nodeName==="HTML"?h.ownerDocument.body:h}for(hr=zs(h.firstChild),qi=m,An=!0,ru=null,Fs=!0,_=R4(m,null,S,_),m.child=_;_;)_.flags=_.flags&-3|4096,_=_.sibling}else{if(Bd(),S===P){m=Vl(h,m,_);break e}Xi(h,m,S,_)}m=m.child}return m;case 26:return Vy(h,m),h===null?(_=J5(m.type,null,m.pendingProps,null))?m.memoizedState=_:An||(_=m.type,h=m.pendingProps,S=ov(ue.current).createElement(_),S[rn]=m,S[Le]=h,Yi(S,_,h),Ie(S),m.stateNode=S):m.memoizedState=J5(m.type,h.memoizedProps,m.pendingProps,h.memoizedState),null;case 27:return ce(m),h===null&&An&&(S=m.stateNode=Y5(m.type,m.pendingProps,ue.current),qi=m,Fs=!0,P=hr,bu(m.type)?(_A=P,hr=zs(S.firstChild)):hr=P),Xi(h,m,m.pendingProps.children,_),Vy(h,m),h===null&&(m.flags|=4194304),m.child;case 5:return h===null&&An&&((P=S=hr)&&(S=xre(S,m.type,m.pendingProps,Fs),S!==null?(m.stateNode=S,qi=m,hr=zs(S.firstChild),Fs=!1,P=!0):P=!1),P||iu(m)),ce(m),P=m.type,D=m.pendingProps,X=h!==null?h.memoizedProps:null,S=D.children,gA(P,D)?S=null:X!==null&&gA(P,X)&&(m.flags|=32),m.memoizedState!==null&&(P=p2(h,m,jne,null,null,_),lx._currentValue=P),Vy(h,m),Xi(h,m,S,_),m.child;case 6:return h===null&&An&&((h=_=hr)&&(_=bre(_,m.pendingProps,Fs),_!==null?(m.stateNode=_,qi=m,hr=null,h=!0):h=!1),h||iu(m)),null;case 13:return UI(h,m,_);case 4:return Ae(m,m.stateNode.containerInfo),S=m.pendingProps,h===null?m.child=qd(m,null,S,_):Xi(h,m,S,_),m.child;case 11:return kI(h,m,m.type,m.pendingProps,_);case 7:return Xi(h,m,m.pendingProps,_),m.child;case 8:return Xi(h,m,m.pendingProps.children,_),m.child;case 12:return Xi(h,m,m.pendingProps.children,_),m.child;case 10:return S=m.pendingProps,au(m,m.type,S.value),Xi(h,m,S.children,_),m.child;case 9:return P=m.type._context,S=m.pendingProps.children,$d(m),P=Ki(P),S=S(P),m.flags|=1,Xi(h,m,S,_),m.child;case 14:return PI(h,m,m.type,m.pendingProps,_);case 15:return jI(h,m,m.type,m.pendingProps,_);case 19:return BI(h,m,_);case 31:return zne(h,m,_);case 22:return RI(h,m,_,m.pendingProps);case 24:return $d(m),S=Ki(ti),h===null?(P=a2(),P===null&&(P=ar,D=r2(),P.pooledCache=D,D.refCount++,D!==null&&(P.pooledCacheLanes|=_),P=D),m.memoizedState={parent:S,cache:P},o2(m),au(m,ti,P)):((h.lanes&_)!==0&&(l2(h,m),Hg(m,null,null,_),Bg()),P=h.memoizedState,D=m.memoizedState,P.parent!==S?(P={parent:S,cache:S},m.memoizedState=P,m.lanes===0&&(m.memoizedState=m.updateQueue.baseState=P),au(m,ti,S)):(S=D.cache,au(m,ti,S),S!==P.cache&&n2(m,[ti],_,!0))),Xi(h,m,m.pendingProps.children,_),m.child;case 29:throw m.pendingProps}throw Error(r(156,m.tag))}function Gl(h){h.flags|=4}function $2(h,m,_,S,P){if((m=(h.mode&32)!==0)&&(m=!1),m){if(h.flags|=16777216,(P&335544128)===P)if(h.stateNode.complete)h.flags|=8192;else if(p5())h.flags|=8192;else throw Wd=Cy,s2}else h.flags&=-16777217}function $I(h,m){if(m.type!=="stylesheet"||(m.state.loading&4)!==0)h.flags&=-16777217;else if(h.flags|=16777216,!iF(m))if(p5())h.flags|=8192;else throw Wd=Cy,s2}function Wy(h,m){m!==null&&(h.flags|=4),h.flags&16384&&(m=h.tag!==22?St():536870912,h.lanes|=m,Kf|=m)}function Kg(h,m){if(!An)switch(h.tailMode){case"hidden":m=h.tail;for(var _=null;m!==null;)m.alternate!==null&&(_=m),m=m.sibling;_===null?h.tail=null:_.sibling=null;break;case"collapsed":_=h.tail;for(var S=null;_!==null;)_.alternate!==null&&(S=_),_=_.sibling;S===null?m||h.tail===null?h.tail=null:h.tail.sibling=null:S.sibling=null}}function fr(h){var m=h.alternate!==null&&h.alternate.child===h.child,_=0,S=0;if(m)for(var P=h.child;P!==null;)_|=P.lanes|P.childLanes,S|=P.subtreeFlags&65011712,S|=P.flags&65011712,P.return=h,P=P.sibling;else for(P=h.child;P!==null;)_|=P.lanes|P.childLanes,S|=P.subtreeFlags,S|=P.flags,P.return=h,P=P.sibling;return h.subtreeFlags|=S,h.childLanes=_,m}function Hne(h,m,_){var S=m.pendingProps;switch(ZE(m),m.tag){case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return fr(m),null;case 1:return fr(m),null;case 3:return _=m.stateNode,S=null,h!==null&&(S=h.memoizedState.cache),m.memoizedState.cache!==S&&(m.flags|=2048),Bl(ti),pe(),_.pendingContext&&(_.context=_.pendingContext,_.pendingContext=null),(h===null||h.child===null)&&(Of(m)?Gl(m):h===null||h.memoizedState.isDehydrated&&(m.flags&256)===0||(m.flags|=1024,JE())),fr(m),null;case 26:var P=m.type,D=m.memoizedState;return h===null?(Gl(m),D!==null?(fr(m),$I(m,D)):(fr(m),$2(m,P,null,S,_))):D?D!==h.memoizedState?(Gl(m),fr(m),$I(m,D)):(fr(m),m.flags&=-16777217):(h=h.memoizedProps,h!==S&&Gl(m),fr(m),$2(m,P,h,S,_)),null;case 27:if(Pe(m),_=ue.current,P=m.type,h!==null&&m.stateNode!=null)h.memoizedProps!==S&&Gl(m);else{if(!S){if(m.stateNode===null)throw Error(r(166));return fr(m),null}h=te.current,Of(m)?w4(m):(h=Y5(P,S,_),m.stateNode=h,Gl(m))}return fr(m),null;case 5:if(Pe(m),P=m.type,h!==null&&m.stateNode!=null)h.memoizedProps!==S&&Gl(m);else{if(!S){if(m.stateNode===null)throw Error(r(166));return fr(m),null}if(D=te.current,Of(m))w4(m);else{var X=ov(ue.current);switch(D){case 1:D=X.createElementNS("http://www.w3.org/2000/svg",P);break;case 2:D=X.createElementNS("http://www.w3.org/1998/Math/MathML",P);break;default:switch(P){case"svg":D=X.createElementNS("http://www.w3.org/2000/svg",P);break;case"math":D=X.createElementNS("http://www.w3.org/1998/Math/MathML",P);break;case"script":D=X.createElement("div"),D.innerHTML=" - + +