diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0692513..ebdc1e6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ on: workflow_dispatch: inputs: run_tests: - description: "执行测试(lint + 类型检查)" + description: "执行测试(lint + 类型检查 + E2E)" type: boolean default: true run_build: @@ -43,3 +43,41 @@ jobs: run: npm run lint - name: Type check run: npx tsc --noEmit + + ui-e2e: + name: UI E2E tests (Playwright) + runs-on: ubuntu-latest + if: ${{ github.event_name != 'workflow_dispatch' || github.event.inputs.run_tests == 'true' }} + steps: + - uses: actions/checkout@v5 + with: + submodules: 'recursive' + token: ${{ secrets.GITHUB_TOKEN }} + - name: Set up Node + uses: actions/setup-node@v5 + with: + node-version: '22' + cache: 'npm' + cache-dependency-path: 'package-lock.json' + - name: Install dependencies + run: npm ci + - name: Install Playwright browser + run: npx playwright install --with-deps chromium + - name: Run E2E tests + env: + CI: 'true' + run: npx playwright test + - name: Upload Playwright report + if: ${{ !cancelled() }} + uses: actions/upload-artifact@v4 + with: + name: playwright-report + path: playwright-report/ + retention-days: 14 + - name: Upload Playwright traces + if: ${{ failure() }} + uses: actions/upload-artifact@v4 + with: + name: playwright-traces + path: test-results/ + retention-days: 7 diff --git a/.gitignore b/.gitignore index f776ba6..3ae5347 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,11 @@ dist-ssr target tsconfig.app.tsbuildinfo tsconfig.node.tsbuildinfo + +# Playwright +/playwright-report/ +/playwright/.cache/ +/test-results/ .history target tsconfig.app.tsbuildinfo diff --git a/DESIGN.md b/DESIGN.md new file mode 100644 index 0000000..8a6764e --- /dev/null +++ b/DESIGN.md @@ -0,0 +1,620 @@ +--- +version: alpha +name: Notion Analysis +description: An analysis of Notion's design language — a warm, paper-calm productivity system built on an off-white canvas, near-black Inter type, and a single confident blue, punctuated by a playful multi-color sticker palette that does all the personality work while the chrome stays quiet. + +colors: + primary: "#0075de" + primary-active: "#005bab" + secondary: "#213183" + on-primary: "#ffffff" + canvas: "#ffffff" + canvas-soft: "#f6f5f4" + surface: "#ffffff" + ink: "#000000" + ink-secondary: "#31302e" + ink-muted: "#615d59" + ink-faint: "#a39e98" + hairline: "#e6e6e6" + accent-sky: "#62aef0" + accent-purple: "#d6b6f6" + accent-purple-deep: "#391c57" + accent-pink: "#ff64c8" + accent-orange: "#dd5b00" + accent-orange-deep: "#793400" + accent-teal: "#2a9d99" + accent-green: "#1aae39" + accent-brown: "#523410" + +typography: + display-1: + fontFamily: NotionInter + fontSize: 64px + fontWeight: 700 + lineHeight: 1.0 + letterSpacing: -2.125px + display-2: + fontFamily: NotionInter + fontSize: 54px + fontWeight: 700 + lineHeight: 1.04 + letterSpacing: -1.875px + heading-1: + fontFamily: NotionInter + fontSize: 40px + fontWeight: 700 + lineHeight: 1.1 + letterSpacing: -1px + heading-2: + fontFamily: NotionInter + fontSize: 26px + fontWeight: 700 + lineHeight: 1.23 + letterSpacing: -0.625px + heading-3: + fontFamily: NotionInter + fontSize: 22px + fontWeight: 700 + lineHeight: 1.27 + letterSpacing: -0.25px + title: + fontFamily: NotionInter + fontSize: 20px + fontWeight: 600 + lineHeight: 1.4 + letterSpacing: -0.125px + body-md: + fontFamily: NotionInter + fontSize: 16px + fontWeight: 400 + lineHeight: 1.5 + letterSpacing: 0 + body-sm: + fontFamily: NotionInter + fontSize: 15px + fontWeight: 400 + lineHeight: 1.33 + letterSpacing: 0 + button: + fontFamily: NotionInter + fontSize: 16px + fontWeight: 500 + lineHeight: 1.5 + letterSpacing: 0 + caption: + fontFamily: NotionInter + fontSize: 14px + fontWeight: 400 + lineHeight: 1.43 + letterSpacing: 0 + eyebrow: + fontFamily: NotionInter + fontSize: 12px + fontWeight: 600 + lineHeight: 1.33 + letterSpacing: 0.125px + +rounded: + xs: 4px + sm: 5px + md: 8px + lg: 12px + xl: 16px + full: 9999px + +spacing: + xxs: 4px + xs: 8px + sm: 12px + md: 16px + lg: 24px + xl: 28px + xxl: 32px + +components: + nav-bar: + backgroundColor: "{colors.canvas}" + textColor: "{colors.ink}" + typography: "{typography.body-sm}" + padding: 16px + button-primary: + backgroundColor: "{colors.primary}" + textColor: "{colors.on-primary}" + typography: "{typography.button}" + rounded: "{rounded.full}" + button-primary-pressed: + backgroundColor: "{colors.primary-active}" + textColor: "{colors.on-primary}" + button-secondary: + backgroundColor: "{colors.surface}" + textColor: "{colors.ink}" + typography: "{typography.button}" + rounded: "{rounded.full}" + button-utility: + backgroundColor: "{colors.surface}" + textColor: "{colors.ink}" + typography: "{typography.button}" + rounded: "{rounded.md}" + padding: 4px 14px + button-icon-circular: + backgroundColor: "rgba(0, 0, 0, 0.05)" + textColor: "{colors.on-primary}" + rounded: "{rounded.full}" + badge-pill: + backgroundColor: "{colors.surface}" + textColor: "{colors.primary}" + typography: "{typography.eyebrow}" + rounded: "{rounded.full}" + padding: 4px 8px + feature-card: + backgroundColor: "{colors.surface}" + textColor: "{colors.ink}" + typography: "{typography.body-md}" + rounded: "{rounded.lg}" + padding: 24px + feature-card-elevated: + backgroundColor: "{colors.surface}" + textColor: "{colors.ink}" + rounded: "{rounded.lg}" + padding: 24px + pricing-plan-card: + backgroundColor: "{colors.surface}" + textColor: "{colors.ink}" + typography: "{typography.body-sm}" + rounded: "{rounded.md}" + padding: 24px + pricing-plan-card-featured: + backgroundColor: "{colors.canvas-soft}" + textColor: "{colors.ink}" + rounded: "{rounded.md}" + padding: 24px + text-input: + backgroundColor: "{colors.surface}" + textColor: "{colors.ink}" + typography: "{typography.body-sm}" + rounded: "{rounded.xs}" + padding: 6px + hero-band: + backgroundColor: "{colors.secondary}" + textColor: "{colors.on-primary}" + typography: "{typography.display-1}" + padding: 32px + footer: + backgroundColor: "{colors.canvas-soft}" + textColor: "{colors.ink-secondary}" + typography: "{typography.caption}" + padding: 32px + + # ─── Examples (illustrative) — auto-derived; resolve any TO_FILL markers below ─── + ex-pricing-tier: + description: "Default Pricing tier card. Re-uses feature-card chrome with brand canvas-soft surface." + backgroundColor: "{colors.canvas-soft}" + textColor: "{colors.ink}" + borderColor: "{colors.hairline}" + rounded: "{rounded.xl}" + padding: "{spacing.lg}" + ex-pricing-tier-featured: + description: "Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light mode, light fill + dark text in dark mode)." + backgroundColor: "{colors.ink}" + textColor: "{colors.on-primary}" + rounded: "{rounded.xl}" + padding: "{spacing.lg}" + ex-product-selector: + description: "What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product gallery)." + backgroundColor: "{colors.surface}" + rounded: "{rounded.xl}" + padding: "{spacing.lg}" + ex-cart-drawer: + description: "Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart)." + backgroundColor: "{colors.surface}" + rounded: "{rounded.xl}" + padding: "{spacing.lg}" + item-divider: "{colors.hairline}" + ex-app-shell-row: + description: "Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator." + backgroundColor: "{colors.canvas}" + activeIndicator: "{colors.primary}" + rounded: "{rounded.sm}" + padding: "{spacing.sm} {spacing.md}" + ex-data-table-cell: + description: "Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses body-sm." + headerBackground: "{colors.canvas-soft}" + headerTypography: "{typography.eyebrow}" + bodyTypography: "{typography.body-sm}" + cellPadding: "{spacing.sm} {spacing.md}" + rowBorder: "{colors.hairline}" + ex-auth-form-card: + description: "Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside." + backgroundColor: "{colors.surface}" + rounded: "{rounded.xl}" + padding: "{spacing.lg}" + ex-modal-card: + description: "Modal dialog surface — same chrome as feature-card with elevated shadow." + backgroundColor: "{colors.surface}" + rounded: "{rounded.xl}" + padding: "{spacing.lg}" + ex-empty-state-card: + description: "Empty-state illustration frame." + backgroundColor: "{colors.canvas-soft}" + rounded: "{rounded.xl}" + padding: "{spacing.xxl}" + captionTypography: "{typography.body-md}" + ex-toast: + description: "Toast notification surface — feature-card shape + medium shadow." + backgroundColor: "{colors.surface}" + rounded: "{rounded.xl}" + padding: "{spacing.sm} {spacing.md}" + typography: "{typography.body-sm}" + +--- + +## Overview + +Notion looks like a well-organized desk in good daylight. The dominant surface is not pure white but a warm, paper-soft +off-white — `{colors.canvas-soft}` (#f6f5f4) — that takes the clinical edge off the screen and makes long pages feel +like a document rather than an app. Type is set in `NotionInter` (a tuned Inter) in near-black `{colors.ink}` at large, +tightly-tracked weights, so headlines read as confident statements with very little letter-spacing slack at display +sizes (`{typography.display-1}` pulls −2.125px of tracking at 64px). The whole system whispers in greys and blacks, then +says exactly one thing in colour: a single, dependable blue, `{colors.primary}` (#0075de), reserved almost entirely for +the primary call-to-action and inline links. + +Against that quiet chrome, Notion lets a **playful multi-colour sticker palette** carry all of the brand's personality — +purple, pink, orange, teal, green and sky-blue appear as small illustrated blocks, app-icon stickers, and category dots +scattered through the marketing pages. These colours never structure the layout or paint a CTA; they decorate. The +discipline is deliberate: the interface stays monochrome-plus-blue so the content (and the cheerful illustrations) can +breathe. The one exception to the bright daylight is the homepage hero, which inverts into a deep indigo "night" band +(`{colors.secondary}`) with white type and glowing sticker constellations — a single dark island in an otherwise light +document. + +Surfaces are defined by hairlines and the faintest layered shadows rather than heavy elevation. Cards round at a +friendly 12px (`{rounded.lg}`), the marketing CTAs are fully-pill-shaped (`{rounded.full}`), and utility buttons round +at a tighter 8px (`{rounded.md}`). Nothing is loud; the brand's character comes from restraint plus one well-placed +splash of joy. + +**Key Characteristics:** + +- Warm paper-soft canvas `{colors.canvas-soft}` over pure white, never clinical +- Near-black `{colors.ink}` `NotionInter` type with tight negative tracking at display sizes (`{typography.display-1}`) +- Exactly one structural accent — Notion blue `{colors.primary}` — reserved for CTAs and links +- A decorative-only multi-colour sticker palette (`{colors.accent-purple}`, `{colors.accent-pink}`, + `{colors.accent-orange}`, `{colors.accent-teal}`, `{colors.accent-green}`, `{colors.accent-sky}`) that adds + personality without ever painting structure +- Pill-shaped marketing CTAs (`{rounded.full}`) contrasted with 8px utility buttons (`{rounded.md}`) +- Elevation by hairline + barely-there layered shadow, not heavy drop-shadows +- A single dark indigo hero "night" band (`{colors.secondary}`) inverting the otherwise daylight page rhythm + +## Colors + +> Source pages analysed: the Notion home page plus Pricing, Enterprise, Product (AI), Product (Agents), and Startups. +> Every secondary page resolved to the same core palette — Notion runs one tightly-scoped system across the marketing +> site. + +### Brand & Accent + +- **Notion Blue** (`{colors.primary}` — #0075de): the single structural accent. Primary CTA fill ("Get Notion free"), + inline link colour, active-tab and focus signal. This is the only colour that ever paints an action. +- **Pressed Blue** (`{colors.primary-active}` — #005bab): the darker press state of the primary CTA. +- **Deep Indigo** (`{colors.secondary}` — #213183): the dark hero "night" band background and its sticker-constellation + field; a deep brand-blue used for full-bleed inverted sections. + +The remaining colours form Notion's **decorative sticker palette** — they appear only as illustrated blocks, app +stickers and category dots, never as CTAs or structural fills: + +- **Sticker Sky** (`{colors.accent-sky}` — #62aef0) +- **Sticker Purple** (`{colors.accent-purple}` — #d6b6f6) / **Deep Purple** (`{colors.accent-purple-deep}` — #391c57) +- **Sticker Pink** (`{colors.accent-pink}` — #ff64c8) +- **Sticker Orange** (`{colors.accent-orange}` — #dd5b00) / **Deep Orange** (`{colors.accent-orange-deep}` — #793400) +- **Sticker Teal** (`{colors.accent-teal}` — #2a9d99) +- **Sticker Green** (`{colors.accent-green}` — #1aae39) +- **Sticker Brown** (`{colors.accent-brown}` — #523410) + +### Surface + +- **White** (`{colors.canvas}` / `{colors.surface}` — #ffffff): card and panel surfaces, nav bar, form fields. +- **Warm Paper** (`{colors.canvas-soft}` — #f6f5f4): the signature page canvas and the footer band — a warm off-white + that gives the whole site its document-like calm. +- **Hairline** (`{colors.hairline}` — #e6e6e6): 1px card borders and dividers, a black-at-10%-on-white blend kept solid + for token reuse. + +### Text + +- **Ink** (`{colors.ink}` — #000000): primary headings and body text (rendered at ~95% alpha for a soft true-black). +- **Warm Charcoal** (`{colors.ink-secondary}` — #31302e): secondary body copy and footer text. +- **Stone** (`{colors.ink-muted}` — #615d59): supporting / muted copy. +- **Ash** (`{colors.ink-faint}` — #a39e98): captions, metadata, placeholder text. + +### Semantic + +Notion's marketing surfaces do not expose a dedicated error/success palette in the system chrome — status is carried by +the sticker palette (e.g. `{colors.accent-green}` for affirmative ticks) rather than a separate semantic ramp. + +## Typography + +### Font Family + +The entire system is set in **`NotionInter`** — Notion's tuned cut of Inter — with a fallback stack of +`Inter, -apple-system, system-ui, "Segoe UI", Helvetica, Arial`. A single family carries everything from 64px display +headlines to 12px eyebrows; there is no serif, no monospace display face. OpenType `lnum` (lining numerals) and `locl` +features are enabled on body and heading roles. + +### Hierarchy + +| Token | Size | Weight | Line Height | Letter Spacing | Use | +|--------------------------|------|--------|-------------|----------------|------------------------------------------| +| `{typography.display-1}` | 64px | 700 | 1.0 | −2.125px | Hero headline ("Meet the night shift") | +| `{typography.display-2}` | 54px | 700 | 1.04 | −1.875px | Large section headlines | +| `{typography.heading-1}` | 40px | 700 | 1.1 | −1px | Section headlines ("Plans and features") | +| `{typography.heading-2}` | 26px | 700 | 1.23 | −0.625px | Sub-section headings | +| `{typography.heading-3}` | 22px | 700 | 1.27 | −0.25px | Card titles | +| `{typography.title}` | 20px | 600 | 1.4 | −0.125px | Feature titles, callouts | +| `{typography.body-md}` | 16px | 400 | 1.5 | 0 | Default body copy | +| `{typography.body-sm}` | 15px | 400 | 1.33 | 0 | Dense body, table rows, nav | +| `{typography.button}` | 16px | 500 | 1.5 | 0 | Button labels | +| `{typography.caption}` | 14px | 400 | 1.43 | 0 | Captions, footnotes | +| `{typography.eyebrow}` | 12px | 600 | 1.33 | +0.125px | Pill badges, small labels | + +### Principles + +Notion's type voice is **tight, heavy, and quiet-confident**. Headlines lean on weight 700 and aggressive negative +tracking (more negative the larger the size) so display copy feels set, not stretched. Body copy stays at a comfortable +1.5 line-height for document readability. The contrast between a heavy 700 headline and a calm 400 body is the primary +expressive lever — there is no decorative typography, only a clear hierarchy. + +### Note on Font Substitutes + +`NotionInter` is a proprietary tuning of the open-source **Inter** family — substitute Inter directly. To approximate +Notion's display tightness, apply the negative letter-spacing values in the table above explicitly (Inter at default +tracking will read looser than `NotionInter`). + +## Layout + +### Spacing System + +- **Base unit**: 8px. +- **Tokens (front matter)**: `{spacing.xxs}` 4px · `{spacing.xs}` 8px · `{spacing.sm}` 12px · `{spacing.md}` 16px · + `{spacing.lg}` 24px · `{spacing.xl}` 28px · `{spacing.xxl}` 32px. +- Card interior padding lands around `{spacing.lg}` (24px); utility buttons use a tight 4px/14px; form fields pad at + `{spacing.xxs}`-scale 6px. Section gaps stack the larger steps. + +### Grid & Container + +Content is centred in a wide max-width column (~1080–1300px on desktop per the extracted breakpoints) with generous +outer gutters. Feature sections alternate between full-width text blocks and 2-up / 3-up card grids; the pricing page +widens to a 4-column plan table. The dark hero spans full-bleed edge to edge while body sections respect the centred +container. + +### Whitespace Philosophy + +Whitespace is the primary grouping device. Sections are separated by large vertical gaps rather than rules, and cards +sit on the warm canvas with quiet hairlines instead of heavy frames. The effect is document-like: airy, scannable, and +never crowded. + +### Responsive Strategy + +#### Breakpoints + +| Name | Width | Key Changes | +|---------|-------------|------------------------------------------------------| +| Wide | 1440px+ | Full multi-column grids, widest container | +| Desktop | 1080–1300px | Standard centred container, 3-up card grids | +| Tablet | 768–840px | Grids collapse to 2-up, nav begins condensing | +| Mobile | ≤600px | Single-column stacks, hamburger nav, full-width CTAs | + +#### Touch Targets + +Pill CTAs (`button-primary`, `button-secondary`) and utility buttons (`button-utility`) carry comfortable tap padding; +aim for a 44×44px minimum hit area on mobile by preserving vertical padding even as labels shrink. + +#### Collapsing Strategy + +The top nav condenses to a hamburger below the tablet breakpoint; multi-column card grids collapse to a single stacked +column; the pricing plan table reflows from 4 side-by-side columns into stacked plan cards. Section padding tightens but +the warm-canvas rhythm is preserved. + +#### Image Behavior + +Product screenshots and illustration tiles sit inside rounded `{rounded.lg}` frames and scale fluidly within their grid +cell. Sticker illustrations are small fixed-scale decorative assets that re-flow but do not crop. + +## Elevation & Depth + +| Level | Treatment | Use | +|--------------|----------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------| +| 0 — Flat | Hairline border `{colors.hairline}`, no shadow | Default cards on the warm canvas | +| 1 — Soft | Layered micro-shadow: `rgba(0,0,0,0.01) 0 0.175px 1.041px`, `0.02 0 0.8px 2.925px`, `0.027 0 2.025px 7.847px`, `0.04 0 4px 18px` | Raised feature cards, floating buttons | +| 2 — Elevated | Deeper 5-stop stack ending in `rgba(0,0,0,0.05) 0 23px 52px` | Modals, popovers, the elevated white pill on the dark hero | + +Notion's elevation philosophy is **barely-there**: shadows are built from many near-transparent layers so surfaces feel +gently lifted off the paper rather than dramatically dropped. Most cards rely on a hairline alone. + +### Decorative Depth + +The brand's real depth cue is **illustration**, not shadow. The dark indigo hero (`{colors.secondary}`) uses glowing +sticker stickers and a starfield to create a sense of a lit night scene, and feature sections layer small colourful +app-icon stickers over plain surfaces to add playful dimensionality. Colour-blocked illustration tiles (purple, pink, +orange, teal headers on otherwise-white cards) provide visual rhythm. + +## Shapes + +### Border Radius Scale + +| Token | Value | Use | +|------------------|--------|----------------------------------------------------| +| `{rounded.xs}` | 4px | Form fields, small tags, inline chips | +| `{rounded.sm}` | 5px | Menu items, list rows, status pills | +| `{rounded.md}` | 8px | Utility / nav buttons, smaller cards | +| `{rounded.lg}` | 12px | Feature cards, illustration frames, content tiles | +| `{rounded.xl}` | 16px | Large containers, image wells | +| `{rounded.full}` | 9999px | Marketing pill CTAs, badges, circular icon buttons | + +### Photography Geometry + +Product screenshots are framed in rounded `{rounded.lg}` / `{rounded.xl}` wells, typically full-bleed within their +container with a hairline edge. Illustration tiles use colour-blocked header bands above white card bodies. Avatars and +app-icon stickers are small, sometimes fully circular (`{rounded.full}`). There is no heavy art-direction crop — images +scale within their rounded frame. + +## Components + +> **No hover states documented.** Every spec below documents Default and Active/Pressed states only. Variants live as +> separate `components:` front-matter entries and are described in their own sub-blocks. + +### Navigation + +**`nav-bar`** — Top navigation + +- White surface `{colors.canvas}`, `{colors.ink}` link text at `{typography.body-sm}`, padding `{spacing.md}`. Sits as a + slim sticky bar; left wordmark, centre product/solutions menu links, right "Log in" text link plus a `button-utility` + "Get Notion free" CTA. Condenses to a hamburger below the tablet breakpoint. + +### Buttons + +**`button-primary`** — Primary CTA ("Get Notion free") + +- Background `{colors.primary}`, text `{colors.on-primary}`, type `{typography.button}`, fully pill-shaped + `{rounded.full}`. The single blue action on any page. +- Pressed state lives in `button-primary-pressed` (background `{colors.primary-active}`); marketing buttons also apply a + brief `scale(0.9)` press transform. + +**`button-primary-pressed`** + +- Background `{colors.primary-active}`, text `{colors.on-primary}` — the depressed state of the primary CTA. + +**`button-secondary`** — Secondary CTA ("Request a demo") + +- White surface `{colors.surface}`, text `{colors.ink}`, type `{typography.button}`, pill `{rounded.full}`, carried by + the soft Level-1 shadow. Pairs beside `button-primary` in the hero. + +**`button-utility`** — Nav / plan-select button + +- White surface `{colors.surface}`, text `{colors.ink}`, type `{typography.button}`, tighter `{rounded.md}` (8px), + padding `4px 14px`, 1px `{colors.hairline}` border. Used for the nav CTA and pricing plan-select buttons where the + marketing pill would be too large. + +**`button-icon-circular`** — Carousel / media control + +- Circular `{rounded.full}` control with a translucent `rgba(0,0,0,0.05)` fill and `{colors.on-primary}` glyph, used for + slide and play/pause controls; applies a `scale(0.9)` press transform. + +### Cards & Containers + +**`feature-card`** — Content / feature card + +- White surface `{colors.surface}`, `{colors.ink}` text, `{typography.body-md}`, rounded `{rounded.lg}` (12px), padding + `{spacing.lg}` (24px). The workhorse marketing card; often topped by a colour-blocked illustration band from the + sticker palette. Default elevation is flat (hairline only). + +**`feature-card-elevated`** — Raised feature card + +- Same chrome as `feature-card` with the soft Level-1 layered shadow for cards that float above the canvas + (testimonials, floating product panels). + +**`pricing-plan-card`** — Pricing plan column + +- White surface `{colors.surface}`, `{colors.ink}` text, `{typography.body-sm}`, rounded `{rounded.md}` (8px), padding + `{spacing.lg}`. A bordered column listing a plan's price and feature checklist, with a `button-utility` select action. + +**`pricing-plan-card-featured`** — Highlighted plan column + +- Warm `{colors.canvas-soft}` fill to lift the recommended tier off the white siblings, same `{rounded.md}` shape and + padding. Distinguished by surface tint rather than a coloured border. + +### Inputs & Forms + +**`text-input`** — Text / number field + +- White surface `{colors.surface}`, `{colors.ink}` text, `{typography.body-sm}`, 1px `rgb(221,221,221)` border, rounded + `{rounded.xs}` (4px), padding `6px`. Square-ish corners deliberately tighter than the pill CTAs. Focus adds the soft + Level-1 shadow. + +### Signature Components + +**`hero-band`** — Dark "night" hero + +- Full-bleed deep indigo `{colors.secondary}` band carrying `{typography.display-1}` white headline, + sticker-constellation field, and a `button-primary` + `button-secondary` CTA pair. The single inverted dark island in + an otherwise daylight page. + +**`badge-pill`** — Eyebrow / category pill + +- White surface `{colors.surface}`, `{colors.primary}` text, `{typography.eyebrow}` (12px / 600), fully pill + `{rounded.full}`, padding `4px 8px`. Small labels such as the pricing "Essential for staying organized" eyebrow and + category tags. + +**`footer`** — Site footer + +- Warm `{colors.canvas-soft}` band, `{colors.ink-secondary}` link text at `{typography.caption}`, padding + `{spacing.xxl}`. Multi-column link directory closing every page. + +### Examples (illustrative) + +> Kit-mirror demonstration surfaces. Each `ex-*` entry references brand-native primitives so downstream consumers +> (`/preview-design`, `/generate-kit`) re-skin the same 10 surfaces consistently. + +**`ex-pricing-tier`** — Default Pricing tier card. Re-uses feature-card chrome with brand canvas-soft surface. + +- Properties: `backgroundColor`, `textColor`, `borderColor`, `rounded`, `padding` + +**`ex-pricing-tier-featured`** — Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light +mode, light fill + dark text in dark mode). + +- Properties: `backgroundColor`, `textColor`, `rounded`, `padding` + +**`ex-product-selector`** — What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product +gallery). + +- Properties: `backgroundColor`, `rounded`, `padding` + +**`ex-cart-drawer`** — Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart). + +- Properties: `backgroundColor`, `rounded`, `padding`, `item-divider` + +**`ex-app-shell-row`** — Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator. + +- Properties: `backgroundColor`, `activeIndicator`, `rounded`, `padding` + +**`ex-data-table-cell`** — Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses +body-sm. + +- Properties: `headerBackground`, `headerTypography`, `bodyTypography`, `cellPadding`, `rowBorder` + +**`ex-auth-form-card`** — Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside. + +- Properties: `backgroundColor`, `rounded`, `padding` + +**`ex-modal-card`** — Modal dialog surface — same chrome as feature-card with elevated shadow. + +- Properties: `backgroundColor`, `rounded`, `padding` + +**`ex-empty-state-card`** — Empty-state illustration frame. + +- Properties: `backgroundColor`, `rounded`, `padding`, `captionTypography` + +**`ex-toast`** — Toast notification surface — feature-card shape + medium shadow. + +- Properties: `backgroundColor`, `rounded`, `padding`, `typography` + +## Do's and Don'ts + +### Do + +- Reserve `{colors.primary}` for the primary action, inline links, and the active/focus signal — nothing decorative. +- Keep the page on the warm `{colors.canvas-soft}` canvas; use pure white `{colors.surface}` for cards and fields to + create gentle figure/ground. +- Let the sticker palette (`{colors.accent-pink}`, `{colors.accent-teal}`, `{colors.accent-orange}`, …) live only in + illustrations, icon tiles and category dots. +- Set headlines in heavy `{typography.display-1}`/`{typography.heading-1}` with their negative tracking applied + explicitly. +- Use pill `{rounded.full}` for marketing CTAs and tighter `{rounded.md}` for nav/utility buttons — the contrast is + intentional. +- Define surfaces with `{colors.hairline}` and the barely-there Level-1 shadow rather than heavy drop-shadows. +- Reserve the deep indigo `{colors.secondary}` "night" treatment for a single hero moment, not repeated bands. + +### Don't + +- Don't paint a CTA or structural fill in any sticker-palette colour — those are decoration only. +- Don't introduce a second structural accent alongside `{colors.primary}`. +- Don't put pill `{rounded.full}` radii on form fields — inputs stay tight at `{rounded.xs}` (4px). +- Don't drop heavy shadows; Notion's elevation is many near-transparent layers, never a hard cast. +- Don't set body copy in a heavy weight — keep 400 for readability and let weight 700 belong to headlines. +- Don't place type on pure clinical white for full pages; the warm `{colors.canvas-soft}` is core to the brand calm. diff --git a/e2e/auth.spec.ts b/e2e/auth.spec.ts new file mode 100644 index 0000000..59e2481 --- /dev/null +++ b/e2e/auth.spec.ts @@ -0,0 +1,35 @@ +import {test, expect} from "@playwright/test"; +import {setupApiMocks} from "./mocks"; + +test.describe("登录与认证", () => { + test("未登录访问受保护路由会跳转到登录页", async ({page}) => { + await setupApiMocks(page); + await page.goto("/project"); + await expect(page).toHaveURL(/\/login/); + await expect(page.getByRole("heading", {name: "Flexmodel"})).toBeVisible(); + }); + + test("登录页展示标题与演示登录入口", async ({page}) => { + await setupApiMocks(page); + await page.goto("/login"); + await expect(page.getByRole("heading", {name: "Flexmodel"})).toBeVisible(); + await expect(page.getByText("使用演示账号登录")).toBeVisible(); + }); + + test("使用演示账号登录后跳转离开登录页", async ({page}) => { + await setupApiMocks(page); + await page.goto("/login"); + await page.getByText("使用演示账号登录").click(); + // 登录成功后会导航到首页或来源页 + await expect(page).not.toHaveURL(/\/login/); + }); + + test("手动输入用户名密码登录", async ({page}) => { + await setupApiMocks(page); + await page.goto("/login"); + await page.getByPlaceholder("请输入用户名").fill("admin"); + await page.getByPlaceholder("请输入密码").fill("admin123"); + await page.getByRole("button", {name: "登录"}).click(); + await expect(page).not.toHaveURL(/\/login/); + }); +}); diff --git a/e2e/data.spec.ts b/e2e/data.spec.ts new file mode 100644 index 0000000..aba0584 --- /dev/null +++ b/e2e/data.spec.ts @@ -0,0 +1,21 @@ +import {test, expect} from "./fixtures"; + +const MODELING = "/project/demo/data/modeling"; + +test.describe("项目 - 数据建模", () => { + test("展示数据建模标题与模型树", async ({mockPage: page}) => { + await page.goto(MODELING); + await expect(page.getByRole("heading", {name: "数据建模"})).toBeVisible(); + // 模型树分组节点(实体)与叶子节点(模型 name) + await expect(page.getByText("实体").first()).toBeVisible(); + await expect(page.getByRole("tree").getByText("Student")).toBeVisible(); + }); + + test("打开 ER 视图弹窗", async ({mockPage: page}) => { + await page.goto(MODELING); + await expect(page.getByRole("heading", {name: "数据建模"})).toBeVisible(); + // ER 视图按钮(title 属性为"ER视图") + await page.locator('button[title="ER视图"]').click(); + await expect(page.getByText("ER视图").first()).toBeVisible(); + }); +}); diff --git a/e2e/fixtures.ts b/e2e/fixtures.ts new file mode 100644 index 0000000..990902b --- /dev/null +++ b/e2e/fixtures.ts @@ -0,0 +1,29 @@ +import {test as base, expect, type Page} from "@playwright/test"; +import {injectAuthState, setupApiMocks} from "./mocks"; + +/** + * 扩展的 test fixture: + * - `mockPage`:已注入登录态 + 已注册所有 /api mock 路由的 page + * - `authedPage`:同 mockPage,语义上指"已登录后访问受保护页面" + * + * 用法: + * import { test, expect } from "./fixtures"; + * test("xxx", async ({ mockPage }) => { ... }); + */ + +export const test = base.extend<{ mockPage: Page; authedPage: Page }>({ + mockPage: async ({page}, use) => { + await injectAuthState(page); + await setupApiMocks(page); + // eslint-disable-next-line react-hooks/rules-of-hooks -- Playwright fixture API, not React's use hook + await use(page); + }, + authedPage: async ({page}, use) => { + await injectAuthState(page); + await setupApiMocks(page); + // eslint-disable-next-line react-hooks/rules-of-hooks -- Playwright fixture API, not React's use hook + await use(page); + }, +}); + +export {expect}; diff --git a/e2e/flow.spec.ts b/e2e/flow.spec.ts new file mode 100644 index 0000000..8b5f52b --- /dev/null +++ b/e2e/flow.spec.ts @@ -0,0 +1,39 @@ +import {test, expect} from "./fixtures"; + +const FLOW_DEF = "/project/demo/flow/definition"; +const FLOW_INST = "/project/demo/flow/instance"; + +test.describe("项目 - 流程", () => { + test("流程定义列表:展示流程与新建按钮", async ({mockPage: page}) => { + await page.goto(FLOW_DEF); + await expect(page.getByRole("heading", {name: "流程定义"})).toBeVisible(); + await expect(page.getByText("审批流程")).toBeVisible(); + await expect(page.getByRole("button", {name: "新建流程"})).toBeVisible(); + }); + + test("流程定义列表:打开新建流程弹窗", async ({mockPage: page}) => { + await page.goto(FLOW_DEF); + await page.getByRole("button", {name: "新建流程"}).click(); + await expect(page.getByRole("dialog").getByText("流程名称")).toBeVisible(); + }); + + test("流程实例列表:展示实例与搜索", async ({mockPage: page}) => { + await page.goto(FLOW_INST); + await expect(page.getByRole("heading", {name: "流程实例"})).toBeVisible(); + await expect(page.getByText("审批流程").first()).toBeVisible(); + await expect(page.getByPlaceholder("搜索流程实例ID")).toBeVisible(); + }); + + test("流程实例详情:渲染页面与返回按钮", async ({mockPage: page}) => { + await page.goto("/project/demo/flow/instance/inst-1"); + // hideLayout 路由,直接渲染内容区;检查页面标题(含流程名和实例ID) + await expect(page.getByText("审批流程").first()).toBeVisible({timeout: 15_000}); + await expect(page.getByText("inst-1").first()).toBeVisible(); + }); + + test("流程设计器:渲染节点面板与画布", async ({mockPage: page}) => { + await page.goto("/project/demo/flow/design/flow-1"); + await expect(page.getByText("开始事件")).toBeVisible(); + await expect(page.locator(".react-flow")).toBeAttached(); + }); +}); diff --git a/e2e/functions.spec.ts b/e2e/functions.spec.ts new file mode 100644 index 0000000..563d88a --- /dev/null +++ b/e2e/functions.spec.ts @@ -0,0 +1,32 @@ +import {test, expect} from "./fixtures"; + +const FUNCTIONS = "/project/demo/functions"; + +test.describe("项目 - 边缘函数", () => { + test("函数列表:展示函数与创建按钮", async ({mockPage: page}) => { + await page.goto(FUNCTIONS); + await expect(page.getByRole("heading", {name: "边缘函数"})).toBeVisible(); + await expect(page.getByText("hello").first()).toBeVisible(); + await expect(page.getByRole("button", {name: "创建函数"})).toBeVisible(); + await expect(page.getByPlaceholder("搜索函数名称")).toBeVisible(); + }); + + test("函数列表:点击函数名打开详情抽屉", async ({mockPage: page}) => { + await page.goto(FUNCTIONS); + await page.getByText("hello").first().click(); + await expect(page.locator(".ant-drawer")).toBeVisible(); + }); + + test("函数编辑器(新建):展示编辑器与部署按钮", async ({mockPage: page}) => { + await page.goto(`${FUNCTIONS}/editor`); + await expect(page.getByText("新建函数")).toBeVisible(); + await expect(page.getByRole("button", {name: "部署"})).toBeVisible(); + await expect(page.getByRole("button", {name: "模板"})).toBeVisible(); + }); + + test("函数编辑器(编辑):加载已有函数", async ({mockPage: page}) => { + await page.goto(`${FUNCTIONS}/editor/hello`); + await expect(page.getByText("hello").first()).toBeVisible(); + await expect(page.getByRole("button", {name: "部署"})).toBeVisible(); + }); +}); diff --git a/e2e/mocks.ts b/e2e/mocks.ts new file mode 100644 index 0000000..2c79c61 --- /dev/null +++ b/e2e/mocks.ts @@ -0,0 +1,535 @@ +import type {Page, Route} from "@playwright/test"; + +/** + * 集中管理所有后端接口的 mock 数据与路由拦截。 + * + * 所有业务接口走 /api 前缀(BASE_URI = "/api"), + * 这里通过 page.route 拦截所有 /api 开头的请求, + * 根据 method + pathname 返回对应的 mock JSON。 + */ + +const PROJECT_ID = "demo"; + +// ---- 公共 mock 数据 ---- + +export const mockUser = {id: "admin", name: "admin", createdAt: "2024-01-01", updatedAt: "2024-01-01"}; + +export const mockProject = { + id: PROJECT_ID, + name: "演示项目", + description: "用于 E2E 测试的演示项目", + databaseName: "flexmodel_demo", + createdAt: "2024-01-01T00:00:00Z", + updatedAt: "2024-01-01T00:00:00Z", + ownerId: "admin", + stats: {apiCount: 3, modelCount: 5, flowCount: 2, datasourceCount: 1, storageCount: 1}, + metadata: {showSystemModels: false}, +}; + +export const mockProjects = [mockProject]; + +const json = (body: unknown, status = 200, headers: Record = {}) => + JSON.stringify(body) === undefined + ? {status, headers: {"content-type": "application/json", ...headers}} + : { + status, + headers: {"content-type": "application/json; charset=utf-8", ...headers}, + body: JSON.stringify(body), + }; + +function ok(body: unknown) { + return json(body, 200); +} + +/** 在浏览器加载前注入已登录的认证态与默认语言(中文)。 */ +export async function injectAuthState(page: Page) { + await page.addInitScript(() => { + const auth = { + state: { + isAuthenticated: true, + user: {id: "admin", name: "admin", createdAt: "2024-01-01", updatedAt: "2024-01-01"}, + token: "mock-token", + isLoading: false, + error: null, + }, + version: 0, + }; + localStorage.setItem("auth-storage", JSON.stringify(auth)); + + const app = { + state: {isDark: false, currentLang: "zh", isSidebarCollapsed: false}, + version: 0, + }; + localStorage.setItem("app-storage", JSON.stringify(app)); + localStorage.setItem("i18nextLng", "zh"); + localStorage.setItem("projectId", "demo"); + }); +} + +/** + * 注册所有 /api 接口的 mock 路由。需要在 page 导航前调用。 + */ +export async function setupApiMocks(page: Page) { + // 仅拦截 pathname 以 /api/ 开头的请求(真正的后端接口调用)。 + // 使用函数谓词而非 glob "**/api/**",避免误拦截 SPA 路由 + // (如 /project/demo/api/log 虽含 /api/ 但不是后端接口)。 + await page.route( + (url) => url.pathname.startsWith("/api/"), + (route) => handleRoute(route), + ); +} + +async function handleRoute(route: Route) { + const request = route.request(); + const url = new URL(request.url()); + const method = request.method(); + const path = url.pathname.replace(/^\/api/, ""); + + // 去掉 query 的 path 匹配辅助 + const matchGet = (re: RegExp) => method === "GET" && re.test(path); + const matchPost = (re: RegExp) => method === "POST" && re.test(path); + const matchDelete = (re: RegExp) => method === "DELETE" && re.test(path); + const matchPatch = (re: RegExp) => method === "PATCH" && re.test(path); + + // ---- 全局 / 认证 ---- + if (matchGet(/^\/global\/profile$/)) return route.fulfill(ok(globalProfile())); + if (matchGet(/^\/auth\/whoami$/)) return route.fulfill(ok({token: "mock-token", user: mockUser, expiresIn: 900})); + if (matchPost(/^\/auth\/login$/)) return route.fulfill(ok({token: "mock-token", user: mockUser, expiresIn: 900})); + if (matchPost(/^\/auth\/refresh$/)) return route.fulfill(ok({token: "mock-token", expiresIn: 900})); + + // ---- 平台设置 ---- + if (matchGet(/^\/settings$/)) return route.fulfill(ok(settingsData())); + if (matchPatch(/^\/settings$/)) return route.fulfill(ok(settingsData())); + + // ---- 用户 / 角色 / 资源 ---- + if (matchGet(/^\/users$/)) return route.fulfill(ok(usersData())); + if (matchGet(/^\/roles$/)) return route.fulfill(ok(rolesData())); + if (matchGet(/^\/resources\/tree$/)) return route.fulfill(ok(resourceTree())); + if (matchGet(/^\/resources$/)) return route.fulfill(ok(resourceTree())); + + // ---- API Key ---- + if (matchGet(/^\/api-keys$/)) return route.fulfill(ok(apiKeysData())); + if (matchPost(/^\/api-keys$/)) return route.fulfill(ok({ + ...apiKeysData()[0], + id: "key-new", + key: "fmk-new-secret-key-value" + })); + if (matchPost(/^\/api-keys\/[^/]+\/regenerate$/)) return route.fulfill(ok({ + ...apiKeysData()[0], + key: "fmk-regen-secret-key" + })); + + // ---- 项目 ---- + if (matchGet(/^\/projects$/) || matchGet(/^\/projects$/)) { + const include = url.searchParams.get("include"); + return route.fulfill(ok(include ? mockProjects : mockProjects)); + } + if (matchGet(/^\/projects\/[^/]+\/stats$/)) return route.fulfill(ok(mockProject.stats)); + if (matchGet(/^\/projects\/[^/]+$/)) return route.fulfill(ok(mockProject)); + if (matchPost(/^\/projects$/)) return route.fulfill(ok(mockProject)); + if (matchPatch(/^\/projects\/[^/]+$/)) return route.fulfill(ok(mockProject)); + if (matchDelete(/^\/projects\/[^/]+$/)) return route.fulfill({status: 204}); + + // ---- 监控指标 ---- + if (matchGet(/^\/projects\/[^/]+\/metrics\/fm$/)) return route.fulfill(ok(fmMetrics())); + if (matchGet(/^\/projects\/[^/]+\/metrics\//)) return route.fulfill(ok({})); + + // ---- API 日志 ---- + if (matchGet(/^\/projects\/[^/]+\/logs\/stat$/)) return route.fulfill(ok(apiLogStat())); + if (matchGet(/^\/projects\/[^/]+\/logs$/)) return route.fulfill(ok({list: apiLogs(), total: apiLogs().length})); + + // ---- API 管理 ---- + if (matchGet(/^\/projects\/[^/]+\/apis$/)) return route.fulfill(ok(apiDefinitions())); + if (matchPost(/^\/projects\/[^/]+\/apis$/)) return route.fulfill(ok(apiDefinitions()[0])); + if (matchPost(/^\/projects\/[^/]+\/apis\/generate$/)) return route.fulfill(ok({})); + + // ---- GraphQL ---- + if (matchPost(/^\/projects\/[^/]+\/graphql$/)) return route.fulfill(ok({data: {hello: "world"}})); + + // ---- 模型 / 数据源 ---- + if (matchGet(/^\/projects\/[^/]+\/models$/)) return route.fulfill(ok(models())); + if (matchGet(/^\/projects\/[^/]+\/datasources$/)) return route.fulfill(ok(datasources())); + + // ---- 分支 ---- + if (matchGet(/^\/projects\/[^/]+\/branches$/)) return route.fulfill(ok([{ + name: "main", + isDefault: true, + active: true, + createdAt: "2024-01-01" + }])); + + // ---- 流程 ---- + if (matchGet(/^\/projects\/[^/]+\/flows\/instances$/)) return route.fulfill(ok({ + list: flowInstances(), + total: flowInstances().length + })); + if (matchGet(/^\/projects\/[^/]+\/flows\/instances\/[^/]+\/elements$/)) return route.fulfill(ok([])); + if (matchGet(/^\/projects\/[^/]+\/flows\/instances\/[^/]+\/user-tasks$/)) return route.fulfill(ok([])); + if (matchGet(/^\/projects\/[^/]+\/flows\/instances\/[^/]+$/)) return route.fulfill(ok(flowInstances()[0])); + if (matchGet(/^\/projects\/[^/]+\/flows\/[^/]+$/)) return route.fulfill(ok(flowModuleDetail())); + if (matchGet(/^\/projects\/[^/]+\/flows$/)) return route.fulfill(ok({ + list: flowModules(), + total: flowModules().length + })); + if (matchPost(/^\/projects\/[^/]+\/flows$/)) return route.fulfill(ok({ + errCode: 1000, + errMsg: "ok", + flowModuleId: "flow-new" + })); + if (matchPost(/^\/projects\/[^/]+\/flows\/instances\/start$/)) return route.fulfill(ok({ + errCode: 1000, + errMsg: "ok", + flowInstanceId: "inst-new", + status: 2 + })); + + // ---- 触发器 / 任务日志 ---- + if (matchGet(/^\/projects\/[^/]+\/triggers$/)) return route.fulfill(ok({list: triggers(), total: triggers().length})); + if (matchGet(/^\/projects\/[^/]+\/jobs\/logs$/)) return route.fulfill(ok({list: jobLogs(), total: jobLogs().length})); + + // ---- 边缘函数 ---- + if (matchGet(/^\/function-templates$/)) return route.fulfill(ok([])); + if (matchGet(/^\/projects\/[^/]+\/functions$/)) return route.fulfill(ok({ + list: functions(), + total: functions().length + })); + if (matchGet(/^\/projects\/[^/]+\/functions\/[^/]+$/)) return route.fulfill(ok(functions()[0])); + + // ---- 认证提供商 / Pages ---- + if (matchGet(/^\/projects\/[^/]+\/auth-providers$/)) return route.fulfill(ok([])); + if (matchGet(/^\/projects\/[^/]+\/page$/)) return route.fulfill(ok(pageSite())); + + // ---- 存储桶 ---- + if (matchGet(/^\/projects\/[^/]+\/buckets$/)) return route.fulfill(ok(buckets())); + + if (matchGet(/^\/projects\/[^/]+\/buckets\/[^/]+\/objects/)) return route.fulfill(ok([])); + + // ---- 兜底:返回空数组,避免 Table 组件因非数组数据崩溃 ---- + return route.fulfill(ok([])); +} + +// ---- mock 数据构造函数 ---- + +function globalProfile() { + return { + settings: {graphql: {enabled: true}}, + apiRootPath: "/api", + storageProvider: {type: "local", readOnly: false}, + projectBaseDomain: "", + edgeUrlTemplate: "", + routingMode: "path", + pagesUrlTemplate: "/pages/{{projectId}}", + version: "test-1.0.0", + }; +} + +function settingsData() { + return {graphql: {enabled: true, introspection: true}}; +} + +function usersData() { + return [ + { + id: "admin", + name: "admin", + email: "admin@example.com", + createdAt: "2024-01-01", + updatedAt: "2024-01-01", + roleIds: ["1"] + }, + { + id: "u2", + name: "alice", + email: "alice@example.com", + createdAt: "2024-02-01", + updatedAt: "2024-02-01", + roleIds: ["2"] + }, + ]; +} + +function rolesData() { + return [ + {id: "1", name: "管理员", description: "系统管理员", resourceIds: ["1", "2"], createdAt: "2024-01-01"}, + {id: "2", name: "开发者", description: "开发人员", resourceIds: ["2"], createdAt: "2024-01-01"}, + ]; +} + +function resourceTree() { + return [ + {id: "1", name: "项目管理", children: [{id: "11", name: "查看项目"}]}, + {id: "2", name: "数据建模", children: [{id: "21", name: "查看模型"}]}, + ]; +} + +function apiKeysData() { + return [ + {id: "k1", name: "测试 Key", keyPrefix: "fmk_abc123", projectIds: "demo", readOnly: false, createdAt: "2024-01-01"}, + {id: "k2", name: "只读 Key", keyPrefix: "fmk_def456", projectIds: "", readOnly: true, createdAt: "2024-02-01"}, + ]; +} + +function fmMetrics() { + return { + requestCount: 128, + modelCount: 5, + branchCount: 1, + flowDefCount: 2, + flowExecCount: 6, + triggerTotalCount: 4, + jobSuccessCount: 3, + jobFailureCount: 1, + }; +} + +function apiLogStat() { + return { + apiChart: {dateList: ["2024-03-01", "2024-03-02"], successData: [10, 12], failData: [1, 0]}, + apiRankingList: [{name: "GET /students", count: 20}], + apiStatList: [{date: "2024-03-01", total: 11}], + }; +} + +function apiLogs() { + return [ + { + id: "log-1", + httpMethod: "GET", + path: "/api/projects/demo/models", + url: "/api/projects/demo/models", + statusCode: 200, + responseTime: 42, + clientIp: "127.0.0.1", + createdAt: "2024-03-01 10:00:00", + isSuccess: true, + requestBody: "", + requestHeaders: {}, + errorMessage: "", + }, + { + id: "log-2", + httpMethod: "POST", + path: "/api/projects/demo/graphql", + url: "/api/projects/demo/graphql", + statusCode: 500, + responseTime: 120, + clientIp: "127.0.0.1", + createdAt: "2024-03-01 11:00:00", + isSuccess: false, + requestBody: "{}", + requestHeaders: {}, + errorMessage: "内部错误", + }, + ]; +} + +function apiDefinitions() { + return [ + {id: "api-1", name: "学生查询", path: "/students", method: "GET", enabled: true, version: 1}, + {id: "api-2", name: "创建学生", path: "/students", method: "POST", enabled: false, version: 1}, + ]; +} + +function models() { + return [ + { + type: "Entity", + name: "Student", + displayName: "学生", + fields: [{name: "id", type: "Long", primaryKey: true, nullable: false}], + indexes: [], + }, + { + type: "Enum", + name: "Gender", + displayName: "性别", + values: [{name: "MALE", value: "MALE"}, {name: "FEMALE", value: "FEMALE"}], + }, + { + type: "NativeQuery", + name: "StudentCount", + displayName: "学生数量", + sql: "SELECT count(*) FROM student", + }, + ]; +} + +function datasources() { + return [ + {name: "main_ds", type: "postgresql", url: "jdbc:postgresql://localhost:5432/demo", username: "demo"}, + ]; +} + +function flowModules() { + return [ + { + flowModuleId: "flow-1", + flowName: "审批流程", + flowKey: "approval", + status: 4, + remark: "示例", + operator: "admin", + modifyTime: "2024-03-01 10:00:00" + }, + { + flowModuleId: "flow-2", + flowName: "请假流程", + flowKey: "leave", + status: 2, + remark: "", + operator: "admin", + modifyTime: "2024-03-02 10:00:00" + }, + ]; +} + +function flowModuleDetail() { + return { + ...flowModules()[0], + flowDeployId: "deploy-1", + flowModel: JSON.stringify({ + flowElements: [ + {key: "start", type: 1, properties: {name: "开始"}, outgoing: ["e1"]}, + {key: "end", type: 2, properties: {name: "结束"}, incoming: ["e1"]}, + ], + edges: [{key: "e1", source: "start", target: "end"}], + }), + }; +} + +function flowInstances() { + return [ + { + flowInstanceId: "inst-1", + flowModuleId: "flow-1", + flowDeployId: "deploy-1", + flowName: "审批流程", + flowKey: "approval", + status: 2, + operator: "admin", + caller: "test", + createTime: "2024-03-01 10:00:00", + modifyTime: "2024-03-01 10:30:00", + }, + { + flowInstanceId: "inst-2", + flowModuleId: "flow-2", + flowDeployId: "deploy-2", + flowName: "请假流程", + flowKey: "leave", + status: 1, + operator: "admin", + caller: "test", + createTime: "2024-03-02 10:00:00", + modifyTime: "2024-03-02 10:30:00", + }, + ]; +} + +function triggers() { + return [ + { + id: "t1", + name: "每分钟触发", + description: "测试", + type: "SCHEDULE", + jobType: "FLOW", + jobId: "flow-1", + jobName: "审批流程", + jobGroup: "demo", + state: true, + createdAt: "2024-03-01" + }, + { + id: "t2", + name: "事件触发", + description: "", + type: "EVENT", + jobType: "FUNCTION", + jobId: "hello", + jobName: "hello", + jobGroup: "demo", + state: false, + createdAt: "2024-03-02" + }, + ]; +} + +function jobLogs() { + return [ + { + id: "j1", + triggerId: "t1", + jobId: "flow-1", + jobGroup: "demo", + jobType: "FLOW", + jobName: "审批流程", + executionStatus: "SUCCESS", + startTime: "2024-03-01 10:00:00", + endTime: "2024-03-01 10:00:05", + executionDuration: 5000, + isSuccess: true, + }, + { + id: "j2", + triggerId: "t2", + jobId: "hello", + jobGroup: "demo", + jobType: "FUNCTION", + jobName: "hello", + executionStatus: "FAILED", + startTime: "2024-03-02 10:00:00", + endTime: "2024-03-02 10:00:02", + executionDuration: 2000, + isSuccess: false, + errorMessage: "执行超时", + }, + ]; +} + +function functions() { + return [ + { + id: "fn-1", + projectId: PROJECT_ID, + name: "hello", + sourceFiles: {"index.ts": 'export default async function(req){ return new Response("hi"); }'}, + timeout: 30, + createdAt: "2024-03-01T00:00:00Z", + updatedAt: "2024-03-01T00:00:00Z", + }, + { + id: "fn-2", + projectId: PROJECT_ID, + name: "echo", + sourceFiles: {"index.ts": 'export default async function(req){ return new Response(req.body); }'}, + timeout: 10, + createdAt: "2024-03-02T00:00:00Z", + updatedAt: "2024-03-02T00:00:00Z", + }, + ]; +} + +function pageSite() { + return { + id: "page-1", + projectId: PROJECT_ID, + customDomains: null, + productionDeploymentId: "deploy-1", + status: "READY", + fileCount: 3, + sizeBytes: 10240, + errorMessage: null, + createdBy: "admin", + updatedBy: "admin", + createdAt: "2024-03-01", + updatedAt: "2024-03-01", + }; +} + +function buckets() { + return [ + {name: "images", visibility: "PUBLIC", createdAt: "2024-03-01", updatedAt: "2024-03-01"}, + {name: "docs", visibility: "PRIVATE", createdAt: "2024-03-02", updatedAt: "2024-03-02"}, + ]; +} diff --git a/e2e/overview-api.spec.ts b/e2e/overview-api.spec.ts new file mode 100644 index 0000000..19d4d7c --- /dev/null +++ b/e2e/overview-api.spec.ts @@ -0,0 +1,38 @@ +import {test, expect} from "./fixtures"; + +const PROJECT = "/project/demo"; + +test.describe("项目 - 概述与接口", () => { + test("概述页:面包屑与统计卡片", async ({mockPage: page}) => { + await page.goto(PROJECT); + await expect(page.getByText("概述").first()).toBeVisible(); + // 面包屑中展示当前项目名称 + await expect(page.getByText("演示项目").first()).toBeVisible(); + }); + + test("GraphQL API 页:展示标题与设置按钮", async ({mockPage: page}) => { + await page.goto(`${PROJECT}/api/graphql`); + await expect(page.getByRole("heading", {name: "GraphQL"})).toBeVisible(); + await expect(page.getByRole("button", {name: "设置"})).toBeVisible(); + }); + + test("接口日志页:展示标题与日志表格", async ({mockPage: page}) => { + await page.goto(`${PROJECT}/api/log`); + // PageContainer 未设 title,通过列头确认页面已渲染 + await expect(page.getByRole("columnheader", {name: "请求方法"})).toBeVisible(); + // 日志数据中的请求方法标签 + await expect(page.getByText("GET").first()).toBeVisible(); + // 搜索 / 重置按钮(Ant Design 按钮在中文字符间插入空格,用正则匹配) + await expect(page.getByRole("button", {name: /搜索/})).toBeVisible(); + await expect(page.getByRole("button", {name: /重\s*置/})).toBeVisible(); + }); + + test("接口日志页:点击行打开详情抽屉", async ({mockPage: page}) => { + await page.goto(`${PROJECT}/api/log`); + await expect(page.getByText("GET").first()).toBeVisible(); + // 虚拟表格行以 div.ant-table-row 渲染,点击第一行打开 Drawer + const row = page.locator(".ant-table-row").first(); + await row.click(); + await expect(page.getByText("请求日志").first()).toBeVisible(); + }); +}); diff --git a/e2e/platform.spec.ts b/e2e/platform.spec.ts new file mode 100644 index 0000000..732b555 --- /dev/null +++ b/e2e/platform.spec.ts @@ -0,0 +1,50 @@ +import {test, expect} from "./fixtures"; + +test.describe("平台页面", () => { + test("项目管理页:展示项目卡片", async ({mockPage: page}) => { + await page.goto("/project"); + await expect(page.getByRole("heading", {name: "项目", exact: true})).toBeVisible(); + await expect(page.getByText("演示项目").first()).toBeVisible(); + }); + + test("项目管理页:创建项目弹窗", async ({mockPage: page}) => { + await page.goto("/project"); + await expect(page.getByText("演示项目").first()).toBeVisible(); + await page.getByRole("button", {name: "创建项目"}).click(); + await expect(page.getByRole("dialog").getByText("项目ID")).toBeVisible(); + }); + + test("成员管理页:展示用户与角色 Tab", async ({mockPage: page}) => { + await page.goto("/member"); + await expect(page.getByRole("heading", {name: "成员", exact: true})).toBeVisible(); + await expect(page.getByRole("tab", {name: "用户"})).toBeVisible(); + await expect(page.getByRole("tab", {name: "角色"})).toBeVisible(); + await expect(page.getByText("admin@example.com")).toBeVisible(); + }); + + test("成员管理页:切换到角色 Tab", async ({mockPage: page}) => { + await page.goto("/member"); + await page.getByRole("tab", {name: "角色"}).click(); + await expect(page.getByText("管理员").first()).toBeVisible(); + }); + + test("API Key 管理页:展示 Key 列表", async ({mockPage: page}) => { + await page.goto("/api-keys"); + await expect(page.getByRole("heading", {name: "API Key 管理"})).toBeVisible(); + await expect(page.getByText("测试 Key")).toBeVisible(); + await expect(page.getByRole("button", {name: "创建 API Key"})).toBeVisible(); + }); + + test("API Key 管理页:打开创建弹窗", async ({mockPage: page}) => { + await page.goto("/api-keys"); + await page.getByRole("button", {name: "创建 API Key"}).click(); + await expect(page.getByRole("dialog").getByText("名称")).toBeVisible(); + }); + + test("平台设置页:展示基础设置菜单", async ({mockPage: page}) => { + await page.goto("/settings"); + await expect(page.getByText("基础设置").first()).toBeVisible(); + await expect(page.getByText("代理").first()).toBeVisible(); + await expect(page.getByText("关于").first()).toBeVisible(); + }); +}); diff --git a/e2e/scheduling.spec.ts b/e2e/scheduling.spec.ts new file mode 100644 index 0000000..3bd1935 --- /dev/null +++ b/e2e/scheduling.spec.ts @@ -0,0 +1,28 @@ +import {test, expect} from "./fixtures"; + +const TRIGGER = "/project/demo/scheduling/trigger"; +const JOB_LOG = "/project/demo/scheduling/job-execution-log"; + +test.describe("项目 - 任务调度", () => { + test("触发器列表:展示触发器与创建按钮", async ({mockPage: page}) => { + await page.goto(TRIGGER); + await expect(page.getByRole("heading", {name: "触发器"})).toBeVisible(); + await expect(page.getByText("每分钟触发")).toBeVisible(); + await expect(page.getByRole("button", {name: "创建触发器"})).toBeVisible(); + }); + + test("触发器列表:打开创建触发器弹窗", async ({mockPage: page}) => { + await page.goto(TRIGGER); + await page.getByRole("button", {name: "创建触发器"}).click(); + await expect(page.getByRole("dialog")).toBeVisible(); + }); + + test("任务执行日志:展示日志与详情", async ({mockPage: page}) => { + await page.goto(JOB_LOG); + await expect(page.getByRole("heading", {name: "任务执行日志"})).toBeVisible(); + await expect(page.getByText("审批流程").first()).toBeVisible(); + // 点击"详情"打开日志详情弹窗 + await page.getByRole("button", {name: "详情"}).first().click(); + await expect(page.getByText("任务执行日志详情")).toBeVisible(); + }); +}); diff --git a/e2e/storage-pages.spec.ts b/e2e/storage-pages.spec.ts new file mode 100644 index 0000000..82a12c3 --- /dev/null +++ b/e2e/storage-pages.spec.ts @@ -0,0 +1,44 @@ +import {test, expect} from "./fixtures"; + +const STORAGE = "/project/demo/storage"; +const PROJECT_SETTINGS = "/project/demo/settings"; + +test.describe("项目 - 存储", () => { + test("存储页:展示标题与存储桶列表", async ({mockPage: page}) => { + await page.goto(STORAGE); + await expect(page.getByRole("heading", {name: "存储"})).toBeVisible(); + await expect(page.getByText("images").first()).toBeVisible(); + }); + + test("存储页:展示存储提供商标签", async ({mockPage: page}) => { + await page.goto(STORAGE); + await expect(page.getByText("Local")).toBeVisible(); + }); +}); + +test.describe("项目 - 项目设置与页面", () => { + test("项目设置:展示设置菜单", async ({mockPage: page}) => { + await page.goto(PROJECT_SETTINGS); + await expect(page.getByText("基础设置").first()).toBeVisible(); + await expect(page.getByText("身份认证").first()).toBeVisible(); + await expect(page.getByText("页面").first()).toBeVisible(); + }); + + test("项目设置 - 基础设置:展示项目名称表单", async ({mockPage: page}) => { + await page.goto(PROJECT_SETTINGS); + await expect(page.getByText("项目名称")).toBeVisible(); + }); + + test("项目设置 - 页面 Tab:展示站点信息", async ({mockPage: page}) => { + await page.goto(PROJECT_SETTINGS); + await page.getByText("页面", {exact: true}).click(); + await expect(page.getByText("站点地址")).toBeVisible(); + await expect(page.getByText("当前部署")).toBeVisible(); + }); + + test("项目设置 - 身份认证 Tab:展示认证提供商", async ({mockPage: page}) => { + await page.goto(PROJECT_SETTINGS); + await page.getByText("身份认证", {exact: true}).click(); + await expect(page.getByRole("heading", {name: "身份认证"})).toBeVisible(); + }); +}); diff --git a/eslint.config.js b/eslint.config.js index 1d1a2d8..cfdb39c 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -19,6 +19,8 @@ export default tseslint.config( }, rules: { ...reactHooks.configs.recommended.rules, + // React Hooks v7 引入此规则,适用于 React Compiler 场景;本项目在 effect 中进行数据获取/表单同步是标准模式,关闭此规则 + 'react-hooks/set-state-in-effect': 'off', 'react-refresh/only-export-components': [ 'warn', { allowConstantExport: true }, diff --git a/package-lock.json b/package-lock.json index 98d3524..afaab5b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,32 +11,33 @@ "@ant-design/icons": "^6.0.0", "@graphiql/plugin-explorer": "5.0.0", "@monaco-editor/react": "^4.7.0", - "@xyflow/react": "^12.8.4", + "@xyflow/react": "^12.11.0", "antd": "^6.0.0", - "axios": "^1.7.5", + "axios": "^1.19.0", "dagre": "^0.8.5", - "echarts": "^5.5.1", - "echarts-for-react": "^3.0.2", + "echarts": "^6.0.0", + "echarts-for-react": "^3.0.6", "graphiql": "5.0.0", "graphql": "16.9.0", "i18next": "^23.16.4", - "monaco-editor": "0.55.1", - "react": "^18.3.1", - "react-dom": "^18.3.1", + "monaco-editor": "^0.56.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", "react-i18next": "^15.1.0", - "react-router-dom": "^6.26.1", - "zustand": "^4.5.2" + "react-router-dom": "^7.18.0", + "zustand": "^5.0.0" }, "devDependencies": { + "@playwright/test": "^1.62.1", "@tsconfig/node18": "^18.2.2", "@types/dagre": "^0.7.52", "@types/node": "^20.19.0", - "@types/react": "^18.3.3", - "@types/react-dom": "^18.3.0", - "@vitejs/plugin-react": "^4.3.1", + "@types/react": "^19.2.0", + "@types/react-dom": "^19.2.0", + "@vitejs/plugin-react": "^6.1.0", "autoprefixer": "^10.4.20", "eslint": "^9.9.0", - "eslint-plugin-react-hooks": "^5.1.0-rc.0", + "eslint-plugin-react-hooks": "^7.0.0", "eslint-plugin-react-refresh": "^0.4.9", "globals": "^15.9.0", "i18next-browser-languagedetector": "^8.0.0", @@ -44,8 +45,8 @@ "tailwindcss": "^3.4.15", "typescript": "^5.5.3", "typescript-eslint": "^8.0.1", - "vite": "^7.2.7", - "vite-plugin-svgr": "^4.2.0" + "vite": "^8.2.2", + "vite-plugin-svgr": "^5.2.0" } }, "node_modules/@alloc/quick-lru": { @@ -70,9 +71,9 @@ } }, "node_modules/@ant-design/cssinjs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-2.0.1.tgz", - "integrity": "sha512-Lw1Z4cUQxdMmTNir67gU0HCpTl5TtkKCJPZ6UBvCqzcOTl/QmMFB6qAEoj8qFl0CuZDX9qQYa3m9+rEKfaBSbA==", + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/@ant-design/cssinjs/-/cssinjs-2.1.2.tgz", + "integrity": "sha512-2Hy8BnCEH31xPeSLbhhB2ctCPXE2ZnASdi+KbSeS79BNbUhL9hAEe20SkUk+BR8aKTmqb6+FKFruk7w8z0VoRQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -89,12 +90,12 @@ } }, "node_modules/@ant-design/cssinjs-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@ant-design/cssinjs-utils/-/cssinjs-utils-2.0.2.tgz", - "integrity": "sha512-Mq3Hm6fJuQeFNKSp3+yT4bjuhVbdrsyXE2RyfpJFL0xiYNZdaJ6oFaE3zFrzmHbmvTd2Wp3HCbRtkD4fU+v2ZA==", + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/@ant-design/cssinjs-utils/-/cssinjs-utils-2.1.2.tgz", + "integrity": "sha512-5fTHQ158jJJ5dC/ECeyIdZUzKxE/mpEMRZxthyG1sw/AKRHKgJBg00Yi6ACVXgycdje7KahRNvNET/uBccwCnA==", "license": "MIT", "dependencies": { - "@ant-design/cssinjs": "^2.0.1", + "@ant-design/cssinjs": "^2.1.2", "@babel/runtime": "^7.23.2", "@rc-component/util": "^1.4.0" }, @@ -103,15 +104,6 @@ "react-dom": ">=18" } }, - "node_modules/@ant-design/cssinjs/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@ant-design/fast-color": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-3.0.0.tgz", @@ -122,14 +114,14 @@ } }, "node_modules/@ant-design/icons": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-6.1.0.tgz", - "integrity": "sha512-KrWMu1fIg3w/1F2zfn+JlfNDU8dDqILfA5Tg85iqs1lf8ooyGlbkA+TkwfOKKgqpUmAiRY1PTFpuOU2DAIgSUg==", + "version": "6.3.2", + "resolved": "https://registry.npmmirror.com/@ant-design/icons/-/icons-6.3.2.tgz", + "integrity": "sha512-B6O5a5XJ4wjtNOfZejXYwHW5zvKV5gYkjGf11dHGLEbKn0ABDGndo41+gfIiXyTFhvESj4XTotuud33mUFid0g==", "license": "MIT", "dependencies": { - "@ant-design/colors": "^8.0.0", - "@ant-design/icons-svg": "^4.4.0", - "@rc-component/util": "^1.3.0", + "@ant-design/colors": "^8.0.1", + "@ant-design/icons-svg": "^4.5.0", + "@rc-component/util": "^1.11.0", "clsx": "^2.1.1" }, "engines": { @@ -141,22 +133,14 @@ } }, "node_modules/@ant-design/icons-svg": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", - "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==" - }, - "node_modules/@ant-design/icons/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.5.0.tgz", + "integrity": "sha512-1BTUFyKPTBZ53MuTP8s0k5SFEXL7o3VHEOwLgzaoWKwnBeqIcqUtVshc4SKzhI6uACfqhJqBwBUE9FsWR3uULA==", + "license": "MIT" }, "node_modules/@ant-design/react-slick": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-2.0.0.tgz", + "resolved": "https://registry.npmmirror.com/@ant-design/react-slick/-/react-slick-2.0.0.tgz", "integrity": "sha512-HMS9sRoEmZey8LsE/Yo6+klhlzU12PisjrVcydW3So7RdklyEd2qehyU6a7Yp+OYN72mgsYs3NFCyP2lCPFVqg==", "license": "MIT", "dependencies": { @@ -170,15 +154,6 @@ "react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/@ant-design/react-slick/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -303,15 +278,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", @@ -367,36 +333,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/runtime": { "version": "7.28.4", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", @@ -452,626 +388,184 @@ }, "node_modules/@emotion/hash": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "resolved": "https://registry.npmmirror.com/@emotion/hash/-/hash-0.8.0.tgz", "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", "license": "MIT" }, "node_modules/@emotion/unitless": { "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "resolved": "https://registry.npmmirror.com/@emotion/unitless/-/unitless-0.7.5.tgz", "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", "license": "MIT" }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, "engines": { - "node": ">=18" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=18" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=18" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@eslint/core": "^0.17.0" + }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@types/json-schema": "^7.0.15" + }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], "engines": { "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], + "node_modules/@eslint/js": { + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", + "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmmirror.com/@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/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmmirror.com/@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/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmmirror.com/@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/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmmirror.com/@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/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmmirror.com/@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/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmmirror.com/@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/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmmirror.com/@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/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmmirror.com/@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/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmmirror.com/@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/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmmirror.com/@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/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmmirror.com/@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/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmmirror.com/@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/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmmirror.com/@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/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmmirror.com/@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/@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/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", - "dev": true, - "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - "dev": true, - "dependencies": { - "@eslint/core": "^0.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", - "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", - "dev": true, - "dependencies": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@floating-ui/core": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", - "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.10" + "@floating-ui/utils": "^0.2.12" } }, "node_modules/@floating-ui/dom": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", - "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.7.3", - "@floating-ui/utils": "^0.2.10" + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" } }, "node_modules/@floating-ui/react": { "version": "0.26.28", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.28.tgz", + "resolved": "https://registry.npmmirror.com/@floating-ui/react/-/react-0.26.28.tgz", "integrity": "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==", "license": "MIT", "dependencies": { @@ -1085,12 +579,12 @@ } }, "node_modules/@floating-ui/react-dom": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", - "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", + "version": "2.1.9", + "resolved": "https://registry.npmmirror.com/@floating-ui/react-dom/-/react-dom-2.1.9.tgz", + "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==", "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.7.4" + "@floating-ui/dom": "^1.8.0" }, "peerDependencies": { "react": ">=16.8.0", @@ -1098,14 +592,14 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", - "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "version": "0.2.12", + "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", "license": "MIT" }, "node_modules/@graphiql/plugin-doc-explorer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@graphiql/plugin-doc-explorer/-/plugin-doc-explorer-0.3.0.tgz", + "resolved": "https://registry.npmmirror.com/@graphiql/plugin-doc-explorer/-/plugin-doc-explorer-0.3.0.tgz", "integrity": "sha512-FfDrUoHsh7tnqxnqQt0DL2k2TDKh0gX2BnCfpdipAEC+6O1bWtW6AfvdbxbmwEe7TP715YZmT1OTRbJQNiGdsg==", "license": "MIT", "dependencies": { @@ -1120,35 +614,6 @@ "react-dom": "^18 || ^19" } }, - "node_modules/@graphiql/plugin-doc-explorer/node_modules/zustand": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.9.tgz", - "integrity": "sha512-ALBtUj0AfjJt3uNRQoL1tL2tMvj6Gp/6e39dnfT6uzpelGru8v1tPOGBzayOWbPJvujM8JojDk3E1LxeFisBNg==", - "license": "MIT", - "engines": { - "node": ">=12.20.0" - }, - "peerDependencies": { - "@types/react": ">=18.0.0", - "immer": ">=9.0.6", - "react": ">=18.0.0", - "use-sync-external-store": ">=1.2.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - }, - "use-sync-external-store": { - "optional": true - } - } - }, "node_modules/@graphiql/plugin-explorer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@graphiql/plugin-explorer/-/plugin-explorer-5.0.0.tgz", @@ -1177,7 +642,7 @@ }, "node_modules/@graphiql/plugin-history": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@graphiql/plugin-history/-/plugin-history-0.3.0.tgz", + "resolved": "https://registry.npmmirror.com/@graphiql/plugin-history/-/plugin-history-0.3.0.tgz", "integrity": "sha512-7428aWIV0vxfzY64ygvKbl8sLVY0BfAywCHSMdoPqzUhJRiJ2nJFh0KPFQ/LLX7S6dG1qJgCFSoOOEZyH1171w==", "license": "MIT", "dependencies": { @@ -1191,38 +656,9 @@ "react-dom": "^18 || ^19" } }, - "node_modules/@graphiql/plugin-history/node_modules/zustand": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.9.tgz", - "integrity": "sha512-ALBtUj0AfjJt3uNRQoL1tL2tMvj6Gp/6e39dnfT6uzpelGru8v1tPOGBzayOWbPJvujM8JojDk3E1LxeFisBNg==", - "license": "MIT", - "engines": { - "node": ">=12.20.0" - }, - "peerDependencies": { - "@types/react": ">=18.0.0", - "immer": ">=9.0.6", - "react": ">=18.0.0", - "use-sync-external-store": ">=1.2.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - }, - "use-sync-external-store": { - "optional": true - } - } - }, "node_modules/@graphiql/react": { "version": "0.35.6", - "resolved": "https://registry.npmjs.org/@graphiql/react/-/react-0.35.6.tgz", + "resolved": "https://registry.npmmirror.com/@graphiql/react/-/react-0.35.6.tgz", "integrity": "sha512-WGel05bOBTL4qdaoZ3IPox4JbEEWzDA0EeZDcqNAamyaVemdco2khXeOHSSsusf6no7kjXlW54qzj5KkMdbZkQ==", "license": "MIT", "dependencies": { @@ -1250,39 +686,34 @@ "react-dom": "^18 || ^19" } }, + "node_modules/@graphiql/react/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/@graphiql/react/node_modules/monaco-editor": { "version": "0.52.2", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", + "resolved": "https://registry.npmmirror.com/monaco-editor/-/monaco-editor-0.52.2.tgz", "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", "license": "MIT" }, - "node_modules/@graphiql/react/node_modules/zustand": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.9.tgz", - "integrity": "sha512-ALBtUj0AfjJt3uNRQoL1tL2tMvj6Gp/6e39dnfT6uzpelGru8v1tPOGBzayOWbPJvujM8JojDk3E1LxeFisBNg==", + "node_modules/@graphiql/react/node_modules/monaco-graphql": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/monaco-graphql/-/monaco-graphql-1.8.0.tgz", + "integrity": "sha512-rWvWUpJdtpTu6YF2qgeaR2HnGPFthUJKSposB38f5wtBKwHlISYZHZLD/LukoMWDEyegNLOF/1bPMRs0SZrNzA==", "license": "MIT", - "engines": { - "node": ">=12.20.0" + "dependencies": { + "graphql-language-service": "^5.5.1", + "picomatch-browser": "^2.2.6" }, "peerDependencies": { - "@types/react": ">=18.0.0", - "immer": ">=9.0.6", - "react": ">=18.0.0", - "use-sync-external-store": ">=1.2.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - }, - "use-sync-external-store": { - "optional": true - } + "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", + "monaco-editor": ">= 0.20.0 < 0.53", + "prettier": "^2.8.0 || ^3.0.0" } }, "node_modules/@graphiql/toolkit": { @@ -1305,9 +736,9 @@ } }, "node_modules/@headlessui/react": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.2.9.tgz", - "integrity": "sha512-Mb+Un58gwBn0/yWZfyrCh0TJyurtT+dETj7YHleylHk5od3dv2XqETPGWMyQ5/7sYN7oWdyM1u9MvC0OC8UmzQ==", + "version": "2.2.10", + "resolved": "https://registry.npmmirror.com/@headlessui/react/-/react-2.2.10.tgz", + "integrity": "sha512-5pVLNK9wlpxTUTy9GpgbX/SdcRh+HBnPktjM2wbiLTH4p+2EPHBO1aoSryUCuKUIItdDWO9ITlhUL8UnUN/oIA==", "license": "MIT", "dependencies": { "@floating-ui/react": "^0.26.16", @@ -1372,6 +803,33 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@internationalized/date": { + "version": "3.12.3", + "resolved": "https://registry.npmmirror.com/@internationalized/date/-/date-3.12.3.tgz", + "integrity": "sha512-fuLX+3ZKLsxI73y8b01EG/WjHb6gE6weCqlfawPO27kBWGMh9G1yH6Csv1uU7/cac9H2GHmOMt6CjmuQ1aia4Q==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@internationalized/number": { + "version": "3.6.7", + "resolved": "https://registry.npmmirror.com/@internationalized/number/-/number-3.6.7.tgz", + "integrity": "sha512-3ji1fcrT+FPAK86UqEhB/psHixYo6niWPJtt7+qRaYFynt/BaJG8GhAPimtWUpEiVSTq8ZM8L5psMxGquiB/Vg==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@internationalized/string": { + "version": "3.2.10", + "resolved": "https://registry.npmmirror.com/@internationalized/string/-/string-3.2.10.tgz", + "integrity": "sha512-PDx6//vHSpRnHfxqMqto11zQvhsaU74O3mKv2F/0eicGZcl9NLjQmGlbHz/LsJh5tLKp4A4L7ZVTzN1/MmMTvA==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -1482,19 +940,45 @@ "node": ">= 8" } }, + "node_modules/@oxc-project/types": { + "version": "0.146.0", + "resolved": "https://registry.npmmirror.com/@oxc-project/types/-/types-0.146.0.tgz", + "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@playwright/test": { + "version": "1.62.1", + "resolved": "https://registry.npmmirror.com/@playwright/test/-/test-1.62.1.tgz", + "integrity": "sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.62.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/@radix-ui/primitive": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", - "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "version": "1.1.7", + "resolved": "https://registry.npmmirror.com/@radix-ui/primitive/-/primitive-1.1.7.tgz", + "integrity": "sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==", "license": "MIT" }, "node_modules/@radix-ui/react-arrow": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", - "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "version": "1.1.15", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-arrow/-/react-arrow-1.1.15.tgz", + "integrity": "sha512-v4zggRcjadnI+ClKDuijlQEW4tw3NoaeHc/PwpKnLoLLKNUG4InLegkstooLcRIUWCs+8L22dGURCVuFfOKfnA==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.3" + "@radix-ui/react-primitive": "2.1.10" }, "peerDependencies": { "@types/react": "*", @@ -1512,15 +996,15 @@ } }, "node_modules/@radix-ui/react-collection": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", - "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "version": "1.1.15", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-collection/-/react-collection-1.1.15.tgz", + "integrity": "sha512-9W+B9NPF0NaaPh/1NJd3+KqsnlLqU9H7T2rvww+fp+T/evVXdNAyYcnfRQZFOjkR1ajQp3yORlqnI8soawLvNA==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3" }, "peerDependencies": { "@types/react": "*", @@ -1538,9 +1022,9 @@ } }, "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.5.tgz", + "integrity": "sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -1553,9 +1037,9 @@ } }, "node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-context/-/react-context-1.2.2.tgz", + "integrity": "sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -1568,25 +1052,26 @@ } }, "node_modules/@radix-ui/react-dialog": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", - "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", + "version": "1.1.23", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-dialog/-/react-dialog-1.1.23.tgz", + "integrity": "sha512-Ksw4WeROkO4rC9k/onilX/Ao2Cr1ku1unMNH+XSCcP4jSXYu7HDsg9n4ojMjVb22XpYjAQ9qfrFlVbru1vXDUA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" + "react-remove-scroll": "^2.7.2" }, "peerDependencies": { "@types/react": "*", @@ -1604,9 +1089,9 @@ } }, "node_modules/@radix-ui/react-direction": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", - "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-direction/-/react-direction-1.1.4.tgz", + "integrity": "sha512-5pzg4FGQNpExhnhT2zlrP1wZFaYCd1K0nYWoFAdcYoYK868IEigqMX3B3f8yIoRlAhAeDWciLI6ZdCKHF9P4Vg==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -1619,16 +1104,16 @@ } }, "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", - "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "version": "1.1.19", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.19.tgz", + "integrity": "sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-escape-keydown": "1.1.1" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-effect-event": "0.0.5" }, "peerDependencies": { "@types/react": "*", @@ -1646,18 +1131,18 @@ } }, "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", - "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==", + "version": "2.1.24", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.24.tgz", + "integrity": "sha512-geq8l2rJkxvkXsT9RMgtUE3P8pITFpTsvYpbySi1IH4fZEABD/Gp85myayFgxk0ktljGMJnCbeFkyTusvSvv7g==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-menu": "2.1.16", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-menu": "2.1.24", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -1675,9 +1160,9 @@ } }, "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", - "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "version": "1.1.6", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.6.tgz", + "integrity": "sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -1690,14 +1175,14 @@ } }, "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", - "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "version": "1.1.16", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.16.tgz", + "integrity": "sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1" + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -1715,12 +1200,12 @@ } }, "node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-id/-/react-id-1.1.4.tgz", + "integrity": "sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -1733,29 +1218,29 @@ } }, "node_modules/@radix-ui/react-menu": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", - "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", + "version": "2.1.24", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-menu/-/react-menu-2.1.24.tgz", + "integrity": "sha512-uW7RVuU6Lp/ZtfeY4b3kL32zccgEWvPv1+cf17ubYzHa9cL8AHokmk36cG/XEiH/smbQvumnieXX9j/e9RqJWA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-callback-ref": "1.1.4", "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" + "react-remove-scroll": "^2.7.2" }, "peerDependencies": { "@types/react": "*", @@ -1773,21 +1258,21 @@ } }, "node_modules/@radix-ui/react-popper": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", - "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", + "version": "1.3.7", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-popper/-/react-popper-1.3.7.tgz", + "integrity": "sha512-UsJrrd7w4wuKKTdvd/DNERVlwSlUcyXzjhyDwBk+3aPOsCjOY6ZSbxuw8E6lZTjjfP8Cpd0J8VVkrYUWyGYXyg==", "license": "MIT", "dependencies": { "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-rect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/rect": "1.1.1" + "@radix-ui/react-arrow": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-rect": "1.1.4", + "@radix-ui/react-use-size": "1.1.4", + "@radix-ui/rect": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -1805,13 +1290,13 @@ } }, "node_modules/@radix-ui/react-portal": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", - "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "version": "1.1.17", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-portal/-/react-portal-1.1.17.tgz", + "integrity": "sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -1829,13 +1314,12 @@ } }, "node_modules/@radix-ui/react-presence": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", - "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "version": "1.1.10", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-presence/-/react-presence-1.1.10.tgz", + "integrity": "sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -1853,12 +1337,12 @@ } }, "node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "version": "2.1.10", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-primitive/-/react-primitive-2.1.10.tgz", + "integrity": "sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.2.3" + "@radix-ui/react-slot": "1.3.3" }, "peerDependencies": { "@types/react": "*", @@ -1876,20 +1360,22 @@ } }, "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", - "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "version": "1.1.19", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.19.tgz", + "integrity": "sha512-V9jI6hDjT7l3jsCQD9bLNvDLM3tH/gdbOTp7Tefp3hbbgCGQoK7tUvrWiRlcoBHIZ809ElXwNQwVo0B98LuTXQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-is-hydrated": "0.1.3", + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -1907,12 +1393,12 @@ } }, "node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-slot/-/react-slot-1.3.3.tgz", + "integrity": "sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" + "@radix-ui/react-compose-refs": "1.1.5" }, "peerDependencies": { "@types/react": "*", @@ -1925,46 +1411,24 @@ } }, "node_modules/@radix-ui/react-tooltip": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", - "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", - "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" + "version": "1.2.16", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-tooltip/-/react-tooltip-1.2.16.tgz", + "integrity": "sha512-6EamKFRRnlpdadndbZ6LMwycfwkwPte1B42hs6QA0gYhjaOKqW4PZ4pjaW9UrlDX5eVt/OjncE7BFTPL5nmZhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11" }, "peerDependencies": { "@types/react": "*", @@ -1982,9 +1446,9 @@ } }, "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", - "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.4.tgz", + "integrity": "sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -1997,13 +1461,14 @@ } }, "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "version": "1.2.6", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.6.tgz", + "integrity": "sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-use-effect-event": "0.0.5", + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -2016,12 +1481,12 @@ } }, "node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", - "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "version": "0.0.5", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.5.tgz", + "integrity": "sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -2033,14 +1498,11 @@ } } }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", - "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "node_modules/@radix-ui/react-use-is-hydrated": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.3.tgz", + "integrity": "sha512-umO/aJ+82CpOnhDZUTbILCQf7kU/g0iv+oGs/Q8jw7IkhWBzaEP4sA268PhFAJTFetbwp3ICc6ktpI4TqtxcIw==", "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.1" - }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -2052,9 +1514,9 @@ } }, "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.4.tgz", + "integrity": "sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -2067,12 +1529,12 @@ } }, "node_modules/@radix-ui/react-use-rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", - "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-rect/-/react-use-rect-1.1.4.tgz", + "integrity": "sha512-cSOCh6JlkmfjLyNcLiu2nB4v+nm+dkZ+Q5KHWk/soo4U7ZLiEQFKHK9/YmtBHjfCEaU43IBKQOc4/uJmCaiCTQ==", "license": "MIT", "dependencies": { - "@radix-ui/rect": "1.1.1" + "@radix-ui/rect": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -2085,12 +1547,12 @@ } }, "node_modules/@radix-ui/react-use-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", - "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-size/-/react-use-size-1.1.4.tgz", + "integrity": "sha512-D3anSY15EJoxrihpsXI6SMrmmonnQtR2ni7arO+Lfdg3O95b9hNXxONk8jA5C8ANdF/h5HMAxejgs8PWJ6rlhw==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -2103,35 +1565,12 @@ } }, "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.4.tgz", - "integrity": "sha512-kaeiyGCe844dkb9AVF+rb4yTyb1LiLN/e3es3nLiRyN4dC8AduBYPMnnNlDjX2VDOcvDEiPnRNMJeWCfsX0txg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-visually-hidden/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "version": "1.2.11", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.11.tgz", + "integrity": "sha512-NFS86RYYZb4/exihaESBGOpMJFz8MGLAfu3mOBSGByVnVPC9JPASfYubxd/8KbkQK0sYAv8lVQDEQukDX/qXvQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.2.4" + "@radix-ui/react-primitive": "2.1.10" }, "peerDependencies": { "@types/react": "*", @@ -2148,34 +1587,16 @@ } } }, - "node_modules/@radix-ui/react-visually-hidden/node_modules/@radix-ui/react-slot": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", - "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", - "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/@radix-ui/rect/-/rect-1.1.3.tgz", + "integrity": "sha512-JtyZR+mqgBibTo8xea3B6ZRmzZiM/YeVBtUkas6zMuXjAlfIFIW2FgqeM9eLyvEaYX66vr6DJMK+4U6LV0KhNw==", "license": "MIT" }, "node_modules/@rc-component/async-validator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.1.0.tgz", - "integrity": "sha512-n4HcR5siNUXRX23nDizbZBQPO0ZM/5oTtmKZ6/eqL0L2bo747cklFdZGRN2f+c9qWGICwDzrhW0H7tE9PptdcA==", + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/@rc-component/async-validator/-/async-validator-5.1.2.tgz", + "integrity": "sha512-WYbrZSjzznU1ekD0qFq2qRxt309VoS61MTG5npnFQlKYcoy9IzU8T+ZCIhq5bGAXRbXysABFWTspicMfmWFwow==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.4" @@ -2186,7 +1607,7 @@ }, "node_modules/@rc-component/cascader": { "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@rc-component/cascader/-/cascader-1.11.0.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/cascader/-/cascader-1.11.0.tgz", "integrity": "sha512-VDiEsskThWi8l0/1Nquc9I4ytcMKQYAb9Jkm6wiX5O5fpcMRsm+b8OulBMbr/b4rFTl/2y2y4GdKqQ+2whD+XQ==", "license": "MIT", "dependencies": { @@ -2200,18 +1621,9 @@ "react-dom": ">=18.0.0" } }, - "node_modules/@rc-component/cascader/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/checkbox": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rc-component/checkbox/-/checkbox-1.0.1.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/checkbox/-/checkbox-1.0.1.tgz", "integrity": "sha512-08yTH8m+bSm8TOqbybbJ9KiAuIATti6bDs2mVeSfu4QfEnyeF6X0enHVvD1NEAyuBWEAo56QtLe++MYs2D9XiQ==", "license": "MIT", "dependencies": { @@ -2223,18 +1635,9 @@ "react-dom": ">=16.9.0" } }, - "node_modules/@rc-component/checkbox/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/collapse": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rc-component/collapse/-/collapse-1.2.0.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/collapse/-/collapse-1.2.0.tgz", "integrity": "sha512-ZRYSKSS39qsFx93p26bde7JUZJshsUBEQRlRXPuJYlAiNX0vyYlF5TsAm8JZN3LcF8XvKikdzPbgAtXSbkLUkw==", "license": "MIT", "dependencies": { @@ -2248,18 +1651,9 @@ "react-dom": ">=18.0.0" } }, - "node_modules/@rc-component/collapse/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/color-picker": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-3.0.3.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/color-picker/-/color-picker-3.0.3.tgz", "integrity": "sha512-V7gFF9O7o5XwIWafdbOtqI4BUUkEUkgdBwp6favy3xajMX/2dDqytFaiXlcwrpq6aRyPLp5dKLAG5RFKLXMeGA==", "license": "MIT", "dependencies": { @@ -2272,37 +1666,28 @@ "react-dom": ">=16.9.0" } }, - "node_modules/@rc-component/color-picker/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/context": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-2.0.1.tgz", - "integrity": "sha512-HyZbYm47s/YqtP6pKXNMjPEMaukyg7P0qVfgMLzr7YiFNMHbK2fKTAGzms9ykfGHSfyf75nBbgWw+hHkp+VImw==", + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/@rc-component/context/-/context-2.0.2.tgz", + "integrity": "sha512-uiGpAlblCNlziHPwj4S4Iy/oemeuz/hR03mbiEjTCXwsqOIN3BOzsRMyDwpyO5Fm0vIEEJRUf9ZtbRLbhksuTA==", "license": "MIT", "dependencies": { - "@rc-component/util": "^1.3.0" + "@rc-component/util": "^1.11.0" }, "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "react": ">=18.0.0", + "react-dom": ">=18.0.0" } }, "node_modules/@rc-component/dialog": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@rc-component/dialog/-/dialog-1.8.0.tgz", - "integrity": "sha512-zGksezfULKixYCIWctIhUC2M3zUJrc81JKWbi9dJrQdPaM7J+8vSOrhLoOHHkZFpBpb2Ri6JqnSuGYb2N+FrRA==", + "version": "1.8.4", + "resolved": "https://registry.npmmirror.com/@rc-component/dialog/-/dialog-1.8.4.tgz", + "integrity": "sha512-Ay6PM7phkTkquplG8fWfUGFZ2GTLx9diTl4f0d8Eqxd7W1u1KjE9AQooFQHOHnhZf0Ya3z51+5EKCWHmt/dNEw==", "license": "MIT", "dependencies": { "@rc-component/motion": "^1.1.3", "@rc-component/portal": "^2.1.0", - "@rc-component/util": "^1.5.0", + "@rc-component/util": "^1.9.0", "clsx": "^2.1.1" }, "peerDependencies": { @@ -2310,24 +1695,15 @@ "react-dom": ">=18.0.0" } }, - "node_modules/@rc-component/dialog/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/drawer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@rc-component/drawer/-/drawer-1.4.0.tgz", - "integrity": "sha512-Zr1j1LRLDauz4a5JXHEmeYQfvEzfh4CddNa7tszyJnfd5GySYdZ5qLO63Tt2tgG4k+qi6tkFDKmcT46ikZfzbQ==", + "version": "1.4.2", + "resolved": "https://registry.npmmirror.com/@rc-component/drawer/-/drawer-1.4.2.tgz", + "integrity": "sha512-1ib+fZEp6FBu+YvcIktm+nCQ+Q+qIpwpoaJH6opGr4ofh2QMq+qdr5DLC4oCf5qf3pcWX9lUWPYX652k4ini8Q==", "license": "MIT", "dependencies": { "@rc-component/motion": "^1.1.4", "@rc-component/portal": "^2.1.3", - "@rc-component/util": "^1.2.1", + "@rc-component/util": "^1.9.0", "clsx": "^2.1.1" }, "peerDependencies": { @@ -2335,23 +1711,14 @@ "react-dom": ">=18.0.0" } }, - "node_modules/@rc-component/drawer/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/dropdown": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rc-component/dropdown/-/dropdown-1.0.2.tgz", - "integrity": "sha512-6PY2ecUSYhDPhkNHHb4wfeAya04WhpmUSKzdR60G+kMNVUCX2vjT/AgTS0Lz0I/K6xrPMJ3enQbwVpeN3sHCgg==", + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@rc-component/dropdown/-/dropdown-1.0.3.tgz", + "integrity": "sha512-YTST/N6kpqpDz3IMuM/PSSZnrDpSOA6dgHv12gPA90ZTSLv2CoqkZ0+9NtwTY6BeO7dstPblSic2QJg7dSFy/g==", "license": "MIT", "dependencies": { "@rc-component/trigger": "^3.0.0", - "@rc-component/util": "^1.2.1", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "peerDependencies": { @@ -2359,18 +1726,9 @@ "react-dom": ">=16.11.0" } }, - "node_modules/@rc-component/dropdown/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/form": { "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@rc-component/form/-/form-1.6.2.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/form/-/form-1.6.2.tgz", "integrity": "sha512-OgIn2RAoaSBqaIgzJf/X6iflIa9LpTozci1lagLBdURDFhGA370v0+T0tXxOi8YShMjTha531sFhwtnrv+EJaQ==", "license": "MIT", "dependencies": { @@ -2386,18 +1744,9 @@ "react-dom": ">=16.9.0" } }, - "node_modules/@rc-component/form/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/image": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@rc-component/image/-/image-1.6.0.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/image/-/image-1.6.0.tgz", "integrity": "sha512-tSfn2ZE/oP082g4QIOxeehkmgnXB7R+5AFj/lIFr4k7pEuxHBdyGIq9axoCY9qea8NN0DY6p4IB/F07tLqaT5A==", "license": "MIT", "dependencies": { @@ -2411,18 +1760,9 @@ "react-dom": ">=16.9.0" } }, - "node_modules/@rc-component/image/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/input": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@rc-component/input/-/input-1.1.2.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/input/-/input-1.1.2.tgz", "integrity": "sha512-Q61IMR47piUBudgixJ30CciKIy9b1H95qe7GgEKOmSJVJXvFRWJllJfQry9tif+MX2cWFXWJf/RXz4kaCeq/Fg==", "license": "MIT", "dependencies": { @@ -2436,7 +1776,7 @@ }, "node_modules/@rc-component/input-number": { "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@rc-component/input-number/-/input-number-1.6.2.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/input-number/-/input-number-1.6.2.tgz", "integrity": "sha512-Gjcq7meZlCOiWN1t1xCC+7/s85humHVokTBI7PJgTfoyw5OWF74y3e6P8PHX104g9+b54jsodFIzyaj6p8LI9w==", "license": "MIT", "dependencies": { @@ -2449,27 +1789,9 @@ "react-dom": ">=16.9.0" } }, - "node_modules/@rc-component/input-number/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@rc-component/input/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/mentions": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@rc-component/mentions/-/mentions-1.6.0.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/mentions/-/mentions-1.6.0.tgz", "integrity": "sha512-KIkQNP6habNuTsLhUv0UGEOwG67tlmE7KNIJoQZZNggEZl5lQJTytFDb69sl5CK3TDdISCTjKP3nGEBKgT61CQ==", "license": "MIT", "dependencies": { @@ -2485,18 +1807,9 @@ "react-dom": ">=16.9.0" } }, - "node_modules/@rc-component/mentions/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/menu": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rc-component/menu/-/menu-1.2.0.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/menu/-/menu-1.2.0.tgz", "integrity": "sha512-VWwDuhvYHSnTGj4n6bV3ISrLACcPAzdPOq3d0BzkeiM5cve8BEYfvkEhNoM0PLzv51jpcejeyrLXeMVIJ+QJlg==", "license": "MIT", "dependencies": { @@ -2511,19 +1824,10 @@ "react-dom": ">=16.9.0" } }, - "node_modules/@rc-component/menu/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/mini-decimal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", - "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/@rc-component/mini-decimal/-/mini-decimal-1.1.4.tgz", + "integrity": "sha512-xiuXcaCwyOWpD8a8scdExFl+bntNphAW8XeenL1ig2en0AAZY0Pcp4pC0dI22qJ+NvxKn9RoNIoRdqYU3BLH4w==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0" @@ -2534,7 +1838,7 @@ }, "node_modules/@rc-component/motion": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@rc-component/motion/-/motion-1.1.6.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/motion/-/motion-1.1.6.tgz", "integrity": "sha512-aEQobs/YA0kqRvHIPjQvOytdtdRVyhf/uXAal4chBjxDu6odHckExJzjn2D+Ju1aKK6hx3pAs6BXdV9+86xkgQ==", "license": "MIT", "dependencies": { @@ -2546,18 +1850,9 @@ "react-dom": ">=16.9.0" } }, - "node_modules/@rc-component/motion/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/mutate-observer": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-2.0.1.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/mutate-observer/-/mutate-observer-2.0.1.tgz", "integrity": "sha512-AyarjoLU5YlxuValRi+w8JRH2Z84TBbFO2RoGWz9d8bSu0FqT8DtugH3xC3BV7mUwlmROFauyWuXFuq4IFbH+w==", "license": "MIT", "dependencies": { @@ -2573,7 +1868,7 @@ }, "node_modules/@rc-component/notification": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rc-component/notification/-/notification-1.2.0.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/notification/-/notification-1.2.0.tgz", "integrity": "sha512-OX3J+zVU7rvoJCikjrfW7qOUp7zlDeFBK2eA3SFbGSkDqo63Sl4Ss8A04kFP+fxHSxMDIS9jYVEZtU1FNCFuBA==", "license": "MIT", "dependencies": { @@ -2589,19 +1884,10 @@ "react-dom": ">=16.9.0" } }, - "node_modules/@rc-component/notification/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/overflow": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rc-component/overflow/-/overflow-1.0.0.tgz", - "integrity": "sha512-GSlBeoE0XTBi5cf3zl8Qh7Uqhn7v8RrlJ8ajeVpEkNe94HWy5l5BQ0Mwn2TVUq9gdgbfEMUmTX7tJFAg7mz0Rw==", + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@rc-component/overflow/-/overflow-1.0.1.tgz", + "integrity": "sha512-syfmgAABaHCnCDzPwHZ/2tuvIcpOO3jefYZMmfkN+pmo8HKTzsfhS57vxo4ksPdN0By+uWVJhJWNFozNBxi2eA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -2614,18 +1900,9 @@ "react-dom": ">=16.9.0" } }, - "node_modules/@rc-component/overflow/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/pagination": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rc-component/pagination/-/pagination-1.2.0.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/pagination/-/pagination-1.2.0.tgz", "integrity": "sha512-YcpUFE8dMLfSo6OARJlK6DbHHvrxz7pMGPGmC/caZSJJz6HRKHC1RPP001PRHCvG9Z/veD039uOQmazVuLJzlw==", "license": "MIT", "dependencies": { @@ -2637,19 +1914,10 @@ "react-dom": ">=16.9.0" } }, - "node_modules/@rc-component/pagination/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/picker": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@rc-component/picker/-/picker-1.9.0.tgz", - "integrity": "sha512-OLisdk8AWVCG9goBU1dWzuH5QlBQk8jktmQ6p0/IyBFwdKGwyIZOSjnBYo8hooHiTdl0lU+wGf/OfMtVBw02KQ==", + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/@rc-component/picker/-/picker-1.9.1.tgz", + "integrity": "sha512-9FBYYsvH3HMLICaPDA/1Th5FLaDkFa7qAtangIdlhKb3ZALaR745e9PsOhheJb6asS4QXc12ffiAcjdkZ4C5/g==", "license": "MIT", "dependencies": { "@rc-component/overflow": "^1.0.0", @@ -2684,22 +1952,13 @@ } } }, - "node_modules/@rc-component/picker/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/portal": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-2.2.0.tgz", - "integrity": "sha512-oc6FlA+uXCMiwArHsJyHcIkX4q6uKyndrPol2eWX8YPkAnztHOPsFIRtmWG4BMlGE5h7YIRE3NiaJ5VS8Lb1QQ==", + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/@rc-component/portal/-/portal-2.2.1.tgz", + "integrity": "sha512-ck+r1kW/JSv0wxPji3KN2ss9K6Z0qqwusw/mf/0JobXhZ8hC2ejZwCJObW/SvDi0uhA0VzmCnx0CaCci95tcmA==", "license": "MIT", "dependencies": { - "@rc-component/util": "^1.2.1", + "@rc-component/util": "^1.11.0", "clsx": "^2.1.1" }, "engines": { @@ -2710,42 +1969,24 @@ "react-dom": ">=18.0.0" } }, - "node_modules/@rc-component/portal/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/progress": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rc-component/progress/-/progress-1.0.2.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/progress/-/progress-1.0.2.tgz", "integrity": "sha512-WZUnH9eGxH1+xodZKqdrHke59uyGZSWgj5HBM5Kwk5BrTMuAORO7VJ2IP5Qbm9aH3n9x3IcesqHHR0NWPBC7fQ==", "license": "MIT", "dependencies": { "@rc-component/util": "^1.2.1", - "clsx": "^2.1.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, - "node_modules/@rc-component/progress/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, "node_modules/@rc-component/qrcode": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.1.1.tgz", - "integrity": "sha512-LfLGNymzKdUPjXUbRP+xOhIWY4jQ+YMj5MmWAcgcAq1Ij8XP7tRmAXqyuv96XvLUBE/5cA8hLFl9eO1JQMujrA==", + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/@rc-component/qrcode/-/qrcode-1.1.3.tgz", + "integrity": "sha512-aGv6alnn4HbDEsURzKP+jv13rbi1VxmAYfBNZr5GKF1iohMNWy5tAVoJ1E3cOvzMB1kbUPvCXchM6zSFlRGPhA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7" @@ -2760,7 +2001,7 @@ }, "node_modules/@rc-component/rate": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rc-component/rate/-/rate-1.0.1.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/rate/-/rate-1.0.1.tgz", "integrity": "sha512-bkXxeBqDpl5IOC7yL7GcSYjQx9G8H+6kLYQnNZWeBYq2OYIv1MONd6mqKTjnnJYpV0cQIU2z3atdW0j1kttpTw==", "license": "MIT", "dependencies": { @@ -2775,19 +2016,10 @@ "react-dom": ">=16.9.0" } }, - "node_modules/@rc-component/rate/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/resize-observer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@rc-component/resize-observer/-/resize-observer-1.1.1.tgz", - "integrity": "sha512-NfXXMmiR+SmUuKE1NwJESzEUYUFWIDUn2uXpxCTOLwiRUUakd62DRNFjRJArgzyFW8S5rsL4aX5XlyIXyC/vRA==", + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@rc-component/resize-observer/-/resize-observer-1.1.2.tgz", + "integrity": "sha512-t/Bb0W8uvL4PYKAB3YcChC+DlHh0Wt5kM7q/J+0qpVEUMLe7Hk5zuvc9km0hMnTFPSx5Z7Wu/fzCLN6erVLE8Q==", "license": "MIT", "dependencies": { "@rc-component/util": "^1.2.0" @@ -2799,7 +2031,7 @@ }, "node_modules/@rc-component/segmented": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@rc-component/segmented/-/segmented-1.3.0.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/segmented/-/segmented-1.3.0.tgz", "integrity": "sha512-5J/bJ01mbDnoA6P/FW8SxUvKn+OgUSTZJPzCNnTBntG50tzoP7DydGhqxp7ggZXZls7me3mc2EQDXakU3iTVFg==", "license": "MIT", "dependencies": { @@ -2813,19 +2045,10 @@ "react-dom": ">=16.0.0" } }, - "node_modules/@rc-component/segmented/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/select": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@rc-component/select/-/select-1.5.0.tgz", - "integrity": "sha512-Zz0hpToAfOdWo/1jj3dW5iooBNU8F6fVgVaYN4Jy1SL3Xcx2OO+IqiQnxqk/PjY6hg1HVt7LjkkrYvpJQyZxoQ==", + "version": "1.5.2", + "resolved": "https://registry.npmmirror.com/@rc-component/select/-/select-1.5.2.tgz", + "integrity": "sha512-7wqD5D4I2+fc5XoB4nzDDK656QPlDnFAUaxLljkU1wwSpi4+MZxndv9vgg7NQfveuuf0/ilUdOjuPg7NPl7Mmg==", "license": "MIT", "dependencies": { "@rc-component/overflow": "^1.0.0", @@ -2842,18 +2065,9 @@ "react-dom": "*" } }, - "node_modules/@rc-component/select/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/slider": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rc-component/slider/-/slider-1.0.1.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/slider/-/slider-1.0.1.tgz", "integrity": "sha512-uDhEPU1z3WDfCJhaL9jfd2ha/Eqpdfxsn0Zb0Xcq1NGQAman0TWaR37OWp2vVXEOdV2y0njSILTMpTfPV1454g==", "license": "MIT", "dependencies": { @@ -2868,18 +2082,9 @@ "react-dom": ">=16.9.0" } }, - "node_modules/@rc-component/slider/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/steps": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rc-component/steps/-/steps-1.2.2.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/steps/-/steps-1.2.2.tgz", "integrity": "sha512-/yVIZ00gDYYPHSY0JP+M+s3ZvuXLu2f9rEjQqiUDs7EcYsUYrpJ/1bLj9aI9R7MBR3fu/NGh6RM9u2qGfqp+Nw==", "license": "MIT", "dependencies": { @@ -2894,18 +2099,9 @@ "react-dom": ">=16.9.0" } }, - "node_modules/@rc-component/steps/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/switch": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rc-component/switch/-/switch-1.0.3.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/switch/-/switch-1.0.3.tgz", "integrity": "sha512-Jgi+EbOBquje/XNdofr7xbJQZPYJP+BlPfR0h+WN4zFkdtB2EWqEfvkXJWeipflwjWip0/17rNbxEAqs8hVHfw==", "license": "MIT", "dependencies": { @@ -2917,18 +2113,9 @@ "react-dom": ">=16.9.0" } }, - "node_modules/@rc-component/switch/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/table": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@rc-component/table/-/table-1.9.1.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/table/-/table-1.9.1.tgz", "integrity": "sha512-FVI5ZS/GdB3BcgexfCYKi3iHhZS3Fr59EtsxORszYGrfpH1eWr33eDNSYkVfLI6tfJ7vftJDd9D5apfFWqkdJg==", "license": "MIT", "dependencies": { @@ -2946,18 +2133,9 @@ "react-dom": ">=18.0.0" } }, - "node_modules/@rc-component/table/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/tabs": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@rc-component/tabs/-/tabs-1.7.0.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/tabs/-/tabs-1.7.0.tgz", "integrity": "sha512-J48cs2iBi7Ho3nptBxxIqizEliUC+ExE23faspUQKGQ550vaBlv3aGF8Epv/UB1vFWeoJDTW/dNzgIU0Qj5i/w==", "license": "MIT", "dependencies": { @@ -2976,18 +2154,9 @@ "react-dom": ">=16.9.0" } }, - "node_modules/@rc-component/tabs/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/textarea": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@rc-component/textarea/-/textarea-1.1.2.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/textarea/-/textarea-1.1.2.tgz", "integrity": "sha512-9rMUEODWZDMovfScIEHXWlVZuPljZ2pd1LKNjslJVitn4SldEzq5vO1CL3yy3Dnib6zZal2r2DPtjy84VVpF6A==", "license": "MIT", "dependencies": { @@ -3001,18 +2170,9 @@ "react-dom": ">=16.9.0" } }, - "node_modules/@rc-component/textarea/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/tooltip": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@rc-component/tooltip/-/tooltip-1.4.0.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/tooltip/-/tooltip-1.4.0.tgz", "integrity": "sha512-8Rx5DCctIlLI4raR0I0xHjVTf1aF48+gKCNeAAo5bmF5VoR5YED+A/XEqzXv9KKqrJDRcd3Wndpxh2hyzrTtSg==", "license": "MIT", "dependencies": { @@ -3025,18 +2185,9 @@ "react-dom": ">=18.0.0" } }, - "node_modules/@rc-component/tooltip/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/tour": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-2.3.0.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/tour/-/tour-2.3.0.tgz", "integrity": "sha512-K04K9r32kUC+auBSQfr+Fss4SpSIS9JGe56oq/ALAX0p+i2ylYOI1MgR83yBY7v96eO6ZFXcM/igCQmubps0Ow==", "license": "MIT", "dependencies": { @@ -3053,18 +2204,9 @@ "react-dom": ">=16.9.0" } }, - "node_modules/@rc-component/tour/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/tree": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rc-component/tree/-/tree-1.1.0.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/tree/-/tree-1.1.0.tgz", "integrity": "sha512-HZs3aOlvFgQdgrmURRc/f4IujiNBf4DdEeXUlkS0lPoLlx9RoqsZcF0caXIAMVb+NaWqKtGQDnrH8hqLCN5zlA==", "license": "MIT", "dependencies": { @@ -3083,7 +2225,7 @@ }, "node_modules/@rc-component/tree-select": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@rc-component/tree-select/-/tree-select-1.6.0.tgz", + "resolved": "https://registry.npmmirror.com/@rc-component/tree-select/-/tree-select-1.6.0.tgz", "integrity": "sha512-UvEGmZT+gcVvRwImAZg3/sXw9nUdn4FmCs1rSIMWjEXEIAo0dTGmIyWuLCvs+1rGe9AZ7CHMPiQUEbdadwV0fw==", "license": "MIT", "dependencies": { @@ -3097,34 +2239,16 @@ "react-dom": "*" } }, - "node_modules/@rc-component/tree-select/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@rc-component/tree/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/trigger": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-3.9.0.tgz", - "integrity": "sha512-X8btpwfrT27AgrZVOz4swclhEHTZcqaHeQMXXBgveagOiakTa36uObXbdwerXffgV8G9dH1fAAE0DHtVQs8EHg==", + "version": "3.10.1", + "resolved": "https://registry.npmmirror.com/@rc-component/trigger/-/trigger-3.10.1.tgz", + "integrity": "sha512-mXlDN0IXdtV8Yqqm8195ECCyrbmfvvfKvwVvSlH0+qvKD6BUF8gRhEjSy0FOcD1+CcDRHgTiX99LoxfQrmh3Cw==", "license": "MIT", "dependencies": { - "@rc-component/motion": "^1.1.4", - "@rc-component/portal": "^2.2.0", - "@rc-component/resize-observer": "^1.1.1", - "@rc-component/util": "^1.2.1", + "@rc-component/motion": "^1.3.3", + "@rc-component/portal": "^2.2.1", + "@rc-component/resize-observer": "^1.1.2", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "engines": { @@ -3135,22 +2259,27 @@ "react-dom": ">=18.0.0" } }, - "node_modules/@rc-component/trigger/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "node_modules/@rc-component/trigger/node_modules/@rc-component/motion": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/@rc-component/motion/-/motion-1.3.3.tgz", + "integrity": "sha512-Xh3IszxvlSv3/PLYFyC2UZi9LNB83yOnkB/LNmRzaypZLvkhqUIPS7MQpGZcCMWrNsXV2p6YTSWbSGvFpEle9A==", "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "@rc-component/util": "^1.11.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" } }, "node_modules/@rc-component/upload": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rc-component/upload/-/upload-1.1.0.tgz", - "integrity": "sha512-LIBV90mAnUE6VK5N4QvForoxZc4XqEYZimcp7fk+lkE4XwHHyJWxpIXQQwMU8hJM+YwBbsoZkGksL1sISWHQxw==", + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/@rc-component/upload/-/upload-1.1.1.tgz", + "integrity": "sha512-GvYWSKeaJTOxxC5p6+nOSadzfvXA1h8C/iHFPFZX+szH3JUXrvs+DLiW8YUTBgvMh8m63mJeHrlYlJzAlg+pDA==", "license": "MIT", "dependencies": { - "@rc-component/util": "^1.3.0", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "peerDependencies": { @@ -3158,42 +2287,27 @@ "react-dom": ">=16.9.0" } }, - "node_modules/@rc-component/upload/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@rc-component/util": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@rc-component/util/-/util-1.7.0.tgz", - "integrity": "sha512-tIvIGj4Vl6fsZFvWSkYw9sAfiCKUXMyhVz6kpKyZbwyZyRPqv2vxYZROdaO1VB4gqTNvUZFXh6i3APUiterw5g==", + "version": "1.12.0", + "resolved": "https://registry.npmmirror.com/@rc-component/util/-/util-1.12.0.tgz", + "integrity": "sha512-AEjPL8JVdohIITaiXokyjL9WQ6tKWWjAYK9QU16tGNE9JaQABBQy+hA4H2Lup5MgXy9yY3iLrbZJheuU13hTdQ==", "license": "MIT", "dependencies": { "is-mobile": "^5.0.0", - "react-is": "^18.2.0" + "react-is": "^19.2.7" }, "peerDependencies": { "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, - "node_modules/@rc-component/util/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" - }, "node_modules/@rc-component/virtual-list": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rc-component/virtual-list/-/virtual-list-1.0.2.tgz", - "integrity": "sha512-uvTol/mH74FYsn5loDGJxo+7kjkO4i+y4j87Re1pxJBs0FaeuMuLRzQRGaXwnMcV1CxpZLi2Z56Rerj2M00fjQ==", + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/@rc-component/virtual-list/-/virtual-list-1.5.1.tgz", + "integrity": "sha512-boqHxdtyWC88u8quYgEO49bcBy5fzRiOcnBge+N4nLzs2k8hUQ/yw7JE9dM6yCBE4jSm5YSHVCVMS+suBuJGKA==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.20.0", + "@babel/runtime": "^8.0.0", "@rc-component/resize-observer": "^1.0.1", "@rc-component/util": "^1.4.0", "clsx": "^2.1.1" @@ -3202,186 +2316,58 @@ "node": ">=8.x" }, "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "react": ">=18.0.0", + "react-dom": ">=18.0.0" } }, - "node_modules/@rc-component/virtual-list/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } + "node_modules/@rc-component/virtual-list/node_modules/@babel/runtime": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-8.0.0.tgz", + "integrity": "sha512-sL6cvO2IfkSu/iU+zs2S/w01B7A8V7suXSIKEN4hPFFdZoiPGxrj5pAG0lCaqLWiEIrjKzdznIWuaLcxPR53qw==", + "license": "MIT" }, "node_modules/@react-aria/focus": { - "version": "3.21.2", - "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.21.2.tgz", - "integrity": "sha512-JWaCR7wJVggj+ldmM/cb/DXFg47CXR55lznJhZBh4XVqJjMKwaOOqpT5vNN7kpC1wUpXicGNuDnJDN1S/+6dhQ==", + "version": "3.22.1", + "resolved": "https://registry.npmmirror.com/@react-aria/focus/-/focus-3.22.1.tgz", + "integrity": "sha512-CPxtkyrBi/HYY5P3lE/57sQ6qfa0lN8E55TOm89H0kNGv0lKt+/0zP7lWERzBjRr5IxBVrQX4gFEowBN52LPaA==", "license": "Apache-2.0", "dependencies": { - "@react-aria/interactions": "^3.25.6", - "@react-aria/utils": "^3.31.0", - "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" + "react-aria": "^3.48.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-aria/focus/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@react-aria/interactions": { - "version": "3.25.6", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.25.6.tgz", - "integrity": "sha512-5UgwZmohpixwNMVkMvn9K1ceJe6TzlRlAfuYoQDUuOkk62/JVJNDLAPKIf5YMRc7d2B0rmfgaZLMtbREb0Zvkw==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/ssr": "^3.9.10", - "@react-aria/utils": "^3.31.0", - "@react-stately/flags": "^3.1.2", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/ssr": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.10.tgz", - "integrity": "sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - }, - "engines": { - "node": ">= 12" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/utils": { - "version": "3.31.0", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.31.0.tgz", - "integrity": "sha512-ABOzCsZrWzf78ysswmguJbx3McQUja7yeGj6/vZo4JVsZNlxAN+E9rs381ExBRI0KzVo6iBTeX5De8eMZPJXig==", + "version": "3.28.1", + "resolved": "https://registry.npmmirror.com/@react-aria/interactions/-/interactions-3.28.1.tgz", + "integrity": "sha512-Bqb+HrD5I5MHS2SKBhISYqo2SW8Y2dfzgF/Y1lIJq7xqLxheo9vzxPGEHhz+XzkgGfoqEJx8A6a3C7uiqS3HWA==", "license": "Apache-2.0", "dependencies": { - "@react-aria/ssr": "^3.9.10", - "@react-stately/flags": "^3.1.2", - "@react-stately/utils": "^3.10.8", - "@react-types/shared": "^3.32.1", + "@react-types/shared": "^3.34.0", "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" + "react-aria": "^3.48.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-aria/utils/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@react-stately/flags": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.1.2.tgz", - "integrity": "sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - } - }, - "node_modules/@react-stately/utils": { - "version": "3.10.8", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.8.tgz", - "integrity": "sha512-SN3/h7SzRsusVQjQ4v10LaVsDc81jyyR0DD5HnsQitm/I5WDpaSr2nRHtyloPFU48jlql1XX/S04T2DLQM7Y3g==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, "node_modules/@react-types/shared": { - "version": "3.32.1", - "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.32.1.tgz", - "integrity": "sha512-famxyD5emrGGpFuUlgOP6fVW2h/ZaF405G5KDi3zPHzyjAWys/8W6NAVJtNbkCkhedmvL0xOhvt8feGXyXaw5w==", + "version": "3.36.1", + "resolved": "https://registry.npmmirror.com/@react-types/shared/-/shared-3.36.1.tgz", + "integrity": "sha512-AzsuD9OfxTOZMMvTRhlN3oHBwOmFN7tDh27LzqmHt4+uOgPhJT7ZM7/kVs/8/o0WxayMUIk3hBmCFRHv1FUoag==", "license": "Apache-2.0", "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@remix-run/router": { - "version": "1.23.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.1.tgz", - "integrity": "sha512-vDbaOzF7yT2Qs4vO6XV1MHcJv+3dgR1sT+l3B8xxOVhUC336prMvqrvsLL/9Dnw2xr6Qhz4J0dmS0llNAbnUmQ==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", - "dev": true - }, - "node_modules/@rollup/pluginutils": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", - "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", - "dev": 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/pluginutils/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.53.3", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", - "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.5.tgz", + "integrity": "sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==", "cpu": [ "arm" ], @@ -3390,26 +2376,15 @@ "optional": true, "os": [ "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", - "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", - "cpu": [ - "arm64" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", - "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.5.tgz", + "integrity": "sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==", "cpu": [ "arm64" ], @@ -3417,27 +2392,16 @@ "license": "MIT", "optional": true, "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", - "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", - "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.5.tgz", + "integrity": "sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==", "cpu": [ "arm64" ], @@ -3445,13 +2409,16 @@ "license": "MIT", "optional": true, "os": [ - "freebsd" - ] + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", - "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.5.tgz", + "integrity": "sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==", "cpu": [ "x64" ], @@ -3459,47 +2426,50 @@ "license": "MIT", "optional": true, "os": [ - "freebsd" - ] + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", - "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.5.tgz", + "integrity": "sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==", "cpu": [ - "arm" + "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ - "linux" - ] + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", - "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.5.tgz", + "integrity": "sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==", "cpu": [ "arm" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", - "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.5.tgz", + "integrity": "sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==", "cpu": [ "arm64" ], @@ -3511,12 +2481,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", - "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.5.tgz", + "integrity": "sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==", "cpu": [ "arm64" ], @@ -3528,29 +2501,15 @@ "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", - "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", - "cpu": [ - "loong64" - ], - "dev": true, - "libc": [ - "glibc" ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", - "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.5.tgz", + "integrity": "sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==", "cpu": [ "ppc64" ], @@ -3562,46 +2521,15 @@ "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", - "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", - "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", - "cpu": [ - "riscv64" ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", - "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.5.tgz", + "integrity": "sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==", "cpu": [ "s390x" ], @@ -3613,12 +2541,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", - "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.5.tgz", + "integrity": "sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==", "cpu": [ "x64" ], @@ -3630,12 +2561,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", - "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.5.tgz", + "integrity": "sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==", "cpu": [ "x64" ], @@ -3647,12 +2581,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", - "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.5.tgz", + "integrity": "sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==", "cpu": [ "arm64" ], @@ -3661,12 +2598,15 @@ "optional": true, "os": [ "openharmony" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", - "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.5.tgz", + "integrity": "sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==", "cpu": [ "arm64" ], @@ -3675,47 +2615,68 @@ "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", - "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz", + "integrity": "sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==", "cpu": [ - "ia32" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", - "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", - "cpu": [ - "x64" ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "dev": true, - "optional": true, - "os": [ - "win32" - ] + "license": "MIT" }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", - "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", - "cpu": [ - "x64" - ], + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", "dev": true, - "optional": true, - "os": [ - "win32" - ] + "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/pluginutils/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { "version": "8.0.0", @@ -3931,21 +2892,21 @@ } }, "node_modules/@swc/helpers": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", - "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", + "version": "0.5.23", + "resolved": "https://registry.npmmirror.com/@swc/helpers/-/helpers-0.5.23.tgz", + "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.8.0" } }, "node_modules/@tanstack/react-virtual": { - "version": "3.13.12", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.12.tgz", - "integrity": "sha512-Gd13QdxPSukP8ZrkbgS2RwoZseTTbQPLnQEn7HY/rqtM+8Zt95f7xKC7N0EsKs7aoz0WzZ+fditZux+F8EzYxA==", + "version": "3.14.10", + "resolved": "https://registry.npmmirror.com/@tanstack/react-virtual/-/react-virtual-3.14.10.tgz", + "integrity": "sha512-SRyoUbdFMRHuYXMijV5H4ZarQWpXkj3iANq8OFre+pybeVap8ZJjZ3Nz9bVjx4d8PfobVUQUdKyyyHYk3E+djw==", "license": "MIT", "dependencies": { - "@tanstack/virtual-core": "3.13.12" + "@tanstack/virtual-core": "3.17.8" }, "funding": { "type": "github", @@ -3957,9 +2918,9 @@ } }, "node_modules/@tanstack/virtual-core": { - "version": "3.13.12", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.12.tgz", - "integrity": "sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==", + "version": "3.17.8", + "resolved": "https://registry.npmmirror.com/@tanstack/virtual-core/-/virtual-core-3.17.8.tgz", + "integrity": "sha512-BfEvehNpOT75r5Ksc5xW6NZuXujTfb7nlSEyVu4XHG3gdxNg1KqXruWbDewXOUaUYIo4oRbSfkjIajz4MAT8tA==", "license": "MIT", "funding": { "type": "github", @@ -3972,85 +2933,50 @@ "integrity": "sha512-eAWQzAjPj18tKnDzmWstz4OyWewLUNBm9tdoN9LayzoboRktYx3Enk1ZXPmThj55L7c4VWYq/Bzq0A51znZfhw==", "dev": true }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.28.2" - } - }, "node_modules/@types/d3-color": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" + "resolved": "https://registry.npmmirror.com/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" }, "node_modules/@types/d3-drag": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "resolved": "https://registry.npmmirror.com/@types/d3-drag/-/d3-drag-3.0.7.tgz", "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-interpolate": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "resolved": "https://registry.npmmirror.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", "dependencies": { "@types/d3-color": "*" } }, "node_modules/@types/d3-selection": { "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", - "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==" + "resolved": "https://registry.npmmirror.com/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" }, "node_modules/@types/d3-transition": { "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "resolved": "https://registry.npmmirror.com/@types/d3-transition/-/d3-transition-3.0.9.tgz", "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-zoom": { "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "resolved": "https://registry.npmmirror.com/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", "dependencies": { "@types/d3-interpolate": "*", "@types/d3-selection": "*" @@ -4084,34 +3010,29 @@ "undici-types": "~6.21.0" } }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "devOptional": true - }, "node_modules/@types/react": { - "version": "18.3.27", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", - "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", + "version": "19.2.18", + "resolved": "https://registry.npmmirror.com/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", "devOptional": true, + "license": "MIT", "dependencies": { - "@types/prop-types": "*", "csstype": "^3.2.2" } }, "node_modules/@types/react-dom": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "version": "19.2.4", + "resolved": "https://registry.npmmirror.com/@types/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", "devOptional": true, + "license": "MIT", "peerDependencies": { - "@types/react": "^18.0.0" + "@types/react": "^19.2.0" } }, "node_modules/@types/trusted-types": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "resolved": "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.7.tgz", "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", "license": "MIT", "optional": true @@ -4374,43 +3295,93 @@ } }, "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-react/-/plugin-react-6.1.0.tgz", + "integrity": "sha512-qd2BzUBehkov86WFhg0JkEFEYyCLG9uPCe6qWTY/kRlss9OvJrOF2UbIWT7p+8IzZHkEu0DNGHc4HSv+JdDLsw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" + "@rolldown/pluginutils": "^1.0.1" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "oxc-transform-react": "^0.145.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "oxc-transform-react": { + "optional": true + } } }, "node_modules/@xyflow/react": { - "version": "12.9.3", - "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.9.3.tgz", - "integrity": "sha512-PSWoJ8vHiEqSIkLIkge+0eiHWiw4C6dyFDA03VKWJkqbU4A13VlDIVwKqf/Znuysn2GQw/zA61zpHE4rGgax7Q==", + "version": "12.11.3", + "resolved": "https://registry.npmmirror.com/@xyflow/react/-/react-12.11.3.tgz", + "integrity": "sha512-G3jogHz2GWUtIOkhavUGno2YzY9u6fILIJBttfsBendb0/HWB90JG+sOTAvlIMEwyvq9zgy9V9ZQSwyQjR5QzQ==", + "license": "MIT", "dependencies": { - "@xyflow/system": "0.0.73", + "@xyflow/system": "0.0.80", "classcat": "^5.0.3", "zustand": "^4.4.0" }, "peerDependencies": { + "@types/react": ">=17", + "@types/react-dom": ">=17", "react": ">=17", "react-dom": ">=17" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@xyflow/react/node_modules/zustand": { + "version": "4.5.7", + "resolved": "https://registry.npmmirror.com/zustand/-/zustand-4.5.7.tgz", + "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "^1.2.2" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } } }, "node_modules/@xyflow/system": { - "version": "0.0.73", - "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.73.tgz", - "integrity": "sha512-C2ymH2V4mYDkdVSiRx0D7R0s3dvfXiupVBcko6tXP5K4tVdSBMo22/e3V9yRNdn+2HQFv44RFKzwOyCcUUDAVQ==", + "version": "0.0.80", + "resolved": "https://registry.npmmirror.com/@xyflow/system/-/system-0.0.80.tgz", + "integrity": "sha512-ywc3ZqG91brzWrH1WlwMdIX4goOfrpBy6AbLdVSaof/Xx9l138ijIKRExM6EkMro2F+OImGmSiA/WKcXvKVcfA==", + "license": "MIT", "dependencies": { "@types/d3-drag": "^3.0.7", "@types/d3-interpolate": "^3.0.4", @@ -4444,6 +3415,18 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -4539,15 +3522,6 @@ "react-dom": ">=18.0.0" } }, - "node_modules/antd/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", @@ -4592,8 +3566,9 @@ }, "node_modules/asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" }, "node_modules/autoprefixer": { "version": "10.4.22", @@ -4633,13 +3608,15 @@ } }, "node_modules/axios": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", - "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "version": "1.19.0", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.19.0.tgz", + "integrity": "sha512-ht/iuYZXEjFxLH/Hkezgd7m6JKlHHXEUSneaDz8uZe1Gj5QZtCnpyDsckvAiEnT89OEbCLmnte4R4sn7P0EKFw==", + "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" + "follow-redirects": "^1.16.0", + "form-data": "^4.0.6", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" } }, "node_modules/balanced-match": { @@ -4726,8 +3703,9 @@ }, "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", + "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -4808,9 +3786,9 @@ "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==" }, "node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "license": "MIT", "engines": { "node": ">=6" @@ -4836,8 +3814,9 @@ }, "node_modules/combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -4863,6 +3842,19 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/cosmiconfig": { "version": "8.3.6", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", @@ -4922,24 +3914,27 @@ }, "node_modules/d3-color": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "resolved": "https://registry.npmmirror.com/d3-color/-/d3-color-3.1.0.tgz", "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-dispatch": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "resolved": "https://registry.npmmirror.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz", "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-drag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "resolved": "https://registry.npmmirror.com/d3-drag/-/d3-drag-3.0.0.tgz", "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" @@ -4950,16 +3945,18 @@ }, "node_modules/d3-ease": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "resolved": "https://registry.npmmirror.com/d3-ease/-/d3-ease-3.0.1.tgz", "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", "engines": { "node": ">=12" } }, "node_modules/d3-interpolate": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "resolved": "https://registry.npmmirror.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz", "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", "dependencies": { "d3-color": "1 - 3" }, @@ -4969,24 +3966,27 @@ }, "node_modules/d3-selection": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "resolved": "https://registry.npmmirror.com/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-timer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "resolved": "https://registry.npmmirror.com/d3-timer/-/d3-timer-3.0.1.tgz", "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-transition": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "resolved": "https://registry.npmmirror.com/d3-transition/-/d3-transition-3.0.1.tgz", "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", @@ -5003,8 +4003,9 @@ }, "node_modules/d3-zoom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "resolved": "https://registry.npmmirror.com/d3-zoom/-/d3-zoom-3.0.0.tgz", "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -5033,7 +4034,7 @@ }, "node_modules/debounce-promise": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/debounce-promise/-/debounce-promise-3.1.2.tgz", + "resolved": "https://registry.npmmirror.com/debounce-promise/-/debounce-promise-3.1.2.tgz", "integrity": "sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg==", "license": "MIT" }, @@ -5041,7 +4042,6 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "dependencies": { "ms": "^2.1.3" }, @@ -5062,12 +4062,23 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/detect-node-es": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", @@ -5087,9 +4098,9 @@ "dev": true }, "node_modules/dompurify": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.7.tgz", - "integrity": "sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==", + "version": "3.4.8", + "resolved": "https://registry.npmmirror.com/dompurify/-/dompurify-3.4.8.tgz", + "integrity": "sha512-yb1cEmaOum7wFvOCSQxyfgVlv5D47Rc30iZWoMpbDIWTnJ6grDDQyu2KFJzB2k7u0pMuJcQ1zphH//fFnw2tjQ==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" @@ -5107,8 +4118,9 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -5119,18 +4131,20 @@ } }, "node_modules/echarts": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.6.0.tgz", - "integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==", + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/echarts/-/echarts-6.1.0.tgz", + "integrity": "sha512-q0yaFPggC9FUdsWH4blavRWFmxdrIodbkoKNAjJudAI6CA9gNPxHtV2RcZNEepZVlk4yvBYkOkbk6HIVpIyHZA==", + "license": "Apache-2.0", "dependencies": { "tslib": "2.3.0", - "zrender": "5.6.1" + "zrender": "6.1.0" } }, "node_modules/echarts-for-react": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/echarts-for-react/-/echarts-for-react-3.0.5.tgz", - "integrity": "sha512-YpEI5Ty7O/2nvCfQ7ybNa+S90DwE8KYZWacGvJW4luUqywP7qStQ+pxDlYOmr4jGDu10mhEkiAuMKcUlT4W5vg==", + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/echarts-for-react/-/echarts-for-react-3.0.6.tgz", + "integrity": "sha512-4zqLgTGWS3JvkQDXjzkR1k1CHRdpd6by0988TWMJgnvDytegWLbeP/VNZmMa+0VJx2eD7Y632bi2JquXDgiGJg==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "size-sensor": "^1.0.1" @@ -5173,24 +4187,27 @@ }, "node_modules/es-define-property": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "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", + "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -5200,8 +4217,9 @@ }, "node_modules/es-set-tostringtag": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -5212,48 +4230,6 @@ "node": ">= 0.4" } }, - "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/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -5335,15 +4311,23 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", - "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, "engines": { - "node": ">=10" + "node": ">=18" }, "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" } }, "node_modules/eslint-plugin-react-refresh": { @@ -5562,15 +4546,16 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -5581,15 +4566,16 @@ } }, "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.6", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -5609,13 +4595,13 @@ } }, "node_modules/framer-motion": { - "version": "12.23.24", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.24.tgz", - "integrity": "sha512-HMi5HRoRCTou+3fb3h9oTLyJGBxHfW+HnNE25tAXOvVx/IvwMHK0cx7IR4a2ZU6sh3IX1Z+4ts32PcYBOqka8w==", + "version": "12.43.0", + "resolved": "https://registry.npmmirror.com/framer-motion/-/framer-motion-12.43.0.tgz", + "integrity": "sha512-1eaL3RvR/kAlbG7UYcpMptEyzPoENO0c6w7ZnB3/hh2vSAz/6uGAFn6fdoqTBguNstf3MsFhJHsD/0DHiclG+g==", "license": "MIT", "dependencies": { - "motion-dom": "^12.23.23", - "motion-utils": "^12.23.6", + "motion-dom": "^12.43.0", + "motion-utils": "^12.39.0", "tslib": "^2.4.0" }, "peerDependencies": { @@ -5669,8 +4655,9 @@ }, "node_modules/get-intrinsic": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -5701,8 +4688,9 @@ }, "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -5713,7 +4701,7 @@ }, "node_modules/get-value": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-3.0.1.tgz", + "resolved": "https://registry.npmmirror.com/get-value/-/get-value-3.0.1.tgz", "integrity": "sha512-mKZj9JLQrwMBtj5wxi6MH8Z5eSKaERpAwjg43dPtlGI1ZVEgH/qC7T8/6R2OBSUA+zzHBZgICsVJaEIV2tKTDA==", "license": "MIT", "dependencies": { @@ -5749,8 +4737,9 @@ }, "node_modules/gopd": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5798,9 +4787,9 @@ } }, "node_modules/graphql-language-service": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/graphql-language-service/-/graphql-language-service-5.5.0.tgz", - "integrity": "sha512-9EvWrLLkF6Y5e29/2cmFoAO6hBPPAZlCyjznmpR11iFtRydfkss+9m6x+htA8h7YznGam+TtJwS6JuwoWWgb2Q==", + "version": "5.5.2", + "resolved": "https://registry.npmmirror.com/graphql-language-service/-/graphql-language-service-5.5.2.tgz", + "integrity": "sha512-NJhgEKTArkyNPcy4NRUFdbpNs5/F99LcvXbNtmGzNGwwruN8tBE3YPMjpYmp8KpBQtOx3uSuvXJlOOE3Vy2KRQ==", "license": "MIT", "dependencies": { "debounce-promise": "^3.1.2", @@ -5825,8 +4814,9 @@ }, "node_modules/has-symbols": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5836,8 +4826,9 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -5849,9 +4840,10 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -5859,6 +4851,23 @@ "node": ">= 0.4" } }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmmirror.com/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmmirror.com/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, "node_modules/html-parse-stringify": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", @@ -5867,6 +4876,19 @@ "void-elements": "3.1.0" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/i18next": { "version": "23.16.8", "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.16.8.tgz", @@ -5988,7 +5010,7 @@ }, "node_modules/is-mobile": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-5.0.0.tgz", + "resolved": "https://registry.npmmirror.com/is-mobile/-/is-mobile-5.0.0.tgz", "integrity": "sha512-Tz/yndySvLAEXh+Uk8liFCxOwVH6YutuR74utvOcu7I9Di+DwM0mtdPVZNaVvvBUM2OXxne/NhOs1zAO7riusQ==", "license": "MIT" }, @@ -6003,7 +5025,7 @@ }, "node_modules/is-plain-object": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "license": "MIT", "dependencies": { @@ -6015,7 +5037,7 @@ }, "node_modules/is-primitive": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-3.0.1.tgz", + "resolved": "https://registry.npmmirror.com/is-primitive/-/is-primitive-3.0.1.tgz", "integrity": "sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==", "license": "MIT", "engines": { @@ -6030,7 +5052,7 @@ }, "node_modules/isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "license": "MIT", "engines": { @@ -6049,7 +5071,8 @@ "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==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "node_modules/js-yaml": { "version": "4.1.1", @@ -6101,7 +5124,7 @@ }, "node_modules/json2mq": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "resolved": "https://registry.npmmirror.com/json2mq/-/json2mq-0.2.0.tgz", "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", "license": "MIT", "dependencies": { @@ -6117,35 +5140,308 @@ "json5": "lib/cli.js" }, "engines": { - "node": ">=6" + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "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.npmmirror.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "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.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "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.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "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.npmmirror.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "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.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "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.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "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.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "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.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "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.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "license": "MIT" - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "json-buffer": "3.0.1" + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.8.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, "node_modules/lilconfig": { @@ -6167,9 +5463,20 @@ "dev": true }, "node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/linkify-it/-/linkify-it-5.0.2.tgz", + "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==", + "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" } @@ -6200,17 +5507,6 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, "node_modules/lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -6230,13 +5526,24 @@ } }, "node_modules/markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "version": "14.3.0", + "resolved": "https://registry.npmmirror.com/markdown-it/-/markdown-it-14.3.0.tgz", + "integrity": "sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw==", + "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.4.0", - "linkify-it": "^5.0.0", + "entities": "^4.5.0", + "linkify-it": "^5.0.2", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" @@ -6258,16 +5565,18 @@ }, "node_modules/math-intrinsics": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/mdurl/-/mdurl-2.1.0.tgz", + "integrity": "sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg==", + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", @@ -6310,16 +5619,18 @@ }, "node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "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", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -6340,50 +5651,34 @@ } }, "node_modules/monaco-editor": { - "version": "0.55.1", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.55.1.tgz", - "integrity": "sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==", + "version": "0.56.0", + "resolved": "https://registry.npmmirror.com/monaco-editor/-/monaco-editor-0.56.0.tgz", + "integrity": "sha512-sXboRm3BeBeLm938eaiyLMe0OxzfXIlZvbv4ir/jVgQy1zDhWjgmny0WoN45fuDKhCCQsYMbBJrv/A6jd8aCUg==", "license": "MIT", "dependencies": { - "dompurify": "3.2.7", + "dompurify": "3.4.8", "marked": "14.0.0" } }, - "node_modules/monaco-graphql": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/monaco-graphql/-/monaco-graphql-1.7.2.tgz", - "integrity": "sha512-iLw1L+pfQOISXGTLWRwjSrxcdP3pjS9ljJmerf2EfvTLBjGc1uwhRd+hnA8/LQVr7RXjrHVPkR6ToKVAvTOBEA==", - "license": "MIT", - "dependencies": { - "graphql-language-service": "^5.5.0", - "picomatch-browser": "^2.2.6" - }, - "peerDependencies": { - "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", - "monaco-editor": ">= 0.20.0 < 1", - "prettier": "^2.8.0 || ^3.0.0" - } - }, "node_modules/motion-dom": { - "version": "12.23.23", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.23.tgz", - "integrity": "sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==", + "version": "12.43.0", + "resolved": "https://registry.npmmirror.com/motion-dom/-/motion-dom-12.43.0.tgz", + "integrity": "sha512-azKON4d9S65PEoFUiQTMTgPheEmzf2QngdRc50AKfJp9Q9mmcBVw22c8eMq9k8kxOFHdL7+WZY7N/5F/lwiDag==", "license": "MIT", "dependencies": { - "motion-utils": "^12.23.6" + "motion-utils": "^12.39.0" } }, "node_modules/motion-utils": { - "version": "12.23.6", - "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz", - "integrity": "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==", + "version": "12.39.0", + "resolved": "https://registry.npmmirror.com/motion-utils/-/motion-utils-12.39.0.tgz", + "integrity": "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==", "license": "MIT" }, "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==", - "dev": true + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/mz": { "version": "2.7.0", @@ -6397,9 +5692,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "3.3.18", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "dev": true, "funding": [ { @@ -6407,6 +5702,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -6456,7 +5752,7 @@ }, "node_modules/nullthrows": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "resolved": "https://registry.npmmirror.com/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", "license": "MIT" }, @@ -6608,7 +5904,7 @@ }, "node_modules/picomatch-browser": { "version": "2.2.6", - "resolved": "https://registry.npmjs.org/picomatch-browser/-/picomatch-browser-2.2.6.tgz", + "resolved": "https://registry.npmmirror.com/picomatch-browser/-/picomatch-browser-2.2.6.tgz", "integrity": "sha512-0ypsOQt9D4e3hziV8O4elD9uN0z/jtUEfxVRtNaAAtXIyUx9m/SzlO020i8YNL2aL/E6blOvvHQcin6HZlFy/w==", "license": "MIT", "engines": { @@ -6636,10 +5932,57 @@ "node": ">= 6" } }, + "node_modules/playwright": { + "version": "1.62.1", + "resolved": "https://registry.npmmirror.com/playwright/-/playwright-1.62.1.tgz", + "integrity": "sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.62.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=20" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.62.1", + "resolved": "https://registry.npmmirror.com/playwright-core/-/playwright-core-1.62.1.tgz", + "integrity": "sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "version": "8.5.26", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", "dev": true, "funding": [ { @@ -6655,8 +5998,9 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.17", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -6802,9 +6146,9 @@ } }, "node_modules/prettier": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.3.tgz", - "integrity": "sha512-QgODejq9K3OzoBbuyobZlUhznP5SKwPqp+6Q6xw6o8gnhr4O85L2U915iM2IDcfF2NPXVaM9zlo9tdwipnYwzg==", + "version": "3.9.6", + "resolved": "https://registry.npmmirror.com/prettier/-/prettier-3.9.6.tgz", + "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" @@ -6817,9 +6161,13 @@ } }, "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } }, "node_modules/punycode": { "version": "2.3.1", @@ -6832,8 +6180,9 @@ }, "node_modules/punycode.js": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "resolved": "https://registry.npmmirror.com/punycode.js/-/punycode.js-2.3.1.tgz", "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -6859,16 +6208,35 @@ ] }, "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, + "version": "19.2.8", + "resolved": "https://registry.npmmirror.com/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/react-aria": { + "version": "3.51.0", + "resolved": "https://registry.npmmirror.com/react-aria/-/react-aria-3.51.0.tgz", + "integrity": "sha512-AyWLw0XR38cFPwBu/ErgGaVrc5dupLEKmRlMXTGvFKOtbaGRQ2+yQJkjVhpdHhoRhU4+G+tJDFeHDTS8tK3bfQ==", + "license": "Apache-2.0", + "dependencies": { + "@internationalized/date": "^3.12.3", + "@internationalized/number": "^3.6.7", + "@internationalized/string": "^3.2.10", + "@react-types/shared": "^3.36.1", + "@swc/helpers": "^0.5.0", + "aria-hidden": "^1.2.3", + "clsx": "^2.0.0", + "react-stately": "3.49.0", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, "node_modules/react-compiler-runtime": { "version": "19.1.0-rc.1", "resolved": "https://registry.npmjs.org/react-compiler-runtime/-/react-compiler-runtime-19.1.0-rc.1.tgz", @@ -6879,15 +6247,15 @@ } }, "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "version": "19.2.8", + "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^18.3.1" + "react": "^19.2.8" } }, "node_modules/react-i18next": { @@ -6915,14 +6283,11 @@ } } }, - "node_modules/react-refresh": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "node_modules/react-is": { + "version": "19.2.8", + "resolved": "https://registry.npmmirror.com/react-is/-/react-is-19.2.8.tgz", + "integrity": "sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==", + "license": "MIT" }, "node_modules/react-remove-scroll": { "version": "2.7.2", @@ -6972,33 +6337,58 @@ } }, "node_modules/react-router": { - "version": "6.30.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.2.tgz", - "integrity": "sha512-H2Bm38Zu1bm8KUE5NVWRMzuIyAV8p/JrOaBJAwVmp37AXG72+CZJlEBw6pdn9i5TBgLMhNDgijS4ZlblpHyWTA==", + "version": "7.18.2", + "resolved": "https://registry.npmmirror.com/react-router/-/react-router-7.18.2.tgz", + "integrity": "sha512-aUVMjFm3GAPTTZL7oYr5E7ETiqfQCHRLH+B+5afnICvf0r7kkK4eR6SMuwbSTJw/7t+12khT/Kahij49fqOCIg==", + "license": "MIT", "dependencies": { - "@remix-run/router": "1.23.1" + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" }, "peerDependencies": { - "react": ">=16.8" + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } } }, "node_modules/react-router-dom": { - "version": "6.30.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.2.tgz", - "integrity": "sha512-l2OwHn3UUnEVUqc6/1VMmR1cvZryZ3j3NzapC2eUXO1dB0sYp5mvwdjiXhpUbRb21eFow3qSxpP8Yv6oAU824Q==", + "version": "7.18.2", + "resolved": "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-7.18.2.tgz", + "integrity": "sha512-AIKJ/jgGlFb3EbfCXk5Gzshiwt+l3mqbCrNjmEWMMjqQxNJ3svBa6bgzFyCC2Sw3RA0VWF1kg3uQf2OFhxb8hw==", + "license": "MIT", "dependencies": { - "@remix-run/router": "1.23.1", - "react-router": "6.30.2" + "react-router": "7.18.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-stately": { + "version": "3.49.0", + "resolved": "https://registry.npmmirror.com/react-stately/-/react-stately-3.49.0.tgz", + "integrity": "sha512-13iNq2KzBrRAzxRc+n53hgROfIistiYY/sPtIhCw1qUB7/kmo+X1xEU2uiS5zcCIrc55AUPwoHqOIIpKWSwB9A==", + "license": "Apache-2.0", + "dependencies": { + "@internationalized/date": "^3.12.3", + "@internationalized/number": "^3.6.7", + "@internationalized/string": "^3.2.10", + "@react-types/shared": "^3.36.1", + "@swc/helpers": "^0.5.0", + "use-sync-external-store": "^1.6.0" }, "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "node_modules/react-style-singleton": { @@ -7071,45 +6461,38 @@ "node": ">=0.10.0" } }, - "node_modules/rollup": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", - "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", + "node_modules/rolldown": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/rolldown/-/rolldown-1.2.5.tgz", + "integrity": "sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==", "dev": true, + "license": "MIT", "dependencies": { - "@types/estree": "1.0.8" + "@oxc-project/types": "=0.146.0", + "@rolldown/pluginutils": "^1.0.0" }, "bin": { - "rollup": "dist/bin/rollup" + "rolldown": "bin/cli.mjs" }, "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" + "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.53.3", - "@rollup/rollup-android-arm64": "4.53.3", - "@rollup/rollup-darwin-arm64": "4.53.3", - "@rollup/rollup-darwin-x64": "4.53.3", - "@rollup/rollup-freebsd-arm64": "4.53.3", - "@rollup/rollup-freebsd-x64": "4.53.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", - "@rollup/rollup-linux-arm-musleabihf": "4.53.3", - "@rollup/rollup-linux-arm64-gnu": "4.53.3", - "@rollup/rollup-linux-arm64-musl": "4.53.3", - "@rollup/rollup-linux-loong64-gnu": "4.53.3", - "@rollup/rollup-linux-ppc64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-musl": "4.53.3", - "@rollup/rollup-linux-s390x-gnu": "4.53.3", - "@rollup/rollup-linux-x64-gnu": "4.53.3", - "@rollup/rollup-linux-x64-musl": "4.53.3", - "@rollup/rollup-openharmony-arm64": "4.53.3", - "@rollup/rollup-win32-arm64-msvc": "4.53.3", - "@rollup/rollup-win32-ia32-msvc": "4.53.3", - "@rollup/rollup-win32-x64-gnu": "4.53.3", - "@rollup/rollup-win32-x64-msvc": "4.53.3", - "fsevents": "~2.3.2" + "@rolldown/binding-android-arm-eabi": "1.2.5", + "@rolldown/binding-android-arm64": "1.2.5", + "@rolldown/binding-darwin-arm64": "1.2.5", + "@rolldown/binding-darwin-x64": "1.2.5", + "@rolldown/binding-freebsd-x64": "1.2.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.5", + "@rolldown/binding-linux-arm64-gnu": "1.2.5", + "@rolldown/binding-linux-arm64-musl": "1.2.5", + "@rolldown/binding-linux-ppc64-gnu": "1.2.5", + "@rolldown/binding-linux-s390x-gnu": "1.2.5", + "@rolldown/binding-linux-x64-gnu": "1.2.5", + "@rolldown/binding-linux-x64-musl": "1.2.5", + "@rolldown/binding-openharmony-arm64": "1.2.5", + "@rolldown/binding-win32-arm64-msvc": "1.2.5", + "@rolldown/binding-win32-x64-msvc": "1.2.5" } }, "node_modules/run-parallel": { @@ -7136,12 +6519,10 @@ } }, "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "dependencies": { - "loose-envify": "^1.1.0" - } + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" }, "node_modules/scroll-into-view-if-needed": { "version": "3.1.0", @@ -7161,9 +6542,15 @@ "semver": "bin/semver.js" } }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmmirror.com/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, "node_modules/set-value": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-4.1.0.tgz", + "resolved": "https://registry.npmmirror.com/set-value/-/set-value-4.1.0.tgz", "integrity": "sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw==", "funding": [ "https://github.com/sponsors/jonschlinkert", @@ -7231,7 +6618,7 @@ }, "node_modules/string-convert": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "resolved": "https://registry.npmmirror.com/string-convert/-/string-convert-0.2.1.tgz", "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==", "license": "MIT" }, @@ -7248,9 +6635,9 @@ } }, "node_modules/stylis": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", - "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/stylis/-/stylis-4.4.0.tgz", + "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==", "license": "MIT" }, "node_modules/sucrase": { @@ -7315,9 +6702,9 @@ "dev": true }, "node_modules/tabbable": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.3.0.tgz", - "integrity": "sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==", + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/tabbable/-/tabbable-6.5.0.tgz", + "integrity": "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==", "license": "MIT" }, "node_modules/tailwindcss": { @@ -7436,13 +6823,14 @@ } }, "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "version": "0.2.17", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, + "license": "MIT", "dependencies": { "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">=12.0.0" @@ -7469,10 +6857,11 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -7565,8 +6954,9 @@ }, "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==" + "resolved": "https://registry.npmmirror.com/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "license": "MIT" }, "node_modules/undici-types": { "version": "6.21.0", @@ -7672,18 +7062,17 @@ "dev": true }, "node_modules/vite": { - "version": "7.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz", - "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", + "version": "8.2.2", + "resolved": "https://registry.npmmirror.com/vite/-/vite-8.2.2.tgz", + "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" + "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" @@ -7699,9 +7088,10 @@ }, "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", - "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", @@ -7714,13 +7104,16 @@ "@types/node": { "optional": true }, - "jiti": { + "@vitejs/devtools": { "optional": true }, - "less": { + "esbuild": { "optional": true }, - "lightningcss": { + "jiti": { + "optional": true + }, + "less": { "optional": true }, "sass": { @@ -7747,41 +7140,24 @@ } }, "node_modules/vite-plugin-svgr": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-4.5.0.tgz", - "integrity": "sha512-W+uoSpmVkSmNOGPSsDCWVW/DDAyv+9fap9AZXBvWiQqrboJ08j2vh0tFxTD/LjwqwAd3yYSVJgm54S/1GhbdnA==", + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/vite-plugin-svgr/-/vite-plugin-svgr-5.2.0.tgz", + "integrity": "sha512-qj2eAKF8C6PZWemVTvQA0xgQIcP1hHU6Buh7fl6BhvayWwnuxE+z417miKxeDvRWbDrupQ1oK99hfxElopJ3sQ==", "dev": true, + "license": "MIT", "dependencies": { - "@rollup/pluginutils": "^5.2.0", + "@rollup/pluginutils": "^5.3.0", "@svgr/core": "^8.1.0", "@svgr/plugin-jsx": "^8.1.0" }, "peerDependencies": { - "vite": ">=2.6.0" - } - }, - "node_modules/vite/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "vite": ">=3.0.0" } }, "node_modules/vite/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "dev": true, "license": "MIT", "engines": { @@ -7800,9 +7176,9 @@ } }, "node_modules/vscode-languageserver-types": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "version": "3.18.0", + "resolved": "https://registry.npmmirror.com/vscode-languageserver-types/-/vscode-languageserver-types-3.18.0.tgz", + "integrity": "sha512-8TsGPNMIMiiBdkORgRSvLjuiEIiAFtO+KssmYWxQ+uSVvlf7RjK8YKCOjPzZ+YA04jXEV7+7LvkSmHkhpNS99g==", "license": "MIT" }, "node_modules/which": { @@ -7847,33 +7223,57 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, "node_modules/zrender": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.6.1.tgz", - "integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==", + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/zrender/-/zrender-6.1.0.tgz", + "integrity": "sha512-oEGMDB6pOP2S6OwRR4PdVv610zrjnA3Bh+JnSG12fYJlBKjtNAoEb5fSUoCOOINlH96I2fU38/A2UpRKs67xYQ==", + "license": "BSD-3-Clause", "dependencies": { "tslib": "2.3.0" } }, "node_modules/zrender/node_modules/tslib": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "license": "0BSD" }, "node_modules/zustand": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", - "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", - "dependencies": { - "use-sync-external-store": "^1.2.2" - }, + "version": "5.0.15", + "resolved": "https://registry.npmmirror.com/zustand/-/zustand-5.0.15.tgz", + "integrity": "sha512-MpSEjRiBkA9crSYeOUH32rJC7SVqAbm0Fqcqge/bUi2PPoLcBWKOsG+C8mevmpr8TwXHBVkChbbJiyvkE+i/3A==", + "license": "MIT", "engines": { - "node": ">=12.7.0" + "node": ">=12.20.0" }, "peerDependencies": { - "@types/react": ">=16.8", + "@types/react": ">=18.0.0", "immer": ">=9.0.6", - "react": ">=16.8" + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" }, "peerDependenciesMeta": { "@types/react": { @@ -7884,6 +7284,9 @@ }, "react": { "optional": true + }, + "use-sync-external-store": { + "optional": true } } } diff --git a/package.json b/package.json index be79e77..878e673 100644 --- a/package.json +++ b/package.json @@ -13,32 +13,33 @@ "@ant-design/icons": "^6.0.0", "@graphiql/plugin-explorer": "5.0.0", "@monaco-editor/react": "^4.7.0", - "@xyflow/react": "^12.8.4", + "@xyflow/react": "^12.11.0", "antd": "^6.0.0", - "axios": "^1.7.5", + "axios": "^1.19.0", "dagre": "^0.8.5", - "echarts": "^5.5.1", - "echarts-for-react": "^3.0.2", + "echarts": "^6.0.0", + "echarts-for-react": "^3.0.6", "graphiql": "5.0.0", "graphql": "16.9.0", "i18next": "^23.16.4", - "monaco-editor": "0.55.1", - "react": "^18.3.1", - "react-dom": "^18.3.1", + "monaco-editor": "^0.56.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", "react-i18next": "^15.1.0", - "react-router-dom": "^6.26.1", - "zustand": "^4.5.2" + "react-router-dom": "^7.18.0", + "zustand": "^5.0.0" }, "devDependencies": { + "@playwright/test": "^1.62.1", "@tsconfig/node18": "^18.2.2", "@types/dagre": "^0.7.52", "@types/node": "^20.19.0", - "@types/react": "^18.3.3", - "@types/react-dom": "^18.3.0", - "@vitejs/plugin-react": "^4.3.1", + "@types/react": "^19.2.0", + "@types/react-dom": "^19.2.0", + "@vitejs/plugin-react": "^6.1.0", "autoprefixer": "^10.4.20", "eslint": "^9.9.0", - "eslint-plugin-react-hooks": "^5.1.0-rc.0", + "eslint-plugin-react-hooks": "^7.0.0", "eslint-plugin-react-refresh": "^0.4.9", "globals": "^15.9.0", "i18next-browser-languagedetector": "^8.0.0", @@ -46,7 +47,7 @@ "tailwindcss": "^3.4.15", "typescript": "^5.5.3", "typescript-eslint": "^8.0.1", - "vite": "^7.2.7", - "vite-plugin-svgr": "^4.2.0" + "vite": "^8.2.2", + "vite-plugin-svgr": "^5.2.0" } } diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..d76453f --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,50 @@ +import {defineConfig, devices} from "@playwright/test"; + +/** + * Playwright 配置 — flexmodel-ui E2E 测试 + * + * 所有后端接口通过 page.route() 拦截并返回 mock 数据, + * 因此无需启动 Java 后端(localhost:8080)即可运行测试。 + * + * 性能优化: + * - fullyParallel: 每个 spec 文件并行,文件内用例也并行 + * - workers: CI 自动按 CPU 核数分配;本地固定 4 线程 + * - video: off — 录制视频开销最大,关闭后仅保留 trace + screenshot 用于排查 + */ +export default defineConfig({ + testDir: "./e2e", + fullyParallel: true, + forbidOnly: !!process.env.CI, + workers: process.env.CI ? undefined : 4, + retries: 0, + reporter: [["list"]], + timeout: 30_000, + expect: {timeout: 7_000}, + + use: { + baseURL: "http://localhost:5173", + trace: "retain-on-failure", + screenshot: "only-on-failure", + video: "off", + actionTimeout: 10_000, + navigationTimeout: 20_000, + locale: "zh-CN", + }, + + projects: [ + { + name: "chromium", + use: {...devices["Desktop Chrome"], channel: undefined}, + }, + ], + + // 所有并行 worker 共享同一个 Vite dev server,避免重复启动 + webServer: { + command: "npm run dev", + url: "http://localhost:5173", + reuseExistingServer: true, + timeout: 120_000, + stdout: "ignore", + stderr: "pipe", + }, +}); diff --git a/src/App.tsx b/src/App.tsx index 5b56daa..77f3405 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -8,7 +8,7 @@ import {useEffect, useMemo} from "react"; import * as appStore from "./store/appStore.ts"; import {useAuth} from "./store/authStore.ts"; import {initializeDarkMode} from "./utils/darkMode.ts"; -import {RenderProjectRoutes} from "./routes"; +import {RenderProjectRoutes} from "./routeRenderers"; import Project from "./pages/Project/index.tsx"; import Settings from "./pages/Settings"; import ApiKeys from "./pages/ApiKeys"; @@ -65,7 +65,7 @@ const App = () => { theme={theme} > - + } /> diff --git a/src/assets/css/fonts.css b/src/assets/css/fonts.css index 87abbd7..eeca486 100644 --- a/src/assets/css/fonts.css +++ b/src/assets/css/fonts.css @@ -1,10 +1,10 @@ /* 编程字体 + UI字体配置 */ /* - * Inter Display → 替代 Haas Groot Disp(标题/展示字体) - * Inter → 替代 Haas Grotesk(正文/UI 字体) - * Per DESIGN.md: Inter Display (variable) is the closest open-source substitute for Haas. - * Weight axes used: 400 (regular), 475 (mid-weight for pricing), 500 (medium), 600 (semibold for legal). + * Inter → 替代 NotionInter(Notion Analysis 设计系统的单一字体族) + * Per DESIGN.md: NotionInter is a proprietary tuning of Inter — substitute Inter directly. + * One family carries everything from 64px display headlines to 12px eyebrows. + * Weight axes used: 400 (body), 500 (buttons), 600 (title/eyebrow), 700 (headlines). */ @import url('https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap'); @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&display=swap'); @@ -63,4 +63,4 @@ text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -} \ No newline at end of file +} diff --git a/src/components/common/BranchSwitcher.tsx b/src/components/common/BranchSwitcher.tsx index 6b3d3e1..f818c19 100644 --- a/src/components/common/BranchSwitcher.tsx +++ b/src/components/common/BranchSwitcher.tsx @@ -62,7 +62,7 @@ const BranchSwitcher: React.FC = ({ projectId, onMenuItemsC const currentBranch = currentProject?.parentProjectId ? projectId.slice(currentProject.parentProjectId.length + 1) : "main"; - const branches = currentProject?.branches ?? []; + const branches = useMemo(() => currentProject?.branches ?? [], [currentProject?.branches]); const refreshProject = useCallback(async () => { try { diff --git a/src/components/common/FieldMappingComponent.tsx b/src/components/common/FieldMappingComponent.tsx index c201116..9ca975c 100644 --- a/src/components/common/FieldMappingComponent.tsx +++ b/src/components/common/FieldMappingComponent.tsx @@ -94,7 +94,7 @@ const FieldMappingComponent: React.FC = ({ ); })} - = + = = ({ onClick={() => handleRemove(index)} disabled={disabled} size="small" - style={{ color: '#aa2d00' }} + style={{color: 'var(--ant-color-error)'}} /> ); diff --git a/src/components/common/GraphQLEditorModal.tsx b/src/components/common/GraphQLEditorModal.tsx index 238c20d..0340a6f 100644 --- a/src/components/common/GraphQLEditorModal.tsx +++ b/src/components/common/GraphQLEditorModal.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, {useState} from "react"; import { Modal, Typography } from "antd"; import { useTranslation } from "react-i18next"; import GraphQL from "@/pages/GraphQLAPI/components/GraphQL"; @@ -18,7 +18,7 @@ const GraphQLEditorModal: React.FC = ({ onClose, }) => { const { t } = useTranslation(); - let tmpValue = value || { query: "" }; + const [tmpValue, setTmpValue] = useState(value || {query: ""}); const modalTitle = t("apis.graphql.modal_title", { defaultValue: "GraphQL编辑器", @@ -50,7 +50,7 @@ const GraphQLEditorModal: React.FC = ({ { - tmpValue = data; + setTmpValue(data); }} /> @@ -58,4 +58,4 @@ const GraphQLEditorModal: React.FC = ({ ); }; -export default GraphQLEditorModal; \ No newline at end of file +export default GraphQLEditorModal; diff --git a/src/components/console/Console.tsx b/src/components/console/Console.tsx index 4d1b902..169813b 100644 --- a/src/components/console/Console.tsx +++ b/src/components/console/Console.tsx @@ -31,7 +31,7 @@ const Console: React.FC = ({ onToggle, projectId }) => { const [searchKeyword, setSearchKeyword] = useState(''); const [debouncedSearchKeyword, setDebouncedSearchKeyword] = useState(''); const [fontSize, setFontSize] = useState(12); - const [displayLimit, setDisplayLimit] = useState(100); // 默认显示100? + const [displayLimit, setDisplayLimit] = useState(100); // 默认显示100条 // 使用WebSocket Hook const { @@ -44,35 +44,35 @@ const Console: React.FC = ({ onToggle, projectId }) => { logsEndRef, setAutoScrollEnabled } = useConsoleLogs({ - maxLogs: 1000, // 减少?000条以提高性能 + maxLogs: 1000, // 减少到000条以提高性能 autoScroll: true, projectId, }); - // 始终置底开关:选中后不管是否滚动,始终保持在底? + // 始终置底开关:选中后不管是否滚动,始终保持在底部 const [stayAtBottom, setStayAtBottom] = useState(false); - // 选中“始终置底”时,确保自动滚动始终开? + // 选中“始终置底”时,确保自动滚动始终开启 useEffect(() => { if (stayAtBottom) { setAutoScrollEnabled(true); } }, [stayAtBottom, setAutoScrollEnabled]); - // 根据滚动位置更新自动滚动开? + // 根据滚动位置更新自动滚动开关 const handleContentScroll = useCallback((e: React.UIEvent) => { if (stayAtBottom) { - // 强制保持在底? + // 强制保持在底部 setAutoScrollEnabled(true); if (logsEndRef.current) { - // 使用同步滚动,避免视觉抖? + // 使用同步滚动,避免视觉抖动 logsEndRef.current.scrollIntoView({ behavior: 'auto' }); } return; } const target = e.currentTarget; - const threshold = 16; // 离底部阈? + const threshold = 16; // 离底部阈值 const distanceToBottom = target.scrollHeight - target.scrollTop - target.clientHeight; const isNearBottom = distanceToBottom <= threshold; setAutoScrollEnabled(isNearBottom); @@ -92,7 +92,7 @@ const Console: React.FC = ({ onToggle, projectId }) => { } }, [isConnected, reconnect, t]); - // 手动滚动到底? + // 手动滚动到底部 const scrollToBottom = useCallback(() => { if (logsEndRef.current) { logsEndRef.current.scrollIntoView({ behavior: 'smooth' }); @@ -108,7 +108,7 @@ const Console: React.FC = ({ onToggle, projectId }) => { return () => clearTimeout(timer); }, [searchKeyword]); - // 过滤日志 - 只按关键词过? + // 过滤日志 - 只按关键词过滤 const filteredLogs = useMemo(() => { if (!debouncedSearchKeyword) { if (displayLimit === -1 || logs.length <= displayLimit) return logs; @@ -129,17 +129,17 @@ const Console: React.FC = ({ onToggle, projectId }) => { useEffect(() => { if (import.meta.env.DEV) { console.log('Console组件 - 当前日志数量:', logs.length); - console.log('Console组件 - 连接状?', isConnected); - console.log('Console组件 - 过滤后日志数?', filteredLogs.length); + console.log('Console组件 - 连接状态', isConnected); + console.log('Console组件 - 过滤后日志数量', filteredLogs.length); // 性能警告 if (logs.length > 400) { - console.warn(`Console日志数量较多 (${logs.length}?,可能影响性能`); + console.warn(`Console日志数量较多 (${logs.length}条,可能影响性能`); } } }, [logs, isConnected, filteredLogs]); - // 当过滤条件或显示限制变化时,滚动到底? + // 当过滤条件或显示限制变化时,滚动到底部 useEffect(() => { if (filteredLogs.length > 0 && logsEndRef.current) { // 使用setTimeout确保DOM更新后再滚动 @@ -151,7 +151,7 @@ const Console: React.FC = ({ onToggle, projectId }) => { } }, [filteredLogs.length, displayLimit, debouncedSearchKeyword, logsEndRef]); - // 打开时滚动到底部(交由父组件控制可见性,这里仅在有日志时尝试? + // 打开时滚动到底部(交由父组件控制可见性,这里仅在有日志时尝试。 useEffect(() => { if (filteredLogs.length > 0) { setTimeout(() => { @@ -169,7 +169,7 @@ const Console: React.FC = ({ onToggle, projectId }) => { borderTop: `1px solid ${token.colorBorder}`, background: token.colorBgContainer }}> - {/* 控制?*/} + {/* 控制栏*/}
= ({ onToggle, projectId }) => { isConnected={isConnected} /> {error && ( - + {error} )} @@ -279,7 +279,7 @@ const Console: React.FC = ({ onToggle, projectId }) => {
= Reac }) => { const [performanceLevel, setPerformanceLevel] = useState<'good' | 'warning' | 'poor'>('good'); const { t } = useTranslation(); + const {token} = theme.useToken(); useEffect(() => { // 根据日志数量和显示限制综合评估性能 @@ -34,10 +35,14 @@ const ConsolePerformanceMonitor: React.FC = Reac const getPerformanceColor = () => { switch (performanceLevel) { - case 'good': return '#39bf45'; - case 'warning': return '#d9a441'; - case 'poor': return '#aa2d00'; - default: return '#9297a0'; + case 'good': + return token.colorSuccess; + case 'warning': + return token.colorWarning; + case 'poor': + return token.colorError; + default: + return token.colorTextQuaternary; } }; @@ -58,8 +63,9 @@ const ConsolePerformanceMonitor: React.FC = Reac
{t('console.display_limit')}: {displayLimit === -1 ? t('console.limit_all') : t('console.limit_items', { count: displayLimit })}
{t('console.connection_status')}: {isConnected ? t('console.connected') : t('console.disconnected')}
{t('console.performance_status')}: {getPerformanceText()}
- {logCount > 400 &&
{t('console.suggest_clear_logs')}
} - {displayLimit > 500 &&
{t('console.too_many_items_may_affect_perf')}
} + {logCount > 400 &&
{t('console.suggest_clear_logs')}
} + {displayLimit > 500 && +
{t('console.too_many_items_may_affect_perf')}
}
); }; @@ -67,7 +73,7 @@ const ConsolePerformanceMonitor: React.FC = Reac return ( = Reac status={isConnected ? 'success' : 'error'} size="small" /> - + {getPerformanceText()} diff --git a/src/components/console/LogItem.tsx b/src/components/console/LogItem.tsx index 08028ee..a4a908e 100644 --- a/src/components/console/LogItem.tsx +++ b/src/components/console/LogItem.tsx @@ -37,7 +37,7 @@ const LogItem: React.FC = React.memo(({ log, token }) => { transform: 'translateY(-50%)', cursor: 'pointer', color: token.colorTextQuaternary, - fontSize: '12px', + fontSize: token.fontSizeSM, padding: '2px 4px', background: token.colorBgElevated, borderRadius: '2px', diff --git a/src/components/layouts/Header.tsx b/src/components/layouts/Header.tsx index 45191c2..525fe7d 100644 --- a/src/components/layouts/Header.tsx +++ b/src/components/layouts/Header.tsx @@ -1,8 +1,8 @@ import React, {useCallback, useMemo} from "react"; import {Breadcrumb, Button, Dropdown, Layout, Row, Space, Switch, theme} from "antd"; import type {MenuProps} from "antd"; -import enUS from "antd/locale/en_US"; -import zhCN from "antd/locale/zh_CN"; +import enUS from "antd/es/locale/en_US"; +import zhCN from "antd/es/locale/zh_CN"; import dayjs from "dayjs"; import {useLocale, useSidebar, useTheme} from "@/store/appStore.ts"; import {useTranslation} from "react-i18next"; diff --git a/src/components/layouts/PageLayout.tsx b/src/components/layouts/PageLayout.tsx index 4dc4573..91d8a72 100644 --- a/src/components/layouts/PageLayout.tsx +++ b/src/components/layouts/PageLayout.tsx @@ -3,7 +3,8 @@ import {Layout, theme} from "antd"; import {useLocation} from "react-router-dom"; import Sidebar from "./Sidebar"; import Header from "./Header"; -import {RenderRoutes, shouldHideLayout} from "@/routes"; +import {RenderRoutes} from "@/routeRenderers"; +import {shouldHideLayout} from "@/routes"; import {useSidebar} from "@/store/appStore"; import Console from "@/components/console/Console.tsx"; import ResizablePanel from "@/components/common/ResizablePanel"; diff --git a/src/components/layouts/PlatformLayout.tsx b/src/components/layouts/PlatformLayout.tsx index b259287..a67c8a3 100644 --- a/src/components/layouts/PlatformLayout.tsx +++ b/src/components/layouts/PlatformLayout.tsx @@ -1,8 +1,8 @@ import React, { useCallback, useMemo, useState } from "react"; import { Layout, Button, Dropdown, Space, Switch, theme as antdTheme } from "antd"; import type { MenuProps } from "antd"; -import enUS from "antd/locale/en_US"; -import zhCN from "antd/locale/zh_CN"; +import enUS from "antd/es/locale/en_US"; +import zhCN from "antd/es/locale/zh_CN"; import dayjs from "dayjs"; import { useLocale, useTheme } from "@/store/appStore"; import { useTranslation } from "react-i18next"; diff --git a/src/components/layouts/ProjectLayout.tsx b/src/components/layouts/ProjectLayout.tsx index 142f13d..be08d1f 100644 --- a/src/components/layouts/ProjectLayout.tsx +++ b/src/components/layouts/ProjectLayout.tsx @@ -1,8 +1,8 @@ import React, {useCallback, useEffect, useMemo} from "react"; import type {MenuProps} from "antd"; import {Breadcrumb, Button, Dropdown, Layout, Space, Switch, theme as antdTheme} from "antd"; -import enUS from "antd/locale/en_US"; -import zhCN from "antd/locale/zh_CN"; +import enUS from "antd/es/locale/en_US"; +import zhCN from "antd/es/locale/zh_CN"; import dayjs from "dayjs"; import {useLocale, useProject, useTheme} from "@/store/appStore"; import {useTranslation} from "react-i18next"; @@ -62,7 +62,7 @@ const ProjectLayout: React.FC = () => { setIsProjectInitialized(true); }; initializeProject(); - }, [projectId]); + }, [projectId, currentProject?.id, setCurrentProject]); useEffect(() => { const fetchProjects = async () => { @@ -177,7 +177,7 @@ const ProjectLayout: React.FC = () => { }); return items; - }, [currentProject, projects, projectId, t, token.marginXS, handleProjectChange, branchMenuItems]); + }, [currentProject, projects, projectId, t, token.marginXS, handleProjectChange, branchMenuItems, location.pathname]); // hideLayout 路由(如流程设计、流程实例详情)只渲染内容区,不显示 Header/Sidebar if (shouldHideLayout(location.pathname)) { diff --git a/src/hooks/useConsoleLogs.ts b/src/hooks/useConsoleLogs.ts index f2ffdf8..3c1faad 100644 --- a/src/hooks/useConsoleLogs.ts +++ b/src/hooks/useConsoleLogs.ts @@ -15,7 +15,7 @@ interface UseConsoleLogsReturn { clearLogs: () => void; reconnect: () => void; error: string | null; - logsEndRef: React.RefObject; + logsEndRef: React.RefObject; setAutoScrollEnabled: (enabled: boolean) => void; } @@ -68,8 +68,6 @@ export const useConsoleLogs = (options: UseConsoleLogsOptions = {}): UseConsoleL useEffect(() => { if (!projectId) { - setIsConnected(false); - setConnectionState('closed'); return; } @@ -96,6 +94,8 @@ export const useConsoleLogs = (options: UseConsoleLogsOptions = {}): UseConsoleL return () => { clearInterval(statusCheck); channel.unsubscribe(); + setIsConnected(false); + setConnectionState('closed'); }; }, [projectId, maxLogs]); diff --git a/src/hooks/useFullscreen.ts b/src/hooks/useFullscreen.ts index 34b655e..ce912b8 100644 --- a/src/hooks/useFullscreen.ts +++ b/src/hooks/useFullscreen.ts @@ -5,7 +5,7 @@ interface UseFullscreenReturn { toggle: () => void; enter: () => void; exit: () => void; - ref: React.RefObject; + ref: React.RefObject; } export const useFullscreen = (backgroundColor?: string): UseFullscreenReturn => { diff --git a/src/hooks/useRealtime.ts b/src/hooks/useRealtime.ts index 4607d61..f00e218 100644 --- a/src/hooks/useRealtime.ts +++ b/src/hooks/useRealtime.ts @@ -35,7 +35,9 @@ export function useRealtime( const [isConnected, setIsConnected] = useState(false); const [channelState, setChannelState] = useState(null); const callbackRef = useRef(callback); - callbackRef.current = callback; + useEffect(() => { + callbackRef.current = callback; + }); // channel 可能为数组,序列化为字符串用于 useEffect 依赖比较 const channelKey = Array.isArray(channel) ? channel.join(',') : channel; diff --git a/src/i18n.js b/src/i18n.js index edb7776..986ac5a 100644 --- a/src/i18n.js +++ b/src/i18n.js @@ -27,6 +27,8 @@ i18n resources, fallbackLng: currentLocale, // 默认当前的语言环境 lng: currentLocale, + supportedLngs: ['zh', 'en'], + load: 'languageOnly', // 将 zh-CN 归约为 zh,确保 localStorage 存储的是 'zh' 而非 'zh-CN' debug: true, interpolation: { escapeValue: false, // not needed for react as it escapes by default @@ -34,6 +36,6 @@ i18n }); // 设置 dayjs 语言 -dayjs.locale(currentLocale); +dayjs.locale(currentLocale === 'zh' ? 'zh-cn' : 'en'); export default i18n; diff --git a/src/locales/en.json b/src/locales/en.json index 05c2547..497860d 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -212,6 +212,8 @@ "upload_file": "Upload File", "upload_drag_text": "Click or drag files to this area to upload", "upload_hint": "Support single or batch upload. Do not upload company data or other sensitive information", + "upload_success": "Upload success: {{name}}", + "upload_failed": "Upload failed: {{name}}", "download": "Download", "download_file": "Downloading file: {{name}}", "delete_confirm": "Confirm Delete", diff --git a/src/locales/zh.json b/src/locales/zh.json index 81cd102..5ef3f48 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -212,6 +212,8 @@ "upload_file": "上传文件", "upload_drag_text": "点击或拖拽文件到此区域上传", "upload_hint": "支持单个或批量上传,严禁上传公司数据或其他敏感信息", + "upload_success": "上传成功: {{name}}", + "upload_failed": "上传失败: {{name}}", "download": "下载", "download_file": "正在下载文件: {{name}}", "delete_confirm": "确认删除", diff --git a/src/pages/APILog/components/ApiLogChart.tsx b/src/pages/APILog/components/ApiLogChart.tsx index 9ea6a13..adb7541 100644 --- a/src/pages/APILog/components/ApiLogChart.tsx +++ b/src/pages/APILog/components/ApiLogChart.tsx @@ -1,4 +1,5 @@ import React from "react"; +import {theme} from "antd"; import ReactECharts from "echarts-for-react"; import echarts from '@/utils/echarts'; @@ -11,19 +12,20 @@ interface ApiLogChartProps { width?: string | number; } -const ApiLogChart: React.FC = ({ - chartData, - height = '200px', - width = '100%' +const ApiLogChart: React.FC = ({ + chartData, + height = '200px', + width = '100%' }) => { + const {token} = theme.useToken(); const getChartOption = () => ({ tooltip: { trigger: "axis", - backgroundColor: 'rgba(255, 255, 255, 0.9)', - borderColor: '#dddddd', + backgroundColor: token.colorBgElevated, + borderColor: token.colorBorder, borderWidth: 1, textStyle: { - color: '#181d26' + color: token.colorText } }, grid: { @@ -68,10 +70,10 @@ const ApiLogChart: React.FC = ({ smooth: true, lineStyle: { width: 3, - color: '#458fff' + color: token.colorPrimary }, itemStyle: { - color: '#458fff', + color: token.colorPrimary, borderWidth: 2, borderColor: '#fff' }, @@ -85,22 +87,22 @@ const ApiLogChart: React.FC = ({ colorStops: [ { offset: 0, - color: 'rgba(27, 97, 201, 0.3)' + color: 'rgba(0, 117, 222, 0.3)' }, { offset: 1, - color: 'rgba(27, 97, 201, 0.05)' + color: 'rgba(0, 117, 222, 0.05)' } ] } }, emphasis: { itemStyle: { - color: '#458fff', + color: token.colorPrimary, borderWidth: 3, borderColor: '#fff', shadowBlur: 10, - shadowColor: 'rgba(27, 97, 201, 0.5)' + shadowColor: 'rgba(0, 117, 222, 0.5)' } } }, diff --git a/src/pages/ApiKeys/index.tsx b/src/pages/ApiKeys/index.tsx index a2bd544..7f57903 100644 --- a/src/pages/ApiKeys/index.tsx +++ b/src/pages/ApiKeys/index.tsx @@ -231,13 +231,13 @@ const ApiKeys: React.FC = () => { ]} >
- + {t("api_key_warning")}
= ({ const { token } = theme.useToken(); // const field = fieldFn(); // 暂时未使用,但保留以备将来扩展 - const [defaultValueType, setDefaultValueType] = useState<'fixed' | 'generated'>('fixed'); - const [fixedValue, setFixedValue] = useState(null); - const [generatedName, setGeneratedName] = useState(''); + const defaultValueType: 'fixed' | 'generated' = value?.type === 'generated' ? 'generated' : 'fixed'; + const fixedValue = value?.type === 'fixed' ? value.value : null; + const generatedName = value?.type === 'generated' ? (value.name || '') : ''; const inputStyle = { fontSize: token.fontSizeSM, }; - // 初始化值 - useEffect(() => { - if (value) { - if (value.type === 'fixed') { - setDefaultValueType('fixed'); - setFixedValue(value.value); - } else if (value.type === 'generated') { - setDefaultValueType('generated'); - setGeneratedName(value.name || ''); - } - } else { - setDefaultValueType('fixed'); - setFixedValue(null); - setGeneratedName(''); - } - }, [value]); - // 处理类型变化 const handleTypeChange = (type: 'fixed' | 'generated') => { - setDefaultValueType(type); if (type === 'fixed') { onChange({ type: 'fixed', value: null }); } else { @@ -58,14 +40,12 @@ const DefaultValueInput: React.FC = ({ // 处理固定值变化 const handleFixedValueChange = (val: any) => { - setFixedValue(val); onChange({ type: 'fixed', value: val }); }; // 处理生成值名称变化 const handleGeneratedNameChange = (e: React.ChangeEvent) => { const name = e.target.value; - setGeneratedName(name); onChange({ type: 'generated', name }); }; diff --git a/src/pages/DataModeling/components/ERDiagramView.tsx b/src/pages/DataModeling/components/ERDiagramView.tsx index 2e1ba14..43f75af 100644 --- a/src/pages/DataModeling/components/ERDiagramView.tsx +++ b/src/pages/DataModeling/components/ERDiagramView.tsx @@ -138,7 +138,7 @@ const ERDiagram: React.FC = ({data}) => { setNodes(newNodes); setEdges(Array.from(edgeMap.values())); setTimeout(() => fitView(), 100); - }, [data, fitView, setNodes, setEdges]); + }, [data, fitView, setNodes, setEdges, token.colorBorderSecondary]); const resizeGraph = useCallback(() => { if (!containerRef.current) return; diff --git a/src/pages/DataModeling/components/ERNodeView.tsx b/src/pages/DataModeling/components/ERNodeView.tsx index f471470..6fe8f12 100644 --- a/src/pages/DataModeling/components/ERNodeView.tsx +++ b/src/pages/DataModeling/components/ERNodeView.tsx @@ -101,7 +101,7 @@ const ERNodeView: React.FC = ({entity, dim = false}) => { display: 'flex', justifyContent: 'center', alignItems: 'center', - marginTop: 8, + marginTop: 'var(--ant-margin-xs)', cursor: 'pointer', userSelect: 'none', }} diff --git a/src/pages/DataModeling/components/EnumForm.tsx b/src/pages/DataModeling/components/EnumForm.tsx index f1cb355..07e9ce1 100644 --- a/src/pages/DataModeling/components/EnumForm.tsx +++ b/src/pages/DataModeling/components/EnumForm.tsx @@ -12,26 +12,18 @@ interface EnumFormProps { onConfirm?: (model: Enum) => void; } -const EnumForm = React.forwardRef(({ +const EnumForm = ({ form: externalForm, mode = 'create', - datasource: _datasource, // eslint-disable-line @typescript-eslint/no-unused-vars + datasource: _datasource, model, - onConfirm -}, ref) => { + onConfirm, + ref, + }: EnumFormProps & { ref?: React.Ref }) => { const { t } = useTranslation(); const [internalForm] = Form.useForm(); const form = externalForm || internalForm; - // 暴露提交方法给父组件 - React.useImperativeHandle(ref, () => ({ - submit: handleSave, - reset: () => form.resetFields(), - getFieldsValue: form.getFieldsValue, - setFieldsValue: form.setFieldsValue, - validateFields: form.validateFields, - })); - // 初始化表单值 useEffect(() => { if (model) { @@ -56,6 +48,15 @@ const EnumForm = React.forwardRef(({ } }; + // 暴露提交方法给父组件 + React.useImperativeHandle(ref, () => ({ + submit: handleSave, + reset: () => form.resetFields(), + getFieldsValue: form.getFieldsValue, + setFieldsValue: form.setFieldsValue, + validateFields: form.validateFields, + })); + return (
(({ ); -}); +}; export default EnumForm; diff --git a/src/pages/DataModeling/components/FieldForm.tsx b/src/pages/DataModeling/components/FieldForm.tsx index c19b052..502184a 100644 --- a/src/pages/DataModeling/components/FieldForm.tsx +++ b/src/pages/DataModeling/components/FieldForm.tsx @@ -1,10 +1,11 @@ -import React, {useEffect, useState} from "react"; +import React, {useEffect, useMemo, useState} from "react"; import {Form, Input, Select, Switch} from "antd"; import {getModelList} from "@/services/model.ts"; import {useTranslation} from "react-i18next"; import DefaultValueInput from "./DefaultValueInput"; import {Field} from "@/types/data-modeling"; import {useProject} from "@/store/appStore"; +import {BasicFieldTypes, FieldInitialValues} from "./fieldFormConstants"; interface FieldFormProps { @@ -15,143 +16,20 @@ interface FieldFormProps { onCancel: () => void; } -export const BasicFieldTypes = [ - { - name: 'String', - label: 'String', - }, - { - name: 'Int', - label: 'Int', - }, - { - name: 'Long', - label: 'Long', - }, - { - name: 'Float', - label: 'Float', - }, - { - name: 'Boolean', - label: 'Boolean', - }, - { - name: 'DateTime', - label: 'DateTime', - }, - { - name: 'Date', - label: 'Date', - }, - { - name: 'Time', - label: 'Time', - }, - { - name: 'JSON', - label: 'JSON', - }, -]; - -export const FieldInitialValues: any = { - STRING: { - type: 'String', - length: 255, - unique: false, - nullable: true, - identity: false, - }, - INT: { - type: 'Int', - unique: false, - nullable: true, - identity: false, - }, - LONG: { - type: 'Long', - unique: false, - nullable: true, - identity: false, - }, - DECIMAL: { - type: 'Decimal', - precision: 20, - scale: 2, - unique: false, - nullable: true, - identity: false, - }, - BOOLEAN: { - type: 'Boolean', - unique: false, - nullable: true, - identity: false, - }, - DATE: { - type: 'Date', - unique: false, - nullable: true, - identity: false, - }, - TIME: { - type: 'Time', - unique: false, - nullable: true, - identity: false, - }, - DATETIME: { - type: 'DateTime', - unique: false, - nullable: true, - identity: false, - }, - JSON: { - type: 'JSON', - unique: false, - nullable: true, - identity: false, - }, - MODEL_REF: { - type: 'ModelRef', - multiple: true, - localField: null, - foreignField: null, - unique: false, - nullable: true, - cascadeDelete: false, - identity: false, - }, - ENUM: { - type: 'Enum', - unique: false, - nullable: true, - multiple: false, - identity: false, - }, -}; - -const FieldForm = React.forwardRef(({ +const FieldForm = ({ mode, model, currentValue, onConfirm, onCancel, -}, ref) => { + ref, + }: FieldFormProps & { ref?: React.Ref }) => { const { t } = useTranslation(); const [form] = Form.useForm(); const {currentProject} = useProject(); const projectId = currentProject?.id || ''; - React.useImperativeHandle(ref, () => ({ - submit: handleConfirm, - reset: handleCancel, - getFieldsValue: form.getFieldsValue, - setFieldsValue: form.setFieldsValue, - validateFields: form.validateFields, - })); const [modelList, setModelList] = useState([]); - const [ModelRefModel, setModelRefModel] = useState(); const [tmpType, setTmpType] = useState(""); const reqModelList = React.useCallback(async () => { @@ -205,14 +83,12 @@ const FieldForm = React.forwardRef(({ } }, [currentValue, form, initialValues, reqModelList]); - useEffect(() => { + const modelRefModel = useMemo(() => { if (tmpType?.startsWith("ModelRef:")) { const relatedModelName = tmpType.replace("ModelRef:", ""); - const relatedModel = modelList.find((m) => m.name === relatedModelName); - setModelRefModel(relatedModel); - } else { - setModelRefModel(null); + return modelList.find((m) => m.name === relatedModelName); } + return null; }, [modelList, tmpType]); const handleTypeChange = (value: string) => { @@ -293,6 +169,14 @@ const FieldForm = React.forwardRef(({ } }; + React.useImperativeHandle(ref, () => ({ + submit: handleConfirm, + reset: handleCancel, + getFieldsValue: form.getFieldsValue, + setFieldsValue: form.setFieldsValue, + validateFields: form.validateFields, + })); + return (
(({ rules={[{ required: true }]} > ({getNodeName(selectedEdge.source)})} + suffix={({getNodeName(selectedEdge.source)})} /> ({getNodeName(selectedEdge.target)})} + suffix={({getNodeName(selectedEdge.target)})} />
@@ -655,7 +660,7 @@ const PropertyPanel = forwardRef(({
-
+

条件表达式说明:

  • 使用 ${'{'}expression{'}'} 格式编写条件
  • @@ -668,7 +673,7 @@ const PropertyPanel = forwardRef(({ )} {!isGateway && ( -
    +
    普通连线无需设置条件
    )} @@ -752,6 +757,24 @@ const PropertyPanel = forwardRef(({ ); }; + useImperativeHandle(ref, () => ({ + validateCurrentNode: async () => { + if (!selectedNode) { + return true; + } + + try { + await form.validateFields(); + onValidationChange(selectedNode.id, true); + return true; + } catch (error) { + console.log('节点校验失败:', selectedNode.id, error); + onValidationChange(selectedNode.id, false); + return false; + } + } + }), [selectedNode, form, onValidationChange]); + return ( (({ /> ); -}); +}; export default PropertyPanel; diff --git a/src/pages/FlowDesign/components/nodes/CallActivityNode.tsx b/src/pages/FlowDesign/components/nodes/CallActivityNode.tsx index 1036512..0902510 100644 --- a/src/pages/FlowDesign/components/nodes/CallActivityNode.tsx +++ b/src/pages/FlowDesign/components/nodes/CallActivityNode.tsx @@ -8,22 +8,22 @@ const CallActivityNode: React.FC = ({ data, selected, id }) => { const [isHovered, setIsHovered] = useState(false); const { token } = theme.useToken(); const hasError = (data as any)?.hasError || false; - + return (
    setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} @@ -33,14 +33,14 @@ const CallActivityNode: React.FC = ({ data, selected, id }) => { position={Position.Left} id="left" style={{ - background: '#41454d', + background: token.colorBorder, width: 8, height: 8, }} />
    - + {(data?.properties as any)?.name || data?.label as string || '子流程'}
    @@ -49,7 +49,7 @@ const CallActivityNode: React.FC = ({ data, selected, id }) => { position={Position.Right} id="right" style={{ - background: '#41454d', + background: token.colorBorder, width: 8, height: 8, }} @@ -82,7 +82,7 @@ const CallActivityNode: React.FC = ({ data, selected, id }) => { borderRadius: '50%', color: token.colorError, zIndex: 1000, - boxShadow: '0 2px 4px rgba(0, 0, 0, 0.1)', + boxShadow: token.boxShadowTertiary, }} /> ) : null} diff --git a/src/pages/FlowDesign/components/nodes/ExclusiveGatewayNode.tsx b/src/pages/FlowDesign/components/nodes/ExclusiveGatewayNode.tsx index 1548805..f7721b8 100644 --- a/src/pages/FlowDesign/components/nodes/ExclusiveGatewayNode.tsx +++ b/src/pages/FlowDesign/components/nodes/ExclusiveGatewayNode.tsx @@ -21,7 +21,7 @@ const ExclusiveGatewayNode: React.FC = ({ id, data, selected }) => { alignItems: 'center', justifyContent: 'center', position: 'relative', - borderRadius: 8, + borderRadius: 'var(--ant-border-radius)', boxShadow: getNodeBoxShadow(hasError, selected), }} onMouseEnter={() => setIsHovered(true)} @@ -133,7 +133,7 @@ const ExclusiveGatewayNode: React.FC = ({ id, data, selected }) => { bottom: -25, left: '50%', transform: 'translateX(-50%)', - fontSize: '12px', + fontSize: 'var(--ant-font-size-sm)', color: token.colorTextSecondary, whiteSpace: 'nowrap', maxWidth: 100, diff --git a/src/pages/FlowDesign/components/nodes/InclusiveGatewayNode.tsx b/src/pages/FlowDesign/components/nodes/InclusiveGatewayNode.tsx index d3fac46..5e01b97 100644 --- a/src/pages/FlowDesign/components/nodes/InclusiveGatewayNode.tsx +++ b/src/pages/FlowDesign/components/nodes/InclusiveGatewayNode.tsx @@ -21,7 +21,7 @@ const InclusiveGatewayNode: React.FC = ({ id, data, selected }) => { alignItems: 'center', justifyContent: 'center', position: 'relative', - borderRadius: 8, + borderRadius: 'var(--ant-border-radius)', boxShadow: getNodeBoxShadow(hasError, selected), }} onMouseEnter={() => setIsHovered(true)} @@ -133,7 +133,7 @@ const InclusiveGatewayNode: React.FC = ({ id, data, selected }) => { bottom: -25, left: '50%', transform: 'translateX(-50%)', - fontSize: '12px', + fontSize: 'var(--ant-font-size-sm)', color: token.colorTextSecondary, whiteSpace: 'nowrap', maxWidth: 100, diff --git a/src/pages/FlowDesign/components/nodes/ParallelGatewayNode.tsx b/src/pages/FlowDesign/components/nodes/ParallelGatewayNode.tsx index d85fd70..c213ed8 100644 --- a/src/pages/FlowDesign/components/nodes/ParallelGatewayNode.tsx +++ b/src/pages/FlowDesign/components/nodes/ParallelGatewayNode.tsx @@ -21,7 +21,7 @@ const ParallelGatewayNode: React.FC = ({ id, data, selected }) => { alignItems: 'center', justifyContent: 'center', position: 'relative', - borderRadius: 8, + borderRadius: 'var(--ant-border-radius)', boxShadow: getNodeBoxShadow(hasError, selected), }} onMouseEnter={() => setIsHovered(true)} @@ -133,7 +133,7 @@ const ParallelGatewayNode: React.FC = ({ id, data, selected }) => { bottom: -25, left: '50%', transform: 'translateX(-50%)', - fontSize: '12px', + fontSize: 'var(--ant-font-size-sm)', color: token.colorTextSecondary, whiteSpace: 'nowrap', maxWidth: 100, diff --git a/src/pages/FlowDesign/components/nodes/SequenceFlowNode.tsx b/src/pages/FlowDesign/components/nodes/SequenceFlowNode.tsx index f1cdde3..060a392 100644 --- a/src/pages/FlowDesign/components/nodes/SequenceFlowNode.tsx +++ b/src/pages/FlowDesign/components/nodes/SequenceFlowNode.tsx @@ -90,7 +90,7 @@ const SequenceFlowNode: React.FC = ({ data, selected }) => { color: token.colorTextSecondary, background: token.colorBgContainer, padding: '2px 4px', - borderRadius: 4, + borderRadius: 'var(--ant-border-radius-xs)', border: `1px solid ${token.colorBorder}`, whiteSpace: 'nowrap', maxWidth: 120, diff --git a/src/pages/FlowDesign/components/nodes/ServiceTaskNode.tsx b/src/pages/FlowDesign/components/nodes/ServiceTaskNode.tsx index b9cf830..35ab191 100644 --- a/src/pages/FlowDesign/components/nodes/ServiceTaskNode.tsx +++ b/src/pages/FlowDesign/components/nodes/ServiceTaskNode.tsx @@ -13,6 +13,7 @@ import { } from '@ant-design/icons'; import {Button, theme} from 'antd'; import {getNodeBorderColor, getNodeBoxShadow} from '../../utils/nodeStyles'; +import {colors} from '@/theme/designTokens'; const ServiceTaskNode: React.FC = ({data, selected, id}) => { const [isHovered, setIsHovered] = useState(false); @@ -21,7 +22,7 @@ const ServiceTaskNode: React.FC = ({data, selected, id}) => { // 根据 subType 获取图标和颜色 const getSubTypeIcon = (subType?: string) => { - const iconProps = {fontSize: '16px'}; + const iconProps = {fontSize: 'var(--ant-font-size-lg)'}; switch (subType) { case 'insert_record': return ; @@ -32,11 +33,11 @@ const ServiceTaskNode: React.FC = ({data, selected, id}) => { case 'delete_record': return ; case 'script': - return ; + return ; case 'sql': - return ; + return ; case 'function': - return ; + return ; default: return ; } @@ -85,7 +86,7 @@ const ServiceTaskNode: React.FC = ({data, selected, id}) => { minHeight: 64, background: selected ? token.colorPrimaryBg : token.colorBgContainer, border: `2px solid ${getNodeBorderColor(hasError, selected, token.colorError, token.colorPrimary, token.colorBorder)}`, - borderRadius: 10, + borderRadius: 'var(--ant-border-radius-lg)', display: 'flex', alignItems: 'center', justifyContent: 'center', diff --git a/src/pages/FlowDesign/components/nodes/UserTaskNode.tsx b/src/pages/FlowDesign/components/nodes/UserTaskNode.tsx index 415f732..70d0f24 100644 --- a/src/pages/FlowDesign/components/nodes/UserTaskNode.tsx +++ b/src/pages/FlowDesign/components/nodes/UserTaskNode.tsx @@ -16,7 +16,7 @@ const UserTaskNode: React.FC = ({ data, selected, id }) => { minHeight: 64, background: selected ? token.colorPrimaryBg : token.colorBgContainer, border: `2px solid ${getNodeBorderColor(hasError, selected, token.colorError, token.colorPrimary, token.colorBorder)}`, - borderRadius: 10, + borderRadius: 'var(--ant-border-radius-lg)', display: 'flex', alignItems: 'center', justifyContent: 'center', @@ -89,7 +89,7 @@ const UserTaskNode: React.FC = ({ data, selected, id }) => { />
    - +
    {String((data.properties as any)?.name || data.name || '提交节点')}
    diff --git a/src/pages/FlowDesign/index.tsx b/src/pages/FlowDesign/index.tsx index 7dca419..09288e2 100644 --- a/src/pages/FlowDesign/index.tsx +++ b/src/pages/FlowDesign/index.tsx @@ -146,6 +146,7 @@ const FlowDesign: React.FC = () => { }, [setEdges]); // 在线路上插入一个节点(替换当前边为两条边) + const handleInsertNodeRef = useRef(null); const handleInsertNode = useCallback((edgeId: string, nodeType: string) => { setEdges((currentEdges) => { const edge = currentEdges.find((e) => e.id === edgeId); @@ -180,7 +181,7 @@ const FlowDesign: React.FC = () => { conditionsequenceflow: '', defaultConditions: 'false', onDelete: handleEdgeDelete, - onInsert: (id: string, t: string) => handleInsertNode(id, t) + onInsert: (id: string, t: string) => handleInsertNodeRef.current?.(id, t) }, }; const secondEdge: CustomEdge = { @@ -194,7 +195,7 @@ const FlowDesign: React.FC = () => { conditionsequenceflow: '', defaultConditions: 'false', onDelete: handleEdgeDelete, - onInsert: (id: string, t: string) => handleInsertNode(id, t) + onInsert: (id: string, t: string) => handleInsertNodeRef.current?.(id, t) }, }; @@ -205,6 +206,9 @@ const FlowDesign: React.FC = () => { return [...currentEdges.filter((e) => e.id !== edgeId), firstEdge, secondEdge]; }); }, [nodes, handleEdgeDelete, handleNodeDelete, setEdges, setNodes]); + useEffect(() => { + handleInsertNodeRef.current = handleInsertNode; + }); // 解析flowModel数据并转换为ReactFlow格式 const parseFlowModel = useCallback((flowModelStr: string) => { @@ -599,7 +603,7 @@ const FlowDesign: React.FC = () => { } else { message.error('流程ID不存在,无法保存'); } - }, [nodes, edges, flowModuleId, flowName, flowKey, flowRemark, invalidNodeIds, selectedNode]); + }, [nodes, edges, flowModuleId, flowName, flowKey, flowRemark, invalidNodeIds, selectedNode, projectId]); // 发布流程 const handleDeploy = useCallback(async () => { @@ -712,7 +716,7 @@ const FlowDesign: React.FC = () => { console.error('发布流程失败:', e); message.error('发布失败'); } - }, [edges, flowKey, flowModuleId, flowName, flowRemark, nodes, invalidNodeIds, selectedNode]); + }, [edges, flowKey, flowModuleId, flowName, flowRemark, nodes, invalidNodeIds, selectedNode, projectId]); // moved above diff --git a/src/pages/FlowDesign/utils/nodeStyles.ts b/src/pages/FlowDesign/utils/nodeStyles.ts index 1abc290..1f9d6bd 100644 --- a/src/pages/FlowDesign/utils/nodeStyles.ts +++ b/src/pages/FlowDesign/utils/nodeStyles.ts @@ -20,10 +20,10 @@ export const getNodeBorderColor = ( export const getNodeBoxShadow = ( hasError: boolean, selected: boolean, - defaultShadow: string = '0 2px 8px rgba(0, 0, 0, 0.08)' + defaultShadow: string = '0 2px 8px rgba(15, 15, 15, 0.08)' ): string => { - if (hasError) return '0 4px 12px rgba(170, 45, 0, 0.25)'; - if (selected) return '0 4px 12px rgba(27, 97, 201, 0.25)'; + // Notion Analysis: error #e5484d, primary #0075de + if (hasError) return '0 4px 12px rgba(229, 72, 77, 0.25)'; + if (selected) return '0 4px 12px rgba(0, 117, 222, 0.25)'; return defaultShadow; }; - diff --git a/src/pages/FlowDetail/components/FlowNode.tsx b/src/pages/FlowDetail/components/FlowNode.tsx index b2da5cc..94baab0 100644 --- a/src/pages/FlowDetail/components/FlowNode.tsx +++ b/src/pages/FlowDetail/components/FlowNode.tsx @@ -96,7 +96,7 @@ const FlowNode: React.FC = ({ data }) => { padding: '0 10px', position: 'relative', boxShadow: isSelected - ? '0 4px 12px rgba(27, 97, 201, 0.25)' + ? '0 4px 12px rgba(0, 117, 222, 0.25)' : '0 1px 3px rgba(0, 0, 0, 0.08)', }} > @@ -141,9 +141,9 @@ const FlowNode: React.FC = ({ data }) => { alignItems: 'center', justifyContent: 'center', position: 'relative', - borderRadius: 8, + borderRadius: 'var(--ant-border-radius)', boxShadow: isSelected - ? '0 4px 12px rgba(27, 97, 201, 0.25)' + ? '0 4px 12px rgba(0, 117, 222, 0.25)' : '0 2px 8px rgba(0, 0, 0, 0.08)', }} > @@ -181,22 +181,22 @@ const FlowNode: React.FC = ({ data }) => { minHeight: 60, background: bgColor, border: `2px solid ${isSelected ? token.colorPrimary : borderColor}`, - borderRadius: 8, + borderRadius: 'var(--ant-border-radius)', display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', - padding: '8px 12px', + padding: 'var(--ant-padding-xs) var(--ant-padding-sm)', position: 'relative', boxShadow: isSelected - ? '0 4px 12px rgba(27, 97, 201, 0.25)' + ? '0 4px 12px rgba(0, 117, 222, 0.25)' : '0 2px 8px rgba(0, 0, 0, 0.08)', }} >
    - + {displayName} @@ -211,9 +211,9 @@ const FlowNode: React.FC = ({ data }) => { // 渲染任务节点(用户任务、服务任务等) const taskIcon = type === FlowElementType.USER_TASK ? ( - + ) : ( - + ); return ( @@ -223,7 +223,7 @@ const FlowNode: React.FC = ({ data }) => { minHeight: 64, background: bgColor, border: `2px solid ${isSelected ? token.colorPrimary : borderColor}`, - borderRadius: 10, + borderRadius: 'var(--ant-border-radius-lg)', display: 'flex', flexDirection: 'column', alignItems: 'center', @@ -231,7 +231,7 @@ const FlowNode: React.FC = ({ data }) => { padding: '10px 14px', position: 'relative', boxShadow: isSelected - ? '0 4px 12px rgba(27, 97, 201, 0.25)' + ? '0 4px 12px rgba(0, 117, 222, 0.25)' : '0 2px 8px rgba(0, 0, 0, 0.08)', }} > diff --git a/src/pages/Functions/components/FunctionDetail.tsx b/src/pages/Functions/components/FunctionDetail.tsx index 13c465c..68a28e0 100644 --- a/src/pages/Functions/components/FunctionDetail.tsx +++ b/src/pages/Functions/components/FunctionDetail.tsx @@ -67,7 +67,7 @@ const FunctionDetail: React.FC = ({ // ---- Code Tab ---- const codeTab = (
    -
    +
    {fileList.map((filename) => ( = ({ onChange={(v) => setInputStr(v || "{}")} /> -
    +
    @@ -86,7 +86,7 @@ const About: React.FC = () => { size="middle" href="https://flexmodel.dev/docs" target="_blank" - style={{ borderRadius: '6px' }} + style={{borderRadius: token.borderRadius}} > 文档 diff --git a/src/pages/Storage/components/BucketExplorer.tsx b/src/pages/Storage/components/BucketExplorer.tsx index a5f2e63..2e2edf4 100644 --- a/src/pages/Storage/components/BucketExplorer.tsx +++ b/src/pages/Storage/components/BucketExplorer.tsx @@ -1,14 +1,12 @@ -import React, {useEffect, useMemo, useState} from "react"; -import type {MenuProps} from "antd"; -import {Button, Dropdown, Empty, Form, Input, message, Modal, Spin, theme, Typography} from "antd"; -import {DatabaseOutlined, DeleteOutlined, MoreOutlined, PlusOutlined, SearchOutlined} from "@ant-design/icons"; +import React, {useCallback, useEffect, useMemo, useRef, useState} from "react"; +import {Button, Empty, Form, Input, message, Modal, Spin, theme} from "antd"; +import {PlusOutlined, SearchOutlined} from "@ant-design/icons"; import type {BucketSchema} from "@/types/storage"; import {createBucket, getBucketList} from "@/services/storage.ts"; import {useTranslation} from "react-i18next"; import {useProject} from "@/store/appStore"; import BucketForm from "@/pages/Storage/components/BucketForm"; - -const {Text} = Typography; +import BucketItem from "@/pages/Storage/components/BucketItem"; interface BucketExplorerProps { onSelect: (bucket: BucketSchema) => void; @@ -30,49 +28,52 @@ const BucketExplorer: React.FC = ({ const [bucketList, setBucketList] = useState([]); const [activeBucket, setActiveBucket] = useState(null); - const [loading, setLoading] = useState(false); - const [filterText, setFilterText] = useState(""); + const [loading, setLoading] = useState(false); + const [filterText, setFilterText] = useState(""); const [createModalVisible, setCreateModalVisible] = useState(false); const [createLoading, setCreateLoading] = useState(false); const [createForm] = Form.useForm(); - const getBucketListHandler = async () => { + // 保持最新的 onSelect / selectedBucket 引用,避免它们的变化导致 fetch 重复触发。 + // 父组件未对 onSelect 做 useCallback,每次渲染都是新引用,若作为依赖会导致 + // getBucketListHandler 重建 → useEffect 重复请求 bucket 列表。 + const onSelectRef = useRef(onSelect); + const selectedBucketRef = useRef(selectedBucket); + useEffect(() => { + onSelectRef.current = onSelect; + selectedBucketRef.current = selectedBucket; + }); + + // 根据名称在列表中定位并选中 bucket,未命中则回退到第一项。 + const selectByName = useCallback((list: BucketSchema[], name?: string) => { + const target = (name && list.find(b => b.name === name)) || list[0] || null; + setActiveBucket(target); + if (target) onSelectRef.current(target); + }, []); + + const getBucketListHandler = useCallback(async () => { try { setLoading(true); const list = await getBucketList(projectId); setBucketList(list); - - let initialActive = null; - if (selectedBucket) { - initialActive = list.find(b => b.name === selectedBucket) || null; - } else { - initialActive = list[0] || null; - } - - setActiveBucket(initialActive); - if (initialActive) { - onSelect(initialActive); - } + selectByName(list, selectedBucketRef.current); } catch (error) { console.error("Failed to load bucket list:", error); } finally { setLoading(false); } - }; + }, [projectId, selectByName]); useEffect(() => { getBucketListHandler(); - }, [refreshKey]); + }, [refreshKey, getBucketListHandler]); + // 外部 selectedBucket 变化时同步高亮(列表已加载的场景)。 useEffect(() => { if (selectedBucket && bucketList.length > 0) { - const bucket = bucketList.find(b => b.name === selectedBucket) || null; - setActiveBucket(bucket); - if (bucket) { - onSelect(bucket); - } + selectByName(bucketList, selectedBucket); } - }, [selectedBucket, bucketList, onSelect]); + }, [selectedBucket, bucketList, selectByName]); const handleCreateBucket = async () => { try { @@ -109,30 +110,20 @@ const BucketExplorer: React.FC = ({ return bucketList.filter(b => b.name.toLowerCase().includes(keyword)); }, [bucketList, filterText]); - const menuItems = (bucket: BucketSchema): MenuProps["items"] => [ - { - key: "delete", - label: t("delete"), - icon: , - danger: true, - onClick: () => { - setActiveBucket(bucket); - setDeleteVisible(true); - }, - }, - ]; - - const searchRowStyle = { - display: 'flex', - alignItems: 'center', - width: '100%', - padding: '8px 8px 12px 8px', // spacing.xs horizontal, spacing.sm bottom - gap: '8px', // spacing.xs - }; + const handleDelete = useCallback((bucket: BucketSchema) => { + setActiveBucket(bucket); + setDeleteVisible(true); + }, [setDeleteVisible]); return (
    -
    +
    = ({
    - + {filteredBucketList.length === 0 && !loading ? ( ) : ( - filteredBucketList.map((bucket) => { - const isActive = activeBucket?.name === bucket.name; - return ( -
    { - setActiveBucket(bucket); - onSelect(bucket); - }} - style={{ - padding: `${token.paddingXS}px ${token.paddingSM}px`, - marginBottom: token.marginXXS, - borderRadius: token.borderRadius, - cursor: 'pointer', - backgroundColor: isActive ? token.colorFillSecondary : 'transparent', - transition: 'background-color 0.2s', - }} - onMouseEnter={(e) => { - if (!isActive) { - e.currentTarget.style.backgroundColor = token.colorFillTertiary; - } - }} - onMouseLeave={(e) => { - if (!isActive) { - e.currentTarget.style.backgroundColor = 'transparent'; - } - }} - > -
    -
    - - - {bucket.name} - -
    - - e.stopPropagation()} - /> - -
    -
    - ); - }) + filteredBucketList.map((bucket) => ( + + )) )}
    diff --git a/src/pages/Storage/components/BucketItem.tsx b/src/pages/Storage/components/BucketItem.tsx new file mode 100644 index 0000000..b45e9f0 --- /dev/null +++ b/src/pages/Storage/components/BucketItem.tsx @@ -0,0 +1,105 @@ +import React, {useState} from 'react'; +import type {MenuProps} from 'antd'; +import {Dropdown, Typography, theme} from 'antd'; +import {DatabaseOutlined, DeleteOutlined, MoreOutlined} from '@ant-design/icons'; +import type {BucketSchema} from '@/types/storage'; +import {useTranslation} from 'react-i18next'; + +const {Text} = Typography; + +interface BucketItemProps { + bucket: BucketSchema; + active: boolean; + onSelect: (bucket: BucketSchema) => void; + onDelete: (bucket: BucketSchema) => void; +} + +const BucketItem: React.FC = ({bucket, active, onSelect, onDelete}) => { + const {token} = theme.useToken(); + const {t} = useTranslation(); + const [hovered, setHovered] = useState(false); + + const backgroundColor = active + ? token.colorFillSecondary + : hovered + ? token.colorFillTertiary + : 'transparent'; + + const menuItems: MenuProps['items'] = [ + { + key: 'delete', + label: t('delete'), + icon: , + danger: true, + onClick: () => onDelete(bucket), + }, + ]; + + return ( +
    onSelect(bucket)} + onMouseEnter={() => setHovered(true)} + onMouseLeave={() => setHovered(false)} + style={{ + padding: `${token.paddingXS}px ${token.paddingSM}px`, + marginBottom: token.marginXXS, + borderRadius: token.borderRadius, + cursor: 'pointer', + backgroundColor, + transition: 'background-color 0.2s', + }} + > +
    +
    + + + {bucket.name} + +
    + + e.stopPropagation()} + /> + +
    +
    + ); +}; + +export default BucketItem; diff --git a/src/routeRenderers.tsx b/src/routeRenderers.tsx new file mode 100644 index 0000000..a052d0e --- /dev/null +++ b/src/routeRenderers.tsx @@ -0,0 +1,6 @@ +import {useRoutes} from "react-router-dom"; +import {routerRoutes, platformRouterRoutes, projectRouterRoutes} from "@/routes"; + +export const RenderRoutes = () => useRoutes(routerRoutes); +export const RenderPlatformRoutes = () => useRoutes(platformRouterRoutes); +export const RenderProjectRoutes = () => useRoutes(projectRouterRoutes); diff --git a/src/routes.tsx b/src/routes.tsx index c1129e4..1da3293 100644 --- a/src/routes.tsx +++ b/src/routes.tsx @@ -1,4 +1,3 @@ -import {useRoutes} from "react-router-dom"; import Settings from "./pages/Settings"; import Overview from "./pages/Overview"; import DataView from "./pages/DataView"; @@ -308,7 +307,3 @@ export const platformRouterRoutes = platformRoutes.map(({ path, element }) => ({ path, element, })); - -export const RenderRoutes = () => useRoutes(routerRoutes); -export const RenderPlatformRoutes = () => useRoutes(platformRouterRoutes); -export const RenderProjectRoutes = () => useRoutes(projectRouterRoutes); diff --git a/src/store/appStore.ts b/src/store/appStore.ts index f5f1741..867b29c 100644 --- a/src/store/appStore.ts +++ b/src/store/appStore.ts @@ -4,8 +4,8 @@ import {useShallow} from 'zustand/react/shallow'; import {getGlobalProfile} from '../services/global'; import {getDarkModeFromStorage, setDarkModeToStorage} from '../utils/darkMode'; import type {Project} from '../types/project'; -import zhCN from 'antd/locale/zh_CN'; -import enUS from 'antd/locale/en_US'; +import zhCN from 'antd/es/locale/zh_CN'; +import enUS from 'antd/es/locale/en_US'; import dayjs from 'dayjs'; // 类型定义 @@ -65,8 +65,8 @@ export const useAppStore = create()( isLoading: false, error: null, isDark: getDarkModeFromStorage(), - locale: localStorage.getItem('i18nextLng') === 'zh' ? zhCN : enUS, - currentLang: (localStorage.getItem('i18nextLng') as 'zh' | 'en') || 'zh', + locale: (localStorage.getItem('i18nextLng') || 'zh').startsWith('zh') ? zhCN : enUS, + currentLang: (localStorage.getItem('i18nextLng') || 'zh').startsWith('zh') ? 'zh' : 'en', isSidebarCollapsed: false, currentProject: null, diff --git a/src/theme/designSystem.css b/src/theme/designSystem.css index 36ea1f0..ebde534 100644 --- a/src/theme/designSystem.css +++ b/src/theme/designSystem.css @@ -1,142 +1,132 @@ /** - * Flexmodel Design System — CSS Custom Properties + * Flexmodel Design System — CSS Custom Properties (Notion Analysis) * - * All design tokens from DESIGN.md (Airtable-design-analysis). - * Uses Inter Display / Inter as open-source substitute for Haas Groot Disp / Haas Grotesk. + * All design tokens from DESIGN.md (Notion Analysis): a warm paper-calm canvas, + * near-black Inter type, one confident blue accent, and a decorative sticker + * palette. NotionInter is substituted by Inter (single family for all sizes). * * Token hierarchy: - * --flex-color-* → Color values - * --flex-type-* → Typography (fontFamily, fontSize, fontWeight, lineHeight, letterSpacing) + * --flex-color-* → Color values + * --flex-font → Font family (Inter) + * --flex-type-* → Typography (fontSize, fontWeight, lineHeight, letterSpacing) * --flex-rounded-* → Border radius * --flex-space-* → Spacing scale + * --flex-shadow-* → Elevation (many near-transparent layers, never a hard cast) */ :root { /* ========================================================================== Colors — Brand & Accent ========================================================================== */ - --flex-color-primary: #181d26; - --flex-color-primary-active: #0d1218; - --flex-color-ink: #181d26; - --flex-color-body: #333840; - --flex-color-muted: #41454d; - --flex-color-hairline: #dddddd; - --flex-color-border-strong: #9297a0; - --flex-color-canvas: #ffffff; - --flex-color-surface-soft: #f8fafc; - --flex-color-surface-strong: #e0e2e6; - --flex-color-surface-dark: #181d26; - --flex-color-surface-dark-elevated: #1d1f25; - --flex-color-on-primary: #ffffff; + --flex-color-primary: #0075de; /* Notion Blue — single structural accent */ + --flex-color-primary-active: #005bab; /* Pressed Blue — CTA press state */ + --flex-color-secondary: #213183; /* Deep Indigo — hero "night" band */ + --flex-color-on-primary: #ffffff; /* Text on primary buttons / dark surfaces */ --flex-color-on-dark: #ffffff; - --flex-color-link: #1b61c9; - --flex-color-link-active: #1a3866; - --flex-color-info: #254fad; - --flex-color-info-border: #458fff; - --flex-color-success: #006400; - --flex-color-success-border: #39bf45; - --flex-color-pricing-ink: #1d1f25; - - /* Signature card surfaces */ - --flex-color-signature-coral: #aa2d00; - --flex-color-signature-forest: #0a2e0e; - --flex-color-signature-cream: #f5e9d4; - --flex-color-signature-peach: #fcab79; - --flex-color-signature-mint: #a8d8c4; - --flex-color-signature-yellow: #f4d35e; - --flex-color-signature-mustard: #d9a441; + + /* --- Surface --- */ + --flex-color-canvas: #ffffff; /* White — cards, panels, nav, fields */ + --flex-color-canvas-soft: #f6f5f4; /* Warm Paper — page canvas, footer */ + --flex-color-surface: #ffffff; /* Alias of canvas for figure/ground */ + --flex-color-hairline: #e6e6e6; /* 1px borders & dividers */ + + /* --- Text (ink hierarchy) --- */ + --flex-color-ink: #000000; /* Headings & body (rendered ~95% alpha) */ + --flex-color-ink-secondary: #31302e; /* Secondary body / footer */ + --flex-color-ink-muted: #615d59; /* Supporting / muted copy */ + --flex-color-ink-faint: #a39e98; /* Captions, metadata, placeholders */ + + /* --- Sticker Palette (DECORATION ONLY) --- */ + --flex-color-accent-sky: #62aef0; + --flex-color-accent-purple: #d6b6f6; + --flex-color-accent-purple-deep: #391c57; + --flex-color-accent-pink: #ff64c8; + --flex-color-accent-orange: #dd5b00; + --flex-color-accent-orange-deep: #793400; + --flex-color-accent-teal: #2a9d99; + --flex-color-accent-green: #1aae39; + --flex-color-accent-brown: #523410; + + /* --- Admin-derived semantics (DESIGN.md marketing surfaces omit a status ramp) --- */ + --flex-color-success: #1aae39; /* = accent-green */ + --flex-color-warning: #dd5b00; /* = accent-orange */ + --flex-color-info: #0075de; /* = primary */ + --flex-color-error: #e5484d; /* calm red */ /* ========================================================================== - Typography — Font Families + Typography — Font Family ========================================================================== */ - /* Inter Display: substitute for Haas Groot Disp (display sizes) */ - --flex-font-display: 'Inter Display', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; - /* Inter: substitute for Haas Grotesk (24px and below) */ - --flex-font-body: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; + /* Inter substitutes NotionInter; one family carries 64px display → 12px eyebrow. */ + --flex-font: 'Inter', -apple-system, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif; /* ========================================================================== - Typography — Scales + Typography — Scales (size / weight / line-height / letter-spacing) ========================================================================== */ - /* display-xl: 48px / 500 / 1.1 / 0 — Articles page h2 */ - --flex-type-display-xl-size: 48px; - --flex-type-display-xl-weight: 500; - --flex-type-display-xl-line: 1.1; - --flex-type-display-xl-spacing: 0; - /* display-lg: 40px / 400 / 1.2 / 0 — Homepage h1 hero */ - --flex-type-display-lg-size: 40px; - --flex-type-display-lg-weight: 400; - --flex-type-display-lg-line: 1.2; - --flex-type-display-lg-spacing: 0; - /* display-md: 32px / 400 / 1.2 / 0 — Feature-section headlines */ - --flex-type-display-md-size: 32px; - --flex-type-display-md-weight: 400; - --flex-type-display-md-line: 1.2; - --flex-type-display-md-spacing: 0; - /* title-lg: 24px / 400 / 1.35 / 0.12px — Section titles */ - --flex-type-title-lg-size: 24px; - --flex-type-title-lg-weight: 400; - --flex-type-title-lg-line: 1.35; - --flex-type-title-lg-spacing: 0.12px; - /* title-md: 20px / 400 / 1.5 / 0 — Sub-section titles */ - --flex-type-title-md-size: 20px; - --flex-type-title-md-weight: 400; - --flex-type-title-md-line: 1.5; - --flex-type-title-md-spacing: 0; - /* title-sm: 18px / 500 / 1.4 / 0 — Article-card titles */ - --flex-type-title-sm-size: 18px; - --flex-type-title-sm-weight: 500; - --flex-type-title-sm-line: 1.4; - --flex-type-title-sm-spacing: 0; - /* label-md: 16px / 500 / 1.4 / 0 — Demo-card titles, list labels */ - --flex-type-label-md-size: 16px; - --flex-type-label-md-weight: 500; - --flex-type-label-md-line: 1.4; - --flex-type-label-md-spacing: 0; - /* button: 16px / 500 / 1.4 / 0 — CTA button labels */ + /* display-1: 64px / 700 / 1.0 / −2.125px — Hero headline */ + --flex-type-display-1-size: 64px; + --flex-type-display-1-weight: 700; + --flex-type-display-1-line: 1.0; + --flex-type-display-1-spacing: -2.125px; + /* display-2: 54px / 700 / 1.04 / −1.875px — Large section headlines */ + --flex-type-display-2-size: 54px; + --flex-type-display-2-weight: 700; + --flex-type-display-2-line: 1.04; + --flex-type-display-2-spacing: -1.875px; + /* heading-1: 40px / 700 / 1.1 / −1px — Section headlines */ + --flex-type-heading-1-size: 40px; + --flex-type-heading-1-weight: 700; + --flex-type-heading-1-line: 1.1; + --flex-type-heading-1-spacing: -1px; + /* heading-2: 26px / 700 / 1.23 / −0.625px — Sub-section headings */ + --flex-type-heading-2-size: 26px; + --flex-type-heading-2-weight: 700; + --flex-type-heading-2-line: 1.23; + --flex-type-heading-2-spacing: -0.625px; + /* heading-3: 22px / 700 / 1.27 / −0.25px — Card titles */ + --flex-type-heading-3-size: 22px; + --flex-type-heading-3-weight: 700; + --flex-type-heading-3-line: 1.27; + --flex-type-heading-3-spacing: -0.25px; + /* title: 20px / 600 / 1.4 / −0.125px — Feature titles, callouts */ + --flex-type-title-size: 20px; + --flex-type-title-weight: 600; + --flex-type-title-line: 1.4; + --flex-type-title-spacing: -0.125px; + /* body-md: 16px / 400 / 1.5 / 0 — Default body copy */ + --flex-type-body-md-size: 16px; + --flex-type-body-md-weight: 400; + --flex-type-body-md-line: 1.5; + --flex-type-body-md-spacing: 0; + /* body-sm: 15px / 400 / 1.33 / 0 — Dense body, table rows, nav */ + --flex-type-body-sm-size: 15px; + --flex-type-body-sm-weight: 400; + --flex-type-body-sm-line: 1.33; + --flex-type-body-sm-spacing: 0; + /* button: 16px / 500 / 1.5 / 0 — Button labels */ --flex-type-button-size: 16px; --flex-type-button-weight: 500; - --flex-type-button-line: 1.4; + --flex-type-button-line: 1.5; --flex-type-button-spacing: 0; - /* body-md: 14px / 400 / 1.25 / 0 — Body copy, footer, nav */ - --flex-type-body-md-size: 14px; - --flex-type-body-md-weight: 400; - --flex-type-body-md-line: 1.25; - --flex-type-body-md-spacing: 0; - /* caption: 14px / 500 / 1.35 / 0.16px — Captions, meta text */ + /* caption: 14px / 400 / 1.43 / 0 — Captions, footnotes */ --flex-type-caption-size: 14px; - --flex-type-caption-weight: 500; - --flex-type-caption-line: 1.35; - --flex-type-caption-spacing: 0.16px; - /* legal: 13.12px / 600 / 1.2 / 0 — Cookie/legal CTAs */ - --flex-type-legal-size: 13.12px; - --flex-type-legal-weight: 600; - --flex-type-legal-line: 1.2; - --flex-type-legal-spacing: 0; - /* pricing-display: 44.8px / 475 / 1.1 / 0 — Pricing-page h1 */ - --flex-type-pricing-display-size: 44.8px; - --flex-type-pricing-display-weight: 475; - --flex-type-pricing-display-line: 1.1; - --flex-type-pricing-display-spacing: 0; - /* pricing-section: 28px / 475 / 1.2 / 0 — Pricing section heads */ - --flex-type-pricing-section-size: 28px; - --flex-type-pricing-section-weight: 475; - --flex-type-pricing-section-line: 1.2; - --flex-type-pricing-section-spacing: 0; - /* pricing-card-title: 20px / 475 / 1.3 / 0 — Plan name */ - --flex-type-pricing-card-title-size: 20px; - --flex-type-pricing-card-title-weight: 475; - --flex-type-pricing-card-title-line: 1.3; - --flex-type-pricing-card-title-spacing: 0; + --flex-type-caption-weight: 400; + --flex-type-caption-line: 1.43; + --flex-type-caption-spacing: 0; + /* eyebrow: 12px / 600 / 1.33 / +0.125px — Pill badges, small labels */ + --flex-type-eyebrow-size: 12px; + --flex-type-eyebrow-weight: 600; + --flex-type-eyebrow-line: 1.33; + --flex-type-eyebrow-spacing: 0.125px; /* ========================================================================== Border Radius ========================================================================== */ - --flex-rounded-xs: 2px; /* Cookie/legal CTAs */ - --flex-rounded-sm: 6px; /* Text inputs, small inline buttons */ - --flex-rounded-md: 10px; /* Content cards, article cards, cream callouts */ - --flex-rounded-lg: 12px; /* Primary CTAs, signature cards, tabbed feature cards */ - --flex-rounded-pill: 9999px; /* Pricing-page CTAs (sub-system only) */ - --flex-rounded-full: 9999px; /* Circular icon buttons, avatars */ + --flex-rounded-xs: 4px; /* Form fields — tighter than pill CTAs */ + --flex-rounded-sm: 5px; /* Small inline surfaces */ + --flex-rounded-md: 8px; /* Utility buttons, nav buttons, pricing columns */ + --flex-rounded-lg: 12px; /* Feature cards, modals, popovers */ + --flex-rounded-xl: 16px; /* Large marketing surfaces */ + --flex-rounded-full: 9999px; /* Pill CTAs, circular icons, badge pills */ /* ========================================================================== Spacing @@ -145,91 +135,131 @@ --flex-space-xs: 8px; --flex-space-sm: 12px; --flex-space-md: 16px; - --flex-space-lg: 24px; /* Gutter between cards in 3-up grids */ - --flex-space-xl: 32px; /* Tabbed feature cards, pricing tier cards internal padding */ - --flex-space-xxl: 48px; /* Signature card internal padding, breathing room */ - --flex-space-section: 96px; /* Universal vertical rhythm constant between major bands */ + --flex-space-lg: 24px; /* Card interior padding */ + --flex-space-xl: 28px; + --flex-space-xxl: 32px; /* Footer / hero padding */ /* ========================================================================== - Component: button-primary + Component: button-primary (pill CTA) ========================================================================== */ --flex-btn-primary-bg: var(--flex-color-primary); --flex-btn-primary-color: var(--flex-color-on-primary); - --flex-btn-primary-font: var(--flex-font-body); --flex-btn-primary-size: var(--flex-type-button-size); --flex-btn-primary-weight: var(--flex-type-button-weight); --flex-btn-primary-line: var(--flex-type-button-line); --flex-btn-primary-spacing: var(--flex-type-button-spacing); - --flex-btn-primary-rounded: var(--flex-rounded-lg); - --flex-btn-primary-padding: 16px 24px; + --flex-btn-primary-rounded: var(--flex-rounded-full); + --flex-btn-primary-padding: 8px 20px; /* ========================================================================== - Component: button-secondary + Component: button-secondary (pill) ========================================================================== */ - --flex-btn-secondary-bg: var(--flex-color-canvas); + --flex-btn-secondary-bg: var(--flex-color-surface); --flex-btn-secondary-color: var(--flex-color-ink); --flex-btn-secondary-border: 1px solid var(--flex-color-hairline); - --flex-btn-secondary-font: var(--flex-font-body); --flex-btn-secondary-size: var(--flex-type-button-size); --flex-btn-secondary-weight: var(--flex-type-button-weight); --flex-btn-secondary-line: var(--flex-type-button-line); - --flex-btn-secondary-rounded: var(--flex-rounded-lg); - --flex-btn-secondary-padding: 16px 24px; + --flex-btn-secondary-rounded: var(--flex-rounded-full); + --flex-btn-secondary-padding: 8px 20px; + + /* ========================================================================== + Component: button-utility (tight 8px) + ========================================================================== */ + --flex-btn-utility-bg: var(--flex-color-surface); + --flex-btn-utility-color: var(--flex-color-ink); + --flex-btn-utility-rounded: var(--flex-rounded-md); + --flex-btn-utility-padding: 4px 14px; /* ========================================================================== - Component: top-nav + Component: badge-pill (eyebrow / category) + ========================================================================== */ + --flex-badge-pill-bg: var(--flex-color-surface); + --flex-badge-pill-color: var(--flex-color-primary); + --flex-badge-pill-size: var(--flex-type-eyebrow-size); + --flex-badge-pill-weight: var(--flex-type-eyebrow-weight); + --flex-badge-pill-rounded: var(--flex-rounded-full); + --flex-badge-pill-padding: 4px 8px; + + /* ========================================================================== + Component: nav-bar ========================================================================== */ --flex-topnav-bg: var(--flex-color-canvas); --flex-topnav-color: var(--flex-color-ink); --flex-topnav-height: 64px; - --flex-topnav-font: var(--flex-font-body); - --flex-topnav-size: var(--flex-type-body-md-size); + --flex-topnav-size: var(--flex-type-body-sm-size); /* ========================================================================== - Component: text-input + Component: text-input (tight 4px corners) ========================================================================== */ - --flex-input-bg: var(--flex-color-canvas); + --flex-input-bg: var(--flex-color-surface); --flex-input-color: var(--flex-color-ink); - --flex-input-border: 1px solid var(--flex-color-hairline); - --flex-input-rounded: var(--flex-rounded-sm); - --flex-input-padding: 12px 16px; - --flex-input-height: 44px; - --flex-input-font: var(--flex-font-body); - --flex-input-size: var(--flex-type-body-md-size); + --flex-input-border: 1px solid rgb(221, 221, 221); + --flex-input-rounded: var(--flex-rounded-xs); + --flex-input-padding: 6px; + --flex-input-size: var(--flex-type-body-sm-size); /* ========================================================================== - Component: cards + Component: feature-card ========================================================================== */ - --flex-card-bg: var(--flex-color-canvas); + --flex-card-bg: var(--flex-color-surface); --flex-card-color: var(--flex-color-ink); - --flex-card-rounded: var(--flex-rounded-md); - --flex-card-padding: 16px; + --flex-card-rounded: var(--flex-rounded-lg); + --flex-card-padding: var(--flex-space-lg); + + /* ========================================================================== + Component: hero-band (dark "night" hero) + ========================================================================== */ + --flex-hero-band-bg: var(--flex-color-secondary); + --flex-hero-band-color: var(--flex-color-on-primary); + --flex-hero-band-size: var(--flex-type-display-1-size); + --flex-hero-band-padding: var(--flex-space-xxl); + + /* ========================================================================== + Component: footer + ========================================================================== */ + --flex-footer-bg: var(--flex-color-canvas-soft); + --flex-footer-color: var(--flex-color-ink-secondary); + --flex-footer-size: var(--flex-type-caption-size); + --flex-footer-padding: var(--flex-space-xxl); /* ========================================================================== - Elevation + Elevation — Notion: many near-transparent layers, never a hard cast ========================================================================== */ - /* Button rest: soft drop with subtle blue-tinted glow at low alpha */ - --flex-shadow-button: 0 2px 0 rgba(27, 97, 201, 0.02); - /* Button focus: outer 2px blue ring at higher alpha */ - --flex-shadow-button-focus: 0 0 0 2px rgba(69, 143, 255, 0.35); + /* Level-0: resting hairline glow */ + --flex-shadow-1: 0 1px 2px rgba(15, 15, 15, 0.04); + /* Level-1: cards floating above the canvas */ + --flex-shadow-2: 0 1px 2px rgba(15, 15, 15, 0.03), 0 2px 4px rgba(15, 15, 15, 0.04), 0 4px 8px rgba(15, 15, 15, 0.03); + /* Level-2: floating panels, dropdowns, popovers */ + --flex-shadow-3: 0 2px 4px rgba(15, 15, 15, 0.04), 0 4px 8px rgba(15, 15, 15, 0.05), 0 12px 24px rgba(15, 15, 15, 0.04); + /* Focus ring — primary blue */ + --flex-shadow-focus: 0 0 0 2px rgba(0, 117, 222, 0.35); } /* ========================================================================== - Dark Mode Overrides — Significantly lifted for comfortable viewing + Dark Mode Overrides — lifted ~15% for comfortable viewing ========================================================================== */ html.dark { + --flex-color-primary: #458fff; + --flex-color-primary-active: #2b6fcc; + --flex-color-secondary: #1a1638; + --flex-color-canvas: #232830; - --flex-color-surface-soft: #2c323c; - --flex-color-surface-strong: #363d48; + --flex-color-canvas-soft: #2c323c; + --flex-color-surface: #2c323c; --flex-color-hairline: #4a5260; - --flex-color-border-strong: #787e8c; + --flex-color-ink: #f5f6f8; - --flex-color-body: #bcc0cc; - --flex-color-muted: #9499a6; - --flex-color-link: #6badff; - --flex-color-link-active: #458fff; + --flex-color-ink-secondary: #bcc0cc; + --flex-color-ink-muted: #9499a6; + --flex-color-ink-faint: #787e8c; + + --flex-color-success: #39bf45; + --flex-color-warning: #ff9f40; + --flex-color-info: #458fff; + --flex-color-error: #ff6b6b; - --flex-btn-primary-bg: #6badff; + --flex-btn-primary-bg: #458fff; --flex-btn-primary-color: #ffffff; --flex-btn-secondary-bg: #2c323c; --flex-btn-secondary-color: #f5f6f8; @@ -245,77 +275,107 @@ html.dark { --flex-card-bg: #2c323c; --flex-card-color: #f5f6f8; - --flex-shadow-button: 0 2px 0 rgba(0, 0, 0, 0.25); - --flex-shadow-button-focus: 0 0 0 2px rgba(69, 143, 255, 0.4); + --flex-hero-band-bg: #1a1638; + --flex-hero-band-color: #f5f6f8; + + --flex-footer-bg: #232830; + --flex-footer-color: #bcc0cc; + + --flex-shadow-1: 0 1px 2px rgba(0, 0, 0, 0.25); + --flex-shadow-2: 0 1px 2px rgba(0, 0, 0, 0.2), 0 2px 4px rgba(0, 0, 0, 0.22), 0 4px 8px rgba(0, 0, 0, 0.2); + --flex-shadow-3: 0 2px 4px rgba(0, 0, 0, 0.22), 0 4px 8px rgba(0, 0, 0, 0.25), 0 12px 24px rgba(0, 0, 0, 0.22); + --flex-shadow-focus: 0 0 0 2px rgba(69, 143, 255, 0.4); } /* ========================================================================== Utility Classes — Typography ========================================================================== */ -.flex-type-display-xl { - font-family: var(--flex-font-display); - font-size: var(--flex-type-display-xl-size); - font-weight: var(--flex-type-display-xl-weight); - line-height: var(--flex-type-display-xl-line); - letter-spacing: var(--flex-type-display-xl-spacing); +.flex-type-display-1 { + font-family: var(--flex-font); + font-size: var(--flex-type-display-1-size); + font-weight: var(--flex-type-display-1-weight); + line-height: var(--flex-type-display-1-line); + letter-spacing: var(--flex-type-display-1-spacing); } -.flex-type-display-lg { - font-family: var(--flex-font-display); - font-size: var(--flex-type-display-lg-size); - font-weight: var(--flex-type-display-lg-weight); - line-height: var(--flex-type-display-lg-line); - letter-spacing: var(--flex-type-display-lg-spacing); -} -.flex-type-display-md { - font-family: var(--flex-font-display); - font-size: var(--flex-type-display-md-size); - font-weight: var(--flex-type-display-md-weight); - line-height: var(--flex-type-display-md-line); - letter-spacing: var(--flex-type-display-md-spacing); + +.flex-type-display-2 { + font-family: var(--flex-font); + font-size: var(--flex-type-display-2-size); + font-weight: var(--flex-type-display-2-weight); + line-height: var(--flex-type-display-2-line); + letter-spacing: var(--flex-type-display-2-spacing); } -.flex-type-title-lg { - font-family: var(--flex-font-body); - font-size: var(--flex-type-title-lg-size); - font-weight: var(--flex-type-title-lg-weight); - line-height: var(--flex-type-title-lg-line); - letter-spacing: var(--flex-type-title-lg-spacing); + +.flex-type-heading-1 { + font-family: var(--flex-font); + font-size: var(--flex-type-heading-1-size); + font-weight: var(--flex-type-heading-1-weight); + line-height: var(--flex-type-heading-1-line); + letter-spacing: var(--flex-type-heading-1-spacing); } -.flex-type-title-md { - font-family: var(--flex-font-display); - font-size: var(--flex-type-title-md-size); - font-weight: var(--flex-type-title-md-weight); - line-height: var(--flex-type-title-md-line); - letter-spacing: var(--flex-type-title-md-spacing); + +.flex-type-heading-2 { + font-family: var(--flex-font); + font-size: var(--flex-type-heading-2-size); + font-weight: var(--flex-type-heading-2-weight); + line-height: var(--flex-type-heading-2-line); + letter-spacing: var(--flex-type-heading-2-spacing); } -.flex-type-title-sm { - font-family: var(--flex-font-body); - font-size: var(--flex-type-title-sm-size); - font-weight: var(--flex-type-title-sm-weight); - line-height: var(--flex-type-title-sm-line); - letter-spacing: var(--flex-type-title-sm-spacing); + +.flex-type-heading-3 { + font-family: var(--flex-font); + font-size: var(--flex-type-heading-3-size); + font-weight: var(--flex-type-heading-3-weight); + line-height: var(--flex-type-heading-3-line); + letter-spacing: var(--flex-type-heading-3-spacing); } -.flex-type-label-md { - font-family: var(--flex-font-body); - font-size: var(--flex-type-label-md-size); - font-weight: var(--flex-type-label-md-weight); - line-height: var(--flex-type-label-md-line); - letter-spacing: var(--flex-type-label-md-spacing); + +.flex-type-title { + font-family: var(--flex-font); + font-size: var(--flex-type-title-size); + font-weight: var(--flex-type-title-weight); + line-height: var(--flex-type-title-line); + letter-spacing: var(--flex-type-title-spacing); } .flex-type-body-md { - font-family: var(--flex-font-body); + font-family: var(--flex-font); font-size: var(--flex-type-body-md-size); font-weight: var(--flex-type-body-md-weight); line-height: var(--flex-type-body-md-line); letter-spacing: var(--flex-type-body-md-spacing); } + +.flex-type-body-sm { + font-family: var(--flex-font); + font-size: var(--flex-type-body-sm-size); + font-weight: var(--flex-type-body-sm-weight); + line-height: var(--flex-type-body-sm-line); + letter-spacing: var(--flex-type-body-sm-spacing); +} + +.flex-type-button { + font-family: var(--flex-font); + font-size: var(--flex-type-button-size); + font-weight: var(--flex-type-button-weight); + line-height: var(--flex-type-button-line); + letter-spacing: var(--flex-type-button-spacing); +} .flex-type-caption { - font-family: var(--flex-font-body); + font-family: var(--flex-font); font-size: var(--flex-type-caption-size); font-weight: var(--flex-type-caption-weight); line-height: var(--flex-type-caption-line); letter-spacing: var(--flex-type-caption-spacing); } +.flex-type-eyebrow { + font-family: var(--flex-font); + font-size: var(--flex-type-eyebrow-size); + font-weight: var(--flex-type-eyebrow-weight); + line-height: var(--flex-type-eyebrow-line); + letter-spacing: var(--flex-type-eyebrow-spacing); +} + /* ========================================================================== Utility Classes — Border Radius ========================================================================== */ @@ -323,5 +383,8 @@ html.dark { .flex-rounded-sm { border-radius: var(--flex-rounded-sm); } .flex-rounded-md { border-radius: var(--flex-rounded-md); } .flex-rounded-lg { border-radius: var(--flex-rounded-lg); } -.flex-rounded-pill { border-radius: var(--flex-rounded-pill); } + +.flex-rounded-xl { + border-radius: var(--flex-rounded-xl); +} .flex-rounded-full { border-radius: var(--flex-rounded-full); } diff --git a/src/theme/designTokens.ts b/src/theme/designTokens.ts index 9ab17d5..434fe83 100644 --- a/src/theme/designTokens.ts +++ b/src/theme/designTokens.ts @@ -1,77 +1,85 @@ /** - * Flexmodel Design Tokens + * Flexmodel Design Tokens — Notion Analysis * - * All design values derived from DESIGN.md (Airtable-design-analysis). - * This is the single source of truth for all visual properties. + * Single source of truth for all visual properties, derived from DESIGN.md + * (Notion Analysis): a warm paper-calm canvas, near-black Inter type, one + * confident blue accent, and a decorative-only sticker palette. * - * Token reference syntax: - * - {colors.*} → Color values - * - {typography.*} → Font stacks, sizes, weights, line heights - * - {rounded.*} → Border radius values - * - {spacing.*} → Spacing scale + * Token reference syntax (mirrors DESIGN.md): + * - {colors.*} → Color values + * - {typography.*} → Font stacks, sizes, weights, line heights, letter spacing + * - {rounded.*} → Border radius values + * - {spacing.*} → Spacing scale * - {components.*} → Component-level presets + * + * The entire system is set in a single family — NotionInter (substituted by + * Inter) — so every typography token shares one fontFamily. */ +// NotionInter is a proprietary tuning of Inter — substitute Inter directly. +// DESIGN.md: "fallback stack of Inter, -apple-system, system-ui, 'Segoe UI', Helvetica, Arial". +const notionInter = + "'Inter', -apple-system, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif"; + // ============================================================================ // Colors // ============================================================================ export const colors = { - /** Primary brand color — near-black CTA background, h1/h2 display type */ - primary: '#181d26', - /** Primary active/press state */ - 'primary-active': '#0d1218', - /** Strongest text — same hex as primary (same role at type layer) */ - ink: '#181d26', - /** Default running-text color */ - body: '#333840', - /** Footer links, breadcrumbs, captions */ - muted: '#41454d', - /** 1px border tone for inputs, table dividers, secondary-button outlines */ - hairline: '#dddddd', - /** 1px outline on disabled secondary buttons */ - 'border-strong': '#9297a0', - /** Default page surface */ - canvas: '#ffffff', - /** Tabbed feature cards, featured pricing tier */ - 'surface-soft': '#f8fafc', - /** Light gray CTA banner */ - 'surface-strong': '#e0e2e6', - /** Dark navy CTA cards */ - 'surface-dark': '#181d26', - /** Articles-page hero base */ - 'surface-dark-elevated': '#1d1f25', - /** Signature full-bleed coral card */ - 'signature-coral': '#aa2d00', - /** Signature full-bleed forest card */ - 'signature-forest': '#0a2e0e', - /** Cream callout band */ - 'signature-cream': '#f5e9d4', - /** Demo-grid warm pastel surface */ - 'signature-peach': '#fcab79', - /** Demo-grid cool pastel surface */ - 'signature-mint': '#a8d8c4', - /** Demo-grid accent surface */ - 'signature-yellow': '#f4d35e', - /** Demo-grid accent surface */ - 'signature-mustard': '#d9a441', - /** Text on primary buttons and dark surfaces */ + // --- Brand & Accent --- + /** Notion Blue — the single structural accent: primary CTA, inline links, active/focus signal. */ + primary: '#0075de', + /** Pressed Blue — darker press state of the primary CTA. */ + 'primary-active': '#005bab', + /** Deep Indigo — the dark hero "night" band background (full-bleed inverted sections). */ + secondary: '#213183', + /** Text on primary buttons and dark surfaces. */ 'on-primary': '#ffffff', - /** Text on dark surfaces */ + /** Text on dark surfaces. */ 'on-dark': '#ffffff', - /** Inline body links and anchor text */ - link: '#1b61c9', - /** Link active/press state */ - 'link-active': '#1a3866', - /** Info badges, focused-input outline */ - info: '#254fad', - /** Info border */ - 'info-border': '#458fff', - /** Confirmation states */ - success: '#006400', - /** Success border */ - 'success-border': '#39bf45', - /** Pricing-page ink — slightly different from editorial ink */ - 'pricing-ink': '#1d1f25', + + // --- Surface --- + /** White — card and panel surfaces, nav bar, form fields. */ + canvas: '#ffffff', + /** Warm Paper — signature page canvas and footer band (warm off-white). */ + 'canvas-soft': '#f6f5f4', + /** White — alias of canvas for card/field figure/ground separation. */ + surface: '#ffffff', + /** 1px card borders and dividers (black-at-10%-on-white, kept solid for reuse). */ + hairline: '#e6e6e6', + + // --- Text --- + /** Ink — primary headings and body text (DESIGN.md renders at ~95% alpha for a soft true-black). */ + ink: '#000000', + /** Warm Charcoal — secondary body copy and footer text. */ + 'ink-secondary': '#31302e', + /** Stone — supporting / muted copy. */ + 'ink-muted': '#615d59', + /** Ash — captions, metadata, placeholder text. */ + 'ink-faint': '#a39e98', + + // --- Sticker Palette (DECORATION ONLY — never paints a CTA or structural fill) --- + 'accent-sky': '#62aef0', + 'accent-purple': '#d6b6f6', + 'accent-purple-deep': '#391c57', + 'accent-pink': '#ff64c8', + 'accent-orange': '#dd5b00', + 'accent-orange-deep': '#793400', + 'accent-teal': '#2a9d99', + 'accent-green': '#1aae39', + 'accent-brown': '#523410', + + // --- Admin-derived semantics --- + // DESIGN.md's marketing surfaces omit a dedicated error/success ramp (status is + // carried by the sticker palette). The admin console requires explicit semantic + // colors, so these are derived from the sticker palette / standard calm tones. + /** Success — affirmative states (derived from accent-green). */ + success: '#1aae39', + /** Warning — caution states (derived from accent-orange). */ + warning: '#dd5b00', + /** Info — informational states (mirrors the primary blue). */ + info: '#0075de', + /** Error — destructive states (calm red; not a Notion sticker colour). */ + error: '#e5484d', } as const; export type ColorToken = keyof typeof colors; @@ -80,103 +88,93 @@ export type ColorToken = keyof typeof colors; // Typography // ============================================================================ export const typography = { - 'display-xl': { - fontFamily: 'Inter Display, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif', - fontSize: 48, - fontWeight: 500, - lineHeight: 1.1, - letterSpacing: 0, - }, - 'display-lg': { - fontFamily: 'Inter Display, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif', + // display-1: 64px / 700 / 1.0 / −2.125px — Hero headline + 'display-1': { + fontFamily: notionInter, + fontSize: 64, + fontWeight: 700, + lineHeight: 1.0, + letterSpacing: -2.125, + }, + // display-2: 54px / 700 / 1.04 / −1.875px — Large section headlines + 'display-2': { + fontFamily: notionInter, + fontSize: 54, + fontWeight: 700, + lineHeight: 1.04, + letterSpacing: -1.875, + }, + // heading-1: 40px / 700 / 1.1 / −1px — Section headlines + 'heading-1': { + fontFamily: notionInter, fontSize: 40, - fontWeight: 400, - lineHeight: 1.2, - letterSpacing: 0, - }, - 'display-md': { - fontFamily: 'Inter Display, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif', - fontSize: 32, - fontWeight: 400, - lineHeight: 1.2, - letterSpacing: 0, - }, - 'title-lg': { - fontFamily: 'Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif', - fontSize: 24, - fontWeight: 400, - lineHeight: 1.35, - letterSpacing: 0.12, - }, - 'title-md': { - fontFamily: 'Inter Display, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif', + fontWeight: 700, + lineHeight: 1.1, + letterSpacing: -1, + }, + // heading-2: 26px / 700 / 1.23 / −0.625px — Sub-section headings + 'heading-2': { + fontFamily: notionInter, + fontSize: 26, + fontWeight: 700, + lineHeight: 1.23, + letterSpacing: -0.625, + }, + // heading-3: 22px / 700 / 1.27 / −0.25px — Card titles + 'heading-3': { + fontFamily: notionInter, + fontSize: 22, + fontWeight: 700, + lineHeight: 1.27, + letterSpacing: -0.25, + }, + // title: 20px / 600 / 1.4 / −0.125px — Feature titles, callouts + title: { + fontFamily: notionInter, fontSize: 20, + fontWeight: 600, + lineHeight: 1.4, + letterSpacing: -0.125, + }, + // body-md: 16px / 400 / 1.5 / 0 — Default body copy + 'body-md': { + fontFamily: notionInter, + fontSize: 16, fontWeight: 400, lineHeight: 1.5, letterSpacing: 0, }, - 'title-sm': { - fontFamily: 'Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif', - fontSize: 18, - fontWeight: 500, - lineHeight: 1.4, - letterSpacing: 0, - }, - 'label-md': { - fontFamily: 'Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif', - fontSize: 16, - fontWeight: 500, - lineHeight: 1.4, + // body-sm: 15px / 400 / 1.33 / 0 — Dense body, table rows, nav + 'body-sm': { + fontFamily: notionInter, + fontSize: 15, + fontWeight: 400, + lineHeight: 1.33, letterSpacing: 0, }, + // button: 16px / 500 / 1.5 / 0 — Button labels button: { - fontFamily: 'Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif', + fontFamily: notionInter, fontSize: 16, fontWeight: 500, - lineHeight: 1.4, + lineHeight: 1.5, letterSpacing: 0, }, - 'body-md': { - fontFamily: 'Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif', + // caption: 14px / 400 / 1.43 / 0 — Captions, footnotes + caption: { + fontFamily: notionInter, fontSize: 14, fontWeight: 400, - lineHeight: 1.25, + lineHeight: 1.43, letterSpacing: 0, }, - caption: { - fontFamily: 'Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif', - fontSize: 14, - fontWeight: 500, - lineHeight: 1.35, - letterSpacing: 0.16, - }, - legal: { - fontFamily: 'Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif', - fontSize: 13.12, + // eyebrow: 12px / 600 / 1.33 / +0.125px — Pill badges, small labels + eyebrow: { + fontFamily: notionInter, + fontSize: 12, fontWeight: 600, - lineHeight: 1.2, - letterSpacing: 0, - }, - 'pricing-display': { - fontFamily: 'Inter Display, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif', - fontSize: 44.8, - fontWeight: 475, - lineHeight: 1.1, - letterSpacing: 0, - }, - 'pricing-section': { - fontFamily: 'Inter Display, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif', - fontSize: 28, - fontWeight: 475, - lineHeight: 1.2, - letterSpacing: 0, - }, - 'pricing-card-title': { - fontFamily: 'Inter Display, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif', - fontSize: 20, - fontWeight: 475, - lineHeight: 1.3, - letterSpacing: 0, + lineHeight: 1.33, + letterSpacing: 0.125, }, } as const; @@ -186,17 +184,17 @@ export type TypographyToken = keyof typeof typography; // Border Radius // ============================================================================ export const rounded = { - /** Cookie-consent and legal CTA buttons — system-required surfaces */ - xs: 2, - /** Text inputs, small inline buttons */ - sm: 6, - /** Secondary content cards, article cards, cream callouts */ - md: 10, - /** Primary CTA buttons, signature surface cards, tabbed feature cards */ + /** Form fields — deliberately tighter than the pill CTAs. */ + xs: 4, + /** Small inline surfaces. */ + sm: 5, + /** Utility buttons, nav buttons, pricing columns. */ + md: 8, + /** Feature cards, modals, popovers. */ lg: 12, - /** Pricing-page CTA buttons (sub-system only) */ - pill: 9999, - /** Circular icon buttons, avatar surfaces */ + /** Large marketing surfaces. */ + xl: 16, + /** Fully pill CTAs, circular icon buttons, badge pills. */ full: 9999, } as const; @@ -206,199 +204,188 @@ export type RoundedToken = keyof typeof rounded; // Spacing // ============================================================================ export const spacing = { - /** 4px — minimum spacing unit */ + /** 4px — minimum spacing unit. */ xxs: 4, - /** 8px */ + /** 8px. */ xs: 8, - /** 12px */ + /** 12px. */ sm: 12, - /** 16px */ + /** 16px. */ md: 16, - /** 24px — gutter between cards in 3-up grids */ + /** 24px — card interior padding. */ lg: 24, - /** 32px — tabbed feature cards, pricing tier cards internal padding */ - xl: 32, - /** 48px — signature card internal padding, breathing room */ - xxl: 48, - /** 96px — universal vertical rhythm constant between major bands */ - section: 96, + /** 28px. */ + xl: 28, + /** 32px — footer / hero padding. */ + xxl: 32, } as const; export type SpacingToken = keyof typeof spacing; // ============================================================================ -// Components +// Components — DESIGN.md component presets // ============================================================================ export const components = { + // --- Navigation --- + 'nav-bar': { + backgroundColor: colors.canvas, + textColor: colors.ink, + typography: typography['body-sm'], + padding: spacing.md, + }, + + // --- Buttons --- 'button-primary': { backgroundColor: colors.primary, textColor: colors['on-primary'], typography: typography.button, - rounded: rounded.lg, - padding: '16px 24px', + rounded: rounded.full, + padding: '8px 20px', }, - 'button-primary-active': { + 'button-primary-pressed': { backgroundColor: colors['primary-active'], textColor: colors['on-primary'], - rounded: rounded.lg, + rounded: rounded.full, }, 'button-secondary': { - backgroundColor: colors.canvas, + backgroundColor: colors.surface, textColor: colors.ink, typography: typography.button, - rounded: rounded.lg, - padding: '16px 24px', + rounded: rounded.full, + padding: '8px 20px', }, - 'button-secondary-on-dark': { - backgroundColor: colors.canvas, + 'button-utility': { + backgroundColor: colors.surface, textColor: colors.ink, typography: typography.button, - rounded: rounded.lg, - padding: '16px 24px', - }, - 'button-legal': { - backgroundColor: colors.link, - textColor: colors['on-primary'], - typography: typography.legal, - rounded: rounded.xs, - padding: '12px 10px', + rounded: rounded.md, + padding: '4px 14px', }, 'button-icon-circular': { - backgroundColor: colors.canvas, - textColor: colors.ink, + backgroundColor: 'rgba(0, 0, 0, 0.05)', + textColor: colors['on-primary'], rounded: rounded.full, - size: 40, }, - 'button-pricing-pill': { - backgroundColor: colors.canvas, - textColor: colors['pricing-ink'], - typography: typography.button, - rounded: rounded.pill, - padding: '12px 24px', - }, - 'text-link': { - backgroundColor: 'transparent', - textColor: colors.link, - typography: typography['body-md'], + + // --- Badges --- + 'badge-pill': { + backgroundColor: colors.surface, + textColor: colors.primary, + typography: typography.eyebrow, + rounded: rounded.full, + padding: '4px 8px', }, - 'top-nav': { - backgroundColor: colors.canvas, + + // --- Cards --- + 'feature-card': { + backgroundColor: colors.surface, textColor: colors.ink, typography: typography['body-md'], - height: 64, - }, - 'hero-band': { - backgroundColor: colors.canvas, - textColor: colors.ink, - typography: typography['display-lg'], - padding: 96, - }, - 'signature-coral-card': { - backgroundColor: colors['signature-coral'], - textColor: colors['on-primary'], - typography: typography['display-md'], rounded: rounded.lg, - padding: 48, + padding: spacing.lg, }, - 'signature-forest-card': { - backgroundColor: colors['signature-forest'], - textColor: colors['on-primary'], - typography: typography['display-md'], - rounded: rounded.lg, - padding: 48, - }, - 'hero-card-dark': { - backgroundColor: colors['surface-dark'], - textColor: colors['on-dark'], - typography: typography['display-md'], - rounded: rounded.lg, - padding: 48, - }, - 'feature-card-tabbed': { - backgroundColor: colors['surface-soft'], + 'feature-card-elevated': { + backgroundColor: colors.surface, textColor: colors.ink, - typography: typography['title-lg'], rounded: rounded.lg, - padding: 32, + padding: spacing.lg, }, - 'cream-callout-card': { - backgroundColor: colors['signature-cream'], + 'pricing-plan-card': { + backgroundColor: colors.surface, textColor: colors.ink, - typography: typography['title-lg'], + typography: typography['body-sm'], rounded: rounded.md, - padding: 24, + padding: spacing.lg, }, - 'demo-grid-card': { - backgroundColor: colors.canvas, + 'pricing-plan-card-featured': { + backgroundColor: colors['canvas-soft'], textColor: colors.ink, - typography: typography['label-md'], rounded: rounded.md, - padding: 16, - }, - 'logo-strip': { - backgroundColor: colors.canvas, - textColor: colors.muted, - typography: typography['body-md'], - padding: 32, + padding: spacing.lg, }, - 'article-card': { - backgroundColor: colors.canvas, + + // --- Inputs & Forms --- + 'text-input': { + backgroundColor: colors.surface, textColor: colors.ink, - typography: typography['title-sm'], - rounded: rounded.md, - padding: 16, + typography: typography['body-sm'], + rounded: rounded.xs, + padding: 6, }, - 'topic-filter-rail': { - backgroundColor: colors.canvas, - textColor: colors.body, - typography: typography['body-md'], - width: 240, + + // --- Signature Components --- + 'hero-band': { + backgroundColor: colors.secondary, + textColor: colors['on-primary'], + typography: typography['display-1'], + padding: spacing.xxl, }, - 'text-input': { - backgroundColor: colors.canvas, - textColor: colors.ink, - typography: typography['body-md'], - rounded: rounded.sm, - padding: '12px 16px', - height: 44, + footer: { + backgroundColor: colors['canvas-soft'], + textColor: colors['ink-secondary'], + typography: typography.caption, + padding: spacing.xxl, }, - 'text-input-focus': { - backgroundColor: colors.canvas, + + // --- Examples (illustrative) — kit-mirror demonstration surfaces --- + 'ex-pricing-tier': { + backgroundColor: colors['canvas-soft'], textColor: colors.ink, - rounded: rounded.sm, - }, - 'pricing-tier-card': { - backgroundColor: colors.canvas, - textColor: colors['pricing-ink'], - typography: typography['pricing-card-title'], - rounded: rounded.md, - padding: 32, + borderColor: colors.hairline, + rounded: rounded.xl, + padding: spacing.lg, }, - 'pricing-tier-card-featured': { - backgroundColor: colors['surface-soft'], - textColor: colors['pricing-ink'], - typography: typography['pricing-card-title'], - rounded: rounded.md, - padding: 32, + 'ex-pricing-tier-featured': { + backgroundColor: colors.ink, + textColor: colors['on-primary'], + rounded: rounded.xl, + padding: spacing.lg, }, - 'pricing-comparison-row': { - backgroundColor: colors.canvas, - textColor: colors.body, - typography: typography['body-md'], - padding: 12, + 'ex-product-selector': { + backgroundColor: colors.surface, + rounded: rounded.xl, + padding: spacing.lg, }, - 'cta-band-light': { - backgroundColor: colors['surface-strong'], - textColor: colors.ink, - typography: typography['display-md'], - rounded: rounded.lg, - padding: 48, + 'ex-cart-drawer': { + backgroundColor: colors.surface, + rounded: rounded.xl, + padding: spacing.lg, + 'item-divider': colors.hairline, }, - footer: { + 'ex-app-shell-row': { backgroundColor: colors.canvas, - textColor: colors.body, - typography: typography['body-md'], - padding: 64, + activeIndicator: colors.primary, + rounded: rounded.sm, + padding: `${spacing.sm}px ${spacing.md}px`, + }, + 'ex-data-table-cell': { + headerBackground: colors['canvas-soft'], + headerTypography: typography.eyebrow, + bodyTypography: typography['body-sm'], + cellPadding: `${spacing.sm}px ${spacing.md}px`, + rowBorder: colors.hairline, + }, + 'ex-auth-form-card': { + backgroundColor: colors.surface, + rounded: rounded.xl, + padding: spacing.lg, + }, + 'ex-modal-card': { + backgroundColor: colors.surface, + rounded: rounded.xl, + padding: spacing.lg, + }, + 'ex-empty-state-card': { + backgroundColor: colors['canvas-soft'], + rounded: rounded.xl, + padding: spacing.xxl, + captionTypography: typography['body-md'], + }, + 'ex-toast': { + backgroundColor: colors.surface, + rounded: rounded.xl, + padding: `${spacing.sm}px ${spacing.md}px`, + typography: typography['body-sm'], }, } as const; @@ -408,112 +395,124 @@ export type ComponentToken = keyof typeof components; // Ant Design v6 Token Mapping // ============================================================================ -/** Ant Design seed tokens derived from DESIGN.md */ +/** Ant Design seed tokens derived from DESIGN.md (Notion Analysis). */ export const antdSeedTokens = { - // Primary — near-black, per DESIGN.md: "primary is #181d26, NOT link-blue" + // Primary — Notion Blue, the single structural accent. colorPrimary: colors.primary, - // Semantic colors + // Semantic colors (admin-derived; DESIGN.md marketing surfaces omit a status ramp). colorSuccess: colors.success, colorInfo: colors.info, - colorWarning: '#d9a441', // derived from signature-mustard (closest warning tone) - colorError: colors['signature-coral'], - // Text base — strongest text is ink + colorWarning: colors.warning, + colorError: colors.error, + // Text base — near-black ink. colorTextBase: colors.ink, - // Background base — white canvas + // Background base — white canvas. colorBgBase: colors.canvas, - // Base font size — body-md is 14px - fontSize: 14, - // Base border radius — DESIGN.md sm (6px) for inputs - borderRadius: 6, - // Font family — Inter as Haas substitute - fontFamily: typography['body-md'].fontFamily, + // Base font size — caption (14px) keeps admin console density; the full + // DESIGN.md type scale (16/15/14/12) is exposed via the typography tokens. + fontSize: typography.caption.fontSize, + // Base border radius — utility-button tight (8px). + borderRadius: rounded.md, + // Font family — Inter (NotionInter substitute). + fontFamily: notionInter, } as const; -/** Ant Design light-mode color map tokens */ +/** Ant Design light-mode color map tokens. */ export const antdMapTokens = { - // --- Text Colors --- - colorText: colors.body, - colorTextSecondary: colors.muted, - colorTextTertiary: colors.muted, - colorTextQuaternary: colors['border-strong'], + // --- Text Colors (ink hierarchy) --- + colorText: colors.ink, + colorTextSecondary: colors['ink-secondary'], + colorTextTertiary: colors['ink-muted'], + colorTextQuaternary: colors['ink-faint'], // --- Background Colors --- + // Cards / fields / panels stay pure white; the page canvas is warm canvas-soft. colorBgContainer: colors.canvas, colorBgElevated: colors.canvas, - colorBgLayout: colors.canvas, - colorBgSpotlight: colors['surface-dark'], + colorBgLayout: colors['canvas-soft'], + // Tooltip / popover spotlight — antd inverts this surface (dark bg + white text) + // regardless of light/dark mode. Must NOT be white, or text becomes invisible. + colorBgSpotlight: 'rgba(0, 0, 0, 0.85)', + colorTextLightSolid: '#ffffff', colorBgMask: 'rgba(0,0,0,0.45)', - + // --- Fill Colors (warm neutrals) --- + colorFill: 'rgba(0,0,0,0.06)', + colorFillSecondary: 'rgba(0,0,0,0.04)', + colorFillTertiary: 'rgba(0,0,0,0.03)', + colorFillQuaternary: 'rgba(0,0,0,0.02)', // --- Border Colors --- colorBorder: colors.hairline, colorBorderSecondary: colors.hairline, - // --- Link --- - colorLink: colors.link, - colorLinkHover: colors.link, - colorLinkActive: colors['link-active'], + // --- Link (inline links use the primary blue) --- + colorLink: colors.primary, + colorLinkHover: '#0066c9', + colorLinkActive: colors['primary-active'], - // --- Primary Derivations --- - colorPrimaryBg: '#e6f4ff', - colorPrimaryBgHover: '#bae0ff', + // --- Primary Derivations (blue ramp) --- + colorPrimaryBg: '#e8f3fc', + colorPrimaryBgHover: '#d4ecfa', colorPrimaryBorder: colors.primary, - colorPrimaryBorderHover: colors.primary, - colorPrimaryHover: colors.body, + colorPrimaryBorderHover: '#0066c9', + colorPrimaryHover: '#0066c9', colorPrimaryActive: colors['primary-active'], - colorPrimaryTextHover: colors.body, + colorPrimaryTextHover: '#0066c9', colorPrimaryText: colors.primary, colorPrimaryTextActive: colors['primary-active'], - // --- Info Derivations --- - colorInfoBg: '#e6f4ff', - colorInfoBgHover: '#bae0ff', - colorInfoBorder: colors['info-border'], - colorInfoBorderHover: colors['info-border'], - colorInfoHover: colors.info, - colorInfoActive: colors.info, - colorInfoTextHover: colors.info, + // --- Info Derivations (mirrors the primary blue) --- + colorInfoBg: '#e8f3fc', + colorInfoBgHover: '#d4ecfa', + colorInfoBorder: colors.info, + colorInfoBorderHover: '#0066c9', + colorInfoHover: '#0066c9', + colorInfoActive: colors['primary-active'], + colorInfoTextHover: '#0066c9', colorInfoText: colors.info, - colorInfoTextActive: colors.info, - - // --- Success Derivations --- - colorSuccessBg: '#f6ffed', - colorSuccessBgHover: '#d9f7be', - colorSuccessBorder: colors['success-border'], - colorSuccessBorderHover: colors['success-border'], - colorSuccessHover: colors.success, - colorSuccessActive: colors.success, - colorSuccessTextHover: colors.success, + colorInfoTextActive: colors['primary-active'], + + // --- Success Derivations (accent-green) --- + colorSuccessBg: '#e8f8ec', + colorSuccessBgHover: '#d0f0d8', + colorSuccessBorder: colors.success, + colorSuccessBorderHover: '#159c31', + colorSuccessHover: '#159c31', + colorSuccessActive: '#128a2b', + colorSuccessTextHover: '#159c31', colorSuccessText: colors.success, - colorSuccessTextActive: colors.success, - - // --- Warning Derivations --- - colorWarningBg: '#fffbe6', - colorWarningBgHover: '#fff1b8', - colorWarningBorder: '#faad14', - colorWarningBorderHover: '#faad14', - colorWarningHover: '#d48806', - colorWarningActive: '#ad6800', - colorWarningTextHover: '#d48806', - colorWarningText: '#ad6800', - colorWarningTextActive: '#ad6800', - - // --- Error Derivations --- - colorErrorBg: '#fff2f0', - colorErrorBgHover: '#ffccc7', - colorErrorBorder: colors['signature-coral'], - colorErrorBorderHover: colors['signature-coral'], - colorErrorHover: '#cf1322', - colorErrorActive: '#a8071a', - colorErrorTextHover: '#cf1322', - colorErrorText: colors['signature-coral'], - colorErrorTextActive: '#a8071a', + colorSuccessTextActive: '#128a2b', + + // --- Warning Derivations (orange ramp) --- + // Light-mode seed override: the sticker accent-orange (#dd5b00) is too dark to + // read as "warning"; use a brighter mid-orange so Alerts/Tags/icons read clearly. + colorWarning: '#fa8c16', + colorWarningBg: '#fff7e6', + colorWarningBgHover: '#ffe7ba', + colorWarningBorder: '#ffd591', + colorWarningBorderHover: '#ffd591', + colorWarningHover: '#ffa940', + colorWarningActive: '#d46b08', + colorWarningTextHover: '#ffa940', + colorWarningText: '#fa8c16', + colorWarningTextActive: '#d46b08', + + // --- Error Derivations (calm red) --- + colorErrorBg: '#fdecec', + colorErrorBgHover: '#fbd5d6', + colorErrorBorder: colors.error, + colorErrorBorderHover: '#ce363b', + colorErrorHover: '#ce363b', + colorErrorActive: '#b62a2e', + colorErrorTextHover: '#ce363b', + colorErrorText: colors.error, + colorErrorTextActive: '#b62a2e', } as const; /** * Shared non-color tokens — identical across light and dark modes. - * Ensures spacing, sizing, typography, and border radius are unified. + * Ensures spacing, sizing, typography, border radius, and elevation are unified. */ export const sharedTokens = { // --- Border Radius --- @@ -524,33 +523,33 @@ export const sharedTokens = { borderRadiusOuter: rounded.lg, // --- Control --- - controlHeight: 44, // matches text-input height - controlHeightSM: 32, - controlHeightLG: 48, + controlHeight: 36, // Notion-compact controls (~text-input height) + controlHeightSM: 28, + controlHeightLG: 44, controlHeightXS: 24, // --- Line Height --- lineHeight: typography['body-md'].lineHeight, - lineHeightSM: 1.2, - lineHeightLG: 1.4, - lineHeightHeading1: typography['display-lg'].lineHeight, - lineHeightHeading2: typography['display-md'].lineHeight, - lineHeightHeading3: typography['title-lg'].lineHeight, - lineHeightHeading4: typography['title-md'].lineHeight, - lineHeightHeading5: typography['title-sm'].lineHeight, + lineHeightSM: typography['body-sm'].lineHeight, + lineHeightLG: typography['body-md'].lineHeight, + lineHeightHeading1: typography['heading-1'].lineHeight, + lineHeightHeading2: typography['heading-2'].lineHeight, + lineHeightHeading3: typography['heading-3'].lineHeight, + lineHeightHeading4: typography.title.lineHeight, + lineHeightHeading5: typography['body-md'].lineHeight, // --- Font Sizes --- - fontSizeSM: 12, - fontSizeLG: typography['label-md'].fontSize, - fontSizeXL: typography['title-sm'].fontSize, - fontSizeHeading1: typography['display-lg'].fontSize, - fontSizeHeading2: typography['display-md'].fontSize, - fontSizeHeading3: typography['title-lg'].fontSize, - fontSizeHeading4: typography['title-md'].fontSize, - fontSizeHeading5: typography['title-sm'].fontSize, - - // --- Font Weight --- - fontWeightStrong: 500, + fontSizeSM: typography.eyebrow.fontSize, + fontSizeLG: typography['body-md'].fontSize, + fontSizeXL: typography.title.fontSize, + fontSizeHeading1: typography['heading-1'].fontSize, + fontSizeHeading2: typography['heading-2'].fontSize, + fontSizeHeading3: typography['heading-3'].fontSize, + fontSizeHeading4: typography.title.fontSize, + fontSizeHeading5: typography['body-md'].fontSize, + + // --- Font Weight (Notion: 700 belongs to headlines) --- + fontWeightStrong: 700, // --- Padding --- paddingXXS: spacing.xxs, @@ -576,17 +575,32 @@ export const sharedTokens = { marginLG: spacing.lg, marginXL: spacing.xl, marginXXL: spacing.xxl, + + // --- Elevation (Notion: many near-transparent layers, never a hard cast) --- + // Level-0: resting hairline glow. + boxShadowTertiary: '0 1px 2px rgba(15, 15, 15, 0.04)', + // Level-1: cards that float above the canvas (feature-card-elevated). + boxShadow: + '0 1px 2px rgba(15, 15, 15, 0.03), 0 2px 4px rgba(15, 15, 15, 0.04), 0 4px 8px rgba(15, 15, 15, 0.03)', + // Level-2: floating panels, dropdowns, popovers. + boxShadowSecondary: + '0 2px 4px rgba(15, 15, 15, 0.04), 0 4px 8px rgba(15, 15, 15, 0.05), 0 12px 24px rgba(15, 15, 15, 0.04)', + + // --- Control hover/active fills --- + controlItemBgHover: colors['canvas-soft'], + controlItemBgActive: colors['canvas-soft'], + controlItemBgActiveHover: colors['canvas-soft'], } as const; -/** Merge shared (sizing) + mode-specific (color) component tokens */ +/** Merge shared (sizing) + mode-specific (color) component tokens. */ function mergeComponentTokens( shared: Record>, - colors: Record>, + modeColors: Record>, ): Record> { - const allKeys = new Set([...Object.keys(shared), ...Object.keys(colors)]); + const allKeys = new Set([...Object.keys(shared), ...Object.keys(modeColors)]); const result: Record> = {}; for (const key of allKeys) { - result[key] = { ...shared[key], ...colors[key] }; + result[key] = {...shared[key], ...modeColors[key]}; } return result; } @@ -597,27 +611,32 @@ function mergeComponentTokens( */ const sharedComponentTokens = { Button: { - borderRadius: rounded.lg, + // Utility-button tight radius (8px) for the admin console; marketing pill + // CTAs live in the `components` presets, not in antd Button. + borderRadius: rounded.md, borderRadiusSM: rounded.sm, - borderRadiusLG: rounded.lg, - controlHeight: 44, - controlHeightSM: 32, - controlHeightLG: 48, + borderRadiusLG: rounded.md, + controlHeight: 36, + controlHeightSM: 28, + controlHeightLG: 44, paddingInline: spacing.lg, paddingInlineSM: spacing.md, paddingInlineLG: spacing.xl, fontWeight: typography.button.fontWeight, - primaryShadow: '0 2px 0 rgba(27,97,201,0.02)', + primaryShadow: 'none', + defaultShadow: 'none', + dangerShadow: 'none', }, Input: { - borderRadius: rounded.sm, - borderRadiusLG: rounded.md, + // Form fields stay tight at rounded.xs (4px) per DESIGN.md. + borderRadius: rounded.xs, + borderRadiusLG: rounded.sm, borderRadiusSM: rounded.xs, - controlHeight: 44, + controlHeight: 36, }, Card: { borderRadiusLG: rounded.lg, - paddingLG: spacing.xl, + paddingLG: spacing.lg, }, Layout: { headerHeight: 64, @@ -645,23 +664,23 @@ const sharedComponentTokens = { borderRadiusLG: rounded.lg, }, Select: { - borderRadius: rounded.sm, - borderRadiusLG: rounded.md, + borderRadius: rounded.xs, + borderRadiusLG: rounded.sm, borderRadiusSM: rounded.xs, - controlHeight: 44, + controlHeight: 36, }, DatePicker: { - borderRadius: rounded.sm, - borderRadiusLG: rounded.md, + borderRadius: rounded.xs, + borderRadiusLG: rounded.sm, borderRadiusSM: rounded.xs, - controlHeight: 44, + controlHeight: 36, }, Segmented: { borderRadius: rounded.sm, }, Steps: { - iconFontSize: typography['label-md'].fontSize, - titleLineHeight: typography['body-md'].lineHeight, + iconFontSize: typography.eyebrow.fontSize, + titleLineHeight: typography['body-sm'].lineHeight, }, Collapse: { headerPadding: `${spacing.sm}px ${spacing.md}px`, @@ -678,7 +697,7 @@ const sharedComponentTokens = { }, } as const; -/** Light-mode component color tokens */ +/** Light-mode component color tokens. */ const lightComponentTokens = { Button: { primaryColor: colors['on-primary'], @@ -687,8 +706,9 @@ const lightComponentTokens = { defaultBorderColor: colors.hairline, }, Input: { - activeBorderColor: colors['info-border'], - hoverBorderColor: colors.ink, + // Focus signal is the primary blue (DESIGN.md: active/focus signal = primary). + activeBorderColor: colors.primary, + hoverBorderColor: colors['ink-secondary'], colorBgContainer: colors.canvas, colorText: colors.ink, }, @@ -697,58 +717,62 @@ const lightComponentTokens = { }, Layout: { headerBg: colors.canvas, - bodyBg: colors.canvas, + bodyBg: colors['canvas-soft'], siderBg: colors.canvas, triggerBg: colors.canvas, }, Menu: { itemBg: colors.canvas, subMenuItemBg: colors.canvas, - itemColor: colors.body, - itemSelectedBg: colors['surface-strong'], + itemColor: colors['ink-muted'], + // Active/selected items use the primary blue tint (focus/active signal). + itemSelectedBg: '#e8f3fc', itemSelectedColor: colors.primary, - itemHoverBg: colors['surface-soft'], + itemHoverBg: colors['canvas-soft'], itemHoverColor: colors.ink, - itemActiveBg: colors['surface-strong'], + itemActiveBg: '#e8f3fc', horizontalItemSelectedColor: colors.primary, subMenuItemSelectedColor: colors.ink, }, Table: { - headerBg: colors.canvas, - headerColor: colors.ink, - rowHoverBg: colors['surface-soft'], + headerBg: colors['canvas-soft'], + headerColor: colors['ink-secondary'], + rowHoverBg: colors['canvas-soft'], borderColor: colors.hairline, headerSplitColor: colors.hairline, }, Tabs: { - inkBarColor: colors.ink, + // Active tab indicator is the primary blue. + inkBarColor: colors.primary, itemSelectedColor: colors.ink, - itemHoverColor: colors.ink, - itemColor: colors.body, + itemHoverColor: colors['ink-secondary'], + itemColor: colors['ink-muted'], }, Segmented: { - itemSelectedBg: colors.ink, - itemSelectedColor: colors['on-primary'], - trackBg: colors['surface-strong'], + // White pill on a warm-paper track. + itemSelectedBg: colors.canvas, + itemSelectedColor: colors.ink, + trackBg: colors['canvas-soft'], }, Switch: { handleBg: colors.canvas, }, Breadcrumb: { - itemColor: colors.muted, - linkColor: colors.body, - separatorColor: colors.muted, + itemColor: colors['ink-faint'], + linkColor: colors['ink-muted'], + separatorColor: colors['ink-faint'], lastItemColor: colors.ink, }, Pagination: { itemActiveBg: colors.primary, - itemActiveColorDisabled: colors['on-primary'], - colorPrimary: colors['on-primary'], + itemActiveColor: colors['on-primary'], + itemActiveColorDisabled: colors.hairline, + colorPrimary: colors.primary, colorPrimaryHover: colors['on-primary'], }, Slider: { trackBg: colors.primary, - trackHoverBg: colors.primary, + trackHoverBg: '#0066c9', handleColor: colors.primary, handleActiveColor: colors.primary, dotActiveBorderColor: colors.primary, @@ -757,16 +781,16 @@ const lightComponentTokens = { defaultColor: colors.primary, }, Tree: { - nodeHoverBg: colors['surface-soft'], - nodeSelectedBg: colors['surface-soft'], + nodeHoverBg: colors['canvas-soft'], + nodeSelectedBg: '#e8f3fc', }, Collapse: { - headerBg: colors['surface-soft'], + headerBg: colors.canvas, contentBg: colors.canvas, }, } as const; -/** Full light-mode Ant Design theme configuration */ +/** Full light-mode Ant Design theme configuration. */ export const antdTheme = { token: { ...antdSeedTokens, @@ -779,12 +803,16 @@ export const antdTheme = { // ============================================================================ // Dark Mode Token Mapping // ============================================================================ +// DESIGN.md is a light-mode marketing analysis; dark mode is an admin-console +// adaptation. Colors are lifted ~15% for comfortable viewing, with the Notion +// blue brightened so it stays legible on dark surfaces. -/** Ant Design dark mode map tokens */ +/** Ant Design dark mode map tokens. */ export const antdDarkMapTokens = { - // --- Seed overrides (dark) — original near-black primary is invisible on dark bg --- + // --- Seed overrides (dark) — brighten the Notion blue for dark bg --- colorPrimary: '#458fff', colorError: '#ff6b6b', + colorWarning: '#ff9f40', // --- Text Colors (dark) — significantly brighter for readability --- colorText: '#f5f6f8', @@ -797,6 +825,7 @@ export const antdDarkMapTokens = { colorBgElevated: '#363d48', colorBgLayout: '#232830', colorBgSpotlight: '#232830', + colorBgMask: 'rgba(0,0,0,0.6)', // --- Fill Colors (dark) --- colorFill: 'rgba(255,255,255,0.12)', @@ -804,6 +833,14 @@ export const antdDarkMapTokens = { colorFillTertiary: 'rgba(255,255,255,0.06)', colorFillQuaternary: 'rgba(255,255,255,0.04)', + // --- Control hover/active fills (dark) — sharedTokens sets these to the + // light canvas-soft for both themes; restore dark-appropriate translucent + // overlays so components relying on these tokens (e.g. Splitter collapse + // bar / dragger) don't render as a white block in dark mode. --- + controlItemBgHover: 'rgba(255,255,255,0.06)', + controlItemBgActive: 'rgba(69,143,255,0.15)', + controlItemBgActiveHover: 'rgba(69,143,255,0.25)', + // --- Border Colors (dark) — clearly visible --- colorBorder: '#4a5260', colorBorderSecondary: '#3c434e', @@ -825,29 +862,51 @@ export const antdDarkMapTokens = { colorPrimaryTextActive: '#2b6fcc', // --- Info Derivations (dark) --- - colorInfoBg: 'rgba(37,79,173,0.20)', - colorInfoBgHover: 'rgba(37,79,173,0.30)', - colorInfoBorder: colors['info-border'], + colorInfoBg: 'rgba(69,143,255,0.20)', + colorInfoBgHover: 'rgba(69,143,255,0.30)', + colorInfoBorder: '#458fff', colorInfoBorderHover: '#6badff', colorInfoHover: '#6badff', colorInfoActive: '#8dc3ff', colorInfoTextHover: '#6badff', - colorInfoText: colors['info-border'], + colorInfoText: '#458fff', colorInfoTextActive: '#8dc3ff', // --- Success Derivations (dark) --- - colorSuccessBg: 'rgba(0,100,0,0.20)', - colorSuccessBgHover: 'rgba(0,100,0,0.30)', - colorSuccessBorder: colors['success-border'], + colorSuccessBg: 'rgba(26,174,57,0.20)', + colorSuccessBgHover: 'rgba(26,174,57,0.30)', + colorSuccessBorder: '#39bf45', colorSuccessBorderHover: '#5bd465', colorSuccessHover: '#5bd465', colorSuccessActive: '#7de885', colorSuccessTextHover: '#5bd465', - colorSuccessText: colors['success-border'], + colorSuccessText: '#39bf45', colorSuccessTextActive: '#7de885', + + // --- Warning Derivations (dark) --- + colorWarningBg: 'rgba(255,159,64,0.20)', + colorWarningBgHover: 'rgba(255,159,64,0.30)', + colorWarningBorder: '#ff9f40', + colorWarningBorderHover: '#ffb266', + colorWarningHover: '#ffb266', + colorWarningActive: '#ffc58a', + colorWarningTextHover: '#ffb266', + colorWarningText: '#ff9f40', + colorWarningTextActive: '#ffc58a', + + // --- Error Derivations (dark) --- + colorErrorBg: 'rgba(229,72,77,0.20)', + colorErrorBgHover: 'rgba(229,72,77,0.30)', + colorErrorBorder: '#ff6b6b', + colorErrorBorderHover: '#ff8585', + colorErrorHover: '#ff8585', + colorErrorActive: '#ff9d9d', + colorErrorTextHover: '#ff8585', + colorErrorText: '#ff6b6b', + colorErrorTextActive: '#ff9d9d', } as const; -/** Dark-mode component color tokens */ +/** Dark-mode component color tokens. */ const darkComponentTokens = { Button: { defaultBg: '#2c323c', @@ -861,7 +920,7 @@ const darkComponentTokens = { Input: { colorBgContainer: '#2c323c', colorText: '#f5f6f8', - activeBorderColor: colors['info-border'], + activeBorderColor: '#458fff', hoverBorderColor: '#bcc0cc', }, Card: { @@ -877,11 +936,11 @@ const darkComponentTokens = { itemBg: '#2c323c', subMenuItemBg: '#2c323c', itemColor: '#bcc0cc', - itemSelectedBg: '#363d48', + itemSelectedBg: 'rgba(69,143,255,0.20)', itemSelectedColor: '#f5f6f8', itemHoverBg: '#363d48', itemHoverColor: '#f5f6f8', - itemActiveBg: '#363d48', + itemActiveBg: 'rgba(69,143,255,0.20)', horizontalItemSelectedColor: '#f5f6f8', subMenuItemSelectedColor: '#f5f6f8', }, @@ -915,8 +974,8 @@ const darkComponentTokens = { Pagination: { itemActiveBg: '#f5f6f8', itemActiveColorDisabled: '#232830', - colorPrimary: '#232830', - colorPrimaryHover: '#232830', + colorPrimary: '#458fff', + colorPrimaryHover: '#6ba3ff', }, Slider: { trackBg: '#f5f6f8', @@ -930,7 +989,7 @@ const darkComponentTokens = { }, Tree: { nodeHoverBg: 'rgba(255,255,255,0.06)', - nodeSelectedBg: 'rgba(255,255,255,0.10)', + nodeSelectedBg: 'rgba(69,143,255,0.20)', }, Collapse: { headerBg: '#2c323c', @@ -938,7 +997,7 @@ const darkComponentTokens = { }, } as const; -/** Full dark mode theme configuration */ +/** Full dark mode theme configuration. */ export const antdDarkTheme = { token: { ...antdSeedTokens, diff --git a/tsconfig.app.tsbuildinfo b/tsconfig.app.tsbuildinfo index 646ec0b..619b3ec 100644 --- a/tsconfig.app.tsbuildinfo +++ b/tsconfig.app.tsbuildinfo @@ -1 +1 @@ -{"root":["./src/app.tsx","./src/main.tsx","./src/routes.tsx","./src/typing.d.ts","./src/vite-env.d.ts","./src/components/sensitivetext.tsx","./src/components/userinfo.tsx","./src/components/common/branchswitcher.tsx","./src/components/common/fieldmappingcomponent.tsx","./src/components/common/graphqleditormodal.tsx","./src/components/common/mcpconnectiondrawer.tsx","./src/components/common/pagecontainer.tsx","./src/components/common/protectedroute.tsx","./src/components/common/resizablepanel.tsx","./src/components/common/scripteditor.tsx","./src/components/common/scripteditormodal.tsx","./src/components/common/index.ts","./src/components/console/console.tsx","./src/components/console/consoleperformancemonitor.tsx","./src/components/console/logitem.tsx","./src/components/layouts/header.tsx","./src/components/layouts/pagelayout.tsx","./src/components/layouts/platformlayout.tsx","./src/components/layouts/platformsidebar.tsx","./src/components/layouts/projectlayout.tsx","./src/components/layouts/projectsidebar.tsx","./src/components/layouts/sidebar.tsx","./src/hooks/useconsolelogs.ts","./src/hooks/usefullscreen.ts","./src/hooks/userealtime.ts","./src/hooks/usetablescrollheight.ts","./src/pages/apilog/index.tsx","./src/pages/apilog/components/apilogchart.tsx","./src/pages/apilog/components/logsettings.tsx","./src/pages/apiview/index.tsx","./src/pages/apikeys/index.tsx","./src/pages/authentication/index.tsx","./src/pages/authentication/permissionscope.ts","./src/pages/authentication/components/functionform.tsx","./src/pages/authentication/components/oidcform.tsx","./src/pages/authentication/components/permissionpicker.tsx","./src/pages/authentication/components/providerstab.tsx","./src/pages/datamodeling/index.tsx","./src/pages/datamodeling/components/defaultvalueinput.tsx","./src/pages/datamodeling/components/erdiagramview.tsx","./src/pages/datamodeling/components/ernodeview.tsx","./src/pages/datamodeling/components/entityform.tsx","./src/pages/datamodeling/components/entityview.tsx","./src/pages/datamodeling/components/enumform.tsx","./src/pages/datamodeling/components/fieldform.tsx","./src/pages/datamodeling/components/fieldinput.tsx","./src/pages/datamodeling/components/fieldlist.tsx","./src/pages/datamodeling/components/fieldtable.tsx","./src/pages/datamodeling/components/fmleditor.tsx","./src/pages/datamodeling/components/fmlmodelform.tsx","./src/pages/datamodeling/components/indexform.tsx","./src/pages/datamodeling/components/indexlist.tsx","./src/pages/datamodeling/components/indextable.tsx","./src/pages/datamodeling/components/modelexplorer.tsx","./src/pages/datamodeling/components/modelform.tsx","./src/pages/datamodeling/components/modelgroupview.tsx","./src/pages/datamodeling/components/nativequeryform.tsx","./src/pages/datamodeling/components/recordform.tsx","./src/pages/datamodeling/components/recordlist.tsx","./src/pages/datamodeling/components/triggerwrapper.tsx","./src/pages/dataview/index.tsx","./src/pages/dataview/components/erview.tsx","./src/pages/flow/index.tsx","./src/pages/flow/components/flowinstancelist.tsx","./src/pages/flow/components/flowlist.tsx","./src/pages/flow/components/usertasksdrawer.tsx","./src/pages/flowdesign/index.tsx","./src/pages/flowdesign/components/flowsettingspanel.tsx","./src/pages/flowdesign/components/nodepanel.tsx","./src/pages/flowdesign/components/propertypanel.tsx","./src/pages/flowdesign/components/edges/arrowedge.tsx","./src/pages/flowdesign/components/nodes/callactivitynode.tsx","./src/pages/flowdesign/components/nodes/endeventnode.tsx","./src/pages/flowdesign/components/nodes/exclusivegatewaynode.tsx","./src/pages/flowdesign/components/nodes/inclusivegatewaynode.tsx","./src/pages/flowdesign/components/nodes/parallelgatewaynode.tsx","./src/pages/flowdesign/components/nodes/sequenceflownode.tsx","./src/pages/flowdesign/components/nodes/servicetasknode.tsx","./src/pages/flowdesign/components/nodes/starteventnode.tsx","./src/pages/flowdesign/components/nodes/usertasknode.tsx","./src/pages/flowdesign/components/nodes/catalog.ts","./src/pages/flowdesign/types/flow.ts","./src/pages/flowdesign/utils/autolayout.ts","./src/pages/flowdesign/utils/flow.ts","./src/pages/flowdesign/utils/nodestyles.ts","./src/pages/flowdetail/index.tsx","./src/pages/flowdetail/components/flownode.tsx","./src/pages/flowdetail/hooks/useelementinstancemerger.ts","./src/pages/flowdetail/hooks/useflowparser.ts","./src/pages/flowdetail/utils/layoututils.ts","./src/pages/functions/functioneditor.tsx","./src/pages/functions/index.tsx","./src/pages/functions/components/functiondetail.tsx","./src/pages/functions/components/functionform.tsx","./src/pages/functions/components/functioninvokepanel.tsx","./src/pages/graphqlapi/index.tsx","./src/pages/graphqlapi/components/graphql.tsx","./src/pages/graphqlapi/components/graphqlsettingsmodal.tsx","./src/pages/login/index.tsx","./src/pages/member/index.tsx","./src/pages/member/components/rolelist.tsx","./src/pages/member/components/rolemodal.tsx","./src/pages/member/components/userlist.tsx","./src/pages/member/components/usermodal.tsx","./src/pages/openapi/index.tsx","./src/pages/overview/index.tsx","./src/pages/overview/components/projectinfopanel.tsx","./src/pages/overview/components/statisticscards.tsx","./src/pages/overview/components/metrics/trendanalysis.tsx","./src/pages/pages/index.tsx","./src/pages/project/index.tsx","./src/pages/projectsettings/index.tsx","./src/pages/scheduling/index.tsx","./src/pages/scheduling/components/jobexecutionloglist.tsx","./src/pages/scheduling/components/triggerform.tsx","./src/pages/scheduling/components/triggerlist.tsx","./src/pages/settings/index.tsx","./src/pages/settings/components/about.tsx","./src/pages/settings/components/base.tsx","./src/pages/settings/components/proxy.tsx","./src/pages/storage/index.tsx","./src/pages/storage/components/bucketexplorer.tsx","./src/pages/storage/components/bucketform.tsx","./src/pages/storage/components/bucketview.tsx","./src/pages/storage/components/filebrowser.tsx","./src/services/api-info.ts","./src/services/api-key.ts","./src/services/api-log.ts","./src/services/api-management.ts","./src/services/auth-provider.ts","./src/services/auth.ts","./src/services/branch.ts","./src/services/codegen.ts","./src/services/console.ts","./src/services/datasource.ts","./src/services/flow.ts","./src/services/function.ts","./src/services/global.ts","./src/services/job.ts","./src/services/metrics.ts","./src/services/model.ts","./src/services/pages.ts","./src/services/project.ts","./src/services/realtime.ts","./src/services/record.ts","./src/services/resource.ts","./src/services/role.ts","./src/services/settings.ts","./src/services/storage.ts","./src/services/trigger.ts","./src/services/user.ts","./src/store/appstore.ts","./src/store/authstore.ts","./src/theme/designtokens.ts","./src/types/api-key.d.ts","./src/types/api-log.d.ts","./src/types/api-management.d.ts","./src/types/auth-provider.d.ts","./src/types/auth.d.ts","./src/types/axios.d.ts","./src/types/branch.d.ts","./src/types/codegen.d.ts","./src/types/components.d.ts","./src/types/data-modeling.d.ts","./src/types/data-source.ts","./src/types/overview.d.ts","./src/types/project.d.ts","./src/types/record.d.ts","./src/types/resource.ts","./src/types/role.d.ts","./src/types/settings.d.ts","./src/types/storage.d.ts","./src/types/system.d.ts","./src/types/trigger.ts","./src/types/user.d.ts","./src/utils/darkmode.ts","./src/utils/echarts.ts","./src/utils/modeltreeconvert.ts","./src/utils/monaco-groovy.ts","./src/utils/monaco-loader.ts","./src/utils/request.ts"],"version":"5.9.3"} \ No newline at end of file +{"root":["./src/app.tsx","./src/main.tsx","./src/routerenderers.tsx","./src/routes.tsx","./src/typing.d.ts","./src/vite-env.d.ts","./src/components/sensitivetext.tsx","./src/components/userinfo.tsx","./src/components/common/branchswitcher.tsx","./src/components/common/fieldmappingcomponent.tsx","./src/components/common/graphqleditormodal.tsx","./src/components/common/mcpconnectiondrawer.tsx","./src/components/common/pagecontainer.tsx","./src/components/common/protectedroute.tsx","./src/components/common/resizablepanel.tsx","./src/components/common/scripteditor.tsx","./src/components/common/scripteditormodal.tsx","./src/components/common/index.ts","./src/components/console/console.tsx","./src/components/console/consoleperformancemonitor.tsx","./src/components/console/logitem.tsx","./src/components/layouts/header.tsx","./src/components/layouts/pagelayout.tsx","./src/components/layouts/platformlayout.tsx","./src/components/layouts/platformsidebar.tsx","./src/components/layouts/projectlayout.tsx","./src/components/layouts/projectsidebar.tsx","./src/components/layouts/sidebar.tsx","./src/hooks/useconsolelogs.ts","./src/hooks/usefullscreen.ts","./src/hooks/userealtime.ts","./src/hooks/usetablescrollheight.ts","./src/pages/apilog/index.tsx","./src/pages/apilog/components/apilogchart.tsx","./src/pages/apilog/components/logsettings.tsx","./src/pages/apiview/index.tsx","./src/pages/apikeys/index.tsx","./src/pages/authentication/index.tsx","./src/pages/authentication/permissionscope.ts","./src/pages/authentication/components/functionform.tsx","./src/pages/authentication/components/oidcform.tsx","./src/pages/authentication/components/permissionpicker.tsx","./src/pages/authentication/components/providerstab.tsx","./src/pages/datamodeling/index.tsx","./src/pages/datamodeling/components/defaultvalueinput.tsx","./src/pages/datamodeling/components/erdiagramview.tsx","./src/pages/datamodeling/components/ernodeview.tsx","./src/pages/datamodeling/components/entityform.tsx","./src/pages/datamodeling/components/entityview.tsx","./src/pages/datamodeling/components/enumform.tsx","./src/pages/datamodeling/components/fieldform.tsx","./src/pages/datamodeling/components/fieldinput.tsx","./src/pages/datamodeling/components/fieldlist.tsx","./src/pages/datamodeling/components/fieldtable.tsx","./src/pages/datamodeling/components/fmleditor.tsx","./src/pages/datamodeling/components/fmlmodelform.tsx","./src/pages/datamodeling/components/indexform.tsx","./src/pages/datamodeling/components/indexlist.tsx","./src/pages/datamodeling/components/indextable.tsx","./src/pages/datamodeling/components/modelexplorer.tsx","./src/pages/datamodeling/components/modelform.tsx","./src/pages/datamodeling/components/modelgroupview.tsx","./src/pages/datamodeling/components/nativequeryform.tsx","./src/pages/datamodeling/components/recordform.tsx","./src/pages/datamodeling/components/recordlist.tsx","./src/pages/datamodeling/components/triggerwrapper.tsx","./src/pages/datamodeling/components/fieldformconstants.ts","./src/pages/dataview/index.tsx","./src/pages/dataview/components/erview.tsx","./src/pages/flow/index.tsx","./src/pages/flow/components/flowinstancelist.tsx","./src/pages/flow/components/flowlist.tsx","./src/pages/flow/components/usertasksdrawer.tsx","./src/pages/flowdesign/index.tsx","./src/pages/flowdesign/components/flowsettingspanel.tsx","./src/pages/flowdesign/components/nodepanel.tsx","./src/pages/flowdesign/components/propertypanel.tsx","./src/pages/flowdesign/components/edges/arrowedge.tsx","./src/pages/flowdesign/components/nodes/callactivitynode.tsx","./src/pages/flowdesign/components/nodes/endeventnode.tsx","./src/pages/flowdesign/components/nodes/exclusivegatewaynode.tsx","./src/pages/flowdesign/components/nodes/inclusivegatewaynode.tsx","./src/pages/flowdesign/components/nodes/parallelgatewaynode.tsx","./src/pages/flowdesign/components/nodes/sequenceflownode.tsx","./src/pages/flowdesign/components/nodes/servicetasknode.tsx","./src/pages/flowdesign/components/nodes/starteventnode.tsx","./src/pages/flowdesign/components/nodes/usertasknode.tsx","./src/pages/flowdesign/components/nodes/catalog.ts","./src/pages/flowdesign/types/flow.ts","./src/pages/flowdesign/utils/autolayout.ts","./src/pages/flowdesign/utils/flow.ts","./src/pages/flowdesign/utils/nodestyles.ts","./src/pages/flowdetail/index.tsx","./src/pages/flowdetail/components/flownode.tsx","./src/pages/flowdetail/hooks/useelementinstancemerger.ts","./src/pages/flowdetail/hooks/useflowparser.ts","./src/pages/flowdetail/utils/layoututils.ts","./src/pages/functions/functioneditor.tsx","./src/pages/functions/index.tsx","./src/pages/functions/components/functiondetail.tsx","./src/pages/functions/components/functionform.tsx","./src/pages/functions/components/functioninvokepanel.tsx","./src/pages/graphqlapi/index.tsx","./src/pages/graphqlapi/components/graphql.tsx","./src/pages/graphqlapi/components/graphqlsettingsmodal.tsx","./src/pages/login/index.tsx","./src/pages/member/index.tsx","./src/pages/member/components/rolelist.tsx","./src/pages/member/components/rolemodal.tsx","./src/pages/member/components/userlist.tsx","./src/pages/member/components/usermodal.tsx","./src/pages/openapi/index.tsx","./src/pages/overview/index.tsx","./src/pages/overview/components/projectinfopanel.tsx","./src/pages/overview/components/statisticscards.tsx","./src/pages/overview/components/metrics/trendanalysis.tsx","./src/pages/pages/index.tsx","./src/pages/project/index.tsx","./src/pages/projectsettings/index.tsx","./src/pages/scheduling/index.tsx","./src/pages/scheduling/components/jobexecutionloglist.tsx","./src/pages/scheduling/components/triggerform.tsx","./src/pages/scheduling/components/triggerlist.tsx","./src/pages/settings/index.tsx","./src/pages/settings/components/about.tsx","./src/pages/settings/components/base.tsx","./src/pages/settings/components/proxy.tsx","./src/pages/storage/index.tsx","./src/pages/storage/components/bucketexplorer.tsx","./src/pages/storage/components/bucketform.tsx","./src/pages/storage/components/bucketitem.tsx","./src/pages/storage/components/bucketview.tsx","./src/pages/storage/components/filebrowser.tsx","./src/services/api-info.ts","./src/services/api-key.ts","./src/services/api-log.ts","./src/services/api-management.ts","./src/services/auth-provider.ts","./src/services/auth.ts","./src/services/branch.ts","./src/services/codegen.ts","./src/services/console.ts","./src/services/datasource.ts","./src/services/flow.ts","./src/services/function.ts","./src/services/global.ts","./src/services/job.ts","./src/services/metrics.ts","./src/services/model.ts","./src/services/pages.ts","./src/services/project.ts","./src/services/realtime.ts","./src/services/record.ts","./src/services/resource.ts","./src/services/role.ts","./src/services/settings.ts","./src/services/storage.ts","./src/services/trigger.ts","./src/services/user.ts","./src/store/appstore.ts","./src/store/authstore.ts","./src/theme/designtokens.ts","./src/types/api-key.d.ts","./src/types/api-log.d.ts","./src/types/api-management.d.ts","./src/types/auth-provider.d.ts","./src/types/auth.d.ts","./src/types/axios.d.ts","./src/types/branch.d.ts","./src/types/codegen.d.ts","./src/types/components.d.ts","./src/types/data-modeling.d.ts","./src/types/data-source.ts","./src/types/overview.d.ts","./src/types/project.d.ts","./src/types/record.d.ts","./src/types/resource.ts","./src/types/role.d.ts","./src/types/settings.d.ts","./src/types/storage.d.ts","./src/types/system.d.ts","./src/types/trigger.ts","./src/types/user.d.ts","./src/utils/darkmode.ts","./src/utils/echarts.ts","./src/utils/modeltreeconvert.ts","./src/utils/monaco-groovy.ts","./src/utils/monaco-loader.ts","./src/utils/request.ts"],"version":"5.9.3"} \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts index 5ddb14a..569b425 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -153,13 +153,7 @@ export default defineConfig({ } }, plugins: [ - react({ - babel: { - parserOpts: { - plugins: ["classProperties", "classPrivateProperties", "classPrivateMethods"], - }, - }, - }), + react(), svgr({ svgrOptions: { icon: true } }), pagesDevPlugin(), ], @@ -171,8 +165,10 @@ export default defineConfig({ build: { rollupOptions: { output: { - manualChunks: { - 'monaco-editor': ['monaco-editor'], + manualChunks: (id) => { + if (id.includes('node_modules/monaco-editor')) { + return 'monaco-editor'; + } }, }, },