From d595af4f5218d90fe3b100cd323a9b23dc850aca Mon Sep 17 00:00:00 2001 From: bboysoul Date: Sun, 6 Sep 2026 14:41:08 +0800 Subject: [PATCH] refactor: simplify dodo core experience --- Dockerfile | 1 - backend/main.py | 96 +----- backend/models.py | 26 -- backend/mvp.py | 301 +----------------- backend/schemas.py | 17 +- backend/static/assets/index-COed2nq9.js | 4 - backend/static/assets/index-Dhk-VG-k.css | 2 - backend/static/assets/index-DlZ9vwzJ.css | 2 + backend/static/assets/index-gRSfwY0T.js | 4 + backend/static/index.html | 4 +- docs/api.md | 17 +- docs/data-model.md | 20 +- docs/decisions.md | 5 +- docs/deploy.md | 7 +- frontend/src/App.vue | 126 ++------ frontend/src/MvpPanel.vue | 78 +---- frontend/src/lib/mvp-utils.test.ts | 16 +- frontend/src/lib/mvp-utils.ts | 15 + frontend/src/lib/task-utils.test.ts | 6 +- frontend/src/lib/task-utils.ts | 2 - frontend/src/style.css | 12 +- .../0008_remove_calendar_subscriptions.py | 32 ++ migrations/versions/0009_remove_tags.py | 41 +++ pyproject.toml | 2 - tests/test_app.py | 50 +-- tests/test_mvp_backend.py | 165 +--------- uv.lock | 71 ----- worker/__init__.py | 0 worker/main.py | 20 -- 29 files changed, 187 insertions(+), 955 deletions(-) delete mode 100644 backend/static/assets/index-COed2nq9.js delete mode 100644 backend/static/assets/index-Dhk-VG-k.css create mode 100644 backend/static/assets/index-DlZ9vwzJ.css create mode 100644 backend/static/assets/index-gRSfwY0T.js create mode 100644 migrations/versions/0008_remove_calendar_subscriptions.py create mode 100644 migrations/versions/0009_remove_tags.py delete mode 100644 worker/__init__.py delete mode 100644 worker/main.py diff --git a/Dockerfile b/Dockerfile index c107ce4..e4986e0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,6 @@ COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv COPY pyproject.toml uv.lock alembic.ini ./ RUN uv sync --frozen --no-dev COPY backend backend -COPY worker worker COPY migrations migrations COPY scripts scripts COPY --from=frontend /build/dist backend/static diff --git a/backend/main.py b/backend/main.py index 9c1ba9a..e29704d 100644 --- a/backend/main.py +++ b/backend/main.py @@ -26,7 +26,7 @@ from .auth import ( verify_password, ) from .db import create_schema, get_db -from .models import AppState, Folder, Session, Tag, Task, TaskList, TaskTag, User, utcnow +from .models import AppState, Folder, Session, Task, TaskList, User, utcnow from .mvp import audit from .mvp import router as mvp_router from .schemas import ( @@ -40,8 +40,6 @@ from .schemas import ( LoginRequest, NameUpdate, SessionOut, - TagCreate, - TagOut, TaskCreate, TaskDetailOut, TaskOut, @@ -186,15 +184,11 @@ async def bootstrap_data(user: User = Depends(current_user), db: AsyncSession = .where(TaskList.user_id == user.id, TaskList.deleted_at.is_(None)) .order_by(TaskList.is_inbox.desc(), TaskList.position, TaskList.created_at) )).all()) - tags = list((await db.scalars( - select(Tag).where(Tag.user_id == user.id).order_by(Tag.name, Tag.id) - )).all()) inbox = next((item for item in lists if item.is_inbox), None) return { "user": UserOut.model_validate(user), "folders": [FolderOut.model_validate(item) for item in folders], "lists": [ListOut.model_validate(item) for item in lists], - "tags": [TagOut.model_validate(item) for item in tags], "inbox_id": inbox.id if inbox else None, } @@ -420,51 +414,6 @@ async def restore_list( return item -@app.post("/api/v1/tags", response_model=TagOut, status_code=201) -async def create_tag( - payload: TagCreate, - user: User = Depends(current_user), - db: AsyncSession = Depends(get_db), -): - existing = await db.scalar( - select(Tag.id).where(Tag.user_id == user.id, func.lower(Tag.name) == payload.name.lower()) - ) - if existing: - raise HTTPException(status_code=409, detail="标签名称已存在") - tag = Tag(user_id=user.id, **payload.model_dump()) - db.add(tag) - await db.commit() - await db.refresh(tag) - return tag - - -@app.get("/api/v1/tags", response_model=list[TagOut]) -async def list_tags(user: User = Depends(current_user), db: AsyncSession = Depends(get_db)): - return list( - (await db.scalars(select(Tag).where(Tag.user_id == user.id).order_by(Tag.name, Tag.id))).all() - ) - - -async def _validate_tags( - db: AsyncSession, user_id: UUID, tag_ids: list[UUID] | None -) -> list[UUID] | None: - if tag_ids is None: - return None - unique_ids = list(dict.fromkeys(tag_ids)) - if not unique_ids: - return [] - found = set( - (await db.scalars(select(Tag.id).where(Tag.user_id == user_id, Tag.id.in_(unique_ids)))).all() - ) - if found != set(unique_ids): - raise HTTPException(status_code=404, detail="标签不存在") - return unique_ids - - -async def _replace_tags(db: AsyncSession, task_ids: list[UUID], tag_ids: list[UUID]) -> None: - await db.execute(delete(TaskTag).where(TaskTag.task_id.in_(task_ids))) - db.add_all(TaskTag(task_id=task_id, tag_id=tag_id) for task_id in task_ids for tag_id in tag_ids) - def _encode_cursor(created_at: datetime, task_id: UUID) -> str: raw = json.dumps([created_at.isoformat(), str(task_id)]).encode() @@ -487,7 +436,6 @@ async def create_task( db: AsyncSession = Depends(get_db), ): await _owned_list(db, user.id, payload.list_id) - tag_ids = await _validate_tags(db, user.id, payload.tag_ids) if payload.parent_id: parent = await db.scalar( select(Task).where( @@ -500,13 +448,11 @@ async def create_task( ) if parent is None: raise HTTPException(status_code=400, detail="父任务必须是同一清单的顶层任务") - data = payload.model_dump(exclude={"tag_ids"}) + data = payload.model_dump() task = Task(user_id=user.id, **data) db.add(task) await db.flush() audit(db, user.id, "create", "task", task.id) - if tag_ids: - db.add_all(TaskTag(task_id=task.id, tag_id=tag_id) for tag_id in tag_ids) await db.commit() await db.refresh(task) return task @@ -540,11 +486,6 @@ async def list_tasks( query = query.where(Task.due_at < due_to) if q: pattern = f"%{q}%" - tag_match = exists( - select(TaskTag.task_id) - .join(Tag, Tag.id == TaskTag.tag_id) - .where(TaskTag.task_id == Task.id, Tag.user_id == user.id, Tag.name.ilike(pattern)) - ) list_match = exists( select(TaskList.id).where( TaskList.id == Task.list_id, @@ -553,7 +494,7 @@ async def list_tasks( ) ) query = query.where( - or_(Task.title.ilike(pattern), Task.description.ilike(pattern), tag_match, list_match) + or_(Task.title.ilike(pattern), Task.description.ilike(pattern), list_match) ) total = await db.scalar(select(func.count()).select_from(query.order_by(None).subquery())) or 0 ordering = (Task.created_at, Task.id) @@ -577,14 +518,6 @@ async def _task_details(db: AsyncSession, tasks: list[Task]) -> list[TaskDetailO if not tasks: return [] task_ids = [task.id for task in tasks] - tag_rows = ( - await db.execute( - select(TaskTag.task_id, Tag) - .join(Tag, Tag.id == TaskTag.tag_id) - .where(TaskTag.task_id.in_(task_ids)) - .order_by(Tag.name, Tag.id) - ) - ).all() subtasks = list( ( await db.scalars( @@ -594,22 +527,17 @@ async def _task_details(db: AsyncSession, tasks: list[Task]) -> list[TaskDetailO ) ).all() ) - tags_by_task: dict[UUID, list[Tag]] = defaultdict(list) subtasks_by_task: dict[UUID, list[Task]] = defaultdict(list) - for task_id, tag in tag_rows: - tags_by_task[task_id].append(tag) for subtask in subtasks: subtasks_by_task[subtask.parent_id].append(subtask) return [ TaskDetailOut( **TaskOut.model_validate(task).model_dump(), - tags=tags_by_task[task.id], subtasks=subtasks_by_task[task.id], ) for task in tasks ] - async def _task_detail(db: AsyncSession, task: Task) -> TaskDetailOut: return (await _task_details(db, [task]))[0] @@ -637,7 +565,6 @@ async def update_task( ): data = payload.model_dump(exclude_unset=True) expected_version = data.pop("version") - tag_ids = await _validate_tags(db, user.id, data.pop("tag_ids", None)) if "list_id" in data: await _owned_list(db, user.id, data["list_id"]) parent_id = await db.scalar( @@ -670,8 +597,6 @@ async def update_task( if exists_id: raise HTTPException(status_code=409, detail="任务已被更新,请刷新后重试") raise HTTPException(status_code=404, detail="任务不存在") - if tag_ids is not None: - await _replace_tags(db, [task_id], tag_ids) if "list_id" in data and task.parent_id is None: await db.execute( update(Task) @@ -773,16 +698,6 @@ async def permanently_delete_task( ) if task is None: raise HTTPException(status_code=404, detail="回收站中不存在该任务") - ids = list( - ( - await db.scalars( - select(Task.id).where( - or_(Task.id == task.id, Task.parent_id == task.id), Task.user_id == user.id - ) - ) - ).all() - ) - await db.execute(delete(TaskTag).where(TaskTag.task_id.in_(ids))) await db.execute(delete(Task).where(Task.parent_id == task.id, Task.user_id == user.id)) await db.delete(task) await db.commit() @@ -812,8 +727,7 @@ async def batch_update_tasks( standalone_children = [task for task in tasks if task.parent_id is not None] if standalone_children: raise HTTPException(status_code=400, detail="子任务不能脱离父任务单独移动") - tag_ids = await _validate_tags(db, user.id, payload.tag_ids) - changes = payload.model_dump(exclude_unset=True, exclude={"task_ids", "tag_ids", "soft_delete"}) + changes = payload.model_dump(exclude_unset=True, exclude={"task_ids", "soft_delete"}) if payload.soft_delete: changes["deleted_at"] = utcnow() if changes: @@ -856,8 +770,6 @@ async def batch_update_tasks( updated_at=utcnow(), ) ) - if tag_ids is not None: - await _replace_tags(db, task_ids, tag_ids) await db.commit() return BatchResult(updated=len(task_ids)) diff --git a/backend/models.py b/backend/models.py index 7ce95eb..4000a56 100644 --- a/backend/models.py +++ b/backend/models.py @@ -77,21 +77,6 @@ class TaskList(Base): deleted_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) -class Tag(Base): - __tablename__ = "tags" - __table_args__ = (UniqueConstraint("user_id", "name", name="uq_tags_user_id_name"),) - id: Mapped[UUID] = mapped_column(primary_key=True, default=new_id) - user_id: Mapped[UUID] = mapped_column(ForeignKey("users.id", ondelete="CASCADE"), index=True) - name: Mapped[str] = mapped_column(String(80)) - color: Mapped[str] = mapped_column(String(32), default="#f15a29") - created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=utcnow) - - -class TaskTag(Base): - __tablename__ = "task_tags" - task_id: Mapped[UUID] = mapped_column(ForeignKey("tasks.id", ondelete="CASCADE"), primary_key=True) - tag_id: Mapped[UUID] = mapped_column(ForeignKey("tags.id", ondelete="CASCADE"), primary_key=True) - class Task(Base): __tablename__ = "tasks" @@ -188,17 +173,6 @@ class Attachment(Base): created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=utcnow) -class CalendarSubscription(Base): - __tablename__ = "calendar_subscriptions" - id: Mapped[UUID] = mapped_column(primary_key=True, default=new_id) - user_id: Mapped[UUID] = mapped_column(ForeignKey("users.id", ondelete="CASCADE"), index=True) - name: Mapped[str] = mapped_column(String(120)) - url: Mapped[str] = mapped_column(Text) - color: Mapped[str] = mapped_column(String(32), default="#f15a29") - enabled: Mapped[bool] = mapped_column(Boolean, default=True) - created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=utcnow) - - class AuditLog(Base): __tablename__ = "audit_logs" id: Mapped[UUID] = mapped_column(primary_key=True, default=new_id) diff --git a/backend/mvp.py b/backend/mvp.py index 8fe0610..3b52046 100644 --- a/backend/mvp.py +++ b/backend/mvp.py @@ -1,21 +1,12 @@ -import asyncio import csv -import http.client import io -import ipaddress import re -import socket -import ssl -import urllib.parse from datetime import UTC, date, datetime, time, timedelta from pathlib import Path from uuid import UUID -from zoneinfo import ZoneInfo -from dateutil.rrule import rrulestr from fastapi import APIRouter, Depends, File, HTTPException, Query, Response, UploadFile from fastapi.responses import FileResponse -from icalendar import Calendar from pydantic import BaseModel, Field, model_validator from sqlalchemy import case, delete, func, select, update from sqlalchemy.ext.asyncio import AsyncSession @@ -26,17 +17,14 @@ from .db import get_db from .models import ( Attachment, AuditLog, - CalendarSubscription, Folder, Habit, HabitLog, HabitPause, RecurrenceException, RecurrenceTemplate, - Tag, Task, TaskList, - TaskTag, User, new_id, utcnow, @@ -262,265 +250,6 @@ async def delete_recurrence(recurrence_id: UUID, scope: str = Query("all", patte await db.commit(); return Response(status_code=204) -class CalendarSubscriptionCreate(BaseModel): - name: str = Field(min_length=1, max_length=120) - url: str = Field(min_length=1, max_length=2000) - color: str = Field(default="#f15a29", min_length=1, max_length=32) - - -def calendar_subscription_dict(row: CalendarSubscription): - return {"id": row.id, "name": row.name, "url": row.url, "color": row.color, "enabled": row.enabled} - - -LOCAL_TZ = ZoneInfo("Asia/Shanghai") - - -def _is_forbidden_ip(value: str) -> bool: - ip = ipaddress.ip_address(value) - return ip.is_private or ip.is_loopback or ip.is_link_local or ip.is_multicast or ip.is_reserved - - -def _localized_ics_datetime(value, default_tz=LOCAL_TZ): - if isinstance(value, datetime): - return value if value.tzinfo else value.replace(tzinfo=default_tz), False - if isinstance(value, date): - return datetime.combine(value, time.min, tzinfo=default_tz), True - raise ValueError("unsupported ICS datetime") - - -def _as_utc(value, default_tz=LOCAL_TZ): - localized, all_day = _localized_ics_datetime(value, default_tz) - return localized.astimezone(UTC), all_day - - -def _event_duration(event, starts_at: datetime, all_day: bool): - if event.get("dtend"): - ends_at, _ = _as_utc(event.decoded("dtend")) - return max(ends_at - starts_at, timedelta()) - if event.get("duration"): - return event.decoded("duration") - return timedelta(days=1) if all_day else timedelta(hours=1) - - -def _excluded_starts(event): - excluded = set() - exdates = event.get("exdate") - if not exdates: - return excluded - if not isinstance(exdates, list): - exdates = [exdates] - for exdate in exdates: - for item in getattr(exdate, "dts", []): - excluded.add(_as_utc(item.dt)[0]) - return excluded - - -def _append_calendar_event(events, source_name, color, event, starts_at, ends_at, all_day): - uid = str(event.get("uid") or "") - title = str(event.get("summary") or "未命名事件").strip() or "未命名事件" - events.append({ - "id": uid or f"{source_name}-{starts_at.isoformat()}-{title}", - "title": title, - "starts_at": starts_at, - "ends_at": ends_at, - "all_day": all_day, - "source_name": source_name, - "color": color, - }) - - -def _overlaps(starts_at: datetime, ends_at: datetime | None, window_start: datetime | None, window_end: datetime | None) -> bool: - if not window_start or not window_end: - return True - return starts_at < window_end and (ends_at or starts_at) > window_start - - -def parse_ics_events(content: str, source_name: str, color: str, window_start: datetime | None = None, window_end: datetime | None = None): - calendar = Calendar.from_ical(content) - components = list(calendar.walk("VEVENT")) - overrides = {} - for event in components: - recurrence_id = event.get("recurrence-id") - if recurrence_id: - overrides[(str(event.get("uid") or ""), _as_utc(event.decoded("recurrence-id"))[0])] = event - - events = [] - for event in components: - if not event.get("dtstart") or event.get("recurrence-id") or str(event.get("status") or "").upper() == "CANCELLED": - continue - localized_start, all_day = _localized_ics_datetime(event.decoded("dtstart")) - starts_at = localized_start.astimezone(UTC) - duration = _event_duration(event, starts_at, all_day) - excluded = _excluded_starts(event) - uid = str(event.get("uid") or "") - if event.get("rrule") and window_start and window_end: - rule_text = event.get("rrule").to_ical().decode() - rule = rrulestr(rule_text, dtstart=localized_start) - for occurrence in rule.between(window_start - duration, window_end, inc=True): - occurrence = occurrence.astimezone(UTC) if occurrence.tzinfo else occurrence.replace(tzinfo=LOCAL_TZ).astimezone(UTC) - if occurrence in excluded or (uid, occurrence) in overrides: - continue - ends_at = occurrence + duration - if _overlaps(occurrence, ends_at, window_start, window_end): - _append_calendar_event(events, source_name, color, event, occurrence, ends_at, all_day) - continue - ends_at = starts_at + duration - if _overlaps(starts_at, ends_at, window_start, window_end): - _append_calendar_event(events, source_name, color, event, starts_at, ends_at, all_day) - - for event in overrides.values(): - if not event.get("dtstart") or str(event.get("status") or "").upper() == "CANCELLED": - continue - starts_at, all_day = _as_utc(event.decoded("dtstart")) - duration = _event_duration(event, starts_at, all_day) - ends_at = starts_at + duration - if _overlaps(starts_at, ends_at, window_start, window_end): - _append_calendar_event(events, source_name, color, event, starts_at, ends_at, all_day) - - return events - - -def _validated_calendar_target(url: str): - parsed = urllib.parse.urlparse(url) - if parsed.scheme not in {"http", "https"} or not parsed.hostname: - raise HTTPException(422, "日历订阅只支持 http/https 链接") - if parsed.username or parsed.password: - raise HTTPException(422, "日历订阅链接不能包含账号密码") - port = parsed.port or (443 if parsed.scheme == "https" else 80) - try: - addresses = socket.getaddrinfo(parsed.hostname, port, type=socket.SOCK_STREAM) - except socket.gaierror as exc: - raise HTTPException(422, "日历订阅域名无法解析") from exc - for item in addresses: - ip = item[4][0] - if not _is_forbidden_ip(ip): - return parsed, ip, port - raise HTTPException(422, "日历订阅不能指向内网地址") - - -def _validate_public_calendar_url(url: str): - _validated_calendar_target(url) - - -def _request_pinned_calendar_url(url: str): - parsed, ip, port = _validated_calendar_target(url) - target_host = f"[{ip}]" if ":" in ip else ip - path = urllib.parse.urlunparse(("", "", parsed.path or "/", parsed.params, parsed.query, "")) - headers = {"Host": parsed.hostname or "", "User-Agent": "dodo-calendar-fetch/1.0"} - if parsed.port: - headers["Host"] = f"{headers['Host']}:{parsed.port}" - if parsed.scheme == "https": - connection = http.client.HTTPSConnection(target_host, port=port, timeout=15, context=ssl.create_default_context()) - else: - connection = http.client.HTTPConnection(target_host, port=port, timeout=15) - try: - if parsed.scheme == "https": - raw = socket.create_connection((ip, port), timeout=15) - sock = ssl.create_default_context().wrap_socket(raw, server_hostname=parsed.hostname) - connection.sock = sock - connection.request("GET", path, headers=headers) - response = connection.getresponse() - body = response.read(2_000_001) - return response.status, response.getheaders(), response.getheader("Content-Type") or "", body - except OSError as exc: - raise HTTPException(502, f"订阅拉取失败: {exc}") from exc - finally: - connection.close() - - -_CAL_CACHE: dict[str, tuple[float, list[dict]]] = {} -_CAL_CACHE_TTL = 300.0 - - -def fetch_calendar_events(url: str, source_name: str, color: str, window_start: datetime | None = None, window_end: datetime | None = None): - cache_key = f"{source_name}|{url}|{window_start.isoformat() if window_start else ''}|{window_end.isoformat() if window_end else ''}" - now = datetime.now(UTC).timestamp() - hit = _CAL_CACHE.get(cache_key) - if hit and now - hit[0] < _CAL_CACHE_TTL: - return [dict(item) for item in hit[1]] - current_url = url - for _ in range(4): - status, headers, content_type, body = _request_pinned_calendar_url(current_url) - if status in {301, 302, 303, 307, 308}: - location = dict(headers).get("Location") - if not location: - raise HTTPException(502, "订阅重定向缺少目标地址") - current_url = urllib.parse.urljoin(current_url, location) - continue - if status >= 400: - raise HTTPException(502, f"订阅拉取失败: HTTP {status}") - if content_type.split(";", 1)[0].lower() not in {"text/calendar", "text/plain", "application/octet-stream"}: - raise HTTPException(422, "订阅链接没有返回 ICS 日历内容") - if len(body) > 2_000_000: - raise HTTPException(413, "日历订阅内容超过 2MB") - parsed = parse_ics_events(body.decode("utf-8", errors="ignore"), source_name, color, window_start, window_end) - if len(_CAL_CACHE) >= 64: - _CAL_CACHE.clear() - _CAL_CACHE[cache_key] = (now, parsed) - return [dict(item) for item in parsed] - raise HTTPException(502, "日历订阅重定向次数过多") - - -@router.get("/calendar-subscriptions") -async def list_calendar_subscriptions(user: User = Depends(current_user), db: AsyncSession = Depends(get_db)): - rows = (await db.scalars(select(CalendarSubscription).where(CalendarSubscription.user_id == user.id).order_by(CalendarSubscription.created_at))).all() - return [calendar_subscription_dict(row) for row in rows] - - -@router.post("/calendar-subscriptions", status_code=201) -async def create_calendar_subscription(payload: CalendarSubscriptionCreate, user: User = Depends(current_user), db: AsyncSession = Depends(get_db)): - _validate_public_calendar_url(payload.url) - row = CalendarSubscription(user_id=user.id, **payload.model_dump()) - db.add(row) - await db.commit() - await db.refresh(row) - return calendar_subscription_dict(row) - - -@router.get("/calendar-subscriptions/today") -async def today_calendar_events( - day: date, - user: User = Depends(current_user), - db: AsyncSession = Depends(get_db), -): - rows = list((await db.scalars(select(CalendarSubscription).where(CalendarSubscription.user_id == user.id, CalendarSubscription.enabled.is_(True)).order_by(CalendarSubscription.created_at))).all()) - if not rows: - return [] - tomorrow = day + timedelta(days=1) - day_start = datetime.combine(day, time.min, tzinfo=LOCAL_TZ).astimezone(UTC) - day_end = datetime.combine(tomorrow, time.min, tzinfo=LOCAL_TZ).astimezone(UTC) - - async def pull(row: CalendarSubscription): - return await asyncio.to_thread(fetch_calendar_events, row.url, row.name, row.color, day_start, day_end) - - results = await asyncio.gather(*(pull(row) for row in rows), return_exceptions=True) - events = [] - for row, result in zip(rows, results, strict=True): - if isinstance(result, Exception): - continue - for item in result: - events.append({ - "id": item["id"], - "title": item["title"], - "starts_at": item["starts_at"].isoformat(), - "ends_at": item["ends_at"].isoformat() if item.get("ends_at") else None, - "all_day": item["all_day"], - "source_name": row.name, - "color": row.color, - }) - events.sort(key=lambda item: (item["all_day"] is False, item["starts_at"], item["title"])) - return events - - -@router.delete("/calendar-subscriptions/{subscription_id}", status_code=204) -async def delete_calendar_subscription(subscription_id: UUID, user: User = Depends(current_user), db: AsyncSession = Depends(get_db)): - row = await db.scalar(select(CalendarSubscription).where(CalendarSubscription.id == subscription_id, CalendarSubscription.user_id == user.id)) - if not row: - raise HTTPException(404, "日历订阅不存在") - await db.delete(row) - await db.commit() - return Response(status_code=204) - class HabitCreate(BaseModel): name: str = Field(min_length=1, max_length=200) @@ -763,25 +492,13 @@ async def import_ticktick(file: UploadFile = File(...), user: User = Depends(cur async def export_json(user: User = Depends(current_user), db: AsyncSession = Depends(get_db)): def serialize(row, fields): return {f: (str(v) if isinstance((v := getattr(row, f)), UUID) else v.isoformat() if isinstance(v, (date, datetime)) else v) for f in fields} - folders = list((await db.scalars(select(Folder).where(Folder.user_id == user.id))).all()); lists = list((await db.scalars(select(TaskList).where(TaskList.user_id == user.id))).all()); tags = list((await db.scalars(select(Tag).where(Tag.user_id == user.id))).all()); tasks = list((await db.scalars(select(Task).where(Task.user_id == user.id))).all()); habits = list((await db.scalars(select(Habit).where(Habit.user_id == user.id))).all()) - task_tags = [ - {"task_id": str(x.task_id), "tag_id": str(x.tag_id)} - for x in ( - await db.scalars( - select(TaskTag) - .join(Task, Task.id == TaskTag.task_id) - .where(Task.user_id == user.id) - ) - ).all() - ] + folders = list((await db.scalars(select(Folder).where(Folder.user_id == user.id))).all()); lists = list((await db.scalars(select(TaskList).where(TaskList.user_id == user.id))).all()); tasks = list((await db.scalars(select(Task).where(Task.user_id == user.id))).all()); habits = list((await db.scalars(select(Habit).where(Habit.user_id == user.id))).all()) return { "version": 1, "exported_at": utcnow(), "folders": [serialize(x, ["id", "name", "position", "deleted_at"]) for x in folders], "lists": [serialize(x, ["id", "folder_id", "name", "is_inbox", "position", "deleted_at"]) for x in lists], - "tags": [serialize(x, ["id", "name", "color"]) for x in tags], "tasks": [serialize(x, ["id", "list_id", "parent_id", "title", "description", "priority", "completed", "due_at", "external_id", "deleted_at"]) for x in tasks], - "task_tags": task_tags, "habits": [serialize(x, ["id", "name", "kind", "target", "max_value", "schedule_type", "weekdays", "month_days", "interval_days", "start_date", "archived_at"]) for x in habits], } @@ -791,15 +508,12 @@ async def restore_json(payload: dict, mode: str = Query("merge", pattern="^(merg if payload.get("version") != 1: raise HTTPException(422, "不支持的备份版本") if mode == "replace": - await db.execute(delete(TaskTag).where(TaskTag.task_id.in_(select(Task.id).where(Task.user_id == user.id)))) await db.execute(delete(Task).where(Task.user_id == user.id)) - await db.execute(delete(Tag).where(Tag.user_id == user.id)) await db.execute(delete(Habit).where(Habit.user_id == user.id)) await db.execute(delete(TaskList).where(TaskList.user_id == user.id)) await db.execute(delete(Folder).where(Folder.user_id == user.id)) id_map = {} task_id_map = {} - tag_id_map = {} for raw in payload.get("folders", []): old = raw["id"] row = Folder(user_id=user.id, name=raw["name"], position=raw.get("position", 0)) @@ -824,11 +538,6 @@ async def restore_json(payload: dict, mode: str = Query("merge", pattern="^(merg inbox = TaskList(user_id=user.id, name="收集箱", is_inbox=True) db.add(inbox) await db.flush() - for raw in payload.get("tags", []): - row = Tag(user_id=user.id, name=raw["name"], color=raw.get("color", "#f15a29")) - db.add(row) - await db.flush() - tag_id_map[raw["id"]] = row.id restored = 0 pending_tasks = [] for raw in payload.get("tasks", []): @@ -855,14 +564,6 @@ async def restore_json(payload: dict, mode: str = Query("merge", pattern="^(merg for task_id, old_parent_id in pending_tasks: if old_parent_id and old_parent_id in task_id_map: await db.execute(update(Task).where(Task.id == task_id, Task.user_id == user.id).values(parent_id=task_id_map[old_parent_id])) - task_tag_rows = [] - for raw in payload.get("task_tags", []): - task_id = task_id_map.get(raw.get("task_id")) - tag_id = tag_id_map.get(raw.get("tag_id")) - if task_id and tag_id: - task_tag_rows.append(TaskTag(task_id=task_id, tag_id=tag_id)) - if task_tag_rows: - db.add_all(task_tag_rows) for raw in payload.get("habits", []): row = Habit( user_id=user.id, diff --git a/backend/schemas.py b/backend/schemas.py index 463e010..75b40a3 100644 --- a/backend/schemas.py +++ b/backend/schemas.py @@ -58,17 +58,6 @@ class ListOut(BaseModel): is_inbox: bool -class TagCreate(BaseModel): - name: str = Field(min_length=1, max_length=80) - color: str = Field(default="#f15a29", min_length=1, max_length=32) - - -class TagOut(BaseModel): - model_config = ConfigDict(from_attributes=True) - id: UUID - name: str - color: str - class TaskCreate(BaseModel): title: str = Field(min_length=1, max_length=500) @@ -77,7 +66,6 @@ class TaskCreate(BaseModel): priority: int = Field(default=0, ge=0, le=3) due_at: datetime | None = None parent_id: UUID | None = None - tag_ids: list[UUID] = Field(default_factory=list) class TaskUpdate(BaseModel): @@ -87,7 +75,6 @@ class TaskUpdate(BaseModel): due_at: datetime | None = None completed: bool | None = None list_id: UUID | None = None - tag_ids: list[UUID] | None = None version: int = Field(ge=1) @model_validator(mode="after") @@ -112,7 +99,6 @@ class TaskOut(BaseModel): class TaskDetailOut(TaskOut): - tags: list[TagOut] = Field(default_factory=list) subtasks: list[TaskOut] = Field(default_factory=list) @@ -129,12 +115,11 @@ class BatchTaskUpdate(BaseModel): completed: bool | None = None list_id: UUID | None = None due_at: datetime | None = None - tag_ids: list[UUID] | None = None soft_delete: bool | None = None @model_validator(mode="after") def require_operation(self): - operations = {"completed", "list_id", "due_at", "tag_ids", "soft_delete"} + operations = {"completed", "list_id", "due_at", "soft_delete"} if not self.model_fields_set.intersection(operations): raise ValueError("at least one batch operation is required") if self.soft_delete is False: diff --git a/backend/static/assets/index-COed2nq9.js b/backend/static/assets/index-COed2nq9.js deleted file mode 100644 index 6b7621c..0000000 --- a/backend/static/assets/index-COed2nq9.js +++ /dev/null @@ -1,4 +0,0 @@ -(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();function e(e){let t=Object.create(null);for(let n of e.split(`,`))t[n]=1;return e=>e in t}var t={},n=[],r=()=>{},i=()=>!1,a=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),o=e=>e.startsWith(`onUpdate:`),s=Object.assign,c=(e,t)=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)},l=Object.prototype.hasOwnProperty,u=(e,t)=>l.call(e,t),d=Array.isArray,f=e=>x(e)===`[object Map]`,p=e=>x(e)===`[object Set]`,m=e=>x(e)===`[object Date]`,h=e=>typeof e==`function`,g=e=>typeof e==`string`,_=e=>typeof e==`symbol`,v=e=>typeof e==`object`&&!!e,y=e=>(v(e)||h(e))&&h(e.then)&&h(e.catch),b=Object.prototype.toString,x=e=>b.call(e),S=e=>x(e).slice(8,-1),C=e=>x(e)===`[object Object]`,w=e=>g(e)&&e!==`NaN`&&e[0]!==`-`&&``+parseInt(e,10)===e,T=e(`,key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted`),ee=e=>{let t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},te=/-\w/g,E=ee(e=>e.replace(te,e=>e.slice(1).toUpperCase())),ne=/\B([A-Z])/g,D=ee(e=>e.replace(ne,`-$1`).toLowerCase()),O=ee(e=>e.charAt(0).toUpperCase()+e.slice(1)),re=ee(e=>e?`on${O(e)}`:``),k=(e,t)=>!Object.is(e,t),A=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},ie=e=>{let t=parseFloat(e);return isNaN(t)?e:t},ae=e=>{let t=g(e)?Number(e):NaN;return isNaN(t)?e:t},oe,se=()=>oe||=typeof globalThis<`u`?globalThis:typeof self<`u`?self:typeof window<`u`?window:typeof global<`u`?global:{};function ce(e){if(d(e)){let t={};for(let n=0;n{if(e){let n=e.split(ue);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function M(e){let t=``;if(g(e))t=e;else if(d(e))for(let n=0;nve(e,t))}var be=e=>!!(e&&e.__v_isRef===!0),N=e=>g(e)?e:e==null?``:d(e)||v(e)&&(e.toString===b||!h(e.toString))?be(e)?N(e.value):JSON.stringify(e,P,2):String(e),P=(e,t)=>be(t)?P(e,t.value):f(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((e,[t,n],r)=>(e[F(t,r)+` =>`]=n,e),{})}:p(t)?{[`Set(${t.size})`]:[...t.values()].map(e=>F(e))}:_(t)?F(t):v(t)&&!d(t)&&!C(t)?String(t):t,F=(e,t=``)=>_(e)?`Symbol(${e.description??t})`:e,I,xe=class{constructor(e=!1){this.detached=e,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!e&&I&&(I.active?(this.parent=I,this.index=(I.scopes||(I.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let e,t;if(this.scopes){let n=this.scopes.slice();for(e=0,t=n.length;e0&&--this._on===0){if(I===this)I=this.prevScope;else{let e=I;for(;e;){if(e.prevScope===this){e.prevScope=this.prevScope;break}e=e.prevScope}}this.prevScope=void 0}}stop(e){if(this._active){this._active=!1;let t,n;for(t=0,n=this.effects.length;t0)return;if(De){let e=De;for(De=void 0;e;){let t=e.next;e.next=void 0,e.flags&=-9,e=t}}let e;for(;Ee;){let t=Ee;for(Ee=void 0;t;){let n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(t){e||=t}t=n}}if(e)throw e}function Ae(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function je(e){let t,n=e.depsTail,r=n;for(;r;){let e=r.prevDep;r.version===-1?(r===n&&(n=e),Pe(r),Fe(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=e}e.deps=t,e.depsTail=n}function Me(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Ne(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Ne(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Be)||(e.globalVersion=Be,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Me(e))))return;e.flags|=2;let t=e.dep,n=L,r=Ie;L=e,Ie=!0;try{Ae(e);let n=e.fn(e._value);(t.version===0||k(n,e._value))&&(e.flags|=128,e._value=n,t.version++)}catch(e){throw t.version++,e}finally{L=n,Ie=r,je(e),e.flags&=-3}}function Pe(e,t=!1){let{dep:n,prevSub:r,nextSub:i}=e;if(r&&(r.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let e=n.computed.deps;e;e=e.nextDep)Pe(e,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Fe(e){let{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}var Ie=!0,Le=[];function Re(){Le.push(Ie),Ie=!1}function z(){let e=Le.pop();Ie=e===void 0||e}function ze(e){let{cleanup:t}=e;if(e.cleanup=void 0,t){let e=L;L=void 0;try{t()}finally{L=e}}}var Be=0,Ve=class{constructor(e,t){this.sub=e,this.dep=t,this.version=t.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}},He=class{constructor(e){this.computed=e,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(e){if(!L||!Ie||L===this.computed)return;let t=this.activeLink;if(t===void 0||t.sub!==L)t=this.activeLink=new Ve(L,this),L.deps?(t.prevDep=L.depsTail,L.depsTail.nextDep=t,L.depsTail=t):L.deps=L.depsTail=t,Ue(t);else if(t.version===-1&&(t.version=this.version,t.nextDep)){let e=t.nextDep;e.prevDep=t.prevDep,t.prevDep&&(t.prevDep.nextDep=e),t.prevDep=L.depsTail,t.nextDep=void 0,L.depsTail.nextDep=t,L.depsTail=t,L.deps===t&&(L.deps=e)}return t}trigger(e){this.version++,Be++,this.notify(e)}notify(e){R();try{for(let e=this.subs;e;e=e.prevSub)e.sub.notify()&&e.sub.dep.notify()}finally{ke()}}};function Ue(e){if(e.dep.sc++,e.sub.flags&4){let t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let e=t.deps;e;e=e.nextDep)Ue(e)}let n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}var We=new WeakMap,Ge=Symbol(``),Ke=Symbol(``),qe=Symbol(``);function B(e,t,n){if(Ie&&L){let t=We.get(e);t||We.set(e,t=new Map);let r=t.get(n);r||(t.set(n,r=new He),r.map=t,r.key=n),r.track()}}function Je(e,t,n,r,i,a){let o=We.get(e);if(!o){Be++;return}let s=e=>{e&&e.trigger()};if(R(),t===`clear`)o.forEach(s);else{let i=d(e),a=i&&w(n);if(i&&n===`length`){let e=Number(r);o.forEach((t,n)=>{(n===`length`||n===qe||!_(n)&&n>=e)&&s(t)})}else switch((n!==void 0||o.has(void 0))&&s(o.get(n)),a&&s(o.get(qe)),t){case`add`:i?a&&s(o.get(`length`)):(s(o.get(Ge)),f(e)&&s(o.get(Ke)));break;case`delete`:i||(s(o.get(Ge)),f(e)&&s(o.get(Ke)));break;case`set`:f(e)&&s(o.get(Ge))}}ke()}function Ye(e){let t=V(e);return t===e?t:(B(t,`iterate`,qe),Pt(e)?t:t.map(Lt))}function Xe(e){return B(e=V(e),`iterate`,qe),e}function Ze(e,t){return Nt(e)?Rt(Mt(e)?Lt(t):t):Lt(t)}var Qe={__proto__:null,[Symbol.iterator](){return $e(this,Symbol.iterator,e=>Ze(this,e))},concat(...e){return Ye(this).concat(...e.map(e=>d(e)?Ye(e):e))},entries(){return $e(this,`entries`,e=>(e[1]=Ze(this,e[1]),e))},every(e,t){return tt(this,`every`,e,t,void 0,arguments)},filter(e,t){return tt(this,`filter`,e,t,e=>e.map(e=>Ze(this,e)),arguments)},find(e,t){return tt(this,`find`,e,t,e=>Ze(this,e),arguments)},findIndex(e,t){return tt(this,`findIndex`,e,t,void 0,arguments)},findLast(e,t){return tt(this,`findLast`,e,t,e=>Ze(this,e),arguments)},findLastIndex(e,t){return tt(this,`findLastIndex`,e,t,void 0,arguments)},forEach(e,t){return tt(this,`forEach`,e,t,void 0,arguments)},includes(...e){return rt(this,`includes`,e)},indexOf(...e){return rt(this,`indexOf`,e)},join(e){return Ye(this).join(e)},lastIndexOf(...e){return rt(this,`lastIndexOf`,e)},map(e,t){return tt(this,`map`,e,t,void 0,arguments)},pop(){return it(this,`pop`)},push(...e){return it(this,`push`,e)},reduce(e,...t){return nt(this,`reduce`,e,t)},reduceRight(e,...t){return nt(this,`reduceRight`,e,t)},shift(){return it(this,`shift`)},some(e,t){return tt(this,`some`,e,t,void 0,arguments)},splice(...e){return it(this,`splice`,e)},toReversed(){return Ye(this).toReversed()},toSorted(e){return Ye(this).toSorted(e)},toSpliced(...e){return Ye(this).toSpliced(...e)},unshift(...e){return it(this,`unshift`,e)},values(){return $e(this,`values`,e=>Ze(this,e))}};function $e(e,t,n){let r=Xe(e),i=r[t]();return r!==e&&!Pt(e)&&(i._next=i.next,i.next=()=>{let e=i._next();return e.done||(e.value=n(e.value)),e}),i}var et=Array.prototype;function tt(e,t,n,r,i,a){let o=Xe(e),s=o!==e&&!Pt(e),c=o[t];if(c!==et[t]){let t=c.apply(e,a);return s?Lt(t):t}let l=n;o!==e&&(s?l=function(t,r){return n.call(this,Ze(e,t),r,e)}:n.length>2&&(l=function(t,r){return n.call(this,t,r,e)}));let u=c.call(o,l,r);return s&&i?i(u):u}function nt(e,t,n,r){let i=Xe(e),a=i!==e&&!Pt(e),o=n,s=!1;i!==e&&(a?(s=r.length===0,o=function(t,r,i){return s&&(s=!1,t=Ze(e,t)),n.call(this,t,Ze(e,r),i,e)}):n.length>3&&(o=function(t,r,i){return n.call(this,t,r,i,e)}));let c=i[t](o,...r);return s?Ze(e,c):c}function rt(e,t,n){let r=V(e);B(r,`iterate`,qe);let i=r[t](...n);return(i===-1||i===!1)&&Ft(n[0])?(n[0]=V(n[0]),r[t](...n)):i}function it(e,t,n=[]){Re(),R();let r=V(e)[t].apply(e,n);return ke(),z(),r}var at=e(`__proto__,__v_isRef,__isVue`),ot=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!==`arguments`&&e!==`caller`).map(e=>Symbol[e]).filter(_));function st(e){_(e)||(e=String(e));let t=V(this);return B(t,`has`,e),t.hasOwnProperty(e)}var ct=class{constructor(e=!1,t=!1){this._isReadonly=e,this._isShallow=t}get(e,t,n){if(t===`__v_skip`)return e.__v_skip;let r=this._isReadonly,i=this._isShallow;if(t===`__v_isReactive`)return!r;if(t===`__v_isReadonly`)return r;if(t===`__v_isShallow`)return i;if(t===`__v_raw`)return n===(r?i?Et:Tt:i?wt:Ct).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;let a=d(e);if(!r){let e;if(a&&(e=Qe[t]))return e;if(t===`hasOwnProperty`)return st}let o=Reflect.get(e,t,zt(e)?e:n);if((_(t)?ot.has(t):at(t))||(r||B(e,`get`,t),i))return o;if(zt(o)){let e=a&&w(t)?o:o.value;return r&&v(e)?At(e):e}return v(o)?r?At(o):Ot(o):o}},lt=class extends ct{constructor(e=!1){super(!1,e)}set(e,t,n,r){let i=e[t],a=d(e)&&w(t);if(!this._isShallow){let e=Nt(i);if(!Pt(n)&&!Nt(n)&&(i=V(i),n=V(n)),!a&&zt(i)&&!zt(n))return e||(i.value=n),!0}let o=a?Number(t)e,ht=e=>Reflect.getPrototypeOf(e);function gt(e,t,n){return function(...r){let i=this.__v_raw,a=V(i),o=f(a),c=e===`entries`||e===Symbol.iterator&&o,l=e===`keys`&&o,u=i[e](...r),d=n?mt:t?Rt:Lt;return!t&&B(a,`iterate`,l?Ke:Ge),s(Object.create(u),{next(){let{value:e,done:t}=u.next();return t?{value:e,done:t}:{value:c?[d(e[0]),d(e[1])]:d(e),done:t}}})}}function _t(e){return function(...t){return e===`delete`?!1:e===`clear`?void 0:this}}function vt(e,t){let n={get(n){let r=this.__v_raw,i=V(r),a=V(n);e||(k(n,a)&&B(i,`get`,n),B(i,`get`,a));let{has:o}=ht(i),s=t?mt:e?Rt:Lt;if(o.call(i,n))return s(r.get(n));if(o.call(i,a))return s(r.get(a));r!==i&&r.get(n)},get size(){let t=this.__v_raw;return!e&&B(V(t),`iterate`,Ge),t.size},has(t){let n=this.__v_raw,r=V(n),i=V(t);return e||(k(t,i)&&B(r,`has`,t),B(r,`has`,i)),t===i?n.has(t):n.has(t)||n.has(i)},forEach(n,r){let i=this,a=i.__v_raw,o=V(a),s=t?mt:e?Rt:Lt;return!e&&B(o,`iterate`,Ge),a.forEach((e,t)=>n.call(r,s(e),s(t),i))}};return s(n,e?{add:_t(`add`),set:_t(`set`),delete:_t(`delete`),clear:_t(`clear`)}:{add(e){let n=V(this),r=ht(n),i=V(e),a=!t&&!Pt(e)&&!Nt(e)?i:e;return r.has.call(n,a)||k(e,a)&&r.has.call(n,e)||k(i,a)&&r.has.call(n,i)||(n.add(a),Je(n,`add`,a,a)),this},set(e,n){!t&&!Pt(n)&&!Nt(n)&&(n=V(n));let r=V(this),{has:i,get:a}=ht(r),o=i.call(r,e);o||=(e=V(e),i.call(r,e));let s=a.call(r,e);return r.set(e,n),o?k(n,s)&&Je(r,`set`,e,n,s):Je(r,`add`,e,n),this},delete(e){let t=V(this),{has:n,get:r}=ht(t),i=n.call(t,e);i||=(e=V(e),n.call(t,e));let a=r?r.call(t,e):void 0,o=t.delete(e);return i&&Je(t,`delete`,e,void 0,a),o},clear(){let e=V(this),t=e.size!==0,n=e.clear();return t&&Je(e,`clear`,void 0,void 0,void 0),n}}),[`keys`,`values`,`entries`,Symbol.iterator].forEach(r=>{n[r]=gt(r,e,t)}),n}function yt(e,t){let n=vt(e,t);return(t,r,i)=>r===`__v_isReactive`?!e:r===`__v_isReadonly`?e:r===`__v_raw`?t:Reflect.get(u(n,r)&&r in t?n:t,r,i)}var bt={get:yt(!1,!1)},xt={get:yt(!1,!0)},St={get:yt(!0,!1)},Ct=new WeakMap,wt=new WeakMap,Tt=new WeakMap,Et=new WeakMap;function Dt(e){switch(e){case`Object`:case`Array`:return 1;case`Map`:case`Set`:case`WeakMap`:case`WeakSet`:return 2;default:return 0}}function Ot(e){return Nt(e)?e:jt(e,!1,dt,bt,Ct)}function kt(e){return jt(e,!1,pt,xt,wt)}function At(e){return jt(e,!0,ft,St,Tt)}function jt(e,t,n,r,i){if(!v(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;let a=i.get(e);if(a)return a;let o=Dt(S(e));if(o===0)return e;let s=new Proxy(e,o===2?r:n);return i.set(e,s),s}function Mt(e){return Nt(e)?Mt(e.__v_raw):!!(e&&e.__v_isReactive)}function Nt(e){return!!(e&&e.__v_isReadonly)}function Pt(e){return!!(e&&e.__v_isShallow)}function Ft(e){return e?!!e.__v_raw:!1}function V(e){let t=e&&e.__v_raw;return t?V(t):e}function It(e){return!u(e,`__v_skip`)&&Object.isExtensible(e)&&j(e,`__v_skip`,!0),e}var Lt=e=>v(e)?Ot(e):e,Rt=e=>v(e)?At(e):e;function zt(e){return e?e.__v_isRef===!0:!1}function H(e){return Bt(e,!1)}function Bt(e,t){return zt(e)?e:new Vt(e,t)}var Vt=class{constructor(e,t){this.dep=new He,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=t?e:V(e),this._value=t?e:Lt(e),this.__v_isShallow=t}get value(){return this.dep.track(),this._value}set value(e){let t=this._rawValue,n=this.__v_isShallow||Pt(e)||Nt(e);e=n?e:V(e),k(e,t)&&(this._rawValue=e,this._value=n?e:Lt(e),this.dep.trigger())}};function U(e){return zt(e)?e.value:e}var Ht={get:(e,t,n)=>t===`__v_raw`?e:U(Reflect.get(e,t,n)),set:(e,t,n,r)=>{let i=e[t];return zt(i)&&!zt(n)?(i.value=n,!0):Reflect.set(e,t,n,r)}};function Ut(e){return Mt(e)?e:new Proxy(e,Ht)}var Wt=class{constructor(e,t,n){this.fn=e,this.setter=t,this._value=void 0,this.dep=new He(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Be-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!t,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&L!==this)return Oe(this,!0),!0}get value(){let e=this.dep.track();return Ne(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}};function Gt(e,t,n=!1){let r,i;return h(e)?r=e:(r=e.get,i=e.set),new Wt(r,i,n)}var Kt={},qt=new WeakMap,Jt=void 0;function Yt(e,t=!1,n=Jt){if(n){let t=qt.get(n);t||qt.set(n,t=[]),t.push(e)}}function Xt(e,n,i=t){let{immediate:a,deep:o,once:s,scheduler:l,augmentJob:u,call:f}=i,p=e=>o?e:Pt(e)||o===!1||o===0?Zt(e,1):Zt(e),m,g,_,v,y=!1,b=!1;if(zt(e)?(g=()=>e.value,y=Pt(e)):Mt(e)?(g=()=>p(e),y=!0):d(e)?(b=!0,y=e.some(e=>Mt(e)||Pt(e)),g=()=>e.map(e=>{if(zt(e))return e.value;if(Mt(e))return p(e);if(h(e))return f?f(e,2):e()})):g=h(e)?n?f?()=>f(e,2):e:()=>{if(_){Re();try{_()}finally{z()}}let t=Jt;Jt=m;try{return f?f(e,3,[v]):e(v)}finally{Jt=t}}:r,n&&o){let e=g,t=o===!0?1/0:o;g=()=>Zt(e(),t)}let x=Se(),S=()=>{m.stop(),x&&x.active&&c(x.effects,m)};if(s&&n){let e=n;n=(...t)=>{let n=e(...t);return S(),n}}let C=b?Array(e.length).fill(Kt):Kt,w=e=>{if(m.flags&1&&(m.dirty||e)){if(n){let t=m.run();if(e||o||y||(b?t.some((e,t)=>k(e,C[t])):k(t,C))){_&&_();let e=Jt;Jt=m;try{let e=[t,C===Kt?void 0:b&&C[0]===Kt?[]:C,v];C=t,f?f(n,3,e):n(...e)}finally{Jt=e}}}else m.run()}};return u&&u(w),m=new we(g),m.scheduler=l?()=>l(w,!1):w,v=e=>Yt(e,!1,m),_=m.onStop=()=>{let e=qt.get(m);if(e){if(f)f(e,4);else for(let t of e)t();qt.delete(m)}},n?a?w(!0):C=m.run():l?l(w.bind(null,!0),!0):m.run(),S.pause=m.pause.bind(m),S.resume=m.resume.bind(m),S.stop=S,S}function Zt(e,t=1/0,n){if(t<=0||!v(e)||e.__v_skip||(n||=new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,zt(e))Zt(e.value,t,n);else if(d(e))for(let r=0;r{Zt(e,t,n)});else if(C(e)){for(let r in e)Zt(e[r],t,n);for(let r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&Zt(e[r],t,n)}return e}function Qt(e,t,n,r){try{return r?e(...r):e()}catch(e){en(e,t,n)}}function $t(e,t,n,r){if(h(e)){let i=Qt(e,t,n,r);return i&&y(i)&&i.catch(e=>{en(e,t,n)}),i}if(d(e)){let i=[];for(let a=0;a>>1,i=nn[r],a=_n(i);a=_n(n)?nn.push(e):nn.splice(dn(t),0,e),e.flags|=1,pn()}}function pn(){ln||=cn.then(vn)}function mn(e){if(!d(e))on&&e.id===-1?on.splice(sn+1,0,e):e.flags&1||(an.push(e),e.flags|=1);else for(let t=0;t_n(e)-_n(t));if(an.length=0,on){for(let t=0;te.id==null?e.flags&2?-1:1/0:e.id;function vn(e){try{for(rn=0;rn{r._d&&Wi(-1);let i=xn(t),a=Bi.length,o;try{o=e(...n)}finally{for(let e=Bi.length;e>a;e--)Hi();xn(i),r._d&&Wi(1)}return o};return r._n=!0,r._c=!0,r._d=!0,r}function W(e,n){if(yn===null)return e;let r=Sa(yn),i=e.dirs||=[];for(let e=0;e1)return n&&h(t)?t.call(r&&r.proxy):t}}var En=Symbol.for(`v-scx`),Dn=()=>Tn(En);function On(e,t,n){return kn(e,t,n)}function kn(e,n,i=t){let{immediate:a,deep:o,flush:c,once:l}=i,u=s({},i),d=n&&a||!n&&c!==`post`,f;if(ha){if(c===`sync`){let e=Dn();f=e.__watcherHandles||=[]}else if(!d){let e=()=>{};return e.stop=r,e.resume=r,e.pause=r,e}}let p=ca;u.call=(e,t,n)=>$t(e,p,t,n);let m=!1;c===`post`?u.scheduler=e=>{wi(e,p&&p.suspense)}:c!==`sync`&&(m=!0,u.scheduler=(e,t)=>{t?e():fn(e)}),u.augmentJob=e=>{n&&(e.flags|=4),m&&(e.flags|=2,p&&(e.id=p.uid,e.i=p))};let h=Xt(e,n,u);return ha&&(f?f.push(h):d&&h()),h}function An(e,t,n){let r=this.proxy,i=g(e)?e.includes(`.`)?jn(r,e):()=>r[e]:e.bind(r,r),a;h(t)?a=t:(a=t.handler,n=t);let o=fa(this),s=kn(i,a.bind(r),n);return o(),s}function jn(e,t){let n=t.split(`.`);return()=>{let t=e;for(let e=0;ee.__isTeleport,Pn=Symbol(`_leaveCb`),Fn=Symbol(`_enterCb`);function In(){let e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return ur(()=>{e.isMounted=!0}),pr(()=>{e.isUnmounting=!0}),e}var Ln=[Function,Array],Rn={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Ln,onEnter:Ln,onAfterEnter:Ln,onEnterCancelled:Ln,onBeforeLeave:Ln,onLeave:Ln,onAfterLeave:Ln,onLeaveCancelled:Ln,onBeforeAppear:Ln,onAppear:Ln,onAfterAppear:Ln,onAppearCancelled:Ln},zn=e=>{let t=e.subTree;return t.component?zn(t.component):t},Bn={name:`BaseTransition`,props:Rn,setup(e,{slots:t}){let n=la(),r=In();return()=>{let i=t.default&&Jn(t.default(),!0),a=i&&i.length?Vn(i):n.subTree?Q():void 0;if(!a)return;let o=V(e),{mode:s}=o;if(r.isLeaving)return Gn(a);let c=Kn(a);if(!c)return Gn(a);let l=Wn(c,o,r,n,e=>l=e);c.type!==Ri&&qn(c,l);let u=n.subTree&&Kn(n.subTree);if(u&&u.type!==Ri&&!Ji(u,c)&&zn(n).type!==Ri){let e=Wn(u,o,r,n);if(qn(u,e),s===`out-in`&&c.type!==Ri)return r.isLeaving=!0,e.afterLeave=()=>{r.isLeaving=!1,n.job.flags&8||n.update(),delete e.afterLeave,u=void 0},Gn(a);s===`in-out`&&c.type!==Ri?e.delayLeave=(e,t,n)=>{let i=Un(r,u);i[String(u.key)]=u,e[Pn]=()=>{t(),e[Pn]=void 0,delete l.delayedLeave,u=void 0},l.delayedLeave=()=>{n(),delete l.delayedLeave,u=void 0}}:u=void 0}else u&&=void 0;return a}}};function Vn(e){let t=e[0];if(e.length>1){for(let n of e)if(n.type!==Ri){t=n;break}}return t}var Hn=Bn;function Un(e,t){let{leavingVNodes:n}=e,r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function Wn(e,t,n,r,i){let{appear:a,mode:o,persisted:s=!1,onBeforeEnter:c,onEnter:l,onAfterEnter:u,onEnterCancelled:f,onBeforeLeave:p,onLeave:m,onAfterLeave:h,onLeaveCancelled:g,onBeforeAppear:_,onAppear:v,onAfterAppear:y,onAppearCancelled:b}=t,x=String(e.key),S=Un(n,e),C=(e,t)=>{e&&$t(e,r,9,t)},w=(e,t)=>{let n=t[1];C(e,t),d(e)?e.every(e=>e.length<=1)&&n():e.length<=1&&n()},T={mode:o,persisted:s,beforeEnter(t){let r=c;if(!n.isMounted){if(a)r=_||c;else return}t[Pn]&&t[Pn](!0);let i=S[x];i&&Ji(e,i)&&i.el[Pn]&&i.el[Pn](),C(r,[t])},enter(t){if(S[x]===e)return;let r=l,i=u,o=f;if(!n.isMounted){if(a)r=v||l,i=y||u,o=b||f;else return}let s=!1;t[Fn]=e=>{s||(s=!0,C(e?o:i,[t]),T.delayedLeave&&T.delayedLeave(),t[Fn]=void 0)};let c=t[Fn].bind(null,!1);r?w(r,[t,c]):c()},leave(t,r){let i=String(e.key);if(t[Fn]&&t[Fn](!0),n.isUnmounting)return r();C(p,[t]);let a=!1;t[Pn]=n=>{a||(a=!0,r(),C(n?g:h,[t]),t[Pn]=void 0,S[i]===e&&delete S[i])};let o=t[Pn].bind(null,!1);S[i]=e,m?w(m,[t,o]):o()},clone(e){let a=Wn(e,t,n,r,i);return i&&i(a),a}};return T}function Gn(e){if(nr(e))return e=$i(e),e.children=null,e}function Kn(e){if(!nr(e))return Nn(e.type)&&e.children?Vn(e.children):e;if(e.component)return e.component.subTree;let{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&h(n.default))return n.default()}}function qn(e,t){if(e.shapeFlag&6&&e.component){e.transition=t;let n=e.component.subTree;qn(Nn(n.type)&&Kn(n)||n,t)}else e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Jn(e,t=!1,n){let r=[],i=0;for(let a=0;a1)for(let e=0;e$n(e,n&&(d(n)?n[t]:n),r,a,o));return}if(tr(a)&&!o){a.shapeFlag&512&&a.type.__asyncResolved&&a.component.subTree.component&&$n(e,n,r,a.component.subTree);return}let s=a.shapeFlag&4?Sa(a.component):a.el,l=o?null:s,{i:f,r:p}=e,m=n&&n.r,_=f.refs===t?f.refs={}:f.refs,v=f.setupState,y=V(v),b=v===t?i:e=>!Zn(_,e)&&u(y,e),x=(e,t)=>!(t&&Zn(_,t));if(m!=null&&m!==p){if(er(n),g(m))_[m]=null,b(m)&&(v[m]=null);else if(zt(m)){let e=n;x(m,e.k)&&(m.value=null),e.k&&(_[e.k]=null)}}if(h(p))Qt(p,f,12,[l,_]);else{let t=g(p),n=zt(p);if(t||n){let i=()=>{if(e.f){let n=t?b(p)?v[p]:_[p]:x(p)||!e.k?p.value:_[e.k];if(o)d(n)&&c(n,s);else if(d(n))n.includes(s)||n.push(s);else if(t)_[p]=[s],b(p)&&(v[p]=_[p]);else{let t=[s];x(p,e.k)&&(p.value=t),e.k&&(_[e.k]=t)}}else t?(_[p]=l,b(p)&&(v[p]=l)):n&&(x(p,e.k)&&(p.value=l),e.k&&(_[e.k]=l))};if(l){let t=()=>{i(),Qn.delete(e)};t.id=-1,Qn.set(e,t),wi(t,r)}else er(e),i()}}}function er(e){let t=Qn.get(e);t&&(t.flags|=8,Qn.delete(e))}se().requestIdleCallback,se().cancelIdleCallback;var tr=e=>!!e.type.__asyncLoader,nr=e=>e.type.__isKeepAlive;function rr(e,t){ar(e,`a`,t)}function ir(e,t){ar(e,`da`,t)}function ar(e,t,n=ca){let r=e.__wdc||=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()};if(sr(t,r,n),n){let e=n.parent;for(;e&&e.parent;)nr(e.parent.vnode)&&or(r,t,n,e),e=e.parent}}function or(e,t,n,r){let i=sr(t,e,r,!0);mr(()=>{c(r[t],i)},n)}function sr(e,t,n=ca,r=!1){if(n){let i=n[e]||(n[e]=[]),a=t.__weh||=(...r)=>{Re();let i=fa(n),a=$t(t,n,e,r);return i(),z(),a};return r?i.unshift(a):i.push(a),a}}var cr=e=>(t,n=ca)=>{(!ha||e===`sp`)&&sr(e,(...e)=>t(...e),n)},lr=cr(`bm`),ur=cr(`m`),dr=cr(`bu`),fr=cr(`u`),pr=cr(`bum`),mr=cr(`um`),hr=cr(`sp`),gr=cr(`rtg`),_r=cr(`rtc`);function vr(e,t=ca){sr(`ec`,e,t)}var yr=`components`;function br(e,t){return Sr(yr,e,!0,t)||e}var xr=Symbol.for(`v-ndc`);function Sr(e,t,n=!0,r=!1){let i=yn||ca;if(i){let n=i.type;if(e===yr){let e=Ca(n,!1);if(e&&(e===t||e===E(t)||e===O(E(t))))return n}let a=Cr(i[e]||n[e],t)||Cr(i.appContext[e],t);return!a&&r?n:a}}function Cr(e,t){return e&&(e[t]||e[E(t)]||e[O(E(t))])}function G(e,t,n,r){let i,a=n&&n[r],o=d(e);if(o||g(e)){let n=o&&Mt(e),r=!1,s=!1;n&&(r=!Pt(e),s=Nt(e),e=Xe(e)),i=Array(e.length);for(let n=0,o=e.length;nt(e,n,void 0,a&&a[n]));else{let n=Object.keys(e);i=Array(n.length);for(let r=0,o=n.length;re?ma(e)?Sa(e):wr(e.parent):null,Tr=s(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>wr(e.parent),$root:e=>wr(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Pr(e),$forceUpdate:e=>e.f||=()=>{fn(e.update)},$nextTick:e=>e.n||=un.bind(e.proxy),$watch:e=>An.bind(e)}),Er=(e,n)=>e!==t&&!e.__isScriptSetup&&u(e,n),Dr={get({_:e},n){if(n===`__v_skip`)return!0;let{ctx:r,setupState:i,data:a,props:o,accessCache:s,type:c,appContext:l}=e;if(n[0]!==`$`){let e=s[n];if(e!==void 0)switch(e){case 1:return i[n];case 2:return a[n];case 4:return r[n];case 3:return o[n]}else if(Er(i,n))return s[n]=1,i[n];else if(a!==t&&u(a,n))return s[n]=2,a[n];else if(u(o,n))return s[n]=3,o[n];else if(r!==t&&u(r,n))return s[n]=4,r[n];else kr&&(s[n]=0)}let d=Tr[n],f,p;if(d)return n===`$attrs`&&B(e.attrs,`get`,``),d(e);if((f=c.__cssModules)&&(f=f[n]))return f;if(r!==t&&u(r,n))return s[n]=4,r[n];if(p=l.config.globalProperties,u(p,n))return p[n]},set({_:e},n,r){let{data:i,setupState:a,ctx:o}=e;return Er(a,n)?(a[n]=r,!0):i!==t&&u(i,n)?(i[n]=r,!0):u(e.props,n)||n[0]===`$`&&n.slice(1)in e?!1:(o[n]=r,!0)},has({_:{data:e,setupState:n,accessCache:r,ctx:i,appContext:a,props:o,type:s}},c){let l;return!!(r[c]||e!==t&&c[0]!==`$`&&u(e,c)||Er(n,c)||u(o,c)||u(i,c)||u(Tr,c)||u(a.config.globalProperties,c)||(l=s.__cssModules)&&l[c])},defineProperty(e,t,n){return n.get==null?u(n,`value`)&&this.set(e,t,n.value,null):e._.accessCache[t]=0,Reflect.defineProperty(e,t,n)}};function Or(e){return d(e)?e.reduce((e,t)=>(e[t]=null,e),{}):e}var kr=!0;function Ar(e){let t=Pr(e),n=e.proxy,i=e.ctx;kr=!1,t.beforeCreate&&Mr(t.beforeCreate,e,`bc`);let{data:a,computed:o,methods:s,watch:c,provide:l,inject:u,created:f,beforeMount:p,mounted:m,beforeUpdate:g,updated:_,activated:y,deactivated:b,beforeDestroy:x,beforeUnmount:S,destroyed:C,unmounted:w,render:T,renderTracked:ee,renderTriggered:te,errorCaptured:E,serverPrefetch:ne,expose:D,inheritAttrs:O,components:re,directives:k,filters:A}=t;if(u&&jr(u,i,null),s)for(let e in s){let t=s[e];h(t)&&(i[e]=t.bind(n))}if(a){let t=a.call(n,n);v(t)&&(e.data=Ot(t))}if(kr=!0,o)for(let e in o){let t=o[e],a=Ta({get:h(t)?t.bind(n,n):h(t.get)?t.get.bind(n,n):r,set:!h(t)&&h(t.set)?t.set.bind(n):r});Object.defineProperty(i,e,{enumerable:!0,configurable:!0,get:()=>a.value,set:e=>a.value=e})}if(c)for(let e in c)Nr(c[e],i,n,e);if(l){let e=h(l)?l.call(n):l;Reflect.ownKeys(e).forEach(t=>{wn(t,e[t])})}f&&Mr(f,e,`c`);function j(e,t){d(t)?t.forEach(t=>e(t.bind(n))):t&&e(t.bind(n))}if(j(lr,p),j(ur,m),j(dr,g),j(fr,_),j(rr,y),j(ir,b),j(vr,E),j(_r,ee),j(gr,te),j(pr,S),j(mr,w),j(hr,ne),d(D)){if(D.length){let t=e.exposed||={};D.forEach(e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t,enumerable:!0})})}else e.exposed||={}}T&&e.render===r&&(e.render=T),O!=null&&(e.inheritAttrs=O),re&&(e.components=re),k&&(e.directives=k),ne&&Xn(e)}function jr(e,t,n=r){d(e)&&(e=zr(e));for(let n in e){let r=e[n],i;i=v(r)?`default`in r?Tn(r.from||n,r.default,!0):Tn(r.from||n):Tn(r),zt(i)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>i.value,set:e=>i.value=e}):t[n]=i}}function Mr(e,t,n){$t(d(e)?e.map(e=>e.bind(t.proxy)):e.bind(t.proxy),t,n)}function Nr(e,t,n,r){let i=r.includes(`.`)?jn(n,r):()=>n[r];if(g(e)){let n=t[e];h(n)&&On(i,n)}else if(h(e))On(i,e.bind(n));else if(v(e)){if(d(e))e.forEach(e=>Nr(e,t,n,r));else{let r=h(e.handler)?e.handler.bind(n):t[e.handler];h(r)&&On(i,r,e)}}}function Pr(e){let t=e.type,{mixins:n,extends:r}=t,{mixins:i,optionsCache:a,config:{optionMergeStrategies:o}}=e.appContext,s=a.get(t),c;return s?c=s:!i.length&&!n&&!r?c=t:(c={},i.length&&i.forEach(e=>Fr(c,e,o,!0)),Fr(c,t,o)),v(t)&&a.set(t,c),c}function Fr(e,t,n,r=!1){let{mixins:i,extends:a}=t;a&&Fr(e,a,n,!0),i&&i.forEach(t=>Fr(e,t,n,!0));for(let i in t)if(!(r&&i===`expose`)){let r=Ir[i]||n&&n[i];e[i]=r?r(e[i],t[i]):t[i]}return e}var Ir={data:Lr,props:Hr,emits:Hr,methods:Vr,computed:Vr,beforeCreate:Br,created:Br,beforeMount:Br,mounted:Br,beforeUpdate:Br,updated:Br,beforeDestroy:Br,beforeUnmount:Br,destroyed:Br,unmounted:Br,activated:Br,deactivated:Br,errorCaptured:Br,serverPrefetch:Br,components:Vr,directives:Vr,watch:Ur,provide:Lr,inject:Rr};function Lr(e,t){return t?e?function(){return s(h(e)?e.call(this,this):e,h(t)?t.call(this,this):t)}:t:e}function Rr(e,t){return Vr(zr(e),zr(t))}function zr(e){if(d(e)){let t={};for(let n=0;nt===`modelValue`||t===`model-value`?e.modelModifiers:e[`${t}Modifiers`]||e[`${E(t)}Modifiers`]||e[`${D(t)}Modifiers`];function Yr(e,n,...r){if(e.isUnmounted)return;let i=e.vnode.props||t,a=r,o=n.startsWith(`update:`),s=o&&Jr(i,n.slice(7));s&&(s.trim&&(a=r.map(e=>g(e)?e.trim():e)),s.number&&(a=a.map(ie)));let c,l=i[c=re(n)]||i[c=re(E(n))];!l&&o&&(l=i[c=re(D(n))]),l&&$t(l,e,6,a);let u=i[c+`Once`];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[c])return;e.emitted[c]=!0,$t(u,e,6,a)}}var Xr=new WeakMap;function Zr(e,t,n=!1){let r=n?Xr:t.emitsCache,i=r.get(e);if(i!==void 0)return i;let a=e.emits,o={},c=!1;if(!h(e)){let r=e=>{let n=Zr(e,t,!0);n&&(c=!0,s(o,n))};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}return!a&&!c?(v(e)&&r.set(e,null),null):(d(a)?a.forEach(e=>o[e]=null):s(o,a),v(e)&&r.set(e,o),o)}function Qr(e,t){return!e||!a(t)?!1:(t=t.slice(2),t=t===`Once`?t:t.replace(/Once$/,``),u(e,t[0].toLowerCase()+t.slice(1))||u(e,D(t))||u(e,t))}function $r(e){let{type:t,vnode:n,proxy:r,withProxy:i,propsOptions:[a],slots:s,attrs:c,emit:l,render:u,renderCache:d,props:f,data:p,setupState:m,ctx:h,inheritAttrs:g}=e,_=xn(e),v,y;try{if(n.shapeFlag&4){let e=i||r,t=e;v=ea(u.call(t,e,d,f,m,p,h)),y=c}else{let e=t;v=ea(e.length>1?e(f,{attrs:c,slots:s,emit:l}):e(f,null)),y=t.props?c:ei(c)}}catch(t){Bi.length=0,en(t,e,1),v=X(Ri)}let b=v;if(y&&g!==!1){let e=Object.keys(y),{shapeFlag:t}=b;e.length&&t&7&&(a&&e.some(o)&&(y=ti(y,a)),b=$i(b,y,!1,!0))}return n.dirs&&(b=$i(b,null,!1,!0),b.dirs=b.dirs?b.dirs.concat(n.dirs):n.dirs),n.transition&&qn(Nn(b.type)&&Kn(b)||b,n.transition),v=b,xn(_),v}var ei=e=>{let t;for(let n in e)(n===`class`||n===`style`||a(n))&&((t||={})[n]=e[n]);return t},ti=(e,t)=>{let n={};for(let r in e)(!o(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function ni(e,t,n){let{props:r,children:i,component:a}=e,{props:o,children:s,patchFlag:c}=t,l=a.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?ri(r,o,l):!!o;if(c&8){let e=t.dynamicProps;for(let t=0;tObject.create(oi),ci=e=>Object.getPrototypeOf(e)===oi;function li(e,t,n,r=!1){let i={},a=si();e.propsDefaults=Object.create(null),di(e,t,i,a);for(let t in e.propsOptions[0])t in i||(i[t]=void 0);e.props=n?r?i:kt(i):e.type.props?i:a,e.attrs=a}function ui(e,t,n,r){let{props:i,attrs:a,vnode:{patchFlag:o}}=e,s=V(i),[c]=e.propsOptions,l=!1;if((r||o>0)&&!(o&16)){if(o&8){let n=e.vnode.dynamicProps;for(let r=0;r{p=!0;let[t,n]=mi(e,r,!0);s(l,t),n&&f.push(...n)};!i&&r.mixins.length&&r.mixins.forEach(t),e.extends&&t(e.extends),e.mixins&&e.mixins.forEach(t)}if(!c&&!p)return v(e)&&a.set(e,n),n;if(d(c))for(let e=0;ee===`_`||e===`_ctx`||e===`$stable`,_i=e=>d(e)?e.map(ea):[ea(e)],vi=(e,t,n)=>{if(t._n)return t;let r=Sn((...e)=>_i(t(...e)),n);return r._c=!1,r},yi=(e,t,n)=>{let r=e._ctx;for(let n in e){if(gi(n))continue;let i=e[n];if(h(i))t[n]=vi(n,i,r);else if(i!=null){let e=_i(i);t[n]=()=>e}}},bi=(e,t)=>{let n=_i(t);e.slots.default=()=>n},xi=(e,t,n)=>{for(let r in t)(n||!gi(r))&&(e[r]=t[r])},Si=(e,t,n)=>{let r=e.slots=si();if(e.vnode.shapeFlag&32){let e=t._;e?(xi(r,t,n),n&&j(r,`_`,e,!0)):yi(t,r)}else t&&bi(e,t)},Ci=(e,n,r)=>{let{vnode:i,slots:a}=e,o=!0,s=t;if(i.shapeFlag&32){let e=n._;e?r&&e===1?o=!1:xi(a,n,r):(o=!n.$stable,yi(n,a)),s=n}else n&&(bi(e,n),s={default:1});if(o)for(let e in a)!gi(e)&&s[e]==null&&delete a[e]},wi=Ii;function Ti(e){return Ei(e)}function Ei(e,i){let a=se();a.__VUE__=!0;let{insert:o,remove:s,patchProp:c,createElement:l,createText:u,createComment:d,setText:f,setElementText:p,parentNode:m,nextSibling:h,setScopeId:g=r,insertStaticContent:_}=e,v=(e,t,n,r=null,i=null,a=null,o=void 0,s=null,c=!!t.dynamicChildren)=>{if(e===t)return;e&&!Ji(e,t)&&(r=ge(e),fe(e,i,a,!0),e=null),t.patchFlag===-2&&(c=!1,t.dynamicChildren=null);let{type:l,ref:u,shapeFlag:d}=t;switch(l){case Li:y(e,t,n,r);break;case Ri:b(e,t,n,r);break;case zi:e??x(t,n,r,o);break;case K:re(e,t,n,r,i,a,o,s,c);break;default:d&1?w(e,t,n,r,i,a,o,s,c):d&6?k(e,t,n,r,i,a,o,s,c):(d&64||d&128)&&l.process(e,t,n,r,i,a,o,s,c,ye)}u!=null&&i?$n(u,e&&e.ref,a,t||e,!t):u==null&&e&&e.ref!=null&&$n(e.ref,null,a,e,!0)},y=(e,t,n,r)=>{if(e==null)o(t.el=u(t.children),n,r);else{let n=t.el=e.el;t.children!==e.children&&f(n,t.children)}},b=(e,t,n,r)=>{e==null?o(t.el=d(t.children||``),n,r):t.el=e.el},x=(e,t,n,r)=>{[e.el,e.anchor]=_(e.children,t,n,r,e.el,e.anchor)},S=({el:e,anchor:t},n,r)=>{let i;for(;e&&e!==t;)i=h(e),o(e,n,r),e=i;o(t,n,r)},C=({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=h(e),s(e),e=n;s(t)},w=(e,t,n,r,i,a,o,s,c)=>{if(t.type===`svg`?o=`svg`:t.type===`math`&&(o=`mathml`),e==null)ee(t,n,r,i,a,o,s,c);else{let n=e.el&&e.el._isVueCE?e.el:null;try{n&&n._beginPatch(),ne(e,t,i,a,o,s,c)}finally{n&&n._endPatch()}}},ee=(e,t,n,r,i,a,s,u)=>{let d,f,{props:m,shapeFlag:h,transition:g,dirs:_}=e;if(d=e.el=l(e.type,a,m&&m.is,m),h&8?p(d,e.children):h&16&&E(e.children,d,null,r,i,Di(e,a),s,u),_&&Cn(e,null,r,`created`),te(d,e,e.scopeId,s,r),m){for(let e in m)e!==`value`&&!T(e)&&c(d,e,null,m[e],a,r);`value`in m&&c(d,`value`,null,m.value,a),(f=m.onVnodeBeforeMount)&&ia(f,r,e)}_&&Cn(e,null,r,`beforeMount`);let v=ki(i,g);v&&g.beforeEnter(d),o(d,t,n),((f=m&&m.onVnodeMounted)||v||_)&&wi(()=>{try{f&&ia(f,r,e),v&&g.enter(d),_&&Cn(e,null,r,`mounted`)}finally{}},i)},te=(e,t,n,r,i)=>{if(n&&g(e,n),r)for(let t=0;t{for(let l=c;l{let l=n.el=e.el,{patchFlag:u,dynamicChildren:d,dirs:f}=n;u|=e.patchFlag&16;let m=e.props||t,h=n.props||t,g;if(r&&Oi(r,!1),(g=h.onVnodeBeforeUpdate)&&ia(g,r,n,e),f&&Cn(n,e,r,`beforeUpdate`),r&&Oi(r,!0),d&&(!e.dynamicChildren||e.dynamicChildren.length!==d.length)&&(u=0,s=!1,d=null),(m.innerHTML&&h.innerHTML==null||m.textContent&&h.textContent==null)&&p(l,``),d?D(e.dynamicChildren,d,l,r,i,Di(n,a),o):s||ce(e,n,l,null,r,i,Di(n,a),o,!1),u>0){if(u&16)O(l,m,h,r,a);else if(u&2&&m.class!==h.class&&c(l,`class`,null,h.class,a),u&4&&c(l,`style`,m.style,h.style,a),u&8){let e=n.dynamicProps;for(let t=0;t{g&&ia(g,r,n,e),f&&Cn(n,e,r,`updated`)},i)},D=(e,t,n,r,i,a,o)=>{for(let s=0;s{if(n!==r){if(n!==t)for(let t in n)!T(t)&&!(t in r)&&c(e,t,n[t],null,a,i);for(let t in r){if(T(t))continue;let o=r[t],s=n[t];o!==s&&t!==`value`&&c(e,t,s,o,a,i)}`value`in r&&c(e,`value`,n.value,r.value,a)}},re=(e,t,n,r,i,a,s,c,l)=>{let d=t.el=e?e.el:u(``),f=t.anchor=e?e.anchor:u(``),{patchFlag:p,dynamicChildren:m,slotScopeIds:h}=t;h&&(c=c?c.concat(h):h),e==null?(o(d,n,r),o(f,n,r),E(t.children||[],n,f,i,a,s,c,l)):p>0&&p&64&&m&&e.dynamicChildren&&e.dynamicChildren.length===m.length?(D(e.dynamicChildren,m,n,i,a,s,c),(t.key!=null||i&&t===i.subTree)&&Ai(e,t,!0)):ce(e,t,n,f,i,a,s,c,l)},k=(e,t,n,r,i,a,o,s,c)=>{t.slotScopeIds=s,e==null?t.shapeFlag&512?i.ctx.activate(t,n,r,o,c):j(t,n,r,i,a,o,c):ie(e,t,c)},j=(e,t,n,r,i,a,o)=>{let s=e.component=sa(e,r,i);if(nr(e)&&(s.ctx.renderer=ye),ga(s,!1,o),s.asyncDep){if(i&&i.registerDep(s,ae,o),!e.el){let r=s.subTree=X(Ri);b(null,r,t,n),e.placeholder=r.el}}else ae(s,e,t,n,i,a,o)},ie=(e,t,n)=>{let r=t.component=e.component;if(ni(e,t,n)){if(r.asyncDep&&!r.asyncResolved){oe(r,t,n);return}r.next=t,r.update()}else t.el=e.el,r.vnode=t},ae=(e,t,n,r,i,a,o)=>{let s=()=>{if(e.isMounted){let{next:t,bu:n,u:r,parent:s,vnode:c}=e;{let n=Mi(e);if(n){t&&(t.el=c.el,oe(e,t,o)),n.asyncDep.then(()=>{wi(()=>{e.isUnmounted||l()},i)});return}}let u=t,d;Oi(e,!1),t?(t.el=c.el,oe(e,t,o)):t=c,n&&A(n),(d=t.props&&t.props.onVnodeBeforeUpdate)&&ia(d,s,t,c),Oi(e,!0);let f=$r(e),p=e.subTree;e.subTree=f,v(p,f,m(p.el),ge(p),e,i,a),t.el=f.el,u===null&&ai(e,f.el),r&&wi(r,i),(d=t.props&&t.props.onVnodeUpdated)&&wi(()=>ia(d,s,t,c),i)}else{let o,{el:s,props:c}=t,{bm:l,m:u,parent:d,root:f,type:p}=e,m=tr(t);if(Oi(e,!1),l&&A(l),!m&&(o=c&&c.onVnodeBeforeMount)&&ia(o,d,t),Oi(e,!0),s&&N){let t=()=>{e.subTree=$r(e),N(s,e.subTree,e,i,null)};m&&p.__asyncHydrate?p.__asyncHydrate(s,e,t):t()}else{f.ce&&f.ce._hasShadowRoot()&&f.ce._injectChildStyle(p,e.parent?e.parent.type:void 0);let o=e.subTree=$r(e);v(null,o,n,r,e,i,a),t.el=o.el}if(u&&wi(u,i),!m&&(o=c&&c.onVnodeMounted)){let e=t;wi(()=>ia(o,d,e),i)}(t.shapeFlag&256||d&&tr(d.vnode)&&d.vnode.shapeFlag&256)&&e.a&&wi(e.a,i),e.isMounted=!0,t=n=r=null}};e.scope.on();let c=e.effect=new we(s);e.scope.off();let l=e.update=c.run.bind(c),u=e.job=c.runIfDirty.bind(c);u.i=e,u.id=e.uid,c.scheduler=()=>fn(u),Oi(e,!0),l()},oe=(e,t,n)=>{t.component=e;let r=e.vnode.props;e.vnode=t,e.next=null,ui(e,t.props,r,n),Ci(e,t.children,n),Re(),hn(e),z()},ce=(e,t,n,r,i,a,o,s,c=!1)=>{let l=e&&e.children,u=e?e.shapeFlag:0,d=t.children,{patchFlag:f,shapeFlag:m}=t;if(f>0){if(f&128){ue(l,d,n,r,i,a,o,s,c);return}if(f&256){le(l,d,n,r,i,a,o,s,c);return}}m&8?(u&16&&he(l,i,a),d!==l&&p(n,d)):u&16?m&16?ue(l,d,n,r,i,a,o,s,c):he(l,i,a,!0):(u&8&&p(n,``),m&16&&E(d,n,r,i,a,o,s,c))},le=(e,t,r,i,a,o,s,c,l)=>{e||=n,t||=n;let u=e.length,d=t.length,f=Math.min(u,d),p=0;for(;pd?he(e,a,o,!0,!1,f):E(t,r,i,a,o,s,c,l,f)},ue=(e,t,r,i,a,o,s,c,l)=>{let u=0,d=t.length,f=e.length-1,p=d-1;for(;u<=f&&u<=p;){let n=e[u],i=t[u]=l?ta(t[u]):ea(t[u]);if(Ji(n,i))v(n,i,r,null,a,o,s,c,l);else break;u++}for(;u<=f&&u<=p;){let n=e[f],i=t[p]=l?ta(t[p]):ea(t[p]);if(Ji(n,i))v(n,i,r,null,a,o,s,c,l);else break;f--,p--}if(u>f){if(u<=p){let e=p+1,n=ep)for(;u<=f;)fe(e[u],a,o,!0),u++;else{let m=u,h=u,g=new Map;for(u=h;u<=p;u++){let e=t[u]=l?ta(t[u]):ea(t[u]);e.key!=null&&g.set(e.key,u)}let _,y=0,b=p-h+1,x=!1,S=0,C=Array(b);for(u=0;u=b){fe(n,a,o,!0);continue}let i;if(n.key!=null)i=g.get(n.key);else for(_=h;_<=p;_++)if(C[_-h]===0&&Ji(n,t[_])){i=_;break}i===void 0?fe(n,a,o,!0):(C[i-h]=u+1,i>=S?S=i:x=!0,v(n,t[i],r,null,a,o,s,c,l),y++)}let w=x?ji(C):n;for(_=w.length-1,u=b-1;u>=0;u--){let e=h+u,n=t[e],f=t[e+1],p=e+1{let{el:a,type:c,transition:l,children:u,shapeFlag:d}=e;if(d&6){de(e.component.subTree,t,n,r);return}if(d&128){e.suspense.move(t,n,r);return}if(d&64){c.move(e,t,n,ye);return}if(c===K){o(a,t,n);for(let e=0;el.enter(a),i));else{let{leave:r,delayLeave:i,afterLeave:c}=l,u=()=>{e.ctx.isUnmounted?s(a):o(a,t,n)},d=()=>{let e=a._isLeaving||!!a[Pn];a._isLeaving&&a[Pn](!0),l.persisted&&!e?u():r(a,()=>{u(),c&&c()})};i?i(a,u,d):d()}}else o(a,t,n)},fe=(e,t,n,r=!1,i=!1)=>{let{type:a,props:o,ref:s,children:c,dynamicChildren:l,shapeFlag:u,patchFlag:d,dirs:f,cacheIndex:p,memo:m}=e;if(d===-2&&(i=!1),s!=null&&(Re(),$n(s,null,n,e,!0),z()),p!=null&&(t.renderCache[p]=void 0),u&256){t.ctx.deactivate(e);return}let h=u&1&&f,g=!tr(e),_;if(g&&(_=o&&o.onVnodeBeforeUnmount)&&ia(_,t,e),u&6)me(e.component,n,r);else{if(u&128){e.suspense.unmount(n,r);return}h&&Cn(e,null,t,`beforeUnmount`),u&64?e.type.remove(e,t,n,ye,r):l&&!l.hasOnce&&(a!==K||d>0&&d&64)?he(l,t,n,!1,!0):(a===K&&d&384||!i&&u&16)&&he(c,t,n),r&&M(e)}let v=m!=null&&p==null;(g&&(_=o&&o.onVnodeUnmounted)||h||v)&&wi(()=>{_&&ia(_,t,e),h&&Cn(e,null,t,`unmounted`),v&&(e.el=null)},n)},M=e=>{let{type:t,el:n,anchor:r,transition:i}=e;if(t===K){pe(n,r);return}if(t===zi){C(e);return}let a=()=>{s(n),i&&!i.persisted&&i.afterLeave&&i.afterLeave()};if(e.shapeFlag&1&&i&&!i.persisted){let{leave:t,delayLeave:r}=i,o=()=>t(n,a);r?r(e.el,a,o):o()}else a()},pe=(e,t)=>{let n;for(;e!==t;)n=h(e),s(e),e=n;s(t)},me=(e,t,n)=>{let{bum:r,scope:i,job:a,subTree:o,um:s,m:c,a:l}=e;Ni(c),Ni(l),r&&A(r),i.stop(),a&&(a.flags|=8,fe(o,e,t,n)),s&&wi(s,t),wi(()=>{e.isUnmounted=!0},t)},he=(e,t,n,r=!1,i=!1,a=0)=>{for(let o=a;o{if(e.shapeFlag&6)return ge(e.component.subTree);if(e.shapeFlag&128)return e.suspense.next();let t=h(e.anchor||e.el),n=t&&t[Mn];return n?h(n):t},_e=!1,ve=(e,t,n)=>{let r;e==null?t._vnode&&(fe(t._vnode,null,null,!0),r=t._vnode.component):v(t._vnode||null,e,t,null,null,null,n),t._vnode=e,_e||=(_e=!0,hn(r),gn(),!1)},ye={p:v,um:fe,m:de,r:M,mt:j,mc:E,pc:ce,pbc:D,n:ge,o:e},be,N;return i&&([be,N]=i(ye)),{render:ve,hydrate:be,createApp:Kr(ve,be)}}function Di({type:e,props:t},n){return n===`svg`&&e===`foreignObject`||n===`mathml`&&e===`annotation-xml`&&t&&t.encoding&&t.encoding.includes(`html`)?void 0:n}function Oi({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function ki(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Ai(e,t,n=!1){let r=e.children,i=t.children;if(d(r)&&d(i))for(let e=0;e>1,e[n[s]]0&&(t[r]=n[a-1]),n[a]=r)}}for(a=n.length,o=n[a-1];a-->0;)n[a]=o,o=t[o];return n}function Mi(e){let t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Mi(t)}function Ni(e){if(e)for(let t=0;te.__isSuspense;function Ii(e,t){t&&t.pendingBranch?d(e)?t.effects.push(...e):t.effects.push(e):mn(e)}var K=Symbol.for(`v-fgt`),Li=Symbol.for(`v-txt`),Ri=Symbol.for(`v-cmt`),zi=Symbol.for(`v-stc`),Bi=[],Vi=null;function q(e=!1){Bi.push(Vi=e?null:[])}function Hi(){Bi.pop(),Vi=Bi[Bi.length-1]||null}var Ui=1;function Wi(e,t=!1){Ui+=e,e<0&&Vi&&t&&(Vi.hasOnce=!0)}function Gi(e){return e.dynamicChildren=Ui>0?Vi||n:null,Hi(),Ui>0&&Vi&&Vi.push(e),e}function J(e,t,n,r,i,a){return Gi(Y(e,t,n,r,i,a,!0))}function Ki(e,t,n,r,i){return Gi(X(e,t,n,r,i,!0))}function qi(e){return e?e.__v_isVNode===!0:!1}function Ji(e,t){return e.type===t.type&&e.key===t.key}var Yi=({key:e})=>e??null,Xi=({ref:e,ref_key:t,ref_for:n})=>(typeof e==`number`&&(e=``+e),e==null?null:g(e)||zt(e)||h(e)?{i:yn,r:e,k:t,f:!!n}:e);function Y(e,t=null,n=null,r=0,i=null,a=e===K?0:1,o=!1,s=!1){let c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Yi(t),ref:t&&Xi(t),scopeId:bn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:a,patchFlag:r,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:yn};return s?(na(c,n),a&128&&e.normalize(c)):n&&(c.shapeFlag|=g(n)?8:16),Ui>0&&!o&&Vi&&(c.patchFlag>0||a&6)&&c.patchFlag!==32&&Vi.push(c),c}var X=Zi;function Zi(e,t=null,n=null,r=0,i=null,a=!1){if((!e||e===xr)&&(e=Ri),qi(e)){let r=$i(e,t,!0);return n&&na(r,n),Ui>0&&!a&&Vi&&(r.shapeFlag&6?Vi[Vi.indexOf(e)]=r:Vi.push(r)),r.patchFlag=-2,r}if(wa(e)&&(e=e.__vccOpts),t){t=Qi(t);let{class:e,style:n}=t;e&&!g(e)&&(t.class=M(e)),v(n)&&(Ft(n)&&!d(n)&&(n=s({},n)),t.style=ce(n))}let o=g(e)?1:Fi(e)?128:Nn(e)?64:v(e)?4:h(e)?2:0;return Y(e,t,n,r,i,o,a,!0)}function Qi(e){return e?Ft(e)||ci(e)?s({},e):e:null}function $i(e,t,n=!1,r=!1){let{props:i,ref:a,patchFlag:o,children:s,transition:c}=e,l=t?ra(i||{},t):i,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&Yi(l),ref:t&&t.ref?n&&a?d(a)?a.concat(Xi(t)):[a,Xi(t)]:Xi(t):a,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:s,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==K?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&$i(e.ssContent),ssFallback:e.ssFallback&&$i(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&r&&qn(u,c.clone(u)),u}function Z(e=` `,t=0){return X(Li,null,e,t)}function Q(e=``,t=!1){return t?(q(),Ki(Ri,null,e)):X(Ri,null,e)}function ea(e){return e==null||typeof e==`boolean`?X(Ri):d(e)?X(K,null,e.slice()):qi(e)?ta(e):X(Li,null,String(e))}function ta(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:$i(e)}function na(e,t){let n=0,{shapeFlag:r}=e;if(t==null)t=null;else if(d(t))n=16;else if(typeof t==`object`){if(r&65){let n=t.default;n&&(n._c&&(n._d=!1),na(e,n()),n._c&&(n._d=!0));return}{n=32;let r=t._;!r&&!ci(t)?t._ctx=yn:r===3&&yn&&(yn.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}}else if(h(t)){if(r&65){na(e,{default:t});return}t={default:t,_ctx:yn},n=32}else t=String(t),r&64?(n=16,t=[Z(t)]):n=8;e.children=t,e.shapeFlag|=n}function ra(...e){let t={};for(let n=0;nca||yn,ua,da;{let e=se(),t=(t,n)=>{let r;return(r=e[t])||(r=e[t]=[]),r.push(n),e=>{r.length>1?r.forEach(t=>t(e)):r[0](e)}};ua=t(`__VUE_INSTANCE_SETTERS__`,e=>ca=e),da=t(`__VUE_SSR_SETTERS__`,e=>ha=e)}var fa=e=>{let t=ca;return ua(e),e.scope.on(),()=>{e.scope.off(),ua(t)}},pa=()=>{ca&&ca.scope.off(),ua(null)};function ma(e){return e.vnode.shapeFlag&4}var ha=!1;function ga(e,t=!1,n=!1){t&&da(t);let{props:r,children:i}=e.vnode,a=ma(e);li(e,r,a,t),Si(e,i,n||t);let o=a?_a(e,t):void 0;return t&&da(!1),o}function _a(e,t){let n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Dr);let{setup:r}=n;if(r){Re();let n=e.setupContext=r.length>1?xa(e):null,i=fa(e),a=Qt(r,e,0,[e.props,n]),o=y(a);if(z(),i(),(o||e.sp)&&!tr(e)&&Xn(e),o){if(a.then(pa,pa),t)return a.then(n=>{da(!0);try{va(e,n,t)}finally{da(!1)}}).catch(t=>{en(t,e,0)});e.asyncDep=a}else va(e,a,t)}else ya(e,t)}function va(e,t,n){h(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:v(t)&&(e.setupState=Ut(t)),ya(e,n)}function ya(e,t,n){let i=e.type;e.render||=i.render||r;{let t=fa(e);Re();try{Ar(e)}finally{z(),t()}}}var ba={get(e,t){return B(e,`get`,``),e[t]}};function xa(e){return{attrs:new Proxy(e.attrs,ba),slots:e.slots,emit:e.emit,expose:t=>{e.exposed=t||{}}}}function Sa(e){return e.exposed?e.exposeProxy||=new Proxy(Ut(It(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Tr)return Tr[n](e)},has(e,t){return t in e||t in Tr}}):e.proxy}function Ca(e,t=!0){return h(e)?e.displayName||e.name:e.name||t&&e.__name}function wa(e){return h(e)&&`__vccOpts`in e}var Ta=(e,t)=>Gt(e,t,ha);function Ea(e,t,n){try{Wi(-1);let r=arguments.length;return r===2?v(t)&&!d(t)?qi(t)?X(e,null,[t]):X(e,t):X(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&qi(n)&&(n=[n]),X(e,t,n))}finally{Wi(1)}}var Da=`3.5.42`,Oa=void 0,ka=typeof window<`u`&&window.trustedTypes;if(ka)try{Oa=ka.createPolicy(`vue`,{createHTML:e=>e})}catch{}var Aa=Oa?e=>Oa.createHTML(e):e=>e,ja=`http://www.w3.org/2000/svg`,Ma=`http://www.w3.org/1998/Math/MathML`,Na=typeof document<`u`?document:null,Pa=Na&&Na.createElement(`template`),Fa={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{let t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{let i=t===`svg`?Na.createElementNS(ja,e):t===`mathml`?Na.createElementNS(Ma,e):n?Na.createElement(e,{is:n}):Na.createElement(e);return e===`select`&&r&&r.multiple!=null&&i.setAttribute(`multiple`,r.multiple),i},createText:e=>Na.createTextNode(e),createComment:e=>Na.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Na.querySelector(e),setScopeId(e,t){e.setAttribute(t,``)},insertStaticContent(e,t,n,r,i,a){let o=n?n.previousSibling:t.lastChild;if(i&&(i===a||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),n),i!==a&&(i=i.nextSibling););else{Pa.innerHTML=Aa(r===`svg`?`${e}`:r===`mathml`?`${e}`:e);let i=Pa.content;if(r===`svg`||r===`mathml`){let e=i.firstChild;for(;e.firstChild;)i.appendChild(e.firstChild);i.removeChild(e)}t.insertBefore(i,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Ia=`transition`,La=`animation`,Ra=Symbol(`_vtc`),za={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Ba=s({},Rn,za),Va=(e=>(e.displayName=`Transition`,e.props=Ba,e))((e,{slots:t})=>Ea(Hn,Wa(e),t)),Ha=(e,t=[])=>{d(e)?e.forEach(e=>e(...t)):e&&e(...t)},Ua=e=>e?d(e)?e.some(e=>e.length>1):e.length>1:!1;function Wa(e){let t={};for(let n in e)n in za||(t[n]=e[n]);if(e.css===!1)return t;let{name:n=`v`,type:r,duration:i,enterFromClass:a=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:c=`${n}-enter-to`,appearFromClass:l=a,appearActiveClass:u=o,appearToClass:d=c,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:m=`${n}-leave-to`}=e,h=Ga(i),g=h&&h[0],_=h&&h[1],{onBeforeEnter:v,onEnter:y,onEnterCancelled:b,onLeave:x,onLeaveCancelled:S,onBeforeAppear:C=v,onAppear:w=y,onAppearCancelled:T=b}=t,ee=(e,t,n,r)=>{e._enterCancelled=r,Ja(e,t?d:c),Ja(e,t?u:o),n&&n()},te=(e,t)=>{e._isLeaving=!1,Ja(e,f),Ja(e,m),Ja(e,p),t&&t()},E=e=>(t,n)=>{let i=e?w:y,o=()=>ee(t,e,n);Ha(i,[t,o]),Ya(()=>{Ja(t,e?l:a),qa(t,e?d:c),Ua(i)||Za(t,r,g,o)})};return s(t,{onBeforeEnter(e){Ha(v,[e]),qa(e,a),qa(e,o)},onBeforeAppear(e){Ha(C,[e]),qa(e,l),qa(e,u)},onEnter:E(!1),onAppear:E(!0),onLeave(e,t){e._isLeaving=!0;let n=()=>te(e,t);qa(e,f),e._enterCancelled?(qa(e,p),to(e)):(to(e),qa(e,p)),Ya(()=>{e._isLeaving&&(Ja(e,f),qa(e,m),Ua(x)||Za(e,r,_,n))}),Ha(x,[e,n])},onEnterCancelled(e){ee(e,!1,void 0,!0),Ha(b,[e])},onAppearCancelled(e){ee(e,!0,void 0,!0),Ha(T,[e])},onLeaveCancelled(e){te(e),Ha(S,[e])}})}function Ga(e){if(e==null)return null;if(v(e))return[Ka(e.enter),Ka(e.leave)];{let t=Ka(e);return[t,t]}}function Ka(e){return ae(e)}function qa(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.add(t)),(e[Ra]||(e[Ra]=new Set)).add(t)}function Ja(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.remove(t));let n=e[Ra];n&&(n.delete(t),n.size||(e[Ra]=void 0))}function Ya(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}var Xa=0;function Za(e,t,n,r){let i=e._endId=++Xa,a=()=>{i===e._endId&&r()};if(n!=null)return setTimeout(a,n);let{type:o,timeout:s,propCount:c}=Qa(e,t);if(!o)return r();let l=o+`end`,u=0,d=()=>{e.removeEventListener(l,f),a()},f=t=>{t.target===e&&++u>=c&&d()};setTimeout(()=>{u(n[e]||``).split(`, `),i=r(`${Ia}Delay`),a=r(`${Ia}Duration`),o=$a(i,a),s=r(`${La}Delay`),c=r(`${La}Duration`),l=$a(s,c),u=null,d=0,f=0;t===Ia?o>0&&(u=Ia,d=o,f=a.length):t===La?l>0&&(u=La,d=l,f=c.length):(d=Math.max(o,l),u=d>0?o>l?Ia:La:null,f=u?u===Ia?a.length:c.length:0);let p=u===Ia&&/\b(?:transform|all)(?:,|$)/.test(r(`${Ia}Property`).toString());return{type:u,timeout:d,propCount:f,hasTransform:p}}function $a(e,t){for(;e.lengtheo(t)+eo(e[n])))}function eo(e){return e===`auto`?0:Number(e.slice(0,-1).replace(`,`,`.`))*1e3}function to(e){return(e?e.ownerDocument:document).body.offsetHeight}function no(e,t,n){let r=e[Ra];r&&(t=(t?[t,...r]:[...r]).join(` `)),t==null?e.removeAttribute(`class`):n?e.setAttribute(`class`,t):e.className=t}var ro=Symbol(`_vod`),io=Symbol(`_vsh`),ao={name:`show`,beforeMount(e,{value:t},{transition:n}){e[ro]=e.style.display===`none`?``:e.style.display,n&&t?n.beforeEnter(e):oo(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),oo(e,!0),r.enter(e)):r.leave(e,()=>{oo(e,!1)}):oo(e,t))},beforeUnmount(e,{value:t}){oo(e,t)}};function oo(e,t){e.style.display=t?e[ro]:`none`,e[io]=!t}var so=Symbol(``),co=/(?:^|;)\s*display\s*:/;function lo(e,t,n){let r=e.style,i=g(n),a=!1;if(n&&!i){if(t){if(g(t))for(let e of t.split(`;`)){let t=e.slice(0,e.indexOf(`:`)).trim();n[t]??fo(r,t,``)}else for(let e in t)n[e]??fo(r,e,``)}for(let i in n){i===`display`&&(a=!0);let o=n[i];o==null?fo(r,i,``):go(e,i,!g(t)&&t?t[i]:void 0,o)||fo(r,i,o)}}else if(i){if(t!==n){let e=r[so];e&&(n+=`;`+e),r.cssText=n,a=co.test(n)}}else t&&e.removeAttribute(`style`);ro in e&&(e[ro]=a?r.display:``,e[io]&&(r.display=`none`))}var uo=/\s*!important$/;function fo(e,t,n){if(d(n))n.forEach(n=>fo(e,t,n));else if(n??=``,t.startsWith(`--`))uo.test(n)?e.setProperty(t,n.replace(uo,``),`important`):e.setProperty(t,n);else{let r=ho(e,t);uo.test(n)?e.setProperty(D(r),n.replace(uo,``),`important`):e[r]=n}}var po=[`Webkit`,`Moz`,`ms`],mo={};function ho(e,t){let n=mo[t];if(n)return n;let r=E(t);if(r!==`filter`&&r in e)return mo[t]=r;r=O(r);for(let n=0;nDo||=(Oo.then(()=>Do=0),Date.now());function Ao(e,t){let n=e=>{if(!e._vts)e._vts=Date.now();else if(e._vts<=n.attached)return;let r=n.value;if(d(r)){let n=e.stopImmediatePropagation;e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0};let i=r.slice(),a=[e];for(let n=0;ne.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Mo=(e,t,n,r,i,s)=>{let c=i===`svg`;t===`class`?no(e,r,c):t===`style`?lo(e,n,r):a(t)?o(t)||Co(e,t,n,r,s):(t[0]===`.`?(t=t.slice(1),1):t[0]===`^`?(t=t.slice(1),0):No(e,t,r,c))?(yo(e,t,r),!e.tagName.includes(`-`)&&(t===`value`||t===`checked`||t===`selected`)&&vo(e,t,r,c,s,t!==`value`)):e._isVueCE&&(Po(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!g(r)))?yo(e,E(t),r,s,t):(t===`true-value`?e._trueValue=r:t===`false-value`&&(e._falseValue=r),vo(e,t,r,c))};function No(e,t,n,r){if(r)return!!(t===`innerHTML`||t===`textContent`||t in e&&jo(t)&&h(n));if(t===`spellcheck`||t===`draggable`||t===`translate`||t===`autocorrect`||t===`sandbox`&&e.tagName===`IFRAME`||t===`form`||t===`list`&&e.tagName===`INPUT`||t===`type`&&e.tagName===`TEXTAREA`)return!1;if(t===`width`||t===`height`){let t=e.tagName;if(t===`IMG`||t===`VIDEO`||t===`CANVAS`||t===`SOURCE`)return!1}return jo(t)&&g(n)?!1:t in e}function Po(e,t){let n=e._def.props;if(!n)return!1;let r=E(t);return Array.isArray(n)?n.some(e=>E(e)===r):Object.keys(n).some(e=>E(e)===r)}var Fo=e=>{let t=e.props[`onUpdate:modelValue`]||!1;return d(t)?e=>A(t,e):t};function Io(e){e.target.composing=!0}function Lo(e){let t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event(`input`)))}var Ro=Symbol(`_assign`),zo=Symbol(`_initialValue`);function Bo(e,t,n){return t&&(e=e.trim()),n&&(e=ie(e)),e}var Vo={created(e,{modifiers:{lazy:t,trim:n,number:r}},i){e.parentNode&&(e.type===`text`?e[zo]=e.defaultValue.replace(/[\r\n]/g,``):e.type===`textarea`&&(e[zo]=e.defaultValue.replace(/\r\n?/g,` -`))),e[Ro]=Fo(i);let a=r||i.props&&i.props.type===`number`;bo(e,t?`change`:`input`,t=>{t.target.composing||e[Ro](Bo(e.value,n,a))}),(n||a)&&bo(e,`change`,()=>{e.value=Bo(e.value,n,a)}),t||(bo(e,`compositionstart`,Io),bo(e,`compositionend`,Lo),bo(e,`change`,Lo))},mounted(e,{value:t,modifiers:{trim:n,number:r}}){let i=t??``,a=e[zo];delete e[zo],a!==void 0&&(e.type===`text`||e.type===`textarea`)&&e.value!==a?e[Ro](Bo(e.value,n,r)):e.value=i},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:i,number:a}},o){if(e[Ro]=Fo(o),e.composing)return;let s=(a||e.type===`number`)&&!/^0\d/.test(e.value)?ie(e.value):e.value,c=t??``;if(s===c)return;let l=e.getRootNode();(l instanceof Document||l instanceof ShadowRoot)&&l.activeElement===e&&e.type!==`range`&&(r&&t===n||i&&e.value.trim()===c)||(e.value=c)}},Ho={deep:!0,created(e,t,n){e[Ro]=Fo(n),bo(e,`change`,()=>{let t=e._modelValue,n=qo(e),r=e.checked,i=e[Ro];if(d(t)){let e=ye(t,n),a=e!==-1;if(r&&!a)i(t.concat(n));else if(!r&&a){let n=[...t];n.splice(e,1),i(n)}}else if(p(t)){let e=new Set(t);r?e.add(n):e.delete(n),i(e)}else i(Jo(e,r))})},mounted:Uo,beforeUpdate(e,t,n){e[Ro]=Fo(n),Uo(e,t,n)}};function Uo(e,{value:t,oldValue:n},r){e._modelValue=t;let i;if(d(t))i=ye(t,r.props.value)>-1;else if(p(t))i=t.has(r.props.value);else{if(t===n)return;i=ve(t,Jo(e,!0))}e.checked!==i&&(e.checked=i)}var Wo={deep:!0,created(e,{value:t,modifiers:{number:n}},r){e._modelValue=t,bo(e,`change`,()=>{let t=Array.prototype.filter.call(e.options,e=>e.selected).map(e=>n?ie(qo(e)):qo(e)),r=e.multiple,i=r?p(e._modelValue)?new Set(t):t:t[0],a=e._pendingValue=[r,r?d(i)?t.slice():t:i];try{e[Ro](i)}finally{un(()=>{e._pendingValue===a&&(e._pendingValue=void 0)})}}),e[Ro]=Fo(r)},mounted(e,{value:t}){Ko(e,t)},beforeUpdate(e,{value:t},n){e._modelValue=t,e[Ro]=Fo(n)},updated(e,{value:t}){let n=e._pendingValue;e._pendingValue=void 0,(!n||n[0]!==e.multiple||!Go(t,n[1],n[0]))&&Ko(e,t)}};function Go(e,t,n){if(!n||d(e))return ve(e,t);if(p(e)){if(e.size!==t.length)return!1;for(let n of t)if(!e.has(n))return!1;return!0}return!1}function Ko(e,t){let n=e.multiple,r=d(t);if(!n||r||p(t)){for(let i=0,a=e.options.length;iString(e)===String(o)):ye(t,o)>-1}else a.selected=t.has(o)}else if(ve(qo(a),t)){e.selectedIndex!==i&&(e.selectedIndex=i);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function qo(e){return`_value`in e?e._value:e.value}function Jo(e,t){let n=t?`_trueValue`:`_falseValue`;return n in e?e[n]:t}var Yo=[`ctrl`,`shift`,`alt`,`meta`],Xo={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>`button`in e&&e.button!==0,middle:e=>`button`in e&&e.button!==1,right:e=>`button`in e&&e.button!==2,exact:(e,t)=>Yo.some(n=>e[`${n}Key`]&&!t.includes(n))},Zo=(e,t)=>{if(!e)return e;let n=e._withMods||={},r=t.join(`.`);return n[r]||(n[r]=((n,...r)=>{for(let e=0;e{let n=e._withKeys||={},r=t.join(`.`);return n[r]||(n[r]=(n=>{if(!(`key`in n))return;let r=D(n.key);if(t.some(e=>e===r||Qo[e]===r))return e(n)}))},es=s({patchProp:Mo},Fa),ts;function ns(){return ts||=Ti(es)}var rs=((...e)=>{let t=ns().createApp(...e),{mount:n}=t;return t.mount=e=>{let r=as(e);if(!r)return;let i=t._component;!h(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent=``);let a=n(r,!1,is(r));return r instanceof Element&&(r.removeAttribute(`v-cloak`),r.setAttribute(`data-v-app`,``)),a},t});function is(e){if(e instanceof SVGElement)return`svg`;if(typeof MathMLElement==`function`&&e instanceof MathMLElement)return`mathml`}function as(e){return g(e)?document.querySelector(e):e}var os=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),ss={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":2,"stroke-linecap":`round`,"stroke-linejoin":`round`},cs=({size:e,strokeWidth:t=2,absoluteStrokeWidth:n,color:r,iconNode:i,name:a,class:o,...s},{slots:c})=>Ea(`svg`,{...ss,width:e||ss.width,height:e||ss.height,stroke:r||ss.stroke,"stroke-width":n?Number(t)*24/Number(e):t,class:[`lucide`,`lucide-${os(a??`icon`)}`],...s},[...i.map(e=>Ea(...e)),...c.default?[c.default()]:[]]),$=(e,t)=>(n,{slots:r})=>Ea(cs,{...n,iconNode:t,name:e},r),ls=$(`ActivityIcon`,[[`path`,{d:`M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2`,key:`169zse`}]]),us=$(`ArchiveRestoreIcon`,[[`rect`,{width:`20`,height:`5`,x:`2`,y:`3`,rx:`1`,key:`1wp1u1`}],[`path`,{d:`M4 8v11a2 2 0 0 0 2 2h2`,key:`tvwodi`}],[`path`,{d:`M20 8v11a2 2 0 0 1-2 2h-2`,key:`1gkqxj`}],[`path`,{d:`m9 15 3-3 3 3`,key:`1pd0qc`}],[`path`,{d:`M12 12v9`,key:`192myk`}]]),ds=$(`CalendarDaysIcon`,[[`path`,{d:`M8 2v4`,key:`1cmpym`}],[`path`,{d:`M16 2v4`,key:`4m81vk`}],[`rect`,{width:`18`,height:`18`,x:`3`,y:`4`,rx:`2`,key:`1hopcy`}],[`path`,{d:`M3 10h18`,key:`8toen8`}],[`path`,{d:`M8 14h.01`,key:`6423bh`}],[`path`,{d:`M12 14h.01`,key:`1etili`}],[`path`,{d:`M16 14h.01`,key:`1gbofw`}],[`path`,{d:`M8 18h.01`,key:`lrp35t`}],[`path`,{d:`M12 18h.01`,key:`mhygvu`}],[`path`,{d:`M16 18h.01`,key:`kzsmim`}]]),fs=$(`CheckIcon`,[[`path`,{d:`M20 6 9 17l-5-5`,key:`1gmf2c`}]]),ps=$(`ChevronDownIcon`,[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]),ms=$(`ChevronRightIcon`,[[`path`,{d:`m9 18 6-6-6-6`,key:`mthhwq`}]]),hs=$(`CirclePlusIcon`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M8 12h8`,key:`1wcyev`}],[`path`,{d:`M12 8v8`,key:`napkw2`}]]),gs=$(`DownloadIcon`,[[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}],[`polyline`,{points:`7 10 12 15 17 10`,key:`2ggqvy`}],[`line`,{x1:`12`,x2:`12`,y1:`15`,y2:`3`,key:`1vk2je`}]]),_s=$(`FileJsonIcon`,[[`path`,{d:`M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z`,key:`1rqfz7`}],[`path`,{d:`M14 2v4a2 2 0 0 0 2 2h4`,key:`tnqrlb`}],[`path`,{d:`M10 12a1 1 0 0 0-1 1v1a1 1 0 0 1-1 1 1 1 0 0 1 1 1v1a1 1 0 0 0 1 1`,key:`1oajmo`}],[`path`,{d:`M14 18a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1 1 1 0 0 1-1-1v-1a1 1 0 0 0-1-1`,key:`mpwhp6`}]]),vs=$(`FolderIcon`,[[`path`,{d:`M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z`,key:`1kt360`}]]),ys=$(`GripVerticalIcon`,[[`circle`,{cx:`9`,cy:`12`,r:`1`,key:`1vctgf`}],[`circle`,{cx:`9`,cy:`5`,r:`1`,key:`hp0tcf`}],[`circle`,{cx:`9`,cy:`19`,r:`1`,key:`fkjjf6`}],[`circle`,{cx:`15`,cy:`12`,r:`1`,key:`1tmaij`}],[`circle`,{cx:`15`,cy:`5`,r:`1`,key:`19l28e`}],[`circle`,{cx:`15`,cy:`19`,r:`1`,key:`f4zoj3`}]]),bs=$(`InboxIcon`,[[`polyline`,{points:`22 12 16 12 14 15 10 15 8 12 2 12`,key:`o97t9d`}],[`path`,{d:`M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z`,key:`oot6mr`}]]),xs=$(`ListChecksIcon`,[[`path`,{d:`m3 17 2 2 4-4`,key:`1jhpwq`}],[`path`,{d:`m3 7 2 2 4-4`,key:`1obspn`}],[`path`,{d:`M13 6h8`,key:`15sg57`}],[`path`,{d:`M13 12h8`,key:`h98zly`}],[`path`,{d:`M13 18h8`,key:`oe0vm4`}]]),Ss=$(`ListTodoIcon`,[[`rect`,{x:`3`,y:`5`,width:`6`,height:`6`,rx:`1`,key:`1defrl`}],[`path`,{d:`m3 17 2 2 4-4`,key:`1jhpwq`}],[`path`,{d:`M13 6h8`,key:`15sg57`}],[`path`,{d:`M13 12h8`,key:`h98zly`}],[`path`,{d:`M13 18h8`,key:`oe0vm4`}]]),Cs=$(`LogOutIcon`,[[`path`,{d:`M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4`,key:`1uf3rs`}],[`polyline`,{points:`16 17 21 12 16 7`,key:`1gabdz`}],[`line`,{x1:`21`,x2:`9`,y1:`12`,y2:`12`,key:`1uyos4`}]]),ws=$(`MenuIcon`,[[`line`,{x1:`4`,x2:`20`,y1:`12`,y2:`12`,key:`1e0a9i`}],[`line`,{x1:`4`,x2:`20`,y1:`6`,y2:`6`,key:`1owob3`}],[`line`,{x1:`4`,x2:`20`,y1:`18`,y2:`18`,key:`yk5zj1`}]]),Ts=$(`PencilIcon`,[[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`,key:`1a8usu`}],[`path`,{d:`m15 5 4 4`,key:`1mk7zo`}]]),Es=$(`PlusIcon`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`M12 5v14`,key:`s699le`}]]),Ds=$(`RefreshCwIcon`,[[`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`,key:`v9h5vc`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}],[`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`,key:`3uifl3`}],[`path`,{d:`M8 16H3v5`,key:`1cv678`}]]),Os=$(`Repeat2Icon`,[[`path`,{d:`m2 9 3-3 3 3`,key:`1ltn5i`}],[`path`,{d:`M13 18H7a2 2 0 0 1-2-2V6`,key:`1r6tfw`}],[`path`,{d:`m22 15-3 3-3-3`,key:`4rnwn2`}],[`path`,{d:`M11 6h6a2 2 0 0 1 2 2v10`,key:`2f72bc`}]]),ks=$(`SearchIcon`,[[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}],[`path`,{d:`m21 21-4.3-4.3`,key:`1qie3q`}]]),As=$(`SettingsIcon`,[[`path`,{d:`M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z`,key:`1qme2f`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),js=$(`Trash2Icon`,[[`path`,{d:`M3 6h18`,key:`d0wm0j`}],[`path`,{d:`M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6`,key:`4alrt4`}],[`path`,{d:`M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2`,key:`v07s0e`}],[`line`,{x1:`10`,x2:`10`,y1:`11`,y2:`17`,key:`1uufr5`}],[`line`,{x1:`14`,x2:`14`,y1:`11`,y2:`17`,key:`xtxkd`}]]),Ms=$(`UploadIcon`,[[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}],[`polyline`,{points:`17 8 12 3 7 8`,key:`t8dd8p`}],[`line`,{x1:`12`,x2:`12`,y1:`3`,y2:`15`,key:`widbto`}]]),Ns=$(`XIcon`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]),Ps=e=>e.replace(/&/g,`&`).replace(//g,`>`).replace(/"/g,`"`).replace(/'/g,`'`),Fs=e=>{let t=Ps(e);return t=t.replace(/`([^`]+)`/g,`$1`),t=t.replace(/\*\*([^*]+)\*\*/g,`$1`),t=t.replace(/\*([^*]+)\*/g,`$1`),t=t.replace(/\[([^\]]+)\]\((https?:\/\/[^\s)]+)\)/g,`$1`),t};function Is(e=``){let t=e.replace(/\r\n/g,` -`).split(` -`),n=[],r=!1,i=()=>{r&&=(n.push(``),!1)};for(let e of t){let t=e.trimEnd();if(!t.trim()){i();continue}t.startsWith(`# `)?(i(),n.push(`

${Fs(t.slice(2))}

`)):t.startsWith(`## `)?(i(),n.push(`

${Fs(t.slice(3))}

`)):/^[-*] /.test(t)?(r||=(n.push(`
    `),!0),n.push(`
  • ${Fs(t.slice(2))}
  • `)):(i(),n.push(`

    ${Fs(t)}

    `))}return i(),n.join(``)}function Ls(e,t){let n=t.trim().toLowerCase();return n?e.filter(e=>[e.title,e.description??``,e.list_name??``,...(e.tags??[]).map(e=>e.name)].join(` `).toLowerCase().includes(n)):e}function Rs(e){let t=new Map;for(let n of e)n.parent_id&&t.set(n.parent_id,[...t.get(n.parent_id)??[],n]);return e.filter(e=>!e.parent_id).map(e=>({task:e,subtasks:t.get(e.id)??[]}))}function zs(e){if(!e)return``;let t=new Date(e);return Number.isNaN(t.valueOf())?``:`${t.getFullYear()}-${`${t.getMonth()+1}`.padStart(2,`0`)}-${`${t.getDate()}`.padStart(2,`0`)}T${`${t.getHours()}`.padStart(2,`0`)}:${`${t.getMinutes()}`.padStart(2,`0`)}`}function Bs(e){return e?new Date(e).toISOString():null}function Vs(e){return`${e.getFullYear()}-${`${e.getMonth()+1}`.padStart(2,`0`)}-${`${e.getDate()}`.padStart(2,`0`)}`}function Hs(e){return Array.isArray(e)?{items:e,nextCursor:null}:{items:e.items??[],nextCursor:e.next_cursor??null}}function Us(e){return e===`tasks`||e===`today`||e===`upcoming`}function Ws(){return`today`}function Gs(e,t,n=1){return e===`numeric`?Number(t??0)>=n:!!t}function Ks(e,t){let n=(e.cells??[]).find(e=>e.day===t);return!(!n?.scheduled||n.paused)}function qs(e,t,n=1){let r=Number(t??0);return e===`numeric`?Math.min(r+1,n):r>0?0:1}function Js(e,t){let n=Number(t??0);return e===`numeric`?Math.max(0,n-1):0}function Ys(e,t){return e>=64&&e>Math.abs(t)*1.5}function Xs(e){if(e&&![`GET`,`HEAD`,`OPTIONS`].includes(e.toUpperCase())){let e=Zs(`dodo_csrf`);if(e)return{"x-csrf-token":e}}return{}}function Zs(e){if(typeof document>`u`)return``;let t=e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),n=document.cookie.match(RegExp(`(?:^|; )${t}=([^;]*)`));return n?decodeURIComponent(n[1]):``}var Qs={key:0,class:`inline-error`},$s={key:0,class:`view-intro`},ec={key:1,class:`habit-list today-habit-list`},tc=[`onTouchstartPassive`,`onTouchmovePassive`,`onTouchend`,`onTouchcancel`],nc={class:`habit-main`},rc={class:`habit-name`},ic=[`aria-label`,`onClick`],ac={key:0,class:`empty-panel`},oc={key:2,class:`empty-panel`},sc={class:`primary-small`},cc={key:4,class:`habit-list`},lc=[`onTouchstartPassive`,`onTouchmovePassive`,`onTouchend`,`onTouchcancel`],uc={class:`habit-main`},dc={class:`habit-name`},fc=[`aria-label`,`aria-pressed`,`onClick`],pc=[`onClick`],mc={key:0,class:`empty-panel`},hc={class:`settings-grid`},gc={class:`tool-card`},_c={class:`file-button`},vc={class:`tool-card`},yc={class:`file-button`},bc=[`disabled`],xc={key:0},Sc={class:`tool-card wide`},Cc=[`onClick`],wc={key:0},Tc={key:0,class:`tool-card wide`},Ec=Yn({__name:`MvpPanel`,props:{view:{}},emits:[`changed`,`notice`],setup(e,{emit:t}){let n=e,r=t,i=H([]),a=H([]),o=H([]),s=H(!1),c=H(``),l=H(``),u=H(`boolean`),d=H(1),f=H(null),p=H(null),m=H(null),h=H(Vs(new Date)),g=H(null),_=H({}),v=Ta(()=>i.value.filter(e=>Ks(e,h.value))),y;function b(e){if(typeof e==`string`)return e;if(Array.isArray(e))return e.map(e=>e&&typeof e==`object`&&`msg`in e&&typeof e.msg==`string`?e.msg:String(e)).join(`;`)||`请求参数有误`;if(e&&typeof e==`object`){let t=e;return`detail`in t?b(t.detail):JSON.stringify(e)}return`请求失败`}async function x(e,t={}){let n={...t.headers||{}};t.body&&!(t.body instanceof FormData)&&(n[`Content-Type`]=`application/json`);let r=Xs(t.method);r[`x-csrf-token`]&&(n[`x-csrf-token`]=r[`x-csrf-token`]);let i=await fetch(`/api/v1`+e,{credentials:`include`,...t,headers:n});if(!i.ok){let e=await i.json().catch(()=>({}));throw Error(b(e.detail))}let a=i.headers.get(`content-type`)||``;return i.status===204?null:a.includes(`json`)?i.json():i.blob()}async function S(e){s.value=!0,c.value=``;try{await e()}catch(e){c.value=e instanceof Error?e.message:`请求失败`}finally{s.value=!1}}function C(e,t){return(e.cells??[]).find(e=>e.day===t)}function w(e,t){return Gs(e.kind,C(e,t)?.value,e.target??1)}function T(e){return e instanceof Element&&!!e.closest(`button,input,select,textarea,a,label`)}function ee(e,t){if(s.value||T(t.target))return;let n=t.touches[0];n&&(g.value={id:e.id,x:n.clientX,y:n.clientY},_.value[e.id]=0)}function te(e,t){let n=g.value,r=t.touches[0];if(!n||n.id!==e.id||!r)return;let i=r.clientX-n.x,a=r.clientY-n.y,o=Number(C(e,h.value)?.value??0);Math.abs(i)>Math.abs(a)&&(i>0&&o<(e.target??1)||i<0&&o>0)&&(_.value[e.id]=Math.max(-92,Math.min(i,92)))}function E(e){return e.kind===`numeric`?`${Number(C(e,h.value)?.value??0)} / ${e.target??1} · ${w(e,h.value)?`左滑减少一次`:`右滑完成一次`}`:w(e,h.value)?`今天已完成 · 左滑取消`:`右滑整行打卡`}function ne(e){return e.kind===`numeric`?`${Number(C(e,h.value)?.value??0)} / ${e.target??1}`:w(e,h.value)?`已完成`:`打卡`}async function D(e,t){let n=C(e,h.value)?.value,i=t>0?qs(e.kind,n,e.target??1):Js(e.kind,n);await S(async()=>{await x(`/habits/${e.id}/logs/${h.value}`,{method:`PUT`,body:JSON.stringify({value:i})}),await ae(),r(`notice`,i>Number(n??0)?`已记录一次 🎉`:`已减少一次`)})}async function O(e,t){let n=g.value;if(g.value=null,_.value[e.id]=0,!n||n.id!==e.id||s.value)return;let r=t.changedTouches[0],i=r?r.clientX-n.x:0,a=r?r.clientY-n.y:0,o=Number(C(e,h.value)?.value??0),c=e.kind===`numeric`?i>0&&o<(e.target??1)||i<0&&o>0:w(e,h.value)?i<0:i>0;r&&c&&Ys(Math.abs(i),a)&&await D(e,i)}function re(e){g.value=null,e&&(_.value[e.id]=0)}async function k(e){let t=C(e,h.value)?.value,n=w(e,h.value)?Js(e.kind,t):qs(e.kind,t,e.target??1);await S(async()=>{await x(`/habits/${e.id}/logs/${h.value}`,{method:`PUT`,body:JSON.stringify({value:n})}),await ae(),r(`notice`,n>Number(t??0)?`已记录一次 🎉`:`已减少一次`)})}async function A(){l.value.trim()&&await S(async()=>{await x(`/habits`,{method:`POST`,body:JSON.stringify({name:l.value.trim(),kind:u.value,target:d.value,schedule_type:`daily`})}),l.value=``,await ae(),r(`notice`,`习惯已创建`)})}async function j(e){confirm(`归档习惯“${e.name}”?历史打卡记录会保留。`)&&await S(async()=>{await x(`/habits/${e.id}`,{method:`DELETE`}),await ae(),r(`notice`,`习惯已归档`)})}function ie(){let e=Vs(new Date);e!==h.value&&(h.value=e,n.view===`habits`&&ae())}async function ae(){await S(async()=>{let e=await x(`/habits/grid?week=${Vs(new Date)}`);i.value=e.habits??[]})}async function oe(){await S(async()=>{let[e,t]=await Promise.all([x(`/sessions`).catch(()=>[]),x(`/audit-logs?limit=20`).catch(()=>[])]);a.value=Hs(e).items,o.value=Hs(t).items})}async function se(e){await S(async()=>{await x(`/sessions/${e}`,{method:`DELETE`}),await oe(),r(`notice`,`会话已撤销`)})}function le(e,t){let n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=t,r.click(),setTimeout(()=>URL.revokeObjectURL(n),1e3)}async function ue(){await S(async()=>le(await x(`/export`),`dodo-export.json`))}async function de(){f.value&&await S(async()=>{let e=new FormData;e.append(`file`,f.value),p.value=await x(`/import/ticktick/preview`,{method:`POST`,body:e})})}async function fe(){await S(async()=>{let e=new FormData;e.append(`file`,f.value);let t=await x(`/import/ticktick`,{method:`POST`,body:e});p.value=null,r(`changed`),r(`notice`,`导入完成:新增 ${t?.imported??0},跳过 ${t?.skipped??0}`)})}async function pe(){m.value&&confirm(`恢复为合并模式,将导入 JSON 中的清单与任务。继续吗?`)&&await S(async()=>{await x(`/restore?mode=merge`,{method:`POST`,body:await m.value.text()}),r(`changed`),r(`notice`,`数据已恢复`)})}return ur(()=>{n.view===`habits`||n.view===`today-habits`?(ie(),ae(),y=setInterval(ie,6e4)):oe()}),pr(()=>{y&&clearInterval(y)}),(t,n)=>(q(),J(`section`,{class:M([`mvp-view`,{loading:s.value}])},[c.value?(q(),J(`p`,Qs,N(c.value),1)):Q(``,!0),e.view===`habits`||e.view===`today-habits`?(q(),J(K,{key:1},[e.view===`habits`?(q(),J(`header`,$s,[n[6]||=Y(`div`,null,[Y(`small`,null,`把想坚持的事,变成每天的日常`),Y(`h2`,null,`习惯`)],-1),Y(`button`,{class:`soft-button`,onClick:ae},[X(U(Ds)),n[5]||=Z(`刷新`,-1)])])):Q(``,!0),e.view===`today-habits`&&!s.value?(q(),J(`div`,ec,[(q(!0),J(K,null,G(v.value,e=>(q(),J(`article`,{key:e.id,class:M([`habit-row swipeable`,{done:w(e,h.value),ready:Math.abs(_.value[e.id]??0)>=64}]),style:ce({"--swipe-x":`${_.value[e.id]??0}px`,"--swipe-width":`${Math.abs(_.value[e.id]??0)}px`}),onTouchstartPassive:t=>ee(e,t),onTouchmovePassive:t=>te(e,t),onTouchend:t=>O(e,t),onTouchcancel:t=>re(e)},[Y(`span`,{class:M([`swipe-bg`,{cancel:w(e,h.value)}])},N(w(e,h.value)?e.kind===`numeric`?`− 一次`:`↩ 未完成`:e.kind===`numeric`?`+ 一次`:`✓ 打卡`),3),Y(`div`,nc,[Y(`span`,null,[Y(`span`,rc,N(e.name),1),Y(`small`,null,N(E(e)),1)]),Y(`button`,{class:`habit-swipe-hint`,"aria-label":w(e,h.value)?`减少${e.name}一次`:`完成${e.name}一次`,onClick:Zo(t=>k(e),[`stop`])},N(ne(e)),9,ic)])],46,tc))),128)),v.value.length?Q(``,!0):(q(),J(`div`,ac,`今天没有安排习惯,轻松一下吧。`))])):e.view===`today-habits`&&s.value?(q(),J(`div`,oc,`加载中…`)):Q(``,!0),e.view===`habits`?(q(),J(`form`,{key:3,class:`habit-create`,onSubmit:Zo(A,[`prevent`])},[W(Y(`input`,{"onUpdate:modelValue":n[0]||=e=>l.value=e,placeholder:`新习惯名称(如:喝水 8 杯)`,"aria-label":`新习惯名称`},null,512),[[Vo,l.value]]),W(Y(`select`,{"onUpdate:modelValue":n[1]||=e=>u.value=e,"aria-label":`习惯类型`},[...n[7]||=[Y(`option`,{value:`boolean`},`完成 / 未完成`,-1),Y(`option`,{value:`numeric`},`按数量记录`,-1)]],512),[[Wo,u.value]]),u.value===`numeric`?W((q(),J(`input`,{key:0,"onUpdate:modelValue":n[2]||=e=>d.value=e,type:`number`,min:`0`,step:`any`,placeholder:`目标值`,"aria-label":`目标值`},null,512)),[[Vo,d.value,void 0,{number:!0}]]):Q(``,!0),Y(`button`,sc,[X(U(Es)),n[8]||=Z(`添加`,-1)])],32)):Q(``,!0),e.view===`habits`?(q(),J(`div`,cc,[(q(!0),J(K,null,G(i.value,e=>(q(),J(`article`,{key:e.id,class:M([`habit-row swipeable`,{done:w(e,h.value),ready:Math.abs(_.value[e.id]??0)>=64}]),style:ce({"--swipe-x":`${_.value[e.id]??0}px`,"--swipe-width":`${Math.abs(_.value[e.id]??0)}px`}),onTouchstartPassive:t=>ee(e,t),onTouchmovePassive:t=>te(e,t),onTouchend:t=>O(e,t),onTouchcancel:t=>re(e)},[Y(`span`,{class:M([`swipe-bg`,{cancel:w(e,h.value)}])},N(w(e,h.value)?e.kind===`numeric`?`− 一次`:`↩ 未完成`:e.kind===`numeric`?`+ 一次`:`✓ 打卡`),3),Y(`div`,uc,[Y(`span`,null,[Y(`span`,dc,N(e.name),1),Y(`small`,null,N(E(e)),1)]),Y(`button`,{class:`habit-swipe-hint`,"aria-label":w(e,h.value)?`减少${e.name}一次`:`完成${e.name}一次`,"aria-pressed":w(e,h.value),onClick:Zo(t=>k(e),[`stop`])},N(ne(e)),9,fc)]),Y(`button`,{class:`icon ghost`,"aria-label":`归档习惯`,onClick:t=>j(e)},[X(U(js))],8,pc)],46,lc))),128)),!i.value.length&&!s.value?(q(),J(`div`,mc,`还没有习惯,从一件容易坚持的小事开始。`)):Q(``,!0)])):Q(``,!0)],64)):(q(),J(K,{key:2},[n[18]||=Y(`header`,{class:`view-intro`},[Y(`div`,null,[Y(`small`,null,`备份、迁移与安全`),Y(`h2`,null,`设置与数据`)])],-1),Y(`div`,hc,[Y(`article`,gc,[X(U(_s)),n[11]||=Y(`h3`,null,`数据导出与恢复`,-1),n[12]||=Y(`p`,null,`下载完整 JSON 备份,或从备份恢复。`,-1),Y(`button`,{class:`soft-button`,onClick:ue},[X(U(gs)),n[9]||=Z(`导出 JSON`,-1)]),Y(`label`,_c,[X(U(us)),n[10]||=Z(`选择备份`,-1),Y(`input`,{type:`file`,accept:`application/json`,onChange:n[3]||=e=>m.value=e.target.files?.[0]||null},null,32)]),m.value?(q(),J(`button`,{key:0,class:`danger-button`,onClick:pe},`确认恢复`)):Q(``,!0)]),Y(`article`,vc,[X(U(Ms)),n[14]||=Y(`h3`,null,`导入`,-1),n[15]||=Y(`p`,null,`先预览变化,确认后才写入。`,-1),Y(`label`,yc,[n[13]||=Z(`选择文件`,-1),Y(`input`,{type:`file`,accept:`.json,.csv`,onChange:n[4]||=e=>f.value=e.target.files?.[0]||null},null,32)]),Y(`button`,{disabled:!f.value,class:`soft-button`,onClick:de},`生成预览`,8,bc),p.value?(q(),J(`pre`,xc,N(JSON.stringify(p.value,null,2)),1)):Q(``,!0),p.value?(q(),J(`button`,{key:1,class:`primary-small`,onClick:fe},`确认导入`)):Q(``,!0)]),Y(`article`,Sc,[X(U(Cs)),n[16]||=Y(`h3`,null,`登录会话`,-1),(q(!0),J(K,null,G(a.value,e=>(q(),J(`div`,{key:e.id,class:`session-row`},[Y(`span`,null,[Y(`b`,null,N(e.current?`当前设备`:`其他设备`),1),Y(`small`,null,N(e.user_agent||`未知设备`)+` · `+N(e.last_seen_at||e.created_at),1)]),e.current?Q(``,!0):(q(),J(`button`,{key:0,class:`danger-text`,onClick:t=>se(e.id)},`撤销`,8,Cc))]))),128)),a.value.length?Q(``,!0):(q(),J(`p`,wc,`没有可显示的会话。`))]),o.value.length?(q(),J(`article`,Tc,[X(U(ls)),n[17]||=Y(`h3`,null,`最近活动`,-1),(q(!0),J(K,null,G(o.value,(e,t)=>(q(),J(`div`,{key:e.id||t,class:`audit-row`},[Y(`span`,null,N(e.action||e.event||`变更`),1),Y(`small`,null,N(e.created_at||e.timestamp),1)]))),128))])):Q(``,!0)])],64))],2))}}),Dc={key:0,class:`center`},Oc={key:1,class:`auth-shell`},kc={class:`auth-card`},Ac={key:0,role:`alert`},jc={key:2,class:`shell`},Mc={class:`brand-row`},Nc={class:`primary-nav`},Pc={class:`section-title`},Fc={class:`folders`},Ic={class:`folder-row`},Lc=[`onClick`],Rc={class:`row-actions`},zc=[`onClick`],Bc=[`onClick`],Vc=[`onClick`],Hc=[`onClick`],Uc={class:`row-actions`},Wc=[`onClick`],Gc=[`onClick`],Kc=[`onClick`],qc={class:`row-actions`},Jc=[`onClick`],Yc=[`onClick`],Xc=[`onClick`],Zc={class:`row-actions`},Qc=[`onClick`],$c={class:`topbar`},el={key:0,class:`search`},tl={class:`view-intro`},nl={class:`settings-grid`},rl={class:`tool-card wide`},il={class:`sub-add`},al={key:0},ol=[`onClick`],sl={key:1,class:`hint`},cl={key:0,class:`tool-card wide`},ll={key:0,class:`calendar-events`},ul={class:`ev-time`},dl={key:1,class:`hint`},fl={key:0,class:`section-heading`},pl={class:`list-toolbar`},ml={key:0},hl={key:2,class:`pager`},gl=[`disabled`],_l=[`disabled`],vl=[`onTouchstartPassive`,`onTouchmovePassive`,`onTouchend`,`onTouchcancel`],yl=[`onClick`,`onKeydown`],bl={class:`meta`},xl={key:0},Sl={key:1},Cl=[`title`],wl=[`aria-label`,`aria-pressed`,`onClick`],Tl=[`onClick`],El=[`onClick`],Dl=[`onClick`],Ol=[`onTouchstartPassive`,`onTouchmovePassive`,`onTouchend`,`onTouchcancel`],kl=[`onClick`,`onKeydown`],Al=[`aria-label`,`aria-pressed`,`onClick`],jl={key:0,class:`empty`},Ml={key:3},Nl={class:`section-heading`},Pl={class:`calendar-events`},Fl={class:`ev-time`},Il={key:4},Ll={class:`section-heading`},Rl={class:`detail-head`},zl={key:0,class:`detail-form`},Bl={class:`detail-title`},Vl=[`value`],Hl=[`value`],Ul={key:0},Wl={class:`field`},Gl={class:`field-label`},Kl={class:`tag-picker`},ql=[`onClick`],Jl={key:0,class:`hint`},Yl={class:`field markdown`},Xl={class:`field-label`},Zl=[`innerHTML`],Ql={class:`subtasks`},$l={class:`field-label`},eu=[`onClick`],tu={class:`check`},nu={key:0,class:`hint`},ru={class:`detail-actions`},iu={key:1,class:`paper`},au={class:`bottom`},ou={key:0,class:`toast`,role:`status`},su={key:2,class:`error-toast`,role:`alert`},cu={class:`modal-box`,role:`dialog`,"aria-modal":`true`},lu={key:0},uu={class:`modal-actions`},du=50;rs(Yn({__name:`App`,setup(e){let t=H(null),n=H(!1),r=H(!1),i=H(``),a=H(``),o=H([]),s=H([]),c=H([]),l=H([]),u=H([]),d=H(`合并日历`),f=H(`https://cal.bboy.app/all.ics`),p=H([]),m=H([]),h=H([]),g=H(``),_=H(Ws()),v=H(null),y=H(``),b=H(``),x=H(``),S=H(``),C=H(!1),w=H(!1),T=H(!1),ee=H(!1),te=H(!0),E=H(1),ne=H(0),D=Ta(()=>Math.max(1,Math.ceil(ne.value/du))),O=H(new Set),re=H(!1),k=H(null),A=H({}),j=``,ie=H(!1),ae=H(``),oe=H(``),se=H(``),le=H(`确定`),ue=H(null);function de(e,t=``,n=``,r=`确定`){return new Promise(i=>{ae.value=e,oe.value=t,se.value=n,le.value=r,ie.value=!0,ue.value=i})}function fe(){ie.value=!1,ue.value&&=(ue.value(null),null)}function pe(){ie.value=!1,ue.value&&=(ue.value(se.value),null)}let me=Ta(()=>_.value===`trash`?`回收站`:_.value===`today`?`今天`:_.value===`calendar`?`日历`:_.value===`upcoming`?`最近 7 天`:_.value===`habits`?`习惯`:_.value===`settings`?`设置与数据`:s.value.find(e=>e.id===g.value)?.name||`收集箱`),he=Ta(()=>_.value===`trash`?h.value:m.value),ge=Ta(()=>{let e=new Date,t=new Date(e);t.setDate(t.getDate()+7);let n=he.value;return[`habits`,`settings`,`calendar`].includes(_.value)?[]:(_.value===`today`&&(n=n.filter(t=>t.due_at&&new Date(t.due_at).toDateString()===e.toDateString())),_.value===`upcoming`&&(n=n.filter(n=>n.due_at&&new Date(n.due_at)>=e&&new Date(n.due_at)<=t)),b.value.trim()?Ls(n,b.value):n)}),_e=Ta(()=>v.value?.subtasks??[]),ve=Ta(()=>Rs(ge.value)),ye=Ta(()=>ve.value),be;On(b,()=>{be&&window.clearTimeout(be),Us(_.value)&&(E.value=1,be=window.setTimeout(()=>Te(),250))}),On(te,()=>{Us(_.value)&&(E.value=1,Te())});async function P(e,t={}){let n=new Headers(t.headers||{});!n.has(`Content-Type`)&&t.body&&!(t.body instanceof FormData)&&n.set(`Content-Type`,`application/json`);let r=Xs(t.method);r[`x-csrf-token`]&&n.set(`x-csrf-token`,r[`x-csrf-token`]);let i=await fetch(`/api/v1`+e,{credentials:`include`,headers:n,...t});if(!i.ok){let e=`请求失败`;try{let t=await i.json();e=typeof t.detail==`string`?t.detail:e}catch{}throw Error(e)}return i.status===204?null:i.json()}function F(e){S.value=e,window.setTimeout(()=>{S.value===e&&(S.value=``)},2400)}function I(e){x.value=e instanceof Error?e.message:`请求失败`}async function xe(){n.value=!1;try{let e=await P(`/setup/status`);if(t.value=e.initialized,e.initialized){let e=await P(`/bootstrap`);r.value=!0,o.value=e.folders??[],s.value=e.lists??[],p.value=e.tags??[],re.value=!0,g.value=e.inbox_id||s.value.find(e=>e.is_inbox)?.id||s.value[0]?.id||``,O.value=new Set(o.value.map(e=>e.id)),await Te()}}catch{r.value=!1,t.value??=!0}finally{n.value=!0}}async function Se(){x.value=``;try{await P(t.value?`/auth/login`:`/setup/initialize`,{method:`POST`,body:JSON.stringify({username:i.value,password:a.value})}),t.value=!0,r.value=!0;let e=await P(`/bootstrap`);o.value=e.folders??[],s.value=e.lists??[],p.value=e.tags??[],re.value=!0,g.value=e.inbox_id||s.value.find(e=>e.is_inbox)?.id||s.value[0]?.id||``,O.value=new Set(o.value.map(e=>e.id)),await Te()}catch(e){I(e)}}function L(e){let t=new Date;return t.setDate(t.getDate()+e),t.setHours(0,0,0,0),t.toISOString()}async function Ce(){let e=new URLSearchParams({page:String(E.value),page_size:String(du)});b.value?e.set(`q`,b.value):_.value===`tasks`&&g.value&&e.set(`list_id`,g.value),_.value===`today`&&(e.set(`due_from`,L(0)),e.set(`due_to`,L(1))),_.value===`upcoming`&&(e.set(`due_from`,L(0)),e.set(`due_to`,L(8))),!te.value&&_.value!==`trash`&&e.set(`completed`,`false`);let t=await P(`/tasks?${e}`);m.value=t.items??[],ne.value=t.total??m.value.length}async function we(e=!1){if(!e&&re.value)return;let[t,n,r]=await Promise.all([P(`/folders`),P(`/lists`),P(`/tags`).catch(()=>[])]);o.value=t,s.value=n,p.value=r,re.value=!0,s.value.some(e=>e.id===g.value)||(g.value=s.value.find(e=>e.is_inbox)?.id||s.value[0]?.id||``),O.value=new Set(o.value.map(e=>e.id)),await Je()}async function Te(){C.value=!0,x.value=``;try{re.value||await we(),await Ce(),E.value>D.value&&(E.value=D.value,await Ce())}catch(e){I(e)}finally{C.value=!1}}async function Ee(){re.value=!1,await Te()}async function De(){let e=await P(`/trash?page=${E.value}&page_size=${du}`);h.value=e.items??[],ne.value=e.total??h.value.length}async function Oe(){C.value=!0,x.value=``;try{await De()}catch(e){I(e)}finally{C.value=!1}}async function R(e,t){_.value=e,t&&(g.value=t),E.value=1,v.value=null,w.value=!1,T.value=!1,e===`trash`?await Oe():e===`calendar`?await Xe():e===`today`?await Ae():Us(e)?await Te():m.value=[]}async function ke(){if(y.value.trim()&&g.value)try{let e=await P(`/tasks`,{method:`POST`,body:JSON.stringify({title:y.value.trim(),list_id:g.value})});m.value.push(e),y.value=``,Ue(e),F(`任务已添加`)}catch(e){I(e)}}async function Ae(){await Promise.all([Te(),it()])}async function je(e,t){let n=await P(`/tasks/${e.id}`,{method:`PATCH`,body:JSON.stringify({...t,version:e.version})}),r=m.value.findIndex(t=>t.id===e.id);return r>=0&&(m.value[r]={...m.value[r],...n}),v.value?.id===e.id&&(v.value={...v.value,...n}),n}async function Me(e){try{await je(e,{completed:!e.completed}),F(e.completed?`已重新打开`:`完成啦`)}catch(e){I(e)}}function Ne(e){return e instanceof Element&&!!e.closest(`button,input,select,textarea,a,label`)}function Pe(e,t){if(_.value===`trash`||C.value||Ne(t.target))return;let n=t.touches[0];n&&(k.value={id:e.id,x:n.clientX,y:n.clientY},A.value[e.id]=0)}function Fe(e,t){let n=k.value,r=t.touches[0];if(!n||n.id!==e.id||!r)return;let i=r.clientX-n.x,a=r.clientY-n.y;Math.abs(i)>Math.abs(a)&&(!e.completed&&i>0||e.completed&&i<0)&&(A.value[e.id]=Math.max(-92,Math.min(i,92)))}async function Ie(e,t){let n=k.value;k.value=null;let r=A.value[e.id]??0;if(A.value[e.id]=0,!n||n.id!==e.id||_.value===`trash`||C.value)return;let i=t.changedTouches[0],a=i?i.clientX-n.x:0,o=i?i.clientY-n.y:0,s=e.completed?a<0:a>0;i&&s&&Ys(Math.abs(a),o)?(j=e.id,window.setTimeout(()=>{j===e.id&&(j=``)},400),await Me(e)):r&&(A.value[e.id]=0)}function Le(e){k.value=null,e&&(A.value[e.id]=0)}function Re(e){if(j===e.id){j=``;return}Ue(e)}async function z(){if(v.value?.title.trim())try{let e=v.value;await je(e,{title:e.title.trim(),description:e.description,priority:Number(e.priority),due_at:Bs(zs(e.due_at)),list_id:e.list_id,recurrence_rule:e.recurrence_rule||null,recurrence_end_at:e.recurrence_end_at||null,tag_ids:(e.tags??[]).map(e=>e.id)}),F(`已保存`)}catch(e){I(e)}}async function ze(e){if(window.confirm(`把“${e.title}”移到回收站?`))try{await P(`/tasks/${e.id}`,{method:`DELETE`}),m.value=m.value.filter(t=>t.id!==e.id&&t.parent_id!==e.id),v.value=null,T.value=!1,F(`已移到回收站`)}catch(e){I(e)}}async function Be(e){try{await P(`/tasks/${e.id}/restore`,{method:`POST`}),h.value=h.value.filter(t=>t.id!==e.id),F(`任务已恢复`)}catch(e){I(e)}}async function Ve(e){if(window.confirm(`永久删除“${e.title}”?这个操作不能撤销。`))try{await P(`/trash/${e.id}`,{method:`DELETE`}),h.value=h.value.filter(t=>t.id!==e.id),F(`已永久删除`)}catch(e){I(e)}}async function He(){if(!v.value)return;let e=(await de(`添加子任务`,`子任务名称`,``,`添加`))?.trim();if(e)try{let t=await P(`/tasks`,{method:`POST`,body:JSON.stringify({title:e,list_id:v.value.list_id,parent_id:v.value.id})});v.value&&(v.value.subtasks=[...v.value.subtasks??[],t]),m.value.push(t),F(`子任务已添加`)}catch(e){I(e)}}function Ue(e){v.value={...e,tags:e.tags?[...e.tags]:[]},ee.value=!1,T.value=!0}async function We(){let e=(await de(`新建文件夹`,`文件夹名称`,``,`创建`))?.trim();if(e)try{o.value.push(await P(`/folders`,{method:`POST`,body:JSON.stringify({name:e})})),F(`文件夹已创建`)}catch(e){I(e)}}async function Ge(e=null){let t=(await de(`新建清单`,`清单名称`,``,`创建`))?.trim();if(t)try{let n=await P(`/lists`,{method:`POST`,body:JSON.stringify({name:t,folder_id:e})});s.value.push(n),await R(`tasks`,n.id),F(`清单已创建`)}catch(e){I(e)}}async function Ke(e,t){let n=(await de(`重命名`,e===`lists`?`清单名称`:`文件夹名称`,t.name,`保存`))?.trim();if(n&&n!==t.name)try{let r=await P(`/${e}/${t.id}`,{method:`PATCH`,body:JSON.stringify({name:n})});Object.assign(t,r),F(`已重命名`)}catch(e){I(e)}}async function qe(){let e=(await de(`新建标签`,`标签名称`,``,`创建`))?.trim();if(!e)return;let t=(await de(`标签颜色`,`颜色(十六进制)`,`#F15A29`,`创建`))?.trim()||`#F15A29`;try{p.value.push(await P(`/tags`,{method:`POST`,body:JSON.stringify({name:e,color:t})})),F(`标签已创建`)}catch(e){I(e)}}async function B(e,t){if(e===`lists`){if(await de(`归档清单「${t.name}」?`,``,``,`归档`)===null)return;try{await P(`/${e}/${t.id}`,{method:`DELETE`}),await Je(),await Ee(),F(`清单已归档`)}catch(e){I(e)}return}if(await de(`删除文件夹「${t.name}」?`,``,``,`删除`)!==null)try{await P(`/${e}/${t.id}`,{method:`DELETE`}),await Ee(),F(`已删除`)}catch(e){I(e)}}async function Je(){try{c.value=await P(`/lists?archived=true`)}catch{c.value=[]}}async function Ye(e){try{await P(`/lists/${e.id}/restore`,{method:`POST`}),await Je(),await Ee(),F(`清单已恢复`)}catch(e){I(e)}}async function Xe(){try{l.value=await P(`/calendar-subscriptions`),l.value.length?u.value=await P(`/calendar-subscriptions/today?day=${Vs(new Date)}`):u.value=[]}catch{l.value=[],u.value=[]}}async function Ze(){if(f.value.trim())try{await P(`/calendar-subscriptions`,{method:`POST`,body:JSON.stringify({name:d.value.trim()||f.value,url:f.value.trim(),color:`#f15a29`})}),await Xe(),F(`日历已订阅`)}catch(e){I(e)}}async function Qe(e){if(window.confirm(`取消这个日历订阅?`))try{await P(`/calendar-subscriptions/${e}`,{method:`DELETE`}),await Xe(),F(`已取消订阅`)}catch(e){I(e)}}function $e(e){return!!v.value?.tags?.some(t=>t.id===e.id)}function et(e){v.value&&(v.value.tags=$e(e)?(v.value.tags??[]).filter(t=>t.id!==e.id):[...v.value.tags??[],e])}function tt(e){let t=new Set(O.value);t.has(e)?t.delete(e):t.add(e),O.value=t}function nt(e){return e?new Intl.DateTimeFormat(`zh-CN`,{month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`}).format(new Date(e)):``}function rt(e){if(e.all_day)return`全天`;let t=new Date(e.starts_at);return`${t.getHours().toString().padStart(2,`0`)}:${t.getMinutes().toString().padStart(2,`0`)}`}async function it(){try{l.value=await P(`/calendar-subscriptions`),u.value=l.value.length?await P(`/calendar-subscriptions/today?day=${Vs(new Date)}`):[]}catch{u.value=[]}}function at(){un(()=>document.querySelector(`.quick-input`)?.focus())}function ot(){E.value<=1||C.value||(--E.value,_.value===`trash`?Oe():Us(_.value)&&Te())}function st(){E.value>=D.value||C.value||(E.value+=1,_.value===`trash`?Oe():Us(_.value)&&Te())}return ur(xe),(e,m)=>{let h=br(`RefreshCw`),re=br(`Upload`);return n.value?r.value?(q(),J(`div`,jc,[w.value||T.value?(q(),J(`div`,{key:0,class:`scrim`,onClick:m[2]||=e=>{w.value=!1,T.value=!1}})):Q(``,!0),Y(`aside`,{class:M([`sidebar`,{open:w.value}])},[Y(`div`,Mc,[m[42]||=Y(`div`,{class:`brand small`},[Z(`do`),Y(`span`,null,`do`)],-1),Y(`button`,{class:`icon mobile-only`,"aria-label":`关闭菜单`,onClick:m[3]||=e=>w.value=!1},[X(U(Ns))])]),Y(`nav`,Nc,[Y(`button`,{class:M({active:_.value===`tasks`&&s.value.find(e=>e.id===g.value)?.is_inbox}),onClick:m[4]||=e=>R(`tasks`,s.value.find(e=>e.is_inbox)?.id)},[X(U(bs)),m[43]||=Z(`收集箱`,-1)],2),Y(`button`,{class:M({active:_.value===`today`}),onClick:m[5]||=e=>R(`today`)},[X(U(Ss)),m[44]||=Z(`今天`,-1)],2),Y(`button`,{class:M({active:_.value===`upcoming`}),onClick:m[6]||=e=>R(`upcoming`)},[X(U(ds)),m[45]||=Z(`最近 7 天`,-1)],2),Y(`button`,{class:M({active:_.value===`calendar`}),onClick:m[7]||=e=>R(`calendar`)},[X(U(ds)),m[46]||=Z(`日历`,-1)],2),Y(`button`,{class:M({active:_.value===`habits`}),onClick:m[8]||=e=>R(`habits`)},[X(U(Os)),m[47]||=Z(`习惯`,-1)],2),Y(`button`,{class:M({active:_.value===`trash`}),onClick:m[9]||=e=>R(`trash`)},[X(U(js)),m[48]||=Z(`回收站`,-1)],2)]),Y(`div`,Pc,[m[49]||=Y(`span`,null,`我的清单`,-1),Y(`span`,null,[Y(`button`,{class:`mini-icon`,"aria-label":`新建文件夹`,onClick:We},[X(U(vs))]),Y(`button`,{class:`mini-icon`,"aria-label":`新建清单`,onClick:m[10]||=e=>Ge(null)},[X(U(Es))])])]),Y(`div`,Fc,[(q(!0),J(K,null,G(o.value,e=>(q(),J(`div`,{key:e.id,class:`folder-block`},[Y(`div`,Ic,[Y(`button`,{onClick:t=>tt(e.id)},[O.value.has(e.id)?(q(),Ki(U(ps),{key:0})):(q(),Ki(U(ms),{key:1})),X(U(vs)),Z(N(e.name),1)],8,Lc),Y(`span`,Rc,[Y(`button`,{"aria-label":`重命名文件夹`,onClick:t=>Ke(`folders`,e)},[X(U(Ts))],8,zc),Y(`button`,{"aria-label":`删除文件夹`,onClick:t=>B(`folders`,e)},[X(U(js))],8,Bc),Y(`button`,{"aria-label":`在文件夹中新建清单`,onClick:t=>Ge(e.id)},[X(U(Es))],8,Vc)])]),(q(!0),J(K,null,G(s.value.filter(t=>t.folder_id===e.id&&!t.is_inbox),t=>W((q(),J(`button`,{key:t.id,class:M([`list-row`,{active:_.value===`tasks`&&g.value===t.id}]),onClick:e=>R(`tasks`,t.id)},[m[50]||=Y(`i`,null,null,-1),Y(`span`,null,N(t.name),1),Y(`span`,Uc,[Y(`button`,{"aria-label":`重命名清单`,onClick:Zo(e=>Ke(`lists`,t),[`stop`])},[X(U(Ts))],8,Wc),Y(`button`,{"aria-label":`归档清单`,onClick:Zo(e=>B(`lists`,t),[`stop`])},[X(U(us))],8,Gc)])],10,Hc)),[[ao,O.value.has(e.id)]])),128))]))),128)),(q(!0),J(K,null,G(s.value.filter(e=>!e.folder_id&&!e.is_inbox),e=>(q(),J(`button`,{key:e.id,class:M([`list-row`,{active:_.value===`tasks`&&g.value===e.id}]),onClick:t=>R(`tasks`,e.id)},[m[51]||=Y(`i`,null,null,-1),Y(`span`,null,N(e.name),1),Y(`span`,qc,[Y(`button`,{"aria-label":`重命名清单`,onClick:Zo(t=>Ke(`lists`,e),[`stop`])},[X(U(Ts))],8,Jc),Y(`button`,{"aria-label":`归档清单`,onClick:Zo(t=>B(`lists`,e),[`stop`])},[X(U(us))],8,Yc)])],10,Kc))),128)),c.value.length?(q(),J(K,{key:0},[m[53]||=Y(`div`,{class:`section-title`},[Y(`span`,null,`已归档清单`)],-1),(q(!0),J(K,null,G(c.value,e=>(q(),J(`button`,{key:e.id,class:`list-row archived-row`,onClick:t=>Ye(e)},[X(U(us)),Y(`span`,null,N(e.name),1),Y(`span`,Zc,[Y(`button`,{"aria-label":`恢复清单`,onClick:Zo(t=>Ye(e),[`stop`])},[X(U(us)),m[52]||=Z(`恢复`,-1)],8,Qc)])],8,Xc))),128))],64)):Q(``,!0)]),Y(`button`,{class:M([`settings`,{active:_.value===`settings`}]),onClick:m[11]||=e=>R(`settings`)},[X(U(As)),m[54]||=Z(`设置`,-1)],2)],2),Y(`main`,null,[Y(`header`,$c,[Y(`button`,{class:`icon mobile-only`,"aria-label":`打开菜单`,onClick:m[12]||=e=>w.value=!0},[X(U(ws))]),Y(`div`,null,[m[55]||=Y(`p`,null,`今天也慢慢来`,-1),Y(`h1`,null,N(me.value),1)]),[`tasks`,`today`,`upcoming`,`trash`].includes(_.value)?(q(),J(`label`,el,[X(U(ks)),W(Y(`input`,{"onUpdate:modelValue":m[13]||=e=>b.value=e,placeholder:`搜索任务…`,"aria-label":`搜索任务`},null,512),[[Vo,b.value]]),m[56]||=Y(`kbd`,null,`⌘ K`,-1)])):Q(``,!0)]),[`habits`,`settings`,`calendar`].includes(_.value)?(q(),J(K,{key:0},[[`habits`,`settings`].includes(_.value)?(q(),Ki(Ec,{key:_.value,view:_.value,onChanged:Ee,onNotice:F},null,8,[`view`])):_.value===`calendar`?(q(),J(K,{key:1},[Y(`header`,tl,[m[58]||=Y(`div`,null,[Y(`small`,null,`订阅外部日历,每天自动同步`),Y(`h2`,null,`日历`)],-1),Y(`button`,{class:`soft-button`,onClick:Xe},[X(h),m[57]||=Z(`刷新`,-1)])]),Y(`div`,nl,[Y(`article`,rl,[X(re),m[59]||=Y(`h3`,null,`添加订阅`,-1),m[60]||=Y(`p`,null,`粘贴 ICS / webcal 链接,例如 cal.bboy.app 的合并日历。`,-1),Y(`div`,il,[W(Y(`input`,{"onUpdate:modelValue":m[14]||=e=>d.value=e,placeholder:`名称(可选)`,"aria-label":`订阅名称`},null,512),[[Vo,d.value]]),W(Y(`input`,{"onUpdate:modelValue":m[15]||=e=>f.value=e,placeholder:`https://…/all.ics`,"aria-label":`订阅地址`},null,512),[[Vo,f.value]]),Y(`button`,{class:`primary-small`,onClick:Ze},`订阅`)]),l.value.length?(q(),J(`div`,al,[(q(!0),J(K,null,G(l.value,e=>(q(),J(`div`,{key:e.id,class:`session-row`},[Y(`span`,null,[Y(`b`,null,N(e.name),1),Y(`small`,null,N(e.url),1)]),Y(`button`,{class:`danger-text`,onClick:t=>Qe(e.id)},`取消订阅`,8,ol)]))),128))])):(q(),J(`p`,sl,`还没有日历订阅`))]),l.value.length?(q(),J(`article`,cl,[X(U(ds)),m[61]||=Y(`h3`,null,`今日事件`,-1),u.value.length?(q(),J(`div`,ll,[(q(!0),J(K,null,G(u.value,e=>(q(),J(`div`,{key:e.id+e.starts_at,class:`calendar-event`},[Y(`span`,ul,N(rt(e)),1),Y(`b`,null,N(e.title),1),Y(`small`,null,N(e.source_name),1)]))),128))])):(q(),J(`p`,dl,`今天没有日历事件`))])):Q(``,!0)])],64)):Q(``,!0)],64)):(q(),J(K,{key:1},[_.value===`today`?(q(),J(`h3`,fl,[X(U(Ss)),m[62]||=Z(`今日任务`,-1)])):Q(``,!0),_.value===`trash`?Q(``,!0):(q(),J(`form`,{key:1,class:`quick`,onSubmit:Zo(ke,[`prevent`])},[X(U(hs)),W(Y(`input`,{"onUpdate:modelValue":m[16]||=e=>y.value=e,class:`quick-input`,placeholder:`添加任务,按回车保存`},null,512),[[Vo,y.value]]),m[63]||=Y(`button`,null,`添加`,-1)],32)),Y(`div`,pl,[_.value===`trash`?Q(``,!0):(q(),J(`label`,ml,[W(Y(`input`,{"onUpdate:modelValue":m[17]||=e=>te.value=e,type:`checkbox`},null,512),[[Ho,te.value]]),m[64]||=Z(` 显示已完成`,-1)])),Y(`span`,null,`第 `+N(E.value)+` / `+N(D.value)+` 页 · 共 `+N(ne.value)+` 项`,1),b.value?(q(),J(`button`,{key:1,class:`link`,onClick:m[18]||=e=>b.value=``},`清除搜索`)):Q(``,!0)]),_.value!==`trash`&&D.value>1?(q(),J(`div`,hl,[Y(`button`,{class:`secondary`,disabled:E.value<=1||C.value,onClick:ot},`上一页`,8,gl),Y(`span`,null,N(E.value)+` / `+N(D.value),1),Y(`button`,{class:`secondary`,disabled:E.value>=D.value||C.value,onClick:st},`下一页`,8,_l)])):Q(``,!0),Y(`section`,{class:M([`task-list`,{loading:C.value}])},[(q(!0),J(K,null,G(ye.value,e=>(q(),J(K,{key:e.task.id},[Y(`article`,{class:M([`task-row swipeable`,{done:e.task.completed,selected:v.value?.id===e.task.id,ready:Math.abs(A.value[e.task.id]??0)>=64}]),style:ce({"--swipe-x":`${A.value[e.task.id]??0}px`,"--swipe-width":`${Math.abs(A.value[e.task.id]??0)}px`}),onTouchstartPassive:t=>Pe(e.task,t),onTouchmovePassive:t=>Fe(e.task,t),onTouchend:t=>Ie(e.task,t),onTouchcancel:t=>Le(e.task)},[Y(`span`,{class:M([`swipe-bg`,{cancel:e.task.completed}])},N(e.task.completed?`↩ 未完成`:`✓ 完成`),3),Y(`div`,{class:`task-main`,role:`button`,tabindex:`0`,onClick:t=>_.value===`trash`?void 0:Re(e.task),onKeydown:[$o(t=>_.value===`trash`?void 0:Re(e.task),[`enter`]),$o(Zo(t=>_.value===`trash`?void 0:Re(e.task),[`prevent`]),[`space`])]},[Y(`strong`,null,N(e.task.title),1),Y(`span`,bl,[e.task.due_at?(q(),J(`span`,xl,[X(U(ds)),Z(N(nt(e.task.due_at)),1)])):Q(``,!0),e.subtasks.length?(q(),J(`span`,Sl,[X(U(xs)),Z(N(e.subtasks.filter(e=>e.completed).length)+`/`+N(e.subtasks.length),1)])):Q(``,!0),(q(!0),J(K,null,G(e.task.tags,e=>(q(),J(`i`,{key:e.id,class:`tag-dot`,style:ce({background:e.color}),title:e.name},null,12,Cl))),128))])],40,yl),_.value===`trash`?Q(``,!0):(q(),J(`button`,{key:0,class:`task-swipe-hint`,"aria-label":e.task.completed?`重新打开${e.task.title}`:`完成${e.task.title}`,"aria-pressed":e.task.completed,onClick:Zo(t=>Me(e.task),[`stop`])},N(e.task.completed?`已完成`:`完成`),9,wl)),e.task.priority?(q(),J(`span`,{key:1,class:M([`priority`,`p${e.task.priority}`])},N([``,`低`,`中`,`高`][e.task.priority]),3)):Q(``,!0),_.value===`trash`?(q(),J(`button`,{key:2,class:`restore`,onClick:t=>Be(e.task)},[X(U(us)),m[65]||=Z(`恢复`,-1)],8,Tl)):(q(),J(`button`,{key:3,class:`icon ghost`,"aria-label":`删除任务`,onClick:Zo(t=>ze(e.task),[`stop`])},[X(U(js))],8,El)),_.value===`trash`?(q(),J(`button`,{key:4,class:`icon danger ghost`,"aria-label":`永久删除`,onClick:Zo(t=>Ve(e.task),[`stop`])},[X(U(Ns))],8,Dl)):Q(``,!0)],46,vl),(q(!0),J(K,null,G(e.subtasks,e=>(q(),J(`article`,{key:e.id,class:M([`task-row subtask swipeable`,{done:e.completed,ready:Math.abs(A.value[e.id]??0)>=64}]),style:ce({"--swipe-x":`${A.value[e.id]??0}px`,"--swipe-width":`${Math.abs(A.value[e.id]??0)}px`}),onTouchstartPassive:t=>Pe(e,t),onTouchmovePassive:t=>Fe(e,t),onTouchend:t=>Ie(e,t),onTouchcancel:t=>Le(e)},[Y(`span`,{class:M([`swipe-bg`,{cancel:e.completed}])},N(e.completed?`↩ 未完成`:`✓ 完成`),3),X(U(ys)),Y(`div`,{class:`task-main`,role:`button`,tabindex:`0`,onClick:t=>Re(e),onKeydown:[$o(t=>Re(e),[`enter`]),$o(Zo(t=>Re(e),[`prevent`]),[`space`])]},[Y(`strong`,null,N(e.title),1)],40,kl),Y(`button`,{class:`task-swipe-hint`,"aria-label":e.completed?`重新打开${e.title}`:`完成${e.title}`,"aria-pressed":e.completed,onClick:Zo(t=>Me(e),[`stop`])},N(e.completed?`已完成`:`完成`),9,Al)],46,Ol))),128))],64))),128)),!ge.value.length&&!C.value?(q(),J(`div`,jl,[X(U(Ss)),Y(`b`,null,N(b.value?`没有匹配的任务`:`这里还很安静`),1),Y(`span`,null,N(b.value?`换个关键词试试`:`写下第一件想完成的小事吧`),1)])):Q(``,!0)],2),_.value===`today`&&u.value.length?(q(),J(`div`,Ml,[Y(`h3`,Nl,[X(U(ds)),m[66]||=Z(`今日日历事件`,-1)]),Y(`div`,Pl,[(q(!0),J(K,null,G(u.value,e=>(q(),J(`div`,{key:e.id+e.starts_at,class:`calendar-event`},[Y(`span`,Fl,N(rt(e)),1),Y(`b`,null,N(e.title),1),Y(`small`,null,N(e.source_name),1)]))),128))])])):Q(``,!0),_.value===`today`?(q(),J(`div`,Il,[Y(`h3`,Ll,[X(U(Os)),m[67]||=Z(`今日习惯`,-1)]),X(Ec,{view:`today-habits`,onChanged:Ee,onNotice:F})])):Q(``,!0)],64))]),Y(`aside`,{class:M([`detail`,{open:T.value}])},[Y(`div`,Rl,[m[68]||=Y(`span`,null,`任务详情`,-1),Y(`button`,{class:`icon mobile-only`,"aria-label":`关闭详情`,onClick:m[19]||=e=>T.value=!1},[X(U(Ns))])]),v.value?(q(),J(`div`,zl,[Y(`div`,Bl,[Y(`button`,{class:M([`check large`,`p${v.value.priority}`]),onClick:m[20]||=e=>Me(v.value)},[v.value.completed?(q(),Ki(U(fs),{key:0})):Q(``,!0)],2),W(Y(`textarea`,{"onUpdate:modelValue":m[21]||=e=>v.value.title=e,rows:`2`,"aria-label":`任务标题`,onBlur:z},null,544),[[Vo,v.value.title]])]),Y(`label`,null,[m[69]||=Z(`清单`,-1),W(Y(`select`,{"onUpdate:modelValue":m[22]||=e=>v.value.list_id=e,onChange:z},[(q(!0),J(K,null,G(s.value,e=>(q(),J(`option`,{key:e.id,value:e.id},N(e.name),9,Vl))),128))],544),[[Wo,v.value.list_id]])]),Y(`label`,null,[m[70]||=Z(`截止时间`,-1),Y(`input`,{value:U(zs)(v.value.due_at),type:`datetime-local`,onChange:m[23]||=e=>{v.value.due_at=e.target.value,z()}},null,40,Hl)]),Y(`label`,null,[m[72]||=Z(`优先级`,-1),W(Y(`select`,{"onUpdate:modelValue":m[24]||=e=>v.value.priority=e,onChange:z},[...m[71]||=[Y(`option`,{value:0},`无`,-1),Y(`option`,{value:1},`低`,-1),Y(`option`,{value:2},`中`,-1),Y(`option`,{value:3},`高`,-1)]],544),[[Wo,v.value.priority,void 0,{number:!0}]])]),Y(`label`,null,[m[74]||=Z(`重复`,-1),W(Y(`select`,{"onUpdate:modelValue":m[25]||=e=>v.value.recurrence_rule=e,onChange:z},[...m[73]||=[Y(`option`,{value:``},`不重复`,-1),Y(`option`,{value:`FREQ=DAILY`},`每天`,-1),Y(`option`,{value:`FREQ=WEEKLY`},`每周`,-1),Y(`option`,{value:`FREQ=MONTHLY`},`每月`,-1)]],544),[[Wo,v.value.recurrence_rule]])]),v.value.recurrence_rule?(q(),J(`label`,Ul,[m[75]||=Z(`重复截止`,-1),W(Y(`input`,{"onUpdate:modelValue":m[26]||=e=>v.value.recurrence_end_at=e,type:`date`,onChange:z},null,544),[[Vo,v.value.recurrence_end_at]])])):Q(``,!0),Y(`div`,Wl,[Y(`div`,Gl,[m[77]||=Y(`span`,null,`标签`,-1),Y(`button`,{class:`link`,onClick:qe},[X(U(Es)),m[76]||=Z(`新建`,-1)])]),Y(`div`,Kl,[(q(!0),J(K,null,G(p.value,e=>(q(),J(`button`,{key:e.id,class:M({chosen:$e(e)}),onClick:t=>{et(e),z()}},[Y(`i`,{style:ce({background:e.color})},null,4),Z(N(e.name),1)],10,ql))),128)),p.value.length?Q(``,!0):(q(),J(`span`,Jl,`还没有标签`))])]),Y(`div`,Yl,[Y(`div`,Xl,[m[78]||=Y(`span`,null,`备注`,-1),Y(`span`,null,[Y(`button`,{class:M({active:!ee.value}),onClick:m[27]||=e=>ee.value=!1},`编辑`,2),Y(`button`,{class:M({active:ee.value}),onClick:m[28]||=e=>ee.value=!0},`预览`,2)])]),ee.value?(q(),J(`div`,{key:0,class:`markdown-preview`,innerHTML:U(Is)(v.value.description)},null,8,Zl)):W((q(),J(`textarea`,{key:1,"onUpdate:modelValue":m[29]||=e=>v.value.description=e,rows:`9`,placeholder:`支持 Markdown…`,onBlur:z},null,544)),[[Vo,v.value.description]])]),Y(`div`,Ql,[Y(`div`,$l,[m[80]||=Y(`span`,null,`子任务`,-1),Y(`button`,{class:`link`,onClick:He},[X(U(Es)),m[79]||=Z(`添加`,-1)])]),(q(!0),J(K,null,G(_e.value,e=>(q(),J(`button`,{key:e.id,class:`subtask-detail`,onClick:t=>Me(e)},[Y(`span`,tu,[e.completed?(q(),Ki(U(fs),{key:0})):Q(``,!0)]),Y(`span`,{class:M({strike:e.completed})},N(e.title),3)],8,eu))),128)),_e.value.length?Q(``,!0):(q(),J(`span`,nu,`把这件事拆成更小的步骤`))]),Y(`div`,ru,[Y(`button`,{class:`secondary`,onClick:z},`保存更改`),Y(`button`,{class:`danger-text`,onClick:m[30]||=e=>ze(v.value)},[X(U(js)),m[81]||=Z(`移到回收站`,-1)])])])):(q(),J(`div`,iu,[X(U(xs)),m[82]||=Y(`b`,null,`选中一个任务`,-1),m[83]||=Y(`p`,null,`日期、优先级、标签、子任务和 Markdown 备注会出现在这里。`,-1)]))],2),Y(`nav`,au,[Y(`button`,{class:M({active:_.value===`today`}),onClick:m[31]||=e=>R(`today`)},[X(U(Ss)),m[84]||=Y(`span`,null,`今天`,-1)],2),Y(`button`,{class:M({active:_.value===`tasks`}),onClick:m[32]||=e=>R(`tasks`,g.value)},[X(U(bs)),m[85]||=Y(`span`,null,`任务`,-1)],2),Y(`button`,{class:M({active:_.value===`calendar`}),onClick:m[33]||=e=>R(`calendar`)},[X(U(ds)),m[86]||=Y(`span`,null,`日历`,-1)],2),Y(`button`,{class:M({active:_.value===`habits`}),onClick:m[34]||=e=>R(`habits`)},[X(U(Os)),m[87]||=Y(`span`,null,`习惯`,-1)],2),Y(`button`,{class:M({active:_.value===`settings`}),onClick:m[35]||=e=>R(`settings`)},[X(U(As)),m[88]||=Y(`span`,null,`设置`,-1)],2)]),[`tasks`,`today`,`upcoming`].includes(_.value)?(q(),J(`button`,{key:1,class:`fab`,"aria-label":`添加任务`,onClick:at},[X(U(hs))])):Q(``,!0),X(Va,{name:`toast`},{default:Sn(()=>[S.value?(q(),J(`div`,ou,N(S.value),1)):Q(``,!0)]),_:1}),x.value?(q(),J(`div`,su,[Z(N(x.value),1),Y(`button`,{onClick:m[36]||=e=>x.value=``},[X(U(Ns))])])):Q(``,!0),ie.value?(q(),J(`div`,{key:3,class:`modal-mask`,onClick:Zo(fe,[`self`])},[Y(`div`,cu,[Y(`h3`,null,N(ae.value),1),oe.value?(q(),J(`label`,lu,[Z(N(oe.value),1),W(Y(`input`,{"onUpdate:modelValue":m[37]||=e=>se.value=e,class:`modal-input`,autofocus:``,onKeyup:$o(pe,[`enter`])},null,544),[[Vo,se.value]])])):Q(``,!0),Y(`div`,uu,[Y(`button`,{class:`secondary`,onClick:fe},`取消`),Y(`button`,{class:`primary-small`,onClick:pe},N(le.value),1)])])])):Q(``,!0)])):(q(),J(`div`,Oc,[Y(`section`,kc,[m[41]||=Y(`div`,{class:`brand`},[Z(`do`),Y(`span`,null,`do`)],-1),Y(`p`,null,N(t.value?`欢迎回来,继续把生活理顺。`:`创建你的 dodo`),1),Y(`label`,null,[m[39]||=Z(`用户名`,-1),W(Y(`input`,{"onUpdate:modelValue":m[0]||=e=>i.value=e,autocomplete:`username`,placeholder:`你的用户名`},null,512),[[Vo,i.value]])]),Y(`label`,null,[m[40]||=Z(`密码`,-1),W(Y(`input`,{"onUpdate:modelValue":m[1]||=e=>a.value=e,type:`password`,autocomplete:`current-password`,placeholder:`至少 12 位`,onKeyup:$o(Se,[`enter`])},null,544),[[Vo,a.value]])]),Y(`button`,{class:`primary`,onClick:Se},N(t.value?`登录`:`开始使用`),1),x.value?(q(),J(`small`,Ac,N(x.value),1)):Q(``,!0)])])):(q(),J(`div`,Dc,[...m[38]||=[Y(`span`,{class:`loader`},null,-1),Z(`正在打开 dodo…`,-1)]]))}}})).mount(`#app`),`serviceWorker`in navigator&&(navigator.serviceWorker.getRegistrations().then(e=>{e.forEach(e=>e.unregister())}),caches.keys().then(e=>e.forEach(e=>caches.delete(e)))); \ No newline at end of file diff --git a/backend/static/assets/index-Dhk-VG-k.css b/backend/static/assets/index-Dhk-VG-k.css deleted file mode 100644 index 0ce11a6..0000000 --- a/backend/static/assets/index-Dhk-VG-k.css +++ /dev/null @@ -1,2 +0,0 @@ -/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */ -@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, 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;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@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,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-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:where(:not(iframe)){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 components,utilities;:root{color:#2d2924;--accent:#f15a29;--accent-soft:#fbe6dc;--paper:#fffdf8;--sidebar:#f6f0e4;--line:#e7ddcc;--muted:#8b8275;--danger:#bd3827;--shadow:0 12px 36px #4e3a221a;background:#f8f3e8;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Noto Sans CJK SC,sans-serif}*{box-sizing:border-box}html{-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}body{background:#f8f3e8;margin:0}button,input,textarea,select{font:inherit;color:inherit}@media (width<=800px){input,textarea,select{font-size:16px}}button{cursor:pointer}svg{stroke-width:1.8px;width:18px;height:18px}.center,.auth-shell{place-items:center;min-height:100vh;display:grid}.center{color:var(--muted);align-content:center;gap:12px}.loader{border:2px solid var(--line);border-top-color:var(--accent);border-radius:50%;width:24px;height:24px;animation:.8s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}.auth-shell{background:radial-gradient(circle at 20% 10%,#ffe3d5 0,#0000 28%),linear-gradient(135deg,#f8f3e8,#fffaf0)}.auth-card{background:var(--paper);border:1px solid var(--line);width:min(390px,90vw);box-shadow:var(--shadow);border-radius:14px;gap:16px;padding:38px;display:grid}.brand{letter-spacing:-3px;font-size:40px;font-weight:850}.brand span{color:var(--accent)}.brand.small{font-size:29px}.auth-card p{color:var(--muted);margin:0 0 8px}.auth-card label,.detail-form>label{color:#756d61;gap:7px;font-size:12px;font-weight:650;display:grid}.auth-card input,.detail-form input,.detail-form select{border:1px solid var(--line);background:#fff;border-radius:9px;outline:none;width:100%;padding:11px}.auth-card input:focus,.detail-form input:focus,.detail-form select:focus,.detail-form textarea:focus{border-color:var(--accent);box-shadow:0 0 0 3px #f15a291a}.primary{background:var(--accent);color:#fff;border:0;border-radius:9px;padding:12px;font-weight:700;box-shadow:0 5px 12px #f15a2933}.auth-card small{color:var(--danger)}.shell{background:var(--paper);grid-template-columns:238px minmax(430px,1fr) 350px;height:100vh;display:grid;overflow:hidden}.sidebar{border-right:1px solid var(--line);background:var(--sidebar);flex-direction:column;min-height:0;display:flex}.brand-row{justify-content:space-between;align-items:center;height:76px;padding:0 20px;display:flex}.primary-nav{gap:3px;padding:4px 12px 12px;display:grid}.primary-nav button,.settings{color:#665e52;text-align:left;background:0 0;border:0;border-radius:9px;align-items:center;gap:10px;padding:10px 12px;display:flex}.primary-nav button:hover,.list-row:hover,.folder-row>button:hover{background:#ffffff85}.primary-nav button.active,.list-row.active{background:var(--accent-soft);color:#b7421e;font-weight:700}.section-title{color:#958b7d;text-transform:uppercase;letter-spacing:.08em;justify-content:space-between;align-items:center;padding:17px 17px 7px 22px;font-size:11px;font-weight:750;display:flex}.section-title>span:last-child{display:flex}.mini-icon,.row-actions button{color:#8e8477;background:0 0;border:0;padding:4px}.mini-icon svg,.row-actions svg{width:14px;height:14px}.folders{padding:0 10px;overflow:auto}.folder-row{align-items:center;display:flex}.folder-row>button{color:#6d6559;text-align:left;background:0 0;border:0;flex:1;align-items:center;gap:7px;min-width:0;padding:8px;display:flex}.folder-row>button svg{width:14px}.row-actions{opacity:0;transition:opacity .15s;display:flex}.folder-row:hover .row-actions,.list-row:hover .row-actions{opacity:1}.list-row{text-align:left;color:#665f55;background:0 0;border:0;border-radius:8px;align-items:center;gap:9px;width:100%;padding:8px 7px 8px 31px;display:flex}.list-row>span:nth-child(2){white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}.list-row i{background:#d89b62;border-radius:3px;width:8px;height:8px}.settings{margin:auto 12px 14px}.mobile-only,.bottom,.fab{display:none}main{background:linear-gradient(#fffdf8eb,#fffdf8eb),repeating-linear-gradient(0deg,#0000,#0000 31px,#eee3d2 32px);min-width:0;padding:27px 34px 50px;overflow:auto}.topbar{align-items:center;gap:14px;display:flex}.topbar>div{flex:1}.topbar p{color:var(--muted);margin:0;font-size:12px}.topbar h1{letter-spacing:-.03em;margin:3px 0 21px;font-size:27px}.search{border:1px solid var(--line);width:min(260px,36%);color:var(--muted);background:#faf7f0;border-radius:9px;align-items:center;gap:8px;margin-bottom:18px;padding:8px 10px;display:flex}.search input{background:0 0;border:0;outline:0;width:100%;min-width:0}.search kbd{white-space:nowrap;border:1px solid var(--line);border-radius:4px;padding:2px 4px;font-size:10px}.quick{border:1px solid var(--line);background:#fff;border-radius:11px;align-items:center;gap:10px;padding:7px 7px 7px 13px;transition:all .18s;display:flex;box-shadow:0 2px 10px #513d260d}.quick:focus-within{border-color:var(--accent);box-shadow:0 0 0 3px #f15a2917}.quick>svg{color:var(--accent)}.quick input{background:0 0;border:0;outline:0;flex:1;min-width:0}.quick button{background:var(--accent);color:#fff;border:0;border-radius:8px;padding:8px 15px;font-weight:650}.list-toolbar{height:42px;color:var(--muted);align-items:center;gap:14px;font-size:12px;display:flex}.list-toolbar label{margin-right:auto}.link{color:var(--accent);background:0 0;border:0;align-items:center;gap:3px;padding:3px;display:inline-flex}.link svg{width:14px}.task-list{transition:opacity .2s}.task-list.loading{opacity:.45}.task-row{--swipe-x:0px;border-bottom:1px solid var(--line);isolation:isolate;align-items:center;gap:10px;min-height:53px;padding:4px 8px;transition:background .15s,transform .18s;display:flex;position:relative;overflow:hidden}.task-row.swipeable{touch-action:pan-y;transform:translateX(var(--swipe-x))}.task-row.swipeable:not([style*="0px"]){transition:none}.task-row:hover,.task-row.selected{background:#faf0e5bf}.task-row:hover{transform:translateX(calc(var(--swipe-x) + 2px))}.swipe-bg{z-index:-1;inset:0 auto 0 calc(-1 * var(--swipe-x));width:var(--swipe-width);color:#24814f;white-space:nowrap;background:#e9f7ee;align-items:center;min-width:0;padding-left:14px;font-size:12px;font-weight:800;display:flex;position:absolute;overflow:hidden}.swipe-bg.cancel{left:auto;right:var(--swipe-x);color:#c65a23;background:#fff2e8;justify-content:flex-end;padding:0 14px 0 0}.task-row.ready .swipe-bg,.habit-row.ready .swipe-bg{color:#187142;background:#dff3e7}.task-row.ready .swipe-bg.cancel,.habit-row.ready .swipe-bg.cancel{color:#b94716;background:#ffe4d3}.check{background:#fff;border:1.6px solid #c6baa8;border-radius:5px;flex:0 0 19px;place-items:center;width:19px;height:19px;padding:0;display:grid}.check svg{width:13px}.check.p1{border-color:#4b93d1}.check.p2{border-color:#d79b25}.check.p3{border-color:#dc4b30}.done .check{color:#fff;background:#afa595}.task-main{text-align:left;background:0 0;border:0;flex:1;min-width:0;padding:8px 0}.task-main strong{white-space:nowrap;text-overflow:ellipsis;font-size:14px;font-weight:590;display:block;overflow:hidden}.done .task-main strong{color:#9b9388;text-decoration:line-through}.task-swipe-hint{color:#9a8f80;background:#f3ede3;border:0;border-radius:999px;flex:none;min-height:44px;padding:8px 11px;font-size:11px;font-weight:700}.task-row.done .task-swipe-hint{background:var(--accent-soft);color:#b7421e}.meta{color:#9b9286;align-items:center;gap:9px;margin-top:3px;font-size:11px;display:flex}.meta span{align-items:center;gap:3px;display:flex}.meta svg{width:12px}.tag-dot{border-radius:50%;width:7px;height:7px}.priority{border-radius:5px;padding:3px 6px;font-size:10px;font-weight:750}.priority.p1{color:#3f80ba;background:#e5f2fc}.priority.p2{color:#a56b05;background:#fff1cb}.priority.p3{color:#bd3827;background:#fde2dc}.icon,.ghost{background:0 0;border:0;border-radius:6px;place-items:center;padding:5px;display:grid}.ghost{opacity:0;color:#9d9387}.task-row:hover .ghost{opacity:1}.ghost:hover{color:var(--danger);background:#fce7e2}.restore{border:1px solid var(--line);background:#fff;border-radius:7px;align-items:center;gap:5px;padding:6px 8px;font-size:12px;display:flex}.restore svg{width:14px}.subtask{color:#6d655b;min-height:42px;padding-left:53px}.subtask>svg{color:#bbb0a2;width:13px}.empty{color:#aaa094;text-align:center;align-content:center;place-items:center;gap:8px;min-height:300px;display:grid}.empty>svg{color:#d8cabb;width:38px;height:38px}.empty b{color:#6f675c}.empty span{font-size:13px}.detail{border-left:1px solid var(--line);background:#faf7f0;min-width:0;overflow:auto}.detail-head{border-bottom:1px solid var(--line);color:#80766a;text-transform:uppercase;letter-spacing:.08em;justify-content:space-between;align-items:center;height:57px;padding:0 21px;font-size:12px;font-weight:700;display:flex}.paper{border:1px solid var(--line);text-align:center;color:#8f8578;background:#fff;border-radius:11px;align-content:center;place-items:center;min-height:180px;margin:22px;padding:28px 20px;display:grid;box-shadow:0 4px 18px #4c39220d}.paper svg{color:#ceb8a4;width:32px;height:32px;margin-bottom:12px}.paper b{color:#625b50}.paper p{font-size:13px;line-height:1.6}.detail-form{gap:15px;padding:19px;display:grid}.detail-title{align-items:flex-start;gap:10px;display:flex}.check.large{flex-basis:22px;width:22px;height:22px;margin-top:8px}.detail-title textarea{resize:none;background:0 0;border:0;outline:none;flex:1;font-size:19px;font-weight:700;line-height:1.4}.detail-form>label{grid-template-columns:80px 1fr;align-items:center}.detail-form>label input,.detail-form>label select{padding:8px}.field{gap:7px;display:grid}.field-label{color:#756d61;justify-content:space-between;align-items:center;font-size:12px;font-weight:700;display:flex}.tag-picker{flex-wrap:wrap;gap:6px;display:flex}.tag-picker button{border:1px solid var(--line);background:#fff;border-radius:999px;align-items:center;gap:5px;padding:5px 8px;font-size:11px;display:flex}.tag-picker button.chosen{background:#fff1e9;border-color:#c89077}.tag-picker i{border-radius:50%;width:8px;height:8px}.hint{color:#a49a8d;font-size:12px}.markdown .field-label>span:last-child{background:#eee7dc;border-radius:6px;padding:2px;display:flex}.markdown .field-label button{background:0 0;border:0;border-radius:5px;padding:4px 8px;font-size:11px}.markdown .field-label button.active{color:var(--accent);background:#fff}.markdown textarea{border:1px solid var(--line);resize:vertical;background:#fff;border-radius:9px;outline:none;padding:11px;font:13px/1.6 ui-monospace,SFMono-Regular,Menlo,monospace}.markdown-preview{border:1px solid var(--line);overflow-wrap:anywhere;background:#fff;border-radius:9px;min-height:160px;padding:10px 12px;font-size:13px;line-height:1.65}.markdown-preview h1{font-size:20px}.markdown-preview h2{font-size:16px}.markdown-preview p{margin:8px 0}.markdown-preview code{background:#f2ece2;border-radius:4px;padding:2px 4px}.markdown-preview a{color:var(--accent)}.subtasks{gap:5px;display:grid}.subtask-detail{text-align:left;background:#fff;border:0;border-radius:7px;align-items:center;gap:8px;padding:8px;display:flex}.subtask-detail .check{pointer-events:none}.strike{color:var(--muted);text-decoration:line-through}.detail-actions{border-top:1px solid var(--line);justify-content:space-between;align-items:center;padding-top:10px;display:flex}.secondary{border:1px solid var(--line);background:#fff;border-radius:8px;padding:8px 11px;font-weight:650}.danger-text{color:var(--danger);background:0 0;border:0;align-items:center;gap:5px;font-size:12px;display:flex}.danger-text svg{width:14px}.toast,.error-toast{z-index:50;color:#fff;box-shadow:var(--shadow);background:#322d28;border-radius:9px;padding:10px 15px;font-size:13px;position:fixed;bottom:24px;left:50%;transform:translate(-50%)}.error-toast{background:var(--danger);align-items:center;gap:10px;display:flex}.error-toast button{color:#fff;background:0 0;border:0;padding:0}.toast-enter-active,.toast-leave-active{transition:all .2s}.toast-enter-from,.toast-leave-to{opacity:0;transform:translate(-50%,8px)}@media (width<=1050px){.shell{grid-template-columns:220px minmax(400px,1fr) 310px}main{padding-inline:24px}}@media (width<=800px){.shell{height:100dvh;display:block;overflow:auto}.sidebar,.detail{z-index:30;box-shadow:var(--shadow);transition:transform .22s;display:flex;position:fixed;top:0;bottom:0}.sidebar{width:min(300px,86vw);left:0;transform:translate(-105%)}.sidebar.open{transform:none}.detail{width:min(430px,94vw);right:0;transform:translate(105%)}.detail.open{transform:none}.scrim{z-index:20;background:#2d261f42;position:fixed;inset:0}.mobile-only{display:grid}main{min-height:100dvh;padding:20px 17px 112px}.topbar h1{margin-bottom:17px;font-size:24px}.search{width:auto;margin-bottom:13px;padding:8px}.search input{width:90px}.search kbd,.quick button{display:none}.row-actions{opacity:1}.row-actions button{min-height:34px;padding:7px}.list-row{padding:6px 4px}.archived-row{color:#8a6d3b;background:#fbf3e2;border:1px dashed #e0cfae;border-radius:8px;padding:9px 7px}.archived-row>svg{color:#c9a45c}.bottom{z-index:15;border-top:1px solid var(--line);padding:8px 5px max(8px,env(safe-area-inset-bottom));background:#fffdf8f5;justify-content:space-around;display:flex;position:fixed;bottom:0;left:0;right:0;box-shadow:0 -5px 18px #4f3b220f}.bottom button{color:#81786d;background:0 0;border:0;place-items:center;gap:2px;min-width:60px;font-size:10px;display:grid}.bottom button.active{color:var(--accent);font-weight:700}.bottom svg{width:20px}.fab{z-index:16;background:var(--accent);color:#fff;border:0;border-radius:50%;place-items:center;width:52px;height:52px;transition:transform .15s;display:grid;position:fixed;bottom:76px;right:18px;box-shadow:0 7px 20px #f15a2961}.fab:active{transform:scale(.94)}.toast,.error-toast{bottom:142px}.task-row{padding-inline:2px}.subtask{padding-left:35px}.ghost{opacity:.45}}.mvp-view{gap:16px;padding-bottom:36px;display:grid}.view-intro{border-bottom:1px dashed var(--line);justify-content:space-between;align-items:end;padding-bottom:12px;display:flex}.view-intro h2{margin:2px 0 0;font-size:22px}.view-intro small,.view-intro>span{color:var(--muted);font-size:12px}.tool-card,.empty-panel{border:1px solid var(--line);background:#fff;border-radius:12px;padding:16px;box-shadow:0 3px 14px #513d260d}.soft-button,.primary-small,.danger-button,.file-button{border:1px solid var(--line);background:#fff;border-radius:8px;justify-content:center;align-items:center;gap:6px;padding:8px 11px;font-size:12px;display:inline-flex}.soft-button svg,.file-button svg{width:15px}.primary-small{background:var(--accent);border-color:var(--accent);color:#fff}.danger-button{color:var(--danger);border-color:#e5b7ad}.habit-create{grid-template-columns:1fr 150px 90px auto;gap:8px;display:grid}.habit-create input,.habit-create select{border:1px solid var(--line);background:#fff;border-radius:8px;min-width:0;padding:9px}.habit-create button{background:var(--accent);color:#fff;border:0;border-radius:8px;align-items:center;gap:5px;padding:8px 13px;display:flex}.habit-list{gap:10px;display:grid}.tool-card h3{margin:0 0 4px}.habit-row{--swipe-x:0px;border:1px solid var(--line);isolation:isolate;background:#fff;border-radius:14px;align-items:center;gap:8px;padding:5px 5px 5px 12px;transition:border-color .15s,box-shadow .15s,transform .18s;display:flex;position:relative;overflow:hidden;box-shadow:0 3px 14px #513d260d}.habit-row.done{border-color:var(--accent)}.habit-row.swipeable{touch-action:pan-y;transform:translateX(var(--swipe-x))}.habit-row.swipeable:not([style*="0px"]){transition:none}.habit-main{text-align:left;background:0 0;border:0;border-radius:10px;flex:1;justify-content:space-between;align-items:center;gap:10px;min-width:0;padding:13px 4px;display:flex}.habit-name{color:#3c372f;text-overflow:ellipsis;white-space:nowrap;font-size:15px;font-weight:700;overflow:hidden}.habit-main>span:first-child{gap:3px;display:grid}.habit-main small{color:var(--muted);font-size:11px}.habit-row.done .habit-name{color:var(--accent)}.habit-swipe-hint{color:#9a8f80;background:#f3ede3;border-radius:999px;flex:none;padding:6px 10px;font-size:11px;font-weight:700}.habit-row.done .habit-swipe-hint{background:var(--accent-soft);color:#b7421e}.habit-row .icon.ghost{color:#b3a795;margin-left:4px}.habit-row .icon.ghost:hover{color:var(--danger)}.numeric-habit>span:first-child{gap:3px;display:grid}.numeric-habit small{color:var(--muted);font-size:11px}.numeric-action{align-items:center;gap:6px;display:flex}.numeric-action input{border:1px solid var(--line);background:#fff;border-radius:8px;width:74px;padding:7px}.numeric-action .soft-button{min-height:44px;padding:9px 12px}.habit-row>.icon.ghost{flex:0 0 44px;width:44px;height:44px}.empty-panel{text-align:center;color:var(--muted)}.settings-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;display:grid}.tool-card{flex-direction:column;align-items:flex-start;gap:10px;display:flex}.tool-card>svg{color:var(--accent);width:25px;height:25px}.tool-card p{color:var(--muted);margin:0;font-size:13px}.tool-card.wide{grid-column:1/-1}.file-button input{display:none}.tool-card pre{background:#f8f3e8;border-radius:8px;width:100%;max-height:180px;padding:10px;font-size:10px;overflow:auto}.session-row,.audit-row{border-top:1px solid var(--line);justify-content:space-between;align-items:center;width:100%;padding:9px 0;display:flex}.session-row span{display:grid}.session-row small,.audit-row small{color:var(--muted);font-size:11px}.inline-error{color:var(--danger);background:#fff0ed;border-radius:8px;padding:9px}.settings.active{background:var(--accent-soft);color:#b7421e;font-weight:700}@media (width<=800px){.habit-create{grid-template-columns:1fr 1fr}.habit-create button{justify-content:center}.settings-grid{grid-template-columns:1fr}.tool-card.wide{grid-column:auto}.habit-row{padding:5px 4px 5px 8px}.habit-main{padding:10px 2px}.numeric-action input{width:62px}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important}}.pager{justify-content:flex-end;align-items:center;gap:10px;margin:0 0 14px;display:flex}.pager button:disabled{opacity:.4;cursor:not-allowed}.pager span{color:var(--muted);font-size:13px}.modal-mask{z-index:80;background:#2d261f66;place-items:center;padding:24px;display:grid;position:fixed;inset:0}.modal-box{border:1px solid var(--line);width:min(360px,92vw);box-shadow:var(--shadow);background:#fffdf8;border-radius:14px;gap:14px;padding:22px;display:grid}.modal-box h3{margin:0;font-size:17px}.modal-box label{color:#756d61;gap:7px;font-size:12px;font-weight:650;display:grid}.modal-input{border:1px solid var(--line);background:#fff;border-radius:9px;outline:none;width:100%;padding:11px;font-size:16px}.modal-actions{justify-content:flex-end;gap:8px;display:flex}.calendar-events{gap:8px;display:grid}.calendar-event{border-bottom:1px dashed var(--line);grid-template-columns:auto 1fr;align-items:baseline;gap:3px 10px;padding:9px 4px;display:grid}.calendar-event b{font-size:14px}.calendar-event small{color:var(--muted);grid-column:2;font-size:11px}.calendar-event .ev-time{min-width:46px;color:var(--accent);grid-row:1/3;align-self:center;font-size:12px;font-weight:800} diff --git a/backend/static/assets/index-DlZ9vwzJ.css b/backend/static/assets/index-DlZ9vwzJ.css new file mode 100644 index 0000000..8c3ea18 --- /dev/null +++ b/backend/static/assets/index-DlZ9vwzJ.css @@ -0,0 +1,2 @@ +/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */ +@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, 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;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@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,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-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:where(:not(iframe)){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 components;@layer utilities{.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}}:root{color:#2d2924;--accent:#f15a29;--accent-soft:#fbe6dc;--paper:#fffdf8;--sidebar:#f6f0e4;--line:#e7ddcc;--muted:#8b8275;--danger:#bd3827;--shadow:0 12px 36px #4e3a221a;background:#f8f3e8;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Noto Sans CJK SC,sans-serif}*{box-sizing:border-box}html{-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}body{background:#f8f3e8;margin:0}button,input,textarea,select{font:inherit;color:inherit}@media (width<=800px){input,textarea,select{font-size:16px}}button{cursor:pointer}svg{stroke-width:1.8px;width:18px;height:18px}.center,.auth-shell{place-items:center;min-height:100vh;display:grid}.center{color:var(--muted);align-content:center;gap:12px}.loader{border:2px solid var(--line);border-top-color:var(--accent);border-radius:50%;width:24px;height:24px;animation:.8s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}.auth-shell{background:radial-gradient(circle at 20% 10%,#ffe3d5 0,#0000 28%),linear-gradient(135deg,#f8f3e8,#fffaf0)}.auth-card{background:var(--paper);border:1px solid var(--line);width:min(390px,90vw);box-shadow:var(--shadow);border-radius:14px;gap:16px;padding:38px;display:grid}.brand{letter-spacing:-3px;font-size:40px;font-weight:850}.brand span{color:var(--accent)}.brand.small{font-size:29px}.auth-card p{color:var(--muted);margin:0 0 8px}.auth-card label,.detail-form>label{color:#756d61;gap:7px;font-size:12px;font-weight:650;display:grid}.auth-card input,.detail-form input,.detail-form select{border:1px solid var(--line);background:#fff;border-radius:9px;outline:none;width:100%;padding:11px}.auth-card input:focus,.detail-form input:focus,.detail-form select:focus,.detail-form textarea:focus{border-color:var(--accent);box-shadow:0 0 0 3px #f15a291a}.primary{background:var(--accent);color:#fff;border:0;border-radius:9px;padding:12px;font-weight:700;box-shadow:0 5px 12px #f15a2933}.auth-card small{color:var(--danger)}.shell{background:var(--paper);grid-template-columns:238px minmax(430px,1fr) 350px;height:100vh;display:grid;overflow:hidden}.sidebar{border-right:1px solid var(--line);background:var(--sidebar);flex-direction:column;min-height:0;display:flex}.brand-row{justify-content:space-between;align-items:center;height:76px;padding:0 20px;display:flex}.primary-nav{gap:3px;padding:4px 12px 12px;display:grid}.primary-nav button,.settings{color:#665e52;text-align:left;background:0 0;border:0;border-radius:9px;align-items:center;gap:10px;padding:10px 12px;display:flex}.primary-nav button:hover,.list-row:hover,.folder-row>button:hover{background:#ffffff85}.primary-nav button.active,.list-row.active{background:var(--accent-soft);color:#b7421e;font-weight:700}.section-title{color:#958b7d;text-transform:uppercase;letter-spacing:.08em;justify-content:space-between;align-items:center;padding:17px 17px 7px 22px;font-size:11px;font-weight:750;display:flex}.section-title>span:last-child{display:flex}.mini-icon,.row-actions button{color:#8e8477;background:0 0;border:0;padding:4px}.mini-icon svg,.row-actions svg{width:14px;height:14px}.folders{padding:0 10px;overflow:auto}.folder-row{align-items:center;display:flex}.folder-row>button{color:#6d6559;text-align:left;background:0 0;border:0;flex:1;align-items:center;gap:7px;min-width:0;padding:8px;display:flex}.folder-row>button svg{width:14px}.row-actions{opacity:0;transition:opacity .15s;display:flex}.folder-row:hover .row-actions,.list-row:hover .row-actions{opacity:1}.list-row{text-align:left;color:#665f55;background:0 0;border:0;border-radius:8px;align-items:center;gap:9px;width:100%;padding:8px 7px 8px 31px;display:flex}.list-row>span:nth-child(2){white-space:nowrap;text-overflow:ellipsis;flex:1;overflow:hidden}.list-row i{background:#d89b62;border-radius:3px;width:8px;height:8px}.settings{margin:auto 12px 14px}.mobile-only,.bottom,.fab{display:none}main{background:linear-gradient(#fffdf8eb,#fffdf8eb),repeating-linear-gradient(0deg,#0000,#0000 31px,#eee3d2 32px);min-width:0;padding:27px 34px 50px;overflow:auto}.topbar{align-items:center;gap:14px;display:flex}.topbar>div{flex:1}.topbar p{color:var(--muted);margin:0;font-size:12px}.topbar h1{letter-spacing:-.03em;margin:3px 0 21px;font-size:27px}.search{border:1px solid var(--line);width:min(260px,36%);color:var(--muted);background:#faf7f0;border-radius:9px;align-items:center;gap:8px;margin-bottom:18px;padding:8px 10px;display:flex}.search input{background:0 0;border:0;outline:0;width:100%;min-width:0}.search kbd{white-space:nowrap;border:1px solid var(--line);border-radius:4px;padding:2px 4px;font-size:10px}.quick{border:1px solid var(--line);background:#fff;border-radius:11px;align-items:center;gap:10px;padding:7px 7px 7px 13px;transition:all .18s;display:flex;box-shadow:0 2px 10px #513d260d}.quick:focus-within{border-color:var(--accent);box-shadow:0 0 0 3px #f15a2917}.quick>svg{color:var(--accent)}.quick input{background:0 0;border:0;outline:0;flex:1;min-width:0}.quick button{background:var(--accent);color:#fff;border:0;border-radius:8px;padding:8px 15px;font-weight:650}.list-toolbar{height:42px;color:var(--muted);align-items:center;gap:14px;font-size:12px;display:flex}.list-toolbar label{margin-right:auto}.link{color:var(--accent);background:0 0;border:0;align-items:center;gap:3px;padding:3px;display:inline-flex}.link svg{width:14px}.task-list{transition:opacity .2s}.task-list.loading{opacity:.45}.task-row{--swipe-x:0px;border-bottom:1px solid var(--line);isolation:isolate;align-items:center;gap:10px;min-height:53px;padding:4px 8px;transition:background .15s,transform .18s;display:flex;position:relative;overflow:hidden}.task-row.swipeable{touch-action:pan-y;transform:translateX(var(--swipe-x))}.task-row.swipeable:not([style*="0px"]){transition:none}.task-row:hover,.task-row.selected{background:#faf0e5bf}.task-row:hover{transform:translateX(calc(var(--swipe-x) + 2px))}.swipe-bg{z-index:-1;inset:0 auto 0 calc(-1 * var(--swipe-x));width:var(--swipe-width);color:#24814f;white-space:nowrap;background:#e9f7ee;align-items:center;min-width:0;padding-left:14px;font-size:12px;font-weight:800;display:flex;position:absolute;overflow:hidden}.swipe-bg.cancel{left:auto;right:var(--swipe-x);color:#c65a23;background:#fff2e8;justify-content:flex-end;padding:0 14px 0 0}.task-row.ready .swipe-bg,.habit-row.ready .swipe-bg{color:#187142;background:#dff3e7}.task-row.ready .swipe-bg.cancel,.habit-row.ready .swipe-bg.cancel{color:#b94716;background:#ffe4d3}.check{background:#fff;border:1.6px solid #c6baa8;border-radius:5px;flex:0 0 19px;place-items:center;width:19px;height:19px;padding:0;display:grid}.check svg{width:13px}.check.p1{border-color:#4b93d1}.check.p2{border-color:#d79b25}.check.p3{border-color:#dc4b30}.done .check{color:#fff;background:#afa595}.task-main{text-align:left;background:0 0;border:0;flex:1;min-width:0;padding:8px 0}.task-main strong{white-space:nowrap;text-overflow:ellipsis;font-size:14px;font-weight:590;display:block;overflow:hidden}.done .task-main strong{color:#9b9388;text-decoration:line-through}.meta{color:#9b9286;align-items:center;gap:9px;margin-top:3px;font-size:11px;display:flex}.meta span{align-items:center;gap:3px;display:flex}.meta svg{width:12px}.priority{border-radius:5px;padding:3px 6px;font-size:10px;font-weight:750}.priority.p1{color:#3f80ba;background:#e5f2fc}.priority.p2{color:#a56b05;background:#fff1cb}.priority.p3{color:#bd3827;background:#fde2dc}.icon,.ghost{background:0 0;border:0;border-radius:6px;place-items:center;padding:5px;display:grid}.ghost{opacity:0;color:#9d9387}.task-row:hover .ghost{opacity:1}.ghost:hover{color:var(--danger);background:#fce7e2}.restore{border:1px solid var(--line);background:#fff;border-radius:7px;align-items:center;gap:5px;padding:6px 8px;font-size:12px;display:flex}.restore svg{width:14px}.subtask{color:#6d655b;min-height:42px;padding-left:53px}.subtask>svg{color:#bbb0a2;width:13px}.empty{color:#aaa094;text-align:center;align-content:center;place-items:center;gap:8px;min-height:300px;display:grid}.empty>svg{color:#d8cabb;width:38px;height:38px}.empty b{color:#6f675c}.empty span{font-size:13px}.detail{border-left:1px solid var(--line);background:#faf7f0;min-width:0;overflow:auto}.detail-head{border-bottom:1px solid var(--line);color:#80766a;text-transform:uppercase;letter-spacing:.08em;justify-content:space-between;align-items:center;height:57px;padding:0 21px;font-size:12px;font-weight:700;display:flex}.paper{border:1px solid var(--line);text-align:center;color:#8f8578;background:#fff;border-radius:11px;align-content:center;place-items:center;min-height:180px;margin:22px;padding:28px 20px;display:grid;box-shadow:0 4px 18px #4c39220d}.paper svg{color:#ceb8a4;width:32px;height:32px;margin-bottom:12px}.paper b{color:#625b50}.paper p{font-size:13px;line-height:1.6}.detail-form{gap:15px;padding:19px;display:grid}.detail-title{align-items:flex-start;gap:10px;display:flex}.check.large{flex-basis:22px;width:22px;height:22px;margin-top:8px}.detail-title textarea{resize:none;background:0 0;border:0;outline:none;flex:1;font-size:19px;font-weight:700;line-height:1.4}.detail-form>label{grid-template-columns:80px 1fr;align-items:center}.detail-form>label input,.detail-form>label select{padding:8px}.field{gap:7px;display:grid}.field-label{color:#756d61;justify-content:space-between;align-items:center;font-size:12px;font-weight:700;display:flex}.hint{color:#a49a8d;font-size:12px}.markdown .field-label>span:last-child{background:#eee7dc;border-radius:6px;padding:2px;display:flex}.markdown .field-label button{background:0 0;border:0;border-radius:5px;padding:4px 8px;font-size:11px}.markdown .field-label button.active{color:var(--accent);background:#fff}.markdown textarea{border:1px solid var(--line);resize:vertical;background:#fff;border-radius:9px;outline:none;padding:11px;font:13px/1.6 ui-monospace,SFMono-Regular,Menlo,monospace}.markdown-preview{border:1px solid var(--line);overflow-wrap:anywhere;background:#fff;border-radius:9px;min-height:160px;padding:10px 12px;font-size:13px;line-height:1.65}.markdown-preview h1{font-size:20px}.markdown-preview h2{font-size:16px}.markdown-preview p{margin:8px 0}.markdown-preview code{background:#f2ece2;border-radius:4px;padding:2px 4px}.markdown-preview a{color:var(--accent)}.subtasks{gap:5px;display:grid}.subtask-detail{text-align:left;background:#fff;border:0;border-radius:7px;align-items:center;gap:8px;padding:8px;display:flex}.subtask-detail .check{pointer-events:none}.strike{color:var(--muted);text-decoration:line-through}.detail-actions{border-top:1px solid var(--line);justify-content:space-between;align-items:center;padding-top:10px;display:flex}.secondary{border:1px solid var(--line);background:#fff;border-radius:8px;padding:8px 11px;font-weight:650}.danger-text{color:var(--danger);background:0 0;border:0;align-items:center;gap:5px;font-size:12px;display:flex}.danger-text svg{width:14px}.toast,.error-toast{z-index:50;color:#fff;box-shadow:var(--shadow);background:#322d28;border-radius:9px;padding:10px 15px;font-size:13px;position:fixed;bottom:24px;left:50%;transform:translate(-50%)}.error-toast{background:var(--danger);align-items:center;gap:10px;display:flex}.error-toast button{color:#fff;background:0 0;border:0;padding:0}.toast-enter-active,.toast-leave-active{transition:all .2s}.toast-enter-from,.toast-leave-to{opacity:0;transform:translate(-50%,8px)}@media (width<=1050px){.shell{grid-template-columns:220px minmax(400px,1fr) 310px}main{padding-inline:24px}}@media (width<=800px){.shell{height:100dvh;display:block;overflow:auto}.sidebar{z-index:30;box-shadow:var(--shadow);width:min(300px,86vw);transition:transform .22s;display:flex;position:fixed;top:0;bottom:0;left:0;transform:translate(-105%)}.sidebar.open{transform:none}.detail{z-index:40;border:1px solid var(--line);width:100%;max-height:min(88dvh,760px);padding-bottom:max(16px,env(safe-area-inset-bottom));background:#fffdf8;border-bottom:0;border-radius:22px 22px 0 0;transition:transform .22s;display:block;position:fixed;inset:auto 0 0;overflow:auto;transform:translateY(105%);box-shadow:0 -14px 38px #38281833}.detail.open{transform:none}.detail-head{z-index:2;border-bottom:1px solid var(--line);background:#fffdf8;height:62px;padding:0 18px;position:sticky;top:0}.detail-head .icon{background:var(--accent-soft);width:42px;height:42px;color:var(--accent);border-radius:50%;display:grid}.detail-form{padding:18px}.detail-title textarea{font-size:21px}.more-mask{z-index:45;background:#2d261f52;align-items:flex-end;display:flex;position:fixed;inset:0}.more-sheet{width:100%;padding:14px 16px max(22px,env(safe-area-inset-bottom));background:#fffdf8;border-radius:22px 22px 0 0;gap:6px;display:grid}.more-sheet-head{justify-content:space-between;align-items:center;padding:2px 4px 8px;display:flex}.more-sheet>button{text-align:left;background:#fff;border:0;border-radius:12px;align-items:center;gap:12px;padding:13px;display:flex}.scrim{z-index:35;background:#2d261f52;position:fixed;inset:0}.mobile-only{display:grid}main{min-height:100dvh;padding:20px 17px 112px}.topbar h1{margin:0 0 17px;font-size:24px}.search{width:auto;margin-bottom:13px;padding:8px}.search input{width:90px}.search kbd,.quick button{display:none}.row-actions{opacity:1}.row-actions button{min-height:34px;padding:7px}.list-row{padding:6px 4px}.archived-row{color:#8a6d3b;background:#fbf3e2;border:1px dashed #e0cfae;border-radius:8px;padding:9px 7px}.archived-row>svg{color:#c9a45c}.bottom{z-index:15;border-top:1px solid var(--line);padding:8px 5px max(8px,env(safe-area-inset-bottom));background:#fffdf8f5;justify-content:space-around;display:flex;position:fixed;bottom:0;left:0;right:0;box-shadow:0 -5px 18px #4f3b220f}.bottom button{color:#81786d;background:0 0;border:0;place-items:center;gap:2px;min-width:60px;font-size:10px;display:grid}.bottom button.active{color:var(--accent);font-weight:700}.bottom svg{width:20px}.fab{z-index:16;background:var(--accent);color:#fff;border:0;border-radius:50%;place-items:center;width:52px;height:52px;transition:transform .15s;display:grid;position:fixed;bottom:76px;right:18px;box-shadow:0 7px 20px #f15a2961}.fab:active{transform:scale(.94)}.toast,.error-toast{bottom:142px}.task-row{padding-inline:2px}.subtask{padding-left:35px}.ghost{opacity:.45}}.mvp-view{gap:16px;padding-bottom:36px;display:grid}.view-intro{border-bottom:1px dashed var(--line);justify-content:space-between;align-items:end;padding-bottom:12px;display:flex}.view-intro h2{margin:2px 0 0;font-size:22px}.view-intro small,.view-intro>span{color:var(--muted);font-size:12px}.tool-card,.empty-panel{border:1px solid var(--line);background:#fff;border-radius:12px;padding:16px;box-shadow:0 3px 14px #513d260d}.soft-button,.primary-small,.danger-button,.file-button{border:1px solid var(--line);background:#fff;border-radius:8px;justify-content:center;align-items:center;gap:6px;padding:8px 11px;font-size:12px;display:inline-flex}.soft-button svg,.file-button svg{width:15px}.primary-small{background:var(--accent);border-color:var(--accent);color:#fff}.danger-button{color:var(--danger);border-color:#e5b7ad}.habit-create{grid-template-columns:1fr 150px 90px auto;gap:8px;display:grid}.habit-create input,.habit-create select{border:1px solid var(--line);background:#fff;border-radius:8px;min-width:0;padding:9px}.habit-create button{background:var(--accent);color:#fff;border:0;border-radius:8px;align-items:center;gap:5px;padding:8px 13px;display:flex}.habit-list{gap:10px;display:grid}.tool-card h3{margin:0 0 4px}.habit-row{--swipe-x:0px;border:1px solid var(--line);isolation:isolate;background:#fff;border-radius:14px;align-items:center;gap:8px;padding:5px 5px 5px 12px;transition:border-color .15s,box-shadow .15s,transform .18s;display:flex;position:relative;overflow:hidden;box-shadow:0 3px 14px #513d260d}.habit-row.done{background:#fffaf5}.habit-row.swipeable{touch-action:pan-y;transform:translateX(var(--swipe-x))}.habit-row.swipeable:not([style*="0px"]){transition:none}.habit-main{text-align:left;background:0 0;border:0;border-radius:10px;flex:1;justify-content:space-between;align-items:center;gap:10px;min-width:0;padding:13px 4px;display:flex}.habit-name{color:#3c372f;text-overflow:ellipsis;white-space:nowrap;font-size:15px;font-weight:700;overflow:hidden}.habit-main>span:first-child{gap:3px;display:grid}.habit-main small{color:var(--muted);font-size:11px}.habit-row.done .habit-name{color:var(--accent)}.habit-row .icon.ghost{color:#b3a795;margin-left:4px}.habit-row .icon.ghost:hover{color:var(--danger)}.numeric-habit>span:first-child{gap:3px;display:grid}.numeric-habit small{color:var(--muted);font-size:11px}.numeric-action{align-items:center;gap:6px;display:flex}.numeric-action input{border:1px solid var(--line);background:#fff;border-radius:8px;width:74px;padding:7px}.numeric-action .soft-button{min-height:44px;padding:9px 12px}.habit-row>.icon.ghost{flex:0 0 44px;width:44px;height:44px}.empty-panel{text-align:center;color:var(--muted)}.settings-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;display:grid}.tool-card{flex-direction:column;align-items:flex-start;gap:10px;display:flex}.tool-card>svg{color:var(--accent);width:25px;height:25px}.tool-card p{color:var(--muted);margin:0;font-size:13px}.tool-card.wide{grid-column:1/-1}.file-button input{display:none}.tool-card pre{background:#f8f3e8;border-radius:8px;width:100%;max-height:180px;padding:10px;font-size:10px;overflow:auto}.session-row,.audit-row{border-top:1px solid var(--line);justify-content:space-between;align-items:center;width:100%;padding:9px 0;display:flex}.session-row span{display:grid}.session-row small,.audit-row small{color:var(--muted);font-size:11px}.inline-error{color:var(--danger);background:#fff0ed;border-radius:8px;padding:9px}.settings.active{background:var(--accent-soft);color:#b7421e;font-weight:700}@media (width<=800px){.habit-create{grid-template-columns:1fr 1fr}.habit-create button{justify-content:center}.settings-grid{grid-template-columns:1fr}.tool-card.wide{grid-column:auto}.habit-row{padding:5px 4px 5px 8px}.habit-main{padding:10px 2px}.numeric-action input{width:62px}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important}}.pager{justify-content:flex-end;align-items:center;gap:10px;margin:0 0 14px;display:flex}.pager button:disabled{opacity:.4;cursor:not-allowed}.pager span{color:var(--muted);font-size:13px}.sr-only{clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important;width:1px!important;height:1px!important;margin:-1px!important;padding:0!important;position:absolute!important;overflow:hidden!important}.more-settings{border:1px solid var(--line);background:#fff;border-radius:10px}.more-settings summary{cursor:pointer;color:#756d61;padding:11px 13px;font-size:12px;font-weight:700}.more-settings-body{gap:12px;padding:0 13px 13px;display:grid}.more-settings-body>label{color:#756d61;grid-template-columns:80px 1fr;align-items:center;gap:7px;font-size:12px;font-weight:650;display:grid}.more-mask{display:none}.modal-mask{z-index:80;background:#2d261f66;place-items:center;padding:24px;display:grid;position:fixed;inset:0}.modal-box{border:1px solid var(--line);width:min(360px,92vw);box-shadow:var(--shadow);background:#fffdf8;border-radius:14px;gap:14px;padding:22px;display:grid}.modal-box h3{margin:0;font-size:17px}.modal-box label{color:#756d61;gap:7px;font-size:12px;font-weight:650;display:grid}.modal-input{border:1px solid var(--line);background:#fff;border-radius:9px;outline:none;width:100%;padding:11px;font-size:16px}.modal-actions{justify-content:flex-end;gap:8px;display:flex} diff --git a/backend/static/assets/index-gRSfwY0T.js b/backend/static/assets/index-gRSfwY0T.js new file mode 100644 index 0000000..16a8876 --- /dev/null +++ b/backend/static/assets/index-gRSfwY0T.js @@ -0,0 +1,4 @@ +(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();function e(e){let t=Object.create(null);for(let n of e.split(`,`))t[n]=1;return e=>e in t}var t={},n=[],r=()=>{},i=()=>!1,a=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),o=e=>e.startsWith(`onUpdate:`),s=Object.assign,c=(e,t)=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)},l=Object.prototype.hasOwnProperty,u=(e,t)=>l.call(e,t),d=Array.isArray,f=e=>x(e)===`[object Map]`,p=e=>x(e)===`[object Set]`,m=e=>x(e)===`[object Date]`,h=e=>typeof e==`function`,g=e=>typeof e==`string`,_=e=>typeof e==`symbol`,v=e=>typeof e==`object`&&!!e,y=e=>(v(e)||h(e))&&h(e.then)&&h(e.catch),b=Object.prototype.toString,x=e=>b.call(e),S=e=>x(e).slice(8,-1),C=e=>x(e)===`[object Object]`,w=e=>g(e)&&e!==`NaN`&&e[0]!==`-`&&``+parseInt(e,10)===e,T=e(`,key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted`),ee=e=>{let t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},te=/-\w/g,E=ee(e=>e.replace(te,e=>e.slice(1).toUpperCase())),ne=/\B([A-Z])/g,D=ee(e=>e.replace(ne,`-$1`).toLowerCase()),O=ee(e=>e.charAt(0).toUpperCase()+e.slice(1)),re=ee(e=>e?`on${O(e)}`:``),k=(e,t)=>!Object.is(e,t),ie=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},ae=e=>{let t=parseFloat(e);return isNaN(t)?e:t},oe=e=>{let t=g(e)?Number(e):NaN;return isNaN(t)?e:t},se,ce=()=>se||=typeof globalThis<`u`?globalThis:typeof self<`u`?self:typeof window<`u`?window:typeof global<`u`?global:{};function le(e){if(d(e)){let t={};for(let n=0;n{if(e){let n=e.split(de);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function j(e){let t=``;if(g(e))t=e;else if(d(e))for(let n=0;nM(e,t))}var P=e=>!!(e&&e.__v_isRef===!0),F=e=>g(e)?e:e==null?``:d(e)||v(e)&&(e.toString===b||!h(e.toString))?P(e)?F(e.value):JSON.stringify(e,ye,2):String(e),ye=(e,t)=>P(t)?ye(e,t.value):f(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((e,[t,n],r)=>(e[be(t,r)+` =>`]=n,e),{})}:p(t)?{[`Set(${t.size})`]:[...t.values()].map(e=>be(e))}:_(t)?be(t):v(t)&&!d(t)&&!C(t)?String(t):t,be=(e,t=``)=>_(e)?`Symbol(${e.description??t})`:e,I,xe=class{constructor(e=!1){this.detached=e,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!e&&I&&(I.active?(this.parent=I,this.index=(I.scopes||(I.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let e,t;if(this.scopes){let n=this.scopes.slice();for(e=0,t=n.length;e0&&--this._on===0){if(I===this)I=this.prevScope;else{let e=I;for(;e;){if(e.prevScope===this){e.prevScope=this.prevScope;break}e=e.prevScope}}this.prevScope=void 0}}stop(e){if(this._active){this._active=!1;let t,n;for(t=0,n=this.effects.length;t0)return;if(Ee){let e=Ee;for(Ee=void 0;e;){let t=e.next;e.next=void 0,e.flags&=-9,e=t}}let e;for(;R;){let t=R;for(R=void 0;t;){let n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(t){e||=t}t=n}}if(e)throw e}function Ae(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function je(e){let t,n=e.depsTail,r=n;for(;r;){let e=r.prevDep;r.version===-1?(r===n&&(n=e),Pe(r),Fe(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=e}e.deps=t,e.depsTail=n}function Me(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Ne(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Ne(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Be)||(e.globalVersion=Be,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Me(e))))return;e.flags|=2;let t=e.dep,n=L,r=z;L=e,z=!0;try{Ae(e);let n=e.fn(e._value);(t.version===0||k(n,e._value))&&(e.flags|=128,e._value=n,t.version++)}catch(e){throw t.version++,e}finally{L=n,z=r,je(e),e.flags&=-3}}function Pe(e,t=!1){let{dep:n,prevSub:r,nextSub:i}=e;if(r&&(r.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let e=n.computed.deps;e;e=e.nextDep)Pe(e,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Fe(e){let{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}var z=!0,Ie=[];function Le(){Ie.push(z),z=!1}function Re(){let e=Ie.pop();z=e===void 0||e}function ze(e){let{cleanup:t}=e;if(e.cleanup=void 0,t){let e=L;L=void 0;try{t()}finally{L=e}}}var Be=0,Ve=class{constructor(e,t){this.sub=e,this.dep=t,this.version=t.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}},He=class{constructor(e){this.computed=e,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(e){if(!L||!z||L===this.computed)return;let t=this.activeLink;if(t===void 0||t.sub!==L)t=this.activeLink=new Ve(L,this),L.deps?(t.prevDep=L.depsTail,L.depsTail.nextDep=t,L.depsTail=t):L.deps=L.depsTail=t,Ue(t);else if(t.version===-1&&(t.version=this.version,t.nextDep)){let e=t.nextDep;e.prevDep=t.prevDep,t.prevDep&&(t.prevDep.nextDep=e),t.prevDep=L.depsTail,t.nextDep=void 0,L.depsTail.nextDep=t,L.depsTail=t,L.deps===t&&(L.deps=e)}return t}trigger(e){this.version++,Be++,this.notify(e)}notify(e){Oe();try{for(let e=this.subs;e;e=e.prevSub)e.sub.notify()&&e.sub.dep.notify()}finally{ke()}}};function Ue(e){if(e.dep.sc++,e.sub.flags&4){let t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let e=t.deps;e;e=e.nextDep)Ue(e)}let n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}var We=new WeakMap,Ge=Symbol(``),Ke=Symbol(``),qe=Symbol(``);function B(e,t,n){if(z&&L){let t=We.get(e);t||We.set(e,t=new Map);let r=t.get(n);r||(t.set(n,r=new He),r.map=t,r.key=n),r.track()}}function Je(e,t,n,r,i,a){let o=We.get(e);if(!o){Be++;return}let s=e=>{e&&e.trigger()};if(Oe(),t===`clear`)o.forEach(s);else{let i=d(e),a=i&&w(n);if(i&&n===`length`){let e=Number(r);o.forEach((t,n)=>{(n===`length`||n===qe||!_(n)&&n>=e)&&s(t)})}else switch((n!==void 0||o.has(void 0))&&s(o.get(n)),a&&s(o.get(qe)),t){case`add`:i?a&&s(o.get(`length`)):(s(o.get(Ge)),f(e)&&s(o.get(Ke)));break;case`delete`:i||(s(o.get(Ge)),f(e)&&s(o.get(Ke)));break;case`set`:f(e)&&s(o.get(Ge))}}ke()}function Ye(e){let t=V(e);return t===e?t:(B(t,`iterate`,qe),Pt(e)?t:t.map(Lt))}function Xe(e){return B(e=V(e),`iterate`,qe),e}function Ze(e,t){return Nt(e)?Rt(Mt(e)?Lt(t):t):Lt(t)}var Qe={__proto__:null,[Symbol.iterator](){return $e(this,Symbol.iterator,e=>Ze(this,e))},concat(...e){return Ye(this).concat(...e.map(e=>d(e)?Ye(e):e))},entries(){return $e(this,`entries`,e=>(e[1]=Ze(this,e[1]),e))},every(e,t){return tt(this,`every`,e,t,void 0,arguments)},filter(e,t){return tt(this,`filter`,e,t,e=>e.map(e=>Ze(this,e)),arguments)},find(e,t){return tt(this,`find`,e,t,e=>Ze(this,e),arguments)},findIndex(e,t){return tt(this,`findIndex`,e,t,void 0,arguments)},findLast(e,t){return tt(this,`findLast`,e,t,e=>Ze(this,e),arguments)},findLastIndex(e,t){return tt(this,`findLastIndex`,e,t,void 0,arguments)},forEach(e,t){return tt(this,`forEach`,e,t,void 0,arguments)},includes(...e){return rt(this,`includes`,e)},indexOf(...e){return rt(this,`indexOf`,e)},join(e){return Ye(this).join(e)},lastIndexOf(...e){return rt(this,`lastIndexOf`,e)},map(e,t){return tt(this,`map`,e,t,void 0,arguments)},pop(){return it(this,`pop`)},push(...e){return it(this,`push`,e)},reduce(e,...t){return nt(this,`reduce`,e,t)},reduceRight(e,...t){return nt(this,`reduceRight`,e,t)},shift(){return it(this,`shift`)},some(e,t){return tt(this,`some`,e,t,void 0,arguments)},splice(...e){return it(this,`splice`,e)},toReversed(){return Ye(this).toReversed()},toSorted(e){return Ye(this).toSorted(e)},toSpliced(...e){return Ye(this).toSpliced(...e)},unshift(...e){return it(this,`unshift`,e)},values(){return $e(this,`values`,e=>Ze(this,e))}};function $e(e,t,n){let r=Xe(e),i=r[t]();return r!==e&&!Pt(e)&&(i._next=i.next,i.next=()=>{let e=i._next();return e.done||(e.value=n(e.value)),e}),i}var et=Array.prototype;function tt(e,t,n,r,i,a){let o=Xe(e),s=o!==e&&!Pt(e),c=o[t];if(c!==et[t]){let t=c.apply(e,a);return s?Lt(t):t}let l=n;o!==e&&(s?l=function(t,r){return n.call(this,Ze(e,t),r,e)}:n.length>2&&(l=function(t,r){return n.call(this,t,r,e)}));let u=c.call(o,l,r);return s&&i?i(u):u}function nt(e,t,n,r){let i=Xe(e),a=i!==e&&!Pt(e),o=n,s=!1;i!==e&&(a?(s=r.length===0,o=function(t,r,i){return s&&(s=!1,t=Ze(e,t)),n.call(this,t,Ze(e,r),i,e)}):n.length>3&&(o=function(t,r,i){return n.call(this,t,r,i,e)}));let c=i[t](o,...r);return s?Ze(e,c):c}function rt(e,t,n){let r=V(e);B(r,`iterate`,qe);let i=r[t](...n);return(i===-1||i===!1)&&Ft(n[0])?(n[0]=V(n[0]),r[t](...n)):i}function it(e,t,n=[]){Le(),Oe();let r=V(e)[t].apply(e,n);return ke(),Re(),r}var at=e(`__proto__,__v_isRef,__isVue`),ot=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!==`arguments`&&e!==`caller`).map(e=>Symbol[e]).filter(_));function st(e){_(e)||(e=String(e));let t=V(this);return B(t,`has`,e),t.hasOwnProperty(e)}var ct=class{constructor(e=!1,t=!1){this._isReadonly=e,this._isShallow=t}get(e,t,n){if(t===`__v_skip`)return e.__v_skip;let r=this._isReadonly,i=this._isShallow;if(t===`__v_isReactive`)return!r;if(t===`__v_isReadonly`)return r;if(t===`__v_isShallow`)return i;if(t===`__v_raw`)return n===(r?i?Et:Tt:i?wt:Ct).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;let a=d(e);if(!r){let e;if(a&&(e=Qe[t]))return e;if(t===`hasOwnProperty`)return st}let o=Reflect.get(e,t,H(e)?e:n);if((_(t)?ot.has(t):at(t))||(r||B(e,`get`,t),i))return o;if(H(o)){let e=a&&w(t)?o:o.value;return r&&v(e)?At(e):e}return v(o)?r?At(o):Ot(o):o}},lt=class extends ct{constructor(e=!1){super(!1,e)}set(e,t,n,r){let i=e[t],a=d(e)&&w(t);if(!this._isShallow){let e=Nt(i);if(!Pt(n)&&!Nt(n)&&(i=V(i),n=V(n)),!a&&H(i)&&!H(n))return e||(i.value=n),!0}let o=a?Number(t)e,ht=e=>Reflect.getPrototypeOf(e);function gt(e,t,n){return function(...r){let i=this.__v_raw,a=V(i),o=f(a),c=e===`entries`||e===Symbol.iterator&&o,l=e===`keys`&&o,u=i[e](...r),d=n?mt:t?Rt:Lt;return!t&&B(a,`iterate`,l?Ke:Ge),s(Object.create(u),{next(){let{value:e,done:t}=u.next();return t?{value:e,done:t}:{value:c?[d(e[0]),d(e[1])]:d(e),done:t}}})}}function _t(e){return function(...t){return e===`delete`?!1:e===`clear`?void 0:this}}function vt(e,t){let n={get(n){let r=this.__v_raw,i=V(r),a=V(n);e||(k(n,a)&&B(i,`get`,n),B(i,`get`,a));let{has:o}=ht(i),s=t?mt:e?Rt:Lt;if(o.call(i,n))return s(r.get(n));if(o.call(i,a))return s(r.get(a));r!==i&&r.get(n)},get size(){let t=this.__v_raw;return!e&&B(V(t),`iterate`,Ge),t.size},has(t){let n=this.__v_raw,r=V(n),i=V(t);return e||(k(t,i)&&B(r,`has`,t),B(r,`has`,i)),t===i?n.has(t):n.has(t)||n.has(i)},forEach(n,r){let i=this,a=i.__v_raw,o=V(a),s=t?mt:e?Rt:Lt;return!e&&B(o,`iterate`,Ge),a.forEach((e,t)=>n.call(r,s(e),s(t),i))}};return s(n,e?{add:_t(`add`),set:_t(`set`),delete:_t(`delete`),clear:_t(`clear`)}:{add(e){let n=V(this),r=ht(n),i=V(e),a=!t&&!Pt(e)&&!Nt(e)?i:e;return r.has.call(n,a)||k(e,a)&&r.has.call(n,e)||k(i,a)&&r.has.call(n,i)||(n.add(a),Je(n,`add`,a,a)),this},set(e,n){!t&&!Pt(n)&&!Nt(n)&&(n=V(n));let r=V(this),{has:i,get:a}=ht(r),o=i.call(r,e);o||=(e=V(e),i.call(r,e));let s=a.call(r,e);return r.set(e,n),o?k(n,s)&&Je(r,`set`,e,n,s):Je(r,`add`,e,n),this},delete(e){let t=V(this),{has:n,get:r}=ht(t),i=n.call(t,e);i||=(e=V(e),n.call(t,e));let a=r?r.call(t,e):void 0,o=t.delete(e);return i&&Je(t,`delete`,e,void 0,a),o},clear(){let e=V(this),t=e.size!==0,n=e.clear();return t&&Je(e,`clear`,void 0,void 0,void 0),n}}),[`keys`,`values`,`entries`,Symbol.iterator].forEach(r=>{n[r]=gt(r,e,t)}),n}function yt(e,t){let n=vt(e,t);return(t,r,i)=>r===`__v_isReactive`?!e:r===`__v_isReadonly`?e:r===`__v_raw`?t:Reflect.get(u(n,r)&&r in t?n:t,r,i)}var bt={get:yt(!1,!1)},xt={get:yt(!1,!0)},St={get:yt(!0,!1)},Ct=new WeakMap,wt=new WeakMap,Tt=new WeakMap,Et=new WeakMap;function Dt(e){switch(e){case`Object`:case`Array`:return 1;case`Map`:case`Set`:case`WeakMap`:case`WeakSet`:return 2;default:return 0}}function Ot(e){return Nt(e)?e:jt(e,!1,dt,bt,Ct)}function kt(e){return jt(e,!1,pt,xt,wt)}function At(e){return jt(e,!0,ft,St,Tt)}function jt(e,t,n,r,i){if(!v(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;let a=i.get(e);if(a)return a;let o=Dt(S(e));if(o===0)return e;let s=new Proxy(e,o===2?r:n);return i.set(e,s),s}function Mt(e){return Nt(e)?Mt(e.__v_raw):!!(e&&e.__v_isReactive)}function Nt(e){return!!(e&&e.__v_isReadonly)}function Pt(e){return!!(e&&e.__v_isShallow)}function Ft(e){return e?!!e.__v_raw:!1}function V(e){let t=e&&e.__v_raw;return t?V(t):e}function It(e){return!u(e,`__v_skip`)&&Object.isExtensible(e)&&A(e,`__v_skip`,!0),e}var Lt=e=>v(e)?Ot(e):e,Rt=e=>v(e)?At(e):e;function H(e){return e?e.__v_isRef===!0:!1}function U(e){return zt(e,!1)}function zt(e,t){return H(e)?e:new Bt(e,t)}var Bt=class{constructor(e,t){this.dep=new He,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=t?e:V(e),this._value=t?e:Lt(e),this.__v_isShallow=t}get value(){return this.dep.track(),this._value}set value(e){let t=this._rawValue,n=this.__v_isShallow||Pt(e)||Nt(e);e=n?e:V(e),k(e,t)&&(this._rawValue=e,this._value=n?e:Lt(e),this.dep.trigger())}};function W(e){return H(e)?e.value:e}var Vt={get:(e,t,n)=>t===`__v_raw`?e:W(Reflect.get(e,t,n)),set:(e,t,n,r)=>{let i=e[t];return H(i)&&!H(n)?(i.value=n,!0):Reflect.set(e,t,n,r)}};function Ht(e){return Mt(e)?e:new Proxy(e,Vt)}var Ut=class{constructor(e,t,n){this.fn=e,this.setter=t,this._value=void 0,this.dep=new He(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Be-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!t,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&L!==this)return De(this,!0),!0}get value(){let e=this.dep.track();return Ne(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}};function Wt(e,t,n=!1){let r,i;return h(e)?r=e:(r=e.get,i=e.set),new Ut(r,i,n)}var Gt={},Kt=new WeakMap,qt=void 0;function Jt(e,t=!1,n=qt){if(n){let t=Kt.get(n);t||Kt.set(n,t=[]),t.push(e)}}function Yt(e,n,i=t){let{immediate:a,deep:o,once:s,scheduler:l,augmentJob:u,call:f}=i,p=e=>o?e:Pt(e)||o===!1||o===0?Xt(e,1):Xt(e),m,g,_,v,y=!1,b=!1;if(H(e)?(g=()=>e.value,y=Pt(e)):Mt(e)?(g=()=>p(e),y=!0):d(e)?(b=!0,y=e.some(e=>Mt(e)||Pt(e)),g=()=>e.map(e=>{if(H(e))return e.value;if(Mt(e))return p(e);if(h(e))return f?f(e,2):e()})):g=h(e)?n?f?()=>f(e,2):e:()=>{if(_){Le();try{_()}finally{Re()}}let t=qt;qt=m;try{return f?f(e,3,[v]):e(v)}finally{qt=t}}:r,n&&o){let e=g,t=o===!0?1/0:o;g=()=>Xt(e(),t)}let x=Se(),S=()=>{m.stop(),x&&x.active&&c(x.effects,m)};if(s&&n){let e=n;n=(...t)=>{let n=e(...t);return S(),n}}let C=b?Array(e.length).fill(Gt):Gt,w=e=>{if(m.flags&1&&(m.dirty||e)){if(n){let t=m.run();if(e||o||y||(b?t.some((e,t)=>k(e,C[t])):k(t,C))){_&&_();let e=qt;qt=m;try{let e=[t,C===Gt?void 0:b&&C[0]===Gt?[]:C,v];C=t,f?f(n,3,e):n(...e)}finally{qt=e}}}else m.run()}};return u&&u(w),m=new we(g),m.scheduler=l?()=>l(w,!1):w,v=e=>Jt(e,!1,m),_=m.onStop=()=>{let e=Kt.get(m);if(e){if(f)f(e,4);else for(let t of e)t();Kt.delete(m)}},n?a?w(!0):C=m.run():l?l(w.bind(null,!0),!0):m.run(),S.pause=m.pause.bind(m),S.resume=m.resume.bind(m),S.stop=S,S}function Xt(e,t=1/0,n){if(t<=0||!v(e)||e.__v_skip||(n||=new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,H(e))Xt(e.value,t,n);else if(d(e))for(let r=0;r{Xt(e,t,n)});else if(C(e)){for(let r in e)Xt(e[r],t,n);for(let r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&Xt(e[r],t,n)}return e}function Zt(e,t,n,r){try{return r?e(...r):e()}catch(e){$t(e,t,n)}}function Qt(e,t,n,r){if(h(e)){let i=Zt(e,t,n,r);return i&&y(i)&&i.catch(e=>{$t(e,t,n)}),i}if(d(e)){let i=[];for(let a=0;a>>1,i=tn[r],a=gn(i);a=gn(n)?tn.push(e):tn.splice(un(t),0,e),e.flags|=1,fn()}}function fn(){cn||=sn.then(_n)}function pn(e){if(!d(e))an&&e.id===-1?an.splice(on+1,0,e):e.flags&1||(rn.push(e),e.flags|=1);else for(let t=0;tgn(e)-gn(t));if(rn.length=0,an){for(let t=0;te.id==null?e.flags&2?-1:1/0:e.id;function _n(e){try{for(nn=0;nn{r._d&&Vi(-1);let i=bn(t),a=Li.length,o;try{o=e(...n)}finally{for(let e=Li.length;e>a;e--)zi();bn(i),r._d&&Vi(1)}return o};return r._n=!0,r._c=!0,r._d=!0,r}function Sn(e,n){if(vn===null)return e;let r=ya(vn),i=e.dirs||=[];for(let e=0;e1)return n&&h(t)?t.call(r&&r.proxy):t}}var En=Symbol.for(`v-scx`),Dn=()=>Tn(En);function On(e,t,n){return kn(e,t,n)}function kn(e,n,i=t){let{immediate:a,deep:o,flush:c,once:l}=i,u=s({},i),d=n&&a||!n&&c!==`post`,f;if(fa){if(c===`sync`){let e=Dn();f=e.__watcherHandles||=[]}else if(!d){let e=()=>{};return e.stop=r,e.resume=r,e.pause=r,e}}let p=aa;u.call=(e,t,n)=>Qt(e,p,t,n);let m=!1;c===`post`?u.scheduler=e=>{xi(e,p&&p.suspense)}:c!==`sync`&&(m=!0,u.scheduler=(e,t)=>{t?e():dn(e)}),u.augmentJob=e=>{n&&(e.flags|=4),m&&(e.flags|=2,p&&(e.id=p.uid,e.i=p))};let h=Yt(e,n,u);return fa&&(f?f.push(h):d&&h()),h}function An(e,t,n){let r=this.proxy,i=g(e)?e.includes(`.`)?jn(r,e):()=>r[e]:e.bind(r,r),a;h(t)?a=t:(a=t.handler,n=t);let o=la(this),s=kn(i,a.bind(r),n);return o(),s}function jn(e,t){let n=t.split(`.`);return()=>{let t=e;for(let e=0;ee.__isTeleport,Pn=Symbol(`_leaveCb`),Fn=Symbol(`_enterCb`);function In(){let e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return ur(()=>{e.isMounted=!0}),pr(()=>{e.isUnmounting=!0}),e}var Ln=[Function,Array],Rn={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Ln,onEnter:Ln,onAfterEnter:Ln,onEnterCancelled:Ln,onBeforeLeave:Ln,onLeave:Ln,onAfterLeave:Ln,onLeaveCancelled:Ln,onBeforeAppear:Ln,onAppear:Ln,onAfterAppear:Ln,onAppearCancelled:Ln},zn=e=>{let t=e.subTree;return t.component?zn(t.component):t},Bn={name:`BaseTransition`,props:Rn,setup(e,{slots:t}){let n=oa(),r=In();return()=>{let i=t.default&&Jn(t.default(),!0),a=i&&i.length?Vn(i):n.subTree?Z():void 0;if(!a)return;let o=V(e),{mode:s}=o;if(r.isLeaving)return Gn(a);let c=Kn(a);if(!c)return Gn(a);let l=Wn(c,o,r,n,e=>l=e);c.type!==Fi&&qn(c,l);let u=n.subTree&&Kn(n.subTree);if(u&&u.type!==Fi&&!Gi(u,c)&&zn(n).type!==Fi){let e=Wn(u,o,r,n);if(qn(u,e),s===`out-in`&&c.type!==Fi)return r.isLeaving=!0,e.afterLeave=()=>{r.isLeaving=!1,n.job.flags&8||n.update(),delete e.afterLeave,u=void 0},Gn(a);s===`in-out`&&c.type!==Fi?e.delayLeave=(e,t,n)=>{let i=Un(r,u);i[String(u.key)]=u,e[Pn]=()=>{t(),e[Pn]=void 0,delete l.delayedLeave,u=void 0},l.delayedLeave=()=>{n(),delete l.delayedLeave,u=void 0}}:u=void 0}else u&&=void 0;return a}}};function Vn(e){let t=e[0];if(e.length>1){for(let n of e)if(n.type!==Fi){t=n;break}}return t}var Hn=Bn;function Un(e,t){let{leavingVNodes:n}=e,r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function Wn(e,t,n,r,i){let{appear:a,mode:o,persisted:s=!1,onBeforeEnter:c,onEnter:l,onAfterEnter:u,onEnterCancelled:f,onBeforeLeave:p,onLeave:m,onAfterLeave:h,onLeaveCancelled:g,onBeforeAppear:_,onAppear:v,onAfterAppear:y,onAppearCancelled:b}=t,x=String(e.key),S=Un(n,e),C=(e,t)=>{e&&Qt(e,r,9,t)},w=(e,t)=>{let n=t[1];C(e,t),d(e)?e.every(e=>e.length<=1)&&n():e.length<=1&&n()},T={mode:o,persisted:s,beforeEnter(t){let r=c;if(!n.isMounted){if(a)r=_||c;else return}t[Pn]&&t[Pn](!0);let i=S[x];i&&Gi(e,i)&&i.el[Pn]&&i.el[Pn](),C(r,[t])},enter(t){if(S[x]===e)return;let r=l,i=u,o=f;if(!n.isMounted){if(a)r=v||l,i=y||u,o=b||f;else return}let s=!1;t[Fn]=e=>{s||(s=!0,C(e?o:i,[t]),T.delayedLeave&&T.delayedLeave(),t[Fn]=void 0)};let c=t[Fn].bind(null,!1);r?w(r,[t,c]):c()},leave(t,r){let i=String(e.key);if(t[Fn]&&t[Fn](!0),n.isUnmounting)return r();C(p,[t]);let a=!1;t[Pn]=n=>{a||(a=!0,r(),C(n?g:h,[t]),t[Pn]=void 0,S[i]===e&&delete S[i])};let o=t[Pn].bind(null,!1);S[i]=e,m?w(m,[t,o]):o()},clone(e){let a=Wn(e,t,n,r,i);return i&&i(a),a}};return T}function Gn(e){if(nr(e))return e=Xi(e),e.children=null,e}function Kn(e){if(!nr(e))return Nn(e.type)&&e.children?Vn(e.children):e;if(e.component)return e.component.subTree;let{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&h(n.default))return n.default()}}function qn(e,t){if(e.shapeFlag&6&&e.component){e.transition=t;let n=e.component.subTree;qn(Nn(n.type)&&Kn(n)||n,t)}else e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Jn(e,t=!1,n){let r=[],i=0;for(let a=0;a1)for(let e=0;e$n(e,n&&(d(n)?n[t]:n),r,a,o));return}if(tr(a)&&!o){a.shapeFlag&512&&a.type.__asyncResolved&&a.component.subTree.component&&$n(e,n,r,a.component.subTree);return}let s=a.shapeFlag&4?ya(a.component):a.el,l=o?null:s,{i:f,r:p}=e,m=n&&n.r,_=f.refs===t?f.refs={}:f.refs,v=f.setupState,y=V(v),b=v===t?i:e=>!Zn(_,e)&&u(y,e),x=(e,t)=>!(t&&Zn(_,t));if(m!=null&&m!==p){if(er(n),g(m))_[m]=null,b(m)&&(v[m]=null);else if(H(m)){let e=n;x(m,e.k)&&(m.value=null),e.k&&(_[e.k]=null)}}if(h(p))Zt(p,f,12,[l,_]);else{let t=g(p),n=H(p);if(t||n){let i=()=>{if(e.f){let n=t?b(p)?v[p]:_[p]:x(p)||!e.k?p.value:_[e.k];if(o)d(n)&&c(n,s);else if(d(n))n.includes(s)||n.push(s);else if(t)_[p]=[s],b(p)&&(v[p]=_[p]);else{let t=[s];x(p,e.k)&&(p.value=t),e.k&&(_[e.k]=t)}}else t?(_[p]=l,b(p)&&(v[p]=l)):n&&(x(p,e.k)&&(p.value=l),e.k&&(_[e.k]=l))};if(l){let t=()=>{i(),Qn.delete(e)};t.id=-1,Qn.set(e,t),xi(t,r)}else er(e),i()}}}function er(e){let t=Qn.get(e);t&&(t.flags|=8,Qn.delete(e))}ce().requestIdleCallback,ce().cancelIdleCallback;var tr=e=>!!e.type.__asyncLoader,nr=e=>e.type.__isKeepAlive;function rr(e,t){ar(e,`a`,t)}function ir(e,t){ar(e,`da`,t)}function ar(e,t,n=aa){let r=e.__wdc||=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()};if(sr(t,r,n),n){let e=n.parent;for(;e&&e.parent;)nr(e.parent.vnode)&&or(r,t,n,e),e=e.parent}}function or(e,t,n,r){let i=sr(t,e,r,!0);mr(()=>{c(r[t],i)},n)}function sr(e,t,n=aa,r=!1){if(n){let i=n[e]||(n[e]=[]),a=t.__weh||=(...r)=>{Le();let i=la(n),a=Qt(t,n,e,r);return i(),Re(),a};return r?i.unshift(a):i.push(a),a}}var cr=e=>(t,n=aa)=>{(!fa||e===`sp`)&&sr(e,(...e)=>t(...e),n)},lr=cr(`bm`),ur=cr(`m`),dr=cr(`bu`),fr=cr(`u`),pr=cr(`bum`),mr=cr(`um`),hr=cr(`sp`),gr=cr(`rtg`),_r=cr(`rtc`);function vr(e,t=aa){sr(`ec`,e,t)}var yr=Symbol.for(`v-ndc`);function br(e,t,n,r){let i,a=n&&n[r],o=d(e);if(o||g(e)){let n=o&&Mt(e),r=!1,s=!1;n&&(r=!Pt(e),s=Nt(e),e=Xe(e)),i=Array(e.length);for(let n=0,o=e.length;nt(e,n,void 0,a&&a[n]));else{let n=Object.keys(e);i=Array(n.length);for(let r=0,o=n.length;re?da(e)?ya(e):xr(e.parent):null,Sr=s(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>xr(e.parent),$root:e=>xr(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>jr(e),$forceUpdate:e=>e.f||=()=>{dn(e.update)},$nextTick:e=>e.n||=ln.bind(e.proxy),$watch:e=>An.bind(e)}),Cr=(e,n)=>e!==t&&!e.__isScriptSetup&&u(e,n),wr={get({_:e},n){if(n===`__v_skip`)return!0;let{ctx:r,setupState:i,data:a,props:o,accessCache:s,type:c,appContext:l}=e;if(n[0]!==`$`){let e=s[n];if(e!==void 0)switch(e){case 1:return i[n];case 2:return a[n];case 4:return r[n];case 3:return o[n]}else if(Cr(i,n))return s[n]=1,i[n];else if(a!==t&&u(a,n))return s[n]=2,a[n];else if(u(o,n))return s[n]=3,o[n];else if(r!==t&&u(r,n))return s[n]=4,r[n];else Er&&(s[n]=0)}let d=Sr[n],f,p;if(d)return n===`$attrs`&&B(e.attrs,`get`,``),d(e);if((f=c.__cssModules)&&(f=f[n]))return f;if(r!==t&&u(r,n))return s[n]=4,r[n];if(p=l.config.globalProperties,u(p,n))return p[n]},set({_:e},n,r){let{data:i,setupState:a,ctx:o}=e;return Cr(a,n)?(a[n]=r,!0):i!==t&&u(i,n)?(i[n]=r,!0):u(e.props,n)||n[0]===`$`&&n.slice(1)in e?!1:(o[n]=r,!0)},has({_:{data:e,setupState:n,accessCache:r,ctx:i,appContext:a,props:o,type:s}},c){let l;return!!(r[c]||e!==t&&c[0]!==`$`&&u(e,c)||Cr(n,c)||u(o,c)||u(i,c)||u(Sr,c)||u(a.config.globalProperties,c)||(l=s.__cssModules)&&l[c])},defineProperty(e,t,n){return n.get==null?u(n,`value`)&&this.set(e,t,n.value,null):e._.accessCache[t]=0,Reflect.defineProperty(e,t,n)}};function Tr(e){return d(e)?e.reduce((e,t)=>(e[t]=null,e),{}):e}var Er=!0;function Dr(e){let t=jr(e),n=e.proxy,i=e.ctx;Er=!1,t.beforeCreate&&kr(t.beforeCreate,e,`bc`);let{data:a,computed:o,methods:s,watch:c,provide:l,inject:u,created:f,beforeMount:p,mounted:m,beforeUpdate:g,updated:_,activated:y,deactivated:b,beforeDestroy:x,beforeUnmount:S,destroyed:C,unmounted:w,render:T,renderTracked:ee,renderTriggered:te,errorCaptured:E,serverPrefetch:ne,expose:D,inheritAttrs:O,components:re,directives:k,filters:ie}=t;if(u&&Or(u,i,null),s)for(let e in s){let t=s[e];h(t)&&(i[e]=t.bind(n))}if(a){let t=a.call(n,n);v(t)&&(e.data=Ot(t))}if(Er=!0,o)for(let e in o){let t=o[e],a=xa({get:h(t)?t.bind(n,n):h(t.get)?t.get.bind(n,n):r,set:!h(t)&&h(t.set)?t.set.bind(n):r});Object.defineProperty(i,e,{enumerable:!0,configurable:!0,get:()=>a.value,set:e=>a.value=e})}if(c)for(let e in c)Ar(c[e],i,n,e);if(l){let e=h(l)?l.call(n):l;Reflect.ownKeys(e).forEach(t=>{wn(t,e[t])})}f&&kr(f,e,`c`);function A(e,t){d(t)?t.forEach(t=>e(t.bind(n))):t&&e(t.bind(n))}if(A(lr,p),A(ur,m),A(dr,g),A(fr,_),A(rr,y),A(ir,b),A(vr,E),A(_r,ee),A(gr,te),A(pr,S),A(mr,w),A(hr,ne),d(D)){if(D.length){let t=e.exposed||={};D.forEach(e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t,enumerable:!0})})}else e.exposed||={}}T&&e.render===r&&(e.render=T),O!=null&&(e.inheritAttrs=O),re&&(e.components=re),k&&(e.directives=k),ne&&Xn(e)}function Or(e,t,n=r){d(e)&&(e=Ir(e));for(let n in e){let r=e[n],i;i=v(r)?`default`in r?Tn(r.from||n,r.default,!0):Tn(r.from||n):Tn(r),H(i)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>i.value,set:e=>i.value=e}):t[n]=i}}function kr(e,t,n){Qt(d(e)?e.map(e=>e.bind(t.proxy)):e.bind(t.proxy),t,n)}function Ar(e,t,n,r){let i=r.includes(`.`)?jn(n,r):()=>n[r];if(g(e)){let n=t[e];h(n)&&On(i,n)}else if(h(e))On(i,e.bind(n));else if(v(e)){if(d(e))e.forEach(e=>Ar(e,t,n,r));else{let r=h(e.handler)?e.handler.bind(n):t[e.handler];h(r)&&On(i,r,e)}}}function jr(e){let t=e.type,{mixins:n,extends:r}=t,{mixins:i,optionsCache:a,config:{optionMergeStrategies:o}}=e.appContext,s=a.get(t),c;return s?c=s:!i.length&&!n&&!r?c=t:(c={},i.length&&i.forEach(e=>Mr(c,e,o,!0)),Mr(c,t,o)),v(t)&&a.set(t,c),c}function Mr(e,t,n,r=!1){let{mixins:i,extends:a}=t;a&&Mr(e,a,n,!0),i&&i.forEach(t=>Mr(e,t,n,!0));for(let i in t)if(!(r&&i===`expose`)){let r=Nr[i]||n&&n[i];e[i]=r?r(e[i],t[i]):t[i]}return e}var Nr={data:Pr,props:zr,emits:zr,methods:Rr,computed:Rr,beforeCreate:Lr,created:Lr,beforeMount:Lr,mounted:Lr,beforeUpdate:Lr,updated:Lr,beforeDestroy:Lr,beforeUnmount:Lr,destroyed:Lr,unmounted:Lr,activated:Lr,deactivated:Lr,errorCaptured:Lr,serverPrefetch:Lr,components:Rr,directives:Rr,watch:Br,provide:Pr,inject:Fr};function Pr(e,t){return t?e?function(){return s(h(e)?e.call(this,this):e,h(t)?t.call(this,this):t)}:t:e}function Fr(e,t){return Rr(Ir(e),Ir(t))}function Ir(e){if(d(e)){let t={};for(let n=0;nt===`modelValue`||t===`model-value`?e.modelModifiers:e[`${t}Modifiers`]||e[`${E(t)}Modifiers`]||e[`${D(t)}Modifiers`];function Kr(e,n,...r){if(e.isUnmounted)return;let i=e.vnode.props||t,a=r,o=n.startsWith(`update:`),s=o&&Gr(i,n.slice(7));s&&(s.trim&&(a=r.map(e=>g(e)?e.trim():e)),s.number&&(a=a.map(ae)));let c,l=i[c=re(n)]||i[c=re(E(n))];!l&&o&&(l=i[c=re(D(n))]),l&&Qt(l,e,6,a);let u=i[c+`Once`];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[c])return;e.emitted[c]=!0,Qt(u,e,6,a)}}var qr=new WeakMap;function Jr(e,t,n=!1){let r=n?qr:t.emitsCache,i=r.get(e);if(i!==void 0)return i;let a=e.emits,o={},c=!1;if(!h(e)){let r=e=>{let n=Jr(e,t,!0);n&&(c=!0,s(o,n))};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}return!a&&!c?(v(e)&&r.set(e,null),null):(d(a)?a.forEach(e=>o[e]=null):s(o,a),v(e)&&r.set(e,o),o)}function Yr(e,t){return!e||!a(t)?!1:(t=t.slice(2),t=t===`Once`?t:t.replace(/Once$/,``),u(e,t[0].toLowerCase()+t.slice(1))||u(e,D(t))||u(e,t))}function Xr(e){let{type:t,vnode:n,proxy:r,withProxy:i,propsOptions:[a],slots:s,attrs:c,emit:l,render:u,renderCache:d,props:f,data:p,setupState:m,ctx:h,inheritAttrs:g}=e,_=bn(e),v,y;try{if(n.shapeFlag&4){let e=i||r,t=e;v=Zi(u.call(t,e,d,f,m,p,h)),y=c}else{let e=t;v=Zi(e.length>1?e(f,{attrs:c,slots:s,emit:l}):e(f,null)),y=t.props?c:Zr(c)}}catch(t){Li.length=0,$t(t,e,1),v=Y(Fi)}let b=v;if(y&&g!==!1){let e=Object.keys(y),{shapeFlag:t}=b;e.length&&t&7&&(a&&e.some(o)&&(y=Qr(y,a)),b=Xi(b,y,!1,!0))}return n.dirs&&(b=Xi(b,null,!1,!0),b.dirs=b.dirs?b.dirs.concat(n.dirs):n.dirs),n.transition&&qn(Nn(b.type)&&Kn(b)||b,n.transition),v=b,bn(_),v}var Zr=e=>{let t;for(let n in e)(n===`class`||n===`style`||a(n))&&((t||={})[n]=e[n]);return t},Qr=(e,t)=>{let n={};for(let r in e)(!o(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function $r(e,t,n){let{props:r,children:i,component:a}=e,{props:o,children:s,patchFlag:c}=t,l=a.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?ei(r,o,l):!!o;if(c&8){let e=t.dynamicProps;for(let t=0;tObject.create(ri),ai=e=>Object.getPrototypeOf(e)===ri;function oi(e,t,n,r=!1){let i={},a=ii();e.propsDefaults=Object.create(null),ci(e,t,i,a);for(let t in e.propsOptions[0])t in i||(i[t]=void 0);e.props=n?r?i:kt(i):e.type.props?i:a,e.attrs=a}function si(e,t,n,r){let{props:i,attrs:a,vnode:{patchFlag:o}}=e,s=V(i),[c]=e.propsOptions,l=!1;if((r||o>0)&&!(o&16)){if(o&8){let n=e.vnode.dynamicProps;for(let r=0;r{p=!0;let[t,n]=di(e,r,!0);s(l,t),n&&f.push(...n)};!i&&r.mixins.length&&r.mixins.forEach(t),e.extends&&t(e.extends),e.mixins&&e.mixins.forEach(t)}if(!c&&!p)return v(e)&&a.set(e,n),n;if(d(c))for(let e=0;ee===`_`||e===`_ctx`||e===`$stable`,mi=e=>d(e)?e.map(Zi):[Zi(e)],hi=(e,t,n)=>{if(t._n)return t;let r=xn((...e)=>mi(t(...e)),n);return r._c=!1,r},gi=(e,t,n)=>{let r=e._ctx;for(let n in e){if(pi(n))continue;let i=e[n];if(h(i))t[n]=hi(n,i,r);else if(i!=null){let e=mi(i);t[n]=()=>e}}},_i=(e,t)=>{let n=mi(t);e.slots.default=()=>n},vi=(e,t,n)=>{for(let r in t)(n||!pi(r))&&(e[r]=t[r])},yi=(e,t,n)=>{let r=e.slots=ii();if(e.vnode.shapeFlag&32){let e=t._;e?(vi(r,t,n),n&&A(r,`_`,e,!0)):gi(t,r)}else t&&_i(e,t)},bi=(e,n,r)=>{let{vnode:i,slots:a}=e,o=!0,s=t;if(i.shapeFlag&32){let e=n._;e?r&&e===1?o=!1:vi(a,n,r):(o=!n.$stable,gi(n,a)),s=n}else n&&(_i(e,n),s={default:1});if(o)for(let e in a)!pi(e)&&s[e]==null&&delete a[e]},xi=Ni;function Si(e){return Ci(e)}function Ci(e,i){let a=ce();a.__VUE__=!0;let{insert:o,remove:s,patchProp:c,createElement:l,createText:u,createComment:d,setText:f,setElementText:p,parentNode:m,nextSibling:h,setScopeId:g=r,insertStaticContent:_}=e,v=(e,t,n,r=null,i=null,a=null,o=void 0,s=null,c=!!t.dynamicChildren)=>{if(e===t)return;e&&!Gi(e,t)&&(r=_e(e),pe(e,i,a,!0),e=null),t.patchFlag===-2&&(c=!1,t.dynamicChildren=null);let{type:l,ref:u,shapeFlag:d}=t;switch(l){case Pi:y(e,t,n,r);break;case Fi:b(e,t,n,r);break;case Ii:e??x(t,n,r,o);break;case G:re(e,t,n,r,i,a,o,s,c);break;default:d&1?w(e,t,n,r,i,a,o,s,c):d&6?k(e,t,n,r,i,a,o,s,c):(d&64||d&128)&&l.process(e,t,n,r,i,a,o,s,c,N)}u!=null&&i?$n(u,e&&e.ref,a,t||e,!t):u==null&&e&&e.ref!=null&&$n(e.ref,null,a,e,!0)},y=(e,t,n,r)=>{if(e==null)o(t.el=u(t.children),n,r);else{let n=t.el=e.el;t.children!==e.children&&f(n,t.children)}},b=(e,t,n,r)=>{e==null?o(t.el=d(t.children||``),n,r):t.el=e.el},x=(e,t,n,r)=>{[e.el,e.anchor]=_(e.children,t,n,r,e.el,e.anchor)},S=({el:e,anchor:t},n,r)=>{let i;for(;e&&e!==t;)i=h(e),o(e,n,r),e=i;o(t,n,r)},C=({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=h(e),s(e),e=n;s(t)},w=(e,t,n,r,i,a,o,s,c)=>{if(t.type===`svg`?o=`svg`:t.type===`math`&&(o=`mathml`),e==null)ee(t,n,r,i,a,o,s,c);else{let n=e.el&&e.el._isVueCE?e.el:null;try{n&&n._beginPatch(),ne(e,t,i,a,o,s,c)}finally{n&&n._endPatch()}}},ee=(e,t,n,r,i,a,s,u)=>{let d,f,{props:m,shapeFlag:h,transition:g,dirs:_}=e;if(d=e.el=l(e.type,a,m&&m.is,m),h&8?p(d,e.children):h&16&&E(e.children,d,null,r,i,wi(e,a),s,u),_&&Cn(e,null,r,`created`),te(d,e,e.scopeId,s,r),m){for(let e in m)e!==`value`&&!T(e)&&c(d,e,null,m[e],a,r);`value`in m&&c(d,`value`,null,m.value,a),(f=m.onVnodeBeforeMount)&&ta(f,r,e)}_&&Cn(e,null,r,`beforeMount`);let v=Ei(i,g);v&&g.beforeEnter(d),o(d,t,n),((f=m&&m.onVnodeMounted)||v||_)&&xi(()=>{try{f&&ta(f,r,e),v&&g.enter(d),_&&Cn(e,null,r,`mounted`)}finally{}},i)},te=(e,t,n,r,i)=>{if(n&&g(e,n),r)for(let t=0;t{for(let l=c;l{let l=n.el=e.el,{patchFlag:u,dynamicChildren:d,dirs:f}=n;u|=e.patchFlag&16;let m=e.props||t,h=n.props||t,g;if(r&&Ti(r,!1),(g=h.onVnodeBeforeUpdate)&&ta(g,r,n,e),f&&Cn(n,e,r,`beforeUpdate`),r&&Ti(r,!0),d&&(!e.dynamicChildren||e.dynamicChildren.length!==d.length)&&(u=0,s=!1,d=null),(m.innerHTML&&h.innerHTML==null||m.textContent&&h.textContent==null)&&p(l,``),d?D(e.dynamicChildren,d,l,r,i,wi(n,a),o):s||le(e,n,l,null,r,i,wi(n,a),o,!1),u>0){if(u&16)O(l,m,h,r,a);else if(u&2&&m.class!==h.class&&c(l,`class`,null,h.class,a),u&4&&c(l,`style`,m.style,h.style,a),u&8){let e=n.dynamicProps;for(let t=0;t{g&&ta(g,r,n,e),f&&Cn(n,e,r,`updated`)},i)},D=(e,t,n,r,i,a,o)=>{for(let s=0;s{if(n!==r){if(n!==t)for(let t in n)!T(t)&&!(t in r)&&c(e,t,n[t],null,a,i);for(let t in r){if(T(t))continue;let o=r[t],s=n[t];o!==s&&t!==`value`&&c(e,t,s,o,a,i)}`value`in r&&c(e,`value`,n.value,r.value,a)}},re=(e,t,n,r,i,a,s,c,l)=>{let d=t.el=e?e.el:u(``),f=t.anchor=e?e.anchor:u(``),{patchFlag:p,dynamicChildren:m,slotScopeIds:h}=t;h&&(c=c?c.concat(h):h),e==null?(o(d,n,r),o(f,n,r),E(t.children||[],n,f,i,a,s,c,l)):p>0&&p&64&&m&&e.dynamicChildren&&e.dynamicChildren.length===m.length?(D(e.dynamicChildren,m,n,i,a,s,c),(t.key!=null||i&&t===i.subTree)&&Di(e,t,!0)):le(e,t,n,f,i,a,s,c,l)},k=(e,t,n,r,i,a,o,s,c)=>{t.slotScopeIds=s,e==null?t.shapeFlag&512?i.ctx.activate(t,n,r,o,c):A(t,n,r,i,a,o,c):ae(e,t,c)},A=(e,t,n,r,i,a,o)=>{let s=e.component=ia(e,r,i);if(nr(e)&&(s.ctx.renderer=N),pa(s,!1,o),s.asyncDep){if(i&&i.registerDep(s,oe,o),!e.el){let r=s.subTree=Y(Fi);b(null,r,t,n),e.placeholder=r.el}}else oe(s,e,t,n,i,a,o)},ae=(e,t,n)=>{let r=t.component=e.component;if($r(e,t,n)){if(r.asyncDep&&!r.asyncResolved){se(r,t,n);return}r.next=t,r.update()}else t.el=e.el,r.vnode=t},oe=(e,t,n,r,i,a,o)=>{let s=()=>{if(e.isMounted){let{next:t,bu:n,u:r,parent:s,vnode:c}=e;{let n=ki(e);if(n){t&&(t.el=c.el,se(e,t,o)),n.asyncDep.then(()=>{xi(()=>{e.isUnmounted||l()},i)});return}}let u=t,d;Ti(e,!1),t?(t.el=c.el,se(e,t,o)):t=c,n&&ie(n),(d=t.props&&t.props.onVnodeBeforeUpdate)&&ta(d,s,t,c),Ti(e,!0);let f=Xr(e),p=e.subTree;e.subTree=f,v(p,f,m(p.el),_e(p),e,i,a),t.el=f.el,u===null&&ni(e,f.el),r&&xi(r,i),(d=t.props&&t.props.onVnodeUpdated)&&xi(()=>ta(d,s,t,c),i)}else{let o,{el:s,props:c}=t,{bm:l,m:u,parent:d,root:f,type:p}=e,m=tr(t);if(Ti(e,!1),l&&ie(l),!m&&(o=c&&c.onVnodeBeforeMount)&&ta(o,d,t),Ti(e,!0),s&&F){let t=()=>{e.subTree=Xr(e),F(s,e.subTree,e,i,null)};m&&p.__asyncHydrate?p.__asyncHydrate(s,e,t):t()}else{f.ce&&f.ce._hasShadowRoot()&&f.ce._injectChildStyle(p,e.parent?e.parent.type:void 0);let o=e.subTree=Xr(e);v(null,o,n,r,e,i,a),t.el=o.el}if(u&&xi(u,i),!m&&(o=c&&c.onVnodeMounted)){let e=t;xi(()=>ta(o,d,e),i)}(t.shapeFlag&256||d&&tr(d.vnode)&&d.vnode.shapeFlag&256)&&e.a&&xi(e.a,i),e.isMounted=!0,t=n=r=null}};e.scope.on();let c=e.effect=new we(s);e.scope.off();let l=e.update=c.run.bind(c),u=e.job=c.runIfDirty.bind(c);u.i=e,u.id=e.uid,c.scheduler=()=>dn(u),Ti(e,!0),l()},se=(e,t,n)=>{t.component=e;let r=e.vnode.props;e.vnode=t,e.next=null,si(e,t.props,r,n),bi(e,t.children,n),Le(),mn(e),Re()},le=(e,t,n,r,i,a,o,s,c=!1)=>{let l=e&&e.children,u=e?e.shapeFlag:0,d=t.children,{patchFlag:f,shapeFlag:m}=t;if(f>0){if(f&128){de(l,d,n,r,i,a,o,s,c);return}if(f&256){ue(l,d,n,r,i,a,o,s,c);return}}m&8?(u&16&&ge(l,i,a),d!==l&&p(n,d)):u&16?m&16?de(l,d,n,r,i,a,o,s,c):ge(l,i,a,!0):(u&8&&p(n,``),m&16&&E(d,n,r,i,a,o,s,c))},ue=(e,t,r,i,a,o,s,c,l)=>{e||=n,t||=n;let u=e.length,d=t.length,f=Math.min(u,d),p=0;for(;pd?ge(e,a,o,!0,!1,f):E(t,r,i,a,o,s,c,l,f)},de=(e,t,r,i,a,o,s,c,l)=>{let u=0,d=t.length,f=e.length-1,p=d-1;for(;u<=f&&u<=p;){let n=e[u],i=t[u]=l?Qi(t[u]):Zi(t[u]);if(Gi(n,i))v(n,i,r,null,a,o,s,c,l);else break;u++}for(;u<=f&&u<=p;){let n=e[f],i=t[p]=l?Qi(t[p]):Zi(t[p]);if(Gi(n,i))v(n,i,r,null,a,o,s,c,l);else break;f--,p--}if(u>f){if(u<=p){let e=p+1,n=ep)for(;u<=f;)pe(e[u],a,o,!0),u++;else{let m=u,h=u,g=new Map;for(u=h;u<=p;u++){let e=t[u]=l?Qi(t[u]):Zi(t[u]);e.key!=null&&g.set(e.key,u)}let _,y=0,b=p-h+1,x=!1,S=0,C=Array(b);for(u=0;u=b){pe(n,a,o,!0);continue}let i;if(n.key!=null)i=g.get(n.key);else for(_=h;_<=p;_++)if(C[_-h]===0&&Gi(n,t[_])){i=_;break}i===void 0?pe(n,a,o,!0):(C[i-h]=u+1,i>=S?S=i:x=!0,v(n,t[i],r,null,a,o,s,c,l),y++)}let w=x?Oi(C):n;for(_=w.length-1,u=b-1;u>=0;u--){let e=h+u,n=t[e],f=t[e+1],p=e+1{let{el:a,type:c,transition:l,children:u,shapeFlag:d}=e;if(d&6){fe(e.component.subTree,t,n,r);return}if(d&128){e.suspense.move(t,n,r);return}if(d&64){c.move(e,t,n,N);return}if(c===G){o(a,t,n);for(let e=0;el.enter(a),i));else{let{leave:r,delayLeave:i,afterLeave:c}=l,u=()=>{e.ctx.isUnmounted?s(a):o(a,t,n)},d=()=>{let e=a._isLeaving||!!a[Pn];a._isLeaving&&a[Pn](!0),l.persisted&&!e?u():r(a,()=>{u(),c&&c()})};i?i(a,u,d):d()}}else o(a,t,n)},pe=(e,t,n,r=!1,i=!1)=>{let{type:a,props:o,ref:s,children:c,dynamicChildren:l,shapeFlag:u,patchFlag:d,dirs:f,cacheIndex:p,memo:m}=e;if(d===-2&&(i=!1),s!=null&&(Le(),$n(s,null,n,e,!0),Re()),p!=null&&(t.renderCache[p]=void 0),u&256){t.ctx.deactivate(e);return}let h=u&1&&f,g=!tr(e),_;if(g&&(_=o&&o.onVnodeBeforeUnmount)&&ta(_,t,e),u&6)he(e.component,n,r);else{if(u&128){e.suspense.unmount(n,r);return}h&&Cn(e,null,t,`beforeUnmount`),u&64?e.type.remove(e,t,n,N,r):l&&!l.hasOnce&&(a!==G||d>0&&d&64)?ge(l,t,n,!1,!0):(a===G&&d&384||!i&&u&16)&&ge(c,t,n),r&&j(e)}let v=m!=null&&p==null;(g&&(_=o&&o.onVnodeUnmounted)||h||v)&&xi(()=>{_&&ta(_,t,e),h&&Cn(e,null,t,`unmounted`),v&&(e.el=null)},n)},j=e=>{let{type:t,el:n,anchor:r,transition:i}=e;if(t===G){me(n,r);return}if(t===Ii){C(e);return}let a=()=>{s(n),i&&!i.persisted&&i.afterLeave&&i.afterLeave()};if(e.shapeFlag&1&&i&&!i.persisted){let{leave:t,delayLeave:r}=i,o=()=>t(n,a);r?r(e.el,a,o):o()}else a()},me=(e,t)=>{let n;for(;e!==t;)n=h(e),s(e),e=n;s(t)},he=(e,t,n)=>{let{bum:r,scope:i,job:a,subTree:o,um:s,m:c,a:l}=e;Ai(c),Ai(l),r&&ie(r),i.stop(),a&&(a.flags|=8,pe(o,e,t,n)),s&&xi(s,t),xi(()=>{e.isUnmounted=!0},t)},ge=(e,t,n,r=!1,i=!1,a=0)=>{for(let o=a;o{if(e.shapeFlag&6)return _e(e.component.subTree);if(e.shapeFlag&128)return e.suspense.next();let t=h(e.anchor||e.el),n=t&&t[Mn];return n?h(n):t},ve=!1,M=(e,t,n)=>{let r;e==null?t._vnode&&(pe(t._vnode,null,null,!0),r=t._vnode.component):v(t._vnode||null,e,t,null,null,null,n),t._vnode=e,ve||=(ve=!0,mn(r),hn(),!1)},N={p:v,um:pe,m:fe,r:j,mt:A,mc:E,pc:le,pbc:D,n:_e,o:e},P,F;return i&&([P,F]=i(N)),{render:M,hydrate:P,createApp:Ur(M,P)}}function wi({type:e,props:t},n){return n===`svg`&&e===`foreignObject`||n===`mathml`&&e===`annotation-xml`&&t&&t.encoding&&t.encoding.includes(`html`)?void 0:n}function Ti({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Ei(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Di(e,t,n=!1){let r=e.children,i=t.children;if(d(r)&&d(i))for(let e=0;e>1,e[n[s]]0&&(t[r]=n[a-1]),n[a]=r)}}for(a=n.length,o=n[a-1];a-->0;)n[a]=o,o=t[o];return n}function ki(e){let t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:ki(t)}function Ai(e){if(e)for(let t=0;te.__isSuspense;function Ni(e,t){t&&t.pendingBranch?d(e)?t.effects.push(...e):t.effects.push(e):pn(e)}var G=Symbol.for(`v-fgt`),Pi=Symbol.for(`v-txt`),Fi=Symbol.for(`v-cmt`),Ii=Symbol.for(`v-stc`),Li=[],Ri=null;function K(e=!1){Li.push(Ri=e?null:[])}function zi(){Li.pop(),Ri=Li[Li.length-1]||null}var Bi=1;function Vi(e,t=!1){Bi+=e,e<0&&Ri&&t&&(Ri.hasOnce=!0)}function Hi(e){return e.dynamicChildren=Bi>0?Ri||n:null,zi(),Bi>0&&Ri&&Ri.push(e),e}function q(e,t,n,r,i,a){return Hi(J(e,t,n,r,i,a,!0))}function Ui(e,t,n,r,i){return Hi(Y(e,t,n,r,i,!0))}function Wi(e){return e?e.__v_isVNode===!0:!1}function Gi(e,t){return e.type===t.type&&e.key===t.key}var Ki=({key:e})=>e??null,qi=({ref:e,ref_key:t,ref_for:n})=>(typeof e==`number`&&(e=``+e),e==null?null:g(e)||H(e)||h(e)?{i:vn,r:e,k:t,f:!!n}:e);function J(e,t=null,n=null,r=0,i=null,a=e===G?0:1,o=!1,s=!1){let c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Ki(t),ref:t&&qi(t),scopeId:yn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:a,patchFlag:r,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:vn};return s?($i(c,n),a&128&&e.normalize(c)):n&&(c.shapeFlag|=g(n)?8:16),Bi>0&&!o&&Ri&&(c.patchFlag>0||a&6)&&c.patchFlag!==32&&Ri.push(c),c}var Y=Ji;function Ji(e,t=null,n=null,r=0,i=null,a=!1){if((!e||e===yr)&&(e=Fi),Wi(e)){let r=Xi(e,t,!0);return n&&$i(r,n),Bi>0&&!a&&Ri&&(r.shapeFlag&6?Ri[Ri.indexOf(e)]=r:Ri.push(r)),r.patchFlag=-2,r}if(ba(e)&&(e=e.__vccOpts),t){t=Yi(t);let{class:e,style:n}=t;e&&!g(e)&&(t.class=j(e)),v(n)&&(Ft(n)&&!d(n)&&(n=s({},n)),t.style=le(n))}let o=g(e)?1:Mi(e)?128:Nn(e)?64:v(e)?4:h(e)?2:0;return J(e,t,n,r,i,o,a,!0)}function Yi(e){return e?Ft(e)||ai(e)?s({},e):e:null}function Xi(e,t,n=!1,r=!1){let{props:i,ref:a,patchFlag:o,children:s,transition:c}=e,l=t?ea(i||{},t):i,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&Ki(l),ref:t&&t.ref?n&&a?d(a)?a.concat(qi(t)):[a,qi(t)]:qi(t):a,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:s,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==G?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Xi(e.ssContent),ssFallback:e.ssFallback&&Xi(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&r&&qn(u,c.clone(u)),u}function X(e=` `,t=0){return Y(Pi,null,e,t)}function Z(e=``,t=!1){return t?(K(),Ui(Fi,null,e)):Y(Fi,null,e)}function Zi(e){return e==null||typeof e==`boolean`?Y(Fi):d(e)?Y(G,null,e.slice()):Wi(e)?Qi(e):Y(Pi,null,String(e))}function Qi(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Xi(e)}function $i(e,t){let n=0,{shapeFlag:r}=e;if(t==null)t=null;else if(d(t))n=16;else if(typeof t==`object`){if(r&65){let n=t.default;n&&(n._c&&(n._d=!1),$i(e,n()),n._c&&(n._d=!0));return}{n=32;let r=t._;!r&&!ai(t)?t._ctx=vn:r===3&&vn&&(vn.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}}else if(h(t)){if(r&65){$i(e,{default:t});return}t={default:t,_ctx:vn},n=32}else t=String(t),r&64?(n=16,t=[X(t)]):n=8;e.children=t,e.shapeFlag|=n}function ea(...e){let t={};for(let n=0;naa||vn,sa,ca;{let e=ce(),t=(t,n)=>{let r;return(r=e[t])||(r=e[t]=[]),r.push(n),e=>{r.length>1?r.forEach(t=>t(e)):r[0](e)}};sa=t(`__VUE_INSTANCE_SETTERS__`,e=>aa=e),ca=t(`__VUE_SSR_SETTERS__`,e=>fa=e)}var la=e=>{let t=aa;return sa(e),e.scope.on(),()=>{e.scope.off(),sa(t)}},ua=()=>{aa&&aa.scope.off(),sa(null)};function da(e){return e.vnode.shapeFlag&4}var fa=!1;function pa(e,t=!1,n=!1){t&&ca(t);let{props:r,children:i}=e.vnode,a=da(e);oi(e,r,a,t),yi(e,i,n||t);let o=a?ma(e,t):void 0;return t&&ca(!1),o}function ma(e,t){let n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,wr);let{setup:r}=n;if(r){Le();let n=e.setupContext=r.length>1?va(e):null,i=la(e),a=Zt(r,e,0,[e.props,n]),o=y(a);if(Re(),i(),(o||e.sp)&&!tr(e)&&Xn(e),o){if(a.then(ua,ua),t)return a.then(n=>{ca(!0);try{ha(e,n,t)}finally{ca(!1)}}).catch(t=>{$t(t,e,0)});e.asyncDep=a}else ha(e,a,t)}else ga(e,t)}function ha(e,t,n){h(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:v(t)&&(e.setupState=Ht(t)),ga(e,n)}function ga(e,t,n){let i=e.type;e.render||=i.render||r;{let t=la(e);Le();try{Dr(e)}finally{Re(),t()}}}var _a={get(e,t){return B(e,`get`,``),e[t]}};function va(e){return{attrs:new Proxy(e.attrs,_a),slots:e.slots,emit:e.emit,expose:t=>{e.exposed=t||{}}}}function ya(e){return e.exposed?e.exposeProxy||=new Proxy(Ht(It(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Sr)return Sr[n](e)},has(e,t){return t in e||t in Sr}}):e.proxy}function ba(e){return h(e)&&`__vccOpts`in e}var xa=(e,t)=>Wt(e,t,fa);function Sa(e,t,n){try{Vi(-1);let r=arguments.length;return r===2?v(t)&&!d(t)?Wi(t)?Y(e,null,[t]):Y(e,t):Y(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&Wi(n)&&(n=[n]),Y(e,t,n))}finally{Vi(1)}}var Ca=`3.5.42`,wa=void 0,Ta=typeof window<`u`&&window.trustedTypes;if(Ta)try{wa=Ta.createPolicy(`vue`,{createHTML:e=>e})}catch{}var Ea=wa?e=>wa.createHTML(e):e=>e,Da=`http://www.w3.org/2000/svg`,Oa=`http://www.w3.org/1998/Math/MathML`,ka=typeof document<`u`?document:null,Aa=ka&&ka.createElement(`template`),ja={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{let t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{let i=t===`svg`?ka.createElementNS(Da,e):t===`mathml`?ka.createElementNS(Oa,e):n?ka.createElement(e,{is:n}):ka.createElement(e);return e===`select`&&r&&r.multiple!=null&&i.setAttribute(`multiple`,r.multiple),i},createText:e=>ka.createTextNode(e),createComment:e=>ka.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>ka.querySelector(e),setScopeId(e,t){e.setAttribute(t,``)},insertStaticContent(e,t,n,r,i,a){let o=n?n.previousSibling:t.lastChild;if(i&&(i===a||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),n),i!==a&&(i=i.nextSibling););else{Aa.innerHTML=Ea(r===`svg`?`${e}`:r===`mathml`?`${e}`:e);let i=Aa.content;if(r===`svg`||r===`mathml`){let e=i.firstChild;for(;e.firstChild;)i.appendChild(e.firstChild);i.removeChild(e)}t.insertBefore(i,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Ma=`transition`,Na=`animation`,Pa=Symbol(`_vtc`),Fa={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Ia=s({},Rn,Fa),La=(e=>(e.displayName=`Transition`,e.props=Ia,e))((e,{slots:t})=>Sa(Hn,Ba(e),t)),Ra=(e,t=[])=>{d(e)?e.forEach(e=>e(...t)):e&&e(...t)},za=e=>e?d(e)?e.some(e=>e.length>1):e.length>1:!1;function Ba(e){let t={};for(let n in e)n in Fa||(t[n]=e[n]);if(e.css===!1)return t;let{name:n=`v`,type:r,duration:i,enterFromClass:a=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:c=`${n}-enter-to`,appearFromClass:l=a,appearActiveClass:u=o,appearToClass:d=c,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:m=`${n}-leave-to`}=e,h=Va(i),g=h&&h[0],_=h&&h[1],{onBeforeEnter:v,onEnter:y,onEnterCancelled:b,onLeave:x,onLeaveCancelled:S,onBeforeAppear:C=v,onAppear:w=y,onAppearCancelled:T=b}=t,ee=(e,t,n,r)=>{e._enterCancelled=r,Wa(e,t?d:c),Wa(e,t?u:o),n&&n()},te=(e,t)=>{e._isLeaving=!1,Wa(e,f),Wa(e,m),Wa(e,p),t&&t()},E=e=>(t,n)=>{let i=e?w:y,o=()=>ee(t,e,n);Ra(i,[t,o]),Ga(()=>{Wa(t,e?l:a),Ua(t,e?d:c),za(i)||qa(t,r,g,o)})};return s(t,{onBeforeEnter(e){Ra(v,[e]),Ua(e,a),Ua(e,o)},onBeforeAppear(e){Ra(C,[e]),Ua(e,l),Ua(e,u)},onEnter:E(!1),onAppear:E(!0),onLeave(e,t){e._isLeaving=!0;let n=()=>te(e,t);Ua(e,f),e._enterCancelled?(Ua(e,p),Za(e)):(Za(e),Ua(e,p)),Ga(()=>{e._isLeaving&&(Wa(e,f),Ua(e,m),za(x)||qa(e,r,_,n))}),Ra(x,[e,n])},onEnterCancelled(e){ee(e,!1,void 0,!0),Ra(b,[e])},onAppearCancelled(e){ee(e,!0,void 0,!0),Ra(T,[e])},onLeaveCancelled(e){te(e),Ra(S,[e])}})}function Va(e){if(e==null)return null;if(v(e))return[Ha(e.enter),Ha(e.leave)];{let t=Ha(e);return[t,t]}}function Ha(e){return oe(e)}function Ua(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.add(t)),(e[Pa]||(e[Pa]=new Set)).add(t)}function Wa(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.remove(t));let n=e[Pa];n&&(n.delete(t),n.size||(e[Pa]=void 0))}function Ga(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}var Ka=0;function qa(e,t,n,r){let i=e._endId=++Ka,a=()=>{i===e._endId&&r()};if(n!=null)return setTimeout(a,n);let{type:o,timeout:s,propCount:c}=Ja(e,t);if(!o)return r();let l=o+`end`,u=0,d=()=>{e.removeEventListener(l,f),a()},f=t=>{t.target===e&&++u>=c&&d()};setTimeout(()=>{u(n[e]||``).split(`, `),i=r(`${Ma}Delay`),a=r(`${Ma}Duration`),o=Ya(i,a),s=r(`${Na}Delay`),c=r(`${Na}Duration`),l=Ya(s,c),u=null,d=0,f=0;t===Ma?o>0&&(u=Ma,d=o,f=a.length):t===Na?l>0&&(u=Na,d=l,f=c.length):(d=Math.max(o,l),u=d>0?o>l?Ma:Na:null,f=u?u===Ma?a.length:c.length:0);let p=u===Ma&&/\b(?:transform|all)(?:,|$)/.test(r(`${Ma}Property`).toString());return{type:u,timeout:d,propCount:f,hasTransform:p}}function Ya(e,t){for(;e.lengthXa(t)+Xa(e[n])))}function Xa(e){return e===`auto`?0:Number(e.slice(0,-1).replace(`,`,`.`))*1e3}function Za(e){return(e?e.ownerDocument:document).body.offsetHeight}function Qa(e,t,n){let r=e[Pa];r&&(t=(t?[t,...r]:[...r]).join(` `)),t==null?e.removeAttribute(`class`):n?e.setAttribute(`class`,t):e.className=t}var $a=Symbol(`_vod`),eo=Symbol(`_vsh`),to={name:`show`,beforeMount(e,{value:t},{transition:n}){e[$a]=e.style.display===`none`?``:e.style.display,n&&t?n.beforeEnter(e):no(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),no(e,!0),r.enter(e)):r.leave(e,()=>{no(e,!1)}):no(e,t))},beforeUnmount(e,{value:t}){no(e,t)}};function no(e,t){e.style.display=t?e[$a]:`none`,e[eo]=!t}var ro=Symbol(``),io=/(?:^|;)\s*display\s*:/;function ao(e,t,n){let r=e.style,i=g(n),a=!1;if(n&&!i){if(t){if(g(t))for(let e of t.split(`;`)){let t=e.slice(0,e.indexOf(`:`)).trim();n[t]??so(r,t,``)}else for(let e in t)n[e]??so(r,e,``)}for(let i in n){i===`display`&&(a=!0);let o=n[i];o==null?so(r,i,``):fo(e,i,!g(t)&&t?t[i]:void 0,o)||so(r,i,o)}}else if(i){if(t!==n){let e=r[ro];e&&(n+=`;`+e),r.cssText=n,a=io.test(n)}}else t&&e.removeAttribute(`style`);$a in e&&(e[$a]=a?r.display:``,e[eo]&&(r.display=`none`))}var oo=/\s*!important$/;function so(e,t,n){if(d(n))n.forEach(n=>so(e,t,n));else if(n??=``,t.startsWith(`--`))oo.test(n)?e.setProperty(t,n.replace(oo,``),`important`):e.setProperty(t,n);else{let r=uo(e,t);oo.test(n)?e.setProperty(D(r),n.replace(oo,``),`important`):e[r]=n}}var co=[`Webkit`,`Moz`,`ms`],lo={};function uo(e,t){let n=lo[t];if(n)return n;let r=E(t);if(r!==`filter`&&r in e)return lo[t]=r;r=O(r);for(let n=0;nCo||=(wo.then(()=>Co=0),Date.now());function Eo(e,t){let n=e=>{if(!e._vts)e._vts=Date.now();else if(e._vts<=n.attached)return;let r=n.value;if(d(r)){let n=e.stopImmediatePropagation;e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0};let i=r.slice(),a=[e];for(let n=0;ne.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Oo=(e,t,n,r,i,s)=>{let c=i===`svg`;t===`class`?Qa(e,r,c):t===`style`?ao(e,n,r):a(t)?o(t)||yo(e,t,n,r,s):(t[0]===`.`?(t=t.slice(1),1):t[0]===`^`?(t=t.slice(1),0):ko(e,t,r,c))?(ho(e,t,r),!e.tagName.includes(`-`)&&(t===`value`||t===`checked`||t===`selected`)&&mo(e,t,r,c,s,t!==`value`)):e._isVueCE&&(Ao(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!g(r)))?ho(e,E(t),r,s,t):(t===`true-value`?e._trueValue=r:t===`false-value`&&(e._falseValue=r),mo(e,t,r,c))};function ko(e,t,n,r){if(r)return!!(t===`innerHTML`||t===`textContent`||t in e&&Do(t)&&h(n));if(t===`spellcheck`||t===`draggable`||t===`translate`||t===`autocorrect`||t===`sandbox`&&e.tagName===`IFRAME`||t===`form`||t===`list`&&e.tagName===`INPUT`||t===`type`&&e.tagName===`TEXTAREA`)return!1;if(t===`width`||t===`height`){let t=e.tagName;if(t===`IMG`||t===`VIDEO`||t===`CANVAS`||t===`SOURCE`)return!1}return Do(t)&&g(n)?!1:t in e}function Ao(e,t){let n=e._def.props;if(!n)return!1;let r=E(t);return Array.isArray(n)?n.some(e=>E(e)===r):Object.keys(n).some(e=>E(e)===r)}var jo=e=>{let t=e.props[`onUpdate:modelValue`]||!1;return d(t)?e=>ie(t,e):t};function Mo(e){e.target.composing=!0}function No(e){let t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event(`input`)))}var Po=Symbol(`_assign`),Fo=Symbol(`_initialValue`);function Io(e,t,n){return t&&(e=e.trim()),n&&(e=ae(e)),e}var Lo={created(e,{modifiers:{lazy:t,trim:n,number:r}},i){e.parentNode&&(e.type===`text`?e[Fo]=e.defaultValue.replace(/[\r\n]/g,``):e.type===`textarea`&&(e[Fo]=e.defaultValue.replace(/\r\n?/g,` +`))),e[Po]=jo(i);let a=r||i.props&&i.props.type===`number`;go(e,t?`change`:`input`,t=>{t.target.composing||e[Po](Io(e.value,n,a))}),(n||a)&&go(e,`change`,()=>{e.value=Io(e.value,n,a)}),t||(go(e,`compositionstart`,Mo),go(e,`compositionend`,No),go(e,`change`,No))},mounted(e,{value:t,modifiers:{trim:n,number:r}}){let i=t??``,a=e[Fo];delete e[Fo],a!==void 0&&(e.type===`text`||e.type===`textarea`)&&e.value!==a?e[Po](Io(e.value,n,r)):e.value=i},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:i,number:a}},o){if(e[Po]=jo(o),e.composing)return;let s=(a||e.type===`number`)&&!/^0\d/.test(e.value)?ae(e.value):e.value,c=t??``;if(s===c)return;let l=e.getRootNode();(l instanceof Document||l instanceof ShadowRoot)&&l.activeElement===e&&e.type!==`range`&&(r&&t===n||i&&e.value.trim()===c)||(e.value=c)}},Ro={deep:!0,created(e,t,n){e[Po]=jo(n),go(e,`change`,()=>{let t=e._modelValue,n=Uo(e),r=e.checked,i=e[Po];if(d(t)){let e=N(t,n),a=e!==-1;if(r&&!a)i(t.concat(n));else if(!r&&a){let n=[...t];n.splice(e,1),i(n)}}else if(p(t)){let e=new Set(t);r?e.add(n):e.delete(n),i(e)}else i(Wo(e,r))})},mounted:zo,beforeUpdate(e,t,n){e[Po]=jo(n),zo(e,t,n)}};function zo(e,{value:t,oldValue:n},r){e._modelValue=t;let i;if(d(t))i=N(t,r.props.value)>-1;else if(p(t))i=t.has(r.props.value);else{if(t===n)return;i=M(t,Wo(e,!0))}e.checked!==i&&(e.checked=i)}var Bo={deep:!0,created(e,{value:t,modifiers:{number:n}},r){e._modelValue=t,go(e,`change`,()=>{let t=Array.prototype.filter.call(e.options,e=>e.selected).map(e=>n?ae(Uo(e)):Uo(e)),r=e.multiple,i=r?p(e._modelValue)?new Set(t):t:t[0],a=e._pendingValue=[r,r?d(i)?t.slice():t:i];try{e[Po](i)}finally{ln(()=>{e._pendingValue===a&&(e._pendingValue=void 0)})}}),e[Po]=jo(r)},mounted(e,{value:t}){Ho(e,t)},beforeUpdate(e,{value:t},n){e._modelValue=t,e[Po]=jo(n)},updated(e,{value:t}){let n=e._pendingValue;e._pendingValue=void 0,(!n||n[0]!==e.multiple||!Vo(t,n[1],n[0]))&&Ho(e,t)}};function Vo(e,t,n){if(!n||d(e))return M(e,t);if(p(e)){if(e.size!==t.length)return!1;for(let n of t)if(!e.has(n))return!1;return!0}return!1}function Ho(e,t){let n=e.multiple,r=d(t);if(!n||r||p(t)){for(let i=0,a=e.options.length;iString(e)===String(o)):N(t,o)>-1}else a.selected=t.has(o)}else if(M(Uo(a),t)){e.selectedIndex!==i&&(e.selectedIndex=i);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function Uo(e){return`_value`in e?e._value:e.value}function Wo(e,t){let n=t?`_trueValue`:`_falseValue`;return n in e?e[n]:t}var Go=[`ctrl`,`shift`,`alt`,`meta`],Ko={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>`button`in e&&e.button!==0,middle:e=>`button`in e&&e.button!==1,right:e=>`button`in e&&e.button!==2,exact:(e,t)=>Go.some(n=>e[`${n}Key`]&&!t.includes(n))},Q=(e,t)=>{if(!e)return e;let n=e._withMods||={},r=t.join(`.`);return n[r]||(n[r]=((n,...r)=>{for(let e=0;e{let n=e._withKeys||={},r=t.join(`.`);return n[r]||(n[r]=(n=>{if(!(`key`in n))return;let r=D(n.key);if(t.some(e=>e===r||qo[e]===r))return e(n)}))},Yo=s({patchProp:Oo},ja),Xo;function Zo(){return Xo||=Si(Yo)}var Qo=((...e)=>{let t=Zo().createApp(...e),{mount:n}=t;return t.mount=e=>{let r=es(e);if(!r)return;let i=t._component;!h(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent=``);let a=n(r,!1,$o(r));return r instanceof Element&&(r.removeAttribute(`v-cloak`),r.setAttribute(`data-v-app`,``)),a},t});function $o(e){if(e instanceof SVGElement)return`svg`;if(typeof MathMLElement==`function`&&e instanceof MathMLElement)return`mathml`}function es(e){return g(e)?document.querySelector(e):e}var ts=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),ns={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":2,"stroke-linecap":`round`,"stroke-linejoin":`round`},rs=({size:e,strokeWidth:t=2,absoluteStrokeWidth:n,color:r,iconNode:i,name:a,class:o,...s},{slots:c})=>Sa(`svg`,{...ns,width:e||ns.width,height:e||ns.height,stroke:r||ns.stroke,"stroke-width":n?Number(t)*24/Number(e):t,class:[`lucide`,`lucide-${ts(a??`icon`)}`],...s},[...i.map(e=>Sa(...e)),...c.default?[c.default()]:[]]),$=(e,t)=>(n,{slots:r})=>Sa(rs,{...n,iconNode:t,name:e},r),is=$(`ActivityIcon`,[[`path`,{d:`M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2`,key:`169zse`}]]),as=$(`ArchiveRestoreIcon`,[[`rect`,{width:`20`,height:`5`,x:`2`,y:`3`,rx:`1`,key:`1wp1u1`}],[`path`,{d:`M4 8v11a2 2 0 0 0 2 2h2`,key:`tvwodi`}],[`path`,{d:`M20 8v11a2 2 0 0 1-2 2h-2`,key:`1gkqxj`}],[`path`,{d:`m9 15 3-3 3 3`,key:`1pd0qc`}],[`path`,{d:`M12 12v9`,key:`192myk`}]]),os=$(`CalendarDaysIcon`,[[`path`,{d:`M8 2v4`,key:`1cmpym`}],[`path`,{d:`M16 2v4`,key:`4m81vk`}],[`rect`,{width:`18`,height:`18`,x:`3`,y:`4`,rx:`2`,key:`1hopcy`}],[`path`,{d:`M3 10h18`,key:`8toen8`}],[`path`,{d:`M8 14h.01`,key:`6423bh`}],[`path`,{d:`M12 14h.01`,key:`1etili`}],[`path`,{d:`M16 14h.01`,key:`1gbofw`}],[`path`,{d:`M8 18h.01`,key:`lrp35t`}],[`path`,{d:`M12 18h.01`,key:`mhygvu`}],[`path`,{d:`M16 18h.01`,key:`kzsmim`}]]),ss=$(`CheckIcon`,[[`path`,{d:`M20 6 9 17l-5-5`,key:`1gmf2c`}]]),cs=$(`ChevronDownIcon`,[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]),ls=$(`ChevronRightIcon`,[[`path`,{d:`m9 18 6-6-6-6`,key:`mthhwq`}]]),us=$(`CirclePlusIcon`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M8 12h8`,key:`1wcyev`}],[`path`,{d:`M12 8v8`,key:`napkw2`}]]),ds=$(`DownloadIcon`,[[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}],[`polyline`,{points:`7 10 12 15 17 10`,key:`2ggqvy`}],[`line`,{x1:`12`,x2:`12`,y1:`15`,y2:`3`,key:`1vk2je`}]]),fs=$(`EllipsisIcon`,[[`circle`,{cx:`12`,cy:`12`,r:`1`,key:`41hilf`}],[`circle`,{cx:`19`,cy:`12`,r:`1`,key:`1wjl8i`}],[`circle`,{cx:`5`,cy:`12`,r:`1`,key:`1pcz8c`}]]),ps=$(`FileJsonIcon`,[[`path`,{d:`M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z`,key:`1rqfz7`}],[`path`,{d:`M14 2v4a2 2 0 0 0 2 2h4`,key:`tnqrlb`}],[`path`,{d:`M10 12a1 1 0 0 0-1 1v1a1 1 0 0 1-1 1 1 1 0 0 1 1 1v1a1 1 0 0 0 1 1`,key:`1oajmo`}],[`path`,{d:`M14 18a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1 1 1 0 0 1-1-1v-1a1 1 0 0 0-1-1`,key:`mpwhp6`}]]),ms=$(`FolderIcon`,[[`path`,{d:`M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z`,key:`1kt360`}]]),hs=$(`GripVerticalIcon`,[[`circle`,{cx:`9`,cy:`12`,r:`1`,key:`1vctgf`}],[`circle`,{cx:`9`,cy:`5`,r:`1`,key:`hp0tcf`}],[`circle`,{cx:`9`,cy:`19`,r:`1`,key:`fkjjf6`}],[`circle`,{cx:`15`,cy:`12`,r:`1`,key:`1tmaij`}],[`circle`,{cx:`15`,cy:`5`,r:`1`,key:`19l28e`}],[`circle`,{cx:`15`,cy:`19`,r:`1`,key:`f4zoj3`}]]),gs=$(`InboxIcon`,[[`polyline`,{points:`22 12 16 12 14 15 10 15 8 12 2 12`,key:`o97t9d`}],[`path`,{d:`M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z`,key:`oot6mr`}]]),_s=$(`ListChecksIcon`,[[`path`,{d:`m3 17 2 2 4-4`,key:`1jhpwq`}],[`path`,{d:`m3 7 2 2 4-4`,key:`1obspn`}],[`path`,{d:`M13 6h8`,key:`15sg57`}],[`path`,{d:`M13 12h8`,key:`h98zly`}],[`path`,{d:`M13 18h8`,key:`oe0vm4`}]]),vs=$(`ListTodoIcon`,[[`rect`,{x:`3`,y:`5`,width:`6`,height:`6`,rx:`1`,key:`1defrl`}],[`path`,{d:`m3 17 2 2 4-4`,key:`1jhpwq`}],[`path`,{d:`M13 6h8`,key:`15sg57`}],[`path`,{d:`M13 12h8`,key:`h98zly`}],[`path`,{d:`M13 18h8`,key:`oe0vm4`}]]),ys=$(`LogOutIcon`,[[`path`,{d:`M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4`,key:`1uf3rs`}],[`polyline`,{points:`16 17 21 12 16 7`,key:`1gabdz`}],[`line`,{x1:`21`,x2:`9`,y1:`12`,y2:`12`,key:`1uyos4`}]]),bs=$(`MenuIcon`,[[`line`,{x1:`4`,x2:`20`,y1:`12`,y2:`12`,key:`1e0a9i`}],[`line`,{x1:`4`,x2:`20`,y1:`6`,y2:`6`,key:`1owob3`}],[`line`,{x1:`4`,x2:`20`,y1:`18`,y2:`18`,key:`yk5zj1`}]]),xs=$(`PencilIcon`,[[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`,key:`1a8usu`}],[`path`,{d:`m15 5 4 4`,key:`1mk7zo`}]]),Ss=$(`PlusIcon`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`M12 5v14`,key:`s699le`}]]),Cs=$(`RefreshCwIcon`,[[`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`,key:`v9h5vc`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}],[`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`,key:`3uifl3`}],[`path`,{d:`M8 16H3v5`,key:`1cv678`}]]),ws=$(`Repeat2Icon`,[[`path`,{d:`m2 9 3-3 3 3`,key:`1ltn5i`}],[`path`,{d:`M13 18H7a2 2 0 0 1-2-2V6`,key:`1r6tfw`}],[`path`,{d:`m22 15-3 3-3-3`,key:`4rnwn2`}],[`path`,{d:`M11 6h6a2 2 0 0 1 2 2v10`,key:`2f72bc`}]]),Ts=$(`SearchIcon`,[[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}],[`path`,{d:`m21 21-4.3-4.3`,key:`1qie3q`}]]),Es=$(`SettingsIcon`,[[`path`,{d:`M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z`,key:`1qme2f`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),Ds=$(`Trash2Icon`,[[`path`,{d:`M3 6h18`,key:`d0wm0j`}],[`path`,{d:`M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6`,key:`4alrt4`}],[`path`,{d:`M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2`,key:`v07s0e`}],[`line`,{x1:`10`,x2:`10`,y1:`11`,y2:`17`,key:`1uufr5`}],[`line`,{x1:`14`,x2:`14`,y1:`11`,y2:`17`,key:`xtxkd`}]]),Os=$(`UploadIcon`,[[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}],[`polyline`,{points:`17 8 12 3 7 8`,key:`t8dd8p`}],[`line`,{x1:`12`,x2:`12`,y1:`3`,y2:`15`,key:`widbto`}]]),ks=$(`XIcon`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]),As=e=>e.replace(/&/g,`&`).replace(//g,`>`).replace(/"/g,`"`).replace(/'/g,`'`),js=e=>{let t=As(e);return t=t.replace(/`([^`]+)`/g,`$1`),t=t.replace(/\*\*([^*]+)\*\*/g,`$1`),t=t.replace(/\*([^*]+)\*/g,`$1`),t=t.replace(/\[([^\]]+)\]\((https?:\/\/[^\s)]+)\)/g,`$1`),t};function Ms(e=``){let t=e.replace(/\r\n/g,` +`).split(` +`),n=[],r=!1,i=()=>{r&&=(n.push(`
`),!1)};for(let e of t){let t=e.trimEnd();if(!t.trim()){i();continue}t.startsWith(`# `)?(i(),n.push(`

${js(t.slice(2))}

`)):t.startsWith(`## `)?(i(),n.push(`

${js(t.slice(3))}

`)):/^[-*] /.test(t)?(r||=(n.push(`
    `),!0),n.push(`
  • ${js(t.slice(2))}
  • `)):(i(),n.push(`

    ${js(t)}

    `))}return i(),n.join(``)}function Ns(e,t){let n=t.trim().toLowerCase();return n?e.filter(e=>[e.title,e.description??``,e.list_name??``].join(` `).toLowerCase().includes(n)):e}function Ps(e){let t=new Map;for(let n of e)n.parent_id&&t.set(n.parent_id,[...t.get(n.parent_id)??[],n]);return e.filter(e=>!e.parent_id).map(e=>({task:e,subtasks:t.get(e.id)??[]}))}function Fs(e){if(!e)return``;let t=new Date(e);return Number.isNaN(t.valueOf())?``:`${t.getFullYear()}-${`${t.getMonth()+1}`.padStart(2,`0`)}-${`${t.getDate()}`.padStart(2,`0`)}T${`${t.getHours()}`.padStart(2,`0`)}:${`${t.getMinutes()}`.padStart(2,`0`)}`}function Is(e){return e?new Date(e).toISOString():null}function Ls(e){return`${e.getFullYear()}-${`${e.getMonth()+1}`.padStart(2,`0`)}-${`${e.getDate()}`.padStart(2,`0`)}`}function Rs(e){return Array.isArray(e)?{items:e,nextCursor:null}:{items:e.items??[],nextCursor:e.next_cursor??null}}function zs(e){return e===`tasks`||e===`today`||e===`upcoming`}function Bs(){return`today`}function Vs(e,t,n,r=new Date){if(e!==`today`)return{list_id:t};let i=new Intl.DateTimeFormat(`en-CA`,{timeZone:`Asia/Shanghai`,year:`numeric`,month:`2-digit`,day:`2-digit`}).formatToParts(r),a=e=>i.find(t=>t.type===e)?.value;return{list_id:n,due_at:`${a(`year`)}-${a(`month`)}-${a(`day`)}T12:00:00+08:00`}}function Hs(e,t,n=1){return e===`numeric`?Number(t??0)>=n:!!t}function Us(e,t){let n=(e.cells??[]).find(e=>e.day===t);return!(!n?.scheduled||n.paused)}function Ws(e,t,n=1){let r=Number(t??0);return e===`numeric`?Math.min(r+1,n):r>0?0:1}function Gs(e,t){let n=Number(t??0);return e===`numeric`?Math.max(0,n-1):0}function Ks(e,t){return e>=64&&e>Math.abs(t)*1.5}function qs(e){if(e&&![`GET`,`HEAD`,`OPTIONS`].includes(e.toUpperCase())){let e=Js(`dodo_csrf`);if(e)return{"x-csrf-token":e}}return{}}function Js(e){if(typeof document>`u`)return``;let t=e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),n=document.cookie.match(RegExp(`(?:^|; )${t}=([^;]*)`));return n?decodeURIComponent(n[1]):``}var Ys={key:0,class:`inline-error`},Xs={key:0,class:`view-intro`},Zs={key:1,class:`habit-list today-habit-list`},Qs=[`onTouchstartPassive`,`onTouchmovePassive`,`onTouchend`,`onTouchcancel`],$s={class:`habit-main`},ec={class:`habit-name`},tc={key:0},nc=[`aria-label`,`onClick`],rc={key:0,class:`empty-panel`},ic={key:2,class:`empty-panel`},ac={class:`primary-small`},oc={key:4,class:`habit-list`},sc=[`onTouchstartPassive`,`onTouchmovePassive`,`onTouchend`,`onTouchcancel`],cc={class:`habit-main`},lc={class:`habit-name`},uc={key:0},dc=[`aria-label`,`aria-pressed`,`onClick`],fc=[`onClick`],pc={key:0,class:`empty-panel`},mc={class:`settings-grid`},hc={class:`tool-card`},gc={class:`file-button`},_c={class:`tool-card`},vc={class:`file-button`},yc=[`disabled`],bc={key:0},xc={class:`tool-card wide`},Sc=[`onClick`],Cc={key:0},wc={key:0,class:`tool-card wide`},Tc=Yn({__name:`MvpPanel`,props:{view:{}},emits:[`changed`,`notice`],setup(e,{emit:t}){let n=e,r=t,i=U([]),a=U([]),o=U([]),s=U(!1),c=U(``),l=U(``),u=U(`boolean`),d=U(1),f=U(null),p=U(null),m=U(null),h=U(Ls(new Date)),g=U(null),_=U({}),v=xa(()=>i.value.filter(e=>Us(e,h.value))),y;function b(e){if(typeof e==`string`)return e;if(Array.isArray(e))return e.map(e=>e&&typeof e==`object`&&`msg`in e&&typeof e.msg==`string`?e.msg:String(e)).join(`;`)||`请求参数有误`;if(e&&typeof e==`object`){let t=e;return`detail`in t?b(t.detail):JSON.stringify(e)}return`请求失败`}async function x(e,t={}){let n={...t.headers||{}};t.body&&!(t.body instanceof FormData)&&(n[`Content-Type`]=`application/json`);let r=qs(t.method);r[`x-csrf-token`]&&(n[`x-csrf-token`]=r[`x-csrf-token`]);let i=await fetch(`/api/v1`+e,{credentials:`include`,...t,headers:n});if(!i.ok){let e=await i.json().catch(()=>({}));throw Error(b(e.detail))}let a=i.headers.get(`content-type`)||``;return i.status===204?null:a.includes(`json`)?i.json():i.blob()}async function S(e){s.value=!0,c.value=``;try{await e()}catch(e){c.value=e instanceof Error?e.message:`请求失败`}finally{s.value=!1}}function C(e,t){return(e.cells??[]).find(e=>e.day===t)}function w(e,t){return Hs(e.kind,C(e,t)?.value,e.target??1)}function T(e){return e instanceof Element&&!!e.closest(`button,input,select,textarea,a,label`)}function ee(e,t){if(s.value||T(t.target))return;let n=t.touches[0];n&&(g.value={id:e.id,x:n.clientX,y:n.clientY},_.value[e.id]=0)}function te(e,t){let n=g.value,r=t.touches[0];if(!n||n.id!==e.id||!r)return;let i=r.clientX-n.x,a=r.clientY-n.y,o=Number(C(e,h.value)?.value??0);Math.abs(i)>Math.abs(a)&&(i>0&&o<(e.target??1)||i<0&&o>0)&&(_.value[e.id]=Math.max(-92,Math.min(i,92)))}function E(e){return e.kind===`numeric`?`${Number(C(e,h.value)?.value??0)} / ${e.target??1}`:``}async function ne(e,t){let n=C(e,h.value)?.value,i=t>0?Ws(e.kind,n,e.target??1):Gs(e.kind,n);await S(async()=>{await x(`/habits/${e.id}/logs/${h.value}`,{method:`PUT`,body:JSON.stringify({value:i})}),await ae(),r(`notice`,i>Number(n??0)?`已记录一次 🎉`:`已减少一次`)})}async function D(e,t){let n=g.value;if(g.value=null,_.value[e.id]=0,!n||n.id!==e.id||s.value)return;let r=t.changedTouches[0],i=r?r.clientX-n.x:0,a=r?r.clientY-n.y:0,o=Number(C(e,h.value)?.value??0),c=e.kind===`numeric`?i>0&&o<(e.target??1)||i<0&&o>0:w(e,h.value)?i<0:i>0;r&&c&&Ks(Math.abs(i),a)&&await ne(e,i)}function O(e){g.value=null,e&&(_.value[e.id]=0)}async function re(e){let t=C(e,h.value)?.value,n=w(e,h.value)?Gs(e.kind,t):Ws(e.kind,t,e.target??1);await S(async()=>{await x(`/habits/${e.id}/logs/${h.value}`,{method:`PUT`,body:JSON.stringify({value:n})}),await ae(),r(`notice`,n>Number(t??0)?`已记录一次 🎉`:`已减少一次`)})}async function k(){l.value.trim()&&await S(async()=>{await x(`/habits`,{method:`POST`,body:JSON.stringify({name:l.value.trim(),kind:u.value,target:d.value,schedule_type:`daily`})}),l.value=``,await ae(),r(`notice`,`习惯已创建`)})}async function ie(e){confirm(`归档习惯“${e.name}”?历史打卡记录会保留。`)&&await S(async()=>{await x(`/habits/${e.id}`,{method:`DELETE`}),await ae(),r(`notice`,`习惯已归档`)})}function A(){let e=Ls(new Date);e!==h.value&&(h.value=e,n.view===`habits`&&ae())}async function ae(){await S(async()=>{let e=await x(`/habits/grid?week=${Ls(new Date)}`);i.value=e.habits??[]})}async function oe(){await S(async()=>{let[e,t]=await Promise.all([x(`/sessions`).catch(()=>[]),x(`/audit-logs?limit=20`).catch(()=>[])]);a.value=Rs(e).items,o.value=Rs(t).items})}async function se(e){await S(async()=>{await x(`/sessions/${e}`,{method:`DELETE`}),await oe(),r(`notice`,`会话已撤销`)})}function ce(e,t){let n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=t,r.click(),setTimeout(()=>URL.revokeObjectURL(n),1e3)}async function ue(){await S(async()=>ce(await x(`/export`),`dodo-export.json`))}async function de(){f.value&&await S(async()=>{let e=new FormData;e.append(`file`,f.value),p.value=await x(`/import/ticktick/preview`,{method:`POST`,body:e})})}async function fe(){await S(async()=>{let e=new FormData;e.append(`file`,f.value);let t=await x(`/import/ticktick`,{method:`POST`,body:e});p.value=null,r(`changed`),r(`notice`,`导入完成:新增 ${t?.imported??0},跳过 ${t?.skipped??0}`)})}async function pe(){m.value&&confirm(`恢复为合并模式,将导入 JSON 中的清单与任务。继续吗?`)&&await S(async()=>{await x(`/restore?mode=merge`,{method:`POST`,body:await m.value.text()}),r(`changed`),r(`notice`,`数据已恢复`)})}return ur(()=>{n.view===`habits`||n.view===`today-habits`?(A(),ae(),y=setInterval(A,6e4)):oe()}),pr(()=>{y&&clearInterval(y)}),(t,n)=>(K(),q(`section`,{class:j([`mvp-view`,{loading:s.value}])},[c.value?(K(),q(`p`,Ys,F(c.value),1)):Z(``,!0),e.view===`habits`||e.view===`today-habits`?(K(),q(G,{key:1},[e.view===`habits`?(K(),q(`header`,Xs,[n[6]||=J(`div`,null,[J(`small`,null,`把想坚持的事,变成每天的日常`),J(`h2`,null,`习惯`)],-1),J(`button`,{class:`soft-button`,onClick:ae},[Y(W(Cs)),n[5]||=X(`刷新`,-1)])])):Z(``,!0),e.view===`today-habits`&&!s.value?(K(),q(`div`,Zs,[(K(!0),q(G,null,br(v.value,e=>(K(),q(`article`,{key:e.id,class:j([`habit-row swipeable`,{done:w(e,h.value),ready:Math.abs(_.value[e.id]??0)>=64}]),style:le({"--swipe-x":`${_.value[e.id]??0}px`,"--swipe-width":`${Math.abs(_.value[e.id]??0)}px`}),onTouchstartPassive:t=>ee(e,t),onTouchmovePassive:t=>te(e,t),onTouchend:t=>D(e,t),onTouchcancel:t=>O(e)},[J(`span`,{class:j([`swipe-bg`,{cancel:w(e,h.value)}])},F(w(e,h.value)?e.kind===`numeric`?`− 一次`:`↩ 未完成`:e.kind===`numeric`?`+ 一次`:`✓ 打卡`),3),J(`div`,$s,[J(`span`,null,[J(`span`,ec,F(e.name),1),E(e)?(K(),q(`small`,tc,F(E(e)),1)):Z(``,!0)]),J(`button`,{class:`sr-only`,"aria-label":w(e,h.value)?`减少${e.name}一次`:`完成${e.name}一次`,onClick:Q(t=>re(e),[`stop`])},`切换习惯状态`,8,nc)])],46,Qs))),128)),v.value.length?Z(``,!0):(K(),q(`div`,rc,`今天没有安排习惯,轻松一下吧。`))])):e.view===`today-habits`&&s.value?(K(),q(`div`,ic,`加载中…`)):Z(``,!0),e.view===`habits`?(K(),q(`form`,{key:3,class:`habit-create`,onSubmit:Q(k,[`prevent`])},[Sn(J(`input`,{"onUpdate:modelValue":n[0]||=e=>l.value=e,placeholder:`新习惯名称(如:喝水 8 杯)`,"aria-label":`新习惯名称`},null,512),[[Lo,l.value]]),Sn(J(`select`,{"onUpdate:modelValue":n[1]||=e=>u.value=e,"aria-label":`习惯类型`},[...n[7]||=[J(`option`,{value:`boolean`},`完成 / 未完成`,-1),J(`option`,{value:`numeric`},`按数量记录`,-1)]],512),[[Bo,u.value]]),u.value===`numeric`?Sn((K(),q(`input`,{key:0,"onUpdate:modelValue":n[2]||=e=>d.value=e,type:`number`,min:`0`,step:`any`,placeholder:`目标值`,"aria-label":`目标值`},null,512)),[[Lo,d.value,void 0,{number:!0}]]):Z(``,!0),J(`button`,ac,[Y(W(Ss)),n[8]||=X(`添加`,-1)])],32)):Z(``,!0),e.view===`habits`?(K(),q(`div`,oc,[(K(!0),q(G,null,br(i.value,e=>(K(),q(`article`,{key:e.id,class:j([`habit-row swipeable`,{done:w(e,h.value),ready:Math.abs(_.value[e.id]??0)>=64}]),style:le({"--swipe-x":`${_.value[e.id]??0}px`,"--swipe-width":`${Math.abs(_.value[e.id]??0)}px`}),onTouchstartPassive:t=>ee(e,t),onTouchmovePassive:t=>te(e,t),onTouchend:t=>D(e,t),onTouchcancel:t=>O(e)},[J(`span`,{class:j([`swipe-bg`,{cancel:w(e,h.value)}])},F(w(e,h.value)?e.kind===`numeric`?`− 一次`:`↩ 未完成`:e.kind===`numeric`?`+ 一次`:`✓ 打卡`),3),J(`div`,cc,[J(`span`,null,[J(`span`,lc,F(e.name),1),E(e)?(K(),q(`small`,uc,F(E(e)),1)):Z(``,!0)]),J(`button`,{class:`sr-only`,"aria-label":w(e,h.value)?`减少${e.name}一次`:`完成${e.name}一次`,"aria-pressed":w(e,h.value),onClick:Q(t=>re(e),[`stop`])},`切换习惯状态`,8,dc)]),J(`button`,{class:`icon ghost`,"aria-label":`归档习惯`,onClick:t=>ie(e)},[Y(W(Ds))],8,fc)],46,sc))),128)),!i.value.length&&!s.value?(K(),q(`div`,pc,`还没有习惯,从一件容易坚持的小事开始。`)):Z(``,!0)])):Z(``,!0)],64)):(K(),q(G,{key:2},[n[18]||=J(`header`,{class:`view-intro`},[J(`div`,null,[J(`small`,null,`备份、迁移与安全`),J(`h2`,null,`设置与数据`)])],-1),J(`div`,mc,[J(`article`,hc,[Y(W(ps)),n[11]||=J(`h3`,null,`数据导出与恢复`,-1),n[12]||=J(`p`,null,`下载完整 JSON 备份,或从备份恢复。`,-1),J(`button`,{class:`soft-button`,onClick:ue},[Y(W(ds)),n[9]||=X(`导出 JSON`,-1)]),J(`label`,gc,[Y(W(as)),n[10]||=X(`选择备份`,-1),J(`input`,{type:`file`,accept:`application/json`,onChange:n[3]||=e=>m.value=e.target.files?.[0]||null},null,32)]),m.value?(K(),q(`button`,{key:0,class:`danger-button`,onClick:pe},`确认恢复`)):Z(``,!0)]),J(`article`,_c,[Y(W(Os)),n[14]||=J(`h3`,null,`导入`,-1),n[15]||=J(`p`,null,`先预览变化,确认后才写入。`,-1),J(`label`,vc,[n[13]||=X(`选择文件`,-1),J(`input`,{type:`file`,accept:`.json,.csv`,onChange:n[4]||=e=>f.value=e.target.files?.[0]||null},null,32)]),J(`button`,{disabled:!f.value,class:`soft-button`,onClick:de},`生成预览`,8,yc),p.value?(K(),q(`pre`,bc,F(JSON.stringify(p.value,null,2)),1)):Z(``,!0),p.value?(K(),q(`button`,{key:1,class:`primary-small`,onClick:fe},`确认导入`)):Z(``,!0)]),J(`article`,xc,[Y(W(ys)),n[16]||=J(`h3`,null,`登录会话`,-1),(K(!0),q(G,null,br(a.value,e=>(K(),q(`div`,{key:e.id,class:`session-row`},[J(`span`,null,[J(`b`,null,F(e.current?`当前设备`:`其他设备`),1),J(`small`,null,F(e.user_agent||`未知设备`)+` · `+F(e.last_seen_at||e.created_at),1)]),e.current?Z(``,!0):(K(),q(`button`,{key:0,class:`danger-text`,onClick:t=>se(e.id)},`撤销`,8,Sc))]))),128)),a.value.length?Z(``,!0):(K(),q(`p`,Cc,`没有可显示的会话。`))]),o.value.length?(K(),q(`article`,wc,[Y(W(is)),n[17]||=J(`h3`,null,`最近活动`,-1),(K(!0),q(G,null,br(o.value,(e,t)=>(K(),q(`div`,{key:e.id||t,class:`audit-row`},[J(`span`,null,F(e.action||e.event||`变更`),1),J(`small`,null,F(e.created_at||e.timestamp),1)]))),128))])):Z(``,!0)])],64))],2))}}),Ec={key:0,class:`center`},Dc={key:1,class:`auth-shell`},Oc={class:`auth-card`},kc={key:0,role:`alert`},Ac={key:2,class:`shell`},jc={class:`brand-row`},Mc={class:`primary-nav`},Nc={class:`section-title`},Pc={class:`folders`},Fc={class:`folder-row`},Ic=[`onClick`],Lc={class:`row-actions`},Rc=[`onClick`],zc=[`onClick`],Bc=[`onClick`],Vc=[`onClick`],Hc={class:`row-actions`},Uc=[`onClick`],Wc=[`onClick`],Gc=[`onClick`],Kc={class:`row-actions`},qc=[`onClick`],Jc=[`onClick`],Yc=[`onClick`],Xc={class:`row-actions`},Zc=[`onClick`],Qc={class:`topbar`},$c={key:0,class:`search`},el={key:0,class:`section-heading`},tl={class:`list-toolbar`},nl={key:0},rl={key:2,class:`pager`},il=[`disabled`],al=[`disabled`],ol=[`onTouchstartPassive`,`onTouchmovePassive`,`onTouchend`,`onTouchcancel`],sl=[`onClick`,`onKeydown`],cl={class:`meta`},ll={key:0},ul={key:1},dl=[`aria-label`,`aria-pressed`,`onClick`],fl=[`onClick`],pl=[`onClick`],ml=[`onClick`],hl=[`onTouchstartPassive`,`onTouchmovePassive`,`onTouchend`,`onTouchcancel`],gl=[`onClick`,`onKeydown`],_l=[`aria-label`,`aria-pressed`,`onClick`],vl={key:0,class:`empty`},yl={key:3},bl={class:`section-heading`},xl={class:`detail-head`},Sl={key:0,class:`detail-form`},Cl={class:`detail-title`},wl=[`value`],Tl=[`value`],El={class:`field markdown`},Dl={class:`field-label`},Ol=[`innerHTML`],kl={class:`subtasks`},Al={class:`field-label`},jl=[`onClick`],Ml={class:`check`},Nl={key:0,class:`hint`},Pl=[`open`],Fl={class:`more-settings-body`},Il={class:`detail-actions`},Ll={key:1,class:`paper`},Rl={id:`mobile-more-menu`,class:`more-sheet`,role:`dialog`,"aria-modal":`true`,"aria-label":`更多导航`},zl={class:`more-sheet-head`},Bl={class:`bottom`,"aria-label":`主要导航`},Vl=[`aria-expanded`],Hl={key:0,class:`toast`,role:`status`},Ul={key:3,class:`error-toast`,role:`alert`},Wl={class:`modal-box`,role:`dialog`,"aria-modal":`true`},Gl={key:0},Kl={class:`modal-actions`},ql=50;Qo(Yn({__name:`App`,setup(e){let t=U(null),n=U(!1),r=U(!1),i=U(``),a=U(``),o=U([]),s=U([]),c=U([]),l=U([]),u=U([]),d=U(``),f=U(Bs()),p=U(null),m=U(``),h=U(``),g=U(``),_=U(``),v=U(!1),y=U(!1),b=U(!1),x=U(!1),S=U(!1),C=U(!1),w=U(!0),T=U(1),ee=U(0),te=xa(()=>Math.max(1,Math.ceil(ee.value/ql))),E=U(new Set),ne=U(!1),D=U(null),O=U({}),re=``,k=U(!1),ie=U(``),A=U(``),ae=U(``),oe=U(`确定`),se=U(null);function ce(e,t=``,n=``,r=`确定`){return new Promise(i=>{ie.value=e,A.value=t,ae.value=n,oe.value=r,k.value=!0,se.value=i})}function ue(){k.value=!1,se.value&&=(se.value(null),null)}function de(){k.value=!1,se.value&&=(se.value(ae.value),null)}let fe=xa(()=>f.value===`trash`?`回收站`:f.value===`today`?`今天`:f.value===`upcoming`?`最近 7 天`:f.value===`habits`?`习惯`:f.value===`settings`?`设置与数据`:s.value.find(e=>e.id===d.value)?.name||`收集箱`),pe=xa(()=>f.value===`trash`?u.value:l.value),me=xa(()=>{let e=new Date,t=new Date(e);t.setDate(t.getDate()+7);let n=pe.value;return[`habits`,`settings`].includes(f.value)?[]:(f.value===`today`&&(n=n.filter(t=>t.due_at&&new Date(t.due_at).toDateString()===e.toDateString())),f.value===`upcoming`&&(n=n.filter(n=>n.due_at&&new Date(n.due_at)>=e&&new Date(n.due_at)<=t)),h.value.trim()?Ns(n,h.value):n)}),he=xa(()=>p.value?.subtasks??[]),ge=xa(()=>Ps(me.value)),_e=xa(()=>ge.value),ve;On(h,()=>{ve&&window.clearTimeout(ve),zs(f.value)&&(T.value=1,ve=window.setTimeout(()=>L(),250))}),On(w,()=>{zs(f.value)&&(T.value=1,L())});async function M(e,t={}){let n=new Headers(t.headers||{});!n.has(`Content-Type`)&&t.body&&!(t.body instanceof FormData)&&n.set(`Content-Type`,`application/json`);let r=qs(t.method);r[`x-csrf-token`]&&n.set(`x-csrf-token`,r[`x-csrf-token`]);let i=await fetch(`/api/v1`+e,{credentials:`include`,headers:n,...t});if(!i.ok){let e=`请求失败`;try{let t=await i.json();e=typeof t.detail==`string`?t.detail:e}catch{}throw Error(e)}return i.status===204?null:i.json()}function N(e){_.value=e,window.setTimeout(()=>{_.value===e&&(_.value=``)},2400)}function P(e){g.value=e instanceof Error?e.message:`请求失败`}async function ye(){n.value=!1;try{let e=await M(`/setup/status`);if(t.value=e.initialized,e.initialized){let e=await M(`/bootstrap`);r.value=!0,o.value=e.folders??[],s.value=e.lists??[],ne.value=!0,d.value=e.inbox_id||s.value.find(e=>e.is_inbox)?.id||s.value[0]?.id||``,E.value=new Set(o.value.map(e=>e.id)),await L()}}catch{r.value=!1,t.value??=!0}finally{n.value=!0}}async function be(){g.value=``;try{await M(t.value?`/auth/login`:`/setup/initialize`,{method:`POST`,body:JSON.stringify({username:i.value,password:a.value})}),t.value=!0,r.value=!0;let e=await M(`/bootstrap`);o.value=e.folders??[],s.value=e.lists??[],ne.value=!0,d.value=e.inbox_id||s.value.find(e=>e.is_inbox)?.id||s.value[0]?.id||``,E.value=new Set(o.value.map(e=>e.id)),await L()}catch(e){P(e)}}function I(e){let t=new Date;return t.setDate(t.getDate()+e),t.setHours(0,0,0,0),t.toISOString()}async function xe(){let e=new URLSearchParams({page:String(T.value),page_size:String(ql)});h.value?e.set(`q`,h.value):f.value===`tasks`&&d.value&&e.set(`list_id`,d.value),f.value===`today`&&(e.set(`due_from`,I(0)),e.set(`due_to`,I(1))),f.value===`upcoming`&&(e.set(`due_from`,I(0)),e.set(`due_to`,I(8))),!w.value&&f.value!==`trash`&&e.set(`completed`,`false`);let t=await M(`/tasks?${e}`);l.value=t.items??[],ee.value=t.total??l.value.length}async function Se(e=!1){if(!e&&ne.value)return;let[t,n]=await Promise.all([M(`/folders`),M(`/lists`)]);o.value=t,s.value=n,ne.value=!0,s.value.some(e=>e.id===d.value)||(d.value=s.value.find(e=>e.is_inbox)?.id||s.value[0]?.id||``),E.value=new Set(o.value.map(e=>e.id)),await Ge()}async function L(){v.value=!0,g.value=``;try{ne.value||await Se(),await xe(),T.value>te.value&&(T.value=te.value,await xe())}catch(e){P(e)}finally{v.value=!1}}async function Ce(){ne.value=!1,await L()}async function we(){let e=await M(`/trash?page=${T.value}&page_size=${ql}`);u.value=e.items??[],ee.value=e.total??u.value.length}async function Te(){v.value=!0,g.value=``;try{await we()}catch(e){P(e)}finally{v.value=!1}}async function R(e,t){f.value=e,t&&(d.value=t),T.value=1,p.value=null,y.value=!1,b.value=!1,x.value=!1,e===`trash`?await Te():e===`today`?await De():zs(e)?await L():l.value=[]}async function Ee(){let e=s.value.find(e=>e.is_inbox)?.id||d.value;if(m.value.trim()&&e)try{let t=Vs(f.value,d.value,e),n=await M(`/tasks`,{method:`POST`,body:JSON.stringify({title:m.value.trim(),...t})});l.value.push(n),m.value=``,Be(n),b.value=!0,N(`任务已添加`)}catch(e){P(e)}}async function De(){await L()}async function Oe(e,t){let n=await M(`/tasks/${e.id}`,{method:`PATCH`,body:JSON.stringify({...t,version:e.version})}),r=l.value.findIndex(t=>t.id===e.id);return r>=0&&(l.value[r]={...l.value[r],...n}),p.value?.id===e.id&&(p.value={...p.value,...n}),n}async function ke(e){try{await Oe(e,{completed:!e.completed}),N(e.completed?`已重新打开`:`完成啦`)}catch(e){P(e)}}function Ae(e){return e instanceof Element&&!!e.closest(`button,input,select,textarea,a,label`)}function je(e,t){if(f.value===`trash`||v.value||Ae(t.target))return;let n=t.touches[0];n&&(D.value={id:e.id,x:n.clientX,y:n.clientY},O.value[e.id]=0)}function Me(e,t){let n=D.value,r=t.touches[0];if(!n||n.id!==e.id||!r)return;let i=r.clientX-n.x,a=r.clientY-n.y;Math.abs(i)>Math.abs(a)&&(!e.completed&&i>0||e.completed&&i<0)&&(O.value[e.id]=Math.max(-92,Math.min(i,92)))}async function Ne(e,t){let n=D.value;D.value=null;let r=O.value[e.id]??0;if(O.value[e.id]=0,!n||n.id!==e.id||f.value===`trash`||v.value)return;let i=t.changedTouches[0],a=i?i.clientX-n.x:0,o=i?i.clientY-n.y:0,s=e.completed?a<0:a>0;i&&s&&Ks(Math.abs(a),o)?(re=e.id,window.setTimeout(()=>{re===e.id&&(re=``)},400),await ke(e)):r&&(O.value[e.id]=0)}function Pe(e){D.value=null,e&&(O.value[e.id]=0)}function Fe(e){if(re===e.id){re=``;return}Be(e)}async function z(){if(p.value?.title.trim())try{let e=p.value;await Oe(e,{title:e.title.trim(),description:e.description,priority:Number(e.priority),due_at:Is(Fs(e.due_at)),list_id:e.list_id}),N(`已保存`)}catch(e){P(e)}}async function Ie(e){if(window.confirm(`把“${e.title}”移到回收站?`))try{await M(`/tasks/${e.id}`,{method:`DELETE`}),l.value=l.value.filter(t=>t.id!==e.id&&t.parent_id!==e.id),p.value=null,b.value=!1,N(`已移到回收站`)}catch(e){P(e)}}async function Le(e){try{await M(`/tasks/${e.id}/restore`,{method:`POST`}),u.value=u.value.filter(t=>t.id!==e.id),N(`任务已恢复`)}catch(e){P(e)}}async function Re(e){if(window.confirm(`永久删除“${e.title}”?这个操作不能撤销。`))try{await M(`/trash/${e.id}`,{method:`DELETE`}),u.value=u.value.filter(t=>t.id!==e.id),N(`已永久删除`)}catch(e){P(e)}}async function ze(){if(!p.value)return;let e=(await ce(`添加子任务`,`子任务名称`,``,`添加`))?.trim();if(e)try{let t=await M(`/tasks`,{method:`POST`,body:JSON.stringify({title:e,list_id:p.value.list_id,parent_id:p.value.id})});p.value&&(p.value.subtasks=[...p.value.subtasks??[],t]),l.value.push(t),N(`子任务已添加`)}catch(e){P(e)}}function Be(e){p.value={...e,subtasks:e.subtasks?[...e.subtasks]:[]},C.value=!1,S.value=!1,b.value=!0}async function Ve(){let e=(await ce(`新建文件夹`,`文件夹名称`,``,`创建`))?.trim();if(e)try{o.value.push(await M(`/folders`,{method:`POST`,body:JSON.stringify({name:e})})),N(`文件夹已创建`)}catch(e){P(e)}}async function He(e=null){let t=(await ce(`新建清单`,`清单名称`,``,`创建`))?.trim();if(t)try{let n=await M(`/lists`,{method:`POST`,body:JSON.stringify({name:t,folder_id:e})});s.value.push(n),await R(`tasks`,n.id),N(`清单已创建`)}catch(e){P(e)}}async function Ue(e,t){let n=(await ce(`重命名`,e===`lists`?`清单名称`:`文件夹名称`,t.name,`保存`))?.trim();if(n&&n!==t.name)try{let r=await M(`/${e}/${t.id}`,{method:`PATCH`,body:JSON.stringify({name:n})});Object.assign(t,r),N(`已重命名`)}catch(e){P(e)}}async function We(e,t){if(e===`lists`){if(await ce(`归档清单「${t.name}」?`,``,``,`归档`)===null)return;try{await M(`/${e}/${t.id}`,{method:`DELETE`}),await Ge(),await Ce(),N(`清单已归档`)}catch(e){P(e)}return}if(await ce(`删除文件夹「${t.name}」?`,``,``,`删除`)!==null)try{await M(`/${e}/${t.id}`,{method:`DELETE`}),await Ce(),N(`已删除`)}catch(e){P(e)}}async function Ge(){try{c.value=await M(`/lists?archived=true`)}catch{c.value=[]}}async function Ke(e){try{await M(`/lists/${e.id}/restore`,{method:`POST`}),await Ge(),await Ce(),N(`清单已恢复`)}catch(e){P(e)}}function qe(e){let t=new Set(E.value);t.has(e)?t.delete(e):t.add(e),E.value=t}function B(e){return e?new Intl.DateTimeFormat(`zh-CN`,{month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`}).format(new Date(e)):``}function Je(){ln(()=>document.querySelector(`.quick-input`)?.focus())}function Ye(){T.value<=1||v.value||(--T.value,f.value===`trash`?Te():zs(f.value)&&L())}function Xe(){T.value>=te.value||v.value||(T.value+=1,f.value===`trash`?Te():zs(f.value)&&L())}return ur(ye),(e,l)=>n.value?r.value?(K(),q(`div`,Ac,[y.value||b.value?(K(),q(`div`,{key:0,class:`scrim`,onClick:l[2]||=e=>{y.value=!1,b.value=!1}})):Z(``,!0),J(`aside`,{class:j([`sidebar`,{open:y.value}])},[J(`div`,jc,[l[43]||=J(`div`,{class:`brand small`},[X(`do`),J(`span`,null,`do`)],-1),J(`button`,{class:`icon mobile-only`,"aria-label":`关闭菜单`,onClick:l[3]||=e=>y.value=!1},[Y(W(ks))])]),J(`nav`,Mc,[J(`button`,{class:j({active:f.value===`tasks`&&s.value.find(e=>e.id===d.value)?.is_inbox}),onClick:l[4]||=e=>R(`tasks`,s.value.find(e=>e.is_inbox)?.id)},[Y(W(gs)),l[44]||=X(`收集箱`,-1)],2),J(`button`,{class:j({active:f.value===`today`}),onClick:l[5]||=e=>R(`today`)},[Y(W(vs)),l[45]||=X(`今天`,-1)],2),J(`button`,{class:j({active:f.value===`upcoming`}),onClick:l[6]||=e=>R(`upcoming`)},[Y(W(os)),l[46]||=X(`最近 7 天`,-1)],2),J(`button`,{class:j({active:f.value===`habits`}),onClick:l[7]||=e=>R(`habits`)},[Y(W(ws)),l[47]||=X(`习惯`,-1)],2),J(`button`,{class:j({active:f.value===`trash`}),onClick:l[8]||=e=>R(`trash`)},[Y(W(Ds)),l[48]||=X(`回收站`,-1)],2)]),J(`div`,Nc,[l[49]||=J(`span`,null,`我的清单`,-1),J(`span`,null,[J(`button`,{class:`mini-icon`,"aria-label":`新建文件夹`,onClick:Ve},[Y(W(ms))]),J(`button`,{class:`mini-icon`,"aria-label":`新建清单`,onClick:l[9]||=e=>He(null)},[Y(W(Ss))])])]),J(`div`,Pc,[(K(!0),q(G,null,br(o.value,e=>(K(),q(`div`,{key:e.id,class:`folder-block`},[J(`div`,Fc,[J(`button`,{onClick:t=>qe(e.id)},[E.value.has(e.id)?(K(),Ui(W(cs),{key:0})):(K(),Ui(W(ls),{key:1})),Y(W(ms)),X(F(e.name),1)],8,Ic),J(`span`,Lc,[J(`button`,{"aria-label":`重命名文件夹`,onClick:t=>Ue(`folders`,e)},[Y(W(xs))],8,Rc),J(`button`,{"aria-label":`删除文件夹`,onClick:t=>We(`folders`,e)},[Y(W(Ds))],8,zc),J(`button`,{"aria-label":`在文件夹中新建清单`,onClick:t=>He(e.id)},[Y(W(Ss))],8,Bc)])]),(K(!0),q(G,null,br(s.value.filter(t=>t.folder_id===e.id&&!t.is_inbox),t=>Sn((K(),q(`button`,{key:t.id,class:j([`list-row`,{active:f.value===`tasks`&&d.value===t.id}]),onClick:e=>R(`tasks`,t.id)},[l[50]||=J(`i`,null,null,-1),J(`span`,null,F(t.name),1),J(`span`,Hc,[J(`button`,{"aria-label":`重命名清单`,onClick:Q(e=>Ue(`lists`,t),[`stop`])},[Y(W(xs))],8,Uc),J(`button`,{"aria-label":`归档清单`,onClick:Q(e=>We(`lists`,t),[`stop`])},[Y(W(as))],8,Wc)])],10,Vc)),[[to,E.value.has(e.id)]])),128))]))),128)),(K(!0),q(G,null,br(s.value.filter(e=>!e.folder_id&&!e.is_inbox),e=>(K(),q(`button`,{key:e.id,class:j([`list-row`,{active:f.value===`tasks`&&d.value===e.id}]),onClick:t=>R(`tasks`,e.id)},[l[51]||=J(`i`,null,null,-1),J(`span`,null,F(e.name),1),J(`span`,Kc,[J(`button`,{"aria-label":`重命名清单`,onClick:Q(t=>Ue(`lists`,e),[`stop`])},[Y(W(xs))],8,qc),J(`button`,{"aria-label":`归档清单`,onClick:Q(t=>We(`lists`,e),[`stop`])},[Y(W(as))],8,Jc)])],10,Gc))),128)),c.value.length?(K(),q(G,{key:0},[l[53]||=J(`div`,{class:`section-title`},[J(`span`,null,`已归档清单`)],-1),(K(!0),q(G,null,br(c.value,e=>(K(),q(`button`,{key:e.id,class:`list-row archived-row`,onClick:t=>Ke(e)},[Y(W(as)),J(`span`,null,F(e.name),1),J(`span`,Xc,[J(`button`,{"aria-label":`恢复清单`,onClick:Q(t=>Ke(e),[`stop`])},[Y(W(as)),l[52]||=X(`恢复`,-1)],8,Zc)])],8,Yc))),128))],64)):Z(``,!0)]),J(`button`,{class:j([`settings`,{active:f.value===`settings`}]),onClick:l[10]||=e=>R(`settings`)},[Y(W(Es)),l[54]||=X(`设置`,-1)],2)],2),J(`main`,null,[J(`header`,Qc,[J(`button`,{class:`icon mobile-only`,"aria-label":`打开菜单`,onClick:l[11]||=e=>y.value=!0},[Y(W(bs))]),J(`div`,null,[J(`h1`,null,F(fe.value),1)]),[`tasks`,`today`,`upcoming`,`trash`].includes(f.value)?(K(),q(`label`,$c,[Y(W(Ts)),Sn(J(`input`,{"onUpdate:modelValue":l[12]||=e=>h.value=e,placeholder:`搜索任务…`,"aria-label":`搜索任务`},null,512),[[Lo,h.value]]),l[55]||=J(`kbd`,null,`⌘ K`,-1)])):Z(``,!0)]),[`habits`,`settings`].includes(f.value)?(K(),Ui(Tc,{key:f.value,view:f.value,onChanged:Ce,onNotice:N},null,8,[`view`])):(K(),q(G,{key:1},[f.value===`today`?(K(),q(`h3`,el,[Y(W(vs)),l[56]||=X(`今日任务`,-1)])):Z(``,!0),f.value===`trash`?Z(``,!0):(K(),q(`form`,{key:1,class:`quick`,onSubmit:Q(Ee,[`prevent`])},[Y(W(us)),Sn(J(`input`,{"onUpdate:modelValue":l[13]||=e=>m.value=e,class:`quick-input`,placeholder:`添加任务,按回车保存`},null,512),[[Lo,m.value]]),l[57]||=J(`button`,null,`添加`,-1)],32)),J(`div`,tl,[f.value===`trash`?Z(``,!0):(K(),q(`label`,nl,[Sn(J(`input`,{"onUpdate:modelValue":l[14]||=e=>w.value=e,type:`checkbox`},null,512),[[Ro,w.value]]),l[58]||=X(` 显示已完成`,-1)])),J(`span`,null,`第 `+F(T.value)+` / `+F(te.value)+` 页 · 共 `+F(ee.value)+` 项`,1),h.value?(K(),q(`button`,{key:1,class:`link`,onClick:l[15]||=e=>h.value=``},`清除搜索`)):Z(``,!0)]),f.value!==`trash`&&te.value>1?(K(),q(`div`,rl,[J(`button`,{class:`secondary`,disabled:T.value<=1||v.value,onClick:Ye},`上一页`,8,il),J(`span`,null,F(T.value)+` / `+F(te.value),1),J(`button`,{class:`secondary`,disabled:T.value>=te.value||v.value,onClick:Xe},`下一页`,8,al)])):Z(``,!0),J(`section`,{class:j([`task-list`,{loading:v.value}])},[(K(!0),q(G,null,br(_e.value,e=>(K(),q(G,{key:e.task.id},[J(`article`,{class:j([`task-row swipeable`,{done:e.task.completed,selected:p.value?.id===e.task.id,ready:Math.abs(O.value[e.task.id]??0)>=64}]),style:le({"--swipe-x":`${O.value[e.task.id]??0}px`,"--swipe-width":`${Math.abs(O.value[e.task.id]??0)}px`}),onTouchstartPassive:t=>je(e.task,t),onTouchmovePassive:t=>Me(e.task,t),onTouchend:t=>Ne(e.task,t),onTouchcancel:t=>Pe(e.task)},[J(`span`,{class:j([`swipe-bg`,{cancel:e.task.completed}])},F(e.task.completed?`↩ 未完成`:`✓ 完成`),3),J(`div`,{class:`task-main`,role:`button`,tabindex:`0`,onClick:t=>f.value===`trash`?void 0:Fe(e.task),onKeydown:[Jo(t=>f.value===`trash`?void 0:Fe(e.task),[`enter`]),Jo(Q(t=>f.value===`trash`?void 0:Fe(e.task),[`prevent`]),[`space`])]},[J(`strong`,null,F(e.task.title),1),J(`span`,cl,[e.task.due_at?(K(),q(`span`,ll,[Y(W(os)),X(F(B(e.task.due_at)),1)])):Z(``,!0),e.subtasks.length?(K(),q(`span`,ul,[Y(W(_s)),X(F(e.subtasks.filter(e=>e.completed).length)+`/`+F(e.subtasks.length),1)])):Z(``,!0)])],40,sl),f.value===`trash`?Z(``,!0):(K(),q(`button`,{key:0,class:`sr-only`,"aria-label":e.task.completed?`重新打开${e.task.title}`:`完成${e.task.title}`,"aria-pressed":e.task.completed,onClick:Q(t=>ke(e.task),[`stop`])},`切换任务状态`,8,dl)),e.task.priority?(K(),q(`span`,{key:1,class:j([`priority`,`p${e.task.priority}`])},F([``,`低`,`中`,`高`][e.task.priority]),3)):Z(``,!0),f.value===`trash`?(K(),q(`button`,{key:2,class:`restore`,onClick:t=>Le(e.task)},[Y(W(as)),l[59]||=X(`恢复`,-1)],8,fl)):(K(),q(`button`,{key:3,class:`icon ghost`,"aria-label":`删除任务`,onClick:Q(t=>Ie(e.task),[`stop`])},[Y(W(Ds))],8,pl)),f.value===`trash`?(K(),q(`button`,{key:4,class:`icon danger ghost`,"aria-label":`永久删除`,onClick:Q(t=>Re(e.task),[`stop`])},[Y(W(ks))],8,ml)):Z(``,!0)],46,ol),(K(!0),q(G,null,br(e.subtasks,e=>(K(),q(`article`,{key:e.id,class:j([`task-row subtask swipeable`,{done:e.completed,ready:Math.abs(O.value[e.id]??0)>=64}]),style:le({"--swipe-x":`${O.value[e.id]??0}px`,"--swipe-width":`${Math.abs(O.value[e.id]??0)}px`}),onTouchstartPassive:t=>je(e,t),onTouchmovePassive:t=>Me(e,t),onTouchend:t=>Ne(e,t),onTouchcancel:t=>Pe(e)},[J(`span`,{class:j([`swipe-bg`,{cancel:e.completed}])},F(e.completed?`↩ 未完成`:`✓ 完成`),3),Y(W(hs)),J(`div`,{class:`task-main`,role:`button`,tabindex:`0`,onClick:t=>Fe(e),onKeydown:[Jo(t=>Fe(e),[`enter`]),Jo(Q(t=>Fe(e),[`prevent`]),[`space`])]},[J(`strong`,null,F(e.title),1)],40,gl),J(`button`,{class:`sr-only`,"aria-label":e.completed?`重新打开${e.title}`:`完成${e.title}`,"aria-pressed":e.completed,onClick:Q(t=>ke(e),[`stop`])},`切换任务状态`,8,_l)],46,hl))),128))],64))),128)),!me.value.length&&!v.value?(K(),q(`div`,vl,[Y(W(vs)),J(`b`,null,F(h.value?`没有匹配的任务`:`这里还很安静`),1),J(`span`,null,F(h.value?`换个关键词试试`:`写下第一件想完成的小事吧`),1)])):Z(``,!0)],2),f.value===`today`?(K(),q(`div`,yl,[J(`h3`,bl,[Y(W(ws)),l[60]||=X(`今日习惯`,-1)]),Y(Tc,{view:`today-habits`,onChanged:Ce,onNotice:N})])):Z(``,!0)],64))]),J(`aside`,{class:j([`detail`,{open:b.value}])},[J(`div`,xl,[l[61]||=J(`span`,null,`任务详情`,-1),J(`button`,{class:`icon mobile-only`,"aria-label":`关闭详情`,onClick:l[16]||=e=>b.value=!1},[Y(W(ks))])]),p.value?(K(),q(`div`,Sl,[J(`div`,Cl,[J(`button`,{class:j([`check large`,`p${p.value.priority}`]),onClick:l[17]||=e=>ke(p.value)},[p.value.completed?(K(),Ui(W(ss),{key:0})):Z(``,!0)],2),Sn(J(`textarea`,{"onUpdate:modelValue":l[18]||=e=>p.value.title=e,rows:`2`,"aria-label":`任务标题`,onBlur:z},null,544),[[Lo,p.value.title]])]),J(`label`,null,[l[62]||=X(`清单`,-1),Sn(J(`select`,{"onUpdate:modelValue":l[19]||=e=>p.value.list_id=e,onChange:z},[(K(!0),q(G,null,br(s.value,e=>(K(),q(`option`,{key:e.id,value:e.id},F(e.name),9,wl))),128))],544),[[Bo,p.value.list_id]])]),J(`label`,null,[l[63]||=X(`截止时间`,-1),J(`input`,{value:W(Fs)(p.value.due_at),type:`datetime-local`,onChange:l[20]||=e=>{p.value.due_at=e.target.value,z()}},null,40,Tl)]),J(`div`,El,[J(`div`,Dl,[l[64]||=J(`span`,null,`备注`,-1),J(`span`,null,[J(`button`,{class:j({active:!C.value}),onClick:l[21]||=e=>C.value=!1},`编辑`,2),J(`button`,{class:j({active:C.value}),onClick:l[22]||=e=>C.value=!0},`预览`,2)])]),C.value?(K(),q(`div`,{key:0,class:`markdown-preview`,innerHTML:W(Ms)(p.value.description)},null,8,Ol)):Sn((K(),q(`textarea`,{key:1,"onUpdate:modelValue":l[23]||=e=>p.value.description=e,rows:`9`,placeholder:`支持 Markdown…`,onBlur:z},null,544)),[[Lo,p.value.description]])]),J(`div`,kl,[J(`div`,Al,[l[66]||=J(`span`,null,`子任务`,-1),J(`button`,{class:`link`,onClick:ze},[Y(W(Ss)),l[65]||=X(`添加`,-1)])]),(K(!0),q(G,null,br(he.value,e=>(K(),q(`button`,{key:e.id,class:`subtask-detail`,onClick:t=>ke(e)},[J(`span`,Ml,[e.completed?(K(),Ui(W(ss),{key:0})):Z(``,!0)]),J(`span`,{class:j({strike:e.completed})},F(e.title),3)],8,jl))),128)),he.value.length?Z(``,!0):(K(),q(`span`,Nl,`把这件事拆成更小的步骤`))]),J(`details`,{class:`more-settings`,open:S.value,onToggle:l[25]||=e=>S.value=e.target.open},[l[69]||=J(`summary`,null,`更多设置`,-1),J(`div`,Fl,[J(`label`,null,[l[68]||=X(`优先级`,-1),Sn(J(`select`,{"onUpdate:modelValue":l[24]||=e=>p.value.priority=e,onChange:z},[...l[67]||=[J(`option`,{value:0},`无`,-1),J(`option`,{value:1},`低`,-1),J(`option`,{value:2},`中`,-1),J(`option`,{value:3},`高`,-1)]],544),[[Bo,p.value.priority,void 0,{number:!0}]])])])],40,Pl),J(`div`,Il,[J(`button`,{class:`secondary`,onClick:z},`保存更改`),J(`button`,{class:`danger-text`,onClick:l[26]||=e=>Ie(p.value)},[Y(W(Ds)),l[70]||=X(`移到回收站`,-1)])])])):(K(),q(`div`,Ll,[Y(W(_s)),l[71]||=J(`b`,null,`选中一个任务`,-1),l[72]||=J(`p`,null,`日期、优先级、子任务和 Markdown 备注会出现在这里。`,-1)]))],2),x.value?(K(),q(`div`,{key:1,class:`more-mask`,onClick:l[32]||=Q(e=>x.value=!1,[`self`])},[J(`section`,Rl,[J(`div`,zl,[l[73]||=J(`b`,null,`更多`,-1),J(`button`,{class:`icon`,"aria-label":`关闭更多菜单`,onClick:l[27]||=e=>x.value=!1},[Y(W(ks))])]),J(`button`,{onClick:l[28]||=e=>R(`upcoming`)},[Y(W(os)),l[74]||=X(`最近 7 天`,-1)]),J(`button`,{onClick:l[29]||=e=>R(`trash`)},[Y(W(Ds)),l[75]||=X(`回收站`,-1)]),J(`button`,{onClick:l[30]||=e=>R(`settings`)},[Y(W(Es)),l[76]||=X(`设置与数据`,-1)]),J(`button`,{onClick:l[31]||=e=>{x.value=!1,y.value=!0}},[Y(W(bs)),l[77]||=X(`全部清单`,-1)])])])):Z(``,!0),J(`nav`,Bl,[J(`button`,{class:j({active:f.value===`today`}),onClick:l[33]||=e=>R(`today`)},[Y(W(vs)),l[78]||=J(`span`,null,`今天`,-1)],2),J(`button`,{class:j({active:f.value===`tasks`}),onClick:l[34]||=e=>R(`tasks`,s.value.find(e=>e.is_inbox)?.id)},[Y(W(gs)),l[79]||=J(`span`,null,`任务`,-1)],2),J(`button`,{class:j({active:f.value===`habits`}),onClick:l[35]||=e=>R(`habits`)},[Y(W(ws)),l[80]||=J(`span`,null,`习惯`,-1)],2),J(`button`,{class:j({active:x.value||[`upcoming`,`trash`,`settings`].includes(f.value)}),"aria-haspopup":`dialog`,"aria-controls":`mobile-more-menu`,"aria-expanded":x.value,onClick:l[36]||=e=>x.value=!x.value},[Y(W(fs)),l[81]||=J(`span`,null,`更多`,-1)],10,Vl)]),[`tasks`,`today`,`upcoming`].includes(f.value)?(K(),q(`button`,{key:2,class:`fab`,"aria-label":`添加任务`,onClick:Je},[Y(W(us))])):Z(``,!0),Y(La,{name:`toast`},{default:xn(()=>[_.value?(K(),q(`div`,Hl,F(_.value),1)):Z(``,!0)]),_:1}),g.value?(K(),q(`div`,Ul,[X(F(g.value),1),J(`button`,{onClick:l[37]||=e=>g.value=``},[Y(W(ks))])])):Z(``,!0),k.value?(K(),q(`div`,{key:4,class:`modal-mask`,onClick:Q(ue,[`self`])},[J(`div`,Wl,[J(`h3`,null,F(ie.value),1),A.value?(K(),q(`label`,Gl,[X(F(A.value),1),Sn(J(`input`,{"onUpdate:modelValue":l[38]||=e=>ae.value=e,class:`modal-input`,autofocus:``,onKeyup:Jo(de,[`enter`])},null,544),[[Lo,ae.value]])])):Z(``,!0),J(`div`,Kl,[J(`button`,{class:`secondary`,onClick:ue},`取消`),J(`button`,{class:`primary-small`,onClick:de},F(oe.value),1)])])])):Z(``,!0)])):(K(),q(`div`,Dc,[J(`section`,Oc,[l[42]||=J(`div`,{class:`brand`},[X(`do`),J(`span`,null,`do`)],-1),J(`p`,null,F(t.value?`欢迎回来,继续把生活理顺。`:`创建你的 dodo`),1),J(`label`,null,[l[40]||=X(`用户名`,-1),Sn(J(`input`,{"onUpdate:modelValue":l[0]||=e=>i.value=e,autocomplete:`username`,placeholder:`你的用户名`},null,512),[[Lo,i.value]])]),J(`label`,null,[l[41]||=X(`密码`,-1),Sn(J(`input`,{"onUpdate:modelValue":l[1]||=e=>a.value=e,type:`password`,autocomplete:`current-password`,placeholder:`至少 12 位`,onKeyup:Jo(be,[`enter`])},null,544),[[Lo,a.value]])]),J(`button`,{class:`primary`,onClick:be},F(t.value?`登录`:`开始使用`),1),g.value?(K(),q(`small`,kc,F(g.value),1)):Z(``,!0)])])):(K(),q(`div`,Ec,[...l[39]||=[J(`span`,{class:`loader`},null,-1),X(`正在打开 dodo…`,-1)]]))}})).mount(`#app`),`serviceWorker`in navigator&&(navigator.serviceWorker.getRegistrations().then(e=>{e.forEach(e=>e.unregister())}),caches.keys().then(e=>e.forEach(e=>caches.delete(e)))); \ No newline at end of file diff --git a/backend/static/index.html b/backend/static/index.html index 004a85c..ea93913 100644 --- a/backend/static/index.html +++ b/backend/static/index.html @@ -1,3 +1,3 @@ -dodo - +dodo +
    \ No newline at end of file diff --git a/docs/api.md b/docs/api.md index b29dc09..7b0c086 100644 --- a/docs/api.md +++ b/docs/api.md @@ -24,24 +24,17 @@ Base path: `/api/v1`. 除初始化、登录和健康检查外均需 `dodo_sessio - `PATCH /lists/{list_id}` — 重命名;系统收集箱返回 409 - `DELETE /lists/{list_id}` — 软删除并将任务移入系统收集箱;系统收集箱返回 409 -## Tags - -标签属于当前用户,可跨清单复用。 - -- `GET /tags` -- `POST /tags` — `{name, color}`;同一用户名称唯一 - ## Tasks -- `GET /tasks?q=&limit=&cursor=` — 顶层未删除任务的游标分页;`q` 匹配标题、描述、标签名和清单名 -- `POST /tasks` — 创建任务;`parent_id` 只允许指向同清单顶层任务;`tag_ids` 必须属于当前用户 -- `GET /tasks/{task_id}` — 返回任务、标签和一层子任务 +- `GET /tasks?q=&limit=&cursor=` — 顶层未删除任务的游标分页;`q` 匹配标题、描述和清单名 +- `POST /tasks` — 创建任务;`parent_id` 只允许指向同清单顶层任务 +- `GET /tasks/{task_id}` — 返回任务和一层子任务 - `PATCH /tasks/{task_id}` — 必须携带当前 `version`,原子比较更新;版本冲突返回 409 - `DELETE /tasks/{task_id}` — 软删除任务及其直接子任务 - `POST /tasks/{task_id}/restore` — 恢复任务及其直接子任务 -- `POST /tasks/batch` — 原子批量完成、移动、设置截止时间、替换标签或软删除 +- `POST /tasks/batch` — 原子批量完成、移动、设置截止时间或软删除 -批量请求字段:`task_ids`、`completed`、`list_id`、`due_at`、`tag_ids`、`soft_delete`。所有任务、目标清单和标签在写入前完成归属校验;任一不存在则整批不修改。 +批量请求字段:`task_ids`、`completed`、`list_id`、`due_at`、`soft_delete`。所有任务和目标清单在写入前完成归属校验;任一不存在则整批不修改。 ## Recycle bin diff --git a/docs/data-model.md b/docs/data-model.md index 93dae5e..e4591ac 100644 --- a/docs/data-model.md +++ b/docs/data-model.md @@ -47,22 +47,6 @@ 删除普通清单时,其未删除任务原子移动到系统收集箱。系统收集箱不可重命名或删除。 -## tags - -- `id` -- `user_id` → users -- `name`,同一用户内唯一 -- `color` -- `created_at` - -标签是用户级全局实体,不隶属于清单。 - -## task_tags - -- `task_id` → tasks -- `tag_id` → tags -- `(task_id, tag_id)` 联合主键 - ## tasks - `id` @@ -85,7 +69,9 @@ ## 迁移 - `0001_initial.py`:已部署的初始模式,不修改 -- `0002_task_management.py`:新增文件夹/清单软删除列、标签表、任务标签关联表及游标/回收站索引 +- `0002_task_management.py`:新增文件夹/清单软删除列、历史标签表及游标/回收站索引 +- `0008_remove_calendar_subscriptions.py`:移除日历订阅表 +- `0009_remove_tags.py`:移除历史标签表及任务标签关联表 ## 后续阶段预留 diff --git a/docs/decisions.md b/docs/decisions.md index ebdc26c..3d320db 100644 --- a/docs/decisions.md +++ b/docs/decisions.md @@ -14,11 +14,10 @@ dodo 是一个纯自托管的 TickTick-like 任务与习惯管理工具。目标 ## 技术栈 -- Monorepo:`frontend/`、`backend/`、`worker/` +- Monorepo:`frontend/`、`backend/` - 前端:Vue 3 + TypeScript + Vite + Tailwind CSS + Shadcn-vue/Reka UI - 后端:FastAPI + Pydantic v2 + SQLAlchemy 2 Async + Alembic - 数据库:PostgreSQL,主键 UUIDv7,时间统一 UTC,用户配置时区 -- 后台:独立 Worker + APScheduler - 包管理:uv + pnpm - 交付:单 Docker 镜像,外部 PostgreSQL - 许可证:AGPL-3.0 @@ -45,7 +44,6 @@ postgresql+asyncpg://postgres:***@10.10.100.99:5433/dodo - Markdown 描述 - 截止日期 + 具体时间 - 多提醒设计预留 -- 全局彩色标签 - 删除为软删除,回收站手动清空 - 支持创建、修改、完成、恢复、删除操作历史 - 并发编辑使用原子乐观锁 @@ -86,7 +84,6 @@ postgresql+asyncpg://postgres:***@10.10.100.99:5433/dodo - 手机底部导航 - 顶部快速输入,手机悬浮新增按钮 - 桌面右侧详情栏,手机底部弹层 -- 日历默认月视图 - 习惯首页:今日习惯列表 + 一周打卡格 - 搜索:顶部搜索框 + 全局搜索快捷键 diff --git a/docs/deploy.md b/docs/deploy.md index cade944..9d61030 100644 --- a/docs/deploy.md +++ b/docs/deploy.md @@ -18,9 +18,6 @@ DODO_SESSION_DAYS=30 - 应用监听 `0.0.0.0:8781` - 健康检查:`/health/ready` -## 后续补充 +## 部署文件 -- Dockerfile -- docker-compose.yml 示例 -- Alembic 正式迁移目录 -- Worker 启动命令 +仓库已包含 Dockerfile、compose 示例和 Alembic 迁移。 diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 91d83a3..009dac2 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -3,20 +3,17 @@ import { computed, nextTick, onMounted, ref, watch } from 'vue' import { ArchiveRestore, CalendarDays, Check, ChevronDown, ChevronRight, CirclePlus, Folder, GripVertical, Inbox, ListChecks, ListTodo, Menu, Pencil, Plus, Search, - Settings, Trash2, X, Repeat2, + Settings, Trash2, X, Repeat2, Ellipsis, } from 'lucide-vue-next' import { filterTasks, fromDateTimeLocal, groupTaskTree, renderMarkdown, toDateTimeLocal } from './lib/task-utils' -import { dateKey, defaultView, isTaskView, shouldToggleRowSwipe } from './lib/mvp-utils' +import { defaultView, isTaskView, quickTaskFields, shouldToggleRowSwipe } from './lib/mvp-utils' import { csrfHeader } from './lib/csrf' import MvpPanel from './MvpPanel.vue' type FolderItem = { id: string; name: string } type TaskList = { id: string; folder_id: string | null; name: string; is_inbox: boolean } -type CalendarSubscription = { id: string; name: string; url: string; color?: string } -type Tag = { id: string; name: string; color: string } -type Task = { id: string; list_id: string; parent_id: string | null; title: string; description: string; priority: number; completed: boolean; version: number; due_at: string | null; recurrence_rule?: string | null; recurrence_end_at?: string | null; tags?: Tag[]; subtasks?: Task[] } -type CalendarEvent = { id: string; title: string; starts_at: string; ends_at?: string | null; all_day: boolean; source_name: string; color?: string } -type View = 'tasks' | 'today' | 'upcoming' | 'trash' | 'habits' | 'calendar' | 'settings' +type Task = { id: string; list_id: string; parent_id: string | null; title: string; description: string; priority: number; completed: boolean; version: number; due_at: string | null; subtasks?: Task[] } +type View = 'tasks' | 'today' | 'upcoming' | 'trash' | 'habits' | 'settings' const initialized = ref(null) const authReady = ref(false) @@ -26,11 +23,6 @@ const password = ref('') const folders = ref([]) const lists = ref([]) const archivedLists = ref([]) -const calendarSubscriptions = ref([]) -const calendarEvents = ref([]) -const calendarName = ref('合并日历') -const calendarUrl = ref('https://cal.bboy.app/all.ics') -const tags = ref([]) const tasks = ref([]) const trash = ref([]) const activeList = ref('') @@ -43,6 +35,8 @@ const notice = ref('') const loading = ref(false) const mobileSidebar = ref(false) const mobileDetail = ref(false) +const mobileMore = ref(false) +const moreSettingsOpen = ref(false) const markdownPreview = ref(false) const showCompleted = ref(true) const page = ref(1) @@ -83,7 +77,6 @@ function confirmModal() { const activeName = computed(() => { if (activeView.value === 'trash') return '回收站' if (activeView.value === 'today') return '今天' - if (activeView.value === 'calendar') return '日历' if (activeView.value === 'upcoming') return '最近 7 天' if (activeView.value === 'habits') return '习惯' if (activeView.value === 'settings') return '设置与数据' @@ -94,7 +87,7 @@ const visibleTasks = computed(() => { const now = new Date() const end = new Date(now); end.setDate(end.getDate() + 7) let result = sourceTasks.value - if (['habits','settings','calendar'].includes(activeView.value)) return [] + if (['habits','settings'].includes(activeView.value)) return [] if (activeView.value === 'today') result = result.filter((task) => task.due_at && new Date(task.due_at).toDateString() === now.toDateString()) if (activeView.value === 'upcoming') result = result.filter((task) => task.due_at && new Date(task.due_at) >= now && new Date(task.due_at) <= end) return query.value.trim() ? filterTasks(result, query.value) : result @@ -149,7 +142,6 @@ async function bootstrap() { authenticated.value = true folders.value = data.folders ?? [] lists.value = data.lists ?? [] - tags.value = data.tags ?? [] navigationLoaded.value = true activeList.value = data.inbox_id || lists.value.find((item: TaskList) => item.is_inbox)?.id || lists.value[0]?.id || '' expandedFolders.value = new Set(folders.value.map((folder) => folder.id)) @@ -171,7 +163,6 @@ async function submitAuth() { const data = await api('/bootstrap') folders.value = data.folders ?? [] lists.value = data.lists ?? [] - tags.value = data.tags ?? [] navigationLoaded.value = true activeList.value = data.inbox_id || lists.value.find((item: TaskList) => item.is_inbox)?.id || lists.value[0]?.id || '' expandedFolders.value = new Set(folders.value.map((folder) => folder.id)) @@ -208,10 +199,8 @@ async function loadTasksPage() { } async function loadNavigation(force = false) { if (!force && navigationLoaded.value) return - const [folderData, listData, tagData] = await Promise.all([ - api('/folders'), api('/lists'), api('/tags').catch(() => []), - ]) - folders.value = folderData; lists.value = listData; tags.value = tagData + const [folderData, listData] = await Promise.all([api('/folders'), api('/lists')]) + folders.value = folderData; lists.value = listData navigationLoaded.value = true if (!lists.value.some((item) => item.id === activeList.value)) { activeList.value = lists.value.find((item) => item.is_inbox)?.id || lists.value[0]?.id || '' @@ -244,22 +233,23 @@ async function switchView(view: View, listId?: string) { activeView.value = view if (listId) activeList.value = listId page.value = 1 - selectedTask.value = null; mobileSidebar.value = false; mobileDetail.value = false + selectedTask.value = null; mobileSidebar.value = false; mobileDetail.value = false; mobileMore.value = false if (view === 'trash') await loadTrash() - else if (view === 'calendar') await loadCalendarTab() else if (view === 'today') await loadTodayView() else if (!isTaskView(view)) tasks.value = [] else await loadAll() } async function addTask() { - if (!title.value.trim() || !activeList.value) return + const inboxId = lists.value.find((item) => item.is_inbox)?.id || activeList.value + if (!title.value.trim() || !inboxId) return try { - const task = await api('/tasks', { method: 'POST', body: JSON.stringify({ title: title.value.trim(), list_id: activeList.value }) }) - tasks.value.push(task); title.value = ''; selectTask(task); toast('任务已添加') + const fields = quickTaskFields(activeView.value, activeList.value, inboxId) + const task = await api('/tasks', { method: 'POST', body: JSON.stringify({ title: title.value.trim(), ...fields }) }) + tasks.value.push(task); title.value = ''; selectTask(task); mobileDetail.value = true; toast('任务已添加') } catch (reason) { fail(reason) } } async function loadTodayView() { - await Promise.all([loadAll(), loadTodayEvents()]) + await loadAll() } async function patchTask(task: Task, patch: Partial) { const updated = await api(`/tasks/${task.id}`, { method: 'PATCH', body: JSON.stringify({ ...patch, version: task.version }) }) @@ -327,7 +317,7 @@ async function saveTask() { if (!selectedTask.value?.title.trim()) return try { const task = selectedTask.value - await patchTask(task, { title: task.title.trim(), description: task.description, priority: Number(task.priority), due_at: fromDateTimeLocal(toDateTimeLocal(task.due_at)), list_id: task.list_id, recurrence_rule: task.recurrence_rule || null, recurrence_end_at: task.recurrence_end_at || null, tag_ids: (task.tags ?? []).map((tag) => tag.id) } as Partial) + await patchTask(task, { title: task.title.trim(), description: task.description, priority: Number(task.priority), due_at: fromDateTimeLocal(toDateTimeLocal(task.due_at)), list_id: task.list_id } as Partial) toast('已保存') } catch (reason) { fail(reason) } } @@ -349,8 +339,8 @@ async function addSubtask() { try { const child = await api('/tasks', { method: 'POST', body: JSON.stringify({ title: subtaskTitle, list_id: selectedTask.value.list_id, parent_id: selectedTask.value.id }) }); if (selectedTask.value) selectedTask.value.subtasks = [...(selectedTask.value.subtasks ?? []), child]; tasks.value.push(child); toast('子任务已添加') } catch (reason) { fail(reason) } } function selectTask(task: Task) { - selectedTask.value = { ...task, tags: task.tags ? [...task.tags] : [] } - markdownPreview.value = false; mobileDetail.value = true + selectedTask.value = { ...task, subtasks: task.subtasks ? [...task.subtasks] : [] } + markdownPreview.value = false; moreSettingsOpen.value = false; mobileDetail.value = true } async function createFolder() { const name = (await askText('新建文件夹', '文件夹名称', '', '创建'))?.trim(); if (!name) return @@ -364,11 +354,6 @@ async function renameEntity(kind: 'folders' | 'lists', item: FolderItem | TaskLi const name = (await askText('重命名', kind === 'lists' ? '清单名称' : '文件夹名称', item.name, '保存'))?.trim(); if (!name || name === item.name) return try { const updated = await api(`/${kind}/${item.id}`, { method: 'PATCH', body: JSON.stringify({ name }) }); Object.assign(item, updated); toast('已重命名') } catch (reason) { fail(reason) } } -async function createTag() { - const name = (await askText('新建标签', '标签名称', '', '创建'))?.trim(); if (!name) return - const color = (await askText('标签颜色', '颜色(十六进制)', '#F15A29', '创建'))?.trim() || '#F15A29' - try { tags.value.push(await api('/tags', { method: 'POST', body: JSON.stringify({ name, color }) })); toast('标签已创建') } catch (reason) { fail(reason) } -} async function deleteEntity(kind: 'folders' | 'lists', item: FolderItem | TaskList) { if (kind === 'lists') { const answer = await askText(`归档清单「${item.name}」?`, '', '', '归档') @@ -386,45 +371,8 @@ async function loadArchivedLists() { async function restoreList(item: TaskList) { try { await api(`/lists/${item.id}/restore`, { method: 'POST' }); await loadArchivedLists(); await refreshAll(); toast('清单已恢复') } catch (reason) { fail(reason) } } -async function loadCalendarTab() { - try { - calendarSubscriptions.value = await api('/calendar-subscriptions') - if (calendarSubscriptions.value.length) { - calendarEvents.value = await api(`/calendar-subscriptions/today?day=${dateKey(new Date())}`) - } else { - calendarEvents.value = [] - } - } catch { calendarSubscriptions.value = []; calendarEvents.value = [] } -} -async function addCalendarSubscription() { - if (!calendarUrl.value.trim()) return - try { - await api('/calendar-subscriptions', { method: 'POST', body: JSON.stringify({ name: calendarName.value.trim() || calendarUrl.value, url: calendarUrl.value.trim(), color: '#f15a29' }) }) - await loadCalendarTab(); toast('日历已订阅') - } catch (reason) { fail(reason) } -} -async function removeCalendarSubscription(id: string) { - if (!window.confirm('取消这个日历订阅?')) return - try { await api(`/calendar-subscriptions/${id}`, { method: 'DELETE' }); await loadCalendarTab(); toast('已取消订阅') } catch (reason) { fail(reason) } -} -function taskHasTag(tag: Tag) { return !!selectedTask.value?.tags?.some((item) => item.id === tag.id) } -function toggleTag(tag: Tag) { - if (!selectedTask.value) return - selectedTask.value.tags = taskHasTag(tag) ? (selectedTask.value.tags ?? []).filter((item) => item.id !== tag.id) : [...(selectedTask.value.tags ?? []), tag] -} function toggleFolder(id: string) { const next = new Set(expandedFolders.value); next.has(id) ? next.delete(id) : next.add(id); expandedFolders.value = next } function formatDue(value: string | null) { return value ? new Intl.DateTimeFormat('zh-CN', { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }).format(new Date(value)) : '' } -function formatEventTime(item: CalendarEvent) { - if (item.all_day) return '全天' - const date = new Date(item.starts_at) - return `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}` -} -async function loadTodayEvents() { - try { - calendarSubscriptions.value = await api('/calendar-subscriptions') - calendarEvents.value = calendarSubscriptions.value.length ? await api(`/calendar-subscriptions/today?day=${dateKey(new Date())}`) : [] - } catch { calendarEvents.value = [] } -} function focusQuick() { nextTick(() => document.querySelector('.quick-input')?.focus()) } function previousPage() { if (page.value <= 1 || loading.value) return @@ -459,7 +407,6 @@ onMounted(bootstrap) - @@ -481,18 +428,11 @@ onMounted(bootstrap)
    -

    今天也慢慢来

    {{ activeName }}

    +

    {{ activeName }}

    -