`, `
`) when primitives exist.
+ - Always compose: `TInput`, `TButton`, `TCard`, `TDivider`, `TDropdown`, `TDropdownItem`.
+
+4. **Preserve Dynamic Polymorphism & Escape Hatches**:
+ - Never collapse dynamic descriptor branches into hardcoded constants.
+ - Always keep plugin component escape hatches (`resolveComponent(ui.component)`), slot variants, and fallbacks.
+
+5. **Extensible Menus & Navigation**:
+ - Do NOT hardcode domain-specific menus (e.g., Settings/Admin/Logout) into UI kit primitives.
+ - Provide an `items` array prop (`MenuItem[]`) and `#menu` / `#header` slots with sensible defaults.
+
+6. **Zero Migration Noise & Strict Types**:
+ - Never commit scaffolding/transitional comments (`Migrated from webui/...`, `Tier 0 primitive`, `mirrors ...`).
+ - Never use `@ts-nocheck` to silence TypeScript errors. Fix types properly.
diff --git a/.gitignore b/.gitignore
index 58a49d2..f0c2167 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,5 @@ cypress/videos
cypress/downloads
*.log
.DS_Store
+
+.playwright-mcp/
diff --git a/.storybook/preview.js b/.storybook/preview.js
index 84467d2..220d21a 100644
--- a/.storybook/preview.js
+++ b/.storybook/preview.js
@@ -1,12 +1,44 @@
// Default token values so components are themed in isolation.
import '../assets/css/tokens.css';
-// NuxtLink is provided by Nuxt at runtime. Outside Nuxt (Storybook), register a
-// minimal stand-in so components that render links still mount.
import { setup } from '@storybook/vue3';
-import { h } from 'vue';
+import { h, ref } from 'vue';
+
+// Minimal en translations for storybook preview
+const messages = {
+ 'Sign in with Google': 'Sign in with Google',
+ 'Sign up with Google': 'Sign up with Google',
+ 'Theme': 'Theme',
+ 'Light': 'Light',
+ 'Dark': 'Dark',
+ 'System': 'System',
+ 'Language': 'Language',
+ 'Cancel': 'Cancel',
+ 'Confirm': 'Confirm',
+ 'carousel.ai.title': 'Just ask',
+ 'carousel.ai.text': 'Log expenses, build reports and get answers by chatting with your assistant in plain language.',
+ 'carousel.integrations.title': 'Connect your bank',
+ 'carousel.integrations.text': 'Link accounts with Plaid and import statements, so your transactions flow in on their own.',
+ 'carousel.import.title': 'Import anything',
+ 'carousel.import.text': 'Drop in a statement in any format and the assistant reads it, structured or not, into clean transactions.',
+ 'carousel.welcome.title': "Sit back, we've got this",
+ 'carousel.welcome.text': "You handle life. Trakli wrangles the receipts, the math and the mess. Welcome aboard!"
+};
+
+const locale = ref('en');
+const t = (key) => messages[key] || key;
+const setLocale = (l) => { locale.value = l; };
+
+// Provide global nuxt helper stand-ins so components can render cleanly in Storybook
+window.useI18n = () => ({ t, locale, setLocale });
+window.useCookie = () => ref('mock-cookie');
+window.useApi = () => async () => ({ data: {} });
setup((app) => {
+ app.config.globalProperties.t = t;
+ app.config.globalProperties.locale = locale;
+ app.config.globalProperties.setLocale = setLocale;
+
app.component('NuxtLink', {
props: { to: { type: [String, Object], default: '#' } },
setup(props, { slots }) {
diff --git a/UI_ARCHITECTURE.md b/UI_ARCHITECTURE.md
new file mode 100644
index 0000000..9ce4f5e
--- /dev/null
+++ b/UI_ARCHITECTURE.md
@@ -0,0 +1,957 @@
+# UI Design System: Component Architecture Inventory & Migration Tracker
+
+> **Architecture Note**: This codebase follows a **pragmatic 5-layer component hierarchy** rather than the modern 6-layer headless-first pattern:
+>
+> ```
+> Layer 0: Design Tokens & Utilities
+> Layer 1: Base Components (Atoms) — Styled building blocks
+> Layer 2: Composite Components (Molecules) — Reusable patterns
+> Layer 3: Domain Components — Business logic & data-bound
+> Layer 4: Layouts & Pages — Application structure & routes
+> ```
+>
+> **Key Difference**: This codebase does **not** have a dedicated headless primitive layer (like Radix UI, Ark UI, or React Aria). Base components (Layer 1) serve dual roles as both behavioral and visual primitives. When migrating to a headless-first architecture, Layer 1 components should be refactored to compose headless primitives with styled wrappers.
+
+> **Tracking Legend**:
+> - `[ ]` = Pending migration
+> - `[x]` = Migrated to the modern headless/token-driven standard
+
+---
+
+## ▸ Layer 0: Design Tokens, Foundation Scales & Utilities
+
+> The absolute foundation. Raw design variables, scale systems, formatters, and stateless utility logic. Zero dependency on components or business domain data.
+
+> The absolute ground floor. Raw values, algorithms, formatters, and stateless UI logic only. Zero dependency on business domain data.
+
+---
+
+### 0.1 Color Tokens & CSS Custom Properties
+**File:** [assets/scss/_variables.scss](file:///home/lantum/Desktop/Projects/webui/assets/scss/_variables.scss)
+
+#### Brand & Interaction Palette
+- [x] `--color-primary` — Core brand green (`#047844` / dark: `#059669`)
+- [x] `--color-primary-rgb` — RGB channel split for alpha mixing
+- [x] `--color-primary-hover` — Hover darkened shade
+- [x] `--color-primary-light` — Tinted fill for chips, surfaces
+- [x] `--color-primary-dark` — Deep/contrast accent
+- [x] `--color-primary-lighter` — Soft accent for highlights
+- [x] `--color-primary-border` — Focused ring / active border colour
+- [x] `--color-primary-muted` — Subtle badge and indicator
+- [x] `--color-primary-toggle` — Switch/toggle active state
+- [x] `--color-success` / `--color-success-rgb`
+- [x] `--color-error` / `--color-error-rgb` / `--color-error-dark`
+- [x] `--color-warning` / `--color-warning-rgb` / `--color-warning-bg` / `--color-warning-text`
+- [x] `--color-info` / `--color-info-rgb`
+- [x] `--color-accent` — Callout / flash highlight
+
+#### Financial Domain Semantics
+- [x] `--color-income` / `--color-income-rgb` / `--color-income-soft`
+- [x] `--color-expense` / `--color-expense-rgb` / `--color-expense-soft`
+- [x] `--color-neutral-soft` — Transfers / balanced entries
+- [x] `--color-chart-grid` — SVG/Canvas axis grid lines
+- [x] `--color-table-header` — Sticky table header background
+
+#### Typography & Surface Tokens
+- [x] `--color-text-primary` / `--color-text-secondary` / `--color-text-muted` / `--color-text-inverse`
+- [x] `--color-bg-light` / `--color-bg-gray` / `--color-bg-white` / `--color-bg-slate` / `--color-bg-card`
+- [x] `--color-input-bg`
+- [x] `--color-border` / `--color-border-light` / `--color-border-medium` / `--color-border-gray`
+- [x] `--glass-bg` / `--glass-bg-strong` — Glassmorphic backdrop fills
+- [x] `--hover-overlay` / `--press-overlay` — State layer overlays
+
+---
+
+### 0.2 Elevation & Shadow Scales
+**File:** [assets/scss/_variables.scss](file:///home/lantum/Desktop/Projects/webui/assets/scss/_variables.scss)
+
+- [x] `--shadow-sm` / `--shadow-md` / `--shadow-lg` / `--shadow-xl`
+- [x] `--elevation-0` — Flat / no shadow
+- [x] `--elevation-1` — Subtle ambient (base cards)
+- [x] `--elevation-2` — Raised cards & dropdowns
+- [x] `--elevation-3` — Floating panels
+- [x] `--elevation-4` — Dialogs & popovers
+- [x] `--elevation-5` — Critical overlays
+
+---
+
+### 0.3 Design Scales: Spacing, Radius, Typography, Breakpoints, Z-Index & Motion
+**File:** [assets/scss/_variables.scss](file:///home/lantum/Desktop/Projects/webui/assets/scss/_variables.scss)
+
+#### Spacing Scale
+- [x] `$spacing-1` (4px) · `$spacing-2` (8px) · `$spacing-3` (12px) · `$spacing-4` (16px)
+- [x] `$spacing-5` (20px) · `$spacing-6` (24px) · `$spacing-8` (32px) · `$spacing-10` (40px) · `$spacing-12` (48px)
+
+#### Border Radius Scale
+- [x] `$radius-sm` (2px) · `$radius-md` (4px) · `$radius-lg` (6px) · `$radius-xl` (8px)
+
+#### Typography Scale & Font Weights
+- [x] `$font-family-sans` — `'Ubuntu', -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, sans-serif`
+- [x] `$font-size-xs` (12px) · `$font-size-sm` (14px) · `$font-size-base` (16px) · `$font-size-lg` (18px) · `$font-size-xl` (20px) · `$font-size-2xl` (24px)
+- [x] `$font-normal` (400) · `$font-medium` (500) · `$font-semibold` (600) · `$font-bold` (700)
+
+#### Responsive Breakpoints
+- [x] `$breakpoint-sm` (640px) · `$breakpoint-md` (768px) · `$breakpoint-lg` (1024px) · `$breakpoint-xl` (1280px) · `$breakpoint-2xl` (1536px)
+
+#### Z-Index Scale
+- [x] `$z-index-dropdown` (1000) · `$z-index-sticky` (1020) · `$z-index-fixed` (1030)
+- [x] `$z-index-modal-backdrop` (1040) · `$z-index-modal` (1050) · `$z-index-popover` (1060) · `$z-index-tooltip` (1070)
+
+#### Motion & Easing Curves (Material 3)
+- [x] `$easing-standard` `cubic-bezier(0.2, 0, 0, 1)` — Everyday micro-interactions
+- [x] `$easing-emphasized` `cubic-bezier(0.3, 0, 0, 1)` — Hero / page-level transitions
+- [x] `$easing-decelerate` `cubic-bezier(0, 0, 0, 1)` — Entering animations
+- [x] `$easing-accelerate` `cubic-bezier(0.3, 0, 1, 1)` — Exiting animations
+- [x] `$duration-fast` (150ms) · `$duration-base` (250ms) · `$duration-slow` (400ms) · `$duration-deliberate` (600ms)
+
+#### Layout Structural Constants
+- [x] `$navbar-height` (52px) · `$navbar-icon-button-height` (36px)
+- [x] `$sidebar-width` (300px) · `$sidebar-width-collapsed` (80px) · `$sidebar-mobile-width` (280px)
+- [x] `$table-cell-padding` / `$table-header-padding`
+
+---
+
+### 0.4 Global CSS Surface & Utility Primitives
+
+#### Surface Variants — [assets/scss/_surfaces.scss](file:///home/lantum/Desktop/Projects/webui/assets/scss/_surfaces.scss)
+- [x] `.surface` base class + `--surface-bg` / `--surface-ink` / `--surface-accent` / `--surface-deep` scoped custom properties
+- [x] `.surface--brand` / `.surface--brand-soft`
+- [x] `.surface--income` / `.surface--expense` / `.surface--neutral`
+- [x] `.surface--investment` / `.surface--loan` / `.surface--gift`
+- [x] `.display-1` / `.display-2` / `.display-3` — Fluid `clamp()` hero headings
+- [x] `.eyebrow` — 11px uppercased section labels
+- [x] `.glass-pill` — Backdrop-blurred pill tag
+- [x] `.tone-card` — Responsive tone surface card wrapper
+
+#### Form Structural Class Primitives — [assets/scss/_form-styles.scss](file:///home/lantum/Desktop/Projects/webui/assets/scss/_form-styles.scss)
+- [x] `.entity-form` — Max-width constrained column layout form container
+- [x] `.card-form` — Modal card wrapper for forms
+- [x] `.form-group` — Flex column with gap
+- [x] `.form-label` / `.error-text`
+- [x] `.form-input` / `.form-select` / `.form-textarea` — Full-featured input atoms with hover, focus, disabled, error states
+- [x] `.form-header` / `.form-actions` — Structured header + footer button rows
+- [x] `.name-col` / `.name-icon-row` / `.two-col-row` — Grid layout helpers
+- [x] `.btn` / `.btn-primary` / `.btn-secondary` — Generic button class set
+- [x] `.submit-btn` / `.close-btn` — Specialised form action buttons
+- [x] `.icon-trigger` / `.icon-popover` — Icon picker trigger button + floating container
+
+#### Layout Utility Primitives — [assets/scss/_utilities.scss](file:///home/lantum/Desktop/Projects/webui/assets/scss/_utilities.scss)
+- [x] `.only-mobile` / `.only-tablet` / `.only-desktop` — Viewport-conditional visibility
+- [x] `.hide-mobile` / `.hide-tablet` / `.hide-desktop` — Viewport-conditional hiding
+- [x] `.chip` / `.chip--primary` / `.chip--report` / `.chip-icon` — Pill geometry primitive
+- [x] `.icon-button` — 28–32px icon-only bounding box button
+- [x] `.search-container` — Responsive flex search wrapper
+
+---
+
+### 0.5 Headless UI Helpers, Algorithms & Formatters
+
+#### Color Utilities — [utils/colors.ts](file:///home/lantum/Desktop/Projects/webui/utils/colors.ts)
+- [x] `hashString(str)` — Deterministic 32-bit string-to-integer hash
+- [x] `generateHSLColor(input, saturation, lightness)` — Infinite algorithmic colour generator
+- [x] `getColorForItem(item, index, opts)` — Base palette first, then HSL fallback
+- [x] `generateColorPalette(items, opts)` — Bulk unique colour mapping for lists/charts
+- [x] `getChartColors(data, opts)` — Chart dataset colour enricher
+- [x] `THEME_COLORS` — Semantic colour constants map (`income`, `expense`, `balance`, `neutral`, `success`, `warning`, `danger`, `info`)
+
+#### Currency & Data Formatters — [utils/currency.ts](file:///home/lantum/Desktop/Projects/webui/utils/currency.ts)
+- [x] `formatCurrency(amount, currency, locale)` — `Intl.NumberFormat` localized money formatter
+
+#### Headless UI State Composables
+- [x] `useTheme()` — Light/Dark/System state machine, `localStorage` persistence, `prefers-color-scheme` listener ([composables/useTheme.ts](file:///home/lantum/Desktop/Projects/webui/composables/useTheme.ts))
+- [x] `useDropdown()` — Click-outside DOM listener, open/close toggle, `rootRef` anchor ([composables/useDropdown.ts](file:///home/lantum/Desktop/Projects/webui/composables/useDropdown.ts))
+- [x] `useSidebar()` — Mobile drawer state, viewport resize listener, desktop collapse persistence ([composables/useSidebar.js](file:///home/lantum/Desktop/Projects/webui/composables/useSidebar.js))
+- [x] `usePasswordToggle()` — Input `type` toggle (`password` ↔ `text`) ([composables/usePasswordToggle.js](file:///home/lantum/Desktop/Projects/webui/composables/usePasswordToggle.js))
+- [x] `useAvatar()` — Deterministic initials parser and fallback avatar background resolver ([composables/useAvatar.ts](file:///home/lantum/Desktop/Projects/webui/composables/useAvatar.ts))
+- [x] `useMarkdown()` — SSR-safe, HTML-escaped Markdown-It renderer (`html: false`, `linkify: true`) ([composables/useMarkdown.ts](file:///home/lantum/Desktop/Projects/webui/composables/useMarkdown.ts))
+
+---
+
+## ▸ Layer 1: Base Components (Atoms)
+
+> Lowest-level styled `.vue` building blocks. These are **already styled components** (not headless primitives). They serve dual roles as both behavioral and visual atoms. Zero business/domain logic. Stateless or local-state only.
+>
+> **Migration Path**: When adopting a headless-first architecture, these should be refactored to compose headless primitives (Radix UI, Ark UI, or Reka UI) with a thin styled wrapper layer.
+
+| Status | Component | File | Description |
+| :---: | :--- | :--- | :--- |
+| [x] | **TButton** | [TButton.vue](file:///home/lantum/Desktop/Projects/webui/components/TButton.vue) | Polymorphic button atom. Variants: `primary`, `secondary`, `outline`, `text`. Sizes: `small`, `medium`, `large`. States: `loading` (spinner), `disabled`, `fullWidth`. Renders as `
` when `to` prop provided. |
+| [x] | **TDropdown** | [TDropdown.vue](file:///home/lantum/Desktop/Projects/webui/components/TDropdown.vue) | Headless floating overlay container. Click-outside detection. `trigger` + default content slots. Scale + fade animated transitions. |
+| [x] | **TDropdownItem** | [TDropdownItem.vue](file:///home/lantum/Desktop/Projects/webui/components/TDropdownItem.vue) | Slot-based menu item button. 40px touch target. Standardised hover / focus-visible / active states. |
+| [x] | **TCard** | [TCard.vue](file:///home/lantum/Desktop/Projects/webui/components/TCard.vue) | Structural card container with elevation tokens. `header`, body, and `footer` slots. |
+| [x] | **TTabs** | [TTabs.vue](file:///home/lantum/Desktop/Projects/webui/components/TTabs.vue) | Pill-style tab bar. Dynamic named slot switching per active tab. Icon + label per tab. |
+| [x] | **SearchInput** | [SearchInput.vue](file:///home/lantum/Desktop/Projects/webui/components/SearchInput.vue) | Debounced `v-model` text input with built-in search icon and focus-expand animation. |
+| [x] | **LoadingSkeleton** | [LoadingSkeleton.vue](file:///home/lantum/Desktop/Projects/webui/components/LoadingSkeleton.vue) | Shimmer-animated skeleton. Variants: `default`, `list`, `card`, `table`. Props: `count`, `columns`. |
+| [x] | **EmptyState** | [EmptyState.vue](file:///home/lantum/Desktop/Projects/webui/components/EmptyState.vue) | Full-center empty state with customisable icon, i18n headline, subtitle, and CTA button (`@create`). |
+| [x] | **ComponentLoader** | [ComponentLoader.vue](file:///home/lantum/Desktop/Projects/webui/components/ComponentLoader.vue) | State orchestration wrapper: loading → `LoadingSkeleton`, error → retry alert, empty → `EmptyState`, data → default slot. |
+| [x] | **HamburgerMenu** | [HamburgerMenu.vue](file:///home/lantum/Desktop/Projects/webui/components/HamburgerMenu.vue) | Animated 3-line → X toggle button for mobile navigation. `isOpen` prop + `@toggle` emit. |
+| [x] | **TInfoButton** | [TInfoButton.vue](file:///home/lantum/Desktop/Projects/webui/components/TInfoButton.vue) | 34×48px information icon button atom. |
+| [x] | **TypingDots** | [ai/TypingDots.vue](file:///home/lantum/Desktop/Projects/webui/components/ai/TypingDots.vue) | Aria-labelled 3-dot staggered bounce animation for AI streaming / loading states. |
+| [x] | **TAvatar** | [TAvatar.vue](file:///home/lantum/Desktop/Projects/webui/components/TAvatar.vue) | User avatar trigger button with integrated account dropdown (Settings, Admin, Logout). Consumes `useDropdown` + `useAuth`. |
+| [x] | **Logo** | [Logo.vue](file:///home/lantum/Desktop/Projects/webui/components/Logo.vue) | Brand logo image. Sizes: `small / medium / large`. Fallback path error handling. |
+| [x] | **ViewToggle** | [ViewToggle.vue](file:///home/lantum/Desktop/Projects/webui/components/ViewToggle.vue) | Segmented 2-button control toggling `table` ↔ `cards` view mode via `v-model`. |
+| [x] | **ThemeToggleButton** | [ThemeToggleButton.vue](file:///home/lantum/Desktop/Projects/webui/components/ThemeToggleButton.vue) | 40px round icon button calling `useTheme().toggleTheme()`. Swaps `Sun` / `Moon` icon based on `isDark`. |
+| [x] | **GoogleIcon** | [icons/GoogleIcon.vue](file:///home/lantum/Desktop/Projects/webui/components/icons/GoogleIcon.vue) | Inline SVG Google brand logo. No props; purely presentational. |
+| [x] | **AuthDivider** | [auth/AuthDivider.vue](file:///home/lantum/Desktop/Projects/webui/components/auth/AuthDivider.vue) | Horizontal "OR" divider with flanking lines for auth forms. Purely decorative layout atom. |
+| [x] | **AuthFooterLink** | [AuthFooterLink.vue](file:///home/lantum/Desktop/Projects/webui/components/AuthFooterLink.vue) | Auth-page footer copy + link row. Props: `text`, `linkText`, `to`. |
+| [x] | **ExtensionSlot** | [extensions/ExtensionSlot.vue](file:///home/lantum/Desktop/Projects/webui/components/extensions/ExtensionSlot.vue) | Renderless plugin injection point. Iterates slot contributions via `useExtensionSlots` and delegates to `DescriptorRenderer`. |
+
+---
+
+## ▸ Layer 2: Composite Components (Molecules & Organisms)
+
+> Reusable widgets combining multiple Layer 1 atoms or SCSS primitives into richer interactive patterns. No product/domain logic. Safe to use across any context within the application.
+
+| Status | Component | File | Description |
+| :---: | :--- | :--- | :--- |
+| [x] | **SearchableDropdown** | [SearchableDropdown.vue](file:///home/lantum/Desktop/Projects/webui/components/SearchableDropdown.vue) | Full-featured combobox. Text search, single & multi-select, chip removal, option highlight matching, outside-click detection, disabled options. |
+| [x] | **ThemeSelector** | [ThemeSelector.vue](file:///home/lantum/Desktop/Projects/webui/components/ThemeSelector.vue) | `.icon-button` trigger + themed dropdown panel exposing Light / Dark / System options. Consumes `useTheme` + `useDropdown`. |
+| [x] | **LanguageSelector** | [LanguageSelector.vue](file:///home/lantum/Desktop/Projects/webui/components/LanguageSelector.vue) | Flag-icon trigger + scrollable locale list dropdown. Consumes `useI18n` + `useDropdown`. |
+| [x] | **CollapsibleSection** | [settings/CollapsibleSection.vue](file:///home/lantum/Desktop/Projects/webui/components/settings/CollapsibleSection.vue) | Animated accordion with icon title, expand/collapse chevron, inline Edit/Done mode toggle, and slotted body content. |
+| [x] | **ConfirmModal** | [modals/ConfirmModal.vue](file:///home/lantum/Desktop/Projects/webui/components/modals/ConfirmModal.vue) | Backdrop modal dialog with animated entry, contextual icon, and confirm/cancel actions. Types: `warning`, `danger`, `info`. |
+| [x] | **TTableComponent** | [TTableComponent.vue](file:///home/lantum/Desktop/Projects/webui/components/TTableComponent.vue) | Generic data table with sticky header/footer, inline edit/delete/recurrent actions, income/expense/net totals tray, and paginator. |
+| [x] | **ContentCard** | [ContentCard.vue](file:///home/lantum/Desktop/Projects/webui/components/ContentCard.vue) | Generic entity list row. Dynamic Lucide icon, name, description, type badge, default badge, edit/delete actions. |
+| [x] | **ContentCardGrid** | [ContentCardGrid.vue](file:///home/lantum/Desktop/Projects/webui/components/ContentCardGrid.vue) | Responsive `auto-fill` grid for entity cards. Inline context menu (edit/delete) per card with outside-click handling. Supports dynamic `cardFields` rendering. |
+| [x] | **ContentTable** | [ContentTable.vue](file:///home/lantum/Desktop/Projects/webui/components/ContentTable.vue) | Generic entity tabular view with search, sortable columns, and per-row actions. |
+| [x] | **ContentListView** | [ContentListView.vue](file:///home/lantum/Desktop/Projects/webui/components/ContentListView.vue) | Master meta-component: wraps `ContentTable` + `ContentCardGrid` with `ViewToggle` switch, local search, and client-side pagination. |
+| [x] | **ContentSection** | [ContentSection.vue](file:///home/lantum/Desktop/Projects/webui/components/ContentSection.vue) | Page content region shell: header with title slot + primary CTA action slot + body area. |
+| [x] | **TTopCard** | [TTopCard.vue](file:///home/lantum/Desktop/Projects/webui/components/TTopCard.vue) | Branded page header hero card with SVG radial bloom decoration, breadcrumb nav, dynamic icon resolved from `pageName`, info button, action slot, and primary CTA via `TButton`. |
+| [x] | **TDashboardTopCard** | [TDashboardTopCard.vue](file:///home/lantum/Desktop/Projects/webui/components/TDashboardTopCard.vue) | Dashboard-scoped KPI hero card variant with trend delta indicator. |
+| [x] | **TTransactionCard** | [TTransactionCard.vue](file:///home/lantum/Desktop/Projects/webui/components/TTransactionCard.vue) | Mobile-friendly card row for a single transaction entry (amount, party, category, type badge). |
+| [x] | **TTransactionSubCard** | [TTransactionSubCard.vue](file:///home/lantum/Desktop/Projects/webui/components/TTransactionSubCard.vue) | Sub-item card for grouped or nested transaction entries. |
+| [x] | **SparkLine** | [reports/SparkLine.vue](file:///home/lantum/Desktop/Projects/webui/components/reports/SparkLine.vue) | Pure SVG mini-chart. Gradient area fill, polyline path, terminal point dot. Takes `values[]` array + `color`. Zero chart library dependency. |
+| [x] | **KpiCard** | [reports/KpiCard.vue](file:///home/lantum/Desktop/Projects/webui/components/reports/KpiCard.vue) | Label + large display-value card. `is-positive` / `is-negative` value colour modifier classes. |
+| [x] | **PeriodControl** | [reports/PeriodControl.vue](file:///home/lantum/Desktop/Projects/webui/components/reports/PeriodControl.vue) | Period chip selector (predefined + custom date-range popover with transitions), compare toggle, and recap action CTA. |
+| [x] | **ReportsTabs** | [reports/ReportsTabs.vue](file:///home/lantum/Desktop/Projects/webui/components/reports/ReportsTabs.vue) | Tab navigation bar specific to the reports section pages. |
+| [x] | **IconPicker** | [IconPicker.vue](file:///home/lantum/Desktop/Projects/webui/components/IconPicker.vue) | Searchable Lucide icon grid popover for selecting and binding an icon name string value. |
+| [x] | **StatsFilterModal** | [StatsFilterModal.vue](file:///home/lantum/Desktop/Projects/webui/components/StatsFilterModal.vue) | Modal overlay for filtering statistics by date range, wallets, and categories. |
+| [x] | **NotificationBell** | [NotificationBell.vue](file:///home/lantum/Desktop/Projects/webui/components/NotificationBell.vue) | Bell icon + unread badge counter with dropdown notification list. Fetches from `notificationsApi` on open, supports mark-as-read and mark-all-read. |
+| [x] | **NotificationsContainer** | [NotificationsContainer.vue](file:///home/lantum/Desktop/Projects/webui/components/NotificationsContainer.vue) | Toast/banner notification display container and notification queue manager. |
+| [x] | **DescriptorRenderer** | [extensions/DescriptorRenderer.vue](file:///home/lantum/Desktop/Projects/webui/components/extensions/DescriptorRenderer.vue) | Polymorphic extension renderer mapping slot contribution descriptors to dynamic component trees. |
+| [x] | **auth/AuthCarousel** | [auth/AuthCarousel.vue](file:///home/lantum/Desktop/Projects/webui/components/auth/AuthCarousel.vue) | Auto-advancing image/text carousel for the auth page marketing panel. |
+| [x] | **auth/AuthSocialLogin** | [auth/AuthSocialLogin.vue](file:///home/lantum/Desktop/Projects/webui/components/auth/AuthSocialLogin.vue) | Renders OAuth provider buttons (Google etc.) for social login flows. |
+| [x] | **DailyBarChart** | [reports/charts/DailyBarChart.vue](file:///home/lantum/Desktop/Projects/webui/components/reports/charts/DailyBarChart.vue) | Daily cashflow bar chart visualisation. |
+| [x] | **CumulativeNetArea** | [reports/charts/CumulativeNetArea.vue](file:///home/lantum/Desktop/Projects/webui/components/reports/charts/CumulativeNetArea.vue) | Cumulative net worth area chart over time. |
+| [x] | **CashflowLineChart** | [reports/charts/CashflowLineChart.vue](file:///home/lantum/Desktop/Projects/webui/components/reports/charts/CashflowLineChart.vue) | Income vs expense cashflow trend line chart. |
+| [x] | **CategoryDonut** | [reports/charts/CategoryDonut.vue](file:///home/lantum/Desktop/Projects/webui/components/reports/charts/CategoryDonut.vue) | Donut/pie chart for category spending breakdown. |
+
+---
+
+## ▸ Layer 3: Domain / Feature Components
+
+> Components tightly coupled to product entities, API services, and application data models. Carry business logic, data fetching, mutations, or domain-specific validation. These are the highest-level reusable components before full page assembly.
+
+### 3.1 Transaction Domain
+| Status | Component | File | Description |
+| :---: | :--- | :--- | :--- |
+| [ ] | **TransactionForm** | [TransactionForm.vue](file:///home/lantum/Desktop/Projects/webui/components/TransactionForm.vue) | Full transaction entry form: amount, date, category, party, wallet, notes, recurrence. |
+| [ ] | **TransactionFormContainer** | [TransactionFormContainer.vue](file:///home/lantum/Desktop/Projects/webui/components/TransactionFormContainer.vue) | State wrapper managing transaction form submit, validation, API mutation. |
+| [ ] | **TransactionFormSection** | [TransactionFormSection.vue](file:///home/lantum/Desktop/Projects/webui/components/TransactionFormSection.vue) | Section sub-layout within the transaction form. |
+| [ ] | **FormSection** | [FormSection.vue](file:///home/lantum/Desktop/Projects/webui/components/FormSection.vue) | Transaction type tab switcher (Expense / Income / Transfer) that mounts either `TransactionFormContainer` or `TransferFormContainer`. |
+| [ ] | **TransferForm** | [TransferForm.vue](file:///home/lantum/Desktop/Projects/webui/components/TransferForm.vue) | Inter-wallet transfer entry form (from wallet, to wallet, amount, date). |
+| [ ] | **TransferFormContainer** | [TransferFormContainer.vue](file:///home/lantum/Desktop/Projects/webui/components/TransferFormContainer.vue) | State wrapper managing transfer submit and API mutation. |
+| [ ] | **TransactionsContentSection** | [transactions/TransactionsContentSection.vue](file:///home/lantum/Desktop/Projects/webui/components/transactions/TransactionsContentSection.vue) | Full transactions page layout orchestrating table/card view, filters, search, and pagination. |
+| [ ] | **TransactionsSpreadsheet** | [transactions/TransactionsSpreadsheet.vue](file:///home/lantum/Desktop/Projects/webui/components/transactions/TransactionsSpreadsheet.vue) | Inline-editable spreadsheet view of transactions. |
+| [ ] | **TTransactionsCardList** | [transactions/TTransactionsCardList.vue](file:///home/lantum/Desktop/Projects/webui/components/transactions/TTransactionsCardList.vue) | Mobile card list rendering of paginated transaction entries. |
+| [ ] | **TransactionFilters** | [transactions/TransactionFilters.vue](file:///home/lantum/Desktop/Projects/webui/components/transactions/TransactionFilters.vue) | Slide-in filter panel: date range, type, category, wallet, party, amount range. |
+
+### 3.2 Wallet Domain
+| Status | Component | File | Description |
+| :---: | :--- | :--- | :--- |
+| [ ] | **WalletCard** | [WalletCard.vue](file:///home/lantum/Desktop/Projects/webui/components/WalletCard.vue) | Wallet summary card with balance, currency, type, and actions. |
+| [ ] | **WalletListCard** | [WalletListCard.vue](file:///home/lantum/Desktop/Projects/webui/components/WalletListCard.vue) | Compact horizontal wallet row for list views. |
+| [ ] | **WalletForm** | [WalletForm.vue](file:///home/lantum/Desktop/Projects/webui/components/WalletForm.vue) | Wallet create/edit form: name, currency, type, opening balance, icon. |
+| [ ] | **WalletDetailPanel** | [wallets/WalletDetailPanel.vue](file:///home/lantum/Desktop/Projects/webui/components/wallets/WalletDetailPanel.vue) | Slide-out or full detail panel for a single wallet with balance history. |
+| [ ] | **WalletsStatsStrip** | [wallets/WalletsStatsStrip.vue](file:///home/lantum/Desktop/Projects/webui/components/wallets/WalletsStatsStrip.vue) | Horizontal summary strip of aggregate wallet stats (total balance, count, currencies). |
+
+### 3.3 Budget Domain
+| Status | Component | File | Description |
+| :---: | :--- | :--- | :--- |
+| [ ] | **BudgetCard** | [budgets/BudgetCard.vue](file:///home/lantum/Desktop/Projects/webui/components/budgets/BudgetCard.vue) | Budget card with progress bar, status chip, period, category/wallet scope pills, and edit/delete. Links to budget detail page. |
+| [ ] | **BudgetForm** | [budgets/BudgetForm.vue](file:///home/lantum/Desktop/Projects/webui/components/budgets/BudgetForm.vue) | Budget create/edit form: name, amount, period type, target categories/wallets. |
+
+### 3.4 Category Domain
+| Status | Component | File | Description |
+| :---: | :--- | :--- | :--- |
+| [ ] | **CategoryForm** | [categories/CategoryForm.vue](file:///home/lantum/Desktop/Projects/webui/components/categories/CategoryForm.vue) | Category create/edit form: name, type (income/expense), icon, colour, parent group. |
+
+### 3.5 Party Domain
+| Status | Component | File | Description |
+| :---: | :--- | :--- | :--- |
+| [ ] | **PartiesForm** | [PartiesForm.vue](file:///home/lantum/Desktop/Projects/webui/components/PartiesForm.vue) | Party create/edit form: name, email, phone, notes. |
+| [ ] | **PartyCard** | [PartyCard.vue](file:///home/lantum/Desktop/Projects/webui/components/PartyCard.vue) | Party summary card with contact info and action buttons. |
+| [ ] | **PartyCardList** | [PartyCardList.vue](file:///home/lantum/Desktop/Projects/webui/components/PartyCardList.vue) | Grid/list of `PartyCard` items. |
+| [ ] | **PartyDetailPanel** | [parties/PartyDetailPanel.vue](file:///home/lantum/Desktop/Projects/webui/components/parties/PartyDetailPanel.vue) | Full party detail panel with transaction history and contact details. |
+| [ ] | **PartiesStatsStrip** | [parties/PartiesStatsStrip.vue](file:///home/lantum/Desktop/Projects/webui/components/parties/PartiesStatsStrip.vue) | Aggregate party stats strip (total parties, top payees, top payers). |
+
+### 3.6 Group, Holdings & Reminders Domain
+| Status | Component | File | Description |
+| :---: | :--- | :--- | :--- |
+| [ ] | **GroupForm** | [groups/GroupForm.vue](file:///home/lantum/Desktop/Projects/webui/components/groups/GroupForm.vue) | Group create/edit form. |
+| [ ] | **HoldingForm** | [holdings/HoldingForm.vue](file:///home/lantum/Desktop/Projects/webui/components/holdings/HoldingForm.vue) | Investment holding create/edit form. |
+| [ ] | **ReminderForm** | [reminders/ReminderForm.vue](file:///home/lantum/Desktop/Projects/webui/components/reminders/ReminderForm.vue) | Reminder create/edit form: title, due date, frequency, linked transaction. |
+| [ ] | **RecurringModal** | [modals/RecurringModal.vue](file:///home/lantum/Desktop/Projects/webui/components/modals/RecurringModal.vue) | Modal for managing transaction recurrence rules (frequency, end date). |
+| [ ] | **LearningModal** | [modals/LearningModal.vue](file:///home/lantum/Desktop/Projects/webui/components/modals/LearningModal.vue) | Educational contextual modal explaining financial concepts in-app. |
+
+### 3.7 Imports Domain
+| Status | Component | File | Description |
+| :---: | :--- | :--- | :--- |
+| [ ] | **ImportUpload** | [imports/ImportUpload.vue](file:///home/lantum/Desktop/Projects/webui/components/imports/ImportUpload.vue) | Hero upload section with animated document type carousel, drag-and-drop zone, and file type selector. |
+| [ ] | **ImportAnalyzing** | [imports/ImportAnalyzing.vue](file:///home/lantum/Desktop/Projects/webui/components/imports/ImportAnalyzing.vue) | AI analysis in-progress state with streaming progress indicators. |
+| [ ] | **ImportConfirmDialog** | [imports/ImportConfirmDialog.vue](file:///home/lantum/Desktop/Projects/webui/components/imports/ImportConfirmDialog.vue) | Confirmation step before committing parsed import data. |
+| [ ] | **ImportSessionsList** | [imports/ImportSessionsList.vue](file:///home/lantum/Desktop/Projects/webui/components/imports/ImportSessionsList.vue) | List of past import sessions with status badges and re-open actions. |
+| [ ] | **SuggestionReviewTable** | [imports/SuggestionReviewTable.vue](file:///home/lantum/Desktop/Projects/webui/components/imports/SuggestionReviewTable.vue) | Editable review table of AI-parsed transaction suggestions before acceptance. |
+
+### 3.8 Dashboard Domain
+| Status | Component | File | Description |
+| :---: | :--- | :--- | :--- |
+| [ ] | **DashboardKPIs** | [dashboard/DashboardKPIs.vue](file:///home/lantum/Desktop/Projects/webui/components/dashboard/DashboardKPIs.vue) | Row of KPI metric cards (total income, expenses, net, savings rate). |
+| [ ] | **RecentTransactions** | [dashboard/RecentTransactions.vue](file:///home/lantum/Desktop/Projects/webui/components/dashboard/RecentTransactions.vue) | Latest transactions widget with mini list and "view all" link. |
+| [ ] | **CategoryBreakdown** | [dashboard/CategoryBreakdown.vue](file:///home/lantum/Desktop/Projects/webui/components/dashboard/CategoryBreakdown.vue) | Donut chart + ranked list showing spending by category for the period. |
+| [ ] | **QuickInsights** | [dashboard/QuickInsights.vue](file:///home/lantum/Desktop/Projects/webui/components/dashboard/QuickInsights.vue) | AI-generated summary insight cards for the current period. |
+| [ ] | **DashboardWalletSelector** | [dashboard/DashboardWalletSelector.vue](file:///home/lantum/Desktop/Projects/webui/components/dashboard/DashboardWalletSelector.vue) | Wallet filter chip strip for scoping dashboard data to specific wallets. |
+| [ ] | **DashboardQuickActionModal** | [dashboard/DashboardQuickActionModal.vue](file:///home/lantum/Desktop/Projects/webui/components/dashboard/DashboardQuickActionModal.vue) | Quick-action floating modal for add transaction / transfer shortcut. |
+| [ ] | **DashboardAgentHero** | [dashboard/DashboardAgentHero.vue](file:///home/lantum/Desktop/Projects/webui/components/dashboard/DashboardAgentHero.vue) | AI agent hero card with greeting, financial snapshot, and launch assistant CTA. |
+
+### 3.9 Reports Domain
+| Status | Component | File | Description |
+| :---: | :--- | :--- | :--- |
+| [ ] | **CashflowHero** | [reports/CashflowHero.vue](file:///home/lantum/Desktop/Projects/webui/components/reports/CashflowHero.vue) | Period income/expense/net hero summary with trend comparison. |
+| [ ] | **MonthInReview** | [reports/MonthInReview.vue](file:///home/lantum/Desktop/Projects/webui/components/reports/MonthInReview.vue) | Monthly recap modal/panel with AI highlights, top categories, and cashflow summary. |
+| [ ] | **CategoryRanking** | [reports/CategoryRanking.vue](file:///home/lantum/Desktop/Projects/webui/components/reports/CategoryRanking.vue) | Ranked bar list of categories by spend amount. |
+| [ ] | **CategoryDrillModal** | [reports/CategoryDrillModal.vue](file:///home/lantum/Desktop/Projects/webui/components/reports/CategoryDrillModal.vue) | Drill-down modal for a single category's transactions and trend. |
+| [ ] | **FinancialRatios** | [reports/FinancialRatios.vue](file:///home/lantum/Desktop/Projects/webui/components/reports/FinancialRatios.vue) | Computed ratio cards (savings rate, expense ratio, etc.). |
+| [ ] | **NotableStrip** | [reports/NotableStrip.vue](file:///home/lantum/Desktop/Projects/webui/components/reports/NotableStrip.vue) | Horizontal strip of notable outlier transactions for the period. |
+| [ ] | **CalendarHeatmap** | [reports/CalendarHeatmap.vue](file:///home/lantum/Desktop/Projects/webui/components/reports/CalendarHeatmap.vue) | GitHub-style calendar heatmap of daily spending intensity. |
+| [ ] | **SankeyFlow** | [reports/SankeyFlow.vue](file:///home/lantum/Desktop/Projects/webui/components/reports/SankeyFlow.vue) | Sankey flow diagram of income sources → expense categories. |
+| [ ] | **ReportsEmpty** | [reports/ReportsEmpty.vue](file:///home/lantum/Desktop/Projects/webui/components/reports/ReportsEmpty.vue) | Reports-specific empty state with onboarding prompt. |
+| [ ] | **CategoriesTab** | [reports/CategoriesTab.vue](file:///home/lantum/Desktop/Projects/webui/components/reports/CategoriesTab.vue) | Reports tab: category breakdown donut + ranking table. |
+| [ ] | **ChartsTab** | [reports/ChartsTab.vue](file:///home/lantum/Desktop/Projects/webui/components/reports/ChartsTab.vue) | Reports tab: cashflow line chart + cumulative area chart. |
+| [ ] | **CalendarTab** | [reports/CalendarTab.vue](file:///home/lantum/Desktop/Projects/webui/components/reports/CalendarTab.vue) | Reports tab: calendar heatmap + period totals. |
+| [ ] | **FlowTab** | [reports/FlowTab.vue](file:///home/lantum/Desktop/Projects/webui/components/reports/FlowTab.vue) | Reports tab: Sankey flow diagram view. |
+
+### 3.10 Settings Domain
+| Status | Component | File | Description |
+| :---: | :--- | :--- | :--- |
+| [ ] | **SettingsAccount** | [settings/SettingsAccount.vue](file:///home/lantum/Desktop/Projects/webui/components/settings/SettingsAccount.vue) | User profile edit section: first/last name, username, email, password change trigger. |
+| [ ] | **SettingsDisplay** | [settings/SettingsDisplay.vue](file:///home/lantum/Desktop/Projects/webui/components/settings/SettingsDisplay.vue) | Display preferences: theme, language, currency, date format. |
+| [ ] | **SettingsGeneral** | [settings/SettingsGeneral.vue](file:///home/lantum/Desktop/Projects/webui/components/settings/SettingsGeneral.vue) | General application configuration settings panel. |
+| [ ] | **SettingsNotifications** | [settings/SettingsNotifications.vue](file:///home/lantum/Desktop/Projects/webui/components/settings/SettingsNotifications.vue) | Notification preferences toggle panel (email, push, reminders). |
+| [ ] | **SettingsWallets** | [settings/SettingsWallets.vue](file:///home/lantum/Desktop/Projects/webui/components/settings/SettingsWallets.vue) | Wallet management section within settings. |
+| [ ] | **SettingsConnections** | [settings/SettingsConnections.vue](file:///home/lantum/Desktop/Projects/webui/components/settings/SettingsConnections.vue) | Third-party integrations and connected services management. |
+| [ ] | **PasswordModal** | [settings/PasswordModal.vue](file:///home/lantum/Desktop/Projects/webui/components/settings/PasswordModal.vue) | Modal for secure password change with current/new/confirm fields. |
+
+### 3.11 AI / Chat Domain
+| Status | Component | File | Description |
+| :---: | :--- | :--- | :--- |
+| [ ] | **ChatExperience** | [ai/ChatExperience.vue](file:///home/lantum/Desktop/Projects/webui/components/ai/ChatExperience.vue) | Full AI chat experience shell composing sidebar, message list, composer, and canvas panel. |
+| [ ] | **ChatComposer** | [ai/ChatComposer.vue](file:///home/lantum/Desktop/Projects/webui/components/ai/ChatComposer.vue) | Message input bar with attach, send, and slash-command detection. |
+| [ ] | **ChatMessageList** | [ai/ChatMessageList.vue](file:///home/lantum/Desktop/Projects/webui/components/ai/ChatMessageList.vue) | Scrollable message thread with user/assistant message rendering. |
+| [ ] | **ChatSidebar** | [ai/ChatSidebar.vue](file:///home/lantum/Desktop/Projects/webui/components/ai/ChatSidebar.vue) | Conversation history sidebar with new chat, session list, and rename/delete. |
+| [ ] | **ChatResultRenderer** | [ai/ChatResultRenderer.vue](file:///home/lantum/Desktop/Projects/webui/components/ai/ChatResultRenderer.vue) | Routes AI result payloads to the appropriate block renderer component. |
+| [ ] | **CanvasPanel** | [ai/CanvasPanel.vue](file:///home/lantum/Desktop/Projects/webui/components/ai/CanvasPanel.vue) | Expandable side canvas panel for AI-generated chart/table artifacts. |
+| [ ] | **ChatLandingInsights** | [ai/ChatLandingInsights.vue](file:///home/lantum/Desktop/Projects/webui/components/ai/ChatLandingInsights.vue) | Landing state insight prompt cards shown before first message. |
+| [ ] | **ChatEmptyState** | [ai/ChatEmptyState.vue](file:///home/lantum/Desktop/Projects/webui/components/ai/ChatEmptyState.vue) | Empty chat session landing with suggested prompts. |
+| [ ] | **ChatProgressSteps** | [ai/ChatProgressSteps.vue](file:///home/lantum/Desktop/Projects/webui/components/ai/ChatProgressSteps.vue) | Animated multi-step progress indicator for long-running AI operations. |
+| [ ] | **DiscussionDropdown** | [ai/DiscussionDropdown.vue](file:///home/lantum/Desktop/Projects/webui/components/ai/DiscussionDropdown.vue) | Conversation session selection and management dropdown. |
+| [ ] | **ChatMarkdownBlock** | [ai/blocks/ChatMarkdownBlock.vue](file:///home/lantum/Desktop/Projects/webui/components/ai/blocks/ChatMarkdownBlock.vue) | Renders AI markdown response safely via `useMarkdown`. |
+| [ ] | **ChatChartBlock** | [ai/blocks/ChatChartBlock.vue](file:///home/lantum/Desktop/Projects/webui/components/ai/blocks/ChatChartBlock.vue) | Renders AI-generated chart data inline in chat. |
+| [ ] | **ChatTableBlock** | [ai/blocks/ChatTableBlock.vue](file:///home/lantum/Desktop/Projects/webui/components/ai/blocks/ChatTableBlock.vue) | Renders tabular AI result data inline in chat. |
+| [ ] | **ChatKpiBlock** | [ai/blocks/ChatKpiBlock.vue](file:///home/lantum/Desktop/Projects/webui/components/ai/blocks/ChatKpiBlock.vue) | Renders KPI metrics returned by AI inline in chat. |
+| [ ] | **ChatListBlock** | [ai/blocks/ChatListBlock.vue](file:///home/lantum/Desktop/Projects/webui/components/ai/blocks/ChatListBlock.vue) | Renders AI list responses inline in chat. |
+| [ ] | **ChatTimelineBlock** | [ai/blocks/ChatTimelineBlock.vue](file:///home/lantum/Desktop/Projects/webui/components/ai/blocks/ChatTimelineBlock.vue) | Renders timeline/event-sequence AI results inline. |
+| [ ] | **ChatComparisonBlock** | [ai/blocks/ChatComparisonBlock.vue](file:///home/lantum/Desktop/Projects/webui/components/ai/blocks/ChatComparisonBlock.vue) | Side-by-side comparison result block from AI. |
+| [ ] | **ChatCalloutBlock** | [ai/blocks/ChatCalloutBlock.vue](file:///home/lantum/Desktop/Projects/webui/components/ai/blocks/ChatCalloutBlock.vue) | Styled callout/alert block from AI (tip, warning, info). |
+| [ ] | **ChatProgressBlock** | [ai/blocks/ChatProgressBlock.vue](file:///home/lantum/Desktop/Projects/webui/components/ai/blocks/ChatProgressBlock.vue) | Progress steps block shown as part of AI structured response. |
+| [ ] | **ChatQuestionBlock** | [ai/blocks/ChatQuestionBlock.vue](file:///home/lantum/Desktop/Projects/webui/components/ai/blocks/ChatQuestionBlock.vue) | AI clarification question block with interactive answer options. |
+| [ ] | **ChatProposedActionBlock** | [ai/blocks/ChatProposedActionBlock.vue](file:///home/lantum/Desktop/Projects/webui/components/ai/blocks/ChatProposedActionBlock.vue) | AI-proposed action with accept/reject confirmation UI. |
+| [ ] | **ChatQuickActionsBlock** | [ai/blocks/ChatQuickActionsBlock.vue](file:///home/lantum/Desktop/Projects/webui/components/ai/blocks/ChatQuickActionsBlock.vue) | Pill-style quick action suggestion chips from AI. |
+| [ ] | **ChatImportReviewBlock** | [ai/blocks/ChatImportReviewBlock.vue](file:///home/lantum/Desktop/Projects/webui/components/ai/blocks/ChatImportReviewBlock.vue) | AI import review result rendered inline with accept/edit flow. |
+| [ ] | **ChatCanvasBlock** | [ai/blocks/ChatCanvasBlock.vue](file:///home/lantum/Desktop/Projects/webui/components/ai/blocks/ChatCanvasBlock.vue) | Triggers canvas panel with AI-generated visual artifact payload. |
+
+### 3.12 Onboarding, Auth & Admin Domain
+| Status | Component | File | Description |
+| :---: | :--- | :--- | :--- |
+| [ ] | **OnboardingWizard** | [onboarding/OnboardingWizard.vue](file:///home/lantum/Desktop/Projects/webui/components/onboarding/OnboardingWizard.vue) | Animated horizontal step carousel for new user setup flow. |
+| [ ] | **OnboardingEmptyState** | [onboarding/OnboardingEmptyState.vue](file:///home/lantum/Desktop/Projects/webui/components/onboarding/OnboardingEmptyState.vue) | Empty state with onboarding prompt for first-time users. |
+| [ ] | **DashboardOnboarding** | [onboarding/DashboardOnboarding.vue](file:///home/lantum/Desktop/Projects/webui/components/onboarding/DashboardOnboarding.vue) | Dashboard-embedded onboarding task checklist. |
+| [ ] | **LoginCard** | [LoginCard.vue](file:///home/lantum/Desktop/Projects/webui/components/LoginCard.vue) | Login form card: email, password, social login section, forgot password. |
+| [ ] | **RegisterCard** | [RegisterCard.vue](file:///home/lantum/Desktop/Projects/webui/components/RegisterCard.vue) | Registration form card: name, email, password, confirm password. |
+| [ ] | **FinancialPositionView** | [financial-position/FinancialPositionView.vue](file:///home/lantum/Desktop/Projects/webui/components/financial-position/FinancialPositionView.vue) | Net worth / financial position summary with asset and liability breakdown. |
+| [ ] | **FinancialPositionDrill** | [financial-position/FinancialPositionDrill.vue](file:///home/lantum/Desktop/Projects/webui/components/financial-position/FinancialPositionDrill.vue) | Drill-down panel into a specific financial position category. |
+| [ ] | **UserDetail** | [admin/UserDetail.vue](file:///home/lantum/Desktop/Projects/webui/components/admin/UserDetail.vue) | Admin panel user profile viewer and account management actions. |
+| [ ] | **OutreachComposer** | [admin/OutreachComposer.vue](file:///home/lantum/Desktop/Projects/webui/components/admin/OutreachComposer.vue) | Admin tool for composing and sending user outreach messages. |
+| [ ] | **TipsSection** | [TipsSection.vue](file:///home/lantum/Desktop/Projects/webui/components/TipsSection.vue) | Contextual in-app tips and hints panel. |
+
+
+---
+
+## ▸ Layer 4: Layouts, Navigation & Pages
+
+> **Macro-level application structure**: This layer encompasses both the structural scaffolding (layouts, navigation chrome) and the routed page views themselves. It defines how the entire application is organized and accessed.
+>
+> - **4.A–4.C**: Layout shells and navigation components
+> - **4.D–4.Z**: Routed page views and their orchestration
+
+---
+
+### 4.A Navigation Components
+
+> Navigation chrome components used within layout shells. These are **composite components** (Layer 2 conceptually) but are documented here due to their structural role in the application frame.
+
+| Status | Component | File | Description |
+| :---: | :--- | :--- | :--- |
+| [ ] | **TNavbar** | [TNavbar.vue](file:///home/lantum/Desktop/Projects/webui/components/TNavbar.vue) | Top navigation bar (52px fixed). Contains: hamburger menu (mobile), add transaction button, language selector, theme selector, notification bell, info/learning button, and user avatar with dropdown. Responsive to mobile/tablet/desktop breakpoints. |
+| [ ] | **TSidebar** | [TSidebar.vue](file:///home/lantum/Desktop/Projects/webui/components/TSidebar.vue) | Main application sidebar navigation. Features: collapsible rail mode (desktop), mobile drawer with overlay, hierarchical nav items with sub-menus, extension slots, active route highlighting, branded logo header. Width: 300px expanded / 80px rail / 280px mobile. |
+
+---
+
+### 4.B Layout Shells
+
+> Framework-level layout components that wrap page content and define structural regions (header, sidebar, main content area, footer).
+
+| Status | Layout | File | Purpose & Structure |
+| :---: | :--- | :--- | :--- |
+| [ ] | **default** | [layouts/default.vue](file:///home/lantum/Desktop/Projects/webui/layouts/default.vue) | Minimal pass-through layout. Pure slot rendering with no chrome. Used for landing pages or custom full-viewport experiences. |
+| [ ] | **dashboard** | [layouts/dashboard.vue](file:///home/lantum/Desktop/Projects/webui/layouts/dashboard.vue) | Main authenticated application shell. Structure: `TSidebar` (left, responsive collapse) + `TNavbar` (top fixed) + main content area (with rounded card container) + `NotificationsContainer` + `LearningModal`. Viewport: 100vh with scroll-within-content-area pattern. Provides `learningModal` context injection for child components. |
+| [ ] | **auth** | [layouts/auth.vue](file:///home/lantum/Desktop/Projects/webui/layouts/auth.vue) | Authentication pages layout (login, register). Structure: full-viewport split-screen → marketing carousel (left, desktop only) + form slot (right, centered). Includes floating theme toggle button (top-right) and copyright footer. Background: decorative floating documents SVG with dark mode inversion. |
+| [ ] | **onboarding** | [layouts/onboarding.vue](file:///home/lantum/Desktop/Projects/webui/layouts/onboarding.vue) | First-time user setup wizard layout. Structure: centered card with radial gradient brand background, logo header, theme toggle (top-right), and wizard slot. Max-width: 800px. Responsive padding adjustments for mobile. |
+| [ ] | **admin** | [layouts/admin.vue](file:///home/lantum/Desktop/Projects/webui/layouts/admin.vue) | Administrative panel layout. Minimal shell: slot + `NotificationsContainer`. Background: `$bg-gray`. No sidebar or navbar; admin pages control their own structure. User authentication check on mount. |
+
+---
+
+### 4.C Layout Architecture & Behavior
+
+```
+┌─────────────────────────────────────────────────────────────────────┐
+│ Application Layout Hierarchy │
+├─────────────────────────────────────────────────────────────────────┤
+│ │
+│ ┌───────────────────────────────────────────────────────────┐ │
+│ │ dashboard.vue (main app shell) │ │
+│ │ ┌───────────┬───────────────────────────────────────────┐ │ │
+│ │ │ TSidebar │ TNavbar (fixed top, 52px) │ │ │
+│ │ │ (300/80px)│───────────────────────────────────────────│ │ │
+│ │ │ │ Main Content Area (rounded card) │ │ │
+│ │ │ Primary │ ┌─────────────────────────────────────┐ │ │ │
+│ │ │ Nav │ │ (route slot) │ │ │ │
+│ │ │ │ │ - Dashboard pages │ │ │ │
+│ │ │ - Home │ │ - Transactions │ │ │ │
+│ │ │ - Txns │ │ - Wallets │ │ │ │
+│ │ │ - Wallet │ │ - Budgets │ │ │ │
+│ │ │ - Budget │ │ - Reports │ │ │ │
+│ │ │ - Report │ │ - Settings │ │ │ │
+│ │ │ - AI │ └─────────────────────────────────────┘ │ │ │
+│ │ │ │ NotificationsContainer (toast/banner) │ │ │
+│ │ │ Footer │ LearningModal (contextual help) │ │ │
+│ │ │ - Prefs │ │ │ │
+│ │ │ - Help │ │ │ │
+│ │ └───────────┴───────────────────────────────────────────┘ │ │
+│ └───────────────────────────────────────────────────────────┘ │
+│ │
+│ ┌───────────────────────────────────────────────────────────┐ │
+│ │ auth.vue (authentication shell) │ │
+│ │ ┌─────────────────────┬─────────────────────────────────┐ │ │
+│ │ │ AuthCarousel │ Form Slot │ │ │
+│ │ │ (marketing content, │ ┌─────────────────────────────┐ │ │ │
+│ │ │ desktop only) │ │ LoginCard / RegisterCard │ │ │ │
+│ │ │ │ │ - Social login buttons │ │ │ │
+│ │ │ - Hero images │ │ - Email/password fields │ │ │ │
+│ │ │ - Feature bullets │ │ - Auth footer links │ │ │ │
+│ │ │ - Auto-rotating │ └─────────────────────────────┘ │ │ │
+│ │ └─────────────────────┴─────────────────────────────────┘ │ │
+│ │ ThemeToggleButton (top-right) │ │
+│ │ Copyright footer │ │
+│ └───────────────────────────────────────────────────────────┘ │
+│ │
+│ ┌───────────────────────────────────────────────────────────┐ │
+│ │ onboarding.vue (first-time setup) │ │
+│ │ ThemeToggleButton (top-right) │ │
+│ │ ┌─────────────────────────────────────────────────────┐ │ │
+│ │ │ Logo (centered) │ │ │
+│ │ │ ┌─────────────────────────────────────────────────┐ │ │ │
+│ │ │ │ OnboardingWizard (slot) │ │ │ │
+│ │ │ │ - Step 1: Welcome │ │ │ │
+│ │ │ │ - Step 2: Create first wallet │ │ │ │
+│ │ │ │ - Step 3: Set up categories │ │ │ │
+│ │ │ │ - Step 4: Complete │ │ │ │
+│ │ │ └─────────────────────────────────────────────────┘ │ │ │
+│ │ └─────────────────────────────────────────────────────┘ │ │
+│ │ (radial gradient brand background) │ │
+│ └───────────────────────────────────────────────────────────┘ │
+│ │
+│ ┌───────────────────────────────────────────────────────────┐ │
+│ │ admin.vue (administrative panel) │ │
+│ │ ┌─────────────────────────────────────────────────────┐ │ │
+│ │ │ Admin pages control their own structure │ │ │
+│ │ │ (no enforced navigation chrome) │ │ │
+│ │ │ - User management │ │ │
+│ │ │ - System analytics │ │ │
+│ │ │ - Outreach composer │ │ │
+│ │ └─────────────────────────────────────────────────────┘ │ │
+│ │ NotificationsContainer │ │
+│ └───────────────────────────────────────────────────────────┘ │
+│ │
+│ ┌───────────────────────────────────────────────────────────┐ │
+│ │ default.vue (pass-through) │ │
+│ │ ┌─────────────────────────────────────────────────────┐ │ │
+│ │ │ (pure pass-through, no chrome) │ │ │
+│ │ └─────────────────────────────────────────────────────┘ │ │
+│ └───────────────────────────────────────────────────────────┘ │
+└─────────────────────────────────────────────────────────────────────┘
+```
+
+---
+
+### 4.D Key Layout Characteristics
+
+#### **Responsive Breakpoints Usage**
+All layouts respect the global breakpoint scale:
+- `$breakpoint-sm` (640px) — Mobile phone landscape
+- `$breakpoint-md` (768px) — Tablet portrait (sidebar collapses to mobile drawer)
+- `$breakpoint-lg` (1024px) — Desktop (auth carousel visible)
+- `$breakpoint-xl` (1280px) — Wide desktop
+- `$breakpoint-2xl` (1536px) — Ultra-wide
+
+#### **Sidebar Behavior (dashboard layout)**
+- **Desktop (≥768px)**: Persistent sidebar, toggles between 300px expanded ↔ 80px rail
+- **Mobile (<768px)**: Drawer overlay mode, hidden by default, hamburger menu trigger in navbar
+- State managed via `useSidebar()` composable with localStorage persistence
+
+#### **Content Scroll Patterns**
+- **dashboard**: Fixed navbar + sidebar, scroll contained within `.dashboard-content` card
+- **auth**: Full-page scroll (marketing content may exceed viewport)
+- **onboarding**: Centered card, scroll within wizard steps if needed
+- **admin**: Full-page scroll, no viewport constraints
+- **default**: No enforced scroll structure
+
+#### **Theme & Dark Mode Support**
+All layouts support seamless theme switching via:
+- Global CSS custom property updates (`--color-*` tokens)
+- `useTheme()` composable state management
+- `ThemeToggleButton` or `ThemeSelector` widget placement
+- Dark mode adjustments for background SVGs and overlays (e.g., auth layout inverts decorative elements)
+
+#### **Global Context Providers**
+- **dashboard.vue** provides `learningModal` injection for triggering contextual help modals
+- All layouts (except default) fetch and verify user authentication on mount
+- **dashboard** and **admin** render `NotificationsContainer` for toast/banner notifications
+
+---
+
+### 4.E Migration Notes for Layouts
+
+When modernizing layouts:
+
+1. **Slot API Standardization**: Ensure all layouts expose documented, named slots for extensibility (header, sidebar-footer, content-actions, etc.)
+2. **Layout Transition Animations**: Implement view transitions API support for smoother route changes within layouts
+3. **Accessibility Landmarks**: Add ARIA `role` attributes (`banner`, `navigation`, `main`, `complementary`, `contentinfo`) to layout regions
+4. **Responsive Container Queries**: Migrate from viewport-based media queries to container queries for sidebar/content areas where appropriate
+5. **Skeleton UI States**: Add built-in loading skeletons at layout level for initial page hydration
+6. **Persistent Layout State**: Ensure sidebar collapse state, theme, and language preferences sync across tabs via `localStorage` + `BroadcastChannel`
+
+---
+
+### 4.F Pages & Routes (View Entrypoints)
+
+> Top-level routed views combining layouts, domain components, and page-level state management. These are the user-facing screens accessed via URLs.
+
+---
+
+#### 4.F.1 Public & Landing Routes
+
+| Status | Route | File | Layout | Middleware | Description |
+| :---: | :--- | :--- | :--- | :--- | :--- |
+| [ ] | `/` | [index.vue](file:///home/lantum/Desktop/Projects/webui/pages/index.vue) | default | none | **Landing redirect**: Authenticated users → resolved landing path (home/dashboard); unauthenticated → `/login`. Shows loading spinner with logo during redirect. |
+| [ ] | `/login` | [login.vue](file:///home/lantum/Desktop/Projects/webui/pages/login.vue) | auth | guest | **Login page**: Email/password form, social OAuth buttons (Google etc.), remember me checkbox, forgot password link, redirect to register. Form validation, loading states, error handling. |
+| [ ] | `/register` | [register.vue](file:///home/lantum/Desktop/Projects/webui/pages/register.vue) | auth | guest | **Registration page**: Contact, first name, last name, password fields. Email verification code input. Social OAuth option. Password strength validation. Success redirects to onboarding. |
+| [ ] | `/auth/[driver]/callback` | [auth/[driver]/callback.vue](file:///home/lantum/Desktop/Projects/webui/pages/auth/[driver]/callback.vue) | default | none | **OAuth callback handler**: Processes OAuth provider callback (Google, etc.). Exchanges code for tokens, creates session, redirects to dashboard or shows error. |
+
+---
+
+#### 4.F.B Onboarding Flow
+
+| Status | Route | File | Layout | Middleware | Description |
+| :---: | :--- | :--- | :--- | :--- | :--- |
+| [ ] | `/onboarding` | [onboarding.vue](file:///home/lantum/Desktop/Projects/webui/pages/onboarding.vue) | onboarding | auth | **Onboarding wizard**: Multi-step setup flow (language, currency, first wallet, categories). Progress bar indicator. Step validation. Completion redirects to dashboard. Skippable for quick start. |
+
+---
+
+#### 4.F.C Dashboard & Home
+
+| Status | Route | File | Layout | Middleware | Description |
+| :---: | :--- | :--- | :--- | :--- | :--- |
+| [ ] | `/home` | [home.vue](file:///home/lantum/Desktop/Projects/webui/pages/home.vue) | dashboard | auth | **AI-first landing page**: Full-viewport `ChatExperience` in landing mode. Personalized greeting, financial snapshot, suggested prompts. Alternative entry point to `/dashboard`. |
+| [ ] | `/dashboard` | [dashboard/index.vue](file:///home/lantum/Desktop/Projects/webui/pages/dashboard/index.vue) | dashboard | auth | **Main dashboard**: `DashboardAgentHero`, conditional onboarding wizard, `TDashboardTopCard` with filters, `DashboardKPIs`, `CategoryBreakdown`, `RecentTransactions`, `QuickInsights`. Empty state for first-time users. Data refresh on mount. |
+
+---
+
+#### 4.F.D Transaction Management
+
+| Status | Route | File | Layout | Middleware | Description |
+| :---: | :--- | :--- | :--- | :--- | :--- |
+| [ ] | `/transactions` | [transactions/index.vue](file:///home/lantum/Desktop/Projects/webui/pages/transactions/index.vue) | dashboard | auth | **Transactions list page**: Renders `TransactionsContentSection` orchestrating table/card view toggle, filters panel, search, pagination, bulk actions. View mode persistence. |
+| [ ] | `/transactions/new` | [transactions/new.vue](file:///home/lantum/Desktop/Projects/webui/pages/transactions/new.vue) | dashboard | auth | **Create transaction page**: Full-page `TransactionFormSection` with type tabs (Expense/Income/Transfer). Form submission handler with API error handling. Success redirects to `/transactions`. |
+| [ ] | `/transactions/edit/[id]` | [transactions/edit/[id].vue](file:///home/lantum/Desktop/Projects/webui/pages/transactions/edit/[id].vue) | dashboard | auth | **Edit transaction page**: Fetches existing transaction by ID, pre-populates `TransactionFormSection`. Update handler. Delete action. Cancel returns to `/transactions`. |
+
+---
+
+#### 4.F.E Wallet Management
+
+| Status | Route | File | Layout | Middleware | Description |
+| :---: | :--- | :--- | :--- | :--- | :--- |
+| [ ] | `/wallets` | [wallets.vue](file:///home/lantum/Desktop/Projects/webui/pages/wallets.vue) | dashboard | auth | **Wallets page**: `ContentTopCard` with add button, `WalletsStatsStrip` aggregate metrics, inline `WalletForm` (create/edit), `ContentListView` with table/card toggle. Empty state onboarding. Sidebar tips section. |
+
+---
+
+#### 4.F.F Budget Management
+
+| Status | Route | File | Layout | Middleware | Description |
+| :---: | :--- | :--- | :--- | :--- | :--- |
+| [ ] | `/budgets` | [budgets/index.vue](file:///home/lantum/Desktop/Projects/webui/pages/budgets/index.vue) | dashboard | auth | **Budgets list page**: `ContentTopCard` with add button, inline `BudgetForm` with educational sidebar ("How budgets work"), grid of `BudgetCard` components showing progress bars, status chips, period labels. Empty state. |
+| [ ] | `/budgets/[id]` | [budgets/[id].vue](file:///home/lantum/Desktop/Projects/webui/pages/budgets/[id].vue) | dashboard | auth | **Budget detail page**: Back navigation to `/budgets`, budget summary card with status, progress bar, period, target scope pills. Transaction breakdown table filtered by budget criteria. Sparkline trends. Edit/delete actions. |
+
+---
+
+#### 4.F.G Category & Group Management
+
+| Status | Route | File | Layout | Middleware | Description |
+| :---: | :--- | :--- | :--- | :--- | :--- |
+| [ ] | `/categories` | [categories/index.vue](file:///home/lantum/Desktop/Projects/webui/pages/categories/index.vue) | dashboard | auth | **Categories page**: `ContentTopCard`, inline `CategoryForm` (name, type, icon, color, parent group), `ContentListView` with income/expense filtering. Grouped display by parent. Empty state. Tips sidebar. |
+| [ ] | `/groups` | [groups.vue](file:///home/lantum/Desktop/Projects/webui/pages/groups.vue) | dashboard | auth | **Groups page**: `ContentTopCard`, inline `GroupForm`, `ContentListView` for category groups. Hierarchical category organization. Empty state. Tips sidebar. |
+
+---
+
+#### 4.F.H Party Management
+
+| Status | Route | File | Layout | Middleware | Description |
+| :---: | :--- | :--- | :--- | :--- | :--- |
+| [ ] | `/parties` | [parties.vue](file:///home/lantum/Desktop/Projects/webui/pages/parties.vue) | dashboard | auth | **Parties page** (payees/payers): `ContentTopCard`, `PartiesStatsStrip` (top payees/payers), inline `PartiesForm` (name, email, phone, notes), `ContentListView` with search. Transaction history per party. Empty state. Tips sidebar. |
+
+---
+
+#### 4.F.I Reports & Analytics
+
+| Status | Route | File | Layout | Middleware | Description |
+| :---: | :--- | :--- | :--- | :--- | :--- |
+| [ ] | `/reports` | [reports.vue](file:///home/lantum/Desktop/Projects/webui/pages/reports.vue) | dashboard | auth | **Reports & analytics hub**: `ReportsTabs` (Charts, Categories, Calendar, Flow), `PeriodControl` with preset/custom ranges + compare toggle + month review. Tab content: `ChartsTab` (cashflow line + cumulative area), `CategoriesTab` (donut + ranking), `CalendarTab` (heatmap), `FlowTab` (Sankey). Currency conversion warnings. Transaction sweep truncation notices. |
+
+---
+
+#### 4.F.J Holdings & Investments
+
+| Status | Route | File | Layout | Middleware | Description |
+| :---: | :--- | :--- | :--- | :--- | :--- |
+| [ ] | `/holdings` | [holdings/index.vue](file:///home/lantum/Desktop/Projects/webui/pages/holdings/index.vue) | dashboard | auth | **Holdings page** (assets: crypto, stocks, property): Header with refresh prices button, total value summary in brand surface card, holdings list with icons, quantities, current values. Inline `HoldingForm`. Price refresh API calls. Empty state. |
+
+---
+
+#### 4.F.K Financial Position
+
+| Status | Route | File | Layout | Middleware | Description |
+| :---: | :--- | :--- | :--- | :--- | :--- |
+| [ ] | `/financial-position` | [financial-position/index.vue](file:///home/lantum/Desktop/Projects/webui/pages/financial-position/index.vue) | dashboard | auth | **Net worth / financial position page**: Renders `FinancialPositionView` showing assets vs liabilities breakdown, net worth calculation, trend over time, drill-down modals per category. |
+
+---
+
+#### 4.F.L Reminders
+
+| Status | Route | File | Layout | Middleware | Description |
+| :---: | :--- | :--- | :--- | :--- | :--- |
+| [ ] | `/reminders` | [reminders.vue](file:///home/lantum/Desktop/Projects/webui/pages/reminders.vue) | dashboard | auth | **Reminders page**: `ContentTopCard`, inline `ReminderForm` (title, due date, frequency, linked transaction), list of upcoming/past reminders with status badges, snooze/complete actions. Empty state. |
+
+---
+
+#### 4.F.M Notifications
+
+| Status | Route | File | Layout | Middleware | Description |
+| :---: | :--- | :--- | :--- | :--- | :--- |
+| [ ] | `/notifications` | [notifications.vue](file:///home/lantum/Desktop/Projects/webui/pages/notifications.vue) | dashboard | auth | **Notifications center**: Page header with bell icon and "mark all read" action. Chronological notification list (unread bold, read muted). Notification type icons, timestamps, action buttons. Empty state. Pagination. |
+
+---
+
+#### 4.F.N Imports
+
+| Status | Route | File | Layout | Middleware | Description |
+| :---: | :--- | :--- | :--- | :--- | :--- |
+| [ ] | `/imports` | [imports.vue](file:///home/lantum/Desktop/Projects/webui/pages/imports.vue) | dashboard | auth | **Import & document parsing page**: `ImportUpload` (drag-and-drop zone, file type carousel), `ImportAnalyzing` progress state, `SuggestionReviewTable` for AI-parsed transactions, `ImportConfirmDialog` before commit. Past `ImportSessionsList`. Status polling during analysis. Error handling. |
+
+---
+
+#### 4.F.O AI Assistant
+
+| Status | Route | File | Layout | Middleware | Description |
+| :---: | :--- | :--- | :--- | :--- | :--- |
+| [ ] | `/assistant` | [assistant.vue](file:///home/lantum/Desktop/Projects/webui/pages/assistant.vue) | dashboard | auth | **AI financial assistant page**: Full-page `ChatExperience` in full mode. Conversation history sidebar, message composer, result renderer with block types (markdown, chart, table, KPI, timeline). Canvas panel for artifacts. Streaming responses. |
+
+---
+
+#### 4.F.P Settings
+
+| Status | Route | File | Layout | Middleware | Description |
+| :---: | :--- | :--- | :--- | :--- | :--- |
+| [ ] | `/settings` | [settings.vue](file:///home/lantum/Desktop/Projects/webui/pages/settings.vue) | dashboard | auth | **Settings page**: Tabbed interface (`TTabs`) with sections: Account (`SettingsAccount` - profile, password), General (`SettingsGeneral` - app config), Wallets (`SettingsWallets`), Display (`SettingsDisplay` - theme, language, currency), Notifications (`SettingsNotifications`), Integrations (`ExtensionSlot` for plugins), Connections (`SettingsConnections` - third-party services). Modal for password change. |
+
+---
+
+#### 4.F.Q Admin Panel
+
+| Status | Route | File | Layout | Middleware | Description |
+| :---: | :--- | :--- | :--- | :--- | :--- |
+| [ ] | `/admin` | [admin/index.vue](file:///home/lantum/Desktop/Projects/webui/pages/admin/index.vue) | admin | auth (admin role) | **Admin console**: Sidebar rail navigation with sections (Users, Analytics, Outreach, System). User management table (`UserDetail` drill-down), system health metrics, `OutreachComposer` for bulk messaging. Admin badge. Exit button to return to main app. |
+
+---
+
+#### 4.F.R Development & Testing
+
+| Status | Route | File | Layout | Middleware | Description |
+| :---: | :--- | :--- | :--- | :--- | :--- |
+| [ ] | `/test-kit` | [test-kit.vue](file:///home/lantum/Desktop/Projects/webui/pages/test-kit.vue) | dashboard (likely) | none (dev only) | **Component testing playground**: Isolated environment for testing UI components, design tokens, and interactions. Development-only route, should not be accessible in production. |
+
+---
+
+#### 4.F.S Route Architecture Summary
+
+```
+Application Route Tree (Nuxt file-based routing)
+├─ / (index.vue)
+│ └─ Landing redirect logic
+│
+├─ Authentication (auth layout, guest middleware)
+│ ├─ /login
+│ ├─ /register
+│ └─ /auth/[driver]/callback (OAuth)
+│
+├─ Onboarding (onboarding layout, auth middleware)
+│ └─ /onboarding
+│
+├─ Main Application (dashboard layout, auth middleware)
+│ ├─ Dashboard & Overview
+│ │ ├─ /home (AI-first landing)
+│ │ └─ /dashboard (traditional dashboard)
+│ │
+│ ├─ Core Financial Operations
+│ │ ├─ /transactions
+│ │ │ ├─ /transactions/new
+│ │ │ └─ /transactions/edit/[id]
+│ │ ├─ /wallets
+│ │ ├─ /budgets
+│ │ │ └─ /budgets/[id]
+│ │ └─ /categories
+│ │
+│ ├─ Supporting Entities
+│ │ ├─ /parties
+│ │ ├─ /groups
+│ │ ├─ /reminders
+│ │ └─ /holdings
+│ │
+│ ├─ Reporting & Analysis
+│ │ ├─ /reports
+│ │ └─ /financial-position
+│ │
+│ ├─ Data & AI
+│ │ ├─ /imports
+│ │ └─ /assistant
+│ │
+│ └─ System
+│ ├─ /notifications
+│ └─ /settings
+│
+├─ Administration (admin layout, admin middleware)
+│ └─ /admin
+│
+└─ Development
+ └─ /test-kit (dev only)
+```
+
+---
+
+#### 4.F.T Middleware & Meta Conventions
+
+All pages use `definePageMeta()` to declare:
+
+| Meta Property | Values | Purpose |
+| :--- | :--- | :--- |
+| `layout` | `default`, `auth`, `onboarding`, `dashboard`, `admin` | Specifies which layout shell wraps the page |
+| `middleware` | `auth`, `guest`, `admin` | Route guards: `auth` requires authentication, `guest` redirects authenticated users, `admin` requires admin role |
+
+**Common patterns:**
+- Authenticated pages: `definePageMeta({ layout: 'dashboard', middleware: 'auth' })`
+- Public pages: `definePageMeta({ layout: 'auth', middleware: 'guest' })`
+- Admin pages: `definePageMeta({ layout: 'admin', middleware: ['auth', 'admin'] })`
+
+---
+
+#### 4.F.U Page-Level State Management Patterns
+
+Most pages follow a consistent state orchestration pattern:
+
+1. **Data Fetching**: `onMounted()` or `watchEffect()` triggers API calls via composables (`useTransactions`, `useWallets`, `useBudgets`, etc.)
+2. **Loading States**: Boolean flags (`isLoading`, `isSubmitting`) control skeleton rendering via `ComponentLoader` or inline spinners
+3. **Error Handling**: API errors captured in `error` refs, displayed as alert banners or inline error messages
+4. **Form Management**: Inline form toggle (`showForm` ref), edit vs create mode discrimination (`editingItem` ref), validation state
+5. **CRUD Orchestration**: Create/update/delete handlers call API services, update local state, trigger shared data refresh, show notifications
+6. **Empty States**: Conditional rendering of `OnboardingEmptyState` or `EmptyState` when no data exists
+7. **Responsive Behavior**: Viewport detection (`useViewport()`, `isTabletOrBelow`) adjusts layout (hide tips sidebar, switch to card view, collapse forms)
+
+---
+
+#### 4.F.V Migration Notes for Layer 5
+
+When modernizing pages:
+
+1. **Data Fetching Standardization**: Migrate to Nuxt 3 `useFetch` / `useAsyncData` with built-in SSR hydration and automatic error/pending states
+2. **Route Transitions**: Implement View Transitions API for smoother page navigation (especially in dashboard shell)
+3. **Page-Level Loading Skeletons**: Replace boolean loading flags with structured skeleton states matching page content layout
+4. **Breadcrumb Navigation**: Add consistent breadcrumb trails to detail pages (budget detail, transaction edit, etc.)
+5. **Deep Link Support**: Ensure all pages support direct URL access with proper state restoration (filter params, search queries, view modes)
+6. **Meta Tags & SEO**: Add page-specific ``, ` `, and Open Graph tags via `useHead()` composable
+7. **Keyboard Shortcuts**: Implement consistent keyboard navigation (e.g., `Cmd+K` for command palette, `N` for new transaction)
+8. **Optimistic UI Updates**: Add optimistic mutations for create/update/delete actions to improve perceived performance
+9. **Infinite Scroll / Virtual Lists**: For large datasets (transactions, notifications), replace pagination with virtual scrolling
+10. **Progressive Enhancement**: Ensure core functionality works without JavaScript (form submissions, navigation) before hydration
+
+
+
+---
+---
+
+## 📊 Complete Architecture Summary
+
+### Component Inventory by Layer
+
+| Layer | Category | Count | Description |
+| :---: | :--- | ---: | :--- |
+| **0** | **Design Tokens & Utilities** | **68** | CSS variables, design scales, formatters, composables |
+| | Color Tokens | 28 | Brand, semantic, financial domain colors |
+| | Elevation & Shadow | 9 | Material-inspired shadow scale |
+| | Design Scales | 31+ | Spacing, radius, typography, z-index, motion |
+| | Global CSS Utilities | — | Surfaces, form styles, layout utilities |
+| | Headless Utilities | 8 | colors.ts, currency.ts, 6 composables |
+| **1** | **Base Components (Atoms)** | **21** | Styled foundational UI building blocks |
+| | Interactive | 11 | TButton, TDropdown, TDropdownItem, SearchInput, etc. |
+| | Display | 6 | TCard, TAvatar, Logo, LoadingSkeleton, EmptyState |
+| | Navigation | 2 | HamburgerMenu, ViewToggle |
+| | Utility | 2 | ComponentLoader, ExtensionSlot |
+| **2** | **Composite Components (Molecules)** | **29** | Reusable complex patterns |
+| | Forms & Inputs | 4 | SearchableDropdown, IconPicker, ThemeSelector, LanguageSelector |
+| | Layout & Display | 8 | ContentCard, ContentCardGrid, ContentTable, ContentListView, etc. |
+| | Modals & Overlays | 3 | ConfirmModal, StatsFilterModal, NotificationBell |
+| | Data Visualization | 5 | SparkLine, KpiCard, 4 chart components |
+| | Auth & Onboarding | 2 | AuthCarousel, AuthSocialLogin |
+| | Settings & Config | 2 | CollapsibleSection, PeriodControl |
+| | Other | 5 | TTableComponent, NotificationsContainer, DescriptorRenderer, etc. |
+| **3** | **Domain Components** | **90+** | Business logic & data-bound components |
+| | Transactions | 10 | TransactionForm, TransactionsSpreadsheet, filters, etc. |
+| | Wallets | 5 | WalletCard, WalletForm, WalletDetailPanel, etc. |
+| | Budgets | 2 | BudgetCard, BudgetForm |
+| | Categories & Groups | 2 | CategoryForm, GroupForm |
+| | Parties | 4 | PartyCard, PartiesForm, PartyDetailPanel, PartiesStatsStrip |
+| | Holdings & Reminders | 2 | HoldingForm, ReminderForm |
+| | Imports | 5 | ImportUpload, ImportAnalyzing, SuggestionReviewTable, etc. |
+| | Dashboard | 7 | DashboardKPIs, RecentTransactions, CategoryBreakdown, etc. |
+| | Reports | 19 | CashflowHero, MonthInReview, CalendarHeatmap, Sankey, etc. |
+| | Settings | 7 | SettingsAccount, SettingsDisplay, PasswordModal, etc. |
+| | AI / Chat | 24 | ChatExperience, ChatComposer, 16 block renderers, etc. |
+| | Financial Position | 2 | FinancialPositionView, FinancialPositionDrill |
+| | Auth & Onboarding | 5 | LoginCard, RegisterCard, OnboardingWizard, etc. |
+| | Admin | 2 | UserDetail, OutreachComposer |
+| **4** | **Layouts & Pages** | **33** | Application structure & routes |
+| | Navigation Components | 2 | TNavbar, TSidebar |
+| | Layout Shells | 5 | default, dashboard, auth, onboarding, admin |
+| | Page Routes | 26 | Landing, auth, dashboard, transactions, reports, etc. |
+
+**Total Tracked Components: 241+**
+
+---
+
+### Architecture Alignment with Industry Standards
+
+| Aspect | Theoretical Best Practice | Trakli Current State | Migration Priority |
+| :--- | :--- | :--- | :---: |
+| **Headless Primitives** | Dedicated layer (Radix UI, Ark UI, React Aria) | ❌ Not implemented | 🔴 High |
+| **Design Tokens** | Platform-agnostic JSON/YAML exported to CSS | ✓ SCSS variables (platform-specific) | 🟡 Medium |
+| **Component Variants** | CVA (Class Variance Authority) + Tailwind | ❌ Manual SCSS classes | 🔴 High |
+| **Styled Atoms** | Composition of headless + styled wrapper | ⚠️ Monolithic styled components | 🔴 High |
+| **Type Safety** | Full TypeScript coverage | ⚠️ Mixed .vue/.ts, incomplete types | 🟡 Medium |
+| **Accessibility** | WCAG AA/AAA compliance, automated testing | ⚠️ Manual ARIA, no automated tests | 🟡 Medium |
+| **Dark Mode** | CSS custom properties + theme tokens | ✓ CSS variables + theme composable | 🟢 Low |
+| **Responsive Design** | Container queries + viewport breakpoints | ⚠️ Media queries only | 🟡 Medium |
+| **State Management** | Composables + shared state | ✓ Composables pattern | 🟢 Low |
+| **Documentation** | Storybook / Histoire with stories | ❌ No component workshop | 🟡 Medium |
+
+---
+
+### Recommended Migration Path
+
+#### Phase 1: Foundation Modernization (Weeks 1-4)
+1. **Adopt Style Dictionary** for platform-agnostic design tokens
+2. **Integrate CVA** (Class Variance Authority) for type-safe component variants
+3. **Add Tailwind CSS** as utility-first styling layer
+4. **Set up Histoire** or Storybook for component development
+
+#### Phase 2: Headless Primitive Layer (Weeks 5-10)
+5. **Install Reka UI** (Radix for Vue) as headless primitive foundation
+6. **Refactor Layer 1 atoms** to compose Reka UI primitives with styled wrappers
+ - Priority order: TDropdown → TButton → TTabs → SearchInput
+7. **Establish component composition patterns** (primitive + wrapper convention)
+
+#### Phase 3: Component Library Refinement (Weeks 11-16)
+8. **Migrate SCSS to Tailwind + CVA** for all Layer 1 and Layer 2 components
+9. **Add automated accessibility testing** (axe-core, Playwright)
+10. **Implement container queries** for responsive components
+11. **Complete TypeScript coverage** for all components and props
+
+#### Phase 4: Distribution & Developer Experience (Weeks 17-20)
+12. **Set up component CLI** (shadcn/ui-style copy-paste model)
+13. **Create comprehensive Storybook documentation**
+14. **Add visual regression testing** (Chromatic or Percy)
+15. **Publish as npm package** (optional, for multi-repo usage)
+
+---
+
+### Key Files for Migration Attention
+
+#### Immediate Refactor Candidates (High Impact)
+```
+components/TButton.vue → Compose Reka UI Button + CVA variants
+components/TDropdown.vue → Replace with Reka UI DropdownMenu
+components/SearchableDropdown.vue → Compose Reka UI Combobox
+components/TTabs.vue → Replace with Reka UI Tabs
+assets/scss/_variables.scss → Convert to Style Dictionary tokens
+```
+
+#### Token System Overhaul
+```
+assets/scss/_variables.scss → tokens/colors.json
+ → tokens/spacing.json
+ → tokens/typography.json
+ → tokens/motion.json
+ (Style Dictionary build → CSS custom properties)
+```
+
+#### Test Coverage Priority
+```
+1. Layer 1 atoms (TButton, TCard, TDropdown)
+2. Layer 2 forms (SearchableDropdown, IconPicker)
+3. Layer 3 critical paths (TransactionForm, WalletForm, BudgetForm)
+4. Layer 4 layouts (dashboard.vue, auth.vue)
+```
+
+---
+
+## 🎯 Migration Tracking
+
+Use the checkboxes throughout this document to track component-by-component migration progress:
+
+- `[ ]` → Component pending migration
+- `[x]` → Component migrated to modern headless/token-driven architecture
+
+**Migration Progress**: 0 / 241+ components (0%)
+
+---
+
+**Document Version**: 1.0
+**Last Updated**: 2026-08-31
+**Maintained by**: Trakli Engineering Team
+
diff --git a/assets/bulbIcon.svg b/assets/bulbIcon.svg
new file mode 100644
index 0000000..0aac5d9
--- /dev/null
+++ b/assets/bulbIcon.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/flags/de.svg b/assets/flags/de.svg
new file mode 100644
index 0000000..295d13e
--- /dev/null
+++ b/assets/flags/de.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/flags/es.svg b/assets/flags/es.svg
new file mode 100644
index 0000000..e143324
--- /dev/null
+++ b/assets/flags/es.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/flags/fr.svg b/assets/flags/fr.svg
new file mode 100644
index 0000000..ec311d7
--- /dev/null
+++ b/assets/flags/fr.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/flags/gb.svg b/assets/flags/gb.svg
new file mode 100644
index 0000000..91f11d8
--- /dev/null
+++ b/assets/flags/gb.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/flags/it.svg b/assets/flags/it.svg
new file mode 100644
index 0000000..be3a5df
--- /dev/null
+++ b/assets/flags/it.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/flags/pt.svg b/assets/flags/pt.svg
new file mode 100644
index 0000000..99b5fe6
--- /dev/null
+++ b/assets/flags/pt.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/floating-docs-man.svg b/assets/floating-docs-man.svg
new file mode 100644
index 0000000..2061a27
--- /dev/null
+++ b/assets/floating-docs-man.svg
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/logo.svg b/assets/logo.svg
new file mode 100644
index 0000000..4b02c00
--- /dev/null
+++ b/assets/logo.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/scss/_form-styles.scss b/assets/scss/_form-styles.scss
new file mode 100644
index 0000000..c585aaf
--- /dev/null
+++ b/assets/scss/_form-styles.scss
@@ -0,0 +1,367 @@
+// Tier 0 Primitive #5 — Form Structural Primitives
+// Migrated from webui/assets/scss/_form-styles.scss
+// Provides .entity-form/.card-form/.form-input etc. — pure SCSS, consumes _vars tokens only.
+@use './_vars' as *;
+
+.entity-form {
+ display: flex;
+ flex-direction: column;
+ gap: 0.75rem;
+ background: $bg-gray;
+ width: min(750px, 100%);
+ height: auto;
+ overflow-y: auto;
+ border-radius: 16px;
+ padding: 2rem 2rem 1.5rem 2rem;
+ box-shadow: $shadow-sm;
+ box-sizing: border-box;
+ align-self: flex-start;
+
+ @media (max-width: $breakpoint-md) {
+ padding: 1.5rem 1.5rem 1.25rem 1.5rem;
+ border-radius: 12px;
+ gap: 1rem;
+ }
+
+ @media (max-width: $breakpoint-sm) {
+ padding: 1rem 1rem 0.75rem 1rem;
+ border-radius: 8px;
+ gap: 0.75rem;
+ width: 100%;
+ }
+
+ @media (max-width: 480px) {
+ padding: 0.75rem 0.75rem 0.5rem 0.75rem;
+ border-radius: 6px;
+ gap: 0.5rem;
+ }
+}
+
+.form-group {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+
+ @media (max-width: $breakpoint-sm) {
+ gap: 0.375rem;
+ }
+}
+
+.form-label {
+ font-weight: 600;
+ color: $text-primary;
+ margin: 0;
+ font-size: 1rem;
+
+ @media (max-width: $breakpoint-md) {
+ font-size: 0.95rem;
+ }
+
+ @media (max-width: $breakpoint-sm) {
+ font-size: 0.9rem;
+ }
+}
+
+.form-input,
+.form-textarea,
+.form-select {
+ width: 100%;
+ box-sizing: border-box;
+ padding: 0.75rem 1rem;
+ border: 1px solid $border-medium;
+ border-radius: 12px;
+ font-size: 1rem;
+ background: $bg-white;
+ color: $text-primary;
+ transition:
+ border-color $duration-fast $easing-standard,
+ box-shadow $duration-fast $easing-standard,
+ background-color $duration-fast $easing-standard;
+
+ @media (max-width: $breakpoint-md) {
+ padding: 0.625rem 0.875rem;
+ font-size: 0.95rem;
+ border-radius: 10px;
+ }
+
+ @media (max-width: $breakpoint-sm) {
+ padding: 0.5rem 0.75rem;
+ font-size: 0.9rem;
+ border-radius: 10px;
+ }
+
+ @media (max-width: 480px) {
+ padding: 0.5rem 0.625rem;
+ font-size: 0.875rem;
+ }
+
+ &::placeholder {
+ color: $text-muted;
+ }
+
+ &:hover:not(:focus):not(:disabled) {
+ border-color: $text-muted;
+ }
+
+ &:focus {
+ border-color: $primary;
+ outline: none;
+ box-shadow: 0 0 0 3px rgba(var(--color-primary-rgb), 0.18);
+ }
+
+ &:disabled {
+ background: $bg-light;
+ color: $text-muted;
+ cursor: not-allowed;
+ }
+
+ &.error {
+ border-color: $error-color;
+
+ &:focus {
+ box-shadow: 0 0 0 3px rgba(var(--color-error-rgb, 220, 38, 38), 0.18);
+ }
+ }
+}
+
+.form-select {
+ cursor: pointer;
+ appearance: none;
+ background-position: right 0.75rem center;
+ background-repeat: no-repeat;
+ background-size: 1.5em 1.5em;
+ padding-right: 2.5rem;
+
+ option {
+ padding: 0.5rem;
+ }
+}
+
+.form-textarea {
+ resize: vertical;
+ max-height: 6vh;
+}
+
+.submit-btn {
+ background: $primary;
+ color: $bg-white;
+ font-weight: 700;
+ font-size: 1rem;
+ border: none;
+ border-radius: 8px;
+ width: fit-content;
+ padding: 0.75rem 1rem;
+ cursor: pointer;
+ transition: 0.2s;
+ margin-top: 0.5rem;
+
+ @media (max-width: $breakpoint-md) {
+ font-size: 0.95rem;
+ padding: 0.625rem 0.875rem;
+ border-radius: 6px;
+ }
+
+ @media (max-width: $breakpoint-sm) {
+ font-size: 0.9rem;
+ padding: 0.5rem 0.75rem;
+ width: 100%;
+ margin-top: 0.75rem;
+ }
+
+ @media (max-width: 480px) {
+ font-size: 0.875rem;
+ padding: 0.5rem 0.625rem;
+ margin-top: 1rem;
+ }
+
+ &:hover {
+ background: $primary-hover;
+ }
+}
+
+.error-text {
+ color: $error-color;
+ font-size: 0.95rem;
+ margin-top: 0.25rem;
+}
+
+.name-icon-row {
+ display: grid;
+ grid-template-columns: 1fr auto;
+ align-items: end;
+ gap: $spacing-4;
+}
+
+.name-col {
+ min-width: 0;
+}
+
+.two-col-row {
+ display: grid;
+ grid-template-columns: 1fr;
+ gap: $spacing-4;
+}
+
+@media (min-width: $breakpoint-md) {
+ .two-col-row {
+ grid-template-columns: 1fr 1fr;
+ align-items: start;
+ }
+}
+
+.icon-trigger {
+ width: 48px;
+ height: 48px;
+ border-radius: 9999px;
+ border: 1px solid $border-light;
+ background: rgba(var(--color-primary-rgb), 0.12);
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ transition: $transition-base;
+
+ &:hover {
+ background: rgba(var(--color-primary-rgb), 0.18);
+ border-color: rgba(var(--color-primary-rgb), 0.25);
+ }
+ &:focus-visible {
+ outline: none;
+ box-shadow: 0 0 0 3px $input-focus;
+ }
+}
+
+.icon-trigger__icon {
+ width: 22px;
+ height: 22px;
+ color: $primary;
+}
+
+.icon-popover {
+ margin-top: $spacing-2;
+ padding: $spacing-3;
+ background: $bg-white;
+ border: 1px solid $border-light;
+ border-radius: $radius-lg;
+ box-shadow: $shadow-sm;
+}
+
+.card-form {
+ background: $bg-white;
+ border-radius: $radius-xl;
+ border: 1px solid $border-color;
+ box-shadow: $shadow-md;
+ padding: 1.5rem;
+ width: min(750px, 100%);
+ min-width: 600px;
+
+ @media (max-width: $breakpoint-md) {
+ padding: 1.25rem;
+ min-width: auto;
+ }
+
+ @media (max-width: $breakpoint-sm) {
+ padding: 1rem;
+ }
+}
+
+.form-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 1.5rem;
+
+ h2 {
+ font-size: $font-size-lg;
+ font-weight: $font-semibold;
+ color: $text-primary;
+ margin: 0;
+ }
+
+ @media (max-width: $breakpoint-sm) {
+ margin-bottom: 1rem;
+
+ h2 {
+ font-size: $font-size-base;
+ }
+ }
+}
+
+.close-btn {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 32px;
+ height: 32px;
+ border-radius: 50%;
+ background: $bg-gray;
+ border: none;
+ cursor: pointer;
+ transition: background 0.2s;
+
+ &:hover {
+ background: $border-color;
+ }
+
+ svg {
+ width: 18px;
+ height: 18px;
+ color: $text-secondary;
+ }
+}
+
+.form-actions {
+ display: flex;
+ justify-content: flex-end;
+ gap: 0.75rem;
+ margin-top: 1.5rem;
+ padding-top: 1rem;
+ border-top: 1px solid $border-color;
+
+ @media (max-width: $breakpoint-sm) {
+ flex-direction: column-reverse;
+ gap: 0.5rem;
+ }
+}
+
+.btn {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ gap: 0.5rem;
+ padding: 0.75rem 1.25rem;
+ border-radius: $radius-lg;
+ font-weight: $font-semibold;
+ font-size: $font-size-sm;
+ cursor: pointer;
+ transition: all 0.2s;
+ border: none;
+
+ @media (max-width: $breakpoint-sm) {
+ width: 100%;
+ padding: 0.625rem 1rem;
+ }
+
+ &:disabled {
+ opacity: 0.6;
+ cursor: not-allowed;
+ }
+}
+
+.btn-primary {
+ background: $primary;
+ color: white;
+
+ &:hover:not(:disabled) {
+ opacity: 0.9;
+ }
+}
+
+.btn-secondary {
+ background: $bg-gray;
+ color: $text-primary;
+
+ &:hover:not(:disabled) {
+ background: $border-color;
+ }
+}
diff --git a/assets/scss/_surfaces.scss b/assets/scss/_surfaces.scss
new file mode 100644
index 0000000..ad48aa7
--- /dev/null
+++ b/assets/scss/_surfaces.scss
@@ -0,0 +1,164 @@
+// Tier 0 Primitive #4 — Surface System
+// Migrated from webui/assets/scss/_surfaces.scss
+// Provides .surface variants + display/eyebrow/glass-pill/tone-card — zero JS, only SCSS vars → CSS custom props.
+@use './_vars' as *;
+
+.surface {
+ background: var(--surface-bg);
+ color: var(--surface-ink);
+
+ &--brand {
+ --surface-bg: var(--color-primary-light);
+ --surface-ink: var(--color-text-primary);
+ --surface-accent: var(--color-primary-border);
+ --surface-deep: var(--color-primary);
+ }
+ &--brand-soft {
+ --surface-bg: var(--color-primary-light);
+ --surface-ink: var(--color-text-primary);
+ --surface-accent: var(--color-primary-lighter);
+ --surface-deep: var(--color-primary-hover);
+ }
+ &--income {
+ --surface-bg: var(--color-income-soft);
+ --surface-ink: var(--color-text-primary);
+ --surface-accent: var(--color-income);
+ --surface-deep: var(--color-income);
+ }
+ &--expense {
+ --surface-bg: var(--color-expense-soft);
+ --surface-ink: var(--color-text-primary);
+ --surface-accent: var(--color-expense);
+ --surface-deep: var(--color-expense);
+ }
+ &--neutral {
+ --surface-bg: var(--color-bg-light);
+ --surface-ink: var(--color-text-primary);
+ --surface-accent: var(--color-border-medium);
+ --surface-deep: var(--color-text-secondary);
+ }
+ &--investment {
+ --surface-bg: rgba(14, 165, 233, 0.12);
+ --surface-ink: var(--color-text-primary);
+ --surface-accent: rgba(14, 165, 233, 0.5);
+ --surface-deep: #0284c7;
+ }
+ &--loan {
+ --surface-bg: rgba(217, 119, 6, 0.12);
+ --surface-ink: var(--color-text-primary);
+ --surface-accent: rgba(217, 119, 6, 0.5);
+ --surface-deep: #b45309;
+ }
+ &--gift {
+ --surface-bg: rgba(124, 58, 237, 0.12);
+ --surface-ink: var(--color-text-primary);
+ --surface-accent: rgba(124, 58, 237, 0.5);
+ --surface-deep: #6d28d9;
+ }
+}
+
+// In dark mode the surface bg becomes a subtle tint so it sits on the page
+// instead of dominating it, and the deep token swaps for a brighter accent
+// so icons and text on top of it stay legible.
+:root.dark {
+ .surface--brand {
+ --surface-bg: rgba(var(--color-primary-rgb), 0.16);
+ --surface-accent: var(--color-primary-lighter);
+ --surface-deep: var(--color-primary-border);
+ }
+ .surface--brand-soft {
+ --surface-bg: rgba(var(--color-primary-rgb), 0.1);
+ --surface-accent: var(--color-primary-muted);
+ --surface-deep: var(--color-primary-border);
+ }
+ .surface--income {
+ --surface-bg: rgba(var(--color-income-rgb), 0.14);
+ --surface-accent: var(--color-income);
+ --surface-deep: var(--color-income);
+ }
+ .surface--expense {
+ --surface-bg: rgba(var(--color-expense-rgb), 0.14);
+ --surface-accent: var(--color-expense);
+ --surface-deep: var(--color-expense);
+ }
+ .surface--neutral {
+ --surface-bg: rgba(255, 255, 255, 0.04);
+ --surface-accent: var(--color-border-medium);
+ --surface-deep: var(--color-text-secondary);
+ }
+ .surface--investment {
+ --surface-bg: rgba(14, 165, 233, 0.16);
+ --surface-accent: rgba(56, 189, 248, 0.5);
+ --surface-deep: #38bdf8;
+ }
+ .surface--loan {
+ --surface-bg: rgba(217, 119, 6, 0.16);
+ --surface-accent: rgba(251, 191, 36, 0.5);
+ --surface-deep: #fbbf24;
+ }
+ .surface--gift {
+ --surface-bg: rgba(124, 58, 237, 0.16);
+ --surface-accent: rgba(167, 139, 250, 0.5);
+ --surface-deep: #a78bfa;
+ }
+}
+
+.display-1 {
+ font-weight: $font-bold;
+ font-size: clamp(2rem, 5vw, 3.4rem);
+ line-height: 1.02;
+ letter-spacing: -0.03em;
+}
+.display-2 {
+ font-weight: $font-bold;
+ font-size: clamp(1.6rem, 3.4vw, 2.2rem);
+ line-height: 1.05;
+ letter-spacing: -0.025em;
+}
+.display-3 {
+ font-weight: $font-semibold;
+ font-size: clamp(1.2rem, 2.4vw, 1.6rem);
+ line-height: 1.1;
+ letter-spacing: -0.015em;
+}
+
+.eyebrow {
+ font-size: 11px;
+ font-weight: $font-bold;
+ text-transform: uppercase;
+ letter-spacing: 0.14em;
+ color: var(--surface-deep, $text-muted);
+}
+
+.glass-pill {
+ display: inline-flex;
+ align-items: center;
+ gap: $spacing-2;
+ padding: 6px 12px;
+ background: var(--glass-bg);
+ border: 1px solid var(--color-border-light);
+ border-radius: 999px;
+ backdrop-filter: blur(10px);
+ box-shadow: var(--elevation-1);
+ font-size: $font-size-sm;
+ font-weight: $font-semibold;
+ color: var(--surface-deep, $text-primary);
+}
+
+.tone-card {
+ position: relative;
+ background: var(--surface-bg, var(--color-bg-white));
+ color: var(--surface-ink, var(--color-text-primary));
+ border: 1px solid var(--color-border-light);
+ border-radius: 18px;
+ padding: 1.25rem;
+ overflow: hidden;
+ box-shadow: var(--elevation-1);
+ transition:
+ box-shadow $duration-base $easing-standard,
+ transform $duration-base $easing-standard;
+
+ &:hover {
+ box-shadow: var(--elevation-2);
+ }
+}
diff --git a/assets/scss/_transaction-form.scss b/assets/scss/_transaction-form.scss
new file mode 100644
index 0000000..3db8890
--- /dev/null
+++ b/assets/scss/_transaction-form.scss
@@ -0,0 +1,748 @@
+@use './_vars.scss' as *;
+
+/* Transaction form layout and styles moved from components/TransactionForm.vue */
+.transaction-form {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 16px;
+ width: 100%;
+}
+
+.form {
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ max-width: 800px;
+ gap: 16px;
+ margin: 0 auto;
+}
+
+.form-transaction {
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ gap: 16px;
+ margin: 0 auto;
+ width: 100%;
+
+ @media (max-width: $breakpoint-sm) {
+ grid-template-columns: 1fr;
+ gap: 12px;
+ }
+}
+
+.transaction-date {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+
+ span {
+ font-weight: $font-medium;
+ }
+
+ input {
+ padding: 12px;
+ border: 1px solid $border-color;
+ border-radius: 8px;
+ font-size: 16px;
+ width: 100%;
+ height: 50px;
+ background: $bg-white;
+ color: $text-primary;
+
+ &:focus {
+ border-color: $primary;
+ outline: none;
+ }
+ }
+
+ input::placeholder {
+ color: $text-muted;
+ }
+}
+
+.transaction-amount {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: 8px;
+ width: 100%;
+
+ input {
+ width: 100%;
+ height: 50px;
+ border-radius: $radius-lg;
+ padding: 12px;
+ border: 1px solid $border-color;
+ background: $bg-white;
+ color: $text-primary;
+
+ &:focus {
+ border-color: $primary;
+ outline: none;
+ }
+ }
+
+ .amount-currency-button {
+ width: 58px;
+ height: 50px;
+ background-color: $bg-light;
+ border-radius: $radius-lg;
+ font-weight: $font-normal;
+ font-size: $font-size-sm;
+ line-height: 100%;
+ border: 1px solid $border-color;
+ cursor: pointer;
+ }
+
+ .amount-currency-select {
+ width: 80px;
+ height: 50px;
+ background-color: $bg-light;
+ border-radius: $radius-lg;
+ font-weight: $font-normal;
+ font-size: $font-size-sm;
+ line-height: 100%;
+ border: 1px solid $border-color;
+ cursor: pointer;
+ padding: 0 8px;
+ appearance: none;
+ color: $text-primary;
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e");
+ background-position: right 8px center;
+ background-repeat: no-repeat;
+ background-size: 16px;
+
+ &:focus {
+ border-color: $primary;
+ outline: none;
+ }
+ }
+}
+
+.transaction-party {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ position: relative;
+
+ span {
+ font-weight: $font-medium;
+ }
+
+ .party-search {
+ display: flex;
+ align-items: center;
+ position: relative;
+
+ input {
+ width: 100%;
+ padding: 12px 40px 12px 36px;
+ height: 50px;
+ border: 1px solid $border-color;
+ border-radius: 8px;
+ font-size: 16px;
+ color: $text-primary;
+ background-color: $bg-white;
+
+ &:focus {
+ border-color: $primary;
+ outline: none;
+ }
+ }
+
+ .search-icon,
+ .dropdown-icon {
+ position: absolute;
+ width: 20px;
+ height: 20px;
+ color: $primary;
+ }
+
+ .search-icon {
+ left: 10px;
+ }
+ .dropdown-icon {
+ right: 10px;
+ }
+ }
+
+ .party-dropdown {
+ position: absolute;
+ top: 85px;
+ width: 100%;
+ background-color: $bg-white;
+ border: 1px solid $border-light;
+ border-radius: 8px;
+ box-shadow: $shadow-md;
+ list-style: none;
+ padding: 8px 0;
+ z-index: 10;
+
+ li {
+ padding: 10px 16px;
+ cursor: pointer;
+ transition: background 0.2s ease;
+
+ .text-highlight {
+ color: $text-secondary;
+ font-weight: 500;
+ }
+ .text-secondary {
+ color: $text-muted;
+ }
+
+ &:hover {
+ background-color: $bg-light;
+ }
+ }
+ }
+}
+
+.transaction-category {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ position: relative;
+
+ span {
+ font-weight: $font-medium;
+ }
+
+ .category-search {
+ display: flex;
+ align-items: center;
+ position: relative;
+
+ input {
+ width: 100%;
+ padding: 12px 40px 12px 36px;
+ height: 50px;
+ border: 1px solid $border-color;
+ border-radius: 8px;
+ font-size: 16px;
+ color: $text-primary;
+ background-color: $bg-white;
+
+ &:focus {
+ border-color: $primary;
+ outline: none;
+ }
+ }
+
+ .search-icon,
+ .dropdown-icon {
+ position: absolute;
+ width: 20px;
+ height: 20px;
+ color: $primary;
+ }
+
+ .search-icon {
+ left: 10px;
+ }
+ .dropdown-icon {
+ right: 10px;
+ }
+ }
+
+ .category-dropdown {
+ position: absolute;
+ top: 85px;
+ width: 100%;
+ background-color: $bg-white;
+ border: 1px solid $border-light;
+ border-radius: 8px;
+ box-shadow: $shadow-md;
+ list-style: none;
+ padding: 8px 0;
+ z-index: 10;
+
+ li {
+ padding: 10px 16px;
+ cursor: pointer;
+ transition: background 0.2s ease;
+
+ .text-highlight {
+ color: $text-secondary;
+ font-weight: 500;
+ }
+ .text-secondary {
+ color: $text-muted;
+ }
+
+ &:hover {
+ background-color: $bg-light;
+ }
+
+ &.selected-option {
+ background-color: $primary-light;
+ font-weight: $font-medium;
+ }
+ &.disabled {
+ opacity: 0.55;
+ pointer-events: none;
+ }
+ }
+ }
+}
+
+.transaction-wallet {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ position: relative;
+
+ span {
+ font-weight: $font-medium;
+ }
+
+ .wallet-search {
+ display: flex;
+ align-items: center;
+ position: relative;
+
+ input {
+ width: 100%;
+ padding: 12px 40px 12px 36px;
+ height: 50px;
+ border: 1px solid $border-color;
+ border-radius: 8px;
+ font-size: 16px;
+ color: $text-primary;
+ background-color: $bg-white;
+
+ &:focus {
+ border-color: $primary;
+ outline: none;
+ }
+ }
+
+ .search-icon,
+ .dropdown-icon {
+ position: absolute;
+ width: 20px;
+ height: 20px;
+ color: $primary;
+ }
+
+ .search-icon {
+ left: 10px;
+ }
+ .dropdown-icon {
+ right: 10px;
+ }
+ }
+
+ .wallet-dropdown {
+ position: absolute;
+ top: 85px;
+ width: 100%;
+ background-color: $bg-white;
+ border: 1px solid $border-light;
+ border-radius: 8px;
+ box-shadow: $shadow-md;
+ list-style: none;
+ padding: 8px 0;
+ z-index: 10;
+
+ li {
+ padding: 10px 16px;
+ cursor: pointer;
+ transition: background 0.2s ease;
+
+ .text-highlight {
+ color: $text-secondary;
+ font-weight: 500;
+ }
+ .text-secondary {
+ color: $text-muted;
+ }
+
+ &:hover {
+ background-color: $bg-light;
+ }
+ }
+ }
+}
+
+.transaction-files {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+
+ span {
+ font-weight: $font-medium;
+ }
+
+ .upload-box {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ background: $bg-white;
+ border: 1px dashed $border-light;
+ border-radius: 10px;
+ padding: 12px;
+ }
+
+ #file-input {
+ display: none;
+ }
+
+ .upload-button {
+ display: inline-block;
+ padding: 8px 12px;
+ background: $bg-light;
+ border: 1px solid $border-color;
+ border-radius: 8px;
+ color: $text-primary;
+ font-size: 14px;
+ cursor: pointer;
+ }
+
+ .hint {
+ color: $text-muted;
+ font-size: 12px;
+ }
+
+ .file-list {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ }
+
+ .chip {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ padding: 6px 10px;
+ background: $bg-light;
+ border: 1px solid $border-color;
+ border-radius: 999px;
+ font-size: 12px;
+
+ .remove {
+ appearance: none;
+ border: none;
+ background: transparent;
+ color: $text-muted;
+ cursor: pointer;
+ font-size: 14px;
+ line-height: 1;
+ }
+ }
+
+ .attachment-grid {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 12px;
+ }
+
+ .attachment-card {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 6px;
+ width: 96px;
+ padding: 6px;
+ background: $bg-white;
+ border: 1px solid $border-color;
+ border-radius: 10px;
+ transition: opacity 0.15s ease;
+
+ &.removing {
+ opacity: 0.5;
+ pointer-events: none;
+ }
+
+ .thumb {
+ width: 84px;
+ height: 84px;
+ border-radius: 8px;
+ overflow: hidden;
+ background: $bg-light;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ display: block;
+ }
+
+ .thumb-placeholder {
+ color: $text-muted;
+ font-size: 20px;
+ }
+ }
+
+ .thumb-doc span {
+ font-weight: $font-medium;
+ font-size: 12px;
+ color: $text-muted;
+ letter-spacing: 0.05em;
+ }
+
+ .filename {
+ font-size: 11px;
+ color: $text-primary;
+ max-width: 88px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+
+ .remove {
+ position: absolute;
+ top: -6px;
+ right: -6px;
+ width: 22px;
+ height: 22px;
+ border-radius: 50%;
+ border: 1px solid $border-color;
+ background: $bg-white;
+ color: $text-primary;
+ cursor: pointer;
+ font-size: 14px;
+ line-height: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ &:disabled {
+ cursor: not-allowed;
+ opacity: 0.6;
+ }
+ }
+ }
+}
+
+.transaction-description {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+
+ span {
+ font-weight: $font-medium;
+ margin-bottom: 8px;
+ }
+
+ textarea {
+ width: 100%;
+ border-radius: 12px;
+ padding: 16px;
+ font-size: 16px;
+ border: 1px solid $border-color;
+ background-color: $bg-white;
+ resize: none;
+ color: $text-primary;
+
+ &:focus {
+ border: 1px solid $primary !important;
+ outline: none;
+ }
+ &::placeholder {
+ color: $text-muted;
+ }
+ }
+}
+
+/* Inline error text */
+.error-text {
+ margin-top: 4px;
+ color: $error-color;
+ font-size: $font-size-xs;
+}
+
+.submit-button {
+ align-self: flex-start;
+ margin-top: 16px;
+
+ @media (max-width: $breakpoint-sm) {
+ width: 100%;
+ }
+
+ &.submit-button--expense {
+ background-color: $error-color;
+ border-color: $error-color;
+
+ &:hover {
+ background-color: $error-dark;
+ border-color: $error-dark;
+ }
+ }
+}
+
+.refund-section {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ padding: 12px;
+ border: 1px solid $border-color;
+ border-radius: $radius-lg;
+ background: $bg-light;
+
+ .refund-toggle {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ cursor: pointer;
+ font-weight: $font-medium;
+ color: $text-primary;
+
+ input[type='checkbox'] {
+ width: 18px;
+ height: 18px;
+ cursor: pointer;
+ accent-color: $primary;
+ }
+ }
+
+ .refund-hint {
+ margin: 0;
+ font-size: $font-size-xs;
+ color: $text-muted;
+ line-height: 1.4;
+ }
+
+ .refund-link {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ margin-top: 8px;
+ }
+
+ .refund-link-hint {
+ margin: 4px 0 0;
+ font-size: $font-size-xs;
+ color: $text-muted;
+ }
+}
+
+.recurring-section {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+
+ .recurring-toggle {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ cursor: pointer;
+ font-weight: $font-medium;
+
+ input[type='checkbox'] {
+ width: 18px;
+ height: 18px;
+ cursor: pointer;
+ accent-color: $primary;
+ }
+ }
+
+ .recurring-fields {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ padding: 16px;
+ border: 1px solid $border-color;
+ border-radius: $radius-lg;
+ background: $bg-light;
+ }
+
+ .recurring-select {
+ padding: 12px;
+ border: 1px solid $border-color;
+ border-radius: 8px;
+ font-size: 16px;
+ width: 100%;
+ height: 50px;
+ background: $bg-white;
+ color: $text-primary;
+
+ &:focus {
+ border-color: $primary;
+ outline: none;
+ }
+ }
+}
+
+.optional-label {
+ font-weight: $font-normal;
+ color: $text-muted;
+ font-size: $font-size-sm;
+}
+
+.intent-pills {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+}
+
+.intent-pill {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ padding: 8px 14px;
+ border: 1px solid $border-color;
+ border-radius: 999px;
+ background: $bg-white;
+ color: $text-secondary;
+ font-size: $font-size-sm;
+ font-weight: $font-medium;
+ cursor: pointer;
+ transition:
+ background 0.15s ease,
+ border-color 0.15s ease,
+ color 0.15s ease;
+
+ &:hover {
+ border-color: $primary;
+ color: $text-primary;
+ }
+
+ .intent-pill-icon {
+ width: 16px;
+ height: 16px;
+ }
+}
+
+.intent-pill--active {
+ background: $primary;
+ border-color: $primary;
+ color: white;
+
+ &:hover {
+ color: white;
+ }
+}
+
+.wallet-field-wrapper,
+.group-field-wrapper {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+
+ .wallet-default-indicator,
+ .group-default-indicator {
+ position: absolute;
+ top: 34px;
+ right: 8px;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ background: $primary;
+ color: white;
+ font-size: 0.65rem;
+ font-weight: 700;
+ padding: 2px 6px;
+ border-radius: 3px;
+ white-space: nowrap;
+ letter-spacing: 0.4px;
+ text-transform: uppercase;
+ pointer-events: none;
+ }
+}
diff --git a/assets/scss/_transactions-cards.scss b/assets/scss/_transactions-cards.scss
new file mode 100644
index 0000000..f6bb294
--- /dev/null
+++ b/assets/scss/_transactions-cards.scss
@@ -0,0 +1,441 @@
+@use './_vars.scss' as *;
+
+.transactions-cards {
+ width: 100%;
+
+ .cards-heading {
+ display: flex;
+ flex-direction: column;
+ gap: $spacing-4;
+ margin-bottom: $spacing-3;
+
+ &__text {
+ font-weight: $font-bold;
+ font-size: $font-size-xl;
+ margin-bottom: 0;
+ color: $text-primary;
+ }
+ }
+
+ .cards-list {
+ display: grid;
+ gap: $spacing-4;
+ }
+
+ .card {
+ position: relative;
+ background: $bg-white;
+ border-radius: $radius-xl;
+ box-shadow: $shadow-sm;
+ padding: $spacing-4;
+ border: 1px solid $border-color;
+
+ &::after {
+ content: '';
+ position: absolute;
+ right: 0;
+ top: 0;
+ width: 76px;
+ height: 76px;
+ border-top-right-radius: $radius-xl;
+ background: radial-gradient(
+ 80px 80px at 90% 20%,
+ rgba(var(--color-primary-rgb), 0.08),
+ transparent 70%
+ );
+ pointer-events: none;
+ }
+
+ &--income {
+ .card__badge {
+ background: $primary-light;
+ color: $primary;
+ }
+ .card__amount {
+ color: $primary;
+ }
+ &::after {
+ background: radial-gradient(80px 80px at 90% 20%, rgba(4, 120, 68, 0.08), transparent 70%);
+ }
+ }
+
+ &--expense {
+ .card__badge {
+ background: rgba(var(--color-error-rgb), 0.12);
+ color: $error-color;
+ }
+ .card__amount {
+ color: $error-color;
+ }
+ &::after {
+ background: radial-gradient(
+ 80px 80px at 90% 20%,
+ rgba(var(--color-error-rgb), 0.08),
+ transparent 70%
+ );
+ }
+ }
+ }
+
+ .card__header {
+ display: grid;
+ grid-template-columns: auto 1fr auto auto;
+ gap: $spacing-3;
+ align-items: start;
+ }
+
+ .card__badge {
+ padding: $spacing-1 $spacing-3;
+ border-radius: 9999px;
+ font-size: $font-size-xs;
+ font-weight: $font-bold;
+ }
+
+ .card__title-group {
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+ }
+ .card__title {
+ font-size: $font-size-lg;
+ font-weight: $font-semibold;
+ color: $text-primary;
+ }
+ .card__subtitle {
+ font-size: $font-size-sm;
+ color: $text-muted;
+ }
+
+ .card__amount {
+ font-size: $font-size-base;
+ font-weight: $font-bold;
+ white-space: nowrap;
+ }
+
+ .card__toggle {
+ width: 32px;
+ height: 32px;
+ border-radius: $radius-lg;
+ background: $bg-light;
+ display: grid;
+ place-items: center;
+ border: 1px solid $border-light;
+ }
+ .toggle-icon {
+ width: 18px;
+ height: 18px;
+ color: $text-muted;
+ transition: transform $transition-base;
+ }
+ .toggle-icon.is-open {
+ transform: rotate(180deg);
+ }
+
+ .card__details {
+ margin-top: $spacing-4;
+ display: grid;
+ gap: $spacing-4;
+ }
+
+ .details__meta {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ }
+
+ .details__timeago {
+ font-size: $font-size-xs;
+ color: $text-muted;
+ }
+
+ .details__tiles {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: $spacing-3;
+ }
+
+ .tile {
+ background: $bg-light;
+ border: 1px solid $border-light;
+ border-radius: $radius-lg;
+ padding: $spacing-3;
+ }
+ .tile__label {
+ font-size: $font-size-xs;
+ color: $text-muted;
+ text-transform: uppercase;
+ letter-spacing: 0.03em;
+ margin-bottom: 2px;
+ }
+ .tile__value {
+ font-size: $font-size-sm;
+ color: $text-primary;
+ word-break: break-word;
+ }
+
+ .card__actions {
+ display: flex;
+ gap: $spacing-3;
+ }
+ .action-btn {
+ width: 28px;
+ height: 28px;
+ border-radius: $radius-md;
+ border: 1px solid $border-light;
+ background: $bg-white;
+ display: grid;
+ place-items: center;
+ }
+ .action-icon {
+ width: 16px;
+ height: 16px;
+ color: $primary;
+ }
+ .action-btn--delete .action-icon {
+ color: $error-color;
+ }
+
+ .pagination-container {
+ margin-top: $spacing-6;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ width: 100%;
+ }
+}
+
+/* New compact mobile card layout */
+.transactions-cards {
+ .txn-card {
+ padding: $spacing-4 $spacing-4 $spacing-3;
+ }
+
+ .txn-card__top {
+ display: grid;
+ grid-template-columns: auto 1fr auto;
+ gap: $spacing-2;
+ align-items: center;
+ }
+
+ .icon-tile {
+ width: 40px;
+ height: 40px;
+ border-radius: $radius-lg;
+ display: grid;
+ place-items: center;
+ border: 1px solid $border-light;
+ background: $bg-light;
+
+ &.tile--income {
+ background: rgba(var(--color-primary-rgb), 0.08);
+ border-color: rgba(var(--color-primary-rgb), 0.15);
+ .tile-icon {
+ color: $primary;
+ }
+ }
+ &.tile--expense {
+ background: rgba(var(--color-error-rgb), 0.08);
+ border-color: rgba(var(--color-error-rgb), 0.15);
+ .tile-icon {
+ color: $error-color;
+ }
+ }
+ }
+ .tile-icon {
+ width: 18px;
+ height: 18px;
+ }
+
+ .header-line {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ min-width: 0;
+
+ .prefix {
+ color: $text-secondary;
+ font-size: $font-size-sm;
+ flex-shrink: 0;
+ }
+ .user-icon {
+ width: 16px;
+ height: 16px;
+ color: $text-secondary;
+ flex-shrink: 0;
+ }
+ .party {
+ font-weight: $font-semibold;
+ color: $text-primary;
+ flex: 1 1 auto;
+ min-width: 0;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ }
+
+ .txn-chip {
+ display: inline-flex;
+ align-items: center;
+ gap: 4px;
+ padding: 2px 6px;
+ border-radius: 9999px;
+ font-size: $font-size-xs;
+ border: 1px solid $border-light;
+ white-space: nowrap;
+ flex-shrink: 0;
+ max-width: 100%;
+ overflow: hidden;
+
+ &--default {
+ background: $primary-light;
+ color: $primary;
+ border-color: rgba(var(--color-primary-rgb), 0.25);
+ }
+ &--wallet {
+ background: $bg-light;
+ color: $text-secondary;
+ }
+ .txn-chip__icon {
+ width: 12px;
+ height: 12px;
+ flex-shrink: 0;
+ }
+ .txn-chip__text {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ }
+
+ .amount {
+ font-weight: $font-bold;
+ font-size: $font-size-lg;
+ white-space: nowrap;
+ &.amount--income {
+ color: $primary;
+ }
+ &.amount--expense {
+ color: $error-color;
+ }
+ }
+
+ .txn-card__middle {
+ margin-top: $spacing-2;
+ display: flex;
+ align-items: center;
+ }
+
+ .txn-card__bottom {
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+ gap: $spacing-3;
+ margin-top: $spacing-3;
+
+ .desc {
+ color: $text-secondary;
+ font-size: $font-size-sm;
+ flex: 1 1 auto;
+ min-width: 0;
+ overflow: hidden;
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ white-space: normal;
+ }
+ .date {
+ color: $text-muted;
+ font-size: $font-size-sm;
+ margin-left: $spacing-3;
+ white-space: nowrap;
+ flex: 0 0 auto;
+ margin-top: 2px;
+ }
+ }
+}
+
+/* Controls reused styles (scoped in cards component) */
+.input-controls {
+ display: flex;
+ flex-wrap: wrap;
+ gap: $spacing-3;
+ align-items: center;
+}
+
+.txn-search-container,
+.txn-filter-container {
+ position: relative;
+ width: 100%;
+ height: 36px;
+ min-width: 140px;
+
+ .search-input,
+ .filter-input {
+ width: 100%;
+ height: 100%;
+ padding: 8px 36px 8px 16px;
+ border: 1px solid $bg-gray;
+ border-radius: $radius-lg;
+ font-size: $font-size-sm;
+ background-color: $input-bg;
+ transition: border-color 0.2s ease;
+ box-sizing: border-box;
+
+ &::placeholder {
+ color: $text-muted;
+ }
+ &:focus {
+ outline: none;
+ border-color: $primary;
+ box-shadow: 0 0 0 3px $input-focus;
+ }
+ }
+}
+
+.txn-search-icon,
+.txn-filter-icon {
+ position: absolute;
+ right: 12px;
+ top: 50%;
+ transform: translateY(-50%);
+ width: 16px;
+ height: 16px;
+ color: $text-muted;
+ pointer-events: none;
+}
+
+.pagination-btn {
+ padding: 8px 12px;
+ border: 1px solid $border-light;
+ background-color: $bg-white;
+ color: $text-secondary;
+ border-radius: $radius-md;
+ cursor: pointer;
+ font-size: $font-size-sm;
+ font-weight: $font-medium;
+ transition: $transition-base;
+ min-width: 40px;
+ text-align: center;
+
+ &:hover:not(:disabled) {
+ background-color: $bg-light;
+ border-color: $border-medium;
+ }
+ &:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+ background-color: $input-bg;
+ }
+ &.active {
+ background-color: $primary;
+ color: #fff;
+ border-color: $primary;
+ }
+}
+
+.entries-text {
+ font-size: $font-size-sm;
+ color: $text-muted;
+ font-weight: $font-medium;
+}
diff --git a/assets/scss/_utilities.scss b/assets/scss/_utilities.scss
new file mode 100644
index 0000000..5f80f66
--- /dev/null
+++ b/assets/scss/_utilities.scss
@@ -0,0 +1,174 @@
+// Tier 0 Primitive #6 — Layout Utility Primitives
+// Migrated from webui/assets/scss/_utilities.scss
+// Provides .chip/.icon-button/.search-container + responsive visibility helpers — pure SCSS.
+@use './_vars' as *;
+
+// Chip Component - Reusable pill-shaped buttons
+.chip {
+ display: inline-flex;
+ align-items: center;
+ gap: $spacing-1;
+ padding: $spacing-1 $spacing-2;
+ border-radius: 999px;
+ background: $bg-white;
+ color: $text-secondary;
+ border: 1px solid $border-light;
+ box-shadow: $shadow-sm;
+ font-size: $font-size-xs;
+ font-weight: $font-medium;
+ cursor: pointer;
+ transition: all 0.2s ease;
+
+ @media (max-width: $breakpoint-sm) {
+ padding: 6px 8px;
+ font-size: 10px;
+ }
+
+ &:hover {
+ background: $bg-light;
+ color: $text-primary;
+ transform: translateY(-1px);
+ box-shadow: $shadow-md;
+ }
+
+ // Modifiers
+ &--primary {
+ background: $primary;
+ color: white;
+ border-color: $primary;
+
+ &:hover {
+ background: $primary-hover;
+ color: white;
+ }
+ }
+
+ &--report {
+ background: $accent-color;
+ color: white;
+ border-color: $accent-color;
+ }
+}
+
+.chip-icon {
+ width: 16px;
+ height: 16px;
+ flex-shrink: 0;
+
+ @media (max-width: $breakpoint-sm) {
+ width: 12px;
+ height: 12px;
+ }
+}
+
+// Search Container - Reusable search input wrapper
+.search-container {
+ display: flex;
+ flex-direction: row;
+ gap: 16px;
+ position: relative;
+ width: 100%;
+
+ @media (max-width: #{$breakpoint-lg - 1px}) {
+ width: auto;
+ gap: 8px;
+ }
+
+ @media (max-width: #{$breakpoint-md - 1px}) {
+ width: auto;
+ gap: 6px;
+ }
+
+ @media (max-width: $breakpoint-sm) {
+ gap: 8px;
+ }
+}
+
+// Responsive Display Utilities
+.only-mobile {
+ display: block;
+
+ @media (min-width: $breakpoint-md) {
+ display: none;
+ }
+}
+
+.only-tablet {
+ display: none;
+
+ @media (min-width: $breakpoint-md) and (max-width: #{$breakpoint-lg - 1px}) {
+ display: block;
+ }
+}
+
+.only-desktop {
+ display: none;
+
+ @media (min-width: $breakpoint-md) {
+ display: block;
+ }
+}
+
+// Hide on mobile
+.hide-mobile {
+ @media (max-width: #{$breakpoint-md - 1px}) {
+ display: none;
+ }
+}
+
+// Hide on tablet
+.hide-tablet {
+ @media (min-width: $breakpoint-md) and (max-width: #{$breakpoint-lg - 1px}) {
+ display: none;
+ }
+}
+
+// Hide on desktop
+.hide-desktop {
+ @media (min-width: $breakpoint-lg) {
+ display: none;
+ }
+}
+
+// Icon Button - Reusable icon-only button. Pill-friendly proportions, mode-aware.
+.icon-button {
+ display: inline-flex;
+ justify-content: center;
+ align-items: center;
+ padding: 0;
+ width: 28px;
+ height: 28px;
+ border-radius: 8px;
+ background-color: transparent;
+ border: 1px solid transparent;
+ color: $text-secondary;
+ cursor: pointer;
+ transition:
+ background-color $duration-fast $easing-standard,
+ color $duration-fast $easing-standard;
+
+ @media (max-width: $breakpoint-sm) {
+ width: 32px;
+ height: 32px;
+ }
+
+ &:hover {
+ background-color: var(--hover-overlay);
+ color: $text-primary;
+ }
+
+ &:active {
+ background-color: var(--press-overlay);
+ }
+
+ &:focus-visible {
+ outline: 2px solid $primary;
+ outline-offset: 2px;
+ }
+
+ .icon {
+ width: 16px;
+ height: 16px;
+ color: currentColor;
+ }
+}
diff --git a/components/AuthFooterLink.stories.js b/components/AuthFooterLink.stories.js
new file mode 100644
index 0000000..276e3db
--- /dev/null
+++ b/components/AuthFooterLink.stories.js
@@ -0,0 +1,15 @@
+import AuthFooterLink from './AuthFooterLink.vue';
+
+export default {
+ title: 'Primitives/AuthFooterLink',
+ component: AuthFooterLink,
+ args: { text: 'No account?', linkText: 'Sign up', to: '/register' },
+ argTypes: {
+ text: { control: 'text' },
+ linkText: { control: 'text' },
+ to: { control: 'text' },
+ },
+};
+
+export const Default = {};
+export const Login = { args: { text: 'Already have an account?', linkText: 'Log in', to: '/login' } };
diff --git a/components/AuthFooterLink.vue b/components/AuthFooterLink.vue
new file mode 100644
index 0000000..13846a2
--- /dev/null
+++ b/components/AuthFooterLink.vue
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
diff --git a/components/ComponentLoader.stories.js b/components/ComponentLoader.stories.js
new file mode 100644
index 0000000..ec4fe8a
--- /dev/null
+++ b/components/ComponentLoader.stories.js
@@ -0,0 +1,25 @@
+import ComponentLoader from './ComponentLoader.vue';
+
+export default {
+ title: 'Primitives/ComponentLoader',
+ component: ComponentLoader,
+ argTypes: {
+ isLoading: { control: 'boolean' },
+ hasData: { control: 'boolean' },
+ showEmpty: { control: 'boolean' },
+ emptyStateName: { control: 'text' },
+ skeletonVariant: { control: 'select', options: ['default', 'list', 'card', 'table'] },
+ },
+};
+
+export const Loading = { args: { isLoading: true, hasData: false, skeletonVariant: 'list', skeletonCount: 3 } };
+export const ErrorState = { args: { error: { message: 'Failed to load' }, isLoading: false, hasData: false, onRetry: () => alert('retry') } };
+export const Empty = { args: { hasData: false, isLoading: false, showEmpty: true, emptyStateName: 'wallets' } };
+export const WithData = {
+ render: (args) => ({
+ components: { ComponentLoader },
+ setup() { return { args }; },
+ template: `Content loaded
`,
+ }),
+ args: { hasData: true },
+};
diff --git a/components/ComponentLoader.vue b/components/ComponentLoader.vue
new file mode 100644
index 0000000..d2782b5
--- /dev/null
+++ b/components/ComponentLoader.vue
@@ -0,0 +1,197 @@
+
+
+
+
+
+
+
+
+ {{ errorTitle }} {{ getErrorCode(error) }}
+ {{ errorFallbackTitle }}
+
+
{{ formatErrorMessage(error) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/ContentCard.stories.js b/components/ContentCard.stories.js
new file mode 100644
index 0000000..7a64871
--- /dev/null
+++ b/components/ContentCard.stories.js
@@ -0,0 +1,60 @@
+import ContentCard from './ContentCard.vue';
+
+export default {
+ title: 'Components/ContentCard',
+ component: ContentCard,
+ tags: ['autodocs'],
+ argTypes: {
+ name: { control: 'text' },
+ description: { control: 'text' },
+ icon: { control: 'text' },
+ isDefault: { control: 'boolean' },
+ typeBadge: { control: 'text' },
+ typeBadgeLabel: { control: 'text' }
+ }
+};
+
+export const Default = {
+ args: {
+ name: 'Personal Wallet',
+ icon: 'Wallet',
+ description: 'Main everyday spending account',
+ editLabel: 'Edit wallet',
+ deleteLabel: 'Delete wallet'
+ }
+};
+
+export const DefaultItem = {
+ args: {
+ name: 'Primary Account',
+ icon: 'CreditCard',
+ description: 'Your default linked bank account',
+ isDefault: true,
+ defaultBadgeLabel: 'Default',
+ editLabel: 'Edit account',
+ deleteLabel: 'Delete account'
+ }
+};
+
+export const WithTypeBadge = {
+ args: {
+ name: 'Groceries',
+ icon: 'ShoppingCart',
+ description: 'Food and household items',
+ typeBadge: 'expense',
+ typeBadgeLabel: 'Expense',
+ editLabel: 'Edit category',
+ deleteLabel: 'Delete category'
+ }
+};
+
+export const WithoutIcon = {
+ args: {
+ name: 'Miscellaneous',
+ description: 'Uncategorized spending',
+ typeBadge: 'expense',
+ typeBadgeLabel: 'Expense',
+ editLabel: 'Edit',
+ deleteLabel: 'Delete'
+ }
+};
diff --git a/components/ContentCard.vue b/components/ContentCard.vue
new file mode 100644
index 0000000..fcd7ab6
--- /dev/null
+++ b/components/ContentCard.vue
@@ -0,0 +1,245 @@
+
+
+
+
+ {{ name }}
+
+ {{ defaultBadgeLabel }}
+
+
+
+
+
{{ description }}
+
+ {{ typeBadgeLabel || typeBadge }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/ContentCardGrid.stories.js b/components/ContentCardGrid.stories.js
new file mode 100644
index 0000000..3fb20a8
--- /dev/null
+++ b/components/ContentCardGrid.stories.js
@@ -0,0 +1,46 @@
+import ContentCardGrid from './ContentCardGrid.vue';
+
+export default {
+ title: 'Components/ContentCardGrid',
+ component: ContentCardGrid,
+ tags: ['autodocs'],
+};
+
+const wallets = [
+ { id: '1', name: 'Main Account', description: 'Primary HSBC current account', icon: 'Wallet', balance: '£4,320.00' },
+ { id: '2', name: 'Savings Pot', description: 'Emergency fund — target £10k', icon: 'PiggyBank' },
+ { id: '3', name: 'Investments', description: 'Stocks & ETFs via Freetrade', icon: 'TrendingUp' },
+ { id: '4', name: 'Cash', description: 'Physical wallet', icon: 'Banknote' },
+];
+
+export const Default = {
+ args: {
+ entities: wallets,
+ defaultItemId: '1',
+ defaultBadgeLabel: 'Default',
+ editLabel: 'Edit wallet',
+ deleteLabel: 'Delete wallet',
+ emptyText: 'No wallets yet.'
+ }
+};
+
+export const WithCardFields = {
+ args: {
+ entities: wallets.slice(0, 3),
+ defaultItemId: '1',
+ defaultBadgeLabel: 'Default',
+ editLabel: 'Edit',
+ deleteLabel: 'Delete',
+ cardFields: [
+ { key: 'balance', label: 'Balance' },
+ ],
+ emptyText: 'No wallets yet.'
+ }
+};
+
+export const Empty = {
+ args: {
+ entities: [],
+ emptyText: 'No wallets have been added yet.'
+ }
+};
diff --git a/components/ContentCardGrid.vue b/components/ContentCardGrid.vue
new file mode 100644
index 0000000..b895b87
--- /dev/null
+++ b/components/ContentCardGrid.vue
@@ -0,0 +1,299 @@
+
+
+
+
+
+
+ {{ entity.description }}
+
+
+
+
+ {{ field.label }}
+
+
+ {{ field.render(entity[field.key], entity) }}
+
+
+ {{ getCellValue(entity, field.key) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/ContentListView.stories.js b/components/ContentListView.stories.js
new file mode 100644
index 0000000..3b6bca8
--- /dev/null
+++ b/components/ContentListView.stories.js
@@ -0,0 +1,52 @@
+import ContentListView from './ContentListView.vue';
+
+export default {
+ title: 'Components/ContentListView',
+ component: ContentListView,
+ tags: ['autodocs'],
+ argTypes: {
+ initialView: { control: 'select', options: ['table', 'cards'] },
+ cardLayout: { control: 'select', options: ['grid', 'horizontal'] }
+ }
+};
+
+const sampleEntities = Array.from({ length: 25 }, (_, i) => ({
+ id: `cat-${i + 1}`,
+ name: `Category ${i + 1}`,
+ description: `Description for category ${i + 1}`,
+ type: i % 2 === 0 ? 'Expense' : 'Income',
+ icon: 'Folder'
+}));
+
+const sampleColumns = [
+ { key: 'name', label: 'Name', sortable: true },
+ { key: 'description', label: 'Description' },
+ { key: 'type', label: 'Type', sortable: true }
+];
+
+const sampleCardFields = [
+ { key: 'description', label: 'Details' },
+ { key: 'type', label: 'Type' }
+];
+
+export const TableView = {
+ args: {
+ pageName: 'Category',
+ pageNamePlural: 'Categories',
+ entities: sampleEntities,
+ columns: sampleColumns,
+ cardFields: sampleCardFields,
+ initialView: 'table'
+ }
+};
+
+export const CardsView = {
+ args: {
+ pageName: 'Category',
+ pageNamePlural: 'Categories',
+ entities: sampleEntities,
+ columns: sampleColumns,
+ cardFields: sampleCardFields,
+ initialView: 'cards'
+ }
+};
diff --git a/components/ContentListView.vue b/components/ContentListView.vue
new file mode 100644
index 0000000..59e6d29
--- /dev/null
+++ b/components/ContentListView.vue
@@ -0,0 +1,433 @@
+
+
+
+
+
+
+
+
+
diff --git a/components/ContentSection.stories.js b/components/ContentSection.stories.js
new file mode 100644
index 0000000..b1840d1
--- /dev/null
+++ b/components/ContentSection.stories.js
@@ -0,0 +1,76 @@
+import ContentSection from './ContentSection.vue';
+import TButton from './TButton.vue';
+import TCard from './TCard.vue';
+
+export default {
+ title: 'Components/ContentSection',
+ component: ContentSection,
+ tags: ['autodocs'],
+ argTypes: {
+ pageName: { control: 'text' },
+ pageNamePlural: { control: 'text' },
+ empty: { control: 'boolean' },
+ modelValue: { control: 'boolean' }
+ }
+};
+
+export const Default = {
+ args: {
+ pageName: 'Category',
+ pageNamePlural: 'Categories',
+ empty: false,
+ modelValue: false
+ },
+ render: (args) => ({
+ components: { ContentSection, TCard },
+ setup: () => ({ args }),
+ template: `
+
+
+ Table or card view mounts here in default slot.
+
+
+ `
+ })
+};
+
+export const EmptyStateExample = {
+ args: {
+ pageName: 'Wallet',
+ pageNamePlural: 'Wallets',
+ empty: true,
+ modelValue: false
+ }
+};
+
+export const WithSlottedForm = {
+ args: {
+ pageName: 'Group',
+ pageNamePlural: 'Groups',
+ modelValue: true
+ },
+ render: (args) => ({
+ components: { ContentSection, TCard, TButton },
+ setup: () => ({ args }),
+ template: `
+
+
+
+ Create New Group
+ Form inputs live here...
+
+
+
+
+
+
+
+
+ Tips
+ Organize wallets into groups for family or business.
+
+
+
+ `
+ })
+};
diff --git a/components/ContentSection.vue b/components/ContentSection.vue
new file mode 100644
index 0000000..2341c3d
--- /dev/null
+++ b/components/ContentSection.vue
@@ -0,0 +1,167 @@
+
+
+
+
+
+
+
diff --git a/components/ContentTable.stories.js b/components/ContentTable.stories.js
new file mode 100644
index 0000000..56ba4b2
--- /dev/null
+++ b/components/ContentTable.stories.js
@@ -0,0 +1,48 @@
+import ContentTable from './ContentTable.vue';
+
+export default {
+ title: 'Components/ContentTable',
+ component: ContentTable,
+ tags: ['autodocs'],
+};
+
+const entities = [
+ { id: '1', name: 'Food & Drink', icon: 'UtensilsCrossed', description: 'Restaurants, groceries, coffee' },
+ { id: '2', name: 'Transport', icon: 'Car', description: 'Fuel, public transit, ride-hailing' },
+ { id: '3', name: 'Healthcare', icon: 'HeartPulse', description: 'Pharmacy, appointments, insurance' },
+ { id: '4', name: 'Entertainment', icon: 'Tv2', description: 'Streaming, events, games' },
+ { id: '5', name: 'Salary', icon: 'Briefcase', description: 'Monthly net salary income' },
+];
+
+export const Default = {
+ args: {
+ entities,
+ defaultItemId: '5',
+ title: 'All Categories',
+ searchPlaceholder: 'Search categories...',
+ defaultBadgeLabel: 'Default',
+ editLabel: 'Edit category',
+ deleteLabel: 'Delete category',
+ emptyText: 'No categories found.',
+ columns: [
+ { key: 'name', label: 'Name' },
+ { key: 'description', label: 'Description' },
+ ]
+ }
+};
+
+export const Loading = {
+ args: {
+ ...Default.args,
+ isLoading: true,
+ entities: []
+ }
+};
+
+export const Empty = {
+ args: {
+ ...Default.args,
+ entities: [],
+ emptyText: 'No categories added yet.'
+ }
+};
diff --git a/components/ContentTable.vue b/components/ContentTable.vue
new file mode 100644
index 0000000..030aece
--- /dev/null
+++ b/components/ContentTable.vue
@@ -0,0 +1,504 @@
+
+
+
+
+
+
+
+
+
diff --git a/components/EmptyState.stories.js b/components/EmptyState.stories.js
new file mode 100644
index 0000000..4dc95f6
--- /dev/null
+++ b/components/EmptyState.stories.js
@@ -0,0 +1,46 @@
+import EmptyState from './EmptyState.vue';
+import { Wallet } from 'lucide-vue-next';
+
+export default {
+ title: 'Primitives/EmptyState',
+ component: EmptyState,
+ argTypes: {
+ title: { control: 'text' },
+ description: { control: 'text' },
+ actionLabel: { control: 'text' },
+ },
+};
+
+export const Default = {
+ args: {
+ title: 'No items found',
+ description: 'There are currently no items in this view.',
+ actionLabel: 'Add item',
+ },
+};
+
+export const Wallets = {
+ args: {
+ title: 'No wallets yet',
+ description: 'Please add at least one wallet to track your finances.',
+ actionLabel: 'Add wallet',
+ icon: Wallet,
+ },
+};
+
+export const CustomSlots = {
+ render: () => ({
+ components: { EmptyState },
+ template: `
+
+ Custom Slotted Title
+ This description is injected via slot.
+
+
+ Custom Action
+
+
+
+ `
+ })
+};
diff --git a/components/EmptyState.vue b/components/EmptyState.vue
new file mode 100644
index 0000000..4bf5ccc
--- /dev/null
+++ b/components/EmptyState.vue
@@ -0,0 +1,144 @@
+
+
+
+
+
+
+
+
+ {{ title }}
+
+
+ {{ description }}
+
+
+
+
+
+
+ {{ actionLabel }}
+
+
+
+
+
+
+
+
diff --git a/components/FormSection.stories.js b/components/FormSection.stories.js
new file mode 100644
index 0000000..97a7ddb
--- /dev/null
+++ b/components/FormSection.stories.js
@@ -0,0 +1,28 @@
+import FormSection from './FormSection.vue';
+
+const wallets = [
+ { id: 1, name: 'Main Bank Account', currency: 'USD' },
+ { id: 2, name: 'Cash Wallet', currency: 'USD' }
+];
+const categories = [
+ { id: 1, name: 'Food & Dining', type: 'expense' },
+ { id: 2, name: 'Salary', type: 'income' }
+];
+const groups = [{ id: 1, name: 'General' }];
+
+export default {
+ title: 'Domain/Transactions/FormSection',
+ component: FormSection,
+ args: {
+ isSubmitting: false,
+ wallets,
+ groups,
+ incomeCategories: categories.filter((c) => c.type === 'income'),
+ expenseCategories: categories.filter((c) => c.type === 'expense'),
+ defaultCurrency: 'USD',
+ defaultGroup: groups[0],
+ defaultWallet: wallets[0]
+ }
+};
+
+export const Default = {};
diff --git a/components/FormSection.vue b/components/FormSection.vue
new file mode 100644
index 0000000..4d570ff
--- /dev/null
+++ b/components/FormSection.vue
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
diff --git a/components/HamburgerMenu.stories.js b/components/HamburgerMenu.stories.js
new file mode 100644
index 0000000..47b1691
--- /dev/null
+++ b/components/HamburgerMenu.stories.js
@@ -0,0 +1,23 @@
+import HamburgerMenu from './HamburgerMenu.vue';
+
+export default {
+ title: 'Primitives/HamburgerMenu',
+ component: HamburgerMenu,
+ argTypes: {
+ isOpen: { control: 'boolean' },
+ },
+};
+
+export const Closed = { args: { isOpen: false } };
+export const Open = { args: { isOpen: true } };
+
+export const Interactive = {
+ render: (args) => ({
+ components: { HamburgerMenu },
+ setup() {
+ return { args };
+ },
+ template: ` `,
+ }),
+ args: { isOpen: false },
+};
diff --git a/components/HamburgerMenu.vue b/components/HamburgerMenu.vue
new file mode 100644
index 0000000..a0f481b
--- /dev/null
+++ b/components/HamburgerMenu.vue
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
diff --git a/components/IconPicker.stories.js b/components/IconPicker.stories.js
new file mode 100644
index 0000000..56ccca5
--- /dev/null
+++ b/components/IconPicker.stories.js
@@ -0,0 +1,43 @@
+import IconPicker from './IconPicker.vue';
+import { ref } from 'vue';
+
+export default {
+ title: 'Components/IconPicker',
+ component: IconPicker,
+ tags: ['autodocs'],
+ argTypes: {
+ modelValue: { control: 'text' },
+ placeholder: { control: 'text' }
+ }
+};
+
+export const Default = {
+ render: () => ({
+ components: { IconPicker },
+ setup() {
+ const selected = ref('Wallet');
+ return { selected };
+ },
+ template: `
+
+
+
Selected icon: {{ selected }}
+
+ `
+ })
+};
+
+export const Empty = {
+ render: () => ({
+ components: { IconPicker },
+ setup() {
+ const selected = ref('');
+ return { selected };
+ },
+ template: `
+
+
+
+ `
+ })
+};
diff --git a/components/IconPicker.vue b/components/IconPicker.vue
new file mode 100644
index 0000000..f375de6
--- /dev/null
+++ b/components/IconPicker.vue
@@ -0,0 +1,363 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/LanguageSelector.stories.js b/components/LanguageSelector.stories.js
new file mode 100644
index 0000000..35644a5
--- /dev/null
+++ b/components/LanguageSelector.stories.js
@@ -0,0 +1,10 @@
+import LanguageSelector from './LanguageSelector.vue';
+
+export default {
+ title: 'Components/LanguageSelector',
+ component: LanguageSelector,
+ tags: ['autodocs'],
+ parameters: { layout: 'centered' }
+};
+
+export const Default = {};
diff --git a/components/LanguageSelector.vue b/components/LanguageSelector.vue
new file mode 100644
index 0000000..9532fd0
--- /dev/null
+++ b/components/LanguageSelector.vue
@@ -0,0 +1,178 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ lang.name }}
+
+
+
+
+
+
+
+
+
+
diff --git a/components/LoadingSkeleton.stories.js b/components/LoadingSkeleton.stories.js
new file mode 100644
index 0000000..f52d7ff
--- /dev/null
+++ b/components/LoadingSkeleton.stories.js
@@ -0,0 +1,16 @@
+import LoadingSkeleton from './LoadingSkeleton.vue';
+
+export default {
+ title: 'Primitives/LoadingSkeleton',
+ component: LoadingSkeleton,
+ argTypes: {
+ variant: { control: 'select', options: ['default', 'list', 'card', 'table'] },
+ count: { control: 'number' },
+ columns: { control: 'number' },
+ },
+};
+
+export const Default = { args: { variant: 'default', count: 3 } };
+export const List = { args: { variant: 'list', count: 3 } };
+export const Card = { args: { variant: 'card' } };
+export const Table = { args: { variant: 'table', count: 3, columns: 4 } };
diff --git a/components/LoadingSkeleton.vue b/components/LoadingSkeleton.vue
new file mode 100644
index 0000000..2b2e155
--- /dev/null
+++ b/components/LoadingSkeleton.vue
@@ -0,0 +1,204 @@
+
+
+
+
+
+
+
diff --git a/components/LoginCard.stories.js b/components/LoginCard.stories.js
new file mode 100644
index 0000000..812fa7b
--- /dev/null
+++ b/components/LoginCard.stories.js
@@ -0,0 +1,16 @@
+import LoginCard from './LoginCard.vue';
+
+export default {
+ title: 'Domain/Auth/LoginCard',
+ component: LoginCard,
+ args: {
+ loading: false,
+ registerTo: '/register'
+ }
+};
+
+export const Default = {};
+
+export const Loading = {
+ args: { loading: true }
+};
diff --git a/components/LoginCard.vue b/components/LoginCard.vue
new file mode 100644
index 0000000..0894089
--- /dev/null
+++ b/components/LoginCard.vue
@@ -0,0 +1,208 @@
+
+
+
+
+
+
+
diff --git a/components/Logo.stories.js b/components/Logo.stories.js
new file mode 100644
index 0000000..51ad762
--- /dev/null
+++ b/components/Logo.stories.js
@@ -0,0 +1,26 @@
+import Logo from './Logo.vue';
+
+export default {
+ title: 'Primitives/Logo',
+ component: Logo,
+ argTypes: {
+ size: { control: 'select', options: ['small', 'medium', 'large'] },
+ alt: { control: 'text' },
+ },
+};
+
+export const Small = { args: { size: 'small' } };
+export const Medium = { args: { size: 'medium' } };
+export const Large = { args: { size: 'large' } };
+
+export const AllSizes = {
+ render: () => ({
+ components: { Logo },
+ template: `
+
+
+
+
+
`,
+ }),
+};
diff --git a/components/Logo.vue b/components/Logo.vue
new file mode 100644
index 0000000..318b9b2
--- /dev/null
+++ b/components/Logo.vue
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
diff --git a/components/NotificationBell.stories.js b/components/NotificationBell.stories.js
new file mode 100644
index 0000000..3f7cb2c
--- /dev/null
+++ b/components/NotificationBell.stories.js
@@ -0,0 +1,83 @@
+import NotificationBell from './NotificationBell.vue';
+import { ref } from 'vue';
+
+export default {
+ title: 'Components/NotificationBell',
+ component: NotificationBell,
+ tags: ['autodocs']
+};
+
+const sampleNotifications = [
+ {
+ id: '1',
+ title: 'Monthly statement ready',
+ body: 'Your statement for August has been processed.',
+ created_at: new Date().toISOString(),
+ type: 'info',
+ read_at: null
+ },
+ {
+ id: '2',
+ title: 'Budget alert',
+ body: 'You have reached 85% of your dining budget.',
+ created_at: new Date(Date.now() - 3600000).toISOString(),
+ type: 'warning',
+ read_at: null
+ },
+ {
+ id: '3',
+ title: 'Recurring transaction logged',
+ body: 'Spotify subscription $9.99 paid.',
+ created_at: new Date(Date.now() - 86400000).toISOString(),
+ type: 'success',
+ read_at: new Date().toISOString()
+ }
+];
+
+export const Default = {
+ render: () => ({
+ components: { NotificationBell },
+ setup() {
+ const notifications = ref(sampleNotifications);
+ const unreadCount = ref(2);
+
+ const handleMarkRead = (id) => {
+ const item = notifications.value.find((n) => n.id === id);
+ if (item && !item.read_at) {
+ item.read_at = new Date().toISOString();
+ unreadCount.value = Math.max(0, unreadCount.value - 1);
+ }
+ };
+
+ const handleMarkAllRead = () => {
+ notifications.value.forEach((n) => {
+ n.read_at = new Date().toISOString();
+ });
+ unreadCount.value = 0;
+ };
+
+ return { notifications, unreadCount, handleMarkRead, handleMarkAllRead };
+ },
+ template: `
+
+
+
+ `
+ })
+};
+
+export const Empty = {
+ render: () => ({
+ components: { NotificationBell },
+ template: `
+
+
+
+ `
+ })
+};
diff --git a/components/NotificationBell.vue b/components/NotificationBell.vue
new file mode 100644
index 0000000..ba93ccd
--- /dev/null
+++ b/components/NotificationBell.vue
@@ -0,0 +1,323 @@
+
+
+
+
+
+
+ {{ unreadCount > 99 ? '99+' : unreadCount }}
+
+
+
+
+
+
+
+
+
+
+
{{ t('Loading...') }}
+
+
+
+
+
{{ t('No notifications yet') }}
+
+
+
+
+
+
+
+
+
{{ notification.title }}
+
{{ truncateText(notification.body, 60) }}
+
{{ formatTime(notification.created_at) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/NotificationsContainer.stories.js b/components/NotificationsContainer.stories.js
new file mode 100644
index 0000000..fa67139
--- /dev/null
+++ b/components/NotificationsContainer.stories.js
@@ -0,0 +1,43 @@
+import NotificationsContainer from './NotificationsContainer.vue';
+import TButton from './TButton.vue';
+import { useNotifications } from '../composables/useNotifications';
+
+export default {
+ title: 'Components/NotificationsContainer',
+ component: NotificationsContainer,
+ tags: ['autodocs'],
+ parameters: { layout: 'fullscreen' }
+};
+
+export const Interactive = {
+ render: () => ({
+ components: { NotificationsContainer, TButton },
+ setup() {
+ const { showSuccess, showError, showWarning, showInfo, showConfirm } = useNotifications();
+
+ const triggerSuccess = () => showSuccess('Saved successfully', 'Your settings have been synced.');
+ const triggerError = () => showError('Failed to update', 'An unknown network error occurred.');
+ const triggerWarning = () => showWarning('Unsaved Changes', 'Please save before navigating away.');
+ const triggerInfo = () => showInfo('Update Available', 'A new version of the application is ready.');
+ const triggerConfirm = () => showConfirm({
+ title: 'Delete Item?',
+ message: 'This will permanently remove the record.',
+ type: 'danger'
+ });
+
+ return { triggerSuccess, triggerError, triggerWarning, triggerInfo, triggerConfirm };
+ },
+ template: `
+
+ `
+ })
+};
diff --git a/components/NotificationsContainer.vue b/components/NotificationsContainer.vue
new file mode 100644
index 0000000..17948e6
--- /dev/null
+++ b/components/NotificationsContainer.vue
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
{{ notification.title }}
+
{{ notification.message }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/PartiesForm.stories.js b/components/PartiesForm.stories.js
new file mode 100644
index 0000000..fd390b0
--- /dev/null
+++ b/components/PartiesForm.stories.js
@@ -0,0 +1,25 @@
+import PartiesForm from './PartiesForm.vue';
+
+export default {
+ title: 'Domain/Parties/PartiesForm',
+ component: PartiesForm,
+ args: {
+ editingItem: null,
+ apiError: '',
+ isSubmitting: false
+ }
+};
+
+export const Create = {};
+
+export const Edit = {
+ args: {
+ editingItem: {
+ id: 1,
+ name: 'Grocery Store',
+ type: 'organization',
+ description: 'Weekly groceries',
+ icon: 'Store'
+ }
+ }
+};
diff --git a/components/PartiesForm.vue b/components/PartiesForm.vue
new file mode 100644
index 0000000..682fb76
--- /dev/null
+++ b/components/PartiesForm.vue
@@ -0,0 +1,281 @@
+
+
+
+
+
+
+
diff --git a/components/PartyCard.stories.js b/components/PartyCard.stories.js
new file mode 100644
index 0000000..3d8e39a
--- /dev/null
+++ b/components/PartyCard.stories.js
@@ -0,0 +1,48 @@
+import PartyCard from './PartyCard.vue';
+
+export default {
+ title: 'Domain/Parties/PartyCard',
+ component: PartyCard,
+ args: {
+ party: {
+ id: 1,
+ name: 'Acme Corporation',
+ type: 'business',
+ description: 'Primary supplier for cloud infrastructure and hosting services.',
+ receivedAmount: 0,
+ spentAmount: 3450.0,
+ lastUpdated: new Date(Date.now() - 3600000 * 5).toISOString()
+ },
+ currency: 'USD'
+ }
+};
+
+export const BusinessVendor = {};
+
+export const IndividualClient = {
+ args: {
+ party: {
+ id: 2,
+ name: 'Sarah Jenkins',
+ type: 'client',
+ description: 'Consulting client - monthly retainer.',
+ receivedAmount: 5200.0,
+ spentAmount: 150.0,
+ lastUpdated: new Date(Date.now() - 3600000 * 24 * 2).toISOString()
+ }
+ }
+};
+
+export const InactiveParty = {
+ args: {
+ party: {
+ id: 3,
+ name: 'Legacy Partner',
+ type: 'organization',
+ description: 'No transactions in current period.',
+ receivedAmount: 0,
+ spentAmount: 0,
+ lastUpdated: null
+ }
+ }
+};
diff --git a/components/PartyCard.vue b/components/PartyCard.vue
new file mode 100644
index 0000000..162f29b
--- /dev/null
+++ b/components/PartyCard.vue
@@ -0,0 +1,400 @@
+
+
+
+
+
+
+
+
+
{{ party.name }}
+
+
+ {{ displayPartyType }}
+
+
+
{{ party.description }}
+
+
+
+
+
+
+ {{ t('Received') }}
+ {{ receivedDisplay }}
+
+
+
+
+
+ {{ t('Spent') }}
+ {{ spentDisplay }}
+
+
+
+
+
+
+ {{ t('Last activity') }}: {{ formatLastUpdated(party.lastUpdated) }}
+
+
+
+
+
+
+
+
diff --git a/components/PartyCardList.stories.js b/components/PartyCardList.stories.js
new file mode 100644
index 0000000..dc158f4
--- /dev/null
+++ b/components/PartyCardList.stories.js
@@ -0,0 +1,58 @@
+import PartyCardList from './PartyCardList.vue';
+
+const sampleParties = [
+ {
+ id: 1,
+ name: 'Acme Corp',
+ type: 'business',
+ description: 'Cloud services and server infrastructure vendor.',
+ receivedAmount: 0,
+ spentAmount: 4200.0,
+ lastUpdated: new Date(Date.now() - 3600000 * 2).toISOString()
+ },
+ {
+ id: 2,
+ name: 'Alice Johnson',
+ type: 'client',
+ description: 'Design consulting retainer.',
+ receivedAmount: 6800.0,
+ spentAmount: 120.0,
+ lastUpdated: new Date(Date.now() - 3600000 * 24).toISOString()
+ },
+ {
+ id: 3,
+ name: 'Robert Davis',
+ type: 'individual',
+ description: 'Subcontractor - mobile developer.',
+ receivedAmount: 0,
+ spentAmount: 2500.0,
+ lastUpdated: new Date(Date.now() - 3600000 * 48).toISOString()
+ },
+ {
+ id: 4,
+ name: 'SaaS Tooling Inc',
+ type: 'vendor',
+ description: 'Analytics and error monitoring licenses.',
+ receivedAmount: 0,
+ spentAmount: 890.0,
+ lastUpdated: new Date(Date.now() - 3600000 * 72).toISOString()
+ }
+];
+
+export default {
+ title: 'Domain/Parties/PartyCardList',
+ component: PartyCardList,
+ args: {
+ title: 'All Contacts & Parties',
+ parties: sampleParties,
+ currency: 'USD'
+ }
+};
+
+export const Default = {};
+
+export const EmptyState = {
+ args: {
+ parties: []
+ }
+};
diff --git a/components/PartyCardList.vue b/components/PartyCardList.vue
new file mode 100644
index 0000000..e49e12d
--- /dev/null
+++ b/components/PartyCardList.vue
@@ -0,0 +1,189 @@
+
+
+
+
+
+
$emit('menu', p)"
+ @edit="(p) => $emit('edit', p)"
+ @delete="(p) => $emit('delete', p)"
+ @view="(p) => $emit('view', p)"
+ />
+
+
+
+
+ {{ t('No parties found. Create your first party to get started.') }}
+
+
+ {{ t('No parties match your search criteria. Try adjusting your search or filters.') }}
+
+
+
+
+
+
+
+
diff --git a/components/RegisterCard.stories.js b/components/RegisterCard.stories.js
new file mode 100644
index 0000000..3aaac87
--- /dev/null
+++ b/components/RegisterCard.stories.js
@@ -0,0 +1,16 @@
+import RegisterCard from './RegisterCard.vue';
+
+export default {
+ title: 'Domain/Auth/RegisterCard',
+ component: RegisterCard,
+ args: {
+ loading: false,
+ loginTo: '/login'
+ }
+};
+
+export const Default = {};
+
+export const Loading = {
+ args: { loading: true }
+};
diff --git a/components/RegisterCard.vue b/components/RegisterCard.vue
new file mode 100644
index 0000000..864f4e1
--- /dev/null
+++ b/components/RegisterCard.vue
@@ -0,0 +1,231 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('Register') }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/SearchInput.stories.js b/components/SearchInput.stories.js
new file mode 100644
index 0000000..48f099f
--- /dev/null
+++ b/components/SearchInput.stories.js
@@ -0,0 +1,21 @@
+import SearchInput from './SearchInput.vue';
+
+export default {
+ title: 'Primitives/SearchInput',
+ component: SearchInput,
+ argTypes: {
+ placeholder: { control: 'text' },
+ debounce: { control: 'number' },
+ },
+};
+
+export const Default = { args: { placeholder: 'Search...', debounce: 300 } };
+export const CustomPlaceholder = { args: { placeholder: 'Find wallets...' } };
+export const Interactive = {
+ render: (args) => ({
+ components: { SearchInput },
+ setup() { return { args }; },
+ template: ` `,
+ }),
+ args: { modelValue: '', placeholder: 'Search...' },
+};
diff --git a/components/SearchInput.vue b/components/SearchInput.vue
new file mode 100644
index 0000000..fc56117
--- /dev/null
+++ b/components/SearchInput.vue
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/SearchableDropdown.stories.js b/components/SearchableDropdown.stories.js
new file mode 100644
index 0000000..74913d3
--- /dev/null
+++ b/components/SearchableDropdown.stories.js
@@ -0,0 +1,78 @@
+import SearchableDropdown from './SearchableDropdown.vue';
+import { ref } from 'vue';
+
+export default {
+ title: 'Components/SearchableDropdown',
+ component: SearchableDropdown,
+ tags: ['autodocs'],
+ argTypes: {
+ label: { control: 'text' },
+ placeholder: { control: 'text' },
+ multiple: { control: 'boolean' }
+ }
+};
+
+const sampleOptions = [
+ { id: '1', name: 'Groceries' },
+ { id: '2', name: 'Rent & Mortgage' },
+ { id: '3', name: 'Dining Out' },
+ { id: '4', name: 'Entertainment' },
+ { id: '5', name: 'Investments' },
+ { id: '6', name: 'Utilities' },
+ { id: '7', name: 'Healthcare' }
+];
+
+export const SingleSelect = {
+ render: (args) => ({
+ components: { SearchableDropdown },
+ setup() {
+ const selected = ref('');
+ return { args, sampleOptions, selected };
+ },
+ template: `
+
+
+
Selected: {{ selected }}
+
+ `
+ })
+};
+
+export const MultiSelect = {
+ render: (args) => ({
+ components: { SearchableDropdown },
+ setup() {
+ const selectedIds = ref(['1', '3']);
+ return { args, sampleOptions, selectedIds };
+ },
+ template: `
+
+
+
Selected IDs: {{ selectedIds }}
+
+ `
+ })
+};
+
+export const WithError = {
+ args: {
+ label: 'Account',
+ placeholder: 'Choose account...',
+ options: sampleOptions,
+ error: 'This field is required'
+ }
+};
diff --git a/components/SearchableDropdown.vue b/components/SearchableDropdown.vue
new file mode 100644
index 0000000..c85b48b
--- /dev/null
+++ b/components/SearchableDropdown.vue
@@ -0,0 +1,461 @@
+
+
+
{{ label }}
+
+
+
+
+
+
+
+
+ {{ part.text }}
+
+
+
+
+
+
+
{{ error }}
+
+
+
+
+
+
diff --git a/components/StatsFilterModal.stories.js b/components/StatsFilterModal.stories.js
new file mode 100644
index 0000000..166cbdc
--- /dev/null
+++ b/components/StatsFilterModal.stories.js
@@ -0,0 +1,47 @@
+import StatsFilterModal from './StatsFilterModal.vue';
+import TButton from './TButton.vue';
+import { ref } from 'vue';
+
+export default {
+ title: 'Components/StatsFilterModal',
+ component: StatsFilterModal,
+ tags: ['autodocs']
+};
+
+const sampleWallets = [
+ { id: '1', name: 'Main Account', currency: 'GBP' },
+ { id: '2', name: 'Savings Pot', currency: 'GBP' },
+ { id: '3', name: 'Euro Travel Wallet', currency: 'EUR' }
+];
+
+export const Interactive = {
+ render: () => ({
+ components: { StatsFilterModal, TButton },
+ setup() {
+ const isOpen = ref(true);
+ const appliedFilters = ref(null);
+
+ const handleApply = (filters) => {
+ appliedFilters.value = filters;
+ isOpen.value = false;
+ };
+
+ return { isOpen, sampleWallets, appliedFilters, handleApply };
+ },
+ template: `
+
+
+
+
+ Applied: {{ appliedFilters }}
+
+
+ `
+ })
+};
diff --git a/components/StatsFilterModal.vue b/components/StatsFilterModal.vue
new file mode 100644
index 0000000..2bbf35d
--- /dev/null
+++ b/components/StatsFilterModal.vue
@@ -0,0 +1,416 @@
+
+
+
+
+
+
+
+
+
+
{{ t('Date Range') }}
+
+
+
+ {{ t(preset.label) }}
+
+
+
+
+
+
{{ t('Wallets') }}
+
+
+
+ {{ wallet.name }}
+
+ {{ wallet.currency }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/TAvatar.stories.js b/components/TAvatar.stories.js
new file mode 100644
index 0000000..951cf68
--- /dev/null
+++ b/components/TAvatar.stories.js
@@ -0,0 +1,44 @@
+import TAvatar from './TAvatar.vue';
+import { User, Bell, LifeBuoy } from 'lucide-vue-next';
+
+export default {
+ title: 'Primitives/TAvatar',
+ component: TAvatar,
+ argTypes: {
+ imageUrl: { control: 'text' },
+ userName: { control: 'text' },
+ showName: { control: 'boolean' },
+ showDropdown: { control: 'boolean' },
+ },
+};
+
+export const Default = {
+ args: {
+ imageUrl: 'https://i.pravatar.cc/100?img=1',
+ user: { first_name: 'John', last_name: 'Doe', email: 'john@example.com', is_admin: true },
+ userName: 'John Doe',
+ showName: true,
+ },
+};
+
+export const CustomItems = {
+ args: {
+ imageUrl: 'https://i.pravatar.cc/100?img=3',
+ user: { first_name: 'Alice', last_name: 'Smith', email: 'alice@plugin.org' },
+ userName: 'Alice Smith',
+ showName: true,
+ items: [
+ { id: 'profile', label: 'My Profile', icon: User },
+ { id: 'notifications', label: 'Notification Preferences', icon: Bell },
+ { id: 'support', label: 'Get Support', icon: LifeBuoy },
+ { id: 'exit', label: 'Switch Tenant', danger: true }
+ ]
+ }
+};
+
+export const WithoutDropdown = {
+ args: {
+ imageUrl: 'https://i.pravatar.cc/100?img=2',
+ showDropdown: false
+ }
+};
diff --git a/components/TAvatar.vue b/components/TAvatar.vue
new file mode 100644
index 0000000..98428f6
--- /dev/null
+++ b/components/TAvatar.vue
@@ -0,0 +1,275 @@
+
+
+
+
+
+ {{ userName }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/TDashboardTopCard.stories.js b/components/TDashboardTopCard.stories.js
new file mode 100644
index 0000000..2bffd00
--- /dev/null
+++ b/components/TDashboardTopCard.stories.js
@@ -0,0 +1,36 @@
+import TDashboardTopCard from './TDashboardTopCard.vue';
+import { ref } from 'vue';
+
+export default {
+ title: 'Components/TDashboardTopCard',
+ component: TDashboardTopCard,
+ tags: ['autodocs'],
+ argTypes: {
+ title: { control: 'text' },
+ subtitle: { control: 'text' },
+ showFilters: { control: 'boolean' }
+ }
+};
+
+const sampleWallets = [
+ { id: '1', name: 'Main Checking', currency: 'USD' },
+ { id: '2', name: 'Savings Pot', currency: 'USD' }
+];
+
+export const Default = {
+ render: () => ({
+ components: { TDashboardTopCard },
+ setup() {
+ const period = ref('current_month');
+ return { period, sampleWallets };
+ },
+ template: `
+
+
+
+ `
+ })
+};
diff --git a/components/TDashboardTopCard.vue b/components/TDashboardTopCard.vue
new file mode 100644
index 0000000..dec024f
--- /dev/null
+++ b/components/TDashboardTopCard.vue
@@ -0,0 +1,310 @@
+
+
+
+
+
+
+
{{ title || t('Overview') }}
+
+ {{ subtitle || t('Showing {period}.', { period: currentPeriodLabel }) }}
+
+
+
+
+
+
+
+
+ {{ t(period.label) }}
+
+
+
+ {{ t('Custom') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/TInput.stories.js b/components/TInput.stories.js
new file mode 100644
index 0000000..8242b47
--- /dev/null
+++ b/components/TInput.stories.js
@@ -0,0 +1,65 @@
+import TInput from './TInput.vue';
+import { Mail, Eye } from 'lucide-vue-next';
+
+export default {
+ title: 'Primitives/TInput',
+ component: TInput,
+ argTypes: {
+ size: { control: 'select', options: ['small', 'medium', 'large'] },
+ disabled: { control: 'boolean' },
+ error: { control: 'boolean' },
+ fullWidth: { control: 'boolean' },
+ placeholder: { control: 'text' },
+ type: { control: 'text' }
+ }
+};
+
+export const Default = {
+ args: {
+ placeholder: 'Enter text...'
+ }
+};
+
+export const WithPrefix = {
+ render: (args) => ({
+ components: { TInput, Mail },
+ setup() { return { args }; },
+ template: `
+
+
+
+
+
+ `
+ })
+};
+
+export const WithSuffix = {
+ render: (args) => ({
+ components: { TInput, Eye },
+ setup() { return { args }; },
+ template: `
+
+
+
+
+
+ `
+ })
+};
+
+export const ErrorState = {
+ args: {
+ placeholder: 'Invalid entry',
+ error: true,
+ modelValue: 'invalid-email'
+ }
+};
+
+export const Disabled = {
+ args: {
+ placeholder: 'Disabled input',
+ disabled: true,
+ modelValue: 'Cannot edit'
+ }
+};
diff --git a/components/TInput.vue b/components/TInput.vue
new file mode 100644
index 0000000..fe0bb65
--- /dev/null
+++ b/components/TInput.vue
@@ -0,0 +1,228 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/TTableComponent.stories.js b/components/TTableComponent.stories.js
new file mode 100644
index 0000000..8a3e4e5
--- /dev/null
+++ b/components/TTableComponent.stories.js
@@ -0,0 +1,97 @@
+import TTableComponent from './TTableComponent.vue';
+import { ref } from 'vue';
+
+export default {
+ title: 'Components/TTableComponent',
+ component: TTableComponent,
+ tags: ['autodocs'],
+ argTypes: {
+ title: { control: 'text' },
+ showHeader: { control: 'boolean' },
+ showSearch: { control: 'boolean' },
+ showTotals: { control: 'boolean' },
+ showPagination: { control: 'boolean' }
+ }
+};
+
+const sampleTransactions = [
+ {
+ id: 1,
+ date: '2026-09-01',
+ time: '14:30',
+ type: 'EXPENSE',
+ party: 'Whole Foods Market',
+ amount: '84.50 USD',
+ category: 'Groceries'
+ },
+ {
+ id: 2,
+ date: '2026-09-02',
+ time: '09:15',
+ type: 'INCOME',
+ party: 'Acme Corp',
+ amount: '3200.00 USD',
+ category: 'Salary'
+ },
+ {
+ id: 3,
+ date: '2026-09-03',
+ time: '19:45',
+ type: 'EXPENSE',
+ party: 'Starbucks',
+ amount: '6.75 USD',
+ category: 'Coffee',
+ isRecurring: true
+ },
+ {
+ id: 4,
+ date: '2026-09-04',
+ time: '11:00',
+ type: 'EXPENSE',
+ party: 'Apex Gym',
+ amount: '65.00 USD',
+ category: 'Fitness',
+ isRecurring: true
+ },
+ {
+ id: 5,
+ date: '2026-09-05',
+ time: '16:20',
+ type: 'INCOME',
+ party: 'Refund Service',
+ amount: '45.00 USD',
+ category: 'Shopping',
+ isRefund: true
+ }
+];
+
+export const Default = {
+ render: (args) => ({
+ components: { TTableComponent },
+ setup() {
+ const search = ref('');
+ const page = ref(1);
+ return { args, sampleTransactions, search, page };
+ },
+ template: `
+
+
+
+ `
+ })
+};
+
+export const Empty = {
+ args: {
+ transactions: [],
+ totalEntries: 0,
+ emptyText: 'No transactions recorded for this period'
+ }
+};
diff --git a/components/TTableComponent.vue b/components/TTableComponent.vue
new file mode 100644
index 0000000..eb9230b
--- /dev/null
+++ b/components/TTableComponent.vue
@@ -0,0 +1,661 @@
+
+
+
+
+ {{ title || t('All Transactions') }}
+
+
+
+
+
+ {{ activeFilterCount }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/TTopCard.stories.js b/components/TTopCard.stories.js
new file mode 100644
index 0000000..682aef3
--- /dev/null
+++ b/components/TTopCard.stories.js
@@ -0,0 +1,53 @@
+import TTopCard from './TTopCard.vue';
+import TButton from './TButton.vue';
+
+export default {
+ title: 'Components/TTopCard',
+ component: TTopCard,
+ tags: ['autodocs'],
+ argTypes: {
+ pageName: { control: 'text' },
+ pageNamePlural: { control: 'text' },
+ showAddButton: { control: 'boolean' },
+ showInfoButton: { control: 'boolean' },
+ buttonText: { control: 'text' }
+ }
+};
+
+export const Wallets = {
+ args: {
+ pageName: 'Wallet',
+ pageNamePlural: 'Wallets',
+ showAddButton: true,
+ showInfoButton: true
+ }
+};
+
+export const Transactions = {
+ args: {
+ pageName: 'Transaction',
+ pageNamePlural: 'Transactions',
+ buttonText: 'New Transaction',
+ showAddButton: true,
+ showInfoButton: true
+ }
+};
+
+export const WithCustomActions = {
+ args: {
+ pageName: 'Category',
+ pageNamePlural: 'Categories',
+ showAddButton: true
+ },
+ render: (args) => ({
+ components: { TTopCard, TButton },
+ setup: () => ({ args }),
+ template: `
+
+
+
+
+
+ `
+ })
+};
diff --git a/components/TTopCard.vue b/components/TTopCard.vue
new file mode 100644
index 0000000..8eb256a
--- /dev/null
+++ b/components/TTopCard.vue
@@ -0,0 +1,334 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/TTransactionCard.stories.js b/components/TTransactionCard.stories.js
new file mode 100644
index 0000000..86ad4e0
--- /dev/null
+++ b/components/TTransactionCard.stories.js
@@ -0,0 +1,33 @@
+import TTransactionCard from './TTransactionCard.vue';
+
+export default {
+ title: 'Components/TTransactionCard',
+ component: TTransactionCard,
+ tags: ['autodocs']
+};
+
+const sampleStats = {
+ transaction_count: 124,
+ total_income: 8450.0,
+ total_expenses: 3210.5,
+ total_balance: 5239.5,
+ income_insights: {
+ biggest_source: {
+ party: 'Acme Corp Payroll',
+ amount: 4500.0
+ }
+ },
+ expense_insights: {
+ biggest_expense: {
+ party: 'Apartment Rent',
+ amount: 1400.0
+ }
+ }
+};
+
+export const Default = {
+ args: {
+ statistics: sampleStats,
+ currency: 'USD'
+ }
+};
diff --git a/components/TTransactionCard.vue b/components/TTransactionCard.vue
new file mode 100644
index 0000000..83516ef
--- /dev/null
+++ b/components/TTransactionCard.vue
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ t('Top Income Source') }}
+
+
+
+ {{ statistics.income_insights.biggest_source.party }}
+
+
+ {{ formatAmount(statistics.income_insights.biggest_source.amount) }}
+
+
+
+
+
+
+
+
{{ t('Biggest Expense') }}
+
+
+
+ {{ statistics.expense_insights.biggest_expense.party }}
+
+
+ {{ formatAmount(statistics.expense_insights.biggest_expense.amount) }}
+
+
+
+
+
+
+
+
+
+
diff --git a/components/TTransactionSubCard.stories.js b/components/TTransactionSubCard.stories.js
new file mode 100644
index 0000000..f6c860f
--- /dev/null
+++ b/components/TTransactionSubCard.stories.js
@@ -0,0 +1,30 @@
+import TTransactionSubCard from './TTransactionSubCard.vue';
+
+export default {
+ title: 'Components/TTransactionSubCard',
+ component: TTransactionSubCard,
+ tags: ['autodocs'],
+ argTypes: {
+ title: { control: 'text' },
+ text: { control: 'text' },
+ currency: { control: 'text' },
+ titleColor: { control: 'color' },
+ textColor: { control: 'color' }
+ }
+};
+
+export const Default = {
+ args: {
+ title: '142',
+ text: 'Total Transactions'
+ }
+};
+
+export const WithCurrency = {
+ args: {
+ title: '3,450',
+ currency: 'USD',
+ text: 'Total Volume',
+ titleColor: 'var(--color-primary)'
+ }
+};
diff --git a/components/TTransactionSubCard.vue b/components/TTransactionSubCard.vue
new file mode 100644
index 0000000..7bab552
--- /dev/null
+++ b/components/TTransactionSubCard.vue
@@ -0,0 +1,100 @@
+
+
+
+
+ {{ title }}{{ currency }}
+
+ {{ text }}
+
+
+
+
+
+
+
diff --git a/components/ThemeSelector.stories.js b/components/ThemeSelector.stories.js
new file mode 100644
index 0000000..b2053a8
--- /dev/null
+++ b/components/ThemeSelector.stories.js
@@ -0,0 +1,10 @@
+import ThemeSelector from './ThemeSelector.vue';
+
+export default {
+ title: 'Components/ThemeSelector',
+ component: ThemeSelector,
+ tags: ['autodocs'],
+ parameters: { layout: 'centered' }
+};
+
+export const Default = {};
diff --git a/components/ThemeSelector.vue b/components/ThemeSelector.vue
new file mode 100644
index 0000000..bcb41a6
--- /dev/null
+++ b/components/ThemeSelector.vue
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t(option.label) }}
+
+
+
+
+
+
+
+
+
+
diff --git a/components/ThemeToggleButton.stories.js b/components/ThemeToggleButton.stories.js
new file mode 100644
index 0000000..052d6b2
--- /dev/null
+++ b/components/ThemeToggleButton.stories.js
@@ -0,0 +1,26 @@
+import ThemeToggleButton from './ThemeToggleButton.vue';
+
+export default {
+ title: 'Primitives/ThemeToggleButton',
+ component: ThemeToggleButton,
+ argTypes: {
+ titleLight: { control: 'text' },
+ titleDark: { control: 'text' },
+ },
+};
+
+export const Default = {};
+export const CustomLabels = {
+ args: { titleLight: 'Switch to light', titleDark: 'Switch to dark' },
+};
+export const Interactive = {
+ render: (args) => ({
+ components: { ThemeToggleButton },
+ setup() { return { args }; },
+ template: `
+
+
+ Click to toggle — check :root.dark on html
+
`,
+ }),
+};
diff --git a/components/ThemeToggleButton.vue b/components/ThemeToggleButton.vue
new file mode 100644
index 0000000..0cfb62d
--- /dev/null
+++ b/components/ThemeToggleButton.vue
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/components/TipsSection.stories.js b/components/TipsSection.stories.js
new file mode 100644
index 0000000..8947b1a
--- /dev/null
+++ b/components/TipsSection.stories.js
@@ -0,0 +1,27 @@
+import TipsSection from './TipsSection.vue';
+
+export default {
+ title: 'Domain/Shared/TipsSection',
+ component: TipsSection,
+ args: {
+ pageName: 'Transaction'
+ }
+};
+
+export const Default = {};
+
+export const WalletTips = {
+ args: {
+ pageName: 'Wallet',
+ title: 'Tips for setting up a wallet',
+ text: 'Choose a descriptive name and pick the correct primary currency. You can designate this as your default wallet for everyday transactions.'
+ }
+};
+
+export const CategoryTips = {
+ args: {
+ pageName: 'Category',
+ title: 'Organizing your categories',
+ text: 'Group similar expenses together to make reporting and budgeting easier to manage.'
+ }
+};
diff --git a/components/TipsSection.vue b/components/TipsSection.vue
new file mode 100644
index 0000000..6d9f870
--- /dev/null
+++ b/components/TipsSection.vue
@@ -0,0 +1,168 @@
+
+
+
+
+
+
+
+ {{ descriptionText }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/TransactionForm.stories.js b/components/TransactionForm.stories.js
new file mode 100644
index 0000000..e6862b9
--- /dev/null
+++ b/components/TransactionForm.stories.js
@@ -0,0 +1,50 @@
+import TransactionForm from './TransactionForm.vue';
+
+const wallets = [
+ { id: 1, name: 'Main Bank Account', currency: 'USD' },
+ { id: 2, name: 'Cash Wallet', currency: 'USD' }
+];
+const parties = [
+ { id: 1, name: 'Grocery Store' },
+ { id: 2, name: 'Employer' }
+];
+const groups = [{ id: 1, name: 'General' }];
+const incomeCategories = [
+ { id: 2, name: 'Salary', type: 'income' },
+ { id: 4, name: 'Freelance', type: 'income' }
+];
+const expenseCategories = [
+ { id: 1, name: 'Food & Dining', type: 'expense' },
+ { id: 3, name: 'Housing', type: 'expense' }
+];
+
+export default {
+ title: 'Domain/Transactions/TransactionForm',
+ component: TransactionForm,
+ args: {
+ isOutcomeSelected: false,
+ editingItem: null,
+ isSubmitting: false,
+ wallets,
+ parties,
+ groups,
+ incomeCategories,
+ expenseCategories,
+ defaultCurrency: 'USD',
+ defaultGroup: groups[0],
+ defaultWallet: wallets[0],
+ fetchFileBlob: async () => null,
+ deleteFile: async () => {},
+ fetchRecentExpenses: async () => []
+ }
+};
+
+export const NewIncome = {};
+
+export const NewExpense = {
+ args: { isOutcomeSelected: true }
+};
+
+export const Submitting = {
+ args: { isSubmitting: true }
+};
diff --git a/components/TransactionForm.vue b/components/TransactionForm.vue
new file mode 100644
index 0000000..11b6d8f
--- /dev/null
+++ b/components/TransactionForm.vue
@@ -0,0 +1,811 @@
+
+
+
+
+
+
+
+
+
diff --git a/components/TransactionFormContainer.stories.js b/components/TransactionFormContainer.stories.js
new file mode 100644
index 0000000..68314e7
--- /dev/null
+++ b/components/TransactionFormContainer.stories.js
@@ -0,0 +1,38 @@
+import TransactionFormContainer from './TransactionFormContainer.vue';
+
+const wallets = [
+ { id: 1, name: 'Main Bank Account', currency: 'USD' },
+ { id: 2, name: 'Cash Wallet', currency: 'USD' }
+];
+const parties = [
+ { id: 1, name: 'Grocery Store' },
+ { id: 2, name: 'Employer' }
+];
+const categories = [
+ { id: 1, name: 'Food & Dining', type: 'expense' },
+ { id: 2, name: 'Salary', type: 'income' }
+];
+const groups = [{ id: 1, name: 'General' }];
+
+export default {
+ title: 'Domain/Transactions/TransactionFormContainer',
+ component: TransactionFormContainer,
+ args: {
+ isOutcomeSelected: false,
+ isSubmitting: false,
+ wallets,
+ parties,
+ groups,
+ incomeCategories: categories.filter((c) => c.type === 'income'),
+ expenseCategories: categories.filter((c) => c.type === 'expense'),
+ defaultCurrency: 'USD',
+ defaultGroup: groups[0],
+ defaultWallet: wallets[0]
+ }
+};
+
+export const NewExpense = {};
+
+export const NewIncome = {
+ args: { isOutcomeSelected: false }
+};
diff --git a/components/TransactionFormContainer.vue b/components/TransactionFormContainer.vue
new file mode 100644
index 0000000..f9419fb
--- /dev/null
+++ b/components/TransactionFormContainer.vue
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
diff --git a/components/TransactionFormSection.stories.js b/components/TransactionFormSection.stories.js
new file mode 100644
index 0000000..a7d01ee
--- /dev/null
+++ b/components/TransactionFormSection.stories.js
@@ -0,0 +1,30 @@
+import TransactionFormSection from './TransactionFormSection.vue';
+
+const wallets = [
+ { id: 1, name: 'Main Bank Account', currency: 'USD' },
+ { id: 2, name: 'Cash Wallet', currency: 'USD' }
+];
+const parties = [{ id: 1, name: 'Grocery Store' }];
+const categories = [
+ { id: 1, name: 'Food & Dining', type: 'expense' },
+ { id: 2, name: 'Salary', type: 'income' }
+];
+const groups = [{ id: 1, name: 'General' }];
+
+export default {
+ title: 'Domain/Transactions/TransactionFormSection',
+ component: TransactionFormSection,
+ args: {
+ isSubmitting: false,
+ wallets,
+ parties,
+ groups,
+ incomeCategories: categories.filter((c) => c.type === 'income'),
+ expenseCategories: categories.filter((c) => c.type === 'expense'),
+ defaultCurrency: 'USD',
+ defaultGroup: groups[0],
+ defaultWallet: wallets[0]
+ }
+};
+
+export const Default = {};
diff --git a/components/TransactionFormSection.vue b/components/TransactionFormSection.vue
new file mode 100644
index 0000000..9f20f0a
--- /dev/null
+++ b/components/TransactionFormSection.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/components/TransferForm.stories.js b/components/TransferForm.stories.js
new file mode 100644
index 0000000..37571d1
--- /dev/null
+++ b/components/TransferForm.stories.js
@@ -0,0 +1,23 @@
+import TransferForm from './TransferForm.vue';
+
+const wallets = [
+ { id: 1, name: 'Main Bank Account', currency: 'USD' },
+ { id: 2, name: 'Cash Wallet', currency: 'USD' },
+ { id: 3, name: 'Mobile Money', currency: 'XAF' }
+];
+
+export default {
+ title: 'Domain/Transactions/TransferForm',
+ component: TransferForm,
+ args: {
+ isSubmitting: false,
+ wallets,
+ defaultCurrency: 'USD'
+ }
+};
+
+export const Default = {};
+
+export const Submitting = {
+ args: { isSubmitting: true }
+};
diff --git a/components/TransferForm.vue b/components/TransferForm.vue
new file mode 100644
index 0000000..1d7496a
--- /dev/null
+++ b/components/TransferForm.vue
@@ -0,0 +1,433 @@
+
+
+
+
+
+
+
diff --git a/components/TransferFormContainer.stories.js b/components/TransferFormContainer.stories.js
new file mode 100644
index 0000000..b1731f3
--- /dev/null
+++ b/components/TransferFormContainer.stories.js
@@ -0,0 +1,23 @@
+import TransferFormContainer from './TransferFormContainer.vue';
+
+const wallets = [
+ { id: 1, name: 'Main Bank Account', currency: 'USD' },
+ { id: 2, name: 'Cash Wallet', currency: 'USD' },
+ { id: 3, name: 'Mobile Money', currency: 'XAF' }
+];
+
+export default {
+ title: 'Domain/Transactions/TransferFormContainer',
+ component: TransferFormContainer,
+ args: {
+ isSubmitting: false,
+ wallets,
+ defaultCurrency: 'USD'
+ }
+};
+
+export const Default = {};
+
+export const Submitting = {
+ args: { isSubmitting: true }
+};
diff --git a/components/TransferFormContainer.vue b/components/TransferFormContainer.vue
new file mode 100644
index 0000000..c35735b
--- /dev/null
+++ b/components/TransferFormContainer.vue
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
diff --git a/components/ViewToggle.stories.js b/components/ViewToggle.stories.js
new file mode 100644
index 0000000..e98d3fb
--- /dev/null
+++ b/components/ViewToggle.stories.js
@@ -0,0 +1,22 @@
+import ViewToggle from './ViewToggle.vue';
+
+export default {
+ title: 'Primitives/ViewToggle',
+ component: ViewToggle,
+ argTypes: {
+ modelValue: { control: 'select', options: ['table', 'cards'] },
+ tableTitle: { control: 'text' },
+ cardsTitle: { control: 'text' },
+ },
+};
+
+export const TableActive = { args: { modelValue: 'table' } };
+export const CardsActive = { args: { modelValue: 'cards' } };
+export const Interactive = {
+ render: (args) => ({
+ components: { ViewToggle },
+ setup() { return { args }; },
+ template: ` `,
+ }),
+ args: { modelValue: 'table' },
+};
diff --git a/components/ViewToggle.vue b/components/ViewToggle.vue
new file mode 100644
index 0000000..ecc2b85
--- /dev/null
+++ b/components/ViewToggle.vue
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/WalletCard.stories.js b/components/WalletCard.stories.js
new file mode 100644
index 0000000..d0f3092
--- /dev/null
+++ b/components/WalletCard.stories.js
@@ -0,0 +1,50 @@
+import WalletCard from './WalletCard.vue';
+
+const sampleWallets = [
+ { id: 1, name: 'Main Checking', currency: 'USD' },
+ { id: 2, name: 'High Yield Savings', currency: 'USD' },
+ { id: 3, name: 'Euro Travel Card', currency: 'EUR' }
+];
+
+export default {
+ title: 'Domain/Wallets/WalletCard',
+ component: WalletCard,
+ args: {
+ wallets: sampleWallets,
+ currency: 'USD',
+ statistics: {
+ total_balance: 14850.75,
+ total_income: 6200.0,
+ total_expenses: 3180.5
+ },
+ isLoading: false
+ }
+};
+
+export const AllWallets = {
+ args: {
+ modelValue: null
+ }
+};
+
+export const SelectedWallet = {
+ args: {
+ modelValue: 1
+ }
+};
+
+export const Loading = {
+ args: {
+ isLoading: true
+ }
+};
+
+export const NegativeBalance = {
+ args: {
+ statistics: {
+ total_balance: -450.25,
+ total_income: 1200.0,
+ total_expenses: 1650.25
+ }
+ }
+};
diff --git a/components/WalletCard.vue b/components/WalletCard.vue
new file mode 100644
index 0000000..2106eab
--- /dev/null
+++ b/components/WalletCard.vue
@@ -0,0 +1,433 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/WalletForm.stories.js b/components/WalletForm.stories.js
new file mode 100644
index 0000000..8a71f85
--- /dev/null
+++ b/components/WalletForm.stories.js
@@ -0,0 +1,28 @@
+import WalletForm from './WalletForm.vue';
+
+export default {
+ title: 'Domain/Wallets/WalletForm',
+ component: WalletForm,
+ args: {
+ editingItem: null,
+ apiError: '',
+ isSubmitting: false,
+ defaultCurrency: 'USD'
+ }
+};
+
+export const Create = {};
+
+export const Edit = {
+ args: {
+ editingItem: {
+ id: 1,
+ name: 'Main Bank Account',
+ type: 'bank',
+ currency: 'USD',
+ balance: 1000,
+ description: 'Primary checking account',
+ icon: 'Landmark'
+ }
+ }
+};
diff --git a/components/WalletForm.vue b/components/WalletForm.vue
new file mode 100644
index 0000000..eb91ea0
--- /dev/null
+++ b/components/WalletForm.vue
@@ -0,0 +1,348 @@
+
+
+
+
+
+
+
+
+
+ {{ t('Initial Balance') }}
+
+
+
+
+
+
+
+ {{ t('Cancel') }}
+
+
+ {{ isEditing ? t('Update Wallet') : t('Create Wallet') }}
+
+
+
+
+
+
+
+
diff --git a/components/WalletListCard.stories.js b/components/WalletListCard.stories.js
new file mode 100644
index 0000000..24e3c79
--- /dev/null
+++ b/components/WalletListCard.stories.js
@@ -0,0 +1,42 @@
+import WalletListCard from './WalletListCard.vue';
+
+export default {
+ title: 'Domain/Wallets/WalletListCard',
+ component: WalletListCard,
+ args: {
+ wallet: {
+ id: 1,
+ name: 'Primary Checking',
+ currency: 'USD',
+ balance: 5420.5,
+ stats: {
+ total_income: 3500.0,
+ total_expense: 1200.0
+ }
+ },
+ isDefault: false
+ }
+};
+
+export const Default = {};
+
+export const DefaultWalletBadge = {
+ args: {
+ isDefault: true
+ }
+};
+
+export const NegativeBalance = {
+ args: {
+ wallet: {
+ id: 2,
+ name: 'Credit Card',
+ currency: 'USD',
+ balance: -1280.4,
+ stats: {
+ total_income: 500.0,
+ total_expense: 1780.4
+ }
+ }
+ }
+};
diff --git a/components/WalletListCard.vue b/components/WalletListCard.vue
new file mode 100644
index 0000000..0269da1
--- /dev/null
+++ b/components/WalletListCard.vue
@@ -0,0 +1,339 @@
+
+
+
+
+
+
+
+
+
+
+
{{ wallet.currency }}
+
+
+ {{ t('Balance') }}
+ {{ formattedBalance }}
+
+
+
+
+
+
+ {{ t('Income') }}
+ {{ formattedIncome }}
+
+
+
+
+
+ {{ t('Expense') }}
+ {{ formattedExpense }}
+
+
+
+
+
+
+
+
+
diff --git a/components/admin/OutreachComposer.stories.js b/components/admin/OutreachComposer.stories.js
new file mode 100644
index 0000000..e392b9f
--- /dev/null
+++ b/components/admin/OutreachComposer.stories.js
@@ -0,0 +1,17 @@
+import OutreachComposer from './OutreachComposer.vue';
+
+export default {
+ title: 'Domain/Admin/OutreachComposer',
+ component: OutreachComposer,
+ args: {
+ fetchUsers: async () => [
+ { id: 1, first_name: 'Jane', last_name: 'Doe', email: 'jane@example.com' },
+ { id: 2, first_name: 'John', last_name: 'Smith', email: 'john@example.com' }
+ ],
+ uploadMedia: async () => ({ url: 'https://example.com/image.png' }),
+ preview: async () => 'Preview
',
+ sendOutreach: async () => ({ sent: 2 })
+ }
+};
+
+export const Default = {};
diff --git a/components/admin/OutreachComposer.vue b/components/admin/OutreachComposer.vue
new file mode 100644
index 0000000..5aee927
--- /dev/null
+++ b/components/admin/OutreachComposer.vue
@@ -0,0 +1,712 @@
+
+
+
+
+ {{ t('Subject') }}
+
+
+
+
+
{{ t('Message') }}
+
+
+
+
+
+
+
+
+
+
{{ t('Header image') }}
+
+
+
+ {{ imageUploading ? t('Uploading...') : t('Add a campaign image') }}
+
+
+
+
+
+ {{ t('Personalize with:') }}
+
+ {{ token }}
+
+
+
+
+
+ {{ t('Button label') }}
+
+
+
+ {{ t('Button link') }}
+
+
+
+
+
+ {{ t('Audience') }}
+
+
+ {{ opt.label }}
+
+
+
+
+
+
{{ t('Choose recipients') }}
+
+
+
+
+ {{ u.first_name }} {{ u.last_name }} · {{ u.email }}
+
+
{{ t('No matches') }}
+
+
+
+
+
{{ t('Attachments') }}
+
+
+ {{ t('Attach files') }}
+
+
+
+
+ {{ file.name }}
+ ×
+
+
+
+
+
+
{{ confirmText }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/admin/UserDetail.stories.js b/components/admin/UserDetail.stories.js
new file mode 100644
index 0000000..ae00b62
--- /dev/null
+++ b/components/admin/UserDetail.stories.js
@@ -0,0 +1,31 @@
+import UserDetail from './UserDetail.vue';
+
+export default {
+ title: 'Domain/Admin/UserDetail',
+ component: UserDetail,
+ args: {
+ userId: 1,
+ fetchDetail: async () => ({
+ user: {
+ id: 1,
+ first_name: 'Jane',
+ last_name: 'Doe',
+ email: 'jane@example.com',
+ is_admin: true,
+ created_at: '2024-01-15T00:00:00Z'
+ },
+ preferences: { country: 'US', language: 'en', currency: 'USD' },
+ last_transaction_at: '2024-03-24T10:30:00Z',
+ counts: {
+ transactions: 42,
+ wallets: 3,
+ categories: 12,
+ parties: 8,
+ groups: 2,
+ budgets: 4
+ }
+ })
+ }
+};
+
+export const Default = {};
diff --git a/components/admin/UserDetail.vue b/components/admin/UserDetail.vue
new file mode 100644
index 0000000..777e710
--- /dev/null
+++ b/components/admin/UserDetail.vue
@@ -0,0 +1,253 @@
+
+
+
+ {{ t('Back to users') }}
+
+
+
{{ t('Loading...') }}
+
{{ error }}
+
+
+
+ {{ initials }}
+
+
{{ detail.user.first_name }} {{ detail.user.last_name }}
+
{{ detail.user.email }}
+
+ {{ t('Admin') }}
+
+
+
+ {{ t('Profile') }}
+
+
+
{{ t('Joined') }}
+ {{ fmtDate(detail.user.created_at) }}
+
+
+
{{ t('Country') }}
+ {{ detail.preferences.country || '-' }}
+
+
+
{{ t('Language') }}
+ {{ detail.preferences.language || '-' }}
+
+
+
{{ t('Currency') }}
+ {{ detail.preferences.currency || '-' }}
+
+
+
{{ t('Last transaction') }}
+ {{ detail.last_transaction_at ? fmtDate(detail.last_transaction_at) : '-' }}
+
+
+
+
+
+
+ {{ item.value }}
+ {{ t(item.label) }}
+
+
+
+
+
+
+
+
+
diff --git a/components/ai/TypingDots.stories.js b/components/ai/TypingDots.stories.js
new file mode 100644
index 0000000..8e9f5c7
--- /dev/null
+++ b/components/ai/TypingDots.stories.js
@@ -0,0 +1,8 @@
+import TypingDots from './TypingDots.vue';
+
+export default {
+ title: 'Primitives/TypingDots',
+ component: TypingDots,
+};
+
+export const Default = {};
diff --git a/components/ai/TypingDots.vue b/components/ai/TypingDots.vue
new file mode 100644
index 0000000..4e12d4f
--- /dev/null
+++ b/components/ai/TypingDots.vue
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
diff --git a/components/auth/AuthCarousel.stories.js b/components/auth/AuthCarousel.stories.js
new file mode 100644
index 0000000..4e9c69b
--- /dev/null
+++ b/components/auth/AuthCarousel.stories.js
@@ -0,0 +1,13 @@
+import AuthCarousel from './AuthCarousel.vue';
+
+export default {
+ title: 'Auth/AuthCarousel',
+ component: AuthCarousel,
+ tags: ['autodocs'],
+ parameters: {
+ layout: 'fullscreen',
+ backgrounds: { default: 'dark', values: [{ name: 'dark', value: '#1a1a2e' }] }
+ }
+};
+
+export const Default = {};
diff --git a/components/auth/AuthCarousel.vue b/components/auth/AuthCarousel.vue
new file mode 100644
index 0000000..dd902ff
--- /dev/null
+++ b/components/auth/AuthCarousel.vue
@@ -0,0 +1,226 @@
+
+
+
+
+
+
+
diff --git a/components/auth/AuthDivider.stories.js b/components/auth/AuthDivider.stories.js
new file mode 100644
index 0000000..2b579d7
--- /dev/null
+++ b/components/auth/AuthDivider.stories.js
@@ -0,0 +1,17 @@
+import AuthDivider from './AuthDivider.vue';
+
+export default {
+ title: 'Primitives/AuthDivider',
+ component: AuthDivider,
+};
+
+export const Default = {};
+export const InCard = {
+ render: () => ({
+ components: { AuthDivider },
+ template: `
+ `,
+ }),
+};
diff --git a/components/auth/AuthDivider.vue b/components/auth/AuthDivider.vue
new file mode 100644
index 0000000..62a4b82
--- /dev/null
+++ b/components/auth/AuthDivider.vue
@@ -0,0 +1,34 @@
+
+
+
+ OR
+
+
+
+
+
+
+
diff --git a/components/auth/AuthSocialLogin.stories.js b/components/auth/AuthSocialLogin.stories.js
new file mode 100644
index 0000000..151638e
--- /dev/null
+++ b/components/auth/AuthSocialLogin.stories.js
@@ -0,0 +1,13 @@
+import AuthSocialLogin from './AuthSocialLogin.vue';
+
+export default {
+ title: 'Auth/AuthSocialLogin',
+ component: AuthSocialLogin,
+ tags: ['autodocs'],
+ argTypes: {
+ mode: { control: 'select', options: ['login', 'signup'] }
+ }
+};
+
+export const Login = { args: { mode: 'login' } };
+export const Signup = { args: { mode: 'signup' } };
diff --git a/components/auth/AuthSocialLogin.vue b/components/auth/AuthSocialLogin.vue
new file mode 100644
index 0000000..6d3805d
--- /dev/null
+++ b/components/auth/AuthSocialLogin.vue
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+ {{ props.mode === 'login' ? t('Sign in with Google') : t('Sign up with Google') }}
+
+
+
+
diff --git a/components/budgets/BudgetCard.stories.js b/components/budgets/BudgetCard.stories.js
new file mode 100644
index 0000000..984d744
--- /dev/null
+++ b/components/budgets/BudgetCard.stories.js
@@ -0,0 +1,80 @@
+import BudgetCard from './BudgetCard.vue';
+
+export default {
+ title: 'Domain/Budgets/BudgetCard',
+ component: BudgetCard,
+ args: {
+ budget: {
+ id: 1,
+ name: 'Groceries & Household',
+ amount: 600,
+ currency: 'USD',
+ period_type: 'monthly',
+ start_date: '2024-01-01',
+ targets: [
+ { type: 'category', id: 10, name: 'Groceries' },
+ { type: 'category', id: 11, name: 'Cleaning Supplies' }
+ ],
+ progress: {
+ period_start: 'Jan 1',
+ period_end: 'Jan 31',
+ limit: 600,
+ gross_spent: 340,
+ refunds: 20,
+ net_spent: 320,
+ effective_limit: 600,
+ remaining: 280,
+ percent_used: 53.3,
+ status: 'on_track'
+ }
+ }
+ }
+};
+
+export const OnTrack = {};
+
+export const NearLimit = {
+ args: {
+ budget: {
+ id: 2,
+ name: 'Dining & Entertainment',
+ amount: 400,
+ currency: 'USD',
+ period_type: 'monthly',
+ start_date: '2024-01-01',
+ targets: [{ type: 'category', id: 12, name: 'Restaurants' }],
+ progress: {
+ period_start: 'Jan 1',
+ limit: 400,
+ net_spent: 350,
+ effective_limit: 400,
+ remaining: 50,
+ percent_used: 87.5,
+ status: 'near_limit'
+ }
+ }
+ }
+};
+
+export const OverBudget = {
+ args: {
+ budget: {
+ id: 3,
+ name: 'Shopping & Gear',
+ amount: 300,
+ currency: 'USD',
+ period_type: 'monthly',
+ start_date: '2024-01-01',
+ targets: [{ type: 'category', id: 14, name: 'Electronics' }],
+ progress: {
+ period_start: 'Jan 1',
+ limit: 300,
+ net_spent: 380,
+ effective_limit: 300,
+ remaining: -80,
+ percent_used: 126.7,
+ status: 'over_budget'
+ }
+ }
+ }
+};
diff --git a/components/budgets/BudgetCard.vue b/components/budgets/BudgetCard.vue
new file mode 100644
index 0000000..78fc2e8
--- /dev/null
+++ b/components/budgets/BudgetCard.vue
@@ -0,0 +1,462 @@
+
+
+
+
+
{{ budget.name }}
+
{{ formattedPeriod }}
+
+
+
+ {{ t(statusLabel) }}
+
+
+
+
+
+
+
+
+ {{ t('All transactions in period') }}
+
+
+
+
+ {{ summaryFor('category', categories) }}
+
+
+
+ {{ summaryFor('group', groups) }}
+
+
+
+ {{ summaryFor('wallet', wallets) }}
+
+
+
+
+
+
+
+
+ {{ formatMoney(netSpent) }}
+ {{ t('of') }} {{ formatMoney(effectiveLimit) }}
+
+ {{ Math.round(percentUsed) }}%
+
+
+
+
+
+
+
+
+
+
diff --git a/components/budgets/BudgetForm.stories.js b/components/budgets/BudgetForm.stories.js
new file mode 100644
index 0000000..5415742
--- /dev/null
+++ b/components/budgets/BudgetForm.stories.js
@@ -0,0 +1,39 @@
+import BudgetForm from './BudgetForm.vue';
+
+export default {
+ title: 'Domain/Budgets/BudgetForm',
+ component: BudgetForm,
+ args: {
+ editingItem: null,
+ apiError: '',
+ isSubmitting: false,
+ wallets: [{ id: 1, name: 'Main Bank Account', currency: 'USD' }],
+ categories: [
+ { id: 1, name: 'Food & Dining' },
+ { id: 2, name: 'Housing' }
+ ],
+ groups: [{ id: 1, name: 'General' }],
+ defaults: { currency: 'USD', period: 'monthly', threshold: 80 }
+ }
+};
+
+export const Create = {};
+
+export const Edit = {
+ args: {
+ editingItem: {
+ id: 1,
+ name: 'Groceries',
+ amount: 500,
+ currency: 'USD',
+ period_type: 'monthly',
+ start_date: '2024-03-01',
+ end_date: null,
+ rollover_enabled: false,
+ threshold_percent: 80,
+ forecast_alerts_enabled: true,
+ is_active: true,
+ targets: [{ type: 'category', id: 1 }]
+ }
+ }
+};
diff --git a/components/budgets/BudgetForm.vue b/components/budgets/BudgetForm.vue
new file mode 100644
index 0000000..dfc9d7e
--- /dev/null
+++ b/components/budgets/BudgetForm.vue
@@ -0,0 +1,611 @@
+
+
+
+
+
+
+ {{ apiError }}
+
+
+
+ {{ t('Cancel') }}
+
+
+ {{ editingItem ? t('Update Budget') : t('Create Budget') }}
+
+
+
+
+
+
+
+
diff --git a/components/categories/CategoryForm.stories.js b/components/categories/CategoryForm.stories.js
new file mode 100644
index 0000000..0426d9f
--- /dev/null
+++ b/components/categories/CategoryForm.stories.js
@@ -0,0 +1,25 @@
+import CategoryForm from './CategoryForm.vue';
+
+export default {
+ title: 'Domain/Categories/CategoryForm',
+ component: CategoryForm,
+ args: {
+ editingItem: null,
+ apiError: '',
+ isSubmitting: false
+ }
+};
+
+export const Create = {};
+
+export const Edit = {
+ args: {
+ editingItem: {
+ id: 1,
+ name: 'Food & Dining',
+ type: 'expense',
+ description: 'Restaurants and groceries',
+ icon: 'Utensils'
+ }
+ }
+};
diff --git a/components/categories/CategoryForm.vue b/components/categories/CategoryForm.vue
new file mode 100644
index 0000000..17ef33a
--- /dev/null
+++ b/components/categories/CategoryForm.vue
@@ -0,0 +1,271 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('Cancel') }}
+
+
+ {{ isEditing ? t('Update Category') : t('Create Category') }}
+
+
+
+
+
+
+
+
diff --git a/components/dashboard/CategoryBreakdown.stories.js b/components/dashboard/CategoryBreakdown.stories.js
new file mode 100644
index 0000000..6541fa7
--- /dev/null
+++ b/components/dashboard/CategoryBreakdown.stories.js
@@ -0,0 +1,39 @@
+import CategoryBreakdown from './CategoryBreakdown.vue';
+
+const sampleCategories = [
+ { name: 'Housing & Rent', amount: 1400.0, color: '#3b82f6' },
+ { name: 'Groceries', amount: 650.0, color: '#10b981' },
+ { name: 'Utilities', amount: 320.0, color: '#f59e0b' },
+ { name: 'Entertainment', amount: 220.0, color: '#8b5cf6' },
+ { name: 'Transport', amount: 160.0, color: '#ec4899' }
+];
+
+export default {
+ title: 'Domain/Dashboard/CategoryBreakdown',
+ component: CategoryBreakdown,
+ args: {
+ categories: sampleCategories,
+ currency: 'USD',
+ initialChart: 'pie'
+ }
+};
+
+export const DonutView = {};
+
+export const BarView = {
+ args: {
+ initialChart: 'bar'
+ }
+};
+
+export const LineView = {
+ args: {
+ initialChart: 'line'
+ }
+};
+
+export const Empty = {
+ args: {
+ categories: []
+ }
+};
diff --git a/components/dashboard/CategoryBreakdown.vue b/components/dashboard/CategoryBreakdown.vue
new file mode 100644
index 0000000..c6ca5f2
--- /dev/null
+++ b/components/dashboard/CategoryBreakdown.vue
@@ -0,0 +1,560 @@
+
+
+
+
+
+
+
{{ t('No expense data available') }}
+
+
+
+
+
+
+
+
+ {{ t('Total') }}
+ {{ formattedTotal }}
+
+
+
+
+
+ {{ item.name }}
+ {{ formatPercent(item.value) }}%
+
+
+
+
+
+
+
+
+
{{ formatPercent(item.value) }}%
+
+
{{ truncateName(item.name) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ truncateName(cat.name, 10) }}
+
+
+
+
+
+
+
+
+
+
diff --git a/components/dashboard/DashboardAgentHero.stories.js b/components/dashboard/DashboardAgentHero.stories.js
new file mode 100644
index 0000000..73fc4bb
--- /dev/null
+++ b/components/dashboard/DashboardAgentHero.stories.js
@@ -0,0 +1,17 @@
+import DashboardAgentHero from './DashboardAgentHero.vue';
+
+export default {
+ title: 'Domain/Dashboard/DashboardAgentHero',
+ component: DashboardAgentHero,
+ args: {
+ userName: 'Alex'
+ }
+};
+
+export const WithName = {};
+
+export const Anonymous = {
+ args: {
+ userName: ''
+ }
+};
diff --git a/components/dashboard/DashboardAgentHero.vue b/components/dashboard/DashboardAgentHero.vue
new file mode 100644
index 0000000..5484473
--- /dev/null
+++ b/components/dashboard/DashboardAgentHero.vue
@@ -0,0 +1,392 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ t('Hey {name}', { name: firstName }) }}
+
{{ t("Tell me what you want and I'll do it.") }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ a.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/dashboard/DashboardKPIs.stories.js b/components/dashboard/DashboardKPIs.stories.js
new file mode 100644
index 0000000..02376ef
--- /dev/null
+++ b/components/dashboard/DashboardKPIs.stories.js
@@ -0,0 +1,36 @@
+import DashboardKPIs from './DashboardKPIs.vue';
+
+export default {
+ title: 'Domain/Dashboard/DashboardKPIs',
+ component: DashboardKPIs,
+ args: {
+ statistics: {
+ total_balance: 24850.5,
+ total_income: 7600.0,
+ total_expenses: 3250.25
+ },
+ currency: 'USD',
+ activeFilterChips: []
+ }
+};
+
+export const Default = {};
+
+export const WithActiveFilters = {
+ args: {
+ activeFilterChips: [
+ { key: 'dateRange', label: 'Jan 1 - Jan 31' },
+ { key: 'wallets', label: 'Main Checking' }
+ ]
+ }
+};
+
+export const DeficitPeriod = {
+ args: {
+ statistics: {
+ total_balance: 1520.0,
+ total_income: 1800.0,
+ total_expenses: 3950.0
+ }
+ }
+};
diff --git a/components/dashboard/DashboardKPIs.vue b/components/dashboard/DashboardKPIs.vue
new file mode 100644
index 0000000..c650072
--- /dev/null
+++ b/components/dashboard/DashboardKPIs.vue
@@ -0,0 +1,303 @@
+
+
+
+
+
+
+
diff --git a/components/dashboard/DashboardQuickActionModal.stories.js b/components/dashboard/DashboardQuickActionModal.stories.js
new file mode 100644
index 0000000..67f2a7f
--- /dev/null
+++ b/components/dashboard/DashboardQuickActionModal.stories.js
@@ -0,0 +1,44 @@
+import DashboardQuickActionModal from './DashboardQuickActionModal.vue';
+
+const sampleWallets = [
+ { id: 1, name: 'Main Checking', currency: 'USD' },
+ { id: 2, name: 'Savings Account', currency: 'USD' },
+ { id: 3, name: 'Euro Travel', currency: 'EUR' }
+];
+
+const sampleParties = [
+ { id: 1, name: 'Acme Supermarket' },
+ { id: 2, name: 'Electric Utility' },
+ { id: 3, name: 'Freelance Client' }
+];
+
+export default {
+ title: 'Domain/Dashboard/DashboardQuickActionModal',
+ component: DashboardQuickActionModal,
+ args: {
+ action: 'log',
+ wallets: sampleWallets,
+ parties: sampleParties,
+ busy: false
+ }
+};
+
+export const LogTransaction = {};
+
+export const TransferMoney = {
+ args: {
+ action: 'transfer'
+ }
+};
+
+export const BuildReport = {
+ args: {
+ action: 'report'
+ }
+};
+
+export const ImportDocument = {
+ args: {
+ action: 'import'
+ }
+};
diff --git a/components/dashboard/DashboardQuickActionModal.vue b/components/dashboard/DashboardQuickActionModal.vue
new file mode 100644
index 0000000..798ba06
--- /dev/null
+++ b/components/dashboard/DashboardQuickActionModal.vue
@@ -0,0 +1,482 @@
+
+
+
+
+
+
+
+
{{ config.title }}
+
{{ config.sub }}
+
+
+
+
+
+
+
+
+
+
+ {{ t('Cancel') }}
+
+
+ {{ submitLabel }}
+
+
+
+
+
+
+
+
+
+
diff --git a/components/dashboard/DashboardWalletSelector.stories.js b/components/dashboard/DashboardWalletSelector.stories.js
new file mode 100644
index 0000000..2eace59
--- /dev/null
+++ b/components/dashboard/DashboardWalletSelector.stories.js
@@ -0,0 +1,24 @@
+import DashboardWalletSelector from './DashboardWalletSelector.vue';
+
+const sampleWallets = [
+ { id: 1, name: 'Main Checking', currency: 'USD' },
+ { id: 2, name: 'Savings Account', currency: 'USD' },
+ { id: 3, name: 'Euro Travel', currency: 'EUR' }
+];
+
+export default {
+ title: 'Domain/Dashboard/DashboardWalletSelector',
+ component: DashboardWalletSelector,
+ args: {
+ wallets: sampleWallets,
+ modelValue: null
+ }
+};
+
+export const AllWalletsSelected = {};
+
+export const SpecificWalletSelected = {
+ args: {
+ modelValue: 1
+ }
+};
diff --git a/components/dashboard/DashboardWalletSelector.vue b/components/dashboard/DashboardWalletSelector.vue
new file mode 100644
index 0000000..d86f73a
--- /dev/null
+++ b/components/dashboard/DashboardWalletSelector.vue
@@ -0,0 +1,148 @@
+
+
+
+
+
+ {{ selectedWalletName }}
+
+
+
+
+
+
+
+
+
+
diff --git a/components/dashboard/QuickInsights.stories.js b/components/dashboard/QuickInsights.stories.js
new file mode 100644
index 0000000..bfda3ce
--- /dev/null
+++ b/components/dashboard/QuickInsights.stories.js
@@ -0,0 +1,49 @@
+import QuickInsights from './QuickInsights.vue';
+
+export default {
+ title: 'Domain/Dashboard/QuickInsights',
+ component: QuickInsights,
+ args: {
+ topIncome: {
+ party: 'TechCorp Solutions',
+ amount: 4800.0
+ },
+ topExpense: {
+ party: 'Downtown Apartment',
+ amount: 1650.0
+ },
+ savingsRate: 32,
+ riskLevel: 'low',
+ periodLabel: 'March 2024',
+ currency: 'USD'
+ }
+};
+
+export const HealthyFinances = {};
+
+export const ModerateRisk = {
+ args: {
+ topIncome: {
+ party: 'Freelance Design',
+ amount: 2200.0
+ },
+ topExpense: {
+ party: 'Medical Expenses',
+ amount: 1850.0
+ },
+ savingsRate: 12,
+ riskLevel: 'medium'
+ }
+};
+
+export const HighRisk = {
+ args: {
+ topIncome: null,
+ topExpense: {
+ party: 'Emergency Car Repair',
+ amount: 2400.0
+ },
+ savingsRate: 0,
+ riskLevel: 'high'
+ }
+};
diff --git a/components/dashboard/QuickInsights.vue b/components/dashboard/QuickInsights.vue
new file mode 100644
index 0000000..7ade305
--- /dev/null
+++ b/components/dashboard/QuickInsights.vue
@@ -0,0 +1,307 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('Top Income') }}
+ {{ topIncome?.party || t('N/A') }}
+
+ {{ formatAmount(topIncome.amount) }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('Top Expense') }}
+ {{ topExpense?.party || t('N/A') }}
+
+ {{ formatAmount(topExpense.amount) }}
+
+
+
+
+
+
+
+
+
+ {{ t('Savings Rate') }}
+ {{ resolvedSavingsRate }}%
+
+
+
+
+
+
+
+
+
+
+ {{ t('Risk Level') }}
+ {{ displayRiskLevel }}
+
+
+
+
+
+
+
+
+
diff --git a/components/dashboard/RecentTransactions.stories.js b/components/dashboard/RecentTransactions.stories.js
new file mode 100644
index 0000000..0791f5b
--- /dev/null
+++ b/components/dashboard/RecentTransactions.stories.js
@@ -0,0 +1,63 @@
+import RecentTransactions from './RecentTransactions.vue';
+
+const sampleTransactions = [
+ {
+ id: 1,
+ party: 'Acme Supermarket',
+ category: 'Groceries',
+ type: 'EXPENSE',
+ amount: 84.5,
+ date: new Date().toISOString()
+ },
+ {
+ id: 2,
+ party: 'Client Retainer',
+ category: 'Salary & Income',
+ type: 'INCOME',
+ amount: 3200.0,
+ date: new Date(Date.now() - 86400000).toISOString()
+ },
+ {
+ id: 3,
+ party: 'Metro Transit',
+ category: 'Transport',
+ type: 'EXPENSE',
+ amount: 14.0,
+ date: new Date(Date.now() - 86400000 * 3).toISOString()
+ },
+ {
+ id: 4,
+ party: 'Electric & Gas Utility',
+ category: 'Utilities',
+ type: 'EXPENSE',
+ amount: 145.2,
+ date: new Date(Date.now() - 86400000 * 6).toISOString()
+ },
+ {
+ id: 5,
+ party: 'Coffee Corner',
+ category: 'Food & Dining',
+ type: 'EXPENSE',
+ amount: 5.75,
+ date: new Date(Date.now() - 86400000 * 12).toISOString()
+ }
+];
+
+export default {
+ title: 'Domain/Dashboard/RecentTransactions',
+ component: RecentTransactions,
+ args: {
+ transactions: sampleTransactions,
+ limit: 5,
+ viewAllTo: '/transactions',
+ currency: 'USD'
+ }
+};
+
+export const Default = {};
+
+export const Empty = {
+ args: {
+ transactions: []
+ }
+};
diff --git a/components/dashboard/RecentTransactions.vue b/components/dashboard/RecentTransactions.vue
new file mode 100644
index 0000000..8163cf0
--- /dev/null
+++ b/components/dashboard/RecentTransactions.vue
@@ -0,0 +1,255 @@
+
+
+
+
+
+
+
{{ t('No transactions yet') }}
+
+
+
+
+
+
+ {{ txn.party || txn.description || t('Unknown') }}
+ {{ txn.category || t('Uncategorized') }}
+
+
+
+ {{ isIncome(txn) ? '+' : '-' }}{{ formatAmountValue(txn.amount) }}
+
+ {{ formatRelativeTime(txn.date) }}
+
+
+
+
+
+
+
+
+
diff --git a/components/extensions/DescriptorRenderer.stories.js b/components/extensions/DescriptorRenderer.stories.js
new file mode 100644
index 0000000..7c831d5
--- /dev/null
+++ b/components/extensions/DescriptorRenderer.stories.js
@@ -0,0 +1,96 @@
+import { h } from 'vue';
+import DescriptorRenderer from './DescriptorRenderer.vue';
+import { useExtensionSlots } from '../../composables/useExtensionSlots';
+
+export default {
+ title: 'Primitives/DescriptorRenderer',
+ component: DescriptorRenderer,
+};
+
+const baseContribution = {
+ key: 'plaid',
+ slot: 'settings.integrations',
+ integration: {
+ key: 'plaid',
+ name: 'Plaid Bank Sync',
+ description: 'Automatically import bank balances and transactions.',
+ icon: 'Building2',
+ configured: true,
+ entitled: true,
+ ui: {
+ slots: ['settings.integrations'],
+ card: { title: 'Plaid Bank Sync', description: 'Connect external bank accounts.', cta: 'Manage Accounts' }
+ }
+ },
+ ui: {
+ slots: ['settings.integrations'],
+ card: { title: 'Plaid Bank Sync', description: 'Connect external bank accounts.', cta: 'Manage Accounts' }
+ },
+ order: 10,
+ configured: true
+};
+
+export const CardIntegration = {
+ args: { contribution: baseContribution }
+};
+
+export const SidebarNav = {
+ args: {
+ contribution: {
+ ...baseContribution,
+ slot: 'sidebar.nav',
+ ui: {
+ ...baseContribution.ui,
+ card: { title: 'Bank Feeds', href: '/banks' }
+ }
+ }
+ }
+};
+
+export const OnboardingStep = {
+ args: {
+ contribution: {
+ ...baseContribution,
+ slot: 'onboarding.steps',
+ ui: {
+ ...baseContribution.ui,
+ onboarding: {
+ title: 'Connect your accounts',
+ description: 'Link your checking, savings, or credit card accounts.',
+ href: '/connect'
+ }
+ }
+ }
+ }
+};
+
+export const CustomPluginEscapeHatch = {
+ render: () => ({
+ components: { DescriptorRenderer },
+ setup() {
+ const { registerComponent } = useExtensionSlots();
+ // Register custom component via plugin escape hatch
+ registerComponent('custom-widget', {
+ props: ['contribution'],
+ render() {
+ return h(
+ 'div',
+ { style: 'padding: 1rem; background: #e0f2fe; border: 1px solid #0284c7; border-radius: 8px;' },
+ 'Custom Plugin Registered Component: ' + this.contribution.integration.name
+ );
+ }
+ });
+
+ const contribution = {
+ ...baseContribution,
+ ui: {
+ ...baseContribution.ui,
+ component: 'custom-widget'
+ }
+ };
+
+ return { contribution };
+ },
+ template: ' '
+ })
+};
diff --git a/components/extensions/DescriptorRenderer.vue b/components/extensions/DescriptorRenderer.vue
new file mode 100644
index 0000000..3c941c1
--- /dev/null
+++ b/components/extensions/DescriptorRenderer.vue
@@ -0,0 +1,198 @@
+
+
+
+
+
+
+
+ {{ card?.title || integration.name }}
+
+
+
+
+
+
+
+
{{ onboarding?.title || card?.title || integration.name }}
+
+ {{ onboarding?.description || card?.description }}
+
+
+
+
+
+
+
+
+
+
+
+
{{ card?.title || integration.name }}
+ Needs setup
+
+
+ {{ card?.description || integration.description }}
+
+
+
+
+
+
+
+
diff --git a/components/extensions/ExtensionSlot.stories.js b/components/extensions/ExtensionSlot.stories.js
new file mode 100644
index 0000000..974361c
--- /dev/null
+++ b/components/extensions/ExtensionSlot.stories.js
@@ -0,0 +1,20 @@
+import ExtensionSlot from './ExtensionSlot.vue';
+
+export default {
+ title: 'Primitives/ExtensionSlot',
+ component: ExtensionSlot,
+};
+
+const sample = [
+ {
+ key: 'test',
+ slot: 'settings.integrations',
+ integration: { key: 'test', name: 'Test Integration', description: 'Example plugin', icon: null, configured: true, entitled: true, ui: { slots: ['settings.integrations'], card: { title: 'Test Card', description: 'Card description', cta: 'Open' } } },
+ ui: { slots: ['settings.integrations'], card: { title: 'Test Card', description: 'Card description', cta: 'Open' } },
+ order: 100,
+ configured: true,
+ },
+];
+
+export const WithContributions = { args: { contributions: sample } };
+export const Empty = { args: { contributions: [] } };
diff --git a/components/extensions/ExtensionSlot.vue b/components/extensions/ExtensionSlot.vue
new file mode 100644
index 0000000..dae10f4
--- /dev/null
+++ b/components/extensions/ExtensionSlot.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
+
diff --git a/components/financial-position/FinancialPositionDrill.stories.js b/components/financial-position/FinancialPositionDrill.stories.js
new file mode 100644
index 0000000..e0fe4a6
--- /dev/null
+++ b/components/financial-position/FinancialPositionDrill.stories.js
@@ -0,0 +1,36 @@
+import FinancialPositionDrill from './FinancialPositionDrill.vue';
+
+const group = {
+ key: 'earned',
+ label: 'Earned income',
+ intents: ['regular'],
+ type: 'income',
+ tone: 'income',
+ metric: '5,200 USD'
+};
+
+export default {
+ title: 'Domain/FinancialPosition/FinancialPositionDrill',
+ component: FinancialPositionDrill,
+ args: {
+ open: true,
+ group,
+ range: { date_from: '2024-01-01', date_to: '2024-03-31' },
+ fetchTransactions: async () => ({
+ data: [
+ {
+ id: 1,
+ description: 'Monthly salary',
+ datetime: '2024-03-20T08:15:00',
+ amount: 2800,
+ intent: 'regular',
+ type: 'income',
+ wallet: { currency: 'USD' },
+ party: { name: 'Employer' }
+ }
+ ]
+ })
+ }
+};
+
+export const Default = {};
diff --git a/components/financial-position/FinancialPositionDrill.vue b/components/financial-position/FinancialPositionDrill.vue
new file mode 100644
index 0000000..265afe7
--- /dev/null
+++ b/components/financial-position/FinancialPositionDrill.vue
@@ -0,0 +1,528 @@
+
+
+
+
+
+
+
+
+
diff --git a/components/financial-position/FinancialPositionView.stories.js b/components/financial-position/FinancialPositionView.stories.js
new file mode 100644
index 0000000..8bdac3a
--- /dev/null
+++ b/components/financial-position/FinancialPositionView.stories.js
@@ -0,0 +1,26 @@
+import FinancialPositionView from './FinancialPositionView.vue';
+
+const position = {
+ net_worth_delta: 2589.5,
+ earned_income: 5200,
+ investment_returns: 180,
+ gifts_received: 50,
+ loan_received: 0,
+ discretionary_spend: 2100,
+ investment_principal: 500,
+ loan_repayment: 0,
+ debt_settled: 240.5
+};
+
+export default {
+ title: 'Domain/FinancialPosition/FinancialPositionView',
+ component: FinancialPositionView,
+ args: {
+ params: null,
+ fetchPosition: async () => ({
+ data: { position, currency: 'USD', partial: false, unconverted_currencies: [] }
+ })
+ }
+};
+
+export const Default = {};
diff --git a/components/financial-position/FinancialPositionView.vue b/components/financial-position/FinancialPositionView.vue
new file mode 100644
index 0000000..9b35b24
--- /dev/null
+++ b/components/financial-position/FinancialPositionView.vue
@@ -0,0 +1,861 @@
+
+
+
+
+
+ {{
+ t(
+ 'Some amounts could not be converted to your default currency and were left out, so figures may be understated. Affected: {currencies}.',
+ { currencies: unconvertedCurrencies.join(', ') }
+ )
+ }}
+
+
+
+
+
+
+
+
{{ t('Net worth change') }}
+
+
{{ signedMoney(position.net_worth_delta) }}
+
+
+ {{ position.net_worth_delta >= 0 ? t('Building') : t('Shrinking') }}
+
+
+
+ {{
+ t(
+ 'Real earnings, returns and gifts, minus real spend. Borrowed money and money parked in investments do not count.'
+ )
+ }}
+
+
+
+
+
+ {{ t('Money in') }}
+ {{ money(totalIn) }}
+
+
+
+ {{ t('Money out') }}
+ {{ money(totalOut) }}
+
+
+
+
+
+
+
{{ t('Total net worth now') }}
+
{{ money(position.total_net_worth) }}
+
+
+
+
+ {{ t('Cash') }}
+ {{ money(position.cash_balance) }}
+
+
+
+ {{ t('Holdings') }}
+ {{ money(position.holdings_value) }}
+
+
+
+
+
+
+
+
+
+ {{ t('Money in') }}
+ {{ money(totalIn) }}
+
+
+
+
+
+
+
+ {{ row.label }}
+ {{ t('cash, not net worth') }}
+
+
+ {{ money(row.value) }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('Money out') }}
+ {{ money(totalOut) }}
+
+
+
+
+
+
+
+ {{ row.label }}
+ {{ t('cash, not net worth') }}
+
+
+ {{ money(row.value) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ t('No data for this period yet.') }}
+
+
+
+
+
+
+
+
+
diff --git a/components/groups/GroupForm.stories.js b/components/groups/GroupForm.stories.js
new file mode 100644
index 0000000..3f13d1d
--- /dev/null
+++ b/components/groups/GroupForm.stories.js
@@ -0,0 +1,24 @@
+import GroupForm from './GroupForm.vue';
+
+export default {
+ title: 'Domain/Groups/GroupForm',
+ component: GroupForm,
+ args: {
+ editingItem: null,
+ apiError: '',
+ isSubmitting: false
+ }
+};
+
+export const Create = {};
+
+export const Edit = {
+ args: {
+ editingItem: {
+ id: 1,
+ name: 'Vacation',
+ description: 'Holiday spending',
+ icon: 'Plane'
+ }
+ }
+};
diff --git a/components/groups/GroupForm.vue b/components/groups/GroupForm.vue
new file mode 100644
index 0000000..e71a397
--- /dev/null
+++ b/components/groups/GroupForm.vue
@@ -0,0 +1,238 @@
+
+
+
+
+
+
+
+
+
+
+ {{ t('Cancel') }}
+
+
+ {{ isEditing ? t('Updating...') : t('Creating...') }}
+ {{ isEditing ? t('Update Group') : t('Create Group') }}
+
+
+
+
+
+
+
+
diff --git a/components/holdings/HoldingForm.stories.js b/components/holdings/HoldingForm.stories.js
new file mode 100644
index 0000000..b111f36
--- /dev/null
+++ b/components/holdings/HoldingForm.stories.js
@@ -0,0 +1,34 @@
+import HoldingForm from './HoldingForm.vue';
+
+export default {
+ title: 'Domain/Holdings/HoldingForm',
+ component: HoldingForm,
+ args: {
+ open: true,
+ editing: null,
+ submitting: false,
+ defaultCurrency: 'USD',
+ searchCoins: async (q) => [
+ { id: 'bitcoin', name: 'Bitcoin', symbol: 'BTC' },
+ { id: 'ethereum', name: 'Ethereum', symbol: 'ETH' }
+ ]
+ }
+};
+
+export const Add = {};
+
+export const Edit = {
+ args: {
+ editing: {
+ id: 1,
+ name: 'Bitcoin',
+ symbol: 'BTC',
+ quantity: 0.5,
+ currency: 'USD',
+ unit_price: 64000,
+ price_source: 'auto',
+ provider: 'coingecko',
+ external_ref: 'bitcoin'
+ }
+ }
+};
diff --git a/components/holdings/HoldingForm.vue b/components/holdings/HoldingForm.vue
new file mode 100644
index 0000000..d9b0c19
--- /dev/null
+++ b/components/holdings/HoldingForm.vue
@@ -0,0 +1,438 @@
+
+
+
+
+
+ {{ editing ? t('Edit holding') : t('Add holding') }}
+
+
+
+
+
+
+
{{ t('Price source') }}
+
+
+ {{ t('Live') }}
+
+
+ {{ t('Manual') }}
+
+
+
+
+
+
{{ t('Coin') }}
+
+
+
+
+ {{ c.symbol }} {{ c.name }}
+
+
+
+
+ {{ t('Priced automatically from CoinGecko') }} ({{ form.external_ref }})
+
+
+
+
+ {{ t('Name') }}
+
+
+
+
+
+
+
+ {{ t('Currency') }}
+
+ {{ c.code }}
+
+
+
+ {{ t('Price per unit') }}
+
+
+
+
+
{{ error }}
+
+
+ {{ editing ? t('Save changes') : t('Add holding') }}
+
+
+
+
+
+
+
+
+
diff --git a/components/icons/GoogleIcon.stories.js b/components/icons/GoogleIcon.stories.js
new file mode 100644
index 0000000..db49a8a
--- /dev/null
+++ b/components/icons/GoogleIcon.stories.js
@@ -0,0 +1,14 @@
+import GoogleIcon from './GoogleIcon.vue';
+
+export default {
+ title: 'Primitives/GoogleIcon',
+ component: GoogleIcon,
+};
+
+export const Default = {};
+export const Large = {
+ render: () => ({
+ components: { GoogleIcon },
+ template: `
`,
+ }),
+};
diff --git a/components/icons/GoogleIcon.vue b/components/icons/GoogleIcon.vue
new file mode 100644
index 0000000..0d272e5
--- /dev/null
+++ b/components/icons/GoogleIcon.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
diff --git a/components/imports/ImportAnalyzing.stories.js b/components/imports/ImportAnalyzing.stories.js
new file mode 100644
index 0000000..c826a34
--- /dev/null
+++ b/components/imports/ImportAnalyzing.stories.js
@@ -0,0 +1,16 @@
+import ImportAnalyzing from './ImportAnalyzing.vue';
+
+export default {
+ title: 'Domain/Imports/ImportAnalyzing',
+ component: ImportAnalyzing,
+ args: {
+ fileName: 'march-statement.pdf',
+ status: 'extracting'
+ }
+};
+
+export const Extracting = {};
+
+export const Checking = {
+ args: { status: 'checking' }
+};
diff --git a/components/imports/ImportAnalyzing.vue b/components/imports/ImportAnalyzing.vue
new file mode 100644
index 0000000..0501f74
--- /dev/null
+++ b/components/imports/ImportAnalyzing.vue
@@ -0,0 +1,257 @@
+
+
+
+
+
{{ currentMessage }}
+
{{ fileName }}
+
+
+
+
+
+
+
+
diff --git a/components/imports/ImportConfirmDialog.stories.js b/components/imports/ImportConfirmDialog.stories.js
new file mode 100644
index 0000000..3ebec30
--- /dev/null
+++ b/components/imports/ImportConfirmDialog.stories.js
@@ -0,0 +1,19 @@
+import ImportConfirmDialog from './ImportConfirmDialog.vue';
+
+export default {
+ title: 'Domain/Imports/ImportConfirmDialog',
+ component: ImportConfirmDialog,
+ args: {
+ show: true,
+ acceptedCount: 25,
+ rejectedCount: 3,
+ duplicatesInAccepted: 2,
+ isConfirming: false,
+ newWalletCount: 1,
+ newPartyCount: 2,
+ newCategoryCount: 0,
+ missingWalletCount: 0
+ }
+};
+
+export const Default = {};
diff --git a/components/imports/ImportConfirmDialog.vue b/components/imports/ImportConfirmDialog.vue
new file mode 100644
index 0000000..47470e2
--- /dev/null
+++ b/components/imports/ImportConfirmDialog.vue
@@ -0,0 +1,267 @@
+
+
+
+
{{ t('Confirm import') }}
+
+
+
{{ t('You are about to import {count} transactions.', { count: acceptedCount }) }}
+
+
+ {{
+ t('{count} of these may be duplicates of existing transactions.', {
+ count: duplicatesInAccepted
+ })
+ }}
+
+
+
+ {{ t('{count} suggestions will be skipped.', { count: rejectedCount }) }}
+
+
+
+
+ {{ t("Some transactions reference items that don't exist yet:") }}
+
+
+
+
+ {{ t('Create {count} new wallets', { count: newWalletCount }) }}
+
+
+
+
+ {{ t('Create {count} new parties', { count: newPartyCount }) }}
+
+
+
+
+ {{ t('Create {count} new categories', { count: newCategoryCount }) }}
+
+
+
+ {{ t('Unchecked items will be skipped and not linked to the transaction.') }}
+
+
+
+ {{
+ t(
+ 'Some accepted rows have no wallet selected. Either choose one or enable "Create new wallets".'
+ )
+ }}
+
+
+
+
+
+
+ {{ t('Cancel') }}
+
+
+ {{ isConfirming ? t('Importing...') : t('Confirm import') }}
+
+
+
+
+
+
+
+
+
diff --git a/components/imports/ImportSessionsList.stories.js b/components/imports/ImportSessionsList.stories.js
new file mode 100644
index 0000000..8a976ba
--- /dev/null
+++ b/components/imports/ImportSessionsList.stories.js
@@ -0,0 +1,28 @@
+import ImportSessionsList from './ImportSessionsList.vue';
+
+const sessions = [
+ {
+ id: 1,
+ file_name: 'march-statement.pdf',
+ status: 'ready',
+ created_at: '2024-03-24T10:00:00Z',
+ metadata: { total_suggestions: 28, duplicates_found: 3 }
+ },
+ {
+ id: 2,
+ file_name: 'receipts.jpg',
+ status: 'confirmed',
+ created_at: '2024-03-18T09:00:00Z',
+ metadata: { total_suggestions: 12, duplicates_found: 0 }
+ }
+];
+
+export default {
+ title: 'Domain/Imports/ImportSessionsList',
+ component: ImportSessionsList,
+ args: {
+ sessions
+ }
+};
+
+export const Default = {};
diff --git a/components/imports/ImportSessionsList.vue b/components/imports/ImportSessionsList.vue
new file mode 100644
index 0000000..d8e11d2
--- /dev/null
+++ b/components/imports/ImportSessionsList.vue
@@ -0,0 +1,235 @@
+
+
+
{{ t('Recent imports') }}
+
+
+
+
+
+
+
diff --git a/components/imports/ImportUpload.stories.js b/components/imports/ImportUpload.stories.js
new file mode 100644
index 0000000..5c4bbdf
--- /dev/null
+++ b/components/imports/ImportUpload.stories.js
@@ -0,0 +1,15 @@
+import ImportUpload from './ImportUpload.vue';
+
+export default {
+ title: 'Domain/Imports/ImportUpload',
+ component: ImportUpload,
+ args: {
+ isAnalyzing: false
+ }
+};
+
+export const Default = {};
+
+export const Analyzing = {
+ args: { isAnalyzing: true }
+};
diff --git a/components/imports/ImportUpload.vue b/components/imports/ImportUpload.vue
new file mode 100644
index 0000000..4023785
--- /dev/null
+++ b/components/imports/ImportUpload.vue
@@ -0,0 +1,685 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ activeDoc.name }}
+ {{ activeDoc.format }}
+
+
{{ activeDoc.badge }}
+
+
+
+
+
+
+
+
+
+
+
{{ t('Smart import') }}
+
{{ t('Bring your statements and receipts to life') }}
+
+ {{
+ t(
+ 'Drop a CSV, PDF, or photo. We extract the transactions, match wallets and categories, and let you review before saving.'
+ )
+ }}
+
+
+
+
+
+
{{ t('Drop your file here or click to browse') }}
+
{{ t('Supports CSV, PDF, PNG, JPG, TIFF, BMP') }}
+
+
+
+
+
+
+
+ {{ selectedFile.name }}
+
+
+
+
+
+
+
+ {{ t('Document type') }}
+
+ {{ t('Auto-detect') }}
+ {{ t('Bank statement') }}
+ {{ t('Receipt') }}
+ {{ t('Invoice') }}
+ {{ t('Pay stub') }}
+ {{ t('Utility bill') }}
+
+
+
+
+ {{ isAnalyzing ? t('Analyzing...') : t('Analyze document') }}
+
+
+
+
+
+
+
+
+
+
diff --git a/components/imports/SuggestionReviewTable.stories.js b/components/imports/SuggestionReviewTable.stories.js
new file mode 100644
index 0000000..e507887
--- /dev/null
+++ b/components/imports/SuggestionReviewTable.stories.js
@@ -0,0 +1,50 @@
+import SuggestionReviewTable from './SuggestionReviewTable.vue';
+
+const suggestions = [
+ {
+ index: 0,
+ status: 'accepted',
+ description: 'Weekly groceries',
+ amount: 142.5,
+ date: '2024-03-24',
+ type: 'expense',
+ wallet_id: 1,
+ category_id: 1,
+ party_id: 1,
+ duplicate: null
+ },
+ {
+ index: 1,
+ status: 'pending',
+ description: 'Monthly salary',
+ amount: 2800,
+ date: '2024-03-20',
+ type: 'income',
+ wallet_id: 1,
+ category_id: 2,
+ party_id: 2,
+ duplicate: null
+ }
+];
+
+export default {
+ title: 'Domain/Imports/SuggestionReviewTable',
+ component: SuggestionReviewTable,
+ args: {
+ suggestions,
+ wallets: [{ id: 1, name: 'Main Bank Account' }],
+ categories: [
+ { id: 1, name: 'Food & Dining' },
+ { id: 2, name: 'Salary' }
+ ],
+ parties: [
+ { id: 1, name: 'Grocery Store' },
+ { id: 2, name: 'Employer' }
+ ],
+ acceptedCount: 1,
+ rejectedCount: 0,
+ pendingCount: 1
+ }
+};
+
+export const Default = {};
diff --git a/components/imports/SuggestionReviewTable.vue b/components/imports/SuggestionReviewTable.vue
new file mode 100644
index 0000000..23fb95d
--- /dev/null
+++ b/components/imports/SuggestionReviewTable.vue
@@ -0,0 +1,584 @@
+
+
+
+
+ {{ t('Accept all') }}
+
+
+ {{ t('Reject all') }}
+
+
+ {{
+ t('{accepted} accepted, {rejected} rejected, {pending} pending', {
+ accepted: acceptedCount,
+ rejected: rejectedCount,
+ pending: pendingCount
+ })
+ }}
+
+
+
+
+
+
+
+
+
+
diff --git a/components/modals/ConfirmModal.stories.js b/components/modals/ConfirmModal.stories.js
new file mode 100644
index 0000000..275a550
--- /dev/null
+++ b/components/modals/ConfirmModal.stories.js
@@ -0,0 +1,22 @@
+import ConfirmModal from './ConfirmModal.vue';
+
+export default {
+ title: 'Modals/ConfirmModal',
+ component: ConfirmModal,
+ tags: ['autodocs'],
+ argTypes: {
+ type: { control: 'select', options: ['warning', 'danger', 'info'] }
+ }
+};
+
+const base = {
+ isOpen: true,
+ title: 'Are you sure?',
+ message: 'This action cannot be undone.',
+ confirmText: 'Confirm',
+ cancelText: 'Cancel'
+};
+
+export const Warning = { args: { ...base, type: 'warning' } };
+export const Danger = { args: { ...base, type: 'danger', title: 'Delete item?', message: 'This will permanently delete the item.' } };
+export const Info = { args: { ...base, type: 'info', title: 'Heads up', message: 'This will affect all linked records.' } };
diff --git a/components/modals/ConfirmModal.vue b/components/modals/ConfirmModal.vue
new file mode 100644
index 0000000..d1720a6
--- /dev/null
+++ b/components/modals/ConfirmModal.vue
@@ -0,0 +1,205 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ cancelText || t('Cancel') }}
+
+
+ {{ confirmText || t('Confirm') }}
+
+
+
+
+
+
+
+
+
+
diff --git a/components/modals/LearningModal.stories.js b/components/modals/LearningModal.stories.js
new file mode 100644
index 0000000..845774b
--- /dev/null
+++ b/components/modals/LearningModal.stories.js
@@ -0,0 +1,11 @@
+import LearningModal from './LearningModal.vue';
+
+export default {
+ title: 'Domain/Modals/LearningModal',
+ component: LearningModal,
+ args: {
+ isOpen: true
+ }
+};
+
+export const Open = {};
diff --git a/components/modals/LearningModal.vue b/components/modals/LearningModal.vue
new file mode 100644
index 0000000..45191be
--- /dev/null
+++ b/components/modals/LearningModal.vue
@@ -0,0 +1,701 @@
+
+
+
+
+
+
+
+
+
+ {{ tab.label }}
+
+
+
+
+
+
{{ t('Core Concepts') }}
+
+
+
+
{{ concept.description }}
+
+
+
+
+
+
+
{{ t('Quick Tips') }}
+
+
+
+
{{ tip.title }}
+
{{ tip.text }}
+
+
+
+
+
+
{{ t('Keyboard Shortcuts') }}
+
+
+
+ {{ key }}
+
+
{{ shortcut.action }}
+
+
+
+
+
+
{{ t('Frequently Asked Questions') }}
+
+
+
+ {{ faq.question }}
+
+
+
+ {{ faq.answer }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/modals/RecurringModal.stories.js b/components/modals/RecurringModal.stories.js
new file mode 100644
index 0000000..771475d
--- /dev/null
+++ b/components/modals/RecurringModal.stories.js
@@ -0,0 +1,24 @@
+import RecurringModal from './RecurringModal.vue';
+
+export default {
+ title: 'Domain/Modals/RecurringModal',
+ component: RecurringModal,
+ args: {
+ isOpen: true,
+ transaction: {
+ id: 12,
+ isRecurring: true,
+ recurrencePeriod: 'monthly',
+ recurrenceInterval: 1,
+ recurrenceEndsAt: null
+ }
+ }
+};
+
+export const EditingRecurring = {};
+
+export const NewRecurring = {
+ args: {
+ transaction: null
+ }
+};
diff --git a/components/modals/RecurringModal.vue b/components/modals/RecurringModal.vue
new file mode 100644
index 0000000..cdae6b4
--- /dev/null
+++ b/components/modals/RecurringModal.vue
@@ -0,0 +1,424 @@
+
+
+
+
+
+
+
+
+
+ {{ t('Repeat every') }} {{ transaction?.recurrenceInterval || 1 }}
+ {{ periodLabel(transaction?.recurrencePeriod) }}
+
+
+
+
+
+ {{ t('Recurrence period') }}
+
+ {{ t('Daily') }}
+ {{ t('Weekly') }}
+ {{ t('Monthly') }}
+ {{ t('Yearly') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/onboarding/DashboardOnboarding.stories.js b/components/onboarding/DashboardOnboarding.stories.js
new file mode 100644
index 0000000..b7cda9b
--- /dev/null
+++ b/components/onboarding/DashboardOnboarding.stories.js
@@ -0,0 +1,23 @@
+import DashboardOnboarding from './DashboardOnboarding.vue';
+
+export default {
+ title: 'Domain/Onboarding/DashboardOnboarding',
+ component: DashboardOnboarding,
+ args: {
+ hasWallets: true,
+ hasCategories: false,
+ hasTransactions: false,
+ hasParties: false
+ }
+};
+
+export const Default = {};
+
+export const AllComplete = {
+ args: {
+ hasWallets: true,
+ hasCategories: true,
+ hasTransactions: true,
+ hasParties: true
+ }
+};
diff --git a/components/onboarding/DashboardOnboarding.vue b/components/onboarding/DashboardOnboarding.vue
new file mode 100644
index 0000000..fd55447
--- /dev/null
+++ b/components/onboarding/DashboardOnboarding.vue
@@ -0,0 +1,479 @@
+
+
+
+
+
+
Welcome to Your Financial Dashboard!
+
+ We've created some starter items for you, but let's personalize them and add your real
+ financial data to get the most out of Trakli.
+
+
+
+
+
+
+
+
+
+
+
+ {{ step.action }}
+
+
+
+ Completed
+
+
+
+
+
+
+
+
+ Customize your default wallet with your real bank account name and balance
+
+ We've added basic categories - add personal ones like "Coffee", "Gym", "Netflix", "Uber"
+
+ Start with your most recent transactions to see your money flow instantly
+ Add parties (employer, grocery store, etc.) for detailed spending patterns
+
+
+
+
+
+
+
+
diff --git a/components/onboarding/OnboardingEmptyState.stories.js b/components/onboarding/OnboardingEmptyState.stories.js
new file mode 100644
index 0000000..582bee0
--- /dev/null
+++ b/components/onboarding/OnboardingEmptyState.stories.js
@@ -0,0 +1,19 @@
+import OnboardingEmptyState from './OnboardingEmptyState.vue';
+
+export default {
+ title: 'Domain/Onboarding/OnboardingEmptyState',
+ component: OnboardingEmptyState,
+ args: {
+ pageType: 'transactions'
+ }
+};
+
+export const Transactions = {};
+
+export const Wallets = {
+ args: { pageType: 'wallets' }
+};
+
+export const Categories = {
+ args: { pageType: 'categories' }
+};
diff --git a/components/onboarding/OnboardingEmptyState.vue b/components/onboarding/OnboardingEmptyState.vue
new file mode 100644
index 0000000..90ca02d
--- /dev/null
+++ b/components/onboarding/OnboardingEmptyState.vue
@@ -0,0 +1,523 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ t('Getting started') }}
+
{{ t(config.title) }}
+
{{ t(config.subtitle) }}
+
+
+
+
+ {{ index + 1 }}
+ {{ t(step) }}
+
+
+
+
+
+
+
+ {{ t(config.primaryAction) }}
+
+
+
+
+
+
{{ t(config.tip) }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/onboarding/OnboardingWizard.stories.js b/components/onboarding/OnboardingWizard.stories.js
new file mode 100644
index 0000000..4e82142
--- /dev/null
+++ b/components/onboarding/OnboardingWizard.stories.js
@@ -0,0 +1,8 @@
+import OnboardingWizard from './OnboardingWizard.vue';
+
+export default {
+ title: 'Domain/Onboarding/OnboardingWizard',
+ component: OnboardingWizard
+};
+
+export const Default = {};
diff --git a/components/onboarding/OnboardingWizard.vue b/components/onboarding/OnboardingWizard.vue
new file mode 100644
index 0000000..b269b8b
--- /dev/null
+++ b/components/onboarding/OnboardingWizard.vue
@@ -0,0 +1,501 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ step.title }}
+
{{ step.description }}
+
+
+
Why this matters:
+
+
+
+ {{ benefit.text }}
+
+
+
+
+
+
+
+
+ {{ step.buttonText }}
+
+
+ Start Using Trakli
+
+
+ {{ step.buttonText }}
+
+
+
+
+
+
+
+
+
+ Previous
+
+
+
{{ currentStepIndex + 1 }} of {{ steps.length }}
+
+
+ Next
+
+
+
+
+
+
+
+
+
diff --git a/components/parties/PartiesStatsStrip.stories.js b/components/parties/PartiesStatsStrip.stories.js
new file mode 100644
index 0000000..fc68953
--- /dev/null
+++ b/components/parties/PartiesStatsStrip.stories.js
@@ -0,0 +1,32 @@
+import PartiesStatsStrip from './PartiesStatsStrip.vue';
+
+const parties = [
+ { id: 1, name: 'Acme Corp', receivedAmount: 0, spentAmount: 4200 },
+ { id: 2, name: 'Alice Johnson', receivedAmount: 6800, spentAmount: 120 },
+ { id: 3, name: 'SaaS Tooling Inc', receivedAmount: 0, spentAmount: 890 },
+ { id: 4, name: 'Robert Davis', receivedAmount: 2500, spentAmount: 0 }
+];
+
+export default {
+ title: 'Domain/Parties/PartiesStatsStrip',
+ component: PartiesStatsStrip,
+ args: {
+ parties,
+ currency: 'USD'
+ }
+};
+
+export const Default = {};
+
+export const NetNegative = {
+ args: {
+ parties: [
+ { id: 1, name: 'Big Vendor', receivedAmount: 0, spentAmount: 9500 },
+ { id: 2, name: 'Small Client', receivedAmount: 1200, spentAmount: 0 }
+ ]
+ }
+};
+
+export const Empty = {
+ args: { parties: [] }
+};
diff --git a/components/parties/PartiesStatsStrip.vue b/components/parties/PartiesStatsStrip.vue
new file mode 100644
index 0000000..93836ee
--- /dev/null
+++ b/components/parties/PartiesStatsStrip.vue
@@ -0,0 +1,197 @@
+
+
+
+
+
+
+
+
{{ stat.label }}
+
{{ stat.value }}
+
{{ stat.sub }}
+
+
+
+
+
+
+
+
diff --git a/components/parties/PartyDetailPanel.stories.js b/components/parties/PartyDetailPanel.stories.js
new file mode 100644
index 0000000..27f0bd0
--- /dev/null
+++ b/components/parties/PartyDetailPanel.stories.js
@@ -0,0 +1,35 @@
+import PartyDetailPanel from './PartyDetailPanel.vue';
+
+const party = {
+ id: 1,
+ name: 'Grocery Store',
+ type: 'organization',
+ description: 'Weekly groceries',
+ icon: 'Store'
+};
+
+const transactions = [
+ { date: '2024-03-24', type: 'EXPENSE', amount: '142.50 USD', party: 'Grocery Store', category: 'Food & Dining' },
+ { date: '2024-03-20', type: 'EXPENSE', amount: '68.00 USD', party: 'Grocery Store', category: 'Food & Dining' },
+ { date: '2024-03-15', type: 'EXPENSE', amount: '210.00 USD', party: 'Grocery Store', category: 'Food & Dining' }
+];
+
+export default {
+ title: 'Domain/Parties/PartyDetailPanel',
+ component: PartyDetailPanel,
+ args: {
+ party,
+ transactions,
+ currency: 'USD',
+ showBack: false
+ }
+};
+
+export const WithParty = {};
+
+export const Empty = {
+ args: {
+ party: null,
+ transactions: []
+ }
+};
diff --git a/components/parties/PartyDetailPanel.vue b/components/parties/PartyDetailPanel.vue
new file mode 100644
index 0000000..3fcbda4
--- /dev/null
+++ b/components/parties/PartyDetailPanel.vue
@@ -0,0 +1,880 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ t('Select a party') }}
+
+ {{
+ t('Pick someone on the left to see their activity, balances, and recent transactions.')
+ }}
+
+
+
+
+
+
+
+
+
+
{{ t('Received') }}
+
{{ formatter(party.receivedAmount || 0, currency) }}
+
+
+
+
{{ t('Spent') }}
+
{{ formatter(party.spentAmount || 0, currency) }}
+
+
+
+
{{ t('Net') }}
+
+ {{ formatter(netValue, currency) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ m.label }}
+
+
+
+
+
{{ t('No activity in the last 6 months yet.') }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ tx.category || tx.description || t('Transaction')
+ }}
+ {{ formatDate(tx.date || tx.datetime) }}
+
+
+
+ {{ formatter(parseAmount(tx.amount).value, currency) }}
+
+
+
+
+ {{ t('No transactions yet with this party.') }}
+
+
+
+
+
+
+
+
+
+
diff --git a/components/reminders/ReminderForm.stories.js b/components/reminders/ReminderForm.stories.js
new file mode 100644
index 0000000..a6b05e5
--- /dev/null
+++ b/components/reminders/ReminderForm.stories.js
@@ -0,0 +1,27 @@
+import ReminderForm from './ReminderForm.vue';
+
+export default {
+ title: 'Domain/Reminders/ReminderForm',
+ component: ReminderForm,
+ args: {
+ editingItem: null,
+ apiError: '',
+ isSubmitting: false
+ }
+};
+
+export const Create = {};
+
+export const Edit = {
+ args: {
+ editingItem: {
+ id: 1,
+ title: 'Review weekly expenses',
+ description: 'Check last week spend',
+ type: 'weekly_review',
+ priority: 0,
+ trigger_at: '2024-03-25T09:00',
+ timezone: 'UTC'
+ }
+ }
+};
diff --git a/components/reminders/ReminderForm.vue b/components/reminders/ReminderForm.vue
new file mode 100644
index 0000000..bf3a351
--- /dev/null
+++ b/components/reminders/ReminderForm.vue
@@ -0,0 +1,388 @@
+
+
+
+
+
+
+
diff --git a/components/reports/CalendarHeatmap.stories.js b/components/reports/CalendarHeatmap.stories.js
new file mode 100644
index 0000000..768327c
--- /dev/null
+++ b/components/reports/CalendarHeatmap.stories.js
@@ -0,0 +1,41 @@
+import CalendarHeatmap from './CalendarHeatmap.vue';
+
+const generateMonthBuckets = () => {
+ const buckets = [];
+ const now = new Date();
+ const year = now.getFullYear();
+ const month = now.getMonth();
+ const days = new Date(year, month + 1, 0).getDate();
+
+ for (let d = 1; d <= days; d++) {
+ const dayStr = String(d).padStart(2, '0');
+ const mStr = String(month + 1).padStart(2, '0');
+ const date = `${year}-${mStr}-${dayStr}`;
+ const expense = d % 4 === 0 ? 0 : Math.round((d * 23.5) % 180);
+ const income = d === 1 || d === 15 ? 2400 : 0;
+ buckets.push({
+ date,
+ expense,
+ income,
+ net: income - expense
+ });
+ }
+ return buckets;
+};
+
+export default {
+ title: 'Domain/Reports/CalendarHeatmap',
+ component: CalendarHeatmap,
+ args: {
+ buckets: generateMonthBuckets(),
+ currency: 'USD'
+ }
+};
+
+export const CurrentMonth = {};
+
+export const Empty = {
+ args: {
+ buckets: []
+ }
+};
diff --git a/components/reports/CalendarHeatmap.vue b/components/reports/CalendarHeatmap.vue
new file mode 100644
index 0000000..ab103ff
--- /dev/null
+++ b/components/reports/CalendarHeatmap.vue
@@ -0,0 +1,325 @@
+
+
+
+
+
+
+ {{ month.label }}
+
+ {{ dow }}
+ 0 && $emit('select-day', slot)"
+ >
+ {{ slot.dayNum }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/reports/CalendarTab.stories.js b/components/reports/CalendarTab.stories.js
new file mode 100644
index 0000000..7640623
--- /dev/null
+++ b/components/reports/CalendarTab.stories.js
@@ -0,0 +1,41 @@
+import CalendarTab from './CalendarTab.vue';
+
+const generateMonthBuckets = () => {
+ const buckets = [];
+ const now = new Date();
+ const year = now.getFullYear();
+ const month = now.getMonth();
+ const days = new Date(year, month + 1, 0).getDate();
+
+ for (let d = 1; d <= days; d++) {
+ const dayStr = String(d).padStart(2, '0');
+ const mStr = String(month + 1).padStart(2, '0');
+ const date = `${year}-${mStr}-${dayStr}`;
+ const expense = d % 4 === 0 ? 0 : Math.round((d * 23.5) % 180);
+ const income = d === 1 || d === 15 ? 2400 : 0;
+ buckets.push({
+ date,
+ expense,
+ income,
+ net: income - expense
+ });
+ }
+ return buckets;
+};
+
+export default {
+ title: 'Domain/Reports/CalendarTab',
+ component: CalendarTab,
+ args: {
+ buckets: generateMonthBuckets(),
+ currency: 'USD'
+ }
+};
+
+export const CurrentMonth = {};
+
+export const Empty = {
+ args: {
+ buckets: []
+ }
+};
diff --git a/components/reports/CalendarTab.vue b/components/reports/CalendarTab.vue
new file mode 100644
index 0000000..e4c9fa9
--- /dev/null
+++ b/components/reports/CalendarTab.vue
@@ -0,0 +1,366 @@
+
+
+
+
+
+
+
diff --git a/components/reports/CashflowHero.stories.js b/components/reports/CashflowHero.stories.js
new file mode 100644
index 0000000..3239ec2
--- /dev/null
+++ b/components/reports/CashflowHero.stories.js
@@ -0,0 +1,60 @@
+import CashflowHero from './CashflowHero.vue';
+
+const sampleTrailing = [
+ { income: 4200, expense: 3100, net: 1100 },
+ { income: 4500, expense: 3400, net: 1100 },
+ { income: 4100, expense: 2900, net: 1200 },
+ { income: 5200, expense: 3200, net: 2000 },
+ { income: 4800, expense: 3300, net: 1500 },
+ { income: 5600, expense: 3100, net: 2500 }
+];
+
+export default {
+ title: 'Domain/Reports/CashflowHero',
+ component: CashflowHero,
+ args: {
+ totals: {
+ net: 2500,
+ prevNet: 1500,
+ netDelta: 66.7,
+ income: 5600,
+ prevIncome: 4800,
+ incomeDelta: 16.7,
+ expense: 3100,
+ prevExpense: 3300,
+ expenseDelta: -6.1,
+ savingsRate: 0.446,
+ prevSavingsRate: 0.3125,
+ savingsRateDelta: 13.4
+ },
+ trailing: sampleTrailing,
+ compareEnabled: true,
+ currency: 'USD'
+ }
+};
+
+export const SurplusPeriod = {};
+
+export const DeficitPeriod = {
+ args: {
+ totals: {
+ net: -850,
+ prevNet: 320,
+ netDelta: -365.6,
+ income: 2400,
+ prevIncome: 2900,
+ incomeDelta: -17.2,
+ expense: 3250,
+ prevExpense: 2580,
+ expenseDelta: 26.0,
+ savingsRate: 0,
+ prevSavingsRate: 0.11,
+ savingsRateDelta: -11.0
+ },
+ trailing: [
+ { income: 3100, expense: 2800, net: 300 },
+ { income: 2900, expense: 2580, net: 320 },
+ { income: 2400, expense: 3250, net: -850 }
+ ]
+ }
+};
diff --git a/components/reports/CashflowHero.vue b/components/reports/CashflowHero.vue
new file mode 100644
index 0000000..3b2ff0c
--- /dev/null
+++ b/components/reports/CashflowHero.vue
@@ -0,0 +1,404 @@
+
+
+
+
+ {{ t('Net for the period') }}
+
+ {{ totals.net >= 0 ? t('Surplus') : t('Deficit') }}
+
+
+
+
{{ format(totals.net) }}
+
+
+ {{ totals.netDelta > 0 ? '+' : '' }}{{ totals.netDelta }}%
+
+
+
+ {{ t('vs') }} {{ format(totals.prevNet) }}
+ {{ t('previous period') }}
+
+
+
+
+
+
+
+
+
+
+
{{ format(totals.income) }}
+
+ {{ totals.incomeDelta > 0 ? '+' : '' }}{{ totals.incomeDelta }}%
+
+
+
+ {{ t('vs') }} {{ format(totals.prevIncome) }}
+
+
+
+
+
+
+
+
+
{{ format(totals.expense) }}
+
+ {{ totals.expenseDelta > 0 ? '+' : '' }}{{ totals.expenseDelta }}%
+
+
+
+ {{ t('vs') }} {{ format(totals.prevExpense) }}
+
+
+
+
+
+
+
+
+ {{ t('Savings rate') }}
+
+
+
{{ ((totals.savingsRate || 0) * 100).toFixed(0) }}%
+
+ {{ totals.savingsRateDelta > 0 ? '+' : '' }}{{ totals.savingsRateDelta }} pts
+
+
+
+ {{ t('vs') }} {{ ((totals.prevSavingsRate || 0) * 100).toFixed(0) }}%
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/reports/CategoriesTab.stories.js b/components/reports/CategoriesTab.stories.js
new file mode 100644
index 0000000..632a774
--- /dev/null
+++ b/components/reports/CategoriesTab.stories.js
@@ -0,0 +1,103 @@
+import CategoriesTab from './CategoriesTab.vue';
+
+const expenseCategories = [
+ {
+ name: 'Housing & Rent',
+ amount: 1450,
+ color: '#8b5cf6',
+ count: 2,
+ percentage: 34.5,
+ prevAmount: 1500,
+ delta: -3.3,
+ trend: [1500, 1480, 1460, 1450, 1460, 1450]
+ },
+ {
+ name: 'Food & Dining',
+ amount: 820,
+ color: '#10b981',
+ count: 24,
+ percentage: 19.5,
+ prevAmount: 900,
+ delta: -8.9,
+ trend: [950, 890, 820, 840, 790, 820]
+ },
+ {
+ name: 'Transport',
+ amount: 460,
+ color: '#f59e0b',
+ count: 11,
+ percentage: 10.9,
+ prevAmount: 430,
+ delta: 7.0,
+ trend: [400, 410, 430, 450, 440, 460]
+ },
+ {
+ name: 'Utilities',
+ amount: 380,
+ color: '#3b82f6',
+ count: 4,
+ percentage: 9.0,
+ prevAmount: 390,
+ delta: -2.6,
+ trend: [400, 390, 385, 380, 375, 380]
+ }
+];
+
+const incomeCategories = [
+ {
+ name: 'Salary',
+ amount: 4800,
+ color: '#10b981',
+ count: 2,
+ percentage: 78.0,
+ prevAmount: 4700,
+ delta: 2.1,
+ trend: [4600, 4700, 4700, 4800, 4800, 4800]
+ },
+ {
+ name: 'Freelance',
+ amount: 1200,
+ color: '#3b82f6',
+ count: 5,
+ percentage: 19.5,
+ prevAmount: 900,
+ delta: 33.3,
+ trend: [700, 800, 900, 1000, 1100, 1200]
+ },
+ {
+ name: 'Interest',
+ amount: 150,
+ color: '#f59e0b',
+ count: 1,
+ percentage: 2.4,
+ prevAmount: 140,
+ delta: 7.1,
+ trend: [120, 130, 135, 140, 145, 150]
+ }
+];
+
+export default {
+ title: 'Domain/Reports/CategoriesTab',
+ component: CategoriesTab,
+ args: {
+ incomeCategories,
+ expenseCategories,
+ compareEnabled: true,
+ currency: 'USD'
+ }
+};
+
+export const WithComparison = {};
+
+export const WithoutComparison = {
+ args: {
+ compareEnabled: false
+ }
+};
+
+export const Empty = {
+ args: {
+ incomeCategories: [],
+ expenseCategories: []
+ }
+};
diff --git a/components/reports/CategoriesTab.vue b/components/reports/CategoriesTab.vue
new file mode 100644
index 0000000..1c3f04b
--- /dev/null
+++ b/components/reports/CategoriesTab.vue
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+ $emit('drill', { ...b, kind: 'income' })"
+ />
+
+
+ $emit('drill', { ...b, kind: 'expense' })"
+ />
+
+
+
+
+
+
+
+
diff --git a/components/reports/CategoryDrillModal.stories.js b/components/reports/CategoryDrillModal.stories.js
new file mode 100644
index 0000000..0d7d61d
--- /dev/null
+++ b/components/reports/CategoryDrillModal.stories.js
@@ -0,0 +1,75 @@
+import CategoryDrillModal from './CategoryDrillModal.vue';
+
+const sampleBucket = {
+ name: 'Food & Dining',
+ color: '#10b981',
+ count: 24,
+ amount: 820.0,
+ delta: -12.4,
+ kind: 'expense',
+ trend: [950, 890, 820, 840, 790, 820]
+};
+
+const sampleTransactions = [
+ {
+ id: 't1',
+ party: 'Whole Foods Market',
+ category: 'Food & Dining',
+ type: 'EXPENSE',
+ amount: 142.5,
+ date: '2024-03-24'
+ },
+ {
+ id: 't2',
+ party: 'City Bistro',
+ category: 'Food & Dining',
+ type: 'EXPENSE',
+ amount: 68.0,
+ date: '2024-03-20'
+ },
+ {
+ id: 't3',
+ party: 'Corner Cafe',
+ category: 'Food & Dining',
+ type: 'EXPENSE',
+ amount: 12.5,
+ date: '2024-03-18'
+ }
+];
+
+export default {
+ title: 'Domain/Reports/CategoryDrillModal',
+ component: CategoryDrillModal,
+ args: {
+ open: true,
+ bucket: sampleBucket,
+ transactions: sampleTransactions,
+ trailingMonths: [
+ { month: '2023-10' },
+ { month: '2023-11' },
+ { month: '2023-12' },
+ { month: '2024-01' },
+ { month: '2024-02' },
+ { month: '2024-03' }
+ ],
+ currency: 'USD'
+ }
+};
+
+export const OpenModal = {};
+
+export const EmptyCategory = {
+ args: {
+ open: true,
+ bucket: {
+ name: 'Uncategorized',
+ color: '#6b7280',
+ count: 0,
+ amount: 0,
+ delta: 0,
+ kind: 'expense',
+ trend: [0, 0, 0, 0, 0, 0]
+ },
+ transactions: []
+ }
+};
diff --git a/components/reports/CategoryDrillModal.vue b/components/reports/CategoryDrillModal.vue
new file mode 100644
index 0000000..11091d6
--- /dev/null
+++ b/components/reports/CategoryDrillModal.vue
@@ -0,0 +1,511 @@
+
+
+
+
+
+
+
+
+
{{ bucket?.name || t('Category') }}
+
+ {{ t('Period overview · {n} transactions', { n: bucket?.count ?? 0 }) }}
+
+
+
+
+
+
+
+
+
+
+ {{ t('Total') }}
+ {{ formatAmount(bucket?.amount) }}
+
+
+ {{ t('Avg / month') }}
+ {{ formatAmount(avgPerMonth) }}
+
+
+ {{ t('Peak month') }}
+ {{ peakMonthLabel || '—' }}
+
+
+ {{ t('vs prior period') }}
+
+ {{ bucket?.delta > 0 ? '+' : '' }}{{ bucket?.delta ?? 0 }}%
+
+
+
+
+
+ {{ t('Trend (last 6 months)') }}
+
+
+
+ {{ monthLabels[i] || '' }}
+
+
+
+
+
+
+ {{ t('Top {kind}', { kind: bucket?.kind === 'income' ? t('sources') : t('payees') }) }}
+
+
+
+ {{ p.name }}
+
+
+
+ {{ formatAmount(p.amount) }}
+
+
+ {{ t('No transactions match.') }}
+
+
+
+ {{ t('Transactions') }}
+
+
+
+ {{ tx.party || tx.description || t('Unknown') }}
+ {{ formatDate(tx.date) }}
+
+
+ {{ isIncome(tx) ? '+' : '-' }}{{ formatAmount(tx.amount) }}
+
+
+
+ {{ t('No transactions match.') }}
+
+ {{ t('Show {n} more', { n: Math.min(10, filteredTxs.length - visibleCount) }) }}
+
+
+
+
+
+
+
+
+
+
diff --git a/components/reports/CategoryRanking.stories.js b/components/reports/CategoryRanking.stories.js
new file mode 100644
index 0000000..60aba39
--- /dev/null
+++ b/components/reports/CategoryRanking.stories.js
@@ -0,0 +1,64 @@
+import CategoryRanking from './CategoryRanking.vue';
+
+const sampleBuckets = [
+ {
+ name: 'Housing & Rent',
+ amount: 1450.0,
+ prevAmount: 1450.0,
+ delta: 0,
+ percentage: 42.6,
+ count: 2,
+ color: '#3b82f6',
+ trend: [1450, 1450, 1450, 1450, 1450]
+ },
+ {
+ name: 'Food & Groceries',
+ amount: 720.0,
+ prevAmount: 850.0,
+ delta: -15.3,
+ percentage: 21.2,
+ count: 18,
+ color: '#10b981',
+ trend: [900, 850, 800, 780, 720]
+ },
+ {
+ name: 'Utilities & Bills',
+ amount: 380.0,
+ prevAmount: 310.0,
+ delta: 22.6,
+ percentage: 11.2,
+ count: 5,
+ color: '#f59e0b',
+ trend: [280, 300, 310, 340, 380]
+ },
+ {
+ name: 'Entertainment',
+ amount: 240.0,
+ prevAmount: 320.0,
+ delta: -25.0,
+ percentage: 7.1,
+ count: 8,
+ color: '#8b5cf6',
+ trend: [350, 320, 290, 260, 240]
+ }
+];
+
+export default {
+ title: 'Domain/Reports/CategoryRanking',
+ component: CategoryRanking,
+ args: {
+ title: 'Top Spending Categories',
+ subtitle: 'Ranked by total net outflow this period',
+ buckets: sampleBuckets,
+ currency: 'USD',
+ showDelta: true
+ }
+};
+
+export const Default = {};
+
+export const EmptyState = {
+ args: {
+ buckets: []
+ }
+};
diff --git a/components/reports/CategoryRanking.vue b/components/reports/CategoryRanking.vue
new file mode 100644
index 0000000..4a5f73c
--- /dev/null
+++ b/components/reports/CategoryRanking.vue
@@ -0,0 +1,333 @@
+
+
+
+
+
{{ title }}
+
{{ subtitle }}
+
+
+
+
+
+
+
+
+
{{ t('No spending in this period') }}
+
+
+
+
+ {{ i + 1 }}
+
+
+
+ {{ b.name }}
+ {{ format(b.amount) }}
+
+
+
+
+
+ {{ (b.percentage ?? 0).toFixed(1) }}%
+
+ {{ t('{n} tx', { n: b.count }) }}
+
+
+
+ {{ b.delta > 0 ? '+' : '' }}{{ b.delta }}%
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/reports/ChartsTab.stories.js b/components/reports/ChartsTab.stories.js
new file mode 100644
index 0000000..f6a107d
--- /dev/null
+++ b/components/reports/ChartsTab.stories.js
@@ -0,0 +1,58 @@
+import ChartsTab from './ChartsTab.vue';
+
+const monthlyBuckets = [
+ { month: '2023-10', income: 5200, expense: 4100, net: 1100 },
+ { month: '2023-11', income: 5400, expense: 3900, net: 1500 },
+ { month: '2023-12', income: 6100, expense: 4800, net: 1300 },
+ { month: '2024-01', income: 5400, expense: 4200, net: 1200 },
+ { month: '2024-02', income: 5600, expense: 4100, net: 1500 },
+ { month: '2024-03', income: 6400, expense: 4400, net: 2000 }
+];
+
+const dailyBuckets = [
+ { date: '2024-03-01', expense: 120, txCount: 4 },
+ { date: '2024-03-02', expense: 0, txCount: 0 },
+ { date: '2024-03-03', expense: 210, txCount: 5 },
+ { date: '2024-03-04', expense: 65, txCount: 2 },
+ { date: '2024-03-05', expense: 0, txCount: 0 },
+ { date: '2024-03-06', expense: 340, txCount: 7 },
+ { date: '2024-03-07', expense: 90, txCount: 3 }
+];
+
+const expenseCategories = [
+ { name: 'Housing', amount: 1450, color: '#8b5cf6' },
+ { name: 'Food & Dining', amount: 820, color: '#10b981' },
+ { name: 'Transport', amount: 460, color: '#f59e0b' },
+ { name: 'Utilities', amount: 380, color: '#3b82f6' },
+ { name: 'Leisure', amount: 340, color: '#ec4899' },
+ { name: 'Health', amount: 250, color: '#14b8a6' }
+];
+
+const incomeCategories = [
+ { name: 'Salary', amount: 4800, color: '#10b981' },
+ { name: 'Freelance', amount: 1200, color: '#3b82f6' },
+ { name: 'Interest', amount: 150, color: '#f59e0b' }
+];
+
+export default {
+ title: 'Domain/Reports/ChartsTab',
+ component: ChartsTab,
+ args: {
+ monthlyBuckets,
+ dailyBuckets,
+ expenseCategories,
+ incomeCategories,
+ currency: 'USD'
+ }
+};
+
+export const Cashflow = {};
+
+export const Empty = {
+ args: {
+ monthlyBuckets: [],
+ dailyBuckets: [],
+ expenseCategories: [],
+ incomeCategories: []
+ }
+};
diff --git a/components/reports/ChartsTab.vue b/components/reports/ChartsTab.vue
new file mode 100644
index 0000000..235b520
--- /dev/null
+++ b/components/reports/ChartsTab.vue
@@ -0,0 +1,561 @@
+
+
+
+
+
+
+
+
+
+
{{ current.label }}
+
{{ current.sub }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ s.label }}
+
+ {{ s.value }}
+
+ {{ s.detail }}
+
+
+
+
+
+
+ {{ t('Use ← → to switch charts') }}
+
+
+
+
+
+
+
diff --git a/components/reports/FinancialRatios.stories.js b/components/reports/FinancialRatios.stories.js
new file mode 100644
index 0000000..d29caed
--- /dev/null
+++ b/components/reports/FinancialRatios.stories.js
@@ -0,0 +1,36 @@
+import FinancialRatios from './FinancialRatios.vue';
+
+export default {
+ title: 'Domain/Reports/FinancialRatios',
+ component: FinancialRatios,
+ args: {
+ totals: {
+ savingsRate: 0.35,
+ expenseRatio: 0.65,
+ runwayMonths: 8.4
+ },
+ currency: 'USD'
+ }
+};
+
+export const Healthy = {};
+
+export const Moderate = {
+ args: {
+ totals: {
+ savingsRate: 0.12,
+ expenseRatio: 0.88,
+ runwayMonths: 3.2
+ }
+ }
+};
+
+export const Deficit = {
+ args: {
+ totals: {
+ savingsRate: -0.15,
+ expenseRatio: 1.15,
+ runwayMonths: 0.8
+ }
+ }
+};
diff --git a/components/reports/FinancialRatios.vue b/components/reports/FinancialRatios.vue
new file mode 100644
index 0000000..7aa6c0a
--- /dev/null
+++ b/components/reports/FinancialRatios.vue
@@ -0,0 +1,206 @@
+
+
+
+
+
+ {{ ratio.label }}
+ {{ ratio.toneLabel }}
+
+ {{ ratio.formatted }}
+
+
+
+
+
+
+
+
diff --git a/components/reports/FlowTab.stories.js b/components/reports/FlowTab.stories.js
new file mode 100644
index 0000000..2980d08
--- /dev/null
+++ b/components/reports/FlowTab.stories.js
@@ -0,0 +1,57 @@
+import FlowTab from './FlowTab.vue';
+
+const flow = {
+ sources: [
+ { name: 'Salary', amount: 5200 },
+ { name: 'Freelance', amount: 1400 },
+ { name: 'Interest', amount: 180 }
+ ],
+ sinks: [
+ { name: 'Housing', amount: 2100, color: '#8b5cf6' },
+ { name: 'Food & Dining', amount: 850, color: '#10b981' },
+ { name: 'Transport', amount: 420, color: '#f59e0b' },
+ { name: 'Utilities', amount: 360, color: '#3b82f6' },
+ { name: 'Leisure', amount: 480, color: '#ec4899' }
+ ],
+ totalIn: 6780,
+ totalOut: 4210,
+ savings: 2570
+};
+
+export default {
+ title: 'Domain/Reports/FlowTab',
+ component: FlowTab,
+ args: {
+ flow,
+ currency: 'USD'
+ }
+};
+
+export const HealthyFlow = {};
+
+export const Deficit = {
+ args: {
+ flow: {
+ sources: [{ name: 'Salary', amount: 2600 }],
+ sinks: [
+ { name: 'Housing', amount: 2100, color: '#8b5cf6' },
+ { name: 'Food & Dining', amount: 850, color: '#10b981' }
+ ],
+ totalIn: 2600,
+ totalOut: 2950,
+ savings: -350
+ }
+ }
+};
+
+export const Empty = {
+ args: {
+ flow: {
+ sources: [],
+ sinks: [],
+ totalIn: 0,
+ totalOut: 0,
+ savings: 0
+ }
+ }
+};
diff --git a/components/reports/FlowTab.vue b/components/reports/FlowTab.vue
new file mode 100644
index 0000000..d1a5bd0
--- /dev/null
+++ b/components/reports/FlowTab.vue
@@ -0,0 +1,279 @@
+
+
+
+
+
+
+
+
+
{{ t('Total in') }}
+
{{ formatter(flow.totalIn, currency) }}
+
+
+
+
+
+
{{ t('Total out') }}
+
{{ formatter(flow.totalOut, currency) }}
+
+
+
+
+
+
{{ flow.savings >= 0 ? t('Saved') : t('Shortfall') }}
+
{{ formatter(Math.abs(flow.savings), currency) }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('Sources') }}
+
+
+
+
+ {{ s.name }}
+ {{ formatter(s.amount, currency) }}
+
+ {{ t('No income.') }}
+
+
+
+
+
+ {{ t('Destinations') }}
+
+
+
+
+ {{ s.name }}
+ {{ formatter(s.amount, currency) }}
+
+ {{ t('No expenses.') }}
+
+
+
+
+
+
+
+
+
diff --git a/components/reports/KpiCard.stories.js b/components/reports/KpiCard.stories.js
new file mode 100644
index 0000000..5ec8f8c
--- /dev/null
+++ b/components/reports/KpiCard.stories.js
@@ -0,0 +1,14 @@
+import KpiCard from './KpiCard.vue';
+
+export default {
+ title: 'Reports/KpiCard',
+ component: KpiCard,
+ tags: ['autodocs'],
+ argTypes: {
+ valueClass: { control: 'select', options: ['', 'is-positive', 'is-negative'] }
+ }
+};
+
+export const Default = { args: { label: 'Total Revenue', value: '$12,400', valueClass: '' } };
+export const Positive = { args: { label: 'Net Income', value: '+$3,200', valueClass: 'is-positive' } };
+export const Negative = { args: { label: 'Expenses', value: '-$1,800', valueClass: 'is-negative' } };
diff --git a/components/reports/KpiCard.vue b/components/reports/KpiCard.vue
new file mode 100644
index 0000000..a83c8ef
--- /dev/null
+++ b/components/reports/KpiCard.vue
@@ -0,0 +1,51 @@
+
+
+ {{ label }}
+ {{ value }}
+
+
+
+
+
+
diff --git a/components/reports/MonthInReview.stories.js b/components/reports/MonthInReview.stories.js
new file mode 100644
index 0000000..846f002
--- /dev/null
+++ b/components/reports/MonthInReview.stories.js
@@ -0,0 +1,42 @@
+import MonthInReview from './MonthInReview.vue';
+
+const sampleMonthData = {
+ monthLabel: 'March 2024',
+ daysInMonth: 31,
+ transactionCount: 42,
+ income: 5600,
+ expense: 3100,
+ savingsRate: 0.446,
+ topCategory: {
+ name: 'Housing & Rent',
+ amount: 1450
+ },
+ topPayee: {
+ name: 'Downtown Landlord Co',
+ amount: 1450
+ },
+ biggestExpense: {
+ amount: 890,
+ party: 'Flight Agency',
+ category: 'Travel & Transport'
+ }
+};
+
+export default {
+ title: 'Domain/Reports/MonthInReview',
+ component: MonthInReview,
+ args: {
+ open: true,
+ data: sampleMonthData,
+ currency: 'USD'
+ }
+};
+
+export const OpenRecap = {};
+
+export const EmptyRecap = {
+ args: {
+ open: true,
+ data: null
+ }
+};
diff --git a/components/reports/MonthInReview.vue b/components/reports/MonthInReview.vue
new file mode 100644
index 0000000..2e7c5b9
--- /dev/null
+++ b/components/reports/MonthInReview.vue
@@ -0,0 +1,1335 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ data?.monthLabel || t('Month in review') }}
+
+
+
+
+
+
+
+
+
+ {{ t('Prev') }}
+
+
+
+
+ {{ t('Next') }}
+
+
+
+
+
+
+
+
+
{{ t('No data for the latest month yet.') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ currentSlide?.eyebrow }}
+
+
+
+ {{ formatter(animatedValue, currency) }}
+
+
+ {{ currentSlide?.headline }}
+
+
+
{{ currentSlide.detail }}
+
+
+
+
+
+
+
+
+
+
+ {{ t('Click sides, use arrow keys, or use the controls below.') }}
+
+
+
+
+
+
+
+
+
+
diff --git a/components/reports/NotableStrip.stories.js b/components/reports/NotableStrip.stories.js
new file mode 100644
index 0000000..f4074c5
--- /dev/null
+++ b/components/reports/NotableStrip.stories.js
@@ -0,0 +1,45 @@
+import NotableStrip from './NotableStrip.vue';
+
+export default {
+ title: 'Domain/Reports/NotableStrip',
+ component: NotableStrip,
+ args: {
+ currency: 'USD',
+ notable: {
+ biggestExpense: {
+ amount: 890.0,
+ party: 'Flight Agency',
+ category: 'Travel & Transport',
+ date: '2024-03-12'
+ },
+ biggestCategorySwing: {
+ name: 'Dining & Restaurants',
+ fromAmount: 450.0,
+ toAmount: 210.0,
+ deltaPct: -53
+ },
+ firstTimePayees: {
+ count: 3,
+ names: ['Coffee Lab', 'Metro Carwash', 'Cloud Host']
+ },
+ longestNoSpendStreak: {
+ days: 4,
+ startDate: '2024-03-04',
+ endDate: '2024-03-07'
+ }
+ }
+ }
+};
+
+export const Default = {};
+
+export const EmptyState = {
+ args: {
+ notable: {
+ biggestExpense: null,
+ biggestCategorySwing: null,
+ firstTimePayees: { count: 0, names: [] },
+ longestNoSpendStreak: { days: 0, startDate: '', endDate: '' }
+ }
+ }
+};
diff --git a/components/reports/NotableStrip.vue b/components/reports/NotableStrip.vue
new file mode 100644
index 0000000..b010e10
--- /dev/null
+++ b/components/reports/NotableStrip.vue
@@ -0,0 +1,310 @@
+
+
+
+
+
+ {{ t('Biggest expense') }}
+
+
+
+ {{ formatValue(notable.biggestExpense.amount) }}
+
+
+ {{ notable.biggestExpense.party }}
+ ·
+ {{ notable.biggestExpense.category }}
+
+ {{ formatDate(notable.biggestExpense.date) }}
+
+ {{ t('No expenses in this period') }}
+
+
+
+
+
+ {{ t('Biggest swing') }}
+
+
+
+ {{ notable.biggestCategorySwing.name }}
+
+
+ {{ formatValue(notable.biggestCategorySwing.fromAmount) }}
+
+ {{ formatValue(notable.biggestCategorySwing.toAmount) }}
+
+
+
+ {{ notable.biggestCategorySwing.deltaPct > 0 ? '+' : ''
+ }}{{ notable.biggestCategorySwing.deltaPct }}%
+
+
+ {{ t('No comparable changes') }}
+
+
+
+
+
+ {{ t('First-time payees') }}
+
+ {{ notable?.firstTimePayees?.count ?? 0 }}
+
+
+
+ {{ name }}·
+
+
+
+ {{ t('All familiar names') }}
+
+
+
+
+
+ {{ t('No-spend streak') }}
+
+
+ {{ notable?.longestNoSpendStreak?.days ?? 0 }}
+ {{ t('days') }}
+
+
+ {{ formatDate(notable.longestNoSpendStreak.startDate) }}
+
+ {{ formatDate(notable.longestNoSpendStreak.endDate) }}
+
+ {{ t('Every day had spending') }}
+
+
+
+
+
+
+
diff --git a/components/reports/PeriodControl.stories.js b/components/reports/PeriodControl.stories.js
new file mode 100644
index 0000000..5fcfc49
--- /dev/null
+++ b/components/reports/PeriodControl.stories.js
@@ -0,0 +1,55 @@
+import PeriodControl from './PeriodControl.vue';
+import { ref } from 'vue';
+
+export default {
+ title: 'Reports/PeriodControl',
+ component: PeriodControl,
+ tags: ['autodocs'],
+ argTypes: {
+ selectedPeriod: { control: 'text' },
+ compareEnabled: { control: 'boolean' }
+ }
+};
+
+const periods = [
+ { label: 'Week', value: 'week' },
+ { label: 'Month', value: 'month' },
+ { label: 'Year', value: 'year' },
+ { label: 'All', value: 'all' }
+];
+
+export const Default = {
+ render: () => ({
+ components: { PeriodControl },
+ setup() {
+ const selected = ref('month');
+ const compare = ref(false);
+ const customRange = ref(null);
+
+ const handleSelect = (val) => { selected.value = val; };
+ const handleToggleCompare = () => { compare.value = !compare.value; };
+ const handleCustom = (r) => {
+ selected.value = 'custom';
+ customRange.value = r;
+ };
+
+ return { periods, selected, compare, customRange, handleSelect, handleToggleCompare, handleCustom };
+ },
+ template: `
+
+
+
+ Selected: {{ selected }} | Compare: {{ compare }} | Custom Range: {{ customRange }}
+
+
+ `
+ })
+};
diff --git a/components/reports/PeriodControl.vue b/components/reports/PeriodControl.vue
new file mode 100644
index 0000000..ef1dac2
--- /dev/null
+++ b/components/reports/PeriodControl.vue
@@ -0,0 +1,273 @@
+
+
+
+
+ {{ t(p.label) }}
+
+
+
+
+
+
+
+ {{
+ selectedPeriod === 'custom' && customRange
+ ? `${customRange.start} → ${customRange.end}`
+ : t('Custom')
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('Compare') }}
+
+
+
+
+
+
+ {{ t('Recap') }}
+
+
+
+
+
+
+
+
diff --git a/components/reports/ReportsEmpty.stories.js b/components/reports/ReportsEmpty.stories.js
new file mode 100644
index 0000000..cb4f441
--- /dev/null
+++ b/components/reports/ReportsEmpty.stories.js
@@ -0,0 +1,22 @@
+import ReportsEmpty from './ReportsEmpty.vue';
+
+export default {
+ title: 'Domain/Reports/ReportsEmpty',
+ component: ReportsEmpty,
+ args: {
+ title: 'Reports are waiting on data',
+ description: 'Log a few transactions and your income, expenses, ratios, and patterns will appear here.',
+ actionText: 'Add your first transaction',
+ to: '/transactions/new'
+ }
+};
+
+export const Default = {};
+
+export const CustomMessage = {
+ args: {
+ title: 'No cashflow trends available',
+ description: 'Import a CSV statement or connect an account to view monthly insights.',
+ actionText: 'Upload bank statement'
+ }
+};
diff --git a/components/reports/ReportsEmpty.vue b/components/reports/ReportsEmpty.vue
new file mode 100644
index 0000000..01dc806
--- /dev/null
+++ b/components/reports/ReportsEmpty.vue
@@ -0,0 +1,156 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ title || t('Reports are waiting on data') }}
+
+ {{
+ description ||
+ t(
+ 'Log a few transactions and your income, expenses, ratios, and patterns will appear here.'
+ )
+ }}
+
+
+
+ {{ actionText || t('Add your first transaction') }}
+
+
+
+
+
+
+
diff --git a/components/reports/ReportsTabs.stories.js b/components/reports/ReportsTabs.stories.js
new file mode 100644
index 0000000..c0309af
--- /dev/null
+++ b/components/reports/ReportsTabs.stories.js
@@ -0,0 +1,28 @@
+import ReportsTabs from './ReportsTabs.vue';
+import { ref } from 'vue';
+import { BarChart2, TrendingUp, PieChart, Activity } from 'lucide-vue-next';
+
+export default {
+ title: 'Reports/ReportsTabs',
+ component: ReportsTabs,
+ tags: ['autodocs'],
+ parameters: { layout: 'centered' }
+};
+
+const tabs = [
+ { value: 'overview', label: 'Overview', icon: BarChart2, count: 4 },
+ { value: 'cashflow', label: 'Cashflow', icon: TrendingUp },
+ { value: 'categories', label: 'Categories', icon: PieChart, count: 12 },
+ { value: 'net-worth', label: 'Net Worth', icon: Activity }
+];
+
+export const Default = {
+ render: () => ({
+ components: { ReportsTabs },
+ setup() {
+ const active = ref('overview');
+ return { tabs, active };
+ },
+ template: ` `
+ })
+};
diff --git a/components/reports/ReportsTabs.vue b/components/reports/ReportsTabs.vue
new file mode 100644
index 0000000..2afd746
--- /dev/null
+++ b/components/reports/ReportsTabs.vue
@@ -0,0 +1,137 @@
+
+
+
+
+ {{ tab.label }}
+ {{ tab.count }}
+
+
+
+
+
+
+
+
diff --git a/components/reports/SankeyFlow.stories.js b/components/reports/SankeyFlow.stories.js
new file mode 100644
index 0000000..5e0da94
--- /dev/null
+++ b/components/reports/SankeyFlow.stories.js
@@ -0,0 +1,51 @@
+import SankeyFlow from './SankeyFlow.vue';
+
+const flow = {
+ sources: [
+ { name: 'Salary', amount: 5200 },
+ { name: 'Freelance', amount: 1400 },
+ { name: 'Interest', amount: 180 }
+ ],
+ sinks: [
+ { name: 'Housing', amount: 2100, color: '#8b5cf6' },
+ { name: 'Food & Dining', amount: 850, color: '#10b981' },
+ { name: 'Transport', amount: 420, color: '#f59e0b' },
+ { name: 'Utilities', amount: 360, color: '#3b82f6' },
+ { name: 'Leisure', amount: 480, color: '#ec4899' }
+ ],
+ savings: 2570
+};
+
+export default {
+ title: 'Domain/Reports/SankeyFlow',
+ component: SankeyFlow,
+ args: {
+ flow,
+ currency: 'USD'
+ }
+};
+
+export const WithSavings = {};
+
+export const Deficit = {
+ args: {
+ flow: {
+ sources: [{ name: 'Salary', amount: 2600 }],
+ sinks: [
+ { name: 'Housing', amount: 2100, color: '#8b5cf6' },
+ { name: 'Food & Dining', amount: 850, color: '#10b981' }
+ ],
+ savings: -350
+ }
+ }
+};
+
+export const Empty = {
+ args: {
+ flow: {
+ sources: [],
+ sinks: [],
+ savings: 0
+ }
+ }
+};
diff --git a/components/reports/SankeyFlow.vue b/components/reports/SankeyFlow.vue
new file mode 100644
index 0000000..8144ec7
--- /dev/null
+++ b/components/reports/SankeyFlow.vue
@@ -0,0 +1,267 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ node.name }}
+
+
+ {{ formatter(node.amount, currency) }}
+
+
+
+
+
+
+ {{ node.name }}
+
+
+ {{ formatter(node.amount, currency) }}
+
+
+
+
+
+ {{ t('Not enough data to draw a flow yet') }}
+
+
+
+
+
+
+
diff --git a/components/reports/SparkLine.stories.js b/components/reports/SparkLine.stories.js
new file mode 100644
index 0000000..7b9dac4
--- /dev/null
+++ b/components/reports/SparkLine.stories.js
@@ -0,0 +1,24 @@
+import SparkLine from './SparkLine.vue';
+
+export default {
+ title: 'Reports/SparkLine',
+ component: SparkLine,
+ tags: ['autodocs'],
+ argTypes: {
+ color: { control: 'color' },
+ width: { control: { type: 'range', min: 60, max: 300 } },
+ height: { control: { type: 'range', min: 20, max: 100 } }
+ }
+};
+
+export const Positive = {
+ args: { values: [10, 25, 18, 40, 35, 55, 48, 70], color: '#10b981', width: 120, height: 36 }
+};
+
+export const Negative = {
+ args: { values: [70, 55, 48, 35, 40, 18, 25, 10], color: '#ef4444', width: 120, height: 36 }
+};
+
+export const Flat = {
+ args: { values: [30, 30, 30, 30], color: '#6366f1', width: 120, height: 36 }
+};
diff --git a/components/reports/SparkLine.vue b/components/reports/SparkLine.vue
new file mode 100644
index 0000000..6b66cad
--- /dev/null
+++ b/components/reports/SparkLine.vue
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/reports/charts/CashflowLineChart.stories.js b/components/reports/charts/CashflowLineChart.stories.js
new file mode 100644
index 0000000..6a0ad7d
--- /dev/null
+++ b/components/reports/charts/CashflowLineChart.stories.js
@@ -0,0 +1,38 @@
+import CashflowLineChart from './CashflowLineChart.vue';
+
+const generateMonths = (n = 12) =>
+ Array.from({ length: n }, (_, i) => {
+ const d = new Date(2024, i, 1);
+ const label = d.toLocaleDateString('en', { month: 'short' });
+ const income = Math.round(1500 + Math.random() * 1000);
+ const expense = Math.round(900 + Math.random() * 800);
+ return { label, income, expense, net: income - expense };
+ });
+
+export default {
+ title: 'Reports/Charts/CashflowLineChart',
+ component: CashflowLineChart,
+ args: {
+ currency: 'USD',
+ formatter: (n) => `$${n.toLocaleString()}`
+ }
+};
+
+export const Default = {
+ args: { data: generateMonths(12) }
+};
+
+export const Weekly = {
+ args: {
+ data: Array.from({ length: 8 }, (_, i) => ({
+ label: `W${i + 1}`,
+ income: Math.round(300 + Math.random() * 200),
+ expense: Math.round(200 + Math.random() * 200),
+ net: Math.round(Math.random() * 200 - 50)
+ }))
+ }
+};
+
+export const Empty = {
+ args: { data: [] }
+};
diff --git a/components/reports/charts/CashflowLineChart.vue b/components/reports/charts/CashflowLineChart.vue
new file mode 100644
index 0000000..1a323e5
--- /dev/null
+++ b/components/reports/charts/CashflowLineChart.vue
@@ -0,0 +1,335 @@
+
+
+
+
+
+
+
+
+ {{ shortNum(tick) }}
+
+
+
+
+
+
+
+ {{ data[i].label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('Income') }}
+ {{ t('Expense') }}
+ {{ t('Net') }}
+
+
+
+
+
+
+
+
+
diff --git a/components/reports/charts/CategoryDonut.stories.js b/components/reports/charts/CategoryDonut.stories.js
new file mode 100644
index 0000000..586110e
--- /dev/null
+++ b/components/reports/charts/CategoryDonut.stories.js
@@ -0,0 +1,36 @@
+import CategoryDonut from './CategoryDonut.vue';
+
+const sampleCategories = [
+ { name: 'Food & Drink', value: 420, color: '#f87171' },
+ { name: 'Transport', value: 180, color: '#fb923c' },
+ { name: 'Shopping', value: 310, color: '#a78bfa' },
+ { name: 'Utilities', value: 90, color: '#60a5fa' },
+ { name: 'Entertainment', value: 145, color: '#34d399' }
+];
+
+const total = sampleCategories.reduce((s, d) => s + d.value, 0);
+
+export default {
+ title: 'Reports/Charts/CategoryDonut',
+ component: CategoryDonut,
+ args: {
+ currency: 'USD',
+ formatter: (n) => `$${n.toLocaleString()}`
+ }
+};
+
+export const Default = {
+ args: { data: sampleCategories, total, centerLabel: 'Total' }
+};
+
+export const SingleCategory = {
+ args: {
+ data: [{ name: 'Food & Drink', value: 800, color: '#f87171' }],
+ total: 800,
+ centerLabel: 'Spending'
+ }
+};
+
+export const Empty = {
+ args: { data: [], total: 0, centerLabel: 'Total' }
+};
diff --git a/components/reports/charts/CategoryDonut.vue b/components/reports/charts/CategoryDonut.vue
new file mode 100644
index 0000000..daf7247
--- /dev/null
+++ b/components/reports/charts/CategoryDonut.vue
@@ -0,0 +1,201 @@
+
+
+
+
+
{{ centerLabel }}
+
{{ formatter(total, currency) }}
+
+
+
+
+
+
+ {{ d.name }}
+ {{ pct(d.value) }}%
+
+
+
+
+
+
+
+
diff --git a/components/reports/charts/CumulativeNetArea.stories.js b/components/reports/charts/CumulativeNetArea.stories.js
new file mode 100644
index 0000000..5f8bfe4
--- /dev/null
+++ b/components/reports/charts/CumulativeNetArea.stories.js
@@ -0,0 +1,38 @@
+import CumulativeNetArea from './CumulativeNetArea.vue';
+
+const generateMonths = (n = 12) =>
+ Array.from({ length: n }, (_, i) => {
+ const d = new Date(2024, i, 1);
+ const label = d.toLocaleDateString('en', { month: 'short' });
+ const running = (i + 1) * 300 + Math.round((Math.random() - 0.4) * 500);
+ return { label, cumulative: running };
+ });
+
+export default {
+ title: 'Reports/Charts/CumulativeNetArea',
+ component: CumulativeNetArea,
+ args: {
+ currency: 'USD',
+ formatter: (n) => `$${n.toLocaleString()}`
+ }
+};
+
+export const Default = {
+ args: { data: generateMonths(12) }
+};
+
+export const NegativePeriod = {
+ args: {
+ data: [
+ { label: 'Jan', cumulative: 200 },
+ { label: 'Feb', cumulative: -100 },
+ { label: 'Mar', cumulative: 150 },
+ { label: 'Apr', cumulative: -50 },
+ { label: 'May', cumulative: 400 }
+ ]
+ }
+};
+
+export const Empty = {
+ args: { data: [] }
+};
diff --git a/components/reports/charts/CumulativeNetArea.vue b/components/reports/charts/CumulativeNetArea.vue
new file mode 100644
index 0000000..7e034e7
--- /dev/null
+++ b/components/reports/charts/CumulativeNetArea.vue
@@ -0,0 +1,219 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ shortNum(tick) }}
+
+
+
+
+
+ {{ data[i].label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/reports/charts/DailyBarChart.stories.js b/components/reports/charts/DailyBarChart.stories.js
new file mode 100644
index 0000000..8c3f2c9
--- /dev/null
+++ b/components/reports/charts/DailyBarChart.stories.js
@@ -0,0 +1,32 @@
+import DailyBarChart from './DailyBarChart.vue';
+
+const generateDays = (n = 30) =>
+ Array.from({ length: n }, (_, i) => {
+ const d = new Date(2024, 0, i + 1);
+ return {
+ date: d.toISOString().split('T')[0],
+ expense: Math.round(Math.random() * 800 + 50),
+ txCount: Math.round(Math.random() * 8 + 1)
+ };
+ });
+
+export default {
+ title: 'Reports/Charts/DailyBarChart',
+ component: DailyBarChart,
+ args: {
+ currency: 'USD',
+ formatter: (n) => `$${n.toLocaleString()}`
+ }
+};
+
+export const Default = {
+ args: { data: generateDays(30) }
+};
+
+export const SparseData = {
+ args: { data: generateDays(7) }
+};
+
+export const Empty = {
+ args: { data: [] }
+};
diff --git a/components/reports/charts/DailyBarChart.vue b/components/reports/charts/DailyBarChart.vue
new file mode 100644
index 0000000..2bda3c7
--- /dev/null
+++ b/components/reports/charts/DailyBarChart.vue
@@ -0,0 +1,224 @@
+
+
+
+
+
+
+ {{ shortNum(tick) }}
+
+
+
+
+
+
+
+
+
+ {{ label.text }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/settings/CollapsibleSection.stories.js b/components/settings/CollapsibleSection.stories.js
new file mode 100644
index 0000000..a9081a6
--- /dev/null
+++ b/components/settings/CollapsibleSection.stories.js
@@ -0,0 +1,37 @@
+import CollapsibleSection from './CollapsibleSection.vue';
+import { Settings } from 'lucide-vue-next';
+
+export default {
+ title: 'Settings/CollapsibleSection',
+ component: CollapsibleSection,
+ tags: ['autodocs'],
+ argTypes: {
+ defaultOpen: { control: 'boolean' }
+ }
+};
+
+export const OpenByDefault = {
+ args: { title: 'Profile Settings', icon: Settings, defaultOpen: true },
+ render: (args) => ({
+ components: { CollapsibleSection },
+ setup: () => ({ args }),
+ template: `
+
+ Section body content goes here.
+
+ `
+ })
+};
+
+export const ClosedByDefault = {
+ args: { title: 'Advanced Settings', icon: Settings, defaultOpen: false },
+ render: (args) => ({
+ components: { CollapsibleSection },
+ setup: () => ({ args }),
+ template: `
+
+ Hidden until expanded.
+
+ `
+ })
+};
diff --git a/components/settings/CollapsibleSection.vue b/components/settings/CollapsibleSection.vue
new file mode 100644
index 0000000..446e5a6
--- /dev/null
+++ b/components/settings/CollapsibleSection.vue
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
diff --git a/components/settings/PasswordModal.stories.js b/components/settings/PasswordModal.stories.js
new file mode 100644
index 0000000..1d90bf0
--- /dev/null
+++ b/components/settings/PasswordModal.stories.js
@@ -0,0 +1,8 @@
+import PasswordModal from './PasswordModal.vue';
+
+export default {
+ title: 'Domain/Settings/PasswordModal',
+ component: PasswordModal
+};
+
+export const Default = {};
diff --git a/components/settings/PasswordModal.vue b/components/settings/PasswordModal.vue
new file mode 100644
index 0000000..5ee7a1d
--- /dev/null
+++ b/components/settings/PasswordModal.vue
@@ -0,0 +1,165 @@
+
+
+
+
+
+ {{ t('Change Password') }}
+
+
+ {{ t('For security, please enter your old password to confirm the change.') }}
+
+
+
+ {{ t('Old Password') }}
+
+
+
+ {{ t('New Password') }}
+
+
+
+ {{ t('Confirm New Password') }}
+
+
+
+
+ {{ message }}
+
+
+
+ {{ t('Cancel') }}
+
+ {{ t('Update Password') }}
+
+
+
+
+
+
+
+
+
diff --git a/components/settings/SettingsAccount.stories.js b/components/settings/SettingsAccount.stories.js
new file mode 100644
index 0000000..b847a90
--- /dev/null
+++ b/components/settings/SettingsAccount.stories.js
@@ -0,0 +1,22 @@
+import SettingsAccount from './SettingsAccount.vue';
+
+export default {
+ title: 'Domain/Settings/SettingsAccount',
+ component: SettingsAccount,
+ args: {
+ isEditMode: true,
+ user: {
+ id: 1,
+ first_name: 'Jane',
+ last_name: 'Doe',
+ username: 'janedoe',
+ email: 'jane@example.com'
+ }
+ }
+};
+
+export const EditMode = {};
+
+export const ViewMode = {
+ args: { isEditMode: false }
+};
diff --git a/components/settings/SettingsAccount.vue b/components/settings/SettingsAccount.vue
new file mode 100644
index 0000000..4374468
--- /dev/null
+++ b/components/settings/SettingsAccount.vue
@@ -0,0 +1,205 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('Password') }}
+
+ {{ t('Change Password') }}
+
+
+
+
+
+
+
+
+ {{ t('Update Account') }}
+
+
+ {{ message }}
+
+
+
+
+
+
+
+
diff --git a/components/settings/SettingsConnections.stories.js b/components/settings/SettingsConnections.stories.js
new file mode 100644
index 0000000..4d7e492
--- /dev/null
+++ b/components/settings/SettingsConnections.stories.js
@@ -0,0 +1,23 @@
+import SettingsConnections from './SettingsConnections.vue';
+
+const tokens = [
+ { id: 1, name: 'Claude Desktop', last_used_at: '2024-03-20T10:00:00Z' },
+ { id: 2, name: 'Cursor', last_used_at: null }
+];
+
+export default {
+ title: 'Domain/Settings/SettingsConnections',
+ component: SettingsConnections,
+ args: {
+ endpoint: 'https://app.trakli.com/mcp',
+ tokens,
+ createToken: async (name) => ({ name, token: 'tk_live_example' }),
+ revokeToken: async () => {}
+ }
+};
+
+export const Default = {};
+
+export const Empty = {
+ args: { tokens: [] }
+};
diff --git a/components/settings/SettingsConnections.vue b/components/settings/SettingsConnections.vue
new file mode 100644
index 0000000..3c24ed0
--- /dev/null
+++ b/components/settings/SettingsConnections.vue
@@ -0,0 +1,309 @@
+
+
+
+ {{
+ t(
+ 'Connect an AI client like Claude Desktop or Cursor to your Trakli data over the Model Context Protocol.'
+ )
+ }}
+
+
+
+
+
+
{{ t('Access tokens') }}
+
+
+
+
+ {{ t('Generate token') }}
+
+
+
+
+
{{ t('No tokens yet.') }}
+
+
+
+
+
{{ t('Copy your token now') }}
+
+ {{ t('This token is shown only once. Store it somewhere safe before closing.') }}
+
+
+
+
+
+
+
+
+
+
+ {{ t('Done') }}
+
+
+
+
+
+
+
+
+
+
diff --git a/components/settings/SettingsDisplay.stories.js b/components/settings/SettingsDisplay.stories.js
new file mode 100644
index 0000000..ba16171
--- /dev/null
+++ b/components/settings/SettingsDisplay.stories.js
@@ -0,0 +1,17 @@
+import SettingsDisplay from './SettingsDisplay.vue';
+
+export default {
+ title: 'Domain/Settings/SettingsDisplay',
+ component: SettingsDisplay,
+ args: {
+ isDark: false,
+ chatFirst: true,
+ savingLanding: false
+ }
+};
+
+export const Default = {};
+
+export const DarkMode = {
+ args: { isDark: true }
+};
diff --git a/components/settings/SettingsDisplay.vue b/components/settings/SettingsDisplay.vue
new file mode 100644
index 0000000..d091f5f
--- /dev/null
+++ b/components/settings/SettingsDisplay.vue
@@ -0,0 +1,143 @@
+
+
+
+
+
+ {{ isDark ? t('Light') : t('Dark') }} {{ t('Mode') }}
+
+
+
+
+
+
+
+
+
+ {{ t('Chat-first landing') }}
+
+
+
+
+
+
{{ t('Open the AI chat as your home screen instead of the dashboard.') }}
+
+
+
+
+
+
diff --git a/components/settings/SettingsGeneral.stories.js b/components/settings/SettingsGeneral.stories.js
new file mode 100644
index 0000000..ab3dbb5
--- /dev/null
+++ b/components/settings/SettingsGeneral.stories.js
@@ -0,0 +1,17 @@
+import SettingsGeneral from './SettingsGeneral.vue';
+
+export default {
+ title: 'Domain/Settings/SettingsGeneral',
+ component: SettingsGeneral,
+ args: {
+ isEditMode: true,
+ language: 'en',
+ currency: 'USD'
+ }
+};
+
+export const EditMode = {};
+
+export const ViewMode = {
+ args: { isEditMode: false }
+};
diff --git a/components/settings/SettingsGeneral.vue b/components/settings/SettingsGeneral.vue
new file mode 100644
index 0000000..e9bbeb0
--- /dev/null
+++ b/components/settings/SettingsGeneral.vue
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+ {{ t('Update General Settings') }}
+
+
{{ message }}
+
+
+
+
+
+
+
diff --git a/components/settings/SettingsNotifications.stories.js b/components/settings/SettingsNotifications.stories.js
new file mode 100644
index 0000000..62449ba
--- /dev/null
+++ b/components/settings/SettingsNotifications.stories.js
@@ -0,0 +1,19 @@
+import SettingsNotifications from './SettingsNotifications.vue';
+
+export default {
+ title: 'Domain/Settings/SettingsNotifications',
+ component: SettingsNotifications,
+ args: {
+ isEditMode: true,
+ preferences: {
+ channels: { email: true, push: false, inapp: true },
+ types: { reminders: true, insights: true, inactivity: false }
+ }
+ }
+};
+
+export const EditMode = {};
+
+export const ViewMode = {
+ args: { isEditMode: false }
+};
diff --git a/components/settings/SettingsNotifications.vue b/components/settings/SettingsNotifications.vue
new file mode 100644
index 0000000..bdb2d67
--- /dev/null
+++ b/components/settings/SettingsNotifications.vue
@@ -0,0 +1,337 @@
+
+
+
+
{{ t('Loading preferences...') }}
+
+
+
+
{{ t('Notification Channels') }}
+
+
+
+
+
+
{{ t('Email Notifications') }}
+
{{ t('Receive notifications via email') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ t('Push Notifications') }}
+
{{ t('Receive notifications on your device') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ t('In-App Notifications') }}
+
{{ t('See notifications in the app') }}
+
+
+
+
+
+
+
+
+
+
{{ t('Notification Types') }}
+
+
+
+
+
+
{{ t('Reminders') }}
+
{{ t('Get notified about your reminders') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ t('Financial Insights') }}
+
{{ t('Weekly/monthly spending summaries') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ t('Engagement Reminders') }}
+
{{ t("Gentle nudges when you haven't tracked") }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('Save Preferences') }}
+
+
{{ message }}
+
+
+
+
+
+
+
+
diff --git a/components/settings/SettingsWallets.stories.js b/components/settings/SettingsWallets.stories.js
new file mode 100644
index 0000000..978f949
--- /dev/null
+++ b/components/settings/SettingsWallets.stories.js
@@ -0,0 +1,26 @@
+import SettingsWallets from './SettingsWallets.vue';
+
+export default {
+ title: 'Domain/Settings/SettingsWallets',
+ component: SettingsWallets,
+ args: {
+ isEditMode: true,
+ wallets: [
+ { id: 1, name: 'Main Bank Account', currency: 'USD' },
+ { id: 2, name: 'Cash Wallet', currency: 'USD' }
+ ],
+ groups: [
+ { id: 1, name: 'General' },
+ { id: 2, name: 'Travel' }
+ ],
+ defaultWalletId: 1,
+ defaultGroupId: 1,
+ allowNegativeBalance: false
+ }
+};
+
+export const EditMode = {};
+
+export const ViewMode = {
+ args: { isEditMode: false }
+};
diff --git a/components/settings/SettingsWallets.vue b/components/settings/SettingsWallets.vue
new file mode 100644
index 0000000..1bc3755
--- /dev/null
+++ b/components/settings/SettingsWallets.vue
@@ -0,0 +1,240 @@
+
+
+
+
+
+
+
+
{{ t('Allow Negative Balances') }}
+
+ {{ t('Permit wallet balances to go below zero when spending or transferring.') }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('Update Wallets & Groups') }}
+
+
+
+
+
+
+
+
diff --git a/components/transactions/TTransactionsCardList.stories.js b/components/transactions/TTransactionsCardList.stories.js
new file mode 100644
index 0000000..889b26c
--- /dev/null
+++ b/components/transactions/TTransactionsCardList.stories.js
@@ -0,0 +1,65 @@
+import TTransactionsCardList from './TTransactionsCardList.vue';
+
+const transactions = [
+ {
+ id: '1',
+ date: '2024-03-24',
+ time: '10:30',
+ type: 'EXPENSE',
+ party: 'Whole Foods Market',
+ amount: '142.50 USD',
+ category: 'Food & Dining',
+ wallet: 'Main Bank Account',
+ walletId: 1,
+ description: 'Weekly groceries'
+ },
+ {
+ id: '2',
+ date: '2024-03-20',
+ time: '08:15',
+ type: 'INCOME',
+ party: 'Employer',
+ amount: '2800.00 USD',
+ category: 'Salary',
+ wallet: 'Main Bank Account',
+ walletId: 1,
+ description: 'Monthly salary',
+ isRecurring: true
+ },
+ {
+ id: '3',
+ date: '2024-03-18',
+ time: '19:45',
+ type: 'EXPENSE',
+ party: 'City Bistro',
+ amount: '68.00 USD',
+ category: 'Food & Dining',
+ wallet: 'Cash Wallet',
+ walletId: 2,
+ description: 'Dinner'
+ }
+];
+
+export default {
+ title: 'Domain/Transactions/TTransactionsCardList',
+ component: TTransactionsCardList,
+ args: {
+ transactions,
+ searchQuery: '',
+ currentPage: 1,
+ itemsPerPage: 10,
+ totalPages: 1,
+ totalEntries: 3,
+ activeFilterCount: 0,
+ defaultWallet: { id: 1, name: 'Main Bank Account' }
+ }
+};
+
+export const Default = {};
+
+export const Empty = {
+ args: {
+ transactions: [],
+ totalEntries: 0
+ }
+};
diff --git a/components/transactions/TTransactionsCardList.vue b/components/transactions/TTransactionsCardList.vue
new file mode 100644
index 0000000..bb5df58
--- /dev/null
+++ b/components/transactions/TTransactionsCardList.vue
@@ -0,0 +1,327 @@
+
+
+
+
All Transactions
+
+
+
+
+ {{ activeFilterCount }}
+
+
+
+
+
+
+
+
+
+
+ {{ formatShortAmount(txn.amount) }}
+
+
+
+
+
+
+ {{
+ isDefaultWallet(txn) ? 'Default' : txn.wallet || '—'
+ }}
+
+
+
+
{{ txn.description }}
+
+
+
+
+
{{ formatShortDate(txn) }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/transactions/TransactionFilters.stories.js b/components/transactions/TransactionFilters.stories.js
new file mode 100644
index 0000000..c616545
--- /dev/null
+++ b/components/transactions/TransactionFilters.stories.js
@@ -0,0 +1,33 @@
+import TransactionFilters from './TransactionFilters.vue';
+
+const wallets = [
+ { id: 1, name: 'Main Bank Account' },
+ { id: 2, name: 'Cash Wallet' }
+];
+const categories = [
+ { id: 1, name: 'Food & Dining' },
+ { id: 2, name: 'Salary' },
+ { id: 3, name: 'Housing' }
+];
+
+export default {
+ title: 'Domain/Transactions/TransactionFilters',
+ component: TransactionFilters,
+ args: {
+ filters: {},
+ wallets,
+ categories
+ }
+};
+
+export const Default = {};
+
+export const WithActiveFilters = {
+ args: {
+ filters: {
+ type: 'expense',
+ wallet_ids: [1],
+ category_ids: [1, 3]
+ }
+ }
+};
diff --git a/components/transactions/TransactionFilters.vue b/components/transactions/TransactionFilters.vue
new file mode 100644
index 0000000..f0fb49a
--- /dev/null
+++ b/components/transactions/TransactionFilters.vue
@@ -0,0 +1,432 @@
+
+
+
+
+
+
+
+
+
+
+
{{ t('Type') }}
+
+
+ {{ t('All') }}
+
+
+ {{ t('Income') }}
+
+
+ {{ t('Expenses') }}
+
+
+
+
+
+
+
{{ t('Date Range') }}
+
+
+ -
+
+
+
+
+ {{ t('This Month') }}
+
+
+ {{ t('Last 3 months') }}
+
+
+ {{ t('This Year') }}
+
+
+ {{ t('Last Year') }}
+
+
+
+
+
+
+
+
+ {{ t('Wallets') }}
+
+
+
+
+
+ {{ t('Category') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/transactions/TransactionsContentSection.stories.js b/components/transactions/TransactionsContentSection.stories.js
new file mode 100644
index 0000000..4cf960a
--- /dev/null
+++ b/components/transactions/TransactionsContentSection.stories.js
@@ -0,0 +1,68 @@
+import TransactionsContentSection from './TransactionsContentSection.vue';
+
+const transactions = [
+ {
+ id: '1',
+ date: '2024-03-24',
+ time: '10:30',
+ type: 'EXPENSE',
+ party: 'Whole Foods Market',
+ amount: '142.50 USD',
+ category: 'Food & Dining',
+ wallet: 'Main Bank Account',
+ walletId: 1,
+ description: 'Weekly groceries'
+ },
+ {
+ id: '2',
+ date: '2024-03-20',
+ time: '08:15',
+ type: 'INCOME',
+ party: 'Employer',
+ amount: '2800.00 USD',
+ category: 'Salary',
+ wallet: 'Main Bank Account',
+ walletId: 1,
+ description: 'Monthly salary'
+ },
+ {
+ id: '3',
+ date: '2024-03-18',
+ time: '19:45',
+ type: 'EXPENSE',
+ party: 'City Bistro',
+ amount: '68.00 USD',
+ category: 'Food & Dining',
+ wallet: 'Cash Wallet',
+ walletId: 2,
+ description: 'Dinner'
+ }
+];
+
+export default {
+ title: 'Domain/Transactions/TransactionsContentSection',
+ component: TransactionsContentSection,
+ args: {
+ transactions,
+ currentPage: 1,
+ totalPages: 1,
+ totalItems: 3,
+ perPage: 10,
+ totals: { income: 2800, expenses: 210.5, net: 2589.5 },
+ filters: {},
+ activeFilterCount: 0,
+ isLoading: false,
+ error: '',
+ isInitialized: true
+ }
+};
+
+export const Default = {};
+
+export const Empty = {
+ args: {
+ transactions: [],
+ totalItems: 0,
+ totals: { income: 0, expenses: 0, net: 0 }
+ }
+};
diff --git a/components/transactions/TransactionsContentSection.vue b/components/transactions/TransactionsContentSection.vue
new file mode 100644
index 0000000..cd45215
--- /dev/null
+++ b/components/transactions/TransactionsContentSection.vue
@@ -0,0 +1,329 @@
+
+
+
+
+
+
+ {{ t('Income') }}
+ {{ formatCurrency(totals.income) }}
+
+
+ {{ t('Expenses') }}
+ {{ formatCurrency(totals.expenses) }}
+
+
+ {{ t('Net') }}
+ {{
+ formatCurrency(totals.net)
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
emit('filter-change', f)"
+ @close="showFiltersPanel = false"
+ />
+
+
+
+
+
+
+
+
{{ t('No results found') }}
+
+ {{ t('No transactions match your current filters. Try adjusting or clearing them.') }}
+
+
+
+
+
+
+
+ emit('search-change', q)"
+ @page-change="(p) => emit('page-change', p)"
+ @edit="(t) => emit('edit', t)"
+ @delete="(t) => emit('delete', t)"
+ @recurrent="handleRecurrent"
+ @toggle-filters="toggleFilters"
+ />
+
+
+ emit('search-change', q)"
+ @page-change="(p) => emit('page-change', p)"
+ @edit="(t) => emit('edit', t)"
+ @delete="(t) => emit('delete', t)"
+ @recurrent="handleRecurrent"
+ @toggle-filters="toggleFilters"
+ />
+
+
+
+
+
+
+
+
+
diff --git a/components/transactions/TransactionsSpreadsheet.stories.js b/components/transactions/TransactionsSpreadsheet.stories.js
new file mode 100644
index 0000000..423f5e7
--- /dev/null
+++ b/components/transactions/TransactionsSpreadsheet.stories.js
@@ -0,0 +1,49 @@
+import TransactionsSpreadsheet from './TransactionsSpreadsheet.vue';
+
+const rows = [
+ {
+ id: 1,
+ datetime: '2024-03-24T10:30:00',
+ type: 'expense',
+ amount: 142.5,
+ description: 'Weekly groceries',
+ wallet: { name: 'Main Bank Account', currency: 'USD' },
+ party: { name: 'Whole Foods Market' },
+ categories: [{ name: 'Food & Dining' }]
+ },
+ {
+ id: 2,
+ datetime: '2024-03-20T08:15:00',
+ type: 'income',
+ amount: 2800,
+ description: 'Monthly salary',
+ wallet: { name: 'Main Bank Account', currency: 'USD' },
+ party: { name: 'Employer' },
+ categories: [{ name: 'Salary' }]
+ },
+ {
+ id: 3,
+ datetime: '2024-03-18T19:45:00',
+ type: 'expense',
+ amount: 68,
+ description: 'Dinner',
+ wallet: { name: 'Cash Wallet', currency: 'USD' },
+ party: { name: 'City Bistro' },
+ categories: [{ name: 'Food & Dining' }]
+ }
+];
+
+const fetchTransactions = async ({ page }) => ({
+ data: page === 1 ? rows : [],
+ last_page: 1
+});
+
+export default {
+ title: 'Domain/Transactions/TransactionsSpreadsheet',
+ component: TransactionsSpreadsheet,
+ args: {
+ fetchTransactions
+ }
+};
+
+export const Default = {};
diff --git a/components/transactions/TransactionsSpreadsheet.vue b/components/transactions/TransactionsSpreadsheet.vue
new file mode 100644
index 0000000..748c1c5
--- /dev/null
+++ b/components/transactions/TransactionsSpreadsheet.vue
@@ -0,0 +1,645 @@
+
+
+
+
+
+
+
+
{{ t('Loading transactions...') }}
+
+
+
+
+
+
+
+
+ #
+
+
+ {{ col.label }}
+
+
+
+
+
+
+
+
+ {{ i + 1 }}
+ {{ formatDate(row.datetime) }}
+
+
+ {{ row.type }}
+
+ {{ t('refund') }}
+
+
+
+ {{ formatAmount(row.amount) }}
+
+ {{ row.wallet?.currency ?? '' }}
+ {{ row.description || '—' }}
+ {{ categoriesText(row) }}
+ {{ row.wallet?.name ?? '' }}
+ {{ row.party?.name ?? '' }}
+
+
+
+
+ {{ t('Totals') }}
+ {{ formatAmount(totalAmount) }}
+
+ {{ t('Income') }}
+ {{ formatAmount(totalIncome) }}
+ · {{ t('Expenses') }}
+ {{ formatAmount(totalExpense) }}
+ · {{ t('Net') }}
+
+ {{ formatAmount(totalIncome - totalExpense) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/wallets/WalletDetailPanel.stories.js b/components/wallets/WalletDetailPanel.stories.js
new file mode 100644
index 0000000..cb0e844
--- /dev/null
+++ b/components/wallets/WalletDetailPanel.stories.js
@@ -0,0 +1,35 @@
+import WalletDetailPanel from './WalletDetailPanel.vue';
+
+const wallet = {
+ id: 1,
+ name: 'Main Bank Account',
+ type: 'bank',
+ currency: 'USD',
+ icon: 'Landmark'
+};
+
+const transactions = [
+ { date: '2024-03-24', type: 'EXPENSE', amount: '142.50 USD', party: 'Whole Foods', category: 'Food & Dining' },
+ { date: '2024-03-20', type: 'INCOME', amount: '2800.00 USD', party: 'Employer', category: 'Salary' },
+ { date: '2024-03-18', type: 'EXPENSE', amount: '68.00 USD', party: 'City Bistro', category: 'Food & Dining' }
+];
+
+export default {
+ title: 'Domain/Wallets/WalletDetailPanel',
+ component: WalletDetailPanel,
+ args: {
+ wallet,
+ isDefault: true,
+ transactions,
+ showBack: false
+ }
+};
+
+export const WithWallet = {};
+
+export const Empty = {
+ args: {
+ wallet: null,
+ transactions: []
+ }
+};
diff --git a/components/wallets/WalletDetailPanel.vue b/components/wallets/WalletDetailPanel.vue
new file mode 100644
index 0000000..76c2694
--- /dev/null
+++ b/components/wallets/WalletDetailPanel.vue
@@ -0,0 +1,922 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ t('Select a wallet') }}
+
+ {{ t('Pick a wallet on the left to see its balance, activity, and recent transactions.') }}
+
+
+
+
+
+
+
+
+
+
{{ t('Balance') }}
+
{{ formatter(wallet.balance || 0, wallet.currency) }}
+
+
+
+
{{ t('Income') }}
+
+ {{ formatter(wallet.stats?.total_income || 0, wallet.currency) }}
+
+
+
+
+
{{ t('Expense') }}
+
+ {{ formatter(wallet.stats?.total_expense || 0, wallet.currency) }}
+
+
+
+
+
{{ t('Net') }}
+
+ {{ formatter(netValue, wallet.currency) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ m.label }}
+
+
+
+
+
{{ t('No activity in the last 6 months yet.') }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ tx.party || tx.description || tx.category || t('Transaction')
+ }}
+ {{ formatDate(tx.date || tx.datetime) }}
+
+
+
+ {{ formatter(parseAmount(tx.amount).value, wallet.currency) }}
+
+
+
+
+ {{ t('No transactions yet on this wallet.') }}
+
+
+
+
+
+
+
+
+
+
diff --git a/components/wallets/WalletsStatsStrip.stories.js b/components/wallets/WalletsStatsStrip.stories.js
new file mode 100644
index 0000000..4bed1bd
--- /dev/null
+++ b/components/wallets/WalletsStatsStrip.stories.js
@@ -0,0 +1,54 @@
+import WalletsStatsStrip from './WalletsStatsStrip.vue';
+
+const wallets = [
+ {
+ id: 1,
+ name: 'Main Checking',
+ currency: 'USD',
+ balance: 8420.5,
+ stats: { total_income: 5200, total_expense: 1800 }
+ },
+ {
+ id: 2,
+ name: 'Savings',
+ currency: 'USD',
+ balance: 14200,
+ stats: { total_income: 3000, total_expense: 400 }
+ },
+ {
+ id: 3,
+ name: 'Euro Card',
+ currency: 'EUR',
+ balance: 1200,
+ stats: { total_income: 600, total_expense: 890 }
+ }
+];
+
+export default {
+ title: 'Domain/Wallets/WalletsStatsStrip',
+ component: WalletsStatsStrip,
+ args: {
+ wallets,
+ defaultCurrency: 'USD'
+ }
+};
+
+export const Default = {};
+
+export const NegativeBalance = {
+ args: {
+ wallets: [
+ {
+ id: 1,
+ name: 'Credit Card',
+ currency: 'USD',
+ balance: -3200,
+ stats: { total_income: 500, total_expense: 3700 }
+ }
+ ]
+ }
+};
+
+export const Empty = {
+ args: { wallets: [] }
+};
diff --git a/components/wallets/WalletsStatsStrip.vue b/components/wallets/WalletsStatsStrip.vue
new file mode 100644
index 0000000..4bbe44e
--- /dev/null
+++ b/components/wallets/WalletsStatsStrip.vue
@@ -0,0 +1,208 @@
+
+
+
+
+
+
+
+
{{ stat.label }}
+
{{ stat.value }}
+
{{ stat.sub }}
+
+
+
+
+
+
+
+
diff --git a/composables/useAvatar.ts b/composables/useAvatar.ts
new file mode 100644
index 0000000..c23304e
--- /dev/null
+++ b/composables/useAvatar.ts
@@ -0,0 +1,51 @@
+import { createAvatar } from '@dicebear/core';
+import { personas } from '@dicebear/collection';
+
+export interface AvatarUser {
+ email?: string;
+ id?: number | string;
+ avatar_url?: string;
+}
+
+/**
+ * Avatar helper.
+ * Generates deterministic fallback SVG via @dicebear/personas.
+ */
+export const useAvatar = () => {
+ const generateFallbackAvatar = (user: AvatarUser): string => {
+ if (!user) return '';
+
+ // Use personas style for gender-neutral people avatars
+ const avatar = createAvatar(personas as any, {
+ seed: user.email || user.id?.toString() || 'fallback',
+ backgroundColor: [
+ 'b6e3f4',
+ 'c4b5fd',
+ 'a78bfa',
+ 'fb7185',
+ 'fdba74',
+ 'fde047',
+ 'a7f3d0',
+ 'fbb6ce',
+ '93c5fd'
+ ],
+ // Gender-neutral styling
+ beard: [],
+ body: ['squared', 'rounded'],
+ face: ['circle', 'square'],
+ hair: ['shortHair', 'mediumHair', 'curlyHair', 'straightHair'],
+ shirt: ['collared', 'crew', 'open']
+ });
+
+ return avatar.toDataUri();
+ };
+
+ const getAvatarUrl = (user: AvatarUser): string => {
+ return user?.avatar_url || generateFallbackAvatar(user);
+ };
+
+ return {
+ generateFallbackAvatar,
+ getAvatarUrl
+ };
+};
diff --git a/composables/useDropdown.ts b/composables/useDropdown.ts
new file mode 100644
index 0000000..dca136b
--- /dev/null
+++ b/composables/useDropdown.ts
@@ -0,0 +1,56 @@
+import { ref, onMounted, onUnmounted, type Ref } from 'vue';
+
+/**
+ * A small composable that models an open/closed dropdown anchored to a
+ * root element. Handles click-outside to close and Escape to close.
+ * Migrated from webui/composables/useDropdown.ts — Tier 0 primitive (#9)
+ * Zero domain deps; pure DOM event handling.
+ *
+ * Usage:
+ * const { isOpen, rootRef, toggle, close } = useDropdown();
+ */
+export function useDropdown(): {
+ isOpen: Ref;
+ rootRef: Ref;
+ toggle: () => void;
+ open: () => void;
+ close: () => void;
+} {
+ const isOpen = ref(false);
+ const rootRef = ref(null);
+
+ const open = () => {
+ isOpen.value = true;
+ };
+ const close = () => {
+ isOpen.value = false;
+ };
+ const toggle = () => {
+ isOpen.value = !isOpen.value;
+ };
+
+ const handleDocumentClick = (event: MouseEvent) => {
+ const target = event.target as Node | null;
+ if (rootRef.value && target && !rootRef.value.contains(target)) {
+ close();
+ }
+ };
+
+ const handleKeydown = (event: KeyboardEvent) => {
+ if (event.key === 'Escape' && isOpen.value) {
+ close();
+ }
+ };
+
+ onMounted(() => {
+ document.addEventListener('click', handleDocumentClick);
+ document.addEventListener('keydown', handleKeydown);
+ });
+
+ onUnmounted(() => {
+ document.removeEventListener('click', handleDocumentClick);
+ document.removeEventListener('keydown', handleKeydown);
+ });
+
+ return { isOpen, rootRef, toggle, open, close };
+}
diff --git a/composables/useExtensionSlots.ts b/composables/useExtensionSlots.ts
new file mode 100644
index 0000000..32d226e
--- /dev/null
+++ b/composables/useExtensionSlots.ts
@@ -0,0 +1,26 @@
+import { markRaw, ref } from 'vue';
+import type { Component } from 'vue';
+
+// Components a plugin Nuxt layer registers for a slot key (the escape hatch).
+const componentRegistry = ref>({});
+
+export const useExtensionSlots = () => {
+ /**
+ * Register a real component for a slot key, used when a descriptor sets
+ * `ui.component`. Called from a plugin Nuxt layer.
+ */
+ const registerComponent = (slotKey: string, component: Component): void => {
+ componentRegistry.value = {
+ ...componentRegistry.value,
+ [slotKey]: markRaw(component)
+ };
+ };
+
+ const resolveComponent = (slotKey: string | null | undefined): Component | null =>
+ slotKey ? (componentRegistry.value[slotKey] ?? null) : null;
+
+ return {
+ registerComponent,
+ resolveComponent
+ };
+};
diff --git a/composables/useMarkdown.ts b/composables/useMarkdown.ts
new file mode 100644
index 0000000..a509686
--- /dev/null
+++ b/composables/useMarkdown.ts
@@ -0,0 +1,22 @@
+import MarkdownIt from 'markdown-it';
+
+// `html: false` escapes all raw HTML in the source, so neither the model nor any
+// embedded record text can inject active markup. markdown-it's built-in
+// validateLink also blocks dangerous link protocols (javascript:, vbscript:,
+// non-image data:). This is pure JS and safe to evaluate during SSR (no DOM).
+const md = new (MarkdownIt as any)({
+ html: false,
+ linkify: true,
+ breaks: true
+});
+
+/**
+ * SSR-safe markdown renderer.
+ */
+export function renderMarkdown(text: string | null | undefined): string {
+ return md.render(text ?? '');
+}
+
+export function useMarkdown() {
+ return { renderMarkdown };
+}
diff --git a/composables/useNotifications.ts b/composables/useNotifications.ts
new file mode 100644
index 0000000..c32131a
--- /dev/null
+++ b/composables/useNotifications.ts
@@ -0,0 +1,165 @@
+import { ref, readonly } from 'vue';
+
+interface Notification {
+ id: string;
+ type: 'success' | 'error' | 'warning' | 'info';
+ title: string;
+ message?: string;
+ duration?: number;
+}
+
+interface ConfirmOptions {
+ title: string;
+ message: string;
+ confirmText?: string;
+ cancelText?: string;
+ type?: 'warning' | 'danger' | 'info';
+}
+
+// Global state for notifications and modals
+const notifications = ref([]);
+const isConfirmModalOpen = ref(false);
+const confirmModalData = ref<
+ ConfirmOptions & {
+ resolve: (value: boolean) => void;
+ }
+>({
+ title: '',
+ message: '',
+ resolve: () => {}
+});
+
+export const useNotifications = () => {
+ const t = (key: string, params?: Record) => {
+ if (params?.item) {
+ return `Are you sure you want to delete this ${params.item}? This action cannot be undone.`;
+ }
+ return key;
+ };
+
+ // Add a notification
+ const addNotification = (notification: Omit) => {
+ const id = `notification-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
+ const newNotification: Notification = {
+ id,
+ duration: 5000, // 5 seconds default
+ ...notification
+ };
+
+ notifications.value.push(newNotification);
+
+ // Auto-remove after duration
+ if (newNotification.duration && newNotification.duration > 0) {
+ setTimeout(() => {
+ removeNotification(id);
+ }, newNotification.duration);
+ }
+
+ return id;
+ };
+
+ // Remove a notification
+ const removeNotification = (id: string) => {
+ const index = notifications.value.findIndex((n) => n.id === id);
+ if (index > -1) {
+ notifications.value.splice(index, 1);
+ }
+ };
+
+ // Clear all notifications
+ const clearNotifications = () => {
+ notifications.value = [];
+ };
+
+ // Show success notification
+ const showSuccess = (title: string, message?: string, duration?: number) => {
+ return addNotification({
+ type: 'success',
+ title,
+ message,
+ duration
+ });
+ };
+
+ // Show error notification
+ const showError = (title: string, message?: string, duration?: number) => {
+ return addNotification({
+ type: 'error',
+ title,
+ message,
+ duration: duration || 7000 // Errors stay longer
+ });
+ };
+
+ // Show warning notification
+ const showWarning = (title: string, message?: string, duration?: number) => {
+ return addNotification({
+ type: 'warning',
+ title,
+ message,
+ duration
+ });
+ };
+
+ // Show info notification
+ const showInfo = (title: string, message?: string, duration?: number) => {
+ return addNotification({
+ type: 'info',
+ title,
+ message,
+ duration
+ });
+ };
+
+ // Show confirmation modal (replaces browser confirm())
+ const showConfirm = (options: ConfirmOptions): Promise => {
+ return new Promise((resolve) => {
+ confirmModalData.value = {
+ ...options,
+ confirmText: options.confirmText || t('Confirm'),
+ cancelText: options.cancelText || t('Cancel'),
+ type: options.type || 'warning',
+ resolve
+ };
+ isConfirmModalOpen.value = true;
+ });
+ };
+
+ // Handle confirm modal response
+ const handleConfirmResponse = (confirmed: boolean) => {
+ confirmModalData.value.resolve(confirmed);
+ isConfirmModalOpen.value = false;
+ };
+
+ // Quick delete confirmation
+ const confirmDelete = (itemName: string = 'item'): Promise => {
+ return showConfirm({
+ title: t('Confirm Deletion'),
+ message: t('Are you sure you want to delete this {item}? This action cannot be undone.', {
+ item: t(itemName)
+ }),
+ confirmText: t('Delete'),
+ cancelText: t('Cancel'),
+ type: 'danger'
+ });
+ };
+
+ return {
+ // State
+ notifications: readonly(notifications),
+ isConfirmModalOpen: readonly(isConfirmModalOpen),
+ confirmModalData: readonly(confirmModalData),
+
+ // Methods
+ addNotification,
+ removeNotification,
+ clearNotifications,
+ showSuccess,
+ showError,
+ showWarning,
+ showInfo,
+ showConfirm,
+ handleConfirmResponse,
+ confirmDelete
+ };
+};
diff --git a/composables/usePasswordToggle.ts b/composables/usePasswordToggle.ts
new file mode 100644
index 0000000..63dcf69
--- /dev/null
+++ b/composables/usePasswordToggle.ts
@@ -0,0 +1,19 @@
+import { ref } from 'vue';
+
+/**
+ * Password visibility toggle — Tier 0 primitive
+ * Migrated from webui/composables/usePasswordToggle.js
+ * .js → .ts for ui-kit; behavior identical.
+ */
+export const usePasswordToggle = () => {
+ const showPassword = ref(false);
+
+ const togglePassword = () => {
+ showPassword.value = !showPassword.value;
+ };
+
+ return {
+ showPassword,
+ togglePassword
+ };
+};
diff --git a/composables/useSidebar.ts b/composables/useSidebar.ts
new file mode 100644
index 0000000..9de9f53
--- /dev/null
+++ b/composables/useSidebar.ts
@@ -0,0 +1,100 @@
+import { ref, onMounted, onUnmounted, readonly, watch } from 'vue';
+
+const STORAGE_KEY = 'trakli-sidebar';
+
+// Mobile drawer — transient, tied to viewport state.
+const isSidebarOpen = ref(false);
+const isMobile = ref(false);
+const isTabletOrBelow = ref(false);
+
+// Desktop collapse — persisted across reloads, mirrors the `theme` pattern.
+const sidebarCollapsed = ref(false);
+let hydrated = false;
+
+const loadCollapseState = () => {
+ if (typeof window === 'undefined' || hydrated) return;
+ hydrated = true;
+ try {
+ const raw = window.localStorage.getItem(STORAGE_KEY);
+ if (!raw) return;
+ const parsed = JSON.parse(raw);
+ if (typeof parsed.collapsed === 'boolean') {
+ sidebarCollapsed.value = parsed.collapsed;
+ }
+ } catch {
+ // ignore
+ }
+};
+
+const persistCollapseState = () => {
+ if (typeof window === 'undefined') return;
+ try {
+ window.localStorage.setItem(STORAGE_KEY, JSON.stringify({ collapsed: sidebarCollapsed.value }));
+ } catch {
+ // ignore
+ }
+};
+
+/**
+ * Sidebar state — Tier 0 primitive (layout chrome, no domain deps)
+ * Migrated from webui/composables/useSidebar.js
+ * Note: .js → .ts for ui-kit; behavior identical, persisted collapse + viewport listeners.
+ */
+export const useSidebar = () => {
+ const checkMobile = () => {
+ isMobile.value = window.innerWidth < 768;
+ isTabletOrBelow.value = window.innerWidth <= 1280;
+ if (!isMobile.value) {
+ isSidebarOpen.value = false;
+ }
+ };
+
+ const toggleSidebar = () => {
+ isSidebarOpen.value = !isSidebarOpen.value;
+ };
+
+ const closeSidebar = () => {
+ isSidebarOpen.value = false;
+ };
+
+ const openSidebar = () => {
+ isSidebarOpen.value = true;
+ };
+
+ const toggleCollapse = () => {
+ sidebarCollapsed.value = !sidebarCollapsed.value;
+ };
+
+ const collapseSidebar = () => {
+ sidebarCollapsed.value = true;
+ };
+
+ const expandSidebar = () => {
+ sidebarCollapsed.value = false;
+ };
+
+ watch(sidebarCollapsed, persistCollapseState);
+
+ onMounted(() => {
+ loadCollapseState();
+ checkMobile();
+ window.addEventListener('resize', checkMobile);
+ });
+
+ onUnmounted(() => {
+ window.removeEventListener('resize', checkMobile);
+ });
+
+ return {
+ isSidebarOpen: readonly(isSidebarOpen),
+ isMobile: readonly(isMobile),
+ isTabletOrBelow: readonly(isTabletOrBelow),
+ sidebarCollapsed: readonly(sidebarCollapsed),
+ toggleSidebar,
+ closeSidebar,
+ openSidebar,
+ toggleCollapse,
+ collapseSidebar,
+ expandSidebar
+ };
+};
diff --git a/composables/useTheme.ts b/composables/useTheme.ts
new file mode 100644
index 0000000..b98a437
--- /dev/null
+++ b/composables/useTheme.ts
@@ -0,0 +1,81 @@
+import { ref, computed } from 'vue';
+
+export type ThemeMode = 'light' | 'dark' | 'system';
+
+const theme = ref('light');
+const isDark = ref(false);
+
+const THEME_STORAGE_KEY = 'trakli-theme';
+
+function applyTheme(dark: boolean) {
+ if (typeof document === 'undefined') return;
+
+ if (dark) {
+ document.documentElement.classList.add('dark');
+ } else {
+ document.documentElement.classList.remove('dark');
+ }
+ isDark.value = dark;
+}
+
+function getSystemPreference(): boolean {
+ if (typeof window === 'undefined') return false;
+ return window.matchMedia('(prefers-color-scheme: dark)').matches;
+}
+
+function resolveTheme(mode: ThemeMode): boolean {
+ if (mode === 'system') {
+ return getSystemPreference();
+ }
+ return mode === 'dark';
+}
+
+/**
+ * Headless theme state machine — Tier 0 primitive (#10)
+ * Migrated from webui/composables/useTheme.ts
+ * Manages light/dark/system, persists to localStorage, toggles `document.documentElement.dark` (drives tokens.css).
+ */
+export function useTheme() {
+ function setTheme(newTheme: ThemeMode) {
+ theme.value = newTheme;
+ const dark = resolveTheme(newTheme);
+ applyTheme(dark);
+
+ if (typeof localStorage !== 'undefined') {
+ localStorage.setItem(THEME_STORAGE_KEY, newTheme);
+ }
+ }
+
+ function toggleTheme() {
+ const newTheme = isDark.value ? 'light' : 'dark';
+ setTheme(newTheme);
+ }
+
+ function initTheme() {
+ if (typeof window === 'undefined') return;
+
+ const saved = localStorage.getItem(THEME_STORAGE_KEY) as ThemeMode | null;
+ const initialTheme = saved || 'light';
+ theme.value = initialTheme;
+
+ const dark = resolveTheme(initialTheme);
+ applyTheme(dark);
+
+ if (initialTheme === 'system') {
+ const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
+ mediaQuery.addEventListener('change', (e) => {
+ if (theme.value === 'system') {
+ applyTheme(e.matches);
+ }
+ });
+ }
+ }
+
+ return {
+ theme: computed(() => theme.value),
+ isDark: computed(() => isDark.value),
+ setTheme,
+ toggleTheme,
+ initTheme
+ };
+}
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..2316201
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,17051 @@
+{
+ "name": "@trakli/ui-kit",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "@trakli/ui-kit",
+ "version": "0.0.0",
+ "devDependencies": {
+ "@cypress/vite-dev-server": "^5.2.0",
+ "@dicebear/collection": "^9.2.4",
+ "@dicebear/core": "^9.2.4",
+ "@heroicons/vue": "^2.2.0",
+ "@storybook/addon-essentials": "^8.3.5",
+ "@storybook/vue3": "^8.3.5",
+ "@storybook/vue3-vite": "^8.3.5",
+ "@types/markdown-it": "^14.1.2",
+ "@vitejs/plugin-vue": "^5.1.4",
+ "cypress": "^13.15.0",
+ "lucide-vue-next": "^0.525.0",
+ "markdown-it": "^14.1.1",
+ "sass": "^1.89.0",
+ "storybook": "^8.3.5",
+ "vite": "^5.4.8",
+ "vue": "^3.5.0"
+ },
+ "peerDependencies": {
+ "@dicebear/collection": "^9.2.4",
+ "@dicebear/core": "^9.2.4",
+ "@heroicons/vue": "^2.2.0",
+ "lucide-vue-next": "^0.525.0",
+ "markdown-it": "^14.1.1",
+ "nuxt": "^3.12.4",
+ "sass": "^1.89.0",
+ "vue": "^3.4.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
+ "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz",
+ "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz",
+ "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/generator": "^7.29.7",
+ "@babel/helper-compilation-targets": "^7.29.7",
+ "@babel/helper-module-transforms": "^7.29.7",
+ "@babel/helpers": "^7.29.7",
+ "@babel/parser": "^7.29.7",
+ "@babel/template": "^7.29.7",
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7",
+ "@jridgewell/remapping": "^2.3.5",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "peer": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz",
+ "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/parser": "^7.29.8",
+ "@babel/types": "^7.29.8",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz",
+ "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz",
+ "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.29.7",
+ "@babel/helper-validator-option": "^7.29.7",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "peer": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz",
+ "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.29.7",
+ "@babel/helper-member-expression-to-functions": "^7.29.7",
+ "@babel/helper-optimise-call-expression": "^7.29.7",
+ "@babel/helper-replace-supers": "^7.29.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7",
+ "@babel/traverse": "^7.29.7",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "peer": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-globals": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz",
+ "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz",
+ "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz",
+ "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz",
+ "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz",
+ "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz",
+ "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz",
+ "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.29.7",
+ "@babel/helper-optimise-call-expression": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz",
+ "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "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.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/helper-validator-option": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz",
+ "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz",
+ "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/template": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "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.8"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz",
+ "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz",
+ "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typescript": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz",
+ "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.29.7",
+ "@babel/helper-create-class-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7",
+ "@babel/plugin-syntax-typescript": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz",
+ "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz",
+ "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/parser": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz",
+ "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/generator": "^7.29.8",
+ "@babel/helper-globals": "^7.29.7",
+ "@babel/parser": "^7.29.8",
+ "@babel/template": "^7.29.7",
+ "@babel/types": "^7.29.8",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "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.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@clack/core": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.4.3.tgz",
+ "integrity": "sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "fast-wrap-ansi": "^0.2.0",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 20.12.0"
+ }
+ },
+ "node_modules/@clack/prompts": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.7.0.tgz",
+ "integrity": "sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@clack/core": "1.4.3",
+ "fast-string-width": "^3.0.2",
+ "fast-wrap-ansi": "^0.2.0",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 20.12.0"
+ }
+ },
+ "node_modules/@cloudflare/kv-asset-handler": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.2.tgz",
+ "integrity": "sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==",
+ "license": "MIT OR Apache-2.0",
+ "peer": true,
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@colordx/core": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@colordx/core/-/core-5.7.0.tgz",
+ "integrity": "sha512-Qbms38g1xs+4c6bNjIpgDGUVGVG25MtZxMNUs+kbmmeoFuaR/wuiKtu1wAOhtVPQShqE/p8F+uFQpoZiTR+1Jw==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@colors/colors": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/@cypress/request": {
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.10.tgz",
+ "integrity": "sha512-hauBrOdvu08vOsagkZ/Aju5XuiZx6ldsLfByg1htFeldhex+PeMrYauANzFsMJeAA0+dyPLbDoX2OYuvVoLDkQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~4.0.4",
+ "http-signature": "~1.4.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "performance-now": "^2.1.0",
+ "qs": "~6.14.1",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "^5.0.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^8.3.2"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@cypress/request/node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/@cypress/vite-dev-server": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/@cypress/vite-dev-server/-/vite-dev-server-5.2.1.tgz",
+ "integrity": "sha512-5HEUpB2UjpoBByOPAdTBfeJWHlvyDv3Qz5GuGovoiZnzsZyF9eivWfFiYadFdjXXX8i8kVzibo8heWZg+jigGg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.4",
+ "find-up": "6.3.0",
+ "node-html-parser": "5.3.3",
+ "semver": "^7.5.3"
+ }
+ },
+ "node_modules/@cypress/xvfb": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz",
+ "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.1.0",
+ "lodash.once": "^4.1.1"
+ }
+ },
+ "node_modules/@cypress/xvfb/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/@dicebear/adventurer": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/adventurer/-/adventurer-9.4.2.tgz",
+ "integrity": "sha512-jqYp834ZmGDA9HBBDQAdgF1O2UTCwHF4vVrktXWa2Dppp1JczPL5HnVOWsjtrLmXNn61Wd6OLmBb2e6rhzp3ig==",
+ "dev": true,
+ "license": "(MIT AND CC-BY-4.0)",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/adventurer-neutral": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/adventurer-neutral/-/adventurer-neutral-9.4.2.tgz",
+ "integrity": "sha512-5xgkG/mNL4j3Q4SJGQLBU/KnU90tng8Ze5ofThD+55wi0oeY/nSAUowg6UFCmHrktjifj/MEx3CQqbpcPWtfIA==",
+ "dev": true,
+ "license": "(MIT AND CC-BY-4.0)",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/avataaars": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/avataaars/-/avataaars-9.4.2.tgz",
+ "integrity": "sha512-3x9jKFkOkFSPmpTbt9xvhiU2E1GX7beCSsX0tXRUShj8x6+5Ks9yBRT1VlkySbnXrZ/GglADGg7vJ/D2uIx1Yw==",
+ "dev": true,
+ "license": "See LICENSE file",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/avataaars-neutral": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/avataaars-neutral/-/avataaars-neutral-9.4.2.tgz",
+ "integrity": "sha512-/eNrp0YCNJRwQXqOloLm1+3Ss2C+pMpUQIGkbEnGsP1UK+13Ge80ggDDof1HpdqvG9HAZcKa7hnbG/0HSwyDSw==",
+ "dev": true,
+ "license": "See LICENSE file",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/big-ears": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/big-ears/-/big-ears-9.4.2.tgz",
+ "integrity": "sha512-mNfz3ppNA7UBq0IO3nXCiV5pFPG7c1DfzRB0foNU2Wo1XXT8FIcSY2BvDlYqorZTOUOz7dHb0vx06hqvG0HP5w==",
+ "dev": true,
+ "license": "(MIT AND CC-BY-4.0)",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/big-ears-neutral": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/big-ears-neutral/-/big-ears-neutral-9.4.2.tgz",
+ "integrity": "sha512-M8Ozmzza4eY4hpLOYULgJxMYmBA0CsBnrE15/xw6LZkEREXnrX5z0NJsf8hUfdyF6BWZ+RBgzoiav32DAC5zcg==",
+ "dev": true,
+ "license": "(MIT AND CC-BY-4.0)",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/big-smile": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/big-smile/-/big-smile-9.4.2.tgz",
+ "integrity": "sha512-hmT5i7rcPPhStjZyg28pbIhdTnnMBzK3RObI0vKCpY30EFrzaPkkdDL6Ck5fAFBdvDIW1EpOJkenyR0XPmhgbQ==",
+ "dev": true,
+ "license": "(MIT AND CC-BY-4.0)",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/bottts": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/bottts/-/bottts-9.4.2.tgz",
+ "integrity": "sha512-tsx+dII7EFUCVA8URj66G1GqORCCVduCAx4dY2prEY2IeFianVpkntXuFsWZ9BBGx1NZFndvDith5oTwKMQPbQ==",
+ "dev": true,
+ "license": "See LICENSE file",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/bottts-neutral": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/bottts-neutral/-/bottts-neutral-9.4.2.tgz",
+ "integrity": "sha512-kFNwWt6j+gzZ5n5Pz7WVwePubREAQOF8ZwWA9ztwVYDVMLnOChWbAofy5FED4j5md2MXFH2EgLCFCMr5K2BmIA==",
+ "dev": true,
+ "license": "See LICENSE file",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/collection": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/collection/-/collection-9.4.2.tgz",
+ "integrity": "sha512-KArubv7if8H7j9sIfpDK2hJJqrdNVR5zMPAMOSpIU2JPyXx8TC9o5wsmXb8il5wOHgaS9Q/cla7jUNIiDD7Gsg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@dicebear/adventurer": "9.4.2",
+ "@dicebear/adventurer-neutral": "9.4.2",
+ "@dicebear/avataaars": "9.4.2",
+ "@dicebear/avataaars-neutral": "9.4.2",
+ "@dicebear/big-ears": "9.4.2",
+ "@dicebear/big-ears-neutral": "9.4.2",
+ "@dicebear/big-smile": "9.4.2",
+ "@dicebear/bottts": "9.4.2",
+ "@dicebear/bottts-neutral": "9.4.2",
+ "@dicebear/croodles": "9.4.2",
+ "@dicebear/croodles-neutral": "9.4.2",
+ "@dicebear/dylan": "9.4.2",
+ "@dicebear/fun-emoji": "9.4.2",
+ "@dicebear/glass": "9.4.2",
+ "@dicebear/icons": "9.4.2",
+ "@dicebear/identicon": "9.4.2",
+ "@dicebear/initials": "9.4.2",
+ "@dicebear/lorelei": "9.4.2",
+ "@dicebear/lorelei-neutral": "9.4.2",
+ "@dicebear/micah": "9.4.2",
+ "@dicebear/miniavs": "9.4.2",
+ "@dicebear/notionists": "9.4.2",
+ "@dicebear/notionists-neutral": "9.4.2",
+ "@dicebear/open-peeps": "9.4.2",
+ "@dicebear/personas": "9.4.2",
+ "@dicebear/pixel-art": "9.4.2",
+ "@dicebear/pixel-art-neutral": "9.4.2",
+ "@dicebear/rings": "9.4.2",
+ "@dicebear/shapes": "9.4.2",
+ "@dicebear/thumbs": "9.4.2",
+ "@dicebear/toon-head": "9.4.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/core": {
+ "version": "9.4.3",
+ "resolved": "https://registry.npmjs.org/@dicebear/core/-/core-9.4.3.tgz",
+ "integrity": "sha512-9ITrQI57k3p5hKuU8HZJ1d0kPdrmTKEJDOdlKQ8CpaChbtmnD1R+dtWmNz5IesYThXM8F64pJ0ZvJ2rsY8Hciw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@dicebear/croodles": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/croodles/-/croodles-9.4.2.tgz",
+ "integrity": "sha512-6VoO0JviIf7dKKMBTL/SMXxWhnXHaZuzufX90G0nXxS77ELG1YkGNMaZzawizN4C09Gbya2gJkozqrWiJN/aGw==",
+ "dev": true,
+ "license": "(MIT AND CC-BY-4.0)",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/croodles-neutral": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/croodles-neutral/-/croodles-neutral-9.4.2.tgz",
+ "integrity": "sha512-oG5IeUdtiYshQ89gkAVcl5w3xAEi5UZX2fTzIyelpBPCG176l7VuuFzlxi2umnB3E6LVHYy06DXvUo/p+rXB2Q==",
+ "dev": true,
+ "license": "(MIT AND CC-BY-4.0)",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/dylan": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/dylan/-/dylan-9.4.2.tgz",
+ "integrity": "sha512-1vQvRu9x9DrwFxhFaIU2rf0EUL04yDTbAt7fHyAjM0mEsKzTD4mRNf95tCRuavCoW6W48u7A/OY6jyIub6kxLQ==",
+ "dev": true,
+ "license": "(MIT AND CC-BY-4.0)",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/fun-emoji": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/fun-emoji/-/fun-emoji-9.4.2.tgz",
+ "integrity": "sha512-kqB6LPkdYCdEU/mwbyz34xLzoNUKL6ARcoo3fr5ASq9D6ZE07qIKybC3xv5+CPz7VmspJ1Q3c/VVWVMDRP7Twg==",
+ "dev": true,
+ "license": "(MIT AND CC-BY-4.0)",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/glass": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/glass/-/glass-9.4.2.tgz",
+ "integrity": "sha512-z5qUogHQ1b6UJ2zCqT848mU2U9DKbVDhiX6GPDjD7tYLisCCJVisH9p6WyNdHvflUd4SHkA6gRqVJIh2v2HnTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/icons": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/icons/-/icons-9.4.2.tgz",
+ "integrity": "sha512-QSMMz0NA03ypSGhXC8HQX8FSj8lYT+/5yqH+/N03OH2IjL0q7wwGZ7nqsrtlRp76O5WqMTwGfSbTUUYPjFr+Xw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/identicon": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/identicon/-/identicon-9.4.2.tgz",
+ "integrity": "sha512-JVDSmZsv11mSWqwAktK5x9Bslht2xY3TFUn8xzu6slAYe1Z7hEXZ76eb+UJ6F4qEzdwZ7xPWzAS6Nb0Y3A0pww==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/initials": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/initials/-/initials-9.4.2.tgz",
+ "integrity": "sha512-yePuIUasmwtl9IrtB6rEzE/zb5fImKP/neW0CdcTC2MwLgMuP1GLHEGRgg1zI8exIh+PMv1YdLGyyUuRTE2Qpw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/lorelei": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/lorelei/-/lorelei-9.4.2.tgz",
+ "integrity": "sha512-YMv6vnriW6VLFDsreKuOnUFFno6SRe7+7X7R7zPY0rZ+MaHX9V3jcioIG+1PSjIHEDfOLUHpr5vd1JBWv8y7UA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/lorelei-neutral": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/lorelei-neutral/-/lorelei-neutral-9.4.2.tgz",
+ "integrity": "sha512-yspanTthA5vh6iCdeLzn6xZ4yYMYRcfcxblcgSvHTF1ut0bjAXtw5SXzZ6aJTrJWiHkzYOQuTOR6GVYiW80Q7w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/micah": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/micah/-/micah-9.4.2.tgz",
+ "integrity": "sha512-e4D3W/OlChSsLo7Llwsy0J18vk0azJqF/uFoY+EKACCNHBc1HGNsqVvu2CTf+OWOA8wTyAK6UkjBN5p01r7D+g==",
+ "dev": true,
+ "license": "(MIT AND CC-BY-4.0)",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/miniavs": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/miniavs/-/miniavs-9.4.2.tgz",
+ "integrity": "sha512-wLwyFNNUnDRd3BbhSBhXR0XEpX8sG0/xDA5M/OkDoapLqZnnI48YLUSDd2N5QTAVMmcSEuZOYxkcnj7WW79vlg==",
+ "dev": true,
+ "license": "(MIT AND CC-BY-4.0)",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/notionists": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/notionists/-/notionists-9.4.2.tgz",
+ "integrity": "sha512-ZCySq+nxcD/x4xyYgytcj2N9uY3gxrL+qpnmOdp2BdA221KacVrxlsUPpIgEMqxS2rMmBQXfxg129Pzn4ycIpA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/notionists-neutral": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/notionists-neutral/-/notionists-neutral-9.4.2.tgz",
+ "integrity": "sha512-AyD9kEfVxQUwDGf4Op059gVmYIOAkTKg3dtE9h9mEKP7zl/kMy5B67BFFOo7sB0mXCjzAegZ6ekGU02E8+hIHw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/open-peeps": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/open-peeps/-/open-peeps-9.4.2.tgz",
+ "integrity": "sha512-i01tLgtp2g937T81sVeAOVlqsCtiTck/Kw20g7hN80+7xrXjOUepz2HPLy3HeiMjwjMGRy5o54kSd0/8Ht4Dqg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/personas": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/personas/-/personas-9.4.2.tgz",
+ "integrity": "sha512-NJlkvI5F5gugt6t2+7QrYNTwQC7+4IQZS3vG0dYk2BncxOHax0BuLovdSdiAesTL4ZkytFYIydWmKmV2/xcUwg==",
+ "dev": true,
+ "license": "(MIT AND CC-BY-4.0)",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/pixel-art": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/pixel-art/-/pixel-art-9.4.2.tgz",
+ "integrity": "sha512-peHf7oKICDgBZ8dUyj+txPnS7VZEWgvKE+xW4mNQqBt6dYZIjmva2shOVHn0b1JU+FDxMx3uIkWVixKdUq4WGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/pixel-art-neutral": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/pixel-art-neutral/-/pixel-art-neutral-9.4.2.tgz",
+ "integrity": "sha512-9e9Lz554uQvWaXV2P17ss+hPa6rTyuAKBtB8zk8ECjHiZzIl61N/KcTVLZ4dILVZwj7gYriaLo16QEqvL2GJCg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/rings": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/rings/-/rings-9.4.2.tgz",
+ "integrity": "sha512-Pc3ymWrRDQPJFNrbbLt7RJrzGvUuuxUiDkrfLhoVE+B6mZWEL1PC78DPbS1yUWYLErJOpJuM2GSwXmTbVjWf+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/shapes": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/shapes/-/shapes-9.4.2.tgz",
+ "integrity": "sha512-AFL6jAaiLztvcqyq+ds+lWZu6Vbp3PlGWhJeJRm842jxtiluJpl6r4f6nUXP2fdMz7MNpDzXfLooQK9E04NbUQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/thumbs": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/thumbs/-/thumbs-9.4.2.tgz",
+ "integrity": "sha512-ccWvDBqbkWS5uzHbsg5L6uML6vBfX7jT3J3jHCQksvz8haHItxTK02w+6e1UavZUsvza4lG5X/XY3eji3siJ4Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dicebear/toon-head": {
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@dicebear/toon-head/-/toon-head-9.4.2.tgz",
+ "integrity": "sha512-lwFeSXyAnaKnCfMt9TiJwnD1cXQUGkey/0h6i/+4TVHVMCz5/Ri5u1ynovPNHy1SnBf858QwoXHkxilGLwQX/g==",
+ "dev": true,
+ "license": "(MIT AND CC-BY-4.0)",
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "peerDependencies": {
+ "@dicebear/core": "^9.0.0"
+ }
+ },
+ "node_modules/@dxup/nuxt": {
+ "version": "0.5.10",
+ "resolved": "https://registry.npmjs.org/@dxup/nuxt/-/nuxt-0.5.10.tgz",
+ "integrity": "sha512-54Vehb7LmR7qYpC6KFwjDTSm6CB1CayBu+JXdHrPLrIjjr5xAgb43jvgOU+mnB+tsRh414fSsEy0QjBMKILQ8g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@dxup/unimport": "^0.1.2",
+ "@nuxt/kit": "^4.5.2",
+ "@vue/compiler-dom": "^3.5.41",
+ "chokidar": "^5.0.0",
+ "knitwork": "^1.3.0",
+ "magic-string": "^1.2.2",
+ "pathe": "^2.0.3",
+ "tinyglobby": "^0.2.17",
+ "unplugin": "^3.3.0"
+ }
+ },
+ "node_modules/@dxup/nuxt/node_modules/@nuxt/kit": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-4.5.2.tgz",
+ "integrity": "sha512-l66LU9DcJYjmNwqwAj2I5UGRrUbnG2DOKGChnN70zIGtn0eq/z87gi/FRgha6eMb9/FmB1PFHgtx6PWVml1C2Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "c12": "^3.3.4",
+ "consola": "^3.4.2",
+ "defu": "^6.1.7",
+ "destr": "^2.0.5",
+ "errx": "^0.1.2",
+ "exsolve": "^1.1.1",
+ "ignore": "^7.0.6",
+ "jiti": "^2.7.0",
+ "klona": "^2.0.6",
+ "mlly": "^1.8.2",
+ "nostics": "^1.2.0",
+ "ohash": "^2.0.11",
+ "pathe": "^2.0.3",
+ "pkg-types": "^2.3.1",
+ "rc9": "^3.0.1",
+ "scule": "^1.3.0",
+ "tinyglobby": "^0.2.17",
+ "ufo": "^1.6.4",
+ "unctx": "^3.0.0",
+ "untyped": "^2.0.0",
+ "verkit": "^0.3.1"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ }
+ },
+ "node_modules/@dxup/nuxt/node_modules/magic-string": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.2.3.tgz",
+ "integrity": "sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/@dxup/nuxt/node_modules/unctx": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/unctx/-/unctx-3.0.1.tgz",
+ "integrity": "sha512-5RAt2etv7g362RXyd33R82gm9u/kbtQlpoaOs9Bgm4E32GRMJ0xjbZyvdxUTmiuHk3V1IQb1aUNrp5IWY+JaWw==",
+ "license": "MIT",
+ "peer": true,
+ "peerDependencies": {
+ "magic-string": ">=0.30.21",
+ "oxc-parser": ">=0.140.0",
+ "rolldown": "^1.1.5",
+ "unplugin": "^3.3.0"
+ },
+ "peerDependenciesMeta": {
+ "magic-string": {
+ "optional": true
+ },
+ "oxc-parser": {
+ "optional": true
+ },
+ "rolldown": {
+ "optional": true
+ },
+ "unplugin": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@dxup/nuxt/node_modules/unplugin": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.3.0.tgz",
+ "integrity": "sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/remapping": "^2.3.5",
+ "picomatch": "^4.0.4",
+ "webpack-virtual-modules": "^0.6.2"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "@farmfe/core": "*",
+ "@rspack/core": "*",
+ "bun-types-no-globals": "*",
+ "esbuild": "*",
+ "rolldown": "*",
+ "rollup": "*",
+ "unloader": "*",
+ "vite": "*",
+ "webpack": "*"
+ },
+ "peerDependenciesMeta": {
+ "@farmfe/core": {
+ "optional": true
+ },
+ "@rspack/core": {
+ "optional": true
+ },
+ "bun-types-no-globals": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "rolldown": {
+ "optional": true
+ },
+ "rollup": {
+ "optional": true
+ },
+ "unloader": {
+ "optional": true
+ },
+ "vite": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@dxup/unimport": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@dxup/unimport/-/unimport-0.1.2.tgz",
+ "integrity": "sha512-/B8YJGPzaYq1NbsQmwgP8EZqg40NpTw4ZB3suuI0TplbxKHeK94jeaawLmVhCv+YwUnOpiWEz9U6SeThku/8JQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz",
+ "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz",
+ "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz",
+ "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz",
+ "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz",
+ "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz",
+ "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz",
+ "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz",
+ "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz",
+ "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz",
+ "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz",
+ "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz",
+ "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz",
+ "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==",
+ "cpu": [
+ "mips64el"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz",
+ "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz",
+ "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz",
+ "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz",
+ "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz",
+ "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz",
+ "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz",
+ "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz",
+ "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz",
+ "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz",
+ "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz",
+ "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz",
+ "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz",
+ "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@heroicons/vue": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@heroicons/vue/-/vue-2.2.0.tgz",
+ "integrity": "sha512-G3dbSxoeEKqbi/DFalhRxJU4mTXJn7GwZ7ae8NuEQzd1bqdd0jAbdaBZlHPcvPD2xI1iGzNVB4k20Un2AguYPw==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "vue": ">= 3"
+ }
+ },
+ "node_modules/@ioredis/commands": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.10.0.tgz",
+ "integrity": "sha512-UmeW7z4LfctwoQ5wkhVzgq8tXkreED2xZGpX+Bg+zA+WJFZCT6c062AfCK/Dfk81xZnnwdhJCUMkitihRaoC2Q==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz",
+ "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-regex": "^6.2.2"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/fs-minipass": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
+ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "minipass": "^7.0.4"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.11",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz",
+ "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "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/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@kwsites/file-exists": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz",
+ "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "debug": "^4.1.1"
+ }
+ },
+ "node_modules/@kwsites/promise-deferred": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz",
+ "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@mapbox/node-pre-gyp": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.3.tgz",
+ "integrity": "sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==",
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "dependencies": {
+ "consola": "^3.2.3",
+ "detect-libc": "^2.0.0",
+ "https-proxy-agent": "^7.0.5",
+ "node-fetch": "^2.6.7",
+ "nopt": "^8.0.0",
+ "semver": "^7.5.3",
+ "tar": "^7.4.0"
+ },
+ "bin": {
+ "node-pre-gyp": "bin/node-pre-gyp"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@mdx-js/react": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz",
+ "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdx": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16",
+ "react": ">=16"
+ }
+ },
+ "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"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "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",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nuxt/cli": {
+ "version": "3.37.0",
+ "resolved": "https://registry.npmjs.org/@nuxt/cli/-/cli-3.37.0.tgz",
+ "integrity": "sha512-Zj9NwHjEBzVrgezsgMFjpMhNqwNgROk9DzNi/dyfk1mCbXIRigV11br2xOl0Satek30bmv7oZAfMtCnDe6Ip0Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@bomb.sh/tab": "^0.0.19",
+ "@clack/prompts": "^1.7.0",
+ "c12": "^3.3.4",
+ "citty": "^0.2.2",
+ "confbox": "^0.2.4",
+ "consola": "^3.4.2",
+ "debug": "^4.4.3",
+ "defu": "^6.1.7",
+ "exsolve": "^1.1.0",
+ "fuse.js": "^7.4.2",
+ "fzf": "^0.5.2",
+ "giget": "^3.3.0",
+ "jiti": "^2.7.0",
+ "listhen": "^1.10.0",
+ "nypm": "^0.6.8",
+ "ofetch": "^1.5.1",
+ "ohash": "^2.0.11",
+ "pathe": "^2.0.3",
+ "perfect-debounce": "^2.1.0",
+ "pkg-types": "^2.3.1",
+ "scule": "^1.3.0",
+ "semver": "^7.8.5",
+ "srvx": "^0.11.22",
+ "std-env": "^4.2.0",
+ "tinyclip": "^0.1.15",
+ "tinyexec": "^1.2.4",
+ "ufo": "^1.6.4",
+ "youch": "^4.1.1"
+ },
+ "bin": {
+ "nuxi": "bin/nuxi.mjs",
+ "nuxi-ng": "bin/nuxi.mjs",
+ "nuxt": "bin/nuxi.mjs",
+ "nuxt-cli": "bin/nuxi.mjs"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "@nuxt/schema": "^4.4.6"
+ },
+ "peerDependenciesMeta": {
+ "@nuxt/schema": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@nuxt/cli/node_modules/@bomb.sh/tab": {
+ "version": "0.0.19",
+ "resolved": "https://registry.npmjs.org/@bomb.sh/tab/-/tab-0.0.19.tgz",
+ "integrity": "sha512-dTRfo9Q9B+lbLG3JCu8a/AGQSfD2XXcFcnakQzVjSOX+VvR/s9zpsH8TlqV3iHqazniRn1Ypwd1hcRlXcu/4BA==",
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "tab": "dist/bin/cli.mjs"
+ },
+ "peerDependencies": {
+ "cac": "^6.7.14",
+ "citty": "^0.1.6 || ^0.2.0",
+ "commander": "^13.1.0 || ^14.0.0 || ^15.0.0"
+ },
+ "peerDependenciesMeta": {
+ "cac": {
+ "optional": true
+ },
+ "citty": {
+ "optional": true
+ },
+ "commander": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@nuxt/devalue": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@nuxt/devalue/-/devalue-2.0.2.tgz",
+ "integrity": "sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@nuxt/devtools-wizard": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/@nuxt/devtools-wizard/-/devtools-wizard-3.4.2.tgz",
+ "integrity": "sha512-U2G8fw7KW1rdECyJDho5N14z8hSllpTk430KG1QPLjrv5w3pDksZ+YcpITd0u762Vw3gq3Arpg65Bk6U4ua6aQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@clack/prompts": "^1.7.0",
+ "consola": "^3.4.2",
+ "diff": "^8.0.4",
+ "execa": "^8.0.1",
+ "magicast": "^0.5.4",
+ "pathe": "^2.0.3",
+ "pkg-types": "^2.3.1",
+ "semver": "^7.8.5"
+ },
+ "bin": {
+ "devtools-wizard": "cli.mjs"
+ }
+ },
+ "node_modules/@nuxt/devtools-wizard/node_modules/execa": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
+ "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^8.0.1",
+ "human-signals": "^5.0.0",
+ "is-stream": "^3.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^5.1.0",
+ "onetime": "^6.0.0",
+ "signal-exit": "^4.1.0",
+ "strip-final-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=16.17"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/@nuxt/devtools-wizard/node_modules/get-stream": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
+ "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@nuxt/devtools-wizard/node_modules/human-signals": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
+ "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "engines": {
+ "node": ">=16.17.0"
+ }
+ },
+ "node_modules/@nuxt/devtools-wizard/node_modules/is-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@nuxt/devtools-wizard/node_modules/mimic-fn": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@nuxt/devtools-wizard/node_modules/npm-run-path": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
+ "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "path-key": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@nuxt/devtools-wizard/node_modules/onetime": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "mimic-fn": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@nuxt/devtools-wizard/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@nuxt/devtools-wizard/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "license": "ISC",
+ "peer": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@nuxt/devtools-wizard/node_modules/strip-final-newline": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@nuxt/kit": {
+ "version": "3.21.11",
+ "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.21.11.tgz",
+ "integrity": "sha512-0Xi3tgwN77w43Q8GCPIrvWmF1J7Peehkts44E0uKNIml9lB8WoUn8YxyUjxBv47XtVR86NWoWALAT+/IEMHJEA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "c12": "^3.3.4",
+ "consola": "^3.4.2",
+ "defu": "^6.1.7",
+ "destr": "^2.0.5",
+ "errx": "^0.1.2",
+ "exsolve": "^1.1.1",
+ "ignore": "^7.0.6",
+ "jiti": "^2.7.0",
+ "klona": "^2.0.6",
+ "knitwork": "^1.3.0",
+ "mlly": "^1.8.2",
+ "ohash": "^2.0.11",
+ "pathe": "^2.0.3",
+ "pkg-types": "^2.3.1",
+ "rc9": "^3.0.1",
+ "scule": "^1.3.0",
+ "semver": "^7.8.5",
+ "tinyglobby": "^0.2.17",
+ "ufo": "^1.6.4",
+ "unctx": "^2.5.0",
+ "untyped": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ }
+ },
+ "node_modules/@nuxt/nitro-server": {
+ "version": "3.21.11",
+ "resolved": "https://registry.npmjs.org/@nuxt/nitro-server/-/nitro-server-3.21.11.tgz",
+ "integrity": "sha512-QIIFH+0xtDBjOdXeTcC23dr+CS98vQv3/wcPtM72BHUUFYH+GWf7TiFCp6xG0wUN6MhGg3KTDjE6yV9U9g6H6Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@nuxt/devalue": "^2.0.2",
+ "@nuxt/kit": "3.21.11",
+ "@unhead/vue": "^2.1.17",
+ "@vue/shared": "^3.5.40",
+ "consola": "^3.4.2",
+ "defu": "^6.1.7",
+ "destr": "^2.0.5",
+ "devalue": "^5.9.0",
+ "errx": "^0.1.2",
+ "escape-string-regexp": "^5.0.0",
+ "exsolve": "^1.1.1",
+ "h3": "^1.15.11",
+ "impound": "^1.1.6",
+ "klona": "^2.0.6",
+ "mocked-exports": "^0.1.1",
+ "nitropack": "^2.13.4",
+ "ohash": "^2.0.11",
+ "pathe": "^2.0.3",
+ "pkg-types": "^2.3.1",
+ "rou3": "^0.9.1",
+ "std-env": "^4.2.0",
+ "ufo": "^1.6.4",
+ "unctx": "^2.5.0",
+ "unstorage": "^1.17.5",
+ "vue": "^3.5.40",
+ "vue-bundle-renderer": "^2.3.1",
+ "vue-devtools-stub": "^0.1.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "nuxt": "^3.21.11"
+ }
+ },
+ "node_modules/@nuxt/nitro-server/node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@nuxt/telemetry": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/@nuxt/telemetry/-/telemetry-2.9.1.tgz",
+ "integrity": "sha512-WYQs6GvebU278YXhbGlLA8pUO3ox+juHAiKCB3SEH0lq2PDRwX465tHRtpVIqsHv+lGK/n99FC7qqyBt9+p3oQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "citty": "^0.2.2",
+ "consola": "^3.4.2",
+ "rc9": "^3.0.1",
+ "std-env": "^4.2.0"
+ },
+ "bin": {
+ "nuxt-telemetry": "bin/nuxt-telemetry.mjs"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ },
+ "peerDependencies": {
+ "@nuxt/kit": ">=3.0.0"
+ }
+ },
+ "node_modules/@nuxt/vite-builder": {
+ "version": "3.21.11",
+ "resolved": "https://registry.npmjs.org/@nuxt/vite-builder/-/vite-builder-3.21.11.tgz",
+ "integrity": "sha512-4w3g5IFzXhVdX0ZIgmd/zKE2xPZ/e2ms4On1z0OWTDIzvIbrWeednYAJA0bgmgwCBsInYppdih8ZN0w+yWIQmw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@nuxt/kit": "3.21.11",
+ "@rollup/plugin-replace": "^6.0.3",
+ "@vitejs/plugin-vue": "^6.0.8",
+ "@vitejs/plugin-vue-jsx": "^5.1.6",
+ "autoprefixer": "^10.5.4",
+ "consola": "^3.4.2",
+ "cssnano": "^7.1.9",
+ "defu": "^6.1.7",
+ "escape-string-regexp": "^5.0.0",
+ "exsolve": "^1.1.1",
+ "externality": "^1.0.2",
+ "generic-names": "^4.0.0",
+ "get-port-please": "^3.2.0",
+ "jiti": "^2.7.0",
+ "knitwork": "^1.3.0",
+ "magic-string": "^0.30.21",
+ "mlly": "^1.8.2",
+ "mocked-exports": "^0.1.1",
+ "nypm": "^0.6.9",
+ "ohash": "^2.0.11",
+ "pathe": "^2.0.3",
+ "perfect-debounce": "^2.1.0",
+ "pkg-types": "^2.3.1",
+ "postcss": "^8.5.25",
+ "seroval": "^1.6.2",
+ "std-env": "^4.2.0",
+ "ufo": "^1.6.4",
+ "unenv": "^2.0.0-rc.24",
+ "vite": "^7.3.6",
+ "vite-node": "^5.3.0",
+ "vite-plugin-checker": "^0.14.5",
+ "vue-bundle-renderer": "^2.3.1"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "nuxt": "3.21.11",
+ "rolldown": "^1.0.0-beta.38",
+ "rollup-plugin-visualizer": "^6.0.0 || ^7.0.1",
+ "vue": "^3.3.4"
+ },
+ "peerDependenciesMeta": {
+ "rolldown": {
+ "optional": true
+ },
+ "rollup-plugin-visualizer": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@nuxt/vite-builder/node_modules/@vitejs/plugin-vue": {
+ "version": "6.0.8",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.8.tgz",
+ "integrity": "sha512-0ZjgOg7oO6farnNGup7yvoM/YXZV84OZxHAwtflItNa/6zzQyVb5LNxyea3FEKEX2XlagIKzrlH7wwxkKgtiew==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@rolldown/pluginutils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+ "vue": "^3.2.25"
+ }
+ },
+ "node_modules/@nuxt/vite-builder/node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@nuxt/vite-builder/node_modules/vite": {
+ "version": "7.3.6",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz",
+ "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "esbuild": "^0.27.0 || ^0.28.0",
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3",
+ "postcss": "^8.5.6",
+ "rollup": "^4.43.0",
+ "tinyglobby": "^0.2.15"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "lightningcss": "^1.21.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@oxc-minify/binding-android-arm-eabi": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-minify/binding-android-arm-eabi/-/binding-android-arm-eabi-0.143.0.tgz",
+ "integrity": "sha512-/UEp7vlZSeB5kkcspO93fec1NnPfdkF0JmKUSKm6ZLBhkh+Ua6hHmGU5tBJYF3LeuDDVpe+RIjBlmSu4d0kmKg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-minify/binding-android-arm64": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-minify/binding-android-arm64/-/binding-android-arm64-0.143.0.tgz",
+ "integrity": "sha512-ZdqRE7yvqP1snCTlCuJ2u9KUSTIj4k1NobK44VRSboAQb6+9j3rxkJ5wPFuIYRYa12lBijFSijSYAFbYapkibw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-minify/binding-darwin-arm64": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-minify/binding-darwin-arm64/-/binding-darwin-arm64-0.143.0.tgz",
+ "integrity": "sha512-KGt9pdVmgmSoec2ViIIPaBS4E0LLXP9fuk+ALDgeVvbOo3IffJPBgL8PWGC5jDXvBOAET1p6Ps9B4VcOQnu1sg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-minify/binding-darwin-x64": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-minify/binding-darwin-x64/-/binding-darwin-x64-0.143.0.tgz",
+ "integrity": "sha512-gb7Nc1la98YxpY3uEiCeXsI/D9YzOAkh3nIpyfPRpZGERLUQ/OpLFqXBTQ+/VD/gSHS+BVQPPLukQcZDnRxX8A==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-minify/binding-freebsd-x64": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-minify/binding-freebsd-x64/-/binding-freebsd-x64-0.143.0.tgz",
+ "integrity": "sha512-XBcPdh9Z7eusL49InRDjZQb5M/c9Uc95LVjbj4X9Vn/8K+HP3bI/RhAl+870kxRqRFcSZru/a4VRxWM/q+eYjw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-minify/binding-linux-arm-gnueabihf": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.143.0.tgz",
+ "integrity": "sha512-w9qTGLd+tGkf8sM9QWbzut+BxS5WLEph/annIxbZwoiDzob/6UCHY3j1AOMx9cp34iHv4jdoE5ZpcjkJM7vm6Q==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-minify/binding-linux-arm-musleabihf": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.143.0.tgz",
+ "integrity": "sha512-oqzjfB+JWnP8+A97R9MXZSRokQNrkMadxRdZ6NFIFPshjbqyrCZy0VQAHkdVPUulMYGziKXI3D18fxYTomPNjw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-minify/binding-linux-arm64-gnu": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.143.0.tgz",
+ "integrity": "sha512-kzUFsaL8ZMmwgMSY5PYvwOTBsQuSOp/FrWjmV3cecu54+f0RbF2mrDXVxOirRpF+mc4HzU8ndkatmgFlpIEo6A==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-minify/binding-linux-arm64-musl": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.143.0.tgz",
+ "integrity": "sha512-Si6teAvC97dUa2Dat0Aj15bqEKb8+bomAqLrmMZgJ5z6zZTFdDspmCM0dy7XlPVIV/gmM8b9R7353om6M868ag==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-minify/binding-linux-ppc64-gnu": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.143.0.tgz",
+ "integrity": "sha512-1YHgZgUHn6kL5q72ohDD7/BwmNTqy71ckz4X++yQ0gLA5iyFCZux+WYO5KOcR/gsh1nRgH7k/XhRlNpvvT43cA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-minify/binding-linux-riscv64-gnu": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.143.0.tgz",
+ "integrity": "sha512-XDVP9LLHxfMB2HiXFKF9gT3Zq648dugq98IUgmBCmRKvryxgXMVlzt+nxHL0v/3r4xtPYcbSTCOhMvVtApUtqQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-minify/binding-linux-riscv64-musl": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.143.0.tgz",
+ "integrity": "sha512-m6s3L8zbQWpOHtJ9n+8FQ1dBQ+eQz6l3hK2hDKvPRaYM1+nFjHWrVj6EIwXidBtk4OT1gGvw+ojPWi6X2xZ9SQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-minify/binding-linux-s390x-gnu": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.143.0.tgz",
+ "integrity": "sha512-5ILtPXU0zhjRoaQ86JbtkJwrIsJ70EEV4rYbYmtB6BJDxKDAb8P/tjwYcnBgVTrxrqn/3Mms2wGa2T9yXY6FRg==",
+ "cpu": [
+ "s390x"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-minify/binding-linux-x64-gnu": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.143.0.tgz",
+ "integrity": "sha512-JzSNJd8/sO0m+VEhgNfA1ZPxogwhDGrQ5ajNqP1Rdo1N7o4CLBH8wLMpBiHk7a/7Y3V0QHQZScCx6SnwoZ3Qsg==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-minify/binding-linux-x64-musl": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-x64-musl/-/binding-linux-x64-musl-0.143.0.tgz",
+ "integrity": "sha512-yvA7b2vJP29Kf/lbA+wgJjwgiRxHxK+vR/NVmqK39H40K1dWeugiIRLl3u7P5Q5xVsBaEfg36uokrZiyNY4IAw==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-minify/binding-openharmony-arm64": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-minify/binding-openharmony-arm64/-/binding-openharmony-arm64-0.143.0.tgz",
+ "integrity": "sha512-0bIPZFCoc5IJvenc3cTP6GRqn6PoIZeQwYlVvdbpun0IlE/Rwx9WTo622T2jcc4+j+u9Vk/oz6wHgisVzDtB5Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-minify/binding-win32-arm64-msvc": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-minify/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.143.0.tgz",
+ "integrity": "sha512-sO3l3B5iWt1QS3owmR+HfJr6PZ3djl7Qu8EsdLao7Ampz1j2RqGpaLSdcLm5OUtFxXEpjQURG6K4yjg6idOXeA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-minify/binding-win32-ia32-msvc": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-minify/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.143.0.tgz",
+ "integrity": "sha512-ZyqIYHCB2R0gSr8FqQVUeJNY5yyGoVWyewi9Mx7A222L4392KCzAYLZj9Hh6eAMO2fu9gX52vguA/gCWo2et4Q==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-minify/binding-win32-x64-msvc": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-minify/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.143.0.tgz",
+ "integrity": "sha512-akQwyMeeaOPBZRklc+KsGfvuAcfjUKctnivNLxW4ubG1SgwRoljR5QliS313lVhixdXiBsIF9eIGCU68RIBfOQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-parser/binding-android-arm-eabi": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.143.0.tgz",
+ "integrity": "sha512-n9uozULWflPqBtdmI8lAabLqGKNgLVNN0ZH8HfgCwpKGNtzRzauB76jTiW/3YLkcA7N1zskpi9GdVnZuu1SAvg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-parser/binding-android-arm64": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.143.0.tgz",
+ "integrity": "sha512-9BbdjHETk6O3zH/DDid9IgBtF0GlpLabNKN231uraXpRDSfY+iiZxTP5bk1Z63GBownVdhdINFIeddmMz4MzpQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-parser/binding-darwin-arm64": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.143.0.tgz",
+ "integrity": "sha512-gh+6ecoHUy4/sUcolBl/1qPXKBbYNxFY0Pk0ujgQvINTMSftJY7o4yb8gOkDJPeZeB8+a+u7xTe6umoP8N5HFA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-parser/binding-darwin-x64": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.143.0.tgz",
+ "integrity": "sha512-qd1hl2d+lXgHv/VQ/M9qm8TrMC5T4RqDBwtOnl+1D0QMjwcz+8AaB4JSg8STgeag0GP6a6L74XEGAsrTSJWNzQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-parser/binding-freebsd-x64": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.143.0.tgz",
+ "integrity": "sha512-M5XXcNa7aOqLPKTR41msfghKu2yQ4xWvCm11/gwU0JzOzHNk5sgW//rVEjJ+LO48+VDAMzXTSzurUVxIDKwozw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-parser/binding-linux-arm-gnueabihf": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.143.0.tgz",
+ "integrity": "sha512-T/GXusuOkPNQhCQCSBbcU/N8j0rAypuDBl1IyFK+lyYT594XsVz80clPC/OtbSSpBGyJxj8uYEfctxVuxVYoww==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-parser/binding-linux-arm-musleabihf": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.143.0.tgz",
+ "integrity": "sha512-oKu4RcBlXSqo3OC62dp6YTnQaZIurNDpCX3BnAM3+bJxt7s8J2TJKMnC0UYer1qhlRaDCg6wkTaTw+2IlsZ12w==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-parser/binding-linux-arm64-gnu": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.143.0.tgz",
+ "integrity": "sha512-WJBbD186AZmMGaSIhlktC+rPl8L3peCTXAh88Ih9uEvK0en2mPojGyCGYiL6mHtV1RPV3JyfJW5t6n5hh0lXhA==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-parser/binding-linux-arm64-musl": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.143.0.tgz",
+ "integrity": "sha512-t1AcYOwEzgceadT4v5e+vaCCb0AncCA3v5AyzfBAz/tMq11qzVccXKzNHtkWdjBsgvTKwRkaUF3QvT4kot8vcQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-parser/binding-linux-ppc64-gnu": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.143.0.tgz",
+ "integrity": "sha512-RsnO/NoD8376LMJq8JS8TwI0ieNaFRTuNe2GVJntQg6gwZNMENZsEbknHdVwjpOmxdGLGodcwaGSbAeRr5Bgjw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-parser/binding-linux-riscv64-gnu": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.143.0.tgz",
+ "integrity": "sha512-48fSVfR9TZi5CASZFyv0VC6z6BCoeihFsX031mAD/oSH7d9PYsPgIqza7d9mjP7Z2KTEpTFyH6SIu0Ui6R1vdg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-parser/binding-linux-riscv64-musl": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.143.0.tgz",
+ "integrity": "sha512-T8CpdD+SfE01DnIOD4HpVxu0ZJOfMJ/VhCvikKfaXAxkZ+9veyLM/D2hpi7Y2hFUyPmVQO3FNZHmYzV/WlVR4g==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-parser/binding-linux-s390x-gnu": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.143.0.tgz",
+ "integrity": "sha512-QLdeMsCcacenPEFsfxnBUDF1y6opyz5+fmOz9bfD5Y7fiGCMupUCuB3KTPQhNwshIG1P9fPqar9MHxuBDd4bwQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-parser/binding-linux-x64-gnu": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.143.0.tgz",
+ "integrity": "sha512-659ujfqLy6k7cuH3sbzhd8b+ztSq+i6E2E9pG78Q0BmHjAExfGIdgc8cGgMdwAozDXeZFHkJ+LXYJdWsaGdgyw==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-parser/binding-linux-x64-musl": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.143.0.tgz",
+ "integrity": "sha512-/Mw/9j4TfZcnKphPrzOE6t4MMknXadcAAuVUlDRTF/ETWB5xOgQvOJV2Mh9We/bWxZdoxaGAdc+hy4GuYwQ2yQ==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-parser/binding-openharmony-arm64": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.143.0.tgz",
+ "integrity": "sha512-8rIKWR2BFuifbIK/1XB9wTaSdtuJ25dlE7ZQYDnEwj/2xH2vHsxnvIjHT3ZjSVuLLwGGlSslIG/fbOJ8TV8rTw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-parser/binding-win32-arm64-msvc": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.143.0.tgz",
+ "integrity": "sha512-5U9kQYMfRRI6Zq7KDxgbIP0RMnKrfn3gLepRMgJuRkPSUALTiRCk9d/uyhb4lGDjUdzwK7mBkKqhLgzBPCmLpQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-parser/binding-win32-ia32-msvc": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.143.0.tgz",
+ "integrity": "sha512-25P7AaHk4R88Yv2XH4gToDVmh0cOu+bEURQU10CRrmvgabfRArSGAP5osmwUKeSUHj0VS50upbpbRWWW/m7mHA==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-parser/binding-win32-x64-msvc": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.143.0.tgz",
+ "integrity": "sha512-ORMh3JE1s6V7ySicdRK7vgaDQnn5o+UHg9ct989PlWHbel8O9ARrmWXM6kZjrBMtNucxNayQ8g69G0VfWzhANw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-project/types": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.143.0.tgz",
+ "integrity": "sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==",
+ "license": "MIT",
+ "peer": true,
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ }
+ },
+ "node_modules/@oxc-transform/binding-android-arm-eabi": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-transform/binding-android-arm-eabi/-/binding-android-arm-eabi-0.143.0.tgz",
+ "integrity": "sha512-Rufrk7btlzkIAofJyrm3COzSrn4iNYOnHNYOahBDQly/PgleJv6QIVCHsPTqC6qfX/EJNoAeNshALvVfKSTY5A==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-transform/binding-android-arm64": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-transform/binding-android-arm64/-/binding-android-arm64-0.143.0.tgz",
+ "integrity": "sha512-EwdR7ynio7zcg3CCaArr/FllpJX8fxmCCQlDdo6o4rZuCSXuIE04hRgcOgRRd5r5AKu81s/XP0TBulXWXaWpmQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-transform/binding-darwin-arm64": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-transform/binding-darwin-arm64/-/binding-darwin-arm64-0.143.0.tgz",
+ "integrity": "sha512-+o1gLw5mefaKDFfhpIyxKEyeE9kAopy8uA/JCUG0D3stDeY35b3vjeWHgTTBwkOgLXWblq8OvZee1yEJ9Xd40Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-transform/binding-darwin-x64": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-transform/binding-darwin-x64/-/binding-darwin-x64-0.143.0.tgz",
+ "integrity": "sha512-lKEnKHSspm8c+aR+lspmP6m8g09f5VivzMCRpLTrMJLgaWmipUCflBsS8qTKcmRp/hYZl3ARfJ3K00SHSIFb2g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-transform/binding-freebsd-x64": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-transform/binding-freebsd-x64/-/binding-freebsd-x64-0.143.0.tgz",
+ "integrity": "sha512-8Rir0D6CpKuh0tWuCjnZgk+r8XmKsGXncGBp6lmcYXwC5baLI3DK3T9I/CM1+khoF7JbFE3PqAmoF4HxGysxUQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-transform/binding-linux-arm-gnueabihf": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.143.0.tgz",
+ "integrity": "sha512-4F+ErMGgG6f7ydN42VwD+4F1UHhYBb4vELUT/0+gOhuGBN1wwhOPNLhHeJJnZQHZM2JYERdS6wn9uBoBiXw3gw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-transform/binding-linux-arm-musleabihf": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.143.0.tgz",
+ "integrity": "sha512-XqEYetdBUbFJE8IQUOtDUlyAmoec7I5xkLBFW5wdMI6oRaRJeFFTAK4jg/5sSRzNLU/OFTBTWCn5soQ/iLbwHQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-transform/binding-linux-arm64-gnu": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.143.0.tgz",
+ "integrity": "sha512-LXswrXbEouF3X/q5s+X3Im4VCCNu8aZDj6gRI/s32WDlBqwGosW/A8Ci5MgvCEnU3efVacXhAPPF9zbFE42OAg==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-transform/binding-linux-arm64-musl": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.143.0.tgz",
+ "integrity": "sha512-/TKz33dR/kqEdmLwGYsAKuVbjDEPhFKq0PAyIMVCLbqglBy7BRQCw7w7g78X5PLFXso0LgfCFCz/C5dDtBDj/Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-transform/binding-linux-ppc64-gnu": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.143.0.tgz",
+ "integrity": "sha512-2mVVq6P4cCXElahTV/GKufxdqRUWZtPHD3EQP2GFigjXRSAXl3HGelIgpYT8I8eoU7QNq6qk+avYsXImt9Hb+Q==",
+ "cpu": [
+ "ppc64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-transform/binding-linux-riscv64-gnu": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.143.0.tgz",
+ "integrity": "sha512-kkZtkNIqljF8KP9jrZYkhtY1Vbg35jaRj7mZCOinWUPwZIR8PYJwe2KkUVNII+148mYyxlCuf8DZXHiJJ9SNgg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-transform/binding-linux-riscv64-musl": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.143.0.tgz",
+ "integrity": "sha512-GRJr0FmQ6C8pbAl0ZyPh/VQwb1/hiXtwrb3IoK93LNsqMWNjbqKFP39lZlLQOdeU8QQADlZM8Qx75YQAOFkbSw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-transform/binding-linux-s390x-gnu": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.143.0.tgz",
+ "integrity": "sha512-k4fpvbh7zGvSLXgOJznv7zPGLgFSYvaMWgVhebxmXZqJgax1kWVOhiJ92L+K/Aqq3tgLEQwkQ8wWGcArSM/O4g==",
+ "cpu": [
+ "s390x"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-transform/binding-linux-x64-gnu": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.143.0.tgz",
+ "integrity": "sha512-utU2SgpVcipJsQ2lHmZm1twk5ke75/Xt1PivxGV8Va55vrXdIXK+At6ERv+6BikB28qauCe7vv2yovtkEuvmQQ==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-transform/binding-linux-x64-musl": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-x64-musl/-/binding-linux-x64-musl-0.143.0.tgz",
+ "integrity": "sha512-T+cQ/IcWiQ5XVC1cG+DczewthN7c2Vujw0JyO2ugcr6B7TCQiucDd/erVxJSaY59X8d6970+lPtng8Z8XiyGYg==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-transform/binding-openharmony-arm64": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-transform/binding-openharmony-arm64/-/binding-openharmony-arm64-0.143.0.tgz",
+ "integrity": "sha512-3uyqUj+d9hccXdL5WiJW+SVojwckAqSGz+eEBjwIs0/2SXavVpasH8n4E2N5CbCOa4NJdaRKmquHa52s/DN1yQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-transform/binding-win32-arm64-msvc": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-transform/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.143.0.tgz",
+ "integrity": "sha512-5x4/nWog5kjADuMVoZx9KOpbrzJNRuz59oA5jFW95NvV69lZikgubJDIM7WwBReS0mIoIF+QC2r3pAiJtKrYJQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-transform/binding-win32-ia32-msvc": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-transform/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.143.0.tgz",
+ "integrity": "sha512-z/hozOHz6t/iB68GQPskKJMGxBMpBYqKhOmik3wOprnvnpwOeEyOQ89xuWgvQvX4B69LnxGyAWpJWjSK5zUVzA==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxc-transform/binding-win32-x64-msvc": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/@oxc-transform/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.143.0.tgz",
+ "integrity": "sha512-8AaiwIM4M/gEcvXWD71SZDCpY70z7J99G110+fSBws/MHa9PaaWu0IVp5clEG/0alWPQiPZcZRFE3ZIhSd5fng==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@parcel/watcher": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz",
+ "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "detect-libc": "^2.0.3",
+ "is-glob": "^4.0.3",
+ "node-addon-api": "^7.0.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher-android-arm64": "2.6.0",
+ "@parcel/watcher-darwin-arm64": "2.6.0",
+ "@parcel/watcher-darwin-x64": "2.6.0",
+ "@parcel/watcher-freebsd-x64": "2.6.0",
+ "@parcel/watcher-linux-arm-glibc": "2.6.0",
+ "@parcel/watcher-linux-arm-musl": "2.6.0",
+ "@parcel/watcher-linux-arm64-glibc": "2.6.0",
+ "@parcel/watcher-linux-arm64-musl": "2.6.0",
+ "@parcel/watcher-linux-x64-glibc": "2.6.0",
+ "@parcel/watcher-linux-x64-musl": "2.6.0",
+ "@parcel/watcher-win32-arm64": "2.6.0",
+ "@parcel/watcher-win32-x64": "2.6.0"
+ }
+ },
+ "node_modules/@parcel/watcher-android-arm64": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz",
+ "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-arm64": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz",
+ "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-x64": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz",
+ "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-freebsd-x64": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz",
+ "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-glibc": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz",
+ "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==",
+ "cpu": [
+ "arm"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-musl": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz",
+ "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==",
+ "cpu": [
+ "arm"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-glibc": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz",
+ "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-musl": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz",
+ "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-glibc": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz",
+ "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-musl": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz",
+ "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-wasm": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-wasm/-/watcher-wasm-2.6.0.tgz",
+ "integrity": "sha512-dtjbDxKSDPQ8AmA+pS4OFaHE1FKrjtGpLGBxw85uKFkRorjNbvDM/aFPgqosu40wprbp1xw2ZSxIKqghCUHe2w==",
+ "bundleDependencies": [
+ "napi-wasm"
+ ],
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "is-glob": "^4.0.3",
+ "napi-wasm": "^1.1.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-wasm/node_modules/napi-wasm": {
+ "version": "1.1.0",
+ "inBundle": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@parcel/watcher-win32-arm64": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz",
+ "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-x64": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz",
+ "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@polka/url": {
+ "version": "1.0.0-next.29",
+ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz",
+ "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@poppinss/colors": {
+ "version": "4.1.6",
+ "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz",
+ "integrity": "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "kleur": "^4.1.5"
+ }
+ },
+ "node_modules/@poppinss/dumper": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.7.0.tgz",
+ "integrity": "sha512-0UTYalzk2t6S4rA2uHOz5bSSW2CHdv4vggJI6Alg90yvl0UgXs6XSXpH96OH+bRkX4J/06djv29pqXJ0lq5Kag==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@poppinss/colors": "^4.1.5",
+ "@sindresorhus/is": "^7.0.2",
+ "supports-color": "^10.0.0"
+ }
+ },
+ "node_modules/@poppinss/dumper/node_modules/supports-color": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz",
+ "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/@poppinss/exception": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz",
+ "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@rolldown/binding-android-arm-eabi": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.6.tgz",
+ "integrity": "sha512-b+jTcARdTiFLI6jB4a5XjTm0RWd6KcRfQj/I2356fxUZemiho9zQLxo0RtCuMDAyKcLo6cEltkgbQp6d1+sjjQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-android-arm64": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.6.tgz",
+ "integrity": "sha512-lkWU8ZJaRk9q3CIEY1Tc7vIFALp3Xw5NfGJo2hQg5oIqNgxWi1zI+IiDEK3r70BF5Dzol1tcXsnzsRc8NLhG+Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-arm64": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.6.tgz",
+ "integrity": "sha512-dgR56NYnvAszm7Ob1B2/Vn0e8bUQYZH2UjVaMMtMVOCKFSfjhfLmuA/9+O+F+ajUdG6B/bSssrKW6JJYASa8jA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-x64": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.6.tgz",
+ "integrity": "sha512-vpVxFvUCFioJqug7OTvqptkc4yb8UX0AwfDmJpaR/0sWz+BUmqSVAf7c8JkUgnN8YLspb4a/N6NhTyMAmdyQ7Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-freebsd-x64": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.6.tgz",
+ "integrity": "sha512-h1wG6Y6K3JlRswxsI64qQJqBAy4vrLuHgRbc8CZMGSWTOFRY6ghMApM1NKzB2I0n5xV1fjkE18SuVl2QpLeNpA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.6.tgz",
+ "integrity": "sha512-tbCiqub0q2MVWJKgF5PoAlNWCtQydiOYSLIkd8sByqK/6MMYLJRcSXSYodqYtd0O+Fw7QaVmKKlS4oL94YRZ0w==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-gnu": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.6.tgz",
+ "integrity": "sha512-oxK9+baEBPhZG5HB4URY+uU04zJWeZlH6Tb9rB5DK4DF9XR1uXNLXt5Q5ZsugTKayNCNLhkcwz/ye74hRI98dg==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-musl": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.6.tgz",
+ "integrity": "sha512-muWCk27FVBEZtv0MsK8gnfSmgczA8KQ0uRVJbTABKhkRfQc38aUrcb7fhi3BNiyseFmgcRsoMfQsSNJ+DbZdSw==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-ppc64-gnu": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.6.tgz",
+ "integrity": "sha512-eWDoSfU7Co2qj3vgB3Dt4lj1mG6CoWbcJQkRMP3XJplyCMtuaq3LHvPFjS9QIPvMGWVadJC04Xiy0IdcVPtnwQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-s390x-gnu": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.6.tgz",
+ "integrity": "sha512-2bWNjRSIayvupRKxXUY2tWG9fYdoUlTqWywHRvE8Eq3GvuQ+f2HeIkve697fIt+IQs/PV8yFsdWuhp1aJ1PdnA==",
+ "cpu": [
+ "s390x"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-gnu": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.6.tgz",
+ "integrity": "sha512-KekI0gS0wLxe1UBSQSjenBVwou/JkcQPDzBPICGZjxUv9k3RteHDPBQaiOicZUFKRIH2wKEimGwVpnJsbPzu7w==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-musl": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.6.tgz",
+ "integrity": "sha512-TvtPnfVr+HtyGiDmPK4VWmlNm7QhNNAcK5Q9A7aOXsI8545yCyaoMaicXrFZ72JzeYjaUVk7yT243zT0jzjFKQ==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-openharmony-arm64": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.6.tgz",
+ "integrity": "sha512-iOo0VEay2XFhaCcH0sps5XIimkSuOnNaZrf6+ZkoSOQBJPKNU48RkmJv0/lSpipexu5P+ouFgafe5IGr/DiQfg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-arm64-msvc": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.6.tgz",
+ "integrity": "sha512-y5NTmmasMS455JlOCO4ZM9krIchv3Mvm1crL1iUPGOPgEzSkves9n0SdC5Sjz6+qWDFhd8/JpfWMH8NSWNHe+A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-x64-msvc": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.6.tgz",
+ "integrity": "sha512-np8iZSLfXlAD4kWhiyq/u0Yt8oZDtRQ8lGhQaCXo2rl37KNjeU0GjJuwr4P3oeZ++ROfofsKNBqR5LTO8aXyWQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
+ "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@rollup/plugin-alias": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-6.0.0.tgz",
+ "integrity": "sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "peerDependencies": {
+ "rollup": ">=4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/plugin-commonjs": {
+ "version": "29.0.3",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-29.0.3.tgz",
+ "integrity": "sha512-ZaOxZceP7SOUW7Lqw5IRVweSQYWaeIPnXIGLiB690EBA3FGJTO40EEr2L5yZplJWsgTCogILRSpcAe7+U0Otdg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@rollup/pluginutils": "^5.0.1",
+ "commondir": "^1.0.1",
+ "estree-walker": "^2.0.2",
+ "fdir": "^6.2.0",
+ "is-reference": "1.2.1",
+ "magic-string": "^0.30.3",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=16.0.0 || 14 >= 14.17"
+ },
+ "peerDependencies": {
+ "rollup": "^2.68.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/plugin-inject": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz",
+ "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@rollup/pluginutils": "^5.0.1",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.3"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/plugin-json": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz",
+ "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@rollup/pluginutils": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/plugin-node-resolve": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.3.tgz",
+ "integrity": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@rollup/pluginutils": "^5.0.1",
+ "@types/resolve": "1.20.2",
+ "deepmerge": "^4.2.2",
+ "is-module": "^1.0.0",
+ "resolve": "^1.22.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^2.78.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/plugin-replace": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.3.tgz",
+ "integrity": "sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@rollup/pluginutils": "^5.0.1",
+ "magic-string": "^0.30.3"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/plugin-terser": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-1.0.0.tgz",
+ "integrity": "sha512-FnCxhTBx6bMOYQrar6C8h3scPt8/JwIzw3+AJ2K++6guogH5fYaIFia+zZuhqv0eo1RN7W1Pz630SyvLbDjhtQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "serialize-javascript": "^7.0.3",
+ "smob": "^1.0.0",
+ "terser": "^5.17.4"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz",
+ "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.1.tgz",
+ "integrity": "sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.1.tgz",
+ "integrity": "sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.1.tgz",
+ "integrity": "sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.1.tgz",
+ "integrity": "sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.1.tgz",
+ "integrity": "sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.1.tgz",
+ "integrity": "sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.1.tgz",
+ "integrity": "sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw==",
+ "cpu": [
+ "arm"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.1.tgz",
+ "integrity": "sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw==",
+ "cpu": [
+ "arm"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.1.tgz",
+ "integrity": "sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.1.tgz",
+ "integrity": "sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.1.tgz",
+ "integrity": "sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.1.tgz",
+ "integrity": "sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA==",
+ "cpu": [
+ "loong64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.1.tgz",
+ "integrity": "sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.1.tgz",
+ "integrity": "sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.1.tgz",
+ "integrity": "sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.1.tgz",
+ "integrity": "sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.1.tgz",
+ "integrity": "sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A==",
+ "cpu": [
+ "s390x"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.1.tgz",
+ "integrity": "sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.1.tgz",
+ "integrity": "sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-openbsd-x64": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.1.tgz",
+ "integrity": "sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.1.tgz",
+ "integrity": "sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.1.tgz",
+ "integrity": "sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.1.tgz",
+ "integrity": "sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.1.tgz",
+ "integrity": "sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.1.tgz",
+ "integrity": "sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@simple-git/args-pathspec": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@simple-git/args-pathspec/-/args-pathspec-1.0.3.tgz",
+ "integrity": "sha512-ngJMaHlsWDTfjyq9F3VIQ8b7NXbBLq5j9i5bJ6XLYtD6qlDXT7fdKY2KscWWUF8t18xx052Y/PUO1K1TRc9yKA==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@simple-git/argv-parser": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@simple-git/argv-parser/-/argv-parser-1.1.1.tgz",
+ "integrity": "sha512-Q9lBcfQ+VQCpQqGJFHe5yooOS5hGdLFFbJ5R+R5aDsnkPCahtn1hSkMcORX65J2Z5lxSkD0lQorMsncuBQxYUw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@simple-git/args-pathspec": "^1.0.3"
+ }
+ },
+ "node_modules/@sindresorhus/is": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz",
+ "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/is?sponsor=1"
+ }
+ },
+ "node_modules/@sindresorhus/merge-streams": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz",
+ "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@speed-highlight/core": {
+ "version": "1.2.24",
+ "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.24.tgz",
+ "integrity": "sha512-qeW2e1l78afw8VhRPfPQ1Gjj+KU5XFQ/OFV5ti6eTa9bruO7mJyZtA4vw0ofqmA3tKCkROE9xLk3VZoeRc98nw==",
+ "license": "CC0-1.0",
+ "peer": true
+ },
+ "node_modules/@storybook/addon-actions": {
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.6.14.tgz",
+ "integrity": "sha512-mDQxylxGGCQSK7tJPkD144J8jWh9IU9ziJMHfB84PKpI/V5ZgqMDnpr2bssTrUaGDqU5e1/z8KcRF+Melhs9pQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/global": "^5.0.0",
+ "@types/uuid": "^9.0.1",
+ "dequal": "^2.0.2",
+ "polished": "^4.2.2",
+ "uuid": "^9.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.14"
+ }
+ },
+ "node_modules/@storybook/addon-backgrounds": {
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.6.14.tgz",
+ "integrity": "sha512-l9xS8qWe5n4tvMwth09QxH2PmJbCctEvBAc1tjjRasAfrd69f7/uFK4WhwJAstzBTNgTc8VXI4w8ZR97i1sFbg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/global": "^5.0.0",
+ "memoizerific": "^1.11.3",
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.14"
+ }
+ },
+ "node_modules/@storybook/addon-controls": {
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.6.14.tgz",
+ "integrity": "sha512-IiQpkNJdiRyA4Mq9mzjZlvQugL/aE7hNgVxBBGPiIZG6wb6Ht9hNnBYpap5ZXXFKV9p2qVI0FZK445ONmAa+Cw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/global": "^5.0.0",
+ "dequal": "^2.0.2",
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.14"
+ }
+ },
+ "node_modules/@storybook/addon-docs": {
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.6.14.tgz",
+ "integrity": "sha512-Obpd0OhAF99JyU5pp5ci17YmpcQtMNgqW2pTXV8jAiiipWpwO++hNDeQmLmlSXB399XjtRDOcDVkoc7rc6JzdQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@mdx-js/react": "^3.0.0",
+ "@storybook/blocks": "8.6.14",
+ "@storybook/csf-plugin": "8.6.14",
+ "@storybook/react-dom-shim": "8.6.14",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.14"
+ }
+ },
+ "node_modules/@storybook/addon-essentials": {
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.6.14.tgz",
+ "integrity": "sha512-5ZZSHNaW9mXMOFkoPyc3QkoNGdJHETZydI62/OASR0lmPlJ1065TNigEo5dJddmZNn0/3bkE8eKMAzLnO5eIdA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/addon-actions": "8.6.14",
+ "@storybook/addon-backgrounds": "8.6.14",
+ "@storybook/addon-controls": "8.6.14",
+ "@storybook/addon-docs": "8.6.14",
+ "@storybook/addon-highlight": "8.6.14",
+ "@storybook/addon-measure": "8.6.14",
+ "@storybook/addon-outline": "8.6.14",
+ "@storybook/addon-toolbars": "8.6.14",
+ "@storybook/addon-viewport": "8.6.14",
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.14"
+ }
+ },
+ "node_modules/@storybook/addon-highlight": {
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.6.14.tgz",
+ "integrity": "sha512-4H19OJlapkofiE9tM6K/vsepf4ir9jMm9T+zw5L85blJZxhKZIbJ6FO0TCG9PDc4iPt3L6+aq5B0X29s9zicNQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/global": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.14"
+ }
+ },
+ "node_modules/@storybook/addon-measure": {
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.6.14.tgz",
+ "integrity": "sha512-1Tlyb72NX8aAqm6I6OICsUuGOP6hgnXcuFlXucyhKomPa6j3Eu2vKu561t/f0oGtAK2nO93Z70kVaEh5X+vaGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/global": "^5.0.0",
+ "tiny-invariant": "^1.3.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.14"
+ }
+ },
+ "node_modules/@storybook/addon-outline": {
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.6.14.tgz",
+ "integrity": "sha512-CW857JvN6OxGWElqjlzJO2S69DHf+xO3WsEfT5mT3ZtIjmsvRDukdWfDU9bIYUFyA2lFvYjncBGjbK+I91XR7w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/global": "^5.0.0",
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.14"
+ }
+ },
+ "node_modules/@storybook/addon-toolbars": {
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.6.14.tgz",
+ "integrity": "sha512-W/wEXT8h3VyZTVfWK/84BAcjAxTdtRiAkT2KAN0nbSHxxB5KEM1MjKpKu2upyzzMa3EywITqbfy4dP6lpkVTwQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.14"
+ }
+ },
+ "node_modules/@storybook/addon-viewport": {
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.6.14.tgz",
+ "integrity": "sha512-gNzVQbMqRC+/4uQTPI2ZrWuRHGquTMZpdgB9DrD88VTEjNudP+J6r8myLfr2VvGksBbUMHkGHMXHuIhrBEnXYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "memoizerific": "^1.11.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.14"
+ }
+ },
+ "node_modules/@storybook/blocks": {
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.6.14.tgz",
+ "integrity": "sha512-rBMHAfA39AGHgkrDze4RmsnQTMw1ND5fGWobr9pDcJdnDKWQWNRD7Nrlxj0gFlN3n4D9lEZhWGdFrCbku7FVAQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/icons": "^1.2.12",
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "storybook": "^8.6.14"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@storybook/builder-vite": {
+ "version": "8.6.18",
+ "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-8.6.18.tgz",
+ "integrity": "sha512-XLqnOv4C36jlTd4uC8xpWBxv+7GV4/05zWJ0wAcU4qflorropUTirt4UQPGkwIzi+BVAhs9pJj+m4k0IWJtpHg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/csf-plugin": "8.6.18",
+ "browser-assert": "^1.2.1",
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.18",
+ "vite": "^4.0.0 || ^5.0.0 || ^6.0.0"
+ }
+ },
+ "node_modules/@storybook/builder-vite/node_modules/@storybook/csf-plugin": {
+ "version": "8.6.18",
+ "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.6.18.tgz",
+ "integrity": "sha512-x1ioz/L0CwaelCkHci3P31YtvwayN3FBftvwQOPbvRh9qeb4Cpz5IdVDmyvSxxYwXN66uAORNoqgjTi7B4/y5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "unplugin": "^1.3.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.18"
+ }
+ },
+ "node_modules/@storybook/components": {
+ "version": "8.6.18",
+ "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.6.18.tgz",
+ "integrity": "sha512-55yViiZzPS/cPBuOeW4QGxGqrusjXVyxuknmbYCIwDtFyyvI/CgbjXRHdxNBaIjz+IlftxvBmmSaOqFG5+/dkA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0"
+ }
+ },
+ "node_modules/@storybook/core": {
+ "version": "8.6.18",
+ "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.6.18.tgz",
+ "integrity": "sha512-dRBP2TnX6fGdS0T2mXBHjkS/3Nlu1ra1huovZVFuM67CYMzrhM/3hX/zru1vWSC5rqY93ZaAhjMciPW4pK5mMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/theming": "8.6.18",
+ "better-opn": "^3.0.2",
+ "browser-assert": "^1.2.1",
+ "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0",
+ "esbuild-register": "^3.5.0",
+ "jsdoc-type-pratt-parser": "^4.0.0",
+ "process": "^0.11.10",
+ "recast": "^0.23.5",
+ "semver": "^7.6.2",
+ "util": "^0.12.5",
+ "ws": "^8.2.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "prettier": "^2 || ^3"
+ },
+ "peerDependenciesMeta": {
+ "prettier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/aix-ppc64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
+ "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/android-arm": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz",
+ "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/android-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz",
+ "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/android-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz",
+ "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/darwin-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz",
+ "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/darwin-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz",
+ "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/freebsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz",
+ "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/linux-arm": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz",
+ "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/linux-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz",
+ "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/linux-ia32": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz",
+ "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/linux-loong64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz",
+ "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/linux-mips64el": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz",
+ "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/linux-ppc64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz",
+ "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/linux-riscv64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz",
+ "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/linux-s390x": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz",
+ "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/linux-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz",
+ "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/netbsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz",
+ "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/openbsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz",
+ "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz",
+ "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/sunos-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz",
+ "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/win32-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz",
+ "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/win32-ia32": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz",
+ "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/@esbuild/win32-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
+ "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/core/node_modules/esbuild": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz",
+ "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.25.12",
+ "@esbuild/android-arm": "0.25.12",
+ "@esbuild/android-arm64": "0.25.12",
+ "@esbuild/android-x64": "0.25.12",
+ "@esbuild/darwin-arm64": "0.25.12",
+ "@esbuild/darwin-x64": "0.25.12",
+ "@esbuild/freebsd-arm64": "0.25.12",
+ "@esbuild/freebsd-x64": "0.25.12",
+ "@esbuild/linux-arm": "0.25.12",
+ "@esbuild/linux-arm64": "0.25.12",
+ "@esbuild/linux-ia32": "0.25.12",
+ "@esbuild/linux-loong64": "0.25.12",
+ "@esbuild/linux-mips64el": "0.25.12",
+ "@esbuild/linux-ppc64": "0.25.12",
+ "@esbuild/linux-riscv64": "0.25.12",
+ "@esbuild/linux-s390x": "0.25.12",
+ "@esbuild/linux-x64": "0.25.12",
+ "@esbuild/netbsd-arm64": "0.25.12",
+ "@esbuild/netbsd-x64": "0.25.12",
+ "@esbuild/openbsd-arm64": "0.25.12",
+ "@esbuild/openbsd-x64": "0.25.12",
+ "@esbuild/openharmony-arm64": "0.25.12",
+ "@esbuild/sunos-x64": "0.25.12",
+ "@esbuild/win32-arm64": "0.25.12",
+ "@esbuild/win32-ia32": "0.25.12",
+ "@esbuild/win32-x64": "0.25.12"
+ }
+ },
+ "node_modules/@storybook/csf-plugin": {
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.6.14.tgz",
+ "integrity": "sha512-dErtc9teAuN+eelN8FojzFE635xlq9cNGGGEu0WEmMUQ4iJ8pingvBO1N8X3scz4Ry7KnxX++NNf3J3gpxS8qQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "unplugin": "^1.3.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.14"
+ }
+ },
+ "node_modules/@storybook/global": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz",
+ "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@storybook/icons": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.6.0.tgz",
+ "integrity": "sha512-hcFZIjW8yQz8O8//2WTIXylm5Xsgc+lW9ISLgUk1xGmptIJQRdlhVIXCpSyLrQaaRiyhQRaVg7l3BD9S216BHw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta"
+ }
+ },
+ "node_modules/@storybook/manager-api": {
+ "version": "8.6.18",
+ "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.6.18.tgz",
+ "integrity": "sha512-BjIp12gEMgzFkEsgKpDIbZdnSWTZpm2dlws8WiPJCpgJtG+HWSxZ0/Ms30Au9yfwzQEKRSbV/5zpsKMGc2SIJw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0"
+ }
+ },
+ "node_modules/@storybook/preview-api": {
+ "version": "8.6.18",
+ "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.6.18.tgz",
+ "integrity": "sha512-joXRXh3GdVvzhbfIgmix1xs90p8Q/nja7AhEAC2egn5Pl7SKsIYZUCYI6UdrQANb2myg9P552LKXfPect8llKg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0"
+ }
+ },
+ "node_modules/@storybook/react-dom-shim": {
+ "version": "8.6.14",
+ "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.6.14.tgz",
+ "integrity": "sha512-0hixr3dOy3f3M+HBofp3jtMQMS+sqzjKNgl7Arfuj3fvjmyXOks/yGjDImySR4imPtEllvPZfhiQNlejheaInw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "storybook": "^8.6.14"
+ }
+ },
+ "node_modules/@storybook/theming": {
+ "version": "8.6.18",
+ "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.6.18.tgz",
+ "integrity": "sha512-n6OEjEtHupa2PdTwWzRepr7cO8NkDd4rgF6BKLitRbujOspLxzMBEqdphs+QLcuiCIgf33SqmEA64QWnbSMhPw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0"
+ }
+ },
+ "node_modules/@storybook/vue3": {
+ "version": "8.6.18",
+ "resolved": "https://registry.npmjs.org/@storybook/vue3/-/vue3-8.6.18.tgz",
+ "integrity": "sha512-FY6XkM3hW0aHxtrMEUBhlaBrIrS1Ler68mb/oZM2PQ9NqY2Mm9x3B3fZuQgFVzzEi4Vc/XXuYNVuC8+B5S0LhQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/components": "8.6.18",
+ "@storybook/global": "^5.0.0",
+ "@storybook/manager-api": "8.6.18",
+ "@storybook/preview-api": "8.6.18",
+ "@storybook/theming": "8.6.18",
+ "@vue/compiler-core": "^3.0.0",
+ "ts-dedent": "^2.0.0",
+ "type-fest": "~2.19",
+ "vue-component-type-helpers": "latest"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.18",
+ "vue": "^3.0.0"
+ }
+ },
+ "node_modules/@storybook/vue3-vite": {
+ "version": "8.6.18",
+ "resolved": "https://registry.npmjs.org/@storybook/vue3-vite/-/vue3-vite-8.6.18.tgz",
+ "integrity": "sha512-iqRzIEmOOSI4+sAWAJb75FrKcFCAip4ykgwlAdU/SRTI//Cywpj0gN33TUaOBqP+vbqgtz/CJdDS2eozFIipeg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/builder-vite": "8.6.18",
+ "@storybook/vue3": "8.6.18",
+ "find-package-json": "^1.2.0",
+ "magic-string": "^0.30.0",
+ "typescript": "^5.7.3",
+ "vue-component-meta": "^2.0.0",
+ "vue-docgen-api": "^4.75.1"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.18",
+ "vite": "^4.0.0 || ^5.0.0 || ^6.0.0"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
+ "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/linkify-it": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/markdown-it": {
+ "version": "14.2.0",
+ "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.2.0.tgz",
+ "integrity": "sha512-NoQ2yGlLWj4wpxMs+TYmRKk3thDrQ97agr7sFqfLsAlvoS8SNQuTrlObhFqG9iugdTtgOE9jpJ6FNM4ZGsa5xQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/linkify-it": "^5",
+ "@types/mdurl": "^2"
+ }
+ },
+ "node_modules/@types/mdurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/mdx": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.14.tgz",
+ "integrity": "sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "26.4.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-26.4.0.tgz",
+ "integrity": "sha512-faiGnoIrLH/V8cibOMEAZ8pMw6oXqSukl29ra4mN8GdaB2ZewzeaLj+INpV5N+Z1eKWzY+IzaIZH2EIR6YZRNQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "undici-types": "~8.3.0"
+ }
+ },
+ "node_modules/@types/react": {
+ "version": "19.2.18",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz",
+ "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "csstype": "^3.2.2"
+ }
+ },
+ "node_modules/@types/resolve": {
+ "version": "1.20.2",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
+ "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@types/sinonjs__fake-timers": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
+ "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/sizzle": {
+ "version": "2.3.10",
+ "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.10.tgz",
+ "integrity": "sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/uuid": {
+ "version": "9.0.8",
+ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz",
+ "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/yauzl": {
+ "version": "2.10.3",
+ "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
+ "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@unhead/vue": {
+ "version": "2.1.17",
+ "resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-2.1.17.tgz",
+ "integrity": "sha512-pnC8x9HLV3qQXdvWfylUEU25uhfCAy3ly9nmpQz84j9py818DRfU8jOsQ5wjdWtxyU1vX/fW2udfm4jtxUK8Bg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "hookable": "^6.0.1",
+ "unhead": "2.1.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/harlan-zw"
+ },
+ "peerDependencies": {
+ "vue": ">=3.5.18"
+ }
+ },
+ "node_modules/@unhead/vue/node_modules/hookable": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.1.tgz",
+ "integrity": "sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@vercel/nft": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-1.11.0.tgz",
+ "integrity": "sha512-m1QFg+U+3yPOnP1xSYJ73UIRxLOXdts1JOhiOiyPYqEsALgrXFFINvgUaD6R6iNvaBFAjHllBCbkfx4FuOdpaA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@mapbox/node-pre-gyp": "^2.0.0",
+ "@rollup/pluginutils": "^5.1.3",
+ "acorn": "^8.6.0",
+ "acorn-import-attributes": "^1.9.5",
+ "async-sema": "^3.1.1",
+ "bindings": "^1.4.0",
+ "estree-walker": "2.0.2",
+ "glob": "^13.0.0",
+ "graceful-fs": "^4.2.9",
+ "node-gyp-build": "^4.2.2",
+ "picomatch": "^4.0.4",
+ "resolve-from": "^5.0.0"
+ },
+ "bin": {
+ "nft": "out/cli.js"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@vitejs/plugin-vue": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz",
+ "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.0.0 || ^6.0.0",
+ "vue": "^3.2.25"
+ }
+ },
+ "node_modules/@vitejs/plugin-vue-jsx": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-5.1.6.tgz",
+ "integrity": "sha512-YXvi4as2clxt6DFw5+a0tTA97ntiQXm/raR8ofNj3aNwwdlVGTiG2gp7EvfZW17P50acL/9bP0ccF4XnqNmlgA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/core": "^7.29.0",
+ "@babel/plugin-syntax-typescript": "^7.29.7",
+ "@babel/plugin-transform-typescript": "^7.29.7",
+ "@rolldown/pluginutils": "^1.0.1",
+ "@vue/babel-plugin-jsx": "^2.0.1"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+ "vue": "^3.0.0"
+ }
+ },
+ "node_modules/@volar/language-core": {
+ "version": "2.4.28",
+ "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz",
+ "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@volar/source-map": "2.4.28"
+ }
+ },
+ "node_modules/@volar/source-map": {
+ "version": "2.4.28",
+ "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz",
+ "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@volar/typescript": {
+ "version": "2.4.15",
+ "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.15.tgz",
+ "integrity": "sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@volar/language-core": "2.4.15",
+ "path-browserify": "^1.0.1",
+ "vscode-uri": "^3.0.8"
+ }
+ },
+ "node_modules/@volar/typescript/node_modules/@volar/language-core": {
+ "version": "2.4.15",
+ "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.15.tgz",
+ "integrity": "sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@volar/source-map": "2.4.15"
+ }
+ },
+ "node_modules/@volar/typescript/node_modules/@volar/source-map": {
+ "version": "2.4.15",
+ "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.15.tgz",
+ "integrity": "sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@vue-macros/common": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-3.1.4.tgz",
+ "integrity": "sha512-/5Fv+6DgIcM9ajY05ZmKBv+LMX1M9A0X+IUwDRVdt67ciw8OV9bvG2r34p3RiEadlsQybjhKPRKNXDC8Bp23cw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@vue/compiler-sfc": "^3.5.22",
+ "ast-kit": "^2.1.2",
+ "local-pkg": "^1.1.2",
+ "magic-string-ast": "^1.0.2",
+ "unplugin-utils": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/vue-macros"
+ },
+ "peerDependencies": {
+ "vue": "^2.7.0 || ^3.2.25"
+ },
+ "peerDependenciesMeta": {
+ "vue": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vue/babel-helper-vue-transform-on": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-2.0.1.tgz",
+ "integrity": "sha512-uZ66EaFbnnZSYqYEyplWvn46GhZ1KuYSThdT68p+am7MgBNbQ3hphTL9L+xSIsWkdktwhPYLwPgVWqo96jDdRA==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@vue/babel-plugin-jsx": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-2.0.1.tgz",
+ "integrity": "sha512-a8CaLQjD/s4PVdhrLD/zT574ZNPnZBOY+IhdtKWRB4HRZ0I2tXBi5ne7d9eCfaYwp5gU5+4KIyFTV1W1YL9xZA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/plugin-syntax-jsx": "^7.27.1",
+ "@babel/template": "^7.27.2",
+ "@babel/traverse": "^7.28.4",
+ "@babel/types": "^7.28.4",
+ "@vue/babel-helper-vue-transform-on": "2.0.1",
+ "@vue/babel-plugin-resolve-type": "2.0.1",
+ "@vue/shared": "^3.5.22"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vue/babel-plugin-resolve-type": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-2.0.1.tgz",
+ "integrity": "sha512-ybwgIuRGRRBhOU37GImDoWQoz+TlSqap65qVI6iwg/J7FfLTLmMf97TS7xQH9I7Qtr/gp161kYVdhr1ZMraSYQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/parser": "^7.28.4",
+ "@vue/compiler-sfc": "^3.5.22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@vue/compiler-core": {
+ "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.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.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.42",
+ "@vue/shared": "3.5.42"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "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.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.19",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "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.42",
+ "@vue/shared": "3.5.42"
+ }
+ },
+ "node_modules/@vue/compiler-vue2": {
+ "version": "2.7.16",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz",
+ "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "de-indent": "^1.0.2",
+ "he": "^1.2.0"
+ }
+ },
+ "node_modules/@vue/devtools-api": {
+ "version": "6.6.4",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@vue/devtools-core": {
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-8.2.1.tgz",
+ "integrity": "sha512-s/VfAY9oDTb/kFEWmy461jaFde2MIV1RO/gi1vwM+PAZBZ/Pc2Ndu3BNBdZUze8QDUuyYvElbEEGA83syjJfzA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@vue/devtools-kit": "^8.2.1",
+ "@vue/devtools-shared": "^8.2.1"
+ },
+ "peerDependencies": {
+ "vue": "^3.0.0"
+ }
+ },
+ "node_modules/@vue/devtools-kit": {
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.2.1.tgz",
+ "integrity": "sha512-FIGIuq3AWReEpbAHY/cRGeHDfI0qOb8OCQ3YjbEAX04uaxIDbGc9rhkbVcG7rnfHPXE3RsU5KrWOu9V/okd8AQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@vue/devtools-shared": "^8.2.1",
+ "birpc": "^2.6.1",
+ "hookable": "^5.5.3",
+ "perfect-debounce": "^2.0.0"
+ }
+ },
+ "node_modules/@vue/devtools-kit/node_modules/birpc": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz",
+ "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==",
+ "license": "MIT",
+ "peer": true,
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vue/devtools-shared": {
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.2.1.tgz",
+ "integrity": "sha512-Fkac7lUdGReh6pVOi3AYPRGe82LQqRmAfThW7RRligOAP0ZA/Z1z9XLHDM9dv34pV2HRc79DK8uKPeG2fLnA/g==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@vue/language-core": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.3.11.tgz",
+ "integrity": "sha512-QJmpliwAVpC/OxubIByPAhNzsQPRc8/gxlN2qnVzVfIMjMDz/9RnXRFoetjz5yEgXVXyp4LqhXq3V53PjmNzFw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@volar/language-core": "2.4.28",
+ "@vue/compiler-dom": "^3.5.0",
+ "@vue/shared": "^3.5.0",
+ "alien-signals": "^3.2.1",
+ "muggle-string": "^0.4.1",
+ "path-browserify": "^1.0.1",
+ "picomatch": "^4.0.4"
+ }
+ },
+ "node_modules/@vue/reactivity": {
+ "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.42"
+ }
+ },
+ "node_modules/@vue/runtime-core": {
+ "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.42",
+ "@vue/shared": "3.5.42"
+ }
+ },
+ "node_modules/@vue/runtime-dom": {
+ "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.42",
+ "@vue/runtime-core": "3.5.42",
+ "@vue/shared": "3.5.42",
+ "csstype": "^3.2.3"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "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.42",
+ "@vue/runtime-dom": "3.5.42",
+ "@vue/shared": "3.5.42"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "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/abbrev": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz",
+ "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==",
+ "license": "ISC",
+ "peer": true,
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/abort-controller": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
+ "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "event-target-shim": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=6.5"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz",
+ "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==",
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-import-attributes": {
+ "version": "1.9.5",
+ "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz",
+ "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==",
+ "license": "MIT",
+ "peer": true,
+ "peerDependencies": {
+ "acorn": "^8"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/aggregate-error": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/alien-signals": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-3.2.1.tgz",
+ "integrity": "sha512-I8FjmltrfnDFoZedi5CG8DghVYNhzb/Ijluz7tCSJH0xpd0484Kowhbb1XDYOxfJpU1p5wnM2X54dA+IfGyD1g==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-escapes/node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/ansis": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.3.1.tgz",
+ "integrity": "sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==",
+ "license": "ISC",
+ "peer": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/anymatch/node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/arch": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
+ "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/archiver": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz",
+ "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "archiver-utils": "^5.0.2",
+ "async": "^3.2.4",
+ "buffer-crc32": "^1.0.0",
+ "readable-stream": "^4.0.0",
+ "readdir-glob": "^1.1.2",
+ "tar-stream": "^3.0.0",
+ "zip-stream": "^6.0.1"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/archiver-utils": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz",
+ "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "glob": "^10.0.0",
+ "graceful-fs": "^4.2.0",
+ "is-stream": "^2.0.1",
+ "lazystream": "^1.0.0",
+ "lodash": "^4.17.15",
+ "normalize-path": "^3.0.0",
+ "readable-stream": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/archiver-utils/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/archiver-utils/node_modules/brace-expansion": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz",
+ "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/archiver-utils/node_modules/glob": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
+ "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/archiver-utils/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "license": "ISC",
+ "peer": true
+ },
+ "node_modules/archiver-utils/node_modules/minimatch": {
+ "version": "9.0.9",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
+ "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/archiver-utils/node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "license": "BlueOak-1.0.0",
+ "peer": true,
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/asn1": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
+ "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "node_modules/assert-never": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.4.0.tgz",
+ "integrity": "sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/ast-kit": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-2.2.0.tgz",
+ "integrity": "sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/parser": "^7.28.5",
+ "pathe": "^2.0.3"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
+ "node_modules/ast-types": {
+ "version": "0.16.3",
+ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.3.tgz",
+ "integrity": "sha512-FvWoWYfSCM6kRxCSH+MGLHIKKGRL6A6AW7Zek2O32REPQRdg131428uRTKMBYAeRd3XXAaHDS60Wpri7CdKDrA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ast-walker-scope": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.8.3.tgz",
+ "integrity": "sha512-cbdCP0PGOBq0ASG+sjnKIoYkWMKhhz+F/h9pRexUdX2Hd38+WOlBkRKlqkGOSm0YQpcFMQBJeK4WspUAkwsEdg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/parser": "^7.28.4",
+ "ast-kit": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
+ "node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/async": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+ "license": "MIT"
+ },
+ "node_modules/async-sema": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz",
+ "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.5.4",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.4.tgz",
+ "integrity": "sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "browserslist": "^4.28.6",
+ "caniuse-lite": "^1.0.30001806",
+ "fraction.js": "^5.3.4",
+ "picocolors": "^1.1.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/aws4": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz",
+ "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/b4a": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz",
+ "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "peerDependencies": {
+ "react-native-b4a": "*"
+ },
+ "peerDependenciesMeta": {
+ "react-native-b4a": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/babel-walk": {
+ "version": "3.0.0-canary-5",
+ "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz",
+ "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.9.6"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/bare-events": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.9.2.tgz",
+ "integrity": "sha512-AIPKioV7/Y/8KfZ3AAhjPJxLLbY49S64Ym5DakZlUg75qQiTgUq9hEJoEwa4eUezPUlXRy/i5NpsKvo9jgKmoA==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "peerDependencies": {
+ "bare-abort-controller": "*"
+ },
+ "peerDependenciesMeta": {
+ "bare-abort-controller": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/bare-fs": {
+ "version": "4.8.1",
+ "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.8.1.tgz",
+ "integrity": "sha512-N1nnXdHZAOSstz0XiHikGS4HGMH4CnSwhqWdGQQMqqdvp4Jybm9sE3R1WVnpWVd4SFkc8ryPDBLViNLwiEqECg==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "bare-events": "^2.5.4",
+ "bare-path": "^3.0.0",
+ "bare-stream": "^2.6.4",
+ "bare-url": "^2.2.2",
+ "fast-fifo": "^1.3.2"
+ },
+ "engines": {
+ "bare": ">=1.28.0"
+ },
+ "peerDependencies": {
+ "bare-buffer": "*"
+ },
+ "peerDependenciesMeta": {
+ "bare-buffer": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/bare-path": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.1.2.tgz",
+ "integrity": "sha512-ZyKbsuuqK6Ag0K8pX6V5Txq6XeJRvY+wXucnFGRjiyVYP9YWDpIQugk/b+enRYrEYBJaqLzghRQpXPMR7341Nw==",
+ "license": "Apache-2.0",
+ "peer": true
+ },
+ "node_modules/bare-stream": {
+ "version": "2.13.4",
+ "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.4.tgz",
+ "integrity": "sha512-PcrQ8lVLbiJscNm1Kez+Yp4Gy4AHGcN1lzwjvf5NybWen7VvEgUfyfnXYJ2zNqWnzOfCb1Abq6lH8ti0syQszA==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "b4a": "^1.8.1",
+ "streamx": "^2.25.0",
+ "teex": "^1.0.1"
+ },
+ "peerDependencies": {
+ "bare-abort-controller": "*",
+ "bare-buffer": "*",
+ "bare-events": "*"
+ },
+ "peerDependenciesMeta": {
+ "bare-abort-controller": {
+ "optional": true
+ },
+ "bare-buffer": {
+ "optional": true
+ },
+ "bare-events": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/bare-url": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.5.3.tgz",
+ "integrity": "sha512-3absfEzoyFosWT8v83ZcJgbTJxv+S/sI7jBfeCMlUVatSaefRmwweqBhFpMllQv+HTxs/FbbToVOw1c05NORkQ==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "bare-path": "^3.0.0"
+ }
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.11.20",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.20.tgz",
+ "integrity": "sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "node_modules/better-opn": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz",
+ "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "open": "^8.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/better-opn/node_modules/define-lazy-prop": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/better-opn/node_modules/is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/better-opn/node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/better-opn/node_modules/open": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
+ "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-lazy-prop": "^2.0.0",
+ "is-docker": "^2.1.1",
+ "is-wsl": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bindings": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
+ "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "file-uri-to-path": "1.0.0"
+ }
+ },
+ "node_modules/birpc": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/birpc/-/birpc-4.2.0.tgz",
+ "integrity": "sha512-KxgKcZPfrtzJDDALHPguGpGJUrzdgpymyiQQgzFjWreHMOpWrnFNVREr5J48x2DBh8ZVioscrV1SBkDipGiX+Q==",
+ "license": "MIT",
+ "peer": true,
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/blob-util": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz",
+ "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "license": "ISC"
+ },
+ "node_modules/brace-expansion": {
+ "version": "5.0.9",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz",
+ "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browser-assert": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz",
+ "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==",
+ "dev": true
+ },
+ "node_modules/browserslist": {
+ "version": "4.28.8",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz",
+ "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "baseline-browser-mapping": "^2.11.12",
+ "caniuse-lite": "^1.0.30001809",
+ "electron-to-chromium": "^1.5.402",
+ "node-releases": "^2.0.53",
+ "update-browserslist-db": "^1.3.0"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/buffer-crc32": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz",
+ "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/bundle-name": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
+ "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "run-applescript": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/c12": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/c12/-/c12-3.3.4.tgz",
+ "integrity": "sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "chokidar": "^5.0.0",
+ "confbox": "^0.2.4",
+ "defu": "^6.1.6",
+ "dotenv": "^17.3.1",
+ "exsolve": "^1.0.8",
+ "giget": "^3.2.0",
+ "jiti": "^2.6.1",
+ "ohash": "^2.0.11",
+ "pathe": "^2.0.3",
+ "perfect-debounce": "^2.1.0",
+ "pkg-types": "^2.3.0",
+ "rc9": "^3.0.1"
+ },
+ "peerDependencies": {
+ "magicast": "*"
+ },
+ "peerDependenciesMeta": {
+ "magicast": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/cac": {
+ "version": "6.7.14",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cachedir": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz",
+ "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz",
+ "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "get-intrinsic": "^1.3.0",
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/caniuse-api": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
+ "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "browserslist": "^4.0.0",
+ "caniuse-lite": "^1.0.0",
+ "lodash.memoize": "^4.1.2",
+ "lodash.uniq": "^4.5.0"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001810",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz",
+ "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0",
+ "peer": true
+ },
+ "node_modules/caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chalk/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/character-parser": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz",
+ "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-regex": "^1.0.3"
+ }
+ },
+ "node_modules/check-more-types": {
+ "version": "2.24.0",
+ "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz",
+ "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
+ "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 20.19.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
+ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
+ "license": "BlueOak-1.0.0",
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz",
+ "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/citty": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.2.tgz",
+ "integrity": "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "restore-cursor": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-table3": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
+ "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "string-width": "^4.2.0"
+ },
+ "engines": {
+ "node": "10.* || >= 12.*"
+ },
+ "optionalDependencies": {
+ "@colors/colors": "1.5.0"
+ }
+ },
+ "node_modules/cli-truncate": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
+ "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "slice-ansi": "^3.0.0",
+ "string-width": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz",
+ "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==",
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "string-width": "^7.2.0",
+ "strip-ansi": "^7.1.0",
+ "wrap-ansi": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/cliui/node_modules/ansi-regex": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz",
+ "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/cliui/node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/cliui/node_modules/emoji-regex": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
+ "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/cliui/node_modules/string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cliui/node_modules/strip-ansi": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-regex": "^6.2.2"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/cliui/node_modules/wrap-ansi": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz",
+ "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "string-width": "^7.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/cluster-key-slot": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.1.tgz",
+ "integrity": "sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
+ "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/common-tags": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
+ "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/compatx": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/compatx/-/compatx-0.2.0.tgz",
+ "integrity": "sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/compress-commons": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz",
+ "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "crc-32": "^1.2.0",
+ "crc32-stream": "^6.0.0",
+ "is-stream": "^2.0.1",
+ "normalize-path": "^3.0.0",
+ "readable-stream": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/consola": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
+ "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "^14.18.0 || >=16.10.0"
+ }
+ },
+ "node_modules/constantinople": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz",
+ "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.6.0",
+ "@babel/types": "^7.6.1"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/cookie-es": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-2.0.1.tgz",
+ "integrity": "sha512-aVf4A4hI2w70LnF7GG+7xDQUkliwiXWXFvTjkip4+b64ygDQ2sJPRSKFDHbxn8o0xu9QzPkMuuiWIXyFSE2slA==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
+ "license": "MIT"
+ },
+ "node_modules/crc-32": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
+ "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "bin": {
+ "crc32": "bin/crc32.njs"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/crc32-stream": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz",
+ "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "crc-32": "^1.2.0",
+ "readable-stream": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/croner": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/croner/-/croner-10.0.1.tgz",
+ "integrity": "sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g==",
+ "funding": [
+ {
+ "type": "other",
+ "url": "https://paypal.me/hexagonpp"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/hexagon"
+ }
+ ],
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=18.0"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/crossws": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz",
+ "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "uncrypto": "^0.1.3"
+ }
+ },
+ "node_modules/css-declaration-sorter": {
+ "version": "7.4.0",
+ "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.4.0.tgz",
+ "integrity": "sha512-LTuzjPoyA2vMGKKcaOqKSp7Ub2eGrNfKiZH4LpezxpNrsICGCSFvsQOI29psISxNZtaXibkC2CXzrQ5enMeGGw==",
+ "license": "ISC",
+ "peer": true,
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.9"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
+ "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.0.1",
+ "domhandler": "^4.3.1",
+ "domutils": "^2.8.0",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz",
+ "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "mdn-data": "2.27.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz",
+ "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cssnano": {
+ "version": "7.1.9",
+ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.1.9.tgz",
+ "integrity": "sha512-uPR75+5Dk/WJ/YSPR1/YDHdwMM9c5FsaARljfKWgeCKLKOtJ0we21xy/RcCjn53fZnD/f6yYEIZ8pu18+GnbNQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "cssnano-preset-default": "^7.0.17",
+ "lilconfig": "^3.1.3"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/cssnano"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/cssnano-preset-default": {
+ "version": "7.0.17",
+ "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.17.tgz",
+ "integrity": "sha512-11qO63A+czwguQFJCaTdICvbaxn0pJzz/XghLlv+OT7WyToDxAMR0Xb3/26/l0y0hQJywwNbj/SLSQlGBHE1OA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "browserslist": "^4.28.2",
+ "css-declaration-sorter": "^7.2.0",
+ "cssnano-utils": "^5.0.3",
+ "postcss-calc": "^10.1.1",
+ "postcss-colormin": "^7.0.10",
+ "postcss-convert-values": "^7.0.12",
+ "postcss-discard-comments": "^7.0.8",
+ "postcss-discard-duplicates": "^7.0.4",
+ "postcss-discard-empty": "^7.0.3",
+ "postcss-discard-overridden": "^7.0.3",
+ "postcss-merge-longhand": "^7.0.7",
+ "postcss-merge-rules": "^7.0.11",
+ "postcss-minify-font-values": "^7.0.3",
+ "postcss-minify-gradients": "^7.0.5",
+ "postcss-minify-params": "^7.0.9",
+ "postcss-minify-selectors": "^7.1.2",
+ "postcss-normalize-charset": "^7.0.3",
+ "postcss-normalize-display-values": "^7.0.3",
+ "postcss-normalize-positions": "^7.0.4",
+ "postcss-normalize-repeat-style": "^7.0.4",
+ "postcss-normalize-string": "^7.0.3",
+ "postcss-normalize-timing-functions": "^7.0.3",
+ "postcss-normalize-unicode": "^7.0.9",
+ "postcss-normalize-url": "^7.0.3",
+ "postcss-normalize-whitespace": "^7.0.3",
+ "postcss-ordered-values": "^7.0.4",
+ "postcss-reduce-initial": "^7.0.9",
+ "postcss-reduce-transforms": "^7.0.3",
+ "postcss-svgo": "^7.1.3",
+ "postcss-unique-selectors": "^7.0.7"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/cssnano-utils": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.3.tgz",
+ "integrity": "sha512-ynIREMICLxkxm7e9bCR9sh75s4Q5drICi0ua1yxo5jH2XPBqSKkl4dOh4EbFqtUmnTMhRffHgYL0EKKkMjtJTg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/csso": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
+ "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "css-tree": "~2.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/css-tree": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
+ "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "mdn-data": "2.0.28",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/mdn-data": {
+ "version": "2.0.28",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
+ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",
+ "license": "CC0-1.0",
+ "peer": true
+ },
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "license": "MIT"
+ },
+ "node_modules/cypress": {
+ "version": "13.17.0",
+ "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.17.0.tgz",
+ "integrity": "sha512-5xWkaPurwkIljojFidhw8lFScyxhtiFHl/i/3zov+1Z5CmY4t9tjIdvSXfu82Y3w7wt0uR9KkucbhkVvJZLQSA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "@cypress/request": "^3.0.6",
+ "@cypress/xvfb": "^1.2.4",
+ "@types/sinonjs__fake-timers": "8.1.1",
+ "@types/sizzle": "^2.3.2",
+ "arch": "^2.2.0",
+ "blob-util": "^2.0.2",
+ "bluebird": "^3.7.2",
+ "buffer": "^5.7.1",
+ "cachedir": "^2.3.0",
+ "chalk": "^4.1.0",
+ "check-more-types": "^2.24.0",
+ "ci-info": "^4.0.0",
+ "cli-cursor": "^3.1.0",
+ "cli-table3": "~0.6.1",
+ "commander": "^6.2.1",
+ "common-tags": "^1.8.0",
+ "dayjs": "^1.10.4",
+ "debug": "^4.3.4",
+ "enquirer": "^2.3.6",
+ "eventemitter2": "6.4.7",
+ "execa": "4.1.0",
+ "executable": "^4.1.1",
+ "extract-zip": "2.0.1",
+ "figures": "^3.2.0",
+ "fs-extra": "^9.1.0",
+ "getos": "^3.2.1",
+ "is-installed-globally": "~0.4.0",
+ "lazy-ass": "^1.6.0",
+ "listr2": "^3.8.3",
+ "lodash": "^4.17.21",
+ "log-symbols": "^4.0.0",
+ "minimist": "^1.2.8",
+ "ospath": "^1.2.2",
+ "pretty-bytes": "^5.6.0",
+ "process": "^0.11.10",
+ "proxy-from-env": "1.0.0",
+ "request-progress": "^3.0.0",
+ "semver": "^7.5.3",
+ "supports-color": "^8.1.1",
+ "tmp": "~0.2.3",
+ "tree-kill": "1.2.2",
+ "untildify": "^4.0.0",
+ "yauzl": "^2.10.0"
+ },
+ "bin": {
+ "cypress": "bin/cypress"
+ },
+ "engines": {
+ "node": "^16.0.0 || ^18.0.0 || >=20.0.0"
+ }
+ },
+ "node_modules/dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/dayjs": {
+ "version": "1.11.23",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.23.tgz",
+ "integrity": "sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/db0": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/db0/-/db0-0.3.4.tgz",
+ "integrity": "sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw==",
+ "license": "MIT",
+ "peer": true,
+ "peerDependencies": {
+ "@electric-sql/pglite": "*",
+ "@libsql/client": "*",
+ "better-sqlite3": "*",
+ "drizzle-orm": "*",
+ "mysql2": "*",
+ "sqlite3": "*"
+ },
+ "peerDependenciesMeta": {
+ "@electric-sql/pglite": {
+ "optional": true
+ },
+ "@libsql/client": {
+ "optional": true
+ },
+ "better-sqlite3": {
+ "optional": true
+ },
+ "drizzle-orm": {
+ "optional": true
+ },
+ "mysql2": {
+ "optional": true
+ },
+ "sqlite3": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/de-indent": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
+ "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/default-browser": {
+ "version": "5.5.1",
+ "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.1.tgz",
+ "integrity": "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "bundle-name": "^4.1.0",
+ "default-browser-id": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/default-browser-id": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz",
+ "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-lazy-prop": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
+ "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/defu": {
+ "version": "6.1.7",
+ "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz",
+ "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/denque": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
+ "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/destr": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz",
+ "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/devalue": {
+ "version": "5.9.2",
+ "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.9.2.tgz",
+ "integrity": "sha512-po4PAY5c53tw5XMocSnf8A/5OHhbbUftpr93aEN6BBoAdntUmK7vu7wOATqvt7cXO7m1Cl4gMVn6p7n6n4mj0w==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/diff": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz",
+ "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==",
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/doctypes": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz",
+ "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/dom-serializer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
+ "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/dom-serializer/node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domhandler": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
+ "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+ "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/dot-prop": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-10.2.0.tgz",
+ "integrity": "sha512-BTJ9aZYL3vCfZlZOBLy9v8TUqWGQ0pzFnygKwFZt5udj6viBoFIBviKPUoZLDCPn1FoXffv6McQFDenrm5Krfw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "type-fest": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/dot-prop/node_modules/type-fest": {
+ "version": "5.9.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.9.0.tgz",
+ "integrity": "sha512-yANm3Jr3GiJ1qgJlxGAVxTOIcEOk1rhQHamlXtnrCK7EHP4HeM9OGxtMg/W7HFdrVzw/ZWJKGVIJusVH85sLtw==",
+ "license": "(MIT OR CC0-1.0)",
+ "peer": true,
+ "dependencies": {
+ "tagged-tag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "17.4.2",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz",
+ "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==",
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/duplexer": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.418",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.418.tgz",
+ "integrity": "sha512-UzS26r3AEbG5wSoGVpJKqwHIU9zwQN7LHdVIThDrJpS0I5KdlXFMEb8543fhc9dVnIIAST6ar8rhwa00AL5MlA==",
+ "license": "ISC",
+ "peer": true
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
+ "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.24.5",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz",
+ "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.3.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/enquirer": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz",
+ "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "^4.1.1",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/entities": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz",
+ "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/error-stack-parser-es": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz",
+ "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==",
+ "license": "MIT",
+ "peer": true,
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/errx": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/errx/-/errx-0.1.2.tgz",
+ "integrity": "sha512-chfpPHmCerdo/rXr/nNvPZRkV4WwDRwzwnsJ0Uzz3tVi8Z41tDctRjduYy1138ii77AFlts1qvWtX3g/Acg91Q==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz",
+ "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz",
+ "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.28.2",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz",
+ "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.28.2",
+ "@esbuild/android-arm": "0.28.2",
+ "@esbuild/android-arm64": "0.28.2",
+ "@esbuild/android-x64": "0.28.2",
+ "@esbuild/darwin-arm64": "0.28.2",
+ "@esbuild/darwin-x64": "0.28.2",
+ "@esbuild/freebsd-arm64": "0.28.2",
+ "@esbuild/freebsd-x64": "0.28.2",
+ "@esbuild/linux-arm": "0.28.2",
+ "@esbuild/linux-arm64": "0.28.2",
+ "@esbuild/linux-ia32": "0.28.2",
+ "@esbuild/linux-loong64": "0.28.2",
+ "@esbuild/linux-mips64el": "0.28.2",
+ "@esbuild/linux-ppc64": "0.28.2",
+ "@esbuild/linux-riscv64": "0.28.2",
+ "@esbuild/linux-s390x": "0.28.2",
+ "@esbuild/linux-x64": "0.28.2",
+ "@esbuild/netbsd-arm64": "0.28.2",
+ "@esbuild/netbsd-x64": "0.28.2",
+ "@esbuild/openbsd-arm64": "0.28.2",
+ "@esbuild/openbsd-x64": "0.28.2",
+ "@esbuild/openharmony-arm64": "0.28.2",
+ "@esbuild/sunos-x64": "0.28.2",
+ "@esbuild/win32-arm64": "0.28.2",
+ "@esbuild/win32-ia32": "0.28.2",
+ "@esbuild/win32-x64": "0.28.2"
+ }
+ },
+ "node_modules/esbuild-register": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz",
+ "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.4"
+ },
+ "peerDependencies": {
+ "esbuild": ">=0.12 <1"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/esm-resolve": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/esm-resolve/-/esm-resolve-1.0.11.tgz",
+ "integrity": "sha512-LxF0wfUQm3ldUDHkkV2MIbvvY0TgzIpJ420jHSV1Dm+IlplBEWiJTKWM61GtxUfvjV6iD4OtTYFGAGM2uuIUWg==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "license": "MIT"
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/event-target-shim": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/eventemitter2": {
+ "version": "6.4.7",
+ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz",
+ "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/events-universal": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz",
+ "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "bare-events": "^2.7.0"
+ }
+ },
+ "node_modules/execa": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
+ "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "get-stream": "^5.0.0",
+ "human-signals": "^1.1.1",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.0",
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/executable": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
+ "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pify": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/exsolve": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.1.tgz",
+ "integrity": "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/externality": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/externality/-/externality-1.0.2.tgz",
+ "integrity": "sha512-LyExtJWKxtgVzmgtEHyQtLFpw1KFhQphF9nTG8TpAIVkiI/xQ3FJh75tRFLYl4hkn7BNIIdLJInuDAavX35pMw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "enhanced-resolve": "^5.14.1",
+ "mlly": "^1.3.0",
+ "pathe": "^1.1.1",
+ "ufo": "^1.1.2"
+ }
+ },
+ "node_modules/externality/node_modules/pathe": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
+ "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/extract-zip": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
+ "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "debug": "^4.1.1",
+ "get-stream": "^5.1.0",
+ "yauzl": "^2.10.0"
+ },
+ "bin": {
+ "extract-zip": "cli.js"
+ },
+ "engines": {
+ "node": ">= 10.17.0"
+ },
+ "optionalDependencies": {
+ "@types/yauzl": "^2.9.1"
+ }
+ },
+ "node_modules/extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "license": "MIT"
+ },
+ "node_modules/fast-fifo": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
+ "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-npm-meta": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/fast-npm-meta/-/fast-npm-meta-2.2.0.tgz",
+ "integrity": "sha512-99jPl8JkCSCa4VlboNU1XuL98ijm74Pm9CGo6H4BoMVoVh1uhguQcvwLgXDT8Vkl2qj/UEQ0J9gD8beHjTFk1w==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "cac": "^7.0.0"
+ },
+ "bin": {
+ "fast-npm-meta": "dist/cli.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/fast-npm-meta/node_modules/cac": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-7.0.0.tgz",
+ "integrity": "sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=20.19.0"
+ }
+ },
+ "node_modules/fast-string-truncated-width": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz",
+ "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/fast-string-width": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz",
+ "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "fast-string-truncated-width": "^3.0.2"
+ }
+ },
+ "node_modules/fast-wrap-ansi": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz",
+ "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "fast-string-width": "^3.0.2"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.20.3",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz",
+ "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==",
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fd-slicer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+ "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pend": "~1.2.0"
+ }
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/file-uri-to-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-package-json": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/find-package-json/-/find-package-json-1.2.0.tgz",
+ "integrity": "sha512-+SOGcLGYDJHtyqHd87ysBhmaeQ95oWspDKnMXBrnQ9Eq4OkLNqejgoaD8xVWu6GPa0B6roa6KinCMEMcVeqONw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/find-up": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz",
+ "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^7.1.0",
+ "path-exists": "^5.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/for-each": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+ "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.6",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/foreground-child/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "license": "ISC",
+ "peer": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz",
+ "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.4",
+ "mime-types": "^2.1.35"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "5.3.4",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz",
+ "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/fuse.js": {
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.5.0.tgz",
+ "integrity": "sha512-sQtrEfA+ez/3G0cCZecF70oqpCRttCexYUG4mUrtWL49ULUzUyxokt5kyqwtKzj1270RaKih+hcP3qLcumccow==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/krisk"
+ }
+ },
+ "node_modules/fzf": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fzf/-/fzf-0.5.2.tgz",
+ "integrity": "sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q==",
+ "license": "BSD-3-Clause",
+ "peer": true
+ },
+ "node_modules/generator-function": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
+ "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/generic-names": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz",
+ "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loader-utils": "^3.2.0"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "license": "ISC",
+ "peer": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-east-asian-width": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz",
+ "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-port-please": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.2.0.tgz",
+ "integrity": "sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/getos": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz",
+ "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "async": "^3.2.0"
+ }
+ },
+ "node_modules/getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "node_modules/giget": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/giget/-/giget-3.3.1.tgz",
+ "integrity": "sha512-r+mvuDjrjMpsdw46Kmeydb8bdHm7wOKw8wNBtTndkjbPjgAp5oUJUxRE76wZFknxIPokfWvep2qSXK37aXE6zg==",
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "giget": "dist/cli.mjs"
+ }
+ },
+ "node_modules/glob": {
+ "version": "13.0.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz",
+ "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==",
+ "license": "BlueOak-1.0.0",
+ "peer": true,
+ "dependencies": {
+ "minimatch": "^10.2.2",
+ "minipass": "^7.1.3",
+ "path-scurry": "^2.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/global-directory": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz",
+ "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ini": "4.1.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/global-directory/node_modules/ini": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz",
+ "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==",
+ "license": "ISC",
+ "peer": true,
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/global-dirs": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
+ "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ini": "2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globby": {
+ "version": "16.2.4",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.4.tgz",
+ "integrity": "sha512-c8B/VNLmxRcmqqenRA9t+9IyOjf9+V6lTxPaUJLqOCONdQkWZ0ETYgX0qbtJqPsgCNusT9MZ5Jeidw8Eb9tn2g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@sindresorhus/merge-streams": "^4.0.0",
+ "fast-glob": "^3.3.3",
+ "ignore": "^7.0.5",
+ "is-path-inside": "^4.0.0",
+ "micromatch": "^4.0.8",
+ "slash": "^5.1.0",
+ "unicorn-magic": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globby/node_modules/is-path-inside": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz",
+ "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "license": "ISC"
+ },
+ "node_modules/gzip-size": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-7.0.0.tgz",
+ "integrity": "sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "duplexer": "^0.1.2"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/h3": {
+ "version": "1.15.11",
+ "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.11.tgz",
+ "integrity": "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "cookie-es": "^1.2.3",
+ "crossws": "^0.3.5",
+ "defu": "^6.1.6",
+ "destr": "^2.0.5",
+ "iron-webcrypto": "^1.2.1",
+ "node-mock-http": "^1.0.4",
+ "radix3": "^1.1.2",
+ "ufo": "^1.6.3",
+ "uncrypto": "^0.1.3"
+ }
+ },
+ "node_modules/h3/node_modules/cookie-es": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.3.tgz",
+ "integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hash-sum": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz",
+ "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/hasown": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
+ "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/hookable": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz",
+ "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "depd": "~2.0.0",
+ "inherits": "~2.0.4",
+ "setprototypeof": "~1.2.0",
+ "statuses": "~2.0.2",
+ "toidentifier": "~1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/http-shutdown": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/http-shutdown/-/http-shutdown-1.2.2.tgz",
+ "integrity": "sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "iojs": ">= 1.0.0",
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/http-signature": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz",
+ "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^2.0.2",
+ "sshpk": "^1.18.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/httpxy": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/httpxy/-/httpxy-0.5.5.tgz",
+ "integrity": "sha512-uDjmnPyp1q4Sgzf3w+J/Fc6UqcCEj0x4Wjp7OqK5dGhNeDgpyrAmnS6ey8QWrX3SWDon2DMKf9sBa5X9+CVyMA==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/human-signals": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+ "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8.12.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/ignore": {
+ "version": "7.0.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.8.tgz",
+ "integrity": "sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/image-meta": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/image-meta/-/image-meta-0.2.2.tgz",
+ "integrity": "sha512-3MOLanc3sb3LNGWQl1RlQlNWURE5g32aUphrDyFeCsxBTk08iE3VNe4CwsUZ0Qs1X+EfX0+r29Sxdpza4B+yRA==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/immutable": {
+ "version": "5.1.9",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz",
+ "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/impound": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/impound/-/impound-1.2.0.tgz",
+ "integrity": "sha512-hbFh2WURN+XQ364SbblzubhEEj/B3qZCe80l/EHXPWM6/kZP2mvOllxwRBBWNxe4gLbqXZL0fxOZwoDCSlJZQw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.31",
+ "es-module-lexer": "^2.0.0",
+ "pathe": "^2.0.3",
+ "unplugin": "^3.0.0",
+ "unplugin-utils": "^0.3.1"
+ }
+ },
+ "node_modules/impound/node_modules/unplugin": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.3.0.tgz",
+ "integrity": "sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/remapping": "^2.3.5",
+ "picomatch": "^4.0.4",
+ "webpack-virtual-modules": "^0.6.2"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "@farmfe/core": "*",
+ "@rspack/core": "*",
+ "bun-types-no-globals": "*",
+ "esbuild": "*",
+ "rolldown": "*",
+ "rollup": "*",
+ "unloader": "*",
+ "vite": "*",
+ "webpack": "*"
+ },
+ "peerDependenciesMeta": {
+ "@farmfe/core": {
+ "optional": true
+ },
+ "@rspack/core": {
+ "optional": true
+ },
+ "bun-types-no-globals": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "rolldown": {
+ "optional": true
+ },
+ "rollup": {
+ "optional": true
+ },
+ "unloader": {
+ "optional": true
+ },
+ "vite": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/ini": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
+ "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ioredis": {
+ "version": "5.11.1",
+ "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.11.1.tgz",
+ "integrity": "sha512-ehuGcf94bQXhfagULNXrJdfnWO38v070jxSx/qE87Kjzmu2fU7ro5EFAb+OPituLqgfyuQaym5DlrNydW2sJ9A==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@ioredis/commands": "1.10.0",
+ "cluster-key-slot": "1.1.1",
+ "debug": "4.4.3",
+ "denque": "2.1.0",
+ "redis-errors": "1.2.0",
+ "redis-parser": "3.0.0",
+ "standard-as-callback": "2.1.0"
+ },
+ "engines": {
+ "node": ">=12.22.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/ioredis"
+ }
+ },
+ "node_modules/iron-webcrypto": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz",
+ "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==",
+ "license": "MIT",
+ "peer": true,
+ "funding": {
+ "url": "https://github.com/sponsors/brc-dd"
+ }
+ },
+ "node_modules/is-arguments": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz",
+ "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.2",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz",
+ "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==",
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
+ "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-expression": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz",
+ "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^7.1.1",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "node_modules/is-expression/node_modules/acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
+ "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.4",
+ "generator-function": "^2.0.0",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-in-ssh": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz",
+ "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-inside-container": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
+ "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "is-docker": "^3.0.0"
+ },
+ "bin": {
+ "is-inside-container": "cli.js"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-installed-globally": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
+ "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "global-dirs": "^3.0.0",
+ "is-path-inside": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
+ "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-promise": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
+ "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-reference": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
+ "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz",
+ "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "is-inside-container": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "license": "ISC"
+ },
+ "node_modules/isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "license": "BlueOak-1.0.0",
+ "peer": true,
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz",
+ "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==",
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
+ },
+ "node_modules/js-stringify": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz",
+ "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jsdoc-type-pratt-parser": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.8.0.tgz",
+ "integrity": "sha512-iZ8Bdb84lWRuGHamRXFyML07r21pcwBrLkHEuHgEY5UbCouBwv7ECknDRKzsQIXMiqpPymqtIf8TC/shYKB5rw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+ "dev": true,
+ "license": "(AFL-2.1 OR BSD-3-Clause)"
+ },
+ "node_modules/json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonfile": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz",
+ "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsprim": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz",
+ "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.4.0",
+ "verror": "1.10.0"
+ }
+ },
+ "node_modules/jstransformer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz",
+ "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-promise": "^2.0.0",
+ "promise": "^7.0.1"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
+ "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/klona": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz",
+ "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/knitwork": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/knitwork/-/knitwork-1.3.0.tgz",
+ "integrity": "sha512-4LqMNoONzR43B1W0ek0fhXMsDNW/zxa1NdFAVMY+k28pgZLovR4G3PB5MrpTxCy1QaZCqNoiaKPr5w5qZHfSNw==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/launch-editor": {
+ "version": "2.14.1",
+ "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.1.tgz",
+ "integrity": "sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "picocolors": "^1.1.1",
+ "shell-quote": "^1.8.4"
+ }
+ },
+ "node_modules/lazy-ass": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
+ "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "> 0.8"
+ }
+ },
+ "node_modules/lazystream": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz",
+ "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "readable-stream": "^2.0.5"
+ },
+ "engines": {
+ "node": ">= 0.6.3"
+ }
+ },
+ "node_modules/lazystream/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/lazystream/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/lazystream/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/lightningcss": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz",
+ "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==",
+ "license": "MPL-2.0",
+ "peer": true,
+ "dependencies": {
+ "detect-libc": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "lightningcss-android-arm64": "1.33.0",
+ "lightningcss-darwin-arm64": "1.33.0",
+ "lightningcss-darwin-x64": "1.33.0",
+ "lightningcss-freebsd-x64": "1.33.0",
+ "lightningcss-linux-arm-gnueabihf": "1.33.0",
+ "lightningcss-linux-arm64-gnu": "1.33.0",
+ "lightningcss-linux-arm64-musl": "1.33.0",
+ "lightningcss-linux-x64-gnu": "1.33.0",
+ "lightningcss-linux-x64-musl": "1.33.0",
+ "lightningcss-win32-arm64-msvc": "1.33.0",
+ "lightningcss-win32-x64-msvc": "1.33.0"
+ }
+ },
+ "node_modules/lightningcss-android-arm64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz",
+ "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz",
+ "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz",
+ "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-freebsd-x64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz",
+ "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz",
+ "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz",
+ "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz",
+ "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz",
+ "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz",
+ "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz",
+ "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz",
+ "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "node_modules/linkify-it": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz",
+ "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/puzrin"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/markdown-it"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "uc.micro": "^2.0.0"
+ }
+ },
+ "node_modules/listhen": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/listhen/-/listhen-1.10.1.tgz",
+ "integrity": "sha512-6nt/86SkqUQSLW1ofz8MxC6RhRMqOl3ONISe6qqvJ3xj09aJWQx6DhgSZpugs3PX4PXdOas/WD6A9jx6J2N19A==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@parcel/watcher-wasm": "^2.5.6",
+ "citty": "^0.2.2",
+ "consola": "^3.4.2",
+ "crossws": "^0.4.10",
+ "defu": "^6.1.7",
+ "get-port-please": "^3.2.0",
+ "h3": "^1.15.11",
+ "http-shutdown": "^1.2.2",
+ "jiti": "^2.7.0",
+ "node-forge": "^1.4.0",
+ "pathe": "^2.0.3",
+ "std-env": "^4.2.0",
+ "tinyclip": "^0.1.15",
+ "ufo": "^1.6.4",
+ "untun": "^0.2.2",
+ "uqr": "^0.1.3"
+ },
+ "bin": {
+ "listen": "bin/listhen.mjs",
+ "listhen": "bin/listhen.mjs"
+ },
+ "peerDependencies": {
+ "@parcel/watcher": "^2.5.6"
+ },
+ "peerDependenciesMeta": {
+ "@parcel/watcher": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/listhen/node_modules/crossws": {
+ "version": "0.4.12",
+ "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.4.12.tgz",
+ "integrity": "sha512-aypfsr6t0uNvkqaZc6zvBfXzC6pLI0/sIulpkV6RwCVtZqG5ebBzv4weImKK0VNCj91Wl9F5j7p5WU4MNrybng==",
+ "license": "MIT",
+ "peer": true,
+ "peerDependencies": {
+ "srvx": ">=0.11.5"
+ },
+ "peerDependenciesMeta": {
+ "srvx": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/listr2": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz",
+ "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cli-truncate": "^2.1.0",
+ "colorette": "^2.0.16",
+ "log-update": "^4.0.0",
+ "p-map": "^4.0.0",
+ "rfdc": "^1.3.0",
+ "rxjs": "^7.5.1",
+ "through": "^2.3.8",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "enquirer": ">= 2.3.0 < 3"
+ },
+ "peerDependenciesMeta": {
+ "enquirer": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/loader-utils": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz",
+ "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 12.13.0"
+ }
+ },
+ "node_modules/local-pkg": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.2.1.tgz",
+ "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "mlly": "^1.7.4",
+ "pkg-types": "^2.3.0",
+ "quansync": "^0.2.11"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz",
+ "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^6.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
+ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
+ "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-escapes": "^4.3.0",
+ "cli-cursor": "^3.1.0",
+ "slice-ansi": "^4.0.0",
+ "wrap-ansi": "^6.2.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/log-update/node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/lucide-vue-next": {
+ "version": "0.525.0",
+ "resolved": "https://registry.npmjs.org/lucide-vue-next/-/lucide-vue-next-0.525.0.tgz",
+ "integrity": "sha512-Xf8+x8B2DrnGDV/rxylS+KBp2FIe6ljwDn2JsGTZZvXIfhmm/q+nv8RuGO1OyoMjOVkkz7CqtUqJfwtFPRbB2w==",
+ "deprecated": "Package deprecated. Please use @lucide/vue instead.",
+ "dev": true,
+ "license": "ISC",
+ "peerDependencies": {
+ "vue": ">=3.0.1"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/magic-string-ast": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-1.0.3.tgz",
+ "integrity": "sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "magic-string": "^0.30.19"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
+ "node_modules/magicast": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.4.tgz",
+ "integrity": "sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/parser": "^7.29.7",
+ "@babel/types": "^7.29.7",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/map-or-similar": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz",
+ "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/markdown-it": {
+ "version": "14.3.1",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.3.1.tgz",
+ "integrity": "sha512-4Ej49aYTDFIQ+uBkfX8GBvJGccoARxxPep+7aWTs55ozbjQJpW9M26Fe53vnGgvLeVzva/amzjQQaQu9w0vMhA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/puzrin"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/markdown-it"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1",
+ "entities": "^4.5.0",
+ "linkify-it": "^5.0.2",
+ "mdurl": "^2.0.0",
+ "punycode.js": "^2.3.1",
+ "uc.micro": "^2.1.0"
+ },
+ "bin": {
+ "markdown-it": "bin/markdown-it.mjs"
+ }
+ },
+ "node_modules/markdown-it/node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/mdn-data": {
+ "version": "2.27.1",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz",
+ "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==",
+ "license": "CC0-1.0",
+ "peer": true
+ },
+ "node_modules/mdurl": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.1.0.tgz",
+ "integrity": "sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/memoizerific": {
+ "version": "1.11.3",
+ "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz",
+ "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "map-or-similar": "^1.5.0"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "license": "MIT"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/micromatch/node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/mime": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-4.1.0.tgz",
+ "integrity": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==",
+ "funding": [
+ "https://github.com/sponsors/broofa"
+ ],
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "mime": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "10.2.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
+ "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==",
+ "license": "BlueOak-1.0.0",
+ "peer": true,
+ "dependencies": {
+ "brace-expansion": "^5.0.8"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
+ "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
+ "license": "BlueOak-1.0.0",
+ "peer": true,
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/minizlib": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
+ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/mlly": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz",
+ "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "acorn": "^8.16.0",
+ "pathe": "^2.0.3",
+ "pkg-types": "^1.3.1",
+ "ufo": "^1.6.3"
+ }
+ },
+ "node_modules/mlly/node_modules/confbox": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
+ "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/mlly/node_modules/pkg-types": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
+ "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "confbox": "^0.1.8",
+ "mlly": "^1.7.4",
+ "pathe": "^2.0.1"
+ }
+ },
+ "node_modules/mocked-exports": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/mocked-exports/-/mocked-exports-0.1.1.tgz",
+ "integrity": "sha512-aF7yRQr/Q0O2/4pIXm6PZ5G+jAd7QS4Yu8m+WEeEHGnbo+7mE36CbLSDQiXYV8bVL3NfmdeqPJct0tUlnjVSnA==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/mrmime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
+ "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/muggle-string": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz",
+ "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==",
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.18",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz",
+ "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/nanotar": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/nanotar/-/nanotar-0.3.0.tgz",
+ "integrity": "sha512-Kv2JYYiCzt16Kt5QwAc9BFG89xfPNBx+oQL4GQXD9nLqPkZBiNaqaCWtwnbk/q7UVsTYevvM1b0UF8zmEI4pCg==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/nitropack": {
+ "version": "2.13.4",
+ "resolved": "https://registry.npmjs.org/nitropack/-/nitropack-2.13.4.tgz",
+ "integrity": "sha512-tX7bT6zxNeMwkc6hxHiZeUoTOjVrcjoh1Z3cmxOlodIqjl4HISgqfGOmkWSayky3Nv9Z5+KQH52F8nmXJY5AAA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@cloudflare/kv-asset-handler": "^0.4.2",
+ "@rollup/plugin-alias": "^6.0.0",
+ "@rollup/plugin-commonjs": "^29.0.2",
+ "@rollup/plugin-inject": "^5.0.5",
+ "@rollup/plugin-json": "^6.1.0",
+ "@rollup/plugin-node-resolve": "^16.0.3",
+ "@rollup/plugin-replace": "^6.0.3",
+ "@rollup/plugin-terser": "^1.0.0",
+ "@vercel/nft": "^1.5.0",
+ "archiver": "^7.0.1",
+ "c12": "^3.3.4",
+ "chokidar": "^5.0.0",
+ "citty": "^0.2.2",
+ "compatx": "^0.2.0",
+ "confbox": "^0.2.4",
+ "consola": "^3.4.2",
+ "cookie-es": "^2.0.1",
+ "croner": "^10.0.1",
+ "crossws": "^0.3.5",
+ "db0": "^0.3.4",
+ "defu": "^6.1.7",
+ "destr": "^2.0.5",
+ "dot-prop": "^10.1.0",
+ "esbuild": "^0.28.0",
+ "escape-string-regexp": "^5.0.0",
+ "etag": "^1.8.1",
+ "exsolve": "^1.0.8",
+ "globby": "^16.2.0",
+ "gzip-size": "^7.0.0",
+ "h3": "^1.15.11",
+ "hookable": "^5.5.3",
+ "httpxy": "^0.5.1",
+ "ioredis": "^5.10.1",
+ "jiti": "^2.6.1",
+ "klona": "^2.0.6",
+ "knitwork": "^1.3.0",
+ "listhen": "^1.9.1",
+ "magic-string": "^0.30.21",
+ "magicast": "^0.5.2",
+ "mime": "^4.1.0",
+ "mlly": "^1.8.2",
+ "node-fetch-native": "^1.6.7",
+ "node-mock-http": "^1.0.4",
+ "ofetch": "^1.5.1",
+ "ohash": "^2.0.11",
+ "pathe": "^2.0.3",
+ "perfect-debounce": "^2.1.0",
+ "pkg-types": "^2.3.1",
+ "pretty-bytes": "^7.1.0",
+ "radix3": "^1.1.2",
+ "rollup": "^4.60.2",
+ "rollup-plugin-visualizer": "^7.0.1",
+ "scule": "^1.3.0",
+ "semver": "^7.7.4",
+ "serve-placeholder": "^2.0.2",
+ "serve-static": "^2.2.1",
+ "source-map": "^0.7.6",
+ "std-env": "^4.1.0",
+ "ufo": "^1.6.4",
+ "ultrahtml": "^1.6.0",
+ "uncrypto": "^0.1.3",
+ "unctx": "^2.5.0",
+ "unenv": "2.0.0-rc.24",
+ "unimport": "^6.2.0",
+ "unplugin-utils": "^0.3.1",
+ "unstorage": "^1.17.5",
+ "untyped": "^2.0.0",
+ "unwasm": "^0.5.3",
+ "youch": "^4.1.1",
+ "youch-core": "^0.3.3"
+ },
+ "bin": {
+ "nitro": "dist/cli/index.mjs",
+ "nitropack": "dist/cli/index.mjs"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "xml2js": "^0.6.2"
+ },
+ "peerDependenciesMeta": {
+ "xml2js": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/nitropack/node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nitropack/node_modules/pretty-bytes": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-7.1.2.tgz",
+ "integrity": "sha512-spZIOSORH9joSPGN0L/tYfvINH+xbOpnI3kdcEkq0mzGMjFvDZzyRVbqEOV0wACF0gggdKE9RWO2mosGsBh/Rg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/node-addon-api": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
+ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/node-fetch-native": {
+ "version": "1.6.7",
+ "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz",
+ "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/node-forge": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz",
+ "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==",
+ "license": "(BSD-3-Clause OR GPL-2.0)",
+ "peer": true,
+ "engines": {
+ "node": ">= 6.13.0"
+ }
+ },
+ "node_modules/node-gyp-build": {
+ "version": "4.8.4",
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz",
+ "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==",
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "node-gyp-build": "bin.js",
+ "node-gyp-build-optional": "optional.js",
+ "node-gyp-build-test": "build-test.js"
+ }
+ },
+ "node_modules/node-html-parser": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.3.3.tgz",
+ "integrity": "sha512-ncg1033CaX9UexbyA7e1N0aAoAYRDiV8jkTvzEnfd1GDvzFdrsXLzR4p4ik8mwLgnaKP/jyUFWDy9q3jvRT2Jw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "css-select": "^4.2.1",
+ "he": "1.2.0"
+ }
+ },
+ "node_modules/node-mock-http": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.5.tgz",
+ "integrity": "sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.54",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz",
+ "integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/nopt": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz",
+ "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==",
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "abbrev": "^3.0.0"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/nostics": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/nostics/-/nostics-1.2.0.tgz",
+ "integrity": "sha512-FGqEfhQjrvo1lL8KFifdTQiNwwQHJxC1jtYE1Rc54qF/jxONUNL+kC9gS1krX8Q65PgrQ5fCqH/I4NhWBvdSqg==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/nuxt": {
+ "version": "3.21.11",
+ "resolved": "https://registry.npmjs.org/nuxt/-/nuxt-3.21.11.tgz",
+ "integrity": "sha512-/RlSSvx2ne/vXbeEy+ZWZ0uVgXyiadVkrK5hMx7XsDk7R6q2o4qln2JxoQqILe7K6HzbWM9/0YFS00bTRj/kEw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@dxup/nuxt": "^0.5.6",
+ "@nuxt/cli": "^3.37.0",
+ "@nuxt/devtools": "^3.4.1",
+ "@nuxt/kit": "3.21.11",
+ "@nuxt/nitro-server": "3.21.11",
+ "@nuxt/schema": "3.21.11",
+ "@nuxt/telemetry": "^2.8.0",
+ "@nuxt/vite-builder": "3.21.11",
+ "@unhead/vue": "^2.1.17",
+ "@vue/shared": "^3.5.40",
+ "c12": "^3.3.4",
+ "chokidar": "^5.0.0",
+ "compatx": "^0.2.0",
+ "consola": "^3.4.2",
+ "cookie-es": "^2.0.1",
+ "defu": "^6.1.7",
+ "destr": "^2.0.5",
+ "devalue": "^5.9.0",
+ "errx": "^0.1.2",
+ "escape-string-regexp": "^5.0.0",
+ "exsolve": "^1.1.1",
+ "h3": "^1.15.11",
+ "hookable": "^5.5.3",
+ "ignore": "^7.0.6",
+ "impound": "^1.1.6",
+ "jiti": "^2.7.0",
+ "klona": "^2.0.6",
+ "knitwork": "^1.3.0",
+ "magic-string": "^0.30.21",
+ "mlly": "^1.8.2",
+ "nanotar": "^0.3.0",
+ "nypm": "^0.6.9",
+ "ofetch": "^1.5.1",
+ "ohash": "^2.0.11",
+ "on-change": "^6.0.2",
+ "oxc-minify": "^0.143.0",
+ "oxc-parser": "^0.143.0",
+ "oxc-transform": "^0.143.0",
+ "oxc-walker": "^1.1.1",
+ "pathe": "^2.0.3",
+ "perfect-debounce": "^2.1.0",
+ "pkg-types": "^2.3.1",
+ "rou3": "^0.9.1",
+ "scule": "^1.3.0",
+ "semver": "^7.8.5",
+ "std-env": "^4.2.0",
+ "tinyglobby": "^0.2.17",
+ "ufo": "^1.6.4",
+ "ultrahtml": "^1.7.0",
+ "uncrypto": "^0.1.3",
+ "unctx": "^2.5.0",
+ "unimport": "^6.4.0",
+ "unplugin": "^3.3.0",
+ "unplugin-vue-router": "^0.19.2",
+ "untyped": "^2.0.0",
+ "vue": "^3.5.40",
+ "vue-router": "^4.6.4"
+ },
+ "bin": {
+ "nuxi": "bin/nuxt.mjs",
+ "nuxt": "bin/nuxt.mjs"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "@parcel/watcher": "^2.1.0",
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@parcel/watcher": {
+ "optional": true
+ },
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/nuxt/node_modules/@nuxt/devtools": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/@nuxt/devtools/-/devtools-3.4.2.tgz",
+ "integrity": "sha512-Nidg0/zB710cyK89ltTkv66hMfPlIPlKA+Yb67bIrAkNm5PoTwQ1goHdFWHIAGZ9nTadcVTzATwMwa56nvl/Wg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@nuxt/devtools-kit": "3.4.2",
+ "@nuxt/devtools-wizard": "3.4.2",
+ "@nuxt/kit": "^4.5.1",
+ "@vue/devtools-core": "^8.2.1",
+ "@vue/devtools-kit": "^8.2.1",
+ "birpc": "^4.0.0",
+ "consola": "^3.4.2",
+ "destr": "^2.0.5",
+ "error-stack-parser-es": "^2.0.1",
+ "execa": "^8.0.1",
+ "fast-npm-meta": "^2.2.0",
+ "get-port-please": "^3.2.0",
+ "hookable": "^6.1.1",
+ "image-meta": "^0.2.2",
+ "is-installed-globally": "^1.0.0",
+ "launch-editor": "^2.14.1",
+ "local-pkg": "^1.2.1",
+ "magicast": "^0.5.4",
+ "nypm": "^0.6.9",
+ "ohash": "^2.0.11",
+ "pathe": "^2.0.3",
+ "perfect-debounce": "^2.1.0",
+ "pkg-types": "^2.3.1",
+ "semver": "^7.8.5",
+ "simple-git": "^3.36.0",
+ "sirv": "^3.0.2",
+ "structured-clone-es": "^2.0.1",
+ "tinyglobby": "^0.2.17",
+ "unstorage": "^1.17.5",
+ "vite-plugin-inspect": "^11.4.1",
+ "vite-plugin-vue-tracer": "^1.4.0",
+ "which": "^6.0.1",
+ "ws": "^8.21.1"
+ },
+ "bin": {
+ "devtools": "cli.mjs"
+ },
+ "peerDependencies": {
+ "@vitejs/devtools": "*",
+ "vite": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vitejs/devtools": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/nuxt/node_modules/@nuxt/devtools-kit": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/@nuxt/devtools-kit/-/devtools-kit-3.4.2.tgz",
+ "integrity": "sha512-TPPbmH9xrExagYxfCe6JgtbHmgchfgDdA656Yws18rn8I/oCvB+gcw3kTWBBp2sC9ipZPXsgbsW/yZnVnGNBiA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@nuxt/kit": "^4.5.1",
+ "execa": "^8.0.1"
+ },
+ "peerDependencies": {
+ "vite": ">=6.0"
+ }
+ },
+ "node_modules/nuxt/node_modules/@nuxt/devtools-kit/node_modules/@nuxt/kit": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-4.5.2.tgz",
+ "integrity": "sha512-l66LU9DcJYjmNwqwAj2I5UGRrUbnG2DOKGChnN70zIGtn0eq/z87gi/FRgha6eMb9/FmB1PFHgtx6PWVml1C2Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "c12": "^3.3.4",
+ "consola": "^3.4.2",
+ "defu": "^6.1.7",
+ "destr": "^2.0.5",
+ "errx": "^0.1.2",
+ "exsolve": "^1.1.1",
+ "ignore": "^7.0.6",
+ "jiti": "^2.7.0",
+ "klona": "^2.0.6",
+ "mlly": "^1.8.2",
+ "nostics": "^1.2.0",
+ "ohash": "^2.0.11",
+ "pathe": "^2.0.3",
+ "pkg-types": "^2.3.1",
+ "rc9": "^3.0.1",
+ "scule": "^1.3.0",
+ "tinyglobby": "^0.2.17",
+ "ufo": "^1.6.4",
+ "unctx": "^3.0.0",
+ "untyped": "^2.0.0",
+ "verkit": "^0.3.1"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ }
+ },
+ "node_modules/nuxt/node_modules/@nuxt/devtools-kit/node_modules/unctx": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/unctx/-/unctx-3.0.1.tgz",
+ "integrity": "sha512-5RAt2etv7g362RXyd33R82gm9u/kbtQlpoaOs9Bgm4E32GRMJ0xjbZyvdxUTmiuHk3V1IQb1aUNrp5IWY+JaWw==",
+ "license": "MIT",
+ "peer": true,
+ "peerDependencies": {
+ "magic-string": ">=0.30.21",
+ "oxc-parser": ">=0.140.0",
+ "rolldown": "^1.1.5",
+ "unplugin": "^3.3.0"
+ },
+ "peerDependenciesMeta": {
+ "magic-string": {
+ "optional": true
+ },
+ "oxc-parser": {
+ "optional": true
+ },
+ "rolldown": {
+ "optional": true
+ },
+ "unplugin": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/nuxt/node_modules/@nuxt/devtools/node_modules/@nuxt/kit": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-4.5.2.tgz",
+ "integrity": "sha512-l66LU9DcJYjmNwqwAj2I5UGRrUbnG2DOKGChnN70zIGtn0eq/z87gi/FRgha6eMb9/FmB1PFHgtx6PWVml1C2Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "c12": "^3.3.4",
+ "consola": "^3.4.2",
+ "defu": "^6.1.7",
+ "destr": "^2.0.5",
+ "errx": "^0.1.2",
+ "exsolve": "^1.1.1",
+ "ignore": "^7.0.6",
+ "jiti": "^2.7.0",
+ "klona": "^2.0.6",
+ "mlly": "^1.8.2",
+ "nostics": "^1.2.0",
+ "ohash": "^2.0.11",
+ "pathe": "^2.0.3",
+ "pkg-types": "^2.3.1",
+ "rc9": "^3.0.1",
+ "scule": "^1.3.0",
+ "tinyglobby": "^0.2.17",
+ "ufo": "^1.6.4",
+ "unctx": "^3.0.0",
+ "untyped": "^2.0.0",
+ "verkit": "^0.3.1"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ }
+ },
+ "node_modules/nuxt/node_modules/@nuxt/devtools/node_modules/hookable": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.1.tgz",
+ "integrity": "sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/nuxt/node_modules/@nuxt/devtools/node_modules/unctx": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/unctx/-/unctx-3.0.1.tgz",
+ "integrity": "sha512-5RAt2etv7g362RXyd33R82gm9u/kbtQlpoaOs9Bgm4E32GRMJ0xjbZyvdxUTmiuHk3V1IQb1aUNrp5IWY+JaWw==",
+ "license": "MIT",
+ "peer": true,
+ "peerDependencies": {
+ "magic-string": ">=0.30.21",
+ "oxc-parser": ">=0.140.0",
+ "rolldown": "^1.1.5",
+ "unplugin": "^3.3.0"
+ },
+ "peerDependenciesMeta": {
+ "magic-string": {
+ "optional": true
+ },
+ "oxc-parser": {
+ "optional": true
+ },
+ "rolldown": {
+ "optional": true
+ },
+ "unplugin": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/nuxt/node_modules/@nuxt/schema": {
+ "version": "3.21.11",
+ "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.21.11.tgz",
+ "integrity": "sha512-5Couz53Pl/SgTwtMQ9jlxVIC6wZk9aAbWyeOD7D6D1UIP5DzV/yV5lPDY/kM0nmiqPSzJf9WLTdJgB2gNm0dOA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@vue/shared": "^3.5.40",
+ "defu": "^6.1.7",
+ "pathe": "^2.0.3",
+ "pkg-types": "^2.3.1",
+ "std-env": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.10.0"
+ }
+ },
+ "node_modules/nuxt/node_modules/error-stack-parser-es": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-2.0.1.tgz",
+ "integrity": "sha512-J36ntO+rMQVRuR/umlmxmfLi4TpWwtmTnHoJoXTiC2xDNazs0VDPKcX6pbhZMDd2HFtH9isMBJXMdbki+A++Pg==",
+ "license": "MIT",
+ "peer": true,
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/nuxt/node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nuxt/node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/nuxt/node_modules/execa": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
+ "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^8.0.1",
+ "human-signals": "^5.0.0",
+ "is-stream": "^3.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^5.1.0",
+ "onetime": "^6.0.0",
+ "signal-exit": "^4.1.0",
+ "strip-final-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=16.17"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/nuxt/node_modules/get-stream": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
+ "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nuxt/node_modules/human-signals": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
+ "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "engines": {
+ "node": ">=16.17.0"
+ }
+ },
+ "node_modules/nuxt/node_modules/is-installed-globally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz",
+ "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "global-directory": "^4.0.1",
+ "is-path-inside": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nuxt/node_modules/is-path-inside": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz",
+ "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nuxt/node_modules/is-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nuxt/node_modules/isexe": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz",
+ "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==",
+ "license": "BlueOak-1.0.0",
+ "peer": true,
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/nuxt/node_modules/mimic-fn": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nuxt/node_modules/npm-run-path": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
+ "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "path-key": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nuxt/node_modules/onetime": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "mimic-fn": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nuxt/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nuxt/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "license": "ISC",
+ "peer": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/nuxt/node_modules/strip-final-newline": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nuxt/node_modules/unplugin": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.3.0.tgz",
+ "integrity": "sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/remapping": "^2.3.5",
+ "picomatch": "^4.0.4",
+ "webpack-virtual-modules": "^0.6.2"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "@farmfe/core": "*",
+ "@rspack/core": "*",
+ "bun-types-no-globals": "*",
+ "esbuild": "*",
+ "rolldown": "*",
+ "rollup": "*",
+ "unloader": "*",
+ "vite": "*",
+ "webpack": "*"
+ },
+ "peerDependenciesMeta": {
+ "@farmfe/core": {
+ "optional": true
+ },
+ "@rspack/core": {
+ "optional": true
+ },
+ "bun-types-no-globals": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "rolldown": {
+ "optional": true
+ },
+ "rollup": {
+ "optional": true
+ },
+ "unloader": {
+ "optional": true
+ },
+ "vite": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/nuxt/node_modules/vite": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz",
+ "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "lightningcss": "^1.33.0",
+ "picomatch": "^4.0.5",
+ "postcss": "^8.5.26",
+ "rolldown": "~1.2.4",
+ "tinyglobby": "^0.2.17"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "@vitejs/devtools": "^0.4.0 || ^0.5.0",
+ "esbuild": "^0.27.0 || ^0.28.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "@vitejs/devtools": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/nuxt/node_modules/vite-plugin-inspect": {
+ "version": "11.4.1",
+ "resolved": "https://registry.npmjs.org/vite-plugin-inspect/-/vite-plugin-inspect-11.4.1.tgz",
+ "integrity": "sha512-ShOFe2PURXGvRS5OrgmOLZOCwDTD7dEBVt0tMpFPKb9AsvqXKCRGM8QgKrUbRbJYFXScHvDPpGRd28rYidC0tA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansis": "^4.3.0",
+ "error-stack-parser-es": "^1.0.5",
+ "obug": "^2.1.1",
+ "ohash": "^2.0.11",
+ "open": "^11.0.0",
+ "perfect-debounce": "^2.1.0",
+ "sirv": "^3.0.2",
+ "unplugin-utils": "^0.3.1",
+ "vite-dev-rpc": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "vite": "^6.0.0 || ^7.0.0-0 || ^8.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "@nuxt/kit": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/nuxt/node_modules/vite-plugin-inspect/node_modules/error-stack-parser-es": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz",
+ "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==",
+ "license": "MIT",
+ "peer": true,
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/nuxt/node_modules/vite-plugin-vue-tracer": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/vite-plugin-vue-tracer/-/vite-plugin-vue-tracer-1.5.0.tgz",
+ "integrity": "sha512-G2aQ676fLBPnYhRi5lsARoL4hbtc/sx6fVzO7p44AB+1xQXo2UuiRgv7K26UdijrNzmuQprmJ121n3rdjBk1CA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "estree-walker": "^3.0.3",
+ "exsolve": "^1.1.1",
+ "magic-string": "^1.1.0",
+ "pathe": "^2.0.3",
+ "source-map-js": "^1.2.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0",
+ "vue": "^3.5.0"
+ }
+ },
+ "node_modules/nuxt/node_modules/vite-plugin-vue-tracer/node_modules/magic-string": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.2.3.tgz",
+ "integrity": "sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/nuxt/node_modules/which": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz",
+ "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==",
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "isexe": "^4.0.0"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/nypm": {
+ "version": "0.6.9",
+ "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.9.tgz",
+ "integrity": "sha512-zxlE2yvSWZWmHcNdT3+5zV2lrCogeE9YOklHrR3dFjqutq5wO7GFDYLFDRXLsYnJzwvy/im9fYoxePvS0VTW0w==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "citty": "^0.2.2",
+ "pathe": "^2.0.3",
+ "tinyexec": "^1.2.4"
+ },
+ "bin": {
+ "nypm": "dist/cli.mjs"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/obug": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz",
+ "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==",
+ "funding": [
+ "https://github.com/sponsors/sxzz",
+ "https://opencollective.com/debug"
+ ],
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/ofetch": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz",
+ "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "destr": "^2.0.5",
+ "node-fetch-native": "^1.6.7",
+ "ufo": "^1.6.1"
+ }
+ },
+ "node_modules/ohash": {
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.12.tgz",
+ "integrity": "sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/on-change": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/on-change/-/on-change-6.0.2.tgz",
+ "integrity": "sha512-08+12qcOVEA0fS9g/VxKS27HaT94nRutUT77J2dr8zv/unzXopvhBuF8tNLWsoLQ5IgrQ6eptGeGqUYat82U1w==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/on-change?sponsor=1"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/open": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-11.0.2.tgz",
+ "integrity": "sha512-RWqF+pBSkqecEvCKOn8QYhaNdRMJDZRIrlS/7rTDdLHaPcfXGCZ/h8zb413NfvdeAV0MR7T1yJcA34/q+CSm1Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "default-browser": "^5.5.1",
+ "define-lazy-prop": "^3.0.0",
+ "is-in-ssh": "^1.0.0",
+ "is-inside-container": "^1.0.0",
+ "powershell-utils": "^0.2.1",
+ "wsl-utils": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ospath": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
+ "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/oxc-minify": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/oxc-minify/-/oxc-minify-0.143.0.tgz",
+ "integrity": "sha512-6P7PFKZpZkI14ez9duBfVWTKLBgJfJMtdPlGGUmTIXiwMWcxS4Qy4+65qWePmYyksuzhaI5AS660V2/UjaveMA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ },
+ "optionalDependencies": {
+ "@oxc-minify/binding-android-arm-eabi": "0.143.0",
+ "@oxc-minify/binding-android-arm64": "0.143.0",
+ "@oxc-minify/binding-darwin-arm64": "0.143.0",
+ "@oxc-minify/binding-darwin-x64": "0.143.0",
+ "@oxc-minify/binding-freebsd-x64": "0.143.0",
+ "@oxc-minify/binding-linux-arm-gnueabihf": "0.143.0",
+ "@oxc-minify/binding-linux-arm-musleabihf": "0.143.0",
+ "@oxc-minify/binding-linux-arm64-gnu": "0.143.0",
+ "@oxc-minify/binding-linux-arm64-musl": "0.143.0",
+ "@oxc-minify/binding-linux-ppc64-gnu": "0.143.0",
+ "@oxc-minify/binding-linux-riscv64-gnu": "0.143.0",
+ "@oxc-minify/binding-linux-riscv64-musl": "0.143.0",
+ "@oxc-minify/binding-linux-s390x-gnu": "0.143.0",
+ "@oxc-minify/binding-linux-x64-gnu": "0.143.0",
+ "@oxc-minify/binding-linux-x64-musl": "0.143.0",
+ "@oxc-minify/binding-openharmony-arm64": "0.143.0",
+ "@oxc-minify/binding-win32-arm64-msvc": "0.143.0",
+ "@oxc-minify/binding-win32-ia32-msvc": "0.143.0",
+ "@oxc-minify/binding-win32-x64-msvc": "0.143.0"
+ }
+ },
+ "node_modules/oxc-parser": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.143.0.tgz",
+ "integrity": "sha512-ov0NzaDCOInknS7mP1cwKdJERt3utPW8ldjtdUXQ8Ty0GEFD08wk422vCUN0d7pST6kqtV7dxoI9w1Zi0l/9TA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@oxc-project/types": "^0.143.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ },
+ "optionalDependencies": {
+ "@oxc-parser/binding-android-arm-eabi": "0.143.0",
+ "@oxc-parser/binding-android-arm64": "0.143.0",
+ "@oxc-parser/binding-darwin-arm64": "0.143.0",
+ "@oxc-parser/binding-darwin-x64": "0.143.0",
+ "@oxc-parser/binding-freebsd-x64": "0.143.0",
+ "@oxc-parser/binding-linux-arm-gnueabihf": "0.143.0",
+ "@oxc-parser/binding-linux-arm-musleabihf": "0.143.0",
+ "@oxc-parser/binding-linux-arm64-gnu": "0.143.0",
+ "@oxc-parser/binding-linux-arm64-musl": "0.143.0",
+ "@oxc-parser/binding-linux-ppc64-gnu": "0.143.0",
+ "@oxc-parser/binding-linux-riscv64-gnu": "0.143.0",
+ "@oxc-parser/binding-linux-riscv64-musl": "0.143.0",
+ "@oxc-parser/binding-linux-s390x-gnu": "0.143.0",
+ "@oxc-parser/binding-linux-x64-gnu": "0.143.0",
+ "@oxc-parser/binding-linux-x64-musl": "0.143.0",
+ "@oxc-parser/binding-openharmony-arm64": "0.143.0",
+ "@oxc-parser/binding-win32-arm64-msvc": "0.143.0",
+ "@oxc-parser/binding-win32-ia32-msvc": "0.143.0",
+ "@oxc-parser/binding-win32-x64-msvc": "0.143.0"
+ }
+ },
+ "node_modules/oxc-transform": {
+ "version": "0.143.0",
+ "resolved": "https://registry.npmjs.org/oxc-transform/-/oxc-transform-0.143.0.tgz",
+ "integrity": "sha512-DBx6urRQRwA2pu3sMxmmVONu2fFlOoi3cU63DGyNsuB5YuAeR/AujdfBv7qqRRq0SnWlPsrHNrzoF8Zf43fIsg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ },
+ "optionalDependencies": {
+ "@oxc-transform/binding-android-arm-eabi": "0.143.0",
+ "@oxc-transform/binding-android-arm64": "0.143.0",
+ "@oxc-transform/binding-darwin-arm64": "0.143.0",
+ "@oxc-transform/binding-darwin-x64": "0.143.0",
+ "@oxc-transform/binding-freebsd-x64": "0.143.0",
+ "@oxc-transform/binding-linux-arm-gnueabihf": "0.143.0",
+ "@oxc-transform/binding-linux-arm-musleabihf": "0.143.0",
+ "@oxc-transform/binding-linux-arm64-gnu": "0.143.0",
+ "@oxc-transform/binding-linux-arm64-musl": "0.143.0",
+ "@oxc-transform/binding-linux-ppc64-gnu": "0.143.0",
+ "@oxc-transform/binding-linux-riscv64-gnu": "0.143.0",
+ "@oxc-transform/binding-linux-riscv64-musl": "0.143.0",
+ "@oxc-transform/binding-linux-s390x-gnu": "0.143.0",
+ "@oxc-transform/binding-linux-x64-gnu": "0.143.0",
+ "@oxc-transform/binding-linux-x64-musl": "0.143.0",
+ "@oxc-transform/binding-openharmony-arm64": "0.143.0",
+ "@oxc-transform/binding-win32-arm64-msvc": "0.143.0",
+ "@oxc-transform/binding-win32-ia32-msvc": "0.143.0",
+ "@oxc-transform/binding-win32-x64-msvc": "0.143.0"
+ }
+ },
+ "node_modules/oxc-walker": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/oxc-walker/-/oxc-walker-1.1.1.tgz",
+ "integrity": "sha512-Hwd7dq28zu/Er99+bpWp16CGwFrhyalJh0W3JOB7XpPvgWo3MqMi2ksWGKuzzA9zt50mJ2pIUwR5lpAdZ9ACNQ==",
+ "license": "MIT",
+ "peer": true,
+ "peerDependencies": {
+ "@oxc-project/types": ">=0.98.0",
+ "oxc-parser": ">=0.98.0",
+ "rolldown": ">=1.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@oxc-project/types": {
+ "optional": true
+ },
+ "oxc-parser": {
+ "optional": true
+ },
+ "rolldown": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
+ "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^1.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
+ "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-map": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "license": "BlueOak-1.0.0",
+ "peer": true
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/path-browserify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
+ "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
+ "license": "MIT"
+ },
+ "node_modules/path-exists": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
+ "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "license": "MIT"
+ },
+ "node_modules/path-scurry": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz",
+ "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==",
+ "license": "BlueOak-1.0.0",
+ "peer": true,
+ "dependencies": {
+ "lru-cache": "^11.0.0",
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-scurry/node_modules/lru-cache": {
+ "version": "11.5.2",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz",
+ "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==",
+ "license": "BlueOak-1.0.0",
+ "peer": true,
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/pathe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/perfect-debounce": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz",
+ "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz",
+ "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "confbox": "^0.2.4",
+ "exsolve": "^1.0.8",
+ "pathe": "^2.0.3"
+ }
+ },
+ "node_modules/polished": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz",
+ "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.17.8"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/possible-typed-array-names": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.26",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz",
+ "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.17",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-calc": {
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.1.1.tgz",
+ "integrity": "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.12 || ^20.9 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.38"
+ }
+ },
+ "node_modules/postcss-colormin": {
+ "version": "7.0.10",
+ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.10.tgz",
+ "integrity": "sha512-yFr6JezOolHLta/buLE71VKPh2mXursp4saVe98/ol8ZnEWhL+racShqPKlvd/DKWLre/39B6HhcMXf7RZ3hxg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@colordx/core": "^5.4.3",
+ "browserslist": "^4.28.2",
+ "caniuse-api": "^3.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-convert-values": {
+ "version": "7.0.12",
+ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.12.tgz",
+ "integrity": "sha512-xurKu5qqk4viR3Cp3p4xBR4KfnZm4w4ys6+UBwBmeuBSNkH7+DtLnYOYnOffgtE4yx8sH9S1VZ6RAAvROXzP2Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "browserslist": "^4.28.2",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-discard-comments": {
+ "version": "7.0.8",
+ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.8.tgz",
+ "integrity": "sha512-CvvS5S9WrXblFXCEJ9nVo+4z+eA7zSC7Z88V1HEJuwlQhlFnYTIjg1xJY+BCUiG2bvICap2tXii4mP22BD108Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "postcss-selector-parser": "^7.1.1"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-discard-duplicates": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.4.tgz",
+ "integrity": "sha512-VBNn1+EuMZkeGVVtz0gRfbNGtx9IFgAsAV+E2pHtXPrp4qfGBkhTIiAuE/wrb+Y6Pakg9NewAlfTpYIFAWODtw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-discard-empty": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.3.tgz",
+ "integrity": "sha512-M2pyjQCU+/7cMHVtL6bKTHjv0lZnPLMpicgr67Dlth7AbuV9gjVTtUqaRwn6Pp6BwSDspUzhz8SaUrRykJU5Dw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-discard-overridden": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.3.tgz",
+ "integrity": "sha512-aNovXo9UsZuRNLzHJtp13lHIvinDPfiXBPePpXkSjCbgp++iU2FqE+YxvjIsg6EdyPZsASFbfu+JcBFVsErXIQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-merge-longhand": {
+ "version": "7.0.7",
+ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.7.tgz",
+ "integrity": "sha512-b3mfYUxR388u5Pt0HPcVIUtUDn/k15UfTY9M+ORW+meCR6JLNxoZffiYvXyOYQoRYQNZyX/UFkMCM/mNHxe1qA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0",
+ "stylehacks": "^7.0.11"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-merge-rules": {
+ "version": "7.0.11",
+ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.11.tgz",
+ "integrity": "sha512-SJUPM18g2BmPhf8BVlbwqWz4aK3pLu6u6xjfwEzra7xL6IBR10sUaiB++EzqcVfadPHrKBSMlNdP+XieykhI+Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "browserslist": "^4.28.2",
+ "caniuse-api": "^3.0.0",
+ "cssnano-utils": "^5.0.3",
+ "postcss-selector-parser": "^7.1.1"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-minify-font-values": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.3.tgz",
+ "integrity": "sha512-yilG/VOaNI74IylQvAQQxm3/wZVBkXyYUqNUAdxqwtbWUXPsbK1q8Ms0mL83v+f8YicgcyfYCRZtWACUdYajpA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-minify-gradients": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.5.tgz",
+ "integrity": "sha512-YraROyQRg3BI1+Hg8E05B/JPdnTm8EDSVu4P2BxdM+CRiOyfmou809+chGIqo6fQqwjPGQ947nbGncSjmTU1WQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@colordx/core": "^5.4.3",
+ "cssnano-utils": "^5.0.3",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-minify-params": {
+ "version": "7.0.9",
+ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.9.tgz",
+ "integrity": "sha512-R8itbB8BhlpoYyBm1ou0dD+vJnQ3F6adQipR4UnkCHUwlo+S9WXJaDRg1RHjC8YVAtIdrQzSWvJl40HnGDTKjA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "browserslist": "^4.28.2",
+ "cssnano-utils": "^5.0.3",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-minify-selectors": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.1.2.tgz",
+ "integrity": "sha512-aQtrEWKwqafNlExcKHQvPGsXR2+vlUqqJtf5XsCQcgsSb5PL4wlujWBYDJuWsP4UnQX1YHDHU8qRlD+1PzTQ+Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "browserslist": "^4.28.1",
+ "caniuse-api": "^3.0.0",
+ "cssesc": "^3.0.0",
+ "postcss-selector-parser": "^7.1.1"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-normalize-charset": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.3.tgz",
+ "integrity": "sha512-NoBfZu8PR4c2NlmjvrqQTzCzLY79hwcSRgNQ3ZiNK0ABzf9kYKloE/jNj+/8GQY1wsm8pRRgANk6ydLH8cwo0Q==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-normalize-display-values": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.3.tgz",
+ "integrity": "sha512-ldsCX0QIt05pKIOobZtVQ48wXJecr+czw4+e1/YjVhLMqslShgpVxgPtI2CefURR8oyVoYaU/l829MMwExDMLw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-normalize-positions": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.4.tgz",
+ "integrity": "sha512-VEvlpeGd3Ju1Hqa/oN4jaP3+ms4laYwkEL9N9u+B6k54PZjXbW1n6wI+aVprf1BQXlCYpS5+1pl/7/vHiKgARg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-normalize-repeat-style": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.4.tgz",
+ "integrity": "sha512-6mPKlY/8cSaDHxX502wERADarJsccwlky6yIrOapHH2ZgfoKAV94SbiTKfKEs4EEpdazuc3J72WsqeYk7hp9+Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-normalize-string": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.3.tgz",
+ "integrity": "sha512-HnEQPUchi1eznmDKEYrKUTqrprEq97SrpUYClgUkv7V2zRODD9DFoUsYU+m9ZOetmD5ku7fEMZB/lwy8IT6xVQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-normalize-timing-functions": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.3.tgz",
+ "integrity": "sha512-zmEzHdvpZBZu0OKlbJSfgASQvaayyAoVuWtvyr34IJ/LyS+DaOKvvR3EvFJ9RWWtNIx+CMvO125OVophaxNYew==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-normalize-unicode": {
+ "version": "7.0.9",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.9.tgz",
+ "integrity": "sha512-DRAdWfeh/TjmhLJsw91vdiWCnUod9iwvM7xyS02/nF/sLsCR3A8l3pztrSUrWG8DSBqfX7yEk9FM0USaVJ2mSg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "browserslist": "^4.28.2",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-normalize-url": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.3.tgz",
+ "integrity": "sha512-CL93wmloq5qsffmFv+bw24MIRbmhHrp53qoh1LDAb/5TtjWEXI/np4xcP/Gw9oWCb2XyWnqHYLDUwiKRoJBA1Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-normalize-whitespace": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.3.tgz",
+ "integrity": "sha512-FdHjjn+Ht5Z2ZRjNOmeCbNq6lq09sUYKpmlF/Aq0XjVNSLTL6fmHlA/3swN2wP2caY9GV/tjSDcIIyS7aN7W0A==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-ordered-values": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.4.tgz",
+ "integrity": "sha512-nubSi49hDHQk4E8KIj+IbLY8Bg+8OcSUEhgyolgM+atnOvXjV7EjaR6bac4YGZoFyPa9mWoAF3EaYbWdFkKqVg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "cssnano-utils": "^5.0.3",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-reduce-initial": {
+ "version": "7.0.9",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.9.tgz",
+ "integrity": "sha512-ztTNPdIxXTxtBcG03E9u8v44M4ElXbMIRT7pf2onlquGula0Y83nKKxqM22FA/hMgkfCjN7ohevkVlaNwI8iOQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "browserslist": "^4.28.2",
+ "caniuse-api": "^3.0.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-reduce-transforms": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.3.tgz",
+ "integrity": "sha512-FXsnN9ZwcZTT8Yf8cAHA8qIGUXcX6WfLd9JoYhrdDfmvsVhhfqkkv7m4AC3rwFOfz+GzkUa87OCKF9dUcicd+g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "7.1.5",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz",
+ "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-svgo": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.1.3.tgz",
+ "integrity": "sha512-2QfoFOYMcj8lwcVEf9WeTlkVIAm7u2QvOEhMzkQU3KUhhGX/l8hVV9EtjMv4iq3E9iI3OeeMN0YoMLbGusuigw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0",
+ "svgo": "^4.0.1"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >= 18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-unique-selectors": {
+ "version": "7.0.7",
+ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.7.tgz",
+ "integrity": "sha512-d+sCkaRnSefghOUdH8CMJZV9yUQhj2ojpe8Nw/lA+LV1UOfeleGkLTl6XdCFFSai9UJ+DJPb69FFuqthXYsY8w==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "postcss-selector-parser": "^7.1.1"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/powershell-utils": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.2.1.tgz",
+ "integrity": "sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pretty-bytes": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
+ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/promise": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
+ "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "asap": "~2.0.3"
+ }
+ },
+ "node_modules/proper-lockfile": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz",
+ "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "retry": "^0.12.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
+ "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pug": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.4.tgz",
+ "integrity": "sha512-kFfq5mMzrS7+wrl5pLJzZEzemx34OQ0w4SARfhy/3yxTlhbstsudDwJzhf1hP02yHzbjoVMSXUj/Sz6RNfMyXg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pug-code-gen": "^3.0.4",
+ "pug-filters": "^4.0.0",
+ "pug-lexer": "^5.0.1",
+ "pug-linker": "^4.0.0",
+ "pug-load": "^3.0.0",
+ "pug-parser": "^6.0.0",
+ "pug-runtime": "^3.0.1",
+ "pug-strip-comments": "^2.0.0"
+ }
+ },
+ "node_modules/pug-attrs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz",
+ "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "constantinople": "^4.0.1",
+ "js-stringify": "^1.0.2",
+ "pug-runtime": "^3.0.0"
+ }
+ },
+ "node_modules/pug-code-gen": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.4.tgz",
+ "integrity": "sha512-6okWYIKdasTyXICyEtvobmTZAVX57JkzgzIi4iRJlin8kmhG+Xry2dsus+Mun/nGCn6F2U49haHI5mkELXB14g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "constantinople": "^4.0.1",
+ "doctypes": "^1.1.0",
+ "js-stringify": "^1.0.2",
+ "pug-attrs": "^3.0.0",
+ "pug-error": "^2.1.0",
+ "pug-runtime": "^3.0.1",
+ "void-elements": "^3.1.0",
+ "with": "^7.0.0"
+ }
+ },
+ "node_modules/pug-error": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.1.0.tgz",
+ "integrity": "sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pug-filters": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz",
+ "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "constantinople": "^4.0.1",
+ "jstransformer": "1.0.0",
+ "pug-error": "^2.0.0",
+ "pug-walk": "^2.0.0",
+ "resolve": "^1.15.1"
+ }
+ },
+ "node_modules/pug-lexer": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz",
+ "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "character-parser": "^2.2.0",
+ "is-expression": "^4.0.0",
+ "pug-error": "^2.0.0"
+ }
+ },
+ "node_modules/pug-linker": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz",
+ "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pug-error": "^2.0.0",
+ "pug-walk": "^2.0.0"
+ }
+ },
+ "node_modules/pug-load": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz",
+ "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "object-assign": "^4.1.1",
+ "pug-walk": "^2.0.0"
+ }
+ },
+ "node_modules/pug-parser": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz",
+ "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pug-error": "^2.0.0",
+ "token-stream": "1.0.0"
+ }
+ },
+ "node_modules/pug-runtime": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz",
+ "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pug-strip-comments": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz",
+ "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pug-error": "^2.0.0"
+ }
+ },
+ "node_modules/pug-walk": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz",
+ "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pump": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz",
+ "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "node_modules/punycode.js": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
+ "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.14.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz",
+ "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/quansync": {
+ "version": "0.2.11",
+ "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz",
+ "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/antfu"
+ },
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ ],
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/radix3": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz",
+ "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/range-parser": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz",
+ "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/rc9": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/rc9/-/rc9-3.0.1.tgz",
+ "integrity": "sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "defu": "^6.1.6",
+ "destr": "^2.0.5"
+ }
+ },
+ "node_modules/react": {
+ "version": "19.2.8",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz",
+ "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.2.8",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz",
+ "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "scheduler": "^0.27.0"
+ },
+ "peerDependencies": {
+ "react": "^19.2.8"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz",
+ "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "abort-controller": "^3.0.0",
+ "buffer": "^6.0.3",
+ "events": "^3.3.0",
+ "process": "^0.11.10",
+ "string_decoder": "^1.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/readable-stream/node_modules/buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
+ }
+ },
+ "node_modules/readdir-glob": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz",
+ "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "minimatch": "^5.1.0"
+ }
+ },
+ "node_modules/readdir-glob/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/readdir-glob/node_modules/brace-expansion": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz",
+ "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/readdir-glob/node_modules/minimatch": {
+ "version": "5.1.9",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz",
+ "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==",
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz",
+ "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20.19.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/recast": {
+ "version": "0.23.21",
+ "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.21.tgz",
+ "integrity": "sha512-mFAyJq9vUbSTARLZUvAEf1z3YxlvAwswbmxMx2mPA/MSm4KmpwvwvhsH/NIrZhyOuwD60Lzyw2qh83uCbgTPYw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ast-types": "^0.16.1",
+ "esprima": "~4.0.0",
+ "source-map": "~0.6.1",
+ "tiny-invariant": "^1.3.3",
+ "tslib": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/recast/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/redis-errors": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz",
+ "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/redis-parser": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz",
+ "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "redis-errors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/request-progress": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
+ "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "throttleit": "^1.0.0"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.12",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz",
+ "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "is-core-module": "^2.16.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rfdc": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
+ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/rolldown": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.6.tgz",
+ "integrity": "sha512-vMM4q3aixf46GiF1Kok8jDPFsEpXgFWGjUHXNkNHNm+Y2adXAG2dbX91jkti3i0ZRsOlcmbuzAz1poObSHCmUA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@oxc-project/types": "=0.147.0",
+ "@rolldown/pluginutils": "^1.0.0"
+ },
+ "bin": {
+ "rolldown": "bin/cli.mjs"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "optionalDependencies": {
+ "@rolldown/binding-android-arm-eabi": "1.2.6",
+ "@rolldown/binding-android-arm64": "1.2.6",
+ "@rolldown/binding-darwin-arm64": "1.2.6",
+ "@rolldown/binding-darwin-x64": "1.2.6",
+ "@rolldown/binding-freebsd-x64": "1.2.6",
+ "@rolldown/binding-linux-arm-gnueabihf": "1.2.6",
+ "@rolldown/binding-linux-arm64-gnu": "1.2.6",
+ "@rolldown/binding-linux-arm64-musl": "1.2.6",
+ "@rolldown/binding-linux-ppc64-gnu": "1.2.6",
+ "@rolldown/binding-linux-s390x-gnu": "1.2.6",
+ "@rolldown/binding-linux-x64-gnu": "1.2.6",
+ "@rolldown/binding-linux-x64-musl": "1.2.6",
+ "@rolldown/binding-openharmony-arm64": "1.2.6",
+ "@rolldown/binding-win32-arm64-msvc": "1.2.6",
+ "@rolldown/binding-win32-x64-msvc": "1.2.6"
+ }
+ },
+ "node_modules/rolldown/node_modules/@oxc-project/types": {
+ "version": "0.147.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.147.0.tgz",
+ "integrity": "sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==",
+ "license": "MIT",
+ "peer": true,
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.1.tgz",
+ "integrity": "sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.9"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@napi-rs/lzma-linux-x64-gnu": "1.5.1",
+ "@rollup/rollup-android-arm-eabi": "4.63.1",
+ "@rollup/rollup-android-arm64": "4.63.1",
+ "@rollup/rollup-darwin-arm64": "4.63.1",
+ "@rollup/rollup-darwin-x64": "4.63.1",
+ "@rollup/rollup-freebsd-arm64": "4.63.1",
+ "@rollup/rollup-freebsd-x64": "4.63.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.63.1",
+ "@rollup/rollup-linux-arm-musleabihf": "4.63.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.63.1",
+ "@rollup/rollup-linux-arm64-musl": "4.63.1",
+ "@rollup/rollup-linux-loong64-gnu": "4.63.1",
+ "@rollup/rollup-linux-loong64-musl": "4.63.1",
+ "@rollup/rollup-linux-ppc64-gnu": "4.63.1",
+ "@rollup/rollup-linux-ppc64-musl": "4.63.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.63.1",
+ "@rollup/rollup-linux-riscv64-musl": "4.63.1",
+ "@rollup/rollup-linux-s390x-gnu": "4.63.1",
+ "@rollup/rollup-linux-x64-gnu": "4.63.1",
+ "@rollup/rollup-linux-x64-musl": "4.63.1",
+ "@rollup/rollup-openbsd-x64": "4.63.1",
+ "@rollup/rollup-openharmony-arm64": "4.63.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.63.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.63.1",
+ "@rollup/rollup-win32-x64-gnu": "4.63.1",
+ "@rollup/rollup-win32-x64-msvc": "4.63.1",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/rollup-plugin-visualizer": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-7.1.1.tgz",
+ "integrity": "sha512-ThaGiHTU8XW02OkK80TrTHATraJmM9OAduU4otal+7gyXLpYEtmGBLfx5kW+EHvvLwn03YGW2NnwKUIqsYlJAA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "open": "^11.0.0",
+ "picomatch": "^4.0.5",
+ "source-map": "^0.8.0",
+ "yargs": "^18.1.0"
+ },
+ "bin": {
+ "rollup-plugin-visualizer": "dist/bin/cli.js"
+ },
+ "engines": {
+ "node": ">=22"
+ },
+ "peerDependencies": {
+ "rolldown": "1.x || ^1.0.0-beta || ^1.0.0-rc",
+ "rollup": "2.x || 3.x || 4.x"
+ },
+ "peerDependenciesMeta": {
+ "rolldown": {
+ "optional": true
+ },
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/rollup-plugin-visualizer/node_modules/source-map": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0.tgz",
+ "integrity": "sha512-d8EqvL+k/SOXCreS/SUzg2ciyHqBBLcN/yuRjFsbvVhHTE2pgei7oAhmPM7kWFbkX6OSMQfUq4KbkF3au9lhYQ==",
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/rou3": {
+ "version": "0.9.2",
+ "resolved": "https://registry.npmjs.org/rou3/-/rou3-0.9.2.tgz",
+ "integrity": "sha512-3SOzvaAg8rkHrXtRjpCvCvbyO5to9oOO27Z/XqHEYXfMRVSw/qMIVdmaOk9W2lcRLtR6dlqTjo9hDeJk70QBYQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/run-applescript": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz",
+ "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/rxjs": {
+ "version": "7.8.2",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
+ "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/sass": {
+ "version": "1.103.1",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.103.1.tgz",
+ "integrity": "sha512-9icZURbP51S6S0QGoyaeqk9uB06GNWxsFYWfH5RgpFgqK5FA8tJcM3AdVxrZEVJ7dz+L87nG95gBKf4VuaMHGw==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "chokidar": "^5.0.0",
+ "immutable": "^5.1.5",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher": "^2.4.1"
+ }
+ },
+ "node_modules/sax": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz",
+ "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==",
+ "license": "BlueOak-1.0.0",
+ "peer": true,
+ "engines": {
+ "node": ">=11.0.0"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
+ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/scule": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz",
+ "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/send": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz",
+ "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "debug": "^4.4.3",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.1",
+ "mime-types": "^3.0.2",
+ "ms": "^2.1.3",
+ "on-finished": "^2.4.1",
+ "range-parser": "^1.2.1",
+ "statuses": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/send/node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/send/node_modules/mime-types": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.1.1.tgz",
+ "integrity": "sha512-k3CMsaIvvdSwm8oLB4MXSl0wH2/cwlH7xGcnRd2DaeRmBkbzYmyT8j0tsX60DwD1eRwHTpNpH8ljKu9oUT1MeQ==",
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/seroval": {
+ "version": "1.6.4",
+ "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.6.4.tgz",
+ "integrity": "sha512-LErWMNS2RRFdu2RMA5u/PA59/IWs0XsikyEXGQ2/36iEWFrdG0ABmg17E17cikrv76891kOAMq3TkTFXpwAHXw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/serve-placeholder": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/serve-placeholder/-/serve-placeholder-2.0.2.tgz",
+ "integrity": "sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "defu": "^6.1.4"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz",
+ "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "parseurl": "^1.3.3",
+ "send": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "license": "ISC",
+ "peer": true
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shell-quote": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.10.0.tgz",
+ "integrity": "sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz",
+ "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.4",
+ "side-channel-list": "^1.0.1",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz",
+ "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "license": "ISC"
+ },
+ "node_modules/simple-git": {
+ "version": "3.36.0",
+ "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.36.0.tgz",
+ "integrity": "sha512-cGQjLjK8bxJw4QuYT7gxHw3/IouVESbhahSsHrX97MzCL1gu2u7oy38W6L2ZIGECEfIBG4BabsWDPjBxJENv9Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@kwsites/file-exists": "^1.1.1",
+ "@kwsites/promise-deferred": "^1.1.1",
+ "@simple-git/args-pathspec": "^1.0.3",
+ "@simple-git/argv-parser": "^1.1.0",
+ "debug": "^4.4.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/steveukx/git-js?sponsor=1"
+ }
+ },
+ "node_modules/sirv": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz",
+ "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@polka/url": "^1.0.0-next.24",
+ "mrmime": "^2.0.0",
+ "totalist": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/slash": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz",
+ "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/slice-ansi": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
+ "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/smob": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/smob/-/smob-1.6.2.tgz",
+ "integrity": "sha512-RQsvleCbF8cVHEv+xuDGaA4pOizFqJ0GgjtMSRo6oP8pnN7WsigHgVGey6aILRBKv4W2YOMHLqbKdnB6hpB9fw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.7.6",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz",
+ "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==",
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/source-map-support/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/srvx": {
+ "version": "0.11.22",
+ "resolved": "https://registry.npmjs.org/srvx/-/srvx-0.11.22.tgz",
+ "integrity": "sha512-LqZxxBDMKuMAZzFzJnDCkFOrs9MZQZr0LvHiO/SuSZVdQaXD7xQ5UWTUxheJrQPve1qk9MG2B/yttUvJxw8egQ==",
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "srvx": "bin/srvx.mjs"
+ },
+ "engines": {
+ "node": ">=20.16.0"
+ }
+ },
+ "node_modules/sshpk": {
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
+ "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ },
+ "bin": {
+ "sshpk-conv": "bin/sshpk-conv",
+ "sshpk-sign": "bin/sshpk-sign",
+ "sshpk-verify": "bin/sshpk-verify"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/standard-as-callback": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz",
+ "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/std-env": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz",
+ "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/storybook": {
+ "version": "8.6.18",
+ "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.6.18.tgz",
+ "integrity": "sha512-p8seiSI6FiVY6P3V0pG+5v7c8pDMehMAFRWEhG5XqIBSQszzOjDnW2rNvm3odoLKfo3V3P6Cs6Hv9ILzymULyQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/core": "8.6.18"
+ },
+ "bin": {
+ "getstorybook": "bin/index.cjs",
+ "sb": "bin/index.cjs",
+ "storybook": "bin/index.cjs"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "prettier": "^2 || ^3"
+ },
+ "peerDependenciesMeta": {
+ "prettier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/streamx": {
+ "version": "2.28.1",
+ "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.28.1.tgz",
+ "integrity": "sha512-zEzXb0s5Cds7tqMH6rhZ05lcJydCWiQPEwiNngVqzsxCc962vLY4Uw+mW7od8kDH258k2Uz/JrOkdIAAhSh9VA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "events-universal": "^1.0.0",
+ "fast-fifo": "^1.3.2",
+ "text-decoder": "^1.1.0"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/strip-literal": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-4.0.0.tgz",
+ "integrity": "sha512-PaqAvfUZKBwc/SLmNZtHmzK+v19Z4O4eS3cKPeGvbIv/U3pnyEq4Tuw3/4v/FwfM8VQaEawsyCcOQ0P+kpwWWw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "js-tokens": "^10.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/strip-literal/node_modules/js-tokens": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz",
+ "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/structured-clone-es": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/structured-clone-es/-/structured-clone-es-2.0.1.tgz",
+ "integrity": "sha512-10ZL5r77LhknxlP1FBiCW+VdnuWOEFLdSS2SKtjyEV+L4qP1hUEIMIZW94LC3jKxRmT/Dj7KkD1mqh/IY6lhKQ==",
+ "license": "ISC",
+ "peer": true
+ },
+ "node_modules/stylehacks": {
+ "version": "7.0.11",
+ "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.11.tgz",
+ "integrity": "sha512-iODNfhXVLqc5LADs+Y6Oh5wJuK5ZcHbVng8aiK3y9pjMQdc5hLrBW0eFU6FtnpNrE6PoEg/MmFTU4waotj5WNg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "browserslist": "^4.28.2",
+ "postcss-selector-parser": "^7.1.1"
+ },
+ "engines": {
+ "node": "^18.12.0 || ^20.9.0 || >=22.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.5.13"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/svgo": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.1.0.tgz",
+ "integrity": "sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "commander": "^11.1.0",
+ "css-select": "^6.0.0",
+ "css-tree": "^3.0.1",
+ "css-what": "^7.0.0",
+ "csso": "^5.0.5",
+ "picocolors": "^1.1.1",
+ "sax": "1.6.1"
+ },
+ "bin": {
+ "svgo": "bin/svgo.js"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/svgo"
+ }
+ },
+ "node_modules/svgo/node_modules/commander": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
+ "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/svgo/node_modules/css-select": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz",
+ "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==",
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^7.0.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.2.2",
+ "nth-check": "^2.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/svgo/node_modules/css-what": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz",
+ "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==",
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/svgo/node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/svgo/node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/svgo/node_modules/domutils": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/svgo/node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/tagged-tag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz",
+ "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/tapable": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
+ "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/tar": {
+ "version": "7.5.22",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz",
+ "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==",
+ "license": "BlueOak-1.0.0",
+ "peer": true,
+ "dependencies": {
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.1.0",
+ "yallist": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tar-stream": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.1.tgz",
+ "integrity": "sha512-nqsEO8zLZJvrOMdEwkA0QdCLFbetHMn95Zqu4fKwX+hkaTWJPZZOrxx/PwtxoK0MMGQmBQNRW3CPs8IFYQz4cQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "b4a": "^1.6.4",
+ "bare-fs": "^4.5.5",
+ "fast-fifo": "^1.2.0",
+ "streamx": "^2.15.0"
+ }
+ },
+ "node_modules/tar/node_modules/yallist": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
+ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
+ "license": "BlueOak-1.0.0",
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/teex": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz",
+ "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "streamx": "^2.12.5"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.51.2",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.51.2.tgz",
+ "integrity": "sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q==",
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.15.0",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/text-decoder": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz",
+ "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "b4a": "^1.6.4"
+ }
+ },
+ "node_modules/throttleit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz",
+ "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tiny-invariant": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
+ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
+ "license": "MIT"
+ },
+ "node_modules/tinyclip": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/tinyclip/-/tinyclip-0.1.15.tgz",
+ "integrity": "sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "^16.14.0 || >= 17.3.0"
+ }
+ },
+ "node_modules/tinyexec": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz",
+ "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
+ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tldts": {
+ "version": "6.1.86",
+ "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz",
+ "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tldts-core": "^6.1.86"
+ },
+ "bin": {
+ "tldts": "bin/cli.js"
+ }
+ },
+ "node_modules/tldts-core": {
+ "version": "6.1.86",
+ "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz",
+ "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tmp": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz",
+ "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/token-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz",
+ "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/totalist": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz",
+ "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tough-cookie": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz",
+ "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "tldts": "^6.1.32"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/tree-kill": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "tree-kill": "cli.js"
+ }
+ },
+ "node_modules/ts-dedent": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.3.0.tgz",
+ "integrity": "sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.10"
+ }
+ },
+ "node_modules/ts-map": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/ts-map/-/ts-map-1.0.3.tgz",
+ "integrity": "sha512-vDWbsl26LIcPGmDpoVzjEP6+hvHZkBkLW7JpvwbCv/5IYPJlsbzCVXY3wsCeAxAUeTclNOUZxnLdGh3VBD/J6w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
+ "dev": true,
+ "license": "Unlicense"
+ },
+ "node_modules/type-fest": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+ "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/uc.micro": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
+ "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ufo": {
+ "version": "1.6.4",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz",
+ "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/ultrahtml": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.7.0.tgz",
+ "integrity": "sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/uncrypto": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz",
+ "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/unctx": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/unctx/-/unctx-2.5.0.tgz",
+ "integrity": "sha512-p+Rz9x0R7X+CYDkT+Xg8/GhpcShTlU8n+cf9OtOEf7zEQsNcCZO1dPKNRDqvUTaq+P32PMMkxWHwfrxkqfqAYg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "acorn": "^8.15.0",
+ "estree-walker": "^3.0.3",
+ "magic-string": "^0.30.21",
+ "unplugin": "^2.3.11"
+ }
+ },
+ "node_modules/unctx/node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/unctx/node_modules/unplugin": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz",
+ "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/remapping": "^2.3.5",
+ "acorn": "^8.15.0",
+ "picomatch": "^4.0.3",
+ "webpack-virtual-modules": "^0.6.2"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz",
+ "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/unenv": {
+ "version": "2.0.0-rc.24",
+ "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz",
+ "integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "pathe": "^2.0.3"
+ }
+ },
+ "node_modules/unhead": {
+ "version": "2.1.17",
+ "resolved": "https://registry.npmjs.org/unhead/-/unhead-2.1.17.tgz",
+ "integrity": "sha512-HLMKXOszRhAPBrr6VlqCeVeJq2kbC4kXwzGLEZvvojPLWNYTJw22xG7Bfwhsvs31+IBet3Wl8ADg9dwYdyphfQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "hookable": "^6.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/harlan-zw"
+ }
+ },
+ "node_modules/unhead/node_modules/hookable": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.1.tgz",
+ "integrity": "sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/unicorn-magic": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz",
+ "integrity": "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/unimport": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/unimport/-/unimport-6.4.0.tgz",
+ "integrity": "sha512-JJOOuNMFq8b4ZPBKwQUxEcba4MplskDzYI1Lvrf8rJfWphZTWvPNXWa493qsPngHUmub89w6C7j+SeLWTE/UIQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "acorn": "^8.18.0",
+ "escape-string-regexp": "^5.0.0",
+ "estree-walker": "^3.0.3",
+ "local-pkg": "^1.2.1",
+ "magic-string": "^1.1.0",
+ "mlly": "^1.8.2",
+ "pathe": "^2.0.3",
+ "picomatch": "^4.0.5",
+ "pkg-types": "^2.3.1",
+ "scule": "^1.3.0",
+ "strip-literal": "^4.0.0",
+ "tinyglobby": "^0.2.17",
+ "unplugin": "^3.3.0",
+ "unplugin-utils": "^0.3.2"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ },
+ "peerDependencies": {
+ "oxc-parser": "*",
+ "rolldown": "^1.0.0"
+ },
+ "peerDependenciesMeta": {
+ "oxc-parser": {
+ "optional": true
+ },
+ "rolldown": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/unimport/node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/unimport/node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/unimport/node_modules/magic-string": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.2.3.tgz",
+ "integrity": "sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/unimport/node_modules/unplugin": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.3.0.tgz",
+ "integrity": "sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/remapping": "^2.3.5",
+ "picomatch": "^4.0.4",
+ "webpack-virtual-modules": "^0.6.2"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "@farmfe/core": "*",
+ "@rspack/core": "*",
+ "bun-types-no-globals": "*",
+ "esbuild": "*",
+ "rolldown": "*",
+ "rollup": "*",
+ "unloader": "*",
+ "vite": "*",
+ "webpack": "*"
+ },
+ "peerDependenciesMeta": {
+ "@farmfe/core": {
+ "optional": true
+ },
+ "@rspack/core": {
+ "optional": true
+ },
+ "bun-types-no-globals": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "rolldown": {
+ "optional": true
+ },
+ "rollup": {
+ "optional": true
+ },
+ "unloader": {
+ "optional": true
+ },
+ "vite": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/unplugin": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.1.tgz",
+ "integrity": "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.14.0",
+ "webpack-virtual-modules": "^0.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/unplugin-utils": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.2.tgz",
+ "integrity": "sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "pathe": "^2.0.3",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
+ "node_modules/unplugin-vue-router": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/unplugin-vue-router/-/unplugin-vue-router-0.19.2.tgz",
+ "integrity": "sha512-u5dgLBarxE5cyDK/hzJGfpCTLIAyiTXGlo85COuD4Nssj6G7NxS+i9mhCWz/1p/ud1eMwdcUbTXehQe41jYZUA==",
+ "deprecated": "Merged into vuejs/router. Migrate: https://router.vuejs.org/guide/migration/v4-to-v5.html",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/generator": "^7.28.5",
+ "@vue-macros/common": "^3.1.1",
+ "@vue/language-core": "^3.2.1",
+ "ast-walker-scope": "^0.8.3",
+ "chokidar": "^5.0.0",
+ "json5": "^2.2.3",
+ "local-pkg": "^1.1.2",
+ "magic-string": "^0.30.21",
+ "mlly": "^1.8.0",
+ "muggle-string": "^0.4.1",
+ "pathe": "^2.0.3",
+ "picomatch": "^4.0.3",
+ "scule": "^1.3.0",
+ "tinyglobby": "^0.2.15",
+ "unplugin": "^2.3.11",
+ "unplugin-utils": "^0.3.1",
+ "yaml": "^2.8.2"
+ },
+ "peerDependencies": {
+ "@vue/compiler-sfc": "^3.5.17",
+ "vue-router": "^4.6.0"
+ },
+ "peerDependenciesMeta": {
+ "vue-router": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/unplugin-vue-router/node_modules/unplugin": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz",
+ "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/remapping": "^2.3.5",
+ "acorn": "^8.15.0",
+ "picomatch": "^4.0.3",
+ "webpack-virtual-modules": "^0.6.2"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ }
+ },
+ "node_modules/unstorage": {
+ "version": "1.17.5",
+ "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.5.tgz",
+ "integrity": "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "anymatch": "^3.1.3",
+ "chokidar": "^5.0.0",
+ "destr": "^2.0.5",
+ "h3": "^1.15.10",
+ "lru-cache": "^11.2.7",
+ "node-fetch-native": "^1.6.7",
+ "ofetch": "^1.5.1",
+ "ufo": "^1.6.3"
+ },
+ "peerDependencies": {
+ "@azure/app-configuration": "^1.8.0",
+ "@azure/cosmos": "^4.2.0",
+ "@azure/data-tables": "^13.3.0",
+ "@azure/identity": "^4.6.0",
+ "@azure/keyvault-secrets": "^4.9.0",
+ "@azure/storage-blob": "^12.26.0",
+ "@capacitor/preferences": "^6 || ^7 || ^8",
+ "@deno/kv": ">=0.9.0",
+ "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0",
+ "@planetscale/database": "^1.19.0",
+ "@upstash/redis": "^1.34.3",
+ "@vercel/blob": ">=0.27.1",
+ "@vercel/functions": "^2.2.12 || ^3.0.0",
+ "@vercel/kv": "^1 || ^2 || ^3",
+ "aws4fetch": "^1.0.20",
+ "db0": ">=0.2.1",
+ "idb-keyval": "^6.2.1",
+ "ioredis": "^5.4.2",
+ "uploadthing": "^7.4.4"
+ },
+ "peerDependenciesMeta": {
+ "@azure/app-configuration": {
+ "optional": true
+ },
+ "@azure/cosmos": {
+ "optional": true
+ },
+ "@azure/data-tables": {
+ "optional": true
+ },
+ "@azure/identity": {
+ "optional": true
+ },
+ "@azure/keyvault-secrets": {
+ "optional": true
+ },
+ "@azure/storage-blob": {
+ "optional": true
+ },
+ "@capacitor/preferences": {
+ "optional": true
+ },
+ "@deno/kv": {
+ "optional": true
+ },
+ "@netlify/blobs": {
+ "optional": true
+ },
+ "@planetscale/database": {
+ "optional": true
+ },
+ "@upstash/redis": {
+ "optional": true
+ },
+ "@vercel/blob": {
+ "optional": true
+ },
+ "@vercel/functions": {
+ "optional": true
+ },
+ "@vercel/kv": {
+ "optional": true
+ },
+ "aws4fetch": {
+ "optional": true
+ },
+ "db0": {
+ "optional": true
+ },
+ "idb-keyval": {
+ "optional": true
+ },
+ "ioredis": {
+ "optional": true
+ },
+ "uploadthing": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/unstorage/node_modules/lru-cache": {
+ "version": "11.5.2",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz",
+ "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==",
+ "license": "BlueOak-1.0.0",
+ "peer": true,
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/untildify": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
+ "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/untun": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/untun/-/untun-0.2.2.tgz",
+ "integrity": "sha512-+NnOJcSiEtYsVgJmXUzQbJeRAFXJC4yPJYuh6kF9B0Rm6zunXcs/3GZOTllyocSbUDIxD6Bj7e/4ATw7sph1Sw==",
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "untun": "dist/cli.mjs"
+ }
+ },
+ "node_modules/untyped": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/untyped/-/untyped-2.0.0.tgz",
+ "integrity": "sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "citty": "^0.1.6",
+ "defu": "^6.1.4",
+ "jiti": "^2.4.2",
+ "knitwork": "^1.2.0",
+ "scule": "^1.3.0"
+ },
+ "bin": {
+ "untyped": "dist/cli.mjs"
+ }
+ },
+ "node_modules/untyped/node_modules/citty": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz",
+ "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "consola": "^3.2.3"
+ }
+ },
+ "node_modules/unwasm": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/unwasm/-/unwasm-0.5.3.tgz",
+ "integrity": "sha512-keBgTSfp3r6+s9ZcSma+0chwxQdmLbB5+dAD9vjtB21UTMYuKAxHXCU1K2CbCtnP09EaWeRvACnXk0EJtUx+hw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "exsolve": "^1.0.8",
+ "knitwork": "^1.3.0",
+ "magic-string": "^0.30.21",
+ "mlly": "^1.8.0",
+ "pathe": "^2.0.3",
+ "pkg-types": "^2.3.0"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz",
+ "integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uqr": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/uqr/-/uqr-0.1.3.tgz",
+ "integrity": "sha512-0rjE8iEJe4YmT9TOhwsZtqCMRLc5DXZUI2UEYUUg63ikBkqqE5EYWaI0etFe/5KUcmcYwLih2RND1kq+hrUJXA==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/util": {
+ "version": "0.12.5",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
+ "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "is-arguments": "^1.0.4",
+ "is-generator-function": "^1.0.7",
+ "is-typed-array": "^1.1.3",
+ "which-typed-array": "^1.1.2"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/verkit": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/verkit/-/verkit-0.3.2.tgz",
+ "integrity": "sha512-zj/ob3UsvJGN0whEAKFp53REA5X66hvffVqoCtVQAakJKnKlH+/PcOfMoFwIG/o4rElqLv/ycAFlx8ZlXUorCg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=18.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
+ "node_modules/verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ }
+ },
+ "node_modules/vite": {
+ "version": "5.4.21",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz",
+ "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==",
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.21.3",
+ "postcss": "^8.4.43",
+ "rollup": "^4.20.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-dev-rpc": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/vite-dev-rpc/-/vite-dev-rpc-2.0.0.tgz",
+ "integrity": "sha512-yKwbTwdHKSD2k/aGqyWpPHepo45OQc8lH3/6IfT4ZqeKE26ooKvi4WIEKzqWav8v+9Is8u1k8q54hvOmqASazA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "birpc": "^4.0.0",
+ "vite-hot-client": "^2.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0 || ^8.0.0"
+ }
+ },
+ "node_modules/vite-hot-client": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-2.2.0.tgz",
+ "integrity": "sha512-76Zs9zrHbH7M7wqeyooGQKdX+yg0pQ0xuQ1PbFp4z5a0Lzn2e5IPFoCswnmqZ4GiwqB4Jo3WcDAMO9jARTJl8w==",
+ "license": "MIT",
+ "peer": true,
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 || ^8.0.0"
+ }
+ },
+ "node_modules/vite-node": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-5.3.0.tgz",
+ "integrity": "sha512-8f20COPYJujc3OKPX6OuyBy3ZIv2det4eRRU4GY1y2MjbeGSUmPjedxg1b72KnTagCofwvZ65ThzjxDW2AtQFQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "cac": "^6.7.14",
+ "es-module-lexer": "^2.0.0",
+ "obug": "^2.1.1",
+ "pathe": "^2.0.3",
+ "vite": "^7.3.1"
+ },
+ "bin": {
+ "vite-node": "dist/cli.mjs"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/antfu"
+ }
+ },
+ "node_modules/vite-node/node_modules/vite": {
+ "version": "7.3.6",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz",
+ "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "esbuild": "^0.27.0 || ^0.28.0",
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3",
+ "postcss": "^8.5.6",
+ "rollup": "^4.43.0",
+ "tinyglobby": "^0.2.15"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "lightningcss": "^1.21.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-plugin-checker": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.14.5.tgz",
+ "integrity": "sha512-c9lQ92eisUO+F7Fd93aelojmiOS+NQpPgQ1XR2LTQHox1/laZf4yAoQj+L3RA9Vgh10e2nFd9b8r2LLyYZsbpA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.29.0",
+ "chokidar": "^5.0.0",
+ "npm-run-path": "^6.0.0",
+ "picocolors": "^1.1.1",
+ "picomatch": "^4.0.4",
+ "proper-lockfile": "^4.1.2",
+ "tiny-invariant": "^1.3.3"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "peerDependencies": {
+ "@biomejs/biome": ">=2.4.12",
+ "eslint": ">=9.39.4",
+ "meow": "^13.2.0 || ^14.0.0",
+ "optionator": "^0.9.4",
+ "oxlint": ">=1",
+ "stylelint": ">=16.26.1",
+ "typescript": "*",
+ "vite": ">=5.4.21",
+ "vue-tsc": "~2.2.10 || ^3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@biomejs/biome": {
+ "optional": true
+ },
+ "eslint": {
+ "optional": true
+ },
+ "meow": {
+ "optional": true
+ },
+ "optionator": {
+ "optional": true
+ },
+ "oxlint": {
+ "optional": true
+ },
+ "stylelint": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ },
+ "vue-tsc": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-plugin-checker/node_modules/npm-run-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz",
+ "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "path-key": "^4.0.0",
+ "unicorn-magic": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/vite-plugin-checker/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/vite-plugin-checker/node_modules/unicorn-magic": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
+ "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/aix-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/android-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/android-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/android-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/darwin-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/darwin-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/freebsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-loong64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-mips64el": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+ "cpu": [
+ "mips64el"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-riscv64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-s390x": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/netbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/openbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/sunos-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/win32-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/win32-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/win32-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/esbuild": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.21.5",
+ "@esbuild/android-arm": "0.21.5",
+ "@esbuild/android-arm64": "0.21.5",
+ "@esbuild/android-x64": "0.21.5",
+ "@esbuild/darwin-arm64": "0.21.5",
+ "@esbuild/darwin-x64": "0.21.5",
+ "@esbuild/freebsd-arm64": "0.21.5",
+ "@esbuild/freebsd-x64": "0.21.5",
+ "@esbuild/linux-arm": "0.21.5",
+ "@esbuild/linux-arm64": "0.21.5",
+ "@esbuild/linux-ia32": "0.21.5",
+ "@esbuild/linux-loong64": "0.21.5",
+ "@esbuild/linux-mips64el": "0.21.5",
+ "@esbuild/linux-ppc64": "0.21.5",
+ "@esbuild/linux-riscv64": "0.21.5",
+ "@esbuild/linux-s390x": "0.21.5",
+ "@esbuild/linux-x64": "0.21.5",
+ "@esbuild/netbsd-x64": "0.21.5",
+ "@esbuild/openbsd-x64": "0.21.5",
+ "@esbuild/sunos-x64": "0.21.5",
+ "@esbuild/win32-arm64": "0.21.5",
+ "@esbuild/win32-ia32": "0.21.5",
+ "@esbuild/win32-x64": "0.21.5"
+ }
+ },
+ "node_modules/void-elements": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
+ "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/vscode-uri": {
+ "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.42",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.42.tgz",
+ "integrity": "sha512-4RyHQTbQvOPs3MfvUO1Sg0YRrKNnA0mAVtvpd12Tg1fKDN7OHBUl1IqSn8zGJjK9nI3NkNp8cgTpVrSZC5TTcA==",
+ "license": "MIT",
+ "dependencies": {
+ "@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": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-bundle-renderer": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/vue-bundle-renderer/-/vue-bundle-renderer-2.3.2.tgz",
+ "integrity": "sha512-BtazFw0lm3N/ZE4+tre2g8G+c5wolfizu+e5jxZAcao0gcy5KJei9Yopl1svDato2poeFldVLfmLMk57Sg8rLg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ufo": "^1.6.4"
+ }
+ },
+ "node_modules/vue-component-meta": {
+ "version": "2.2.12",
+ "resolved": "https://registry.npmjs.org/vue-component-meta/-/vue-component-meta-2.2.12.tgz",
+ "integrity": "sha512-dQU6/obNSNbennJ1xd+rhDid4g3vQro+9qUBBIg8HMZH2Zs1jTpkFNxuQ3z77bOlU+ew08Qck9sbYkdSePr0Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@volar/typescript": "2.4.15",
+ "@vue/language-core": "2.2.12",
+ "path-browserify": "^1.0.1",
+ "vue-component-type-helpers": "2.2.12"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-component-meta/node_modules/@volar/language-core": {
+ "version": "2.4.15",
+ "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.15.tgz",
+ "integrity": "sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@volar/source-map": "2.4.15"
+ }
+ },
+ "node_modules/vue-component-meta/node_modules/@volar/source-map": {
+ "version": "2.4.15",
+ "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.15.tgz",
+ "integrity": "sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/vue-component-meta/node_modules/@vue/language-core": {
+ "version": "2.2.12",
+ "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.12.tgz",
+ "integrity": "sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@volar/language-core": "2.4.15",
+ "@vue/compiler-dom": "^3.5.0",
+ "@vue/compiler-vue2": "^2.7.16",
+ "@vue/shared": "^3.5.0",
+ "alien-signals": "^1.0.3",
+ "minimatch": "^9.0.3",
+ "muggle-string": "^0.4.1",
+ "path-browserify": "^1.0.1"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-component-meta/node_modules/alien-signals": {
+ "version": "1.0.13",
+ "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz",
+ "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/vue-component-meta/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/vue-component-meta/node_modules/brace-expansion": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz",
+ "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/vue-component-meta/node_modules/minimatch": {
+ "version": "9.0.9",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
+ "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/vue-component-meta/node_modules/vue-component-type-helpers": {
+ "version": "2.2.12",
+ "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.2.12.tgz",
+ "integrity": "sha512-YbGqHZ5/eW4SnkPNR44mKVc6ZKQoRs/Rux1sxC6rdwXb4qpbOSYfDr9DsTHolOTGmIKgM9j141mZbBeg05R1pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/vue-component-type-helpers": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-3.3.11.tgz",
+ "integrity": "sha512-LwcxzeliO9fkQcpJG0PoX8X5kmAhKmH9wkpDLxNabwzkQ9Zeib2YVHwFV4pcWmMLfXVfjr/dSV+DaJ3cIPgSNA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/vue-devtools-stub": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/vue-devtools-stub/-/vue-devtools-stub-0.1.0.tgz",
+ "integrity": "sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/vue-docgen-api": {
+ "version": "4.79.2",
+ "resolved": "https://registry.npmjs.org/vue-docgen-api/-/vue-docgen-api-4.79.2.tgz",
+ "integrity": "sha512-n9ENAcs+40awPZMsas7STqjkZiVlIjxIKgiJr5rSohDP0/JCrD9VtlzNojafsA1MChm/hz2h3PDtUedx3lbgfA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.24.7",
+ "@babel/types": "^7.24.7",
+ "@vue/compiler-dom": "^3.2.0",
+ "@vue/compiler-sfc": "^3.2.0",
+ "ast-types": "^0.16.1",
+ "esm-resolve": "^1.0.8",
+ "hash-sum": "^2.0.0",
+ "lru-cache": "^8.0.3",
+ "pug": "^3.0.2",
+ "recast": "^0.23.1",
+ "ts-map": "^1.0.3",
+ "vue-inbrowser-compiler-independent-utils": "^4.69.0"
+ },
+ "peerDependencies": {
+ "vue": ">=2"
+ }
+ },
+ "node_modules/vue-docgen-api/node_modules/lru-cache": {
+ "version": "8.0.5",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz",
+ "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16.14"
+ }
+ },
+ "node_modules/vue-inbrowser-compiler-independent-utils": {
+ "version": "4.71.1",
+ "resolved": "https://registry.npmjs.org/vue-inbrowser-compiler-independent-utils/-/vue-inbrowser-compiler-independent-utils-4.71.1.tgz",
+ "integrity": "sha512-K3wt3iVmNGaFEOUR4JIThQRWfqokxLfnPslD41FDZB2ajXp789+wCqJyGYlIFsvEQ2P61PInw6/ph5iiqg51gg==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "vue": ">=2"
+ }
+ },
+ "node_modules/vue-router": {
+ "version": "4.6.4",
+ "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.4.tgz",
+ "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@vue/devtools-api": "^6.6.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "vue": "^3.5.0"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+ "license": "BSD-2-Clause",
+ "peer": true
+ },
+ "node_modules/webpack-virtual-modules": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
+ "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==",
+ "license": "MIT"
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.22",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz",
+ "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.9",
+ "call-bound": "^1.0.4",
+ "for-each": "^0.3.5",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/with": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz",
+ "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.9.6",
+ "@babel/types": "^7.9.6",
+ "assert-never": "^1.2.1",
+ "babel-walk": "3.0.0-canary-5"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ws": {
+ "version": "8.21.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz",
+ "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/wsl-utils": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-1.0.0.tgz",
+ "integrity": "sha512-Hl0ZOAs672vg+06kfujwRhoS6/jehvULrlFkuF2dRu6pHgA8U06h3xqNIqNNU1LTXPcedxByAR4GS6pwQK0mgA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "is-wsl": "^3.1.0",
+ "powershell-utils": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/wsl-utils/node_modules/powershell-utils": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz",
+ "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "license": "ISC",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "license": "ISC",
+ "peer": true
+ },
+ "node_modules/yaml": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
+ "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==",
+ "license": "ISC",
+ "peer": true,
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "18.1.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz",
+ "integrity": "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "cliui": "^9.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "string-width": "^8.2.1",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^22.0.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=23"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "22.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz",
+ "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==",
+ "license": "ISC",
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=23"
+ }
+ },
+ "node_modules/yargs/node_modules/ansi-regex": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz",
+ "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/yargs/node_modules/string-width": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz",
+ "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "get-east-asian-width": "^1.5.0",
+ "strip-ansi": "^7.1.2"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/yargs/node_modules/strip-ansi": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-regex": "^6.2.2"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-crc32": "~0.2.3",
+ "fd-slicer": "~1.1.0"
+ }
+ },
+ "node_modules/yauzl/node_modules/buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz",
+ "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/youch": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.1.tgz",
+ "integrity": "sha512-mxW3qiSnl+GRxXsaUMzv2Mbada1Y8CDltET9UxejDQe6DBYlSekghl5U5K0ReAikcHDi0G1vKZEmmo/NWAGKLA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@poppinss/colors": "^4.1.6",
+ "@poppinss/dumper": "^0.7.0",
+ "@speed-highlight/core": "^1.2.14",
+ "cookie-es": "^3.0.1",
+ "youch-core": "^0.3.3"
+ }
+ },
+ "node_modules/youch-core": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/youch-core/-/youch-core-0.3.3.tgz",
+ "integrity": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@poppinss/exception": "^1.2.2",
+ "error-stack-parser-es": "^1.0.5"
+ }
+ },
+ "node_modules/youch/node_modules/cookie-es": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-3.1.1.tgz",
+ "integrity": "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/zip-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz",
+ "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "archiver-utils": "^5.0.0",
+ "compress-commons": "^6.0.2",
+ "readable-stream": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
index 6274a00..ba6e46d 100644
--- a/package.json
+++ b/package.json
@@ -7,6 +7,8 @@
"files": [
"components",
"assets",
+ "utils",
+ "composables",
"nuxt.config.ts"
],
"scripts": {
@@ -16,21 +18,28 @@
"cypress:open": "cypress open --component"
},
"peerDependencies": {
+ "@dicebear/collection": "^9.2.4",
+ "@dicebear/core": "^9.2.4",
"@heroicons/vue": "^2.2.0",
"lucide-vue-next": "^0.525.0",
+ "markdown-it": "^14.1.1",
"nuxt": "^3.12.4",
"sass": "^1.89.0",
"vue": "^3.4.0"
},
"devDependencies": {
"@cypress/vite-dev-server": "^5.2.0",
+ "@dicebear/collection": "^9.2.4",
+ "@dicebear/core": "^9.2.4",
"@heroicons/vue": "^2.2.0",
"@storybook/addon-essentials": "^8.3.5",
"@storybook/vue3": "^8.3.5",
"@storybook/vue3-vite": "^8.3.5",
+ "@types/markdown-it": "^14.1.2",
"@vitejs/plugin-vue": "^5.1.4",
"cypress": "^13.15.0",
"lucide-vue-next": "^0.525.0",
+ "markdown-it": "^14.1.1",
"sass": "^1.89.0",
"storybook": "^8.3.5",
"vite": "^5.4.8",
diff --git a/types/budget.ts b/types/budget.ts
new file mode 100644
index 0000000..63ec88e
--- /dev/null
+++ b/types/budget.ts
@@ -0,0 +1,53 @@
+export type BudgetPeriodType = 'weekly' | 'monthly' | 'yearly' | 'custom';
+
+export type BudgetTargetType = 'category' | 'group' | 'wallet';
+
+export type BudgetStatus = 'on_track' | 'near_limit' | 'over_budget' | 'forecast_breach';
+
+export interface BudgetTarget {
+ type: BudgetTargetType;
+ id: number;
+ client_generated_id?: string | null;
+ name?: string;
+}
+
+export interface BudgetProgress {
+ period_start: string;
+ period_end: string;
+ limit: number;
+ gross_spent: number;
+ refunds: number;
+ net_spent: number;
+ rollover_in: number;
+ effective_limit: number;
+ remaining: number;
+ percent_used: number;
+ projected_spend: number;
+ status: BudgetStatus;
+ is_threshold_crossed: boolean;
+ is_forecast_breach: boolean;
+}
+
+export interface Budget {
+ id: number;
+ owner_id?: number;
+ owner_type?: string;
+ name: string;
+ slug?: string;
+ description?: string | null;
+ amount: number | string;
+ currency: string;
+ period_type: BudgetPeriodType;
+ start_date: string;
+ end_date?: string | null;
+ rollover_enabled?: boolean;
+ threshold_percent?: number;
+ forecast_alerts_enabled?: boolean;
+ is_active?: boolean;
+ targets?: BudgetTarget[];
+ progress?: BudgetProgress;
+ last_synced_at?: string | null;
+ client_generated_id?: string | null;
+ created_at?: string;
+ updated_at?: string;
+}
diff --git a/types/integration.ts b/types/integration.ts
new file mode 100644
index 0000000..ff4dfba
--- /dev/null
+++ b/types/integration.ts
@@ -0,0 +1,40 @@
+export type ExtensionSlot =
+ | 'settings.integrations'
+ | 'settings.tabs'
+ | 'onboarding.steps'
+ | 'dashboard.widgets'
+ | 'sidebar.nav';
+
+export interface IntegrationCardDescriptor {
+ title: string;
+ cta?: string;
+ description?: string;
+ href?: string;
+}
+
+export interface IntegrationUiDescriptor {
+ slots: ExtensionSlot[];
+ card?: IntegrationCardDescriptor | null;
+ onboarding?: { title?: string; description?: string; href?: string; order?: number } | null;
+ component?: string | null;
+ show_when_unconfigured?: boolean;
+}
+
+export interface Integration {
+ key: string;
+ name: string;
+ description: string | null;
+ icon: string | null;
+ configured: boolean;
+ entitled: boolean;
+ ui: IntegrationUiDescriptor | null;
+}
+
+export interface SlotContribution {
+ key: string;
+ slot: ExtensionSlot;
+ integration: Integration;
+ ui: IntegrationUiDescriptor;
+ order: number;
+ configured: boolean;
+}
diff --git a/utils/colors.ts b/utils/colors.ts
new file mode 100644
index 0000000..c1eeb5c
--- /dev/null
+++ b/utils/colors.ts
@@ -0,0 +1,128 @@
+/**
+ * Dynamic color generation utilities for consistent UI theming
+ * Migrated from webui/utils/colors.ts — Tier 0 primitive (#7)
+ * Zero domain deps; pure algorithm + constants.
+ */
+
+// Base color palette for better visual consistency
+const BASE_COLORS = [
+ '#3b82f6', // Blue
+ '#f97316', // Orange
+ '#10b981', // Green
+ '#f43f5e', // Pink
+ '#8b5cf6', // Purple
+ '#06b6d4', // Cyan
+ '#84cc16', // Lime
+ '#f59e0b', // Amber
+ '#ef4444', // Red
+ '#6366f1', // Indigo
+ '#14b8a6', // Teal
+ '#a855f7', // Violet
+ '#22d3ee', // Sky
+ '#65a30d', // Green-600
+ '#dc2626', // Red-600
+ '#7c3aed' // Violet-600
+];
+
+/**
+ * Generate a hash from a string for consistent color assignment
+ */
+function hashString(str: string): number {
+ let hash = 0;
+ if (str.length === 0) return hash;
+
+ for (let i = 0; i < str.length; i++) {
+ const char = str.charCodeAt(i);
+ hash = (hash << 5) - hash + char;
+ hash = hash & hash; // Convert to 32-bit integer
+ }
+
+ return Math.abs(hash);
+}
+
+/**
+ * Generate HSL color based on input string for infinite unique colors
+ */
+function generateHSLColor(input: string, saturation = 65, lightness = 55): string {
+ const hash = hashString(input);
+ const hue = hash % 360;
+ return `hsl(${hue}, ${saturation}%, ${lightness}%)`;
+}
+
+/**
+ * Get color for a given input with consistent assignment
+ * First tries base palette, then generates unique HSL colors
+ */
+export function getColorForItem(
+ item: string,
+ index?: number,
+ options: {
+ saturation?: number;
+ lightness?: number;
+ forceGenerated?: boolean;
+ } = {}
+): string {
+ const { saturation = 65, lightness = 55, forceGenerated = false } = options;
+
+ // If we have an index and it's within base colors range, use base palette
+ if (!forceGenerated && typeof index === 'number' && index < BASE_COLORS.length) {
+ return BASE_COLORS[index];
+ }
+
+ // Generate consistent color based on item name hash
+ return generateHSLColor(item, saturation, lightness);
+}
+
+/**
+ * Generate a set of colors for multiple items ensuring uniqueness and consistency
+ */
+export function generateColorPalette(
+ items: string[],
+ options: {
+ saturation?: number;
+ lightness?: number;
+ preferBasePalette?: boolean;
+ } = {}
+): Record {
+ const { preferBasePalette = true } = options;
+ const colorMap: Record = {};
+
+ items.forEach((item, index) => {
+ colorMap[item] = getColorForItem(item, preferBasePalette ? index : undefined, options);
+ });
+
+ return colorMap;
+}
+
+/**
+ * Get colors specifically for chart data with consistent assignment
+ */
+export function getChartColors(
+ data: T[],
+ options: {
+ saturation?: number;
+ lightness?: number;
+ } = {}
+): Array {
+ return data.map((item, index) => ({
+ ...item,
+ color: getColorForItem(item.name, index, options)
+ }));
+}
+
+/**
+ * Predefined theme colors for specific contexts
+ */
+export const THEME_COLORS = {
+ income: '#10b981', // Green
+ expense: '#ef4444', // Red
+ balance: '#3b82f6', // Blue
+ neutral: '#6b7280', // Gray
+ success: '#059669', // Green-600
+ warning: '#d97706', // Orange-600
+ danger: '#dc2626', // Red-600
+ info: '#0284c7' // Sky-600
+} as const;
+
+// Re-export internals for testing/consumers that need deterministic hashing
+export { hashString, generateHSLColor, BASE_COLORS };
diff --git a/utils/currency.ts b/utils/currency.ts
new file mode 100644
index 0000000..edf7eb9
--- /dev/null
+++ b/utils/currency.ts
@@ -0,0 +1,246 @@
+/**
+ * Centralized Currency Utility
+ * Migrated from webui/utils/currency.ts — Tier 0 primitive (#8)
+ * Provides locale-aware parsing and formatting for currency amounts
+ * Zero domain deps; Intl.NumberFormat only.
+ */
+
+/**
+ * Currency symbol mappings
+ * Maps internal currency codes to display symbols
+ */
+export const CURRENCY_SYMBOL_MAP: Record = {
+ XAF: 'FCFA',
+ USD: '$',
+ EUR: '€',
+ GBP: '£',
+ CAD: 'C$',
+ JPY: '¥',
+ CHF: 'CHF'
+ // Add more mappings as needed
+};
+
+/**
+ * Get display currency symbol from currency code
+ * @param currencyCode - The currency code (e.g., 'XAF', 'USD')
+ * @returns The display symbol (e.g., 'FCFA', '$')
+ */
+export function getCurrencySymbol(currencyCode: string): string {
+ if (!currencyCode) return '';
+ return CURRENCY_SYMBOL_MAP[currencyCode.toUpperCase()] || currencyCode;
+}
+
+/**
+ * Parse an amount string that may contain currency symbols and locale-specific formatting
+ * Handles multiple formats:
+ * - "1,234.56 USD" (English format with currency)
+ * - "1.234,56 EUR" (European format with currency)
+ * - "5000 XAF" (simple format)
+ * - "1234.56" (no currency)
+ *
+ * @param amountStr - The amount string to parse
+ * @returns Object with numeric value and extracted currency code
+ */
+export function parseAmount(amountStr: string | number): { value: number; currency: string } {
+ // Handle numeric input directly
+ if (typeof amountStr === 'number') {
+ return { value: amountStr, currency: '' };
+ }
+
+ if (!amountStr || typeof amountStr !== 'string') {
+ return { value: 0, currency: '' };
+ }
+
+ try {
+ // Extract currency (last word/token in the string, typically 3 uppercase letters)
+ const currencyMatch = amountStr.match(/\b([A-Z]{3})\b\s*$/);
+ const currency = currencyMatch ? currencyMatch[1] : '';
+
+ // Remove currency and extract only numeric characters and separators
+ const numericPart = amountStr
+ .replace(/[A-Z]{3}\s*$/i, '')
+ .replace(/[^\d.,-]/g, '')
+ .trim();
+
+ if (!numericPart) {
+ return { value: 0, currency };
+ }
+
+ let value = 0;
+
+ // Count dots and commas
+ const dotCount = (numericPart.match(/\./g) || []).length;
+ const commaCount = (numericPart.match(/,/g) || []).length;
+
+ if (dotCount === 0 && commaCount === 0) {
+ // Simple integer: "1234"
+ value = parseFloat(numericPart);
+ } else if (dotCount === 0 && commaCount === 1) {
+ // One comma: could be "1234,56" (decimal) or "1,234" (thousands)
+ const commaPos = numericPart.lastIndexOf(',');
+ const afterComma = numericPart.substring(commaPos + 1);
+
+ if (afterComma.length <= 2) {
+ // Likely decimal separator (European format): "1234,56"
+ value = parseFloat(numericPart.replace(',', '.'));
+ } else {
+ // Likely thousands separator: "1,234"
+ value = parseFloat(numericPart.replace(',', ''));
+ }
+ } else if (commaCount === 0 && dotCount === 1) {
+ // One dot: could be "1234.56" (decimal) or "1.234" (thousands)
+ const dotPos = numericPart.lastIndexOf('.');
+ const afterDot = numericPart.substring(dotPos + 1);
+
+ if (afterDot.length <= 2) {
+ // Likely decimal separator (English format): "1234.56"
+ value = parseFloat(numericPart);
+ } else {
+ // Likely thousands separator: "1.234"
+ value = parseFloat(numericPart.replace('.', ''));
+ }
+ } else {
+ // Multiple separators - determine which is the decimal separator
+ // Rule: the last separator is the decimal separator
+ const lastDot = numericPart.lastIndexOf('.');
+ const lastComma = numericPart.lastIndexOf(',');
+
+ if (lastDot > lastComma) {
+ // Dot is decimal separator: "1,234.56" or "1.234.56"
+ value = parseFloat(numericPart.replace(/,/g, ''));
+ } else {
+ // Comma is decimal separator: "1.234,56"
+ value = parseFloat(numericPart.replace(/\./g, '').replace(',', '.'));
+ }
+ }
+
+ return {
+ value: isNaN(value) ? 0 : value,
+ currency
+ };
+ } catch (error) {
+ console.error('Error parsing amount:', amountStr, error);
+ return { value: 0, currency: '' };
+ }
+}
+
+export interface FormatAmountOptions {
+ /** The locale to use for formatting (defaults to browser locale) */
+ locale?: string;
+ /** Whether to use compact notation (1.2k instead of 1,200) */
+ compact?: boolean;
+ /** Threshold for compact notation in base units (default: 1000) */
+ compactThreshold?: number;
+ /** Minimum fraction digits (default: 0) */
+ minimumFractionDigits?: number;
+ /** Maximum fraction digits (default: 2) */
+ maximumFractionDigits?: number;
+ /** Whether to show currency symbol/code (default: true) */
+ showCurrency?: boolean;
+}
+
+/**
+ * Format amount with proper locale and optional compact notation
+ *
+ * @param amount - The amount to format (string or number)
+ * @param options - Formatting options
+ * @returns Formatted amount string with currency
+ *
+ * @example
+ * formatAmount("1234.56 USD") // "1,234.56 $"
+ * formatAmount(1234.56, { compact: true }) // "1.2k"
+ * formatAmount("5000 XAF", { locale: 'fr-FR' }) // "5 000 FCFA"
+ */
+export function formatAmount(amount: string | number, options: FormatAmountOptions = {}): string {
+ const {
+ locale = typeof navigator !== 'undefined' ? navigator.language : 'en-US',
+ compact = false,
+ compactThreshold = 1000,
+ minimumFractionDigits = 0,
+ maximumFractionDigits = 2,
+ showCurrency = true
+ } = options;
+
+ // Parse the amount if it's a string
+ const { value, currency } =
+ typeof amount === 'string' ? parseAmount(amount) : { value: amount, currency: '' };
+
+ // Get display currency symbol
+ const displayCurrency = getCurrencySymbol(currency);
+
+ // Determine if we should use compact notation
+ const useCompact = compact && Math.abs(value) >= compactThreshold;
+
+ try {
+ const formatterOptions: Intl.NumberFormatOptions = {
+ minimumFractionDigits,
+ maximumFractionDigits
+ };
+
+ // Add compact notation if supported and requested
+ if (useCompact) {
+ formatterOptions.notation = 'compact';
+ formatterOptions.compactDisplay = 'short';
+ }
+
+ const formatter = new Intl.NumberFormat(locale, formatterOptions);
+ const formattedNumber = formatter.format(value);
+
+ // Return with or without currency
+ if (showCurrency && displayCurrency) {
+ return `${formattedNumber} ${displayCurrency}`;
+ }
+
+ return formattedNumber;
+ } catch (error) {
+ console.error('Error formatting amount:', amount, error);
+ // Fallback to simple formatting
+ const rounded = Math.round(value * 100) / 100;
+ return showCurrency && displayCurrency ? `${rounded} ${displayCurrency}` : String(rounded);
+ }
+}
+
+/**
+ * Format amount for compact display (mobile cards, summaries)
+ * Always uses compact notation for numbers >= 1000
+ *
+ * @param amount - The amount to format
+ * @returns Formatted amount string (e.g., "1.2k FCFA", "450 $")
+ */
+export function formatShortAmount(amount: string | number): string {
+ return formatAmount(amount, {
+ compact: true,
+ compactThreshold: 1000,
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 2
+ });
+}
+
+/**
+ * Format amount for full display (tables, detailed views)
+ * Never uses compact notation, shows all digits with locale formatting
+ *
+ * @param amount - The amount to format
+ * @returns Formatted amount string (e.g., "1,234.56 $")
+ */
+export function formatFullAmount(amount: string | number): string {
+ return formatAmount(amount, {
+ compact: false,
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2
+ });
+}
+
+/**
+ * Format amount without currency symbol (for input fields, calculations)
+ *
+ * @param amount - The amount to format
+ * @returns Formatted number without currency
+ */
+export function formatAmountNoCurrency(amount: string | number): string {
+ return formatAmount(amount, {
+ showCurrency: false,
+ minimumFractionDigits: 2,
+ maximumFractionDigits: 2
+ });
+}