diff --git a/.agents/skills/protowiki-components/references/wrappers.md b/.agents/skills/protowiki-components/references/wrappers.md index 605bd91a..d723686e 100644 --- a/.agents/skills/protowiki-components/references/wrappers.md +++ b/.agents/skills/protowiki-components/references/wrappers.md @@ -219,6 +219,39 @@ Does **not** set `data-skin` / `data-theme` — pass those on content inside the ``` +### Overlays inside MobileWrapper + +`MobileWrapper` provides `#mobile-wrapper-overlay` and +`provide( 'CdxTeleportTarget', overlayEl )` (a template ref, not a selector +string) so Codex popovers, bottom sheets, and dialogs teleport into a **fixed, +viewport-height** layer aligned with the phone column (not the scrollable page +height). Shared containment CSS lives in `src/styles/mobile-wrapper-overlays.css`. +The overlay element must appear **before** the default slot so the ref is set +before slot children mount. + +**`CdxPopover` bottom sheets:** Codex only uses bottom-sheet layout when the +**browser viewport** is ≤639px. On wider viewports (typical desktop preview), +`use-bottom-sheet` falls back to floating popover mode. Add +`mobile-wrapper__sheet-popover` on the `CdxPopover` (teleport into the overlay +root is fine) so `mobile-wrapper-overlays.css` keeps the sheet anchored to the +bottom of the phone column: + +```vue + + … + +``` + +**Full-screen in-place dialogs** inside the frame: pass `render-in-place` to +`CdxDialog` so it stays within the phone column instead of teleporting to +``, then override the backdrop to `position: absolute` (it defaults to +`fixed`, which would cover the whole browser viewport rather than the frame). + ## Why these wrappers? The earlier draft of this repo had `ArticleLayout`, `ArticleBody`, diff --git a/.agents/skills/protowiki-wikitab/SKILL.md b/.agents/skills/protowiki-wikitab/SKILL.md new file mode 100644 index 00000000..c7e8b93e --- /dev/null +++ b/.agents/skills/protowiki-wikitab/SKILL.md @@ -0,0 +1,659 @@ +--- +name: protowiki-wikitab +description: The Wikitab new-tab prototype — its section registry, the reserved-slot "no-jump" loading contract that keeps the layout perfectly still, the shared reveal-more engine (desktop Show more button vs mobile continuous scroll), the daily feed orchestrator (featured + Active discussions + Main Page OTD + births), and the localStorage config / feed-cache split. Use when editing src/prototypes/wikitab/, adding a section, changing card sizes, or debugging layout shift or paging there. +--- + +# ProtoWiki — Wikitab + +Route `/wikitab`. A bare, responsive new-tab page: serif wordmark, a search +input, and six feed sections. Logged-out only, `platform: 'web'`. + +Deliberately **not** wrapped in `ChromeWrapper` — this is a page you set as your +browser's new-tab URL, so it has no Wikipedia chrome and no fake browser chrome. +Desktop and mobile diverge on `[data-skin]`, which ProtoWiki already resolves +from `?skin=` and the viewport at boot (see +[`protowiki-skins`](../protowiki-skins/SKILL.md)). + +## The section registry is the source of truth + +`sections.ts` holds one `WikitabSectionSpec` per section, and it drives both the +loading contract and the pagination. Change a card size or page size **there**, +never in a component: + +| Field | Meaning | +| --------------- | -------------------------------------------------------------------- | +| `initialCount` | Slots shown before any paging (4). Desktop renders these 2×2. | +| `pageSize` | How many more one reveal adds (6). | +| `cardHeight` | Placeholder slot height (px) and row floor. Real cards grow taller when content needs it; rows equalize via `useEqualRowHeights`. | +| `variant` | `thumbnail` (Trending, Birthdays — always shows thumbnail; thumbnail-slot loading) or `text` (Active discussions, On this day, DYK, news — optional thumbnail; full-card loading). See [Loading modes](#loading-modes). | +| `thumbnailSize` | Thumbnail edge in px. Must fit inside `cardHeight`. | +| `fullHook` | Text variant only: no line-clamp; card grows past `cardHeight` (min). On this day, Did you know, and In the news. | + +`cardHeight` and `thumbnailSize` are coupled: a 96px thumbnail needs a 122px card +(96 + 12px padding either side + 1px border), and a 40px one fits a 98px card. +Change one without the other and the thumbnail either clips or floats in space. +Trending and Birthdays use 122/96 thumbnail cards; On this day, Did you know, and In the news use the same 122/96 text-card layout (thumbnail only when one resolves). Active discussions uses a 98px text card with no thumbnail column. + +## The no-jump loading contract + +This is the point of the prototype, so treat it as load-bearing. + +The heading and `…` button paint immediately. Each section then reserves exactly +`initialCount` slots at exactly `cardHeight` — flat +`background-color-neutral-subtle` blocks with **no border** — and "Show more" +renders in `color-disabled`. How a slot looks while its page resolves depends +on the section's **`variant`** in `sections.ts` (see [Loading modes](#loading-modes)). + +Four details make it actually not jump. Breaking any one of them reintroduces +shift: + +1. **Loading placeholders use exact `cardHeight`,** not `min-height`. Real + cards use `min-height: cardHeight` and grow with content; `useEqualRowHeights` + keeps cards in the same row matched to the tallest. Clamped sections + (Trending, Birthdays) line-clamp title/description; `fullHook` sections + (On this day, Did you know, In the news) show the full hook with no clamp. +2. **A page is only "ready" once its thumbnails have decoded** — see + `preloadImages.ts`, which preloads via `new Image()` with a 1.5s cap so one + dead image can't hold a slot open. +3. **The error state keeps the reserved height** rather than collapsing. +4. **The "Show more" row is always rendered,** even when a section is exhausted + and the control inside it is gone. Otherwise the sections below shift up the + moment a short section finishes loading. + +`useSectionReveal.ts` expresses the contract as two numbers: + +- `reserved` — how many slots are on screen. Raised **immediately** on reveal. +- `ready` — how many of them have fully resolved (thumbnails decoded, and for + DYK any per-hook summary fetch finished). + +A slot at index `i` is `loading` when `i >= ready`. + +### Loading modes + +Controlled by `WikitabCardVariant` in the section registry — **do not** branch +on section id in components; add or change a `variant` in `sections.ts` instead. + +| Variant | Sections | Thumbnail column | While `loading` | +| ------- | -------- | ---------------- | --------------- | +| `thumbnail` | Trending, Birthdays | Always — every item carries a feed thumbnail (or one fetched for the lead page) | **Thumbnail-slot loading:** card shell + title/description paint as soon as feed data lands; only the image area is a flat `background-color-neutral-subtle` block at `thumbnailSize` (no Codex image icon) until decode finishes. | +| `text` | Active discussions, On this day, Did you know, In the news | **Only when a URL resolves** — omit the column entirely if there is no image | **Full-card loading:** the whole slot stays the borderless neutral skeleton until the page is ready. Never show an empty thumbnail column while summaries are fetched or while "no thumbnail" is still being determined. | + +Implementation lives in `WikitabCard.vue`: `showFullLoading` for the skeleton, +`showThumbnail` (text variant checks `thumbnailUrl` only, not `thumbnailTitle`). + +### Feed cards use `CdxCard` + +`WikitabCard.vue` is a thin adapter around Codex's `CdxCard` — not a hand-built +border shell. Variant wiring: + +| Variant | `CdxCard` props | Link behaviour | +| ------- | --------------- | -------------- | +| `thumbnail` | `url`, `thumbnail`, `force-thumbnail` | Whole card is the link via `url`. | +| `text` | No `url`; hook HTML in `#description`; thumbnail via CSS `order` at inline-end when an image resolves | Overlay `` for the primary page — hooks carry nested anchors Codex forbids inside a linked card. | + +ProtoWiki ships Codex **2.6.x**, whose `CdxCard` has no `thumbnailSize` / +`thumbnailPosition` props — large (96px) thumbnails and text-variant end +placement are layout CSS in `WikitabCard.vue`, keyed off `sections.ts` +`thumbnailSize`. **Never set `display: block` on the card root** — it overrides +`.cdx-card { display: flex }` and breaks the fixed-height slot. + +**Typography:** card title, description, and supporting text use Codex's built-in +`.cdx-card__text__*` styles. Do **not** override font-size, line-height, or +font-weight on those elements via `:deep()` — layout-only rules (fixed height, +line-clamp, overflow) belong on the wrapper. + +**Equal row heights:** `useEqualRowHeights.ts` runs per section. Every row +(Trending, Birthdays, On this day, etc.) equalizes to the tallest card in that +row — pairs on desktop, the whole carousel on mobile — via `ResizeObserver`. +`cardHeight` in `sections.ts` is the **placeholder floor**, not a fixed cap on +real cards. `useEqualRowHeights` sets a definite inline `height` (not just +`min-height`) on each slot so the bordered `CdxCard` can fill the row. +Supporting text is pinned to the bottom inner edge of that card with a flex +`::after` spacer on `.cdx-card__text` (so Codex’s 8px `margin-top` on the +supporting slot is preserved) and `align-items: stretch` on `.wikitab-card__cdx` +(the Codex card root — the class merges onto `.cdx-card`, not a wrapper). + +When adding a section: if thumbnails are guaranteed from the feed, use +`thumbnail`. If thumbnails are optional or need a follow-up fetch, use `text`. + +## Pagination + +One engine, two triggers: + +- **Desktop** — "Show more" reveals `min(pageSize, remaining)`. Hidden once + exhausted, `color-disabled` while a page resolves. +- **Mobile** — no button. `useRevealOnScrollEnd.ts` observes a sentinel at the + end of the horizontal scroller (`root` = the scroller, `rootMargin` about one + card wide) and reveals as it approaches. Torn down when exhausted, so + scrolling just ends. + +`revealMore()` ignores calls while a page is in flight, so a fast flick can't +queue several pages. + +Sections **cap** at whatever the day's feed contains rather than reaching back +into previous days. Depth varies by day, so `hasMore` always derives from the +actual list length — never hardcode it. Typically Trending has ~44 items, On this day ~5 (Main Page event bullets), +Birthdays ~294 (Wikifeeds births, newest first), Did you know ~9, +In the news ~4 (which exactly fills the initial slots, so no control ever +renders for it), and Active discussions ~20 (merged from six noticeboards). +All registered sections **always render**. While a section's slice is still +loading, skeleton slots show; once resolved with zero items, a reserved empty +state (`"Nothing to show right now."`) appears instead of removing the section. +Feed errors show the same reserved-height error row per section. + +## Daily feed sources + +`data/fetchDailyFeed.ts` loads the feed in **two phases** so top sections can +resolve while slower secondary APIs are still in flight. All six sections are +cached under one UTC-day blob (`wikitab-feed-cache-v*`); slices patch in via +`persistPartialFeed()` as each section resolves during ordered home load. +**Active discussions** is the exception: its slice carries a **5-minute TTL** +(`DISCUSSIONS_TTL_MS` in `feedCache.ts`) so noticeboard threads stay reasonably +fresh without refetching the whole daily feed. + +**Phase 1 — featured (blocking):** + +- **`feed/featured/{yyyy}/{mm}/{dd}`** — Trending, DYK, In the news + +`fetchDailyFeedProgressive(onUpdate)` calls `onUpdate` with this partial feed +immediately. `useWikitabFeed` sets `feedPhase = 'featured'` and featured +sections stop being feed-loading — their `useSectionReveal` watch fires and +card pages begin resolving. + +**Phase 2 — secondary (parallel, patched as each settles):** + +- **Action API `discussiontoolspageinfo`** — Active discussions (six noticeboards) +- **Action API parse of `Main_Page`** — On this day event bullets (`#mp-otd > ul > li`) +- **`feed/onthisday/births/{mm}/{dd}`** — Birthdays + +Each secondary request patches its slice into the feed and calls `onUpdate` +again. `feedPhase` stays `'featured'` until all three settle, then becomes +`'complete'`. Secondary sections keep skeleton slots until their slice arrives; +they no longer block Trending / In the news / Did you know above them. + +Featured failure fails the whole load; Main Page OTD, births, or Active +discussions failure yields an empty section for that part only. + +Every card links as a whole to the **bolded** link inside it — the page the feed +marks as the item's subject — via `primaryLinkTitle()`. For news that means +preferring the bolded link's own entry in `links[]` for the thumbnail, rather +than whichever link happens to be first. + +Because hooks and stories carry their own inline links and an anchor cannot +contain another one, the card-wide link is an **absolutely-positioned overlay** +(`.wikitab-card__link`) rather than an ancestor element. It sits at `z-index: 1` +and the inline links are lifted to `z-index: 2`, so clicking hook text follows +the card and clicking a link inside it follows that link. Keep that ordering if +you touch the card's stacking. + +- **Trending** ← `mostread.articles`. Already full page summaries, so read + `description`, `thumbnail` and `views` straight off the feed. **Do not** fetch + per-article summaries — that was the main waste in the old wikita prototype. + Sort by `rank`; the list is not pre-sorted. When today's `mostread` is + missing or empty (documented API behaviour, especially early in the UTC day), + `fetchDailyFeed.ts` falls back to the **previous UTC day's** featured feed for + Trending only. Feeds with empty Trending after that fallback are not cached, + so a later tab open can retry. +- **On this day** ← `data/fetchMainPageOtd.ts` parses `#mp-otd` from the Main + Page HTML (Action API). Text cards with inline links; year kept in the hook as + linked prose (`In , ….`). ~5 event bullets matching desktop Main Page + parity. The + `(pictured)` item uses `#mp-otd-img`; others lazy-fetch lead-page thumbnails. + Pin with `?pinned=otd`. +- **Birthdays** ← `data/fetchBirthsOnThisDay.ts` maps + `feed/onthisday/births/{mm}/{dd}`. Person name as title, age as + `"{n} years old"` with `cdxIconCalendar`, lead page for link/thumbnail. Pin + with `?pinned=births`. +- **Did you know** ← `dyk[]`. Carries only `html`, with no thumbnail and no + `pages` array. `data/resolveDykThumbnails.ts` pulls the bolded link's title + out of the HTML and fetches summaries for the **revealed page only**. + On enwiki, DYK normally updates once at ~00:00 UTC; during queue backlog it + can rotate twice per day (~00:00 and ~12:00 UTC). The Wikifeeds API serves + the **current** main-page set for today's date — UTC-day cache is fine for + normal days; the midday rotation is a rare edge case. +- **In the news** ← `news[]`. Each story has `links[]` of full summaries, so + again no follow-up requests. +- **Active discussions** ← `data/fetchActiveDiscussions.ts` queries + `discussiontoolspageinfo` with `prop=threaditemshtml` and + `threaditemsflags=noreplies|excludesignatures|activity` on six enwiki + noticeboards (Help desk + five Village pumps — same list as Personal + Dashboard, T420785). Threads need `authorCount > 1` and a latest reply; + merged newest-first with at least two per noticeboard, capped at ~20. Cards: + discussion title, noticeboard as plain `#description`, supporting row + `cdxIconSpeechBubbles` + `"{n} comments"` at row start, compact relative time at row end. + Links to the + noticeboard URL with a `#` fragment to the thread. Default registry order: + Trending → In the news → Did you know → Active discussions → On this day → + Birthdays. No thumbnails, no per-card follow-up fetches. + +`data/wikitabHtml.ts` normalises feed HTML. Note the asymmetry it exists for: +`news` stories use relative `./Page_Title` hrefs, which would otherwise resolve +against our own origin, while `dyk` hooks use absolute ones. + +## Saved-adjacent home modules + +Three home modules sit beside the daily feed — not in `WIKITAB_SECTIONS` or +`useWikitabFeed`. All use the same paging contract as feed sections +(`initialCount` 4, `pageSize` 6, thumbnail cards at 122/96). Default home order +(`WIKITAB_HOME_MODULE_ORDER`): Saved → Daily reads → Suggested edits → Trending +→ remaining feed sections. All appear in Configure and support pin / hide. + +**Saved** (`saved`) — home feed cards come from a **snapshot** +(`savedModuleArticles` in `index.vue`), not live `savedArticles`. The section is +hidden until a refresh runs (mount, search exit, overlay close) and only then +reflects what was saved at that moment — saving your first article mid-session +does not surface the module. Snapshot + REST summary enrichment via +`useWikitabSavedArticles.ts`, `WikitabSavedSection.vue`. Unsaving every article +during the session clears the snapshot immediately. + +**Daily reads** (`daily-reads`) — morelike suggestions seeded from up to **four** +saved pages picked by a **deterministic daily shuffle** (UTC day + +sorted `titleKey`s → seeded Fisher-Yates). Hidden when the Saved-module +snapshot has no articles (so saving your first page mid-session does not +surface an empty section), and hidden again once a refresh completes with +zero suggestions. Action API `generator=search` with `gsrsearch=morelike:{title}` per +seed (`DailyReadsFeed` in `data/fetchWikitabDailyReads.ts`); seeds load in +parallel but cards resolve **one at a time** via `takeNext()` — a daily-seeded +random shuffle across all seed queues (stable for the UTC day, mixed on screen). +Each card is +enriched with REST `/page/summary/` before paint (better thumbnails than +pageimages alone); a non-blocking summary backfill runs if a thumbnail is still +missing. Cards are thumbnail variant with +`supportingText: "Related to {seed title}"`. Excludes disambiguation pages, +duplicate `pageid`s, and all saved titles. Hidden-article keys are filtered +client-side via `filterCards` in `index.vue`. Cards paint as they resolve — no +batch `preloadImages` gate (`WikitabDailyReadsSection.vue` does not use +`useSectionReveal`). + +Cached under `wikitab-daily-reads-cache-v3` keyed by `{ utcDay, savedFingerprint }` +(`data/dailyReadsCache.ts`); entries store the loaded card list plus a `hasMore` +flag. + +**Suggested edits** (`suggested-edits`) — edit-opportunity cards from the same +Microtask `POST /quality-check` pipeline as the search **Contribute** tab +(`fetchWikitabSearchContribute.ts`), seeded from up to **six** saved pages via a +**deterministic daily shuffle** with a separate salt from Daily reads +(`pickSavedArticleSeeds.ts` → `SuggestedEditsFeed` in +`data/fetchWikitabSuggestedEdits.ts`). Direct phase quality-checks saved seeds; +morelike expansion skips titles already in the saved list. Cards map to +`WikitabCardData` via `contributeItemToCard()` (Visual Editor link, task body, +`supportingSignals` for task icon + label, optional `Related to {seed}` end +text). Same visibility rules as Daily reads — hidden when the snapshot is empty +or when a completed fetch yields zero cards. Same composable / section pattern as +Daily reads (`useWikitabSuggestedEdits.ts`, `WikitabSuggestedEditsSection.vue` — +local `reserved` display slots, no `useSectionReveal`). Cached under +`wikitab-suggested-edits-cache-v1` (`data/suggestedEditsCache.ts`). + +A render triggered on mount, search exit, or overlay close calls +`refreshHomeSavedModules()` in `index.vue`, which refreshes Saved, Daily reads, +and Suggested edits from the **same snapshot**. Network runs only on cache miss +(saved list or UTC day changed); session memory skips even localStorage when the +key matches. Only the first `initialCount` cards fetch on load — further pages +load on **Show more** (`loadMore()` in each composable), continuing the same seed +feed from refresh time (not the live saved list). A full refresh after save/unsave +waits for overlay close, search exit, or a new tab. `?nocache=1` bypasses caches. + +## State and storage + +User preferences (`data/wikitabConfig.ts`), feed cache (`data/feedCache.ts`), +feed orchestration phase (`useWikitabFeed` → `feedPhase` + +`isSectionLoading`), and transient reveal counts (`useSectionReveal`) live in +separate layers. +See [references/state-and-storage.md](references/state-and-storage.md) for the +full rules, migration from legacy `?pinned=`, and how to add future config +fields without over-building a schema. + +**Pinning** — pinned sections move to the top. State is +`WikitabConfig.pinnedSectionIds` in localStorage, wired through +`useWikitabPinned.ts` (`togglePin`, `orderSections`, cross-tab `storage` +sync). Pinned ids come first (most recently pinned at the very top), then +unpinned sections in registry order. Pinned sections show `cdxIconPushPin` +beside the heading; the ellipsis menu toggles "Pin to top" / "Unpin from top". +Pinning reorders by `spec.id` and does not affect the no-jump loading contract. + +The full daily feed (featured + Active discussions + Main Page OTD + births) is +cached under a UTC-day key; ordered per-section loading reads and writes through +the same cache, with one in-session `feed/featured` request shared across +Trending / News / DYK on a cache miss. **Active discussions** refetches when its +5-minute TTL expires — other slices still hit the day cache. Stale discussions +are stripped on hydrate so skeleton slots show until the refetch lands. +`?nocache=1` forces a refetch. After the first load of the day you mostly won't +see loading slots — use `?nocache=1` when working on them. + +## Layout + +Desktop (`[data-skin="desktop"]`) uses a 2-col grid and Show more from 640px, but +the column width and gutter split again at 768px: + +- **Compact desktop (640–767px):** full-width column, 16px page gutter — the band + between the mobile carousel and the centred wide-desktop column. +- **Wide desktop (768px+):** centred 640px column, 64px page gutter, cards at + 312px each. + +Hero `padding-block: 128px`; 64px between sections. + +Both skins carry an 80px `padding-bottom` on the page root (`64px + 16px`), so the +last section never sits flush against the bottom of the viewport. + +Mobile (`[data-skin="mobile"]`): full width, 16px gutter, 48px between sections, +cards in a horizontally scrolling snap row at 320px that deliberately bleeds +past the right edge. The row cancels the page gutter with negative inline +margins and reinstates it as padding, plus +`scroll-padding-inline-start` — without that last part, snapping to a card's +start edge scrolls straight past the padding and the first card sits flush to +the viewport edge instead of lining up with the heading. + +**Type scale.** Two contexts, both using Codex token shadowing on a scoped +ancestor (tokens are `rem`-based and cannot be scaled by `font-size` on the page +element): + +- **Home feed cards** — compact scale on `.wikitab-section__cards` in + `WikitabSection.vue`: 14px body / 12px small. Section headings, wordmark, and + chrome use Codex defaults (18px / 28px). +- **Search results** — Codex defaults for tabs, hero search, and Articles / + Images panels (16px body / 14px small). **Activity tab cards** use the home + feed compact scale (14px body / 12px small) via token shadowing on + `.wikitab-search-page__list--activity`. + +See [`codex-typography`](../codex-typography/SKILL.md) for the canonical text +styles those values map onto. + +## Lookahead search + +`WikitabSearch.vue` wraps `CdxSearchInput` + `CdxMenu` (not ProtoWiki's +`Search.vue` / `CdxTypeaheadSearch`). English Wikipedia title search via Core +REST: + +`GET https://en.wikipedia.org/w/rest.php/v1/search/title?q=…&limit=6` + +- **`data/fetchWikitabSearch.ts`** — two-step fetch for speed: + `fetchWikitabSearchRaw` (REST only) paints menu rows immediately; + `filterDisambiguationResults` runs in the background via Action API + `pageprops` (`data/filterDisambiguationPages.ts`) and patches the list when + done (e.g. **Squash (sport)** replaces **Squash** dab page). Thumbnail URLs + are normalised to `https:`. No `url` on menu items. Thumbnails decode + in-place — **no preload gate** (contrast feed cards). Rows without a + thumbnail URL use the default Codex placeholder icon. +- **`useWikitabSearch.ts`** — debounced input (200ms), `AbortController` + cancellation, maps results to `MenuItemData` for `CdxMenu`. Stale rows stay + visible while debouncing; `show-pending` only when the first fetch has zero + result rows. +- **Panel** — first menu row is the `Search for "…"` item (custom menu slot, + text only, no thumbnail; shows the raw input inside the quotes including + whitespace; ` ` before the opening quote so that space cannot collapse); + then thumbnail + title + description rows. Dropdown width matches the input + wrapper only (not the Search button). When open, + `.wikitab__hero:has(.wikitab-search--expanded)` gets `z-index: 10` so the + menu covers feed card link overlays (`z-index: 2`). Keyboard handling matches + `CdxTypeaheadSearch`: arrow keys navigate the menu, but **Space** is left to + the input (never delegated to `CdxMenu`). +- **Navigation** — submit or the `Search for "…"` row pushes `?search=…` on the + same `/wikitab` route. On the **home feed**, a lookahead result row (click or + Enter with that row highlighted) navigates the tab to the English Wikipedia + article via `articleUrl(title)`. On the **search results page** (`?search=` + present), the same action pivots search — updates `?search=` to that title via + `useWikitabSearchNavigation()` and refreshes results (current `?tab=` preserved). + Clearing the input and submitting removes `search` from the query. + +## Search results (`?search=`) + +When `?search=` is present, the daily feed is hidden and +`WikitabSearchPage.vue` renders below the hero in the same centred 640px column +as the home feed (hero top padding unchanged so the search bar does not jump). +The feed orchestrator is skipped while search mode is active. + +**Tabs** — quiet `CdxTabs` with four labels: Articles, Images, Activity, +Contribute. All four tabs have content. Active tab syncs to +`?tab=` (`articles` | `images` | `activity` | `contribute`); omitted means +Articles. Tab clicks **push** browser history so Back/Forward walks tab +selections. Submitting a new search keeps the current `tab`; clearing search +removes `tab` from the URL. +`useWikitabSearchTab.ts` owns URL ↔ state sync. + +**Tab cache** — Articles, Images, Activity, and Contribute results stay in +composable memory for the search session. Switching tabs does not refetch or +show skeletons again; Activity, Contribute, and Images abort in-flight requests +when hidden but keep resolved results. Query change resets all four tabs. + +**Loading cards** — `WikitabSearchLoadingCard.vue` is the shared search-result +placeholder. Variants: `article` (96px thumbnail stub), `activity` (no +thumbnail column), and `image` (borderless aspect-ratio skeleton tile). Use +these heavily while API work resolves — especially on Activity and Contribute, +where cards stream in one at a time. Contribute reuses the **activity** skeleton +variant (same compact list type). + +**Articles tab** — `WikitabSearchResultCard.vue` per hit. One flat list built in +priority order from four sources (global `pageid` dedupe — earlier slots win): + +| Cap | Source | Relation | +| --- | ------ | -------- | +| 1 | REST `search/title` | `exact` | +| 1 | REST `search/title` | `near` — **only when there is no exact match** | +| 1 | Action `generator=search` `gsrsearch={query}` (unquoted) + `gsrprop=snippet` | `match` — CirrusSearch snippet (~200–300 chars, not configurable) with hits in **bold**; `…` prepended/appended when the fragment starts mid-article or ends mid-sentence | +| remainder | Action `morelike:{seed}` (top curated hit only) | `related` | + +**Supporting row** (all cards) — split row from the [Attribution API](https://www.mediawiki.org/wiki/Attribution_API) via `useWikitabSearchArticleAttribution.ts` (module cache keyed by title; fetches through `fetchWikimedia`): + +- **Start:** `cdxIconChartLine` + compact page-view count (`trust_and_relevance.page_views`, last 30 days) and `cdxIconReference` + reference count (`trust_and_relevance.reference_count`), 16px apart. +- **End:** relative last update (`formatRelativeUpdate` on `trust_and_relevance.last_updated`). +- Row hidden while loading and when all three signals are null/missing. Partial rows show only available signals. + +**Card menu** — each resolved card has a top-right `CdxMenuButton` (`cdxIconEllipsis`, quiet weight, subtle icon — same pattern as section headings on the home feed). One row: **Why am I seeing this?** (`cdxIconHelpNotice`). Opens a dismissable `CdxDialog` whose body explains the hit from `article.relation` via `formatSearchArticleRelationExplanation()` in `data/formatSearchArticleRelation.ts` — **exact** / **related** use `{title} …`; **near** uses `{title} is the nearest match to your query "{query}".`; **match** uses `Your query was found within the {title} article.` + +Title search runs first; full-text search uses the query unquoted. Title enrichment and full-text then run **in parallel**. Morelike is seeded from +the **top curated result** only (exact, else near, else text match). Disambiguation pages +filtered from every batch via `filterDisambiguationPages`. + +**Progressive load** — `useWikitabSearchResults` streams cards in priority order: +exact title → near title (when no exact) → text match → related. Each slot +paints as soon as its fetch resolves; initial skeletons hide once the first card +lands. Initial morelike uses `INITIAL_MORELIKE_BATCH_SIZE` (5), not the 20-item +pagination batch. `loadingRelated` covers the morelike tail; +tail skeletons while related resolves. + +**Thumbnails** — initial `thumbnailUrl` comes from the Action API `pageimages` +pass in `fetchActionApiPages`. Any article still missing a thumbnail after that +is backfilled asynchronously via REST `/page/summary/` (`backfillArticleThumbnails` +in `fetchWikitabSearchArticles.ts`, shared cache in +`data/fetchWikitabPageSummary.ts`) — non-blocking; cards paint immediately. + +**Thumbnail-slot loading** — `WikitabSearchResultCard` always reserves the 96px +thumbnail column. Title, description, and extract paint as soon as API data +lands; when a `thumbnailUrl` exists, only the image area stays a flat +borderless `background-color-neutral-subtle` block (no Codex image icon) until +decode finishes (`useThumbnailSlotReady.ts`, 1.5s cap). When no thumbnail URL +resolves, fall back to the default Codex placeholder icon — never keep the +loading block. **Do not** call `preloadImages` before rendering search cards — +unlike feed cards, which intentionally gate reveal on decode. + +The **h3 title link** pivots search — updates `?search=` to that article title +via `useWikitabSearchNavigation()` (Wikipedia is not opened from the results +list); the card itself is not otherwise tappable. Infinite scroll uses +`useInfiniteScroll.ts` (viewport sentinel) + `useWikitabSearchResults.ts` +(`loadMore` guarded while a batch is in flight). No error/empty placeholder +text when the query resolves to nothing. + +Implementation: `data/fetchWikitabSearchArticles.ts`, +`data/fetchWikitabPageSummary.ts`, `data/formatSearchArticleRelation.ts`, +`useWikitabSearchResults.ts`, `WikitabSearchPage.vue`, +`WikitabSearchResultCard.vue`, `useThumbnailSlotReady.ts`, +`useWikitabSearchArticleAttribution.ts`. + +**Images tab** — Wikimedia Commons file search in a **responsive masonry grid** +(minimum two columns on mobile — not the home-feed horizontal carousel). +Column count grows with panel width (~320px target column width via +`useWikitabSearchImageColumns.ts`). Each tile links to the Commons file +description page. + +- **Source** — Commons Action API search with **MediaSearch image-tab defaults** + plus explicit-content `-deepcat:` exclusions: + `generator=search`, `gsrnamespace=6`, `gsrsearch="filetype:bitmap|drawing + -fileres:0 -deepcat:\"Pornography\" -deepcat:\"Sexual acts\" + -deepcat:\"Explicit content\" -deepcat:\"Hentai\" {query}"`, `gsrlimit=40`, + `prop=imageinfo` (`url|size|mime`, `iiurlwidth=640` — wider than MediaSearch's + `iiurlheight=180` for full-bleed masonry). Same engine as + [Special:MediaSearch](https://commons.wikimedia.org/wiki/Special:MediaSearch), + not Articles-tab seeds / morelike. **Explicit-content filter** — CirrusSearch + excludes files in pornography / sexual-acts / explicit-content / hentai + category trees only; artistic and medical nudity are not excluded. Commons has + no safe-search API — coverage is partial (CirrusSearch may apply only a subset + of deep categories; uncategorized explicit files can still appear). Client-side + filter: `mime.startsWith('image/')` with valid width/height. Paginate via Action + API `continue` params (`gsroffset`, etc.). +- **Layout** — `WikitabSearchImageGrid.vue` splits results into N equal columns + with **2px gaps** (horizontal and vertical). `useWikitabSearchImageColumns.ts` + derives N from the image panel width (`ResizeObserver`, min 2, ~320px per + column). Results are sorted by the API's search `index`, then distributed + round-robin into columns so the top row is hits 1…N. Each card uses + the API's native + `width / height` as CSS `aspect-ratio` — images fill column width with + **no cropping** (`height: auto`, no `object-fit: cover`). On wide desktop + the image panel **breaks out** to the screen edge with **2px** inset on each + side; tabs and other tab panels stay in the centred column. +- **Styling** — subtle border (`--border-color-subtle`), `--border-radius-base`. + Hover/active borders match feed cards (`--border-color-interactive--hover` / + `--border-color-interactive--active`). The card frame keeps the API + `width / height` as CSS `aspect-ratio` through decode so tile height stays + stable; the img fills at `width: 100%`, `height: auto`. +- **Loading** — `WikitabSearchImageCard` uses thumbnail-slot loading + (`useThumbnailSlotReady.ts`, 1.5s cap): flat neutral block inside the + aspect-ratio box until decode. Initial skeletons use + `WikitabSearchImageSkeletonGrid` (borderless tiles, mixed aspect ratios, + masonry-packed). Resolved cards keep the subtle border. +- **Fetch contract** — all requests via `fetchWikimedia`. Tab fetch starts only + when Images is selected (`enabled` ref); abort when hidden or on query change, + but keep resolved results when switching tabs. Infinite scroll: one sentinel + per masonry column in `WikitabSearchImageGrid.vue` (`useInfiniteScrollMany.ts` + — fires when any column tail nears the viewport; disabled while + `loadingMore`). Load-more uses **batch-sized tail slots** per column + (`fetchingTailSlotCountsPerColumn` in `wikitabSearchImageSkeletons.ts`): + conservative `4/3` placeholders while the fetch is in flight, then exact + API aspect-ratio skeleton UI for gated slots until they reveal. +- **Top-down reveal** — never paint a real card below a skeleton in the same + column. `useWikitabSearchImageDecode.ts` tracks per-`pageid` decode; + `WikitabSearchImageGrid.vue` reveals slots top-to-bottom only when every + image above in that column has finished decoding (including the 1.5s cap). + +Implementation: `data/fetchWikitabSearchImages.ts`, +`useWikitabSearchImages.ts`, `useWikitabSearchImageColumns.ts`, +`useWikitabSearchImageDecode.ts`, `WikitabSearchImageGrid.vue`, +`WikitabSearchImageSkeletonGrid.vue`, `WikitabSearchImageCard.vue`, +`wikitabSearchImageSkeletons.ts`. + +**Activity tab** — merged edit feed scoped to the search query's **top 6 +articles** (seed + related via `fetchWikitabSearchTopTitles`). Reuses those +titles from the Articles tab when already loaded; if Activity opens while +Articles is still loading, **wait** for the first six article titles rather than +duplicating the Articles fetch pipeline. Edits from all six pages merge into one +**newest-first** list; infinite scroll pages backward through revision history on +those titles. + +**Progressive load** — mirrors the Articles tab skeleton phases: + +1. **Initial** — `WikitabSearchLoadingCard variant="activity"` while titles / + the first revision batch resolve (`loading`, or `fillingInitial` before the + first card). +2. **Resolved cards** — append one at a time as `takeNext()` completes. +3. **Tail** — two activity skeletons below resolved cards while the initial + batch is still streaming (`loadingTail`). +4. **Load more** — three skeletons at the bottom during infinite scroll + (`loadingMore`). + +Feed bootstrap is **non-blocking**: `createWikitabSearchActivityFeed` returns +after titles resolve; `feed.start()` fetches the first revision batch; +`feed.prefetchMetadata()` runs in the background for latest revids and missing +thumbnails (REST `/page/summary/` via `fetchWikitabPageSummaryThumbnails` — +same shared cache as Articles / Contribute). Cards paint immediately with +partial metadata; **Latest** chips and **40px thumbnails** patch onto already- +rendered slots when prefetch settles (`patchThumbnails` in +`useWikitabSearchActivity.ts`, same reactive pattern as revert-risk chips). + +Rate-limit contract (mandatory): + +- All requests via `fetchWikimedia` (host queue + backoff). +- **One resolved card per fetch cycle** — never dump a full parallel batch into + the UI. +- Queue refill uses `mapWithConcurrency(…, 2)` per-title revision fetches, + `rvlimit=5`, only when the internal merge queue is empty. +- Latest revid per title fetched in background (`prefetchMetadata`) for the + **Latest** chip — not a gate before the first card paints. +- Revert risk fetched per card in the background via Lift Wing + (`fetchRevertRiskLanguageAgnostic.ts`) — serial queue, not a gate before + paint; indefinite in-memory cache keyed by `revid`. +- Editor kind resolved per card in `takeNext()` via cached + `list=users&usprop=groups` lookup (`bot` / `temp` groups). +- Tab fetch starts only when Activity is selected (`enabled` ref); abort + in-flight work when hidden or on query change, but keep resolved results in + memory when switching tabs. + +UI: resolved `WikitabSearchActivityCard` rows plus activity skeleton phases +above. Resolved cards use the standard Codex card border (`--border-color-subtle` +at rest, interactive hover/active border tokens) — unlike Articles tab cards, +which are borderless. Activity skeletons have **no thumbnail column**; resolved +cards show a 40px thumbnail when one resolves. Description block: green **+n** / red **−n** character delta (from revision `size` +vs parent), or subtle **±0** when size is unchanged, on its own line above the edit +summary when the parent size is known. Chip row uses `CdxInfoChip` (in order): +**High revert risk** (Lift Wing `revertrisk-language-agnostic`, ≥0.9 probability, +every resolved edit — not latest-only; fetched per card in the background; +indefinite in-memory cache keyed by `revid`), **Latest revision** (from +background latest-revid prefetch), and **Reverted** (from revision `mw-reverted` +tag). Multiple chips may appear on one card. +Top-right `CdxMenuButton` (`cdxIconEllipsis`, quiet) exposes **Thank** (opens +`Special:Thanks/{revid}` on en.wikipedia.org in a new tab) and **Dismiss** — persists the revision id in +`WikitabConfig.dismissedActivityRevids` and removes the card; dismissed diffs are +skipped on future loads. Card links go to the en.wikipedia.org diff. Chips sit above the entire card (above the thumbnail + +content row); supporting row is editor + relative time, with a Codex icon for +editor type — **Bot** (`cdxIconRobot`), **Temporary** (`cdxIconUserTemporary`), +**User** (`cdxIconUserAvatar`). IP edits (`userid === 0`) use the same +**Temporary** icon (`cdxIconUserTemporary`). Resolved from revision `userid` +(anonymous when 0) plus the per-card user-group lookup above. + +Implementation: `data/fetchWikitabSearchActivity.ts`, +`data/fetchWikitabPageSummary.ts`, `data/fetchRevertRiskLanguageAgnostic.ts`, +`useWikitabSearchActivity.ts`, +`useWikitabDismissedActivity.ts`, `WikitabSearchActivityCard.vue`, +`WikitabSearchLoadingCard.vue`. + +**Contribute tab** — edit-opportunity cards scoped to the search query's **top 6 +articles** (same `knownTitles` as Activity). Reuses Articles-tab titles when +already loaded; if Contribute opens while Articles is still loading, **wait** for +the first six titles rather than duplicating the Articles fetch pipeline. + +- **Source** — Microtask Generator `POST /quality-check` (`potential_needs[]` → + task label + body via `editOpportunityCopy.ts` / `editOpportunityIcons.ts`). + Phase A quality-checks each top-6 title in Articles order; phase B expands via + Action API `list=search` + `srsearch=morelike:{seed}` into related articles. + Thumbnails and descriptions from Articles-tab cache or + `fetchWikitabPageSummary.ts` (shared with Articles / Activity). +- **Progressive load** — same skeleton phases as Activity (`variant="activity"`): + initial three skeletons → one resolved card per `takeNext()` → tail skeletons + while filling → load-more skeletons on infinite scroll. +- **Rate-limit contract** — Wikipedia requests via `fetchWikimedia`; Microtask + POST via `fetchWithTimeout` (not queued). **One resolved card per fetch cycle.** + Quality-check results and built cards are cached per page as each card resolves + (indefinite in-memory cache keyed by `pageid` / title; `'none'` for misses). + Summary responses are cached per title in `fetchWikitabPageSummary.ts`. Tab + fetch starts only when Contribute is selected; abort when hidden or on query + change, but keep resolved results when switching tabs. + +UI: `WikitabSearchContributeCard.vue` — bordered card (Activity shell), 96px +left thumbnail with thumbnail-slot loading, article title, task body, supporting +row with progressive task icon + label at row start and **Related to {seed}** at +row end when from morelike. Whole card links to Visual Editor +(`visualEditorUrl()` in `wikitabHtml.ts`). + +Implementation: `data/fetchWikitabSearchContribute.ts`, +`data/fetchWikitabPageSummary.ts`, `data/editOpportunityCopy.ts`, +`data/editOpportunityIcons.ts`, +`useWikitabSearchContribute.ts`, `WikitabSearchContributeCard.vue`, +`WikitabSearchLoadingCard.vue`. + +## What's inert + +"About {section}" is inert; its menu row clears its selection without acting. + +The `…` menu is a single `CdxMenuButton` — its `footer` prop renders the +separated "About …" row, and the 2px ring on the open trigger is the underlying +ToggleButton's toggled state, not hand-written CSS. Positioning is left to +Codex's floating logic, which handles desktop (start-anchored, overflowing the +column) and mobile (end-aligned to stay on screen) without per-skin CSS. diff --git a/.agents/skills/protowiki-wikitab/references/state-and-storage.md b/.agents/skills/protowiki-wikitab/references/state-and-storage.md new file mode 100644 index 00000000..35917a69 --- /dev/null +++ b/.agents/skills/protowiki-wikitab/references/state-and-storage.md @@ -0,0 +1,117 @@ +# State and storage + +Wikitab splits persistence into three layers. Keep them separate — do not fold +feed cache into user config, and do not persist transient view state. + +## Authoritative config (`wikitab-config-v*`) + +User preferences for this browser profile live in +[`data/wikitabConfig.ts`](../../../../src/prototypes/wikitab/data/wikitabConfig.ts). + +- Storage key: `wikitab-config-v1` (bump the suffix on breaking shape changes) +- API: `loadWikitabConfig()`, `saveWikitabConfig()`, `patchWikitabConfig()` +- Each field is normalized on read and write (unknown section ids dropped, etc.) + +**Grow one field at a time.** Add a property to `WikitabConfig`, a default in +`DEFAULT_WIKITAB_CONFIG`, and a line in `normalizeConfig`. Do not pre-build a +wikita-lite-style mega schema — the old prototype's 772-line `urlStateSchema.ts` +is the anti-pattern. + +Current fields: + +- `pinnedSectionIds` — most recently pinned first +- `hiddenSectionIds` — section ids hidden from the home feed and skipped for + fetching (`useWikitabHiddenSections.ts`) +- `hiddenArticleTitleKeys` — normalized article titles hidden from Trending on + the home feed (`useWikitabHiddenArticles.ts`) +- `dismissedActivityRevids` — Activity-tab revision ids permanently dismissed + via the card ellipsis menu (`useWikitabDismissedActivity.ts`) + +## Cache-only feed storage (`wikitab-feed-cache-v*`) + +[`data/feedCache.ts`](../../../../src/prototypes/wikitab/data/feedCache.ts) caches +the full daily feed — all six sections (Trending, In the news, Did you know, +Active discussions, On this day, Birthdays) — under a UTC-day key. Nothing here +is authoritative — clearing it must only ever cost one refetch. + +A new-tab page opens dozens of times a day; caching the daily feed is both fast +and good API etiquette. Writing today's entry evicts older days. + +**Active discussions TTL** — the discussions slice carries +`sliceFetchedAt.discussions` (epoch ms). `readCachedSectionSlice('discussions')` +and `readCachedFeed()` treat the slice as a miss after **5 minutes** +(`DISCUSSIONS_TTL_MS`). Other slices remain on the UTC-day key. Legacy entries +without a timestamp are treated as stale. `persistPartialFeed()` stamps the time +when a non-empty discussions slice lands. + +**Ordered home load** (`index.vue` → `refreshHomeModulesInOrder` → +`useWikitabFeed.loadSection`) reads and writes through the same cache: + +- `prepareForOrderedLoad()` hydrates `feed.value` from `readCachedFeed()` when + the day key hits, marking cached sections as already fetched via + `readCachedSectionSlice()` (so stale discussions are not marked fetched). +- Each `loadSection` call reads its slice via `fetchWikitabSectionFeed` (cache + before network) and patches localStorage via `persistPartialFeed()` after each + non-empty slice lands. Empty slices are not cached so a later open can retry. +- `feed/featured` is deduped in-memory per UTC day when Trending, News, and DYK + load separately on a cache miss (`getFeaturedPayload` in + `fetchDailyFeed.ts`). +- `fetchDailyFeedProgressive()` refetches discussions only when the rest of the + day cache hits but discussions exceeded the TTL. + +Skip caching when Trending is still empty (early UTC) so the next tab open can +retry. `?nocache=1` bypasses reads and writes. + +**DYK / In the news** — both are "current day only" in the Wikifeeds API. DYK +normally updates once at ~00:00 UTC; enwiki can switch to twice daily (~00:00 and +~12:00 UTC) during nomination backlog. UTC-day cache is sufficient for normal +days; no separate TTL unless parity with the midday rotation is needed later. + +## Cache-only Daily reads storage (`wikitab-daily-reads-cache-v*`) + +[`data/dailyReadsCache.ts`](../../../../src/prototypes/wikitab/data/dailyReadsCache.ts) +caches the loaded card list plus `hasMore` under `{ day, savedFingerprint }`. +Refetch only when that key misses (saved pages changed, UTC day rolled, or first +visit) and a Daily reads render is triggered via `refreshHomeSavedModules()` — +not on every save during the session. Only the first batch loads on refresh; +additional cards fetch on Show more. Same `?nocache=1` bypass as the feed cache. + +## Cache-only Suggested edits storage (`wikitab-suggested-edits-cache-v*`) + +[`data/suggestedEditsCache.ts`](../../../../src/prototypes/wikitab/data/suggestedEditsCache.ts) +mirrors Daily reads: `{ day, savedFingerprint, items, hasMore }`. Same refresh +cadence via `refreshHomeSavedModules()` and the Saved-module snapshot. Resumable +partial loads — `hasMore: true` lets `loadMore()` recreate the Contribute feed +with `seenPageidsFromCards()` so cached cards are not duplicated. + +## Transient component state + +Revealed page counts (`useSectionReveal`: `reserved` / `ready`) stay in memory +only. A new tab opens fresh every time; persisting scroll/reveal depth would add +complexity with little benefit. + +## URL + +Wikitab does **not** use the URL for user preferences. A browser new-tab URL is +fixed — pin state would never survive between opens if it lived in query params. + +The sole Wikitab-specific URL escape hatch is **`?nocache=1`**, read inline in +`feedCache.ts` to force a feed refetch when developing against the loading +contract. + +ProtoWiki-global params (`?theme=`, `?skin=`) are unrelated — they are resolved +onto `` at boot by [`src/theme.ts`](../../../../src/theme.ts) and +[`protowiki-skins`](../protowiki-skins/SKILL.md). + +## Legacy migration + +On first load, if stored config has empty `pinnedSectionIds` and the URL still +carries `?pinned=trending,dyk`, those ids are imported into config and the param +is stripped via `history.replaceState`. + +## Cross-tab sync + +`useWikitabPinned.ts`, `useWikitabHiddenArticles.ts`, and +`useWikitabDismissedActivity.ts` listen for the `storage` event on +`WIKITAB_CONFIG_STORAGE_KEY` so pin / hide / dismiss changes in one tab update +open tabs. diff --git a/AGENTS.md b/AGENTS.md index c77e8399..d9ab9fba 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -71,6 +71,7 @@ trailing **Inside ProtoWiki** section. | [`protowiki-theme`](.agents/skills/protowiki-theme/SKILL.md) | Light / dark theming; per-component theme overrides | | [`protowiki-deploy`](.agents/skills/protowiki-deploy/SKILL.md) | GitHub Pages deploy, PR previews, base path, fork setup, SPA 404 | | [`protowiki-update-codex`](.agents/skills/protowiki-update-codex/SKILL.md) | Upgrading Codex: bump packages, diff upstream docs, sync skills + tokens | +| [`protowiki-wikitab`](.agents/skills/protowiki-wikitab/SKILL.md) | Wikitab new-tab page: section registry, no-jump loading contract, reveal-more paging | ### Codex (design system) diff --git a/index.html b/index.html index 94c5f642..979df420 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,10 @@ - + ProtoWiki diff --git a/package-lock.json b/package-lock.json index 3ad22116..bcfc0e54 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,30 +30,30 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" + "@babel/types": "^7.29.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -63,13 +63,13 @@ } }, "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -518,9 +518,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", "dev": true, "license": "MIT", "dependencies": { @@ -569,9 +569,9 @@ "license": "MIT" }, "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, "license": "MIT", "dependencies": { @@ -619,9 +619,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", - "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.7.tgz", + "integrity": "sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw==", "dev": true, "license": "MIT", "dependencies": { @@ -631,7 +631,7 @@ "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", + "js-yaml": "^4.3.2", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, @@ -650,9 +650,9 @@ "license": "MIT" }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, "license": "MIT", "dependencies": { @@ -674,9 +674,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", - "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz", + "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==", "dev": true, "license": "MIT", "engines": { @@ -711,28 +711,28 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", - "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.11" + "@floating-ui/utils": "^0.2.12" } }, "node_modules/@floating-ui/dom": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", - "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.7.5", - "@floating-ui/utils": "^0.2.11" + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" } }, "node_modules/@floating-ui/utils": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", - "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", "license": "MIT" }, "node_modules/@floating-ui/vue": { @@ -839,11 +839,28 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", "license": "MIT" }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -883,16 +900,16 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.13", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.13.tgz", - "integrity": "sha512-3ngTAv6F/Py35BsYbeeLeecvhMKdsKm4AoOETVhAA+Qc8nrA2I0kF7oa93mE9qnIurngOSpMnQ0x2nQY2FPviA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "dev": true, "license": "MIT" }, "node_modules/@rollup/pluginutils": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", - "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", + "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", "dev": true, "license": "MIT", "dependencies": { @@ -913,9 +930,9 @@ } }, "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, "license": "MIT", "engines": { @@ -926,9 +943,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.2.tgz", - "integrity": "sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.3.tgz", + "integrity": "sha512-w3Jnvi1ocaVm/c7yVPpfB98XeSRBMyzp6njL5MVVbGyXjpmUkN+s6Hp4t0PqhGCCaI1ZHMKXt/w0lA1RCaLVcw==", "cpu": [ "arm" ], @@ -940,9 +957,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.2.tgz", - "integrity": "sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.3.tgz", + "integrity": "sha512-uI/ESiaIbbRYAEhzy8PCUWDp1hB0bjAqM06mW9flOoNO4Q8DQpeoREhBR5Hegfl+wpXiguyJv6XSPzEN7OxyHQ==", "cpu": [ "arm64" ], @@ -954,9 +971,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.2.tgz", - "integrity": "sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.3.tgz", + "integrity": "sha512-oxhrd1jmXLwWZ83eQYDXxuqRdkqkzrjR3JobKeuUyfdNZo11FuQIvqEOZhyIT7OBHxXoGslDDjN0cQcM6T0TqQ==", "cpu": [ "arm64" ], @@ -968,9 +985,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.2.tgz", - "integrity": "sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.3.tgz", + "integrity": "sha512-7/YiIMghVE8DrxKvNdorAaJVdriOFgOIpdStnPx8ppx5zfTwC3jBCSEAIzB7JD5404m65THl6H93UTTVUvypmg==", "cpu": [ "x64" ], @@ -982,9 +999,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.2.tgz", - "integrity": "sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.3.tgz", + "integrity": "sha512-GXFZRRoMAytaI5z6N3Zhfw0WL18Q0M8r95D5hlC4GqE/lGk8pbSJNUBoOWDfbm6dTciqHj2nU87tI5f6XhQiOg==", "cpu": [ "arm64" ], @@ -996,9 +1013,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.2.tgz", - "integrity": "sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.3.tgz", + "integrity": "sha512-77W+8X3ddYgPxUpB8nZFQs2Mq+wc4HVlcSRtApXLjYBcnPMkttrSnU8VwKQjeWYhMsITHFs5cWBQ8vz1Q+5RHQ==", "cpu": [ "x64" ], @@ -1010,9 +1027,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.2.tgz", - "integrity": "sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.3.tgz", + "integrity": "sha512-FVkwK+iUC+mq+GipVK46rRVticfAPtvPUNlqlGXUDxdVk/UGjQiiiUVPUrEXdSpU2ufU0XxLGyTqDtBidDOVmg==", "cpu": [ "arm" ], @@ -1024,9 +1041,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.2.tgz", - "integrity": "sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.3.tgz", + "integrity": "sha512-+aGU1t3398yQOVj1Bz8o3e+KtswxAPvO+mtxtNdfXYMkXIHu7XhhkCD7/DEH9q8tF8uhDnMWvfpUKI8y1sZJsg==", "cpu": [ "arm" ], @@ -1038,9 +1055,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.2.tgz", - "integrity": "sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.3.tgz", + "integrity": "sha512-cR0kjpRXR2KJ2oQK8E2KTPtphs+b9hZ8IhTZubNryt/RsqgdOZBQ2Zq0q5UedtiIi0rs3jVhJh55RE1ZHUVGUA==", "cpu": [ "arm64" ], @@ -1052,9 +1069,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.2.tgz", - "integrity": "sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.3.tgz", + "integrity": "sha512-y1RYi4Q3/9ByVWSSt9kX2ustE0B7kFYbJ6zZdVZVyqopZs3yhCTwRfrjIX4vezUJInma/Gs6BOFDJg7yZmJ0IQ==", "cpu": [ "arm64" ], @@ -1066,9 +1083,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.2.tgz", - "integrity": "sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.3.tgz", + "integrity": "sha512-DNhEA5viIj3Z5bZLE4z4oV8N5ozWqDwyt7T6KG7VdLDJ0nW+rNOYlphBl4/3HQkK75qipPLsVOfStHHOwN9WSg==", "cpu": [ "loong64" ], @@ -1080,9 +1097,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.2.tgz", - "integrity": "sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.3.tgz", + "integrity": "sha512-17gQCqrIpXBX2Cmi9/TygnVOqGbzsba/iaqcYSL8FY7lNugg+7AiYNs5c5nKWD+NRQha36Sa0CqkJqH4XVHwnQ==", "cpu": [ "loong64" ], @@ -1094,9 +1111,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.2.tgz", - "integrity": "sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.3.tgz", + "integrity": "sha512-6LwVnZRIyINpdku/yOcI8Tm9YqLmhHK5emmlOOnW9tO0SYEm1FmKPcsSAGp0NBlqR2P04xaND4jvN6sTHqhq8A==", "cpu": [ "ppc64" ], @@ -1108,9 +1125,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.2.tgz", - "integrity": "sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.3.tgz", + "integrity": "sha512-xMUqkTXlEUtI/p5AAukMwBRr1enU3efsTeF+bskeFfk8t1C9rcC8sLREcZXmTfAXEbvRdJVSonVJez3TMlbR3w==", "cpu": [ "ppc64" ], @@ -1122,9 +1139,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.2.tgz", - "integrity": "sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.3.tgz", + "integrity": "sha512-S3E94co9F9WRRqEaUoQZ38K1gCz6KiM+nL7/3ijq7fDGF3OznjS5TasgYITlvl27GQKtu4lOAOsr5MFwkijvOA==", "cpu": [ "riscv64" ], @@ -1136,9 +1153,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.2.tgz", - "integrity": "sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.3.tgz", + "integrity": "sha512-1QtRDwG42x5BJI3s9mxu5rEjDnfbSnk20HQ9/ylTAYnSwYwxMVb+Vgu34wzzTQ7ogqBybebgQNUDAvZVQ38DbA==", "cpu": [ "riscv64" ], @@ -1150,9 +1167,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.2.tgz", - "integrity": "sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.3.tgz", + "integrity": "sha512-BQhejF6ZXOpxbngiNTP12GCGQeaDVL2QXGeBVViKIYzFHM5RKxTxwUMB1fr1BeNFphFMpnRqC5QSXFSa4z6UQw==", "cpu": [ "s390x" ], @@ -1164,9 +1181,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.2.tgz", - "integrity": "sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.3.tgz", + "integrity": "sha512-SXagRwnI2Wlwlitllu59UK/nGVbD1CKPcNqDplHwIC4BqJcpXFjD32d1R/RbuISa95HdQrZM3/7v4bKiowFaLA==", "cpu": [ "x64" ], @@ -1178,9 +1195,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.2.tgz", - "integrity": "sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.3.tgz", + "integrity": "sha512-2IPozoEALRCziGqE8O9KMK60PMu5TS1huv4fwoeCexj+WjmcwFtX9CTOVbfXCUqcELAubEwRFPYlzb/WvwY2HQ==", "cpu": [ "x64" ], @@ -1192,9 +1209,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.2.tgz", - "integrity": "sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.3.tgz", + "integrity": "sha512-AoxqosUHT9IX54hFn2TiN6A7d6ZKTtE6pd2bqWtqkkNJ6HJGaU6FRouGX8L1O7R/ZwsnCnpQrHzb4pDEx+UHRQ==", "cpu": [ "x64" ], @@ -1206,9 +1223,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.2.tgz", - "integrity": "sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.3.tgz", + "integrity": "sha512-d+CaftKgmkFBzCwezMqqy1d0QNNYugqLCMcYVQWBy5SS2YfeMP8Q8ripkgx9O8IyBXXLHrJ+aaCV4U96usv6Yg==", "cpu": [ "arm64" ], @@ -1220,9 +1237,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.2.tgz", - "integrity": "sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.3.tgz", + "integrity": "sha512-xXlDF6nR1eOuXbdDy5Hl5fmtY7teUDevF/k0O7IPoZe4Tpmdv+lgdE5JRsnhQtt37ql9P0VF2kAN9a0OCZdo+Q==", "cpu": [ "arm64" ], @@ -1234,9 +1251,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.2.tgz", - "integrity": "sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.3.tgz", + "integrity": "sha512-YtXAgLN+JP7Ay6qG3eWhc7IHMQPzLc8r3uvhAvlJIoCz/4Q32+Bl9Fmnywidh8v1GOIMmymjovfqY9ETAtysvA==", "cpu": [ "ia32" ], @@ -1248,9 +1265,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.2.tgz", - "integrity": "sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.3.tgz", + "integrity": "sha512-WuWtSJRNo549vzcfZyEgfqb6zeSgn1F+UE5kQ+BCjzz0W4MGCjntUHkZVc1VRuAM7+ULaSyhiPxD1spyewFvkQ==", "cpu": [ "x64" ], @@ -1262,9 +1279,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.2.tgz", - "integrity": "sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.3.tgz", + "integrity": "sha512-+lIKX7O0+IGe7WuhATaAMMeT7B76vfhXH/l9wLQL+nvyhbw2ohYCKIdWL56JfDu75CWt5oKRP4QFH/jkMtBquA==", "cpu": [ "x64" ], @@ -1276,9 +1293,9 @@ ] }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true, "license": "MIT" }, @@ -1290,9 +1307,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.19.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.17.tgz", - "integrity": "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==", + "version": "22.20.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.3.tgz", + "integrity": "sha512-DZmzkmwHzXrLPAXPyKNDzlIwMMUZCVacoD25ywdy5YTKGbOx/2ld+Q38Im2zJ0vBuZP5Prd3VZutKZyXwkOS8A==", "dev": true, "license": "MIT", "peer": true, @@ -1301,17 +1318,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.1.tgz", - "integrity": "sha512-BOziFIfE+6osHO9FoJG4zjoHUcvI7fTNBSpdAwrNH0/TLvzjsk2oo8XSSOT2HhqUyhZPfHv4UOffoJ9oEEQ7Ag==", + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.70.0.tgz", + "integrity": "sha512-/v8HZt6RlyIZxB3ntehELOcUcfxKPVGWXnQdJuHRmzrqgF8nQypcC/oxGW+Ot4VGKDq81XugPKxx0n5PBtf9PA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.59.1", - "@typescript-eslint/type-utils": "8.59.1", - "@typescript-eslint/utils": "8.59.1", - "@typescript-eslint/visitor-keys": "8.59.1", + "@typescript-eslint/scope-manager": "8.70.0", + "@typescript-eslint/type-utils": "8.70.0", + "@typescript-eslint/utils": "8.70.0", + "@typescript-eslint/visitor-keys": "8.70.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -1324,15 +1341,15 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.59.1", + "@typescript-eslint/parser": "^8.70.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.9.tgz", + "integrity": "sha512-brTTsvFRt5C1gGHtPst/281UjPD5t9fBqbgoMPlVWy11ZLTPfu7HxK4ZYqO9H7o/yC9rSTCI85EaQ4OoY12qYw==", "dev": true, "license": "MIT", "engines": { @@ -1340,17 +1357,17 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.1.tgz", - "integrity": "sha512-HDQH9O/47Dxi1ceDhBXdaldtf/WV9yRYMjbjCuNk3qnaTD564qwv61Y7+gTxwxRKzSrgO5uhtw584igXVuuZkA==", + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.70.0.tgz", + "integrity": "sha512-zYvrmj9Yxd63UGaXw+kdt6A0F0s0qveJyuatIM77bYC2DE4pgmg7a50u8LR7PRtXd0x+h+Tl3eXabGm06SWd3Q==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.59.1", - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/typescript-estree": "8.59.1", - "@typescript-eslint/visitor-keys": "8.59.1", + "@typescript-eslint/scope-manager": "8.70.0", + "@typescript-eslint/types": "8.70.0", + "@typescript-eslint/typescript-estree": "8.70.0", + "@typescript-eslint/visitor-keys": "8.70.0", "debug": "^4.4.3" }, "engines": { @@ -1366,14 +1383,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.1.tgz", - "integrity": "sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg==", + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.70.0.tgz", + "integrity": "sha512-hFHbTNqhU9G+2eKFXCBVb1tjFT/LceiJ4+HfLO4pTpDI0KHi6iajpcFFkaSQ9gXmCh7n82A0PthaayEdN6mspQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.59.1", - "@typescript-eslint/types": "^8.59.1", + "@typescript-eslint/tsconfig-utils": "^8.70.0", + "@typescript-eslint/types": "^8.70.0", "debug": "^4.4.3" }, "engines": { @@ -1388,14 +1405,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.1.tgz", - "integrity": "sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg==", + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.70.0.tgz", + "integrity": "sha512-8nP3Kwh5hlgZ4FicGvmznAmJe8UL4sdU8tLukrPaMuQmDuk4Y8xYfzu/aYZW4xT2JCgc7H/TpDI5cGlxcWJSqQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/visitor-keys": "8.59.1" + "@typescript-eslint/types": "8.70.0", + "@typescript-eslint/visitor-keys": "8.70.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1406,9 +1423,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.1.tgz", - "integrity": "sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA==", + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.70.0.tgz", + "integrity": "sha512-adnkeeNq9Sq1sUf4+FRVc0KdgYghzsgFpZSQVZVvY0LCuUuN0FnQgyGzCJeC4fW1cdXseBAjU2EOqUIjbNcZUw==", "dev": true, "license": "MIT", "engines": { @@ -1423,15 +1440,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.1.tgz", - "integrity": "sha512-klWPBR2ciQHS3f++ug/mVnWKPjBUo7icEL3FAO1lhAR1Z1i5NQYZ1EannMSRYcq5qCv5wNALlXr6fksRHyYl7w==", + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.70.0.tgz", + "integrity": "sha512-NUMKIhYVaVIVLnRL9CRt+VVcuLgSHUCpXn4/+K8wql+vdInUzvx8BjUO1oJ7cG9shjFJKtF8F8Hh2kCh3/KBVw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/typescript-estree": "8.59.1", - "@typescript-eslint/utils": "8.59.1", + "@typescript-eslint/types": "8.70.0", + "@typescript-eslint/typescript-estree": "8.70.0", + "@typescript-eslint/utils": "8.70.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -1448,9 +1465,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.1.tgz", - "integrity": "sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==", + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.70.0.tgz", + "integrity": "sha512-asTOIYhDg4zdzOScCyaytrsV3cR6B4ecPQlXw/dJIm7J/MZTtCtfVII9JD8Geh4jTCrK/Xe6cg5UevoleMcoJQ==", "dev": true, "license": "MIT", "engines": { @@ -1462,16 +1479,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.1.tgz", - "integrity": "sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==", + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.70.0.tgz", + "integrity": "sha512-d9NmHMPEKQ7QCLLm1jI3zmoQBwT5KwFYjXBJ9ymZfKCUU+5rmTRykKAFvH5Qn/ZCds3CEAFS9OC9M/jkl0X2bA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.59.1", - "@typescript-eslint/tsconfig-utils": "8.59.1", - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/visitor-keys": "8.59.1", + "@typescript-eslint/project-service": "8.70.0", + "@typescript-eslint/tsconfig-utils": "8.70.0", + "@typescript-eslint/types": "8.70.0", + "@typescript-eslint/visitor-keys": "8.70.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -1490,16 +1507,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.1.tgz", - "integrity": "sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA==", + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.70.0.tgz", + "integrity": "sha512-oZmtKJz/4fufZ2p3+Cn3ijEojcdfR+1zYDH2xKYrEly0dR/Q/1xUPRCOlKGxod78nWlU2UnDe09GZ3TaknBFGA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.59.1", - "@typescript-eslint/types": "8.59.1", - "@typescript-eslint/typescript-estree": "8.59.1" + "@typescript-eslint/scope-manager": "8.70.0", + "@typescript-eslint/types": "8.70.0", + "@typescript-eslint/typescript-estree": "8.70.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1514,13 +1531,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.1.tgz", - "integrity": "sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg==", + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.70.0.tgz", + "integrity": "sha512-BoC8PiO4Hkdo0TVJh9Ntxr5MxPDI7/oFsrygN5ADelFSeXG/qgNuucIGA+L5Z6JpPTE/uRfcTWtscjbUaufepQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/types": "8.70.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -1545,13 +1562,13 @@ } }, "node_modules/@vitejs/plugin-vue": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.6.tgz", - "integrity": "sha512-u9HHgfrq3AjXlysn0eINFnWQOJQLO9WN6VprZ8FXl7A2bYisv3Hui9Ij+7QZ41F/WYWarHjwBbXtD7dKg3uxbg==", + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.9.tgz", + "integrity": "sha512-rD/MORlhaZMlXWW0rEn4FB4wMinWC0z/D7Ye160S5+Rs1mC8ZDAdcDp4SjKfUhG5t8q1ktcPVw4xuTkPRlzrSA==", "dev": true, "license": "MIT", "dependencies": { - "@rolldown/pluginutils": "1.0.0-rc.13" + "@rolldown/pluginutils": "^1.0.1" }, "engines": { "node": "^20.19.0 || >=22.12.0" @@ -1617,16 +1634,16 @@ } }, "node_modules/@vue-macros/common/node_modules/confbox": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", - "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.3.1.tgz", + "integrity": "sha512-cKUSoKa8YxFZZSmraVi7onONx3amu77ngK3kGpsYHDH7drPwCRkQE1RYMPlLRrMtnciRj274XNRxcHxnKmDSnA==", "dev": true, "license": "MIT" }, "node_modules/@vue-macros/common/node_modules/local-pkg": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", - "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.2.1.tgz", + "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1649,9 +1666,9 @@ "license": "MIT" }, "node_modules/@vue-macros/common/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, "license": "MIT", "engines": { @@ -1662,65 +1679,65 @@ } }, "node_modules/@vue-macros/common/node_modules/pkg-types": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", - "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.3.tgz", + "integrity": "sha512-j/lCFdcppV0JxWpCEITdbDltBxPP6cHT+yNJ6Go2OgoSA9518X847X9z0p6LtA4Nc16+eQzCZjRrWanTGvHJ5w==", "dev": true, "license": "MIT", "dependencies": { - "confbox": "^0.2.4", - "exsolve": "^1.0.8", + "confbox": "^0.3.1", + "exsolve": "^1.1.1", "pathe": "^2.0.3" } }, "node_modules/@vue/compiler-core": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.33.tgz", - "integrity": "sha512-3PZLQwFw4Za3TC8t0FvTy3wI16Kt+pmwcgNZca4Pj9iWL2E72a/gZlpBtAJvEdDMdCxdG/qq0C7PN0bsJuv0Rw==", + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.42.tgz", + "integrity": "sha512-2Ye1ilMtKXxl8qZUrQ5j0CdgenFp/HFQmta6rfRyfEsTG69L6Wk+tWuNoHYHMx9E8tF2Slvdg1FuwDvAXdy1LQ==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.2", - "@vue/shared": "3.5.33", + "@babel/parser": "^7.29.8", + "@vue/shared": "3.5.42", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.33.tgz", - "integrity": "sha512-PXq0yrfCLzzL07rbXO4awtXY1Z06LG2eu6Adg3RJFa/j3Cii217XxxLXG22N330gw7GmALCY0Z8RgXEviwgpjA==", + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.42.tgz", + "integrity": "sha512-qbhQZEFmycr+ni/qyuccS4sucNN7VAbDfbkvNxWOX2VfgFm90MNs3/UhRNKoPMEIVn0F8gdlYjLPvqxHwHeQOA==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.33", - "@vue/shared": "3.5.33" + "@vue/compiler-core": "3.5.42", + "@vue/shared": "3.5.42" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.33.tgz", - "integrity": "sha512-UTUvRO9cY+rROrx/pvN9P5Z7FgA6QGfokUCfhQE4EnmUj3rVnK+CHI0LsEO1pg+I7//iRYMUfcNcCPe7tg0CoA==", + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.42.tgz", + "integrity": "sha512-fkCAFB4okcAANGMThboWnScp/gzWjU0ZSkVnjTIiplmMDq2uq0tIB3j+xVu4rhv5rvOgBySCysudmbMd6xRRqw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.2", - "@vue/compiler-core": "3.5.33", - "@vue/compiler-dom": "3.5.33", - "@vue/compiler-ssr": "3.5.33", - "@vue/shared": "3.5.33", + "@babel/parser": "^7.29.8", + "@vue/compiler-core": "3.5.42", + "@vue/compiler-dom": "3.5.42", + "@vue/compiler-ssr": "3.5.42", + "@vue/shared": "3.5.42", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", - "postcss": "^8.5.10", + "postcss": "^8.5.19", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.33.tgz", - "integrity": "sha512-IErjYdnj1qIupG5xxiVIYiiRvDhGWV4zuh/RCrwfYpuL+HWQzeU6lCk/nF9r7olWMnjKxCAkOctT2qFWFkzb1A==", + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.42.tgz", + "integrity": "sha512-xmLk3wLkbizPAiLyomjgFFosf2ys9b5Ghb+oh/k2tnvipNz8OFrQOiTcWCzyK7MpBp9KkyGtfvgfLUivbmuGYA==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.33", - "@vue/shared": "3.5.33" + "@vue/compiler-dom": "3.5.42", + "@vue/shared": "3.5.42" } }, "node_modules/@vue/compiler-vue2": { @@ -1741,17 +1758,20 @@ "license": "MIT" }, "node_modules/@vue/eslint-config-typescript": { - "version": "14.7.0", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-14.7.0.tgz", - "integrity": "sha512-iegbMINVc+seZ/QxtzWiOBozctrHiF2WvGedruu2EbLujg9VuU0FQiNcN2z1ycuaoKKpF4m2qzB5HDEMKbxtIg==", + "version": "14.9.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-14.9.0.tgz", + "integrity": "sha512-E3j9hDlfVf10F30MRcLTPY2IIhWIx1nsvkVukk14kTcuA+oBVot9zsP1hzsO+PAMDxV3Fd9FimBJtUBNBL5KFA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "^8.56.0", + "@typescript-eslint/utils": "^8.60.0", "fast-glob": "^3.3.3", - "typescript-eslint": "^8.56.0", + "typescript-eslint": "^8.60.0", "vue-eslint-parser": "^10.4.0" }, + "bin": { + "vue-eslint-config-typescript": "dist/bin.js" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -1799,9 +1819,9 @@ "license": "MIT" }, "node_modules/@vue/language-core/node_modules/brace-expansion": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", - "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", "dev": true, "license": "MIT", "dependencies": { @@ -1825,63 +1845,61 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.33.tgz", - "integrity": "sha512-p8UfIqyIhb0rYGlSgSBV+lPhF2iUSBcRy7enhTmPqKWadHy9kcOFYF1AejYBP9P+avnd3OBbD49DU4pLWX/94A==", + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.42.tgz", + "integrity": "sha512-TzNNfKpb7hDxbQltwAut8VDQA5YP+BuRlxntHUuRjyKwlMvmAPbs3unhCvieijifY6vFfVBwsS7wG/C7uq+bEQ==", "license": "MIT", "dependencies": { - "@vue/shared": "3.5.33" + "@vue/shared": "3.5.42" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.33.tgz", - "integrity": "sha512-UpFF45RI9//a7rvq7RdOQblb4tup7hHG9QsmIrxkFQLzQ7R8/iNQ5LE15NhLZ1/WcHMU2b47u6P33CPUelHyIQ==", + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.42.tgz", + "integrity": "sha512-9uACtuHs7vJGkm5Bp3xu4xRDLFTIYy5DgxpToVjqGIAhAEKwQfsaLvKINhM6nFVp6bZPRFGdDqd1g52MqKsotA==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.33", - "@vue/shared": "3.5.33" + "@vue/reactivity": "3.5.42", + "@vue/shared": "3.5.42" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.33.tgz", - "integrity": "sha512-IOxMsAOwquhfITgmOgaPYl7/j8gKUxUFoflRc+u4LxyD3+783xne8vNta1PONVCvCV9A0w7hkyEepINDqfO0tw==", + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.42.tgz", + "integrity": "sha512-rsCmhiWLaRxGltLwhlCWyYkFn7WAbKRh0q17eZ1A6Dq6eqc2ACQ61IIryxz0LrsvCzHSilLA9JHovVwM8CNE2g==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.33", - "@vue/runtime-core": "3.5.33", - "@vue/shared": "3.5.33", + "@vue/reactivity": "3.5.42", + "@vue/runtime-core": "3.5.42", + "@vue/shared": "3.5.42", "csstype": "^3.2.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.33.tgz", - "integrity": "sha512-0xylq/8/h44lVG0pZFknv1XIdEgymq2E9n59uTWJBG+dIgiT0TMCSsxrN7nO16Z0MU0MPjFcguBbZV8Itk52Hw==", + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.42.tgz", + "integrity": "sha512-2++5dUyYS4gvo7xQXSECUDhB7TS0aOl5SeVfC5qSq1Jgfhjvegw1zqhwTIR3imZ+QYPJQw9gfcFvXGAjGZ7ajQ==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.33", - "@vue/shared": "3.5.33" - }, - "peerDependencies": { - "vue": "3.5.33" + "@vue/compiler-ssr": "3.5.42", + "@vue/runtime-dom": "3.5.42", + "@vue/shared": "3.5.42" } }, "node_modules/@vue/shared": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.33.tgz", - "integrity": "sha512-5vR2QIlmaLG77Ygd4pMP6+SGQ5yox9VhtnbDWTy9DzMzdmeLxZ1QqxrywEZ9sa1AVubfIJyaCG3ytyWU81ufcQ==", + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.42.tgz", + "integrity": "sha512-2rPxex1jQf4jvl9MOHl6YaXCPcrNqz/FstMOEh3QWY+/OME9nQTvl9WYeCwhW7AFjaR0SnngZGlp/wkR6rkI6g==", "license": "MIT" }, "node_modules/@wikimedia/codex": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@wikimedia/codex/-/codex-2.6.2.tgz", - "integrity": "sha512-TcT6M2sHq44aZMIOmInJKrZ8uOwVGT4i71WEAq5+pNvg4BVmPCRvoSYsLwEXqEolVB7xigUhH+BCb0P624sSUQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@wikimedia/codex/-/codex-2.7.0.tgz", + "integrity": "sha512-LZvhmGd2YcKKkavJVkWUVDL/aoBJRcSMO+PeEr5J5r4ieEye3nrtdZIuDygTezoKrLWMDNP9zUJG9kBmqzdUvw==", "license": "GPL-2.0+", "dependencies": { "@floating-ui/vue": "1.0.6", - "@wikimedia/codex-icons": "2.6.2" + "@wikimedia/codex-icons": "2.7.0" }, "engines": { "node": ">=24.14.1", @@ -1892,9 +1910,9 @@ } }, "node_modules/@wikimedia/codex-design-tokens": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@wikimedia/codex-design-tokens/-/codex-design-tokens-2.6.2.tgz", - "integrity": "sha512-gbMMV4Nw/fTsZdWiaSqWwP7F4V6lctoQA6zfuy/hGppQlU29BetT4suBuBHhOGW+Y3RohljhkAQXunKREhFVvA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@wikimedia/codex-design-tokens/-/codex-design-tokens-2.7.0.tgz", + "integrity": "sha512-wdvIzDKQmmRkVi/YYyAO0ufXYz1ISJUYzLNKWP13QlBrkw/Y6z0dypOm4WA2vJNgNxTmiabOA3dLFvefLinylQ==", "license": "GPL-2.0+", "engines": { "node": ">=24.14.1", @@ -1902,9 +1920,9 @@ } }, "node_modules/@wikimedia/codex-icons": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@wikimedia/codex-icons/-/codex-icons-2.6.2.tgz", - "integrity": "sha512-civbR6I12sCTua9t8oPNqVBCHAF30x9rQT5kYIYgBR6hhcBL9NhzYdSLgjROpnkprt1rCVKRzMEBGBae5oNauw==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@wikimedia/codex-icons/-/codex-icons-2.7.0.tgz", + "integrity": "sha512-nORTIm6pkzJk0H+4TMZLMvrCDTc1rpbQ77hHfsA230Mxjs281Kz1p5JjEiUJuXrel/PiMsbnWLWCia5h0URpIA==", "license": "MIT", "engines": { "node": ">=24.14.1", @@ -1912,9 +1930,9 @@ } }, "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "dev": true, "license": "MIT", "peer": true, @@ -2065,16 +2083,16 @@ "license": "ISC" }, "node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/braces": { @@ -2323,9 +2341,10 @@ } }, "node_modules/eslint": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", - "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.5.tgz", + "integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", "peer": true, @@ -2335,8 +2354,8 @@ "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.5", - "@eslint/js": "9.39.4", + "@eslint/eslintrc": "^3.3.6", + "@eslint/js": "9.39.5", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -2384,19 +2403,19 @@ } }, "node_modules/eslint-plugin-vue": { - "version": "10.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.9.0.tgz", - "integrity": "sha512-EFNNzu4HqtTRb5DJINpyd+u3bDdzETWDMpCzG+UBHz1tpsnMDCeOcf61u4Wy/cbXnMymK+MT9bjH7KcG1fItSw==", + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.11.0.tgz", + "integrity": "sha512-fGt38SsaPCZ2FmA3bX/3vOW2qdsPNx0/9x+7Aab6NMX++PhynMtK4LWC4vzXgfQBCqpUAler18H38GA+NBAd0Q==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", + "@eslint-community/eslint-utils": "^4.9.1", "natural-compare": "^1.4.0", "nth-check": "^2.1.1", - "postcss-selector-parser": "^7.1.0", - "semver": "^7.6.3", - "xml-name-validator": "^4.0.0" + "postcss-selector-parser": "^7.1.4", + "semver": "^7.8.5", + "xml-name-validator": "^5.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2405,7 +2424,7 @@ "@stylistic/eslint-plugin": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", "@typescript-eslint/parser": "^7.0.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "vue-eslint-parser": "^10.0.0" + "vue-eslint-parser": "^10.3.0" }, "peerDependenciesMeta": { "@stylistic/eslint-plugin": { @@ -2454,9 +2473,9 @@ "license": "MIT" }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, "license": "MIT", "dependencies": { @@ -2574,9 +2593,9 @@ } }, "node_modules/exsolve": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", - "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.1.tgz", + "integrity": "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==", "dev": true, "license": "MIT" }, @@ -2632,9 +2651,9 @@ "license": "MIT" }, "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", + "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", "dev": true, "license": "ISC", "dependencies": { @@ -2699,9 +2718,9 @@ } }, "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", "dev": true, "license": "ISC" }, @@ -2857,10 +2876,20 @@ "license": "ISC" }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -3017,13 +3046,13 @@ } }, "node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.5" + "brace-expansion": "^5.0.8" }, "engines": { "node": "18 || 20 || >=22" @@ -3067,9 +3096,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", + "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", "funding": [ { "type": "github", @@ -3250,9 +3279,9 @@ "license": "MIT" }, "node_modules/postcss": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.12.tgz", - "integrity": "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==", + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", "funding": [ { "type": "opencollective", @@ -3270,7 +3299,7 @@ "license": "MIT", "peer": true, "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.18", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -3279,9 +3308,9 @@ } }, "node_modules/postcss-prefix-selector": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-2.1.1.tgz", - "integrity": "sha512-ZBgf427Et6+XnrnJ9VXtJEKCjJwTvn2wn/qMg+wvvlRhIeFIAxdbrlZZ0CSsWYMJfcyPLBh8ogj5O1kb/Mcx3g==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-2.2.1.tgz", + "integrity": "sha512-oMvY0GLVjg6b/N09B4h/xWYczc+LsX1O+laIpXDBbP6tZll+Cj5kXxdI0IZ23NOQ+XIko8VDsCFj+bhgYsmP8g==", "dev": true, "license": "MIT", "peerDependencies": { @@ -3289,9 +3318,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz", + "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==", "dev": true, "license": "MIT", "dependencies": { @@ -3313,9 +3342,9 @@ } }, "node_modules/prettier": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", - "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.7.tgz", + "integrity": "sha512-T3mF5P7HFzZVLDQuCUNtJj6WK1pcpLMweMNUVwGb01bLNkH9AkKxtZvmInw8K6bnn2O3d6/5RHl6zSHiBAD0Og==", "dev": true, "license": "MIT", "bin": { @@ -3411,14 +3440,14 @@ } }, "node_modules/rollup": { - "version": "4.60.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz", - "integrity": "sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==", + "version": "4.63.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.3.tgz", + "integrity": "sha512-1i2XreiAoMMXuPGD6Msj2xWrMMkHojNRKivInxGQcg7/1KuPuYlfUutLyh4drnOxUTHX9cHI4wFoat8D/NKaBw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@types/estree": "1.0.8" + "@types/estree": "1.0.9" }, "bin": { "rollup": "dist/bin/rollup" @@ -3428,31 +3457,32 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.60.2", - "@rollup/rollup-android-arm64": "4.60.2", - "@rollup/rollup-darwin-arm64": "4.60.2", - "@rollup/rollup-darwin-x64": "4.60.2", - "@rollup/rollup-freebsd-arm64": "4.60.2", - "@rollup/rollup-freebsd-x64": "4.60.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.60.2", - "@rollup/rollup-linux-arm-musleabihf": "4.60.2", - "@rollup/rollup-linux-arm64-gnu": "4.60.2", - "@rollup/rollup-linux-arm64-musl": "4.60.2", - "@rollup/rollup-linux-loong64-gnu": "4.60.2", - "@rollup/rollup-linux-loong64-musl": "4.60.2", - "@rollup/rollup-linux-ppc64-gnu": "4.60.2", - "@rollup/rollup-linux-ppc64-musl": "4.60.2", - "@rollup/rollup-linux-riscv64-gnu": "4.60.2", - "@rollup/rollup-linux-riscv64-musl": "4.60.2", - "@rollup/rollup-linux-s390x-gnu": "4.60.2", - "@rollup/rollup-linux-x64-gnu": "4.60.2", - "@rollup/rollup-linux-x64-musl": "4.60.2", - "@rollup/rollup-openbsd-x64": "4.60.2", - "@rollup/rollup-openharmony-arm64": "4.60.2", - "@rollup/rollup-win32-arm64-msvc": "4.60.2", - "@rollup/rollup-win32-ia32-msvc": "4.60.2", - "@rollup/rollup-win32-x64-gnu": "4.60.2", - "@rollup/rollup-win32-x64-msvc": "4.60.2", + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.63.3", + "@rollup/rollup-android-arm64": "4.63.3", + "@rollup/rollup-darwin-arm64": "4.63.3", + "@rollup/rollup-darwin-x64": "4.63.3", + "@rollup/rollup-freebsd-arm64": "4.63.3", + "@rollup/rollup-freebsd-x64": "4.63.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.63.3", + "@rollup/rollup-linux-arm-musleabihf": "4.63.3", + "@rollup/rollup-linux-arm64-gnu": "4.63.3", + "@rollup/rollup-linux-arm64-musl": "4.63.3", + "@rollup/rollup-linux-loong64-gnu": "4.63.3", + "@rollup/rollup-linux-loong64-musl": "4.63.3", + "@rollup/rollup-linux-ppc64-gnu": "4.63.3", + "@rollup/rollup-linux-ppc64-musl": "4.63.3", + "@rollup/rollup-linux-riscv64-gnu": "4.63.3", + "@rollup/rollup-linux-riscv64-musl": "4.63.3", + "@rollup/rollup-linux-s390x-gnu": "4.63.3", + "@rollup/rollup-linux-x64-gnu": "4.63.3", + "@rollup/rollup-linux-x64-musl": "4.63.3", + "@rollup/rollup-openbsd-x64": "4.63.3", + "@rollup/rollup-openharmony-arm64": "4.63.3", + "@rollup/rollup-win32-arm64-msvc": "4.63.3", + "@rollup/rollup-win32-ia32-msvc": "4.63.3", + "@rollup/rollup-win32-x64-gnu": "4.63.3", + "@rollup/rollup-win32-x64-msvc": "4.63.3", "fsevents": "~2.3.2" } }, @@ -3488,9 +3518,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", "bin": { @@ -3559,9 +3589,9 @@ } }, "node_modules/tinyglobby": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", - "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", "dependencies": { @@ -3594,9 +3624,9 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, "license": "MIT", "peer": true, @@ -3662,16 +3692,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.59.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.1.tgz", - "integrity": "sha512-xqDcFVBmlrltH64lklOVp1wYxgJr6LVdg3NamBgH2OOQDLFdTKfIZXF5PfghrnXQKXZGTQs8tr1vL7fJvq8CTQ==", + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.70.0.tgz", + "integrity": "sha512-P/W5cz70/cQAuKfY3xwQMWWTV7BvJ0mAQmi+9mBcsVPaBUpd6Ohpa+fECv9rBFrQcig86jAiNBFNWUqnTjr4pw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.59.1", - "@typescript-eslint/parser": "8.59.1", - "@typescript-eslint/typescript-estree": "8.59.1", - "@typescript-eslint/utils": "8.59.1" + "@typescript-eslint/eslint-plugin": "8.70.0", + "@typescript-eslint/parser": "8.70.0", + "@typescript-eslint/typescript-estree": "8.70.0", + "@typescript-eslint/utils": "8.70.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3686,9 +3716,9 @@ } }, "node_modules/ufo": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", - "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", "dev": true, "license": "MIT" }, @@ -3763,9 +3793,9 @@ "license": "MIT" }, "node_modules/vite": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.2.tgz", - "integrity": "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==", + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", + "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", "dev": true, "license": "MIT", "peer": true, @@ -3857,9 +3887,9 @@ } }, "node_modules/vite/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, "license": "MIT", "peer": true, @@ -3871,24 +3901,24 @@ } }, "node_modules/vscode-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", - "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.2.0.tgz", + "integrity": "sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==", "dev": true, "license": "MIT" }, "node_modules/vue": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.33.tgz", - "integrity": "sha512-1AgChhx5w3ALgT4oK3acm2Es/7jyZhWSVUfs3rOBlGQC0rjEDkS7G4lWlJJGGNQD+BV3reCwbQrOe1mPNwKHBQ==", + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.42.tgz", + "integrity": "sha512-4RyHQTbQvOPs3MfvUO1Sg0YRrKNnA0mAVtvpd12Tg1fKDN7OHBUl1IqSn8zGJjK9nI3NkNp8cgTpVrSZC5TTcA==", "license": "MIT", "peer": true, "dependencies": { - "@vue/compiler-dom": "3.5.33", - "@vue/compiler-sfc": "3.5.33", - "@vue/runtime-dom": "3.5.33", - "@vue/server-renderer": "3.5.33", - "@vue/shared": "3.5.33" + "@vue/compiler-dom": "3.5.42", + "@vue/compiler-sfc": "3.5.42", + "@vue/runtime-dom": "3.5.42", + "@vue/server-renderer": "3.5.42", + "@vue/shared": "3.5.42" }, "peerDependencies": { "typescript": "*" @@ -3900,9 +3930,9 @@ } }, "node_modules/vue-eslint-parser": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.4.0.tgz", - "integrity": "sha512-Vxi9pJdbN3ZnVGLODVtZ7y4Y2kzAAE2Cm0CZ3ZDRvydVYxZ6VrnBhLikBsRS+dpwj4Jv4UCv21PTEwF5rQ9WXg==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.4.1.tgz", + "integrity": "sha512-Gk6gRDj0n/fkRa3C3l0bBheoBckUq/Rs0F/TvMWIS6nzzx67amAViMe9CkNgsP2tXyQONvGiHQESHwFtZ3aYDA==", "dev": true, "license": "MIT", "dependencies": { @@ -4003,19 +4033,19 @@ } }, "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", "dev": true, "license": "Apache-2.0", "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/yaml": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", - "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz", + "integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==", "dev": true, "license": "ISC", "bin": { diff --git a/public/images/wikita-lite-onboarding-globe-poster.gif b/public/images/wikita-lite-onboarding-globe-poster.gif new file mode 100644 index 00000000..24c0364d Binary files /dev/null and b/public/images/wikita-lite-onboarding-globe-poster.gif differ diff --git a/public/images/wikita-lite-onboarding-globe.gif b/public/images/wikita-lite-onboarding-globe.gif new file mode 100644 index 00000000..3453998a Binary files /dev/null and b/public/images/wikita-lite-onboarding-globe.gif differ diff --git a/public/images/wikita-lite-onboarding-hero.png b/public/images/wikita-lite-onboarding-hero.png new file mode 100644 index 00000000..a97024dc Binary files /dev/null and b/public/images/wikita-lite-onboarding-hero.png differ diff --git a/public/wikita-lite/wikiminute-social-media.png b/public/wikita-lite/wikiminute-social-media.png new file mode 100644 index 00000000..a542cc77 Binary files /dev/null and b/public/wikita-lite/wikiminute-social-media.png differ diff --git a/src/components/MobileWrapper.vue b/src/components/MobileWrapper.vue index 9470f0f3..5fd8d4a0 100644 --- a/src/components/MobileWrapper.vue +++ b/src/components/MobileWrapper.vue @@ -1,10 +1,17 @@