diff --git a/backend/main.py b/backend/main.py index 78aaeae..5049f77 100644 --- a/backend/main.py +++ b/backend/main.py @@ -1,11 +1,14 @@ +import base64 +import json from contextlib import asynccontextmanager +from datetime import datetime from pathlib import Path from uuid import UUID -from fastapi import Depends, FastAPI, HTTPException, Response +from fastapi import Depends, FastAPI, HTTPException, Query, Response from fastapi.responses import FileResponse from fastapi.staticfiles import StaticFiles -from sqlalchemy import func, select, update +from sqlalchemy import delete, exists, func, or_, select, update from sqlalchemy.exc import IntegrityError from sqlalchemy.ext.asyncio import AsyncSession @@ -19,15 +22,21 @@ from .auth import ( verify_password, ) from .db import create_schema, get_db -from .models import AppState, Folder, Session, Task, TaskList, User, utcnow +from .models import AppState, Folder, Session, Tag, Task, TaskList, TaskTag, User, utcnow from .schemas import ( + BatchResult, + BatchTaskUpdate, FolderCreate, FolderOut, InitializeRequest, ListCreate, ListOut, LoginRequest, + NameUpdate, + TagCreate, + TagOut, TaskCreate, + TaskDetailOut, TaskOut, TaskPage, TaskUpdate, @@ -44,7 +53,13 @@ async def lifespan(app: FastAPI): yield -app = FastAPI(title="dodo", version="0.1.0", lifespan=lifespan, docs_url="/api/docs", openapi_url="/api/openapi.json") +app = FastAPI( + title="dodo", + version="0.1.0", + lifespan=lifespan, + docs_url="/api/docs", + openapi_url="/api/openapi.json", +) @app.get("/health/live") @@ -65,7 +80,11 @@ async def setup_status(db: AsyncSession = Depends(get_db)): @app.post("/api/v1/setup/initialize", response_model=UserOut, status_code=201) -async def initialize(payload: InitializeRequest, response: Response, db: AsyncSession = Depends(get_db)): +async def initialize( + payload: InitializeRequest, + response: Response, + db: AsyncSession = Depends(get_db), +): count = await db.scalar(select(func.count()).select_from(User)) if count: raise HTTPException(status_code=409, detail="系统已经初始化") @@ -85,7 +104,11 @@ async def initialize(payload: InitializeRequest, response: Response, db: AsyncSe @app.post("/api/v1/auth/login", response_model=UserOut) -async def login(payload: LoginRequest, response: Response, db: AsyncSession = Depends(get_db)): +async def login( + payload: LoginRequest, + response: Response, + db: AsyncSession = Depends(get_db), +): user = await db.scalar(select(User).where(User.username == payload.username)) if user is None or not verify_password(user.password_hash, payload.password): raise HTTPException(status_code=401, detail="用户名或密码错误") @@ -113,35 +136,218 @@ async def logout( @app.post("/api/v1/folders", response_model=FolderOut, status_code=201) -async def create_folder(payload: FolderCreate, user: User = Depends(current_user), db: AsyncSession = Depends(get_db)): +async def create_folder( + payload: FolderCreate, + user: User = Depends(current_user), + db: AsyncSession = Depends(get_db), +): folder = Folder(user_id=user.id, name=payload.name) - db.add(folder); await db.commit(); await db.refresh(folder) + db.add(folder) + await db.commit() + await db.refresh(folder) return folder @app.get("/api/v1/folders", response_model=list[FolderOut]) async def list_folders(user: User = Depends(current_user), db: AsyncSession = Depends(get_db)): - return list((await db.scalars(select(Folder).where(Folder.user_id == user.id).order_by(Folder.position, Folder.created_at))).all()) + query = select(Folder).where(Folder.user_id == user.id, Folder.deleted_at.is_(None)) + return list((await db.scalars(query.order_by(Folder.position, Folder.created_at))).all()) + + +@app.patch("/api/v1/folders/{folder_id}", response_model=FolderOut) +async def rename_folder( + folder_id: UUID, + payload: NameUpdate, + user: User = Depends(current_user), + db: AsyncSession = Depends(get_db), +): + folder = await db.scalar( + select(Folder).where( + Folder.id == folder_id, Folder.user_id == user.id, Folder.deleted_at.is_(None) + ) + ) + if folder is None: + raise HTTPException(status_code=404, detail="文件夹不存在") + folder.name = payload.name + await db.commit() + return folder + + +@app.delete("/api/v1/folders/{folder_id}", status_code=204) +async def delete_folder( + folder_id: UUID, + user: User = Depends(current_user), + db: AsyncSession = Depends(get_db), +): + folder = await db.scalar( + select(Folder).where( + Folder.id == folder_id, Folder.user_id == user.id, Folder.deleted_at.is_(None) + ) + ) + if folder is None: + raise HTTPException(status_code=404, detail="文件夹不存在") + folder.deleted_at = utcnow() + await db.execute( + update(TaskList) + .where(TaskList.user_id == user.id, TaskList.folder_id == folder.id) + .values(folder_id=None) + ) + await db.commit() + return Response(status_code=204) @app.post("/api/v1/lists", response_model=ListOut, status_code=201) -async def create_list(payload: ListCreate, user: User = Depends(current_user), db: AsyncSession = Depends(get_db)): - if payload.folder_id and not await db.scalar(select(Folder.id).where(Folder.id == payload.folder_id, Folder.user_id == user.id)): +async def create_list( + payload: ListCreate, + user: User = Depends(current_user), + db: AsyncSession = Depends(get_db), +): + if payload.folder_id and not await db.scalar( + select(Folder.id).where( + Folder.id == payload.folder_id, + Folder.user_id == user.id, + Folder.deleted_at.is_(None), + ) + ): raise HTTPException(status_code=404, detail="文件夹不存在") item = TaskList(user_id=user.id, folder_id=payload.folder_id, name=payload.name) - db.add(item); await db.commit(); await db.refresh(item) + db.add(item) + await db.commit() + await db.refresh(item) return item @app.get("/api/v1/lists", response_model=list[ListOut]) async def list_lists(user: User = Depends(current_user), db: AsyncSession = Depends(get_db)): - return list((await db.scalars(select(TaskList).where(TaskList.user_id == user.id).order_by(TaskList.is_inbox.desc(), TaskList.position, TaskList.created_at))).all()) + query = select(TaskList).where(TaskList.user_id == user.id, TaskList.deleted_at.is_(None)) + ordering = (TaskList.is_inbox.desc(), TaskList.position, TaskList.created_at) + return list((await db.scalars(query.order_by(*ordering))).all()) + + +async def _owned_list(db: AsyncSession, user_id: UUID, list_id: UUID) -> TaskList: + item = await db.scalar( + select(TaskList).where( + TaskList.id == list_id, + TaskList.user_id == user_id, + TaskList.deleted_at.is_(None), + ) + ) + if item is None: + raise HTTPException(status_code=404, detail="清单不存在") + return item + + +@app.patch("/api/v1/lists/{list_id}", response_model=ListOut) +async def rename_list( + list_id: UUID, + payload: NameUpdate, + user: User = Depends(current_user), + db: AsyncSession = Depends(get_db), +): + item = await _owned_list(db, user.id, list_id) + if item.is_inbox: + raise HTTPException(status_code=409, detail="系统收集箱不能重命名") + item.name = payload.name + await db.commit() + return item + + +@app.delete("/api/v1/lists/{list_id}", status_code=204) +async def delete_list( + list_id: UUID, + user: User = Depends(current_user), + db: AsyncSession = Depends(get_db), +): + item = await _owned_list(db, user.id, list_id) + if item.is_inbox: + raise HTTPException(status_code=409, detail="系统收集箱不能删除") + inbox_id = await db.scalar( + select(TaskList.id).where( + TaskList.user_id == user.id, + TaskList.is_inbox.is_(True), + TaskList.deleted_at.is_(None), + ) + ) + if inbox_id is None: + raise HTTPException(status_code=409, detail="系统收集箱不存在") + await db.execute( + update(Task) + .where(Task.user_id == user.id, Task.list_id == item.id, Task.deleted_at.is_(None)) + .values(list_id=inbox_id, version=Task.version + 1, updated_at=utcnow()) + ) + item.deleted_at = utcnow() + await db.commit() + return Response(status_code=204) + + +@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() + return base64.urlsafe_b64encode(raw).decode().rstrip("=") + + +def _decode_cursor(cursor: str) -> tuple[datetime, UUID]: + try: + raw = base64.urlsafe_b64decode(cursor + "=" * (-len(cursor) % 4)) + timestamp, task_id = json.loads(raw) + return datetime.fromisoformat(timestamp), UUID(task_id) + except (ValueError, TypeError, json.JSONDecodeError) as exc: + raise HTTPException(status_code=422, detail="无效的游标") from exc @app.post("/api/v1/tasks", response_model=TaskOut, status_code=201) -async def create_task(payload: TaskCreate, user: User = Depends(current_user), db: AsyncSession = Depends(get_db)): - if not await db.scalar(select(TaskList.id).where(TaskList.id == payload.list_id, TaskList.user_id == user.id)): - raise HTTPException(status_code=404, detail="清单不存在") +async def create_task( + payload: TaskCreate, + user: User = Depends(current_user), + 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( @@ -153,22 +359,117 @@ async def create_task(payload: TaskCreate, user: User = Depends(current_user), d ) ) if parent is None: - raise HTTPException(status_code=400, detail="父任务必须属于同一清单") - task = Task(user_id=user.id, **payload.model_dump()) - db.add(task); await db.commit(); await db.refresh(task) + raise HTTPException(status_code=400, detail="父任务必须是同一清单的顶层任务") + data = payload.model_dump(exclude={"tag_ids"}) + task = Task(user_id=user.id, **data) + db.add(task) + await db.flush() + 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 @app.get("/api/v1/tasks", response_model=TaskPage) -async def list_tasks(user: User = Depends(current_user), db: AsyncSession = Depends(get_db)): - items = list((await db.scalars(select(Task).where(Task.user_id == user.id, Task.deleted_at.is_(None), Task.parent_id.is_(None)).order_by(Task.completed, Task.position, Task.created_at))).all()) - return TaskPage(items=items) +async def list_tasks( + q: str | None = None, + cursor: str | None = None, + limit: int = Query(default=50, ge=1, le=100), + user: User = Depends(current_user), + db: AsyncSession = Depends(get_db), +): + query = select(Task).where( + Task.user_id == user.id, Task.deleted_at.is_(None), Task.parent_id.is_(None) + ) + 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, + TaskList.user_id == user.id, + TaskList.name.ilike(pattern), + ) + ) + query = query.where( + or_(Task.title.ilike(pattern), Task.description.ilike(pattern), tag_match, list_match) + ) + if cursor: + created_at, task_id = _decode_cursor(cursor) + query = query.where( + or_(Task.created_at > created_at, (Task.created_at == created_at) & (Task.id > task_id)) + ) + rows = list((await db.scalars(query.order_by(Task.created_at, Task.id).limit(limit + 1))).all()) + has_more = len(rows) > limit + items = rows[:limit] + next_cursor = _encode_cursor(items[-1].created_at, items[-1].id) if has_more else None + return TaskPage(items=items, next_cursor=next_cursor) -@app.patch("/api/v1/tasks/{task_id}", response_model=TaskOut) -async def update_task(task_id: UUID, payload: TaskUpdate, user: User = Depends(current_user), db: AsyncSession = Depends(get_db)): +async def _task_detail(db: AsyncSession, task: Task) -> TaskDetailOut: + tags = list( + ( + await db.scalars( + select(Tag) + .join(TaskTag, TaskTag.tag_id == Tag.id) + .where(TaskTag.task_id == task.id) + .order_by(Tag.name, Tag.id) + ) + ).all() + ) + subtasks = list( + ( + await db.scalars( + select(Task) + .where(Task.parent_id == task.id, Task.deleted_at.is_(None)) + .order_by(Task.position, Task.created_at, Task.id) + ) + ).all() + ) + data = TaskOut.model_validate(task).model_dump() + return TaskDetailOut(**data, tags=tags, subtasks=subtasks) + + +@app.get("/api/v1/tasks/{task_id}", response_model=TaskDetailOut) +async def get_task( + task_id: UUID, + user: User = Depends(current_user), + db: AsyncSession = Depends(get_db), +): + task = await db.scalar( + select(Task).where(Task.id == task_id, Task.user_id == user.id, Task.deleted_at.is_(None)) + ) + if task is None: + raise HTTPException(status_code=404, detail="任务不存在") + return await _task_detail(db, task) + + +@app.patch("/api/v1/tasks/{task_id}", response_model=TaskDetailOut) +async def update_task( + task_id: UUID, + payload: TaskUpdate, + user: User = Depends(current_user), + db: AsyncSession = Depends(get_db), +): 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( + select(Task.parent_id).where(Task.id == task_id, Task.user_id == user.id) + ) + if parent_id: + parent_list = await db.scalar( + select(Task.list_id).where(Task.id == parent_id, Task.user_id == user.id) + ) + if parent_list != data["list_id"]: + raise HTTPException(status_code=400, detail="子任务必须与父任务属于同一清单") data["version"] = Task.version + 1 data["updated_at"] = utcnow() result = await db.execute( @@ -184,27 +485,171 @@ async def update_task(task_id: UUID, payload: TaskUpdate, user: User = Depends(c ) task = result.scalar_one_or_none() if task is None: - exists = await db.scalar( + exists_id = await db.scalar( select(Task.id).where(Task.id == task_id, Task.user_id == user.id, Task.deleted_at.is_(None)) ) - if exists: + 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) + .where(Task.parent_id == task.id, Task.user_id == user.id, Task.deleted_at.is_(None)) + .values(list_id=task.list_id, version=Task.version + 1, updated_at=utcnow()) + ) await db.commit() - return task + return await _task_detail(db, task) @app.delete("/api/v1/tasks/{task_id}", status_code=204) -async def delete_task(task_id: UUID, user: User = Depends(current_user), db: AsyncSession = Depends(get_db)): - task = await db.scalar(select(Task).where(Task.id == task_id, Task.user_id == user.id, Task.deleted_at.is_(None))) +async def delete_task( + task_id: UUID, + user: User = Depends(current_user), + db: AsyncSession = Depends(get_db), +): + task = await db.scalar( + select(Task).where(Task.id == task_id, Task.user_id == user.id, Task.deleted_at.is_(None)) + ) if task is None: raise HTTPException(status_code=404, detail="任务不存在") - task.deleted_at = utcnow() - task.version += 1 + deleted_at = utcnow() + await db.execute( + update(Task) + .where(or_(Task.id == task.id, Task.parent_id == task.id), Task.user_id == user.id) + .values(deleted_at=deleted_at, version=Task.version + 1, updated_at=deleted_at) + ) await db.commit() return Response(status_code=204) +@app.get("/api/v1/trash", response_model=TaskPage) +async def list_trash( + cursor: str | None = None, + limit: int = Query(default=50, ge=1, le=100), + user: User = Depends(current_user), + db: AsyncSession = Depends(get_db), +): + query = select(Task).where( + Task.user_id == user.id, Task.deleted_at.is_not(None), Task.parent_id.is_(None) + ) + if cursor: + created_at, task_id = _decode_cursor(cursor) + query = query.where( + or_(Task.created_at > created_at, (Task.created_at == created_at) & (Task.id > task_id)) + ) + rows = list((await db.scalars(query.order_by(Task.created_at, Task.id).limit(limit + 1))).all()) + has_more = len(rows) > limit + items = rows[:limit] + next_cursor = _encode_cursor(items[-1].created_at, items[-1].id) if has_more else None + return TaskPage(items=items, next_cursor=next_cursor) + + +@app.post("/api/v1/tasks/{task_id}/restore", response_model=TaskDetailOut) +async def restore_task( + task_id: UUID, + user: User = Depends(current_user), + db: AsyncSession = Depends(get_db), +): + task = await db.scalar( + select(Task).where(Task.id == task_id, Task.user_id == user.id, Task.deleted_at.is_not(None)) + ) + if task is None: + raise HTTPException(status_code=404, detail="回收站中不存在该任务") + await _owned_list(db, user.id, task.list_id) + now = utcnow() + await db.execute( + update(Task) + .where(or_(Task.id == task.id, Task.parent_id == task.id), Task.user_id == user.id) + .values(deleted_at=None, version=Task.version + 1, updated_at=now) + ) + await db.commit() + await db.refresh(task) + return await _task_detail(db, task) + + +@app.delete("/api/v1/trash/{task_id}", status_code=204) +async def permanently_delete_task( + task_id: UUID, + user: User = Depends(current_user), + db: AsyncSession = Depends(get_db), +): + task = await db.scalar( + select(Task).where(Task.id == task_id, Task.user_id == user.id, Task.deleted_at.is_not(None)) + ) + 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() + return Response(status_code=204) + + +@app.post("/api/v1/tasks/batch", response_model=BatchResult) +async def batch_update_tasks( + payload: BatchTaskUpdate, + user: User = Depends(current_user), + db: AsyncSession = Depends(get_db), +): + task_ids = list(dict.fromkeys(payload.task_ids)) + tasks = list( + ( + await db.scalars( + select(Task).where( + Task.id.in_(task_ids), Task.user_id == user.id, Task.deleted_at.is_(None) + ) + ) + ).all() + ) + if len(tasks) != len(task_ids): + raise HTTPException(status_code=404, detail="一个或多个任务不存在") + if payload.list_id is not None: + await _owned_list(db, user.id, payload.list_id) + 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"}) + if payload.soft_delete: + changes["deleted_at"] = utcnow() + if changes: + changes["version"] = Task.version + 1 + changes["updated_at"] = utcnow() + await db.execute( + update(Task) + .where(Task.id.in_(task_ids), Task.user_id == user.id, Task.deleted_at.is_(None)) + .values(**changes) + ) + if payload.list_id is not None: + parent_ids = [task.id for task in tasks if task.parent_id is None] + if parent_ids: + await db.execute( + update(Task) + .where( + Task.parent_id.in_(parent_ids), + Task.user_id == user.id, + Task.deleted_at.is_(None), + ) + .values( + list_id=payload.list_id, + version=Task.version + 1, + 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)) + + static_dir = Path(__file__).parent / "static" if static_dir.exists(): app.mount("/assets", StaticFiles(directory=static_dir / "assets"), name="assets") diff --git a/backend/models.py b/backend/models.py index 02d259f..4998c3d 100644 --- a/backend/models.py +++ b/backend/models.py @@ -1,7 +1,7 @@ from datetime import UTC, datetime from uuid import UUID -from sqlalchemy import Boolean, DateTime, ForeignKey, Integer, String, Text +from sqlalchemy import Boolean, DateTime, ForeignKey, Integer, String, Text, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column from uuid_utils import uuid7 @@ -47,6 +47,7 @@ class Folder(Base): name: Mapped[str] = mapped_column(String(120)) position: Mapped[int] = mapped_column(Integer, default=0) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=utcnow) + deleted_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) class TaskList(Base): @@ -58,6 +59,23 @@ class TaskList(Base): is_inbox: Mapped[bool] = mapped_column(Boolean, default=False) position: Mapped[int] = mapped_column(Integer, default=0) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=utcnow) + 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): diff --git a/backend/schemas.py b/backend/schemas.py index 47fca81..a41c934 100644 --- a/backend/schemas.py +++ b/backend/schemas.py @@ -1,7 +1,7 @@ from datetime import datetime from uuid import UUID -from pydantic import BaseModel, ConfigDict, Field +from pydantic import BaseModel, ConfigDict, Field, model_validator class InitializeRequest(BaseModel): @@ -20,10 +20,14 @@ class UserOut(BaseModel): username: str -class FolderCreate(BaseModel): +class NameUpdate(BaseModel): name: str = Field(min_length=1, max_length=120) +class FolderCreate(NameUpdate): + pass + + class FolderOut(BaseModel): model_config = ConfigDict(from_attributes=True) id: UUID @@ -43,6 +47,18 @@ 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) list_id: UUID @@ -50,16 +66,26 @@ 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): - title: str = Field(default=None, min_length=1, max_length=500) - description: str = Field(default=None) + title: str | None = Field(default=None, min_length=1, max_length=500) + description: str | None = None priority: int | None = Field(default=None, ge=0, le=3) 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") + def reject_null_non_nullable_fields(self): + for field in ("title", "description", "priority", "completed", "list_id"): + if field in self.model_fields_set and getattr(self, field) is None: + raise ValueError(f"{field} cannot be null") + return self + class TaskOut(BaseModel): model_config = ConfigDict(from_attributes=True) @@ -74,6 +100,33 @@ class TaskOut(BaseModel): version: int +class TaskDetailOut(TaskOut): + tags: list[TagOut] = Field(default_factory=list) + subtasks: list[TaskOut] = Field(default_factory=list) + + class TaskPage(BaseModel): items: list[TaskOut] next_cursor: str | None = None + + +class BatchTaskUpdate(BaseModel): + task_ids: list[UUID] = Field(min_length=1) + 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"} + if not self.model_fields_set.intersection(operations): + raise ValueError("at least one batch operation is required") + if self.soft_delete is False: + raise ValueError("soft_delete can only be true") + return self + + +class BatchResult(BaseModel): + updated: int diff --git a/backend/static/assets/index-BBQtE9Jy.css b/backend/static/assets/index-BBQtE9Jy.css deleted file mode 100644 index e335154..0000000 --- a/backend/static/assets/index-BBQtE9Jy.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:#29251f;--accent:#f15a29;--line:#e8dfcf;background:#f8f3e8;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,sans-serif}*{box-sizing:border-box}body{margin:0}button,input{font:inherit}.center,.auth-shell{place-items:center;min-height:100vh;display:grid}.auth-card{border:1px solid var(--line);background:#fffdf7;border-radius:12px;gap:14px;width:min(390px,90vw);padding:36px;display:grid;box-shadow:0 12px 40px #5d4b3320}.brand{letter-spacing:-3px;font-size:38px;font-weight:800}.brand span{color:var(--accent)}.brand.small{padding:22px;font-size:28px}.auth-card input,.quick{border:1px solid var(--line);background:#fff;border-radius:10px}.auth-card input{padding:12px}.auth-card button,.quick button{background:var(--accent);color:#fff;border:0;border-radius:8px;padding:11px 16px;font-weight:650}.auth-card small{color:#c0341d}.shell{background:#fffdf8;grid-template-columns:230px minmax(400px,1fr) 310px;height:100vh;display:grid}.shell>aside{border-right:1px solid var(--line);background:#f8f3e8;flex-direction:column;display:flex}.shell nav,.lists{gap:3px;padding:8px 12px;display:grid}.shell nav button,.lists button,.settings{color:#625c52;text-align:left;background:0 0;border:0;border-radius:9px;align-items:center;gap:10px;padding:10px 12px;display:flex}.shell nav svg,.settings svg{width:18px}.shell nav .active{color:#b73d18;background:#f3dfd2;font-weight:650}.lists label{color:#9a9184;padding:15px 12px 5px;font-size:12px}.lists i{background:#df9c61;border-radius:3px;width:9px;height:9px}.settings{margin:auto 12px 15px}main{min-width:0;padding:34px 38px;overflow:auto}header{justify-content:space-between;align-items:center;display:flex}header p{color:#9a9184;margin:0;font-size:13px}h1{margin:4px 0 25px;font-size:28px}.search{border:1px solid var(--line);color:#777065;background:#faf7f0;border-radius:10px;gap:8px;padding:8px 12px;display:flex}.search svg{width:16px}.quick{align-items:center;padding:6px 7px 6px 13px;display:flex;box-shadow:0 4px 18px #5d4b330d}.quick svg{color:var(--accent);width:20px}.quick input{background:0 0;border:0;outline:0;flex:1;padding:10px}.task-list{border-top:1px solid var(--line);margin-top:22px}article{border-bottom:1px solid var(--line);align-items:center;gap:12px;min-height:54px;transition:all .2s;display:flex}article.done{opacity:.45}article.done strong{text-decoration:line-through}.check{color:#fff;background:#fff;border:1.5px solid #b8ad9e;border-radius:50%;width:20px;height:20px;padding:2px}.done .check{background:var(--accent);border-color:var(--accent)}.check svg{width:13px;height:13px}.priority{color:var(--accent);margin-left:auto;font-size:12px}.empty{color:#a59b8d;place-items:center;gap:9px;padding:90px 20px;display:grid}.empty svg{stroke-width:1px;width:42px;height:42px}.empty b{color:#6e675d}.detail{padding:28px 22px;border-left:1px solid var(--line)!important;border-right:0!important}.detail>span{color:#8f867a;font-size:13px}.paper{background:#fffaf0;border:1px dashed #dfd2be;border-radius:12px;margin-top:22px;padding:22px}.paper p{color:#948a7c;font-size:14px;line-height:1.6}.bottom,.fab,.mobile-menu{display:none}@media (width<=800px){.shell{height:auto;min-height:100vh;display:block}.shell>aside,.detail{display:none}main{padding:24px 18px 100px}.search{font-size:0}.bottom{border-top:1px solid var(--line);padding:8px 0 max(8px,env(safe-area-inset-bottom));background:#fffdf8;justify-content:space-around;display:flex;position:fixed;bottom:0;left:0;right:0}.bottom button{color:#766e62;background:0 0;border:0;place-items:center;gap:2px;font-size:11px;display:grid}.bottom svg{width:20px}.fab{background:var(--accent);color:#fff;border:0;border-radius:50%;place-items:center;width:52px;height:52px;display:grid;position:fixed;bottom:78px;right:20px;box-shadow:0 8px 20px #f15a2950}.mobile-menu{background:0 0;border:0;margin-right:12px;padding:0;display:block}header>div{margin-right:auto}.quick button{display:none}} diff --git a/backend/static/assets/index-BHdY9q3o.js b/backend/static/assets/index-BHdY9q3o.js deleted file mode 100644 index 32876ac..0000000 --- a/backend/static/assets/index-BHdY9q3o.js +++ /dev/null @@ -1,2 +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,ee=e(`,key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted`),te=e=>{let t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},ne=/-\w/g,T=te(e=>e.replace(ne,e=>e.slice(1).toUpperCase())),re=/\B([A-Z])/g,E=te(e=>e.replace(re,`-$1`).toLowerCase()),ie=te(e=>e.charAt(0).toUpperCase()+e.slice(1)),ae=te(e=>e?`on${ie(e)}`:``),D=(e,t)=>!Object.is(e,t),oe=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},se=e=>{let t=parseFloat(e);return isNaN(t)?e:t},ce,le=()=>ce||=typeof globalThis<`u`?globalThis:typeof self<`u`?self:typeof window<`u`?window:typeof global<`u`?global:{};function ue(e){if(d(e)){let t={};for(let n=0;n{if(e){let n=e.split(fe);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function k(e){let t=``;if(g(e))t=e;else if(d(e))for(let n=0;n!!(e&&e.__v_isRef===!0),A=e=>g(e)?e:e==null?``:d(e)||v(e)&&(e.toString===b||!h(e.toString))?xe(e)?A(e.value):JSON.stringify(e,Se,2):String(e),Se=(e,t)=>xe(t)?Se(e,t.value):f(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((e,[t,n],r)=>(e[Ce(t,r)+` =>`]=n,e),{})}:p(t)?{[`Set(${t.size})`]:[...t.values()].map(e=>Ce(e))}:_(t)?Ce(t):v(t)&&!d(t)&&!C(t)?String(t):t,Ce=(e,t=``)=>_(e)?`Symbol(${e.description??t})`:e,j,we=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&&j&&(j.active?(this.parent=j,this.index=(j.scopes||(j.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(j===this)j=this.prevScope;else{let e=j;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(Ae){let e=Ae;for(Ae=void 0;e;){let t=e.next;e.next=void 0,e.flags&=-9,e=t}}let e;for(;ke;){let t=ke;for(ke=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 Pe(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Fe(e){let t,n=e.depsTail,r=n;for(;r;){let e=r.prevDep;r.version===-1?(r===n&&(n=e),Re(r),ze(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=e}e.deps=t,e.depsTail=n}function Ie(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Le(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Le(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===We)||(e.globalVersion=We,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Ie(e))))return;e.flags|=2;let t=e.dep,n=M,r=N;M=e,N=!0;try{Pe(e);let n=e.fn(e._value);(t.version===0||D(n,e._value))&&(e.flags|=128,e._value=n,t.version++)}catch(e){throw t.version++,e}finally{M=n,N=r,Fe(e),e.flags&=-3}}function Re(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)Re(e,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function ze(e){let{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}var N=!0,Be=[];function Ve(){Be.push(N),N=!1}function He(){let e=Be.pop();N=e===void 0||e}function Ue(e){let{cleanup:t}=e;if(e.cleanup=void 0,t){let e=M;M=void 0;try{t()}finally{M=e}}}var We=0,Ge=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}},Ke=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(!M||!N||M===this.computed)return;let t=this.activeLink;if(t===void 0||t.sub!==M)t=this.activeLink=new Ge(M,this),M.deps?(t.prevDep=M.depsTail,M.depsTail.nextDep=t,M.depsTail=t):M.deps=M.depsTail=t,qe(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=M.depsTail,t.nextDep=void 0,M.depsTail.nextDep=t,M.depsTail=t,M.deps===t&&(M.deps=e)}return t}trigger(e){this.version++,We++,this.notify(e)}notify(e){Me();try{for(let e=this.subs;e;e=e.prevSub)e.sub.notify()&&e.sub.dep.notify()}finally{Ne()}}};function qe(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)qe(e)}let n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}var Je=new WeakMap,Ye=Symbol(``),Xe=Symbol(``),Ze=Symbol(``);function P(e,t,n){if(N&&M){let t=Je.get(e);t||Je.set(e,t=new Map);let r=t.get(n);r||(t.set(n,r=new Ke),r.map=t,r.key=n),r.track()}}function Qe(e,t,n,r,i,a){let o=Je.get(e);if(!o){We++;return}let s=e=>{e&&e.trigger()};if(Me(),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===Ze||!_(n)&&n>=e)&&s(t)})}else switch((n!==void 0||o.has(void 0))&&s(o.get(n)),a&&s(o.get(Ze)),t){case`add`:i?a&&s(o.get(`length`)):(s(o.get(Ye)),f(e)&&s(o.get(Xe)));break;case`delete`:i||(s(o.get(Ye)),f(e)&&s(o.get(Xe)));break;case`set`:f(e)&&s(o.get(Ye))}}Ne()}function $e(e){let t=I(e);return t===e?t:(P(t,`iterate`,Ze),F(e)?t:t.map(L))}function et(e){return P(e=I(e),`iterate`,Ze),e}function tt(e,t){return Lt(e)?Bt(It(e)?L(t):t):L(t)}var nt={__proto__:null,[Symbol.iterator](){return rt(this,Symbol.iterator,e=>tt(this,e))},concat(...e){return $e(this).concat(...e.map(e=>d(e)?$e(e):e))},entries(){return rt(this,`entries`,e=>(e[1]=tt(this,e[1]),e))},every(e,t){return at(this,`every`,e,t,void 0,arguments)},filter(e,t){return at(this,`filter`,e,t,e=>e.map(e=>tt(this,e)),arguments)},find(e,t){return at(this,`find`,e,t,e=>tt(this,e),arguments)},findIndex(e,t){return at(this,`findIndex`,e,t,void 0,arguments)},findLast(e,t){return at(this,`findLast`,e,t,e=>tt(this,e),arguments)},findLastIndex(e,t){return at(this,`findLastIndex`,e,t,void 0,arguments)},forEach(e,t){return at(this,`forEach`,e,t,void 0,arguments)},includes(...e){return st(this,`includes`,e)},indexOf(...e){return st(this,`indexOf`,e)},join(e){return $e(this).join(e)},lastIndexOf(...e){return st(this,`lastIndexOf`,e)},map(e,t){return at(this,`map`,e,t,void 0,arguments)},pop(){return ct(this,`pop`)},push(...e){return ct(this,`push`,e)},reduce(e,...t){return ot(this,`reduce`,e,t)},reduceRight(e,...t){return ot(this,`reduceRight`,e,t)},shift(){return ct(this,`shift`)},some(e,t){return at(this,`some`,e,t,void 0,arguments)},splice(...e){return ct(this,`splice`,e)},toReversed(){return $e(this).toReversed()},toSorted(e){return $e(this).toSorted(e)},toSpliced(...e){return $e(this).toSpliced(...e)},unshift(...e){return ct(this,`unshift`,e)},values(){return rt(this,`values`,e=>tt(this,e))}};function rt(e,t,n){let r=et(e),i=r[t]();return r!==e&&!F(e)&&(i._next=i.next,i.next=()=>{let e=i._next();return e.done||(e.value=n(e.value)),e}),i}var it=Array.prototype;function at(e,t,n,r,i,a){let o=et(e),s=o!==e&&!F(e),c=o[t];if(c!==it[t]){let t=c.apply(e,a);return s?L(t):t}let l=n;o!==e&&(s?l=function(t,r){return n.call(this,tt(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 ot(e,t,n,r){let i=et(e),a=i!==e&&!F(e),o=n,s=!1;i!==e&&(a?(s=r.length===0,o=function(t,r,i){return s&&(s=!1,t=tt(e,t)),n.call(this,t,tt(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?tt(e,c):c}function st(e,t,n){let r=I(e);P(r,`iterate`,Ze);let i=r[t](...n);return(i===-1||i===!1)&&Rt(n[0])?(n[0]=I(n[0]),r[t](...n)):i}function ct(e,t,n=[]){Ve(),Me();let r=I(e)[t].apply(e,n);return Ne(),He(),r}var lt=e(`__proto__,__v_isRef,__isVue`),ut=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!==`arguments`&&e!==`caller`).map(e=>Symbol[e]).filter(_));function dt(e){_(e)||(e=String(e));let t=I(this);return P(t,`has`,e),t.hasOwnProperty(e)}var ft=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?At:kt:i?Ot:Dt).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;let a=d(e);if(!r){let e;if(a&&(e=nt[t]))return e;if(t===`hasOwnProperty`)return dt}let o=Reflect.get(e,t,R(e)?e:n);if((_(t)?ut.has(t):lt(t))||(r||P(e,`get`,t),i))return o;if(R(o)){let e=a&&w(t)?o:o.value;return r&&v(e)?Pt(e):e}return v(o)?r?Pt(o):Mt(o):o}},pt=class extends ft{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=Lt(i);if(!F(n)&&!Lt(n)&&(i=I(i),n=I(n)),!a&&R(i)&&!R(n))return e||(i.value=n),!0}let o=a?Number(t)e,yt=e=>Reflect.getPrototypeOf(e);function bt(e,t,n){return function(...r){let i=this.__v_raw,a=I(i),o=f(a),c=e===`entries`||e===Symbol.iterator&&o,l=e===`keys`&&o,u=i[e](...r),d=n?vt:t?Bt:L;return!t&&P(a,`iterate`,l?Xe:Ye),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 xt(e){return function(...t){return e===`delete`?!1:e===`clear`?void 0:this}}function St(e,t){let n={get(n){let r=this.__v_raw,i=I(r),a=I(n);e||(D(n,a)&&P(i,`get`,n),P(i,`get`,a));let{has:o}=yt(i),s=t?vt:e?Bt:L;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&&P(I(t),`iterate`,Ye),t.size},has(t){let n=this.__v_raw,r=I(n),i=I(t);return e||(D(t,i)&&P(r,`has`,t),P(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=I(a),s=t?vt:e?Bt:L;return!e&&P(o,`iterate`,Ye),a.forEach((e,t)=>n.call(r,s(e),s(t),i))}};return s(n,e?{add:xt(`add`),set:xt(`set`),delete:xt(`delete`),clear:xt(`clear`)}:{add(e){let n=I(this),r=yt(n),i=I(e),a=!t&&!F(e)&&!Lt(e)?i:e;return r.has.call(n,a)||D(e,a)&&r.has.call(n,e)||D(i,a)&&r.has.call(n,i)||(n.add(a),Qe(n,`add`,a,a)),this},set(e,n){!t&&!F(n)&&!Lt(n)&&(n=I(n));let r=I(this),{has:i,get:a}=yt(r),o=i.call(r,e);o||=(e=I(e),i.call(r,e));let s=a.call(r,e);return r.set(e,n),o?D(n,s)&&Qe(r,`set`,e,n,s):Qe(r,`add`,e,n),this},delete(e){let t=I(this),{has:n,get:r}=yt(t),i=n.call(t,e);i||=(e=I(e),n.call(t,e));let a=r?r.call(t,e):void 0,o=t.delete(e);return i&&Qe(t,`delete`,e,void 0,a),o},clear(){let e=I(this),t=e.size!==0,n=e.clear();return t&&Qe(e,`clear`,void 0,void 0,void 0),n}}),[`keys`,`values`,`entries`,Symbol.iterator].forEach(r=>{n[r]=bt(r,e,t)}),n}function Ct(e,t){let n=St(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 wt={get:Ct(!1,!1)},Tt={get:Ct(!1,!0)},Et={get:Ct(!0,!1)},Dt=new WeakMap,Ot=new WeakMap,kt=new WeakMap,At=new WeakMap;function jt(e){switch(e){case`Object`:case`Array`:return 1;case`Map`:case`Set`:case`WeakMap`:case`WeakSet`:return 2;default:return 0}}function Mt(e){return Lt(e)?e:Ft(e,!1,ht,wt,Dt)}function Nt(e){return Ft(e,!1,_t,Tt,Ot)}function Pt(e){return Ft(e,!0,gt,Et,kt)}function Ft(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=jt(S(e));if(o===0)return e;let s=new Proxy(e,o===2?r:n);return i.set(e,s),s}function It(e){return Lt(e)?It(e.__v_raw):!!(e&&e.__v_isReactive)}function Lt(e){return!!(e&&e.__v_isReadonly)}function F(e){return!!(e&&e.__v_isShallow)}function Rt(e){return e?!!e.__v_raw:!1}function I(e){let t=e&&e.__v_raw;return t?I(t):e}function zt(e){return!u(e,`__v_skip`)&&Object.isExtensible(e)&&O(e,`__v_skip`,!0),e}var L=e=>v(e)?Mt(e):e,Bt=e=>v(e)?Pt(e):e;function R(e){return e?e.__v_isRef===!0:!1}function Vt(e){return Ht(e,!1)}function Ht(e,t){return R(e)?e:new Ut(e,t)}var Ut=class{constructor(e,t){this.dep=new Ke,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=t?e:I(e),this._value=t?e:L(e),this.__v_isShallow=t}get value(){return this.dep.track(),this._value}set value(e){let t=this._rawValue,n=this.__v_isShallow||F(e)||Lt(e);e=n?e:I(e),D(e,t)&&(this._rawValue=e,this._value=n?e:L(e),this.dep.trigger())}};function z(e){return R(e)?e.value:e}var Wt={get:(e,t,n)=>t===`__v_raw`?e:z(Reflect.get(e,t,n)),set:(e,t,n,r)=>{let i=e[t];return R(i)&&!R(n)?(i.value=n,!0):Reflect.set(e,t,n,r)}};function Gt(e){return It(e)?e:new Proxy(e,Wt)}var Kt=class{constructor(e,t,n){this.fn=e,this.setter=t,this._value=void 0,this.dep=new Ke(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=We-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!t,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&M!==this)return je(this,!0),!0}get value(){let e=this.dep.track();return Le(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}};function qt(e,t,n=!1){let r,i;return h(e)?r=e:(r=e.get,i=e.set),new Kt(r,i,n)}var Jt={},Yt=new WeakMap,Xt=void 0;function Zt(e,t=!1,n=Xt){if(n){let t=Yt.get(n);t||Yt.set(n,t=[]),t.push(e)}}function Qt(e,n,i=t){let{immediate:a,deep:o,once:s,scheduler:l,augmentJob:u,call:f}=i,p=e=>o?e:F(e)||o===!1||o===0?$t(e,1):$t(e),m,g,_,v,y=!1,b=!1;if(R(e)?(g=()=>e.value,y=F(e)):It(e)?(g=()=>p(e),y=!0):d(e)?(b=!0,y=e.some(e=>It(e)||F(e)),g=()=>e.map(e=>{if(R(e))return e.value;if(It(e))return p(e);if(h(e))return f?f(e,2):e()})):g=h(e)?n?f?()=>f(e,2):e:()=>{if(_){Ve();try{_()}finally{He()}}let t=Xt;Xt=m;try{return f?f(e,3,[v]):e(v)}finally{Xt=t}}:r,n&&o){let e=g,t=o===!0?1/0:o;g=()=>$t(e(),t)}let x=Te(),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(Jt):Jt,w=e=>{if(m.flags&1&&(m.dirty||e)){if(n){let t=m.run();if(e||o||y||(b?t.some((e,t)=>D(e,C[t])):D(t,C))){_&&_();let e=Xt;Xt=m;try{let e=[t,C===Jt?void 0:b&&C[0]===Jt?[]:C,v];C=t,f?f(n,3,e):n(...e)}finally{Xt=e}}}else m.run()}};return u&&u(w),m=new De(g),m.scheduler=l?()=>l(w,!1):w,v=e=>Zt(e,!1,m),_=m.onStop=()=>{let e=Yt.get(m);if(e){if(f)f(e,4);else for(let t of e)t();Yt.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 $t(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--,R(e))$t(e.value,t,n);else if(d(e))for(let r=0;r{$t(e,t,n)});else if(C(e)){for(let r in e)$t(e[r],t,n);for(let r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&$t(e[r],t,n)}return e}function en(e,t,n,r){try{return r?e(...r):e()}catch(e){tn(e,t,n)}}function B(e,t,n,r){if(h(e)){let i=en(e,t,n,r);return i&&y(i)&&i.catch(e=>{tn(e,t,n)}),i}if(d(e)){let i=[];for(let a=0;a>>1,i=V[r],a=gn(i);a=gn(n)?V.push(e):V.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(H=0;H{r._d&&Ei(-1);let i=yn(t),a=Ci.length,o;try{o=e(...n)}finally{for(let e=Ci.length;e>a;e--)wi();yn(i),r._d&&Ei(1)}return o};return r._n=!0,r._c=!0,r._d=!0,r}function xn(e,n){if(U===null)return e;let r=ia(U),i=e.dirs||=[];for(let e=0;e1)return n&&h(t)?t.call(r&&r.proxy):t}}var Tn=Symbol.for(`v-scx`),En=()=>wn(Tn);function Dn(e,t,n){return On(e,t,n)}function On(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(Zi){if(c===`sync`){let e=En();f=e.__watcherHandles||=[]}else if(!d){let e=()=>{};return e.stop=r,e.resume=r,e.pause=r,e}}let p=$;u.call=(e,t,n)=>B(e,p,t,n);let m=!1;c===`post`?u.scheduler=e=>{G(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=Qt(e,n,u);return Zi&&(f?f.push(h):d&&h()),h}function kn(e,t,n){let r=this.proxy,i=g(e)?e.includes(`.`)?An(r,e):()=>r[e]:e.bind(r,r),a;h(t)?a=t:(a=t.handler,n=t);let o=Ji(this),s=On(i,a.bind(r),n);return o(),s}function An(e,t){let n=t.split(`.`);return()=>{let t=e;for(let e=0;ee.__isTeleport,Nn=Symbol(`_leaveCb`);function Pn(e){let t=e[0];if(e.length>1){for(let n of e)if(n.type!==xi){t=n;break}}return t}function Fn(e){if(!Wn(e))return Mn(e.type)&&e.children?Pn(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 In(e,t){if(e.shapeFlag&6&&e.component){e.transition=t;let n=e.component.subTree;In(Mn(n.type)&&Fn(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 Ln(e,t){return h(e)?s({name:e.name},t,{setup:e}):e}function Rn(e){e.ids=[e.ids[0]+e.ids[2]+++`-`,0,0]}function zn(e,t){let n;return!!((n=Object.getOwnPropertyDescriptor(e,t))&&!n.configurable)}var Bn=new WeakMap;function Vn(e,n,r,a,o=!1){if(d(e)){e.forEach((e,t)=>Vn(e,n&&(d(n)?n[t]:n),r,a,o));return}if(Un(a)&&!o){a.shapeFlag&512&&a.type.__asyncResolved&&a.component.subTree.component&&Vn(e,n,r,a.component.subTree);return}let s=a.shapeFlag&4?ia(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=I(v),b=v===t?i:e=>!zn(_,e)&&u(y,e),x=(e,t)=>!(t&&zn(_,t));if(m!=null&&m!==p){if(Hn(n),g(m))_[m]=null,b(m)&&(v[m]=null);else if(R(m)){let e=n;x(m,e.k)&&(m.value=null),e.k&&(_[e.k]=null)}}if(h(p))en(p,f,12,[l,_]);else{let t=g(p),n=R(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(),Bn.delete(e)};t.id=-1,Bn.set(e,t),G(t,r)}else Hn(e),i()}}}function Hn(e){let t=Bn.get(e);t&&(t.flags|=8,Bn.delete(e))}le().requestIdleCallback,le().cancelIdleCallback;var Un=e=>!!e.type.__asyncLoader,Wn=e=>e.type.__isKeepAlive;function Gn(e,t){qn(e,`a`,t)}function Kn(e,t){qn(e,`da`,t)}function qn(e,t,n=$){let r=e.__wdc||=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()};if(Yn(t,r,n),n){let e=n.parent;for(;e&&e.parent;)Wn(e.parent.vnode)&&Jn(r,t,n,e),e=e.parent}}function Jn(e,t,n,r){let i=Yn(t,e,r,!0);nr(()=>{c(r[t],i)},n)}function Yn(e,t,n=$,r=!1){if(n){let i=n[e]||(n[e]=[]),a=t.__weh||=(...r)=>{Ve();let i=Ji(n),a=B(t,n,e,r);return i(),He(),a};return r?i.unshift(a):i.push(a),a}}var Xn=e=>(t,n=$)=>{(!Zi||e===`sp`)&&Yn(e,(...e)=>t(...e),n)},Zn=Xn(`bm`),Qn=Xn(`m`),$n=Xn(`bu`),er=Xn(`u`),tr=Xn(`bum`),nr=Xn(`um`),rr=Xn(`sp`),ir=Xn(`rtg`),ar=Xn(`rtc`);function or(e,t=$){Yn(`ec`,e,t)}var sr=Symbol.for(`v-ndc`);function cr(e,t,n,r){let i,a=n&&n[r],o=d(e);if(o||g(e)){let n=o&&It(e),r=!1,s=!1;n&&(r=!F(e),s=Lt(e),e=et(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?Xi(e)?ia(e):lr(e.parent):null,ur=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=>lr(e.parent),$root:e=>lr(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>yr(e),$forceUpdate:e=>e.f||=()=>{dn(e.update)},$nextTick:e=>e.n||=ln.bind(e.proxy),$watch:e=>kn.bind(e)}),dr=(e,n)=>e!==t&&!e.__isScriptSetup&&u(e,n),fr={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(dr(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 mr&&(s[n]=0)}let d=ur[n],f,p;if(d)return n===`$attrs`&&P(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 dr(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)||dr(n,c)||u(o,c)||u(i,c)||u(ur,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 pr(e){return d(e)?e.reduce((e,t)=>(e[t]=null,e),{}):e}var mr=!0;function hr(e){let t=yr(e),n=e.proxy,i=e.ctx;mr=!1,t.beforeCreate&&_r(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:ee,renderTracked:te,renderTriggered:ne,errorCaptured:T,serverPrefetch:re,expose:E,inheritAttrs:ie,components:ae,directives:D,filters:oe}=t;if(u&&gr(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=Mt(t))}if(mr=!0,o)for(let e in o){let t=o[e],a=oa({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)vr(c[e],i,n,e);if(l){let e=h(l)?l.call(n):l;Reflect.ownKeys(e).forEach(t=>{Cn(t,e[t])})}f&&_r(f,e,`c`);function O(e,t){d(t)?t.forEach(t=>e(t.bind(n))):t&&e(t.bind(n))}if(O(Zn,p),O(Qn,m),O($n,g),O(er,_),O(Gn,y),O(Kn,b),O(or,T),O(ar,te),O(ir,ne),O(tr,S),O(nr,w),O(rr,re),d(E)){if(E.length){let t=e.exposed||={};E.forEach(e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t,enumerable:!0})})}else e.exposed||={}}ee&&e.render===r&&(e.render=ee),ie!=null&&(e.inheritAttrs=ie),ae&&(e.components=ae),D&&(e.directives=D),re&&Rn(e)}function gr(e,t,n=r){d(e)&&(e=wr(e));for(let n in e){let r=e[n],i;i=v(r)?`default`in r?wn(r.from||n,r.default,!0):wn(r.from||n):wn(r),R(i)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>i.value,set:e=>i.value=e}):t[n]=i}}function _r(e,t,n){B(d(e)?e.map(e=>e.bind(t.proxy)):e.bind(t.proxy),t,n)}function vr(e,t,n,r){let i=r.includes(`.`)?An(n,r):()=>n[r];if(g(e)){let n=t[e];h(n)&&Dn(i,n)}else if(h(e))Dn(i,e.bind(n));else if(v(e)){if(d(e))e.forEach(e=>vr(e,t,n,r));else{let r=h(e.handler)?e.handler.bind(n):t[e.handler];h(r)&&Dn(i,r,e)}}}function yr(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=>br(c,e,o,!0)),br(c,t,o)),v(t)&&a.set(t,c),c}function br(e,t,n,r=!1){let{mixins:i,extends:a}=t;a&&br(e,a,n,!0),i&&i.forEach(t=>br(e,t,n,!0));for(let i in t)if(!(r&&i===`expose`)){let r=xr[i]||n&&n[i];e[i]=r?r(e[i],t[i]):t[i]}return e}var xr={data:Sr,props:Er,emits:Er,methods:Tr,computed:Tr,beforeCreate:W,created:W,beforeMount:W,mounted:W,beforeUpdate:W,updated:W,beforeDestroy:W,beforeUnmount:W,destroyed:W,unmounted:W,activated:W,deactivated:W,errorCaptured:W,serverPrefetch:W,components:Tr,directives:Tr,watch:Dr,provide:Sr,inject:Cr};function Sr(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 Cr(e,t){return Tr(wr(e),wr(t))}function wr(e){if(d(e)){let t={};for(let n=0;nt===`modelValue`||t===`model-value`?e.modelModifiers:e[`${t}Modifiers`]||e[`${T(t)}Modifiers`]||e[`${E(t)}Modifiers`];function Nr(e,n,...r){if(e.isUnmounted)return;let i=e.vnode.props||t,a=r,o=n.startsWith(`update:`),s=o&&Mr(i,n.slice(7));s&&(s.trim&&(a=r.map(e=>g(e)?e.trim():e)),s.number&&(a=a.map(se)));let c,l=i[c=ae(n)]||i[c=ae(T(n))];!l&&o&&(l=i[c=ae(E(n))]),l&&B(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,B(u,e,6,a)}}var Pr=new WeakMap;function Fr(e,t,n=!1){let r=n?Pr: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=Fr(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 Ir(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,E(t))||u(e,t))}function Lr(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,_=yn(e),v,y;try{if(n.shapeFlag&4){let e=i||r,t=e;v=Li(u.call(t,e,d,f,m,p,h)),y=c}else{let e=t;v=Li(e.length>1?e(f,{attrs:c,slots:s,emit:l}):e(f,null)),y=t.props?c:Rr(c)}}catch(t){Ci.length=0,tn(t,e,1),v=Z(xi)}let b=v;if(y&&g!==!1){let e=Object.keys(y),{shapeFlag:t}=b;e.length&&t&7&&(a&&e.some(o)&&(y=zr(y,a)),b=Fi(b,y,!1,!0))}return n.dirs&&(b=Fi(b,null,!1,!0),b.dirs=b.dirs?b.dirs.concat(n.dirs):n.dirs),n.transition&&In(Mn(b.type)&&Fn(b)||b,n.transition),v=b,yn(_),v}var Rr=e=>{let t;for(let n in e)(n===`class`||n===`style`||a(n))&&((t||={})[n]=e[n]);return t},zr=(e,t)=>{let n={};for(let r in e)(!o(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function Br(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?Vr(r,o,l):!!o;if(c&8){let e=t.dynamicProps;for(let t=0;tObject.create(Wr),Kr=e=>Object.getPrototypeOf(e)===Wr;function qr(e,t,n,r=!1){let i={},a=Gr();e.propsDefaults=Object.create(null),Yr(e,t,i,a);for(let t in e.propsOptions[0])t in i||(i[t]=void 0);e.props=n?r?i:Nt(i):e.type.props?i:a,e.attrs=a}function Jr(e,t,n,r){let{props:i,attrs:a,vnode:{patchFlag:o}}=e,s=I(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]=Qr(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`,ti=e=>d(e)?e.map(Li):[Li(e)],ni=(e,t,n)=>{if(t._n)return t;let r=bn((...e)=>ti(t(...e)),n);return r._c=!1,r},ri=(e,t,n)=>{let r=e._ctx;for(let n in e){if(ei(n))continue;let i=e[n];if(h(i))t[n]=ni(n,i,r);else if(i!=null){let e=ti(i);t[n]=()=>e}}},ii=(e,t)=>{let n=ti(t);e.slots.default=()=>n},ai=(e,t,n)=>{for(let r in t)(n||!ei(r))&&(e[r]=t[r])},oi=(e,t,n)=>{let r=e.slots=Gr();if(e.vnode.shapeFlag&32){let e=t._;e?(ai(r,t,n),n&&O(r,`_`,e,!0)):ri(t,r)}else t&&ii(e,t)},si=(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:ai(a,n,r):(o=!n.$stable,ri(n,a)),s=n}else n&&(ii(e,n),s={default:1});if(o)for(let e in a)!ei(e)&&s[e]==null&&delete a[e]},G=yi;function ci(e){return li(e)}function li(e,i){let a=le();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&&!Ai(e,t)&&(r=ye(e),k(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 bi:y(e,t,n,r);break;case xi:b(e,t,n,r);break;case Si:e??x(t,n,r,o);break;case K:ae(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?D(e,t,n,r,i,a,o,s,c):(d&64||d&128)&&l.process(e,t,n,r,i,a,o,s,c,A)}u!=null&&i?Vn(u,e&&e.ref,a,t||e,!t):u==null&&e&&e.ref!=null&&Vn(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)te(t,n,r,i,a,o,s,c);else{let n=e.el&&e.el._isVueCE?e.el:null;try{n&&n._beginPatch(),re(e,t,i,a,o,s,c)}finally{n&&n._endPatch()}}},te=(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&&T(e.children,d,null,r,i,ui(e,a),s,u),_&&Sn(e,null,r,`created`),ne(d,e,e.scopeId,s,r),m){for(let e in m)e!==`value`&&!ee(e)&&c(d,e,null,m[e],a,r);`value`in m&&c(d,`value`,null,m.value,a),(f=m.onVnodeBeforeMount)&&Vi(f,r,e)}_&&Sn(e,null,r,`beforeMount`);let v=fi(i,g);v&&g.beforeEnter(d),o(d,t,n),((f=m&&m.onVnodeMounted)||v||_)&&G(()=>{try{f&&Vi(f,r,e),v&&g.enter(d),_&&Sn(e,null,r,`mounted`)}finally{}},i)},ne=(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&&di(r,!1),(g=h.onVnodeBeforeUpdate)&&Vi(g,r,n,e),f&&Sn(n,e,r,`beforeUpdate`),r&&di(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?E(e.dynamicChildren,d,l,r,i,ui(n,a),o):s||de(e,n,l,null,r,i,ui(n,a),o,!1),u>0){if(u&16)ie(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&&Vi(g,r,n,e),f&&Sn(n,e,r,`updated`)},i)},E=(e,t,n,r,i,a,o)=>{for(let s=0;s{if(n!==r){if(n!==t)for(let t in n)!ee(t)&&!(t in r)&&c(e,t,n[t],null,a,i);for(let t in r){if(ee(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)}},ae=(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),T(t.children||[],n,f,i,a,s,c,l)):p>0&&p&64&&m&&e.dynamicChildren&&e.dynamicChildren.length===m.length?(E(e.dynamicChildren,m,n,i,a,s,c),(t.key!=null||i&&t===i.subTree)&&pi(e,t,!0)):de(e,t,n,f,i,a,s,c,l)},D=(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):O(t,n,r,i,a,o,c):se(e,t,c)},O=(e,t,n,r,i,a,o)=>{let s=e.component=Wi(e,r,i);if(Wn(e)&&(s.ctx.renderer=A),Qi(s,!1,o),s.asyncDep){if(i&&i.registerDep(s,ce,o),!e.el){let r=s.subTree=Z(xi);b(null,r,t,n),e.placeholder=r.el}}else ce(s,e,t,n,i,a,o)},se=(e,t,n)=>{let r=t.component=e.component;if(Br(e,t,n)){if(r.asyncDep&&!r.asyncResolved){ue(r,t,n);return}r.next=t,r.update()}else t.el=e.el,r.vnode=t},ce=(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=hi(e);if(n){t&&(t.el=c.el,ue(e,t,o)),n.asyncDep.then(()=>{G(()=>{e.isUnmounted||l()},i)});return}}let u=t,d;di(e,!1),t?(t.el=c.el,ue(e,t,o)):t=c,n&&oe(n),(d=t.props&&t.props.onVnodeBeforeUpdate)&&Vi(d,s,t,c),di(e,!0);let f=Lr(e),p=e.subTree;e.subTree=f,v(p,f,m(p.el),ye(p),e,i,a),t.el=f.el,u===null&&Ur(e,f.el),r&&G(r,i),(d=t.props&&t.props.onVnodeUpdated)&&G(()=>Vi(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=Un(t);if(di(e,!1),l&&oe(l),!m&&(o=c&&c.onVnodeBeforeMount)&&Vi(o,d,t),di(e,!0),s&&Ce){let t=()=>{e.subTree=Lr(e),Ce(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=Lr(e);v(null,o,n,r,e,i,a),t.el=o.el}if(u&&G(u,i),!m&&(o=c&&c.onVnodeMounted)){let e=t;G(()=>Vi(o,d,e),i)}(t.shapeFlag&256||d&&Un(d.vnode)&&d.vnode.shapeFlag&256)&&e.a&&G(e.a,i),e.isMounted=!0,t=n=r=null}};e.scope.on();let c=e.effect=new De(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),di(e,!0),l()},ue=(e,t,n)=>{t.component=e;let r=e.vnode.props;e.vnode=t,e.next=null,Jr(e,t.props,r,n),si(e,t.children,n),Ve(),mn(e),He()},de=(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){pe(l,d,n,r,i,a,o,s,c);return}if(f&256){fe(l,d,n,r,i,a,o,s,c);return}}m&8?(u&16&&ve(l,i,a),d!==l&&p(n,d)):u&16?m&16?pe(l,d,n,r,i,a,o,s,c):ve(l,i,a,!0):(u&8&&p(n,``),m&16&&T(d,n,r,i,a,o,s,c))},fe=(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?ve(e,a,o,!0,!1,f):T(t,r,i,a,o,s,c,l,f)},pe=(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?Ri(t[u]):Li(t[u]);if(Ai(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?Ri(t[p]):Li(t[p]);if(Ai(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;)k(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?Ri(t[u]):Li(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){k(n,a,o,!0);continue}let i;if(n.key!=null)i=g.get(n.key);else for(_=h;_<=p;_++)if(C[_-h]===0&&Ai(n,t[_])){i=_;break}i===void 0?k(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?mi(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){me(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,A);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[Nn];a._isLeaving&&a[Nn](!0),l.persisted&&!e?u():r(a,()=>{u(),c&&c()})};i?i(a,u,d):d()}}else o(a,t,n)},k=(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&&(Ve(),Vn(s,null,n,e,!0),He()),p!=null&&(t.renderCache[p]=void 0),u&256){t.ctx.deactivate(e);return}let h=u&1&&f,g=!Un(e),_;if(g&&(_=o&&o.onVnodeBeforeUnmount)&&Vi(_,t,e),u&6)_e(e.component,n,r);else{if(u&128){e.suspense.unmount(n,r);return}h&&Sn(e,null,t,`beforeUnmount`),u&64?e.type.remove(e,t,n,A,r):l&&!l.hasOnce&&(a!==K||d>0&&d&64)?ve(l,t,n,!1,!0):(a===K&&d&384||!i&&u&16)&&ve(c,t,n),r&&he(e)}let v=m!=null&&p==null;(g&&(_=o&&o.onVnodeUnmounted)||h||v)&&G(()=>{_&&Vi(_,t,e),h&&Sn(e,null,t,`unmounted`),v&&(e.el=null)},n)},he=e=>{let{type:t,el:n,anchor:r,transition:i}=e;if(t===K){ge(n,r);return}if(t===Si){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()},ge=(e,t)=>{let n;for(;e!==t;)n=h(e),s(e),e=n;s(t)},_e=(e,t,n)=>{let{bum:r,scope:i,job:a,subTree:o,um:s,m:c,a:l}=e;gi(c),gi(l),r&&oe(r),i.stop(),a&&(a.flags|=8,k(o,e,t,n)),s&&G(s,t),G(()=>{e.isUnmounted=!0},t)},ve=(e,t,n,r=!1,i=!1,a=0)=>{for(let o=a;o{if(e.shapeFlag&6)return ye(e.component.subTree);if(e.shapeFlag&128)return e.suspense.next();let t=h(e.anchor||e.el),n=t&&t[jn];return n?h(n):t},be=!1,xe=(e,t,n)=>{let r;e==null?t._vnode&&(k(t._vnode,null,null,!0),r=t._vnode.component):v(t._vnode||null,e,t,null,null,null,n),t._vnode=e,be||=(be=!0,mn(r),hn(),!1)},A={p:v,um:k,m:me,r:he,mt:O,mc:T,pc:de,pbc:E,n:ye,o:e},Se,Ce;return i&&([Se,Ce]=i(A)),{render:xe,hydrate:Se,createApp:Ar(xe,Se)}}function ui({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 di({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function fi(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function pi(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 hi(e){let t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:hi(t)}function gi(e){if(e)for(let t=0;te.__isSuspense;function yi(e,t){t&&t.pendingBranch?d(e)?t.effects.push(...e):t.effects.push(e):pn(e)}var K=Symbol.for(`v-fgt`),bi=Symbol.for(`v-txt`),xi=Symbol.for(`v-cmt`),Si=Symbol.for(`v-stc`),Ci=[],q=null;function J(e=!1){Ci.push(q=e?null:[])}function wi(){Ci.pop(),q=Ci[Ci.length-1]||null}var Ti=1;function Ei(e,t=!1){Ti+=e,e<0&&q&&t&&(q.hasOnce=!0)}function Di(e){return e.dynamicChildren=Ti>0?q||n:null,wi(),Ti>0&&q&&q.push(e),e}function Y(e,t,n,r,i,a){return Di(X(e,t,n,r,i,a,!0))}function Oi(e,t,n,r,i){return Di(Z(e,t,n,r,i,!0))}function ki(e){return e?e.__v_isVNode===!0:!1}function Ai(e,t){return e.type===t.type&&e.key===t.key}var ji=({key:e})=>e??null,Mi=({ref:e,ref_key:t,ref_for:n})=>(typeof e==`number`&&(e=``+e),e==null?null:g(e)||R(e)||h(e)?{i:U,r:e,k:t,f:!!n}:e);function X(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&&ji(t),ref:t&&Mi(t),scopeId:vn,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:U};return s?(zi(c,n),a&128&&e.normalize(c)):n&&(c.shapeFlag|=g(n)?8:16),Ti>0&&!o&&q&&(c.patchFlag>0||a&6)&&c.patchFlag!==32&&q.push(c),c}var Z=Ni;function Ni(e,t=null,n=null,r=0,i=null,a=!1){if((!e||e===sr)&&(e=xi),ki(e)){let r=Fi(e,t,!0);return n&&zi(r,n),Ti>0&&!a&&q&&(r.shapeFlag&6?q[q.indexOf(e)]=r:q.push(r)),r.patchFlag=-2,r}if(aa(e)&&(e=e.__vccOpts),t){t=Pi(t);let{class:e,style:n}=t;e&&!g(e)&&(t.class=k(e)),v(n)&&(Rt(n)&&!d(n)&&(n=s({},n)),t.style=ue(n))}let o=g(e)?1:vi(e)?128:Mn(e)?64:v(e)?4:h(e)?2:0;return X(e,t,n,r,i,o,a,!0)}function Pi(e){return e?Rt(e)||Kr(e)?s({},e):e:null}function Fi(e,t,n=!1,r=!1){let{props:i,ref:a,patchFlag:o,children:s,transition:c}=e,l=t?Bi(i||{},t):i,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&ji(l),ref:t&&t.ref?n&&a?d(a)?a.concat(Mi(t)):[a,Mi(t)]:Mi(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&&Fi(e.ssContent),ssFallback:e.ssFallback&&Fi(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&r&&In(u,c.clone(u)),u}function Q(e=` `,t=0){return Z(bi,null,e,t)}function Ii(e=``,t=!1){return t?(J(),Oi(xi,null,e)):Z(xi,null,e)}function Li(e){return e==null||typeof e==`boolean`?Z(xi):d(e)?Z(K,null,e.slice()):ki(e)?Ri(e):Z(bi,null,String(e))}function Ri(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Fi(e)}function zi(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),zi(e,n()),n._c&&(n._d=!0));return}{n=32;let r=t._;!r&&!Kr(t)?t._ctx=U:r===3&&U&&(U.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}}else if(h(t)){if(r&65){zi(e,{default:t});return}t={default:t,_ctx:U},n=32}else t=String(t),r&64?(n=16,t=[Q(t)]):n=8;e.children=t,e.shapeFlag|=n}function Bi(...e){let t={};for(let n=0;n$||U,Ki,qi;{let e=le(),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)}};Ki=t(`__VUE_INSTANCE_SETTERS__`,e=>$=e),qi=t(`__VUE_SSR_SETTERS__`,e=>Zi=e)}var Ji=e=>{let t=$;return Ki(e),e.scope.on(),()=>{e.scope.off(),Ki(t)}},Yi=()=>{$&&$.scope.off(),Ki(null)};function Xi(e){return e.vnode.shapeFlag&4}var Zi=!1;function Qi(e,t=!1,n=!1){t&&qi(t);let{props:r,children:i}=e.vnode,a=Xi(e);qr(e,r,a,t),oi(e,i,n||t);let o=a?$i(e,t):void 0;return t&&qi(!1),o}function $i(e,t){let n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,fr);let{setup:r}=n;if(r){Ve();let n=e.setupContext=r.length>1?ra(e):null,i=Ji(e),a=en(r,e,0,[e.props,n]),o=y(a);if(He(),i(),(o||e.sp)&&!Un(e)&&Rn(e),o){if(a.then(Yi,Yi),t)return a.then(n=>{qi(!0);try{ea(e,n,t)}finally{qi(!1)}}).catch(t=>{tn(t,e,0)});e.asyncDep=a}else ea(e,a,t)}else ta(e,t)}function ea(e,t,n){h(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:v(t)&&(e.setupState=Gt(t)),ta(e,n)}function ta(e,t,n){let i=e.type;e.render||=i.render||r;{let t=Ji(e);Ve();try{hr(e)}finally{He(),t()}}}var na={get(e,t){return P(e,`get`,``),e[t]}};function ra(e){return{attrs:new Proxy(e.attrs,na),slots:e.slots,emit:e.emit,expose:t=>{e.exposed=t||{}}}}function ia(e){return e.exposed?e.exposeProxy||=new Proxy(Gt(zt(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in ur)return ur[n](e)},has(e,t){return t in e||t in ur}}):e.proxy}function aa(e){return h(e)&&`__vccOpts`in e}var oa=(e,t)=>qt(e,t,Zi);function sa(e,t,n){try{Ei(-1);let r=arguments.length;return r===2?v(t)&&!d(t)?ki(t)?Z(e,null,[t]):Z(e,t):Z(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&ki(n)&&(n=[n]),Z(e,t,n))}finally{Ei(1)}}var ca=`3.5.42`,la=void 0,ua=typeof window<`u`&&window.trustedTypes;if(ua)try{la=ua.createPolicy(`vue`,{createHTML:e=>e})}catch{}var da=la?e=>la.createHTML(e):e=>e,fa=`http://www.w3.org/2000/svg`,pa=`http://www.w3.org/1998/Math/MathML`,ma=typeof document<`u`?document:null,ha=ma&&ma.createElement(`template`),ga={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`?ma.createElementNS(fa,e):t===`mathml`?ma.createElementNS(pa,e):n?ma.createElement(e,{is:n}):ma.createElement(e);return e===`select`&&r&&r.multiple!=null&&i.setAttribute(`multiple`,r.multiple),i},createText:e=>ma.createTextNode(e),createComment:e=>ma.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>ma.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{ha.innerHTML=da(r===`svg`?`${e}`:r===`mathml`?`${e}`:e);let i=ha.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]}},_a=Symbol(`_vtc`);function va(e,t,n){let r=e[_a];r&&(t=(t?[t,...r]:[...r]).join(` `)),t==null?e.removeAttribute(`class`):n?e.setAttribute(`class`,t):e.className=t}var ya=Symbol(`_vod`),ba=Symbol(`_vsh`),xa=Symbol(``),Sa=/(?:^|;)\s*display\s*:/;function Ca(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]??Ta(r,t,``)}else for(let e in t)n[e]??Ta(r,e,``)}for(let i in n){i===`display`&&(a=!0);let o=n[i];o==null?Ta(r,i,``):ka(e,i,!g(t)&&t?t[i]:void 0,o)||Ta(r,i,o)}}else if(i){if(t!==n){let e=r[xa];e&&(n+=`;`+e),r.cssText=n,a=Sa.test(n)}}else t&&e.removeAttribute(`style`);ya in e&&(e[ya]=a?r.display:``,e[ba]&&(r.display=`none`))}var wa=/\s*!important$/;function Ta(e,t,n){if(d(n))n.forEach(n=>Ta(e,t,n));else if(n??=``,t.startsWith(`--`))wa.test(n)?e.setProperty(t,n.replace(wa,``),`important`):e.setProperty(t,n);else{let r=Oa(e,t);wa.test(n)?e.setProperty(E(r),n.replace(wa,``),`important`):e[r]=n}}var Ea=[`Webkit`,`Moz`,`ms`],Da={};function Oa(e,t){let n=Da[t];if(n)return n;let r=T(t);if(r!==`filter`&&r in e)return Da[t]=r;r=ie(r);for(let n=0;nBa||=(Va.then(()=>Ba=0),Date.now());function Ua(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,Ga=(e,t,n,r,i,s)=>{let c=i===`svg`;t===`class`?va(e,r,c):t===`style`?Ca(e,n,r):a(t)?o(t)||Ia(e,t,n,r,s):(t[0]===`.`?(t=t.slice(1),1):t[0]===`^`?(t=t.slice(1),0):Ka(e,t,r,c))?(Ma(e,t,r),!e.tagName.includes(`-`)&&(t===`value`||t===`checked`||t===`selected`)&&ja(e,t,r,c,s,t!==`value`)):e._isVueCE&&(qa(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!g(r)))?Ma(e,T(t),r,s,t):(t===`true-value`?e._trueValue=r:t===`false-value`&&(e._falseValue=r),ja(e,t,r,c))};function Ka(e,t,n,r){if(r)return!!(t===`innerHTML`||t===`textContent`||t in e&&Wa(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 Wa(t)&&g(n)?!1:t in e}function qa(e,t){let n=e._def.props;if(!n)return!1;let r=T(t);return Array.isArray(n)?n.some(e=>T(e)===r):Object.keys(n).some(e=>T(e)===r)}var Ja=e=>{let t=e.props[`onUpdate:modelValue`]||!1;return d(t)?e=>oe(t,e):t};function Ya(e){e.target.composing=!0}function Xa(e){let t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event(`input`)))}var Za=Symbol(`_assign`),Qa=Symbol(`_initialValue`);function $a(e,t,n){return t&&(e=e.trim()),n&&(e=se(e)),e}var eo={created(e,{modifiers:{lazy:t,trim:n,number:r}},i){e.parentNode&&(e.type===`text`?e[Qa]=e.defaultValue.replace(/[\r\n]/g,``):e.type===`textarea`&&(e[Qa]=e.defaultValue.replace(/\r\n?/g,` -`))),e[Za]=Ja(i);let a=r||i.props&&i.props.type===`number`;Na(e,t?`change`:`input`,t=>{t.target.composing||e[Za]($a(e.value,n,a))}),(n||a)&&Na(e,`change`,()=>{e.value=$a(e.value,n,a)}),t||(Na(e,`compositionstart`,Ya),Na(e,`compositionend`,Xa),Na(e,`change`,Xa))},mounted(e,{value:t,modifiers:{trim:n,number:r}}){let i=t??``,a=e[Qa];delete e[Qa],a!==void 0&&(e.type===`text`||e.type===`textarea`)&&e.value!==a?e[Za]($a(e.value,n,r)):e.value=i},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:i,number:a}},o){if(e[Za]=Ja(o),e.composing)return;let s=(a||e.type===`number`)&&!/^0\d/.test(e.value)?se(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)}},to=[`ctrl`,`shift`,`alt`,`meta`],no={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)=>to.some(n=>e[`${n}Key`]&&!t.includes(n))},ro=(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=E(n.key);if(t.some(e=>e===r||io[e]===r))return e(n)}))},oo=s({patchProp:Ga},ga),so;function co(){return so||=ci(oo)}var lo=((...e)=>{let t=co().createApp(...e),{mount:n}=t;return t.mount=e=>{let r=fo(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,uo(r));return r instanceof Element&&(r.removeAttribute(`v-cloak`),r.setAttribute(`data-v-app`,``)),a},t});function uo(e){if(e instanceof SVGElement)return`svg`;if(typeof MathMLElement==`function`&&e instanceof MathMLElement)return`mathml`}function fo(e){return g(e)?document.querySelector(e):e}var po=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),mo={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`},ho=({size:e,strokeWidth:t=2,absoluteStrokeWidth:n,color:r,iconNode:i,name:a,class:o,...s},{slots:c})=>sa(`svg`,{...mo,width:e||mo.width,height:e||mo.height,stroke:r||mo.stroke,"stroke-width":n?Number(t)*24/Number(e):t,class:[`lucide`,`lucide-${po(a??`icon`)}`],...s},[...i.map(e=>sa(...e)),...c.default?[c.default()]:[]]),go=(e,t)=>(n,{slots:r})=>sa(ho,{...n,iconNode:t,name:e},r),_o=go(`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`}]]),vo=go(`CheckIcon`,[[`path`,{d:`M20 6 9 17l-5-5`,key:`1gmf2c`}]]),yo=go(`CirclePlusIcon`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M8 12h8`,key:`1wcyev`}],[`path`,{d:`M12 8v8`,key:`napkw2`}]]),bo=go(`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`}]]),xo=go(`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`}]]),So=go(`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`}]]),Co=go(`SearchIcon`,[[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}],[`path`,{d:`m21 21-4.3-4.3`,key:`1qie3q`}]]),wo=go(`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`}]]),To=go(`SproutIcon`,[[`path`,{d:`M7 20h10`,key:`e6iznv`}],[`path`,{d:`M10 20c5.5-2.5.8-6.4 3-10`,key:`161w41`}],[`path`,{d:`M9.5 9.4c1.1.8 1.8 2.2 2.3 3.7-2 .4-3.5.4-4.8-.3-1.2-.6-2.3-1.9-3-4.2 2.8-.5 4.4 0 5.5.8z`,key:`9gtqwd`}],[`path`,{d:`M14.1 6a7 7 0 0 0-1.1 4c1.9-.1 3.3-.6 4.3-1.4 1-1 1.6-2.3 1.7-4.6-2.7.1-4 1-4.9 2z`,key:`bkxnd2`}]]),Eo={key:0,class:`center`},Do={key:1,class:`auth-shell`},Oo={class:`auth-card`},ko={key:0},Ao={key:2,class:`shell`},jo={class:`active`},Mo={class:`lists`},No=[`onClick`],Po={class:`settings`},Fo={class:`mobile-menu`},Io={class:`search`},Lo={class:`task-list`},Ro=[`onClick`],zo={key:0},Bo={key:0,class:`priority`},Vo={key:0,class:`empty`},Ho={class:`bottom`};lo(Ln({__name:`App`,setup(e){let t=Vt(null),n=Vt(!1),r=Vt(``),i=Vt(``),a=Vt([]),o=Vt([]),s=Vt(``),c=Vt(``),l=Vt(``),u=oa(()=>a.value.find(e=>e.id===s.value)?.name||`今天`);async function d(e,t={}){let n=await fetch(`/api/v1`+e,{credentials:`include`,headers:{"Content-Type":`application/json`,...t.headers||{}},...t});if(!n.ok)throw Error((await n.json()).detail||`请求失败`);return n.status===204?null:n.json()}async function f(){try{let e=await d(`/setup/status`);t.value=e.initialized,e.initialized&&(await d(`/me`),n.value=!0,await m())}catch{n.value=!1}}async function p(){l.value=``;try{t.value?await d(`/auth/login`,{method:`POST`,body:JSON.stringify({username:r.value,password:i.value})}):(await d(`/setup/initialize`,{method:`POST`,body:JSON.stringify({username:r.value,password:i.value})}),t.value=!0),n.value=!0,await m()}catch(e){l.value=e.message}}async function m(){a.value=await d(`/lists`),s.value||=a.value[0]?.id,o.value=(await d(`/tasks`)).items}async function h(){if(!c.value.trim()||!s.value)return;let e=await d(`/tasks`,{method:`POST`,body:JSON.stringify({title:c.value.trim(),list_id:s.value})});o.value.push(e),c.value=``}async function g(e){let t=await d(`/tasks/${e.id}`,{method:`PATCH`,body:JSON.stringify({completed:!e.completed,version:e.version})});Object.assign(e,t)}function _(){document.querySelector(`.quick input`)?.focus()}return Qn(f),(e,d)=>t.value===null?(J(),Y(`div`,Eo,`正在打开 dodo…`)):n.value?(J(),Y(`div`,Ao,[X(`aside`,null,[d[11]||=X(`div`,{class:`brand small`},[Q(`do`),X(`span`,null,`do`)],-1),X(`nav`,null,[X(`button`,jo,[Z(z(bo)),d[4]||=Q(`收集箱`,-1)]),X(`button`,null,[Z(z(xo)),d[5]||=Q(`今天`,-1)]),X(`button`,null,[Z(z(_o)),d[6]||=Q(`最近7天`,-1)]),X(`button`,null,[Z(z(To)),d[7]||=Q(`习惯`,-1)])]),X(`div`,Mo,[d[9]||=X(`label`,null,`我的清单`,-1),(J(!0),Y(K,null,cr(a.value,e=>(J(),Y(`button`,{key:e.id,onClick:t=>s.value=e.id},[d[8]||=X(`i`,null,null,-1),Q(A(e.name),1)],8,No))),128))]),X(`button`,Po,[Z(z(wo)),d[10]||=Q(`设置`,-1)])]),X(`main`,null,[X(`header`,null,[X(`button`,Fo,[Z(z(So))]),X(`div`,null,[d[12]||=X(`p`,null,`今天也慢慢来`,-1),X(`h1`,null,A(u.value),1)]),X(`button`,Io,[Z(z(Co)),d[13]||=Q(`搜索`,-1)])]),X(`form`,{onSubmit:ro(h,[`prevent`]),class:`quick`},[Z(z(yo)),xn(X(`input`,{"onUpdate:modelValue":d[2]||=e=>c.value=e,placeholder:`添加任务`},null,512),[[eo,c.value]]),d[14]||=X(`button`,null,`添加`,-1)],32),X(`section`,Lo,[(J(!0),Y(K,null,cr(o.value.filter(e=>e.list_id===s.value),e=>(J(),Y(`article`,{key:e.id,class:k({done:e.completed})},[X(`button`,{class:`check`,onClick:t=>g(e)},[e.completed?(J(),Oi(z(vo),{key:0})):Ii(``,!0)],8,Ro),X(`div`,null,[X(`strong`,null,A(e.title),1),e.description?(J(),Y(`p`,zo,A(e.description),1)):Ii(``,!0)]),e.priority?(J(),Y(`span`,Bo,`P`+A(4-e.priority),1)):Ii(``,!0)],2))),128)),o.value.filter(e=>e.list_id===s.value).length?Ii(``,!0):(J(),Y(`div`,Vo,[Z(z(xo)),d[15]||=X(`b`,null,`这里还很安静`,-1),d[16]||=X(`span`,null,`写下第一件想完成的小事吧`,-1)]))])]),d[21]||=X(`aside`,{class:`detail`},[X(`span`,null,`任务详情`),X(`div`,{class:`paper`},[X(`b`,null,`选中一个任务`),X(`p`,null,`日期、提醒、标签和备注会出现在这里。`)])],-1),X(`nav`,Ho,[X(`button`,null,[Z(z(xo)),d[17]||=X(`span`,null,`今天`,-1)]),X(`button`,null,[Z(z(bo)),d[18]||=X(`span`,null,`任务`,-1)]),X(`button`,null,[Z(z(_o)),d[19]||=X(`span`,null,`日历`,-1)]),X(`button`,null,[Z(z(To)),d[20]||=X(`span`,null,`习惯`,-1)])]),X(`button`,{class:`fab`,onClick:_},[Z(z(yo))])])):(J(),Y(`div`,Do,[X(`section`,Oo,[d[3]||=X(`div`,{class:`brand`},[Q(`do`),X(`span`,null,`do`)],-1),X(`p`,null,A(t.value?`欢迎回来`:`创建你的 dodo`),1),xn(X(`input`,{"onUpdate:modelValue":d[0]||=e=>r.value=e,placeholder:`用户名`},null,512),[[eo,r.value]]),xn(X(`input`,{"onUpdate:modelValue":d[1]||=e=>i.value=e,type:`password`,placeholder:`密码(至少12位)`,onKeyup:ao(p,[`enter`])},null,544),[[eo,i.value]]),X(`button`,{onClick:p},A(t.value?`登录`:`开始使用`),1),l.value?(J(),Y(`small`,ko,A(l.value),1)):Ii(``,!0)])]))}})).mount(`#app`),`serviceWorker`in navigator&&navigator.serviceWorker.register(`/sw.js`); \ No newline at end of file diff --git a/backend/static/assets/index-BiihmXG7.js b/backend/static/assets/index-BiihmXG7.js new file mode 100644 index 0000000..0282425 --- /dev/null +++ b/backend/static/assets/index-BiihmXG7.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,ee=e(`,key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted`),te=e=>{let t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},ne=/-\w/g,T=te(e=>e.replace(ne,e=>e.slice(1).toUpperCase())),re=/\B([A-Z])/g,E=te(e=>e.replace(re,`-$1`).toLowerCase()),D=te(e=>e.charAt(0).toUpperCase()+e.slice(1)),O=te(e=>e?`on${D(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,j=()=>se||=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 N(e){let t=``;if(g(e))t=e;else if(d(e))for(let n=0;n_e(e,t))}var ye=e=>!!(e&&e.__v_isRef===!0),P=e=>g(e)?e:e==null?``:d(e)||v(e)&&(e.toString===b||!h(e.toString))?ye(e)?P(e.value):JSON.stringify(e,be,2):String(e),be=(e,t)=>ye(t)?be(e,t.value):f(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((e,[t,n],r)=>(e[xe(t,r)+` =>`]=n,e),{})}:p(t)?{[`Set(${t.size})`]:[...t.values()].map(e=>xe(e))}:_(t)?xe(t):v(t)&&!d(t)&&!C(t)?String(t):t,xe=(e,t=``)=>_(e)?`Symbol(${e.description??t})`:e,F,Se=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&&F&&(F.active?(this.parent=F,this.index=(F.scopes||(F.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(F===this)F=this.prevScope;else{let e=F;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(Oe){let e=Oe;for(Oe=void 0;e;){let t=e.next;e.next=void 0,e.flags&=-9,e=t}}let e;for(;De;){let t=De;for(De=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 Me(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Ne(e){let t,n=e.depsTail,r=n;for(;r;){let e=r.prevDep;r.version===-1?(r===n&&(n=e),Ie(r),Le(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=e}e.deps=t,e.depsTail=n}function Pe(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Fe(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Fe(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Ue)||(e.globalVersion=Ue,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Pe(e))))return;e.flags|=2;let t=e.dep,n=I,r=Re;I=e,Re=!0;try{Me(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{I=n,Re=r,Ne(e),e.flags&=-3}}function Ie(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)Ie(e,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Le(e){let{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}var Re=!0,ze=[];function Be(){ze.push(Re),Re=!1}function Ve(){let e=ze.pop();Re=e===void 0||e}function He(e){let{cleanup:t}=e;if(e.cleanup=void 0,t){let e=I;I=void 0;try{t()}finally{I=e}}}var Ue=0,We=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}},Ge=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(!I||!Re||I===this.computed)return;let t=this.activeLink;if(t===void 0||t.sub!==I)t=this.activeLink=new We(I,this),I.deps?(t.prevDep=I.depsTail,I.depsTail.nextDep=t,I.depsTail=t):I.deps=I.depsTail=t,Ke(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=I.depsTail,t.nextDep=void 0,I.depsTail.nextDep=t,I.depsTail=t,I.deps===t&&(I.deps=e)}return t}trigger(e){this.version++,Ue++,this.notify(e)}notify(e){Ae();try{for(let e=this.subs;e;e=e.prevSub)e.sub.notify()&&e.sub.dep.notify()}finally{je()}}};function Ke(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)Ke(e)}let n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}var qe=new WeakMap,Je=Symbol(``),Ye=Symbol(``),Xe=Symbol(``);function L(e,t,n){if(Re&&I){let t=qe.get(e);t||qe.set(e,t=new Map);let r=t.get(n);r||(t.set(n,r=new Ge),r.map=t,r.key=n),r.track()}}function Ze(e,t,n,r,i,a){let o=qe.get(e);if(!o){Ue++;return}let s=e=>{e&&e.trigger()};if(Ae(),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===Xe||!_(n)&&n>=e)&&s(t)})}else switch((n!==void 0||o.has(void 0))&&s(o.get(n)),a&&s(o.get(Xe)),t){case`add`:i?a&&s(o.get(`length`)):(s(o.get(Je)),f(e)&&s(o.get(Ye)));break;case`delete`:i||(s(o.get(Je)),f(e)&&s(o.get(Ye)));break;case`set`:f(e)&&s(o.get(Je))}}je()}function Qe(e){let t=R(e);return t===e?t:(L(t,`iterate`,Xe),Lt(e)?t:t.map(Bt))}function $e(e){return L(e=R(e),`iterate`,Xe),e}function et(e,t){return It(e)?Vt(Ft(e)?Bt(t):t):Bt(t)}var tt={__proto__:null,[Symbol.iterator](){return nt(this,Symbol.iterator,e=>et(this,e))},concat(...e){return Qe(this).concat(...e.map(e=>d(e)?Qe(e):e))},entries(){return nt(this,`entries`,e=>(e[1]=et(this,e[1]),e))},every(e,t){return it(this,`every`,e,t,void 0,arguments)},filter(e,t){return it(this,`filter`,e,t,e=>e.map(e=>et(this,e)),arguments)},find(e,t){return it(this,`find`,e,t,e=>et(this,e),arguments)},findIndex(e,t){return it(this,`findIndex`,e,t,void 0,arguments)},findLast(e,t){return it(this,`findLast`,e,t,e=>et(this,e),arguments)},findLastIndex(e,t){return it(this,`findLastIndex`,e,t,void 0,arguments)},forEach(e,t){return it(this,`forEach`,e,t,void 0,arguments)},includes(...e){return ot(this,`includes`,e)},indexOf(...e){return ot(this,`indexOf`,e)},join(e){return Qe(this).join(e)},lastIndexOf(...e){return ot(this,`lastIndexOf`,e)},map(e,t){return it(this,`map`,e,t,void 0,arguments)},pop(){return st(this,`pop`)},push(...e){return st(this,`push`,e)},reduce(e,...t){return at(this,`reduce`,e,t)},reduceRight(e,...t){return at(this,`reduceRight`,e,t)},shift(){return st(this,`shift`)},some(e,t){return it(this,`some`,e,t,void 0,arguments)},splice(...e){return st(this,`splice`,e)},toReversed(){return Qe(this).toReversed()},toSorted(e){return Qe(this).toSorted(e)},toSpliced(...e){return Qe(this).toSpliced(...e)},unshift(...e){return st(this,`unshift`,e)},values(){return nt(this,`values`,e=>et(this,e))}};function nt(e,t,n){let r=$e(e),i=r[t]();return r!==e&&!Lt(e)&&(i._next=i.next,i.next=()=>{let e=i._next();return e.done||(e.value=n(e.value)),e}),i}var rt=Array.prototype;function it(e,t,n,r,i,a){let o=$e(e),s=o!==e&&!Lt(e),c=o[t];if(c!==rt[t]){let t=c.apply(e,a);return s?Bt(t):t}let l=n;o!==e&&(s?l=function(t,r){return n.call(this,et(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 at(e,t,n,r){let i=$e(e),a=i!==e&&!Lt(e),o=n,s=!1;i!==e&&(a?(s=r.length===0,o=function(t,r,i){return s&&(s=!1,t=et(e,t)),n.call(this,t,et(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?et(e,c):c}function ot(e,t,n){let r=R(e);L(r,`iterate`,Xe);let i=r[t](...n);return(i===-1||i===!1)&&Rt(n[0])?(n[0]=R(n[0]),r[t](...n)):i}function st(e,t,n=[]){Be(),Ae();let r=R(e)[t].apply(e,n);return je(),Ve(),r}var ct=e(`__proto__,__v_isRef,__isVue`),lt=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!==`arguments`&&e!==`caller`).map(e=>Symbol[e]).filter(_));function ut(e){_(e)||(e=String(e));let t=R(this);return L(t,`has`,e),t.hasOwnProperty(e)}var dt=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?kt:Ot:i?Dt:Et).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;let a=d(e);if(!r){let e;if(a&&(e=tt[t]))return e;if(t===`hasOwnProperty`)return ut}let o=Reflect.get(e,t,z(e)?e:n);if((_(t)?lt.has(t):ct(t))||(r||L(e,`get`,t),i))return o;if(z(o)){let e=a&&w(t)?o:o.value;return r&&v(e)?Nt(e):e}return v(o)?r?Nt(o):jt(o):o}},ft=class extends dt{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=It(i);if(!Lt(n)&&!It(n)&&(i=R(i),n=R(n)),!a&&z(i)&&!z(n))return e||(i.value=n),!0}let o=a?Number(t)e,vt=e=>Reflect.getPrototypeOf(e);function yt(e,t,n){return function(...r){let i=this.__v_raw,a=R(i),o=f(a),c=e===`entries`||e===Symbol.iterator&&o,l=e===`keys`&&o,u=i[e](...r),d=n?_t:t?Vt:Bt;return!t&&L(a,`iterate`,l?Ye:Je),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 bt(e){return function(...t){return e===`delete`?!1:e===`clear`?void 0:this}}function xt(e,t){let n={get(n){let r=this.__v_raw,i=R(r),a=R(n);e||(k(n,a)&&L(i,`get`,n),L(i,`get`,a));let{has:o}=vt(i),s=t?_t:e?Vt:Bt;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&&L(R(t),`iterate`,Je),t.size},has(t){let n=this.__v_raw,r=R(n),i=R(t);return e||(k(t,i)&&L(r,`has`,t),L(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=R(a),s=t?_t:e?Vt:Bt;return!e&&L(o,`iterate`,Je),a.forEach((e,t)=>n.call(r,s(e),s(t),i))}};return s(n,e?{add:bt(`add`),set:bt(`set`),delete:bt(`delete`),clear:bt(`clear`)}:{add(e){let n=R(this),r=vt(n),i=R(e),a=!t&&!Lt(e)&&!It(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),Ze(n,`add`,a,a)),this},set(e,n){!t&&!Lt(n)&&!It(n)&&(n=R(n));let r=R(this),{has:i,get:a}=vt(r),o=i.call(r,e);o||=(e=R(e),i.call(r,e));let s=a.call(r,e);return r.set(e,n),o?k(n,s)&&Ze(r,`set`,e,n,s):Ze(r,`add`,e,n),this},delete(e){let t=R(this),{has:n,get:r}=vt(t),i=n.call(t,e);i||=(e=R(e),n.call(t,e));let a=r?r.call(t,e):void 0,o=t.delete(e);return i&&Ze(t,`delete`,e,void 0,a),o},clear(){let e=R(this),t=e.size!==0,n=e.clear();return t&&Ze(e,`clear`,void 0,void 0,void 0),n}}),[`keys`,`values`,`entries`,Symbol.iterator].forEach(r=>{n[r]=yt(r,e,t)}),n}function St(e,t){let n=xt(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 Ct={get:St(!1,!1)},wt={get:St(!1,!0)},Tt={get:St(!0,!1)},Et=new WeakMap,Dt=new WeakMap,Ot=new WeakMap,kt=new WeakMap;function At(e){switch(e){case`Object`:case`Array`:return 1;case`Map`:case`Set`:case`WeakMap`:case`WeakSet`:return 2;default:return 0}}function jt(e){return It(e)?e:Pt(e,!1,mt,Ct,Et)}function Mt(e){return Pt(e,!1,gt,wt,Dt)}function Nt(e){return Pt(e,!0,ht,Tt,Ot)}function Pt(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=At(S(e));if(o===0)return e;let s=new Proxy(e,o===2?r:n);return i.set(e,s),s}function Ft(e){return It(e)?Ft(e.__v_raw):!!(e&&e.__v_isReactive)}function It(e){return!!(e&&e.__v_isReadonly)}function Lt(e){return!!(e&&e.__v_isShallow)}function Rt(e){return e?!!e.__v_raw:!1}function R(e){let t=e&&e.__v_raw;return t?R(t):e}function zt(e){return!u(e,`__v_skip`)&&Object.isExtensible(e)&&A(e,`__v_skip`,!0),e}var Bt=e=>v(e)?jt(e):e,Vt=e=>v(e)?Nt(e):e;function z(e){return e?e.__v_isRef===!0:!1}function B(e){return Ht(e,!1)}function Ht(e,t){return z(e)?e:new Ut(e,t)}var Ut=class{constructor(e,t){this.dep=new Ge,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=t?e:R(e),this._value=t?e:Bt(e),this.__v_isShallow=t}get value(){return this.dep.track(),this._value}set value(e){let t=this._rawValue,n=this.__v_isShallow||Lt(e)||It(e);e=n?e:R(e),k(e,t)&&(this._rawValue=e,this._value=n?e:Bt(e),this.dep.trigger())}};function V(e){return z(e)?e.value:e}var Wt={get:(e,t,n)=>t===`__v_raw`?e:V(Reflect.get(e,t,n)),set:(e,t,n,r)=>{let i=e[t];return z(i)&&!z(n)?(i.value=n,!0):Reflect.set(e,t,n,r)}};function Gt(e){return Ft(e)?e:new Proxy(e,Wt)}var Kt=class{constructor(e,t,n){this.fn=e,this.setter=t,this._value=void 0,this.dep=new Ge(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Ue-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!t,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&I!==this)return ke(this,!0),!0}get value(){let e=this.dep.track();return Fe(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}};function qt(e,t,n=!1){let r,i;return h(e)?r=e:(r=e.get,i=e.set),new Kt(r,i,n)}var Jt={},Yt=new WeakMap,Xt=void 0;function Zt(e,t=!1,n=Xt){if(n){let t=Yt.get(n);t||Yt.set(n,t=[]),t.push(e)}}function Qt(e,n,i=t){let{immediate:a,deep:o,once:s,scheduler:l,augmentJob:u,call:f}=i,p=e=>o?e:Lt(e)||o===!1||o===0?$t(e,1):$t(e),m,g,_,v,y=!1,b=!1;if(z(e)?(g=()=>e.value,y=Lt(e)):Ft(e)?(g=()=>p(e),y=!0):d(e)?(b=!0,y=e.some(e=>Ft(e)||Lt(e)),g=()=>e.map(e=>{if(z(e))return e.value;if(Ft(e))return p(e);if(h(e))return f?f(e,2):e()})):g=h(e)?n?f?()=>f(e,2):e:()=>{if(_){Be();try{_()}finally{Ve()}}let t=Xt;Xt=m;try{return f?f(e,3,[v]):e(v)}finally{Xt=t}}:r,n&&o){let e=g,t=o===!0?1/0:o;g=()=>$t(e(),t)}let x=Ce(),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(Jt):Jt,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=Xt;Xt=m;try{let e=[t,C===Jt?void 0:b&&C[0]===Jt?[]:C,v];C=t,f?f(n,3,e):n(...e)}finally{Xt=e}}}else m.run()}};return u&&u(w),m=new Te(g),m.scheduler=l?()=>l(w,!1):w,v=e=>Zt(e,!1,m),_=m.onStop=()=>{let e=Yt.get(m);if(e){if(f)f(e,4);else for(let t of e)t();Yt.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 $t(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--,z(e))$t(e.value,t,n);else if(d(e))for(let r=0;r{$t(e,t,n)});else if(C(e)){for(let r in e)$t(e[r],t,n);for(let r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&$t(e[r],t,n)}return e}function en(e,t,n,r){try{return r?e(...r):e()}catch(e){nn(e,t,n)}}function tn(e,t,n,r){if(h(e)){let i=en(e,t,n,r);return i&&y(i)&&i.catch(e=>{nn(e,t,n)}),i}if(d(e)){let i=[];for(let a=0;a>>1,i=H[r],a=vn(i);a=vn(n)?H.push(e):H.splice(fn(t),0,e),e.flags|=1,mn()}}function mn(){un||=ln.then(yn)}function hn(e){if(!d(e))sn&&e.id===-1?sn.splice(cn+1,0,e):e.flags&1||(on.push(e),e.flags|=1);else for(let t=0;tvn(e)-vn(t));if(on.length=0,sn){for(let t=0;te.id==null?e.flags&2?-1:1/0:e.id;function yn(e){try{for(an=0;an{r._d&&Vi(-1);let i=Sn(t),a=Li.length,o;try{o=e(...n)}finally{for(let e=Li.length;e>a;e--)zi();Sn(i),r._d&&Vi(1)}return o};return r._n=!0,r._c=!0,r._d=!0,r}function wn(e,n){if(bn===null)return e;let r=va(bn),i=e.dirs||=[];for(let e=0;e1)return n&&h(t)?t.call(r&&r.proxy):t}}var On=Symbol.for(`v-scx`),kn=()=>Dn(On);function An(e,t,n){return jn(e,t,n)}function jn(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(da){if(c===`sync`){let e=kn();f=e.__watcherHandles||=[]}else if(!d){let e=()=>{};return e.stop=r,e.resume=r,e.pause=r,e}}let p=Q;u.call=(e,t,n)=>tn(e,p,t,n);let m=!1;c===`post`?u.scheduler=e=>{Si(e,p&&p.suspense)}:c!==`sync`&&(m=!0,u.scheduler=(e,t)=>{t?e():pn(e)}),u.augmentJob=e=>{n&&(e.flags|=4),m&&(e.flags|=2,p&&(e.id=p.uid,e.i=p))};let h=Qt(e,n,u);return da&&(f?f.push(h):d&&h()),h}function Mn(e,t,n){let r=this.proxy,i=g(e)?e.includes(`.`)?Nn(r,e):()=>r[e]:e.bind(r,r),a;h(t)?a=t:(a=t.handler,n=t);let o=ca(this),s=jn(i,a.bind(r),n);return o(),s}function Nn(e,t){let n=t.split(`.`);return()=>{let t=e;for(let e=0;ee.__isTeleport,In=Symbol(`_leaveCb`),Ln=Symbol(`_enterCb`);function Rn(){let e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return fr(()=>{e.isMounted=!0}),hr(()=>{e.isUnmounting=!0}),e}var zn=[Function,Array],Bn={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:zn,onEnter:zn,onAfterEnter:zn,onEnterCancelled:zn,onBeforeLeave:zn,onLeave:zn,onAfterLeave:zn,onLeaveCancelled:zn,onBeforeAppear:zn,onAppear:zn,onAfterAppear:zn,onAppearCancelled:zn},Vn=e=>{let t=e.subTree;return t.component?Vn(t.component):t},Hn={name:`BaseTransition`,props:Bn,setup(e,{slots:t}){let n=aa(),r=Rn();return()=>{let i=t.default&&Xn(t.default(),!0),a=i&&i.length?Un(i):n.subTree?Z():void 0;if(!a)return;let o=R(e),{mode:s}=o;if(r.isLeaving)return qn(a);let c=Jn(a);if(!c)return qn(a);let l=Kn(c,o,r,n,e=>l=e);c.type!==G&&Yn(c,l);let u=n.subTree&&Jn(n.subTree);if(u&&u.type!==G&&!Gi(u,c)&&Vn(n).type!==G){let e=Kn(u,o,r,n);if(Yn(u,e),s===`out-in`&&c.type!==G)return r.isLeaving=!0,e.afterLeave=()=>{r.isLeaving=!1,n.job.flags&8||n.update(),delete e.afterLeave,u=void 0},qn(a);s===`in-out`&&c.type!==G?e.delayLeave=(e,t,n)=>{let i=Gn(r,u);i[String(u.key)]=u,e[In]=()=>{t(),e[In]=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 Un(e){let t=e[0];if(e.length>1){for(let n of e)if(n.type!==G){t=n;break}}return t}var Wn=Hn;function Gn(e,t){let{leavingVNodes:n}=e,r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function Kn(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=Gn(n,e),C=(e,t)=>{e&&tn(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()},ee={mode:o,persisted:s,beforeEnter(t){let r=c;if(!n.isMounted){if(a)r=_||c;else return}t[In]&&t[In](!0);let i=S[x];i&&Gi(e,i)&&i.el[In]&&i.el[In](),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[Ln]=e=>{s||(s=!0,C(e?o:i,[t]),ee.delayedLeave&&ee.delayedLeave(),t[Ln]=void 0)};let c=t[Ln].bind(null,!1);r?w(r,[t,c]):c()},leave(t,r){let i=String(e.key);if(t[Ln]&&t[Ln](!0),n.isUnmounting)return r();C(p,[t]);let a=!1;t[In]=n=>{a||(a=!0,r(),C(n?g:h,[t]),t[In]=void 0,S[i]===e&&delete S[i])};let o=t[In].bind(null,!1);S[i]=e,m?w(m,[t,o]):o()},clone(e){let a=Kn(e,t,n,r,i);return i&&i(a),a}};return ee}function qn(e){if(ir(e))return e=Xi(e),e.children=null,e}function Jn(e){if(!ir(e))return Fn(e.type)&&e.children?Un(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 Yn(e,t){if(e.shapeFlag&6&&e.component){e.transition=t;let n=e.component.subTree;Yn(Fn(n.type)&&Jn(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 Xn(e,t=!1,n){let r=[],i=0;for(let a=0;a1)for(let e=0;etr(e,n&&(d(n)?n[t]:n),r,a,o));return}if(rr(a)&&!o){a.shapeFlag&512&&a.type.__asyncResolved&&a.component.subTree.component&&tr(e,n,r,a.component.subTree);return}let s=a.shapeFlag&4?va(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=R(v),b=v===t?i:e=>!$n(_,e)&&u(y,e),x=(e,t)=>!(t&&$n(_,t));if(m!=null&&m!==p){if(nr(n),g(m))_[m]=null,b(m)&&(v[m]=null);else if(z(m)){let e=n;x(m,e.k)&&(m.value=null),e.k&&(_[e.k]=null)}}if(h(p))en(p,f,12,[l,_]);else{let t=g(p),n=z(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(),er.delete(e)};t.id=-1,er.set(e,t),Si(t,r)}else nr(e),i()}}}function nr(e){let t=er.get(e);t&&(t.flags|=8,er.delete(e))}j().requestIdleCallback,j().cancelIdleCallback;var rr=e=>!!e.type.__asyncLoader,ir=e=>e.type.__isKeepAlive;function ar(e,t){sr(e,`a`,t)}function or(e,t){sr(e,`da`,t)}function sr(e,t,n=Q){let r=e.__wdc||=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()};if(lr(t,r,n),n){let e=n.parent;for(;e&&e.parent;)ir(e.parent.vnode)&&cr(r,t,n,e),e=e.parent}}function cr(e,t,n,r){let i=lr(t,e,r,!0);gr(()=>{c(r[t],i)},n)}function lr(e,t,n=Q,r=!1){if(n){let i=n[e]||(n[e]=[]),a=t.__weh||=(...r)=>{Be();let i=ca(n),a=tn(t,n,e,r);return i(),Ve(),a};return r?i.unshift(a):i.push(a),a}}var ur=e=>(t,n=Q)=>{(!da||e===`sp`)&&lr(e,(...e)=>t(...e),n)},dr=ur(`bm`),fr=ur(`m`),pr=ur(`bu`),mr=ur(`u`),hr=ur(`bum`),gr=ur(`um`),_r=ur(`sp`),vr=ur(`rtg`),yr=ur(`rtc`);function br(e,t=Q){lr(`ec`,e,t)}var xr=Symbol.for(`v-ndc`);function Sr(e,t,n,r){let i,a=n&&n[r],o=d(e);if(o||g(e)){let n=o&&Ft(e),r=!1,s=!1;n&&(r=!Lt(e),s=It(e),e=$e(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?ua(e)?va(e):Cr(e.parent):null,wr=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=>Cr(e.parent),$root:e=>Cr(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Nr(e),$forceUpdate:e=>e.f||=()=>{pn(e.update)},$nextTick:e=>e.n||=dn.bind(e.proxy),$watch:e=>Mn.bind(e)}),Tr=(e,n)=>e!==t&&!e.__isScriptSetup&&u(e,n),Er={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(Tr(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 Or&&(s[n]=0)}let d=wr[n],f,p;if(d)return n===`$attrs`&&L(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 Tr(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)||Tr(n,c)||u(o,c)||u(i,c)||u(wr,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 Dr(e){return d(e)?e.reduce((e,t)=>(e[t]=null,e),{}):e}var Or=!0;function kr(e){let t=Nr(e),n=e.proxy,i=e.ctx;Or=!1,t.beforeCreate&&jr(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:ee,renderTracked:te,renderTriggered:ne,errorCaptured:T,serverPrefetch:re,expose:E,inheritAttrs:D,components:O,directives:k,filters:ie}=t;if(u&&Ar(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=jt(t))}if(Or=!0,o)for(let e in o){let t=o[e],a=ba({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)Mr(c[e],i,n,e);if(l){let e=h(l)?l.call(n):l;Reflect.ownKeys(e).forEach(t=>{En(t,e[t])})}f&&jr(f,e,`c`);function A(e,t){d(t)?t.forEach(t=>e(t.bind(n))):t&&e(t.bind(n))}if(A(dr,p),A(fr,m),A(pr,g),A(mr,_),A(ar,y),A(or,b),A(br,T),A(yr,te),A(vr,ne),A(hr,S),A(gr,w),A(_r,re),d(E)){if(E.length){let t=e.exposed||={};E.forEach(e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t,enumerable:!0})})}else e.exposed||={}}ee&&e.render===r&&(e.render=ee),D!=null&&(e.inheritAttrs=D),O&&(e.components=O),k&&(e.directives=k),re&&Qn(e)}function Ar(e,t,n=r){d(e)&&(e=Rr(e));for(let n in e){let r=e[n],i;i=v(r)?`default`in r?Dn(r.from||n,r.default,!0):Dn(r.from||n):Dn(r),z(i)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>i.value,set:e=>i.value=e}):t[n]=i}}function jr(e,t,n){tn(d(e)?e.map(e=>e.bind(t.proxy)):e.bind(t.proxy),t,n)}function Mr(e,t,n,r){let i=r.includes(`.`)?Nn(n,r):()=>n[r];if(g(e)){let n=t[e];h(n)&&An(i,n)}else if(h(e))An(i,e.bind(n));else if(v(e)){if(d(e))e.forEach(e=>Mr(e,t,n,r));else{let r=h(e.handler)?e.handler.bind(n):t[e.handler];h(r)&&An(i,r,e)}}}function Nr(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=>Pr(c,e,o,!0)),Pr(c,t,o)),v(t)&&a.set(t,c),c}function Pr(e,t,n,r=!1){let{mixins:i,extends:a}=t;a&&Pr(e,a,n,!0),i&&i.forEach(t=>Pr(e,t,n,!0));for(let i in t)if(!(r&&i===`expose`)){let r=Fr[i]||n&&n[i];e[i]=r?r(e[i],t[i]):t[i]}return e}var Fr={data:Ir,props:Br,emits:Br,methods:zr,computed:zr,beforeCreate:U,created:U,beforeMount:U,mounted:U,beforeUpdate:U,updated:U,beforeDestroy:U,beforeUnmount:U,destroyed:U,unmounted:U,activated:U,deactivated:U,errorCaptured:U,serverPrefetch:U,components:zr,directives:zr,watch:Vr,provide:Ir,inject:Lr};function Ir(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 Lr(e,t){return zr(Rr(e),Rr(t))}function Rr(e){if(d(e)){let t={};for(let n=0;nt===`modelValue`||t===`model-value`?e.modelModifiers:e[`${t}Modifiers`]||e[`${T(t)}Modifiers`]||e[`${E(t)}Modifiers`];function qr(e,n,...r){if(e.isUnmounted)return;let i=e.vnode.props||t,a=r,o=n.startsWith(`update:`),s=o&&Kr(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=O(n)]||i[c=O(T(n))];!l&&o&&(l=i[c=O(E(n))]),l&&tn(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,tn(u,e,6,a)}}var Jr=new WeakMap;function Yr(e,t,n=!1){let r=n?Jr: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=Yr(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 Xr(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,E(t))||u(e,t))}function Zr(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,_=Sn(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:Qr(c)}}catch(t){Li.length=0,nn(t,e,1),v=Y(G)}let b=v;if(y&&g!==!1){let e=Object.keys(y),{shapeFlag:t}=b;e.length&&t&7&&(a&&e.some(o)&&(y=$r(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&&Yn(Fn(b.type)&&Jn(b)||b,n.transition),v=b,Sn(_),v}var Qr=e=>{let t;for(let n in e)(n===`class`||n===`style`||a(n))&&((t||={})[n]=e[n]);return t},$r=(e,t)=>{let n={};for(let r in e)(!o(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function ei(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?ti(r,o,l):!!o;if(c&8){let e=t.dynamicProps;for(let t=0;tObject.create(ii),oi=e=>Object.getPrototypeOf(e)===ii;function si(e,t,n,r=!1){let i={},a=ai();e.propsDefaults=Object.create(null),li(e,t,i,a);for(let t in e.propsOptions[0])t in i||(i[t]=void 0);e.props=n?r?i:Mt(i):e.type.props?i:a,e.attrs=a}function ci(e,t,n,r){let{props:i,attrs:a,vnode:{patchFlag:o}}=e,s=R(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]=fi(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`,hi=e=>d(e)?e.map(Zi):[Zi(e)],gi=(e,t,n)=>{if(t._n)return t;let r=Cn((...e)=>hi(t(...e)),n);return r._c=!1,r},_i=(e,t,n)=>{let r=e._ctx;for(let n in e){if(mi(n))continue;let i=e[n];if(h(i))t[n]=gi(n,i,r);else if(i!=null){let e=hi(i);t[n]=()=>e}}},vi=(e,t)=>{let n=hi(t);e.slots.default=()=>n},yi=(e,t,n)=>{for(let r in t)(n||!mi(r))&&(e[r]=t[r])},bi=(e,t,n)=>{let r=e.slots=ai();if(e.vnode.shapeFlag&32){let e=t._;e?(yi(r,t,n),n&&A(r,`_`,e,!0)):_i(t,r)}else t&&vi(e,t)},xi=(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:yi(a,n,r):(o=!n.$stable,_i(n,a)),s=n}else n&&(vi(e,n),s={default:1});if(o)for(let e in a)!mi(e)&&s[e]==null&&delete a[e]},Si=Pi;function Ci(e){return wi(e)}function wi(e,i){let a=j();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=he(e),M(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 Fi:y(e,t,n,r);break;case G:b(e,t,n,r);break;case Ii:e??x(t,n,r,o);break;case W:O(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,ve)}u!=null&&i?tr(u,e&&e.ref,a,t||e,!t):u==null&&e&&e.ref!=null&&tr(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)te(t,n,r,i,a,o,s,c);else{let n=e.el&&e.el._isVueCE?e.el:null;try{n&&n._beginPatch(),re(e,t,i,a,o,s,c)}finally{n&&n._endPatch()}}},te=(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&&T(e.children,d,null,r,i,Ti(e,a),s,u),_&&Tn(e,null,r,`created`),ne(d,e,e.scopeId,s,r),m){for(let e in m)e!==`value`&&!ee(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)}_&&Tn(e,null,r,`beforeMount`);let v=Di(i,g);v&&g.beforeEnter(d),o(d,t,n),((f=m&&m.onVnodeMounted)||v||_)&&Si(()=>{try{f&&ta(f,r,e),v&&g.enter(d),_&&Tn(e,null,r,`mounted`)}finally{}},i)},ne=(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&&Ei(r,!1),(g=h.onVnodeBeforeUpdate)&&ta(g,r,n,e),f&&Tn(n,e,r,`beforeUpdate`),r&&Ei(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?E(e.dynamicChildren,d,l,r,i,Ti(n,a),o):s||ce(e,n,l,null,r,i,Ti(n,a),o,!1),u>0){if(u&16)D(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&&Tn(n,e,r,`updated`)},i)},E=(e,t,n,r,i,a,o)=>{for(let s=0;s{if(n!==r){if(n!==t)for(let t in n)!ee(t)&&!(t in r)&&c(e,t,n[t],null,a,i);for(let t in r){if(ee(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)}},O=(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),T(t.children||[],n,f,i,a,s,c,l)):p>0&&p&64&&m&&e.dynamicChildren&&e.dynamicChildren.length===m.length?(E(e.dynamicChildren,m,n,i,a,s,c),(t.key!=null||i&&t===i.subTree)&&Oi(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):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(ir(e)&&(s.ctx.renderer=ve),fa(s,!1,o),s.asyncDep){if(i&&i.registerDep(s,oe,o),!e.el){let r=s.subTree=Y(G);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(ei(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=Ai(e);if(n){t&&(t.el=c.el,se(e,t,o)),n.asyncDep.then(()=>{Si(()=>{e.isUnmounted||l()},i)});return}}let u=t,d;Ei(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),Ei(e,!0);let f=Zr(e),p=e.subTree;e.subTree=f,v(p,f,m(p.el),he(p),e,i,a),t.el=f.el,u===null&&ri(e,f.el),r&&Si(r,i),(d=t.props&&t.props.onVnodeUpdated)&&Si(()=>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=rr(t);if(Ei(e,!1),l&&ie(l),!m&&(o=c&&c.onVnodeBeforeMount)&&ta(o,d,t),Ei(e,!0),s&&P){let t=()=>{e.subTree=Zr(e),P(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=Zr(e);v(null,o,n,r,e,i,a),t.el=o.el}if(u&&Si(u,i),!m&&(o=c&&c.onVnodeMounted)){let e=t;Si(()=>ta(o,d,e),i)}(t.shapeFlag&256||d&&rr(d.vnode)&&d.vnode.shapeFlag&256)&&e.a&&Si(e.a,i),e.isMounted=!0,t=n=r=null}};e.scope.on();let c=e.effect=new Te(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=()=>pn(u),Ei(e,!0),l()},se=(e,t,n)=>{t.component=e;let r=e.vnode.props;e.vnode=t,e.next=null,ci(e,t.props,r,n),xi(e,t.children,n),Be(),gn(e),Ve()},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&&me(l,i,a),d!==l&&p(n,d)):u&16?m&16?ue(l,d,n,r,i,a,o,s,c):me(l,i,a,!0):(u&8&&p(n,``),m&16&&T(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?me(e,a,o,!0,!1,f):T(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?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;)M(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){M(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?M(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?ki(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,ve);return}if(c===W){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[In];a._isLeaving&&a[In](!0),l.persisted&&!e?u():r(a,()=>{u(),c&&c()})};i?i(a,u,d):d()}}else o(a,t,n)},M=(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&&(Be(),tr(s,null,n,e,!0),Ve()),p!=null&&(t.renderCache[p]=void 0),u&256){t.ctx.deactivate(e);return}let h=u&1&&f,g=!rr(e),_;if(g&&(_=o&&o.onVnodeBeforeUnmount)&&ta(_,t,e),u&6)pe(e.component,n,r);else{if(u&128){e.suspense.unmount(n,r);return}h&&Tn(e,null,t,`beforeUnmount`),u&64?e.type.remove(e,t,n,ve,r):l&&!l.hasOnce&&(a!==W||d>0&&d&64)?me(l,t,n,!1,!0):(a===W&&d&384||!i&&u&16)&&me(c,t,n),r&&N(e)}let v=m!=null&&p==null;(g&&(_=o&&o.onVnodeUnmounted)||h||v)&&Si(()=>{_&&ta(_,t,e),h&&Tn(e,null,t,`unmounted`),v&&(e.el=null)},n)},N=e=>{let{type:t,el:n,anchor:r,transition:i}=e;if(t===W){fe(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()},fe=(e,t)=>{let n;for(;e!==t;)n=h(e),s(e),e=n;s(t)},pe=(e,t,n)=>{let{bum:r,scope:i,job:a,subTree:o,um:s,m:c,a:l}=e;ji(c),ji(l),r&&ie(r),i.stop(),a&&(a.flags|=8,M(o,e,t,n)),s&&Si(s,t),Si(()=>{e.isUnmounted=!0},t)},me=(e,t,n,r=!1,i=!1,a=0)=>{for(let o=a;o{if(e.shapeFlag&6)return he(e.component.subTree);if(e.shapeFlag&128)return e.suspense.next();let t=h(e.anchor||e.el),n=t&&t[Pn];return n?h(n):t},ge=!1,_e=(e,t,n)=>{let r;e==null?t._vnode&&(M(t._vnode,null,null,!0),r=t._vnode.component):v(t._vnode||null,e,t,null,null,null,n),t._vnode=e,ge||=(ge=!0,gn(r),_n(),!1)},ve={p:v,um:M,m:de,r:N,mt:A,mc:T,pc:ce,pbc:E,n:he,o:e},ye,P;return i&&([ye,P]=i(ve)),{render:_e,hydrate:ye,createApp:Wr(_e,ye)}}function Ti({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 Ei({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Di(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Oi(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 Ai(e){let t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Ai(t)}function ji(e){if(e)for(let t=0;te.__isSuspense;function Pi(e,t){t&&t.pendingBranch?d(e)?t.effects.push(...e):t.effects.push(e):hn(e)}var W=Symbol.for(`v-fgt`),Fi=Symbol.for(`v-txt`),G=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)||z(e)||h(e)?{i:bn,r:e,k:t,f:!!n}:e);function J(e,t=null,n=null,r=0,i=null,a=e===W?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:xn,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:bn};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===xr)&&(e=G),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(ya(e)&&(e=e.__vccOpts),t){t=Yi(t);let{class:e,style:n}=t;e&&!g(e)&&(t.class=N(e)),v(n)&&(Rt(n)&&!d(n)&&(n=s({},n)),t.style=ce(n))}let o=g(e)?1:Ni(e)?128:Fn(e)?64:v(e)?4:h(e)?2:0;return J(e,t,n,r,i,o,a,!0)}function Yi(e){return e?Rt(e)||oi(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!==W?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&&Yn(u,c.clone(u)),u}function X(e=` `,t=0){return Y(Fi,null,e,t)}function Z(e=``,t=!1){return t?(K(),Ui(G,null,e)):Y(G,null,e)}function Zi(e){return e==null||typeof e==`boolean`?Y(G):d(e)?Y(W,null,e.slice()):Wi(e)?Qi(e):Y(Fi,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&&!oi(t)?t._ctx=bn:r===3&&bn&&(bn.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:bn},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;nQ||bn,oa,sa;{let e=j(),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)}};oa=t(`__VUE_INSTANCE_SETTERS__`,e=>Q=e),sa=t(`__VUE_SSR_SETTERS__`,e=>da=e)}var ca=e=>{let t=Q;return oa(e),e.scope.on(),()=>{e.scope.off(),oa(t)}},la=()=>{Q&&Q.scope.off(),oa(null)};function ua(e){return e.vnode.shapeFlag&4}var da=!1;function fa(e,t=!1,n=!1){t&&sa(t);let{props:r,children:i}=e.vnode,a=ua(e);si(e,r,a,t),bi(e,i,n||t);let o=a?pa(e,t):void 0;return t&&sa(!1),o}function pa(e,t){let n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Er);let{setup:r}=n;if(r){Be();let n=e.setupContext=r.length>1?_a(e):null,i=ca(e),a=en(r,e,0,[e.props,n]),o=y(a);if(Ve(),i(),(o||e.sp)&&!rr(e)&&Qn(e),o){if(a.then(la,la),t)return a.then(n=>{sa(!0);try{ma(e,n,t)}finally{sa(!1)}}).catch(t=>{nn(t,e,0)});e.asyncDep=a}else ma(e,a,t)}else ha(e,t)}function ma(e,t,n){h(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:v(t)&&(e.setupState=Gt(t)),ha(e,n)}function ha(e,t,n){let i=e.type;e.render||=i.render||r;{let t=ca(e);Be();try{kr(e)}finally{Ve(),t()}}}var ga={get(e,t){return L(e,`get`,``),e[t]}};function _a(e){return{attrs:new Proxy(e.attrs,ga),slots:e.slots,emit:e.emit,expose:t=>{e.exposed=t||{}}}}function va(e){return e.exposed?e.exposeProxy||=new Proxy(Gt(zt(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in wr)return wr[n](e)},has(e,t){return t in e||t in wr}}):e.proxy}function ya(e){return h(e)&&`__vccOpts`in e}var ba=(e,t)=>qt(e,t,da);function xa(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 Sa=`3.5.42`,Ca=void 0,wa=typeof window<`u`&&window.trustedTypes;if(wa)try{Ca=wa.createPolicy(`vue`,{createHTML:e=>e})}catch{}var Ta=Ca?e=>Ca.createHTML(e):e=>e,Ea=`http://www.w3.org/2000/svg`,Da=`http://www.w3.org/1998/Math/MathML`,Oa=typeof document<`u`?document:null,ka=Oa&&Oa.createElement(`template`),Aa={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`?Oa.createElementNS(Ea,e):t===`mathml`?Oa.createElementNS(Da,e):n?Oa.createElement(e,{is:n}):Oa.createElement(e);return e===`select`&&r&&r.multiple!=null&&i.setAttribute(`multiple`,r.multiple),i},createText:e=>Oa.createTextNode(e),createComment:e=>Oa.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Oa.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{ka.innerHTML=Ta(r===`svg`?`${e}`:r===`mathml`?`${e}`:e);let i=ka.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]}},ja=`transition`,Ma=`animation`,Na=Symbol(`_vtc`),Pa={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},Fa=s({},Bn,Pa),Ia=(e=>(e.displayName=`Transition`,e.props=Fa,e))((e,{slots:t})=>xa(Wn,za(e),t)),La=(e,t=[])=>{d(e)?e.forEach(e=>e(...t)):e&&e(...t)},Ra=e=>e?d(e)?e.some(e=>e.length>1):e.length>1:!1;function za(e){let t={};for(let n in e)n in Pa||(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=Ba(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:ee=b}=t,te=(e,t,n,r)=>{e._enterCancelled=r,Ua(e,t?d:c),Ua(e,t?u:o),n&&n()},ne=(e,t)=>{e._isLeaving=!1,Ua(e,f),Ua(e,m),Ua(e,p),t&&t()},T=e=>(t,n)=>{let i=e?w:y,o=()=>te(t,e,n);La(i,[t,o]),Wa(()=>{Ua(t,e?l:a),Ha(t,e?d:c),Ra(i)||Ka(t,r,g,o)})};return s(t,{onBeforeEnter(e){La(v,[e]),Ha(e,a),Ha(e,o)},onBeforeAppear(e){La(C,[e]),Ha(e,l),Ha(e,u)},onEnter:T(!1),onAppear:T(!0),onLeave(e,t){e._isLeaving=!0;let n=()=>ne(e,t);Ha(e,f),e._enterCancelled?(Ha(e,p),Xa(e)):(Xa(e),Ha(e,p)),Wa(()=>{e._isLeaving&&(Ua(e,f),Ha(e,m),Ra(x)||Ka(e,r,_,n))}),La(x,[e,n])},onEnterCancelled(e){te(e,!1,void 0,!0),La(b,[e])},onAppearCancelled(e){te(e,!0,void 0,!0),La(ee,[e])},onLeaveCancelled(e){ne(e),La(S,[e])}})}function Ba(e){if(e==null)return null;if(v(e))return[Va(e.enter),Va(e.leave)];{let t=Va(e);return[t,t]}}function Va(e){return oe(e)}function Ha(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.add(t)),(e[Na]||(e[Na]=new Set)).add(t)}function Ua(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.remove(t));let n=e[Na];n&&(n.delete(t),n.size||(e[Na]=void 0))}function Wa(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}var Ga=0;function Ka(e,t,n,r){let i=e._endId=++Ga,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(`${ja}Delay`),a=r(`${ja}Duration`),o=Ja(i,a),s=r(`${Ma}Delay`),c=r(`${Ma}Duration`),l=Ja(s,c),u=null,d=0,f=0;t===ja?o>0&&(u=ja,d=o,f=a.length):t===Ma?l>0&&(u=Ma,d=l,f=c.length):(d=Math.max(o,l),u=d>0?o>l?ja:Ma:null,f=u?u===ja?a.length:c.length:0);let p=u===ja&&/\b(?:transform|all)(?:,|$)/.test(r(`${ja}Property`).toString());return{type:u,timeout:d,propCount:f,hasTransform:p}}function Ja(e,t){for(;e.lengthYa(t)+Ya(e[n])))}function Ya(e){return e===`auto`?0:Number(e.slice(0,-1).replace(`,`,`.`))*1e3}function Xa(e){return(e?e.ownerDocument:document).body.offsetHeight}function Za(e,t,n){let r=e[Na];r&&(t=(t?[t,...r]:[...r]).join(` `)),t==null?e.removeAttribute(`class`):n?e.setAttribute(`class`,t):e.className=t}var Qa=Symbol(`_vod`),$a=Symbol(`_vsh`),eo={name:`show`,beforeMount(e,{value:t},{transition:n}){e[Qa]=e.style.display===`none`?``:e.style.display,n&&t?n.beforeEnter(e):to(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),to(e,!0),r.enter(e)):r.leave(e,()=>{to(e,!1)}):to(e,t))},beforeUnmount(e,{value:t}){to(e,t)}};function to(e,t){e.style.display=t?e[Qa]:`none`,e[$a]=!t}var no=Symbol(``),ro=/(?:^|;)\s*display\s*:/;function io(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]??oo(r,t,``)}else for(let e in t)n[e]??oo(r,e,``)}for(let i in n){i===`display`&&(a=!0);let o=n[i];o==null?oo(r,i,``):uo(e,i,!g(t)&&t?t[i]:void 0,o)||oo(r,i,o)}}else if(i){if(t!==n){let e=r[no];e&&(n+=`;`+e),r.cssText=n,a=ro.test(n)}}else t&&e.removeAttribute(`style`);Qa in e&&(e[Qa]=a?r.display:``,e[$a]&&(r.display=`none`))}var ao=/\s*!important$/;function oo(e,t,n){if(d(n))n.forEach(n=>oo(e,t,n));else if(n??=``,t.startsWith(`--`))ao.test(n)?e.setProperty(t,n.replace(ao,``),`important`):e.setProperty(t,n);else{let r=lo(e,t);ao.test(n)?e.setProperty(E(r),n.replace(ao,``),`important`):e[r]=n}}var so=[`Webkit`,`Moz`,`ms`],co={};function lo(e,t){let n=co[t];if(n)return n;let r=T(t);if(r!==`filter`&&r in e)return co[t]=r;r=D(r);for(let n=0;nSo||=(Co.then(()=>So=0),Date.now());function To(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,Do=(e,t,n,r,i,s)=>{let c=i===`svg`;t===`class`?Za(e,r,c):t===`style`?io(e,n,r):a(t)?o(t)||vo(e,t,n,r,s):(t[0]===`.`?(t=t.slice(1),1):t[0]===`^`?(t=t.slice(1),0):Oo(e,t,r,c))?(mo(e,t,r),!e.tagName.includes(`-`)&&(t===`value`||t===`checked`||t===`selected`)&&po(e,t,r,c,s,t!==`value`)):e._isVueCE&&(ko(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!g(r)))?mo(e,T(t),r,s,t):(t===`true-value`?e._trueValue=r:t===`false-value`&&(e._falseValue=r),po(e,t,r,c))};function Oo(e,t,n,r){if(r)return!!(t===`innerHTML`||t===`textContent`||t in e&&Eo(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 Eo(t)&&g(n)?!1:t in e}function ko(e,t){let n=e._def.props;if(!n)return!1;let r=T(t);return Array.isArray(n)?n.some(e=>T(e)===r):Object.keys(n).some(e=>T(e)===r)}var Ao=e=>{let t=e.props[`onUpdate:modelValue`]||!1;return d(t)?e=>ie(t,e):t};function jo(e){e.target.composing=!0}function Mo(e){let t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event(`input`)))}var No=Symbol(`_assign`),Po=Symbol(`_initialValue`);function Fo(e,t,n){return t&&(e=e.trim()),n&&(e=ae(e)),e}var Io={created(e,{modifiers:{lazy:t,trim:n,number:r}},i){e.parentNode&&(e.type===`text`?e[Po]=e.defaultValue.replace(/[\r\n]/g,``):e.type===`textarea`&&(e[Po]=e.defaultValue.replace(/\r\n?/g,` +`))),e[No]=Ao(i);let a=r||i.props&&i.props.type===`number`;ho(e,t?`change`:`input`,t=>{t.target.composing||e[No](Fo(e.value,n,a))}),(n||a)&&ho(e,`change`,()=>{e.value=Fo(e.value,n,a)}),t||(ho(e,`compositionstart`,jo),ho(e,`compositionend`,Mo),ho(e,`change`,Mo))},mounted(e,{value:t,modifiers:{trim:n,number:r}}){let i=t??``,a=e[Po];delete e[Po],a!==void 0&&(e.type===`text`||e.type===`textarea`)&&e.value!==a?e[No](Fo(e.value,n,r)):e.value=i},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:i,number:a}},o){if(e[No]=Ao(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)}},Lo={deep:!0,created(e,t,n){e[No]=Ao(n),ho(e,`change`,()=>{let t=e._modelValue,n=Ho(e),r=e.checked,i=e[No];if(d(t)){let e=ve(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(Uo(e,r))})},mounted:Ro,beforeUpdate(e,t,n){e[No]=Ao(n),Ro(e,t,n)}};function Ro(e,{value:t,oldValue:n},r){e._modelValue=t;let i;if(d(t))i=ve(t,r.props.value)>-1;else if(p(t))i=t.has(r.props.value);else{if(t===n)return;i=_e(t,Uo(e,!0))}e.checked!==i&&(e.checked=i)}var zo={deep:!0,created(e,{value:t,modifiers:{number:n}},r){e._modelValue=t,ho(e,`change`,()=>{let t=Array.prototype.filter.call(e.options,e=>e.selected).map(e=>n?ae(Ho(e)):Ho(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[No](i)}finally{dn(()=>{e._pendingValue===a&&(e._pendingValue=void 0)})}}),e[No]=Ao(r)},mounted(e,{value:t}){Vo(e,t)},beforeUpdate(e,{value:t},n){e._modelValue=t,e[No]=Ao(n)},updated(e,{value:t}){let n=e._pendingValue;e._pendingValue=void 0,(!n||n[0]!==e.multiple||!Bo(t,n[1],n[0]))&&Vo(e,t)}};function Bo(e,t,n){if(!n||d(e))return _e(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 Vo(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)):ve(t,o)>-1}else a.selected=t.has(o)}else if(_e(Ho(a),t)){e.selectedIndex!==i&&(e.selectedIndex=i);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function Ho(e){return`_value`in e?e._value:e.value}function Uo(e,t){let n=t?`_trueValue`:`_falseValue`;return n in e?e[n]:t}var Wo=[`ctrl`,`shift`,`alt`,`meta`],Go={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)=>Wo.some(n=>e[`${n}Key`]&&!t.includes(n))},Ko=(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=E(n.key);if(t.some(e=>e===r||qo[e]===r))return e(n)}))},Yo=s({patchProp:Do},Aa),Xo;function Zo(){return Xo||=Ci(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})=>xa(`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=>xa(...e)),...c.default?[c.default()]:[]]),$=(e,t)=>(n,{slots:r})=>xa(rs,{...n,iconNode:t,name:e},r),is=$(`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`}]]),as=$(`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`}]]),os=$(`CheckIcon`,[[`path`,{d:`M20 6 9 17l-5-5`,key:`1gmf2c`}]]),ss=$(`ChevronDownIcon`,[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]),cs=$(`ChevronRightIcon`,[[`path`,{d:`m9 18 6-6-6-6`,key:`mthhwq`}]]),ls=$(`CirclePlusIcon`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M8 12h8`,key:`1wcyev`}],[`path`,{d:`M12 8v8`,key:`napkw2`}]]),us=$(`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`}]]),ds=$(`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`}]]),fs=$(`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`}]]),ps=$(`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`}]]),ms=$(`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`}]]),hs=$(`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`}]]),gs=$(`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`}]]),_s=$(`PlusIcon`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`M12 5v14`,key:`s699le`}]]),vs=$(`SearchIcon`,[[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}],[`path`,{d:`m21 21-4.3-4.3`,key:`1qie3q`}]]),ys=$(`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`}]]),bs=$(`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`}]]),xs=$(`XIcon`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]),Ss=e=>e.replace(/&/g,`&`).replace(//g,`>`).replace(/"/g,`"`).replace(/'/g,`'`),Cs=e=>{let t=Ss(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 ws(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(`

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

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

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

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

    ${Cs(t)}

    `))}return i(),n.join(``)}function Ts(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 Es(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 Ds(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 Os(e){return e?new Date(e).toISOString():null}var ks={key:0,class:`center`},As={key:1,class:`auth-shell`},js={class:`auth-card`},Ms={key:0,role:`alert`},Ns={key:2,class:`shell`},Ps={class:`brand-row`},Fs={class:`primary-nav`},Is={class:`section-title`},Ls={class:`folders`},Rs={class:`folder-row`},zs=[`onClick`],Bs={class:`row-actions`},Vs=[`onClick`],Hs=[`onClick`],Us=[`onClick`],Ws=[`onClick`],Gs={class:`row-actions`},Ks=[`onClick`],qs=[`onClick`],Js=[`onClick`],Ys={class:`row-actions`},Xs=[`onClick`],Zs=[`onClick`],Qs={class:`settings`},$s={class:`topbar`},ec={class:`search`},tc={class:`list-toolbar`},nc={key:0},rc={key:1,class:`batch-bar`},ic=[`onClick`],ac=[`onClick`],oc=[`onClick`],sc={class:`meta`},cc={key:0},lc={key:1},uc=[`title`],dc=[`onClick`],fc=[`onClick`],pc=[`onClick`],mc=[`onClick`],hc=[`onClick`],gc={key:0,class:`empty`},_c={class:`detail-head`},vc={key:0,class:`detail-form`},yc={class:`detail-title`},bc=[`value`],xc=[`value`],Sc={class:`field`},Cc={class:`field-label`},wc={class:`tag-picker`},Tc=[`onClick`],Ec={key:0,class:`hint`},Dc={class:`field markdown`},Oc={class:`field-label`},kc=[`innerHTML`],Ac={class:`subtasks`},jc={class:`field-label`},Mc=[`onClick`],Nc={class:`check`},Pc={key:0,class:`hint`},Fc={class:`detail-actions`},Ic={key:1,class:`paper`},Lc={class:`bottom`},Rc={key:0,class:`toast`,role:`status`},zc={key:2,class:`error-toast`,role:`alert`};Qo(Zn({__name:`App`,setup(e){let t=B(null),n=B(!1),r=B(``),i=B(``),a=B([]),o=B([]),s=B([]),c=B([]),l=B([]),u=B(``),d=B(`tasks`),f=B(null),p=B(new Set),m=B(``),h=B(``),g=B(``),_=B(``),v=B(!1),y=B(!1),b=B(!1),x=B(!1),S=B(!0),C=B(new Set),w=ba(()=>d.value===`trash`?`回收站`:d.value===`today`?`今天`:d.value===`upcoming`?`最近 7 天`:o.value.find(e=>e.id===u.value)?.name||`收集箱`),ee=ba(()=>d.value===`trash`?l.value:c.value),te=ba(()=>{let e=new Date,t=new Date(e);t.setDate(t.getDate()+7);let n=ee.value;return h.value.trim()?n:(d.value===`tasks`&&(n=n.filter(e=>e.list_id===u.value)),d.value===`today`&&(n=n.filter(t=>t.due_at&&new Date(t.due_at).toDateString()===e.toDateString())),d.value===`upcoming`&&(n=n.filter(n=>n.due_at&&new Date(n.due_at)>=e&&new Date(n.due_at)<=t)),!S.value&&d.value!==`trash`&&(n=n.filter(e=>!e.completed)),n)}),ne=ba(()=>Es(Ts(te.value,h.value))),T=ba(()=>ne.value),re=ba(()=>p.value.size),E;An(h,()=>{E&&window.clearTimeout(E),d.value!==`trash`&&(E=window.setTimeout(()=>oe(),250))});async function D(e,t={}){let n=await fetch(`/api/v1`+e,{credentials:`include`,headers:{"Content-Type":`application/json`,...t.headers||{}},...t});if(!n.ok){let e=`请求失败`;try{let t=await n.json();e=typeof t.detail==`string`?t.detail:e}catch{}throw Error(e)}return n.status===204?null:n.json()}function O(e){_.value=e,window.setTimeout(()=>{_.value===e&&(_.value=``)},2400)}function k(e){g.value=e instanceof Error?e.message:`请求失败`}async function ie(){try{let e=await D(`/setup/status`);t.value=e.initialized,e.initialized&&(await D(`/me`),n.value=!0,await oe())}catch{n.value=!1,t.value??=!0}}async function A(){g.value=``;try{await D(t.value?`/auth/login`:`/setup/initialize`,{method:`POST`,body:JSON.stringify({username:r.value,password:i.value})}),t.value=!0,n.value=!0,await oe()}catch(e){k(e)}}async function ae(e){let t=[],n=null;do{let r=e.includes(`?`)?`&`:`?`,i=await D(n?`${e}${r}cursor=${encodeURIComponent(n)}`:e);t.push(...i.items??i),n=i.next_cursor??null}while(n);return t}async function oe(){v.value=!0,g.value=``;try{let e=h.value?`/tasks?q=${encodeURIComponent(h.value)}`:`/tasks`,[t,n,r,i]=await Promise.all([D(`/folders`),D(`/lists`),D(`/tags`).catch(()=>[]),ae(e)]);a.value=t,o.value=n,s.value=r,c.value=i,u.value||=o.value.find(e=>e.is_inbox)?.id||o.value[0]?.id||``,C.value=new Set(a.value.map(e=>e.id))}catch(e){k(e)}finally{v.value=!1}}async function se(){try{l.value=await ae(`/trash`)}catch(e){k(e)}}async function j(e,t){d.value=e,t&&(u.value=t),f.value=null,p.value=new Set,y.value=!1,e===`trash`&&await se()}async function le(){if(m.value.trim()&&u.value)try{let e=await D(`/tasks`,{method:`POST`,body:JSON.stringify({title:m.value.trim(),list_id:u.value})});c.value.push(e),m.value=``,ge(e),O(`任务已添加`)}catch(e){k(e)}}async function ue(e,t){let n=await D(`/tasks/${e.id}`,{method:`PATCH`,body:JSON.stringify({...t,version:e.version})}),r=c.value.findIndex(t=>t.id===e.id);return r>=0&&(c.value[r]={...c.value[r],...n}),f.value?.id===e.id&&(f.value={...f.value,...n}),n}async function de(e){try{await ue(e,{completed:!e.completed}),O(e.completed?`已重新打开`:`完成啦`)}catch(e){k(e)}}async function M(){if(f.value?.title.trim())try{let e=f.value;await ue(e,{title:e.title.trim(),description:e.description,priority:Number(e.priority),due_at:Os(Ds(e.due_at)),list_id:e.list_id,tag_ids:(e.tags??[]).map(e=>e.id)}),O(`已保存`)}catch(e){k(e)}}async function fe(e){if(window.confirm(`把“${e.title}”移到回收站?`))try{await D(`/tasks/${e.id}`,{method:`DELETE`}),c.value=c.value.filter(t=>t.id!==e.id&&t.parent_id!==e.id),f.value=null,b.value=!1,O(`已移到回收站`)}catch(e){k(e)}}async function pe(e){try{await D(`/tasks/${e.id}/restore`,{method:`POST`}),l.value=l.value.filter(t=>t.id!==e.id),O(`任务已恢复`)}catch(e){k(e)}}async function me(e){if(window.confirm(`永久删除“${e.title}”?这个操作不能撤销。`))try{await D(`/trash/${e.id}`,{method:`DELETE`}),l.value=l.value.filter(t=>t.id!==e.id),O(`已永久删除`)}catch(e){k(e)}}async function he(){if(!f.value)return;let e=window.prompt(`子任务名称`)?.trim();if(e)try{let t=await D(`/tasks`,{method:`POST`,body:JSON.stringify({title:e,list_id:f.value.list_id,parent_id:f.value.id})});c.value.push(t),O(`子任务已添加`)}catch(e){k(e)}}function ge(e){f.value={...e,tags:e.tags?[...e.tags]:[]},x.value=!1,b.value=!0}function _e(e){let t=new Set(p.value);t.has(e)?t.delete(e):t.add(e),p.value=t}async function ve(e){if(!p.value.size)return;let t={task_ids:[...p.value]};if(e===`complete`&&(t.completed=!0),e===`move`){let e=window.prompt(`输入目标清单 ID`,u.value)?.trim();if(!e)return;t.list_id=e}try{e===`delete`&&(t.soft_delete=!0),await D(`/tasks/batch`,{method:`POST`,body:JSON.stringify(t)}),p.value=new Set,await oe(),O(e===`delete`?`已批量移到回收站`:`批量操作完成`)}catch(e){k(e)}}async function ye(){let e=window.prompt(`文件夹名称`)?.trim();if(e)try{a.value.push(await D(`/folders`,{method:`POST`,body:JSON.stringify({name:e})})),O(`文件夹已创建`)}catch(e){k(e)}}async function be(e=null){let t=window.prompt(`清单名称`)?.trim();if(t)try{let n=await D(`/lists`,{method:`POST`,body:JSON.stringify({name:t,folder_id:e})});o.value.push(n),await j(`tasks`,n.id),O(`清单已创建`)}catch(e){k(e)}}async function xe(e,t){let n=window.prompt(`新名称`,t.name)?.trim();if(n&&n!==t.name)try{let r=await D(`/${e}/${t.id}`,{method:`PATCH`,body:JSON.stringify({name:n})});Object.assign(t,r),O(`已重命名`)}catch(e){k(e)}}async function F(e,t){if(window.confirm(`删除“${t.name}”?`))try{await D(`/${e}/${t.id}`,{method:`DELETE`}),await oe(),O(`已删除`)}catch(e){k(e)}}async function Se(){let e=window.prompt(`标签名称`)?.trim();if(!e)return;let t=window.prompt(`标签颜色`,`#F15A29`)||`#F15A29`;try{s.value.push(await D(`/tags`,{method:`POST`,body:JSON.stringify({name:e,color:t})})),O(`标签已创建`)}catch(e){k(e)}}function Ce(e){return!!f.value?.tags?.some(t=>t.id===e.id)}function I(e){f.value&&(f.value.tags=Ce(e)?(f.value.tags??[]).filter(t=>t.id!==e.id):[...f.value.tags??[],e])}function we(e){let t=new Set(C.value);t.has(e)?t.delete(e):t.add(e),C.value=t}function Te(e){return e?new Intl.DateTimeFormat(`zh-CN`,{month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`}).format(new Date(e)):``}function Ee(){dn(()=>document.querySelector(`.quick-input`)?.focus())}return fr(ie),(e,l)=>t.value===null?(K(),q(`div`,ks,[...l[33]||=[J(`span`,{class:`loader`},null,-1),X(`正在打开 dodo…`,-1)]])):n.value?(K(),q(`div`,Ns,[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:N([`sidebar`,{open:y.value}])},[J(`div`,Ps,[l[37]||=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(V(xs))])]),J(`nav`,Fs,[J(`button`,{class:N({active:d.value===`tasks`&&o.value.find(e=>e.id===u.value)?.is_inbox}),onClick:l[4]||=e=>j(`tasks`,o.value.find(e=>e.is_inbox)?.id)},[Y(V(fs)),l[38]||=X(`收集箱`,-1)],2),J(`button`,{class:N({active:d.value===`today`}),onClick:l[5]||=e=>j(`today`)},[Y(V(ms)),l[39]||=X(`今天`,-1)],2),J(`button`,{class:N({active:d.value===`upcoming`}),onClick:l[6]||=e=>j(`upcoming`)},[Y(V(as)),l[40]||=X(`最近 7 天`,-1)],2),J(`button`,{class:N({active:d.value===`trash`}),onClick:l[7]||=e=>j(`trash`)},[Y(V(bs)),l[41]||=X(`回收站`,-1)],2)]),J(`div`,Is,[l[42]||=J(`span`,null,`我的清单`,-1),J(`span`,null,[J(`button`,{class:`mini-icon`,"aria-label":`新建文件夹`,onClick:ye},[Y(V(us))]),J(`button`,{class:`mini-icon`,"aria-label":`新建清单`,onClick:l[8]||=e=>be(null)},[Y(V(_s))])])]),J(`div`,Ls,[(K(!0),q(W,null,Sr(a.value,e=>(K(),q(`div`,{key:e.id,class:`folder-block`},[J(`div`,Rs,[J(`button`,{onClick:t=>we(e.id)},[C.value.has(e.id)?(K(),Ui(V(ss),{key:0})):(K(),Ui(V(cs),{key:1})),Y(V(us)),X(P(e.name),1)],8,zs),J(`span`,Bs,[J(`button`,{"aria-label":`重命名文件夹`,onClick:t=>xe(`folders`,e)},[Y(V(gs))],8,Vs),J(`button`,{"aria-label":`删除文件夹`,onClick:t=>F(`folders`,e)},[Y(V(bs))],8,Hs),J(`button`,{"aria-label":`在文件夹中新建清单`,onClick:t=>be(e.id)},[Y(V(_s))],8,Us)])]),(K(!0),q(W,null,Sr(o.value.filter(t=>t.folder_id===e.id&&!t.is_inbox),t=>wn((K(),q(`button`,{key:t.id,class:N([`list-row`,{active:d.value===`tasks`&&u.value===t.id}]),onClick:e=>j(`tasks`,t.id)},[l[43]||=J(`i`,null,null,-1),J(`span`,null,P(t.name),1),J(`span`,Gs,[J(`button`,{"aria-label":`重命名清单`,onClick:Ko(e=>xe(`lists`,t),[`stop`])},[Y(V(gs))],8,Ks),J(`button`,{"aria-label":`删除清单`,onClick:Ko(e=>F(`lists`,t),[`stop`])},[Y(V(bs))],8,qs)])],10,Ws)),[[eo,C.value.has(e.id)]])),128))]))),128)),(K(!0),q(W,null,Sr(o.value.filter(e=>!e.folder_id&&!e.is_inbox),e=>(K(),q(`button`,{key:e.id,class:N([`list-row`,{active:d.value===`tasks`&&u.value===e.id}]),onClick:t=>j(`tasks`,e.id)},[l[44]||=J(`i`,null,null,-1),J(`span`,null,P(e.name),1),J(`span`,Ys,[J(`button`,{"aria-label":`重命名清单`,onClick:Ko(t=>xe(`lists`,e),[`stop`])},[Y(V(gs))],8,Xs),J(`button`,{"aria-label":`删除清单`,onClick:Ko(t=>F(`lists`,e),[`stop`])},[Y(V(bs))],8,Zs)])],10,Js))),128))]),J(`button`,Qs,[Y(V(ys)),l[45]||=X(`设置`,-1)])],2),J(`main`,null,[J(`header`,$s,[J(`button`,{class:`icon mobile-only`,"aria-label":`打开菜单`,onClick:l[9]||=e=>y.value=!0},[Y(V(hs))]),J(`div`,null,[l[46]||=J(`p`,null,`今天也慢慢来`,-1),J(`h1`,null,P(w.value),1)]),J(`label`,ec,[Y(V(vs)),wn(J(`input`,{"onUpdate:modelValue":l[10]||=e=>h.value=e,placeholder:`搜索任务…`,"aria-label":`搜索任务`},null,512),[[Io,h.value]]),l[47]||=J(`kbd`,null,`⌘ K`,-1)])]),d.value===`trash`?Z(``,!0):(K(),q(`form`,{key:0,class:`quick`,onSubmit:Ko(le,[`prevent`])},[Y(V(ls)),wn(J(`input`,{"onUpdate:modelValue":l[11]||=e=>m.value=e,class:`quick-input`,placeholder:`添加任务,按回车保存`},null,512),[[Io,m.value]]),l[48]||=J(`button`,null,`添加`,-1)],32)),J(`div`,tc,[d.value===`trash`?Z(``,!0):(K(),q(`label`,nc,[wn(J(`input`,{"onUpdate:modelValue":l[12]||=e=>S.value=e,type:`checkbox`},null,512),[[Lo,S.value]]),l[49]||=X(` 显示已完成`,-1)])),J(`span`,null,P(te.value.length)+` 项`,1),h.value?(K(),q(`button`,{key:1,class:`link`,onClick:l[13]||=e=>h.value=``},`清除搜索`)):Z(``,!0)]),re.value?(K(),q(`div`,rc,[J(`b`,null,`已选 `+P(re.value)+` 项`,1),J(`button`,{onClick:l[14]||=e=>ve(`complete`)},[Y(V(os)),l[50]||=X(`完成`,-1)]),J(`button`,{onClick:l[15]||=e=>ve(`move`)},[Y(V(us)),l[51]||=X(`移动`,-1)]),J(`button`,{class:`danger`,onClick:l[16]||=e=>ve(`delete`)},[Y(V(bs)),l[52]||=X(`删除`,-1)]),J(`button`,{class:`icon`,"aria-label":`取消选择`,onClick:l[17]||=e=>p.value=new Set},[Y(V(xs))])])):Z(``,!0),J(`section`,{class:N([`task-list`,{loading:v.value}])},[(K(!0),q(W,null,Sr(T.value,e=>(K(),q(W,{key:e.task.id},[J(`article`,{class:N([`task-row`,{done:e.task.completed,selected:f.value?.id===e.task.id}])},[d.value===`trash`?Z(``,!0):(K(),q(`button`,{key:0,class:N([`select-box`,{checked:p.value.has(e.task.id)}]),"aria-label":`选择任务`,onClick:Ko(t=>_e(e.task.id),[`stop`])},[p.value.has(e.task.id)?(K(),Ui(V(os),{key:0})):Z(``,!0)],10,ic)),d.value===`trash`?Z(``,!0):(K(),q(`button`,{key:1,class:N([`check`,`p${e.task.priority}`]),"aria-label":`切换完成状态`,onClick:Ko(t=>de(e.task),[`stop`])},[e.task.completed?(K(),Ui(V(os),{key:0})):Z(``,!0)],10,ac)),J(`button`,{class:`task-main`,onClick:t=>d.value===`trash`?void 0:ge(e.task)},[J(`strong`,null,P(e.task.title),1),J(`span`,sc,[e.task.due_at?(K(),q(`span`,cc,[Y(V(as)),X(P(Te(e.task.due_at)),1)])):Z(``,!0),e.subtasks.length?(K(),q(`span`,lc,[Y(V(ps)),X(P(e.subtasks.filter(e=>e.completed).length)+`/`+P(e.subtasks.length),1)])):Z(``,!0),(K(!0),q(W,null,Sr(e.task.tags,e=>(K(),q(`i`,{key:e.id,class:`tag-dot`,style:ce({background:e.color}),title:e.name},null,12,uc))),128))])],8,oc),e.task.priority?(K(),q(`span`,{key:2,class:N([`priority`,`p${e.task.priority}`])},P([``,`低`,`中`,`高`][e.task.priority]),3)):Z(``,!0),d.value===`trash`?(K(),q(`button`,{key:3,class:`restore`,onClick:t=>pe(e.task)},[Y(V(is)),l[53]||=X(`恢复`,-1)],8,dc)):(K(),q(`button`,{key:4,class:`icon ghost`,"aria-label":`删除任务`,onClick:Ko(t=>fe(e.task),[`stop`])},[Y(V(bs))],8,fc)),d.value===`trash`?(K(),q(`button`,{key:5,class:`icon danger ghost`,"aria-label":`永久删除`,onClick:Ko(t=>me(e.task),[`stop`])},[Y(V(xs))],8,pc)):Z(``,!0)],2),(K(!0),q(W,null,Sr(e.subtasks,e=>(K(),q(`article`,{key:e.id,class:N([`task-row subtask`,{done:e.completed}])},[Y(V(ds)),J(`button`,{class:`check`,onClick:t=>de(e)},[e.completed?(K(),Ui(V(os),{key:0})):Z(``,!0)],8,mc),J(`button`,{class:`task-main`,onClick:t=>ge(e)},[J(`strong`,null,P(e.title),1)],8,hc)],2))),128))],64))),128)),!te.value.length&&!v.value?(K(),q(`div`,gc,[Y(V(ms)),J(`b`,null,P(h.value?`没有匹配的任务`:`这里还很安静`),1),J(`span`,null,P(h.value?`换个关键词试试`:`写下第一件想完成的小事吧`),1)])):Z(``,!0)],2)]),J(`aside`,{class:N([`detail`,{open:b.value}])},[J(`div`,_c,[l[54]||=J(`span`,null,`任务详情`,-1),J(`button`,{class:`icon mobile-only`,"aria-label":`关闭详情`,onClick:l[18]||=e=>b.value=!1},[Y(V(xs))])]),f.value?(K(),q(`div`,vc,[J(`div`,yc,[J(`button`,{class:N([`check large`,`p${f.value.priority}`]),onClick:l[19]||=e=>de(f.value)},[f.value.completed?(K(),Ui(V(os),{key:0})):Z(``,!0)],2),wn(J(`textarea`,{"onUpdate:modelValue":l[20]||=e=>f.value.title=e,rows:`2`,"aria-label":`任务标题`,onBlur:M},null,544),[[Io,f.value.title]])]),J(`label`,null,[l[55]||=X(`清单`,-1),wn(J(`select`,{"onUpdate:modelValue":l[21]||=e=>f.value.list_id=e,onChange:M},[(K(!0),q(W,null,Sr(o.value,e=>(K(),q(`option`,{key:e.id,value:e.id},P(e.name),9,bc))),128))],544),[[zo,f.value.list_id]])]),J(`label`,null,[l[56]||=X(`截止时间`,-1),J(`input`,{value:V(Ds)(f.value.due_at),type:`datetime-local`,onChange:l[22]||=e=>{f.value.due_at=e.target.value,M()}},null,40,xc)]),J(`label`,null,[l[58]||=X(`优先级`,-1),wn(J(`select`,{"onUpdate:modelValue":l[23]||=e=>f.value.priority=e,onChange:M},[...l[57]||=[J(`option`,{value:0},`无`,-1),J(`option`,{value:1},`低`,-1),J(`option`,{value:2},`中`,-1),J(`option`,{value:3},`高`,-1)]],544),[[zo,f.value.priority,void 0,{number:!0}]])]),J(`div`,Sc,[J(`div`,Cc,[l[60]||=J(`span`,null,`标签`,-1),J(`button`,{class:`link`,onClick:Se},[Y(V(_s)),l[59]||=X(`新建`,-1)])]),J(`div`,wc,[(K(!0),q(W,null,Sr(s.value,e=>(K(),q(`button`,{key:e.id,class:N({chosen:Ce(e)}),onClick:t=>{I(e),M()}},[J(`i`,{style:ce({background:e.color})},null,4),X(P(e.name),1)],10,Tc))),128)),s.value.length?Z(``,!0):(K(),q(`span`,Ec,`还没有标签`))])]),J(`div`,Dc,[J(`div`,Oc,[l[61]||=J(`span`,null,`备注`,-1),J(`span`,null,[J(`button`,{class:N({active:!x.value}),onClick:l[24]||=e=>x.value=!1},`编辑`,2),J(`button`,{class:N({active:x.value}),onClick:l[25]||=e=>x.value=!0},`预览`,2)])]),x.value?(K(),q(`div`,{key:0,class:`markdown-preview`,innerHTML:V(ws)(f.value.description)},null,8,kc)):wn((K(),q(`textarea`,{key:1,"onUpdate:modelValue":l[26]||=e=>f.value.description=e,rows:`9`,placeholder:`支持 Markdown…`,onBlur:M},null,544)),[[Io,f.value.description]])]),J(`div`,Ac,[J(`div`,jc,[l[63]||=J(`span`,null,`子任务`,-1),J(`button`,{class:`link`,onClick:he},[Y(V(_s)),l[62]||=X(`添加`,-1)])]),(K(!0),q(W,null,Sr(c.value.filter(e=>e.parent_id===f.value?.id),e=>(K(),q(`button`,{key:e.id,class:`subtask-detail`,onClick:t=>de(e)},[J(`span`,Nc,[e.completed?(K(),Ui(V(os),{key:0})):Z(``,!0)]),J(`span`,{class:N({strike:e.completed})},P(e.title),3)],8,Mc))),128)),c.value.some(e=>e.parent_id===f.value?.id)?Z(``,!0):(K(),q(`span`,Pc,`把这件事拆成更小的步骤`))]),J(`div`,Fc,[J(`button`,{class:`secondary`,onClick:M},`保存更改`),J(`button`,{class:`danger-text`,onClick:l[27]||=e=>fe(f.value)},[Y(V(bs)),l[64]||=X(`移到回收站`,-1)])])])):(K(),q(`div`,Ic,[Y(V(ps)),l[65]||=J(`b`,null,`选中一个任务`,-1),l[66]||=J(`p`,null,`日期、优先级、标签、子任务和 Markdown 备注会出现在这里。`,-1)]))],2),J(`nav`,Lc,[J(`button`,{class:N({active:d.value===`today`}),onClick:l[28]||=e=>j(`today`)},[Y(V(ms)),l[67]||=J(`span`,null,`今天`,-1)],2),J(`button`,{class:N({active:d.value===`tasks`}),onClick:l[29]||=e=>j(`tasks`,u.value)},[Y(V(fs)),l[68]||=J(`span`,null,`任务`,-1)],2),J(`button`,{class:N({active:d.value===`upcoming`}),onClick:l[30]||=e=>j(`upcoming`)},[Y(V(as)),l[69]||=J(`span`,null,`计划`,-1)],2),J(`button`,{class:N({active:d.value===`trash`}),onClick:l[31]||=e=>j(`trash`)},[Y(V(bs)),l[70]||=J(`span`,null,`回收站`,-1)],2)]),d.value===`trash`?Z(``,!0):(K(),q(`button`,{key:1,class:`fab`,"aria-label":`添加任务`,onClick:Ee},[Y(V(ls))])),Y(Ia,{name:`toast`},{default:Cn(()=>[_.value?(K(),q(`div`,Rc,P(_.value),1)):Z(``,!0)]),_:1}),g.value?(K(),q(`div`,zc,[X(P(g.value),1),J(`button`,{onClick:l[32]||=e=>g.value=``},[Y(V(xs))])])):Z(``,!0)])):(K(),q(`div`,As,[J(`section`,js,[l[36]||=J(`div`,{class:`brand`},[X(`do`),J(`span`,null,`do`)],-1),J(`p`,null,P(t.value?`欢迎回来,继续把生活理顺。`:`创建你的 dodo`),1),J(`label`,null,[l[34]||=X(`用户名`,-1),wn(J(`input`,{"onUpdate:modelValue":l[0]||=e=>r.value=e,autocomplete:`username`,placeholder:`你的用户名`},null,512),[[Io,r.value]])]),J(`label`,null,[l[35]||=X(`密码`,-1),wn(J(`input`,{"onUpdate:modelValue":l[1]||=e=>i.value=e,type:`password`,autocomplete:`current-password`,placeholder:`至少 12 位`,onKeyup:Jo(A,[`enter`])},null,544),[[Io,i.value]])]),J(`button`,{class:`primary`,onClick:A},P(t.value?`登录`:`开始使用`),1),g.value?(K(),q(`small`,Ms,P(g.value),1)):Z(``,!0)])]))}})).mount(`#app`),`serviceWorker`in navigator&&navigator.serviceWorker.register(`/sw.js`); \ No newline at end of file diff --git a/backend/static/assets/index-hzru7WEs.css b/backend/static/assets/index-hzru7WEs.css new file mode 100644 index 0000000..a7cfec0 --- /dev/null +++ b/backend/static/assets/index-hzru7WEs.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,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}body{background:#f8f3e8;margin:0}button,input,textarea,select{font:inherit;color:inherit}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}.batch-bar{z-index:5;background:#fff7f2;border:1px solid #f3c2ae;border-radius:10px;align-items:center;gap:7px;margin-bottom:8px;padding:8px 10px;display:flex;position:sticky;top:-12px;box-shadow:0 8px 18px #603e2814}.batch-bar b{margin-right:auto;font-size:13px}.batch-bar>button:not(.icon){background:#fff;border:0;border-radius:7px;align-items:center;gap:4px;padding:6px 9px;display:flex}.batch-bar svg{width:14px}.batch-bar .danger{color:var(--danger)}.task-list{transition:opacity .2s}.task-list.loading{opacity:.45}.task-row{border-bottom:1px solid var(--line);align-items:center;gap:10px;min-height:53px;padding:4px 8px;transition:background .15s,transform .15s;display:flex}.task-row:hover,.task-row.selected{background:#faf0e5bf}.task-row:hover{transform:translate(2px)}.select-box,.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}.select-box{opacity:.2;border-radius:3px;flex-basis:16px;width:16px;height:16px}.task-row:hover .select-box,.select-box.checked{opacity:1}.select-box.checked{color:#fff;background:#796f63}.check svg,.select-box 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}.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}.select-box{opacity:.45}.row-actions{opacity:1}.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}.batch-bar{overflow:auto}.batch-bar b{white-space:nowrap}.task-row{padding-inline:2px}.subtask{padding-left:35px}.ghost{opacity:.45}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important}} diff --git a/backend/static/index.html b/backend/static/index.html index d3805e9..d5c99cd 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 4cb4201..b29dc09 100644 --- a/docs/api.md +++ b/docs/api.md @@ -1,27 +1,56 @@ # API -Base path: `/api/v1` +Base path: `/api/v1`. 除初始化、登录和健康检查外均需 `dodo_session` Cookie。 ## Setup / Auth + - `GET /setup/status` - `POST /setup/initialize` - `POST /auth/login` +- `POST /auth/logout` - `GET /me` ## Folders -- `GET /folders` -- `POST /folders` + +- `GET /folders` — 仅返回未删除文件夹 +- `POST /folders` — 创建文件夹 +- `PATCH /folders/{folder_id}` — 重命名 +- `DELETE /folders/{folder_id}` — 软删除;其清单移到根层级 ## Lists -- `GET /lists` -- `POST /lists` + +- `GET /lists` — 仅返回未删除清单,系统收集箱排首位 +- `POST /lists` — 创建清单,可指定 `folder_id` +- `PATCH /lists/{list_id}` — 重命名;系统收集箱返回 409 +- `DELETE /lists/{list_id}` — 软删除并将任务移入系统收集箱;系统收集箱返回 409 + +## Tags + +标签属于当前用户,可跨清单复用。 + +- `GET /tags` +- `POST /tags` — `{name, color}`;同一用户名称唯一 ## Tasks -- `GET /tasks` -- `POST /tasks` -- `PATCH /tasks/{task_id}` — 必须携带当前 `version`,冲突返回 409 -- `DELETE /tasks/{task_id}` — 软删除 + +- `GET /tasks?q=&limit=&cursor=` — 顶层未删除任务的游标分页;`q` 匹配标题、描述、标签名和清单名 +- `POST /tasks` — 创建任务;`parent_id` 只允许指向同清单顶层任务;`tag_ids` 必须属于当前用户 +- `GET /tasks/{task_id}` — 返回任务、标签和一层子任务 +- `PATCH /tasks/{task_id}` — 必须携带当前 `version`,原子比较更新;版本冲突返回 409 +- `DELETE /tasks/{task_id}` — 软删除任务及其直接子任务 +- `POST /tasks/{task_id}/restore` — 恢复任务及其直接子任务 +- `POST /tasks/batch` — 原子批量完成、移动、设置截止时间、替换标签或软删除 + +批量请求字段:`task_ids`、`completed`、`list_id`、`due_at`、`tag_ids`、`soft_delete`。所有任务、目标清单和标签在写入前完成归属校验;任一不存在则整批不修改。 + +## Recycle bin + +- `GET /trash?limit=&cursor=` — 已删除顶层任务的游标分页 +- `DELETE /trash/{task_id}` — 永久删除任务及其子任务 + +游标是不透明字符串。无效游标返回 422;`limit` 范围为 1–100。 ## Health + - `GET /health/live` - `GET /health/ready` diff --git a/docs/data-model.md b/docs/data-model.md index 078fc1c..93dae5e 100644 --- a/docs/data-model.md +++ b/docs/data-model.md @@ -1,60 +1,97 @@ -# dodo 数据模型(第一阶段) +# dodo 数据模型 + +所有业务实体使用 UUIDv7 主键并按 `user_id` 隔离。生产使用 PostgreSQL,测试使用 SQLite;模型保持两者兼容。 ## app_state -- key -- created_at + +- `key` 主键 +- `created_at` ## users -- id UUIDv7 -- username -- password_hash -- timezone -- created_at + +- `id` +- `username` 唯一 +- `password_hash` +- `timezone` +- `created_at` ## sessions -- id UUIDv7 -- token_hash -- user_id -- expires_at -- created_at + +- `id` +- `token_hash` 唯一 +- `user_id` → users,级联删除 +- `expires_at` +- `created_at` ## folders -- id UUIDv7 -- user_id -- name -- position -- created_at + +- `id` +- `user_id` → users +- `name` +- `position` +- `created_at` +- `deleted_at`,非空表示软删除 + +删除文件夹不会删除清单;清单的 `folder_id` 被置空。 ## task_lists -- id UUIDv7 -- user_id -- folder_id nullable -- name -- is_inbox -- position -- created_at + +- `id` +- `user_id` → users +- `folder_id` → folders,可空 +- `name` +- `is_inbox`,每个用户初始化时创建一个受保护的系统收集箱 +- `position` +- `created_at` +- `deleted_at`,非空表示软删除 + +删除普通清单时,其未删除任务原子移动到系统收集箱。系统收集箱不可重命名或删除。 + +## tags + +- `id` +- `user_id` → users +- `name`,同一用户内唯一 +- `color` +- `created_at` + +标签是用户级全局实体,不隶属于清单。 + +## task_tags + +- `task_id` → tasks +- `tag_id` → tags +- `(task_id, tag_id)` 联合主键 ## tasks -- id UUIDv7 -- user_id -- list_id -- parent_id nullable -- title -- description -- priority (0-3) -- completed -- due_at nullable -- version -- position -- created_at -- updated_at -- deleted_at nullable + +- `id` +- `user_id` → users +- `list_id` → task_lists +- `parent_id` → tasks,可空;仅允许一层子任务且必须与父任务同清单 +- `title` +- `description` +- `priority`(0–3) +- `completed` +- `due_at`,可空 +- `version`,乐观锁版本;单任务更新用 `id + user_id + version` 原子比较更新 +- `position` +- `created_at` +- `updated_at` +- `deleted_at`,非空表示进入回收站 + +顶层任务软删除、恢复或永久删除时同步处理直接子任务。列表与回收站使用 `(created_at, id)` 作为稳定游标排序键。 + +## 迁移 + +- `0001_initial.py`:已部署的初始模式,不修改 +- `0002_task_management.py`:新增文件夹/清单软删除列、标签表、任务标签关联表及游标/回收站索引 ## 后续阶段预留 + - task_reminders - task_recurrence_templates - task_recurrence_exceptions -- tags / task_tags - habits / habit_logs / habit_reminders - attachments - audit_logs diff --git a/docs/decisions.md b/docs/decisions.md new file mode 100644 index 0000000..ebdc26c --- /dev/null +++ b/docs/decisions.md @@ -0,0 +1,113 @@ +# dodo 产品与技术决策记录 + +## 定位 + +dodo 是一个纯自托管的 TickTick-like 任务与习惯管理工具。目标不是一比一复刻 TickTick,而是做一个数据归自己、界面温暖紧凑、适合个人长期使用的任务系统。 + +## 当前边界 + +- 首版只做本地开发验证,不部署。 +- 首版不做通知渠道:Web Push、Telegram、SMTP 暂不实现。 +- 首版附件只做本地存储,不实现 S3。 +- 首版不做番茄钟。 +- 首版不做自然语言创建任务。 + +## 技术栈 + +- Monorepo:`frontend/`、`backend/`、`worker/` +- 前端: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 + +## 数据库 + +本地开发数据库: + +```text +postgresql+asyncpg://postgres:***@10.10.100.99:5433/dodo +``` + +已从默认 `postgres` 库迁移到独立 `dodo` 库。误建在 `postgres.public` 的 dodo 表已清理。 + +## 产品模型 + +### 任务 + +- 文件夹 → 清单 → 任务 +- 系统内置收集箱,不允许删除 +- 任务支持一层子任务 +- 状态:未完成 / 已完成 +- 优先级:无 / 低 / 中 / 高 +- Markdown 描述 +- 截止日期 + 具体时间 +- 多提醒设计预留 +- 全局彩色标签 +- 删除为软删除,回收站手动清空 +- 支持创建、修改、完成、恢复、删除操作历史 +- 并发编辑使用原子乐观锁 + +### 重复任务 + +- RFC 5545 RRULE +- 模板 + 实例 +- 修改范围:仅本次 / 本次及以后 / 全部 +- 删除单次保存为例外 +- 每月 31 日在无 31 日月份跳过 +- 逾期完成不影响下次计划日期 + +### 习惯 + +- 完成型 + 数值型 +- 每天 / 每周 / 每月 / 间隔天数 +- 数值型当日累计,达标后封顶 +- 允许补打和修改历史 +- 支持暂停区间,暂停期不破坏连续记录 +- 归档后保留历史统计 + +## UI 方向 + +- 手账生活感 +- 中高信息密度 +- 10–12px 中等圆角 +- 细分割线为主,少量浅底色 +- 强调色:`#F15A29` +- 只做浅色模式 +- 系统字体栈 +- 不使用猫猫元素 +- 轻微动效 + +## 页面结构 + +- 桌面三栏:左导航 / 中任务列表 / 右任务详情 +- 手机底部导航 +- 顶部快速输入,手机悬浮新增按钮 +- 桌面右侧详情栏,手机底部弹层 +- 日历默认月视图 +- 习惯首页:今日习惯列表 + 一周打卡格 +- 搜索:顶部搜索框 + 全局搜索快捷键 + +## 工程质量 + +- `/api/v1` API 路径 +- 统一错误码、可读提示和字段详情 +- 页面内诊断信息 + Toast +- readiness 检查数据库 +- 首版不提供 Prometheus metrics +- 审计日志记录操作人、实体、动作、时间和变更摘要 +- 手动 JSON 全量导出 +- 附件默认 20MB,可用环境变量调整 +- 默认允许常用文档与图片,拒绝危险文件类型 + +## 第一阶段验收 + +- 可初始化管理员 +- 可登录 +- 可创建清单和任务 +- 后端测试通过 +- 前端生产构建通过 +- PostgreSQL 迁移成功 +- 本地应用可以启动并访问 diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 5105007..f72296e 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -1,28 +1,314 @@ +