diff --git a/.cursor/rules/base-components.mdc b/.cursor/rules/base-components.mdc
index db4f425e7e..4607c0d938 100644
--- a/.cursor/rules/base-components.mdc
+++ b/.cursor/rules/base-components.mdc
@@ -234,7 +234,7 @@ Components support various size variants.
Components use CSS custom properties for theming:
-- Design tokens from Vibe's styling library (`@vibe/style`)
+- Design tokens from Vibe's styling library (`monday-ui-style`)
- Automatic dark/light mode support
- Consistent spacing and typography scales
diff --git a/.cursor/rules/component-internal-structure.mdc b/.cursor/rules/component-internal-structure.mdc
index 04c0cdaeb1..8c8fdfbb64 100644
--- a/.cursor/rules/component-internal-structure.mdc
+++ b/.cursor/rules/component-internal-structure.mdc
@@ -13,6 +13,7 @@ alwaysApply: false
2. **TypeScript**: All components must be written in TypeScript.
3. **`forwardRef`**: Prefer using `React.forwardRef` for all components that might need to expose their underlying DOM element or instance to parent components. The `ref` should be typed directly on the function's second argument.
4. **Props Typing and Destructuring**: Props must be destructured in the component function's first argument, and this argument must be explicitly typed with the component's props type.
+5. **No Static Properties**: Never use the `withStaticProps` utility or assign static properties to components. Components should remain without attached static properties. This means avoiding patterns like `MyComponent.colors = {...}`, `MyComponent.sizes = {...}`, and even avoiding `MyComponent.displayName = "..."`.
## File Structure (within the `.tsx` file)
diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 0000000000..33f010f44d
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,7 @@
+# Agent Instructions
+
+## Kitchen Sink Vibe Sources
+
+- **Original** must resolve `@vibe/*` component code from the pinned npm packages in `packages/kitchen-sink/published-vibe/node_modules`; never alias it to workspace source or apply Current-only component overrides.
+- **Current** resolves `@vibe/*` from local workspace source and keeps the existing kitchen-sink development overrides.
+- Keep the two runtimes isolated. Verify source-related changes with both `npm run build:original` and `npm run build:current` from `packages/kitchen-sink`.
diff --git a/CLAUDE.md b/CLAUDE.md
index 3e8a2be997..4d3e716f4e 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -6,6 +6,10 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
The **Vibe Design System** is monday.com's official React component library, managed as a Lerna monorepo with Yarn Workspaces. The main package `@vibe/core` provides the primary component library, while specialized packages handle icons, testing utilities, codemods, and more.
+## Node.js Version
+
+This repo requires **Node.js v22**. Always run `nvm use` (or `nvm use 22`) before any dev/build commands. The `.nvmrc` in `apps/kitchen-sink/` pins v22. Running on v20 will cause a `styleText` crash from `rolldown`.
+
## Development Commands
### Building and Testing
@@ -134,6 +138,12 @@ The repository includes an MCP (Model Context Protocol) server (`@vibe/mcp`) tha
- **Metadata generation** for component documentation
- **CSS token handling** via `@vibe/style` package
+### Kitchen Sink Vibe Sources
+- **Original** must resolve `@vibe/*` component code from the pinned npm packages in `apps/kitchen-sink/published-vibe/node_modules`; never alias it to workspace source or apply Current-only component overrides.
+- **Current** resolves `@vibe/*` from local workspace source and keeps the existing kitchen-sink development overrides.
+- Keep the two runtimes isolated. Verify source-related changes with both `npm run build:original` and `npm run build:current` from `apps/kitchen-sink`.
+- Kitchen-sink lives in `app/` (not `packages/`) so it is excluded from the root Yarn workspace and CI installs. Run `yarn install` inside `apps/kitchen-sink` before first use.
+
## Important Files and Conventions
### Configuration Files
diff --git a/apps/kitchen-sink/.gitignore b/apps/kitchen-sink/.gitignore
new file mode 100644
index 0000000000..ed1c2f679b
--- /dev/null
+++ b/apps/kitchen-sink/.gitignore
@@ -0,0 +1,3 @@
+node_modules
+dist
+.superpowers
diff --git a/apps/kitchen-sink/.nvmrc b/apps/kitchen-sink/.nvmrc
new file mode 100644
index 0000000000..b6f5ce1e9e
--- /dev/null
+++ b/apps/kitchen-sink/.nvmrc
@@ -0,0 +1 @@
+v22.23
diff --git a/apps/kitchen-sink/README.md b/apps/kitchen-sink/README.md
new file mode 100644
index 0000000000..a289d4f372
--- /dev/null
+++ b/apps/kitchen-sink/README.md
@@ -0,0 +1,69 @@
+# Facelift Kitchen Sink
+
+An interactive playground for exploring [@vibe/core](https://www.npmjs.com/package/@vibe/core) components. Click any card to tweak its state, customize theme tokens, compare your design against defaults, and pick up where you left off — everything persists in the browser.
+
+## Run it
+
+```bash
+npm install
+npm run dev
+```
+
+Open the URL Vite prints (usually http://localhost:5173).
+
+## Scripts
+
+| Command | What it does |
+| --- | --- |
+| `npm run dev` | Start the Vite dev server |
+| `npm run check` | Type-check and production build |
+| `npm test` | Run Vitest unit tests (persistence + CSS override helpers) |
+
+## Navigation
+
+The **left pane** is the only navigation:
+
+- **Components** — 3×3 grid of all nine demos with a control bar below for the focused card
+- **Theme** — token editors with sub-pages: Colors, Radius, Spacing, Typography
+- **Light / Dark / Black** — global theme mode toggles at the bottom of the left pane (always visible)
+
+Click a component card to focus it and show its controls. Theme sub-pages appear indented under Theme when that view is active.
+
+## Compare
+
+On the Components page, use the **Compare** button in the main area to open a side-by-side view:
+
+- **Original** — default component states
+- **Your design** — your current saved states
+
+Both columns share the same theme. Compare is component-state only (not a theme A/B). Reload always returns to the normal editing view.
+
+## Persistence
+
+All state is saved to `localStorage` under the key `facelift-kitchen-sink-state`:
+
+- Active view and theme sub-page
+- Light / Dark / Black mode
+- Per-component control values
+- Focused card
+- Theme token overrides (colors, radius, spacing, typography)
+
+Compare mode is **not** persisted — it resets to off on reload.
+
+## Components (fixed order)
+
+Icon Button, Button, Button Group, Tabs, Label, Chip, Text Field, Dropdown, Toast, Stroke Spotlight
+
+Each lives in `src/sections/*.section.tsx` and exports `{ id, title, defaultState, controls, Demo }`. Files are auto-collected via `import.meta.glob` and sorted by the order above.
+
+## Project layout
+
+| Path | Purpose |
+| --- | --- |
+| `src/context/KitchenSinkContext.tsx` | App state + localStorage sync |
+| `src/components/LeftPane.tsx` | Left navigation + theme mode |
+| `src/components/ComponentsView.tsx` | Grid, control bar, Compare entry |
+| `src/components/CompareView.tsx` | Side-by-side default vs current |
+| `src/components/ThemePanel.tsx` | Token editors + preview strip |
+| `src/lib/storage.ts` | Load/save/migrate persisted state |
+| `src/tests/` | Vitest tests for pure helpers |
diff --git a/apps/kitchen-sink/docs/superpowers/plans/2026-07-29-kitchen-sink-interactive.md b/apps/kitchen-sink/docs/superpowers/plans/2026-07-29-kitchen-sink-interactive.md
new file mode 100644
index 0000000000..5894215f56
--- /dev/null
+++ b/apps/kitchen-sink/docs/superpowers/plans/2026-07-29-kitchen-sink-interactive.md
@@ -0,0 +1,1731 @@
+# Kitchen Sink Interactive Playground — Implementation Plan
+
+> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
+
+**Goal:** Transform the static Facelift Kitchen Sink into an interactive redesign playground with left-pane navigation, per-component state controls (click-to-focus), theme token editing, Compare view, and full localStorage persistence.
+
+**Architecture:** Single React app with `KitchenSinkContext` holding view, theme mode, token overrides, and component states. Vibe `ThemeProvider` handles color overrides; radius/spacing/typography applied via CSS custom properties on an app root wrapper. No router — view switching via context state.
+
+**Tech Stack:** Vite 8, React 18, TypeScript 7, `@vibe/core` 4.5.3, `@vibe/icons` 4.1.0, Vitest (added for pure-function tests only)
+
+## Global Constraints
+
+- Component scope: exactly 9 components in this order — Icon Button, Button, Button Group, Tabs, Label, Chip, Text Field, Dropdown, Toast
+- State controls: click card → highlight + control bar below grid
+- Compare: Components page only; button in main area; side-by-side grids (default states vs current states); same theme on both sides; component states only (not theme comparison)
+- No change counter
+- Theme mode: Light / Dark / Black — global, always visible in left pane bottom
+- Theme customization sub-pages: Colors, Radius, Spacing, Typography (indented under Theme in left pane)
+- Navigation: left pane only — no center/top page nav; no component list in nav
+- Grid: fixed 3×3, larger cards than today
+- Persistence key: `facelift-kitchen-sink-state`; persist everything including focused card and compare mode off on reload (compareMode defaults false on load)
+- No router; no URL hash sync in v1
+- Verify with `npm run check` after every task; manual browser pass at end
+- Prop names must match `@vibe/core` types — verify in `node_modules/@vibe/core/dist` during implementation
+
+## Subagent model mapping
+
+Use this when dispatching subagents via **subagent-driven development**. Between-task review stays with the parent agent (default model).
+
+| Task | What it is | Model | Why |
+| --- | --- | --- | --- |
+| 1 | Vitest + shared types | `composer-2.5-fast` | Config + type definitions — low risk |
+| 2 | Default states + token defs | `composer-2.5-fast` | Mostly data/constants |
+| 3 | Persistence helpers (TDD) | `claude-sonnet-5-thinking-high` | Merge/migration logic needs careful edge-case handling |
+| 4 | `KitchenSinkContext` | `claude-sonnet-5-thinking-high` | Central state — mistakes here affect everything |
+| 5 | Theme shell + layout CSS | `claude-sonnet-5-thinking-high` | Vibe `ThemeProvider` + CSS vars need correct wiring |
+| 6 | Left pane nav | `composer-2.5-fast` | Straightforward UI from a clear spec |
+| 7 | Grid, control bar, error boundary | `claude-sonnet-5-thinking-high` | Several connected components; sets the interaction pattern |
+| 8 | Upgrade all 9 sections | `gpt-5.6-terra-medium` | Largest task — 9 files, must match real `@vibe/core` prop names |
+| 9 | Compare view | `composer-2.5-fast` | Builds on Task 7; mostly composition |
+| 10 | Theme panel + preview | `claude-sonnet-5-thinking-high` | Token editors + live preview need correct state updates |
+| 11 | README + final verification | `composer-2.5-fast` | Docs + running checks |
+
+**Opus escalation (`claude-opus-5-thinking-high`):** Re-dispatch the task with Opus if the first pass fails verification:
+
+- **Task 8** — more than 2 sections fail typecheck or render incorrectly
+- **Task 5** — theme overrides do not visibly apply after first pass
+- **Task 10** — token edits do not reflect in preview or Components grid after first pass
+
+---
+
+## File map
+
+| File | Responsibility |
+| --- | --- |
+| `src/types.ts` | Shared types: `SystemTheme`, `AppState`, `ControlDef`, `Section` |
+| `src/lib/defaultComponentStates.ts` | Default state bag per component id |
+| `src/lib/tokenDefinitions.ts` | Token editor field definitions per theme sub-page |
+| `src/lib/storage.ts` | Load/save/migrate `localStorage` |
+| `src/lib/buildThemeConfig.ts` | Convert color overrides → Vibe `ThemeProvider` config |
+| `src/lib/cssVarOverrides.ts` | Convert radius/spacing/typography → inline CSSProperties |
+| `src/context/KitchenSinkContext.tsx` | Provider + hooks |
+| `src/components/LeftPane.tsx` | Nav + theme mode toggles |
+| `src/components/ComponentGrid.tsx` | 3×3 clickable cards |
+| `src/components/ComponentControlBar.tsx` | Renders controls for focused section |
+| `src/components/CompareView.tsx` | Side-by-side grids |
+| `src/components/ThemePanel.tsx` | Token editors + preview strip |
+| `src/components/ComponentCard.tsx` | Single card with error boundary |
+| `src/components/ErrorBoundary.tsx` | Per-card render fallback |
+| `src/sections/*.section.tsx` | Extended with `defaultState`, `controls`, stateful `Demo` |
+| `src/section.ts` | Re-export `Section` from `types.ts` (keep import path stable) |
+| `src/App.tsx` | Shell composing left pane + main views |
+| `src/main.tsx` | Wrap with `KitchenSinkProvider` |
+| `src/styles.css` | Layout: left pane, 3×3 grid, compare, control bar |
+| `src/tests/storage.test.ts` | Vitest tests for persistence |
+| `src/tests/cssVarOverrides.test.ts` | Vitest tests for CSS var builder |
+
+---
+
+### Task 1: Add Vitest and shared types — `composer-2.5-fast`
+
+**Files:**
+- Modify: `package.json`
+- Create: `src/types.ts`
+- Create: `vitest.config.ts`
+
+**Interfaces:**
+- Produces: `SystemTheme`, `ThemeSubPage`, `AppView`, `TokenOverrides`, `PersistedState`, `ControlDef`, `Section`
+
+- [ ] **Step 1: Add Vitest dev dependency and test script**
+
+Modify `package.json` scripts and devDependencies:
+
+```json
+{
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc --noEmit && vite build",
+ "check": "tsc --noEmit && vite build",
+ "test": "vitest run",
+ "preview": "vite preview"
+ },
+ "devDependencies": {
+ "@types/react": "^18.3.31",
+ "@types/react-dom": "^18.3.7",
+ "@vitejs/plugin-react": "^6.0.4",
+ "typescript": "^7.0.2",
+ "vite": "^8.1.5",
+ "vitest": "^3.2.4"
+ }
+}
+```
+
+Run: `npm install`
+
+- [ ] **Step 2: Create Vitest config**
+
+Create `vitest.config.ts`:
+
+```ts
+import { defineConfig } from "vitest/config";
+
+export default defineConfig({
+ test: {
+ environment: "node",
+ include: ["src/tests/**/*.test.ts"],
+ },
+});
+```
+
+- [ ] **Step 3: Create shared types**
+
+Create `src/types.ts`:
+
+```ts
+import type React from "react";
+import type { ThemeColor } from "@vibe/core";
+
+export type SystemTheme = "light" | "dark" | "black";
+export type AppView = "components" | "theme";
+export type ThemeSubPage = "colors" | "radius" | "spacing" | "typography";
+
+export type ThemeColorOverrides = Partial>>>;
+
+export type TokenOverrides = {
+ colors: ThemeColorOverrides;
+ radius: Record;
+ spacing: Record;
+ typography: Record;
+};
+
+export type ComponentStateMap = Record>;
+
+export type AppState = {
+ view: AppView;
+ themeSubPage: ThemeSubPage;
+ systemTheme: SystemTheme;
+ tokenOverrides: TokenOverrides;
+ componentStates: ComponentStateMap;
+ focusedComponentId: string | null;
+ compareMode: boolean;
+};
+
+export const STORAGE_VERSION = 1;
+export const STORAGE_KEY = "facelift-kitchen-sink-state";
+
+export type PersistedState = {
+ version: number;
+ view: AppView;
+ themeSubPage: ThemeSubPage;
+ systemTheme: SystemTheme;
+ tokenOverrides: TokenOverrides;
+ componentStates: ComponentStateMap;
+ focusedComponentId: string | null;
+};
+
+export type ControlOption = { value: string; label: string };
+
+export type ControlDef =
+ | {
+ key: string;
+ label: string;
+ type: "select";
+ options: ControlOption[];
+ }
+ | {
+ key: string;
+ label: string;
+ type: "boolean";
+ };
+
+export interface Section {
+ id: string;
+ title: string;
+ defaultState: Record;
+ controls: ControlDef[];
+ Demo: React.FC<{ state: Record }>;
+}
+
+export type TokenFieldDef =
+ | { id: string; label: string; kind: "color"; cssVar: ThemeColor }
+ | { id: string; label: string; kind: "css-var"; cssVar: string; unit?: string; defaultValue: string };
+```
+
+- [ ] **Step 4: Update section re-export**
+
+Replace `src/section.ts` contents:
+
+```ts
+export type { Section, ControlDef, ControlOption } from "./types";
+```
+
+- [ ] **Step 5: Verify**
+
+Run: `npm run check`
+Expected: PASS (no tests yet)
+
+- [ ] **Step 6: Commit**
+
+```bash
+git add package.json package-lock.json vitest.config.ts src/types.ts src/section.ts
+git commit -m "chore: add vitest and shared kitchen sink types"
+```
+
+---
+
+### Task 2: Default component states and token definitions — `composer-2.5-fast`
+
+**Files:**
+- Create: `src/lib/defaultComponentStates.ts`
+- Create: `src/lib/tokenDefinitions.ts`
+
+**Interfaces:**
+- Consumes: `Section` ids from existing sections (fixed order list)
+- Produces: `defaultComponentStates`, `EMPTY_TOKEN_OVERRIDES`, `TOKEN_FIELDS_BY_SUBPAGE`
+
+- [ ] **Step 1: Create default component states**
+
+Create `src/lib/defaultComponentStates.ts`:
+
+```ts
+import type { ComponentStateMap } from "../types";
+
+export const defaultComponentStates: ComponentStateMap = {
+ "icon-button": { kind: "primary", size: "medium", disabled: false },
+ button: {
+ kind: "primary",
+ size: "medium",
+ leftIcon: "none",
+ rightIcon: "none",
+ disabled: false,
+ loading: false,
+ },
+ "button-group": { kind: "primary", size: "medium", disabled: false },
+ tabs: { size: "medium", activeTab: 0 },
+ label: { color: "primary", size: "medium" },
+ chip: { color: "primary", size: "medium", disabled: false, readOnly: true },
+ "text-field": {
+ size: "medium",
+ disabled: false,
+ validation: "none",
+ withTitle: false,
+ },
+ dropdown: { size: "medium", disabled: false, multi: false },
+ toast: { type: "positive", withAction: false },
+};
+
+export function mergeWithDefaults(
+ stored: ComponentStateMap | undefined
+): ComponentStateMap {
+ const result: ComponentStateMap = {};
+ for (const [id, defaults] of Object.entries(defaultComponentStates)) {
+ result[id] = { ...defaults, ...(stored?.[id] ?? {}) };
+ }
+ return result;
+}
+```
+
+- [ ] **Step 2: Create token field definitions**
+
+Create `src/lib/tokenDefinitions.ts`:
+
+```ts
+import type { ThemeSubPage, TokenFieldDef, TokenOverrides } from "../types";
+
+export const EMPTY_TOKEN_OVERRIDES: TokenOverrides = {
+ colors: {},
+ radius: {},
+ spacing: {},
+ typography: {},
+};
+
+export const TOKEN_FIELDS_BY_SUBPAGE: Record = {
+ colors: [
+ { id: "primary-color", label: "Primary", kind: "color", cssVar: "primary-color" },
+ { id: "primary-hover-color", label: "Primary hover", kind: "color", cssVar: "primary-hover-color" },
+ { id: "brand-color", label: "Brand", kind: "color", cssVar: "brand-color" },
+ { id: "brand-hover-color", label: "Brand hover", kind: "color", cssVar: "brand-hover-color" },
+ { id: "primary-selected-color", label: "Primary selected", kind: "color", cssVar: "primary-selected-color" },
+ ],
+ radius: [
+ { id: "radius-small", label: "Small", kind: "css-var", cssVar: "--border-radius-small", unit: "px", defaultValue: "4" },
+ { id: "radius-medium", label: "Medium", kind: "css-var", cssVar: "--border-radius-medium", unit: "px", defaultValue: "8" },
+ { id: "radius-big", label: "Large", kind: "css-var", cssVar: "--border-radius-big", unit: "px", defaultValue: "16" },
+ ],
+ spacing: [
+ { id: "space-8", label: "Space 8", kind: "css-var", cssVar: "--space-8", unit: "px", defaultValue: "8" },
+ { id: "space-16", label: "Space 16", kind: "css-var", cssVar: "--space-16", unit: "px", defaultValue: "16" },
+ { id: "space-24", label: "Space 24", kind: "css-var", cssVar: "--space-24", unit: "px", defaultValue: "24" },
+ ],
+ typography: [
+ { id: "font-size-30", label: "Body size", kind: "css-var", cssVar: "--font-size-30", unit: "px", defaultValue: "16" },
+ { id: "font-size-40", label: "Heading size", kind: "css-var", cssVar: "--font-size-40", unit: "px", defaultValue: "18" },
+ { id: "font-weight-bold", label: "Bold weight", kind: "css-var", cssVar: "--font-weight-bold", defaultValue: "500" },
+ ],
+};
+```
+
+- [ ] **Step 3: Verify**
+
+Run: `npm run check`
+Expected: PASS
+
+- [ ] **Step 4: Commit**
+
+```bash
+git add src/lib/defaultComponentStates.ts src/lib/tokenDefinitions.ts
+git commit -m "feat: add default component states and token field definitions"
+```
+
+---
+
+### Task 3: Persistence and CSS override helpers (TDD) — `claude-sonnet-5-thinking-high`
+
+**Files:**
+- Create: `src/lib/storage.ts`
+- Create: `src/lib/cssVarOverrides.ts`
+- Create: `src/lib/buildThemeConfig.ts`
+- Create: `src/tests/storage.test.ts`
+- Create: `src/tests/cssVarOverrides.test.ts`
+
+**Interfaces:**
+- Produces: `loadPersistedState()`, `savePersistedState(state)`, `createInitialAppState()`, `buildCssVarStyle(overrides)`, `buildThemeConfig(overrides, name)`
+
+- [ ] **Step 1: Write failing storage tests**
+
+Create `src/tests/storage.test.ts`:
+
+```ts
+import { describe, expect, it, beforeEach } from "vitest";
+import { loadPersistedState, savePersistedState, createInitialAppState } from "../lib/storage";
+import { STORAGE_KEY, STORAGE_VERSION } from "../types";
+
+beforeEach(() => {
+ localStorage.clear();
+});
+
+describe("storage", () => {
+ it("returns initial state when nothing stored", () => {
+ const state = loadPersistedState();
+ expect(state.view).toBe("components");
+ expect(state.systemTheme).toBe("light");
+ expect(state.componentStates.button.kind).toBe("primary");
+ });
+
+ it("round-trips persisted fields", () => {
+ const initial = createInitialAppState();
+ initial.systemTheme = "dark";
+ initial.componentStates.button = { ...initial.componentStates.button, kind: "secondary" };
+ savePersistedState(initial);
+
+ const loaded = loadPersistedState();
+ expect(loaded.systemTheme).toBe("dark");
+ expect(loaded.componentStates.button.kind).toBe("secondary");
+ });
+
+ it("resets when version mismatches", () => {
+ localStorage.setItem(
+ STORAGE_KEY,
+ JSON.stringify({ version: 999, systemTheme: "black" })
+ );
+ const loaded = loadPersistedState();
+ expect(loaded.systemTheme).toBe("light");
+ expect(loaded.version).toBe(STORAGE_VERSION);
+ });
+});
+```
+
+- [ ] **Step 2: Run tests — expect fail**
+
+Run: `npm test`
+Expected: FAIL — module `../lib/storage` not found
+
+- [ ] **Step 3: Implement storage**
+
+Create `src/lib/storage.ts`:
+
+```ts
+import { defaultComponentStates, mergeWithDefaults } from "./defaultComponentStates";
+import { EMPTY_TOKEN_OVERRIDES } from "./tokenDefinitions";
+import type { AppState, PersistedState } from "../types";
+import { STORAGE_KEY, STORAGE_VERSION } from "../types";
+
+export function createInitialAppState(): AppState {
+ return {
+ view: "components",
+ themeSubPage: "colors",
+ systemTheme: "light",
+ tokenOverrides: structuredClone(EMPTY_TOKEN_OVERRIDES),
+ componentStates: mergeWithDefaults(undefined),
+ focusedComponentId: "button",
+ compareMode: false,
+ };
+}
+
+function toPersisted(state: AppState): PersistedState {
+ return {
+ version: STORAGE_VERSION,
+ view: state.view,
+ themeSubPage: state.themeSubPage,
+ systemTheme: state.systemTheme,
+ tokenOverrides: state.tokenOverrides,
+ componentStates: state.componentStates,
+ focusedComponentId: state.focusedComponentId,
+ };
+}
+
+export function savePersistedState(state: AppState): void {
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(toPersisted(state)));
+}
+
+export function loadPersistedState(): AppState {
+ const raw = localStorage.getItem(STORAGE_KEY);
+ if (!raw) return createInitialAppState();
+
+ try {
+ const parsed = JSON.parse(raw) as Partial;
+ if (parsed.version !== STORAGE_VERSION) return createInitialAppState();
+
+ const base = createInitialAppState();
+ return {
+ ...base,
+ view: parsed.view ?? base.view,
+ themeSubPage: parsed.themeSubPage ?? base.themeSubPage,
+ systemTheme: parsed.systemTheme ?? base.systemTheme,
+ tokenOverrides: {
+ ...base.tokenOverrides,
+ ...parsed.tokenOverrides,
+ colors: parsed.tokenOverrides?.colors ?? base.tokenOverrides.colors,
+ radius: parsed.tokenOverrides?.radius ?? base.tokenOverrides.radius,
+ spacing: parsed.tokenOverrides?.spacing ?? base.tokenOverrides.spacing,
+ typography: parsed.tokenOverrides?.typography ?? base.tokenOverrides.typography,
+ },
+ componentStates: mergeWithDefaults(parsed.componentStates),
+ focusedComponentId: parsed.focusedComponentId ?? base.focusedComponentId,
+ compareMode: false,
+ };
+ } catch {
+ return createInitialAppState();
+ }
+}
+
+export { defaultComponentStates };
+```
+
+- [ ] **Step 4: Write failing cssVarOverrides test**
+
+Create `src/tests/cssVarOverrides.test.ts`:
+
+```ts
+import { describe, expect, it } from "vitest";
+import { buildCssVarStyle } from "../lib/cssVarOverrides";
+import { EMPTY_TOKEN_OVERRIDES } from "../lib/tokenDefinitions";
+
+describe("buildCssVarStyle", () => {
+ it("maps radius spacing typography overrides to CSS properties", () => {
+ const style = buildCssVarStyle({
+ ...EMPTY_TOKEN_OVERRIDES,
+ radius: { "--border-radius-medium": "12px" },
+ spacing: { "--space-16": "20px" },
+ typography: { "--font-size-30": "18px" },
+ });
+ expect(style["--border-radius-medium"]).toBe("12px");
+ expect(style["--space-16"]).toBe("20px");
+ expect(style["--font-size-30"]).toBe("18px");
+ });
+});
+```
+
+- [ ] **Step 5: Implement cssVarOverrides and buildThemeConfig**
+
+Create `src/lib/cssVarOverrides.ts`:
+
+```ts
+import type { CSSProperties } from "react";
+import type { TokenOverrides } from "../types";
+
+export function buildCssVarStyle(overrides: TokenOverrides): CSSProperties {
+ return {
+ ...overrides.radius,
+ ...overrides.spacing,
+ ...overrides.typography,
+ } as CSSProperties;
+}
+```
+
+Create `src/lib/buildThemeConfig.ts`:
+
+```ts
+import type { Theme } from "@vibe/core";
+import type { TokenOverrides } from "../types";
+
+export function buildThemeConfig(overrides: TokenOverrides): Theme | undefined {
+ const colors = overrides.colors;
+ if (!colors || Object.keys(colors).length === 0) return undefined;
+
+ return {
+ name: "facelift-custom-theme",
+ colors,
+ };
+}
+```
+
+- [ ] **Step 6: Run tests**
+
+Run: `npm test`
+Expected: PASS (3 tests)
+
+- [ ] **Step 7: Verify build**
+
+Run: `npm run check`
+Expected: PASS
+
+- [ ] **Step 8: Commit**
+
+```bash
+git add src/lib/storage.ts src/lib/cssVarOverrides.ts src/lib/buildThemeConfig.ts src/tests/
+git commit -m "feat: add persistence and theme override helpers"
+```
+
+---
+
+### Task 4: KitchenSinkContext — `claude-sonnet-5-thinking-high`
+
+**Files:**
+- Create: `src/context/KitchenSinkContext.tsx`
+- Modify: `src/main.tsx`
+
+**Interfaces:**
+- Consumes: `loadPersistedState`, `savePersistedState`, `createInitialAppState`
+- Produces: `KitchenSinkProvider`, `useKitchenSink()`
+
+- [ ] **Step 1: Implement context**
+
+Create `src/context/KitchenSinkContext.tsx`:
+
+```tsx
+import {
+ createContext,
+ useCallback,
+ useContext,
+ useEffect,
+ useMemo,
+ useState,
+ type ReactNode,
+} from "react";
+import { loadPersistedState, savePersistedState } from "../lib/storage";
+import type {
+ AppState,
+ AppView,
+ SystemTheme,
+ ThemeSubPage,
+ TokenOverrides,
+} from "../types";
+
+type KitchenSinkContextValue = AppState & {
+ setView: (view: AppView) => void;
+ setThemeSubPage: (page: ThemeSubPage) => void;
+ setSystemTheme: (theme: SystemTheme) => void;
+ setFocusedComponentId: (id: string | null) => void;
+ setCompareMode: (enabled: boolean) => void;
+ updateComponentState: (id: string, patch: Record) => void;
+ updateTokenOverrides: (patch: Partial) => void;
+ updateColorOverride: (theme: SystemTheme, key: string, value: string) => void;
+};
+
+const KitchenSinkContext = createContext(null);
+
+export function KitchenSinkProvider({ children }: { children: ReactNode }) {
+ const [state, setState] = useState(loadPersistedState);
+
+ useEffect(() => {
+ const id = window.setTimeout(() => savePersistedState(state), 200);
+ return () => window.clearTimeout(id);
+ }, [state]);
+
+ const setView = useCallback((view: AppView) => {
+ setState((s) => ({ ...s, view, compareMode: false }));
+ }, []);
+
+ const setThemeSubPage = useCallback((themeSubPage: ThemeSubPage) => {
+ setState((s) => ({ ...s, view: "theme", themeSubPage }));
+ }, []);
+
+ const setSystemTheme = useCallback((systemTheme: SystemTheme) => {
+ setState((s) => ({ ...s, systemTheme }));
+ }, []);
+
+ const setFocusedComponentId = useCallback((focusedComponentId: string | null) => {
+ setState((s) => ({ ...s, focusedComponentId, compareMode: false }));
+ }, []);
+
+ const setCompareMode = useCallback((compareMode: boolean) => {
+ setState((s) => ({ ...s, compareMode }));
+ }, []);
+
+ const updateComponentState = useCallback((id: string, patch: Record) => {
+ setState((s) => ({
+ ...s,
+ componentStates: {
+ ...s.componentStates,
+ [id]: { ...s.componentStates[id], ...patch },
+ },
+ }));
+ }, []);
+
+ const updateTokenOverrides = useCallback((patch: Partial) => {
+ setState((s) => ({
+ ...s,
+ tokenOverrides: {
+ colors: { ...s.tokenOverrides.colors, ...patch.colors },
+ radius: { ...s.tokenOverrides.radius, ...patch.radius },
+ spacing: { ...s.tokenOverrides.spacing, ...patch.spacing },
+ typography: { ...s.tokenOverrides.typography, ...patch.typography },
+ },
+ }));
+ }, []);
+
+ const updateColorOverride = useCallback(
+ (theme: SystemTheme, key: string, value: string) => {
+ setState((s) => ({
+ ...s,
+ tokenOverrides: {
+ ...s.tokenOverrides,
+ colors: {
+ ...s.tokenOverrides.colors,
+ [theme]: {
+ ...s.tokenOverrides.colors[theme],
+ [key]: value,
+ },
+ },
+ },
+ }));
+ },
+ []
+ );
+
+ const value = useMemo(
+ () => ({
+ ...state,
+ setView,
+ setThemeSubPage,
+ setSystemTheme,
+ setFocusedComponentId,
+ setCompareMode,
+ updateComponentState,
+ updateTokenOverrides,
+ updateColorOverride,
+ }),
+ [
+ state,
+ setView,
+ setThemeSubPage,
+ setSystemTheme,
+ setFocusedComponentId,
+ setCompareMode,
+ updateComponentState,
+ updateTokenOverrides,
+ updateColorOverride,
+ ]
+ );
+
+ return (
+ {children}
+ );
+}
+
+export function useKitchenSink(): KitchenSinkContextValue {
+ const ctx = useContext(KitchenSinkContext);
+ if (!ctx) throw new Error("useKitchenSink must be used within KitchenSinkProvider");
+ return ctx;
+}
+```
+
+- [ ] **Step 2: Wrap app in provider (ThemeProvider added in Task 5)**
+
+Modify `src/main.tsx`:
+
+```tsx
+import React from "react";
+import ReactDOM from "react-dom/client";
+import "@vibe/core/tokens";
+import "./styles.css";
+import App from "./App";
+import { KitchenSinkProvider } from "./context/KitchenSinkContext";
+
+ReactDOM.createRoot(document.getElementById("root")!).render(
+
+
+
+
+
+);
+```
+
+- [ ] **Step 3: Verify**
+
+Run: `npm run check && npm test`
+Expected: PASS
+
+- [ ] **Step 4: Commit**
+
+```bash
+git add src/context/KitchenSinkContext.tsx src/main.tsx
+git commit -m "feat: add KitchenSinkContext with localStorage sync"
+```
+
+---
+
+### Task 5: ThemeProvider wrapper and app shell styles — `claude-sonnet-5-thinking-high` *(Opus if theme overrides don't apply)*
+
+**Files:**
+- Create: `src/components/AppThemeShell.tsx`
+- Modify: `src/styles.css`
+- Modify: `src/App.tsx` (minimal shell stub)
+
+**Interfaces:**
+- Consumes: `useKitchenSink()`, `buildThemeConfig`, `buildCssVarStyle`
+- Produces: `AppThemeShell` wrapping children with Vibe theme + CSS vars
+
+- [ ] **Step 1: Create AppThemeShell**
+
+Create `src/components/AppThemeShell.tsx`:
+
+```tsx
+import { ThemeProvider } from "@vibe/core";
+import type { ReactNode } from "react";
+import { useKitchenSink } from "../context/KitchenSinkContext";
+import { buildThemeConfig } from "../lib/buildThemeConfig";
+import { buildCssVarStyle } from "../lib/cssVarOverrides";
+
+export function AppThemeShell({ children }: { children: ReactNode }) {
+ const { systemTheme, tokenOverrides } = useKitchenSink();
+ const themeConfig = buildThemeConfig(tokenOverrides);
+ const cssVars = buildCssVarStyle(tokenOverrides);
+
+ return (
+
+
+ {children}
+
+
+ );
+}
+```
+
+- [ ] **Step 2: Replace styles.css layout foundation**
+
+Replace `src/styles.css` with layout rules (keep Vibe-friendly fonts):
+
+```css
+* {
+ box-sizing: border-box;
+}
+
+body {
+ margin: 0;
+ font-family: Figtree, Roboto, -apple-system, BlinkMacSystemFont, sans-serif;
+ background: var(--primary-background-color, #f6f7fb);
+ color: var(--primary-text-color, #323338);
+}
+
+.layout {
+ display: flex;
+ min-height: 100vh;
+}
+
+.left-pane {
+ position: sticky;
+ top: 0;
+ width: 240px;
+ flex-shrink: 0;
+ height: 100vh;
+ overflow-y: auto;
+ padding: 24px 16px;
+ background: var(--secondary-background-color, #ffffff);
+ border-right: 1px solid var(--layout-border-color, #e6e9ef);
+ display: flex;
+ flex-direction: column;
+}
+
+.left-pane-title {
+ margin: 0 0 20px;
+ font-size: 18px;
+ font-weight: 700;
+}
+
+.left-pane-nav {
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+ flex: 1;
+}
+
+.left-pane-link,
+.left-pane-sublink,
+.left-pane-theme-mode {
+ padding: 7px 10px;
+ border: none;
+ border-radius: 4px;
+ background: none;
+ font: inherit;
+ font-size: 14px;
+ text-align: left;
+ cursor: pointer;
+ color: var(--primary-text-color, #323338);
+}
+
+.left-pane-sublink {
+ padding-left: 24px;
+ font-size: 13px;
+}
+
+.left-pane-link:hover,
+.left-pane-sublink:hover,
+.left-pane-theme-mode:hover {
+ background: var(--primary-background-hover-color, #eff1f8);
+}
+
+.left-pane-link.is-active,
+.left-pane-sublink.is-active,
+.left-pane-theme-mode.is-active {
+ background: var(--primary-selected-color, #cce5ff);
+ font-weight: 600;
+}
+
+.left-pane-footer {
+ margin-top: auto;
+ padding-top: 16px;
+ border-top: 1px solid var(--layout-border-color, #e6e9ef);
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+}
+
+.main-area {
+ flex: 1;
+ min-height: 100vh;
+ padding: 32px;
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+}
+
+.component-grid {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 20px;
+}
+
+.component-card {
+ position: relative;
+ min-height: 220px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ background: var(--secondary-background-color, #ffffff);
+ border: 1px solid var(--layout-border-color, #e6e9ef);
+ border-radius: var(--border-radius-medium, 8px);
+ padding: 16px;
+ cursor: pointer;
+}
+
+.component-card.is-focused {
+ border-color: var(--primary-color, #0073ea);
+ outline: 2px solid var(--primary-selected-color, #cce5ff);
+}
+
+.component-card-title {
+ position: absolute;
+ top: 16px;
+ left: 16px;
+ margin: 0;
+ font-size: 13px;
+ font-weight: 600;
+ color: var(--secondary-text-color, #676879);
+ text-transform: uppercase;
+ letter-spacing: 0.4px;
+}
+
+.component-card-demo {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ padding-top: 24px;
+}
+
+.control-bar {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 12px;
+ align-items: center;
+ padding: 16px;
+ border: 1px solid var(--layout-border-color, #e6e9ef);
+ border-radius: var(--border-radius-medium, 8px);
+ background: var(--secondary-background-color, #ffffff);
+}
+
+.control-bar-label {
+ font-size: 14px;
+ font-weight: 600;
+ margin-right: 8px;
+}
+
+.compare-layout {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 24px;
+}
+
+.compare-column-title {
+ margin: 0 0 12px;
+ font-size: 16px;
+ font-weight: 600;
+}
+
+.compare-toolbar {
+ display: flex;
+ justify-content: flex-end;
+}
+
+.theme-panel {
+ display: flex;
+ flex-direction: column;
+ gap: 24px;
+ max-width: 720px;
+}
+
+.theme-field {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+}
+
+.theme-preview-strip {
+ display: flex;
+ gap: 16px;
+ align-items: center;
+ padding: 16px;
+ border: 1px dashed var(--layout-border-color, #e6e9ef);
+ border-radius: var(--border-radius-medium, 8px);
+}
+
+.card-error {
+ font-size: 12px;
+ color: var(--negative-color, #d83a52);
+ text-align: center;
+ padding: 8px;
+}
+```
+
+- [ ] **Step 3: Stub App.tsx with shell**
+
+Replace `src/App.tsx`:
+
+```tsx
+import { AppThemeShell } from "./components/AppThemeShell";
+import { LeftPane } from "./components/LeftPane";
+import { useKitchenSink } from "./context/KitchenSinkContext";
+import { ComponentsView } from "./components/ComponentsView";
+import { ThemePanel } from "./components/ThemePanel";
+
+export default function App() {
+ const { view } = useKitchenSink();
+
+ return (
+
+
+
+
+ {view === "components" ? : }
+
+
+
+ );
+}
+```
+
+Create placeholder exports to unblock compile (filled in Tasks 6–8):
+
+`src/components/LeftPane.tsx`, `src/components/ComponentsView.tsx`, `src/components/ThemePanel.tsx` — each exports minimal `() => null` until implemented.
+
+- [ ] **Step 4: Verify**
+
+Run: `npm run check`
+Expected: PASS
+
+- [ ] **Step 5: Commit**
+
+```bash
+git add src/components/AppThemeShell.tsx src/components/LeftPane.tsx src/components/ComponentsView.tsx src/components/ThemePanel.tsx src/App.tsx src/styles.css
+git commit -m "feat: add theme shell and layout styles"
+```
+
+---
+
+### Task 6: LeftPane navigation — `composer-2.5-fast`
+
+**Files:**
+- Modify: `src/components/LeftPane.tsx`
+
+**Interfaces:**
+- Consumes: `useKitchenSink()` — `view`, `themeSubPage`, `systemTheme`, setters
+
+- [ ] **Step 1: Implement LeftPane**
+
+Replace `src/components/LeftPane.tsx`:
+
+```tsx
+import { useKitchenSink } from "../context/KitchenSinkContext";
+import type { SystemTheme, ThemeSubPage } from "../types";
+
+const THEME_SUBPAGES: { id: ThemeSubPage; label: string }[] = [
+ { id: "colors", label: "Colors" },
+ { id: "radius", label: "Radius" },
+ { id: "spacing", label: "Spacing" },
+ { id: "typography", label: "Typography" },
+];
+
+const SYSTEM_THEMES: SystemTheme[] = ["light", "dark", "black"];
+
+export function LeftPane() {
+ const {
+ view,
+ themeSubPage,
+ systemTheme,
+ setView,
+ setThemeSubPage,
+ setSystemTheme,
+ } = useKitchenSink();
+
+ return (
+
+ Facelift Kitchen Sink
+
+ setView("components")}
+ >
+ Components
+
+ setThemeSubPage(themeSubPage)}
+ >
+ Theme
+
+ {view === "theme" &&
+ THEME_SUBPAGES.map((page) => (
+ setThemeSubPage(page.id)}
+ >
+ {page.label}
+
+ ))}
+
+
+ {SYSTEM_THEMES.map((theme) => (
+ setSystemTheme(theme)}
+ >
+ {theme.charAt(0).toUpperCase() + theme.slice(1)}
+
+ ))}
+
+
+ );
+}
+```
+
+- [ ] **Step 2: Manual check**
+
+Run: `npm run dev`
+Click: Components / Theme / sub-pages / Light Dark Black
+Expected: active styles switch; no console errors
+
+- [ ] **Step 3: Commit**
+
+```bash
+git add src/components/LeftPane.tsx
+git commit -m "feat: add left pane navigation and theme mode toggles"
+```
+
+---
+
+### Task 7: Component grid, control bar, and error boundary — `claude-sonnet-5-thinking-high`
+
+**Files:**
+- Create: `src/components/ErrorBoundary.tsx`
+- Create: `src/components/ComponentCard.tsx`
+- Create: `src/components/ComponentGrid.tsx`
+- Create: `src/components/ComponentControlBar.tsx`
+- Create: `src/components/ComponentsView.tsx`
+
+**Interfaces:**
+- Consumes: `sections` from `./sections`, `useKitchenSink()`, `defaultComponentStates`
+
+- [ ] **Step 1: ErrorBoundary**
+
+Create `src/components/ErrorBoundary.tsx`:
+
+```tsx
+import { Component, type ErrorInfo, type ReactNode } from "react";
+
+type Props = { fallback: ReactNode; children: ReactNode };
+type State = { hasError: boolean };
+
+export class ErrorBoundary extends Component {
+ state: State = { hasError: false };
+
+ static getDerivedStateFromError(): State {
+ return { hasError: true };
+ }
+
+ componentDidCatch(error: Error, info: ErrorInfo) {
+ console.error("Component demo error:", error, info);
+ }
+
+ render() {
+ if (this.state.hasError) return this.props.fallback;
+ return this.props.children;
+ }
+}
+```
+
+- [ ] **Step 2: ComponentCard**
+
+Create `src/components/ComponentCard.tsx`:
+
+```tsx
+import type { Section } from "../types";
+import { ErrorBoundary } from "./ErrorBoundary";
+
+type Props = {
+ section: Section;
+ state: Record;
+ focused: boolean;
+ onFocus: () => void;
+};
+
+export function ComponentCard({ section, state, focused, onFocus }: Props) {
+ const { Demo, title } = section;
+
+ return (
+ {
+ if (e.key === "Enter" || e.key === " ") onFocus();
+ }}
+ >
+ {title}
+
+ Could not render this state}>
+
+
+
+
+ );
+}
+```
+
+- [ ] **Step 3: ComponentGrid**
+
+Create `src/components/ComponentGrid.tsx`:
+
+```tsx
+import { sections } from "../sections";
+import { ComponentCard } from "./ComponentCard";
+
+type Props = {
+ componentStates: Record>;
+ focusedComponentId: string | null;
+ onFocus: (id: string) => void;
+};
+
+export function ComponentGrid({ componentStates, focusedComponentId, onFocus }: Props) {
+ return (
+
+ {sections.map((section) => (
+ onFocus(section.id)}
+ />
+ ))}
+
+ );
+}
+```
+
+- [ ] **Step 4: ComponentControlBar**
+
+Create `src/components/ComponentControlBar.tsx`:
+
+```tsx
+import { Dropdown, Flex, Text, Toggle } from "@vibe/core";
+import type { Section } from "../types";
+
+type Props = {
+ section: Section;
+ state: Record;
+ onChange: (patch: Record) => void;
+};
+
+export function ComponentControlBar({ section, state, onChange }: Props) {
+ return (
+
+
{section.title} controls
+
+ {section.controls.map((control) => {
+ if (control.type === "boolean") {
+ return (
+
+ {control.label}
+ onChange({ [control.key]: val })}
+ />
+
+ );
+ }
+
+ const options = control.options.map((o) => ({ value: o.value, label: o.label }));
+ const selected = options.find((o) => o.value === String(state[control.key])) ?? options[0];
+
+ return (
+
+ {control.label}
+
+ onChange({ [control.key]: opt?.value })}
+ clearable={false}
+ />
+
+
+ );
+ })}
+
+
+ );
+}
+```
+
+- [ ] **Step 5: ComponentsView**
+
+Create `src/components/ComponentsView.tsx`:
+
+```tsx
+import { Button } from "@vibe/core";
+import { useKitchenSink } from "../context/KitchenSinkContext";
+import { sections } from "../sections";
+import { CompareView } from "./CompareView";
+import { ComponentControlBar } from "./ComponentControlBar";
+import { ComponentGrid } from "./ComponentGrid";
+
+export function ComponentsView() {
+ const {
+ componentStates,
+ focusedComponentId,
+ compareMode,
+ setFocusedComponentId,
+ setCompareMode,
+ updateComponentState,
+ } = useKitchenSink();
+
+ const focusedSection = sections.find((s) => s.id === focusedComponentId) ?? sections[0];
+
+ if (compareMode) {
+ return setCompareMode(false)} />;
+ }
+
+ return (
+ <>
+
+ setCompareMode(true)}>
+ Compare
+
+
+
+ {focusedSection && (
+ updateComponentState(focusedSection.id, patch)}
+ />
+ )}
+ >
+ );
+}
+```
+
+Create stub `src/components/CompareView.tsx`:
+
+```tsx
+export function CompareView({ onExit }: { onExit: () => void }) {
+ return null;
+}
+```
+
+- [ ] **Step 6: Verify**
+
+Run: `npm run check`
+Expected: PASS (sections still old shape — fixed in Task 8)
+
+- [ ] **Step 7: Commit**
+
+```bash
+git add src/components/ErrorBoundary.tsx src/components/ComponentCard.tsx src/components/ComponentGrid.tsx src/components/ComponentControlBar.tsx src/components/ComponentsView.tsx src/components/CompareView.tsx
+git commit -m "feat: add component grid, control bar, and error boundary"
+```
+
+---
+
+### Task 8: Upgrade all nine sections — `gpt-5.6-terra-medium` *(Opus if >2 sections fail typecheck or render)*
+
+**Files:**
+- Modify: all `src/sections/*.section.tsx`
+- Modify: `src/sections/index.ts` (if needed — should still glob)
+
+**Interfaces:**
+- Each section exports `defaultState`, `controls`, and `Demo({ state })`
+
+- [ ] **Step 1: Update Button.section.tsx (reference implementation)**
+
+Replace `src/sections/Button.section.tsx`:
+
+```tsx
+import { Button } from "@vibe/core";
+import { Bolt } from "@vibe/icons";
+import type { Section } from "../section";
+
+const controls: Section["controls"] = [
+ {
+ key: "kind",
+ label: "Kind",
+ type: "select",
+ options: [
+ { value: "primary", label: "Primary" },
+ { value: "secondary", label: "Secondary" },
+ { value: "tertiary", label: "Tertiary" },
+ ],
+ },
+ {
+ key: "size",
+ label: "Size",
+ type: "select",
+ options: [
+ { value: "small", label: "Small" },
+ { value: "medium", label: "Medium" },
+ { value: "large", label: "Large" },
+ ],
+ },
+ {
+ key: "leftIcon",
+ label: "Left icon",
+ type: "select",
+ options: [
+ { value: "none", label: "None" },
+ { value: "left", label: "Left" },
+ ],
+ },
+ {
+ key: "rightIcon",
+ label: "Right icon",
+ type: "select",
+ options: [
+ { value: "none", label: "None" },
+ { value: "right", label: "Right" },
+ ],
+ },
+ { key: "disabled", label: "Disabled", type: "boolean" },
+ { key: "loading", label: "Loading", type: "boolean" },
+];
+
+const defaultState = {
+ kind: "primary",
+ size: "medium",
+ leftIcon: "none",
+ rightIcon: "none",
+ disabled: false,
+ loading: false,
+};
+
+const Demo: Section["Demo"] = ({ state }) => (
+ {}}
+ >
+ Click me
+
+);
+
+const section: Section = {
+ id: "button",
+ title: "Button",
+ defaultState,
+ controls,
+ Demo,
+};
+
+export default section;
+```
+
+- [ ] **Step 2: Update remaining eight sections**
+
+Apply the same pattern to each file. Verify prop names against `@vibe/core` types before coding. Minimum spec per file:
+
+| File | `defaultState` keys | Notes |
+| --- | --- | --- |
+| `IconButton.section.tsx` | `kind`, `size`, `disabled` | Use `IconButton` + `Bolt` icon |
+| `ButtonGroup.section.tsx` | `kind`, `size`, `disabled` | Render 2–3 grouped buttons |
+| `Tabs.section.tsx` | `size`, `activeTab` | Control active tab via state index |
+| `Label.section.tsx` | `color`, `size` | Map color/size to Vibe Label props |
+| `Chip.section.tsx` | `color`, `size`, `disabled`, `readOnly` | Component export is `Chips` |
+| `TextField.section.tsx` | `size`, `disabled`, `validation`, `withTitle` | Map validation to success/error props |
+| `Dropdown.section.tsx` | `size`, `disabled`, `multi` | Keep existing options array |
+| `Toast.section.tsx` | `type`, `withAction` | Keep open trigger button; toast reflects type |
+
+- [ ] **Step 3: Verify**
+
+Run: `npm run check`
+Expected: PASS
+
+Run: `npm run dev`
+Click each card, change controls, reload page
+Expected: states persist
+
+- [ ] **Step 4: Commit**
+
+```bash
+git add src/sections/
+git commit -m "feat: make all section demos stateful with control definitions"
+```
+
+---
+
+### Task 9: Compare view — `composer-2.5-fast`
+
+**Files:**
+- Modify: `src/components/CompareView.tsx`
+
+**Interfaces:**
+- Consumes: `sections`, `componentStates`, `defaultComponentStates` via context
+
+- [ ] **Step 1: Implement CompareView**
+
+Replace `src/components/CompareView.tsx`:
+
+```tsx
+import { Button } from "@vibe/core";
+import { useKitchenSink } from "../context/KitchenSinkContext";
+import { defaultComponentStates } from "../lib/defaultComponentStates";
+import { sections } from "../sections";
+import { ComponentGrid } from "./ComponentGrid";
+
+export function CompareView({ onExit }: { onExit: () => void }) {
+ const { componentStates } = useKitchenSink();
+
+ return (
+ <>
+
+
+ Back to editing
+
+
+
+
+ Original
+ [s.id, s.defaultState])
+ )}
+ focusedComponentId={null}
+ onFocus={() => {}}
+ />
+
+
+ Your design
+ {}}
+ />
+
+
+ >
+ );
+}
+```
+
+Remove unused import if `defaultComponentStates` not needed (use `s.defaultState`).
+
+- [ ] **Step 2: Disable focus ring in compare mode**
+
+Add optional prop `interactive?: boolean` to `ComponentGrid` / `ComponentCard` — when `false`, skip `cursor: pointer`, focus handlers, and `is-focused` class. Pass `interactive={false}` from CompareView.
+
+- [ ] **Step 3: Manual check**
+
+Run: `npm run dev`
+Change Button to secondary → Compare
+Expected: left grid shows primary default; right shows secondary
+
+- [ ] **Step 4: Commit**
+
+```bash
+git add src/components/CompareView.tsx src/components/ComponentGrid.tsx src/components/ComponentCard.tsx src/styles.css
+git commit -m "feat: add side-by-side compare view for component states"
+```
+
+---
+
+### Task 10: Theme panel with live preview — `claude-sonnet-5-thinking-high` *(Opus if token edits don't reflect in UI)*
+
+**Files:**
+- Modify: `src/components/ThemePanel.tsx`
+
+**Interfaces:**
+- Consumes: `TOKEN_FIELDS_BY_SUBPAGE`, `useKitchenSink()`, `updateColorOverride`, `updateTokenOverrides`
+
+- [ ] **Step 1: Implement ThemePanel**
+
+Replace `src/components/ThemePanel.tsx`:
+
+```tsx
+import { Button, Chips, TextField, Text } from "@vibe/core";
+import { TOKEN_FIELDS_BY_SUBPAGE } from "../lib/tokenDefinitions";
+import { useKitchenSink } from "../context/KitchenSinkContext";
+
+export function ThemePanel() {
+ const { themeSubPage, systemTheme, tokenOverrides, updateColorOverride, updateTokenOverrides } =
+ useKitchenSink();
+
+ const fields = TOKEN_FIELDS_BY_SUBPAGE[themeSubPage];
+
+ return (
+
+
+ {themeSubPage.charAt(0).toUpperCase() + themeSubPage.slice(1)} ({systemTheme})
+
+
+ {fields.map((field) => {
+ if (field.kind === "color") {
+ const value =
+ tokenOverrides.colors[systemTheme]?.[field.cssVar] ?? "";
+ return (
+
+ {field.label}
+ updateColorOverride(systemTheme, field.cssVar, e.target.value)}
+ />
+
+ );
+ }
+
+ const bucket =
+ themeSubPage === "radius"
+ ? tokenOverrides.radius
+ : themeSubPage === "spacing"
+ ? tokenOverrides.spacing
+ : tokenOverrides.typography;
+
+ const stored = bucket[field.cssVar]?.replace(field.unit ?? "", "") ?? field.defaultValue;
+
+ return (
+
+ {field.label}
+ {
+ const next = `${val}${field.unit ?? ""}`;
+ const patch =
+ themeSubPage === "radius"
+ ? { radius: { ...tokenOverrides.radius, [field.cssVar]: next } }
+ : themeSubPage === "spacing"
+ ? { spacing: { ...tokenOverrides.spacing, [field.cssVar]: next } }
+ : { typography: { ...tokenOverrides.typography, [field.cssVar]: next } };
+ updateTokenOverrides(patch);
+ }}
+ />
+
+ );
+ })}
+
+
+ {}}>Preview button
+
+
+
+
+ );
+}
+```
+
+- [ ] **Step 2: Manual check**
+
+Run: `npm run dev`
+Theme → Colors → change primary → Components
+Expected: button colors reflect override
+
+- [ ] **Step 3: Commit**
+
+```bash
+git add src/components/ThemePanel.tsx
+git commit -m "feat: add theme token panel with live preview strip"
+```
+
+---
+
+### Task 11: Final integration, README, and verification — `composer-2.5-fast`
+
+**Files:**
+- Modify: `README.md`
+- Modify: `src/sections/index.ts` (remove any stale search references if present)
+
+- [ ] **Step 1: Update README**
+
+Update `README.md` to describe:
+- Left pane navigation (Components / Theme sub-pages)
+- Compare button on Components page
+- Persistence via localStorage
+- Scripts: `npm run dev`, `npm run check`, `npm test`
+
+- [ ] **Step 2: Full verification**
+
+Run: `npm test && npm run check`
+Expected: all tests PASS, build PASS
+
+Manual checklist (from spec):
+1. Left pane switches Components ↔ Theme sub-pages
+2. Light / Dark / Black updates all views
+3. Click card → control bar updates; states persist on reload
+4. Theme token edits visible on Components grid after return
+5. Compare shows two 3×3 grids; Original = defaults, Your design = saved states
+6. 3×3 grid fills desktop width cleanly
+
+- [ ] **Step 3: Commit**
+
+```bash
+git add README.md
+git commit -m "docs: update README for interactive kitchen sink"
+```
+
+---
+
+## Spec coverage self-review
+
+| Spec requirement | Task |
+| --- | --- |
+| 9 components fixed order | Task 2, 8 |
+| Click-to-focus control bar | Task 7, 8 |
+| Compare side-by-side component states | Task 9 |
+| No change counter | — (not implemented) |
+| Light/Dark/Black global | Task 6 |
+| Theme sub-pages in left pane | Task 6, 10 |
+| Left pane nav only | Task 5, 6 |
+| 3×3 larger grid | Task 5, 7 |
+| Full persistence | Task 3, 4 |
+| ThemeProvider colors | Task 5 |
+| CSS var radius/spacing/typography | Task 3, 10 |
+| Theme live preview strip | Task 10 |
+| Per-card error fallback | Task 7 |
+| `npm run check` verification | All tasks |
+
+## Placeholder scan
+
+No TBD/TODO steps. Each task includes file paths, code, and verification commands.
+
+## Type consistency
+
+- `Section.Demo` always `(props: { state: Record }) => JSX`
+- `ComponentStateMap` keys match section `id` strings
+- `PersistedState.version` === `STORAGE_VERSION` (1)
+- `compareMode` never persisted; always `false` on load
+
+---
+
+**Plan complete and saved to `docs/superpowers/plans/2026-07-29-kitchen-sink-interactive.md`. Two execution options:**
+
+**1. Subagent-Driven (recommended)** — I dispatch a fresh subagent per task, review between tasks, fast iteration
+
+**2. Inline Execution** — Execute tasks in this session using executing-plans, batch execution with checkpoints
+
+**Which approach?**
diff --git a/apps/kitchen-sink/docs/superpowers/plans/2026-08-12-button-group-source-pair.md b/apps/kitchen-sink/docs/superpowers/plans/2026-08-12-button-group-source-pair.md
new file mode 100644
index 0000000000..a0dfb4c09c
--- /dev/null
+++ b/apps/kitchen-sink/docs/superpowers/plans/2026-08-12-button-group-source-pair.md
@@ -0,0 +1,37 @@
+# Plan: Button Group source pair (kitchen sink)
+
+Spec: `packages/kitchen-sink/docs/superpowers/specs/2026-08-12-button-group-source-pair-design.md`
+
+## Task 1 — Gallery nav pairing + state migrate
+
+Files:
+- `src/components/componentGalleries.tsx`
+- `src/types.ts` (optional: keep `segmented-control` in type for migration, or remove from `ComponentGalleryId` and coerce string)
+- `src/context/KitchenSinkContext.tsx`
+- `src/lib/defaultComponentStates.ts`
+- `src/components/SegmentedControlGalleryView.tsx` (title → "Button Group"; description can mention Segmented Control)
+
+Acceptance:
+- `COMPONENT_GALLERY_ORDER` has no `segmented-control`
+- `componentGalleries["button-group"]` is ButtonGroup gallery on Original, SegmentedControl gallery on Current
+- Label always "Button Group"
+- Persisted / transferred / hash `segmented-control` coerces to `button-group`
+- Do **not** git commit
+
+## Task 2 — Components grid section pairing
+
+Files:
+- `src/sections/ButtonGroup.section.tsx`
+- `src/sections/index.ts`
+- Keep `SegmentedControl.section.tsx` on disk but exclude from `SECTION_ORDER`
+
+Acceptance:
+- Only one section id `button-group` in the grid
+- Original Demo/controls = ButtonGroup
+- Current Demo/controls = SegmentedControl (reuse logic from SegmentedControl.section)
+- Title "Button Group"
+- Do **not** git commit
+
+## Task 3 — Review
+
+Verify Original/Current nav and grid match the spec; no standalone Segmented Control entry.
diff --git a/apps/kitchen-sink/docs/superpowers/specs/2026-07-26-kitchen-sink-design.md b/apps/kitchen-sink/docs/superpowers/specs/2026-07-26-kitchen-sink-design.md
new file mode 100644
index 0000000000..d27c6301fe
--- /dev/null
+++ b/apps/kitchen-sink/docs/superpowers/specs/2026-07-26-kitchen-sink-design.md
@@ -0,0 +1,89 @@
+# Vibe Kitchen Sink — Design
+
+**Date:** 2026-07-26
+**Owner:** Laure (Product Design Lead, monday.com)
+**Status:** Approved decisions from brainstorming session
+
+## Goal
+
+A single custom webpage (not Storybook) that renders a selected set of
+components from the open-source Vibe design system (`@vibe/core`,
+github.com/mondaycom/vibe) in one place, for quick visual reference.
+
+## Component scope (exact list, locked)
+
+Exactly these 15 components, using their `@vibe/core` export names:
+
+`IconButton`, `ButtonGroup`, `Button`, `Label`, `Chips` (the Chip component),
+`Modal`, `Avatar`, `Counter`, `Tabs` (composed with `TabList`/`Tab`/`TabPanel`),
+`TextField`, `Dropdown`, `Toggle`, `Checkbox`, `Tooltip`, `Toast`.
+
+No other components. The coverage script validates against this fixed list,
+not against all `@vibe/core` exports.
+
+## Decisions (locked)
+
+| Decision | Choice |
+| --- | --- |
+| Location | Standalone repo `vibe-kitchen-sink` (this repo), private on GitHub |
+| Component source | `@vibe/core` + `@vibe/icons` installed from npm |
+| Scope | Fixed list of 15 components (see above) |
+| Depth | One representative rendering per component |
+| Verification | Typecheck + lint + build + coverage script + browser screenshot self-review |
+| Execution | 2 parallel cloud agents overnight, unattended; merge next morning |
+
+## Architecture
+
+- **Stack:** Vite + React 18 + TypeScript. No router, no state library.
+- **Page layout:** left sidebar listing all components with a text search
+ filter; main area with one titled, anchor-linked section per component;
+ light/dark theme toggle using Vibe tokens.
+- **Demo contract:** one file per component at `src/demos/.demo.tsx`.
+ Each file default-exports a small React component rendering one representative
+ usage, plus a named export `meta = { name: "" }`.
+- **Auto-discovery:** the app collects demos with
+ `import.meta.glob('./demos/*.demo.tsx')`. There is **no shared registry file**
+ — agents only add new files, so parallel branches merge without conflicts by
+ construction.
+
+## Verify gate (loop engineering)
+
+- `scripts/coverage.mjs`: holds the fixed 15-component list, diffs it against
+ existing `*.demo.tsx` files, prints missing components, and exits non-zero
+ if any component is missing.
+- `npm run verify` = coverage + `tsc --noEmit` + lint + `vite build`.
+- Agents loop until their slice passes `verify`. "Done" is machine-checked, not
+ self-declared.
+- Additionally, each batch is screenshot-reviewed in a real browser by the
+ agent before being committed.
+
+## Execution plan
+
+1. **Scaffold (tonight, local):** app shell, theme toggle, sidebar, glob
+ loader, coverage script, lint/typecheck config, 1 example demo (Button),
+ `AGENTS.md` playbook for the cloud agents. Push to GitHub `main`.
+2. **Dispatch (tonight):** 2 cloud agents, each assigned a disjoint slice of
+ 7 components (Button is done in the scaffold as the reference example).
+ Each agent:
+ - writes only its own `*.demo.tsx` files (never edits shared files),
+ - runs `npm run verify`,
+ - screenshots its sections and self-reviews rendering,
+ - commits after every 3-4 components on its own branch (crash loses
+ little progress).
+3. **Wrap-up (tomorrow morning, one user message):** merge the 2 branches
+ (conflict-free by design), run full `verify`, visual pass over the whole
+ page, backfill anything missed.
+
+## Error handling
+
+- A component that cannot render standalone gets a placeholder card explaining
+ why, and an entry in `KNOWN_ISSUES.md`. Nothing is silently skipped.
+- Coverage script is the source of truth for completeness; the morning wrap-up
+ re-runs it against the merged result.
+
+## Out of scope
+
+- Any `@vibe/core` component not in the fixed 15-component list.
+- Multiple variants or prop playgrounds per component.
+- Deployment/hosting (local `npm run dev` only, for now).
+- Internal monorepo packages (`vibe-internal`) — open-source `@vibe/core` only.
diff --git a/apps/kitchen-sink/docs/superpowers/specs/2026-07-29-kitchen-sink-interactive-design.md b/apps/kitchen-sink/docs/superpowers/specs/2026-07-29-kitchen-sink-interactive-design.md
new file mode 100644
index 0000000000..293d879d9d
--- /dev/null
+++ b/apps/kitchen-sink/docs/superpowers/specs/2026-07-29-kitchen-sink-interactive-design.md
@@ -0,0 +1,234 @@
+# Facelift Kitchen Sink — Interactive Playground Design
+
+**Date:** 2026-07-29
+**Owner:** Laure (Product Design Lead, monday.com)
+**Status:** Approved from brainstorming session
+
+## Goal
+
+Evolve the Facelift Kitchen Sink from a static component gallery into an interactive playground for reviewing a Vibe redesign. Designers can tweak component states, switch system themes, customize design tokens, and compare default vs. customized component states side by side — with all choices persisted between sessions.
+
+## Locked decisions
+
+| Decision | Choice |
+| --- | --- |
+| Component scope | Same 9 components, same order: Icon Button, Button, Button Group, Tabs, Label, Chip, Text Field, Dropdown, Toast |
+| State controls | **Click-to-focus (C):** click a card → highlight + control bar below grid |
+| Compare | On Components page only; button in main area (not nav); side-by-side grids — Original (default states) vs Your design (current states); same theme on both sides |
+| Change counter | **Out of scope** — Compare button only, no change count |
+| Theme mode | Light / Dark / Black — global, always visible |
+| Theme customization | Full token playground: Colors, Radius, Spacing, Typography |
+| Navigation | Left pane only — no center/top page nav |
+| Theme sub-nav | Indented sub-pages under Theme in left pane |
+| Grid | Fixed 3×3, larger cards than today |
+| Persistence | Everything: theme mode, token overrides, per-component states, last focused card |
+| Architecture | View state + shared React context + `localStorage`; no router dependency |
+| Compare scope (v1) | Component states only — not theme comparison |
+
+## Architecture
+
+### Stack (unchanged)
+
+- Vite + React 18 + TypeScript
+- `@vibe/core` + `@vibe/icons`
+- No router library; optional URL hash sync deferred to a future iteration
+
+### State model
+
+Single `KitchenSinkContext` (or equivalent) holds:
+
+```ts
+type SystemTheme = "light" | "dark" | "black";
+
+type TokenOverrides = {
+ colors: ThemeColorTokenValueMap; // Vibe ThemeProvider shape
+ radius: Record; // CSS var → value
+ spacing: Record;
+ typography: Record;
+};
+
+type ComponentStateMap = {
+ [componentId: string]: Record; // per-section prop bag
+};
+
+type AppState = {
+ view: "components" | "theme";
+ themeSubPage: "colors" | "radius" | "spacing" | "typography";
+ systemTheme: SystemTheme;
+ tokenOverrides: TokenOverrides;
+ componentStates: ComponentStateMap;
+ focusedComponentId: string | null;
+ compareMode: boolean;
+};
+```
+
+- Hydrate from `localStorage` on mount; debounced write on change.
+- Provide `resetCategory(category)` and `resetComponentStates()` helpers (nice-to-have for v1, not blocking).
+
+### Vibe integration
+
+- Wrap app in `ThemeProvider` with `systemTheme` from context and `themeConfig` built from color overrides.
+- Apply radius / spacing / typography overrides by injecting CSS custom properties on a root wrapper (or `:root` / `body`) — these are not covered by `ThemeProvider`'s color-only API.
+- Import `@vibe/core/tokens` in `main.tsx` as today.
+
+### File structure (target)
+
+```
+src/
+ App.tsx # shell: left pane + main area
+ context/
+ KitchenSinkContext.tsx # state + persistence
+ components/
+ LeftPane.tsx # nav + theme mode + theme sub-nav
+ ComponentGrid.tsx # 3×3 grid
+ ComponentControlBar.tsx # focused component controls
+ CompareView.tsx # side-by-side grids
+ ThemePanel.tsx # token editors per sub-page
+ sections/ # existing *.section.tsx files, extended
+ lib/
+ defaultComponentStates.ts
+ tokenDefinitions.ts # which tokens appear on each theme sub-page
+```
+
+Each `*.section.tsx` exports `{ id, title, Demo, controls }` where `controls` defines the configurable props and `Demo` reads state from context (or receives props).
+
+## Layout
+
+### Left pane (always visible)
+
+```
+┌──────────────┐
+│ Facelift │
+│ Kitchen Sink │
+│ │
+│ Components │ ← top-level
+│ Theme │ ← top-level; expands when active:
+│ Colors │
+│ Radius │
+│ Spacing │
+│ Typography │
+│ │
+│ ──────────── │
+│ Light │ ← system theme (one active)
+│ Dark │
+│ Black │
+└──────────────┘
+```
+
+- Width ~240px, sticky, scrollable if Theme sub-nav overflows.
+- Selecting **Components** sets `view = "components"`, collapses theme sub-nav highlight to Theme parent only.
+- Selecting **Theme → {sub-page}** sets `view = "theme"` and `themeSubPage`.
+- Light / Dark / Black toggle `systemTheme` immediately app-wide.
+
+### Components view (main area)
+
+- **Compare** button top-right of main area.
+- **3×3 grid** — 9 cards, one per component. Cards are taller/wider than current `minmax(320px, 1fr)` auto-fill layout. Use `grid-template-columns: repeat(3, 1fr)` with a generous `min-height` per card.
+- **Click a card** → `focusedComponentId` updates, card gets accent border, control bar renders below the grid.
+- **Control bar** renders controls defined by the focused section's `controls` config (dropdowns, toggles — Vibe `Dropdown`, `Toggle`, `Checkbox` where possible).
+- Clicking empty space or another card moves focus.
+
+### Compare mode (Components view)
+
+Triggered by Compare button; replaces grid + control bar with:
+
+```
+┌─────────────────────┬─────────────────────┐
+│ Original │ Your design │
+│ default states │ persisted states │
+│ 3×3 grid │ 3×3 grid │
+└─────────────────────┴─────────────────────┘
+```
+
+- Both grids use the **current** `systemTheme` and **current** token overrides — only component prop states differ.
+- "Original" grid always renders `defaultComponentStates`; "Your design" grid renders `componentStates` from context.
+- Exit Compare (same button toggles, or explicit "Back to editing" label) restores normal Components view with prior focus preserved.
+
+### Theme view (main area)
+
+- Renders `ThemePanel` for the active `themeSubPage`.
+- Each sub-page shows labeled controls for its token group (sliders, text inputs, color pickers).
+- Live preview: main area can show a small sample strip (Button + Chip + Text Field) below the editors, or editors alone if space is tight — **prefer a live preview strip** so changes are visible without switching back to Components.
+
+## Component controls (v1)
+
+| Component | Configurable props |
+| --- | --- |
+| Icon Button | `kind` (primary / secondary / tertiary), `size`, `disabled` |
+| Button | `kind`, `size`, `leftIcon` (none / left), `rightIcon` (none / right), `disabled`, `loading` |
+| Button Group | `kind`, `size`, `disabled` |
+| Tabs | `size`, active tab index |
+| Label | `color`, `size` |
+| Chip | `color`, `size`, `disabled`, `readOnly` |
+| Text Field | `size`, `disabled`, validation state, `title` / icon presence |
+| Dropdown | `size`, `disabled`, multi-select |
+| Toast | `type` (positive / negative / neutral), action button presence |
+
+Exact prop names must match `@vibe/core` exports; verify against package types during implementation.
+
+## Theme token playground (v1)
+
+### Colors
+
+Use Vibe `ThemeProvider` `themeConfig.colors` keyed by `SystemTheme`. Expose at minimum:
+
+- `primary-color`, `primary-hover-color`
+- `brand-color`, `brand-hover-color`
+- `primary-selected-color`
+
+One set of pickers applies to the active system theme, or global overrides across all three — **implement per active system theme** so Light / Dark / Black can diverge.
+
+### Radius
+
+Override CSS variables on the app root, e.g.:
+
+- `--border-radius-small`
+- `--border-radius-medium`
+- `--border-radius-large`
+
+Sliders or numeric inputs with px/rem suffix.
+
+### Spacing
+
+Override spacing-related CSS variables used by Vibe components (confirm exact var names from `@vibe/core/tokens` during implementation). Start with 2–3 high-impact tokens rather than exhaustive coverage.
+
+### Typography
+
+Override font-size / weight variables for body and heading scales. Start with 2–3 tokens; expand if needed.
+
+## Persistence
+
+- **Key:** `facelift-kitchen-sink-state` in `localStorage`.
+- **Serialize:** full `AppState` minus transient UI if any.
+- **Migrate:** if stored JSON version mismatches, reset to defaults (version field in stored object).
+- **Defaults:** Vibe default theme, empty token overrides, `defaultComponentStates` for all nine components.
+
+## Error handling
+
+- If a component fails to render with a given state combo, fall back to default state for that component and show a one-line error in the card (do not crash the grid).
+- Invalid stored state on load → reset affected component to defaults.
+
+## Out of scope (v1)
+
+- Change counter
+- Theme comparison in Compare view
+- Router / shareable URLs
+- Reset-all button (nice-to-have)
+- Search filter (removed with old sidebar component list)
+- Components beyond the fixed list of 9
+- Deployment / hosting changes
+
+## Verification
+
+- `npm run check` passes (typecheck + build).
+- Manual pass:
+ 1. Left pane switches Components ↔ Theme sub-pages.
+ 2. Light / Dark / Black updates all views.
+ 3. Click card → control bar updates; states persist on reload.
+ 4. Theme token edits visible on Components grid after return.
+ 5. Compare shows two 3×3 grids; Original uses defaults, Your design uses saved states.
+ 6. 3×3 grid fills viewport cleanly at desktop width.
+
+## Implementation handoff
+
+Next step: invoke **writing-plans** skill to produce a step-by-step implementation plan from this spec.
diff --git a/apps/kitchen-sink/docs/superpowers/specs/2026-08-12-button-group-source-pair-design.md b/apps/kitchen-sink/docs/superpowers/specs/2026-08-12-button-group-source-pair-design.md
new file mode 100644
index 0000000000..a01a25d667
--- /dev/null
+++ b/apps/kitchen-sink/docs/superpowers/specs/2026-08-12-button-group-source-pair-design.md
@@ -0,0 +1,44 @@
+# Button Group ↔ Segmented Control source pair (kitchen sink)
+
+**Date:** 2026-08-12
+**Status:** Approved design (kitchen sink only)
+**Scope:** `packages/kitchen-sink` navigation + galleries/sections. No `@vibe/core` API changes.
+
+## Goal
+
+Treat Segmented Control as the **Current** counterpart to Button Group so Original ↔ Current compares the same slot. Sidebar label stays **Button Group** in both sources.
+
+## Behavior
+
+| Vibe source | Nav label | Gallery / grid demo |
+|-------------|----------------|---------------------------------------------|
+| Original | Button Group | `ButtonGroup` (npm / published) |
+| Current | Button Group | `SegmentedControl` (local workspace) |
+
+- One nav/gallery id: `button-group`.
+- Remove the standalone **Segmented Control** nav entry (and hide/filter the separate `segmented-control` gallery id from the sidebar order).
+- Switching Original ↔ Current while on Button Group keeps `componentSubPage: "button-group"` (existing state transfer already preserves view/theme/route).
+- Components grid card for Button Group follows the same swap.
+- Interactive section under the grid: Original uses `ButtonGroup.section`; Current uses Segmented Control demo content under the same `button-group` section id (or maps Current’s section renderer onto that id). Label remains **Button Group**.
+
+## Non-goals
+
+- Merging Segmented Control into Button Group in `@vibe/core`.
+- Aligning every gallery card 1:1 between the two components.
+- Changing published npm packages.
+
+## Implementation notes
+
+- `COMPONENT_GALLERY_ORDER`: drop `segmented-control`; keep `button-group`.
+- `componentGalleries["button-group"]`: render `ButtonGroupGalleryView` when Original, `SegmentedControlGalleryView` when Current.
+- `COMPONENT_GALLERY_LABELS["button-group"]`: always `"Button Group"`.
+- Sections: stop listing `segmented-control` as its own nav/section entry; on Current, `button-group` section Demo should render Segmented Control (shared Day/Week/Month options where practical).
+- Persist/migrate: if `componentSubPage === "segmented-control"`, coerce to `"button-group"` on load so old state still lands on the paired page.
+- Keep `SegmentedControlGalleryView` / section module files; wire them through the pair rather than deleting.
+
+## Success criteria
+
+- Original sidebar shows Button Group only (no Segmented Control).
+- Current sidebar shows Button Group only (no Segmented Control).
+- On that page, Original shows Button Group UI; Current shows Segmented Control UI.
+- Vibe switch preserves the Button Group page + theme/mode.
diff --git a/apps/kitchen-sink/index.html b/apps/kitchen-sink/index.html
new file mode 100644
index 0000000000..77fcb7ee89
--- /dev/null
+++ b/apps/kitchen-sink/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+ Facelift Kitchen Sink
+
+
+
+
+
+
diff --git a/apps/kitchen-sink/log.txt b/apps/kitchen-sink/log.txt
new file mode 100644
index 0000000000..0bc8f14c43
--- /dev/null
+++ b/apps/kitchen-sink/log.txt
@@ -0,0 +1,15 @@
+2026-08-16 12:57:41 ERROR Arduino not found
+2026-08-16 13:00:01 ERROR Arduino not found
+2026-08-16 13:00:17 ERROR Arduino not found
+2026-08-16 13:00:28 ERROR Arduino not found
+2026-08-16 13:02:58 ERROR Arduino not found
+2026-08-16 13:25:31 ERROR Arduino not found
+2026-08-16 13:25:50 ERROR Arduino not found
+2026-08-16 13:27:33 ERROR Arduino not found
+2026-08-16 13:27:41 ERROR Arduino not found
+2026-08-16 13:32:02 ERROR Arduino not found
+2026-08-16 13:32:19 ERROR Arduino not found
+2026-08-16 13:40:22 ERROR Arduino not found
+2026-08-16 13:42:53 ERROR Arduino not found
+2026-08-16 13:43:00 ERROR Arduino not found
+2026-08-16 13:49:19 ERROR Arduino not found
diff --git a/apps/kitchen-sink/package-lock.json b/apps/kitchen-sink/package-lock.json
new file mode 100644
index 0000000000..d12479865f
--- /dev/null
+++ b/apps/kitchen-sink/package-lock.json
@@ -0,0 +1,17458 @@
+{
+ "name": "facelift-kitchen-sink",
+ "version": "0.0.1",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "facelift-kitchen-sink",
+ "version": "0.0.1",
+ "dependencies": {
+ "@mondaydotcomorg/icons": "^1.51.0",
+ "@mondaydotcomorg/monday-ui-components": "^0.81.1",
+ "@vibe/base": "4.0.3",
+ "@vibe/button": "4.0.4",
+ "@vibe/clickable": "4.0.3",
+ "@vibe/core": "4.5.3",
+ "@vibe/dialog": "4.1.1",
+ "@vibe/hooks": "4.0.3",
+ "@vibe/icon": "4.0.3",
+ "@vibe/icon-button": "4.0.6",
+ "@vibe/icons": "4.1.0",
+ "@vibe/layer": "4.0.4",
+ "@vibe/layout": "4.0.4",
+ "@vibe/loader": "4.0.3",
+ "@vibe/shared": "4.0.3",
+ "@vibe/style": "4.0.0",
+ "@vibe/tooltip": "4.0.6",
+ "@vibe/typography": "4.0.6",
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1"
+ },
+ "devDependencies": {
+ "@types/react": "^18.3.31",
+ "@types/react-dom": "^18.3.7",
+ "@vitejs/plugin-react": "^6.0.4",
+ "sass": "^1.99.0",
+ "typescript": "^7.0.2",
+ "vite": "^8.1.5",
+ "vitest": "^3.2.4"
+ }
+ },
+ "node_modules/@adobe/css-tools": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz",
+ "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
+ "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz",
+ "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.8",
+ "@babel/types": "^7.29.8",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-globals": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz",
+ "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz",
+ "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
+ "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
+ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz",
+ "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.8"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz",
+ "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/runtime-corejs2": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.29.7.tgz",
+ "integrity": "sha512-5GidEBf/rOQlv4sUknPRgboZEvzt/je7CpbkCZ2o7ojs9JbldxdXJinGLYE0sYR9mfPpRz3Q3D7rP+oSCal70g==",
+ "license": "MIT",
+ "dependencies": {
+ "core-js": "^2.6.12"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz",
+ "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/parser": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz",
+ "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/generator": "^7.29.8",
+ "@babel/helper-globals": "^7.29.7",
+ "@babel/parser": "^7.29.8",
+ "@babel/template": "^7.29.7",
+ "@babel/types": "^7.29.8",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@csstools/selector-specificity": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz",
+ "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==",
+ "license": "CC0-1.0",
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss-selector-parser": "^6.0.10"
+ }
+ },
+ "node_modules/@emnapi/core": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz",
+ "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.2.2",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz",
+ "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz",
+ "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emotion/cache": {
+ "version": "10.0.29",
+ "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz",
+ "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/sheet": "0.9.4",
+ "@emotion/stylis": "0.8.5",
+ "@emotion/utils": "0.11.3",
+ "@emotion/weak-memoize": "0.2.5"
+ }
+ },
+ "node_modules/@emotion/core": {
+ "version": "10.3.1",
+ "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.3.1.tgz",
+ "integrity": "sha512-447aUEjPIm0MnE6QYIaFz9VQOHSXf4Iu6EWOIqq11EAPqinkSZmfymPTmlOE3QjLv846lH4JVZBUOtwGbuQoww==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "@emotion/cache": "^10.0.27",
+ "@emotion/css": "^10.0.27",
+ "@emotion/serialize": "^0.11.15",
+ "@emotion/sheet": "0.9.4",
+ "@emotion/utils": "0.11.3"
+ },
+ "peerDependencies": {
+ "react": ">=16.3.0"
+ }
+ },
+ "node_modules/@emotion/css": {
+ "version": "10.0.27",
+ "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.27.tgz",
+ "integrity": "sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/serialize": "^0.11.15",
+ "@emotion/utils": "0.11.3",
+ "babel-plugin-emotion": "^10.0.27"
+ }
+ },
+ "node_modules/@emotion/hash": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
+ "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/is-prop-valid": {
+ "version": "0.8.8",
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz",
+ "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emotion/memoize": "0.7.4"
+ }
+ },
+ "node_modules/@emotion/memoize": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz",
+ "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/serialize": {
+ "version": "0.11.16",
+ "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz",
+ "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/hash": "0.8.0",
+ "@emotion/memoize": "0.7.4",
+ "@emotion/unitless": "0.7.5",
+ "@emotion/utils": "0.11.3",
+ "csstype": "^2.5.7"
+ }
+ },
+ "node_modules/@emotion/serialize/node_modules/csstype": {
+ "version": "2.6.21",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz",
+ "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/sheet": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz",
+ "integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/stylis": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz",
+ "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/unitless": {
+ "version": "0.7.5",
+ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz",
+ "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/utils": {
+ "version": "0.11.3",
+ "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz",
+ "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/weak-memoize": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz",
+ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==",
+ "license": "MIT"
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz",
+ "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz",
+ "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz",
+ "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz",
+ "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz",
+ "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz",
+ "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz",
+ "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz",
+ "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz",
+ "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz",
+ "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz",
+ "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz",
+ "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz",
+ "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==",
+ "cpu": [
+ "mips64el"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz",
+ "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz",
+ "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz",
+ "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz",
+ "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz",
+ "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz",
+ "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz",
+ "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz",
+ "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz",
+ "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz",
+ "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz",
+ "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz",
+ "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz",
+ "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@faker-js/faker": {
+ "version": "9.9.0",
+ "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.9.0.tgz",
+ "integrity": "sha512-OEl393iCOoo/z8bMezRlJu+GlRGlsKbUAN7jKB6LhnKoqKve5DXRpalbItIIcwnCjs1k/FOPjFzcA6Qn+H+YbA==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fakerjs"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=9.0.0"
+ }
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz",
+ "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/utils": "^0.2.12"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz",
+ "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/core": "^1.8.0",
+ "@floating-ui/utils": "^0.2.12"
+ }
+ },
+ "node_modules/@floating-ui/react-dom": {
+ "version": "2.1.9",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz",
+ "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/dom": "^1.8.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.2.12",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz",
+ "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==",
+ "license": "MIT"
+ },
+ "node_modules/@handsontable/formulajs": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@handsontable/formulajs/-/formulajs-2.0.2.tgz",
+ "integrity": "sha512-maIyMJtYjA5e/R9nyA22Qd7Yw73MBSxClJvle0a8XWAS/5l6shc/OFpQqrmwMy4IXUCmywJ9ER0gOGz/YA720w==",
+ "license": "MIT",
+ "dependencies": {
+ "bessel": "^1.0.2",
+ "jstat": "^1.9.2"
+ },
+ "bin": {
+ "implementation-stats": "bin/implementation-stats"
+ }
+ },
+ "node_modules/@icons/material": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz",
+ "integrity": "sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "*"
+ }
+ },
+ "node_modules/@inquirer/ansi": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.7.tgz",
+ "integrity": "sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ }
+ },
+ "node_modules/@inquirer/confirm": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.1.1.tgz",
+ "integrity": "sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@inquirer/core": "^11.2.1",
+ "@inquirer/type": "^4.0.7"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/core": {
+ "version": "11.2.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.2.1.tgz",
+ "integrity": "sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@inquirer/ansi": "^2.0.7",
+ "@inquirer/figures": "^2.0.7",
+ "@inquirer/type": "^4.0.7",
+ "cli-width": "^4.1.0",
+ "fast-wrap-ansi": "^0.2.0",
+ "mute-stream": "^3.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/core/node_modules/cli-width": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz",
+ "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==",
+ "license": "ISC",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/@inquirer/core/node_modules/mute-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz",
+ "integrity": "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==",
+ "license": "ISC",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/@inquirer/core/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "license": "ISC",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@inquirer/external-editor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz",
+ "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==",
+ "license": "MIT",
+ "dependencies": {
+ "chardet": "^2.1.1",
+ "iconv-lite": "^0.7.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/figures": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.7.tgz",
+ "integrity": "sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ }
+ },
+ "node_modules/@inquirer/type": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.0.7.tgz",
+ "integrity": "sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/schemas": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
+ "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
+ "license": "MIT",
+ "dependencies": {
+ "@sinclair/typebox": "^0.27.8"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/types": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
+ "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^17.0.8",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@mondaydotcomorg/ai-agents-store-vulcan-client": {
+ "version": "1.1.61-a5f2",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/ai-agents-store-vulcan-client/-/ai-agents-store-vulcan-client-1.1.61-a5f2.tgz",
+ "integrity": "sha512-9RNkHS5H1WAHBpxFP2HZoXOL1CcAvqDSuxyy/BxD1Rewb4KzaiFmtUXerFLwElL55T1YgaNDmZohPAw+R60tmA==",
+ "dependencies": {
+ "@mondaydotcomorg/ignite-client-sdk": "^1.1.4",
+ "@mondaydotcomorg/vulcan-client": "^1.1.1016",
+ "@mondaydotcomorg/vulcan-core": "^0.0.102",
+ "@mondaydotcomorg/vulcan-services": "^0.1.3",
+ "@mondaydotcomorg/vulcan-store-setup": "^0.0.62",
+ "reselect": "^5.1.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/ai-agents-store-vulcan-client/node_modules/@mondaydotcomorg/vulcan-core": {
+ "version": "0.0.102",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/vulcan-core/-/vulcan-core-0.0.102.tgz",
+ "integrity": "sha512-TvLEdvfbmjNEa4icf6P0WL+Wq0X0WuxM3d/83KQ4D2fMi4oXjsZWzHOeDs/dvvUuBSm5UJawR4xQe7pZIW9uiA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@mondaydotcomorg/ignite-client-sdk": "^1.1.4",
+ "reselect": "^5.1.1",
+ "uuid": "^10.0.0",
+ "zustand": "4.5.2"
+ }
+ },
+ "node_modules/@mondaydotcomorg/ai-agents-store-vulcan-client/node_modules/use-sync-external-store": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
+ "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/ai-agents-store-vulcan-client/node_modules/uuid": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
+ "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/@mondaydotcomorg/ai-agents-store-vulcan-client/node_modules/zustand": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.2.tgz",
+ "integrity": "sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==",
+ "license": "MIT",
+ "dependencies": {
+ "use-sync-external-store": "1.2.0"
+ },
+ "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/@mondaydotcomorg/announcements-helpers": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/announcements-helpers/-/announcements-helpers-0.9.1.tgz",
+ "integrity": "sha512-HBsyZHKb9PIULSyR3slhMx/qKc+yqofQ5R5G78MVLNis6v/E1FAlUAO9yBOCxxE4mRXY6L6dmw6Lka5iIREfEA==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@mondaydotcomorg/api-client": {
+ "version": "1.0.21",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/api-client/-/api-client-1.0.21.tgz",
+ "integrity": "sha512-2uPcFTdd9MgCDscx4mM6We9l6rqIFx7gnUqO+F4r6oDB6Vy1KvoiAujJYdCxrrvg1YxFV779qEXrvmLM4n6xBQ==",
+ "license": "MIT",
+ "dependencies": {
+ "extract-files": "9.0.0",
+ "normalizr": "3.3.0"
+ },
+ "peerDependencies": {
+ "@mondaydotcomorg/vulcan-client": "^1.1.1000"
+ }
+ },
+ "node_modules/@mondaydotcomorg/api-client/node_modules/normalizr": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/normalizr/-/normalizr-3.3.0.tgz",
+ "integrity": "sha512-u8Us8Ms5KpY0mmNwML4OBxNKvlmSKeXfPBIXU9XmcejrZUjhIvUOd8RYBq62UL4JHxrcO4wqo2sL4s8B74Hadw==",
+ "license": "MIT"
+ },
+ "node_modules/@mondaydotcomorg/bigbrain": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/bigbrain/-/bigbrain-3.0.5.tgz",
+ "integrity": "sha512-7lqOSM9IRKq5jWjabSQc7r6LHdqLsEbLsYbA4badhet81QF4m3tFJHOr5ZR5OiobIdy5enR4w+HI5GiEpPbCeA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@mondaydotcomorg/monday-logger": "4.0.8",
+ "@mondaydotcomorg/trident-backend-api": "^0.24.3",
+ "cross-fetch": "^3.0.6",
+ "uuid": "^8.3.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/bigbrain-tracker": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/bigbrain-tracker/-/bigbrain-tracker-1.4.0.tgz",
+ "integrity": "sha512-jVFIzRf1okFBSz46eVnxVvh9i7Op3IVtqBOJi3mplZL+3irr2DutzY/sN1CgqiYlubBN+3litJ3MZ57xxTfHBw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@mondaydotcomorg/client-events-frame-tracker": "0.0.8",
+ "@mondaydotcomorg/lite-client-configurations": "0.0.4",
+ "js-cookie": "^3.0.5"
+ }
+ },
+ "node_modules/@mondaydotcomorg/bigbrain-tracker-types": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/bigbrain-tracker-types/-/bigbrain-tracker-types-0.0.4.tgz",
+ "integrity": "sha512-77kcbLWAzGv7aQYXqvxaFH7znReMwRvpE5y1rkALow8V3b1ycTpiRVJ7dqgk/yNKpL9J57/oPXcKk3Ds4lUzSw==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@mondaydotcomorg/board-app-frontend-client": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/board-app-frontend-client/-/board-app-frontend-client-0.2.10.tgz",
+ "integrity": "sha512-c6nCX6h7PNqO62cl1XeLhhHOWNCBt0JynqYLaAqi8d56ORzhW/i9/nnhuUqeTnDtisJaxlwpLHlcfjn5MuBzmg==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@mondaydotcomorg/http-server-commons": "^0.1.0"
+ },
+ "peerDependencies": {
+ "@mondaydotcomorg/trident-runtime": "^1.20.0",
+ "axios": "^1.12.2"
+ },
+ "peerDependenciesMeta": {
+ "axios": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mondaydotcomorg/board-columns": {
+ "version": "4.27.9",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/board-columns/-/board-columns-4.27.9.tgz",
+ "integrity": "sha512-n04tAOAqd67psPdTIXjnVOQr0bIdwjlv7h5pW8ZniE7XMPWznGuzggiEYWXIP/5TAj9Bcxymfifd2BkDBiU8Vg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@mondaydotcomorg/contracts": "0.16.0",
+ "@mondaydotcomorg/date-utils": "3.0.0",
+ "@mondaydotcomorg/formula-parser": "2.1.7",
+ "@mondaydotcomorg/module-utils": "1.0.1",
+ "@mondaydotcomorg/query-builder": "1.3.26",
+ "@mondaydotcomorg/query-types": "0.2.54",
+ "date-fns": "^2.16.1",
+ "html-entities": "^2.4.0",
+ "lodash-es": "^4.17.21",
+ "moment": "^2.29.1",
+ "moment-timezone": "^0.5.32",
+ "object-hash": "^2.2.0",
+ "re-reselect": "4.0.0",
+ "reselect": "^4.1.5",
+ "sanitize-html": "^2.14.0",
+ "zod": "^3.24"
+ }
+ },
+ "node_modules/@mondaydotcomorg/board-columns/node_modules/reselect": {
+ "version": "4.1.8",
+ "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz",
+ "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==",
+ "license": "MIT"
+ },
+ "node_modules/@mondaydotcomorg/board-columns/node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/@mondaydotcomorg/chat-client": {
+ "version": "1.13.5",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/chat-client/-/chat-client-1.13.5.tgz",
+ "integrity": "sha512-qZ8PYtmYCYBd4Izf6XEIdJfUG9s//YttGZR6ry7GSjedzqM1gAZgvW01h4VpmWtQOcDUMK8b3xiHiwTxbuXMjg==",
+ "dependencies": {
+ "@mondaydotcomorg/support-chat-types": "0.18.0",
+ "zustand": "^4.5.0"
+ },
+ "peerDependencies": {
+ "@mondaydotcomorg/trident-runtime": ">=1.4.0",
+ "react": "^18.0.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/client-error-tracker": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-error-tracker/-/client-error-tracker-0.5.1.tgz",
+ "integrity": "sha512-Sn0IPoVz98Rnv2+yDrnolHit99iVR4DHLoB1LHvJmFG8DILgJs3Hs/OT5/CBI1KPUc+1wja9+57Q28r9gq5w5A==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@sentry/browser": "^10.58.0",
+ "@sentry/react": "^10.58.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/client-events-frame-tracker": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-events-frame-tracker/-/client-events-frame-tracker-0.0.8.tgz",
+ "integrity": "sha512-5BkapNN8/vcWf420L3FUIbK1LXFIRGagojGmEimRB25X2jJHaV0l78WPqPbLC7eKepsUXQBgSONtjUhA40Rnpw==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@mondaydotcomorg/client-http-request": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-http-request/-/client-http-request-2.2.0.tgz",
+ "integrity": "sha512-AnugcikZ40P5D6wDSJkSqnDIOhoAioNWXwtB8HH38rd7pBs5x5Sbqgnzcts4gjUXyJa/44LDeFR5o1E1tNghcw==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@mondaydotcomorg/client-local-data-management": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-local-data-management/-/client-local-data-management-1.16.0.tgz",
+ "integrity": "sha512-7cIw7UMgT6KH42YHDRj17Ywnp7KPtBJpiUrarAXstKfw7KUC2L/45TzULAXkHDz6lr/sEcf82ga5pp4aFLe6ow==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/monolith-window": "1.21.0"
+ },
+ "peerDependencies": {
+ "lodash-es": "^4.17.21"
+ }
+ },
+ "node_modules/@mondaydotcomorg/client-local-data-management/node_modules/@mondaydotcomorg/monolith-window": {
+ "version": "1.21.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/monolith-window/-/monolith-window-1.21.0.tgz",
+ "integrity": "sha512-6ASfupaHw8Z3ddKZWG8WwO+jvLLPU2fqkj/1V9FFXuniCKxroKxZn0gomfwaYmnr1HdwHPpIURCtl9IjFp4ovA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/client-local-data-management/node_modules/react": {
+ "version": "16.14.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz",
+ "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/client-local-data-management/node_modules/react-dom": {
+ "version": "16.14.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz",
+ "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2",
+ "scheduler": "^0.19.1"
+ },
+ "peerDependencies": {
+ "react": "^16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/client-local-data-management/node_modules/scheduler": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz",
+ "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/contracts": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/contracts/-/contracts-0.16.0.tgz",
+ "integrity": "sha512-NQP9Ufxcfpwau6PshlG6JPQ1ZT2vTf/TBzjR1298mI+trwQlH6ZYQ8YChbL6Dspc7IDfUWEt2igTLRBYqda93A=="
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-types": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/customer-journey-types/-/customer-journey-types-0.3.0.tgz",
+ "integrity": "sha512-wEXdmihFRgDufW+OwRxiGFSTnwRskCfu9gGdA/qicQeZ2gRc/6H8BZAWAACUz5EPKdxBZmFF3udHWXcHpVTwnw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "zod": "^3.25.30"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-types/node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client": {
+ "version": "1.2.4760",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/customer-journey-vulcan-client/-/customer-journey-vulcan-client-1.2.4760.tgz",
+ "integrity": "sha512-2+iBhi4sHjxxxjoq5RgsCXA2bDp7S6v2yktT9WC4lkStXNJFls/FbJXe/xm+AXYMjs2q44qiR5nd0Am5hmvHnw==",
+ "dependencies": {
+ "@mondaydotcomorg/announcements-helpers": "^0.9.0",
+ "@mondaydotcomorg/chat-client": "1.2.2",
+ "@mondaydotcomorg/customer-journey-types": "0.3.0",
+ "@mondaydotcomorg/react-hooks": "^1.0.1",
+ "@mondaydotcomorg/vulcan-client": "^1.1.959",
+ "@mondaydotcomorg/vulcan-core": "^0.0.102",
+ "@mondaydotcomorg/vulcan-store-setup": "^0.0.64",
+ "@vibe/core": "^3.25.0",
+ "reselect": "^5.1.1",
+ "zod": "^4.1.13"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@mondaydotcomorg/chat-client": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/chat-client/-/chat-client-1.2.2.tgz",
+ "integrity": "sha512-AjG9XOZiUuuC0NhWSiTzcuKi7VZV5b0GlPjwGUQwY3NFZpddlkQF+lWKFjtiIhLvt+NAL7NdwCErvqRQqztAcQ==",
+ "peerDependencies": {
+ "react": ">=16.7.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@mondaydotcomorg/vulcan-core": {
+ "version": "0.0.102",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/vulcan-core/-/vulcan-core-0.0.102.tgz",
+ "integrity": "sha512-TvLEdvfbmjNEa4icf6P0WL+Wq0X0WuxM3d/83KQ4D2fMi4oXjsZWzHOeDs/dvvUuBSm5UJawR4xQe7pZIW9uiA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@mondaydotcomorg/ignite-client-sdk": "^1.1.4",
+ "reselect": "^5.1.1",
+ "uuid": "^10.0.0",
+ "zustand": "4.5.2"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@mondaydotcomorg/vulcan-store-setup": {
+ "version": "0.0.64",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/vulcan-store-setup/-/vulcan-store-setup-0.0.64.tgz",
+ "integrity": "sha512-ik1T9iobRT/Bh/OErgXz5BEC9LT8EN7DIgfajgFRldNgsDXqbzWBO7pMgeiX7U0nHAeOQqkY0kyOXItNhNMc2g==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@rollup/plugin-commonjs": "^28.0.3",
+ "@rollup/plugin-json": "^6.1.0",
+ "@rollup/plugin-node-resolve": "^16.0.1",
+ "@rollup/plugin-replace": "^6.0.2",
+ "@rollup/plugin-typescript": "^12.1.2",
+ "@types/semver": "^7.5.8",
+ "concurrently": "^9.1.2",
+ "dts-bundle-generator": "^9.5.1",
+ "ejs": "^3.1.10",
+ "fs-extra": "^11.3.0",
+ "rollup": "4.44.2",
+ "rollup-plugin-preserve-shebangs": "^0.2.0",
+ "semver": "^7.6.0",
+ "tsc-alias": "1.8.15"
+ },
+ "bin": {
+ "vulcan-client-release": "dist/plugin/release-client.js"
+ },
+ "peerDependencies": {
+ "@mondaydotcomorg/vulcan-core": "^0.0.49"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.2.tgz",
+ "integrity": "sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.2.tgz",
+ "integrity": "sha512-Yt5MKrOosSbSaAK5Y4J+vSiID57sOvpBNBR6K7xAaQvk3MkcNVV0f9fE20T+41WYN8hDn6SGFlFrKudtx4EoxA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.2.tgz",
+ "integrity": "sha512-EsnFot9ZieM35YNA26nhbLTJBHD0jTwWpPwmRVDzjylQT6gkar+zenfb8mHxWpRrbn+WytRRjE0WKsfaxBkVUA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.2.tgz",
+ "integrity": "sha512-dv/t1t1RkCvJdWWxQ2lWOO+b7cMsVw5YFaS04oHpZRWehI1h0fV1gF4wgGCTyQHHjJDfbNpwOi6PXEafRBBezw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.2.tgz",
+ "integrity": "sha512-W4tt4BLorKND4qeHElxDoim0+BsprFTwb+vriVQnFFtT/P6v/xO5I99xvYnVzKWrK6j7Hb0yp3x7V5LUbaeOMg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.2.tgz",
+ "integrity": "sha512-tdT1PHopokkuBVyHjvYehnIe20fxibxFCEhQP/96MDSOcyjM/shlTkZZLOufV3qO6/FQOSiJTBebhVc12JyPTA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.2.tgz",
+ "integrity": "sha512-+xmiDGGaSfIIOXMzkhJ++Oa0Gwvl9oXUeIiwarsdRXSe27HUIvjbSIpPxvnNsRebsNdUo7uAiQVgBD1hVriwSQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.2.tgz",
+ "integrity": "sha512-bDHvhzOfORk3wt8yxIra8N4k/N0MnKInCW5OGZaeDYa/hMrdPaJzo7CSkjKZqX4JFUWjUGm88lI6QJLCM7lDrA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.2.tgz",
+ "integrity": "sha512-NMsDEsDiYghTbeZWEGnNi4F0hSbGnsuOG+VnNvxkKg0IGDvFh7UVpM/14mnMwxRxUf9AdAVJgHPvKXf6FpMB7A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.2.tgz",
+ "integrity": "sha512-lb5bxXnxXglVq+7imxykIp5xMq+idehfl+wOgiiix0191av84OqbjUED+PRC5OA8eFJYj5xAGcpAZ0pF2MnW+A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.2.tgz",
+ "integrity": "sha512-iYtAqBg5eEMG4dEfVlkqo05xMOk6y/JXIToRca2bAWuqjrJYJlx/I7+Z+4hSrsWU8GdJDFPL4ktV3dy4yBSrzg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.2.tgz",
+ "integrity": "sha512-e6vEbgaaqz2yEHqtkPXa28fFuBGmUJ0N2dOJK8YUfijejInt9gfCSA7YDdJ4nYlv67JfP3+PSWFX4IVw/xRIPg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.2.tgz",
+ "integrity": "sha512-evFOtkmVdY3udE+0QKrV5wBx7bKI0iHz5yEVx5WqDJkxp9YQefy4Mpx3RajIVcM6o7jxTvVd/qpC1IXUhGc1Mw==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.2.tgz",
+ "integrity": "sha512-/bXb0bEsWMyEkIsUL2Yt5nFB5naLAwyOWMEviQfQY1x3l5WsLKgvZf66TM7UTfED6erckUVUJQ/jJ1FSpm3pRQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.2.tgz",
+ "integrity": "sha512-3D3OB1vSSBXmkGEZR27uiMRNiwN08/RVAcBKwhUYPaiZ8bcvdeEwWPvbnXvvXHY+A/7xluzcN+kaiOFNiOZwWg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.2.tgz",
+ "integrity": "sha512-VfU0fsMK+rwdK8mwODqYeM2hDrF2WiHaSmCBrS7gColkQft95/8tphyzv2EupVxn3iE0FI78wzffoULH1G+dkw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.2.tgz",
+ "integrity": "sha512-+qMUrkbUurpE6DVRjiJCNGZBGo9xM4Y0FXU5cjgudWqIBWbcLkjE3XprJUsOFgC6xjBClwVa9k6O3A7K3vxb5Q==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.2.tgz",
+ "integrity": "sha512-3+QZROYfJ25PDcxFF66UEk8jGWigHJeecZILvkPkyQN7oc5BvFo4YEXFkOs154j3FTMp9mn9Ky8RCOwastduEA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "license": "MIT"
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@vibe/base": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@vibe/base/-/base-3.0.5.tgz",
+ "integrity": "sha512-e0JQWygbbRj6q85XlovXAOgkxZtoTR7I9K+OMoMvFc09xnQ1evZr8G2HF6Il8ENT/23s5O8hLJ1Ef/OzdBbp2w==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/shared": "3.0.8",
+ "classnames": "^2.5.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@vibe/button": {
+ "version": "3.0.16",
+ "resolved": "https://registry.npmjs.org/@vibe/button/-/button-3.0.16.tgz",
+ "integrity": "sha512-fjFb7Khv86P/tk6rO8Mdg2+fwBLen98i+E6YXC2gkWcFJAvNfjkH8kZN4m0HhmaQDBQb+ESmXZdq9vZIllS3Dw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/icon": "3.0.11",
+ "@vibe/loader": "3.0.11",
+ "@vibe/shared": "3.0.8",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@vibe/clickable": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@vibe/clickable/-/clickable-3.0.3.tgz",
+ "integrity": "sha512-xsMt0TpUj8Wdv62kADvq//BhXlU3YVBix4WJdcyRPBp5NRPMksIbbOiMc35WIZznO/lA9IwoE1ktFOjwx28hfw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/shared": "3.0.8",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@vibe/core": {
+ "version": "3.88.6",
+ "resolved": "https://registry.npmjs.org/@vibe/core/-/core-3.88.6.tgz",
+ "integrity": "sha512-dLF2J0vftejo0z2HCmyGiorQtO52qU/XZczNbwZR96y18fiANdhb5pXWMHqA9NPaSzLVOLmUKxJ4ksfvceJmHg==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/react-dom": "^2.1.2",
+ "@popperjs/core": "2.11.6",
+ "@vibe/base": "3.0.5",
+ "@vibe/button": "3.0.16",
+ "@vibe/clickable": "3.0.3",
+ "@vibe/dialog": "3.0.13",
+ "@vibe/hooks": "3.0.3",
+ "@vibe/icon": "3.0.11",
+ "@vibe/icon-button": "3.0.7",
+ "@vibe/icons": "1.16.0",
+ "@vibe/layer": "3.0.10",
+ "@vibe/layout": "3.0.3",
+ "@vibe/loader": "3.0.11",
+ "@vibe/shared": "3.0.8",
+ "@vibe/tooltip": "3.0.7",
+ "@vibe/typography": "3.0.7",
+ "a11y-dialog": "^7.5.2",
+ "body-scroll-lock": "^4.0.0-beta.0",
+ "browserslist-config-monday": "1.0.6",
+ "classnames": "^2.3.2",
+ "date-fns": "^2.30.0",
+ "downshift": "^9.0.8",
+ "es-toolkit": "^1.39.10",
+ "framer-motion": "^6.5.1",
+ "monday-ui-style": "0.26.2",
+ "react-dates": "21.8.0",
+ "react-day-picker": "^8.8.0",
+ "react-focus-lock": "^2.13.2",
+ "react-inlinesvg": "^4.1.3",
+ "react-is": "^16.9.0",
+ "react-popper": "^2.3.0",
+ "react-remove-scroll": "^2.6.0",
+ "react-select": "npm:react-select-module@3.4.0",
+ "react-transition-group": "^4.4.5",
+ "react-virtualized-auto-sizer": "^1.0.7",
+ "react-window": "^1.8.7",
+ "react-windowed-select": "^2.0.4",
+ "style-inject": "^0.3.0"
+ },
+ "peerDependencies": {
+ "moment": "^2.29.1",
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@vibe/dialog": {
+ "version": "3.0.13",
+ "resolved": "https://registry.npmjs.org/@vibe/dialog/-/dialog-3.0.13.tgz",
+ "integrity": "sha512-orI9IumQZcAWMu7uqZ2QcXsTFs5WlaaSkbhPk98+VC7DNbUP5QJyLIaX+Jf+aInCqmpN6r1IIZdDNH85Im5tlg==",
+ "license": "MIT",
+ "dependencies": {
+ "@popperjs/core": "2.11.6",
+ "@vibe/hooks": "3.0.3",
+ "@vibe/layer": "3.0.10",
+ "@vibe/shared": "3.0.8",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10",
+ "react-popper": "^2.3.0",
+ "react-transition-group": "^4.4.5"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@vibe/hooks": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@vibe/hooks/-/hooks-3.0.3.tgz",
+ "integrity": "sha512-74iEe2qLdjm3enpstGtewFkrKxNACvPMtIAxgUiBZ9T28cYu5mjbtH+Lp2Gv/kNMMv3x/V3RWcn7uqjLjyKBbQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/shared": "3.0.8",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@vibe/icon": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/@vibe/icon/-/icon-3.0.11.tgz",
+ "integrity": "sha512-4xdj++K+2e7Wy7mSeTS6aLK0rjZpwIuZZoFv6X/lE5PxR7JkA1IRiaHUyCSE9CS9W0TDGEAzN923YuFjU0ghsA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/shared": "3.0.8",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10",
+ "react-inlinesvg": "^4.1.3"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@vibe/icon-button": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@vibe/icon-button/-/icon-button-3.0.7.tgz",
+ "integrity": "sha512-oy29sjexjaxF8f7ZzDhFbQFhyF0pkXx/KvuLooyNtgokQ27A99uGxjnHBivv6m9lXRNCKvtt6PrTL8UXUYBRJw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/button": "3.0.16",
+ "@vibe/icon": "3.0.11",
+ "@vibe/icons": "1.16.0",
+ "@vibe/shared": "3.0.8",
+ "@vibe/tooltip": "3.0.7",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@vibe/icons": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/@vibe/icons/-/icons-1.16.0.tgz",
+ "integrity": "sha512-/ljaos2zNr4NfZKLoAjOfEilWUlmvBwqh9fFN+Z1BdYW84oGZQGRdj4TJW5jyirZyJ/H6jTcutKUbJaD3Om7+w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@vibe/layer": {
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/@vibe/layer/-/layer-3.0.10.tgz",
+ "integrity": "sha512-UChefl8dxp4SLadYcItRMc49AS8PEakDv05KBNxzej2vybignt0sqI98+CurC6lr+0dNRlf8x58+Gae9wy5ybQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/icon": "3.0.11",
+ "@vibe/loader": "3.0.11",
+ "@vibe/shared": "3.0.8",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@vibe/layout": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@vibe/layout/-/layout-3.0.3.tgz",
+ "integrity": "sha512-9SGVKKl4IJqsqg7Yuy9aQHtqGG/wPs/7ZCK2g3Fp8ot0/yc3EjWgBQh0uP+wOVHyRaRUPfI4CdkCsVmdGJ4YFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/clickable": "3.0.3",
+ "@vibe/shared": "3.0.8",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@vibe/loader": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/@vibe/loader/-/loader-3.0.11.tgz",
+ "integrity": "sha512-F1Yn9ti0yaD08VYt0pfubfyE1yRsG8GZA41TR+0erVr/XnVlf6NA8+07pU85N06rQnp89slxlMy8Yf4AevkWDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/shared": "3.0.8",
+ "classnames": "^2.5.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@vibe/shared": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/@vibe/shared/-/shared-3.0.8.tgz",
+ "integrity": "sha512-qjWaNylbVKbdaDi75jFpp+LmF3y74JYdaLNWf6noiMkhq0fhcPTietVrHBxYO2b0cBvm1sQbrytX5YiBk3ii2w==",
+ "license": "MIT",
+ "dependencies": {
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "vitest": ">=1.6.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@vibe/tooltip": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@vibe/tooltip/-/tooltip-3.0.7.tgz",
+ "integrity": "sha512-4VYMSFerqZ+4Q1Sta86cN09vNUHhUcO2FBk1U94LaFctKWMc16iLv6XJwWHjQHp8zZMGkHi43/NwD2jYNiub8g==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/dialog": "3.0.13",
+ "@vibe/icon": "3.0.11",
+ "@vibe/layout": "3.0.3",
+ "@vibe/shared": "3.0.8",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/@vibe/typography": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@vibe/typography/-/typography-3.0.7.tgz",
+ "integrity": "sha512-ezzzs9/CKM2/gadwBc33O7A8Ru9FMOjP6kpNT6QrpNebCBSKM1uBqECJ20I5/jmCDSPyvnRAjFFvItOHdFLnCw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/hooks": "3.0.3",
+ "@vibe/shared": "3.0.8",
+ "@vibe/tooltip": "3.0.7",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10",
+ "monday-ui-style": "0.26.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/airbnb-prop-types": {
+ "version": "2.16.0",
+ "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz",
+ "integrity": "sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==",
+ "deprecated": "This package has been renamed to 'prop-types-tools'",
+ "license": "MIT",
+ "dependencies": {
+ "array.prototype.find": "^2.1.1",
+ "function.prototype.name": "^1.1.2",
+ "is-regex": "^1.1.0",
+ "object-is": "^1.1.2",
+ "object.assign": "^4.1.0",
+ "object.entries": "^1.1.2",
+ "prop-types": "^15.7.2",
+ "prop-types-exact": "^1.2.0",
+ "react-is": "^16.13.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ },
+ "peerDependencies": {
+ "react": "^0.14 || ^15.0.0 || ^16.0.0-alpha"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/deepmerge": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz",
+ "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/monday-ui-style": {
+ "version": "0.26.2",
+ "resolved": "https://registry.npmjs.org/monday-ui-style/-/monday-ui-style-0.26.2.tgz",
+ "integrity": "sha512-LZxjT+eqppL/m/hvxPfGdiFZ5xbv31rFkwItfuVHup8Xw3axTNgsvewDJg/Ahs0G7qcO9T7ucMIk7B440HtUJg==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss": "8.4.31",
+ "postcss-scss": "^4.0.9",
+ "postcss-value-parser": "4.2.0",
+ "stylelint": "^14.16.1"
+ },
+ "peerDependencies": {
+ "stylelint": "^14.1.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/react": {
+ "version": "16.14.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz",
+ "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/react-dates": {
+ "version": "21.8.0",
+ "resolved": "https://registry.npmjs.org/react-dates/-/react-dates-21.8.0.tgz",
+ "integrity": "sha512-PPriGqi30CtzZmoHiGdhlA++YPYPYGCZrhydYmXXQ6RAvAsaONcPtYgXRTLozIOrsQ5mSo40+DiA5eOFHnZ6xw==",
+ "license": "MIT",
+ "dependencies": {
+ "airbnb-prop-types": "^2.15.0",
+ "consolidated-events": "^1.1.1 || ^2.0.0",
+ "enzyme-shallow-equal": "^1.0.0",
+ "is-touch-device": "^1.0.1",
+ "lodash": "^4.1.1",
+ "object.assign": "^4.1.0",
+ "object.values": "^1.1.0",
+ "prop-types": "^15.7.2",
+ "raf": "^3.4.1",
+ "react-moment-proptypes": "^1.6.0",
+ "react-outside-click-handler": "^1.2.4",
+ "react-portal": "^4.2.0",
+ "react-with-direction": "^1.3.1",
+ "react-with-styles": "^4.1.0",
+ "react-with-styles-interface-css": "^6.0.0"
+ },
+ "peerDependencies": {
+ "@babel/runtime": "^7.0.0",
+ "moment": "^2.18.1",
+ "react": "^0.14 || ^15.5.4 || ^16.1.1",
+ "react-dom": "^0.14 || ^15.5.4 || ^16.1.1",
+ "react-with-direction": "^1.3.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/react-dom": {
+ "version": "16.14.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz",
+ "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2",
+ "scheduler": "^0.19.1"
+ },
+ "peerDependencies": {
+ "react": "^16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/react-input-autosize": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-3.0.0.tgz",
+ "integrity": "sha512-nL9uS7jEs/zu8sqwFE5MAPx6pPkNAriACQ2rGLlqmKr2sPGtN7TXTyDdQt4lbNXVx7Uzadb40x8qotIuru6Rhg==",
+ "license": "MIT",
+ "dependencies": {
+ "prop-types": "^15.5.8"
+ },
+ "peerDependencies": {
+ "react": "^16.3.0 || ^17.0.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/react-select": {
+ "name": "react-select-module",
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/react-select-module/-/react-select-module-3.4.0.tgz",
+ "integrity": "sha512-d9swlWWqqQyrZPfako6aKFK/kdLY9m4TQMIdhuD387VVAqB3+0zEKGb0ANQWsNNobo5ga46SltQzXuklxUvteA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.4.4",
+ "@emotion/cache": "^10.0.9",
+ "@emotion/core": "^10.0.9",
+ "@emotion/css": "^10.0.9",
+ "memoize-one": "^5.0.0",
+ "prop-types": "^15.6.0",
+ "react-input-autosize": "^3.0.0",
+ "react-transition-group": "^4.3.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/react-windowed-select": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/react-windowed-select/-/react-windowed-select-2.0.5.tgz",
+ "integrity": "sha512-HIpl3jl7fjxAFAn9RgY7JMw240Gj1Spookx656zyG7cYucYtCK4RLqv1celqdGHcXTCy5R3IFVoDcVasF2YNDg==",
+ "license": "MIT",
+ "dependencies": {
+ "react-select": "3.1.0",
+ "react-window": "1.8.5"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0",
+ "react-dom": "^16.8.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/react-windowed-select/node_modules/react-input-autosize": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.2.2.tgz",
+ "integrity": "sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw==",
+ "license": "MIT",
+ "dependencies": {
+ "prop-types": "^15.5.8"
+ },
+ "peerDependencies": {
+ "react": "^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/react-windowed-select/node_modules/react-select": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/react-select/-/react-select-3.1.0.tgz",
+ "integrity": "sha512-wBFVblBH1iuCBprtpyGtd1dGMadsG36W5/t2Aj8OE6WbByDg5jIFyT7X5gT+l0qmT5TqWhxX+VsKJvCEl2uL9g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.4.4",
+ "@emotion/cache": "^10.0.9",
+ "@emotion/core": "^10.0.9",
+ "@emotion/css": "^10.0.9",
+ "memoize-one": "^5.0.0",
+ "prop-types": "^15.6.0",
+ "react-input-autosize": "^2.2.2",
+ "react-transition-group": "^4.3.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0",
+ "react-dom": "^16.8.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/react-windowed-select/node_modules/react-window": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.5.tgz",
+ "integrity": "sha512-HeTwlNa37AFa8MDZFZOKcNEkuF2YflA0hpGPiTT9vR7OawEt+GZbfM6wqkBahD3D3pUjIabQYzsnY/BSJbgq6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.0.0",
+ "memoize-one": ">=3.1.1 <6"
+ },
+ "engines": {
+ "node": ">8.0.0"
+ },
+ "peerDependencies": {
+ "react": "^15.0.0 || ^16.0.0",
+ "react-dom": "^15.0.0 || ^16.0.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/react-with-direction": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/react-with-direction/-/react-with-direction-1.4.0.tgz",
+ "integrity": "sha512-ybHNPiAmaJpoWwugwqry9Hd1Irl2hnNXlo/2SXQBwbLn/jGMauMS2y9jw+ydyX5V9ICryCqObNSthNt5R94xpg==",
+ "license": "MIT",
+ "dependencies": {
+ "airbnb-prop-types": "^2.16.0",
+ "brcast": "^2.0.2",
+ "deepmerge": "^1.5.2",
+ "direction": "^1.0.4",
+ "hoist-non-react-statics": "^3.3.2",
+ "object.assign": "^4.1.2",
+ "object.values": "^1.1.5",
+ "prop-types": "^15.7.2"
+ },
+ "peerDependencies": {
+ "react": "^0.14 || ^15 || ^16",
+ "react-dom": "^0.14 || ^15 || ^16"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/rollup": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.2.tgz",
+ "integrity": "sha512-PVoapzTwSEcelaWGth3uR66u7ZRo6qhPHc0f2uRO9fX6XDVNrIiGYS0Pj9+R8yIIYSD/mCx2b16Ws9itljKSPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.8"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.44.2",
+ "@rollup/rollup-android-arm64": "4.44.2",
+ "@rollup/rollup-darwin-arm64": "4.44.2",
+ "@rollup/rollup-darwin-x64": "4.44.2",
+ "@rollup/rollup-freebsd-arm64": "4.44.2",
+ "@rollup/rollup-freebsd-x64": "4.44.2",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.44.2",
+ "@rollup/rollup-linux-arm-musleabihf": "4.44.2",
+ "@rollup/rollup-linux-arm64-gnu": "4.44.2",
+ "@rollup/rollup-linux-arm64-musl": "4.44.2",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.44.2",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.44.2",
+ "@rollup/rollup-linux-riscv64-gnu": "4.44.2",
+ "@rollup/rollup-linux-riscv64-musl": "4.44.2",
+ "@rollup/rollup-linux-s390x-gnu": "4.44.2",
+ "@rollup/rollup-linux-x64-gnu": "4.44.2",
+ "@rollup/rollup-linux-x64-musl": "4.44.2",
+ "@rollup/rollup-win32-arm64-msvc": "4.44.2",
+ "@rollup/rollup-win32-ia32-msvc": "4.44.2",
+ "@rollup/rollup-win32-x64-msvc": "4.44.2",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/scheduler": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz",
+ "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/use-sync-external-store": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
+ "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/uuid": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
+ "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/@mondaydotcomorg/customer-journey-vulcan-client/node_modules/zustand": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.2.tgz",
+ "integrity": "sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==",
+ "license": "MIT",
+ "dependencies": {
+ "use-sync-external-store": "1.2.0"
+ },
+ "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/@mondaydotcomorg/darobot-utils": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/darobot-utils/-/darobot-utils-0.0.4.tgz",
+ "integrity": "sha512-uWSelGCilLP853ngw/Ub6u7EkweJ/51lHQS1XMJbCzRsfrsoUlIud6hmkXvTzQDv3SkmJ7LJQ205f+5hDEF8ww=="
+ },
+ "node_modules/@mondaydotcomorg/date-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/date-utils/-/date-utils-3.0.0.tgz",
+ "integrity": "sha512-wUc4BHkohqA6z72FtR5a92zOIfoZ6q+v3bwvjycgjpCbQedZ80R2/sebpNrk6fMmx/5/3fwIYErNUmTAZxTFGg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/runtime-corejs2": "^7.10.0"
+ },
+ "peerDependencies": {
+ "moment": "^2.29.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/departments-frontend-client": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/departments-frontend-client/-/departments-frontend-client-0.0.2.tgz",
+ "integrity": "sha512-8rN8mbE87Jhmh5hmr3vx43RoPI7uwnWfLx1mBERHoaOkwDvL8YIF0QRn/ohjfZvq++A0YDt9Hi2k89ROosimcA==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@mondaydotcomorg/http-server-commons": "^0.1.0"
+ },
+ "peerDependencies": {
+ "@mondaydotcomorg/trident-runtime": "^1.16.8",
+ "axios": "^1.9.0"
+ },
+ "peerDependenciesMeta": {
+ "axios": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mondaydotcomorg/files-service": {
+ "version": "0.1.40",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/files-service/-/files-service-0.1.40.tgz",
+ "integrity": "sha512-tME7Fzc3maZ64YLHkUCvqxnviidQUEkMLe9vEU7O6lWOkeK2CqFNIW8UYKI3FzdYkBGwAB37/Ql4xP0tgb6RhA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@mondaydotcomorg/client-configurations": "1.1.20",
+ "@mondaydotcomorg/monolith-window": "1.4.3",
+ "@mondaydotcomorg/shared-constants": "1.5.5"
+ }
+ },
+ "node_modules/@mondaydotcomorg/files-service/node_modules/@mondaydotcomorg/client-configurations": {
+ "version": "1.1.20",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-configurations/-/client-configurations-1.1.20.tgz",
+ "integrity": "sha512-IlLemeosGJgyJK6ZXCKticvIt+oMB59J1MSzsupbMEpvTFE/bydoMP5JOHODQL41wFX/vDD6xneJjK7pCvLZBQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/client-local-data-management": "1.1.10",
+ "@mondaydotcomorg/ignite-client-sdk": "^1.1.4",
+ "@mondaydotcomorg/monolith-window": "1.4.3"
+ },
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "moment": "^2.29.4",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/files-service/node_modules/@mondaydotcomorg/client-local-data-management": {
+ "version": "1.1.10",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-local-data-management/-/client-local-data-management-1.1.10.tgz",
+ "integrity": "sha512-m25X24WbaxE39UDNiZQBzS+QCrj6Lr0N8QmCQaRu2vAHtKslpSTwW8fdiFKQn5AfYCnfOT5uC6qPmwKB1DXBIg==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/monolith-window": "1.4.3"
+ },
+ "peerDependencies": {
+ "lodash-es": "^4.17.21"
+ }
+ },
+ "node_modules/@mondaydotcomorg/files-service/node_modules/@mondaydotcomorg/monolith-window": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/monolith-window/-/monolith-window-1.4.3.tgz",
+ "integrity": "sha512-pK2asndVLETfU5NBAw5WGTwa1B2xBJw9VzYS3Ll6ySMP5aO1OWh06QVeymAALk0XaEQ0Kj1XODmnudt6l3FnMA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/files-service/node_modules/@mondaydotcomorg/shared-constants": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/shared-constants/-/shared-constants-1.5.5.tgz",
+ "integrity": "sha512-8IE8XLxBKa+zP8jzv7XmXNeNe3DjlIf4ARzDns0bfaY1ywB2CE4wJGsiQozX8SToENfZo9Yijab5QTN8pKT/yA==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/icons": "^1.20.0",
+ "@mondaydotcomorg/monolith-window": "1.4.3",
+ "@mondaydotcomorg/shared-constants": "1.5.5",
+ "@mondaydotcomorg/shared-jsons": "1.1.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/files-service/node_modules/@mondaydotcomorg/shared-jsons": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/shared-jsons/-/shared-jsons-1.1.1.tgz",
+ "integrity": "sha512-MX4IxCgbkm+8+WG+Ws5xHk4M8HrnMlzPkswYo6ZZtowGIzTgL+K4euBwev8L1yzoE6X6RoPWZSs03+HavOq5kw==",
+ "license": "MIT"
+ },
+ "node_modules/@mondaydotcomorg/files-service/node_modules/react": {
+ "version": "16.14.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz",
+ "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/files-service/node_modules/react-dom": {
+ "version": "16.14.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz",
+ "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2",
+ "scheduler": "^0.19.1"
+ },
+ "peerDependencies": {
+ "react": "^16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/files-service/node_modules/scheduler": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz",
+ "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/formula-parser": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/formula-parser/-/formula-parser-2.1.7.tgz",
+ "integrity": "sha512-aXA+yx2D/TxUMsoIa+uaqfg7OoeZjnMe00oSs9wHnpkI7Hyd3eOgSzRkzVcqOdpucEDMz25FE5Z/rLWizx205Q==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/runtime-corejs2": "^7.10.0",
+ "hot-formula-parser": "3.0.2",
+ "lodash.isempty": "^4.4.0",
+ "numbro": "1.11.1"
+ },
+ "peerDependencies": {
+ "moment": "^2.29.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/growth-entities-store-vulcan-client/-/growth-entities-store-vulcan-client-1.2.0.tgz",
+ "integrity": "sha512-ulmdWFWHAtG9uaxT+c9UZBPPaDgl8xtpatAWFtKyNmcUqamdaoDzqMMVChpt9ynN+00hkLrWn5mD+BvzoKLvUg==",
+ "dependencies": {
+ "@mondaydotcomorg/vulcan-client": "^1.1.959",
+ "@mondaydotcomorg/vulcan-core": "^0.0.102",
+ "@mondaydotcomorg/vulcan-services": "^0.0.11",
+ "@mondaydotcomorg/vulcan-store-setup": "^0.0.65",
+ "moment-timezone": "^0.6.0",
+ "reselect": "^5.1.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/@mondaydotcomorg/vulcan-core": {
+ "version": "0.0.102",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/vulcan-core/-/vulcan-core-0.0.102.tgz",
+ "integrity": "sha512-TvLEdvfbmjNEa4icf6P0WL+Wq0X0WuxM3d/83KQ4D2fMi4oXjsZWzHOeDs/dvvUuBSm5UJawR4xQe7pZIW9uiA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@mondaydotcomorg/ignite-client-sdk": "^1.1.4",
+ "reselect": "^5.1.1",
+ "uuid": "^10.0.0",
+ "zustand": "4.5.2"
+ }
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/@mondaydotcomorg/vulcan-services": {
+ "version": "0.0.11",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/vulcan-services/-/vulcan-services-0.0.11.tgz",
+ "integrity": "sha512-6anj4viplfepEYtg56shEU1K/3ZhHsoJ6edBU7n+aK+7e3lifIE6aQsUM+gfRVjjwmAx+CjAK8Zd79OhUJsjOA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@mondaydotcomorg/client-http-request": "^2.1.3"
+ }
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/@mondaydotcomorg/vulcan-store-setup": {
+ "version": "0.0.65",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/vulcan-store-setup/-/vulcan-store-setup-0.0.65.tgz",
+ "integrity": "sha512-VdGpz1Y1cy6GFIVccRU/0L38T3zdz+7+w8CApdx+ttXXTajJIVamxbalirWu8kHdKXJIfz4SnIbSXCoVZwGwJg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@rollup/plugin-commonjs": "^28.0.3",
+ "@rollup/plugin-json": "^6.1.0",
+ "@rollup/plugin-node-resolve": "^16.0.1",
+ "@rollup/plugin-replace": "^6.0.2",
+ "@rollup/plugin-typescript": "^12.1.2",
+ "@types/semver": "^7.5.8",
+ "concurrently": "^9.1.2",
+ "dts-bundle-generator": "^9.5.1",
+ "ejs": "^3.1.10",
+ "fs-extra": "^11.3.0",
+ "rollup": "4.44.2",
+ "rollup-plugin-preserve-shebangs": "^0.2.0",
+ "semver": "^7.6.0",
+ "tsc-alias": "1.8.15"
+ },
+ "bin": {
+ "vulcan-client-release": "dist/plugin/release-client.js"
+ },
+ "peerDependencies": {
+ "@mondaydotcomorg/vulcan-core": "^0.0.49"
+ }
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.2.tgz",
+ "integrity": "sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.2.tgz",
+ "integrity": "sha512-Yt5MKrOosSbSaAK5Y4J+vSiID57sOvpBNBR6K7xAaQvk3MkcNVV0f9fE20T+41WYN8hDn6SGFlFrKudtx4EoxA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.2.tgz",
+ "integrity": "sha512-EsnFot9ZieM35YNA26nhbLTJBHD0jTwWpPwmRVDzjylQT6gkar+zenfb8mHxWpRrbn+WytRRjE0WKsfaxBkVUA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.2.tgz",
+ "integrity": "sha512-dv/t1t1RkCvJdWWxQ2lWOO+b7cMsVw5YFaS04oHpZRWehI1h0fV1gF4wgGCTyQHHjJDfbNpwOi6PXEafRBBezw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.2.tgz",
+ "integrity": "sha512-W4tt4BLorKND4qeHElxDoim0+BsprFTwb+vriVQnFFtT/P6v/xO5I99xvYnVzKWrK6j7Hb0yp3x7V5LUbaeOMg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.2.tgz",
+ "integrity": "sha512-tdT1PHopokkuBVyHjvYehnIe20fxibxFCEhQP/96MDSOcyjM/shlTkZZLOufV3qO6/FQOSiJTBebhVc12JyPTA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.2.tgz",
+ "integrity": "sha512-+xmiDGGaSfIIOXMzkhJ++Oa0Gwvl9oXUeIiwarsdRXSe27HUIvjbSIpPxvnNsRebsNdUo7uAiQVgBD1hVriwSQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.2.tgz",
+ "integrity": "sha512-bDHvhzOfORk3wt8yxIra8N4k/N0MnKInCW5OGZaeDYa/hMrdPaJzo7CSkjKZqX4JFUWjUGm88lI6QJLCM7lDrA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.2.tgz",
+ "integrity": "sha512-NMsDEsDiYghTbeZWEGnNi4F0hSbGnsuOG+VnNvxkKg0IGDvFh7UVpM/14mnMwxRxUf9AdAVJgHPvKXf6FpMB7A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.2.tgz",
+ "integrity": "sha512-lb5bxXnxXglVq+7imxykIp5xMq+idehfl+wOgiiix0191av84OqbjUED+PRC5OA8eFJYj5xAGcpAZ0pF2MnW+A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.2.tgz",
+ "integrity": "sha512-iYtAqBg5eEMG4dEfVlkqo05xMOk6y/JXIToRca2bAWuqjrJYJlx/I7+Z+4hSrsWU8GdJDFPL4ktV3dy4yBSrzg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.2.tgz",
+ "integrity": "sha512-e6vEbgaaqz2yEHqtkPXa28fFuBGmUJ0N2dOJK8YUfijejInt9gfCSA7YDdJ4nYlv67JfP3+PSWFX4IVw/xRIPg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.2.tgz",
+ "integrity": "sha512-evFOtkmVdY3udE+0QKrV5wBx7bKI0iHz5yEVx5WqDJkxp9YQefy4Mpx3RajIVcM6o7jxTvVd/qpC1IXUhGc1Mw==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.2.tgz",
+ "integrity": "sha512-/bXb0bEsWMyEkIsUL2Yt5nFB5naLAwyOWMEviQfQY1x3l5WsLKgvZf66TM7UTfED6erckUVUJQ/jJ1FSpm3pRQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.2.tgz",
+ "integrity": "sha512-3D3OB1vSSBXmkGEZR27uiMRNiwN08/RVAcBKwhUYPaiZ8bcvdeEwWPvbnXvvXHY+A/7xluzcN+kaiOFNiOZwWg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.2.tgz",
+ "integrity": "sha512-VfU0fsMK+rwdK8mwODqYeM2hDrF2WiHaSmCBrS7gColkQft95/8tphyzv2EupVxn3iE0FI78wzffoULH1G+dkw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.2.tgz",
+ "integrity": "sha512-+qMUrkbUurpE6DVRjiJCNGZBGo9xM4Y0FXU5cjgudWqIBWbcLkjE3XprJUsOFgC6xjBClwVa9k6O3A7K3vxb5Q==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.2.tgz",
+ "integrity": "sha512-3+QZROYfJ25PDcxFF66UEk8jGWigHJeecZILvkPkyQN7oc5BvFo4YEXFkOs154j3FTMp9mn9Ky8RCOwastduEA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "license": "MIT"
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/moment-timezone": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.6.3.tgz",
+ "integrity": "sha512-pVEPA/HCFHHbwJ130ywnzYuZpkEGcP6Daa/OwNebpA18MybeFHmQilAGGovXgWijQ8vQtmud9jZrziUBgsykfg==",
+ "license": "MIT",
+ "dependencies": {
+ "moment": "^2.29.4"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/rollup": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.2.tgz",
+ "integrity": "sha512-PVoapzTwSEcelaWGth3uR66u7ZRo6qhPHc0f2uRO9fX6XDVNrIiGYS0Pj9+R8yIIYSD/mCx2b16Ws9itljKSPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.8"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.44.2",
+ "@rollup/rollup-android-arm64": "4.44.2",
+ "@rollup/rollup-darwin-arm64": "4.44.2",
+ "@rollup/rollup-darwin-x64": "4.44.2",
+ "@rollup/rollup-freebsd-arm64": "4.44.2",
+ "@rollup/rollup-freebsd-x64": "4.44.2",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.44.2",
+ "@rollup/rollup-linux-arm-musleabihf": "4.44.2",
+ "@rollup/rollup-linux-arm64-gnu": "4.44.2",
+ "@rollup/rollup-linux-arm64-musl": "4.44.2",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.44.2",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.44.2",
+ "@rollup/rollup-linux-riscv64-gnu": "4.44.2",
+ "@rollup/rollup-linux-riscv64-musl": "4.44.2",
+ "@rollup/rollup-linux-s390x-gnu": "4.44.2",
+ "@rollup/rollup-linux-x64-gnu": "4.44.2",
+ "@rollup/rollup-linux-x64-musl": "4.44.2",
+ "@rollup/rollup-win32-arm64-msvc": "4.44.2",
+ "@rollup/rollup-win32-ia32-msvc": "4.44.2",
+ "@rollup/rollup-win32-x64-msvc": "4.44.2",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/use-sync-external-store": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
+ "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/uuid": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
+ "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/@mondaydotcomorg/growth-entities-store-vulcan-client/node_modules/zustand": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.2.tgz",
+ "integrity": "sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==",
+ "license": "MIT",
+ "dependencies": {
+ "use-sync-external-store": "1.2.0"
+ },
+ "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/@mondaydotcomorg/http-server-commons": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/http-server-commons/-/http-server-commons-0.1.0.tgz",
+ "integrity": "sha512-gAPMakPSRh7Ipsxl5m4A2gy9Tjf3G3CGgBl6AplA/ubNP+iT4/51EdjSe05bkhmrK6wRsjrQYNWUqOxslj8Erg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@mondaydotcomorg/trident-backend-api": "^0.24.7"
+ }
+ },
+ "node_modules/@mondaydotcomorg/icons": {
+ "version": "1.60.1",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/icons/-/icons-1.60.1.tgz",
+ "integrity": "sha512-evsJZ73Hlu/aDfFnXlnLuRPB5YOpP5CUQGz6XpDrQca4CjrJ8qzHqVJW1zJL965Wlh9H5cFvnqWj7ic0zSMXEw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@vibe/icons": "^4.1.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/ignite-client-sdk": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/ignite-client-sdk/-/ignite-client-sdk-1.1.4.tgz",
+ "integrity": "sha512-4b+bSvyAyqLmgR48B274mfKwS5NJynaZueLlmb9GtHkJpwwHasmMhkF7qEJJzwTBEYglaQ3v5tQrojswjKXKiQ==",
+ "dependencies": {
+ "@mondaydotcomorg/client-http-request": "^2.1.6",
+ "@mondaydotcomorg/monolith-logger": "^2.0.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/ignite-client-sdk/node_modules/@mondaydotcomorg/client-configurations": {
+ "version": "1.24.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-configurations/-/client-configurations-1.24.0.tgz",
+ "integrity": "sha512-CTDdJAyX08PTTlYnX2hzLFiDraJo+nR1zYlbT4ObfL0Mr82Z7Jq4XF7lrilK76wlRr7H4F8h77022+3xkEId7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/client-local-data-management": "1.16.0",
+ "@mondaydotcomorg/ignite-client-sdk": "^1.1.4",
+ "@mondaydotcomorg/monolith-window": "1.21.0",
+ "@mondaydotcomorg/shared-constants": "1.47.0"
+ },
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "moment": "^2.29.4",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/ignite-client-sdk/node_modules/@mondaydotcomorg/dom-utils": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/dom-utils/-/dom-utils-1.19.0.tgz",
+ "integrity": "sha512-ejue6glVlDJIDpxhaaQLyaKwiFM3logwsRAQTUd4CHoz2iiXsvW4tfoMJP8P2pTAtlYV32rnOs6hXXmaYjM+Ng==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/monolith-window": "1.21.0",
+ "@mondaydotcomorg/shared-constants": "1.47.0"
+ },
+ "peerDependencies": {
+ "js-cookie": "^2.2.1",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/ignite-client-sdk/node_modules/@mondaydotcomorg/monolith-logger": {
+ "version": "2.24.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/monolith-logger/-/monolith-logger-2.24.0.tgz",
+ "integrity": "sha512-jjf1QMNP1hQ3KSVuR3OOFW+1aJ8P0tHcpLpZ5xHwtzmc37ORZg21kSyQxBvAMofeme32KIEbed6Q88/gm2d+2A==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/client-configurations": "1.24.0",
+ "@mondaydotcomorg/client-error-tracker": "0.5.1",
+ "@mondaydotcomorg/client-local-data-management": "1.16.0",
+ "@mondaydotcomorg/dom-utils": "1.19.0",
+ "@mondaydotcomorg/mercury-communication": "0.0.7",
+ "@mondaydotcomorg/monolith-window": "1.21.0",
+ "@mondaydotcomorg/resource-management-shared": "1.0.0",
+ "@mondaydotcomorg/shared-constants": "1.47.0",
+ "@mondaydotcomorg/trident-skeleton": "1.0.10"
+ },
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/ignite-client-sdk/node_modules/@mondaydotcomorg/monolith-window": {
+ "version": "1.21.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/monolith-window/-/monolith-window-1.21.0.tgz",
+ "integrity": "sha512-6ASfupaHw8Z3ddKZWG8WwO+jvLLPU2fqkj/1V9FFXuniCKxroKxZn0gomfwaYmnr1HdwHPpIURCtl9IjFp4ovA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/ignite-client-sdk/node_modules/@mondaydotcomorg/resource-management-shared": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/resource-management-shared/-/resource-management-shared-1.0.0.tgz",
+ "integrity": "sha512-E+T701R2uNIwVNn90FKSPWLxUwN1/f6ldSyGyqFelDT6oBRy+tuYvYx/wDUYOkaO2ujzUPd4GnTVB3pCBQdxpQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@mondaydotcomorg/ignite-client-sdk/node_modules/@mondaydotcomorg/trident-runtime": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/trident-runtime/-/trident-runtime-0.1.2.tgz",
+ "integrity": "sha512-Pfl3s0pG4v9/CeCqCx8SeHpaURzb7U8QbdQnJ/0qmrsLPwu1vWIm4YhwnCHQPP2Yc0R/n5ProPAqrcq2zgtZIg==",
+ "license": "BSD-3-Clause",
+ "peer": true
+ },
+ "node_modules/@mondaydotcomorg/ignite-client-sdk/node_modules/@mondaydotcomorg/trident-skeleton": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/trident-skeleton/-/trident-skeleton-1.0.10.tgz",
+ "integrity": "sha512-UMZVatmFJtG2saNHSh7g1AciiQHnU6c1pqvnXzHK2ICpNbpvj48O5CdyHMWZpWFeemrHV9BBsHMEDU0Z7cHrJg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@mondaydotcomorg/bigbrain": "^3.0.4",
+ "@mondaydotcomorg/client-configurations": "^1.0.8",
+ "@mondaydotcomorg/client-error-tracker": "^0.4.0",
+ "@mondaydotcomorg/client-http-request": "^2.1.8",
+ "clsx": "^1.2.1",
+ "query-string": "^7.1.3",
+ "semver": "^7.3.8",
+ "style-inject": "^0.3.0",
+ "uuid": "^9.0.0"
+ },
+ "peerDependencies": {
+ "@mondaydotcomorg/trident-runtime": "^0.1.0",
+ "react": ">=16.8.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/ignite-client-sdk/node_modules/@mondaydotcomorg/trident-skeleton/node_modules/@mondaydotcomorg/client-error-tracker": {
+ "version": "0.4.13",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-error-tracker/-/client-error-tracker-0.4.13.tgz",
+ "integrity": "sha512-rLkLhkz8LOhJGCzuNBrc+saaEst7cEGXIBEGqbQSwA+DK1ON40VuLNh/CFvE740qnBfPHSs4bbBulQro8CULdA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@sentry/browser": "^10.58.0",
+ "@sentry/react": "^10.58.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/ignite-client-sdk/node_modules/js-cookie": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz",
+ "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@mondaydotcomorg/ignite-client-sdk/node_modules/query-string": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz",
+ "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==",
+ "license": "MIT",
+ "dependencies": {
+ "decode-uri-component": "^0.2.2",
+ "filter-obj": "^1.1.0",
+ "split-on-first": "^1.0.0",
+ "strict-uri-encode": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@mondaydotcomorg/ignite-client-sdk/node_modules/react": {
+ "version": "16.14.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz",
+ "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/ignite-client-sdk/node_modules/react-dom": {
+ "version": "16.14.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz",
+ "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2",
+ "scheduler": "^0.19.1"
+ },
+ "peerDependencies": {
+ "react": "^16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/ignite-client-sdk/node_modules/scheduler": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz",
+ "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/ignite-client-sdk/node_modules/strict-uri-encode": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
+ "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@mondaydotcomorg/ignite-client-sdk/node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/@mondaydotcomorg/injection-solver": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/injection-solver/-/injection-solver-1.2.5.tgz",
+ "integrity": "sha512-b0mWGUfBB2ZJeFVZUIrYxI/gnn+rQwal24YRQqpb5W03HN2s86t6tXXDzn2D6bIkzDdScdpTfwNr/Yz4YybcAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/monolith-logger": "2.2.119",
+ "@mondaydotcomorg/monolith-window": "1.4.3"
+ }
+ },
+ "node_modules/@mondaydotcomorg/injection-solver/node_modules/@mondaydotcomorg/client-common-configurations": {
+ "version": "2.1.67",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-common-configurations/-/client-common-configurations-2.1.67.tgz",
+ "integrity": "sha512-VnTxZ6MfehKmBHNgwYMO77TunT9Pqm/Zmu9SBeRldB2vtng4tkqteaDt6f0NxtGZQL3lbENOP0wggW19gH+cvg==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/client-configurations": "1.1.20",
+ "@mondaydotcomorg/monolith-window": "1.4.3"
+ },
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/injection-solver/node_modules/@mondaydotcomorg/client-configurations": {
+ "version": "1.1.20",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-configurations/-/client-configurations-1.1.20.tgz",
+ "integrity": "sha512-IlLemeosGJgyJK6ZXCKticvIt+oMB59J1MSzsupbMEpvTFE/bydoMP5JOHODQL41wFX/vDD6xneJjK7pCvLZBQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/client-local-data-management": "1.1.10",
+ "@mondaydotcomorg/ignite-client-sdk": "^1.1.4",
+ "@mondaydotcomorg/monolith-window": "1.4.3"
+ },
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "moment": "^2.29.4",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/injection-solver/node_modules/@mondaydotcomorg/client-error-tracker": {
+ "version": "0.4.13",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-error-tracker/-/client-error-tracker-0.4.13.tgz",
+ "integrity": "sha512-rLkLhkz8LOhJGCzuNBrc+saaEst7cEGXIBEGqbQSwA+DK1ON40VuLNh/CFvE740qnBfPHSs4bbBulQro8CULdA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@sentry/browser": "^10.58.0",
+ "@sentry/react": "^10.58.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/injection-solver/node_modules/@mondaydotcomorg/client-local-data-management": {
+ "version": "1.1.10",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-local-data-management/-/client-local-data-management-1.1.10.tgz",
+ "integrity": "sha512-m25X24WbaxE39UDNiZQBzS+QCrj6Lr0N8QmCQaRu2vAHtKslpSTwW8fdiFKQn5AfYCnfOT5uC6qPmwKB1DXBIg==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/monolith-window": "1.4.3"
+ },
+ "peerDependencies": {
+ "lodash-es": "^4.17.21"
+ }
+ },
+ "node_modules/@mondaydotcomorg/injection-solver/node_modules/@mondaydotcomorg/core-utils": {
+ "version": "1.2.61",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/core-utils/-/core-utils-1.2.61.tgz",
+ "integrity": "sha512-qKvbTTQXuWvHHOUnPb7E4fG8V20pDcAutPZlgjtrPBoAnRFdiNKO3B6hTFpokGwDKqJ7e+juFGwYoKcgpRxYfw==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/localization": "^2.1.6",
+ "@mondaydotcomorg/monolith-window": "1.4.3",
+ "@mondaydotcomorg/shared-constants": "1.5.5",
+ "classnames": "^2.5.1",
+ "lodash-es": "^4.17.21"
+ },
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/injection-solver/node_modules/@mondaydotcomorg/dom-utils": {
+ "version": "1.1.64",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/dom-utils/-/dom-utils-1.1.64.tgz",
+ "integrity": "sha512-foMChaDt6tTZjHggOG05lkuU1T6N6O7t9T+H1Zfd8ZcnXsuRfFVwZ0kd11jinY/+kN2RKJhv3QpQmflSqfWmJA==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/core-utils": "1.2.61",
+ "@mondaydotcomorg/monolith-window": "1.4.3"
+ },
+ "peerDependencies": {
+ "js-cookie": "^2.2.1",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/injection-solver/node_modules/@mondaydotcomorg/monolith-logger": {
+ "version": "2.2.119",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/monolith-logger/-/monolith-logger-2.2.119.tgz",
+ "integrity": "sha512-OUMZ3G5VkdeE+wq5IF8FC6/3thIyAO4yPRdBz2cs9p6JFBM7E7ApwEYyirnICHbyhSPCHuaYr+FqosXHMk7vyg==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/client-common-configurations": "2.1.67",
+ "@mondaydotcomorg/client-configurations": "1.1.20",
+ "@mondaydotcomorg/client-error-tracker": "^0.4.8",
+ "@mondaydotcomorg/client-local-data-management": "1.1.10",
+ "@mondaydotcomorg/dom-utils": "1.1.64",
+ "@mondaydotcomorg/mercury-communication": "0.0.7",
+ "@mondaydotcomorg/monolith-window": "1.4.3",
+ "@mondaydotcomorg/pricing-service": "1.2.29",
+ "@mondaydotcomorg/resource-management-shared": "1.0.0",
+ "@mondaydotcomorg/shared-constants": "1.5.5"
+ },
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/injection-solver/node_modules/@mondaydotcomorg/monolith-window": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/monolith-window/-/monolith-window-1.4.3.tgz",
+ "integrity": "sha512-pK2asndVLETfU5NBAw5WGTwa1B2xBJw9VzYS3Ll6ySMP5aO1OWh06QVeymAALk0XaEQ0Kj1XODmnudt6l3FnMA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/injection-solver/node_modules/@mondaydotcomorg/pricing-service": {
+ "version": "1.2.29",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/pricing-service/-/pricing-service-1.2.29.tgz",
+ "integrity": "sha512-sP/EpCdJR3JvMAQ2AbCFP1rhxwdj9pD0TxjAmDhWG8RGLIKKgOhKtJzFEczQMKnUduvp53PgYEsC0rUE7Hk1jQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/client-configurations": "1.1.20",
+ "@mondaydotcomorg/core-utils": "1.2.61",
+ "@mondaydotcomorg/monolith-window": "1.4.3",
+ "@mondaydotcomorg/shared-constants": "1.5.5"
+ },
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/injection-solver/node_modules/@mondaydotcomorg/resource-management-shared": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/resource-management-shared/-/resource-management-shared-1.0.0.tgz",
+ "integrity": "sha512-E+T701R2uNIwVNn90FKSPWLxUwN1/f6ldSyGyqFelDT6oBRy+tuYvYx/wDUYOkaO2ujzUPd4GnTVB3pCBQdxpQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@mondaydotcomorg/injection-solver/node_modules/@mondaydotcomorg/shared-constants": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/shared-constants/-/shared-constants-1.5.5.tgz",
+ "integrity": "sha512-8IE8XLxBKa+zP8jzv7XmXNeNe3DjlIf4ARzDns0bfaY1ywB2CE4wJGsiQozX8SToENfZo9Yijab5QTN8pKT/yA==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/icons": "^1.20.0",
+ "@mondaydotcomorg/monolith-window": "1.4.3",
+ "@mondaydotcomorg/shared-constants": "1.5.5",
+ "@mondaydotcomorg/shared-jsons": "1.1.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/injection-solver/node_modules/@mondaydotcomorg/shared-jsons": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/shared-jsons/-/shared-jsons-1.1.1.tgz",
+ "integrity": "sha512-MX4IxCgbkm+8+WG+Ws5xHk4M8HrnMlzPkswYo6ZZtowGIzTgL+K4euBwev8L1yzoE6X6RoPWZSs03+HavOq5kw==",
+ "license": "MIT"
+ },
+ "node_modules/@mondaydotcomorg/injection-solver/node_modules/js-cookie": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz",
+ "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@mondaydotcomorg/injection-solver/node_modules/react": {
+ "version": "16.14.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz",
+ "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/injection-solver/node_modules/react-dom": {
+ "version": "16.14.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz",
+ "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2",
+ "scheduler": "^0.19.1"
+ },
+ "peerDependencies": {
+ "react": "^16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/injection-solver/node_modules/scheduler": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz",
+ "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/lite-client-configurations": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/lite-client-configurations/-/lite-client-configurations-0.0.4.tgz",
+ "integrity": "sha512-T4teWoywrj6dPFpHWibc+vAZTfCoxQlcVyYa0IZJimva1saCUmsYnc8WQNbvbOQWTsqxlWWx0/LpLzJ0EIY5jg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@mondaydotcomorg/ignite-client-sdk": "^1.1.4"
+ }
+ },
+ "node_modules/@mondaydotcomorg/localization": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/localization/-/localization-2.2.0.tgz",
+ "integrity": "sha512-i9/Vfdn24vJmUPrrDL4/+9I7Pmd6fJNyLD7heSnOKKRGhgvia/CMSR8AUo2SsrHnTXGfs7R/XHeyYrAhs3VieA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "date-fns": "^2.30.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/mercury-communication": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/mercury-communication/-/mercury-communication-0.0.7.tgz",
+ "integrity": "sha512-sLZECTY+L7ElFIjPWtxur3+z/6JK6G3V34zjYFhMK19cN9eTLYTJTYc3jqEwUPibl6l6zCijRc6qPDI4m/o0sg==",
+ "license": "MIT"
+ },
+ "node_modules/@mondaydotcomorg/mf-api-types": {
+ "version": "0.6.7",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/mf-api-types/-/mf-api-types-0.6.7.tgz",
+ "integrity": "sha512-UskML5oLvyDuSZtkfKKN9uhZNO/08AORr9rOFToZQqy5yOgLcPdsasiHHBXgRDVx48ZkAp2TVPimgT5YJlPN0w==",
+ "license": "MIT",
+ "dependencies": {
+ "zod": "^3.24.0"
+ },
+ "peerDependencies": {
+ "immutable": ">=3.8.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/mf-api-types/node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/@mondaydotcomorg/module-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/module-utils/-/module-utils-1.0.1.tgz",
+ "integrity": "sha512-ZBva+a9jPBG/YJmdyRKWDQyOylZLddB/6bsidmmpfUYNpDPm7Bys2+VC49gkHWe6JyKi/qEekFBOHXPfJZVwOQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/runtime-corejs2": "^7.10.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/monday-fetch-api": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/monday-fetch-api/-/monday-fetch-api-1.1.3.tgz",
+ "integrity": "sha512-k4Z09pYeKQqqnbuPwADOTXiK7eJQsBMGbDJUactQm/XeG1VRtSqyWfhBxt6SDEXdyTuTecp1r7713Ep/6gTfxQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "node-fetch": "^2.6.7"
+ }
+ },
+ "node_modules/@mondaydotcomorg/monday-logger": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/monday-logger/-/monday-logger-4.0.8.tgz",
+ "integrity": "sha512-4N9FhP2wC5Ec9n7fccyeOYuoIh9g2ZiZ1Js8Zrulb5IFc3cM0GUQbc1sWxWOjL5bdTW6ovCViIyt/vVmof214w==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@types/bunyan": "^1.8.6",
+ "bunyan": "1.8.13"
+ }
+ },
+ "node_modules/@mondaydotcomorg/monday-shared-mocks": {
+ "version": "1.11.2",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/monday-shared-mocks/-/monday-shared-mocks-1.11.2.tgz",
+ "integrity": "sha512-wd6hc8LBkr/OKRIm8/E3pbAXkzdmHGI2GLSMBF7Fl82rgH3xZdRkYHAIQ4CCu5Jb2AG4QH7rV78fhswHqLaqNQ==",
+ "dependencies": {
+ "lodash-es": "^4.17.21",
+ "msw": "0.35.0",
+ "uuid": "^11.0.3"
+ }
+ },
+ "node_modules/@mondaydotcomorg/monday-shared-mocks/node_modules/uuid": {
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz",
+ "integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/esm/bin/uuid"
+ }
+ },
+ "node_modules/@mondaydotcomorg/monday-ui-components": {
+ "version": "0.81.3",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/monday-ui-components/-/monday-ui-components-0.81.3.tgz",
+ "integrity": "sha512-QsyylIBRBqzUy/znRgA0T8QS7bnVPxmkukIka5eetAD0uFKQNS7P8+27Z3BV/e7r8TvuEUsJXT8Q3vI+bQ2t6w==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/agent-ecosystem-shared": "^0.1.0",
+ "@mondaydotcomorg/ai-agents-store-vulcan-client": "1.1.61-a5f2",
+ "@mondaydotcomorg/chat-client": "^1.1.3",
+ "@mondaydotcomorg/customer-journey-vulcan-client": "^1.1.11",
+ "@mondaydotcomorg/darobot-utils": "^0.0.4",
+ "@mondaydotcomorg/icons": "1.54.0",
+ "@mondaydotcomorg/react-virtualized": "^9.22.3",
+ "@mondaydotcomorg/vulcan-client": "^1.1.966",
+ "@vibe/core": "^4.2.3",
+ "@vibe/icons": "^4.0.0",
+ "chromatic": "^11.28.2",
+ "chrono-node": "2.8.0",
+ "classnames": "^2.3.1",
+ "date-fns": "^2.30.0",
+ "dompurify": "^3.2.3",
+ "emoji-mart": "3.0.1",
+ "focus-trap-react": "^10.1.1",
+ "jspdf": "^2.5.1",
+ "lodash-es": "^4.17.21",
+ "lottie-react": "^2.2.1",
+ "moment": "^2.30.1",
+ "monday-ui-style": "^0.21.1",
+ "prop-types": "^15.7.2",
+ "react-color": "^2.19.3",
+ "react-colorful": "^5.6.1",
+ "react-day-picker": "^8.8.0",
+ "react-error-boundary": "^4.0.13",
+ "react-quill": "^1.3.5",
+ "react-youtube": "^10.1.0",
+ "style-inject": "^0.3.0",
+ "use-debounce": "5.2.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/monday-ui-components/node_modules/@mondaydotcomorg/agent-ecosystem-shared": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/agent-ecosystem-shared/-/agent-ecosystem-shared-0.1.0.tgz",
+ "integrity": "sha512-V1Fx4OvWrg7ZAp36IniKXuVTk9ddxDgpzHs1377S2RbOr+PTJ3Uq7WTrEkavi26/BYlsbZ+BirXumfqMUQG4lw==",
+ "dependencies": {
+ "classnames": "^2.3.2"
+ },
+ "peerDependencies": {
+ "@vibe/core": "^3.77.0",
+ "react": "^16.14.0 || ^18.2.0",
+ "react-dom": "^16.14.0 || ^18.2.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/monday-ui-components/node_modules/@mondaydotcomorg/icons": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/icons/-/icons-1.54.0.tgz",
+ "integrity": "sha512-8tzAC4DTrEr75loG//Sc40l2+jB0L7bd04KG7Bksft3LEnJmwjUqoJAdludPN9js8IhyKJV1x//ajlaZ/npMPw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@vibe/icons": "^4.0.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/monday-ui-components/node_modules/@mondaydotcomorg/react-virtualized": {
+ "version": "9.22.3",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/react-virtualized/-/react-virtualized-9.22.3.tgz",
+ "integrity": "sha512-TqGH85/o41kaKLuJ+6IP4PFppZBhSm7o0Bic/lf18oWozQIOMCvc6si/yEF3pxPhaUPWhWKJCsliueDMo9+xhA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "clsx": "^1.0.4",
+ "dom-helpers": "^5.1.3",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.7.2",
+ "react-lifecycles-compat": "^3.0.4"
+ },
+ "peerDependencies": {
+ "react": "^15.3.0 || ^16.0.0-alpha",
+ "react-dom": "^15.3.0 || ^16.0.0-alpha"
+ }
+ },
+ "node_modules/@mondaydotcomorg/monday-ui-components/node_modules/emoji-mart": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/emoji-mart/-/emoji-mart-3.0.1.tgz",
+ "integrity": "sha512-sxpmMKxqLvcscu6mFn9ITHeZNkGzIvD0BSNFE/LJESPbCA8s1jM6bCDPjWbV31xHq7JXaxgpHxLB54RCbBZSlg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/runtime": "^7.0.0",
+ "prop-types": "^15.6.0"
+ },
+ "peerDependencies": {
+ "react": "^0.14.0 || ^15.0.0-0 || ^16.0.0 || ^17.0.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/monday-ui-components/node_modules/react-quill": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/react-quill/-/react-quill-1.3.5.tgz",
+ "integrity": "sha512-/W/rNCW+6QpGz8yQ9tFK5Ka/h/No1RqrcOOvCIOR092OiKzRFlU2xbPEwiP3Wgy/Dx13pi1YhjReDMX/5uotJg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/quill": "1.3.10",
+ "create-react-class": "^15.6.0",
+ "lodash": "^4.17.4",
+ "prop-types": "^15.5.10",
+ "quill": "^1.3.7",
+ "react-dom-factories": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8.x"
+ },
+ "peerDependencies": {
+ "react": "^0.14.9 || ^15.3.0 || ^16.0.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/pmo-common-shared": {
+ "version": "0.2.11",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/pmo-common-shared/-/pmo-common-shared-0.2.11.tgz",
+ "integrity": "sha512-x0CVI3UB3+bSKL7CcL1c46W+VI+jv3QQ7UbuwtVN2LDNjK0jHtTnCtM0Nem7ovmidLssamGeL1/x8rWczkdpDw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@mondaydotcomorg/board-columns": "^4.0.970"
+ }
+ },
+ "node_modules/@mondaydotcomorg/query-builder": {
+ "version": "1.3.26",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/query-builder/-/query-builder-1.3.26.tgz",
+ "integrity": "sha512-kv4VaETJq42QPKOsxJ2JiRZU9eNPe7/WVaLx4n+wjMXZdJ7wyJKPTp43igPj3m+clSMCC2t7LrS8EZ9fW8YMDA==",
+ "dependencies": {
+ "@mondaydotcomorg/contracts": "0.16.0"
+ },
+ "peerDependencies": {
+ "lodash": "^4.17.21"
+ }
+ },
+ "node_modules/@mondaydotcomorg/query-types": {
+ "version": "0.2.54",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/query-types/-/query-types-0.2.54.tgz",
+ "integrity": "sha512-1IT8ie/+oXOsxkORo4A1kIZzX/WzyUC0lz/Yhuu0IE21RF8OvRr6qHHxIFe2XM7U8w/aAzWiD+KYNLuqZRgtCA==",
+ "dependencies": {
+ "@mondaydotcomorg/contracts": "0.16.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/react-hooks": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/react-hooks/-/react-hooks-1.0.4.tgz",
+ "integrity": "sha512-+d30+DXS5RwRIvBcZg/zD/mK8NlJ3iX6wtYF4TDHFfXLtHzWpcafJhgHFbLt9lryv10h4R6aMxdcvIE8+QS08Q==",
+ "license": "BSD-3-Clause",
+ "peerDependencies": {
+ "react": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/resource-directory-types": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/resource-directory-types/-/resource-directory-types-0.0.4.tgz",
+ "integrity": "sha512-KOJ2w43h7QPCOT1NpXl+cKLDR/OhD1fX82gFLFfhLz4rXgTKAYh6ZPtgkU1Hip/3dUxCFd3Go/kmVxJpI7FXGA=="
+ },
+ "node_modules/@mondaydotcomorg/resource-management-shared": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/resource-management-shared/-/resource-management-shared-2.7.0.tgz",
+ "integrity": "sha512-KtlNZJV1ci7vCFrAz+MrWkQ6ZUxdSX6+yFpWXTB6HAWDG950XGl7XVjkTbIr4ptbpbzLfYpRqMRwWMPrVUtO9g==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@mondaydotcomorg/shared-constants": {
+ "version": "1.47.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/shared-constants/-/shared-constants-1.47.0.tgz",
+ "integrity": "sha512-qsK9ijEQmEODDZvKWy3ZI6webGsjv0ch+ZaXisZVdk0AbOTGwUijV9TcHWPnxFlzOMNsJbNIlr3bW67pWkZJ6A==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/icons": "^1.20.0",
+ "@mondaydotcomorg/pmo-common-shared": "^0.2.11",
+ "@mondaydotcomorg/shared-jsons": "1.7.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/shared-jsons": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/shared-jsons/-/shared-jsons-1.7.0.tgz",
+ "integrity": "sha512-QmtzecvRte2daIgvU5M5LwKt4LYWSrG3Nw/fFhrAkK93IgKc96XMZrlxwiWkCmc0x+pw/nq0nEgcydUZ4YGXWw==",
+ "license": "MIT"
+ },
+ "node_modules/@mondaydotcomorg/sphera-mf-api": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/sphera-mf-api/-/sphera-mf-api-1.0.2.tgz",
+ "integrity": "sha512-b96XcgDyyTXb0m69mC+5BOUhFYZRxFMo/NR6EfU5mrQxPXUhjSQEVH5rQ4/dSEansrkzHHcUv2lWqR7DvzsGew==",
+ "license": "BSD-3-Clause",
+ "peer": true
+ },
+ "node_modules/@mondaydotcomorg/support-chat-types": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/support-chat-types/-/support-chat-types-0.18.0.tgz",
+ "integrity": "sha512-aVtMmVosVGjc/Z+bFfMgNlB5wHVx/UAQ33ZDcEkxjM3A8lAdO/gdnGBPxJpsryknQ64Wnm3DBF9kYwvVgBp1HA==",
+ "dependencies": {
+ "zod": "^3.24.2"
+ }
+ },
+ "node_modules/@mondaydotcomorg/support-chat-types/node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/@mondaydotcomorg/trident-backend-api": {
+ "version": "0.24.9",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/trident-backend-api/-/trident-backend-api-0.24.9.tgz",
+ "integrity": "sha512-/N954WaPAB/rmtDQl+f+4byH7g/TqTsf/T+Tc0cSHEuMkd/yV5AQtyh/C72pToOvZAJ0cLEeXx2Iarhw9B/geA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@mondaydotcomorg/bigbrain-tracker-types": "0.0.4",
+ "@mondaydotcomorg/monday-fetch-api": "^1.0.2",
+ "dotenv": "^16.3.1",
+ "jest-mock": "^29.7.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/trident-runtime": {
+ "version": "1.24.6",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/trident-runtime/-/trident-runtime-1.24.6.tgz",
+ "integrity": "sha512-gdaa087cpSQ+Pmj7CYtCwbNSJcV36lo39eGONryCKfks4qW21Y3zLBKwCdoa8r9aLgNUzGUeHtvxgNxRoyG13A==",
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "dependencies": {
+ "@mondaydotcomorg/mf-api-types": "0.1.9",
+ "@mondaydotcomorg/sphera-mf-api": "1.0.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/trident-runtime/node_modules/@mondaydotcomorg/mf-api-types": {
+ "version": "0.1.9",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/mf-api-types/-/mf-api-types-0.1.9.tgz",
+ "integrity": "sha512-atNAViMyFpMLPDacE/JRUL+CxqKlFGx4Brqtk7erSlopzlggHxh+dvEPgbMfTCMycmi64Pg5ukh+q1zkb3Ooow==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "zod": "^3.24.0"
+ },
+ "peerDependencies": {
+ "immutable": ">=3.8.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/trident-runtime/node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "peer": true,
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/@mondaydotcomorg/user-data-validations": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/user-data-validations/-/user-data-validations-2.4.1.tgz",
+ "integrity": "sha512-BSgUbZcKLaxHGkeQaSxNoHbCq7ogXl5b+bxBDMwUAxopq51ymWCCbO3bg3zVv5I5Hp4KEi10KArvk3h0E08NCA==",
+ "dependencies": {
+ "@mondaydotcomorg/board-columns": "^4.19.5",
+ "@types/lodash": "^4.17.14",
+ "date-fns": "^2.16.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/users-and-governance-frontend": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/users-and-governance-frontend/-/users-and-governance-frontend-2.3.6.tgz",
+ "integrity": "sha512-ab/roHc+PRnK83BthRAxyiIoPlaCl2tmVhVp4jqUxyitUT0VGLchGcHk8Vh33nX/RIfyGe1cYaYnJmAKxA4Bbw==",
+ "dependencies": {
+ "@mondaydotcomorg/bigbrain-tracker": "^1.3.1",
+ "@mondaydotcomorg/client-configurations": "^1.1.24",
+ "@mondaydotcomorg/users-and-governance-shared": "2.0.15",
+ "js-cookie": "^3.0.5",
+ "jwt-decode": "^4.0.0",
+ "zod": "^4.1.13"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/users-and-governance-frontend/node_modules/@mondaydotcomorg/client-configurations": {
+ "version": "1.24.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-configurations/-/client-configurations-1.24.0.tgz",
+ "integrity": "sha512-CTDdJAyX08PTTlYnX2hzLFiDraJo+nR1zYlbT4ObfL0Mr82Z7Jq4XF7lrilK76wlRr7H4F8h77022+3xkEId7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/client-local-data-management": "1.16.0",
+ "@mondaydotcomorg/ignite-client-sdk": "^1.1.4",
+ "@mondaydotcomorg/monolith-window": "1.21.0",
+ "@mondaydotcomorg/shared-constants": "1.47.0"
+ },
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "moment": "^2.29.4",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/users-and-governance-frontend/node_modules/@mondaydotcomorg/client-configurations/node_modules/@mondaydotcomorg/monolith-window": {
+ "version": "1.21.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/monolith-window/-/monolith-window-1.21.0.tgz",
+ "integrity": "sha512-6ASfupaHw8Z3ddKZWG8WwO+jvLLPU2fqkj/1V9FFXuniCKxroKxZn0gomfwaYmnr1HdwHPpIURCtl9IjFp4ovA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/users-and-governance-frontend/node_modules/react-dom": {
+ "version": "16.14.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz",
+ "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2",
+ "scheduler": "^0.19.1"
+ },
+ "peerDependencies": {
+ "react": "^16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/users-and-governance-frontend/node_modules/scheduler": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz",
+ "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/users-and-governance-shared": {
+ "version": "2.0.15",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/users-and-governance-shared/-/users-and-governance-shared-2.0.15.tgz",
+ "integrity": "sha512-MefBcS8glVM9QChjtIzju4toy2xewVZlVJk+6nwqISZnDtjlBhC/edfkqqhWL6rzVFfCxhVXhG35AgQnCLWz3A==",
+ "dependencies": {
+ "@faker-js/faker": "^9.9.0",
+ "validator": "^13.15.15",
+ "zod": "^4.0.14"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client": {
+ "version": "1.2.1092",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/vulcan-client/-/vulcan-client-1.2.1092.tgz",
+ "integrity": "sha512-F7LwpoGFbNKioXEj/k2ApoW+ZCiI3SUrjMAFo4/8lPyfSI+3545n1RSg5AAHGo38MVBJ8vg/Na37hW53lZeTLA==",
+ "dependencies": {
+ "@mondaydotcomorg/api-client": "^1.0.6",
+ "@mondaydotcomorg/bigbrain": "^3.0.1",
+ "@mondaydotcomorg/board-app-frontend-client": "^0.2.10",
+ "@mondaydotcomorg/board-columns": "^4.21.2",
+ "@mondaydotcomorg/client-boards-services": "^1.1.138",
+ "@mondaydotcomorg/client-common-configurations": "^2.0.55",
+ "@mondaydotcomorg/client-configurations": "^1.1.13",
+ "@mondaydotcomorg/client-date-utils": "^1.1.41",
+ "@mondaydotcomorg/columns-services": "1.8.5",
+ "@mondaydotcomorg/departments-frontend-client": "^0.0.2",
+ "@mondaydotcomorg/hierarchy-frontend-client": "^1.7.1",
+ "@mondaydotcomorg/ignite-client-sdk": "^1.1.4",
+ "@mondaydotcomorg/localization": "^2.1.9",
+ "@mondaydotcomorg/mf-api-types": "^0.6.5",
+ "@mondaydotcomorg/monday-shared-mocks": "1.11.2",
+ "@mondaydotcomorg/monolith-window": "^1.5.2",
+ "@mondaydotcomorg/pricing-service": "^1.2.23",
+ "@mondaydotcomorg/resource-directory-types": "^0.0.4",
+ "@mondaydotcomorg/resource-management-shared": "^2.6.1",
+ "@mondaydotcomorg/scheduled-exports-frontend-client": "^0.1.2",
+ "@mondaydotcomorg/shared-constants": "^1.1.5",
+ "@mondaydotcomorg/user-data-validations": "2.4.1",
+ "@mondaydotcomorg/users-and-governance-frontend": "^2.3.2",
+ "@mondaydotcomorg/vulcan-core": "0.1.17",
+ "@mondaydotcomorg/vulcan-services": "0.1.4",
+ "@mondaydotcomorg/vulcan-store-setup": "0.1.1",
+ "@mondaydotcomorg/vulcan-testkit-utils": "0.0.125",
+ "dayjs": "^1.11.12",
+ "immer": "^10.1.1",
+ "immutable": "3.8.1",
+ "js-cookie": "^3.0.5",
+ "lodash-es": "^4.17.21",
+ "moment-fquarter": "^1.0.0",
+ "node-fetch": "2.6.7",
+ "p-map": "^7.0.3",
+ "react-compiler-runtime": "~1.0.0",
+ "react-error-boundary": "^3.1.3",
+ "reselect": "^5.1.1",
+ "zod": "^3.24.4"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/client-boards-services": {
+ "version": "1.1.252",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-boards-services/-/client-boards-services-1.1.252.tgz",
+ "integrity": "sha512-td88aIb61w3tbj6mYQ3uETPekBK8YWJLiy1LgNGiZlHli/8e2SrKWnOgLYhZyzT/kbploqnfKD6H2dCHqqZrgA==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/board-columns": "4.19.52",
+ "@mondaydotcomorg/client-date-utils": "1.2.10",
+ "@mondaydotcomorg/client-web-workers": "1.0.80",
+ "@mondaydotcomorg/core-utils": "1.2.61",
+ "@mondaydotcomorg/localization": "^2.1.6",
+ "@mondaydotcomorg/monolith-logger": "2.2.119",
+ "@mondaydotcomorg/monolith-window": "1.4.3",
+ "@mondaydotcomorg/shared-constants": "1.5.5",
+ "@mondaydotcomorg/vulcan-client": "^1.1.966",
+ "lodash-es": "4.17.21",
+ "moment": "^2.29.4"
+ },
+ "peerDependencies": {
+ "@mondaydotcomorg/api-client": "^1.0.1",
+ "normalizr": "^3.3.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/client-boards-services/node_modules/@mondaydotcomorg/board-columns": {
+ "version": "4.19.52",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/board-columns/-/board-columns-4.19.52.tgz",
+ "integrity": "sha512-9h60D1MvwZDZMeSbQ8wp6qzTMlzXCprOJx5r1ZpO3yqBVaNFhTj6mo8eFeLDGnOhNzCvem14O8v+fvNjzuhMAA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@mondaydotcomorg/contracts": "0.10.17",
+ "@mondaydotcomorg/date-utils": "3.0.0",
+ "@mondaydotcomorg/formula-parser": "2.1.2",
+ "@mondaydotcomorg/module-utils": "1.0.1",
+ "@mondaydotcomorg/query-builder": "1.2.32",
+ "@mondaydotcomorg/query-types": "0.2.29",
+ "date-fns": "^2.16.1",
+ "html-entities": "^2.4.0",
+ "lodash-es": "^4.17.21",
+ "moment": "^2.29.1",
+ "moment-timezone": "^0.5.32",
+ "object-hash": "^2.2.0",
+ "re-reselect": "4.0.0",
+ "reselect": "^4.1.5",
+ "sanitize-html": "^2.14.0",
+ "zod": "^3.24"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/client-boards-services/node_modules/@mondaydotcomorg/monolith-window": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/monolith-window/-/monolith-window-1.4.3.tgz",
+ "integrity": "sha512-pK2asndVLETfU5NBAw5WGTwa1B2xBJw9VzYS3Ll6ySMP5aO1OWh06QVeymAALk0XaEQ0Kj1XODmnudt6l3FnMA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/client-boards-services/node_modules/@mondaydotcomorg/shared-constants": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/shared-constants/-/shared-constants-1.5.5.tgz",
+ "integrity": "sha512-8IE8XLxBKa+zP8jzv7XmXNeNe3DjlIf4ARzDns0bfaY1ywB2CE4wJGsiQozX8SToENfZo9Yijab5QTN8pKT/yA==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/icons": "^1.20.0",
+ "@mondaydotcomorg/monolith-window": "1.4.3",
+ "@mondaydotcomorg/shared-constants": "1.5.5",
+ "@mondaydotcomorg/shared-jsons": "1.1.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/client-boards-services/node_modules/@mondaydotcomorg/shared-jsons": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/shared-jsons/-/shared-jsons-1.1.1.tgz",
+ "integrity": "sha512-MX4IxCgbkm+8+WG+Ws5xHk4M8HrnMlzPkswYo6ZZtowGIzTgL+K4euBwev8L1yzoE6X6RoPWZSs03+HavOq5kw==",
+ "license": "MIT"
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/client-boards-services/node_modules/reselect": {
+ "version": "4.1.8",
+ "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz",
+ "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==",
+ "license": "MIT"
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/client-common-configurations": {
+ "version": "2.24.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-common-configurations/-/client-common-configurations-2.24.0.tgz",
+ "integrity": "sha512-QvUP/D3q1WgEYCYPfJ8vGYQRVure5WWWkv933RpgeAj6flpjZkoAkQFIMVboCDzMP56SndVIaJlyklnLsma81g==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/client-configurations": "1.24.0",
+ "@mondaydotcomorg/monolith-window": "1.21.0"
+ },
+ "peerDependencies": {
+ "@mondaydotcomorg/vulcan-client": "^1.1.1000",
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/client-configurations": {
+ "version": "1.24.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-configurations/-/client-configurations-1.24.0.tgz",
+ "integrity": "sha512-CTDdJAyX08PTTlYnX2hzLFiDraJo+nR1zYlbT4ObfL0Mr82Z7Jq4XF7lrilK76wlRr7H4F8h77022+3xkEId7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/client-local-data-management": "1.16.0",
+ "@mondaydotcomorg/ignite-client-sdk": "^1.1.4",
+ "@mondaydotcomorg/monolith-window": "1.21.0",
+ "@mondaydotcomorg/shared-constants": "1.47.0"
+ },
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "moment": "^2.29.4",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/client-date-utils": {
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-date-utils/-/client-date-utils-1.2.10.tgz",
+ "integrity": "sha512-S1bitwpTRz6XNI9LBU8EN/Ot5XXO5ACpSLuGOz5dZ3u2y5aiW56s+vmqdOGfzBluuSkqcJkxTzjWNa+N/yYzTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/core-utils": "1.2.61",
+ "@mondaydotcomorg/dom-utils": "1.1.64",
+ "@mondaydotcomorg/monolith-window": "1.4.3"
+ },
+ "peerDependencies": {
+ "date-fns": "^2.30.0",
+ "lodash-es": "^4.17.21",
+ "moment": "^2.29.4",
+ "moment-fquarter": "^1.0.0",
+ "moment-timezone": "0.5.33"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/client-date-utils/node_modules/@mondaydotcomorg/dom-utils": {
+ "version": "1.1.64",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/dom-utils/-/dom-utils-1.1.64.tgz",
+ "integrity": "sha512-foMChaDt6tTZjHggOG05lkuU1T6N6O7t9T+H1Zfd8ZcnXsuRfFVwZ0kd11jinY/+kN2RKJhv3QpQmflSqfWmJA==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/core-utils": "1.2.61",
+ "@mondaydotcomorg/monolith-window": "1.4.3"
+ },
+ "peerDependencies": {
+ "js-cookie": "^2.2.1",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/client-date-utils/node_modules/@mondaydotcomorg/monolith-window": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/monolith-window/-/monolith-window-1.4.3.tgz",
+ "integrity": "sha512-pK2asndVLETfU5NBAw5WGTwa1B2xBJw9VzYS3Ll6ySMP5aO1OWh06QVeymAALk0XaEQ0Kj1XODmnudt6l3FnMA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/client-date-utils/node_modules/js-cookie": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz",
+ "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/client-error-tracker": {
+ "version": "0.4.13",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-error-tracker/-/client-error-tracker-0.4.13.tgz",
+ "integrity": "sha512-rLkLhkz8LOhJGCzuNBrc+saaEst7cEGXIBEGqbQSwA+DK1ON40VuLNh/CFvE740qnBfPHSs4bbBulQro8CULdA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@sentry/browser": "^10.58.0",
+ "@sentry/react": "^10.58.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/client-events-frame-tracker": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-events-frame-tracker/-/client-events-frame-tracker-0.0.5.tgz",
+ "integrity": "sha512-aufYm0CsrfxwdvrdO/WDSqkJAnQMFh1pFRHmRuasU313SIUVa0153RyPeIgPmOMZBQgU4Mnvgond9oNWI+TUig==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/client-web-workers": {
+ "version": "1.0.80",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-web-workers/-/client-web-workers-1.0.80.tgz",
+ "integrity": "sha512-+GK1LHkSMA1J+afsk83h/6U2oPWW/GGcenMRata5I0Jck5hDp5SPKZtUHh8VovfWcQMbXFBUQMPEG5eQZEAGDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/board-columns": "4.19.52",
+ "@mondaydotcomorg/core-utils": "1.2.61",
+ "@mondaydotcomorg/vulcan-client": "^1.1.961"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/client-web-workers/node_modules/@mondaydotcomorg/board-columns": {
+ "version": "4.19.52",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/board-columns/-/board-columns-4.19.52.tgz",
+ "integrity": "sha512-9h60D1MvwZDZMeSbQ8wp6qzTMlzXCprOJx5r1ZpO3yqBVaNFhTj6mo8eFeLDGnOhNzCvem14O8v+fvNjzuhMAA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@mondaydotcomorg/contracts": "0.10.17",
+ "@mondaydotcomorg/date-utils": "3.0.0",
+ "@mondaydotcomorg/formula-parser": "2.1.2",
+ "@mondaydotcomorg/module-utils": "1.0.1",
+ "@mondaydotcomorg/query-builder": "1.2.32",
+ "@mondaydotcomorg/query-types": "0.2.29",
+ "date-fns": "^2.16.1",
+ "html-entities": "^2.4.0",
+ "lodash-es": "^4.17.21",
+ "moment": "^2.29.1",
+ "moment-timezone": "^0.5.32",
+ "object-hash": "^2.2.0",
+ "re-reselect": "4.0.0",
+ "reselect": "^4.1.5",
+ "sanitize-html": "^2.14.0",
+ "zod": "^3.24"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/client-web-workers/node_modules/reselect": {
+ "version": "4.1.8",
+ "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz",
+ "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==",
+ "license": "MIT"
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/columns-services": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/columns-services/-/columns-services-1.8.5.tgz",
+ "integrity": "sha512-FvrRNUekyGqpGSl1aYz/+fDgeLVJGfm/b3XQTVJRf2CKvwCUscfj6kpiFt82SjxhBWwytvd3RWMp5rHSscwlvw==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/board-columns": "4.19.52",
+ "@mondaydotcomorg/client-boards-services": "1.1.252",
+ "@mondaydotcomorg/client-common-configurations": "2.1.67",
+ "@mondaydotcomorg/client-configurations": "1.1.20",
+ "@mondaydotcomorg/client-date-utils": "1.2.10",
+ "@mondaydotcomorg/core-utils": "1.2.61",
+ "@mondaydotcomorg/files-service": "0.1.40",
+ "@mondaydotcomorg/injection-solver": "1.2.5",
+ "@mondaydotcomorg/localization": "^2.1.6",
+ "@mondaydotcomorg/monday-ui-components": "^0.64.0",
+ "@mondaydotcomorg/monolith-logger": "2.2.119",
+ "@mondaydotcomorg/monolith-window": "1.4.3",
+ "@mondaydotcomorg/pricing-service": "1.2.29",
+ "@mondaydotcomorg/resource-management-shared": "1.0.0",
+ "@mondaydotcomorg/shared-constants": "1.5.5",
+ "@mondaydotcomorg/shared-jsons": "1.1.1",
+ "lodash-es": "^4.17.21"
+ },
+ "peerDependencies": {
+ "@vibe/icons": "^1.11.1",
+ "moment": "^2.29.4",
+ "moment-timezone": "0.5.33"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/columns-services/node_modules/@mondaydotcomorg/board-columns": {
+ "version": "4.19.52",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/board-columns/-/board-columns-4.19.52.tgz",
+ "integrity": "sha512-9h60D1MvwZDZMeSbQ8wp6qzTMlzXCprOJx5r1ZpO3yqBVaNFhTj6mo8eFeLDGnOhNzCvem14O8v+fvNjzuhMAA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@mondaydotcomorg/contracts": "0.10.17",
+ "@mondaydotcomorg/date-utils": "3.0.0",
+ "@mondaydotcomorg/formula-parser": "2.1.2",
+ "@mondaydotcomorg/module-utils": "1.0.1",
+ "@mondaydotcomorg/query-builder": "1.2.32",
+ "@mondaydotcomorg/query-types": "0.2.29",
+ "date-fns": "^2.16.1",
+ "html-entities": "^2.4.0",
+ "lodash-es": "^4.17.21",
+ "moment": "^2.29.1",
+ "moment-timezone": "^0.5.32",
+ "object-hash": "^2.2.0",
+ "re-reselect": "4.0.0",
+ "reselect": "^4.1.5",
+ "sanitize-html": "^2.14.0",
+ "zod": "^3.24"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/columns-services/node_modules/@mondaydotcomorg/client-common-configurations": {
+ "version": "2.1.67",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-common-configurations/-/client-common-configurations-2.1.67.tgz",
+ "integrity": "sha512-VnTxZ6MfehKmBHNgwYMO77TunT9Pqm/Zmu9SBeRldB2vtng4tkqteaDt6f0NxtGZQL3lbENOP0wggW19gH+cvg==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/client-configurations": "1.1.20",
+ "@mondaydotcomorg/monolith-window": "1.4.3"
+ },
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/columns-services/node_modules/@mondaydotcomorg/client-configurations": {
+ "version": "1.1.20",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-configurations/-/client-configurations-1.1.20.tgz",
+ "integrity": "sha512-IlLemeosGJgyJK6ZXCKticvIt+oMB59J1MSzsupbMEpvTFE/bydoMP5JOHODQL41wFX/vDD6xneJjK7pCvLZBQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/client-local-data-management": "1.1.10",
+ "@mondaydotcomorg/ignite-client-sdk": "^1.1.4",
+ "@mondaydotcomorg/monolith-window": "1.4.3"
+ },
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "moment": "^2.29.4",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/columns-services/node_modules/@mondaydotcomorg/client-local-data-management": {
+ "version": "1.1.10",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-local-data-management/-/client-local-data-management-1.1.10.tgz",
+ "integrity": "sha512-m25X24WbaxE39UDNiZQBzS+QCrj6Lr0N8QmCQaRu2vAHtKslpSTwW8fdiFKQn5AfYCnfOT5uC6qPmwKB1DXBIg==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/monolith-window": "1.4.3"
+ },
+ "peerDependencies": {
+ "lodash-es": "^4.17.21"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/columns-services/node_modules/@mondaydotcomorg/monolith-window": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/monolith-window/-/monolith-window-1.4.3.tgz",
+ "integrity": "sha512-pK2asndVLETfU5NBAw5WGTwa1B2xBJw9VzYS3Ll6ySMP5aO1OWh06QVeymAALk0XaEQ0Kj1XODmnudt6l3FnMA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/columns-services/node_modules/@mondaydotcomorg/pricing-service": {
+ "version": "1.2.29",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/pricing-service/-/pricing-service-1.2.29.tgz",
+ "integrity": "sha512-sP/EpCdJR3JvMAQ2AbCFP1rhxwdj9pD0TxjAmDhWG8RGLIKKgOhKtJzFEczQMKnUduvp53PgYEsC0rUE7Hk1jQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/client-configurations": "1.1.20",
+ "@mondaydotcomorg/core-utils": "1.2.61",
+ "@mondaydotcomorg/monolith-window": "1.4.3",
+ "@mondaydotcomorg/shared-constants": "1.5.5"
+ },
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/columns-services/node_modules/@mondaydotcomorg/resource-management-shared": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/resource-management-shared/-/resource-management-shared-1.0.0.tgz",
+ "integrity": "sha512-E+T701R2uNIwVNn90FKSPWLxUwN1/f6ldSyGyqFelDT6oBRy+tuYvYx/wDUYOkaO2ujzUPd4GnTVB3pCBQdxpQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/columns-services/node_modules/@mondaydotcomorg/shared-constants": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/shared-constants/-/shared-constants-1.5.5.tgz",
+ "integrity": "sha512-8IE8XLxBKa+zP8jzv7XmXNeNe3DjlIf4ARzDns0bfaY1ywB2CE4wJGsiQozX8SToENfZo9Yijab5QTN8pKT/yA==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/icons": "^1.20.0",
+ "@mondaydotcomorg/monolith-window": "1.4.3",
+ "@mondaydotcomorg/shared-constants": "1.5.5",
+ "@mondaydotcomorg/shared-jsons": "1.1.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/columns-services/node_modules/@mondaydotcomorg/shared-jsons": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/shared-jsons/-/shared-jsons-1.1.1.tgz",
+ "integrity": "sha512-MX4IxCgbkm+8+WG+Ws5xHk4M8HrnMlzPkswYo6ZZtowGIzTgL+K4euBwev8L1yzoE6X6RoPWZSs03+HavOq5kw==",
+ "license": "MIT"
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/columns-services/node_modules/reselect": {
+ "version": "4.1.8",
+ "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz",
+ "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==",
+ "license": "MIT"
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/contracts": {
+ "version": "0.10.17",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/contracts/-/contracts-0.10.17.tgz",
+ "integrity": "sha512-kAF9GlLRMgBV+Kpnm8a+zPG9C/d4EqOkhdSxBOXIol9bvHAX5yvmSnKgz8vK6g/uwQSI/MwrjGYwGrCntDp4bA=="
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/core-utils": {
+ "version": "1.2.61",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/core-utils/-/core-utils-1.2.61.tgz",
+ "integrity": "sha512-qKvbTTQXuWvHHOUnPb7E4fG8V20pDcAutPZlgjtrPBoAnRFdiNKO3B6hTFpokGwDKqJ7e+juFGwYoKcgpRxYfw==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/localization": "^2.1.6",
+ "@mondaydotcomorg/monolith-window": "1.4.3",
+ "@mondaydotcomorg/shared-constants": "1.5.5",
+ "classnames": "^2.5.1",
+ "lodash-es": "^4.17.21"
+ },
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/core-utils/node_modules/@mondaydotcomorg/monolith-window": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/monolith-window/-/monolith-window-1.4.3.tgz",
+ "integrity": "sha512-pK2asndVLETfU5NBAw5WGTwa1B2xBJw9VzYS3Ll6ySMP5aO1OWh06QVeymAALk0XaEQ0Kj1XODmnudt6l3FnMA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/core-utils/node_modules/@mondaydotcomorg/shared-constants": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/shared-constants/-/shared-constants-1.5.5.tgz",
+ "integrity": "sha512-8IE8XLxBKa+zP8jzv7XmXNeNe3DjlIf4ARzDns0bfaY1ywB2CE4wJGsiQozX8SToENfZo9Yijab5QTN8pKT/yA==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/icons": "^1.20.0",
+ "@mondaydotcomorg/monolith-window": "1.4.3",
+ "@mondaydotcomorg/shared-constants": "1.5.5",
+ "@mondaydotcomorg/shared-jsons": "1.1.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/core-utils/node_modules/@mondaydotcomorg/shared-jsons": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/shared-jsons/-/shared-jsons-1.1.1.tgz",
+ "integrity": "sha512-MX4IxCgbkm+8+WG+Ws5xHk4M8HrnMlzPkswYo6ZZtowGIzTgL+K4euBwev8L1yzoE6X6RoPWZSs03+HavOq5kw==",
+ "license": "MIT"
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/formula-parser": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/formula-parser/-/formula-parser-2.1.2.tgz",
+ "integrity": "sha512-t3QsZUentS4+LOsoMBdO01gjiqacHVFPqR2EyGEwopGfhv1H9GXUk4SR+3AKKUEiYacRu4w20/kN+tL6fBT1Og==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/runtime-corejs2": "^7.10.0",
+ "hot-formula-parser": "3.0.2",
+ "lodash.isempty": "^4.4.0",
+ "numbro": "1.11.1"
+ },
+ "peerDependencies": {
+ "moment": "^2.29.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/hierarchy-frontend-client": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/hierarchy-frontend-client/-/hierarchy-frontend-client-1.10.0.tgz",
+ "integrity": "sha512-VrMoCYLL4GpBl9QNe0onU9zgJlheAq+D4A65s0O5ovG23cqqWJ2TxXzuoZ9I9fhIng+tKplMrBPZBVqoFpZpvA==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@mondaydotcomorg/http-server-commons": "^0.1.0"
+ },
+ "peerDependencies": {
+ "@mondaydotcomorg/trident-runtime": "^2.0.1",
+ "axios": "^1.18.1"
+ },
+ "peerDependenciesMeta": {
+ "axios": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/icons": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/icons/-/icons-1.28.0.tgz",
+ "integrity": "sha512-Dp0VxPepVb+FwA/VPICAOKyENvxzlfxxXQ+aRDH/mGGx5J6DQ2K09n6JpkABQw0cCenF1uaT/Hbk+BxzWv8Bww==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@vibe/icons": "^1.15.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/monday-ui-components": {
+ "version": "0.64.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/monday-ui-components/-/monday-ui-components-0.64.0.tgz",
+ "integrity": "sha512-8sOLoWqx73Cx6hROy+0lalLeLko2r1IrFO+h0TtxcH0e2VRunI/peHSGFYQPIGI7aLlu7jOUu3zALOROJD+JAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/chat-client": "^1.1.3",
+ "@mondaydotcomorg/customer-journey-vulcan-client": "^1.1.11",
+ "@mondaydotcomorg/darobot-utils": "^0.0.4",
+ "@mondaydotcomorg/icons": "1.28.0",
+ "@mondaydotcomorg/react-virtualized": "^9.22.3",
+ "@mondaydotcomorg/vulcan-client": "^1.1.899",
+ "@vibe/core": "^3.82.0",
+ "@vibe/icons": "^1.11.1",
+ "chromatic": "^11.28.2",
+ "chrono-node": "2.8.0",
+ "classnames": "^2.3.1",
+ "date-fns": "^2.30.0",
+ "dompurify": "^3.2.3",
+ "emoji-mart": "3.0.1",
+ "focus-trap-react": "^10.1.1",
+ "jspdf": "^2.5.1",
+ "lodash-es": "^4.17.21",
+ "lottie-react": "^2.2.1",
+ "moment": "^2.30.1",
+ "monday-ui-style": "^0.21.1",
+ "prop-types": "^15.7.2",
+ "react-color": "^2.19.3",
+ "react-colorful": "^5.6.1",
+ "react-day-picker": "^8.8.0",
+ "react-error-boundary": "^4.0.13",
+ "react-quill": "^1.3.5",
+ "react-youtube": "^10.1.0",
+ "style-inject": "^0.3.0",
+ "use-debounce": "5.2.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/monday-ui-components/node_modules/react-error-boundary": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-4.1.2.tgz",
+ "integrity": "sha512-GQDxZ5Jd+Aq/qUxbCm1UtzmL/s++V7zKgE8yMktJiCQXCCFZnMZh9ng+6/Ne6PjNSXH0L9CjeOEREfRnq6Duag==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5"
+ },
+ "peerDependencies": {
+ "react": ">=16.13.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/monolith-logger": {
+ "version": "2.2.119",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/monolith-logger/-/monolith-logger-2.2.119.tgz",
+ "integrity": "sha512-OUMZ3G5VkdeE+wq5IF8FC6/3thIyAO4yPRdBz2cs9p6JFBM7E7ApwEYyirnICHbyhSPCHuaYr+FqosXHMk7vyg==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/client-common-configurations": "2.1.67",
+ "@mondaydotcomorg/client-configurations": "1.1.20",
+ "@mondaydotcomorg/client-error-tracker": "^0.4.8",
+ "@mondaydotcomorg/client-local-data-management": "1.1.10",
+ "@mondaydotcomorg/dom-utils": "1.1.64",
+ "@mondaydotcomorg/mercury-communication": "0.0.7",
+ "@mondaydotcomorg/monolith-window": "1.4.3",
+ "@mondaydotcomorg/pricing-service": "1.2.29",
+ "@mondaydotcomorg/resource-management-shared": "1.0.0",
+ "@mondaydotcomorg/shared-constants": "1.5.5"
+ },
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/monolith-logger/node_modules/@mondaydotcomorg/client-common-configurations": {
+ "version": "2.1.67",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-common-configurations/-/client-common-configurations-2.1.67.tgz",
+ "integrity": "sha512-VnTxZ6MfehKmBHNgwYMO77TunT9Pqm/Zmu9SBeRldB2vtng4tkqteaDt6f0NxtGZQL3lbENOP0wggW19gH+cvg==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/client-configurations": "1.1.20",
+ "@mondaydotcomorg/monolith-window": "1.4.3"
+ },
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/monolith-logger/node_modules/@mondaydotcomorg/client-configurations": {
+ "version": "1.1.20",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-configurations/-/client-configurations-1.1.20.tgz",
+ "integrity": "sha512-IlLemeosGJgyJK6ZXCKticvIt+oMB59J1MSzsupbMEpvTFE/bydoMP5JOHODQL41wFX/vDD6xneJjK7pCvLZBQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/client-local-data-management": "1.1.10",
+ "@mondaydotcomorg/ignite-client-sdk": "^1.1.4",
+ "@mondaydotcomorg/monolith-window": "1.4.3"
+ },
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "moment": "^2.29.4",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/monolith-logger/node_modules/@mondaydotcomorg/client-local-data-management": {
+ "version": "1.1.10",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-local-data-management/-/client-local-data-management-1.1.10.tgz",
+ "integrity": "sha512-m25X24WbaxE39UDNiZQBzS+QCrj6Lr0N8QmCQaRu2vAHtKslpSTwW8fdiFKQn5AfYCnfOT5uC6qPmwKB1DXBIg==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/monolith-window": "1.4.3"
+ },
+ "peerDependencies": {
+ "lodash-es": "^4.17.21"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/monolith-logger/node_modules/@mondaydotcomorg/dom-utils": {
+ "version": "1.1.64",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/dom-utils/-/dom-utils-1.1.64.tgz",
+ "integrity": "sha512-foMChaDt6tTZjHggOG05lkuU1T6N6O7t9T+H1Zfd8ZcnXsuRfFVwZ0kd11jinY/+kN2RKJhv3QpQmflSqfWmJA==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/core-utils": "1.2.61",
+ "@mondaydotcomorg/monolith-window": "1.4.3"
+ },
+ "peerDependencies": {
+ "js-cookie": "^2.2.1",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/monolith-logger/node_modules/@mondaydotcomorg/monolith-window": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/monolith-window/-/monolith-window-1.4.3.tgz",
+ "integrity": "sha512-pK2asndVLETfU5NBAw5WGTwa1B2xBJw9VzYS3Ll6ySMP5aO1OWh06QVeymAALk0XaEQ0Kj1XODmnudt6l3FnMA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/monolith-logger/node_modules/@mondaydotcomorg/pricing-service": {
+ "version": "1.2.29",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/pricing-service/-/pricing-service-1.2.29.tgz",
+ "integrity": "sha512-sP/EpCdJR3JvMAQ2AbCFP1rhxwdj9pD0TxjAmDhWG8RGLIKKgOhKtJzFEczQMKnUduvp53PgYEsC0rUE7Hk1jQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/client-configurations": "1.1.20",
+ "@mondaydotcomorg/core-utils": "1.2.61",
+ "@mondaydotcomorg/monolith-window": "1.4.3",
+ "@mondaydotcomorg/shared-constants": "1.5.5"
+ },
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/monolith-logger/node_modules/@mondaydotcomorg/resource-management-shared": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/resource-management-shared/-/resource-management-shared-1.0.0.tgz",
+ "integrity": "sha512-E+T701R2uNIwVNn90FKSPWLxUwN1/f6ldSyGyqFelDT6oBRy+tuYvYx/wDUYOkaO2ujzUPd4GnTVB3pCBQdxpQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/monolith-logger/node_modules/@mondaydotcomorg/shared-constants": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/shared-constants/-/shared-constants-1.5.5.tgz",
+ "integrity": "sha512-8IE8XLxBKa+zP8jzv7XmXNeNe3DjlIf4ARzDns0bfaY1ywB2CE4wJGsiQozX8SToENfZo9Yijab5QTN8pKT/yA==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/icons": "^1.20.0",
+ "@mondaydotcomorg/monolith-window": "1.4.3",
+ "@mondaydotcomorg/shared-constants": "1.5.5",
+ "@mondaydotcomorg/shared-jsons": "1.1.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/monolith-logger/node_modules/@mondaydotcomorg/shared-jsons": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/shared-jsons/-/shared-jsons-1.1.1.tgz",
+ "integrity": "sha512-MX4IxCgbkm+8+WG+Ws5xHk4M8HrnMlzPkswYo6ZZtowGIzTgL+K4euBwev8L1yzoE6X6RoPWZSs03+HavOq5kw==",
+ "license": "MIT"
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/monolith-logger/node_modules/js-cookie": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz",
+ "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/monolith-window": {
+ "version": "1.21.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/monolith-window/-/monolith-window-1.21.0.tgz",
+ "integrity": "sha512-6ASfupaHw8Z3ddKZWG8WwO+jvLLPU2fqkj/1V9FFXuniCKxroKxZn0gomfwaYmnr1HdwHPpIURCtl9IjFp4ovA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/pricing-service": {
+ "version": "1.23.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/pricing-service/-/pricing-service-1.23.0.tgz",
+ "integrity": "sha512-Z4KVUv+Ztn7x5zbvZMBx8JL6aJ3A6J3BFNRl0QlSzW+tSSnBimsBm6xFwAOeieaYmdcfPFxTS+/X1lM1AE35FA==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/client-common-configurations": "2.24.0",
+ "@mondaydotcomorg/client-configurations": "1.24.0",
+ "@mondaydotcomorg/core-utils": "1.22.0",
+ "@mondaydotcomorg/growth-entities-store-vulcan-client": "1.2.0",
+ "@mondaydotcomorg/localization": "^2.1.13",
+ "@mondaydotcomorg/monolith-logger": "2.24.0",
+ "@mondaydotcomorg/monolith-window": "1.21.0",
+ "@mondaydotcomorg/react-hooks": "^1.0.1",
+ "@mondaydotcomorg/shared-constants": "1.47.0",
+ "@mondaydotcomorg/shared-jsons": "1.7.0",
+ "@vibe/core": "^3.85.0"
+ },
+ "peerDependencies": {
+ "@mondaydotcomorg/vulcan-client": "^1.1.1000",
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/pricing-service/node_modules/@mondaydotcomorg/client-error-tracker": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-error-tracker/-/client-error-tracker-0.5.1.tgz",
+ "integrity": "sha512-Sn0IPoVz98Rnv2+yDrnolHit99iVR4DHLoB1LHvJmFG8DILgJs3Hs/OT5/CBI1KPUc+1wja9+57Q28r9gq5w5A==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@sentry/browser": "^10.58.0",
+ "@sentry/react": "^10.58.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/pricing-service/node_modules/@mondaydotcomorg/core-utils": {
+ "version": "1.22.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/core-utils/-/core-utils-1.22.0.tgz",
+ "integrity": "sha512-tJ9x/wRhBdpN+6NynRnF0M7D1Q8JN0WBYZohXzP/RXhoLJLaFL1JpfYrHh67Fr/gq2ybWh1Mj/ZYlRjiAdTj9Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/localization": "^2.1.12",
+ "@mondaydotcomorg/monolith-window": "1.21.0",
+ "@mondaydotcomorg/shared-constants": "1.47.0",
+ "anchorme": "1.1.2",
+ "classnames": "^2.5.1",
+ "lodash-es": "^4.17.21",
+ "query-string": "5.1.1"
+ },
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/pricing-service/node_modules/@mondaydotcomorg/dom-utils": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/dom-utils/-/dom-utils-1.19.0.tgz",
+ "integrity": "sha512-ejue6glVlDJIDpxhaaQLyaKwiFM3logwsRAQTUd4CHoz2iiXsvW4tfoMJP8P2pTAtlYV32rnOs6hXXmaYjM+Ng==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/monolith-window": "1.21.0",
+ "@mondaydotcomorg/shared-constants": "1.47.0"
+ },
+ "peerDependencies": {
+ "js-cookie": "^2.2.1",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/pricing-service/node_modules/@mondaydotcomorg/monolith-logger": {
+ "version": "2.24.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/monolith-logger/-/monolith-logger-2.24.0.tgz",
+ "integrity": "sha512-jjf1QMNP1hQ3KSVuR3OOFW+1aJ8P0tHcpLpZ5xHwtzmc37ORZg21kSyQxBvAMofeme32KIEbed6Q88/gm2d+2A==",
+ "license": "MIT",
+ "dependencies": {
+ "@mondaydotcomorg/client-configurations": "1.24.0",
+ "@mondaydotcomorg/client-error-tracker": "0.5.1",
+ "@mondaydotcomorg/client-local-data-management": "1.16.0",
+ "@mondaydotcomorg/dom-utils": "1.19.0",
+ "@mondaydotcomorg/mercury-communication": "0.0.7",
+ "@mondaydotcomorg/monolith-window": "1.21.0",
+ "@mondaydotcomorg/resource-management-shared": "1.0.0",
+ "@mondaydotcomorg/shared-constants": "1.47.0",
+ "@mondaydotcomorg/trident-skeleton": "1.0.10"
+ },
+ "peerDependencies": {
+ "lodash-es": "^4.17.21",
+ "react": "16.14.0",
+ "react-dom": "16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/pricing-service/node_modules/@mondaydotcomorg/resource-management-shared": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/resource-management-shared/-/resource-management-shared-1.0.0.tgz",
+ "integrity": "sha512-E+T701R2uNIwVNn90FKSPWLxUwN1/f6ldSyGyqFelDT6oBRy+tuYvYx/wDUYOkaO2ujzUPd4GnTVB3pCBQdxpQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/pricing-service/node_modules/@mondaydotcomorg/trident-runtime": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/trident-runtime/-/trident-runtime-0.1.2.tgz",
+ "integrity": "sha512-Pfl3s0pG4v9/CeCqCx8SeHpaURzb7U8QbdQnJ/0qmrsLPwu1vWIm4YhwnCHQPP2Yc0R/n5ProPAqrcq2zgtZIg==",
+ "license": "BSD-3-Clause",
+ "peer": true
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/pricing-service/node_modules/@mondaydotcomorg/trident-skeleton": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/trident-skeleton/-/trident-skeleton-1.0.10.tgz",
+ "integrity": "sha512-UMZVatmFJtG2saNHSh7g1AciiQHnU6c1pqvnXzHK2ICpNbpvj48O5CdyHMWZpWFeemrHV9BBsHMEDU0Z7cHrJg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@mondaydotcomorg/bigbrain": "^3.0.4",
+ "@mondaydotcomorg/client-configurations": "^1.0.8",
+ "@mondaydotcomorg/client-error-tracker": "^0.4.0",
+ "@mondaydotcomorg/client-http-request": "^2.1.8",
+ "clsx": "^1.2.1",
+ "query-string": "^7.1.3",
+ "semver": "^7.3.8",
+ "style-inject": "^0.3.0",
+ "uuid": "^9.0.0"
+ },
+ "peerDependencies": {
+ "@mondaydotcomorg/trident-runtime": "^0.1.0",
+ "react": ">=16.8.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/pricing-service/node_modules/@mondaydotcomorg/trident-skeleton/node_modules/@mondaydotcomorg/client-error-tracker": {
+ "version": "0.4.13",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-error-tracker/-/client-error-tracker-0.4.13.tgz",
+ "integrity": "sha512-rLkLhkz8LOhJGCzuNBrc+saaEst7cEGXIBEGqbQSwA+DK1ON40VuLNh/CFvE740qnBfPHSs4bbBulQro8CULdA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@sentry/browser": "^10.58.0",
+ "@sentry/react": "^10.58.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/pricing-service/node_modules/@mondaydotcomorg/trident-skeleton/node_modules/query-string": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz",
+ "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==",
+ "license": "MIT",
+ "dependencies": {
+ "decode-uri-component": "^0.2.2",
+ "filter-obj": "^1.1.0",
+ "split-on-first": "^1.0.0",
+ "strict-uri-encode": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/pricing-service/node_modules/js-cookie": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz",
+ "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/pricing-service/node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/query-builder": {
+ "version": "1.2.32",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/query-builder/-/query-builder-1.2.32.tgz",
+ "integrity": "sha512-BlzH4nVsfhJEBu09ZBJjpk3wAVO/rTToAFz8zmLgbBiyPNi7pV47oPXXm9FfMSpj1u+GSQbtW5aJrbGHVWypiQ==",
+ "dependencies": {
+ "@mondaydotcomorg/contracts": "0.10.17"
+ },
+ "peerDependencies": {
+ "lodash": "^4.17.21"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/query-types": {
+ "version": "0.2.29",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/query-types/-/query-types-0.2.29.tgz",
+ "integrity": "sha512-xMqi4ICfs8D5n4NY128G8fanNGKEzWmLaYV7v5HU7+q6gNDtPhNZWFZrTvX9RKol5wWK2L5Jc0AbAx0x2uCJHw==",
+ "dependencies": {
+ "@mondaydotcomorg/contracts": "0.10.17"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/react-virtualized": {
+ "version": "9.22.3",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/react-virtualized/-/react-virtualized-9.22.3.tgz",
+ "integrity": "sha512-TqGH85/o41kaKLuJ+6IP4PFppZBhSm7o0Bic/lf18oWozQIOMCvc6si/yEF3pxPhaUPWhWKJCsliueDMo9+xhA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "clsx": "^1.0.4",
+ "dom-helpers": "^5.1.3",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.7.2",
+ "react-lifecycles-compat": "^3.0.4"
+ },
+ "peerDependencies": {
+ "react": "^15.3.0 || ^16.0.0-alpha",
+ "react-dom": "^15.3.0 || ^16.0.0-alpha"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/scheduled-exports-frontend-client": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/scheduled-exports-frontend-client/-/scheduled-exports-frontend-client-0.1.2.tgz",
+ "integrity": "sha512-v1JcMgsmN14dnjPdquhLtJddHffwT0d62lscrOBON0BSvawvBT7e1S+fKpMyHjRACZxWZj2eyfeojhENUbsmsw==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@mondaydotcomorg/http-server-commons": "^0.1.0"
+ },
+ "peerDependencies": {
+ "@mondaydotcomorg/trident-runtime": "^2.0.0",
+ "axios": "^1.15.2"
+ },
+ "peerDependenciesMeta": {
+ "axios": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/trident-runtime": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/trident-runtime/-/trident-runtime-2.0.2.tgz",
+ "integrity": "sha512-AQRJklXhtWth8b1i9vwOvoOMmz4UbML9/Sh38rLA6yJ/KSyQYiZUWGox6aRo6BpWoWb9ItKy7TGE52AyhZoz+A==",
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "peerDependencies": {
+ "@mondaydotcomorg/bigbrain-types": ">=0.0.4",
+ "@mondaydotcomorg/mf-api-types": ">=0.1.0",
+ "@mondaydotcomorg/sphera-mf-api": ">=1.0.0",
+ "react": ">=16.8.0"
+ },
+ "peerDependenciesMeta": {
+ "@mondaydotcomorg/bigbrain-types": {
+ "optional": true
+ },
+ "@mondaydotcomorg/mf-api-types": {
+ "optional": true
+ },
+ "@mondaydotcomorg/sphera-mf-api": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/vulcan-core": {
+ "version": "0.1.17",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/vulcan-core/-/vulcan-core-0.1.17.tgz",
+ "integrity": "sha512-Qkfo/VcrLTFqOxFj//mAKorlaCwDwjc1I+VWn+J3LLgPKXNaprG0UzQayTMAUQiSoZOqEZDftYmzzVHLbSeoKQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@mondaydotcomorg/client-events-frame-tracker": "^0.0.5",
+ "@mondaydotcomorg/ignite-client-sdk": "^1.1.4",
+ "bowser": "^2.11.0",
+ "lodash-es": "^4.17.21",
+ "reselect": "^5.1.1",
+ "uuid": "^10.0.0",
+ "zustand": "4.5.2"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/vulcan-core/node_modules/zustand": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.2.tgz",
+ "integrity": "sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==",
+ "license": "MIT",
+ "dependencies": {
+ "use-sync-external-store": "1.2.0"
+ },
+ "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/@mondaydotcomorg/vulcan-client/node_modules/@mondaydotcomorg/vulcan-store-setup": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/vulcan-store-setup/-/vulcan-store-setup-0.1.1.tgz",
+ "integrity": "sha512-e3Hvt9b9OjUPyt0fuQRf7Lq31+EC48dDeyMa5sbz0SR7qg7ukEi7lRUSGTDxKbmezi7TydOQlWgysZjiUTBiyA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@rollup/plugin-commonjs": "^28.0.3",
+ "@rollup/plugin-json": "^6.1.0",
+ "@rollup/plugin-node-resolve": "^16.0.1",
+ "@rollup/plugin-replace": "^6.0.2",
+ "@rollup/plugin-typescript": "^12.1.2",
+ "@types/semver": "^7.5.8",
+ "concurrently": "^9.1.2",
+ "dts-bundle-generator": "^9.5.1",
+ "ejs": "^3.1.10",
+ "fs-extra": "^11.3.0",
+ "rollup": "4.44.2",
+ "rollup-plugin-preserve-shebangs": "^0.2.0",
+ "semver": "^7.6.0",
+ "tsc-alias": "1.8.15"
+ },
+ "bin": {
+ "vulcan-client-release": "dist/plugin/release-client.js"
+ },
+ "peerDependencies": {
+ "@mondaydotcomorg/vulcan-core": "^0.0.49"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.2.tgz",
+ "integrity": "sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.2.tgz",
+ "integrity": "sha512-Yt5MKrOosSbSaAK5Y4J+vSiID57sOvpBNBR6K7xAaQvk3MkcNVV0f9fE20T+41WYN8hDn6SGFlFrKudtx4EoxA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.2.tgz",
+ "integrity": "sha512-EsnFot9ZieM35YNA26nhbLTJBHD0jTwWpPwmRVDzjylQT6gkar+zenfb8mHxWpRrbn+WytRRjE0WKsfaxBkVUA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.2.tgz",
+ "integrity": "sha512-dv/t1t1RkCvJdWWxQ2lWOO+b7cMsVw5YFaS04oHpZRWehI1h0fV1gF4wgGCTyQHHjJDfbNpwOi6PXEafRBBezw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.2.tgz",
+ "integrity": "sha512-W4tt4BLorKND4qeHElxDoim0+BsprFTwb+vriVQnFFtT/P6v/xO5I99xvYnVzKWrK6j7Hb0yp3x7V5LUbaeOMg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.2.tgz",
+ "integrity": "sha512-tdT1PHopokkuBVyHjvYehnIe20fxibxFCEhQP/96MDSOcyjM/shlTkZZLOufV3qO6/FQOSiJTBebhVc12JyPTA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.2.tgz",
+ "integrity": "sha512-+xmiDGGaSfIIOXMzkhJ++Oa0Gwvl9oXUeIiwarsdRXSe27HUIvjbSIpPxvnNsRebsNdUo7uAiQVgBD1hVriwSQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.2.tgz",
+ "integrity": "sha512-bDHvhzOfORk3wt8yxIra8N4k/N0MnKInCW5OGZaeDYa/hMrdPaJzo7CSkjKZqX4JFUWjUGm88lI6QJLCM7lDrA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.2.tgz",
+ "integrity": "sha512-NMsDEsDiYghTbeZWEGnNi4F0hSbGnsuOG+VnNvxkKg0IGDvFh7UVpM/14mnMwxRxUf9AdAVJgHPvKXf6FpMB7A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.2.tgz",
+ "integrity": "sha512-lb5bxXnxXglVq+7imxykIp5xMq+idehfl+wOgiiix0191av84OqbjUED+PRC5OA8eFJYj5xAGcpAZ0pF2MnW+A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.2.tgz",
+ "integrity": "sha512-iYtAqBg5eEMG4dEfVlkqo05xMOk6y/JXIToRca2bAWuqjrJYJlx/I7+Z+4hSrsWU8GdJDFPL4ktV3dy4yBSrzg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.2.tgz",
+ "integrity": "sha512-e6vEbgaaqz2yEHqtkPXa28fFuBGmUJ0N2dOJK8YUfijejInt9gfCSA7YDdJ4nYlv67JfP3+PSWFX4IVw/xRIPg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.2.tgz",
+ "integrity": "sha512-evFOtkmVdY3udE+0QKrV5wBx7bKI0iHz5yEVx5WqDJkxp9YQefy4Mpx3RajIVcM6o7jxTvVd/qpC1IXUhGc1Mw==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.2.tgz",
+ "integrity": "sha512-/bXb0bEsWMyEkIsUL2Yt5nFB5naLAwyOWMEviQfQY1x3l5WsLKgvZf66TM7UTfED6erckUVUJQ/jJ1FSpm3pRQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.2.tgz",
+ "integrity": "sha512-3D3OB1vSSBXmkGEZR27uiMRNiwN08/RVAcBKwhUYPaiZ8bcvdeEwWPvbnXvvXHY+A/7xluzcN+kaiOFNiOZwWg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.2.tgz",
+ "integrity": "sha512-VfU0fsMK+rwdK8mwODqYeM2hDrF2WiHaSmCBrS7gColkQft95/8tphyzv2EupVxn3iE0FI78wzffoULH1G+dkw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.2.tgz",
+ "integrity": "sha512-+qMUrkbUurpE6DVRjiJCNGZBGo9xM4Y0FXU5cjgudWqIBWbcLkjE3XprJUsOFgC6xjBClwVa9k6O3A7K3vxb5Q==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.2.tgz",
+ "integrity": "sha512-3+QZROYfJ25PDcxFF66UEk8jGWigHJeecZILvkPkyQN7oc5BvFo4YEXFkOs154j3FTMp9mn9Ky8RCOwastduEA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "license": "MIT"
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@vibe/base": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@vibe/base/-/base-3.0.5.tgz",
+ "integrity": "sha512-e0JQWygbbRj6q85XlovXAOgkxZtoTR7I9K+OMoMvFc09xnQ1evZr8G2HF6Il8ENT/23s5O8hLJ1Ef/OzdBbp2w==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/shared": "3.0.8",
+ "classnames": "^2.5.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@vibe/button": {
+ "version": "3.0.16",
+ "resolved": "https://registry.npmjs.org/@vibe/button/-/button-3.0.16.tgz",
+ "integrity": "sha512-fjFb7Khv86P/tk6rO8Mdg2+fwBLen98i+E6YXC2gkWcFJAvNfjkH8kZN4m0HhmaQDBQb+ESmXZdq9vZIllS3Dw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/icon": "3.0.11",
+ "@vibe/loader": "3.0.11",
+ "@vibe/shared": "3.0.8",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@vibe/clickable": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@vibe/clickable/-/clickable-3.0.3.tgz",
+ "integrity": "sha512-xsMt0TpUj8Wdv62kADvq//BhXlU3YVBix4WJdcyRPBp5NRPMksIbbOiMc35WIZznO/lA9IwoE1ktFOjwx28hfw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/shared": "3.0.8",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@vibe/core": {
+ "version": "3.88.6",
+ "resolved": "https://registry.npmjs.org/@vibe/core/-/core-3.88.6.tgz",
+ "integrity": "sha512-dLF2J0vftejo0z2HCmyGiorQtO52qU/XZczNbwZR96y18fiANdhb5pXWMHqA9NPaSzLVOLmUKxJ4ksfvceJmHg==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/react-dom": "^2.1.2",
+ "@popperjs/core": "2.11.6",
+ "@vibe/base": "3.0.5",
+ "@vibe/button": "3.0.16",
+ "@vibe/clickable": "3.0.3",
+ "@vibe/dialog": "3.0.13",
+ "@vibe/hooks": "3.0.3",
+ "@vibe/icon": "3.0.11",
+ "@vibe/icon-button": "3.0.7",
+ "@vibe/icons": "1.16.0",
+ "@vibe/layer": "3.0.10",
+ "@vibe/layout": "3.0.3",
+ "@vibe/loader": "3.0.11",
+ "@vibe/shared": "3.0.8",
+ "@vibe/tooltip": "3.0.7",
+ "@vibe/typography": "3.0.7",
+ "a11y-dialog": "^7.5.2",
+ "body-scroll-lock": "^4.0.0-beta.0",
+ "browserslist-config-monday": "1.0.6",
+ "classnames": "^2.3.2",
+ "date-fns": "^2.30.0",
+ "downshift": "^9.0.8",
+ "es-toolkit": "^1.39.10",
+ "framer-motion": "^6.5.1",
+ "monday-ui-style": "0.26.2",
+ "react-dates": "21.8.0",
+ "react-day-picker": "^8.8.0",
+ "react-focus-lock": "^2.13.2",
+ "react-inlinesvg": "^4.1.3",
+ "react-is": "^16.9.0",
+ "react-popper": "^2.3.0",
+ "react-remove-scroll": "^2.6.0",
+ "react-select": "npm:react-select-module@3.4.0",
+ "react-transition-group": "^4.4.5",
+ "react-virtualized-auto-sizer": "^1.0.7",
+ "react-window": "^1.8.7",
+ "react-windowed-select": "^2.0.4",
+ "style-inject": "^0.3.0"
+ },
+ "peerDependencies": {
+ "moment": "^2.29.1",
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@vibe/core/node_modules/monday-ui-style": {
+ "version": "0.26.2",
+ "resolved": "https://registry.npmjs.org/monday-ui-style/-/monday-ui-style-0.26.2.tgz",
+ "integrity": "sha512-LZxjT+eqppL/m/hvxPfGdiFZ5xbv31rFkwItfuVHup8Xw3axTNgsvewDJg/Ahs0G7qcO9T7ucMIk7B440HtUJg==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss": "8.4.31",
+ "postcss-scss": "^4.0.9",
+ "postcss-value-parser": "4.2.0",
+ "stylelint": "^14.16.1"
+ },
+ "peerDependencies": {
+ "stylelint": "^14.1.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@vibe/dialog": {
+ "version": "3.0.13",
+ "resolved": "https://registry.npmjs.org/@vibe/dialog/-/dialog-3.0.13.tgz",
+ "integrity": "sha512-orI9IumQZcAWMu7uqZ2QcXsTFs5WlaaSkbhPk98+VC7DNbUP5QJyLIaX+Jf+aInCqmpN6r1IIZdDNH85Im5tlg==",
+ "license": "MIT",
+ "dependencies": {
+ "@popperjs/core": "2.11.6",
+ "@vibe/hooks": "3.0.3",
+ "@vibe/layer": "3.0.10",
+ "@vibe/shared": "3.0.8",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10",
+ "react-popper": "^2.3.0",
+ "react-transition-group": "^4.4.5"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@vibe/hooks": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@vibe/hooks/-/hooks-3.0.3.tgz",
+ "integrity": "sha512-74iEe2qLdjm3enpstGtewFkrKxNACvPMtIAxgUiBZ9T28cYu5mjbtH+Lp2Gv/kNMMv3x/V3RWcn7uqjLjyKBbQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/shared": "3.0.8",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@vibe/icon": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/@vibe/icon/-/icon-3.0.11.tgz",
+ "integrity": "sha512-4xdj++K+2e7Wy7mSeTS6aLK0rjZpwIuZZoFv6X/lE5PxR7JkA1IRiaHUyCSE9CS9W0TDGEAzN923YuFjU0ghsA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/shared": "3.0.8",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10",
+ "react-inlinesvg": "^4.1.3"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@vibe/icon-button": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@vibe/icon-button/-/icon-button-3.0.7.tgz",
+ "integrity": "sha512-oy29sjexjaxF8f7ZzDhFbQFhyF0pkXx/KvuLooyNtgokQ27A99uGxjnHBivv6m9lXRNCKvtt6PrTL8UXUYBRJw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/button": "3.0.16",
+ "@vibe/icon": "3.0.11",
+ "@vibe/icons": "1.16.0",
+ "@vibe/shared": "3.0.8",
+ "@vibe/tooltip": "3.0.7",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@vibe/icons": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/@vibe/icons/-/icons-1.16.0.tgz",
+ "integrity": "sha512-/ljaos2zNr4NfZKLoAjOfEilWUlmvBwqh9fFN+Z1BdYW84oGZQGRdj4TJW5jyirZyJ/H6jTcutKUbJaD3Om7+w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@vibe/layer": {
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/@vibe/layer/-/layer-3.0.10.tgz",
+ "integrity": "sha512-UChefl8dxp4SLadYcItRMc49AS8PEakDv05KBNxzej2vybignt0sqI98+CurC6lr+0dNRlf8x58+Gae9wy5ybQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/icon": "3.0.11",
+ "@vibe/loader": "3.0.11",
+ "@vibe/shared": "3.0.8",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@vibe/layout": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@vibe/layout/-/layout-3.0.3.tgz",
+ "integrity": "sha512-9SGVKKl4IJqsqg7Yuy9aQHtqGG/wPs/7ZCK2g3Fp8ot0/yc3EjWgBQh0uP+wOVHyRaRUPfI4CdkCsVmdGJ4YFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/clickable": "3.0.3",
+ "@vibe/shared": "3.0.8",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@vibe/loader": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/@vibe/loader/-/loader-3.0.11.tgz",
+ "integrity": "sha512-F1Yn9ti0yaD08VYt0pfubfyE1yRsG8GZA41TR+0erVr/XnVlf6NA8+07pU85N06rQnp89slxlMy8Yf4AevkWDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/shared": "3.0.8",
+ "classnames": "^2.5.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@vibe/shared": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/@vibe/shared/-/shared-3.0.8.tgz",
+ "integrity": "sha512-qjWaNylbVKbdaDi75jFpp+LmF3y74JYdaLNWf6noiMkhq0fhcPTietVrHBxYO2b0cBvm1sQbrytX5YiBk3ii2w==",
+ "license": "MIT",
+ "dependencies": {
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "vitest": ">=1.6.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@vibe/tooltip": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@vibe/tooltip/-/tooltip-3.0.7.tgz",
+ "integrity": "sha512-4VYMSFerqZ+4Q1Sta86cN09vNUHhUcO2FBk1U94LaFctKWMc16iLv6XJwWHjQHp8zZMGkHi43/NwD2jYNiub8g==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/dialog": "3.0.13",
+ "@vibe/icon": "3.0.11",
+ "@vibe/layout": "3.0.3",
+ "@vibe/shared": "3.0.8",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@vibe/typography": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@vibe/typography/-/typography-3.0.7.tgz",
+ "integrity": "sha512-ezzzs9/CKM2/gadwBc33O7A8Ru9FMOjP6kpNT6QrpNebCBSKM1uBqECJ20I5/jmCDSPyvnRAjFFvItOHdFLnCw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/hooks": "3.0.3",
+ "@vibe/shared": "3.0.8",
+ "@vibe/tooltip": "3.0.7",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10",
+ "monday-ui-style": "0.26.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/@vibe/typography/node_modules/monday-ui-style": {
+ "version": "0.26.2",
+ "resolved": "https://registry.npmjs.org/monday-ui-style/-/monday-ui-style-0.26.2.tgz",
+ "integrity": "sha512-LZxjT+eqppL/m/hvxPfGdiFZ5xbv31rFkwItfuVHup8Xw3axTNgsvewDJg/Ahs0G7qcO9T7ucMIk7B440HtUJg==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss": "8.4.31",
+ "postcss-scss": "^4.0.9",
+ "postcss-value-parser": "4.2.0",
+ "stylelint": "^14.16.1"
+ },
+ "peerDependencies": {
+ "stylelint": "^14.1.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/airbnb-prop-types": {
+ "version": "2.16.0",
+ "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz",
+ "integrity": "sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==",
+ "deprecated": "This package has been renamed to 'prop-types-tools'",
+ "license": "MIT",
+ "dependencies": {
+ "array.prototype.find": "^2.1.1",
+ "function.prototype.name": "^1.1.2",
+ "is-regex": "^1.1.0",
+ "object-is": "^1.1.2",
+ "object.assign": "^4.1.0",
+ "object.entries": "^1.1.2",
+ "prop-types": "^15.7.2",
+ "prop-types-exact": "^1.2.0",
+ "react-is": "^16.13.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ },
+ "peerDependencies": {
+ "react": "^0.14 || ^15.0.0 || ^16.0.0-alpha"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/deepmerge": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz",
+ "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/emoji-mart": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/emoji-mart/-/emoji-mart-3.0.1.tgz",
+ "integrity": "sha512-sxpmMKxqLvcscu6mFn9ITHeZNkGzIvD0BSNFE/LJESPbCA8s1jM6bCDPjWbV31xHq7JXaxgpHxLB54RCbBZSlg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/runtime": "^7.0.0",
+ "prop-types": "^15.6.0"
+ },
+ "peerDependencies": {
+ "react": "^0.14.0 || ^15.0.0-0 || ^16.0.0 || ^17.0.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/lodash-es": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
+ "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
+ "license": "MIT"
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/react": {
+ "version": "16.14.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz",
+ "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/react-compiler-runtime": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/react-compiler-runtime/-/react-compiler-runtime-1.0.0.tgz",
+ "integrity": "sha512-rRfjYv66HlG8896yPUDONgKzG5BxZD1nV9U6rkm+7VCuvQc903C4MjcoZR4zPw53IKSOX9wMQVpA1IAbRtzQ7w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^0.0.0-experimental"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/react-dates": {
+ "version": "21.8.0",
+ "resolved": "https://registry.npmjs.org/react-dates/-/react-dates-21.8.0.tgz",
+ "integrity": "sha512-PPriGqi30CtzZmoHiGdhlA++YPYPYGCZrhydYmXXQ6RAvAsaONcPtYgXRTLozIOrsQ5mSo40+DiA5eOFHnZ6xw==",
+ "license": "MIT",
+ "dependencies": {
+ "airbnb-prop-types": "^2.15.0",
+ "consolidated-events": "^1.1.1 || ^2.0.0",
+ "enzyme-shallow-equal": "^1.0.0",
+ "is-touch-device": "^1.0.1",
+ "lodash": "^4.1.1",
+ "object.assign": "^4.1.0",
+ "object.values": "^1.1.0",
+ "prop-types": "^15.7.2",
+ "raf": "^3.4.1",
+ "react-moment-proptypes": "^1.6.0",
+ "react-outside-click-handler": "^1.2.4",
+ "react-portal": "^4.2.0",
+ "react-with-direction": "^1.3.1",
+ "react-with-styles": "^4.1.0",
+ "react-with-styles-interface-css": "^6.0.0"
+ },
+ "peerDependencies": {
+ "@babel/runtime": "^7.0.0",
+ "moment": "^2.18.1",
+ "react": "^0.14 || ^15.5.4 || ^16.1.1",
+ "react-dom": "^0.14 || ^15.5.4 || ^16.1.1",
+ "react-with-direction": "^1.3.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/react-dom": {
+ "version": "16.14.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz",
+ "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2",
+ "scheduler": "^0.19.1"
+ },
+ "peerDependencies": {
+ "react": "^16.14.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/react-error-boundary": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz",
+ "integrity": "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5"
+ },
+ "engines": {
+ "node": ">=10",
+ "npm": ">=6"
+ },
+ "peerDependencies": {
+ "react": ">=16.13.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/react-input-autosize": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-3.0.0.tgz",
+ "integrity": "sha512-nL9uS7jEs/zu8sqwFE5MAPx6pPkNAriACQ2rGLlqmKr2sPGtN7TXTyDdQt4lbNXVx7Uzadb40x8qotIuru6Rhg==",
+ "license": "MIT",
+ "dependencies": {
+ "prop-types": "^15.5.8"
+ },
+ "peerDependencies": {
+ "react": "^16.3.0 || ^17.0.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/react-quill": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/react-quill/-/react-quill-1.3.5.tgz",
+ "integrity": "sha512-/W/rNCW+6QpGz8yQ9tFK5Ka/h/No1RqrcOOvCIOR092OiKzRFlU2xbPEwiP3Wgy/Dx13pi1YhjReDMX/5uotJg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/quill": "1.3.10",
+ "create-react-class": "^15.6.0",
+ "lodash": "^4.17.4",
+ "prop-types": "^15.5.10",
+ "quill": "^1.3.7",
+ "react-dom-factories": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8.x"
+ },
+ "peerDependencies": {
+ "react": "^0.14.9 || ^15.3.0 || ^16.0.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/react-select": {
+ "name": "react-select-module",
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/react-select-module/-/react-select-module-3.4.0.tgz",
+ "integrity": "sha512-d9swlWWqqQyrZPfako6aKFK/kdLY9m4TQMIdhuD387VVAqB3+0zEKGb0ANQWsNNobo5ga46SltQzXuklxUvteA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.4.4",
+ "@emotion/cache": "^10.0.9",
+ "@emotion/core": "^10.0.9",
+ "@emotion/css": "^10.0.9",
+ "memoize-one": "^5.0.0",
+ "prop-types": "^15.6.0",
+ "react-input-autosize": "^3.0.0",
+ "react-transition-group": "^4.3.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/react-windowed-select": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/react-windowed-select/-/react-windowed-select-2.0.5.tgz",
+ "integrity": "sha512-HIpl3jl7fjxAFAn9RgY7JMw240Gj1Spookx656zyG7cYucYtCK4RLqv1celqdGHcXTCy5R3IFVoDcVasF2YNDg==",
+ "license": "MIT",
+ "dependencies": {
+ "react-select": "3.1.0",
+ "react-window": "1.8.5"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0",
+ "react-dom": "^16.8.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/react-windowed-select/node_modules/react-input-autosize": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.2.2.tgz",
+ "integrity": "sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw==",
+ "license": "MIT",
+ "dependencies": {
+ "prop-types": "^15.5.8"
+ },
+ "peerDependencies": {
+ "react": "^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/react-windowed-select/node_modules/react-select": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/react-select/-/react-select-3.1.0.tgz",
+ "integrity": "sha512-wBFVblBH1iuCBprtpyGtd1dGMadsG36W5/t2Aj8OE6WbByDg5jIFyT7X5gT+l0qmT5TqWhxX+VsKJvCEl2uL9g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.4.4",
+ "@emotion/cache": "^10.0.9",
+ "@emotion/core": "^10.0.9",
+ "@emotion/css": "^10.0.9",
+ "memoize-one": "^5.0.0",
+ "prop-types": "^15.6.0",
+ "react-input-autosize": "^2.2.2",
+ "react-transition-group": "^4.3.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0",
+ "react-dom": "^16.8.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/react-windowed-select/node_modules/react-window": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.5.tgz",
+ "integrity": "sha512-HeTwlNa37AFa8MDZFZOKcNEkuF2YflA0hpGPiTT9vR7OawEt+GZbfM6wqkBahD3D3pUjIabQYzsnY/BSJbgq6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.0.0",
+ "memoize-one": ">=3.1.1 <6"
+ },
+ "engines": {
+ "node": ">8.0.0"
+ },
+ "peerDependencies": {
+ "react": "^15.0.0 || ^16.0.0",
+ "react-dom": "^15.0.0 || ^16.0.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/react-with-direction": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/react-with-direction/-/react-with-direction-1.4.0.tgz",
+ "integrity": "sha512-ybHNPiAmaJpoWwugwqry9Hd1Irl2hnNXlo/2SXQBwbLn/jGMauMS2y9jw+ydyX5V9ICryCqObNSthNt5R94xpg==",
+ "license": "MIT",
+ "dependencies": {
+ "airbnb-prop-types": "^2.16.0",
+ "brcast": "^2.0.2",
+ "deepmerge": "^1.5.2",
+ "direction": "^1.0.4",
+ "hoist-non-react-statics": "^3.3.2",
+ "object.assign": "^4.1.2",
+ "object.values": "^1.1.5",
+ "prop-types": "^15.7.2"
+ },
+ "peerDependencies": {
+ "react": "^0.14 || ^15 || ^16",
+ "react-dom": "^0.14 || ^15 || ^16"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/rollup": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.2.tgz",
+ "integrity": "sha512-PVoapzTwSEcelaWGth3uR66u7ZRo6qhPHc0f2uRO9fX6XDVNrIiGYS0Pj9+R8yIIYSD/mCx2b16Ws9itljKSPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.8"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.44.2",
+ "@rollup/rollup-android-arm64": "4.44.2",
+ "@rollup/rollup-darwin-arm64": "4.44.2",
+ "@rollup/rollup-darwin-x64": "4.44.2",
+ "@rollup/rollup-freebsd-arm64": "4.44.2",
+ "@rollup/rollup-freebsd-x64": "4.44.2",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.44.2",
+ "@rollup/rollup-linux-arm-musleabihf": "4.44.2",
+ "@rollup/rollup-linux-arm64-gnu": "4.44.2",
+ "@rollup/rollup-linux-arm64-musl": "4.44.2",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.44.2",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.44.2",
+ "@rollup/rollup-linux-riscv64-gnu": "4.44.2",
+ "@rollup/rollup-linux-riscv64-musl": "4.44.2",
+ "@rollup/rollup-linux-s390x-gnu": "4.44.2",
+ "@rollup/rollup-linux-x64-gnu": "4.44.2",
+ "@rollup/rollup-linux-x64-musl": "4.44.2",
+ "@rollup/rollup-win32-arm64-msvc": "4.44.2",
+ "@rollup/rollup-win32-ia32-msvc": "4.44.2",
+ "@rollup/rollup-win32-x64-msvc": "4.44.2",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/scheduler": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz",
+ "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/strict-uri-encode": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
+ "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/use-sync-external-store": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
+ "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/uuid": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
+ "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-client/node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-core": {
+ "version": "0.0.49",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/vulcan-core/-/vulcan-core-0.0.49.tgz",
+ "integrity": "sha512-WmNIhHPNN5WP/kq+2wt4mU/rB+NPuEiOEsVRwyajodTUBudri0uq7fYBG5lxRBHfUJzkBtG9R19c4TnJjtwvZw==",
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "dependencies": {
+ "reselect": "^5.1.1",
+ "uuid": "^10.0.0",
+ "zustand": "4.5.2"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-core/node_modules/use-sync-external-store": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
+ "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
+ "license": "MIT",
+ "peer": true,
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-core/node_modules/uuid": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
+ "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-core/node_modules/zustand": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.2.tgz",
+ "integrity": "sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "use-sync-external-store": "1.2.0"
+ },
+ "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/@mondaydotcomorg/vulcan-services": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/vulcan-services/-/vulcan-services-0.1.4.tgz",
+ "integrity": "sha512-uDguqxSNgpH8D9W34Qx1ZTw16/+g0BYYz8Ox8UYsmcOSiaQajKh/qVWysx9KgHwVwkhAeXugz4ocSawcE9f2YQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@mondaydotcomorg/client-http-request": "^2.1.6"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-store-setup": {
+ "version": "0.0.62",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/vulcan-store-setup/-/vulcan-store-setup-0.0.62.tgz",
+ "integrity": "sha512-Uk3A/9ZhK777w+j7G0CsU6Ub9K1FpDI1wbSyBeDvnTXbgTCh/PeQkR7MnqW7Cmo918QSkf8lX3GPAOinY/lHEA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@rollup/plugin-commonjs": "^28.0.3",
+ "@rollup/plugin-json": "^6.1.0",
+ "@rollup/plugin-node-resolve": "^16.0.1",
+ "@rollup/plugin-replace": "^6.0.2",
+ "@rollup/plugin-typescript": "^12.1.2",
+ "concurrently": "^9.1.2",
+ "dts-bundle-generator": "^9.5.1",
+ "ejs": "^3.1.10",
+ "fs-extra": "^11.3.0",
+ "rollup": "4.44.2",
+ "rollup-plugin-preserve-shebangs": "^0.2.0",
+ "tsc-alias": "1.8.15"
+ },
+ "bin": {
+ "vulcan-client-release": "dist/plugin/release-client.js"
+ },
+ "peerDependencies": {
+ "@mondaydotcomorg/vulcan-core": "^0.0.49"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-store-setup/node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.2.tgz",
+ "integrity": "sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-store-setup/node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.2.tgz",
+ "integrity": "sha512-Yt5MKrOosSbSaAK5Y4J+vSiID57sOvpBNBR6K7xAaQvk3MkcNVV0f9fE20T+41WYN8hDn6SGFlFrKudtx4EoxA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-store-setup/node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.2.tgz",
+ "integrity": "sha512-EsnFot9ZieM35YNA26nhbLTJBHD0jTwWpPwmRVDzjylQT6gkar+zenfb8mHxWpRrbn+WytRRjE0WKsfaxBkVUA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-store-setup/node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.2.tgz",
+ "integrity": "sha512-dv/t1t1RkCvJdWWxQ2lWOO+b7cMsVw5YFaS04oHpZRWehI1h0fV1gF4wgGCTyQHHjJDfbNpwOi6PXEafRBBezw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-store-setup/node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.2.tgz",
+ "integrity": "sha512-W4tt4BLorKND4qeHElxDoim0+BsprFTwb+vriVQnFFtT/P6v/xO5I99xvYnVzKWrK6j7Hb0yp3x7V5LUbaeOMg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-store-setup/node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.2.tgz",
+ "integrity": "sha512-tdT1PHopokkuBVyHjvYehnIe20fxibxFCEhQP/96MDSOcyjM/shlTkZZLOufV3qO6/FQOSiJTBebhVc12JyPTA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-store-setup/node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.2.tgz",
+ "integrity": "sha512-+xmiDGGaSfIIOXMzkhJ++Oa0Gwvl9oXUeIiwarsdRXSe27HUIvjbSIpPxvnNsRebsNdUo7uAiQVgBD1hVriwSQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-store-setup/node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.2.tgz",
+ "integrity": "sha512-bDHvhzOfORk3wt8yxIra8N4k/N0MnKInCW5OGZaeDYa/hMrdPaJzo7CSkjKZqX4JFUWjUGm88lI6QJLCM7lDrA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-store-setup/node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.2.tgz",
+ "integrity": "sha512-NMsDEsDiYghTbeZWEGnNi4F0hSbGnsuOG+VnNvxkKg0IGDvFh7UVpM/14mnMwxRxUf9AdAVJgHPvKXf6FpMB7A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-store-setup/node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.2.tgz",
+ "integrity": "sha512-lb5bxXnxXglVq+7imxykIp5xMq+idehfl+wOgiiix0191av84OqbjUED+PRC5OA8eFJYj5xAGcpAZ0pF2MnW+A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-store-setup/node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.2.tgz",
+ "integrity": "sha512-iYtAqBg5eEMG4dEfVlkqo05xMOk6y/JXIToRca2bAWuqjrJYJlx/I7+Z+4hSrsWU8GdJDFPL4ktV3dy4yBSrzg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-store-setup/node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.2.tgz",
+ "integrity": "sha512-e6vEbgaaqz2yEHqtkPXa28fFuBGmUJ0N2dOJK8YUfijejInt9gfCSA7YDdJ4nYlv67JfP3+PSWFX4IVw/xRIPg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-store-setup/node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.2.tgz",
+ "integrity": "sha512-evFOtkmVdY3udE+0QKrV5wBx7bKI0iHz5yEVx5WqDJkxp9YQefy4Mpx3RajIVcM6o7jxTvVd/qpC1IXUhGc1Mw==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-store-setup/node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.2.tgz",
+ "integrity": "sha512-/bXb0bEsWMyEkIsUL2Yt5nFB5naLAwyOWMEviQfQY1x3l5WsLKgvZf66TM7UTfED6erckUVUJQ/jJ1FSpm3pRQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-store-setup/node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.2.tgz",
+ "integrity": "sha512-3D3OB1vSSBXmkGEZR27uiMRNiwN08/RVAcBKwhUYPaiZ8bcvdeEwWPvbnXvvXHY+A/7xluzcN+kaiOFNiOZwWg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-store-setup/node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.2.tgz",
+ "integrity": "sha512-VfU0fsMK+rwdK8mwODqYeM2hDrF2WiHaSmCBrS7gColkQft95/8tphyzv2EupVxn3iE0FI78wzffoULH1G+dkw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-store-setup/node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.2.tgz",
+ "integrity": "sha512-+qMUrkbUurpE6DVRjiJCNGZBGo9xM4Y0FXU5cjgudWqIBWbcLkjE3XprJUsOFgC6xjBClwVa9k6O3A7K3vxb5Q==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-store-setup/node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.2.tgz",
+ "integrity": "sha512-3+QZROYfJ25PDcxFF66UEk8jGWigHJeecZILvkPkyQN7oc5BvFo4YEXFkOs154j3FTMp9mn9Ky8RCOwastduEA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-store-setup/node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "license": "MIT"
+ },
+ "node_modules/@mondaydotcomorg/vulcan-store-setup/node_modules/rollup": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.2.tgz",
+ "integrity": "sha512-PVoapzTwSEcelaWGth3uR66u7ZRo6qhPHc0f2uRO9fX6XDVNrIiGYS0Pj9+R8yIIYSD/mCx2b16Ws9itljKSPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.8"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.44.2",
+ "@rollup/rollup-android-arm64": "4.44.2",
+ "@rollup/rollup-darwin-arm64": "4.44.2",
+ "@rollup/rollup-darwin-x64": "4.44.2",
+ "@rollup/rollup-freebsd-arm64": "4.44.2",
+ "@rollup/rollup-freebsd-x64": "4.44.2",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.44.2",
+ "@rollup/rollup-linux-arm-musleabihf": "4.44.2",
+ "@rollup/rollup-linux-arm64-gnu": "4.44.2",
+ "@rollup/rollup-linux-arm64-musl": "4.44.2",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.44.2",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.44.2",
+ "@rollup/rollup-linux-riscv64-gnu": "4.44.2",
+ "@rollup/rollup-linux-riscv64-musl": "4.44.2",
+ "@rollup/rollup-linux-s390x-gnu": "4.44.2",
+ "@rollup/rollup-linux-x64-gnu": "4.44.2",
+ "@rollup/rollup-linux-x64-musl": "4.44.2",
+ "@rollup/rollup-win32-arm64-msvc": "4.44.2",
+ "@rollup/rollup-win32-ia32-msvc": "4.44.2",
+ "@rollup/rollup-win32-x64-msvc": "4.44.2",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils": {
+ "version": "0.0.125",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/vulcan-testkit-utils/-/vulcan-testkit-utils-0.0.125.tgz",
+ "integrity": "sha512-/PE4nWJ64dzHDqjmRCO/CXz8xhdG8mA2WBbTdStbt5zI3n7NrDq8wP0U9tmPIIvi7A5gPbonsmDkjdpGpGfQMQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@mondaydotcomorg/monday-shared-mocks": "1.11.2",
+ "@mondaydotcomorg/vulcan-core": "0.1.17",
+ "@mondaydotcomorg/vulcan-services": "0.1.4",
+ "@mondaydotcomorg/vulcan-store-setup": "0.1.1",
+ "jest-mock": "^29.6.4",
+ "node-fetch": "2.6.7"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/@mondaydotcomorg/client-events-frame-tracker": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/client-events-frame-tracker/-/client-events-frame-tracker-0.0.5.tgz",
+ "integrity": "sha512-aufYm0CsrfxwdvrdO/WDSqkJAnQMFh1pFRHmRuasU313SIUVa0153RyPeIgPmOMZBQgU4Mnvgond9oNWI+TUig==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/@mondaydotcomorg/vulcan-core": {
+ "version": "0.1.17",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/vulcan-core/-/vulcan-core-0.1.17.tgz",
+ "integrity": "sha512-Qkfo/VcrLTFqOxFj//mAKorlaCwDwjc1I+VWn+J3LLgPKXNaprG0UzQayTMAUQiSoZOqEZDftYmzzVHLbSeoKQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@mondaydotcomorg/client-events-frame-tracker": "^0.0.5",
+ "@mondaydotcomorg/ignite-client-sdk": "^1.1.4",
+ "bowser": "^2.11.0",
+ "lodash-es": "^4.17.21",
+ "reselect": "^5.1.1",
+ "uuid": "^10.0.0",
+ "zustand": "4.5.2"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/@mondaydotcomorg/vulcan-store-setup": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@mondaydotcomorg/vulcan-store-setup/-/vulcan-store-setup-0.1.1.tgz",
+ "integrity": "sha512-e3Hvt9b9OjUPyt0fuQRf7Lq31+EC48dDeyMa5sbz0SR7qg7ukEi7lRUSGTDxKbmezi7TydOQlWgysZjiUTBiyA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@rollup/plugin-commonjs": "^28.0.3",
+ "@rollup/plugin-json": "^6.1.0",
+ "@rollup/plugin-node-resolve": "^16.0.1",
+ "@rollup/plugin-replace": "^6.0.2",
+ "@rollup/plugin-typescript": "^12.1.2",
+ "@types/semver": "^7.5.8",
+ "concurrently": "^9.1.2",
+ "dts-bundle-generator": "^9.5.1",
+ "ejs": "^3.1.10",
+ "fs-extra": "^11.3.0",
+ "rollup": "4.44.2",
+ "rollup-plugin-preserve-shebangs": "^0.2.0",
+ "semver": "^7.6.0",
+ "tsc-alias": "1.8.15"
+ },
+ "bin": {
+ "vulcan-client-release": "dist/plugin/release-client.js"
+ },
+ "peerDependencies": {
+ "@mondaydotcomorg/vulcan-core": "^0.0.49"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.2.tgz",
+ "integrity": "sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.2.tgz",
+ "integrity": "sha512-Yt5MKrOosSbSaAK5Y4J+vSiID57sOvpBNBR6K7xAaQvk3MkcNVV0f9fE20T+41WYN8hDn6SGFlFrKudtx4EoxA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.2.tgz",
+ "integrity": "sha512-EsnFot9ZieM35YNA26nhbLTJBHD0jTwWpPwmRVDzjylQT6gkar+zenfb8mHxWpRrbn+WytRRjE0WKsfaxBkVUA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.2.tgz",
+ "integrity": "sha512-dv/t1t1RkCvJdWWxQ2lWOO+b7cMsVw5YFaS04oHpZRWehI1h0fV1gF4wgGCTyQHHjJDfbNpwOi6PXEafRBBezw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.2.tgz",
+ "integrity": "sha512-W4tt4BLorKND4qeHElxDoim0+BsprFTwb+vriVQnFFtT/P6v/xO5I99xvYnVzKWrK6j7Hb0yp3x7V5LUbaeOMg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.2.tgz",
+ "integrity": "sha512-tdT1PHopokkuBVyHjvYehnIe20fxibxFCEhQP/96MDSOcyjM/shlTkZZLOufV3qO6/FQOSiJTBebhVc12JyPTA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.2.tgz",
+ "integrity": "sha512-+xmiDGGaSfIIOXMzkhJ++Oa0Gwvl9oXUeIiwarsdRXSe27HUIvjbSIpPxvnNsRebsNdUo7uAiQVgBD1hVriwSQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.2.tgz",
+ "integrity": "sha512-bDHvhzOfORk3wt8yxIra8N4k/N0MnKInCW5OGZaeDYa/hMrdPaJzo7CSkjKZqX4JFUWjUGm88lI6QJLCM7lDrA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.2.tgz",
+ "integrity": "sha512-NMsDEsDiYghTbeZWEGnNi4F0hSbGnsuOG+VnNvxkKg0IGDvFh7UVpM/14mnMwxRxUf9AdAVJgHPvKXf6FpMB7A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.2.tgz",
+ "integrity": "sha512-lb5bxXnxXglVq+7imxykIp5xMq+idehfl+wOgiiix0191av84OqbjUED+PRC5OA8eFJYj5xAGcpAZ0pF2MnW+A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.2.tgz",
+ "integrity": "sha512-iYtAqBg5eEMG4dEfVlkqo05xMOk6y/JXIToRca2bAWuqjrJYJlx/I7+Z+4hSrsWU8GdJDFPL4ktV3dy4yBSrzg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.2.tgz",
+ "integrity": "sha512-e6vEbgaaqz2yEHqtkPXa28fFuBGmUJ0N2dOJK8YUfijejInt9gfCSA7YDdJ4nYlv67JfP3+PSWFX4IVw/xRIPg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.2.tgz",
+ "integrity": "sha512-evFOtkmVdY3udE+0QKrV5wBx7bKI0iHz5yEVx5WqDJkxp9YQefy4Mpx3RajIVcM6o7jxTvVd/qpC1IXUhGc1Mw==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.2.tgz",
+ "integrity": "sha512-/bXb0bEsWMyEkIsUL2Yt5nFB5naLAwyOWMEviQfQY1x3l5WsLKgvZf66TM7UTfED6erckUVUJQ/jJ1FSpm3pRQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.2.tgz",
+ "integrity": "sha512-3D3OB1vSSBXmkGEZR27uiMRNiwN08/RVAcBKwhUYPaiZ8bcvdeEwWPvbnXvvXHY+A/7xluzcN+kaiOFNiOZwWg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.2.tgz",
+ "integrity": "sha512-VfU0fsMK+rwdK8mwODqYeM2hDrF2WiHaSmCBrS7gColkQft95/8tphyzv2EupVxn3iE0FI78wzffoULH1G+dkw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.2.tgz",
+ "integrity": "sha512-+qMUrkbUurpE6DVRjiJCNGZBGo9xM4Y0FXU5cjgudWqIBWbcLkjE3XprJUsOFgC6xjBClwVa9k6O3A7K3vxb5Q==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.2.tgz",
+ "integrity": "sha512-3+QZROYfJ25PDcxFF66UEk8jGWigHJeecZILvkPkyQN7oc5BvFo4YEXFkOs154j3FTMp9mn9Ky8RCOwastduEA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "license": "MIT"
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/rollup": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.2.tgz",
+ "integrity": "sha512-PVoapzTwSEcelaWGth3uR66u7ZRo6qhPHc0f2uRO9fX6XDVNrIiGYS0Pj9+R8yIIYSD/mCx2b16Ws9itljKSPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.8"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.44.2",
+ "@rollup/rollup-android-arm64": "4.44.2",
+ "@rollup/rollup-darwin-arm64": "4.44.2",
+ "@rollup/rollup-darwin-x64": "4.44.2",
+ "@rollup/rollup-freebsd-arm64": "4.44.2",
+ "@rollup/rollup-freebsd-x64": "4.44.2",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.44.2",
+ "@rollup/rollup-linux-arm-musleabihf": "4.44.2",
+ "@rollup/rollup-linux-arm64-gnu": "4.44.2",
+ "@rollup/rollup-linux-arm64-musl": "4.44.2",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.44.2",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.44.2",
+ "@rollup/rollup-linux-riscv64-gnu": "4.44.2",
+ "@rollup/rollup-linux-riscv64-musl": "4.44.2",
+ "@rollup/rollup-linux-s390x-gnu": "4.44.2",
+ "@rollup/rollup-linux-x64-gnu": "4.44.2",
+ "@rollup/rollup-linux-x64-musl": "4.44.2",
+ "@rollup/rollup-win32-arm64-msvc": "4.44.2",
+ "@rollup/rollup-win32-ia32-msvc": "4.44.2",
+ "@rollup/rollup-win32-x64-msvc": "4.44.2",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/use-sync-external-store": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
+ "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/uuid": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
+ "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/@mondaydotcomorg/vulcan-testkit-utils/node_modules/zustand": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.2.tgz",
+ "integrity": "sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==",
+ "license": "MIT",
+ "dependencies": {
+ "use-sync-external-store": "1.2.0"
+ },
+ "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/@motionone/animation": {
+ "version": "10.18.0",
+ "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.18.0.tgz",
+ "integrity": "sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==",
+ "license": "MIT",
+ "dependencies": {
+ "@motionone/easing": "^10.18.0",
+ "@motionone/types": "^10.17.1",
+ "@motionone/utils": "^10.18.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@motionone/dom": {
+ "version": "10.12.0",
+ "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.12.0.tgz",
+ "integrity": "sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw==",
+ "license": "MIT",
+ "dependencies": {
+ "@motionone/animation": "^10.12.0",
+ "@motionone/generators": "^10.12.0",
+ "@motionone/types": "^10.12.0",
+ "@motionone/utils": "^10.12.0",
+ "hey-listen": "^1.0.8",
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@motionone/easing": {
+ "version": "10.18.0",
+ "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.18.0.tgz",
+ "integrity": "sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==",
+ "license": "MIT",
+ "dependencies": {
+ "@motionone/utils": "^10.18.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@motionone/generators": {
+ "version": "10.18.0",
+ "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.18.0.tgz",
+ "integrity": "sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==",
+ "license": "MIT",
+ "dependencies": {
+ "@motionone/types": "^10.17.1",
+ "@motionone/utils": "^10.18.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@motionone/types": {
+ "version": "10.17.1",
+ "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.17.1.tgz",
+ "integrity": "sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==",
+ "license": "MIT"
+ },
+ "node_modules/@motionone/utils": {
+ "version": "10.18.0",
+ "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.18.0.tgz",
+ "integrity": "sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==",
+ "license": "MIT",
+ "dependencies": {
+ "@motionone/types": "^10.17.1",
+ "hey-listen": "^1.0.8",
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@mswjs/cookies": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/@mswjs/cookies/-/cookies-0.1.7.tgz",
+ "integrity": "sha512-bDg1ReMBx+PYDB4Pk7y1Q07Zz1iKIEUWQpkEXiA2lEWg9gvOZ8UBmGXilCEUvyYoRFlmr/9iXTRR69TrgSwX/Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/set-cookie-parser": "^2.4.0",
+ "set-cookie-parser": "^2.4.6"
+ }
+ },
+ "node_modules/@mswjs/interceptors": {
+ "version": "0.12.7",
+ "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.12.7.tgz",
+ "integrity": "sha512-eGjZ3JRAt0Fzi5FgXiV/P3bJGj0NqsN7vBS0J0FO2AQRQ0jCKQS4lEFm4wvlSgKQNfeuc/Vz6d81VtU3Gkx/zg==",
+ "license": "MIT",
+ "dependencies": {
+ "@open-draft/until": "^1.0.3",
+ "@xmldom/xmldom": "^0.7.2",
+ "debug": "^4.3.2",
+ "headers-utils": "^3.0.2",
+ "outvariant": "^1.2.0",
+ "strict-event-emitter": "^0.2.0"
+ }
+ },
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz",
+ "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@tybys/wasm-util": "^0.10.3"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ },
+ "peerDependencies": {
+ "@emnapi/core": "^1.7.1",
+ "@emnapi/runtime": "^1.7.1"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@open-draft/deferred-promise": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-3.0.0.tgz",
+ "integrity": "sha512-XW375UK8/9SqUVNVa6M0yEy8+iTi4QN5VZ7aZuRFQmy76LRwI9wy5F4YIBU6T+eTe2/DNDo8tqu8RHlwLHM6RA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/@open-draft/logger": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz",
+ "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "is-node-process": "^1.2.0",
+ "outvariant": "^1.4.0"
+ }
+ },
+ "node_modules/@open-draft/until": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-1.0.3.tgz",
+ "integrity": "sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q==",
+ "license": "MIT"
+ },
+ "node_modules/@oxc-project/types": {
+ "version": "0.139.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz",
+ "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ }
+ },
+ "node_modules/@parcel/watcher": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz",
+ "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "detect-libc": "^2.0.3",
+ "is-glob": "^4.0.3",
+ "node-addon-api": "^7.0.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher-android-arm64": "2.6.0",
+ "@parcel/watcher-darwin-arm64": "2.6.0",
+ "@parcel/watcher-darwin-x64": "2.6.0",
+ "@parcel/watcher-freebsd-x64": "2.6.0",
+ "@parcel/watcher-linux-arm-glibc": "2.6.0",
+ "@parcel/watcher-linux-arm-musl": "2.6.0",
+ "@parcel/watcher-linux-arm64-glibc": "2.6.0",
+ "@parcel/watcher-linux-arm64-musl": "2.6.0",
+ "@parcel/watcher-linux-x64-glibc": "2.6.0",
+ "@parcel/watcher-linux-x64-musl": "2.6.0",
+ "@parcel/watcher-win32-arm64": "2.6.0",
+ "@parcel/watcher-win32-x64": "2.6.0"
+ }
+ },
+ "node_modules/@parcel/watcher-android-arm64": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz",
+ "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-arm64": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz",
+ "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-x64": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz",
+ "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-freebsd-x64": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz",
+ "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-glibc": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz",
+ "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-musl": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz",
+ "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-glibc": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz",
+ "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-musl": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz",
+ "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-glibc": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz",
+ "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-musl": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz",
+ "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-arm64": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz",
+ "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-x64": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz",
+ "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher/node_modules/picomatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
+ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/@popperjs/core": {
+ "version": "2.11.6",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz",
+ "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
+ },
+ "node_modules/@rolldown/binding-android-arm64": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz",
+ "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-arm64": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz",
+ "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-x64": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz",
+ "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-freebsd-x64": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz",
+ "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz",
+ "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-gnu": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz",
+ "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-musl": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz",
+ "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-ppc64-gnu": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz",
+ "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-s390x-gnu": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz",
+ "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-gnu": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz",
+ "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-musl": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz",
+ "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-openharmony-arm64": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz",
+ "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-wasm32-wasi": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz",
+ "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==",
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "1.11.1",
+ "@emnapi/runtime": "1.11.1",
+ "@napi-rs/wasm-runtime": "^1.1.6"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-arm64-msvc": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz",
+ "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-x64-msvc": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz",
+ "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
+ "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rollup/plugin-commonjs": {
+ "version": "28.0.9",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.9.tgz",
+ "integrity": "sha512-PIR4/OHZ79romx0BVVll/PkwWpJ7e5lsqFa3gFfcrFPWwLXLV39JVUzQV9RKjWerE7B845Hqjj9VYlQeieZ2dA==",
+ "license": "MIT",
+ "dependencies": {
+ "@rollup/pluginutils": "^5.0.1",
+ "commondir": "^1.0.1",
+ "estree-walker": "^2.0.2",
+ "fdir": "^6.2.0",
+ "is-reference": "1.2.1",
+ "magic-string": "^0.30.3",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=16.0.0 || 14 >= 14.17"
+ },
+ "peerDependencies": {
+ "rollup": "^2.68.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/plugin-commonjs/node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "license": "MIT"
+ },
+ "node_modules/@rollup/plugin-commonjs/node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/plugin-commonjs/node_modules/picomatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
+ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/@rollup/plugin-json": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz",
+ "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==",
+ "license": "MIT",
+ "dependencies": {
+ "@rollup/pluginutils": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/plugin-node-resolve": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.3.tgz",
+ "integrity": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==",
+ "license": "MIT",
+ "dependencies": {
+ "@rollup/pluginutils": "^5.0.1",
+ "@types/resolve": "1.20.2",
+ "deepmerge": "^4.2.2",
+ "is-module": "^1.0.0",
+ "resolve": "^1.22.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^2.78.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/plugin-replace": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.3.tgz",
+ "integrity": "sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==",
+ "license": "MIT",
+ "dependencies": {
+ "@rollup/pluginutils": "^5.0.1",
+ "magic-string": "^0.30.3"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/plugin-typescript": {
+ "version": "12.3.0",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.3.0.tgz",
+ "integrity": "sha512-7DP0/p7y3t67+NabT9f8oTBFE6gGkto4SA6Np2oudYmZE/m1dt8RB0SjL1msMxFpLo631qjRCcBlAbq1ml/Big==",
+ "license": "MIT",
+ "dependencies": {
+ "@rollup/pluginutils": "^5.1.0",
+ "resolve": "^1.22.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^2.14.0||^3.0.0||^4.0.0",
+ "tslib": "*",
+ "typescript": ">=3.7.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ },
+ "tslib": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz",
+ "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==",
+ "license": "MIT",
+ "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/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "license": "MIT"
+ },
+ "node_modules/@rollup/pluginutils/node_modules/picomatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
+ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.3.tgz",
+ "integrity": "sha512-c0wdcekXtQvvn5Tsrk/+op/gUArrbWaFduBnTLP2l1cKLSQs4diMWjJw3m6A0DdzT8dAAX95KpkJ3qynCePbmw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.3.tgz",
+ "integrity": "sha512-3YjElDdWN+qXAFbJ/CzPV+0wspLqh54k/I6GfdYtEJRqg7buSgc1yPM3B+93j1M4neobtkATHZTmxK2AMVGfnA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.3.tgz",
+ "integrity": "sha512-Pch2pFNOxxz1hTjypIdPyRTR6riiwRl84+VcN9djS680fw+Co1nAJINrdpqp7KV0NvyuU8ilZXZCjd7ykJl1GQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.3.tgz",
+ "integrity": "sha512-LEuncFUHFiF8t4yZVZvvZA1wk0pjAscRnsrn1EfTEmN4HXotBi2YtcnLRyaK6UbuczW7xZS5ES+81Rdz8Z0T6g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.3.tgz",
+ "integrity": "sha512-zvBUvsQUpOWALdDsk6qbS8bXf2VxmPisuudNDrY7x0p0jBdsoZl8HsHczIOgkQiZldmcacMKtBzpoGVNeIe2bQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.3.tgz",
+ "integrity": "sha512-C2KmNrcSem/AMg984H/dev+si0lieQGdXdR/lYGJnuumXnFb9Y7QdiI62obFdLlxRYLBv4P0eUVIDbD4c1vVvw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.3.tgz",
+ "integrity": "sha512-ggXnsTAEzNQx74XpunRsiZ9aBZDsI7XIa0hm2nzR9f4WzH5/f/d73ZSDaC5ejJ8YLY4NW+V3wr0tjOaeCq8hqA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.3.tgz",
+ "integrity": "sha512-2vng+FlzNUhKZxtej3IUqJgbZoQk2M/dwQM20+ULV0R/E/8tr9/P6uEf2iiGIk4HL0zMKh5Jry7mUHdUOvyGgA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.3.tgz",
+ "integrity": "sha512-LLLFZKt4/Nraf9rxDkhiU8QVgLF4WmCkfr0L4fj0fPfIZFBib0DeiFk1hhaYKd03LFAFJcxHslhDFlNJLylf5Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.3.tgz",
+ "integrity": "sha512-WJkdQCvS9sWNOUBJZfQRKpZGFBztRzcowI+nndmflKgU4XY+3a420FgTOSKTsVqJbnzSxeT4vaJalpOaPo2YCQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.3.tgz",
+ "integrity": "sha512-PwHXCCS2n64/1Ot6rP1YEYA02MGYBcQlr8CSZZyrUG2O7NH6NklYmvr9v3Jy+5e/eDeNchc/ukmKJi9LuflMIQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.3.tgz",
+ "integrity": "sha512-vUjxINQu3RC8NZS3ykk1gN65gIz8pAopOq2HXuZhiIxHdx7TFvDG+jgrdSgInu1Eza4/Rfi2VzZgyIgEH4WOaw==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.2.tgz",
+ "integrity": "sha512-Yl5Rdpf9pIc4GW1PmkUGHdMtbx0fBLE1//SxDmuf3X0dUC57+zMepow2LK0V21661cjXdTn8hO2tXDdAWAqE5g==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.2.tgz",
+ "integrity": "sha512-03vUDH+w55s680YYryyr78jsO1RWU9ocRMaeV2vMniJJW/6HhoTBwyyiiTPVHNWLnhsnwcQ0oH3S9JSBEKuyqw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.3.tgz",
+ "integrity": "sha512-wzko4aJ13+0G3kGnviCg5gnXFKd40izKsrf2uOw12US4XqprkDrmwOpeW14aSNa37V8bfPcz5Fkob6LZ3BAPmA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.3.tgz",
+ "integrity": "sha512-8120ue0JUMSwy11stlwnfdX3pPd+WZYGCDBwEHWtIHi6pOpZmsEF5QKB7a/UN+XFdqvobxz98kv8RTqikyCEBw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.3.tgz",
+ "integrity": "sha512-XLFHnR3tXMjbOCh2vtVJHmxt+995uJsTERQyseFDRA0xxMxyTZPLa3OIUlyFaO4mF/Lu0FjmWHCuPXJT1n/IOg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.3.tgz",
+ "integrity": "sha512-se6yXvNGMIl0f+RQzyh7XAmia8/9kplQx424wnG2w0C1oi6XgO6Y8otKhdXFHbHs88Ihavzmvh1NWjuovE76BQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.3.tgz",
+ "integrity": "sha512-gNoxRefktVIiGflpONuxWWXZAzIQG++z9qHO3xKwk4WdDMuQja3JHGfE1u0i3PfPDyvhypdk+WrgIJqLhGG7sg==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.3.tgz",
+ "integrity": "sha512-V4KtWtQfAFMU7+9/A/VDps/VI8CHd3cYz0L8sgJzz8qK7eY7wI4ruFD82UYIYvW9Z4DtlTfhQcsl4XyPHW5uSg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.3.tgz",
+ "integrity": "sha512-LBx9LYXvj2CBkMkjLdNAWLwH0MLMin7do2VcVo9kVPibGLkY0BQQut2fv7NVqkXqZ/CrAu9LqDHVV1xHCMpCPw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-openbsd-x64": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.3.tgz",
+ "integrity": "sha512-ABVf3Q0RCu7NcyCCOZQI0pJ3GuSdfSl8EXcy88QtdceIMIoCUdfhsJChZ64L9zVM2aJHjde1Bhn5uqSRcX9ySA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.3.tgz",
+ "integrity": "sha512-+2Cy/ldweGBLlPIKsQLF8U5N44a0KDdbrk1rAjHOM9M2K+kGdIVjHLmmrZIcx+9Ny3ke/1JomCsDI1ocb11+sg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.3.tgz",
+ "integrity": "sha512-dtZvzc8BedpSaFNy75x6uiWwAGTH+aZHDtdrqP6qk+WcLJrfti6sGje1ZJ9UxyzDLF23d/mV+PaMwuC0hL7UVA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.3.tgz",
+ "integrity": "sha512-Rj8Ra4noo+aYy7sKBggCx0407mws34kAb1ySyWuq5DAtFBQdkSwnsjCgPrhPe9cvgBKZIukpE+CVHvORCS93kQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.3.tgz",
+ "integrity": "sha512-vp7N084ew/odXn2gi/mzm9mUkQu9l6AiN6dt4IeUM2Uvm9o+cVmP+YkqbMOteLbiGgqBBlJZjIMYVCfOOIVbVQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.3.tgz",
+ "integrity": "sha512-MOG/3gTOn4Fwf574RVOaY61I5o6P90legkFADiTyn1hyjNydT+cerU2rLUwPdZkKKyJ+iT+K9p7WXK4LM1Ka6g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@sentry/browser": {
+ "version": "10.70.0",
+ "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-10.70.0.tgz",
+ "integrity": "sha512-IK6+J+8H06tZe+A8L37TT5ZxxwNtyQatW8zl5RYYJ/e9CsjrM8fPi8I1OT7uquTw8UtjqFHt7bEef/Vy63ksPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@sentry/browser-utils": "10.70.0",
+ "@sentry/conventions": "^0.16.0",
+ "@sentry/core": "10.70.0",
+ "@sentry/feedback": "10.70.0",
+ "@sentry/replay": "10.70.0",
+ "@sentry/replay-canvas": "10.70.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@sentry/browser-utils": {
+ "version": "10.70.0",
+ "resolved": "https://registry.npmjs.org/@sentry/browser-utils/-/browser-utils-10.70.0.tgz",
+ "integrity": "sha512-IvjhafF5NFXrPCg5EHbAPGDwIhHxgUcLlHTklZ3DAdA6ky88BJYMfevbcnOEmgavf4nylhCaquRUFNB5+szj+A==",
+ "license": "MIT",
+ "dependencies": {
+ "@sentry/conventions": "^0.16.0",
+ "@sentry/core": "10.70.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@sentry/conventions": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/@sentry/conventions/-/conventions-0.16.0.tgz",
+ "integrity": "sha512-fO9PLmHdVURcSPUpWCItWAtgKiMwGdJHbovoSEyLplX5sxs2ugvI4CBPTrkkgqhObnZOD0CnWBKDzSVQYBKEyQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@sentry/core": {
+ "version": "10.70.0",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.70.0.tgz",
+ "integrity": "sha512-ozhCTDqg89oB4XmWfAwuHshABpvT7AkRpaPnogopPfMAaI61G1t8EKCJ4W7aum8JSBonlfyjPCyW5oYZFm0KvA==",
+ "license": "MIT",
+ "dependencies": {
+ "@sentry/conventions": "^0.16.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@sentry/feedback": {
+ "version": "10.70.0",
+ "resolved": "https://registry.npmjs.org/@sentry/feedback/-/feedback-10.70.0.tgz",
+ "integrity": "sha512-6VQn2ETJjHkk4QQDdx/587/JDfXsk3yBTLZ3UZOMtBVrkmwgk+1FJZ8ULJ3ud1xZcuh2icunIkc7tGVv2axdnw==",
+ "license": "MIT",
+ "dependencies": {
+ "@sentry/core": "10.70.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@sentry/react": {
+ "version": "10.70.0",
+ "resolved": "https://registry.npmjs.org/@sentry/react/-/react-10.70.0.tgz",
+ "integrity": "sha512-j1d/4hvoaUVKs5GRrfmwUCkiEmkfaeHsk+xgausZlzg5YvmwpF+gyevBLNP26GFEH7nyHXW4l8dbbo0eNieJmw==",
+ "license": "MIT",
+ "dependencies": {
+ "@sentry/browser": "10.70.0",
+ "@sentry/conventions": "^0.16.0",
+ "@sentry/core": "10.70.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "react": "^16.14.0 || 17.x || 18.x || 19.x"
+ }
+ },
+ "node_modules/@sentry/replay": {
+ "version": "10.70.0",
+ "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-10.70.0.tgz",
+ "integrity": "sha512-xMnSGzJn9Xd29rYd32lkx/gFW+5mtgqADJ2FiZvis0MBGZuDlNRwPn0/Cs1xA3JNXKV3NGfhdmmvs90w4dHSmw==",
+ "license": "MIT",
+ "dependencies": {
+ "@sentry/browser-utils": "10.70.0",
+ "@sentry/core": "10.70.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@sentry/replay-canvas": {
+ "version": "10.70.0",
+ "resolved": "https://registry.npmjs.org/@sentry/replay-canvas/-/replay-canvas-10.70.0.tgz",
+ "integrity": "sha512-irzpw22bK5CF3jbecDa0gBUcfjv7tgeUoLAvtIfeHOP5ajmf3o4Cp99a9RQqkfgvkcMeRZBUwE91SQhp6Ank+w==",
+ "license": "MIT",
+ "dependencies": {
+ "@sentry/core": "10.70.0",
+ "@sentry/replay": "10.70.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@sinclair/typebox": {
+ "version": "0.27.12",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.12.tgz",
+ "integrity": "sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==",
+ "license": "MIT"
+ },
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz",
+ "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@types/bunyan": {
+ "version": "1.8.11",
+ "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.11.tgz",
+ "integrity": "sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/chai": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz",
+ "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/deep-eql": "*",
+ "assertion-error": "^2.0.1"
+ }
+ },
+ "node_modules/@types/cookie": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
+ "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==",
+ "license": "MIT"
+ },
+ "node_modules/@types/deep-eql": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
+ "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
+ "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/inquirer": {
+ "version": "7.3.3",
+ "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-7.3.3.tgz",
+ "integrity": "sha512-HhxyLejTHMfohAuhRun4csWigAMjXTmRyiJTU1Y/I1xmggikFMkOUoMQRlFm+zQcPEGHSs3io/0FAmNZf8EymQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/through": "*",
+ "rxjs": "^6.4.0"
+ }
+ },
+ "node_modules/@types/inquirer/node_modules/rxjs": {
+ "version": "6.6.7",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
+ "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^1.9.0"
+ },
+ "engines": {
+ "npm": ">=2.0.0"
+ }
+ },
+ "node_modules/@types/inquirer/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "license": "0BSD"
+ },
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+ "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+ "license": "MIT"
+ },
+ "node_modules/@types/istanbul-lib-report": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
+ "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "node_modules/@types/istanbul-reports": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
+ "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "node_modules/@types/js-levenshtein": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@types/js-levenshtein/-/js-levenshtein-1.1.3.tgz",
+ "integrity": "sha512-jd+Q+sD20Qfu9e2aEXogiO3vpOC1PYJOUdyN9gvs4Qrvkg4wF43L5OhqrPeokdv8TL0/mXoYfpkcoGZMNN2pkQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/lodash": {
+ "version": "4.17.25",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.25.tgz",
+ "integrity": "sha512-+K1NIO8I+F9/wNulfVvu23QYd0Pe9/OCqRrim4NoYIf1VoEDL90Ve4ClzpyqBLc7NpGGWRvYNCKZ1BE/Jpf8dQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==",
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "26.2.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-26.2.0.tgz",
+ "integrity": "sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~8.3.0"
+ }
+ },
+ "node_modules/@types/normalize-package-data": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
+ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/parse-json": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
+ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/postcss-modules-local-by-default": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.2.tgz",
+ "integrity": "sha512-CtYCcD+L+trB3reJPny+bKWKMzPfxEyQpKIwit7kErnOexf5/faaGpkFy4I5AwbV4hp1sk7/aTg0tt0B67VkLQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/@types/postcss-modules-scope": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/postcss-modules-scope/-/postcss-modules-scope-3.0.4.tgz",
+ "integrity": "sha512-//ygSisVq9kVI0sqx3UPLzWIMCmtSVrzdljtuaAEJtGoGnpjBikZ2sXO5MpH9SnWX9HRfXxHifDAXcQjupWnIQ==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss": "^8.0.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,
+ "license": "MIT"
+ },
+ "node_modules/@types/quill": {
+ "version": "1.3.10",
+ "resolved": "https://registry.npmjs.org/@types/quill/-/quill-1.3.10.tgz",
+ "integrity": "sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw==",
+ "license": "MIT",
+ "dependencies": {
+ "parchment": "^1.1.2"
+ }
+ },
+ "node_modules/@types/raf": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.3.tgz",
+ "integrity": "sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/@types/react": {
+ "version": "18.3.31",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz",
+ "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==",
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^18.0.0"
+ }
+ },
+ "node_modules/@types/resolve": {
+ "version": "1.20.2",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
+ "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==",
+ "license": "MIT"
+ },
+ "node_modules/@types/semver": {
+ "version": "7.8.0",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.8.0.tgz",
+ "integrity": "sha512-1mAINjtQCXXeLkJ9ehXkwOcBpqtLxiVtKhpUf83DdRNdQKV0iXZpaHYqRr7nj+wvxuJzoAmAwXI+sCNMv1CzLQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/set-cookie-parser": {
+ "version": "2.4.10",
+ "resolved": "https://registry.npmjs.org/@types/set-cookie-parser/-/set-cookie-parser-2.4.10.tgz",
+ "integrity": "sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/statuses": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz",
+ "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/@types/through": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz",
+ "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/trusted-types": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/@types/yargs": {
+ "version": "17.0.35",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz",
+ "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+ "license": "MIT"
+ },
+ "node_modules/@typescript/typescript-aix-ppc64": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz",
+ "integrity": "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=16.20.0"
+ }
+ },
+ "node_modules/@typescript/typescript-darwin-arm64": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-arm64/-/typescript-darwin-arm64-7.0.2.tgz",
+ "integrity": "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=16.20.0"
+ }
+ },
+ "node_modules/@typescript/typescript-darwin-x64": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-x64/-/typescript-darwin-x64-7.0.2.tgz",
+ "integrity": "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=16.20.0"
+ }
+ },
+ "node_modules/@typescript/typescript-freebsd-arm64": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-arm64/-/typescript-freebsd-arm64-7.0.2.tgz",
+ "integrity": "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=16.20.0"
+ }
+ },
+ "node_modules/@typescript/typescript-freebsd-x64": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-x64/-/typescript-freebsd-x64-7.0.2.tgz",
+ "integrity": "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=16.20.0"
+ }
+ },
+ "node_modules/@typescript/typescript-linux-arm": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm/-/typescript-linux-arm-7.0.2.tgz",
+ "integrity": "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=16.20.0"
+ }
+ },
+ "node_modules/@typescript/typescript-linux-arm64": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm64/-/typescript-linux-arm64-7.0.2.tgz",
+ "integrity": "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=16.20.0"
+ }
+ },
+ "node_modules/@typescript/typescript-linux-loong64": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-loong64/-/typescript-linux-loong64-7.0.2.tgz",
+ "integrity": "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=16.20.0"
+ }
+ },
+ "node_modules/@typescript/typescript-linux-mips64el": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-mips64el/-/typescript-linux-mips64el-7.0.2.tgz",
+ "integrity": "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==",
+ "cpu": [
+ "mips64el"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=16.20.0"
+ }
+ },
+ "node_modules/@typescript/typescript-linux-ppc64": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-ppc64/-/typescript-linux-ppc64-7.0.2.tgz",
+ "integrity": "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=16.20.0"
+ }
+ },
+ "node_modules/@typescript/typescript-linux-riscv64": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-riscv64/-/typescript-linux-riscv64-7.0.2.tgz",
+ "integrity": "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=16.20.0"
+ }
+ },
+ "node_modules/@typescript/typescript-linux-s390x": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-s390x/-/typescript-linux-s390x-7.0.2.tgz",
+ "integrity": "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=16.20.0"
+ }
+ },
+ "node_modules/@typescript/typescript-linux-x64": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-x64/-/typescript-linux-x64-7.0.2.tgz",
+ "integrity": "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=16.20.0"
+ }
+ },
+ "node_modules/@typescript/typescript-netbsd-arm64": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-arm64/-/typescript-netbsd-arm64-7.0.2.tgz",
+ "integrity": "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=16.20.0"
+ }
+ },
+ "node_modules/@typescript/typescript-netbsd-x64": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-x64/-/typescript-netbsd-x64-7.0.2.tgz",
+ "integrity": "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=16.20.0"
+ }
+ },
+ "node_modules/@typescript/typescript-openbsd-arm64": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-arm64/-/typescript-openbsd-arm64-7.0.2.tgz",
+ "integrity": "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=16.20.0"
+ }
+ },
+ "node_modules/@typescript/typescript-openbsd-x64": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-x64/-/typescript-openbsd-x64-7.0.2.tgz",
+ "integrity": "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=16.20.0"
+ }
+ },
+ "node_modules/@typescript/typescript-sunos-x64": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-sunos-x64/-/typescript-sunos-x64-7.0.2.tgz",
+ "integrity": "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=16.20.0"
+ }
+ },
+ "node_modules/@typescript/typescript-win32-arm64": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-arm64/-/typescript-win32-arm64-7.0.2.tgz",
+ "integrity": "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=16.20.0"
+ }
+ },
+ "node_modules/@typescript/typescript-win32-x64": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-x64/-/typescript-win32-x64-7.0.2.tgz",
+ "integrity": "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=16.20.0"
+ }
+ },
+ "node_modules/@vibe/base": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@vibe/base/-/base-4.0.3.tgz",
+ "integrity": "sha512-N+sZL27fw3QOKFEk00WsXGvg3GjtOSGhy65YYGPwJR3f7qkAl7nQmBDogT+YGHaEatV1MekfDw1FLbvQKK/vaw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/shared": "4.0.3",
+ "@vibe/style": "4.0.0",
+ "classnames": "^2.5.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/button": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@vibe/button/-/button-4.0.4.tgz",
+ "integrity": "sha512-R0n8CPVpLtkdmHvT2WWTnEPx9baOkAEyiu7EYyZiHgenuoB0IXVhFIMFNp1Rcgo8apctTfNsMChTv0ACIwVqlg==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/icon": "4.0.3",
+ "@vibe/loader": "4.0.3",
+ "@vibe/shared": "4.0.3",
+ "@vibe/style": "4.0.0",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/clickable": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@vibe/clickable/-/clickable-4.0.3.tgz",
+ "integrity": "sha512-VdN5rZROOHsd4Vg4jFLt6OSmVLAkosFlnF6QROBUo+z7DC3Pj90wyBa1/6UeJqV5sQIBRqSelbwH+oftfExOPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/shared": "4.0.3",
+ "@vibe/style": "4.0.0",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/core": {
+ "version": "4.5.3",
+ "resolved": "https://registry.npmjs.org/@vibe/core/-/core-4.5.3.tgz",
+ "integrity": "sha512-QnynGiCHE3+M9sLBFADuqZLzR2fdlMr25rE7Zho9RrGbY1DHHUDLC5XwVhTwhpTgsezJpuCmgfFY/Kq39c1THg==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/react-dom": "^2.1.2",
+ "@vibe/base": "4.0.3",
+ "@vibe/button": "4.0.4",
+ "@vibe/clickable": "4.0.3",
+ "@vibe/dialog": "4.1.1",
+ "@vibe/hooks": "4.0.3",
+ "@vibe/icon": "4.0.3",
+ "@vibe/icon-button": "4.0.6",
+ "@vibe/icons": "4.1.0",
+ "@vibe/layer": "4.0.4",
+ "@vibe/layout": "4.0.4",
+ "@vibe/loader": "4.0.3",
+ "@vibe/shared": "4.0.3",
+ "@vibe/style": "4.0.0",
+ "@vibe/tooltip": "4.0.6",
+ "@vibe/typography": "4.0.6",
+ "browserslist-config-monday": "1.0.6",
+ "classnames": "^2.5.1",
+ "date-fns": "^2.30.0",
+ "downshift": "^9.0.8",
+ "es-toolkit": "^1.39.10",
+ "react-day-picker": "^8.10.2",
+ "react-focus-lock": "^2.13.2",
+ "react-inlinesvg": "^4.1.3",
+ "react-is": "^16.9.0",
+ "react-remove-scroll": "^2.6.0",
+ "react-transition-group": "^4.4.5",
+ "react-virtualized-auto-sizer": "^1.0.7",
+ "react-window": "^1.8.7",
+ "style-inject": "^0.3.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/dialog": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/@vibe/dialog/-/dialog-4.1.1.tgz",
+ "integrity": "sha512-Gh6D4LAAX8njtZ5ezrtBpRq+Ew9UmzRGG290uYRe2AnS4fuG74TVkyHPOHmYBfCr98drEBPz3V1fA1g38SItkA==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/react-dom": "^2.1.2",
+ "@vibe/hooks": "4.0.3",
+ "@vibe/layer": "4.0.4",
+ "@vibe/shared": "4.0.3",
+ "@vibe/style": "4.0.0",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10",
+ "react-transition-group": "^4.4.5"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/hooks": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@vibe/hooks/-/hooks-4.0.3.tgz",
+ "integrity": "sha512-W4vKiC5q6p9x0CHb+xzh0SqNEvu4vevYSvOvUySrD76DLkgbgU/VZ8cFNZne24W0V7ED93ID4Dw3FugFKyfOAQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/shared": "4.0.3",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/icon": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@vibe/icon/-/icon-4.0.3.tgz",
+ "integrity": "sha512-cUacuzAL7cgRBUCa6eNNXevdV3hKYRYBTGsbQscO1cPnTIRjGahHwjzLjeBlF+Z6T2rvogLB1abSBVyOwVMPwA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/shared": "4.0.3",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10",
+ "react-inlinesvg": "^4.1.3"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/icon-button": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@vibe/icon-button/-/icon-button-4.0.6.tgz",
+ "integrity": "sha512-KcsojJmExaRxrGMsr1nGDesV2v5PjBf0Zd5Rov0lYN16EJRJi20cTGCG1+7BCTS+2vHIhpbYvxhEVUJfMePcNQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/button": "4.0.4",
+ "@vibe/icon": "4.0.3",
+ "@vibe/icons": "4.1.0",
+ "@vibe/shared": "4.0.3",
+ "@vibe/tooltip": "4.0.6",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/icons": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@vibe/icons/-/icons-4.1.0.tgz",
+ "integrity": "sha512-xO61cHnuNDEA0SlhG6/hWA3mYsatUzcTELTk701i2cGdZw85nZ/mNn2NtfJRaHnAZ8uJuw1ZWXQ+HpvXL1X6xA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/layer": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@vibe/layer/-/layer-4.0.4.tgz",
+ "integrity": "sha512-9OAFxKefKtiYHINZZBg0DUoLrUZcYSnUUnBS5+yDoGedJ4aH5f/2rOuKEO3PfkGExsfsEiGjUr3igMdSKhdNcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/icon": "4.0.3",
+ "@vibe/loader": "4.0.3",
+ "@vibe/shared": "4.0.3",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/layout": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@vibe/layout/-/layout-4.0.4.tgz",
+ "integrity": "sha512-Eh6/lZ3ditNPOHwS2q0fxHSavbu8ULSwp/3NIXZaNPnSinuSU6VTRNwutB1Bu2aA7hLknOjEmA3wgXDUqmAc7w==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/clickable": "4.0.3",
+ "@vibe/shared": "4.0.3",
+ "@vibe/style": "4.0.0",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/loader": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@vibe/loader/-/loader-4.0.3.tgz",
+ "integrity": "sha512-cCR1UT/v9aiLfTy4guxOLv4Vi0GKxWQlnKZDYxCOpoa83P3o4uBpoC0X4dj8qtlCTFfCyYCr5G3SewC2ClARnA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/shared": "4.0.3",
+ "classnames": "^2.5.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/shared": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@vibe/shared/-/shared-4.0.3.tgz",
+ "integrity": "sha512-mp3nFv7rbF3Eq3lYylKwMWKaV5+P795B0ky/IMzcmz7hCt07/6ej5sT06Q4N2HizMqMAo6lbDH3uMwfaVG0dhQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "vitest": ">=1.6.0"
+ }
+ },
+ "node_modules/@vibe/style": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@vibe/style/-/style-4.0.0.tgz",
+ "integrity": "sha512-dnb9TEcCC0ZQFvHultyM0FbxYVQQlHvRC9fjNN+wIEhOOBAgVFBP6PcRuH5PQHDyfulbKv3/SX91rHJss6quqw==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss": "8.4.31",
+ "postcss-scss": "^4.0.9",
+ "postcss-value-parser": "4.2.0",
+ "stylelint": "^14.16.1"
+ },
+ "peerDependencies": {
+ "stylelint": "^14.1.0"
+ }
+ },
+ "node_modules/@vibe/tooltip": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@vibe/tooltip/-/tooltip-4.0.6.tgz",
+ "integrity": "sha512-vFWWzTeZgLhAYZlyk0ME5bHDikHGpJgRbl4rGpWkeCgXn1fGzzzCdgz2QnJgbb/41ddbPqUAZmqpjwjf6c/MUQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/dialog": "4.1.1",
+ "@vibe/icon": "4.0.3",
+ "@vibe/layout": "4.0.4",
+ "@vibe/shared": "4.0.3",
+ "@vibe/style": "4.0.0",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/typography": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@vibe/typography/-/typography-4.0.6.tgz",
+ "integrity": "sha512-KVX+bWYo5CtMQ6b4FCqfmhT6bDe7ko6oDpxqtyHoBuINebEHjiFqOAnZtk7FzkOT2QmUdHoBypZH8SmalQQg3A==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/hooks": "4.0.3",
+ "@vibe/shared": "4.0.3",
+ "@vibe/style": "4.0.0",
+ "@vibe/tooltip": "4.0.6",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vitejs/plugin-react": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.4.tgz",
+ "integrity": "sha512-XcCQz0TBpBgljhj0gMuuDj49i6Ytqh5q1osT/Gp5uAVJUCTWxyskk/l1jwYYiu2xcNHHipdMz40EGfM1VdamVg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@rolldown/pluginutils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0",
+ "babel-plugin-react-compiler": "^1.0.0",
+ "vite": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@rolldown/plugin-babel": {
+ "optional": true
+ },
+ "babel-plugin-react-compiler": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vitest/expect": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.7.tgz",
+ "integrity": "sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/chai": "^5.2.2",
+ "@vitest/spy": "3.2.7",
+ "@vitest/utils": "3.2.7",
+ "chai": "^5.2.0",
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/pretty-format": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.7.tgz",
+ "integrity": "sha512-KUHlwqVu0sRlhCdyPdQ/wBoTfRahjUky1MubOmYw9fWfIZy1gNoHpuaaQBPAaMaVYdQYHJLurzj8ECCj5OwTqA==",
+ "license": "MIT",
+ "dependencies": {
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/runner": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.7.tgz",
+ "integrity": "sha512-sB9y4ovltoQP+WaUPwmSxO9WIg9Ig694Di5PalVPsYHklAdE027mehpWF2SQSVq+k6sFgaivbTjTJwZLSHbedA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/utils": "3.2.7",
+ "pathe": "^2.0.3",
+ "strip-literal": "^3.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/snapshot": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.7.tgz",
+ "integrity": "sha512-7C+MwShwtBSI5Buwoyg3s/iY1eHL9PKAf+O1wVh/TdnjXUtkoL/9YQtre90i4MtNXM6edP1wJ2zOBpfCyhIS7g==",
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "3.2.7",
+ "magic-string": "^0.30.17",
+ "pathe": "^2.0.3"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/spy": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.7.tgz",
+ "integrity": "sha512-Q2eQGI6d2L/hBtZ0qNuKcAGid68XK6cv1xsoaIma6PaJhHPoqcEJhYpXZ/5myCMqkNgtP6UKuBhbc0nHKnrkuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "tinyspy": "^4.0.3"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/utils": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.7.tgz",
+ "integrity": "sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "3.2.7",
+ "loupe": "^3.1.4",
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@xmldom/xmldom": {
+ "version": "0.7.13",
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.13.tgz",
+ "integrity": "sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==",
+ "deprecated": "this version has critical issues, please update to the latest version",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/a11y-dialog": {
+ "version": "7.5.3",
+ "resolved": "https://registry.npmjs.org/a11y-dialog/-/a11y-dialog-7.5.3.tgz",
+ "integrity": "sha512-ssx2j2FIgxhycE+liCKRam/S7F2TJyDJd8FwaoDS3vq5+yVTSg4dJAQPJr1abJLOlNmsjl5iAGE0VIp0x7gikg==",
+ "license": "MIT",
+ "dependencies": {
+ "focusable-selectors": "^0.4.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz",
+ "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/anchorme": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/anchorme/-/anchorme-1.1.2.tgz",
+ "integrity": "sha512-/jQV4KaMWGSk+izs7KkqgoEbl+8dpePBbanE8OuwFD6Zrl8Vn1zi8w0ja5ZVRSrFnogkTag2YrNBWR6MRlwgbg==",
+ "license": "MIT"
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-escapes/node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+ "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "is-array-buffer": "^3.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/array.prototype.find": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.2.3.tgz",
+ "integrity": "sha512-fO/ORdOELvjbbeIfZfzrXFMhYHGofRGqd+am9zm3tZ4GlJINj/pA2eITyfd65Vg6+ZbHd/Cys7stpoRSWtQFdA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
+ "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+ "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/assertion-error": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
+ "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/async": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+ "license": "MIT"
+ },
+ "node_modules/async-function": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
+ "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/atob": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+ "license": "(MIT OR Apache-2.0)",
+ "bin": {
+ "atob": "bin/atob.js"
+ },
+ "engines": {
+ "node": ">= 4.5.0"
+ }
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/babel-plugin-emotion": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.2.2.tgz",
+ "integrity": "sha512-SMSkGoqTbTyUTDeuVuPIWifPdUGkTk1Kf9BWRiXIOIcuyMfsdp2EjeiiFvOzX8NOBvEh/ypKYvUh2rkgAJMCLA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.0.0",
+ "@emotion/hash": "0.8.0",
+ "@emotion/memoize": "0.7.4",
+ "@emotion/serialize": "^0.11.16",
+ "babel-plugin-macros": "^2.0.0",
+ "babel-plugin-syntax-jsx": "^6.18.0",
+ "convert-source-map": "^1.5.0",
+ "escape-string-regexp": "^1.0.5",
+ "find-root": "^1.1.0",
+ "source-map": "^0.5.7"
+ }
+ },
+ "node_modules/babel-plugin-emotion/node_modules/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/babel-plugin-macros": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz",
+ "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "cosmiconfig": "^6.0.0",
+ "resolve": "^1.12.0"
+ }
+ },
+ "node_modules/babel-plugin-macros/node_modules/cosmiconfig": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
+ "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.1.0",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.7.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/babel-plugin-macros/node_modules/yaml": {
+ "version": "1.10.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz",
+ "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/babel-plugin-syntax-jsx": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz",
+ "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==",
+ "license": "MIT"
+ },
+ "node_modules/balanced-match": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
+ "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
+ "license": "MIT"
+ },
+ "node_modules/base64-arraybuffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
+ "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/bessel": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bessel/-/bessel-1.0.2.tgz",
+ "integrity": "sha512-Al3nHGQGqDYqqinXhQzmwmcRToe/3WyBv4N8aZc5Pef8xw2neZlR9VPi84Sa23JtgWcucu18HxVZrnI0fn2etw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/body-scroll-lock": {
+ "version": "4.0.0-beta.0",
+ "resolved": "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-4.0.0-beta.0.tgz",
+ "integrity": "sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ==",
+ "license": "MIT"
+ },
+ "node_modules/bowser": {
+ "version": "2.14.1",
+ "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz",
+ "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==",
+ "license": "MIT"
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.16",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz",
+ "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/brace-expansion/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/brcast": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brcast/-/brcast-2.0.2.tgz",
+ "integrity": "sha512-Tfn5JSE7hrUlFcOoaLzVvkbgIemIorMIyoMr3TgvszWW7jFt2C9PdeMLtysYD9RU0MmU17b69+XJG1eRY2OBRg==",
+ "license": "MIT"
+ },
+ "node_modules/browserslist-config-monday": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/browserslist-config-monday/-/browserslist-config-monday-1.0.6.tgz",
+ "integrity": "sha512-o74nIIUzfBTdJOo211HgKdpooMzolM3bMWTCJregiq/vnmfGoDtJzscyKv41MgrMZ7L0Rzc8MYjvFgU4OkzAdg==",
+ "license": "MIT"
+ },
+ "node_modules/btoa": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz",
+ "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==",
+ "license": "(MIT OR Apache-2.0)",
+ "bin": {
+ "btoa": "bin/btoa.js"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/bunyan": {
+ "version": "1.8.13",
+ "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.13.tgz",
+ "integrity": "sha512-4zO4iMxZeCpf+95ERsr83nwQr11o1KY2FLhX4wZ6kPXieIVYL3k9eX+N6vbHhFEK5h5O/qCQpfXt7N9VBAIvCA==",
+ "engines": [
+ "node >=0.10.0"
+ ],
+ "license": "MIT",
+ "bin": {
+ "bunyan": "bin/bunyan"
+ },
+ "optionalDependencies": {
+ "dtrace-provider": "~0.8",
+ "moment": "^2.10.6",
+ "mv": "~2",
+ "safe-json-stringify": "~1"
+ }
+ },
+ "node_modules/cac": {
+ "version": "6.7.14",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz",
+ "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "get-intrinsic": "^1.3.0",
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase-keys": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
+ "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
+ "license": "MIT",
+ "dependencies": {
+ "camelcase": "^5.3.1",
+ "map-obj": "^4.0.0",
+ "quick-lru": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/canvg": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.11.tgz",
+ "integrity": "sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "@types/raf": "^3.4.0",
+ "core-js": "^3.8.3",
+ "raf": "^3.4.1",
+ "regenerator-runtime": "^0.13.7",
+ "rgbcolor": "^1.0.1",
+ "stackblur-canvas": "^2.0.0",
+ "svg-pathdata": "^6.0.3"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/canvg/node_modules/core-js": {
+ "version": "3.50.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.50.0.tgz",
+ "integrity": "sha512-BRWgOLKkFeCgRudR6zrs8p9XJZcE14grzKMMssoYrk6krtuEZ7MTKPIY5RzOnqsEKIR9kst7wNzphttraT+Yqw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/chai": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz",
+ "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==",
+ "license": "MIT",
+ "dependencies": {
+ "assertion-error": "^2.0.1",
+ "check-error": "^2.1.1",
+ "deep-eql": "^5.0.1",
+ "loupe": "^3.1.0",
+ "pathval": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chardet": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz",
+ "integrity": "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==",
+ "license": "MIT"
+ },
+ "node_modules/check-error": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz",
+ "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chromatic": {
+ "version": "11.29.0",
+ "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-11.29.0.tgz",
+ "integrity": "sha512-yisBlntp9hHVj19lIQdpTlcYIXuU9H/DbFuu6tyWHmj6hWT2EtukCCcxYXL78XdQt1vm2GfIrtgtKpj/Rzmo4A==",
+ "license": "MIT",
+ "bin": {
+ "chroma": "dist/bin.js",
+ "chromatic": "dist/bin.js",
+ "chromatic-cli": "dist/bin.js"
+ },
+ "peerDependencies": {
+ "@chromatic-com/cypress": "^0.*.* || ^1.0.0",
+ "@chromatic-com/playwright": "^0.*.* || ^1.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@chromatic-com/cypress": {
+ "optional": true
+ },
+ "@chromatic-com/playwright": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/chrono-node": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/chrono-node/-/chrono-node-2.8.0.tgz",
+ "integrity": "sha512-//a/HhnCQ4zFHxRfi1m+jQwr8o0Gxsg0GUjZ39O6ud9lkhrnuLGX1oOKjGsivm9AVMS79cn0PmTa6JCRlzgfWA==",
+ "license": "MIT",
+ "dependencies": {
+ "dayjs": "^1.10.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/classnames": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
+ "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==",
+ "license": "MIT"
+ },
+ "node_modules/cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "license": "MIT",
+ "dependencies": {
+ "restore-cursor": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-spinners": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
+ "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-width": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
+ "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/cliui/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/clsx": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz",
+ "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/colord": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
+ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
+ "license": "MIT"
+ },
+ "node_modules/commander": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
+ "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || >=14"
+ }
+ },
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
+ "license": "MIT"
+ },
+ "node_modules/compute-scroll-into-view": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz",
+ "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==",
+ "license": "MIT"
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "license": "MIT"
+ },
+ "node_modules/concurrently": {
+ "version": "9.2.4",
+ "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.4.tgz",
+ "integrity": "sha512-TZ0CEhyzvFjgtAvHTusDMgj7wNdihCh7LLLrzdUOXIhdlnL2JBBGA9eJxR24rtqgmdjh3OA3hrN1rCHj6HM8qA==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "4.1.2",
+ "rxjs": "7.8.2",
+ "shell-quote": "1.9.0",
+ "supports-color": "8.1.1",
+ "tree-kill": "1.2.2",
+ "yargs": "17.7.2"
+ },
+ "bin": {
+ "conc": "dist/bin/concurrently.js",
+ "concurrently": "dist/bin/concurrently.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/open-cli-tools/concurrently?sponsor=1"
+ }
+ },
+ "node_modules/concurrently/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/consolidated-events": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/consolidated-events/-/consolidated-events-2.0.2.tgz",
+ "integrity": "sha512-2/uRVMdRypf5z/TW/ncD/66l75P5hH2vM/GR8Jf8HLc2xnfJtmina6F6du8+v4Z2vTrMo7jC+W1tmEEuuELgkQ==",
+ "license": "MIT"
+ },
+ "node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "license": "MIT"
+ },
+ "node_modules/cookie": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
+ "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/copy-anything": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz",
+ "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==",
+ "license": "MIT",
+ "dependencies": {
+ "is-what": "^4.1.8"
+ },
+ "engines": {
+ "node": ">=12.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/core-js": {
+ "version": "2.6.12",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
+ "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
+ "hasInstallScript": true,
+ "license": "MIT"
+ },
+ "node_modules/cosmiconfig": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+ "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/cosmiconfig/node_modules/yaml": {
+ "version": "1.10.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz",
+ "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/create-react-class": {
+ "version": "15.7.0",
+ "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz",
+ "integrity": "sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.3.1",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "node_modules/cross-fetch": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz",
+ "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "node-fetch": "^2.7.0"
+ }
+ },
+ "node_modules/cross-fetch/node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/css-functions-list": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.3.3.tgz",
+ "integrity": "sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/css-line-break": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz",
+ "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "utrie": "^1.0.2"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "license": "MIT",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "license": "MIT"
+ },
+ "node_modules/data-view-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+ "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+ "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/inspect-js"
+ }
+ },
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+ "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/date-fns": {
+ "version": "2.30.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
+ "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.21.0"
+ },
+ "engines": {
+ "node": ">=0.11"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/date-fns"
+ }
+ },
+ "node_modules/dayjs": {
+ "version": "1.11.22",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.22.tgz",
+ "integrity": "sha512-1YRnxzt/AabP3GHxnaB9/b+ZScCKu5TeF+co+BWG+lnWVIwEcTFc1FVE0WLNmNO3sA6GGXL40i5qkHfbLzpwrg==",
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/decamelize-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz",
+ "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==",
+ "license": "MIT",
+ "dependencies": {
+ "decamelize": "^1.1.0",
+ "map-obj": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/decamelize-keys/node_modules/map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/decode-uri-component": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
+ "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/deep-eql": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
+ "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/deep-equal": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz",
+ "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-arguments": "^1.1.1",
+ "is-date-object": "^1.0.5",
+ "is-regex": "^1.1.4",
+ "object-is": "^1.1.5",
+ "object-keys": "^1.1.1",
+ "regexp.prototype.flags": "^1.5.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/defaults": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
+ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
+ "license": "MIT",
+ "dependencies": {
+ "clone": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "devOptional": 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",
+ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
+ "license": "MIT"
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "license": "MIT",
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/direction": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/direction/-/direction-1.0.4.tgz",
+ "integrity": "sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==",
+ "license": "MIT",
+ "bin": {
+ "direction": "cli.js"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/document.contains": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/document.contains/-/document.contains-1.0.2.tgz",
+ "integrity": "sha512-YcvYFs15mX8m3AO1QNQy3BlIpSMfNRj3Ujk2BEJxsZG+HZf7/hZ6jr7mDpXrF8q+ff95Vef5yjhiZxm8CGJr6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/dom-helpers": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.8.7",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/dom-serializer/node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/dompurify": {
+ "version": "3.4.13",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.13.tgz",
+ "integrity": "sha512-2vmYIoqjze2d+kakP8S/nS5shfsl587kzwEjcGlTdiksUVgFHnFCsLYDVj/JNqJVOQZGSYBTmuycv0PodwmnMQ==",
+ "license": "(MPL-2.0 OR Apache-2.0)",
+ "optionalDependencies": {
+ "@types/trusted-types": "^2.0.7"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "16.6.1",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz",
+ "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/downshift": {
+ "version": "9.4.0",
+ "resolved": "https://registry.npmjs.org/downshift/-/downshift-9.4.0.tgz",
+ "integrity": "sha512-yIwyzRYzycKwMZhvOahsn4BmRr4Ffi0JymdWOtTDhR+LGDEXCZHTcwgUbNBC/oZLT6YrR46iwJe/BrQUS5ClQQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.28.6",
+ "compute-scroll-into-view": "^3.1.1",
+ "prop-types": "^15.8.1",
+ "react-is": "^18.2.0",
+ "tslib": "^2.8.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.12.0"
+ }
+ },
+ "node_modules/downshift/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/dtrace-provider": {
+ "version": "0.8.8",
+ "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz",
+ "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==",
+ "hasInstallScript": true,
+ "license": "BSD-2-Clause",
+ "optional": true,
+ "dependencies": {
+ "nan": "^2.14.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/dts-bundle-generator": {
+ "version": "9.5.1",
+ "resolved": "https://registry.npmjs.org/dts-bundle-generator/-/dts-bundle-generator-9.5.1.tgz",
+ "integrity": "sha512-DxpJOb2FNnEyOzMkG11sxO2dmxPjthoVWxfKqWYJ/bI/rT1rvTMktF5EKjAYrRZu6Z6t3NhOUZ0sZ5ZXevOfbA==",
+ "license": "MIT",
+ "dependencies": {
+ "typescript": ">=5.0.2",
+ "yargs": "^17.6.0"
+ },
+ "bin": {
+ "dts-bundle-generator": "dist/bin/dts-bundle-generator.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ejs": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
+ "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "jake": "^10.8.5"
+ },
+ "bin": {
+ "ejs": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/entities": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz",
+ "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/enzyme-shallow-equal": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.7.tgz",
+ "integrity": "sha512-/um0GFqUXnpM9SvKtje+9Tjoz3f1fpBC3eXRFrNs8kpYn69JljciYP7KZTqM/YQbUY9KUjvKB4jo/q+L6WGGvg==",
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.0",
+ "object-is": "^1.1.5"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/errno": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
+ "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "prr": "~1.0.1"
+ },
+ "bin": {
+ "errno": "cli.js"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
+ "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.24.2",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz",
+ "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==",
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.2",
+ "arraybuffer.prototype.slice": "^1.0.4",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "data-view-buffer": "^1.0.2",
+ "data-view-byte-length": "^1.0.2",
+ "data-view-byte-offset": "^1.0.1",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "es-set-tostringtag": "^2.1.0",
+ "es-to-primitive": "^1.3.0",
+ "function.prototype.name": "^1.1.8",
+ "get-intrinsic": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "get-symbol-description": "^1.1.0",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.1.0",
+ "is-array-buffer": "^3.0.5",
+ "is-callable": "^1.2.7",
+ "is-data-view": "^1.0.2",
+ "is-negative-zero": "^2.0.3",
+ "is-regex": "^1.2.1",
+ "is-set": "^2.0.3",
+ "is-shared-array-buffer": "^1.0.4",
+ "is-string": "^1.1.1",
+ "is-typed-array": "^1.1.15",
+ "is-weakref": "^1.1.1",
+ "math-intrinsics": "^1.1.0",
+ "object-inspect": "^1.13.4",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.7",
+ "own-keys": "^1.0.1",
+ "regexp.prototype.flags": "^1.5.4",
+ "safe-array-concat": "^1.1.3",
+ "safe-push-apply": "^1.0.0",
+ "safe-regex-test": "^1.1.0",
+ "set-proto": "^1.0.0",
+ "stop-iteration-iterator": "^1.1.0",
+ "string.prototype.trim": "^1.2.10",
+ "string.prototype.trimend": "^1.0.9",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.3",
+ "typed-array-byte-length": "^1.0.3",
+ "typed-array-byte-offset": "^1.0.4",
+ "typed-array-length": "^1.0.7",
+ "unbox-primitive": "^1.1.0",
+ "which-typed-array": "^1.1.19"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-abstract-get": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz",
+ "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.2",
+ "is-callable": "^1.2.7",
+ "object-inspect": "^1.13.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
+ "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
+ "license": "MIT"
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz",
+ "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz",
+ "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==",
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz",
+ "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==",
+ "license": "MIT",
+ "dependencies": {
+ "es-abstract-get": "^1.0.0",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "is-callable": "^1.2.7",
+ "is-date-object": "^1.1.0",
+ "is-symbol": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-toolkit": {
+ "version": "1.50.0",
+ "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.50.0.tgz",
+ "integrity": "sha512-OyZKhUVvEep9ITEiwHn8GKnMRQIVqoSIX7WnRbkWgJkllCujilqP2rD0u979tkl8wqyc8ICwlc1UBVv/Sl1G6w==",
+ "license": "MIT",
+ "workspaces": [
+ "docs",
+ "benchmarks",
+ "tests/types"
+ ]
+ },
+ "node_modules/esbuild": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz",
+ "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.28.1",
+ "@esbuild/android-arm": "0.28.1",
+ "@esbuild/android-arm64": "0.28.1",
+ "@esbuild/android-x64": "0.28.1",
+ "@esbuild/darwin-arm64": "0.28.1",
+ "@esbuild/darwin-x64": "0.28.1",
+ "@esbuild/freebsd-arm64": "0.28.1",
+ "@esbuild/freebsd-x64": "0.28.1",
+ "@esbuild/linux-arm": "0.28.1",
+ "@esbuild/linux-arm64": "0.28.1",
+ "@esbuild/linux-ia32": "0.28.1",
+ "@esbuild/linux-loong64": "0.28.1",
+ "@esbuild/linux-mips64el": "0.28.1",
+ "@esbuild/linux-ppc64": "0.28.1",
+ "@esbuild/linux-riscv64": "0.28.1",
+ "@esbuild/linux-s390x": "0.28.1",
+ "@esbuild/linux-x64": "0.28.1",
+ "@esbuild/netbsd-arm64": "0.28.1",
+ "@esbuild/netbsd-x64": "0.28.1",
+ "@esbuild/openbsd-arm64": "0.28.1",
+ "@esbuild/openbsd-x64": "0.28.1",
+ "@esbuild/openharmony-arm64": "0.28.1",
+ "@esbuild/sunos-x64": "0.28.1",
+ "@esbuild/win32-arm64": "0.28.1",
+ "@esbuild/win32-ia32": "0.28.1",
+ "@esbuild/win32-x64": "0.28.1"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz",
+ "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==",
+ "license": "MIT"
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/expect-type": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz",
+ "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "license": "MIT"
+ },
+ "node_modules/extract-files": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/extract-files/-/extract-files-9.0.0.tgz",
+ "integrity": "sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^10.17.0 || ^12.0.0 || >= 13.7.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jaydenseric"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "license": "MIT"
+ },
+ "node_modules/fast-diff": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz",
+ "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-string-truncated-width": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz",
+ "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/fast-string-width": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz",
+ "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "fast-string-truncated-width": "^3.0.2"
+ }
+ },
+ "node_modules/fast-uri": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz",
+ "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/fast-wrap-ansi": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz",
+ "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "fast-string-width": "^3.0.2"
+ }
+ },
+ "node_modules/fastest-levenshtein": {
+ "version": "1.0.16",
+ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+ "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.9.1"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fflate": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz",
+ "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==",
+ "license": "MIT"
+ },
+ "node_modules/figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/filelist": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz",
+ "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "minimatch": "^5.0.1"
+ }
+ },
+ "node_modules/filelist/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
+ },
+ "node_modules/filelist/node_modules/brace-expansion": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz",
+ "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/filelist/node_modules/minimatch": {
+ "version": "5.1.9",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz",
+ "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/filter-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz",
+ "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/find-root": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
+ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==",
+ "license": "MIT"
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.3.tgz",
+ "integrity": "sha512-/zipXxyO6rGvuNGDiULY9MvEGSkb2gaG4GGH4ygMi0ZZzyMHdUZBmntJmx5x1G2VuPytCwGN4xsJP6cw+sK+vQ==",
+ "license": "ISC"
+ },
+ "node_modules/focus-lock": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-1.3.6.tgz",
+ "integrity": "sha512-Ik/6OCk9RQQ0T5Xw+hKNLWrjSMtv51dD4GRmJjbD5a58TIEpI5a5iXagKVl3Z5UuyslMCA8Xwnu76jQob62Yhg==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.3"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/focus-trap": {
+ "version": "7.8.0",
+ "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.8.0.tgz",
+ "integrity": "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==",
+ "license": "MIT",
+ "dependencies": {
+ "tabbable": "^6.4.0"
+ }
+ },
+ "node_modules/focus-trap-react": {
+ "version": "10.3.1",
+ "resolved": "https://registry.npmjs.org/focus-trap-react/-/focus-trap-react-10.3.1.tgz",
+ "integrity": "sha512-PN4Ya9xf9nyj/Nd9VxBNMuD7IrlRbmaG6POAQ8VLqgtc6IY/Ln1tYakow+UIq4fihYYYFM70/2oyidE6bbiPgw==",
+ "license": "MIT",
+ "dependencies": {
+ "focus-trap": "^7.6.1",
+ "tabbable": "^6.2.0"
+ },
+ "peerDependencies": {
+ "prop-types": "^15.8.1",
+ "react": ">=16.3.0",
+ "react-dom": ">=16.3.0"
+ }
+ },
+ "node_modules/focusable-selectors": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/focusable-selectors/-/focusable-selectors-0.4.0.tgz",
+ "integrity": "sha512-tc/236hUU3xemsRLu1RKhRQ5UWHjRM9iJTli1zdac43h7b1biRSgG0mILM0qrcsKaGCHcOPJ6NKbk12ouKHLpw==",
+ "license": "MIT"
+ },
+ "node_modules/for-each": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+ "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/framer-motion": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-6.5.1.tgz",
+ "integrity": "sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==",
+ "license": "MIT",
+ "dependencies": {
+ "@motionone/dom": "10.12.0",
+ "framesync": "6.0.1",
+ "hey-listen": "^1.0.8",
+ "popmotion": "11.0.3",
+ "style-value-types": "5.0.0",
+ "tslib": "^2.1.0"
+ },
+ "optionalDependencies": {
+ "@emotion/is-prop-valid": "^0.8.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.8 || ^17.0.0 || ^18.0.0",
+ "react-dom": ">=16.8 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/framesync": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.0.1.tgz",
+ "integrity": "sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "11.4.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz",
+ "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz",
+ "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.9",
+ "call-bound": "^1.0.4",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2",
+ "hasown": "^2.0.4",
+ "is-callable": "^1.2.7",
+ "is-document.all": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/generator-function": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
+ "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-nonce": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
+ "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+ "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-tsconfig": {
+ "version": "4.14.2",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.2.tgz",
+ "integrity": "sha512-XpwZALwwl/BaKTAyC6+c5T8y6kCg2jk+XGqOVrKIQmW49pNypYLMRjCUXqa28tQgJlhS2RlzP7sc+Rx7W6qsfw==",
+ "license": "MIT",
+ "dependencies": {
+ "resolve-pkg-maps": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/global-cache": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/global-cache/-/global-cache-1.2.1.tgz",
+ "integrity": "sha512-EOeUaup5DgWKlCMhA9YFqNRIlZwoxt731jCh47WBV9fQqHgXhr3Fa55hfgIUqilIcPsfdNKN7LHjrNY+Km40KA==",
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.1.2",
+ "is-symbol": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/global-modules": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+ "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+ "license": "MIT",
+ "dependencies": {
+ "global-prefix": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/global-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+ "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+ "license": "MIT",
+ "dependencies": {
+ "ini": "^1.3.5",
+ "kind-of": "^6.0.2",
+ "which": "^1.3.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "license": "MIT",
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globjoin": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz",
+ "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
+ "license": "MIT"
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "license": "ISC"
+ },
+ "node_modules/graphql": {
+ "version": "15.10.2",
+ "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.10.2.tgz",
+ "integrity": "sha512-1PRqdDPAmViWr4h1GVBT8RoPZfWSGZa7kDzleTilOfVIslsgf+cia3Nl95v1KDmR4iERPaT7WzQ+tN4MJmbg3w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.x"
+ }
+ },
+ "node_modules/hard-rejection": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
+ "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/has-bigints": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
+ "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
+ "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
+ "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/headers-polyfill": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-5.0.1.tgz",
+ "integrity": "sha512-1TJ6Fih/b8h5TIcv+1+Hw0PDQWJTKDKzFZzcKOiW1wJza3XoAQlkCuXLbymPYB8+ZQyw8mHvdw560e8zVFIWyA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@types/set-cookie-parser": "^2.4.10",
+ "set-cookie-parser": "^3.0.1"
+ }
+ },
+ "node_modules/headers-polyfill/node_modules/set-cookie-parser": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.1.2.tgz",
+ "integrity": "sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/headers-utils": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/headers-utils/-/headers-utils-3.0.2.tgz",
+ "integrity": "sha512-xAxZkM1dRyGV2Ou5bzMxBPNLoRCjcX+ya7KSWybQD2KwLphxsapUVK6x/02o7f4VU6GPSXch9vNY2+gkU8tYWQ==",
+ "license": "MIT"
+ },
+ "node_modules/hey-listen": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz",
+ "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==",
+ "license": "MIT"
+ },
+ "node_modules/hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "react-is": "^16.7.0"
+ }
+ },
+ "node_modules/hosted-git-info": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
+ "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/hot-formula-parser": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/hot-formula-parser/-/hot-formula-parser-3.0.2.tgz",
+ "integrity": "sha512-W/Dj/UbIyuViMIQOQD6tUEVySl7jd6ei+gfWslTiRqa4yRhkyHnIz8N4oLnqgDRhhVAQIcFF5NfNz49k4X8IxQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@handsontable/formulajs": "^2.0.2",
+ "tiny-emitter": "^2.1.0"
+ }
+ },
+ "node_modules/html-entities": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz",
+ "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/mdevils"
+ },
+ {
+ "type": "patreon",
+ "url": "https://patreon.com/mdevils"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/html-tags": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz",
+ "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/html2canvas": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz",
+ "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "css-line-break": "^2.1.0",
+ "text-segmentation": "^1.0.3"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/htmlparser2": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz",
+ "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==",
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.2.2",
+ "entities": "^7.0.1"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz",
+ "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/icss-utils": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
+ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+ "license": "ISC",
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/immer": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz",
+ "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/immer"
+ }
+ },
+ "node_modules/immutable": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.1.tgz",
+ "integrity": "sha512-0R2q5f83L0h+zizu3lAA3ZR/mzEl04U1jVVXIqf2rQbZs9eX5YGtx1EFQuuJJHzVXH10ur6hGKehR8yBOQmZlQ==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-fresh/node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/import-lazy": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
+ "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "license": "ISC"
+ },
+ "node_modules/inquirer": {
+ "version": "8.2.7",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.7.tgz",
+ "integrity": "sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/external-editor": "^1.0.0",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.1.1",
+ "cli-cursor": "^3.1.0",
+ "cli-width": "^3.0.0",
+ "figures": "^3.0.0",
+ "lodash": "^4.17.21",
+ "mute-stream": "0.0.8",
+ "ora": "^5.4.1",
+ "run-async": "^2.4.0",
+ "rxjs": "^7.5.5",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "through": "^2.3.6",
+ "wrap-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/internal-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-arguments": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz",
+ "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "license": "MIT"
+ },
+ "node_modules/is-async-function": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
+ "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
+ "license": "MIT",
+ "dependencies": {
+ "async-function": "^1.0.0",
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "has-bigints": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
+ "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.2",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz",
+ "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==",
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-view": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
+ "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-document.all": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz",
+ "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-finalizationregistry": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+ "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
+ "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.4",
+ "generator-function": "^2.0.0",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-interactive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
+ "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==",
+ "license": "MIT"
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-node-process": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz",
+ "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==",
+ "license": "MIT"
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+ "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-reference": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
+ "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-touch-device": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-touch-device/-/is-touch-device-1.0.1.tgz",
+ "integrity": "sha512-LAYzo9kMT1b2p19L/1ATGt2XcSilnzNlyvq6c0pbPRVisLbAPpLqr53tIJS00kvrTkj0HtR8U7+u8X0yR8lPSw==",
+ "license": "MIT"
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
+ "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-what": {
+ "version": "4.1.16",
+ "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz",
+ "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "license": "ISC"
+ },
+ "node_modules/jake": {
+ "version": "10.9.4",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz",
+ "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "async": "^3.2.6",
+ "filelist": "^1.0.4",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "jake": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jest-mock": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
+ "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-util": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
+ "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/js-cookie": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.8.tgz",
+ "integrity": "sha512-yeJd4aNAdYZQjaon2bpD/Gb0B/omw7HQOsynXXcOiWVCacbBcPlgn8S/d1X6blFSaHao7ozqtW7NZW19xpCtIw==",
+ "license": "MIT"
+ },
+ "node_modules/js-levenshtein": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
+ "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT"
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "license": "MIT"
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "license": "MIT"
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonfile": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz",
+ "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jspdf": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.5.2.tgz",
+ "integrity": "sha512-myeX9c+p7znDWPk0eTrujCzNjT+CXdXyk7YmJq5nD5V7uLLKmSXnlQ/Jn/kuo3X09Op70Apm0rQSnFWyGK8uEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.23.2",
+ "atob": "^2.1.2",
+ "btoa": "^1.2.1",
+ "fflate": "^0.8.1"
+ },
+ "optionalDependencies": {
+ "canvg": "^3.0.6",
+ "core-js": "^3.6.0",
+ "dompurify": "^2.5.4",
+ "html2canvas": "^1.0.0-rc.5"
+ }
+ },
+ "node_modules/jspdf/node_modules/core-js": {
+ "version": "3.50.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.50.0.tgz",
+ "integrity": "sha512-BRWgOLKkFeCgRudR6zrs8p9XJZcE14grzKMMssoYrk6krtuEZ7MTKPIY5RzOnqsEKIR9kst7wNzphttraT+Yqw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/jspdf/node_modules/dompurify": {
+ "version": "2.5.9",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.9.tgz",
+ "integrity": "sha512-i6mvVmWN4xo9LrhCOZrDgSs9noW6nOahbrmzjRbPF36YPyj5Ue5lgok0MHDWkG7xzpWFO2OYttXdzM7rJxHvNA==",
+ "license": "(MPL-2.0 OR Apache-2.0)",
+ "optional": true
+ },
+ "node_modules/jstat": {
+ "version": "1.9.6",
+ "resolved": "https://registry.npmjs.org/jstat/-/jstat-1.9.6.tgz",
+ "integrity": "sha512-rPBkJbK2TnA8pzs93QcDDPlKcrtZWuuCo2dVR0TFLOJSxhqfWOVCSp8aV3/oSbn+4uY4yw1URtLpHQedtmXfug=="
+ },
+ "node_modules/jwt-decode": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz",
+ "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/known-css-properties": {
+ "version": "0.26.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz",
+ "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==",
+ "license": "MIT"
+ },
+ "node_modules/launder": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/launder/-/launder-1.7.1.tgz",
+ "integrity": "sha512-mU6WRz5EusL9ZZuiZ5SO4Y6C0P9PAUR9iwdb6bzj4KDihm28DiHFw+/yk9DBH4f+Pv1wuzQ4e2jV3oQ7mkIqvw==",
+ "license": "MIT",
+ "dependencies": {
+ "dayjs": "^1.11.7"
+ }
+ },
+ "node_modules/less": {
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/less/-/less-4.9.0.tgz",
+ "integrity": "sha512-umRhrCH7fCi8Uj2RcwKjJdvUORTjeWqkdKx0LbcZvjIwsAVsnIAGcxHaqowPeBFBjQuWOeC/bve0AlpFzF/+SQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "copy-anything": "^3.0.5",
+ "parse-node-version": "^1.0.1"
+ },
+ "bin": {
+ "lessc": "bin/lessc"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "errno": "^0.1.1",
+ "graceful-fs": "^4.1.2",
+ "make-dir": "^5.1.0",
+ "mime": "^1.4.1",
+ "needle": "^3.1.0",
+ "probe-image-size": "^7.2.3",
+ "source-map": "~0.6.0"
+ }
+ },
+ "node_modules/lightningcss": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz",
+ "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==",
+ "devOptional": 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.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz",
+ "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz",
+ "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz",
+ "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-freebsd-x64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz",
+ "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz",
+ "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz",
+ "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==",
+ "cpu": [
+ "arm64"
+ ],
+ "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.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz",
+ "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "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.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz",
+ "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==",
+ "cpu": [
+ "x64"
+ ],
+ "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.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz",
+ "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz",
+ "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz",
+ "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "license": "MIT"
+ },
+ "node_modules/load-script": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz",
+ "integrity": "sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA==",
+ "license": "MIT"
+ },
+ "node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
+ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
+ "license": "MIT"
+ },
+ "node_modules/lodash-es": {
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz",
+ "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isempty": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz",
+ "integrity": "sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/lodash.truncate": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
+ "license": "MIT"
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/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==",
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lottie-react": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/lottie-react/-/lottie-react-2.4.2.tgz",
+ "integrity": "sha512-YkEEKN4E2Y2cFpPEwcvAXTAiRGy/P+0mJKYp9aDP1+r42xZgeXTZCf6No1csWRGmh4YQc3kbYtTq/b4c3IRCYg==",
+ "license": "MIT",
+ "dependencies": {
+ "lottie-web": "^5.13.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/lottie-web": {
+ "version": "5.13.0",
+ "resolved": "https://registry.npmjs.org/lottie-web/-/lottie-web-5.13.0.tgz",
+ "integrity": "sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ==",
+ "license": "MIT"
+ },
+ "node_modules/loupe": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz",
+ "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==",
+ "license": "MIT"
+ },
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-5.1.0.tgz",
+ "integrity": "sha512-IfpFq6UM39dUNiphpA6uDezNx/AvWyhwfICWPR3t1VspkgkMZrL+Rk1RbN1bx+aeNYwOrqGJgEgV3yotk+ZUVw==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/map-obj": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
+ "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/material-colors": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz",
+ "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==",
+ "license": "ISC"
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/mathml-tag-names": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
+ "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/memoize-one": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz",
+ "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==",
+ "license": "MIT"
+ },
+ "node_modules/meow": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
+ "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/minimist": "^1.2.0",
+ "camelcase-keys": "^6.2.2",
+ "decamelize": "^1.2.0",
+ "decamelize-keys": "^1.1.0",
+ "hard-rejection": "^2.1.0",
+ "minimist-options": "4.1.0",
+ "normalize-package-data": "^3.0.0",
+ "read-pkg-up": "^7.0.1",
+ "redent": "^3.0.0",
+ "trim-newlines": "^3.0.0",
+ "type-fest": "^0.18.0",
+ "yargs-parser": "^20.2.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "license": "MIT",
+ "optional": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/min-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minimist-options": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
+ "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
+ "license": "MIT",
+ "dependencies": {
+ "arrify": "^1.0.1",
+ "is-plain-obj": "^1.1.0",
+ "kind-of": "^6.0.3"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/moment": {
+ "version": "2.30.1",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
+ "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/moment-fquarter": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/moment-fquarter/-/moment-fquarter-1.0.0.tgz",
+ "integrity": "sha512-ZmWG9xRHz2FcJt+tm+KB8gPevsS7t9FiyBfjz/io6DYqz2YmC0QRaKfGRYUbo6dIh7fLoKlwU361TTkS3AndtQ==",
+ "license": "MIT"
+ },
+ "node_modules/moment-timezone": {
+ "version": "0.5.33",
+ "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.33.tgz",
+ "integrity": "sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w==",
+ "license": "MIT",
+ "dependencies": {
+ "moment": ">= 2.9.0"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/monday-ui-style": {
+ "version": "0.21.1",
+ "resolved": "https://registry.npmjs.org/monday-ui-style/-/monday-ui-style-0.21.1.tgz",
+ "integrity": "sha512-PtB1PRzo5rZlOm64+2efTClADs8XphR7MpN/mSZcw9+7BJq8mPFjkKY+1X5F4hxOIPsk0aEzE4Cyeg3BjWImRA==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss": "8.4.31",
+ "postcss-scss": "^4.0.9",
+ "postcss-value-parser": "4.2.0",
+ "stylelint": "^14.16.1",
+ "typescript-plugin-css-modules": "^5.0.1"
+ },
+ "peerDependencies": {
+ "stylelint": "^14.1.0"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/msw": {
+ "version": "0.35.0",
+ "resolved": "https://registry.npmjs.org/msw/-/msw-0.35.0.tgz",
+ "integrity": "sha512-V7A6PqaS31F1k//fPS0OnO7vllfaqBUFsMEu3IpYixyWpiUInfyglodnbXhhtDyytkQikpkPZv8TZi/CvZzv/w==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "@mswjs/cookies": "^0.1.6",
+ "@mswjs/interceptors": "^0.12.6",
+ "@open-draft/until": "^1.0.3",
+ "@types/cookie": "^0.4.1",
+ "@types/inquirer": "^7.3.3",
+ "@types/js-levenshtein": "^1.1.0",
+ "chalk": "^4.1.1",
+ "chokidar": "^3.4.2",
+ "cookie": "^0.4.1",
+ "graphql": "^15.5.1",
+ "headers-utils": "^3.0.2",
+ "inquirer": "^8.1.1",
+ "is-node-process": "^1.0.1",
+ "js-levenshtein": "^1.1.6",
+ "node-fetch": "^2.6.1",
+ "node-match-path": "^0.6.3",
+ "statuses": "^2.0.0",
+ "strict-event-emitter": "^0.2.0",
+ "type-fest": "^1.2.2",
+ "yargs": "^17.0.1"
+ },
+ "bin": {
+ "msw": "cli/index.js"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mswjs"
+ }
+ },
+ "node_modules/msw/node_modules/type-fest": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
+ "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mute-stream": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+ "license": "ISC"
+ },
+ "node_modules/mv": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz",
+ "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "mkdirp": "~0.5.1",
+ "ncp": "~2.0.0",
+ "rimraf": "~2.4.0"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/mv/node_modules/glob": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
+ "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "2 || 3",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/mv/node_modules/rimraf": {
+ "version": "2.4.5",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz",
+ "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "glob": "^6.0.1"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/mylas": {
+ "version": "2.1.14",
+ "resolved": "https://registry.npmjs.org/mylas/-/mylas-2.1.14.tgz",
+ "integrity": "sha512-BzQguy9W9NJgoVn2mRWzbFrFWWztGCcng2QI9+41frfk+Athwgx3qhqhvStz7ExeUUu7Kzw427sNzHpEZNINog==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/raouldeheer"
+ }
+ },
+ "node_modules/nan": {
+ "version": "2.28.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.28.0.tgz",
+ "integrity": "sha512-fTsDz99OTq2sVePhGdp4qQhggZFtKr64ZNVyVajRKtMOkJxYekplBh577PiJB12v/D3s2E5cGtOI45LWp6rnLQ==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.18",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz",
+ "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/ncp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz",
+ "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==",
+ "license": "MIT",
+ "optional": true,
+ "bin": {
+ "ncp": "bin/ncp"
+ }
+ },
+ "node_modules/needle": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/needle/-/needle-3.5.0.tgz",
+ "integrity": "sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "iconv-lite": "^0.6.3",
+ "sax": "^1.2.4"
+ },
+ "bin": {
+ "needle": "bin/needle"
+ },
+ "engines": {
+ "node": ">= 4.4.x"
+ }
+ },
+ "node_modules/needle/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/node-addon-api": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
+ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/node-fetch": {
+ "version": "2.6.7",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
+ "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/node-match-path": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/node-match-path/-/node-match-path-0.6.3.tgz",
+ "integrity": "sha512-fB1reOHKLRZCJMAka28hIxCwQLxGmd7WewOCBDYKpyA1KXi68A7vaGgdZAPhY2E6SXoYt3KqYCCvXLJ+O0Fu/Q==",
+ "license": "MIT"
+ },
+ "node_modules/normalize-package-data": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
+ "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "hosted-git-info": "^4.0.1",
+ "is-core-module": "^2.5.0",
+ "semver": "^7.3.4",
+ "validate-npm-package-license": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalizr": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/normalizr/-/normalizr-3.6.2.tgz",
+ "integrity": "sha512-30qCybsBaCBciotorvuOZTCGEg2AXrJfADMT2Kk/lvpIAcipHdK0zc33nNtwKzyfQAqIJXAcqET6YgflYUgsoQ==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/numbro": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/numbro/-/numbro-1.11.1.tgz",
+ "integrity": "sha512-qL0Etqbunz4RtPx4bNjMONe9HyUpgbrM4Sa3VpWY5oRdp9ry5DufAj6lCvnIcluRBA9QUacrllYc73QK0G6VAw==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-hash": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
+ "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-is": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz",
+ "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz",
+ "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz",
+ "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ora": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
+ "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "bl": "^4.1.0",
+ "chalk": "^4.1.0",
+ "cli-cursor": "^3.1.0",
+ "cli-spinners": "^2.5.0",
+ "is-interactive": "^1.0.0",
+ "is-unicode-supported": "^0.1.0",
+ "log-symbols": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "wcwidth": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/outvariant": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz",
+ "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==",
+ "license": "MIT"
+ },
+ "node_modules/own-keys": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.2.tgz",
+ "integrity": "sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.4",
+ "get-intrinsic": "^1.3.0",
+ "object-keys": "^1.1.1",
+ "safe-push-apply": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-map": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.6.tgz",
+ "integrity": "sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parchment": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz",
+ "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse-node-version": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
+ "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/parse-srcset": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz",
+ "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==",
+ "license": "MIT"
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "license": "MIT"
+ },
+ "node_modules/path-to-regexp": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz",
+ "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pathe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+ "license": "MIT"
+ },
+ "node_modules/pathval": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz",
+ "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.16"
+ }
+ },
+ "node_modules/performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/plimit-lit": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/plimit-lit/-/plimit-lit-1.6.1.tgz",
+ "integrity": "sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==",
+ "license": "MIT",
+ "dependencies": {
+ "queue-lit": "^1.5.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/popmotion": {
+ "version": "11.0.3",
+ "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-11.0.3.tgz",
+ "integrity": "sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==",
+ "license": "MIT",
+ "dependencies": {
+ "framesync": "6.0.1",
+ "hey-listen": "^1.0.8",
+ "style-value-types": "5.0.0",
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/possible-typed-array-names": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.31",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+ "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
+ "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
+ "license": "MIT",
+ "dependencies": {
+ "lilconfig": "^2.0.5",
+ "yaml": "^1.10.2"
+ },
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-load-config/node_modules/yaml": {
+ "version": "1.10.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz",
+ "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/postcss-media-query-parser": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
+ "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==",
+ "license": "MIT"
+ },
+ "node_modules/postcss-modules-extract-imports": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz",
+ "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==",
+ "license": "ISC",
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-local-by-default": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz",
+ "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==",
+ "license": "MIT",
+ "dependencies": {
+ "icss-utils": "^5.0.0",
+ "postcss-selector-parser": "^7.0.0",
+ "postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": {
+ "version": "7.1.5",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz",
+ "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-modules-scope": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz",
+ "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==",
+ "license": "ISC",
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": {
+ "version": "7.1.5",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz",
+ "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-resolve-nested-selector": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz",
+ "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==",
+ "license": "MIT"
+ },
+ "node_modules/postcss-safe-parser": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
+ "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3.3"
+ }
+ },
+ "node_modules/postcss-scss": {
+ "version": "4.0.9",
+ "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz",
+ "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss-scss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.29"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz",
+ "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "license": "MIT"
+ },
+ "node_modules/probe-image-size": {
+ "version": "7.4.0",
+ "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.4.0.tgz",
+ "integrity": "sha512-cdEprVtZxV+awMde9X+4jILBFYh4CARxVrQaMl4wY4YcPWbul9jntXrIW95NInBDyJwcVUP3U0T6yukN8rMBaQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/puzrin"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nodeca"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "lodash.merge": "^4.6.2",
+ "needle": "^2.5.2",
+ "stream-parser": "~0.3.1"
+ }
+ },
+ "node_modules/probe-image-size/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/probe-image-size/node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/probe-image-size/node_modules/needle": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz",
+ "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "debug": "^3.2.6",
+ "iconv-lite": "^0.4.4",
+ "sax": "^1.2.4"
+ },
+ "bin": {
+ "needle": "bin/needle"
+ },
+ "engines": {
+ "node": ">= 4.4.x"
+ }
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/prop-types-exact": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/prop-types-exact/-/prop-types-exact-1.2.7.tgz",
+ "integrity": "sha512-A4RaV6mg3jocQqBYmqi2ojJ2VnV4AKTEHhl3xHsud08/u87gcVJc8DUOtgnPegoOCQv/shUqEk4eZGYibjnHzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.2",
+ "isarray": "^2.0.5",
+ "object.assign": "^4.1.7",
+ "own-keys": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/prr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+ "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/query-string": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz",
+ "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==",
+ "license": "MIT",
+ "dependencies": {
+ "decode-uri-component": "^0.2.0",
+ "object-assign": "^4.1.0",
+ "strict-uri-encode": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/queue-lit": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/queue-lit/-/queue-lit-1.5.2.tgz",
+ "integrity": "sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/quick-lru": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
+ "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/quill": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz",
+ "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "clone": "^2.1.1",
+ "deep-equal": "^1.0.1",
+ "eventemitter3": "^2.0.3",
+ "extend": "^3.0.2",
+ "parchment": "^1.1.4",
+ "quill-delta": "^3.6.2"
+ }
+ },
+ "node_modules/quill-delta": {
+ "version": "3.6.3",
+ "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz",
+ "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==",
+ "license": "MIT",
+ "dependencies": {
+ "deep-equal": "^1.0.1",
+ "extend": "^3.0.2",
+ "fast-diff": "1.1.2"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/quill/node_modules/clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/raf": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
+ "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
+ "license": "MIT",
+ "dependencies": {
+ "performance-now": "^2.1.0"
+ }
+ },
+ "node_modules/re-reselect": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/re-reselect/-/re-reselect-4.0.0.tgz",
+ "integrity": "sha512-wuygyq8TXUlSdVXv2kigXxQNOgdb9m7LbIjwfTNGSpaY1riLd5e+VeQjlQMyUtrk0oiyhi1AqIVynworl3qxHA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "reselect": ">1.0.0"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-clientside-effect": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.8.tgz",
+ "integrity": "sha512-ma2FePH0z3px2+WOu6h+YycZcEvFmmxIlAb62cF52bG86eMySciO/EQZeQMXd07kPCYB0a1dWDT5J+KE9mCDUw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.13"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ }
+ },
+ "node_modules/react-color": {
+ "version": "2.19.3",
+ "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.19.3.tgz",
+ "integrity": "sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==",
+ "license": "MIT",
+ "dependencies": {
+ "@icons/material": "^0.2.4",
+ "lodash": "^4.17.15",
+ "lodash-es": "^4.17.15",
+ "material-colors": "^1.2.1",
+ "prop-types": "^15.5.10",
+ "reactcss": "^1.2.0",
+ "tinycolor2": "^1.4.1"
+ },
+ "peerDependencies": {
+ "react": "*"
+ }
+ },
+ "node_modules/react-colorful": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.8.0.tgz",
+ "integrity": "sha512-Wy9OzPfjSN9bF12OB8N7UQvlsZ0I+7wHxpN+bV5BjNQGxOj6IiwkRjevJK9yOBjJWGQvAaf1OXtn8rUeEatAng==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "node_modules/react-day-picker": {
+ "version": "8.10.2",
+ "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.2.tgz",
+ "integrity": "sha512-LK68OTbHB3oJNhl9cA0qVizzp3o26w61YSjAFkYi67N86iro32wx86kSNeFU/hq+gI8m1yzWhnomMLfZ041RzQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "individual",
+ "url": "https://github.com/sponsors/gpbl"
+ },
+ "peerDependencies": {
+ "date-fns": "^2.28.0 || ^3.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.2"
+ },
+ "peerDependencies": {
+ "react": "^18.3.1"
+ }
+ },
+ "node_modules/react-dom-factories": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/react-dom-factories/-/react-dom-factories-1.0.2.tgz",
+ "integrity": "sha512-Bmic2N3oKji7vw9qjDr2dmwHvOATbFSnKy7EH0uT/qjvzIUsiXp6Yquk72LJ3WfMtRnq3ujXMMo7GsJeLPfFWw==",
+ "license": "MIT"
+ },
+ "node_modules/react-error-boundary": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-4.1.2.tgz",
+ "integrity": "sha512-GQDxZ5Jd+Aq/qUxbCm1UtzmL/s++V7zKgE8yMktJiCQXCCFZnMZh9ng+6/Ne6PjNSXH0L9CjeOEREfRnq6Duag==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5"
+ },
+ "peerDependencies": {
+ "react": ">=16.13.1"
+ }
+ },
+ "node_modules/react-fast-compare": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz",
+ "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==",
+ "license": "MIT"
+ },
+ "node_modules/react-focus-lock": {
+ "version": "2.13.7",
+ "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.13.7.tgz",
+ "integrity": "sha512-20lpZHEQrXPb+pp1tzd4ULL6DyO5D2KnR0G69tTDdydrmNhU7pdFmbQUYVyHUgp+xN29IuFR0PVuhOmvaZL9Og==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.0.0",
+ "focus-lock": "^1.3.6",
+ "prop-types": "^15.6.2",
+ "react-clientside-effect": "^1.2.7",
+ "use-callback-ref": "^1.3.3",
+ "use-sidecar": "^1.1.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-from-dom": {
+ "version": "0.7.5",
+ "resolved": "https://registry.npmjs.org/react-from-dom/-/react-from-dom-0.7.5.tgz",
+ "integrity": "sha512-CO92PmMKo/23uYPm6OFvh5CtZbMgHs/Xn+o095Lz/TZj9t8DSDhGdSOMLxBxwWI4sr0MF17KUn9yJWc5Q00R/w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "16.8 - 19"
+ }
+ },
+ "node_modules/react-inlinesvg": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/react-inlinesvg/-/react-inlinesvg-4.5.0.tgz",
+ "integrity": "sha512-J/ZWLCmYdhOu5a+dWBNKXaQb/YFvTjqTZnoaprOUKD2geu+JcO1sZ2AcrXvzYurgQIuI3Y4+Ji2dUjsO86nhgw==",
+ "license": "MIT",
+ "dependencies": {
+ "react-from-dom": "^0.7.5"
+ },
+ "peerDependencies": {
+ "react": "16.8 - 19"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "license": "MIT"
+ },
+ "node_modules/react-lifecycles-compat": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
+ "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==",
+ "license": "MIT"
+ },
+ "node_modules/react-moment-proptypes": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/react-moment-proptypes/-/react-moment-proptypes-1.8.1.tgz",
+ "integrity": "sha512-Er940DxWoObfIqPrZNfwXKugjxMIuk1LAuEzn23gytzV6hKS/sw108wibi9QubfMN4h+nrlje8eUCSbQRJo2fQ==",
+ "license": "MIT",
+ "dependencies": {
+ "moment": ">=1.6.0"
+ },
+ "peerDependencies": {
+ "moment": ">=1.6.0"
+ }
+ },
+ "node_modules/react-outside-click-handler": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/react-outside-click-handler/-/react-outside-click-handler-1.3.0.tgz",
+ "integrity": "sha512-Te/7zFU0oHpAnctl//pP3hEAeobfeHMyygHB8MnjP6sX5OR8KHT1G3jmLsV3U9RnIYo+Yn+peJYWu+D5tUS8qQ==",
+ "license": "MIT",
+ "dependencies": {
+ "airbnb-prop-types": "^2.15.0",
+ "consolidated-events": "^1.1.1 || ^2.0.0",
+ "document.contains": "^1.0.1",
+ "object.values": "^1.1.0",
+ "prop-types": "^15.7.2"
+ },
+ "peerDependencies": {
+ "react": "^0.14 || >=15",
+ "react-dom": "^0.14 || >=15"
+ }
+ },
+ "node_modules/react-outside-click-handler/node_modules/airbnb-prop-types": {
+ "version": "2.16.0",
+ "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz",
+ "integrity": "sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==",
+ "deprecated": "This package has been renamed to 'prop-types-tools'",
+ "license": "MIT",
+ "dependencies": {
+ "array.prototype.find": "^2.1.1",
+ "function.prototype.name": "^1.1.2",
+ "is-regex": "^1.1.0",
+ "object-is": "^1.1.2",
+ "object.assign": "^4.1.0",
+ "object.entries": "^1.1.2",
+ "prop-types": "^15.7.2",
+ "prop-types-exact": "^1.2.0",
+ "react-is": "^16.13.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ },
+ "peerDependencies": {
+ "react": "^0.14 || ^15.0.0 || ^16.0.0-alpha"
+ }
+ },
+ "node_modules/react-popper": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz",
+ "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "react-fast-compare": "^3.0.1",
+ "warning": "^4.0.2"
+ },
+ "peerDependencies": {
+ "@popperjs/core": "^2.0.0",
+ "react": "^16.8.0 || ^17 || ^18",
+ "react-dom": "^16.8.0 || ^17 || ^18"
+ }
+ },
+ "node_modules/react-portal": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/react-portal/-/react-portal-4.3.0.tgz",
+ "integrity": "sha512-qs/2uKq1ifB3J1+K8ExfgUvCDZqlqCkfOEhqTELEDTfosloKiuzOzc7hl7IQ/7nohiFZD41BUYU0boAsIsGYHw==",
+ "license": "MIT",
+ "dependencies": {
+ "prop-types": "^15.5.8"
+ },
+ "peerDependencies": {
+ "react": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0",
+ "react-dom": "^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0"
+ }
+ },
+ "node_modules/react-remove-scroll": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz",
+ "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==",
+ "license": "MIT",
+ "dependencies": {
+ "react-remove-scroll-bar": "^2.3.7",
+ "react-style-singleton": "^2.2.3",
+ "tslib": "^2.1.0",
+ "use-callback-ref": "^1.3.3",
+ "use-sidecar": "^1.1.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-remove-scroll-bar": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz",
+ "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==",
+ "license": "MIT",
+ "dependencies": {
+ "react-style-singleton": "^2.2.2",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-style-singleton": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
+ "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==",
+ "license": "MIT",
+ "dependencies": {
+ "get-nonce": "^1.0.0",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-transition-group": {
+ "version": "4.4.5",
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
+ "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "dom-helpers": "^5.0.1",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.6.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.6.0",
+ "react-dom": ">=16.6.0"
+ }
+ },
+ "node_modules/react-virtualized-auto-sizer": {
+ "version": "1.0.26",
+ "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.26.tgz",
+ "integrity": "sha512-CblNyiNVw2o+hsa5/49NH2ogGxZ+t+3aweRvNSq7TVjDIlwk7ir4lencEg5HxHeSzwNarSkNkiu0qJSOXtxm5A==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/react-window": {
+ "version": "1.8.11",
+ "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.11.tgz",
+ "integrity": "sha512-+SRbUVT2scadgFSWx+R1P754xHPEqvcfSfVX10QYg6POOz+WNgkN48pS+BtZNIMGiL1HYrSEiCkwsMS15QogEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.0.0",
+ "memoize-one": ">=3.1.1 <6"
+ },
+ "engines": {
+ "node": ">8.0.0"
+ },
+ "peerDependencies": {
+ "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/react-with-styles": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/react-with-styles/-/react-with-styles-4.2.0.tgz",
+ "integrity": "sha512-tZCTY27KriRNhwHIbg1NkSdTTOSfXDg6Z7s+Q37mtz0Ym7Sc7IOr3PzVt4qJhJMW6Nkvfi3g34FuhtiGAJCBQA==",
+ "license": "MIT",
+ "dependencies": {
+ "airbnb-prop-types": "^2.14.0",
+ "hoist-non-react-statics": "^3.2.1",
+ "object.assign": "^4.1.0",
+ "prop-types": "^15.7.2",
+ "react-with-direction": "^1.3.1"
+ },
+ "peerDependencies": {
+ "@babel/runtime": "^7.0.0",
+ "react": ">=0.14",
+ "react-with-direction": "^1.3.1"
+ }
+ },
+ "node_modules/react-with-styles-interface-css": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/react-with-styles-interface-css/-/react-with-styles-interface-css-6.0.0.tgz",
+ "integrity": "sha512-6khSG1Trf4L/uXOge/ZAlBnq2O2PEXlQEqAhCRbvzaQU4sksIkdwpCPEl6d+DtP3+IdhyffTWuHDO9lhe1iYvA==",
+ "license": "MIT",
+ "dependencies": {
+ "array.prototype.flat": "^1.2.1",
+ "global-cache": "^1.2.1"
+ },
+ "peerDependencies": {
+ "@babel/runtime": "^7.0.0",
+ "react-with-styles": "^3.0.0 || ^4.0.0"
+ }
+ },
+ "node_modules/react-with-styles/node_modules/airbnb-prop-types": {
+ "version": "2.16.0",
+ "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz",
+ "integrity": "sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==",
+ "deprecated": "This package has been renamed to 'prop-types-tools'",
+ "license": "MIT",
+ "dependencies": {
+ "array.prototype.find": "^2.1.1",
+ "function.prototype.name": "^1.1.2",
+ "is-regex": "^1.1.0",
+ "object-is": "^1.1.2",
+ "object.assign": "^4.1.0",
+ "object.entries": "^1.1.2",
+ "prop-types": "^15.7.2",
+ "prop-types-exact": "^1.2.0",
+ "react-is": "^16.13.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ },
+ "peerDependencies": {
+ "react": "^0.14 || ^15.0.0 || ^16.0.0-alpha"
+ }
+ },
+ "node_modules/react-with-styles/node_modules/deepmerge": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz",
+ "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-with-styles/node_modules/react-dom": {
+ "version": "16.14.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz",
+ "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2",
+ "scheduler": "^0.19.1"
+ },
+ "peerDependencies": {
+ "react": "^16.14.0"
+ }
+ },
+ "node_modules/react-with-styles/node_modules/react-with-direction": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/react-with-direction/-/react-with-direction-1.4.0.tgz",
+ "integrity": "sha512-ybHNPiAmaJpoWwugwqry9Hd1Irl2hnNXlo/2SXQBwbLn/jGMauMS2y9jw+ydyX5V9ICryCqObNSthNt5R94xpg==",
+ "license": "MIT",
+ "dependencies": {
+ "airbnb-prop-types": "^2.16.0",
+ "brcast": "^2.0.2",
+ "deepmerge": "^1.5.2",
+ "direction": "^1.0.4",
+ "hoist-non-react-statics": "^3.3.2",
+ "object.assign": "^4.1.2",
+ "object.values": "^1.1.5",
+ "prop-types": "^15.7.2"
+ },
+ "peerDependencies": {
+ "react": "^0.14 || ^15 || ^16",
+ "react-dom": "^0.14 || ^15 || ^16"
+ }
+ },
+ "node_modules/react-with-styles/node_modules/scheduler": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz",
+ "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "node_modules/react-youtube": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/react-youtube/-/react-youtube-10.1.0.tgz",
+ "integrity": "sha512-ZfGtcVpk0SSZtWCSTYOQKhfx5/1cfyEW1JN/mugGNfAxT3rmVJeMbGpA9+e78yG21ls5nc/5uZJETE3cm3knBg==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "3.1.3",
+ "prop-types": "15.8.1",
+ "youtube-player": "5.5.2"
+ },
+ "engines": {
+ "node": ">= 14.x"
+ },
+ "peerDependencies": {
+ "react": ">=0.14.1"
+ }
+ },
+ "node_modules/reactcss": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz",
+ "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==",
+ "license": "MIT",
+ "dependencies": {
+ "lodash": "^4.0.1"
+ }
+ },
+ "node_modules/read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/read-pkg/node_modules/hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "license": "ISC"
+ },
+ "node_modules/read-pkg/node_modules/normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "node_modules/read-pkg/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/read-pkg/node_modules/type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/redent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+ "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+ "license": "MIT",
+ "dependencies": {
+ "indent-string": "^4.0.0",
+ "strip-indent": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
+ "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.1",
+ "which-builtin-type": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+ "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/reselect": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.2.0.tgz",
+ "integrity": "sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==",
+ "license": "MIT"
+ },
+ "node_modules/reserved-words": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz",
+ "integrity": "sha512-0S5SrIUJ9LfpbVl4Yzij6VipUdafHrOTzvmfazSw/jeZrZtQK303OPZW+obtkaw7jQlTQppy0UvZWm9872PbRw==",
+ "license": "MIT"
+ },
+ "node_modules/resolve": {
+ "version": "1.22.12",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz",
+ "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "is-core-module": "^2.16.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-pkg-maps": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
+ }
+ },
+ "node_modules/restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "license": "MIT",
+ "dependencies": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/rettime": {
+ "version": "0.11.11",
+ "resolved": "https://registry.npmjs.org/rettime/-/rettime-0.11.11.tgz",
+ "integrity": "sha512-ILJRqVWBCTlg9r42fFgwVZx1gnFAcQF8mRoMkbgQfIrjEDf9nbBFDFx00oloOa+Q869FUtaYDXZvEfnecQSCoQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rgbcolor": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz",
+ "integrity": "sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==",
+ "license": "MIT OR SEE LICENSE IN FEEL-FREE.md",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.8.15"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rolldown": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz",
+ "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@oxc-project/types": "=0.139.0",
+ "@rolldown/pluginutils": "^1.0.0"
+ },
+ "bin": {
+ "rolldown": "bin/cli.mjs"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "optionalDependencies": {
+ "@rolldown/binding-android-arm64": "1.1.5",
+ "@rolldown/binding-darwin-arm64": "1.1.5",
+ "@rolldown/binding-darwin-x64": "1.1.5",
+ "@rolldown/binding-freebsd-x64": "1.1.5",
+ "@rolldown/binding-linux-arm-gnueabihf": "1.1.5",
+ "@rolldown/binding-linux-arm64-gnu": "1.1.5",
+ "@rolldown/binding-linux-arm64-musl": "1.1.5",
+ "@rolldown/binding-linux-ppc64-gnu": "1.1.5",
+ "@rolldown/binding-linux-s390x-gnu": "1.1.5",
+ "@rolldown/binding-linux-x64-gnu": "1.1.5",
+ "@rolldown/binding-linux-x64-musl": "1.1.5",
+ "@rolldown/binding-openharmony-arm64": "1.1.5",
+ "@rolldown/binding-wasm32-wasi": "1.1.5",
+ "@rolldown/binding-win32-arm64-msvc": "1.1.5",
+ "@rolldown/binding-win32-x64-msvc": "1.1.5"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.62.3",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.3.tgz",
+ "integrity": "sha512-Gu0c0iH9FzgX1L1t7ByIbbS3Vmdz+6KHm/EsqmmC71gUQ82yvZRkTK6XzrFObSka91WUVdynqp6nsfilzr5k6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.9"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.62.3",
+ "@rollup/rollup-android-arm64": "4.62.3",
+ "@rollup/rollup-darwin-arm64": "4.62.3",
+ "@rollup/rollup-darwin-x64": "4.62.3",
+ "@rollup/rollup-freebsd-arm64": "4.62.3",
+ "@rollup/rollup-freebsd-x64": "4.62.3",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.62.3",
+ "@rollup/rollup-linux-arm-musleabihf": "4.62.3",
+ "@rollup/rollup-linux-arm64-gnu": "4.62.3",
+ "@rollup/rollup-linux-arm64-musl": "4.62.3",
+ "@rollup/rollup-linux-loong64-gnu": "4.62.3",
+ "@rollup/rollup-linux-loong64-musl": "4.62.3",
+ "@rollup/rollup-linux-ppc64-gnu": "4.62.3",
+ "@rollup/rollup-linux-ppc64-musl": "4.62.3",
+ "@rollup/rollup-linux-riscv64-gnu": "4.62.3",
+ "@rollup/rollup-linux-riscv64-musl": "4.62.3",
+ "@rollup/rollup-linux-s390x-gnu": "4.62.3",
+ "@rollup/rollup-linux-x64-gnu": "4.62.3",
+ "@rollup/rollup-linux-x64-musl": "4.62.3",
+ "@rollup/rollup-openbsd-x64": "4.62.3",
+ "@rollup/rollup-openharmony-arm64": "4.62.3",
+ "@rollup/rollup-win32-arm64-msvc": "4.62.3",
+ "@rollup/rollup-win32-ia32-msvc": "4.62.3",
+ "@rollup/rollup-win32-x64-gnu": "4.62.3",
+ "@rollup/rollup-win32-x64-msvc": "4.62.3",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/rollup-plugin-preserve-shebangs": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-preserve-shebangs/-/rollup-plugin-preserve-shebangs-0.2.0.tgz",
+ "integrity": "sha512-OEyTIfZwUJ7yUAVAbegac/bNvp1WJzgZcQNCFprWX42wwwOqlJwrev9lUmzZdYVgCWct+03xUPvZg4RfgkM9oQ==",
+ "license": "MIT",
+ "dependencies": {
+ "magic-string": "^0.25.7"
+ },
+ "peerDependencies": {
+ "rollup": "*"
+ }
+ },
+ "node_modules/rollup-plugin-preserve-shebangs/node_modules/magic-string": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
+ "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+ "license": "MIT",
+ "dependencies": {
+ "sourcemap-codec": "^1.4.8"
+ }
+ },
+ "node_modules/run-async": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/rxjs": {
+ "version": "7.8.2",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
+ "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz",
+ "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.9",
+ "call-bound": "^1.0.4",
+ "get-intrinsic": "^1.3.0",
+ "has-symbols": "^1.1.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safe-json-stringify": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz",
+ "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/safe-push-apply": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
+ "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
+ },
+ "node_modules/sanitize-html": {
+ "version": "2.17.5",
+ "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.17.5.tgz",
+ "integrity": "sha512-ZmU1joGRrvoyctKIiuwUxqR6moLoU2Wk+2bMccN6f7UwhAmwYDvWziqPxRDDN2Qip62NqnIrVrT9akbL6Wretg==",
+ "license": "MIT",
+ "dependencies": {
+ "deepmerge": "^4.2.2",
+ "escape-string-regexp": "^4.0.0",
+ "htmlparser2": "^10.1.0",
+ "is-plain-object": "^5.0.0",
+ "launder": "^1.7.1",
+ "parse-srcset": "^1.0.2",
+ "postcss": "^8.3.11"
+ }
+ },
+ "node_modules/sanitize-html/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/sass": {
+ "version": "1.102.0",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.102.0.tgz",
+ "integrity": "sha512-NSOyTnaQF7rTAEOtI2fwb386vL+akyiQLBZu8Na7hXCb+umJy0GAqlcMIaqACZ6Z1VgTBS4K9PG6B3IdjHGJsw==",
+ "license": "MIT",
+ "dependencies": {
+ "chokidar": "^5.0.0",
+ "immutable": "^5.1.5",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher": "^2.4.1"
+ }
+ },
+ "node_modules/sass/node_modules/chokidar": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
+ "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 20.19.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/sass/node_modules/immutable": {
+ "version": "5.1.9",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz",
+ "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==",
+ "license": "MIT"
+ },
+ "node_modules/sass/node_modules/readdirp": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz",
+ "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20.19.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/sax": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz",
+ "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==",
+ "license": "BlueOak-1.0.0",
+ "optional": true,
+ "engines": {
+ "node": ">=11.0.0"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/set-cookie-parser": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz",
+ "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==",
+ "license": "MIT"
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-proto": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
+ "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/shell-quote": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.9.0.tgz",
+ "integrity": "sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz",
+ "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.4",
+ "side-channel-list": "^1.0.1",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz",
+ "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/siginfo": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
+ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
+ "license": "ISC"
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "license": "ISC"
+ },
+ "node_modules/sister": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/sister/-/sister-3.0.2.tgz",
+ "integrity": "sha512-p19rtTs+NksBRKW9qn0UhZ8/TUI9BPw9lmtHny+Y3TinWlOa9jWh9xB0AtPSdmOy49NJJJSSe0Ey4C7h0TrcYA==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sourcemap-codec": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+ "deprecated": "Please use @jridgewell/sourcemap-codec instead",
+ "license": "MIT"
+ },
+ "node_modules/spdx-correct": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
+ "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-exceptions": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
+ "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
+ "license": "CC-BY-3.0"
+ },
+ "node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-license-ids": {
+ "version": "3.0.23",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz",
+ "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/split-on-first": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz",
+ "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/stackback": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
+ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
+ "license": "MIT"
+ },
+ "node_modules/stackblur-canvas": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz",
+ "integrity": "sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.1.14"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/std-env": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz",
+ "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==",
+ "license": "MIT"
+ },
+ "node_modules/stop-iteration-iterator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
+ "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "internal-slot": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/stream-parser": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz",
+ "integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "debug": "2"
+ }
+ },
+ "node_modules/stream-parser/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/stream-parser/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/strict-event-emitter": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.2.8.tgz",
+ "integrity": "sha512-KDf/ujU8Zud3YaLtMCcTI4xkZlZVIYxTLr+XIULexP+77EEVWixeXroLUXQXiVtH4XH2W7jr/3PT1v3zBuvc3A==",
+ "license": "MIT",
+ "dependencies": {
+ "events": "^3.3.0"
+ }
+ },
+ "node_modules/strict-uri-encode": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
+ "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz",
+ "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.9",
+ "call-bound": "^1.0.4",
+ "define-data-property": "^1.1.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.24.2",
+ "es-object-atoms": "^1.1.2",
+ "has-property-descriptors": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz",
+ "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.9",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-indent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+ "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "min-indent": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-literal": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz",
+ "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==",
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^9.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/strip-literal/node_modules/js-tokens": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz",
+ "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==",
+ "license": "MIT"
+ },
+ "node_modules/style-inject": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz",
+ "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==",
+ "license": "MIT"
+ },
+ "node_modules/style-search": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
+ "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==",
+ "license": "ISC"
+ },
+ "node_modules/style-value-types": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-5.0.0.tgz",
+ "integrity": "sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==",
+ "license": "MIT",
+ "dependencies": {
+ "hey-listen": "^1.0.8",
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/stylelint": {
+ "version": "14.16.1",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz",
+ "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==",
+ "license": "MIT",
+ "dependencies": {
+ "@csstools/selector-specificity": "^2.0.2",
+ "balanced-match": "^2.0.0",
+ "colord": "^2.9.3",
+ "cosmiconfig": "^7.1.0",
+ "css-functions-list": "^3.1.0",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.2.12",
+ "fastest-levenshtein": "^1.0.16",
+ "file-entry-cache": "^6.0.1",
+ "global-modules": "^2.0.0",
+ "globby": "^11.1.0",
+ "globjoin": "^0.1.4",
+ "html-tags": "^3.2.0",
+ "ignore": "^5.2.1",
+ "import-lazy": "^4.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-plain-object": "^5.0.0",
+ "known-css-properties": "^0.26.0",
+ "mathml-tag-names": "^2.1.3",
+ "meow": "^9.0.0",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.19",
+ "postcss-media-query-parser": "^0.2.3",
+ "postcss-resolve-nested-selector": "^0.1.1",
+ "postcss-safe-parser": "^6.0.0",
+ "postcss-selector-parser": "^6.0.11",
+ "postcss-value-parser": "^4.2.0",
+ "resolve-from": "^5.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1",
+ "style-search": "^0.1.0",
+ "supports-hyperlinks": "^2.3.0",
+ "svg-tags": "^1.0.0",
+ "table": "^6.8.1",
+ "v8-compile-cache": "^2.3.0",
+ "write-file-atomic": "^4.0.2"
+ },
+ "bin": {
+ "stylelint": "bin/stylelint.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/stylelint"
+ }
+ },
+ "node_modules/stylus": {
+ "version": "0.62.0",
+ "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.62.0.tgz",
+ "integrity": "sha512-v3YCf31atbwJQIMtPNX8hcQ+okD4NQaTuKGUWfII8eaqn+3otrbttGL1zSMZAAtiPsBztQnujVBugg/cXFUpyg==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@adobe/css-tools": "~4.3.1",
+ "debug": "^4.3.2",
+ "glob": "^7.1.6",
+ "sax": "~1.3.0",
+ "source-map": "^0.7.3"
+ },
+ "bin": {
+ "stylus": "bin/stylus"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://opencollective.com/stylus"
+ }
+ },
+ "node_modules/stylus/node_modules/sax": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz",
+ "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==",
+ "license": "ISC",
+ "optional": true
+ },
+ "node_modules/stylus/node_modules/source-map": {
+ "version": "0.7.6",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz",
+ "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==",
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-hyperlinks": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz",
+ "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/svg-pathdata": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz",
+ "integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/svg-tags": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
+ "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA=="
+ },
+ "node_modules/tabbable": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.5.0.tgz",
+ "integrity": "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==",
+ "license": "MIT"
+ },
+ "node_modules/table": {
+ "version": "6.9.0",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz",
+ "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "ajv": "^8.0.1",
+ "lodash.truncate": "^4.4.2",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/tagged-tag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz",
+ "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/text-segmentation": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz",
+ "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "utrie": "^1.0.2"
+ }
+ },
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "license": "MIT"
+ },
+ "node_modules/tiny-emitter": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
+ "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==",
+ "license": "MIT"
+ },
+ "node_modules/tinybench": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
+ "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
+ "license": "MIT"
+ },
+ "node_modules/tinycolor2": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz",
+ "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==",
+ "license": "MIT"
+ },
+ "node_modules/tinyexec": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
+ "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
+ "license": "MIT"
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
+ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tinyglobby/node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tinyglobby/node_modules/picomatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
+ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/tinypool": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz",
+ "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==",
+ "license": "MIT",
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ }
+ },
+ "node_modules/tinyrainbow": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz",
+ "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tinyspy": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz",
+ "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tldts": {
+ "version": "7.4.10",
+ "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.10.tgz",
+ "integrity": "sha512-GgouD1B+sWwvkaEq8vXC15DjQitxbvs12oIXELpconwm+Tg3zfcEv4jgzq3vtKverDXsg3VI8aRgNL2Nra0Iog==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "tldts-core": "^7.4.10"
+ },
+ "bin": {
+ "tldts": "bin/cli.js"
+ }
+ },
+ "node_modules/tldts-core": {
+ "version": "7.4.10",
+ "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.10.tgz",
+ "integrity": "sha512-KnQjp53ZekKgm/r3l+u8kJGGzYgrWdP8+Mql7a4vijh2WE0IrZWspQj/TpTxDho/YxO+AnOZnIjQcCD+q6iJsw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/tough-cookie": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.2.tgz",
+ "integrity": "sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==",
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "tldts": "^7.0.5"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+ "license": "MIT"
+ },
+ "node_modules/tree-kill": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+ "license": "MIT",
+ "bin": {
+ "tree-kill": "cli.js"
+ }
+ },
+ "node_modules/trim-newlines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
+ "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tsc-alias": {
+ "version": "1.8.15",
+ "resolved": "https://registry.npmjs.org/tsc-alias/-/tsc-alias-1.8.15.tgz",
+ "integrity": "sha512-yKLVx8ddUurRwhVcS6JFF2ZjksOX2ZWDRIdgt+PQhJBDegIdAdilptiHsuAbx9UFxa16GFrxeKQ2kTcGvR6fkQ==",
+ "license": "MIT",
+ "dependencies": {
+ "chokidar": "^3.5.3",
+ "commander": "^9.0.0",
+ "get-tsconfig": "^4.10.0",
+ "globby": "^11.0.4",
+ "mylas": "^2.1.9",
+ "normalize-path": "^3.0.0",
+ "plimit-lit": "^1.2.6"
+ },
+ "bin": {
+ "tsc-alias": "dist/bin/index.js"
+ },
+ "engines": {
+ "node": ">=16.20.2"
+ }
+ },
+ "node_modules/tsconfig-paths": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz",
+ "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==",
+ "license": "MIT",
+ "dependencies": {
+ "json5": "^2.2.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/type-fest": {
+ "version": "0.18.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
+ "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+ "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+ "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.15",
+ "reflect.getprototypeof": "^1.0.9"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz",
+ "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.9",
+ "for-each": "^0.3.5",
+ "gopd": "^1.2.0",
+ "is-typed-array": "^1.1.15",
+ "possible-typed-array-names": "^1.1.0",
+ "reflect.getprototypeof": "^1.0.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz",
+ "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==",
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc"
+ },
+ "engines": {
+ "node": ">=16.20.0"
+ },
+ "optionalDependencies": {
+ "@typescript/typescript-aix-ppc64": "7.0.2",
+ "@typescript/typescript-darwin-arm64": "7.0.2",
+ "@typescript/typescript-darwin-x64": "7.0.2",
+ "@typescript/typescript-freebsd-arm64": "7.0.2",
+ "@typescript/typescript-freebsd-x64": "7.0.2",
+ "@typescript/typescript-linux-arm": "7.0.2",
+ "@typescript/typescript-linux-arm64": "7.0.2",
+ "@typescript/typescript-linux-loong64": "7.0.2",
+ "@typescript/typescript-linux-mips64el": "7.0.2",
+ "@typescript/typescript-linux-ppc64": "7.0.2",
+ "@typescript/typescript-linux-riscv64": "7.0.2",
+ "@typescript/typescript-linux-s390x": "7.0.2",
+ "@typescript/typescript-linux-x64": "7.0.2",
+ "@typescript/typescript-netbsd-arm64": "7.0.2",
+ "@typescript/typescript-netbsd-x64": "7.0.2",
+ "@typescript/typescript-openbsd-arm64": "7.0.2",
+ "@typescript/typescript-openbsd-x64": "7.0.2",
+ "@typescript/typescript-sunos-x64": "7.0.2",
+ "@typescript/typescript-win32-arm64": "7.0.2",
+ "@typescript/typescript-win32-x64": "7.0.2"
+ }
+ },
+ "node_modules/typescript-plugin-css-modules": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/typescript-plugin-css-modules/-/typescript-plugin-css-modules-5.2.0.tgz",
+ "integrity": "sha512-c5pAU5d+m3GciDr/WhkFldz1NIEGBafuP/3xhFt9BEXS2gmn/LvjkoZ11vEBIuP8LkXfPNhOt1BUhM5efFuwOw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/postcss-modules-local-by-default": "^4.0.2",
+ "@types/postcss-modules-scope": "^3.0.4",
+ "dotenv": "^16.4.2",
+ "icss-utils": "^5.1.0",
+ "less": "^4.2.0",
+ "lodash.camelcase": "^4.3.0",
+ "postcss": "^8.4.35",
+ "postcss-load-config": "^3.1.4",
+ "postcss-modules-extract-imports": "^3.0.0",
+ "postcss-modules-local-by-default": "^4.0.4",
+ "postcss-modules-scope": "^3.1.1",
+ "reserved-words": "^0.1.2",
+ "sass": "^1.70.0",
+ "source-map-js": "^1.0.2",
+ "tsconfig-paths": "^4.2.0"
+ },
+ "optionalDependencies": {
+ "stylus": "^0.62.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.0.0"
+ }
+ },
+ "node_modules/typescript-plugin-css-modules/node_modules/postcss": {
+ "version": "8.5.26",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz",
+ "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.17",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+ "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "which-boxed-primitive": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz",
+ "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==",
+ "license": "MIT"
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/until-async": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz",
+ "integrity": "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "funding": {
+ "url": "https://github.com/sponsors/kettanaito"
+ }
+ },
+ "node_modules/use-callback-ref": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
+ "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/use-debounce": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/use-debounce/-/use-debounce-5.2.1.tgz",
+ "integrity": "sha512-BQG5uEypYHd/ASF6imzYR8tJHh5qGn28oZG/5iVAbljV6MUrfyT4jzxA8co+L+WLCT1U8VBwzzvlb3CHmUDpEA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ }
+ },
+ "node_modules/use-sidecar": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz",
+ "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "detect-node-es": "^1.1.0",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/use-sync-external-store": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
+ "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "license": "MIT"
+ },
+ "node_modules/utrie": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz",
+ "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "base64-arraybuffer": "^1.0.2"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/v8-compile-cache": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz",
+ "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==",
+ "license": "MIT"
+ },
+ "node_modules/validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "node_modules/validator": {
+ "version": "13.15.35",
+ "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.35.tgz",
+ "integrity": "sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/vite": {
+ "version": "8.1.5",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.5.tgz",
+ "integrity": "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lightningcss": "^1.32.0",
+ "picomatch": "^4.0.5",
+ "postcss": "^8.5.17",
+ "rolldown": "~1.1.5",
+ "tinyglobby": "^0.2.17"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "@vitejs/devtools": "^0.3.0",
+ "esbuild": "^0.27.0 || ^0.28.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "@vitejs/devtools": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-node": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz",
+ "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==",
+ "license": "MIT",
+ "dependencies": {
+ "cac": "^6.7.14",
+ "debug": "^4.4.1",
+ "es-module-lexer": "^1.7.0",
+ "pathe": "^2.0.3",
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0"
+ },
+ "bin": {
+ "vite-node": "vite-node.mjs"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/vite-node/node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-node/node_modules/picomatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
+ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/vite-node/node_modules/postcss": {
+ "version": "8.5.24",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.24.tgz",
+ "integrity": "sha512-8RyVklq0owXUTa4xlpzu4l9AaVKIdQvAcOHZWaMh98HgySsUtxRVf/chRe3dsSLqb6i40BzGRzEUddRaI+9TSw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.16",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/vite-node/node_modules/vite": {
+ "version": "7.3.6",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz",
+ "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==",
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.27.0 || ^0.28.0",
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3",
+ "postcss": "^8.5.6",
+ "rollup": "^4.43.0",
+ "tinyglobby": "^0.2.15"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "lightningcss": "^1.21.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite/node_modules/picomatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
+ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/vite/node_modules/postcss": {
+ "version": "8.5.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz",
+ "integrity": "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.16",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/vitest": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.7.tgz",
+ "integrity": "sha512-KrxIJ62Fd89gfysR4WotlgZABiz2dqFPgqGzX7s+CwsqLFomRH7777ZcrOD6+WVAh7khPQP41A+BKbpcJFrdEg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/chai": "^5.2.2",
+ "@vitest/expect": "3.2.7",
+ "@vitest/mocker": "3.2.7",
+ "@vitest/pretty-format": "^3.2.7",
+ "@vitest/runner": "3.2.7",
+ "@vitest/snapshot": "3.2.7",
+ "@vitest/spy": "3.2.7",
+ "@vitest/utils": "3.2.7",
+ "chai": "^5.2.0",
+ "debug": "^4.4.1",
+ "expect-type": "^1.2.1",
+ "magic-string": "^0.30.17",
+ "pathe": "^2.0.3",
+ "picomatch": "^4.0.2",
+ "std-env": "^3.9.0",
+ "tinybench": "^2.9.0",
+ "tinyexec": "^0.3.2",
+ "tinyglobby": "^0.2.14",
+ "tinypool": "^1.1.1",
+ "tinyrainbow": "^2.0.0",
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0",
+ "vite-node": "3.2.4",
+ "why-is-node-running": "^2.3.0"
+ },
+ "bin": {
+ "vitest": "vitest.mjs"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "@edge-runtime/vm": "*",
+ "@types/debug": "^4.1.12",
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "@vitest/browser": "3.2.7",
+ "@vitest/ui": "3.2.7",
+ "happy-dom": "*",
+ "jsdom": "*"
+ },
+ "peerDependenciesMeta": {
+ "@edge-runtime/vm": {
+ "optional": true
+ },
+ "@types/debug": {
+ "optional": true
+ },
+ "@types/node": {
+ "optional": true
+ },
+ "@vitest/browser": {
+ "optional": true
+ },
+ "@vitest/ui": {
+ "optional": true
+ },
+ "happy-dom": {
+ "optional": true
+ },
+ "jsdom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitest/node_modules/@mswjs/interceptors": {
+ "version": "0.41.9",
+ "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.41.9.tgz",
+ "integrity": "sha512-VVPPgHyQ6ShqnrmDWuxjmUIsO9gWyOZFmuOfLd9LfBGQJwZfy0gvv9pbHSJuoFNIYC7ZDX9aoFwowjcdSC4E8w==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@open-draft/deferred-promise": "^2.2.0",
+ "@open-draft/logger": "^0.3.0",
+ "@open-draft/until": "^2.0.0",
+ "is-node-process": "^1.2.0",
+ "outvariant": "^1.4.3",
+ "strict-event-emitter": "^0.5.1"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vitest/node_modules/@mswjs/interceptors/node_modules/@open-draft/deferred-promise": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz",
+ "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/vitest/node_modules/@open-draft/until": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz",
+ "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/vitest/node_modules/@vitest/mocker": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.7.tgz",
+ "integrity": "sha512-Trr0hYO9CM3Wj6ksWHRhK9IZpIY6wTMO5u/MqXurMxT57sWBaOPEtP3Oq60ihZuh5JsiagKfz95OcxdEP6dBrA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/spy": "3.2.7",
+ "estree-walker": "^3.0.3",
+ "magic-string": "^0.30.17"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "msw": "^2.4.9",
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "msw": {
+ "optional": true
+ },
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitest/node_modules/cookie": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz",
+ "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/vitest/node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitest/node_modules/graphql": {
+ "version": "16.14.2",
+ "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.14.2.tgz",
+ "integrity": "sha512-Chq1s4CY7jmh8gO2qvLIJyfCDIN+EHLFW/9iShnp1z8FjBQMoodWP1kDC36VAMXXIvAjj4ARa7ntfAV2BrjsbA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0"
+ }
+ },
+ "node_modules/vitest/node_modules/msw": {
+ "version": "2.15.0",
+ "resolved": "https://registry.npmjs.org/msw/-/msw-2.15.0.tgz",
+ "integrity": "sha512-2wQAmKkQKxRuXvYJxVhPGG0wZNBQyD06oJvxqw90XqLvptdqxdlHrFUfEteKkpaNORX3Xzc+HtEl/q0nfmN2wQ==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@inquirer/confirm": "^6.0.11",
+ "@mswjs/interceptors": "^0.41.3",
+ "@open-draft/deferred-promise": "^3.0.0",
+ "@types/statuses": "^2.0.6",
+ "cookie": "^1.1.1",
+ "graphql": "^16.13.2",
+ "headers-polyfill": "^5.0.1",
+ "is-node-process": "^1.2.0",
+ "outvariant": "^1.4.3",
+ "path-to-regexp": "^6.3.0",
+ "picocolors": "^1.1.1",
+ "rettime": "^0.11.11",
+ "statuses": "^2.0.2",
+ "strict-event-emitter": "^0.5.1",
+ "tough-cookie": "^6.0.1",
+ "type-fest": "^5.5.0",
+ "until-async": "^3.0.2",
+ "yargs": "^17.7.2"
+ },
+ "bin": {
+ "msw": "cli/index.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mswjs"
+ },
+ "peerDependencies": {
+ "typescript": ">= 4.8.x"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitest/node_modules/picomatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
+ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/vitest/node_modules/postcss": {
+ "version": "8.5.24",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.24.tgz",
+ "integrity": "sha512-8RyVklq0owXUTa4xlpzu4l9AaVKIdQvAcOHZWaMh98HgySsUtxRVf/chRe3dsSLqb6i40BzGRzEUddRaI+9TSw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.16",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/vitest/node_modules/strict-event-emitter": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz",
+ "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/vitest/node_modules/type-fest": {
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.8.0.tgz",
+ "integrity": "sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==",
+ "license": "(MIT OR CC0-1.0)",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "tagged-tag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/vitest/node_modules/vite": {
+ "version": "7.3.6",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz",
+ "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==",
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.27.0 || ^0.28.0",
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3",
+ "postcss": "^8.5.6",
+ "rollup": "^4.43.0",
+ "tinyglobby": "^0.2.15"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "lightningcss": "^1.21.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/warning": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
+ "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "node_modules/wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+ "license": "MIT",
+ "dependencies": {
+ "defaults": "^1.0.3"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
+ "license": "MIT",
+ "dependencies": {
+ "is-bigint": "^1.1.0",
+ "is-boolean-object": "^1.2.1",
+ "is-number-object": "^1.1.1",
+ "is-string": "^1.1.1",
+ "is-symbol": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-builtin-type": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+ "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "function.prototype.name": "^1.1.6",
+ "has-tostringtag": "^1.0.2",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.1.0",
+ "is-finalizationregistry": "^1.1.0",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.2.1",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.1.0",
+ "which-collection": "^1.0.2",
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-collection": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.22",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz",
+ "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==",
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.9",
+ "call-bound": "^1.0.4",
+ "for-each": "^0.3.5",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/why-is-node-running": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
+ "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
+ "license": "MIT",
+ "dependencies": {
+ "siginfo": "^2.0.0",
+ "stackback": "0.0.2"
+ },
+ "bin": {
+ "why-is-node-running": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "license": "ISC"
+ },
+ "node_modules/write-file-atomic": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
+ "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^3.0.7"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "license": "ISC"
+ },
+ "node_modules/yaml": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
+ "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==",
+ "license": "ISC",
+ "optional": true,
+ "peer": true,
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs/node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/youtube-player": {
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/youtube-player/-/youtube-player-5.5.2.tgz",
+ "integrity": "sha512-ZGtsemSpXnDky2AUYWgxjaopgB+shFHgXVpiJFeNB5nWEugpW1KWYDaHKuLqh2b67r24GtP6HoSW5swvf0fFIQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "debug": "^2.6.6",
+ "load-script": "^1.0.0",
+ "sister": "^3.0.0"
+ }
+ },
+ "node_modules/youtube-player/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/youtube-player/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/zod": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz",
+ "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/zustand": {
+ "version": "4.5.7",
+ "resolved": "https://registry.npmjs.org/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
+ }
+ }
+ }
+ }
+}
diff --git a/apps/kitchen-sink/package.json b/apps/kitchen-sink/package.json
new file mode 100644
index 0000000000..b0b2d7afbf
--- /dev/null
+++ b/apps/kitchen-sink/package.json
@@ -0,0 +1,49 @@
+{
+ "name": "facelift-kitchen-sink",
+ "private": true,
+ "version": "0.0.1",
+ "type": "module",
+ "scripts": {
+ "dev": "node scripts/dev.mjs",
+ "dev:current": "vite --port 5220 --strictPort",
+ "dev:original": "vite --config vite.original.config.ts --mode original",
+ "build:current": "vite build",
+ "build:original": "vite build --config vite.original.config.ts --mode original",
+ "check": "tsc --noEmit && vite build",
+ "test": "vitest run",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@mondaydotcomorg/icons": "^1.51.0",
+ "@mondaydotcomorg/monday-ui-components": "^0.81.1",
+ "@vibe/base": "4.0.3",
+ "@vibe/button": "4.0.4",
+ "@vibe/clickable": "4.0.3",
+ "@vibe/core": "4.5.3",
+ "@vibe/dialog": "4.1.1",
+ "@vibe/hooks": "4.0.3",
+ "@vibe/icon": "4.0.3",
+ "@vibe/icon-button": "4.0.6",
+ "@vibe/icons": "4.1.0",
+ "@vibe/layer": "4.0.4",
+ "@vibe/layout": "4.0.4",
+ "@vibe/loader": "4.0.3",
+ "@vibe/shared": "4.0.3",
+ "@vibe/style": "4.0.0",
+ "@vibe/tooltip": "4.0.6",
+ "@vibe/typography": "4.0.6",
+ "es-toolkit": "^1.51.0",
+ "monday-ui-style": "0.26.2",
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1"
+ },
+ "devDependencies": {
+ "@types/react": "^18.3.31",
+ "@types/react-dom": "^18.3.7",
+ "@vitejs/plugin-react": "^6.0.4",
+ "sass": "^1.99.0",
+ "typescript": "^7.0.2",
+ "vite": "^8.1.5",
+ "vitest": "^3.2.4"
+ }
+}
diff --git a/apps/kitchen-sink/published-vibe/package-lock.json b/apps/kitchen-sink/published-vibe/package-lock.json
new file mode 100644
index 0000000000..4546b663c2
--- /dev/null
+++ b/apps/kitchen-sink/published-vibe/package-lock.json
@@ -0,0 +1,3772 @@
+{
+ "name": "facelift-kitchen-sink-published-vibe",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "facelift-kitchen-sink-published-vibe",
+ "dependencies": {
+ "@vibe/base": "4.0.3",
+ "@vibe/button": "4.0.4",
+ "@vibe/clickable": "4.0.3",
+ "@vibe/core": "4.5.3",
+ "@vibe/dialog": "4.1.1",
+ "@vibe/hooks": "4.0.3",
+ "@vibe/icon": "4.0.3",
+ "@vibe/icon-button": "4.0.6",
+ "@vibe/icons": "4.1.0",
+ "@vibe/layer": "4.0.4",
+ "@vibe/layout": "4.0.4",
+ "@vibe/loader": "4.0.3",
+ "@vibe/shared": "4.0.3",
+ "@vibe/style": "4.0.0",
+ "@vibe/tooltip": "4.0.6",
+ "@vibe/typography": "4.0.6"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
+ "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
+ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz",
+ "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@csstools/selector-specificity": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz",
+ "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==",
+ "license": "CC0-1.0",
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss-selector-parser": "^6.0.10"
+ }
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz",
+ "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/utils": "^0.2.12"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz",
+ "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/core": "^1.8.0",
+ "@floating-ui/utils": "^0.2.12"
+ }
+ },
+ "node_modules/@floating-ui/react-dom": {
+ "version": "2.1.9",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz",
+ "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/dom": "^1.8.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.2.12",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz",
+ "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@oxc-project/types": {
+ "version": "0.144.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.144.0.tgz",
+ "integrity": "sha512-nuhZIOLuI6TFQ32I/WnUx+SCPY7SdSKwgnFHydAuoS1+Z4BRcaP+RRJmGzl9lw+0OFF7UmaESf7KQRXaNLHypg==",
+ "license": "MIT",
+ "peer": true,
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ }
+ },
+ "node_modules/@rolldown/binding-android-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.4.tgz",
+ "integrity": "sha512-jHC2cnyKz5xU2fhECtFl8OZ83cYNt13GZQD+0uMJ/X3o+ijmd56okHhTUwxVSHPx1IRVIJEZ1/1pPzeLCU6XKA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.4.tgz",
+ "integrity": "sha512-Dc5mPD8F5F/FS8i01syd7FTF6yB2fVthH/TRkjwJkzUK6EpoxHtqvZQP5Zwq80/5z19TWYHIg1KOHboCgVx/aQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.4.tgz",
+ "integrity": "sha512-fpDm4oBo6SqLvWUYCmFhdde3U9KH2fRNNMeAnAPAIwxRL345xutL0EtEUcuoxsoazdJGv/MuDBQHlCDrtbvqOg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-freebsd-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.4.tgz",
+ "integrity": "sha512-rSJoreDE/HoIzoaib6MTp5jQtCTdMHKIvItAKT/ImS6Y6Ww76oUaeMyp4Vc/fAgd/ehji068IxetHXAnqUwN9A==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.4.tgz",
+ "integrity": "sha512-/jm8OGHgn7oGaJu3i/qZI9spUGcJ+y/lk43ttQ/iO1tOd9NissG6o97bighBCiL+BKRngmcDuR6ikfwYdJmVuQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-gnu": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.4.tgz",
+ "integrity": "sha512-tIP06BeD9EqvECBrPZ+sqdPlYrT+aYaAiu1wYziVx5elRK/ftm33JxVDy2bXGbr6J0CrtirCkR87/X5a2euEng==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-musl": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.4.tgz",
+ "integrity": "sha512-Ql1Q0EQqVThvn9VAVlwNzsUvbSFtCMGjLpRRi4pk5i7NZZ4n5ISiLMjHYtus4VQ2PvkSw24zyaCVsiS+sXPj1w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-ppc64-gnu": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.4.tgz",
+ "integrity": "sha512-GjbjXD4XXfN19D0LZNbmiCBUoDiRACsYHr0yaIbbn8aFsXjHZifcYqu/W5Er5X2X990WjHXFrxarn5chzItorQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-s390x-gnu": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.4.tgz",
+ "integrity": "sha512-p5WR0NOwaRmJ/B1b6IjEFLLivwEsf3PrdBIhRbhTCQisbo2SvHHpG4ELB/+FgQNnB88LTOF86upmJmbvZdQ2lw==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-gnu": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.4.tgz",
+ "integrity": "sha512-4/GyVjmhR+Tc6HLJvwc1sOhPqAZtySiSMesOZyX6JQ5XBxoTDEMKQzvo07NIK6nTon/SivlZqvhzvuVBNQhObQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-musl": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.4.tgz",
+ "integrity": "sha512-l9eeLsCNvPpmSXUej0etw/J1eqV0Jj1D5G/xG6YTijmE6dkv6E2QezgWbTfQk63v952DPqrjOCoiqxq7Bw0YUQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-openharmony-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.4.tgz",
+ "integrity": "sha512-e0F355MSTMm3+UOqtV3L24gFUp2N5m1f8L/7d56deik6va+AXdrt9F8LbzGpeWGWRbZEDq4m8NVnJDeBtf9DZg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-arm64-msvc": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.4.tgz",
+ "integrity": "sha512-AWLi0uBRYh6QlE7OKhiz+phZC0qwtij2QZmhmOdsLdFn64m7oMpooE9ICE3lhm9xMb4SpDo2WbHcxX1iFLFtqw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-x64-msvc": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.4.tgz",
+ "integrity": "sha512-UwSDJOg3dqCAejWdxclJjCsh3Qq4vLYMDxmyHqo1btz3stK2VqgwNd3mm5tuIwzSlGIQ/1H9Hr+Zn09mrezNqQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
+ "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@standard-schema/spec": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
+ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@types/chai": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz",
+ "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/deep-eql": "*",
+ "assertion-error": "^2.0.1"
+ }
+ },
+ "node_modules/@types/deep-eql": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
+ "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
+ "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@types/minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==",
+ "license": "MIT"
+ },
+ "node_modules/@types/normalize-package-data": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
+ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/parse-json": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
+ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
+ "license": "MIT"
+ },
+ "node_modules/@vibe/base": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@vibe/base/-/base-4.0.3.tgz",
+ "integrity": "sha512-N+sZL27fw3QOKFEk00WsXGvg3GjtOSGhy65YYGPwJR3f7qkAl7nQmBDogT+YGHaEatV1MekfDw1FLbvQKK/vaw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/shared": "4.0.3",
+ "@vibe/style": "4.0.0",
+ "classnames": "^2.5.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/button": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@vibe/button/-/button-4.0.4.tgz",
+ "integrity": "sha512-R0n8CPVpLtkdmHvT2WWTnEPx9baOkAEyiu7EYyZiHgenuoB0IXVhFIMFNp1Rcgo8apctTfNsMChTv0ACIwVqlg==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/icon": "4.0.3",
+ "@vibe/loader": "4.0.3",
+ "@vibe/shared": "4.0.3",
+ "@vibe/style": "4.0.0",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/clickable": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@vibe/clickable/-/clickable-4.0.3.tgz",
+ "integrity": "sha512-VdN5rZROOHsd4Vg4jFLt6OSmVLAkosFlnF6QROBUo+z7DC3Pj90wyBa1/6UeJqV5sQIBRqSelbwH+oftfExOPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/shared": "4.0.3",
+ "@vibe/style": "4.0.0",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/core": {
+ "version": "4.5.3",
+ "resolved": "https://registry.npmjs.org/@vibe/core/-/core-4.5.3.tgz",
+ "integrity": "sha512-QnynGiCHE3+M9sLBFADuqZLzR2fdlMr25rE7Zho9RrGbY1DHHUDLC5XwVhTwhpTgsezJpuCmgfFY/Kq39c1THg==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/react-dom": "^2.1.2",
+ "@vibe/base": "4.0.3",
+ "@vibe/button": "4.0.4",
+ "@vibe/clickable": "4.0.3",
+ "@vibe/dialog": "4.1.1",
+ "@vibe/hooks": "4.0.3",
+ "@vibe/icon": "4.0.3",
+ "@vibe/icon-button": "4.0.6",
+ "@vibe/icons": "4.1.0",
+ "@vibe/layer": "4.0.4",
+ "@vibe/layout": "4.0.4",
+ "@vibe/loader": "4.0.3",
+ "@vibe/shared": "4.0.3",
+ "@vibe/style": "4.0.0",
+ "@vibe/tooltip": "4.0.6",
+ "@vibe/typography": "4.0.6",
+ "browserslist-config-monday": "1.0.6",
+ "classnames": "^2.5.1",
+ "date-fns": "^2.30.0",
+ "downshift": "^9.0.8",
+ "es-toolkit": "^1.39.10",
+ "react-day-picker": "^8.10.2",
+ "react-focus-lock": "^2.13.2",
+ "react-inlinesvg": "^4.1.3",
+ "react-is": "^16.9.0",
+ "react-remove-scroll": "^2.6.0",
+ "react-transition-group": "^4.4.5",
+ "react-virtualized-auto-sizer": "^1.0.7",
+ "react-window": "^1.8.7",
+ "style-inject": "^0.3.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/dialog": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/@vibe/dialog/-/dialog-4.1.1.tgz",
+ "integrity": "sha512-Gh6D4LAAX8njtZ5ezrtBpRq+Ew9UmzRGG290uYRe2AnS4fuG74TVkyHPOHmYBfCr98drEBPz3V1fA1g38SItkA==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/react-dom": "^2.1.2",
+ "@vibe/hooks": "4.0.3",
+ "@vibe/layer": "4.0.4",
+ "@vibe/shared": "4.0.3",
+ "@vibe/style": "4.0.0",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10",
+ "react-transition-group": "^4.4.5"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/hooks": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@vibe/hooks/-/hooks-4.0.3.tgz",
+ "integrity": "sha512-W4vKiC5q6p9x0CHb+xzh0SqNEvu4vevYSvOvUySrD76DLkgbgU/VZ8cFNZne24W0V7ED93ID4Dw3FugFKyfOAQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/shared": "4.0.3",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/icon": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@vibe/icon/-/icon-4.0.3.tgz",
+ "integrity": "sha512-cUacuzAL7cgRBUCa6eNNXevdV3hKYRYBTGsbQscO1cPnTIRjGahHwjzLjeBlF+Z6T2rvogLB1abSBVyOwVMPwA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/shared": "4.0.3",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10",
+ "react-inlinesvg": "^4.1.3"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/icon-button": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@vibe/icon-button/-/icon-button-4.0.6.tgz",
+ "integrity": "sha512-KcsojJmExaRxrGMsr1nGDesV2v5PjBf0Zd5Rov0lYN16EJRJi20cTGCG1+7BCTS+2vHIhpbYvxhEVUJfMePcNQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/button": "4.0.4",
+ "@vibe/icon": "4.0.3",
+ "@vibe/icons": "4.1.0",
+ "@vibe/shared": "4.0.3",
+ "@vibe/tooltip": "4.0.6",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/icons": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@vibe/icons/-/icons-4.1.0.tgz",
+ "integrity": "sha512-xO61cHnuNDEA0SlhG6/hWA3mYsatUzcTELTk701i2cGdZw85nZ/mNn2NtfJRaHnAZ8uJuw1ZWXQ+HpvXL1X6xA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/layer": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@vibe/layer/-/layer-4.0.4.tgz",
+ "integrity": "sha512-9OAFxKefKtiYHINZZBg0DUoLrUZcYSnUUnBS5+yDoGedJ4aH5f/2rOuKEO3PfkGExsfsEiGjUr3igMdSKhdNcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/icon": "4.0.3",
+ "@vibe/loader": "4.0.3",
+ "@vibe/shared": "4.0.3",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/layout": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@vibe/layout/-/layout-4.0.4.tgz",
+ "integrity": "sha512-Eh6/lZ3ditNPOHwS2q0fxHSavbu8ULSwp/3NIXZaNPnSinuSU6VTRNwutB1Bu2aA7hLknOjEmA3wgXDUqmAc7w==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/clickable": "4.0.3",
+ "@vibe/shared": "4.0.3",
+ "@vibe/style": "4.0.0",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/loader": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@vibe/loader/-/loader-4.0.3.tgz",
+ "integrity": "sha512-cCR1UT/v9aiLfTy4guxOLv4Vi0GKxWQlnKZDYxCOpoa83P3o4uBpoC0X4dj8qtlCTFfCyYCr5G3SewC2ClARnA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/shared": "4.0.3",
+ "classnames": "^2.5.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/shared": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@vibe/shared/-/shared-4.0.3.tgz",
+ "integrity": "sha512-mp3nFv7rbF3Eq3lYylKwMWKaV5+P795B0ky/IMzcmz7hCt07/6ej5sT06Q4N2HizMqMAo6lbDH3uMwfaVG0dhQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "vitest": ">=1.6.0"
+ }
+ },
+ "node_modules/@vibe/style": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@vibe/style/-/style-4.0.0.tgz",
+ "integrity": "sha512-dnb9TEcCC0ZQFvHultyM0FbxYVQQlHvRC9fjNN+wIEhOOBAgVFBP6PcRuH5PQHDyfulbKv3/SX91rHJss6quqw==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss": "8.4.31",
+ "postcss-scss": "^4.0.9",
+ "postcss-value-parser": "4.2.0",
+ "stylelint": "^14.16.1"
+ },
+ "peerDependencies": {
+ "stylelint": "^14.1.0"
+ }
+ },
+ "node_modules/@vibe/tooltip": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@vibe/tooltip/-/tooltip-4.0.6.tgz",
+ "integrity": "sha512-vFWWzTeZgLhAYZlyk0ME5bHDikHGpJgRbl4rGpWkeCgXn1fGzzzCdgz2QnJgbb/41ddbPqUAZmqpjwjf6c/MUQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/dialog": "4.1.1",
+ "@vibe/icon": "4.0.3",
+ "@vibe/layout": "4.0.4",
+ "@vibe/shared": "4.0.3",
+ "@vibe/style": "4.0.0",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vibe/typography": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@vibe/typography/-/typography-4.0.6.tgz",
+ "integrity": "sha512-KVX+bWYo5CtMQ6b4FCqfmhT6bDe7ko6oDpxqtyHoBuINebEHjiFqOAnZtk7FzkOT2QmUdHoBypZH8SmalQQg3A==",
+ "license": "MIT",
+ "dependencies": {
+ "@vibe/hooks": "4.0.3",
+ "@vibe/shared": "4.0.3",
+ "@vibe/style": "4.0.0",
+ "@vibe/tooltip": "4.0.6",
+ "classnames": "^2.5.1",
+ "es-toolkit": "^1.39.10"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ }
+ },
+ "node_modules/@vitest/expect": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz",
+ "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@standard-schema/spec": "^1.1.0",
+ "@types/chai": "^5.2.2",
+ "@vitest/spy": "4.1.10",
+ "@vitest/utils": "4.1.10",
+ "chai": "^6.2.2",
+ "tinyrainbow": "^3.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/pretty-format": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz",
+ "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "tinyrainbow": "^3.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/runner": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.10.tgz",
+ "integrity": "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@vitest/utils": "4.1.10",
+ "pathe": "^2.0.3"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/snapshot": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.10.tgz",
+ "integrity": "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@vitest/pretty-format": "4.1.10",
+ "@vitest/utils": "4.1.10",
+ "magic-string": "^0.30.21",
+ "pathe": "^2.0.3"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/spy": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz",
+ "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==",
+ "license": "MIT",
+ "peer": true,
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/utils": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz",
+ "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@vitest/pretty-format": "4.1.10",
+ "convert-source-map": "^2.0.0",
+ "tinyrainbow": "^3.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz",
+ "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/assertion-error": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
+ "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
+ "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
+ "license": "MIT"
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.18",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz",
+ "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/brace-expansion/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist-config-monday": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/browserslist-config-monday/-/browserslist-config-monday-1.0.6.tgz",
+ "integrity": "sha512-o74nIIUzfBTdJOo211HgKdpooMzolM3bMWTCJregiq/vnmfGoDtJzscyKv41MgrMZ7L0Rzc8MYjvFgU4OkzAdg==",
+ "license": "MIT"
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase-keys": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
+ "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
+ "license": "MIT",
+ "dependencies": {
+ "camelcase": "^5.3.1",
+ "map-obj": "^4.0.0",
+ "quick-lru": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/chai": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz",
+ "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/classnames": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
+ "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==",
+ "license": "MIT"
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/colord": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
+ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
+ "license": "MIT"
+ },
+ "node_modules/compute-scroll-into-view": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz",
+ "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==",
+ "license": "MIT"
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "license": "MIT"
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/cosmiconfig": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+ "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/css-functions-list": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.3.3.tgz",
+ "integrity": "sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "license": "MIT",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "license": "MIT"
+ },
+ "node_modules/date-fns": {
+ "version": "2.30.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
+ "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.21.0"
+ },
+ "engines": {
+ "node": ">=0.11"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/date-fns"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/decamelize-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz",
+ "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==",
+ "license": "MIT",
+ "dependencies": {
+ "decamelize": "^1.1.0",
+ "map-obj": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/decamelize-keys/node_modules/map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "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",
+ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
+ "license": "MIT"
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "license": "MIT",
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dom-helpers": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.8.7",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/downshift": {
+ "version": "9.4.0",
+ "resolved": "https://registry.npmjs.org/downshift/-/downshift-9.4.0.tgz",
+ "integrity": "sha512-yIwyzRYzycKwMZhvOahsn4BmRr4Ffi0JymdWOtTDhR+LGDEXCZHTcwgUbNBC/oZLT6YrR46iwJe/BrQUS5ClQQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.28.6",
+ "compute-scroll-into-view": "^3.1.1",
+ "prop-types": "^15.8.1",
+ "react-is": "^18.2.0",
+ "tslib": "^2.8.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.12.0"
+ }
+ },
+ "node_modules/downshift/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/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
+ "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz",
+ "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/es-toolkit": {
+ "version": "1.50.0",
+ "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.50.0.tgz",
+ "integrity": "sha512-OyZKhUVvEep9ITEiwHn8GKnMRQIVqoSIX7WnRbkWgJkllCujilqP2rD0u979tkl8wqyc8ICwlc1UBVv/Sl1G6w==",
+ "license": "MIT",
+ "workspaces": [
+ "docs",
+ "benchmarks",
+ "tests/types"
+ ]
+ },
+ "node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/expect-type": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz",
+ "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-uri": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz",
+ "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/fastest-levenshtein": {
+ "version": "1.0.16",
+ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+ "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.9.1"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.4.4",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz",
+ "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==",
+ "license": "ISC"
+ },
+ "node_modules/focus-lock": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-1.3.6.tgz",
+ "integrity": "sha512-Ik/6OCk9RQQ0T5Xw+hKNLWrjSMtv51dD4GRmJjbD5a58TIEpI5a5iXagKVl3Z5UuyslMCA8Xwnu76jQob62Yhg==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.3"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-nonce": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
+ "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/global-modules": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+ "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+ "license": "MIT",
+ "dependencies": {
+ "global-prefix": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/global-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+ "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+ "license": "MIT",
+ "dependencies": {
+ "ini": "^1.3.5",
+ "kind-of": "^6.0.2",
+ "which": "^1.3.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "license": "MIT",
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globjoin": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz",
+ "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
+ "license": "MIT"
+ },
+ "node_modules/hard-rejection": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
+ "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
+ "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hosted-git-info": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
+ "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/html-tags": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz",
+ "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-fresh/node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/import-lazy": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
+ "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "license": "ISC"
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "license": "MIT"
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.2",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz",
+ "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==",
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+ "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "license": "ISC"
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT"
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "license": "MIT"
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/known-css-properties": {
+ "version": "0.26.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz",
+ "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==",
+ "license": "MIT"
+ },
+ "node_modules/lightningcss": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz",
+ "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==",
+ "license": "MPL-2.0",
+ "peer": true,
+ "dependencies": {
+ "detect-libc": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "lightningcss-android-arm64": "1.33.0",
+ "lightningcss-darwin-arm64": "1.33.0",
+ "lightningcss-darwin-x64": "1.33.0",
+ "lightningcss-freebsd-x64": "1.33.0",
+ "lightningcss-linux-arm-gnueabihf": "1.33.0",
+ "lightningcss-linux-arm64-gnu": "1.33.0",
+ "lightningcss-linux-arm64-musl": "1.33.0",
+ "lightningcss-linux-x64-gnu": "1.33.0",
+ "lightningcss-linux-x64-musl": "1.33.0",
+ "lightningcss-win32-arm64-msvc": "1.33.0",
+ "lightningcss-win32-x64-msvc": "1.33.0"
+ }
+ },
+ "node_modules/lightningcss-android-arm64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz",
+ "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz",
+ "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz",
+ "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-freebsd-x64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz",
+ "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz",
+ "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz",
+ "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz",
+ "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz",
+ "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz",
+ "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz",
+ "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz",
+ "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "license": "MIT"
+ },
+ "node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lodash.truncate": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/map-obj": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
+ "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mathml-tag-names": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
+ "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/memoize-one": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz",
+ "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==",
+ "license": "MIT"
+ },
+ "node_modules/meow": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
+ "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/minimist": "^1.2.0",
+ "camelcase-keys": "^6.2.2",
+ "decamelize": "^1.2.0",
+ "decamelize-keys": "^1.1.0",
+ "hard-rejection": "^2.1.0",
+ "minimist-options": "4.1.0",
+ "normalize-package-data": "^3.0.0",
+ "read-pkg-up": "^7.0.1",
+ "redent": "^3.0.0",
+ "trim-newlines": "^3.0.0",
+ "type-fest": "^0.18.0",
+ "yargs-parser": "^20.2.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/min-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist-options": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
+ "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
+ "license": "MIT",
+ "dependencies": {
+ "arrify": "^1.0.1",
+ "is-plain-obj": "^1.1.0",
+ "kind-of": "^6.0.3"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.18",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz",
+ "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/normalize-package-data": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
+ "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "hosted-git-info": "^4.0.1",
+ "is-core-module": "^2.5.0",
+ "semver": "^7.3.4",
+ "validate-npm-package-license": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/obug": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz",
+ "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==",
+ "funding": [
+ "https://github.com/sponsors/sxzz",
+ "https://opencollective.com/debug"
+ ],
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "license": "MIT"
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pathe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.31",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+ "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-media-query-parser": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
+ "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==",
+ "license": "MIT"
+ },
+ "node_modules/postcss-resolve-nested-selector": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz",
+ "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==",
+ "license": "MIT"
+ },
+ "node_modules/postcss-safe-parser": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
+ "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3.3"
+ }
+ },
+ "node_modules/postcss-scss": {
+ "version": "4.0.9",
+ "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz",
+ "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss-scss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.29"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz",
+ "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "license": "MIT"
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/quick-lru": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
+ "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/react": {
+ "version": "19.2.8",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz",
+ "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-clientside-effect": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.8.tgz",
+ "integrity": "sha512-ma2FePH0z3px2+WOu6h+YycZcEvFmmxIlAb62cF52bG86eMySciO/EQZeQMXd07kPCYB0a1dWDT5J+KE9mCDUw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.13"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ }
+ },
+ "node_modules/react-day-picker": {
+ "version": "8.10.2",
+ "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.2.tgz",
+ "integrity": "sha512-LK68OTbHB3oJNhl9cA0qVizzp3o26w61YSjAFkYi67N86iro32wx86kSNeFU/hq+gI8m1yzWhnomMLfZ041RzQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "individual",
+ "url": "https://github.com/sponsors/gpbl"
+ },
+ "peerDependencies": {
+ "date-fns": "^2.28.0 || ^3.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.2.8",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz",
+ "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "scheduler": "^0.27.0"
+ },
+ "peerDependencies": {
+ "react": "^19.2.8"
+ }
+ },
+ "node_modules/react-focus-lock": {
+ "version": "2.13.7",
+ "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.13.7.tgz",
+ "integrity": "sha512-20lpZHEQrXPb+pp1tzd4ULL6DyO5D2KnR0G69tTDdydrmNhU7pdFmbQUYVyHUgp+xN29IuFR0PVuhOmvaZL9Og==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.0.0",
+ "focus-lock": "^1.3.6",
+ "prop-types": "^15.6.2",
+ "react-clientside-effect": "^1.2.7",
+ "use-callback-ref": "^1.3.3",
+ "use-sidecar": "^1.1.3"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-from-dom": {
+ "version": "0.7.5",
+ "resolved": "https://registry.npmjs.org/react-from-dom/-/react-from-dom-0.7.5.tgz",
+ "integrity": "sha512-CO92PmMKo/23uYPm6OFvh5CtZbMgHs/Xn+o095Lz/TZj9t8DSDhGdSOMLxBxwWI4sr0MF17KUn9yJWc5Q00R/w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "16.8 - 19"
+ }
+ },
+ "node_modules/react-inlinesvg": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/react-inlinesvg/-/react-inlinesvg-4.5.0.tgz",
+ "integrity": "sha512-J/ZWLCmYdhOu5a+dWBNKXaQb/YFvTjqTZnoaprOUKD2geu+JcO1sZ2AcrXvzYurgQIuI3Y4+Ji2dUjsO86nhgw==",
+ "license": "MIT",
+ "dependencies": {
+ "react-from-dom": "^0.7.5"
+ },
+ "peerDependencies": {
+ "react": "16.8 - 19"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "license": "MIT"
+ },
+ "node_modules/react-remove-scroll": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz",
+ "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==",
+ "license": "MIT",
+ "dependencies": {
+ "react-remove-scroll-bar": "^2.3.7",
+ "react-style-singleton": "^2.2.3",
+ "tslib": "^2.1.0",
+ "use-callback-ref": "^1.3.3",
+ "use-sidecar": "^1.1.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-remove-scroll-bar": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz",
+ "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==",
+ "license": "MIT",
+ "dependencies": {
+ "react-style-singleton": "^2.2.2",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-style-singleton": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
+ "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==",
+ "license": "MIT",
+ "dependencies": {
+ "get-nonce": "^1.0.0",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-transition-group": {
+ "version": "4.4.5",
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
+ "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "dom-helpers": "^5.0.1",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.6.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.6.0",
+ "react-dom": ">=16.6.0"
+ }
+ },
+ "node_modules/react-virtualized-auto-sizer": {
+ "version": "1.0.26",
+ "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.26.tgz",
+ "integrity": "sha512-CblNyiNVw2o+hsa5/49NH2ogGxZ+t+3aweRvNSq7TVjDIlwk7ir4lencEg5HxHeSzwNarSkNkiu0qJSOXtxm5A==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/react-window": {
+ "version": "1.8.11",
+ "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.11.tgz",
+ "integrity": "sha512-+SRbUVT2scadgFSWx+R1P754xHPEqvcfSfVX10QYg6POOz+WNgkN48pS+BtZNIMGiL1HYrSEiCkwsMS15QogEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.0.0",
+ "memoize-one": ">=3.1.1 <6"
+ },
+ "engines": {
+ "node": ">8.0.0"
+ },
+ "peerDependencies": {
+ "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/read-pkg/node_modules/hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "license": "ISC"
+ },
+ "node_modules/read-pkg/node_modules/normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "node_modules/read-pkg/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/read-pkg/node_modules/type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/redent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+ "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+ "license": "MIT",
+ "dependencies": {
+ "indent-string": "^4.0.0",
+ "strip-indent": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.12",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz",
+ "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "is-core-module": "^2.16.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rolldown": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.4.tgz",
+ "integrity": "sha512-rSr7irW0K7QRWzjdJXqZowkcRdDtjRduh43rBltnVKd0VFq839l1lJoDvGJb6gl7+4rTTCrPWu+YfujUL8Ug7w==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@oxc-project/types": "=0.144.0",
+ "@rolldown/pluginutils": "^1.0.0"
+ },
+ "bin": {
+ "rolldown": "bin/cli.mjs"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "optionalDependencies": {
+ "@rolldown/binding-android-arm64": "1.2.4",
+ "@rolldown/binding-darwin-arm64": "1.2.4",
+ "@rolldown/binding-darwin-x64": "1.2.4",
+ "@rolldown/binding-freebsd-x64": "1.2.4",
+ "@rolldown/binding-linux-arm-gnueabihf": "1.2.4",
+ "@rolldown/binding-linux-arm64-gnu": "1.2.4",
+ "@rolldown/binding-linux-arm64-musl": "1.2.4",
+ "@rolldown/binding-linux-ppc64-gnu": "1.2.4",
+ "@rolldown/binding-linux-s390x-gnu": "1.2.4",
+ "@rolldown/binding-linux-x64-gnu": "1.2.4",
+ "@rolldown/binding-linux-x64-musl": "1.2.4",
+ "@rolldown/binding-openharmony-arm64": "1.2.4",
+ "@rolldown/binding-win32-arm64-msvc": "1.2.4",
+ "@rolldown/binding-win32-x64-msvc": "1.2.4"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
+ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/siginfo": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
+ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
+ "license": "ISC",
+ "peer": true
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "license": "ISC"
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/spdx-correct": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
+ "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-exceptions": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
+ "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
+ "license": "CC-BY-3.0"
+ },
+ "node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-license-ids": {
+ "version": "3.0.23",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz",
+ "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/stackback": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
+ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/std-env": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz",
+ "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-indent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+ "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "min-indent": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/style-inject": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz",
+ "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==",
+ "license": "MIT"
+ },
+ "node_modules/style-search": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
+ "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==",
+ "license": "ISC"
+ },
+ "node_modules/stylelint": {
+ "version": "14.16.1",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz",
+ "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==",
+ "license": "MIT",
+ "dependencies": {
+ "@csstools/selector-specificity": "^2.0.2",
+ "balanced-match": "^2.0.0",
+ "colord": "^2.9.3",
+ "cosmiconfig": "^7.1.0",
+ "css-functions-list": "^3.1.0",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.2.12",
+ "fastest-levenshtein": "^1.0.16",
+ "file-entry-cache": "^6.0.1",
+ "global-modules": "^2.0.0",
+ "globby": "^11.1.0",
+ "globjoin": "^0.1.4",
+ "html-tags": "^3.2.0",
+ "ignore": "^5.2.1",
+ "import-lazy": "^4.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-plain-object": "^5.0.0",
+ "known-css-properties": "^0.26.0",
+ "mathml-tag-names": "^2.1.3",
+ "meow": "^9.0.0",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.19",
+ "postcss-media-query-parser": "^0.2.3",
+ "postcss-resolve-nested-selector": "^0.1.1",
+ "postcss-safe-parser": "^6.0.0",
+ "postcss-selector-parser": "^6.0.11",
+ "postcss-value-parser": "^4.2.0",
+ "resolve-from": "^5.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1",
+ "style-search": "^0.1.0",
+ "supports-hyperlinks": "^2.3.0",
+ "svg-tags": "^1.0.0",
+ "table": "^6.8.1",
+ "v8-compile-cache": "^2.3.0",
+ "write-file-atomic": "^4.0.2"
+ },
+ "bin": {
+ "stylelint": "bin/stylelint.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/stylelint"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-hyperlinks": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz",
+ "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/svg-tags": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
+ "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA=="
+ },
+ "node_modules/table": {
+ "version": "6.9.0",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz",
+ "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "ajv": "^8.0.1",
+ "lodash.truncate": "^4.4.2",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/tinybench": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
+ "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/tinyexec": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz",
+ "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
+ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tinyglobby/node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tinyglobby/node_modules/picomatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
+ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/tinyrainbow": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.1.tgz",
+ "integrity": "sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/trim-newlines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
+ "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/type-fest": {
+ "version": "0.18.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
+ "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/use-callback-ref": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
+ "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/use-sidecar": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz",
+ "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "detect-node-es": "^1.1.0",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "license": "MIT"
+ },
+ "node_modules/v8-compile-cache": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz",
+ "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==",
+ "license": "MIT"
+ },
+ "node_modules/validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "node_modules/vitest": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz",
+ "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@vitest/expect": "4.1.10",
+ "@vitest/mocker": "4.1.10",
+ "@vitest/pretty-format": "4.1.10",
+ "@vitest/runner": "4.1.10",
+ "@vitest/snapshot": "4.1.10",
+ "@vitest/spy": "4.1.10",
+ "@vitest/utils": "4.1.10",
+ "es-module-lexer": "^2.0.0",
+ "expect-type": "^1.3.0",
+ "magic-string": "^0.30.21",
+ "obug": "^2.1.1",
+ "pathe": "^2.0.3",
+ "picomatch": "^4.0.3",
+ "std-env": "^4.0.0-rc.1",
+ "tinybench": "^2.9.0",
+ "tinyexec": "^1.0.2",
+ "tinyglobby": "^0.2.15",
+ "tinyrainbow": "^3.1.0",
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0",
+ "why-is-node-running": "^2.3.0"
+ },
+ "bin": {
+ "vitest": "vitest.mjs"
+ },
+ "engines": {
+ "node": "^20.0.0 || ^22.0.0 || >=24.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "@edge-runtime/vm": "*",
+ "@opentelemetry/api": "^1.9.0",
+ "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0",
+ "@vitest/browser-playwright": "4.1.10",
+ "@vitest/browser-preview": "4.1.10",
+ "@vitest/browser-webdriverio": "4.1.10",
+ "@vitest/coverage-istanbul": "4.1.10",
+ "@vitest/coverage-v8": "4.1.10",
+ "@vitest/ui": "4.1.10",
+ "happy-dom": "*",
+ "jsdom": "*",
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@edge-runtime/vm": {
+ "optional": true
+ },
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "@types/node": {
+ "optional": true
+ },
+ "@vitest/browser-playwright": {
+ "optional": true
+ },
+ "@vitest/browser-preview": {
+ "optional": true
+ },
+ "@vitest/browser-webdriverio": {
+ "optional": true
+ },
+ "@vitest/coverage-istanbul": {
+ "optional": true
+ },
+ "@vitest/coverage-v8": {
+ "optional": true
+ },
+ "@vitest/ui": {
+ "optional": true
+ },
+ "happy-dom": {
+ "optional": true
+ },
+ "jsdom": {
+ "optional": true
+ },
+ "vite": {
+ "optional": false
+ }
+ }
+ },
+ "node_modules/vitest/node_modules/@vitest/mocker": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz",
+ "integrity": "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@vitest/spy": "4.1.10",
+ "estree-walker": "^3.0.3",
+ "magic-string": "^0.30.21"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "msw": "^2.4.9",
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "msw": {
+ "optional": true
+ },
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitest/node_modules/picomatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
+ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/vitest/node_modules/postcss": {
+ "version": "8.5.26",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz",
+ "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "nanoid": "^3.3.17",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/vitest/node_modules/vite": {
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.1.tgz",
+ "integrity": "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "lightningcss": "^1.33.0",
+ "picomatch": "^4.0.5",
+ "postcss": "^8.5.25",
+ "rolldown": "~1.2.1",
+ "tinyglobby": "^0.2.17"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "@vitejs/devtools": "^0.4.0",
+ "esbuild": "^0.27.0 || ^0.28.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "@vitejs/devtools": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitest/node_modules/yaml": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
+ "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==",
+ "license": "ISC",
+ "optional": true,
+ "peer": true,
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
+ }
+ },
+ "node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/why-is-node-running": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
+ "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "siginfo": "^2.0.0",
+ "stackback": "0.0.2"
+ },
+ "bin": {
+ "why-is-node-running": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "license": "ISC"
+ },
+ "node_modules/write-file-atomic": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
+ "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^3.0.7"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "license": "ISC"
+ },
+ "node_modules/yaml": {
+ "version": "1.10.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz",
+ "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ }
+ }
+}
diff --git a/apps/kitchen-sink/published-vibe/package.json b/apps/kitchen-sink/published-vibe/package.json
new file mode 100644
index 0000000000..c4f66b425e
--- /dev/null
+++ b/apps/kitchen-sink/published-vibe/package.json
@@ -0,0 +1,22 @@
+{
+ "name": "facelift-kitchen-sink-published-vibe",
+ "private": true,
+ "dependencies": {
+ "@vibe/base": "4.0.3",
+ "@vibe/button": "4.0.4",
+ "@vibe/clickable": "4.0.3",
+ "@vibe/core": "4.5.3",
+ "@vibe/dialog": "4.1.1",
+ "@vibe/hooks": "4.0.3",
+ "@vibe/icon": "4.0.3",
+ "@vibe/icon-button": "4.0.6",
+ "@vibe/icons": "4.1.0",
+ "@vibe/layer": "4.0.4",
+ "@vibe/layout": "4.0.4",
+ "@vibe/loader": "4.0.3",
+ "@vibe/shared": "4.0.3",
+ "@vibe/style": "4.0.0",
+ "@vibe/tooltip": "4.0.6",
+ "@vibe/typography": "4.0.6"
+ }
+}
diff --git a/apps/kitchen-sink/scripts/dev.mjs b/apps/kitchen-sink/scripts/dev.mjs
new file mode 100644
index 0000000000..bc4f4aa800
--- /dev/null
+++ b/apps/kitchen-sink/scripts/dev.mjs
@@ -0,0 +1,38 @@
+import { spawn } from "node:child_process";
+import path from "node:path";
+import { fileURLToPath } from "node:url";
+
+const rootDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
+const scripts = ["dev:current", "dev:original"];
+const children = scripts.map(script =>
+ spawn("npm", ["run", script], {
+ cwd: rootDir,
+ stdio: "inherit",
+ detached: true
+ })
+);
+
+let stopping = false;
+
+function stop(exitCode = 0) {
+ if (stopping) return;
+ stopping = true;
+ children.forEach(child => {
+ if (!child.pid) return;
+ try {
+ process.kill(-child.pid, "SIGTERM");
+ } catch {
+ // The child already exited.
+ }
+ });
+ process.exitCode = exitCode;
+}
+
+children.forEach(child => {
+ child.on("exit", code => {
+ if (!stopping) stop(code ?? 1);
+ });
+});
+
+process.on("SIGINT", () => stop());
+process.on("SIGTERM", () => stop());
diff --git a/apps/kitchen-sink/src/App.tsx b/apps/kitchen-sink/src/App.tsx
new file mode 100644
index 0000000000..23fb8da835
--- /dev/null
+++ b/apps/kitchen-sink/src/App.tsx
@@ -0,0 +1,37 @@
+import { useState } from "react";
+import { AppThemeShell } from "./components/AppThemeShell";
+import { LeftPane } from "./components/LeftPane";
+import { useKitchenSink } from "./context/KitchenSinkContext";
+import { ComponentsView } from "./components/ComponentsView";
+import { componentGalleries, isComponentGalleryId } from "./components/componentGalleries";
+import { ThemePanel } from "./components/ThemePanel";
+import { ScreensView } from "./components/ScreensView";
+
+export default function App() {
+ const { view, componentSubPage } = useKitchenSink();
+ const [leftPaneCollapsed, setLeftPaneCollapsed] = useState(false);
+
+ const GalleryView =
+ view === "components" && isComponentGalleryId(componentSubPage)
+ ? componentGalleries[componentSubPage]
+ : null;
+
+ return (
+
+
+ setLeftPaneCollapsed((c) => !c)}
+ />
+
+ {view === "components" && componentSubPage === "grid" && }
+ {GalleryView && }
+ {view === "theme" && }
+ {view === "screens" && }
+
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/components/AppThemeShell.tsx b/apps/kitchen-sink/src/components/AppThemeShell.tsx
new file mode 100644
index 0000000000..703db07dc0
--- /dev/null
+++ b/apps/kitchen-sink/src/components/AppThemeShell.tsx
@@ -0,0 +1,44 @@
+import { ThemeProvider } from "@vibe/core";
+import { useEffect, type ReactNode } from "react";
+import { useKitchenSink } from "../context/KitchenSinkContext";
+import { buildThemeConfig } from "../lib/buildThemeConfig";
+import { buildCssVarStyle } from "../lib/cssVarOverrides";
+import { isCurrentVibeSource } from "../lib/vibeSource";
+import { getThemeFamily, type SystemTheme } from "../types";
+
+const DEFAULT_THEME_CLASSES: SystemTheme[] = ["light", "dark", "black"];
+const FACELIFT_THEME_CLASSES = DEFAULT_THEME_CLASSES.map((theme) => `facelift-${theme}-app-theme`);
+const VIBE_SOURCE_CLASSES = ["original-vibe-source", "current-vibe-source"];
+
+function getBodyThemeClass(faceliftTheme: boolean, systemTheme: SystemTheme): string {
+ return faceliftTheme ? `facelift-${systemTheme}-app-theme` : `${systemTheme}-app-theme`;
+}
+
+export function AppThemeShell({ children }: { children: ReactNode }) {
+ const { systemTheme, tokenOverrides, faceliftTheme } = useKitchenSink();
+ const themeFamily = getThemeFamily(faceliftTheme);
+ const themeConfig = buildThemeConfig(tokenOverrides, themeFamily);
+ const cssVars = buildCssVarStyle(tokenOverrides, systemTheme, themeFamily);
+
+ useEffect(() => {
+ DEFAULT_THEME_CLASSES.forEach((theme) => {
+ document.body.classList.remove(`${theme}-app-theme`);
+ });
+ FACELIFT_THEME_CLASSES.forEach((themeClass) => {
+ document.body.classList.remove(themeClass);
+ });
+ VIBE_SOURCE_CLASSES.forEach(sourceClass => {
+ document.body.classList.remove(sourceClass);
+ });
+ document.body.classList.add(getBodyThemeClass(faceliftTheme, systemTheme));
+ document.body.classList.add(isCurrentVibeSource ? "current-vibe-source" : "original-vibe-source");
+ }, [faceliftTheme, systemTheme]);
+
+ return (
+
+
+ {children}
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/components/ButtonGalleryView.tsx b/apps/kitchen-sink/src/components/ButtonGalleryView.tsx
new file mode 100644
index 0000000000..a7e9846495
--- /dev/null
+++ b/apps/kitchen-sink/src/components/ButtonGalleryView.tsx
@@ -0,0 +1,134 @@
+import { Button } from "@vibe/core";
+import { Bolt, Calendar } from "@vibe/icons";
+import type { ReactNode } from "react";
+import { ComponentGallery, type GalleryVariation } from "./ComponentGallery";
+
+function ButtonRow({ children }: { children: ReactNode }) {
+ return {children}
;
+}
+
+const buttonVariations: GalleryVariation[] = [
+ {
+ id: "kind-primary",
+ label: "Kind — Primary",
+ render: () => Primary
+ },
+ {
+ id: "kind-secondary",
+ label: "Kind — Secondary",
+ render: () => Secondary
+ },
+ {
+ id: "kind-tertiary",
+ label: "Kind — Tertiary",
+ render: () => Tertiary
+ },
+ {
+ id: "sizes",
+ label: "Sizes",
+ render: () => (
+
+ XS
+ Small
+ Medium
+ Large
+
+ )
+ },
+ {
+ id: "icon-left",
+ label: "Icon — Left",
+ render: () => (
+
+
+ Left
+
+
+ Left
+
+
+ Left
+
+
+ )
+ },
+ {
+ id: "icon-right",
+ label: "Icon — Right",
+ render: () => (
+
+
+ Right
+
+
+ Right
+
+
+ Right
+
+
+ )
+ },
+ {
+ id: "icon-both",
+ label: "Icon — Both sides",
+ render: () => (
+
+ Both icons
+
+ )
+ },
+ {
+ id: "disabled-primary",
+ label: "Disabled — Primary",
+ render: () => Primary
+ },
+ {
+ id: "disabled-secondary",
+ label: "Disabled — Secondary",
+ render: () => (
+
+ Secondary
+
+ )
+ },
+ {
+ id: "disabled-tertiary",
+ label: "Disabled — Tertiary",
+ render: () => (
+
+ Tertiary
+
+ )
+ },
+ {
+ id: "state-active",
+ label: "State — Active",
+ render: () => Active
+ },
+ {
+ id: "color-positive",
+ label: "Color — Positive",
+ render: () => Positive
+ },
+ {
+ id: "color-negative",
+ label: "Color — Negative",
+ render: () => Negative
+ },
+ {
+ id: "loading",
+ label: "State — Loading",
+ render: () => Loading
+ }
+];
+
+export function ButtonGalleryView() {
+ return (
+
+ );
+}
diff --git a/apps/kitchen-sink/src/components/ButtonGroupGalleryView.tsx b/apps/kitchen-sink/src/components/ButtonGroupGalleryView.tsx
new file mode 100644
index 0000000000..701cb2a800
--- /dev/null
+++ b/apps/kitchen-sink/src/components/ButtonGroupGalleryView.tsx
@@ -0,0 +1,80 @@
+import { ButtonGroup } from "@vibe/core";
+import { ComponentGallery, type GalleryVariation } from "./ComponentGallery";
+
+const options = [
+ { value: 1, text: "Alpha" },
+ { value: 2, text: "Beta" },
+ { value: 3, text: "Gamma" },
+ { value: 4, text: "Delta" },
+];
+
+const buttonGroupVariations: GalleryVariation[] = [
+ {
+ id: "kind-secondary",
+ label: "Kind — Secondary (default)",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "kind-tertiary",
+ label: "Kind — Tertiary",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "size-medium",
+ label: "Size — Medium",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "size-small",
+ label: "Size — Small",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "disabled",
+ label: "State — Disabled",
+ render: () => ,
+ },
+ {
+ id: "disabled-single",
+ label: "State — Single option disabled",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "full-width",
+ label: "Layout — Full width",
+ render: () => (
+
+
+
+ ),
+ },
+];
+
+export function ButtonGroupGalleryView() {
+ return (
+
+ );
+}
diff --git a/apps/kitchen-sink/src/components/ChipGalleryView.tsx b/apps/kitchen-sink/src/components/ChipGalleryView.tsx
new file mode 100644
index 0000000000..d07bc67413
--- /dev/null
+++ b/apps/kitchen-sink/src/components/ChipGalleryView.tsx
@@ -0,0 +1,2 @@
+/** @deprecated Prefer ChipsGalleryView — kept so older imports keep working. */
+export { ChipsGalleryView as ChipGalleryView } from "./ChipsGalleryView";
diff --git a/apps/kitchen-sink/src/components/ChipsGalleryView.tsx b/apps/kitchen-sink/src/components/ChipsGalleryView.tsx
new file mode 100644
index 0000000000..b5e3e9d218
--- /dev/null
+++ b/apps/kitchen-sink/src/components/ChipsGalleryView.tsx
@@ -0,0 +1,267 @@
+import { Chips } from "@vibe/core";
+import { Bolt, Email } from "@vibe/icons";
+import { type ReactNode, useLayoutEffect, useRef } from "react";
+import { ComponentGallery, type GalleryVariation } from "./ComponentGallery";
+
+type ChipColor =
+ | "primary"
+ | "positive"
+ | "negative"
+ | "warning"
+ | "info"
+ | "done-green"
+ | "bright-blue"
+ | "purple"
+ | "stuck-red"
+ | "working_orange";
+
+const THEME_COLORS: { value: ChipColor; label: string }[] = [
+ { value: "primary", label: "Primary" },
+ { value: "positive", label: "Positive" },
+ { value: "negative", label: "Negative" },
+ { value: "warning", label: "Warning" },
+ { value: "info", label: "Info" },
+];
+
+const PALETTE_COLORS: { value: ChipColor; label: string }[] = [
+ { value: "done-green", label: "Done green" },
+ { value: "bright-blue", label: "Bright blue" },
+ { value: "purple", label: "Purple" },
+ { value: "stuck-red", label: "Stuck red" },
+ { value: "working_orange", label: "Working orange" },
+];
+
+function themeClassName(value: ChipColor, ...extra: (string | undefined)[]) {
+ return [`chips-theme-${value}`, ...extra].filter(Boolean).join(" ") || undefined;
+}
+
+function chipClassName(...parts: (string | undefined | false)[]) {
+ return parts.filter(Boolean).join(" ") || undefined;
+}
+
+function ChipRow({ children }: { children: ReactNode }) {
+ return {children}
;
+}
+
+const chipsVariations: GalleryVariation[] = [
+ {
+ id: "read-only",
+ label: "Read only",
+ render: () => (
+
+ {THEME_COLORS.map(({ value, label }) => (
+
+ ))}
+
+
+ ),
+ },
+ {
+ id: "clickable",
+ label: "Clickable",
+ render: () => (
+
+ {}} />
+ {}} className="chips-has-left" />
+
+ ),
+ },
+ {
+ id: "removable",
+ label: "Removable",
+ render: () => (
+ {}} className="chips-close-on-hover" />
+ ),
+ },
+ {
+ id: "size",
+ label: "Size",
+ render: () => (
+
+
+
+
+
+
+ ),
+ },
+ {
+ id: "filterable-primary",
+ label: "Filterable — Primary",
+ render: () => (
+
+ {}} />
+ {}}
+ />
+ {}}
+ />
+ {}}
+ />
+
+
+ ),
+ },
+ {
+ id: "themes",
+ label: "Themes",
+ render: () => (
+
+ {THEME_COLORS.map(({ value, label }) => (
+
+ ))}
+
+
+ ),
+ },
+ {
+ id: "icons-left",
+ label: "Icons — Left",
+ render: () => (
+
+ {THEME_COLORS.map(({ value, label }) => (
+
+ ))}
+
+ ),
+ },
+ {
+ id: "icons-right",
+ label: "Icons — Right",
+ render: () => (
+
+ {THEME_COLORS.map(({ value, label }) => (
+
+ ))}
+
+ ),
+ },
+ {
+ id: "icons-both",
+ label: "Icons — Both sides",
+ render: () => (
+
+ {THEME_COLORS.map(({ value, label }) => (
+
+ ))}
+
+ ),
+ },
+ {
+ id: "with-border",
+ label: "With border",
+ render: () => (
+
+ {THEME_COLORS.map(({ value, label }) => (
+
+ ))}
+
+ ),
+ },
+ {
+ id: "palette-samples",
+ label: "Palette samples",
+ render: () => (
+
+ {PALETTE_COLORS.map(({ value, label }) => (
+
+ ))}
+
+ ),
+ },
+];
+
+export function ChipsGalleryView() {
+ const rootRef = useRef(null);
+
+ // Published Chips keep the close button in-flow; lock resting width after CSS takes it out of flow
+ useLayoutEffect(() => {
+ const root = rootRef.current;
+ if (!root) return;
+
+ const lockWidths = () => {
+ root.querySelectorAll('[data-vibe="Chips"]:has([data-testid$="-close"])').forEach(chip => {
+ chip.style.width = "";
+ chip.style.width = `${chip.getBoundingClientRect().width}px`;
+ });
+ };
+
+ lockWidths();
+ const frame = requestAnimationFrame(lockWidths);
+ return () => cancelAnimationFrame(frame);
+ }, []);
+
+ return (
+
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/components/ComponentCard.tsx b/apps/kitchen-sink/src/components/ComponentCard.tsx
new file mode 100644
index 0000000000..7c49bbf8bc
--- /dev/null
+++ b/apps/kitchen-sink/src/components/ComponentCard.tsx
@@ -0,0 +1,51 @@
+import type { Section } from "../types";
+import { ErrorBoundary } from "./ErrorBoundary";
+
+type Props = {
+ section: Section;
+ state: Record;
+ focused: boolean;
+ onFocus: () => void;
+ interactive?: boolean;
+};
+
+export function ComponentCard({
+ section,
+ state,
+ focused,
+ onFocus,
+ interactive = true,
+}: Props) {
+ const { Demo, title } = section;
+
+ const className = [
+ "component-card",
+ interactive && focused ? "is-focused" : "",
+ !interactive ? "is-static" : "",
+ ]
+ .filter(Boolean)
+ .join(" ");
+
+ return (
+ {
+ if (e.key === "Enter" || e.key === " ") onFocus();
+ }
+ : undefined
+ }
+ >
+ {title}
+
+ Could not render this state}>
+
+
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/components/ComponentControlBar.tsx b/apps/kitchen-sink/src/components/ComponentControlBar.tsx
new file mode 100644
index 0000000000..aa549b00a5
--- /dev/null
+++ b/apps/kitchen-sink/src/components/ComponentControlBar.tsx
@@ -0,0 +1,57 @@
+import { Dropdown, Flex, Text, Toggle } from "@vibe/core";
+import type { Section } from "../types";
+
+// The control bar is pinned to the bottom, so menus must open upward. At runtime Vite aliases
+// @vibe/core to the local v3 build, whose Dropdown honors menuPlacement; the v4 types resolved
+// from node_modules don't declare it, hence the untyped spread.
+const MENU_ABOVE = { menuPlacement: "top" } as Record;
+
+type Props = {
+ section: Section;
+ state: Record;
+ onChange: (patch: Record) => void;
+ status?: "enter" | "exit";
+};
+
+export function ComponentControlBar({ section, state, onChange, status }: Props) {
+ const statusClass = status ? ` control-bar--${status}` : "";
+
+ return (
+
+
{section.title} controls
+
+ {section.controls.map((control) => {
+ if (control.type === "boolean") {
+ return (
+
+ {control.label}
+ onChange({ [control.key]: val })}
+ />
+
+ );
+ }
+
+ const options = control.options.map((o) => ({ value: o.value, label: o.label }));
+ const selected = options.find((o) => o.value === String(state[control.key])) ?? options[0];
+
+ return (
+
+ {control.label}
+
+ onChange({ [control.key]: opt?.value })}
+ clearable={false}
+ {...MENU_ABOVE}
+ />
+
+
+ );
+ })}
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/components/ComponentGallery.tsx b/apps/kitchen-sink/src/components/ComponentGallery.tsx
new file mode 100644
index 0000000000..2a057e035a
--- /dev/null
+++ b/apps/kitchen-sink/src/components/ComponentGallery.tsx
@@ -0,0 +1,33 @@
+import type { ReactNode } from "react";
+
+export type GalleryVariation = {
+ id: string;
+ label: string;
+ render: () => ReactNode;
+};
+
+type ComponentGalleryProps = {
+ title: string;
+ description: string;
+ variations: GalleryVariation[];
+ className?: string;
+};
+
+export function ComponentGallery({ title, description, variations, className }: ComponentGalleryProps) {
+ return (
+
+
+ {title}
+ {description}
+
+
+ {variations.map(({ id, label, render }) => (
+
+ {label}
+ {render()}
+
+ ))}
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/components/ComponentGrid.tsx b/apps/kitchen-sink/src/components/ComponentGrid.tsx
new file mode 100644
index 0000000000..0218a1b180
--- /dev/null
+++ b/apps/kitchen-sink/src/components/ComponentGrid.tsx
@@ -0,0 +1,31 @@
+import { sections } from "../sections";
+import { ComponentCard } from "./ComponentCard";
+
+type Props = {
+ componentStates: Record>;
+ focusedComponentId: string | null;
+ onFocus: (id: string) => void;
+ interactive?: boolean;
+};
+
+export function ComponentGrid({
+ componentStates,
+ focusedComponentId,
+ onFocus,
+ interactive = true,
+}: Props) {
+ return (
+
+ {sections.map((section) => (
+ onFocus(section.id)}
+ interactive={interactive}
+ />
+ ))}
+
+ );
+}
diff --git a/apps/kitchen-sink/src/components/ComponentsView.tsx b/apps/kitchen-sink/src/components/ComponentsView.tsx
new file mode 100644
index 0000000000..c2669dfb72
--- /dev/null
+++ b/apps/kitchen-sink/src/components/ComponentsView.tsx
@@ -0,0 +1,62 @@
+import { useEffect, useRef, useState } from "react";
+import { useKitchenSink } from "../context/KitchenSinkContext";
+import { sections } from "../sections";
+import { ComponentControlBar } from "./ComponentControlBar";
+import { ComponentGrid } from "./ComponentGrid";
+import type { Section } from "../types";
+
+const EXIT_MS = 300;
+const ENTER_MS = 360;
+
+type BarAnimation = "none" | "exit" | "enter";
+
+export function ComponentsView() {
+ const {
+ componentStates,
+ focusedComponentId,
+ setFocusedComponentId,
+ updateComponentState,
+ } = useKitchenSink();
+
+ const focusedSection = sections.find((s) => s.id === focusedComponentId) ?? sections[0];
+
+ const [shownSection, setShownSection] = useState(focusedSection);
+ const [animation, setAnimation] = useState("none");
+ const timerRef = useRef>();
+
+ useEffect(() => {
+ if (focusedSection.id === shownSection.id) return;
+
+ setAnimation("exit");
+ clearTimeout(timerRef.current);
+
+ timerRef.current = setTimeout(() => {
+ setShownSection(focusedSection);
+ setAnimation("enter");
+ timerRef.current = setTimeout(() => setAnimation("none"), ENTER_MS);
+ }, EXIT_MS);
+
+ return () => clearTimeout(timerRef.current);
+ }, [focusedSection, shownSection.id]);
+
+ useEffect(() => () => clearTimeout(timerRef.current), []);
+
+ return (
+
+
+
+ updateComponentState(shownSection.id, patch)}
+ status={animation === "none" ? undefined : animation}
+ />
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/components/DropdownGalleryView.tsx b/apps/kitchen-sink/src/components/DropdownGalleryView.tsx
new file mode 100644
index 0000000000..f25de0af9a
--- /dev/null
+++ b/apps/kitchen-sink/src/components/DropdownGalleryView.tsx
@@ -0,0 +1,467 @@
+import { Dropdown } from "@vibe/core";
+import { Attach, Email, Mobile, Send } from "@mondaydotcomorg/icons";
+import type { ComponentProps } from "react";
+import avatar1 from "../screens/assets/31a207ddb210814d45f4e60c5afe26c81fb55207.png";
+import avatar2 from "../screens/assets/44a0d931f8b012dcfc18715f7a64847e76751825.png";
+import avatar3 from "../screens/assets/6f1e4ef08a4e8899bba87998c3410a8132536714.png";
+
+type DropdownVariation = {
+ id: string;
+ label: string;
+ render: () => React.ReactNode;
+};
+
+const basicOptions = [
+ { value: 1, label: "Option 1" },
+ { value: 2, label: "Option 2" },
+ { value: 3, label: "Option 3" },
+];
+
+const chipOptions = [
+ { value: "done", label: "Done", chipColor: "positive" as const },
+ { value: "blocked", label: "Blocked", chipColor: "negative" as const },
+ { value: "working", label: "Working on it", chipColor: "warning" as const },
+ { value: "info", label: "Info", chipColor: "info" as const },
+];
+
+const iconOptions = [
+ { value: "email", label: "Email", startElement: { type: "icon" as const, value: Email } },
+ { value: "attach", label: "Attach", startElement: { type: "icon" as const, value: Attach } },
+];
+
+const avatarOptions = [
+ { value: "Julia", label: "Julia Martinez", startElement: { type: "avatar" as const, value: avatar1 } },
+ { value: "Sophia", label: "Sophia Johnson", startElement: { type: "avatar" as const, value: avatar2 } },
+ { value: "Marco", label: "Marco DiAngelo", startElement: { type: "avatar" as const, value: avatar3 } },
+];
+
+const groupedOptions = [
+ {
+ label: "Category 1",
+ options: [
+ { value: "1", label: "Item 1" },
+ { value: "2", label: "Item 2" },
+ { value: "3", label: "Item 3" },
+ ],
+ },
+ {
+ label: "Category 2",
+ options: [
+ { value: "4", label: "Item 1" },
+ { value: "5", label: "Item 2" },
+ { value: "6", label: "Item 3" },
+ ],
+ },
+];
+
+const groupedByDividerOptions = [
+ {
+ options: [
+ { value: "1", label: "Item 1" },
+ { value: "2", label: "Item 2" },
+ { value: "3", label: "Item 3" },
+ ],
+ },
+ {
+ options: [
+ { value: "4", label: "Item 1" },
+ { value: "5", label: "Item 2" },
+ ],
+ },
+];
+
+const startElementOptions = [
+ { value: "icon", label: "Item with icon", startElement: { type: "icon" as const, value: Email } },
+ { value: "avatar", label: "Item with avatar", startElement: { type: "avatar" as const, value: avatar1 } },
+ { value: "indent", label: "Item with indent", startElement: { type: "indent" as const } },
+];
+
+const endElementOptions = [
+ { value: "endIcon", label: "Item with icon", endElement: { type: "icon" as const, value: Email } },
+ { value: "hintText", label: "Item with hint text", endElement: { type: "suffix" as const, value: "⌘C" } },
+];
+
+const tooltipOptions = [
+ {
+ value: "Option 1",
+ label: "Tooltip",
+ tooltipProps: { content: "This is a title message for further information will appear here." },
+ },
+ {
+ value: "Option 2",
+ label: "Chip",
+ tooltipProps: { content: "This is a title message for further information will appear here." },
+ },
+ { value: "Option 3", label: "Button" },
+];
+
+const boxModeIconOptions = [
+ { value: "email", label: "Email", startElement: { type: "icon" as const, value: Email } },
+ { value: "send", label: "Send", startElement: { type: "icon" as const, value: Send } },
+ { value: "mobile", label: "Mobile", startElement: { type: "icon" as const, value: Mobile } },
+ { value: "notification", label: "Send notification" },
+];
+
+const peopleOptions = [
+ {
+ label: "Suggested people",
+ options: [
+ { value: "Matt", label: "Matt Gaman", startElement: { type: "avatar" as const, value: avatar1 } },
+ { value: "Jennifer", label: "Jennifer Lawrence", startElement: { type: "avatar" as const, value: avatar2 } },
+ { value: "Emma", label: "Emma Stone", startElement: { type: "avatar" as const, value: avatar3 } },
+ ],
+ },
+];
+
+function DropdownPreview(props: ComponentProps) {
+ return (
+
+
+
+ );
+}
+
+const dropdownVariations: DropdownVariation[] = [
+ {
+ id: "overview",
+ label: "Overview",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "size-large",
+ label: "Size — Large",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "size-medium",
+ label: "Size — Medium",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "size-small",
+ label: "Size — Small",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "state-default",
+ label: "State — Default",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "state-disabled",
+ label: "State — Disabled",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "state-error",
+ label: "State — Error",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "state-readonly",
+ label: "State — Read only",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "multi-single-line",
+ label: "Multi select — Single line",
+ render: () => (
+
+
+
+ ),
+ },
+ {
+ id: "multi-multiline",
+ label: "Multi select — Multiple lines",
+ render: () => (
+
+
+
+ ),
+ },
+ {
+ id: "multi-hide-selected",
+ label: "Multi select — Hide selected in menu",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "icon-single",
+ label: "With icon — Single value",
+ render: () => ,
+ },
+ {
+ id: "icon-multi",
+ label: "With icon — Multi value",
+ render: () => ,
+ },
+ {
+ id: "avatar-single",
+ label: "With avatar — Single value",
+ render: () => ,
+ },
+ {
+ id: "avatar-multi",
+ label: "With avatar — Multi value",
+ render: () => ,
+ },
+ {
+ id: "searchable",
+ label: "Searchable",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "group-divider",
+ label: "Groups — Divider",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "group-category",
+ label: "Groups — Category",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "group-sticky",
+ label: "Groups — Sticky category title",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "start-element",
+ label: "Item elements — Start",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "end-element",
+ label: "Item elements — End",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "tooltips",
+ label: "With tooltips",
+ render: () => ,
+ },
+ {
+ id: "box-mode-default",
+ label: "Box mode — Default",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "box-mode-multi-single",
+ label: "Box mode — Multi single line",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "box-mode-multi-multiline",
+ label: "Box mode — Multi multiline",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "box-mode-icons",
+ label: "Box mode — With icons",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "box-mode-people",
+ label: "Box mode — People picker",
+ render: () => (
+
+
+
+ ),
+ },
+];
+
+export function DropdownGalleryView() {
+ return (
+
+
+
+ {dropdownVariations.map(({ id, label, render }) => (
+
+ {label}
+ {render()}
+
+ ))}
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/components/ErrorBoundary.tsx b/apps/kitchen-sink/src/components/ErrorBoundary.tsx
new file mode 100644
index 0000000000..fd4b2de5ab
--- /dev/null
+++ b/apps/kitchen-sink/src/components/ErrorBoundary.tsx
@@ -0,0 +1,21 @@
+import { Component, type ErrorInfo, type ReactNode } from "react";
+
+type Props = { fallback: ReactNode; children: ReactNode };
+type State = { hasError: boolean };
+
+export class ErrorBoundary extends Component {
+ state: State = { hasError: false };
+
+ static getDerivedStateFromError(): State {
+ return { hasError: true };
+ }
+
+ componentDidCatch(error: Error, info: ErrorInfo) {
+ console.error("Component demo error:", error, info);
+ }
+
+ render() {
+ if (this.state.hasError) return this.props.fallback;
+ return this.props.children;
+ }
+}
diff --git a/apps/kitchen-sink/src/components/IconButtonGalleryView.tsx b/apps/kitchen-sink/src/components/IconButtonGalleryView.tsx
new file mode 100644
index 0000000000..f0c5138851
--- /dev/null
+++ b/apps/kitchen-sink/src/components/IconButtonGalleryView.tsx
@@ -0,0 +1,110 @@
+import { IconButton } from "@vibe/core";
+import { Add, Bolt, Doc, Robot } from "@vibe/icons";
+import { ComponentGallery, type GalleryVariation } from "./ComponentGallery";
+
+const iconButtonVariations: GalleryVariation[] = [
+ {
+ id: "kind-primary",
+ label: "Kind — Primary",
+ render: () =>
+ },
+ {
+ id: "kind-secondary",
+ label: "Kind — Secondary",
+ render: () =>
+ },
+ {
+ id: "kind-tertiary",
+ label: "Kind — Tertiary",
+ render: () =>
+ },
+ {
+ id: "size-xs",
+ label: "Size — XS",
+ render: () =>
+ },
+ {
+ id: "size-small",
+ label: "Size — Small",
+ render: () =>
+ },
+ {
+ id: "size-medium",
+ label: "Size — Medium",
+ render: () =>
+ },
+ {
+ id: "size-large",
+ label: "Size — Large",
+ render: () =>
+ },
+ {
+ id: "active-primary",
+ label: "Active — Primary",
+ render: () =>
+ },
+ {
+ id: "active-secondary",
+ label: "Active — Secondary",
+ render: () =>
+ },
+ {
+ id: "active-tertiary",
+ label: "Active — Tertiary",
+ render: () =>
+ },
+ {
+ id: "disabled-primary",
+ label: "Disabled — Primary",
+ render: () => (
+
+ )
+ },
+ {
+ id: "disabled-secondary",
+ label: "Disabled — Secondary",
+ render: () => (
+
+ )
+ },
+ {
+ id: "disabled-tertiary",
+ label: "Disabled — Tertiary",
+ render: () => (
+
+ )
+ },
+ {
+ id: "default-add",
+ label: "Default — Add",
+ render: () => {}} />
+ }
+];
+
+export function IconButtonGalleryView() {
+ return (
+
+ );
+}
diff --git a/apps/kitchen-sink/src/components/LabelGalleryView.tsx b/apps/kitchen-sink/src/components/LabelGalleryView.tsx
new file mode 100644
index 0000000000..a083ad0824
--- /dev/null
+++ b/apps/kitchen-sink/src/components/LabelGalleryView.tsx
@@ -0,0 +1,50 @@
+import { Label } from "@vibe/core";
+import { ComponentGallery, type GalleryVariation } from "./ComponentGallery";
+
+const labelVariations: GalleryVariation[] = [
+ {
+ id: "default",
+ label: "Default",
+ render: () => ,
+ },
+ {
+ id: "size-medium",
+ label: "Size — Medium",
+ render: () => ,
+ },
+ {
+ id: "size-small",
+ label: "Size — Small",
+ render: () => ,
+ },
+ {
+ id: "color-primary",
+ label: "Color — Primary",
+ render: () => ,
+ },
+ {
+ id: "color-positive",
+ label: "Color — Positive",
+ render: () => ,
+ },
+ {
+ id: "color-negative",
+ label: "Color — Negative",
+ render: () => ,
+ },
+ {
+ id: "color-dark",
+ label: "Color — Dark",
+ render: () => ,
+ },
+];
+
+export function LabelGalleryView() {
+ return (
+
+ );
+}
diff --git a/apps/kitchen-sink/src/components/LeftPane.tsx b/apps/kitchen-sink/src/components/LeftPane.tsx
new file mode 100644
index 0000000000..ae4b2a8c37
--- /dev/null
+++ b/apps/kitchen-sink/src/components/LeftPane.tsx
@@ -0,0 +1,162 @@
+import { ButtonGroup, SegmentedControl } from "@vibe/core";
+import { useKitchenSink } from "../context/KitchenSinkContext";
+import { isCurrentVibeSource, switchVibeSource, vibeSource } from "../lib/vibeSource";
+import type { AppState, SystemTheme, ThemeSubPage } from "../types";
+import { COMPONENT_GALLERY_LABELS, COMPONENT_GALLERY_ORDER } from "./componentGalleries";
+
+const VIBE_SOURCE_BUTTON_GROUP_OPTIONS = [
+ { value: "original", text: "Original" },
+ { value: "current", text: "Current" }
+] as const;
+
+const VIBE_SOURCE_SEGMENTED_OPTIONS = [
+ { value: "original", label: "Original" },
+ { value: "current", label: "Current" }
+];
+
+const THEME_SUBPAGES: { id: ThemeSubPage; label: string }[] = [
+ { id: "colors", label: "Colors" },
+ { id: "radius", label: "Radius" },
+ { id: "typography", label: "Typography" }
+];
+
+const SYSTEM_THEMES: SystemTheme[] = ["light", "dark", "black"];
+
+type LeftPaneProps = {
+ collapsed: boolean;
+ onToggleCollapse: () => void;
+};
+
+export function LeftPane({ collapsed, onToggleCollapse }: LeftPaneProps) {
+ const {
+ view,
+ themeSubPage,
+ componentSubPage,
+ systemTheme,
+ tokenOverrides,
+ componentStates,
+ focusedComponentId,
+ faceliftTheme,
+ setView,
+ setThemeSubPage,
+ setComponentSubPage,
+ setSystemTheme
+ } = useKitchenSink();
+
+ const currentState: AppState = {
+ view,
+ themeSubPage,
+ componentSubPage,
+ systemTheme,
+ tokenOverrides,
+ componentStates,
+ focusedComponentId,
+ faceliftTheme
+ };
+
+ const onVibeSourceChange = (value: string) => {
+ switchVibeSource(value as "original" | "current", currentState);
+ };
+
+ return (
+
+
+ {!collapsed &&
Facelift Kitchen Sink }
+
+ {collapsed ? "›" : "‹"}
+
+
+
+ setView("components")}
+ >
+ Components
+
+ {COMPONENT_GALLERY_ORDER.map(id => (
+ setComponentSubPage(id)}
+ >
+ {COMPONENT_GALLERY_LABELS[id]}
+
+ ))}
+ setThemeSubPage(themeSubPage)}
+ >
+ Theme
+
+ {view === "theme" &&
+ THEME_SUBPAGES.map(page => (
+ setThemeSubPage(page.id)}
+ >
+ {page.label}
+
+ ))}
+ setView("screens")}
+ >
+ Screens
+
+
+
+
+
Vibe
+
+ {isCurrentVibeSource ? (
+
+ ) : (
+ onVibeSourceChange(String(value))}
+ />
+ )}
+
+
+
+ Mode
+ {SYSTEM_THEMES.map(theme => (
+ setSystemTheme(theme)}
+ >
+ {theme.charAt(0).toUpperCase() + theme.slice(1)}
+
+ ))}
+
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/components/MenuGalleryView.tsx b/apps/kitchen-sink/src/components/MenuGalleryView.tsx
new file mode 100644
index 0000000000..366691452a
--- /dev/null
+++ b/apps/kitchen-sink/src/components/MenuGalleryView.tsx
@@ -0,0 +1,389 @@
+import {
+ DialogContentContainer,
+ Label,
+ Menu,
+ MenuDivider,
+ MenuItem,
+ MenuItemButton,
+ MenuTitle,
+} from "@vibe/core";
+import { Delete, Email, Info, Invite, Settings } from "@vibe/icons";
+import type { ReactNode } from "react";
+import { isCurrentVibeSource } from "../lib/vibeSource";
+import { ComponentGallery, type GalleryVariation } from "./ComponentGallery";
+
+function MenuRow({ children }: { children: ReactNode }) {
+ return {children}
;
+}
+
+function MenuPreview({ children, label }: { children: ReactNode; label?: string }) {
+ return (
+
+ {label ? {label} : null}
+
+ {children}
+
+
+ );
+}
+
+const menuVariations: GalleryVariation[] = [
+ {
+ id: "default",
+ label: "Default",
+ render: () => (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ id: "states",
+ label: "States",
+ render: () => (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ id: "disabled-reason",
+ label: "State — Disabled with reason",
+ render: () => (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ id: "with-label",
+ label: "With item label",
+ render: () => (
+
+
+ } />
+
+
+
+
+ ),
+ },
+ {
+ id: "title-placements",
+ label: "Title — Caption placements",
+ render: () => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ id: "title-divider",
+ label: "Title + divider",
+ render: () => (
+
+
+
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ id: "submenu",
+ label: "Submenu",
+ render: () => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ id: "submenu-split",
+ label: "Submenu — Split item",
+ render: () => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ id: "overflow",
+ label: "Overflow — Long text",
+ render: () => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ id: "tooltip",
+ label: "With tooltip",
+ render: () => (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ id: "item-button-kinds",
+ label: "Menu item button — Kinds",
+ render: () => (
+
+
+
+ Primary
+
+
+
+
+ Secondary
+
+
+
+
+ Tertiary
+
+
+
+ ),
+ },
+ {
+ id: "item-button-disabled",
+ label: "Menu item button — Disabled",
+ render: () => (
+
+
+
+
+ Primary
+
+
+
+
+
+
+ Secondary
+
+
+
+
+
+
+ Tertiary
+
+
+
+
+ ),
+ },
+ {
+ id: "item-button-icons",
+ label: "Menu item button — Icons",
+ render: () => (
+
+
+
+ Left icon
+
+
+
+
+ Right icon
+
+
+
+ ),
+ },
+ {
+ id: "composed",
+ label: "Composed example",
+ render: () => (
+
+
+
+
+ } />
+
+
+
+
+
+
+
+
+
+
+ Invite
+
+
+
+ ),
+ },
+ {
+ id: "sizes",
+ label: "Sizes",
+ render: () => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ id: "icons-left",
+ label: "Icons — Left",
+ render: () => (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ id: "icons-right",
+ label: "Icons — Right",
+ render: () => (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ id: "icons-both",
+ label: "Icons — Both sides",
+ render: () => (
+
+
+
+
+
+
+
+ ),
+ },
+];
+
+export function MenuGalleryView() {
+ return (
+
+ );
+}
diff --git a/apps/kitchen-sink/src/components/ScreensView.tsx b/apps/kitchen-sink/src/components/ScreensView.tsx
new file mode 100644
index 0000000000..0b684d01c4
--- /dev/null
+++ b/apps/kitchen-sink/src/components/ScreensView.tsx
@@ -0,0 +1,17 @@
+import { useKitchenSink } from "../context/KitchenSinkContext";
+import { ScreensApp } from "../screens/ScreensApp";
+import type { RouteMode, RouteTheme } from "../screens/routing/hashRoute";
+
+export function ScreensView() {
+ const { faceliftTheme, systemTheme } = useKitchenSink();
+
+ const externalTheme: RouteTheme = faceliftTheme ? "glaze" : "";
+ const externalMode: RouteMode =
+ systemTheme === "dark"
+ ? "dark-app-theme"
+ : systemTheme === "black"
+ ? "black-app-theme"
+ : "";
+
+ return ;
+}
diff --git a/apps/kitchen-sink/src/components/SegmentedControlGalleryView.tsx b/apps/kitchen-sink/src/components/SegmentedControlGalleryView.tsx
new file mode 100644
index 0000000000..6b0c77bbbb
--- /dev/null
+++ b/apps/kitchen-sink/src/components/SegmentedControlGalleryView.tsx
@@ -0,0 +1,127 @@
+import { SegmentedControl } from "@vibe/core";
+import { Board, Calendar, Chart } from "@vibe/icons";
+import { ComponentGallery, type GalleryVariation } from "./ComponentGallery";
+
+const textOptions = [
+ { value: "day", label: "Day" },
+ { value: "week", label: "Week" },
+ { value: "month", label: "Month" },
+];
+
+const iconOptions = [
+ { value: "calendar", label: "Calendar", icon: Calendar },
+ { value: "board", label: "Board", icon: Board },
+ { value: "chart", label: "Chart", icon: Chart },
+];
+
+const segmentedControlVariations: GalleryVariation[] = [
+ {
+ id: "default",
+ label: "Default",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "size-xs",
+ label: "Size — XS",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "size-small",
+ label: "Size — Small",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "size-medium",
+ label: "Size — Medium",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "size-large",
+ label: "Size — Large",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "with-icons",
+ label: "With icons",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "disabled-option",
+ label: "State — Option disabled",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "disabled-group",
+ label: "State — Disabled",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "full-width",
+ label: "Layout — Full width",
+ render: () => (
+
+
+
+ ),
+ },
+];
+
+export function SegmentedControlGalleryView() {
+ return (
+
+ );
+}
diff --git a/apps/kitchen-sink/src/components/StrokeSpotlightGalleryView.tsx b/apps/kitchen-sink/src/components/StrokeSpotlightGalleryView.tsx
new file mode 100644
index 0000000000..23c4c01fec
--- /dev/null
+++ b/apps/kitchen-sink/src/components/StrokeSpotlightGalleryView.tsx
@@ -0,0 +1,69 @@
+import { StrokeSpotlight, Text, type StrokeSpotlightPalette } from "@vibe/core";
+import { ComponentGallery, type GalleryVariation } from "./ComponentGallery";
+
+function ComposerPreview({
+ palette,
+ placeholder,
+}: {
+ palette: StrokeSpotlightPalette;
+ placeholder: string;
+}) {
+ return (
+
+
+
+
+
+ Move pointer near the box · click to pulse
+
+
+
+
+ );
+}
+
+const strokeSpotlightVariations: GalleryVariation[] = [
+ {
+ id: "default",
+ label: "Palette — Default (Agents)",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "sidekick",
+ label: "Palette — Sidekick",
+ render: () => (
+
+ ),
+ },
+ {
+ id: "vibe",
+ label: "Palette — Vibe",
+ render: () => (
+
+ ),
+ },
+];
+
+export function StrokeSpotlightGalleryView() {
+ return (
+
+ );
+}
diff --git a/apps/kitchen-sink/src/components/TabsGalleryView.tsx b/apps/kitchen-sink/src/components/TabsGalleryView.tsx
new file mode 100644
index 0000000000..24e170b0f8
--- /dev/null
+++ b/apps/kitchen-sink/src/components/TabsGalleryView.tsx
@@ -0,0 +1,191 @@
+import {
+ Box,
+ Tab,
+ TabList,
+ TabPanel,
+ TabPanels,
+ TabsContext,
+} from "@vibe/core";
+import { Calendar, Chart, Table } from "@vibe/icons";
+import { useRef } from "react";
+import { ComponentGallery, type GalleryVariation } from "./ComponentGallery";
+import { useGlidingTabIndicators } from "./useGlidingTabIndicators";
+
+function Panel({ children }: { children: string }) {
+ return (
+
+ {children}
+
+ );
+}
+
+const tabsVariations: GalleryVariation[] = [
+ {
+ id: "default",
+ label: "Default",
+ render: () => (
+
+
+ First
+ Second
+ Third
+ Disabled
+
+
+
+ First slide
+
+
+ Second slide
+
+
+ Third slide
+
+
+ Fourth slide
+
+
+
+ ),
+ },
+ {
+ id: "size-small",
+ label: "Size — Small",
+ render: () => (
+
+
+ Overview
+ Activity
+ Settings
+
+
+
+ Overview
+
+
+ Activity
+
+
+ Settings
+
+
+
+ ),
+ },
+ {
+ id: "size-medium",
+ label: "Size — Medium",
+ render: () => (
+
+
+ Overview
+ Activity
+ Settings
+
+
+
+ Overview
+
+
+ Activity
+
+
+ Settings
+
+
+
+ ),
+ },
+ {
+ id: "size-large",
+ label: "Size — Large",
+ render: () => (
+
+
+ Overview
+ Activity
+ Settings
+
+
+
+ Overview
+
+
+ Activity
+
+
+ Settings
+
+
+
+ ),
+ },
+ {
+ id: "with-icons",
+ label: "With icons",
+ render: () => (
+
+
+ Table
+ Chart
+ Calendar
+
+
+
+ Table view
+
+
+ Chart view
+
+
+ Calendar view
+
+
+
+ ),
+ },
+ {
+ id: "stretched",
+ label: "Stretched",
+ render: () => (
+
+
+ First
+ Second
+ Third
+ Disabled
+
+
+ ),
+ },
+ {
+ id: "stretched-underline",
+ label: "Stretched underline",
+ render: () => (
+
+
+ First
+ Second
+ Third
+ Disabled
+
+
+ ),
+ },
+];
+
+export function TabsGalleryView() {
+ const rootRef = useRef(null);
+ useGlidingTabIndicators(rootRef);
+
+ return (
+
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/components/TextFieldGalleryView.tsx b/apps/kitchen-sink/src/components/TextFieldGalleryView.tsx
new file mode 100644
index 0000000000..cc5d1a0641
--- /dev/null
+++ b/apps/kitchen-sink/src/components/TextFieldGalleryView.tsx
@@ -0,0 +1,129 @@
+import type { ReactNode } from "react";
+import { TextField } from "@vibe/core";
+import { Check, CloseSmall, Duplicate, Email } from "@vibe/icons";
+import { ComponentGallery, type GalleryVariation } from "./ComponentGallery";
+
+function FieldFrame({ children }: { children: ReactNode }) {
+ return {children}
;
+}
+
+const textFieldVariations: GalleryVariation[] = [
+ {
+ id: "size-small",
+ label: "Size — Small",
+ render: () => (
+
+
+
+ ),
+ },
+ {
+ id: "size-medium",
+ label: "Size — Medium",
+ render: () => (
+
+
+
+ ),
+ },
+ {
+ id: "size-large",
+ label: "Size — Large",
+ render: () => (
+
+
+
+ ),
+ },
+ {
+ id: "with-title",
+ label: "With title",
+ render: () => (
+
+
+
+ ),
+ },
+ {
+ id: "disabled",
+ label: "State — Disabled",
+ render: () => (
+
+
+
+ ),
+ },
+ {
+ id: "with-icon",
+ label: "With icon",
+ render: () => (
+
+
+
+ ),
+ },
+ {
+ id: "clickable-icon",
+ label: "With clickable icon",
+ render: () => (
+
+ {}}
+ size="medium"
+ />
+
+ ),
+ },
+ {
+ id: "validation-success",
+ label: "Validation — Success",
+ render: () => (
+
+
+
+ ),
+ },
+ {
+ id: "validation-error",
+ label: "Validation — Error",
+ render: () => (
+
+
+
+ ),
+ },
+ {
+ id: "required",
+ label: "Required",
+ render: () => (
+
+
+
+ ),
+ },
+];
+
+export function TextFieldGalleryView() {
+ return (
+
+ );
+}
diff --git a/apps/kitchen-sink/src/components/ThemeColorSwatch.tsx b/apps/kitchen-sink/src/components/ThemeColorSwatch.tsx
new file mode 100644
index 0000000000..5be5b3c8b0
--- /dev/null
+++ b/apps/kitchen-sink/src/components/ThemeColorSwatch.tsx
@@ -0,0 +1,157 @@
+import { Text } from "@vibe/core";
+import { useEffect, useId, useRef, useState } from "react";
+import { useKitchenSink } from "../context/KitchenSinkContext";
+import type { ColorTokenDef } from "../lib/colorTokenDefinitions";
+import { formatRgba, parseColor, readComputedRgba, toHex } from "../lib/colorUtils";
+
+type ThemeColorSwatchProps = {
+ token: ColorTokenDef;
+ value: string;
+ isOverridden: boolean;
+ onChange: (value: string) => void;
+ onClear: () => void;
+};
+
+const ALPHA_TOKEN_DEFAULTS: Record = {
+ "disabled-text-color": { r: 50, g: 51, b: 56, a: 0.38 },
+ "primary-background-hover-color": { r: 103, g: 104, b: 121, a: 0.1 },
+};
+
+function readComputedTokenValue(tokenName: string): string {
+ return getComputedStyle(document.body).getPropertyValue(`--${tokenName}`).trim();
+}
+
+function toPickerHex(value: string): string {
+ const parsed = parseColor(value);
+ return parsed ? toHex(parsed) : "#0073ea";
+}
+
+function resolveDisplayColor(tokenName: string, override: string): string {
+ if (override) return override;
+ const computed = readComputedTokenValue(tokenName);
+ if (!computed) return "transparent";
+ if (computed.startsWith("#") || computed.startsWith("rgb")) return computed;
+ return `var(--${tokenName})`;
+}
+
+export function ThemeColorSwatch({
+ token,
+ value,
+ isOverridden,
+ onChange,
+ onClear,
+}: ThemeColorSwatchProps) {
+ const { faceliftTheme, systemTheme } = useKitchenSink();
+ const [editing, setEditing] = useState(false);
+ const [pickerValue, setPickerValue] = useState("#0073ea");
+ const [opacity, setOpacity] = useState(1);
+ const [displayColor, setDisplayColor] = useState(() => resolveDisplayColor(token.name, value));
+ const colorInputRef = useRef(null);
+ const inputId = useId();
+
+ useEffect(() => {
+ setDisplayColor(resolveDisplayColor(token.name, value));
+
+ if (token.supportsAlpha) {
+ const fallback = ALPHA_TOKEN_DEFAULTS[token.name] ?? { r: 0, g: 0, b: 0, a: 1 };
+ const parsed = value ? parseColor(value) : readComputedRgba(token.name, fallback);
+ if (parsed) {
+ setPickerValue(toHex(parsed));
+ setOpacity(parsed.a);
+ }
+ return;
+ }
+
+ setPickerValue(toPickerHex(value || readComputedTokenValue(token.name)));
+ }, [token.name, token.supportsAlpha, value, faceliftTheme, systemTheme]);
+
+ const openEditor = () => {
+ if (token.supportsAlpha) {
+ setEditing((current) => !current);
+ return;
+ }
+ colorInputRef.current?.click();
+ };
+
+ const applyAlphaColor = (hex: string, nextOpacity: number) => {
+ const parsed = parseColor(hex);
+ if (!parsed) return;
+ onChange(formatRgba({ ...parsed, a: nextOpacity }));
+ };
+
+ return (
+
+
+
+ {!token.supportsAlpha && (
+
onChange(event.target.value)}
+ tabIndex={-1}
+ aria-hidden
+ />
+ )}
+
+
+
+ {token.name}
+
+
+ {token.description}
+
+
+
+ {token.supportsAlpha && editing && (
+
+ )}
+
+ {isOverridden && (
+
+ Reset
+
+ )}
+
+ );
+}
diff --git a/apps/kitchen-sink/src/components/ThemeColorsPanel.tsx b/apps/kitchen-sink/src/components/ThemeColorsPanel.tsx
new file mode 100644
index 0000000000..f55b3a7135
--- /dev/null
+++ b/apps/kitchen-sink/src/components/ThemeColorsPanel.tsx
@@ -0,0 +1,99 @@
+import { Heading, Tab, TabList, TabsContext, Text } from "@vibe/core";
+import { useState } from "react";
+import { COLOR_TOKEN_SECTIONS } from "../lib/colorTokenDefinitions";
+import { useKitchenSink } from "../context/KitchenSinkContext";
+import { ThemeColorSwatch } from "./ThemeColorSwatch";
+
+function ThemeColorSection({
+ sectionId,
+ title,
+ description,
+ tokens,
+}: {
+ sectionId: string;
+ title: string;
+ description?: string;
+ tokens: (typeof COLOR_TOKEN_SECTIONS)[number]["tokens"];
+}) {
+ const { systemTheme, tokenOverrides, faceliftTheme, updateColorOverride } = useKitchenSink();
+ const themeFamily = faceliftTheme ? "facelift" : "original";
+ const themeColors = tokenOverrides.colors[themeFamily]?.[systemTheme] ?? {};
+
+ return (
+
+
+
+ {title}
+
+ {description && (
+
+ {description}
+
+ )}
+
+
+
+ {tokens.map((token) => {
+ const override = themeColors[token.name];
+ return (
+ updateColorOverride(systemTheme, token.name, next)}
+ onClear={() => updateColorOverride(systemTheme, token.name, "")}
+ />
+ );
+ })}
+
+
+ );
+}
+
+export function ThemeColorsPanel() {
+ const [activeSectionTab, setActiveSectionTab] = useState(0);
+ const visibleSections =
+ activeSectionTab === 0
+ ? COLOR_TOKEN_SECTIONS
+ : [COLOR_TOKEN_SECTIONS[activeSectionTab - 1]!];
+
+ return (
+
+
+
+ Backgrounds, text and layout
+
+
+ Shadows are not included in the theme. They are defined in the design system and should
+ not be changed.
+
+
+
+
+
+ All
+ Primary colors
+ Text colors
+ Status colors
+ Utility
+ Backgrounds
+
+
+
+ {visibleSections.map((section) => (
+
+ ))}
+
+ );
+}
diff --git a/apps/kitchen-sink/src/components/ThemePanel.tsx b/apps/kitchen-sink/src/components/ThemePanel.tsx
new file mode 100644
index 0000000000..457cc25432
--- /dev/null
+++ b/apps/kitchen-sink/src/components/ThemePanel.tsx
@@ -0,0 +1,18 @@
+import { useKitchenSink } from "../context/KitchenSinkContext";
+import { ThemeColorsPanel } from "./ThemeColorsPanel";
+import { ThemeRadiusPanel } from "./ThemeRadiusPanel";
+import { ThemeTypographyPanel } from "./ThemeTypographyPanel";
+
+export function ThemePanel() {
+ const { themeSubPage } = useKitchenSink();
+
+ if (themeSubPage === "colors") {
+ return ;
+ }
+
+ if (themeSubPage === "typography") {
+ return ;
+ }
+
+ return ;
+}
diff --git a/apps/kitchen-sink/src/components/ThemeRadiusPanel.tsx b/apps/kitchen-sink/src/components/ThemeRadiusPanel.tsx
new file mode 100644
index 0000000000..349167336e
--- /dev/null
+++ b/apps/kitchen-sink/src/components/ThemeRadiusPanel.tsx
@@ -0,0 +1,64 @@
+import { Heading, Text, TextField } from "@vibe/core";
+import { useKitchenSink } from "../context/KitchenSinkContext";
+import { TOKEN_FIELDS_BY_SUBPAGE } from "../lib/tokenDefinitions";
+
+export function ThemeRadiusPanel() {
+ const { tokenOverrides, updateTokenOverrides } = useKitchenSink();
+ const fields = TOKEN_FIELDS_BY_SUBPAGE.radius;
+ const bucket = tokenOverrides.radius;
+
+ return (
+
+
+
+ Border radius
+
+
+ Corner radius tokens used across components.
+
+
+
+
+ {fields.map((field) => {
+ const rawValue = bucket[field.cssVar];
+ const stored = rawValue
+ ? field.unit
+ ? rawValue.replace(field.unit, "")
+ : rawValue
+ : field.defaultValue;
+
+ return (
+
+
+ {field.label}
+
+ {field.description && (
+
+ {field.description}
+
+ )}
+
+ {stored}px
+
+
{
+ const next = `${val}${field.unit ?? ""}`;
+ updateTokenOverrides({
+ radius: { ...bucket, [field.cssVar]: next },
+ });
+ }}
+ />
+
+ );
+ })}
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/components/ThemeTypographyPanel.tsx b/apps/kitchen-sink/src/components/ThemeTypographyPanel.tsx
new file mode 100644
index 0000000000..07946cb535
--- /dev/null
+++ b/apps/kitchen-sink/src/components/ThemeTypographyPanel.tsx
@@ -0,0 +1,137 @@
+import { Heading, Tab, TabList, TabsContext, Text, TextField } from "@vibe/core";
+import { useState } from "react";
+import { useKitchenSink } from "../context/KitchenSinkContext";
+import {
+ TYPOGRAPHY_TOKEN_SECTIONS,
+ type TypographyTokenDef,
+} from "../lib/typographyTokenDefinitions";
+
+function ThemeTypographyTokenCard({
+ token,
+ value,
+ onChange,
+}: {
+ token: TypographyTokenDef;
+ value: string;
+ onChange: (value: string) => void;
+}) {
+ const stored = value
+ ? token.unit
+ ? value.replace(token.unit, "")
+ : value
+ : token.defaultValue;
+
+ return (
+
+
+ {token.label}
+
+ {token.description && (
+
+ {token.description}
+
+ )}
+ onChange(`${val}${token.unit ?? ""}`)}
+ />
+
+ );
+}
+
+function ThemeTypographySection({
+ title,
+ description,
+ tokens,
+}: {
+ title: string;
+ description?: string;
+ tokens: TypographyTokenDef[];
+}) {
+ const { tokenOverrides, updateTokenOverrides } = useKitchenSink();
+ const bucket = tokenOverrides.typography;
+
+ return (
+
+
+
+ {title}
+
+ {description && (
+
+ {description}
+
+ )}
+
+
+
+ {tokens.map((token) => (
+
+ updateTokenOverrides({
+ typography: { ...bucket, [token.cssVar]: next },
+ })
+ }
+ />
+ ))}
+
+
+ );
+}
+
+function getVisibleTypographySections(activeTab: number) {
+ if (activeTab === 0) return TYPOGRAPHY_TOKEN_SECTIONS;
+ if (activeTab === 5) {
+ return TYPOGRAPHY_TOKEN_SECTIONS.filter(
+ (section) => section.id === "semantic-sizes" || section.id === "semantic-line-heights"
+ );
+ }
+ return [TYPOGRAPHY_TOKEN_SECTIONS[activeTab - 1]!];
+}
+
+export function ThemeTypographyPanel() {
+ const [activeSectionTab, setActiveSectionTab] = useState(0);
+ const visibleSections = getVisibleTypographySections(activeSectionTab);
+
+ return (
+
+
+
+ Typography
+
+
+ Font families, sizes, line heights, and text style tokens from the Vibe design system.
+
+
+
+
+
+ All
+ Families
+ Weights
+ Sizes
+ Line heights
+ Semantic
+ Text styles
+
+
+
+ {visibleSections.map((section) => (
+
+ ))}
+
+ );
+}
diff --git a/apps/kitchen-sink/src/components/ToastGalleryView.tsx b/apps/kitchen-sink/src/components/ToastGalleryView.tsx
new file mode 100644
index 0000000000..b54fc9d563
--- /dev/null
+++ b/apps/kitchen-sink/src/components/ToastGalleryView.tsx
@@ -0,0 +1,135 @@
+import { Toast, type ToastProps } from "@vibe/core";
+
+type ToastVariation = {
+ id: string;
+ label: string;
+ props: ToastProps;
+ message: string;
+};
+
+const toastVariations: ToastVariation[] = [
+ {
+ id: "normal",
+ label: "Normal",
+ message: "General message toast",
+ props: { type: "normal" },
+ },
+ {
+ id: "normal-with-button",
+ label: "Normal with button",
+ message: "General message toast",
+ props: {
+ type: "normal",
+ actions: [{ type: "button", content: "Button" }],
+ },
+ },
+ {
+ id: "normal-with-link",
+ label: "Normal with link",
+ message: "General message toast",
+ props: {
+ type: "normal",
+ actions: [{ type: "link", text: "Link to action", href: "https://monday.com" }],
+ },
+ },
+ {
+ id: "normal-with-button-and-link",
+ label: "Normal with button and link",
+ message: "General message toast",
+ props: {
+ type: "normal",
+ actions: [
+ { type: "button", content: "Undo 5" },
+ { type: "link", text: "Lorem ipsum", href: "https://monday.com" },
+ ],
+ },
+ },
+ {
+ id: "normal-loading",
+ label: "Normal with loading",
+ message: "General message toast",
+ props: { type: "normal", loading: true },
+ },
+ {
+ id: "positive",
+ label: "Success (positive)",
+ message: "Positive message toast",
+ props: {
+ type: "positive",
+ actions: [{ type: "button", content: "Undo 5" }],
+ },
+ },
+ {
+ id: "negative",
+ label: "Error (negative)",
+ message: "Negative message toast",
+ props: {
+ type: "negative",
+ actions: [{ type: "button", content: "Button" }],
+ },
+ },
+ {
+ id: "warning",
+ label: "Warning",
+ message: "Warning message toast",
+ props: {
+ type: "warning",
+ actions: [{ type: "button", content: "Button" }],
+ },
+ },
+ {
+ id: "dark",
+ label: "Dark",
+ message: "Dark message toast",
+ props: {
+ type: "dark",
+ actions: [{ type: "button", content: "Button" }],
+ },
+ },
+ {
+ id: "feedback-loop",
+ label: "Feedback loop",
+ message: "We successfully deleted 1 item",
+ props: {
+ type: "positive",
+ actions: [{ type: "button", content: "Undo" }],
+ },
+ },
+ {
+ id: "no-close-button",
+ label: "Without close button",
+ message: "General message toast",
+ props: { type: "normal", closeable: false },
+ },
+ {
+ id: "no-icon",
+ label: "Without icon",
+ message: "General message toast",
+ props: { type: "normal", hideIcon: true },
+ },
+];
+
+export function ToastGalleryView() {
+ return (
+
+
+
+ {toastVariations.map(({ id, label, message, props }) => (
+
+ {label}
+
+
+ {message}
+
+
+
+ ))}
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/components/componentGalleries.tsx b/apps/kitchen-sink/src/components/componentGalleries.tsx
new file mode 100644
index 0000000000..3b3070856a
--- /dev/null
+++ b/apps/kitchen-sink/src/components/componentGalleries.tsx
@@ -0,0 +1,93 @@
+import { lazy, Suspense, type ComponentType } from "react";
+import { isCurrentVibeSource } from "../lib/vibeSource";
+import type { ComponentGalleryId, ComponentSubPage } from "../types";
+import { ButtonGalleryView } from "./ButtonGalleryView";
+import { ButtonGroupGalleryView } from "./ButtonGroupGalleryView";
+import { ChipsGalleryView } from "./ChipsGalleryView";
+import { IconButtonGalleryView } from "./IconButtonGalleryView";
+import { LabelGalleryView } from "./LabelGalleryView";
+import { MenuGalleryView } from "./MenuGalleryView";
+import { SegmentedControlGalleryView } from "./SegmentedControlGalleryView";
+import { TabsGalleryView } from "./TabsGalleryView";
+import { TextFieldGalleryView } from "./TextFieldGalleryView";
+import { ToastGalleryView } from "./ToastGalleryView";
+import { StrokeSpotlightGalleryView } from "./StrokeSpotlightGalleryView";
+
+const LazyDropdownGalleryView = lazy(() =>
+ import("./DropdownGalleryView").then((m) => ({ default: m.DropdownGalleryView }))
+);
+
+function DropdownGalleryEntry() {
+ return (
+ Loading dropdown gallery… }>
+
+
+ );
+}
+
+const ALL_COMPONENT_GALLERIES: ComponentGalleryId[] = [
+ "icon-button",
+ "button",
+ "button-group",
+ "tabs",
+ "label",
+ "chip",
+ "menu",
+ "text-field",
+ "dropdown",
+ "toast",
+ "stroke-spotlight",
+];
+
+export const COMPONENT_GALLERY_ORDER = ALL_COMPONENT_GALLERIES;
+
+function ButtonGroupGalleryEntry() {
+ const Gallery = isCurrentVibeSource ? SegmentedControlGalleryView : ButtonGroupGalleryView;
+ return ;
+}
+
+export const COMPONENT_GALLERY_LABELS: Record = {
+ "icon-button": "Icon Button",
+ button: "Button",
+ "button-group": "Button Group",
+ "segmented-control": "Segmented Control",
+ tabs: "Tabs",
+ label: "Label",
+ chip: "Chips",
+ menu: "Menu",
+ "text-field": "Text Field",
+ dropdown: "Dropdown",
+ toast: "Toast",
+ "stroke-spotlight": "Stroke Spotlight",
+};
+
+export const componentGalleries: Record = {
+ "icon-button": IconButtonGalleryView,
+ button: ButtonGalleryView,
+ "button-group": ButtonGroupGalleryEntry,
+ "segmented-control": SegmentedControlGalleryView,
+ tabs: TabsGalleryView,
+ label: LabelGalleryView,
+ chip: ChipsGalleryView,
+ menu: MenuGalleryView,
+ "text-field": TextFieldGalleryView,
+ dropdown: DropdownGalleryEntry,
+ toast: ToastGalleryView,
+ "stroke-spotlight": StrokeSpotlightGalleryView,
+};
+
+export function migrateComponentSubPage(page: ComponentSubPage): ComponentSubPage {
+ return page === "segmented-control" ? "button-group" : page;
+}
+
+export function resolveComponentSubPage(page: unknown): ComponentSubPage {
+ if (page === "grid") return "grid";
+ if (typeof page !== "string") return "grid";
+
+ const migrated = migrateComponentSubPage(page as ComponentSubPage);
+ return isComponentGalleryId(migrated) ? migrated : "grid";
+}
+
+export function isComponentGalleryId(value: string): value is ComponentGalleryId {
+ return (COMPONENT_GALLERY_ORDER as string[]).includes(value);
+}
diff --git a/apps/kitchen-sink/src/components/useGlidingTabIndicators.ts b/apps/kitchen-sink/src/components/useGlidingTabIndicators.ts
new file mode 100644
index 0000000000..18478d9b25
--- /dev/null
+++ b/apps/kitchen-sink/src/components/useGlidingTabIndicators.ts
@@ -0,0 +1,134 @@
+import { type RefObject, useEffect } from "react";
+
+const INSET_PX = 4;
+
+type IndicatorState = {
+ el: HTMLSpanElement;
+ ready: boolean;
+};
+
+function prefersReducedMotion() {
+ return typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
+}
+
+function findTabListWrapper(from: Element | null): HTMLElement | null {
+ return from?.closest?.('[data-testid="tab-list"]') as HTMLElement | null;
+}
+
+function hasCoreIndicator(wrapper: HTMLElement) {
+ return Boolean(wrapper.querySelector('[class*="selectedIndicator"]:not([data-tabs-glide-indicator])'));
+}
+
+/**
+ * Gallery polyfill: Sense Motion `slide-transition` for the selected tab stroke.
+ * Tokens: position · ease-transition · duration-long-250
+ * Skips wrappers that already ship a core selectedIndicator.
+ */
+export function useGlidingTabIndicators(rootRef: RefObject) {
+ useEffect(() => {
+ const root = rootRef.current;
+ if (!root) return;
+
+ const states = new WeakMap();
+
+ const ensureIndicator = (wrapper: HTMLElement): IndicatorState | null => {
+ if (hasCoreIndicator(wrapper)) return null;
+
+ const existing = states.get(wrapper);
+ if (existing) return existing;
+
+ let el = wrapper.querySelector("[data-tabs-glide-indicator]") as HTMLSpanElement | null;
+ if (!el) {
+ el = document.createElement("span");
+ el.dataset.tabsGlideIndicator = "true";
+ el.setAttribute("aria-hidden", "true");
+ el.className = "tabs-glide-indicator";
+ wrapper.appendChild(el);
+ }
+
+ const state: IndicatorState = { el, ready: false };
+ states.set(wrapper, state);
+ return state;
+ };
+
+ const update = (wrapper: HTMLElement, animate: boolean) => {
+ if (hasCoreIndicator(wrapper)) {
+ wrapper.querySelectorAll("[data-tabs-glide-indicator]").forEach(node => node.remove());
+ return;
+ }
+
+ const state = ensureIndicator(wrapper);
+ if (!state) return;
+
+ const selected = wrapper.querySelector('[role="tab"][aria-selected="true"]') as HTMLElement | null;
+ if (!selected) return;
+
+ const wrapperRect = wrapper.getBoundingClientRect();
+ const tabRect = selected.getBoundingClientRect();
+ const toLeft = tabRect.left - wrapperRect.left + wrapper.scrollLeft + INSET_PX;
+ const toWidth = Math.max(0, tabRect.width - INSET_PX * 2);
+
+ const shouldAnimate = animate && state.ready && !prefersReducedMotion();
+ if (!shouldAnimate) {
+ const previous = state.el.style.transition;
+ state.el.style.transition = "none";
+ state.el.style.left = `${toLeft}px`;
+ state.el.style.width = `${toWidth}px`;
+ // Force reflow so disabling transition takes effect before re-enabling
+ void state.el.offsetWidth;
+ state.el.style.transition = previous;
+ } else {
+ state.el.style.left = `${toLeft}px`;
+ state.el.style.width = `${toWidth}px`;
+ }
+
+ state.el.classList.add("is-visible");
+ state.ready = true;
+ };
+
+ const syncAll = (animate: boolean) => {
+ root.querySelectorAll('[data-testid="tab-list"]').forEach(node => {
+ update(node as HTMLElement, animate);
+ });
+ };
+
+ syncAll(false);
+
+ const mutationObserver = new MutationObserver(mutations => {
+ const wrappers = new Set();
+ let structureChanged = false;
+
+ for (const mutation of mutations) {
+ if (mutation.type === "childList") {
+ structureChanged = true;
+ continue;
+ }
+ const wrapper = findTabListWrapper(mutation.target as Element);
+ if (wrapper) wrappers.add(wrapper);
+ }
+
+ if (structureChanged) {
+ syncAll(false);
+ return;
+ }
+
+ wrappers.forEach(wrapper => update(wrapper, true));
+ });
+
+ mutationObserver.observe(root, {
+ subtree: true,
+ childList: true,
+ attributes: true,
+ attributeFilter: ["aria-selected"],
+ });
+
+ const resizeObserver = new ResizeObserver(() => syncAll(false));
+ resizeObserver.observe(root);
+
+ return () => {
+ mutationObserver.disconnect();
+ resizeObserver.disconnect();
+ root.querySelectorAll("[data-tabs-glide-indicator]").forEach(node => node.remove());
+ };
+ }, [rootRef]);
+}
diff --git a/apps/kitchen-sink/src/context/KitchenSinkContext.tsx b/apps/kitchen-sink/src/context/KitchenSinkContext.tsx
new file mode 100644
index 0000000000..e2f7abb262
--- /dev/null
+++ b/apps/kitchen-sink/src/context/KitchenSinkContext.tsx
@@ -0,0 +1,205 @@
+import {
+ createContext,
+ useCallback,
+ useContext,
+ useEffect,
+ useMemo,
+ useState,
+ type ReactNode,
+} from "react";
+import { resolveComponentSubPage } from "../components/componentGalleries";
+import { loadPersistedState, savePersistedState } from "../lib/storage";
+import {
+ clearTransferredVibeState,
+ isCurrentVibeSource,
+ readTransferredVibeState,
+} from "../lib/vibeSource";
+import type {
+ AppState,
+ AppView,
+ ComponentSubPage,
+ SystemTheme,
+ ThemeFamily,
+ ThemeSubPage,
+ TokenOverrides,
+} from "../types";
+import { STORAGE_KEY } from "../types";
+
+type KitchenSinkContextValue = AppState & {
+ setView: (view: AppView) => void;
+ setThemeSubPage: (page: ThemeSubPage) => void;
+ setComponentSubPage: (page: ComponentSubPage) => void;
+ setSystemTheme: (theme: SystemTheme) => void;
+ setFocusedComponentId: (id: string | null) => void;
+ updateComponentState: (id: string, patch: Record) => void;
+ updateTokenOverrides: (patch: Partial) => void;
+ updateColorOverride: (theme: SystemTheme, key: string, value: string) => void;
+ setFaceliftTheme: (on: boolean) => void;
+};
+
+const KitchenSinkContext = createContext(null);
+
+function readRawPersistedComponentSubPage(): unknown {
+ const raw = localStorage.getItem(STORAGE_KEY);
+ if (!raw) return undefined;
+
+ try {
+ return (JSON.parse(raw) as { componentSubPage?: unknown }).componentSubPage;
+ } catch {
+ return undefined;
+ }
+}
+
+export function KitchenSinkProvider({ children }: { children: ReactNode }) {
+ const [state, setState] = useState(() => {
+ const transferred = readTransferredVibeState();
+ const initialState = transferred ?? loadPersistedState();
+ const subPageSource = transferred
+ ? transferred.componentSubPage
+ : (readRawPersistedComponentSubPage() ?? initialState.componentSubPage);
+ const componentSubPage = resolveComponentSubPage(subPageSource);
+
+ return {
+ ...initialState,
+ componentSubPage,
+ faceliftTheme: isCurrentVibeSource
+ };
+ });
+
+ useEffect(() => {
+ clearTransferredVibeState();
+ }, []);
+
+ useEffect(() => {
+ const id = window.setTimeout(() => savePersistedState(state), 200);
+ return () => window.clearTimeout(id);
+ }, [state]);
+
+ useEffect(() => {
+ const hash = window.location.hash.replace(/^#/, "");
+ const componentSubPage = resolveComponentSubPage(hash);
+ if (componentSubPage !== "grid") {
+ setState((s) => ({ ...s, view: "components", componentSubPage }));
+ }
+ }, []);
+
+ const setView = useCallback((view: AppView) => {
+ setState((s) => ({
+ ...s,
+ view,
+ componentSubPage: view === "components" ? "grid" : s.componentSubPage,
+ }));
+ }, []);
+
+ const setThemeSubPage = useCallback((themeSubPage: ThemeSubPage) => {
+ setState((s) => ({ ...s, view: "theme", themeSubPage }));
+ }, []);
+
+ const setComponentSubPage = useCallback((componentSubPage: ComponentSubPage) => {
+ setState((s) => ({
+ ...s,
+ view: "components",
+ componentSubPage: resolveComponentSubPage(componentSubPage),
+ }));
+ }, []);
+
+ const setSystemTheme = useCallback((systemTheme: SystemTheme) => {
+ setState((s) => ({ ...s, systemTheme }));
+ }, []);
+
+ const setFocusedComponentId = useCallback((focusedComponentId: string | null) => {
+ setState((s) => ({ ...s, focusedComponentId }));
+ }, []);
+
+ const updateComponentState = useCallback((id: string, patch: Record) => {
+ setState((s) => ({
+ ...s,
+ componentStates: {
+ ...s.componentStates,
+ [id]: { ...s.componentStates[id], ...patch },
+ },
+ }));
+ }, []);
+
+ const updateTokenOverrides = useCallback((patch: Partial) => {
+ setState((s) => ({
+ ...s,
+ tokenOverrides: {
+ colors: { ...s.tokenOverrides.colors, ...patch.colors },
+ radius: { ...s.tokenOverrides.radius, ...patch.radius },
+ spacing: { ...s.tokenOverrides.spacing, ...patch.spacing },
+ typography: { ...s.tokenOverrides.typography, ...patch.typography },
+ },
+ }));
+ }, []);
+
+ const updateColorOverride = useCallback(
+ (theme: SystemTheme, key: string, value: string) => {
+ setState((s) => {
+ const themeFamily: ThemeFamily = s.faceliftTheme ? "facelift" : "original";
+ const familyColors = { ...(s.tokenOverrides.colors[themeFamily] ?? {}) };
+ const themeColors = { ...(familyColors[theme] ?? {}) };
+ if (value) {
+ themeColors[key] = value;
+ } else {
+ delete themeColors[key];
+ }
+ return {
+ ...s,
+ tokenOverrides: {
+ ...s.tokenOverrides,
+ colors: {
+ ...s.tokenOverrides.colors,
+ [themeFamily]: {
+ ...familyColors,
+ [theme]: themeColors,
+ },
+ },
+ },
+ };
+ });
+ },
+ []
+ );
+
+ const setFaceliftTheme = useCallback((on: boolean) => {
+ setState((s) => ({ ...s, faceliftTheme: on }));
+ }, []);
+
+ const value = useMemo(
+ () => ({
+ ...state,
+ setView,
+ setThemeSubPage,
+ setComponentSubPage,
+ setSystemTheme,
+ setFocusedComponentId,
+ updateComponentState,
+ updateTokenOverrides,
+ updateColorOverride,
+ setFaceliftTheme,
+ }),
+ [
+ state,
+ setView,
+ setThemeSubPage,
+ setComponentSubPage,
+ setSystemTheme,
+ setFocusedComponentId,
+ updateComponentState,
+ updateTokenOverrides,
+ updateColorOverride,
+ setFaceliftTheme,
+ ]
+ );
+
+ return (
+ {children}
+ );
+}
+
+export function useKitchenSink(): KitchenSinkContextValue {
+ const ctx = useContext(KitchenSinkContext);
+ if (!ctx) throw new Error("useKitchenSink must be used within KitchenSinkProvider");
+ return ctx;
+}
diff --git a/apps/kitchen-sink/src/lib/buildThemeConfig.ts b/apps/kitchen-sink/src/lib/buildThemeConfig.ts
new file mode 100644
index 0000000000..635380fa4a
--- /dev/null
+++ b/apps/kitchen-sink/src/lib/buildThemeConfig.ts
@@ -0,0 +1,31 @@
+import type { ThemeProviderProps } from "@vibe/core";
+import type { SystemTheme, ThemeFamily, TokenOverrides } from "../types";
+import { pickThemeProviderColors } from "./themeColorKeys";
+
+type ThemeConfig = NonNullable;
+const SYSTEM_THEMES: SystemTheme[] = ["light", "dark", "black"];
+
+export function buildThemeConfig(
+ overrides: TokenOverrides,
+ themeFamily: ThemeFamily
+): ThemeConfig | undefined {
+ const colors: ThemeConfig["colors"] = {};
+ const familyColors = overrides.colors[themeFamily] ?? {};
+
+ for (const theme of SYSTEM_THEMES) {
+ const themeColors = familyColors[theme];
+ if (!themeColors) continue;
+
+ const eligible = pickThemeProviderColors(themeColors);
+ if (Object.keys(eligible).length > 0) {
+ colors[theme] = eligible;
+ }
+ }
+
+ if (Object.keys(colors).length === 0) return undefined;
+
+ return {
+ name: "facelift-custom-theme",
+ colors,
+ };
+}
diff --git a/apps/kitchen-sink/src/lib/colorTokenDefinitions.ts b/apps/kitchen-sink/src/lib/colorTokenDefinitions.ts
new file mode 100644
index 0000000000..765608cb8e
--- /dev/null
+++ b/apps/kitchen-sink/src/lib/colorTokenDefinitions.ts
@@ -0,0 +1,115 @@
+export type ColorTokenDef = {
+ name: string;
+ description: string;
+ showBorder?: boolean;
+ supportsAlpha?: boolean;
+};
+
+export type ColorTokenSection = {
+ id: string;
+ title: string;
+ description?: string;
+ tokens: ColorTokenDef[];
+};
+
+export const COLOR_TOKEN_SECTIONS: ColorTokenSection[] = [
+ {
+ id: "primary",
+ title: "Primary colors",
+ tokens: [
+ { name: "primary-color", description: "Use as primary color" },
+ { name: "primary-hover-color", description: "Use only as hover on primary color" },
+ { name: "primary-selected-color", description: "Use to indicate selected items", supportsAlpha: true },
+ { name: "primary-selected-hover-color", description: "Use only as hover on selected color", supportsAlpha: true },
+ { name: "primary-highlighted-color", description: "Use only as background of highlighted elements" },
+ ],
+ },
+ {
+ id: "text",
+ title: "Text colors",
+ tokens: [
+ { name: "primary-text-color", description: "Default text color" },
+ { name: "secondary-text-color", description: "Secondary text color" },
+ { name: "text-color-on-inverted", description: "Text color on inverted background", showBorder: true },
+ { name: "text-color-on-primary", description: "Text color on primary background" },
+ { name: "disabled-text-color", description: "Disabled text color", supportsAlpha: true },
+ ],
+ },
+ {
+ id: "status",
+ title: "Status colors",
+ tokens: [
+ { name: "positive-color", description: "Primary positive / success color" },
+ { name: "positive-color-selected", description: "Selected state for positive color", supportsAlpha: true },
+ { name: "negative-color", description: "Primary negative / error color" },
+ { name: "negative-color-selected", description: "Selected state for negative color", supportsAlpha: true },
+ { name: "warning-color", description: "Primary warning color" },
+ { name: "warning-color-selected", description: "Selected state for warning color", supportsAlpha: true },
+ ],
+ },
+ {
+ id: "utility",
+ title: "Utility",
+ tokens: [
+ { name: "ui-border-color", description: "Border color for ui elements and components" },
+ { name: "layout-border-color", description: "Border color for general layout and separators" },
+ { name: "placeholder-color", description: "Use for placeholder text in inputs fields" },
+ { name: "icon-color", description: "Default color for icons" },
+ { name: "link-color", description: "Use only for links" },
+ { name: "fixed-dark-color", description: "Use as color that should remain dark in all themes" },
+ {
+ name: "fixed-light-color",
+ description: "Use as color that should remain light in all themes",
+ showBorder: true,
+ },
+ ],
+ },
+ {
+ id: "backgrounds",
+ title: "Backgrounds",
+ description: "Surface and layout background tokens.",
+ tokens: [
+ { name: "inverted-color-background", description: "Opposite of primary background color" },
+ {
+ name: "primary-background-color",
+ description: "Primary background color",
+ showBorder: true,
+ },
+ {
+ name: "primary-background-hover-color",
+ description: "Use as hover color",
+ supportsAlpha: true,
+ },
+ {
+ name: "secondary-background-color",
+ description: "Secondary background color",
+ showBorder: true,
+ },
+ {
+ name: "allgrey-background-color",
+ description: "Secondary background color",
+ showBorder: true,
+ },
+ { name: "ui-background-color", description: "Background color for ui elements and components" },
+ { name: "ui-background-hover-color", description: "Use only as hover on ui background color" },
+ {
+ name: "disabled-background-color",
+ description: "Use as background for disabled elements",
+ showBorder: true,
+ },
+ { name: "primary-surface-color", description: "Use this as the surface of the main layout appearance" },
+ { name: "surface-primary", description: "Primary / brand tinted surface", showBorder: true },
+ { name: "surface-positive", description: "Positive tinted surface", showBorder: true },
+ { name: "surface-negative", description: "Negative tinted surface", showBorder: true },
+ { name: "surface-warning", description: "Warning tinted surface", showBorder: true },
+ { name: "surface-neutral", description: "Neutral tinted surface", showBorder: true },
+ { name: "surface-info", description: "Informational tinted surface", showBorder: true },
+ { name: "text-on-surface-primary", description: "Text / icon color on --surface-primary" },
+ { name: "text-on-surface-positive", description: "Text / icon color on --surface-positive" },
+ { name: "text-on-surface-negative", description: "Text / icon color on --surface-negative" },
+ { name: "text-on-surface-warning", description: "Text / icon color on --surface-warning" },
+ { name: "text-on-surface-neutral", description: "Text / icon color on --surface-neutral" },
+ { name: "text-on-surface-info", description: "Text / icon color on --surface-info" },
+ ],
+ },
+];
diff --git a/apps/kitchen-sink/src/lib/colorUtils.ts b/apps/kitchen-sink/src/lib/colorUtils.ts
new file mode 100644
index 0000000000..b9056e7668
--- /dev/null
+++ b/apps/kitchen-sink/src/lib/colorUtils.ts
@@ -0,0 +1,47 @@
+export type RgbaColor = {
+ r: number;
+ g: number;
+ b: number;
+ a: number;
+};
+
+export function parseColor(value: string): RgbaColor | null {
+ const rgbaMatch = value.match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)(?:\s*,\s*([\d.]+))?\s*\)/i);
+ if (rgbaMatch) {
+ return {
+ r: Number(rgbaMatch[1]),
+ g: Number(rgbaMatch[2]),
+ b: Number(rgbaMatch[3]),
+ a: rgbaMatch[4] !== undefined ? Number(rgbaMatch[4]) : 1,
+ };
+ }
+
+ const hexMatch = value.match(/^#([0-9a-f]{6})$/i);
+ if (hexMatch) {
+ const hex = hexMatch[1];
+ return {
+ r: Number.parseInt(hex.slice(0, 2), 16),
+ g: Number.parseInt(hex.slice(2, 4), 16),
+ b: Number.parseInt(hex.slice(4, 6), 16),
+ a: 1,
+ };
+ }
+
+ return null;
+}
+
+export function formatRgba(color: RgbaColor): string {
+ const alpha = Number.isInteger(color.a) ? color.a : Math.round(color.a * 1000) / 1000;
+ return `rgba(${color.r}, ${color.g}, ${color.b}, ${alpha})`;
+}
+
+export function toHex(color: Pick): string {
+ return `#${[color.r, color.g, color.b]
+ .map((channel) => channel.toString(16).padStart(2, "0"))
+ .join("")}`;
+}
+
+export function readComputedRgba(tokenName: string, fallback: RgbaColor): RgbaColor {
+ const computed = getComputedStyle(document.body).getPropertyValue(`--${tokenName}`).trim();
+ return parseColor(computed) ?? fallback;
+}
diff --git a/apps/kitchen-sink/src/lib/cssVarOverrides.ts b/apps/kitchen-sink/src/lib/cssVarOverrides.ts
new file mode 100644
index 0000000000..45136acaa8
--- /dev/null
+++ b/apps/kitchen-sink/src/lib/cssVarOverrides.ts
@@ -0,0 +1,22 @@
+import type { CSSProperties } from "react";
+import type { SystemTheme, ThemeFamily, TokenOverrides } from "../types";
+
+export type CssVarStyle = CSSProperties & Record<`--${string}`, string>;
+
+export function buildCssVarStyle(
+ overrides: TokenOverrides,
+ systemTheme: SystemTheme,
+ themeFamily: ThemeFamily
+): CssVarStyle {
+ const themeColors = overrides.colors[themeFamily]?.[systemTheme] ?? {};
+ const colorVars = Object.fromEntries(
+ Object.entries(themeColors).map(([key, value]) => [`--${key}`, value])
+ ) as CssVarStyle;
+
+ return {
+ ...colorVars,
+ ...overrides.radius,
+ ...overrides.spacing,
+ ...overrides.typography,
+ } as CssVarStyle;
+}
diff --git a/apps/kitchen-sink/src/lib/defaultComponentStates.ts b/apps/kitchen-sink/src/lib/defaultComponentStates.ts
new file mode 100644
index 0000000000..b4beaa5352
--- /dev/null
+++ b/apps/kitchen-sink/src/lib/defaultComponentStates.ts
@@ -0,0 +1,50 @@
+import type { ComponentStateMap } from "../types";
+
+export const defaultComponentStates: ComponentStateMap = {
+ "icon-button": { kind: "primary", size: "medium", disabled: false },
+ button: {
+ kind: "primary",
+ size: "medium",
+ leftIcon: "none",
+ rightIcon: "none",
+ disabled: false,
+ loading: false,
+ },
+ "button-group": {
+ kind: "primary",
+ size: "medium",
+ disabled: false,
+ withIcons: false,
+ fullWidth: false,
+ disabledSegment: false,
+ },
+ "segmented-control": {
+ size: "medium",
+ withIcons: false,
+ fullWidth: false,
+ disabled: false,
+ disabledSegment: false,
+ },
+ tabs: { size: "medium", activeTab: 0 },
+ label: { color: "primary", size: "medium" },
+ chip: { color: "primary", size: "medium", disabled: false, readOnly: true },
+ "text-field": {
+ size: "medium",
+ disabled: false,
+ validation: "none",
+ withTitle: false,
+ },
+ dropdown: { size: "medium", disabled: false, multi: false },
+ menu: { size: "medium", withIcons: false },
+ toast: { type: "positive", withAction: false },
+};
+
+export function mergeWithDefaults(
+ stored: ComponentStateMap | undefined
+): ComponentStateMap {
+ const result: ComponentStateMap = {};
+ for (const [id, defaults] of Object.entries(defaultComponentStates)) {
+ result[id] = { ...defaults, ...(stored?.[id] ?? {}) };
+ }
+ return result;
+}
diff --git a/apps/kitchen-sink/src/lib/storage.ts b/apps/kitchen-sink/src/lib/storage.ts
new file mode 100644
index 0000000000..78f286e616
--- /dev/null
+++ b/apps/kitchen-sink/src/lib/storage.ts
@@ -0,0 +1,131 @@
+import { resolveComponentSubPage } from "../components/componentGalleries";
+import { defaultComponentStates, mergeWithDefaults } from "./defaultComponentStates";
+import { EMPTY_TOKEN_OVERRIDES } from "./tokenDefinitions";
+import type {
+ AppState,
+ AppView,
+ ComponentSubPage,
+ PersistedState,
+ ThemeColorOverrides,
+ ThemeSubPage,
+} from "../types";
+import { STORAGE_KEY, STORAGE_VERSION } from "../types";
+
+const VALID_THEME_SUBPAGES: ThemeSubPage[] = ["colors", "radius", "typography"];
+const VALID_VIEWS: AppView[] = ["components", "theme", "screens"];
+
+function normalizeView(value: unknown, fallback: AppView): AppView {
+ if (typeof value === "string" && VALID_VIEWS.includes(value as AppView)) {
+ return value as AppView;
+ }
+ return fallback;
+}
+
+function normalizeComponentSubPage(value: unknown, fallback: ComponentSubPage): ComponentSubPage {
+ if (value === undefined || value === null) return fallback;
+
+ const resolved = resolveComponentSubPage(value);
+ // Unknown ids resolve to "grid"; keep the caller's fallback instead.
+ if (resolved === "grid" && value !== "grid") return fallback;
+ return resolved;
+}
+
+function isSystemThemeKey(key: string): key is "light" | "dark" | "black" {
+ return key === "light" || key === "dark" || key === "black";
+}
+
+function migrateColorOverrides(colors: unknown): AppState["tokenOverrides"]["colors"] {
+ if (!colors || typeof colors !== "object") {
+ return {};
+ }
+
+ const record = colors as Record;
+
+ if ("original" in record || "facelift" in record) {
+ return colors as AppState["tokenOverrides"]["colors"];
+ }
+
+ if (Object.keys(record).some(isSystemThemeKey)) {
+ return { original: colors as ThemeColorOverrides };
+ }
+
+ return {};
+}
+
+function normalizeThemeSubPage(value: unknown, fallback: ThemeSubPage): ThemeSubPage {
+ if (value === "spacing") return "typography";
+ if (VALID_THEME_SUBPAGES.includes(value as ThemeSubPage)) return value as ThemeSubPage;
+ return fallback;
+}
+
+export function createInitialAppState(): AppState {
+ return {
+ view: "components",
+ themeSubPage: "colors",
+ componentSubPage: "grid",
+ systemTheme: "light",
+ tokenOverrides: structuredClone(EMPTY_TOKEN_OVERRIDES),
+ componentStates: mergeWithDefaults(undefined),
+ focusedComponentId: "button",
+ faceliftTheme: false,
+ };
+}
+
+function toPersisted(state: AppState): PersistedState {
+ return {
+ version: STORAGE_VERSION,
+ view: state.view,
+ themeSubPage: state.themeSubPage,
+ componentSubPage: state.componentSubPage,
+ systemTheme: state.systemTheme,
+ tokenOverrides: state.tokenOverrides,
+ componentStates: state.componentStates,
+ focusedComponentId: state.focusedComponentId,
+ faceliftTheme: state.faceliftTheme,
+ };
+}
+
+export function savePersistedState(state: AppState): void {
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(toPersisted(state)));
+}
+
+function resetAndPersist(): AppState {
+ const initial = createInitialAppState();
+ savePersistedState(initial);
+ return initial;
+}
+
+export function loadPersistedState(): AppState {
+ const raw = localStorage.getItem(STORAGE_KEY);
+ if (!raw) return resetAndPersist();
+
+ try {
+ const parsed = JSON.parse(raw) as Partial;
+ if (parsed.version !== STORAGE_VERSION) return resetAndPersist();
+
+ const base = createInitialAppState();
+
+ return {
+ ...base,
+ view: normalizeView(parsed.view, base.view),
+ themeSubPage: normalizeThemeSubPage(parsed.themeSubPage, base.themeSubPage),
+ componentSubPage: normalizeComponentSubPage(parsed.componentSubPage, base.componentSubPage),
+ systemTheme: parsed.systemTheme ?? base.systemTheme,
+ tokenOverrides: {
+ ...base.tokenOverrides,
+ ...parsed.tokenOverrides,
+ colors: migrateColorOverrides(parsed.tokenOverrides?.colors),
+ radius: parsed.tokenOverrides?.radius ?? base.tokenOverrides.radius,
+ spacing: parsed.tokenOverrides?.spacing ?? base.tokenOverrides.spacing,
+ typography: parsed.tokenOverrides?.typography ?? base.tokenOverrides.typography,
+ },
+ componentStates: mergeWithDefaults(parsed.componentStates),
+ focusedComponentId: parsed.focusedComponentId ?? base.focusedComponentId,
+ faceliftTheme: parsed.faceliftTheme ?? false,
+ };
+ } catch {
+ return resetAndPersist();
+ }
+}
+
+export { defaultComponentStates };
diff --git a/apps/kitchen-sink/src/lib/themeColorKeys.ts b/apps/kitchen-sink/src/lib/themeColorKeys.ts
new file mode 100644
index 0000000000..5befa31590
--- /dev/null
+++ b/apps/kitchen-sink/src/lib/themeColorKeys.ts
@@ -0,0 +1,27 @@
+import type { ThemeColor } from "@vibe/core";
+
+export const THEME_PROVIDER_COLOR_KEYS: ThemeColor[] = [
+ "primary-color",
+ "primary-hover-color",
+ "primary-selected-color",
+ "primary-selected-hover-color",
+ "primary-selected-on-secondary-color",
+ "text-color-on-primary",
+ "brand-color",
+ "brand-hover-color",
+ "brand-selected-color",
+ "brand-selected-hover-color",
+ "text-color-on-brand",
+];
+
+export function pickThemeProviderColors(
+ colors: Record
+): Partial> {
+ const result: Partial> = {};
+ for (const key of THEME_PROVIDER_COLOR_KEYS) {
+ if (colors[key]) {
+ result[key] = colors[key];
+ }
+ }
+ return result;
+}
diff --git a/apps/kitchen-sink/src/lib/tokenDefinitions.ts b/apps/kitchen-sink/src/lib/tokenDefinitions.ts
new file mode 100644
index 0000000000..fd3cf321ab
--- /dev/null
+++ b/apps/kitchen-sink/src/lib/tokenDefinitions.ts
@@ -0,0 +1,51 @@
+import type { ThemeSubPage, TokenFieldDef, TokenOverrides } from "../types";
+
+export const EMPTY_TOKEN_OVERRIDES: TokenOverrides = {
+ colors: {},
+ radius: {},
+ spacing: {},
+ typography: {},
+};
+
+export const TOKEN_FIELDS_BY_SUBPAGE: Record = {
+ colors: [],
+ radius: [
+ {
+ id: "radius-small",
+ label: "border-radius-small",
+ description: "Small corner radius",
+ kind: "css-var",
+ cssVar: "--border-radius-small",
+ unit: "px",
+ defaultValue: "4",
+ },
+ {
+ id: "radius-medium",
+ label: "border-radius-medium",
+ description: "Medium corner radius",
+ kind: "css-var",
+ cssVar: "--border-radius-medium",
+ unit: "px",
+ defaultValue: "8",
+ },
+ {
+ id: "radius-big",
+ label: "border-radius-big",
+ description: "Large corner radius",
+ kind: "css-var",
+ cssVar: "--border-radius-big",
+ unit: "px",
+ defaultValue: "16",
+ },
+ {
+ id: "radius-full",
+ label: "border-radius-full",
+ description: "Fully rounded corner radius",
+ kind: "css-var",
+ cssVar: "--border-radius-full",
+ unit: "px",
+ defaultValue: "99",
+ },
+ ],
+ typography: [],
+};
diff --git a/apps/kitchen-sink/src/lib/typographyTokenDefinitions.ts b/apps/kitchen-sink/src/lib/typographyTokenDefinitions.ts
new file mode 100644
index 0000000000..c5d1076c68
--- /dev/null
+++ b/apps/kitchen-sink/src/lib/typographyTokenDefinitions.ts
@@ -0,0 +1,479 @@
+export type TypographyTokenDef = {
+ id: string;
+ label: string;
+ cssVar: string;
+ description?: string;
+ defaultValue: string;
+ unit?: string;
+};
+
+export type TypographyTokenSection = {
+ id: string;
+ title: string;
+ description?: string;
+ tokens: TypographyTokenDef[];
+};
+
+const px = (value: string) => ({ defaultValue: value, unit: "px" as const });
+
+export const TYPOGRAPHY_TOKEN_SECTIONS: TypographyTokenSection[] = [
+ {
+ id: "families",
+ title: "Font families",
+ description: "Base and title font stacks.",
+ tokens: [
+ {
+ id: "font-family",
+ label: "font-family",
+ cssVar: "--font-family",
+ description: "Default UI font stack",
+ defaultValue: "Figtree,Roboto,Noto Sans Hebrew,Noto Kufi Arabic,Noto Sans JP,sans-serif",
+ },
+ {
+ id: "title-font-family",
+ label: "title-font-family",
+ cssVar: "--title-font-family",
+ description: "Heading font stack",
+ defaultValue: "Poppins,Roboto,Noto Sans Hebrew,Noto Kufi Arabic,Noto Sans JP,sans-serif",
+ },
+ ],
+ },
+ {
+ id: "weights",
+ title: "Font weights",
+ tokens: [
+ {
+ id: "font-weight-very-light",
+ label: "font-weight-very-light",
+ cssVar: "--font-weight-very-light",
+ description: "Very light weight",
+ defaultValue: "200",
+ },
+ {
+ id: "font-weight-light",
+ label: "font-weight-light",
+ cssVar: "--font-weight-light",
+ description: "Light weight",
+ defaultValue: "300",
+ },
+ {
+ id: "font-weight-normal",
+ label: "font-weight-normal",
+ cssVar: "--font-weight-normal",
+ description: "Normal weight",
+ defaultValue: "400",
+ },
+ {
+ id: "font-weight-bold",
+ label: "font-weight-bold",
+ cssVar: "--font-weight-bold",
+ description: "Bold weight",
+ defaultValue: "500",
+ },
+ ],
+ },
+ {
+ id: "sizes",
+ title: "Font sizes",
+ description: "Core size scale used across text styles.",
+ tokens: [
+ {
+ id: "font-size-10",
+ label: "font-size-10",
+ cssVar: "--font-size-10",
+ description: "Extra small text",
+ ...px("14"),
+ },
+ {
+ id: "font-size-20",
+ label: "font-size-20",
+ cssVar: "--font-size-20",
+ description: "Small text / labels",
+ ...px("14"),
+ },
+ {
+ id: "font-size-30",
+ label: "font-size-30",
+ cssVar: "--font-size-30",
+ description: "Body text",
+ ...px("16"),
+ },
+ {
+ id: "font-size-40",
+ label: "font-size-40",
+ cssVar: "--font-size-40",
+ description: "Large text",
+ ...px("18"),
+ },
+ {
+ id: "font-size-50",
+ label: "font-size-50",
+ cssVar: "--font-size-50",
+ description: "Heading scale",
+ ...px("24"),
+ },
+ {
+ id: "font-size-60",
+ label: "font-size-60",
+ cssVar: "--font-size-60",
+ description: "Largest heading scale",
+ ...px("30"),
+ },
+ ],
+ },
+ {
+ id: "line-heights",
+ title: "Line heights",
+ description: "Core line-height scale paired with font sizes.",
+ tokens: [
+ {
+ id: "font-line-height-10",
+ label: "font-line-height-10",
+ cssVar: "--font-line-height-10",
+ description: "Extra small line height",
+ ...px("18"),
+ },
+ {
+ id: "font-line-height-20",
+ label: "font-line-height-20",
+ cssVar: "--font-line-height-20",
+ description: "Small line height",
+ ...px("24"),
+ },
+ {
+ id: "font-line-height-30",
+ label: "font-line-height-30",
+ cssVar: "--font-line-height-30",
+ description: "Body line height",
+ ...px("24"),
+ },
+ {
+ id: "font-line-height-40",
+ label: "font-line-height-40",
+ cssVar: "--font-line-height-40",
+ description: "Large line height",
+ ...px("24"),
+ },
+ {
+ id: "font-line-height-50",
+ label: "font-line-height-50",
+ cssVar: "--font-line-height-50",
+ description: "Heading line height",
+ ...px("32"),
+ },
+ {
+ id: "font-line-height-60",
+ label: "font-line-height-60",
+ cssVar: "--font-line-height-60",
+ description: "Largest heading line height",
+ ...px("42"),
+ },
+ ],
+ },
+ {
+ id: "semantic-sizes",
+ title: "Semantic font sizes",
+ description: "Named sizes mapped to the core scale.",
+ tokens: [
+ {
+ id: "font-size-h1",
+ label: "font-size-h1",
+ cssVar: "--font-size-h1",
+ description: "H1 size",
+ ...px("30"),
+ },
+ {
+ id: "font-size-h2",
+ label: "font-size-h2",
+ cssVar: "--font-size-h2",
+ description: "H2 size",
+ ...px("24"),
+ },
+ {
+ id: "font-size-h3",
+ label: "font-size-h3",
+ cssVar: "--font-size-h3",
+ description: "H3 size",
+ ...px("24"),
+ },
+ {
+ id: "font-size-h4",
+ label: "font-size-h4",
+ cssVar: "--font-size-h4",
+ description: "H4 size",
+ ...px("18"),
+ },
+ {
+ id: "font-size-h5",
+ label: "font-size-h5",
+ cssVar: "--font-size-h5",
+ description: "H5 size",
+ ...px("16"),
+ },
+ {
+ id: "font-size-general-label",
+ label: "font-size-general-label",
+ cssVar: "--font-size-general-label",
+ description: "General label size",
+ ...px("14"),
+ },
+ {
+ id: "font-size-paragraph",
+ label: "font-size-paragraph",
+ cssVar: "--font-size-paragraph",
+ description: "Paragraph size",
+ ...px("16"),
+ },
+ {
+ id: "font-size-subtext",
+ label: "font-size-subtext",
+ cssVar: "--font-size-subtext",
+ description: "Subtext size",
+ ...px("14"),
+ },
+ ],
+ },
+ {
+ id: "semantic-line-heights",
+ title: "Semantic line heights",
+ tokens: [
+ {
+ id: "font-line-height-h1",
+ label: "font-line-height-h1",
+ cssVar: "--font-line-height-h1",
+ description: "H1 line height",
+ ...px("42"),
+ },
+ {
+ id: "font-line-height-h2",
+ label: "font-line-height-h2",
+ cssVar: "--font-line-height-h2",
+ description: "H2 line height",
+ ...px("32"),
+ },
+ {
+ id: "font-line-height-h3",
+ label: "font-line-height-h3",
+ cssVar: "--font-line-height-h3",
+ description: "H3 line height",
+ ...px("32"),
+ },
+ {
+ id: "font-line-height-h4",
+ label: "font-line-height-h4",
+ cssVar: "--font-line-height-h4",
+ description: "H4 line height",
+ ...px("24"),
+ },
+ {
+ id: "font-line-height-h5",
+ label: "font-line-height-h5",
+ cssVar: "--font-line-height-h5",
+ description: "H5 line height",
+ ...px("24"),
+ },
+ {
+ id: "font-line-height-general-label",
+ label: "font-line-height-general-label",
+ cssVar: "--font-line-height-general-label",
+ description: "General label line height",
+ ...px("24"),
+ },
+ {
+ id: "font-line-height-paragraph",
+ label: "font-line-height-paragraph",
+ cssVar: "--font-line-height-paragraph",
+ description: "Paragraph line height",
+ ...px("24"),
+ },
+ {
+ id: "font-line-height-subtext",
+ label: "font-line-height-subtext",
+ cssVar: "--font-line-height-subtext",
+ description: "Subtext line height",
+ ...px("18"),
+ },
+ ],
+ },
+ {
+ id: "text-styles",
+ title: "Text styles",
+ description: "Full font shorthand tokens for heading and text variants.",
+ tokens: [
+ {
+ id: "font-h1",
+ label: "font-h1",
+ cssVar: "--font-h1",
+ defaultValue: "var(--font-weight-bold) var(--font-size-h1)/var(--font-line-height-h1) var(--title-font-family)",
+ },
+ {
+ id: "font-h2",
+ label: "font-h2",
+ cssVar: "--font-h2",
+ defaultValue: "var(--font-weight-bold) var(--font-size-h2)/var(--font-line-height-h2) var(--title-font-family)",
+ },
+ {
+ id: "font-h3",
+ label: "font-h3",
+ cssVar: "--font-h3",
+ defaultValue: "var(--font-weight-light) var(--font-size-h3)/var(--font-line-height-h3) var(--title-font-family)",
+ },
+ {
+ id: "font-h4",
+ label: "font-h4",
+ cssVar: "--font-h4",
+ defaultValue: "var(--font-weight-bold) var(--font-size-h4)/var(--font-line-height-h4) var(--title-font-family)",
+ },
+ {
+ id: "font-h5",
+ label: "font-h5",
+ cssVar: "--font-h5",
+ defaultValue: "var(--font-weight-bold) var(--font-size-h5)/var(--font-line-height-h5) var(--font-family)",
+ },
+ {
+ id: "font-general-label",
+ label: "font-general-label",
+ cssVar: "--font-general-label",
+ defaultValue: "var(--font-weight-normal) var(--font-size-general-label)/var(--font-line-height-general-label) var(--font-family)",
+ },
+ {
+ id: "font-paragraph",
+ label: "font-paragraph",
+ cssVar: "--font-paragraph",
+ defaultValue: "var(--font-weight-normal) var(--font-size-paragraph)/var(--font-line-height-paragraph) var(--font-family)",
+ },
+ {
+ id: "font-subtext",
+ label: "font-subtext",
+ cssVar: "--font-subtext",
+ defaultValue: "var(--font-weight-normal) var(--font-size-subtext)/var(--font-line-height-subtext) var(--font-family)",
+ },
+ {
+ id: "font-h1-bold",
+ label: "font-h1-bold",
+ cssVar: "--font-h1-bold",
+ defaultValue: "700 32px/40px var(--title-font-family)",
+ },
+ {
+ id: "font-h1-medium",
+ label: "font-h1-medium",
+ cssVar: "--font-h1-medium",
+ defaultValue: "600 32px/40px var(--title-font-family)",
+ },
+ {
+ id: "font-h1-normal",
+ label: "font-h1-normal",
+ cssVar: "--font-h1-normal",
+ defaultValue: "500 32px/40px var(--title-font-family)",
+ },
+ {
+ id: "font-h1-light",
+ label: "font-h1-light",
+ cssVar: "--font-h1-light",
+ defaultValue: "300 32px/40px var(--title-font-family)",
+ },
+ {
+ id: "font-h2-bold",
+ label: "font-h2-bold",
+ cssVar: "--font-h2-bold",
+ defaultValue: "700 24px/30px var(--title-font-family)",
+ },
+ {
+ id: "font-h2-medium",
+ label: "font-h2-medium",
+ cssVar: "--font-h2-medium",
+ defaultValue: "600 24px/30px var(--title-font-family)",
+ },
+ {
+ id: "font-h2-normal",
+ label: "font-h2-normal",
+ cssVar: "--font-h2-normal",
+ defaultValue: "500 24px/30px var(--title-font-family)",
+ },
+ {
+ id: "font-h2-light",
+ label: "font-h2-light",
+ cssVar: "--font-h2-light",
+ defaultValue: "300 24px/30px var(--title-font-family)",
+ },
+ {
+ id: "font-h3-bold",
+ label: "font-h3-bold",
+ cssVar: "--font-h3-bold",
+ defaultValue: "700 18px/24px var(--title-font-family)",
+ },
+ {
+ id: "font-h3-medium",
+ label: "font-h3-medium",
+ cssVar: "--font-h3-medium",
+ defaultValue: "600 18px/24px var(--title-font-family)",
+ },
+ {
+ id: "font-h3-normal",
+ label: "font-h3-normal",
+ cssVar: "--font-h3-normal",
+ defaultValue: "500 18px/24px var(--title-font-family)",
+ },
+ {
+ id: "font-h3-light",
+ label: "font-h3-light",
+ cssVar: "--font-h3-light",
+ defaultValue: "300 18px/24px var(--title-font-family)",
+ },
+ {
+ id: "font-text1-bold",
+ label: "font-text1-bold",
+ cssVar: "--font-text1-bold",
+ defaultValue: "700 16px/22px var(--font-family)",
+ },
+ {
+ id: "font-text1-medium",
+ label: "font-text1-medium",
+ cssVar: "--font-text1-medium",
+ defaultValue: "600 16px/22px var(--font-family)",
+ },
+ {
+ id: "font-text1-normal",
+ label: "font-text1-normal",
+ cssVar: "--font-text1-normal",
+ defaultValue: "400 16px/22px var(--font-family)",
+ },
+ {
+ id: "font-text2-bold",
+ label: "font-text2-bold",
+ cssVar: "--font-text2-bold",
+ defaultValue: "700 14px/20px var(--font-family)",
+ },
+ {
+ id: "font-text2-medium",
+ label: "font-text2-medium",
+ cssVar: "--font-text2-medium",
+ defaultValue: "600 14px/20px var(--font-family)",
+ },
+ {
+ id: "font-text2-normal",
+ label: "font-text2-normal",
+ cssVar: "--font-text2-normal",
+ defaultValue: "400 14px/20px var(--font-family)",
+ },
+ {
+ id: "font-text3-bold",
+ label: "font-text3-bold",
+ cssVar: "--font-text3-bold",
+ defaultValue: "700 12px/16px var(--font-family)",
+ },
+ {
+ id: "font-text3-medium",
+ label: "font-text3-medium",
+ cssVar: "--font-text3-medium",
+ defaultValue: "600 12px/16px var(--font-family)",
+ },
+ {
+ id: "font-text3-normal",
+ label: "font-text3-normal",
+ cssVar: "--font-text3-normal",
+ defaultValue: "400 12px/16px var(--font-family)",
+ },
+ ],
+ },
+];
diff --git a/apps/kitchen-sink/src/lib/vibeSource.ts b/apps/kitchen-sink/src/lib/vibeSource.ts
new file mode 100644
index 0000000000..8cbec99109
--- /dev/null
+++ b/apps/kitchen-sink/src/lib/vibeSource.ts
@@ -0,0 +1,42 @@
+import type { AppState } from "../types";
+
+export type VibeSource = "original" | "current";
+
+export const vibeSource: VibeSource = import.meta.env.MODE === "original" ? "original" : "current";
+export const isCurrentVibeSource = vibeSource === "current";
+
+const SOURCE_PORTS: Record = {
+ original: "5221",
+ current: "5220"
+};
+
+const STATE_TRANSFER_PARAM = "vibeKitchenSinkState";
+
+export function readTransferredVibeState(): AppState | null {
+ const url = new URL(window.location.href);
+ const serializedState = url.searchParams.get(STATE_TRANSFER_PARAM);
+ if (!serializedState) return null;
+
+ try {
+ return JSON.parse(serializedState) as AppState;
+ } catch {
+ return null;
+ }
+}
+
+export function clearTransferredVibeState(): void {
+ const url = new URL(window.location.href);
+ if (!url.searchParams.has(STATE_TRANSFER_PARAM)) return;
+
+ url.searchParams.delete(STATE_TRANSFER_PARAM);
+ window.history.replaceState(null, "", url);
+}
+
+export function switchVibeSource(source: VibeSource, state: AppState): void {
+ if (source === vibeSource) return;
+
+ const url = new URL(window.location.href);
+ url.searchParams.set(STATE_TRANSFER_PARAM, JSON.stringify(state));
+ url.port = SOURCE_PORTS[source];
+ window.location.assign(url);
+}
diff --git a/apps/kitchen-sink/src/main.tsx b/apps/kitchen-sink/src/main.tsx
new file mode 100644
index 0000000000..0881871dd4
--- /dev/null
+++ b/apps/kitchen-sink/src/main.tsx
@@ -0,0 +1,15 @@
+import React from "react";
+import ReactDOM from "react-dom/client";
+import "./styles.css";
+// Warmth palette override, ported from mf-topbar. After styles.css so it wins.
+import "./styles/themes/warmth.css";
+import App from "./App";
+import { KitchenSinkProvider } from "./context/KitchenSinkContext";
+
+ReactDOM.createRoot(document.getElementById("root")!).render(
+
+
+
+
+
+);
diff --git a/apps/kitchen-sink/src/original-vibe-core.js b/apps/kitchen-sink/src/original-vibe-core.js
new file mode 100644
index 0000000000..c99fc7b54b
--- /dev/null
+++ b/apps/kitchen-sink/src/original-vibe-core.js
@@ -0,0 +1,7 @@
+export * from "@vibe-original/core";
+
+// SegmentedControl does not exist in the pinned npm release. Its kitchen-sink
+// entries are hidden in Original mode, but the no-op export keeps eager modules loadable.
+export function SegmentedControl() {
+ return null;
+}
diff --git a/apps/kitchen-sink/src/screens/App.module.scss b/apps/kitchen-sink/src/screens/App.module.scss
new file mode 100644
index 0000000000..1f6fe1a2cf
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/App.module.scss
@@ -0,0 +1,29 @@
+.boardArea {
+ width: 100%;
+ max-width: 100%;
+ min-height: 0;
+ min-width: 0;
+ padding-right: 0;
+ overflow-x: auto;
+ overflow-y: visible;
+ position: relative;
+}
+
+.boardHeaderSticky {
+ position: sticky;
+ top: 0;
+ z-index: 10;
+}
+
+.boardGroups {
+ display: flex;
+ flex-direction: column;
+ background-color: var(--primary-background-color);
+}
+
+.vibeAppContent {
+ display: flex;
+ flex-direction: column;
+ min-height: 0;
+ background-color: var(--primary-background-color);
+}
diff --git a/apps/kitchen-sink/src/screens/App.tsx b/apps/kitchen-sink/src/screens/App.tsx
new file mode 100644
index 0000000000..1cd4e7d045
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/App.tsx
@@ -0,0 +1,489 @@
+import {
+ useCallback,
+ useEffect,
+ useRef,
+ useState,
+ type ReactNode,
+} from "react";
+import { Box, Toast } from "@vibe/core";
+import styles from "./App.module.scss";
+import { MainLayout } from "./components/MainLayout";
+import { AppMainContent } from "./components/AppMainContent";
+import { BoardHeader } from "./components/BoardHeader";
+import { BoardGroup } from "./components/BoardGroup";
+import { VibeAppBoardView } from "./components/VibeAppBoardView";
+import { isVibeAppView, type BoardViewId } from "./board/boardViews";
+import { Group, ColumnWidths, Item } from "./components/types";
+import { ItemDetailsPanel } from "./components/ItemDetailsPanel";
+import { INITIAL_GROUPS } from "./data/initialGroups";
+import { MIN_COLUMN_WIDTH_PX } from "./board/gridTemplate";
+import { initProduct, type ConfigProductName } from "./productConfig";
+import { ThemeSwitcher } from "./components/ThemeSwitcher";
+import { AgentsViewProvider } from "./context/AgentsViewContext";
+import { SidekickViewProvider } from "./context/SidekickViewContext";
+import { AgentBuilderProvider } from "./context/AgentBuilderContext";
+import {
+ FACELIFT_TEST_NAV_ID,
+ useWorkspaceSelection,
+ WorkspaceSelectionProvider,
+} from "./context/WorkspaceSelectionContext";
+import { AgentBuilderModal } from "./components/AgentBuilderModal";
+import { FaceliftDocPage } from "./components/FaceliftDocPage";
+import type { RailItemId } from "./components/NavigationRail";
+import {
+ CURATED_FONTS,
+ DEFAULT_HEADING_FONT,
+ DEFAULT_TEXT_FONT,
+ PROTECTED_FONTS,
+} from "./components/fontsConfig";
+import {
+ buildHashRoute,
+ parseHashRoute,
+ ROUTE_MODE_CLASSES,
+ ROUTE_THEME_CLASSES,
+ routesEqual,
+ type HashRoute,
+ type RouteMode,
+ type RouteTheme,
+} from "./routing/hashRoute";
+
+const STORAGE_KEY_CUSTOM_FONTS = "boards.customFonts";
+const STORAGE_KEY_REMOVED_FONTS = "boards.removedFonts";
+
+function loadStringArray(key: string): string[] {
+ try {
+ const raw = localStorage.getItem(key);
+ if (!raw) return [];
+ const parsed: unknown = JSON.parse(raw);
+ return Array.isArray(parsed)
+ ? parsed.filter((v): v is string => typeof v === "string")
+ : [];
+ } catch {
+ return [];
+ }
+}
+
+const GLAZE_NEUE_HEADING_FONT = "Hanken Grotesk";
+
+const THEME_DEFAULT_HEADING_FONTS: Partial> = {
+ "glaze-neue": GLAZE_NEUE_HEADING_FONT,
+};
+
+function resolveRouteFont(
+ routeFont: string | null,
+ defaultFont: string,
+): string {
+ if (!routeFont) return defaultFont;
+ return routeFont;
+}
+
+function resolveHeadingFont(
+ theme: RouteTheme,
+ routeHeadingFont: string | null,
+): string {
+ if (routeHeadingFont) return routeHeadingFont;
+ return THEME_DEFAULT_HEADING_FONTS[theme] ?? DEFAULT_HEADING_FONT;
+}
+
+// Dedup so re-selecting a font doesn't re-inject its .
+const loadedFonts = new Set();
+function loadGoogleFont(family: string, weightsParam?: string) {
+ if (loadedFonts.has(family)) return;
+ const param =
+ weightsParam ?? `${family.replace(/\s+/g, "+")}:wght@400;500;600;700`;
+ const link = document.createElement("link");
+ link.rel = "stylesheet";
+ link.href = `https://fonts.googleapis.com/css2?family=${param}&display=swap`;
+ document.head.appendChild(link);
+ loadedFonts.add(family);
+}
+
+// When you are prompted to switch products use this variable to change it.
+const PRODUCT: ConfigProductName = "work_management";
+
+function WorkspaceContent({
+ renderBoardWorkspace,
+}: {
+ renderBoardWorkspace: () => ReactNode;
+}) {
+ const { selectedId } = useWorkspaceSelection();
+ if (selectedId === FACELIFT_TEST_NAV_ID) {
+ return ;
+ }
+ return <>{renderBoardWorkspace()}>;
+}
+
+const THEME_CLASSES = ROUTE_THEME_CLASSES;
+const MODE_CLASSES = ROUTE_MODE_CLASSES;
+type AppMode = RouteMode;
+
+export default function App() {
+ const [hashRoute, setHashRoute] = useState(() => parseHashRoute());
+ const hashRouteRef = useRef(hashRoute);
+ const [groups, _setGroups] = useState(INITIAL_GROUPS);
+ const [columnWidths, setColumnWidths] = useState({
+ task: 280,
+ owner: 100,
+ status: 140,
+ priority: 140,
+ eta: 100,
+ });
+
+ const handleColumnResize = (
+ columnId: keyof ColumnWidths,
+ newWidth: number,
+ ) => {
+ setColumnWidths((prev) => ({
+ ...prev,
+ [columnId]: Math.max(MIN_COLUMN_WIDTH_PX, newWidth),
+ }));
+ };
+
+ const [activeTheme, setActiveTheme] = useState(hashRoute.theme);
+ const [activeMode, setActiveMode] = useState(hashRoute.mode);
+ const [boardViewId, setBoardViewId] = useState(
+ hashRoute.boardViewId,
+ );
+ const [customFonts, setCustomFonts] = useState(() =>
+ loadStringArray(STORAGE_KEY_CUSTOM_FONTS),
+ );
+ const [removedFonts, setRemovedFonts] = useState(() =>
+ loadStringArray(STORAGE_KEY_REMOVED_FONTS),
+ );
+ const [activeHeadingFont, setActiveHeadingFont] = useState(() =>
+ resolveHeadingFont(hashRoute.theme, hashRoute.headingFont),
+ );
+ const [activeTextFont, setActiveTextFont] = useState(() =>
+ resolveRouteFont(hashRoute.textFont, DEFAULT_TEXT_FONT),
+ );
+ const [openItem, setOpenItem] = useState- (null);
+ const [toast, setToast] = useState<{
+ open: boolean;
+ message: string;
+ type: "negative" | "positive";
+ }>({ open: false, message: "", type: "negative" });
+
+ // Persist user font modifications across reloads.
+ useEffect(() => {
+ localStorage.setItem(STORAGE_KEY_CUSTOM_FONTS, JSON.stringify(customFonts));
+ }, [customFonts]);
+ useEffect(() => {
+ localStorage.setItem(
+ STORAGE_KEY_REMOVED_FONTS,
+ JSON.stringify(removedFonts),
+ );
+ }, [removedFonts]);
+
+ const showToast = (
+ message: string,
+ type: "negative" | "positive" = "negative",
+ ) => {
+ setToast({ open: true, message, type });
+ };
+
+ const commitHashRoute = useCallback((updates: Partial
) => {
+ const nextRoute = { ...hashRouteRef.current, ...updates };
+ const nextHash = buildHashRoute(nextRoute);
+ hashRouteRef.current = nextRoute;
+
+ setHashRoute((currentRoute) =>
+ routesEqual(currentRoute, nextRoute) ? currentRoute : nextRoute,
+ );
+
+ if (window.location.hash !== nextHash) {
+ window.location.hash = nextHash;
+ }
+ }, []);
+
+ const handleActiveRailItemChange = useCallback(
+ (activeRailItem: RailItemId) => {
+ commitHashRoute({
+ railItem: activeRailItem,
+ agentsView:
+ activeRailItem === "agents"
+ ? "home"
+ : hashRouteRef.current.agentsView,
+ sidekickChatId: null,
+ });
+ },
+ [commitHashRoute],
+ );
+
+ const handleBoardViewChange = useCallback(
+ (nextBoardViewId: BoardViewId) => {
+ setBoardViewId(nextBoardViewId);
+ commitHashRoute({
+ railItem: "workspace",
+ boardViewId: nextBoardViewId,
+ sidekickChatId: null,
+ });
+ },
+ [commitHashRoute],
+ );
+
+ const handleAgentsViewChange = useCallback(
+ (agentsView: HashRoute["agentsView"]) => {
+ commitHashRoute({
+ railItem: "agents",
+ agentsView,
+ sidekickChatId: null,
+ });
+ },
+ [commitHashRoute],
+ );
+
+ const handleSidekickChatOpen = useCallback(
+ (sidekickChatId: string) => {
+ commitHashRoute({
+ railItem: "sidekick",
+ sidekickChatId,
+ });
+ },
+ [commitHashRoute],
+ );
+
+ const handleSidekickHome = useCallback(() => {
+ commitHashRoute({
+ railItem: "sidekick",
+ sidekickChatId: null,
+ });
+ }, [commitHashRoute]);
+
+ const handleThemeChange = useCallback(
+ (theme: string) => {
+ const nextTheme = theme as RouteTheme;
+ setActiveTheme(nextTheme);
+
+ if (!hashRouteRef.current.headingFont) {
+ setActiveHeadingFont(resolveHeadingFont(nextTheme, null));
+ }
+
+ commitHashRoute({ theme: nextTheme });
+ },
+ [commitHashRoute],
+ );
+
+ const handleModeChange = useCallback(
+ (mode: string) => {
+ const nextMode = mode as AppMode;
+ setActiveMode(nextMode);
+ commitHashRoute({ mode: nextMode });
+ },
+ [commitHashRoute],
+ );
+
+ const handleHeadingFontChange = useCallback(
+ (font: string) => {
+ setActiveHeadingFont(font);
+ commitHashRoute({ headingFont: font });
+ },
+ [commitHashRoute],
+ );
+
+ const handleTextFontChange = useCallback(
+ (font: string) => {
+ setActiveTextFont(font);
+ commitHashRoute({ textFont: font });
+ },
+ [commitHashRoute],
+ );
+
+ const applyHashRouteState = useCallback((nextRoute: HashRoute) => {
+ setBoardViewId(nextRoute.boardViewId);
+ setActiveTheme(nextRoute.theme);
+ setActiveMode(nextRoute.mode);
+ setActiveHeadingFont(
+ resolveHeadingFont(nextRoute.theme, nextRoute.headingFont),
+ );
+ setActiveTextFont(resolveRouteFont(nextRoute.textFont, DEFAULT_TEXT_FONT));
+ }, []);
+
+ useEffect(() => {
+ hashRouteRef.current = hashRoute;
+ }, [hashRoute]);
+
+ useEffect(() => {
+ const handleHashChange = () => {
+ const nextRoute = parseHashRoute();
+ hashRouteRef.current = nextRoute;
+ setHashRoute((currentRoute) =>
+ routesEqual(currentRoute, nextRoute) ? currentRoute : nextRoute,
+ );
+ applyHashRouteState(nextRoute);
+ };
+
+ window.addEventListener("hashchange", handleHashChange);
+ return () => window.removeEventListener("hashchange", handleHashChange);
+ }, [applyHashRouteState]);
+
+ const handleAddCustomFont = (font: string) => {
+ const trimmed = font.trim();
+ if (!trimmed) return;
+ // If the user previously removed this font, un-remove it on re-add.
+ setRemovedFonts((prev) => prev.filter((f) => f !== trimmed));
+ setCustomFonts((prev) =>
+ prev.includes(trimmed) ? prev : [...prev, trimmed],
+ );
+ };
+
+ const handleRemoveFont = (font: string) => {
+ if (PROTECTED_FONTS.has(font)) return;
+ const isCustom = customFonts.includes(font);
+ if (isCustom) {
+ setCustomFonts((prev) => prev.filter((f) => f !== font));
+ } else {
+ // It's a curated font — track it as hidden.
+ setRemovedFonts((prev) => (prev.includes(font) ? prev : [...prev, font]));
+ }
+ // If active anywhere, fall back to that side's default.
+ if (activeHeadingFont === font) {
+ handleHeadingFontChange(DEFAULT_HEADING_FONT);
+ }
+ if (activeTextFont === font) {
+ handleTextFontChange(DEFAULT_TEXT_FONT);
+ }
+ };
+
+ useEffect(() => {
+ initProduct(PRODUCT);
+ }, []);
+
+ useEffect(() => {
+ THEME_CLASSES.forEach((cls) =>
+ document.documentElement.classList.remove(cls),
+ );
+ if (activeTheme) document.documentElement.classList.add(activeTheme);
+ }, [activeTheme]);
+
+ useEffect(() => {
+ MODE_CLASSES.forEach((cls) =>
+ document.documentElement.classList.remove(cls),
+ );
+ if (activeMode) document.documentElement.classList.add(activeMode);
+ }, [activeMode]);
+
+ useEffect(() => {
+ const fallback = `"Figtree", "Poppins", "Inter", "Helvetica Neue", Arial, sans-serif`;
+
+ const headingCurated = CURATED_FONTS.find(
+ (f) => f.value === activeHeadingFont,
+ );
+ loadGoogleFont(activeHeadingFont, headingCurated?.googleFontParam);
+ const headingStack = `"${activeHeadingFont}", ${fallback}`;
+
+ const textCurated = CURATED_FONTS.find((f) => f.value === activeTextFont);
+ loadGoogleFont(activeTextFont, textCurated?.googleFontParam);
+ const textStack = `"${activeTextFont}", ${fallback}`;
+
+ // Vibe token for headings (Heading component, board group titles, etc.)
+ document.documentElement.style.setProperty(
+ "--title-font-family",
+ headingStack,
+ );
+ // Vibe token for body text + the local SCSS module var.
+ document.documentElement.style.setProperty("--font-family", textStack);
+ document.documentElement.style.setProperty(
+ "--boards-font-family",
+ textStack,
+ );
+ }, [activeHeadingFont, activeTextFont]);
+
+ const renderBoardWorkspace = () => (
+
+
+ showToast("Item created successfully", "positive")}
+ />
+
+
+ {isVibeAppView(boardViewId) ? (
+
+ ) : (
+ groups.map((group) => (
+
+ ))
+ )}
+
+
+ );
+
+ const renderWorkspace = () => (
+
+ );
+
+ return (
+
+
+
+
+
+ {(activeRailItem) => (
+
+ )}
+
+
+ setOpenItem(null)}
+ />
+ showToast(message, "negative")}
+ />
+ setToast((t) => ({ ...t, open: false }))}
+ >
+ {toast.message}
+
+
+
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/screens/Attributions.md b/apps/kitchen-sink/src/screens/Attributions.md
new file mode 100644
index 0000000000..9b7cd4e134
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/Attributions.md
@@ -0,0 +1,3 @@
+This Figma Make file includes components from [shadcn/ui](https://ui.shadcn.com/) used under [MIT license](https://github.com/shadcn-ui/ui/blob/main/LICENSE.md).
+
+This Figma Make file includes photos from [Unsplash](https://unsplash.com) used under [license](https://unsplash.com/license).
\ No newline at end of file
diff --git a/apps/kitchen-sink/src/screens/ScreensApp.tsx b/apps/kitchen-sink/src/screens/ScreensApp.tsx
new file mode 100644
index 0000000000..d05745d6d3
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/ScreensApp.tsx
@@ -0,0 +1,302 @@
+import {
+ useCallback,
+ useEffect,
+ useRef,
+ useState,
+} from "react";
+import { Box, Toast } from "@vibe/core";
+import styles from "./App.module.scss";
+import { MainLayout } from "./components/MainLayout";
+import { AppMainContent } from "./components/AppMainContent";
+import { BoardHeader } from "./components/BoardHeader";
+import { BoardGroup } from "./components/BoardGroup";
+import { VibeAppBoardView } from "./components/VibeAppBoardView";
+import { isVibeAppView, type BoardViewId } from "./board/boardViews";
+import { Group, ColumnWidths, Item } from "./components/types";
+import { ItemDetailsPanel } from "./components/ItemDetailsPanel";
+import { INITIAL_GROUPS } from "./data/initialGroups";
+import { MIN_COLUMN_WIDTH_PX } from "./board/gridTemplate";
+import { initProduct, type ConfigProductName } from "./productConfig";
+import { AgentsViewProvider } from "./context/AgentsViewContext";
+import { SidekickViewProvider } from "./context/SidekickViewContext";
+import { AgentBuilderProvider } from "./context/AgentBuilderContext";
+import { WorkspaceSelectionProvider } from "./context/WorkspaceSelectionContext";
+import { AgentBuilderModal } from "./components/AgentBuilderModal";
+import type { RailItemId } from "./components/NavigationRail";
+import {
+ buildHashRoute,
+ parseHashRoute,
+ ROUTE_MODE_CLASSES,
+ ROUTE_THEME_CLASSES,
+ routesEqual,
+ type HashRoute,
+ type RouteMode,
+ type RouteTheme,
+} from "./routing/hashRoute";
+import "./styles/globals.css";
+
+const PRODUCT: ConfigProductName = "work_management";
+
+const THEME_CLASSES = ROUTE_THEME_CLASSES;
+const MODE_CLASSES = ROUTE_MODE_CLASSES;
+type AppMode = RouteMode;
+
+type ScreensAppProps = {
+ externalTheme?: RouteTheme;
+ externalMode?: RouteMode;
+};
+
+export function ScreensApp({ externalTheme, externalMode }: ScreensAppProps) {
+ const [hashRoute, setHashRoute] = useState(() => parseHashRoute());
+ const hashRouteRef = useRef(hashRoute);
+ const [groups, _setGroups] = useState(INITIAL_GROUPS);
+ const [columnWidths, setColumnWidths] = useState({
+ task: 280,
+ owner: 100,
+ status: 140,
+ priority: 140,
+ eta: 100,
+ });
+
+ const handleColumnResize = (
+ columnId: keyof ColumnWidths,
+ newWidth: number,
+ ) => {
+ setColumnWidths((prev) => ({
+ ...prev,
+ [columnId]: Math.max(MIN_COLUMN_WIDTH_PX, newWidth),
+ }));
+ };
+
+ const [activeTheme, setActiveTheme] = useState(hashRoute.theme);
+ const [activeMode, setActiveMode] = useState(hashRoute.mode);
+ const [boardViewId, setBoardViewId] = useState(
+ hashRoute.boardViewId,
+ );
+ const [openItem, setOpenItem] = useState- (null);
+ const [toast, setToast] = useState<{
+ open: boolean;
+ message: string;
+ type: "normal" | "positive" | "negative" | "warning" | "dark";
+ }>({ open: false, message: "", type: "positive" });
+
+ const showToast = (
+ message: string,
+ type: "normal" | "positive" | "negative" | "warning" | "dark" = "positive",
+ ) => {
+ setToast({ open: true, message, type });
+ };
+
+ const commitHashRoute = useCallback((updates: Partial
) => {
+ const nextRoute = { ...hashRouteRef.current, ...updates };
+ const nextHash = buildHashRoute(nextRoute);
+ hashRouteRef.current = nextRoute;
+
+ setHashRoute((currentRoute) =>
+ routesEqual(currentRoute, nextRoute) ? currentRoute : nextRoute,
+ );
+
+ if (window.location.hash !== nextHash) {
+ window.location.hash = nextHash;
+ }
+ }, []);
+
+ const handleActiveRailItemChange = useCallback(
+ (activeRailItem: RailItemId) => {
+ commitHashRoute({
+ railItem: activeRailItem,
+ agentsView:
+ activeRailItem === "agents"
+ ? "home"
+ : hashRouteRef.current.agentsView,
+ sidekickChatId: null,
+ });
+ },
+ [commitHashRoute],
+ );
+
+ const handleBoardViewChange = useCallback(
+ (nextBoardViewId: BoardViewId) => {
+ setBoardViewId(nextBoardViewId);
+ commitHashRoute({
+ railItem: "workspace",
+ boardViewId: nextBoardViewId,
+ sidekickChatId: null,
+ });
+ },
+ [commitHashRoute],
+ );
+
+ const handleAgentsViewChange = useCallback(
+ (agentsView: HashRoute["agentsView"]) => {
+ commitHashRoute({
+ railItem: "agents",
+ agentsView,
+ sidekickChatId: null,
+ });
+ },
+ [commitHashRoute],
+ );
+
+ const handleSidekickChatOpen = useCallback(
+ (sidekickChatId: string) => {
+ commitHashRoute({
+ railItem: "sidekick",
+ sidekickChatId,
+ });
+ },
+ [commitHashRoute],
+ );
+
+ const handleSidekickHome = useCallback(() => {
+ commitHashRoute({
+ railItem: "sidekick",
+ sidekickChatId: null,
+ });
+ }, [commitHashRoute]);
+
+ const applyHashRouteState = useCallback((nextRoute: HashRoute) => {
+ setBoardViewId(nextRoute.boardViewId);
+ setActiveTheme(nextRoute.theme);
+ setActiveMode(nextRoute.mode);
+ }, []);
+
+ useEffect(() => {
+ hashRouteRef.current = hashRoute;
+ }, [hashRoute]);
+
+ useEffect(() => {
+ const handleHashChange = () => {
+ const nextRoute = parseHashRoute();
+ hashRouteRef.current = nextRoute;
+ setHashRoute((currentRoute) =>
+ routesEqual(currentRoute, nextRoute) ? currentRoute : nextRoute,
+ );
+ applyHashRouteState(nextRoute);
+ };
+
+ window.addEventListener("hashchange", handleHashChange);
+ return () => window.removeEventListener("hashchange", handleHashChange);
+ }, [applyHashRouteState]);
+
+ // Sync external theme/mode from the kitchen-sink context
+ useEffect(() => {
+ if (externalTheme === undefined) return;
+ setActiveTheme(externalTheme);
+ commitHashRoute({ theme: externalTheme });
+ }, [externalTheme, commitHashRoute]);
+
+ useEffect(() => {
+ if (externalMode === undefined) return;
+ setActiveMode(externalMode);
+ commitHashRoute({ mode: externalMode });
+ }, [externalMode, commitHashRoute]);
+
+ useEffect(() => {
+ initProduct(PRODUCT);
+ }, []);
+
+ useEffect(() => {
+ THEME_CLASSES.forEach((cls) =>
+ document.documentElement.classList.remove(cls),
+ );
+ if (activeTheme) document.documentElement.classList.add(activeTheme);
+
+ return () => {
+ THEME_CLASSES.forEach((cls) => document.documentElement.classList.remove(cls));
+ };
+ }, [activeTheme]);
+
+ useEffect(() => {
+ MODE_CLASSES.forEach((cls) =>
+ document.documentElement.classList.remove(cls),
+ );
+ if (activeMode) document.documentElement.classList.add(activeMode);
+
+ return () => {
+ MODE_CLASSES.forEach((cls) => document.documentElement.classList.remove(cls));
+ };
+ }, [activeMode]);
+
+ const renderBoardWorkspace = () => (
+
+
+ showToast("Item created successfully", "positive")}
+ />
+
+
+ {isVibeAppView(boardViewId) ? (
+
+ ) : (
+ groups.map((group) => (
+
+ ))
+ )}
+
+
+ );
+
+ const renderWorkspace = () => renderBoardWorkspace();
+
+ return (
+
+
+
+
+
+ {(activeRailItem) => (
+
+ )}
+
+
+ setOpenItem(null)}
+ />
+ setToast((t) => ({ ...t, open: false }))}
+ >
+ {toast.message}
+
+
+
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/screens/assets/15ef82c8ee79f6111e42949aea8f2307269524d3.png b/apps/kitchen-sink/src/screens/assets/15ef82c8ee79f6111e42949aea8f2307269524d3.png
new file mode 100644
index 0000000000..918097737a
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/15ef82c8ee79f6111e42949aea8f2307269524d3.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/31a207ddb210814d45f4e60c5afe26c81fb55207.png b/apps/kitchen-sink/src/screens/assets/31a207ddb210814d45f4e60c5afe26c81fb55207.png
new file mode 100644
index 0000000000..098aa4a137
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/31a207ddb210814d45f4e60c5afe26c81fb55207.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/41836246ebeea8335f78a1ba2a938aabf44d0607.png b/apps/kitchen-sink/src/screens/assets/41836246ebeea8335f78a1ba2a938aabf44d0607.png
new file mode 100644
index 0000000000..9e3c859b96
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/41836246ebeea8335f78a1ba2a938aabf44d0607.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/44a0d931f8b012dcfc18715f7a64847e76751825.png b/apps/kitchen-sink/src/screens/assets/44a0d931f8b012dcfc18715f7a64847e76751825.png
new file mode 100644
index 0000000000..1d000dc5f9
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/44a0d931f8b012dcfc18715f7a64847e76751825.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/4791b41afa3cbdfd3b5bceec099dbf0fe05b97cd.png b/apps/kitchen-sink/src/screens/assets/4791b41afa3cbdfd3b5bceec099dbf0fe05b97cd.png
new file mode 100644
index 0000000000..30a6c3f260
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/4791b41afa3cbdfd3b5bceec099dbf0fe05b97cd.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/6f1e4ef08a4e8899bba87998c3410a8132536714.png b/apps/kitchen-sink/src/screens/assets/6f1e4ef08a4e8899bba87998c3410a8132536714.png
new file mode 100644
index 0000000000..f9a66cac3a
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/6f1e4ef08a4e8899bba87998c3410a8132536714.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/8128ea9b2697cf84d6336d0cf0bbd261c3cae4a6.png b/apps/kitchen-sink/src/screens/assets/8128ea9b2697cf84d6336d0cf0bbd261c3cae4a6.png
new file mode 100644
index 0000000000..b5473b55cd
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/8128ea9b2697cf84d6336d0cf0bbd261c3cae4a6.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/956984e2f299222affe9c3f9d1b91d646e618dbf.png b/apps/kitchen-sink/src/screens/assets/956984e2f299222affe9c3f9d1b91d646e618dbf.png
new file mode 100644
index 0000000000..50c9cd2fa3
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/956984e2f299222affe9c3f9d1b91d646e618dbf.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/99ba70c9442119f320638528787cb086eabb5871.png b/apps/kitchen-sink/src/screens/assets/99ba70c9442119f320638528787cb086eabb5871.png
new file mode 100644
index 0000000000..9a98c9657a
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/99ba70c9442119f320638528787cb086eabb5871.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/acme-logo.png b/apps/kitchen-sink/src/screens/assets/acme-logo.png
new file mode 100644
index 0000000000..6a93f9c890
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/acme-logo.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/145f62e704627cfd6303bb369765d12daf7a685e.png b/apps/kitchen-sink/src/screens/assets/agent-builder/145f62e704627cfd6303bb369765d12daf7a685e.png
new file mode 100644
index 0000000000..8149304568
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/145f62e704627cfd6303bb369765d12daf7a685e.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/16500cfa3be970c70a57416816f4afe3cd395907.png b/apps/kitchen-sink/src/screens/assets/agent-builder/16500cfa3be970c70a57416816f4afe3cd395907.png
new file mode 100644
index 0000000000..1179c17428
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/16500cfa3be970c70a57416816f4afe3cd395907.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/1f8ad43927aa82f5179150ee505c6d1e74950330.png b/apps/kitchen-sink/src/screens/assets/agent-builder/1f8ad43927aa82f5179150ee505c6d1e74950330.png
new file mode 100644
index 0000000000..e2e83a8dc0
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/1f8ad43927aa82f5179150ee505c6d1e74950330.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/1faacca1c0059536e0a5356866fd6a1989ee4c86.png b/apps/kitchen-sink/src/screens/assets/agent-builder/1faacca1c0059536e0a5356866fd6a1989ee4c86.png
new file mode 100644
index 0000000000..80e79c3de5
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/1faacca1c0059536e0a5356866fd6a1989ee4c86.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/22c3ee8fd2ec75f462ac24e289b113b326c6ded4.png b/apps/kitchen-sink/src/screens/assets/agent-builder/22c3ee8fd2ec75f462ac24e289b113b326c6ded4.png
new file mode 100644
index 0000000000..681f7c13f9
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/22c3ee8fd2ec75f462ac24e289b113b326c6ded4.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/30c2ff5ee32d2a6508ca1717ab594ae7de682df5.png b/apps/kitchen-sink/src/screens/assets/agent-builder/30c2ff5ee32d2a6508ca1717ab594ae7de682df5.png
new file mode 100644
index 0000000000..2d57f61642
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/30c2ff5ee32d2a6508ca1717ab594ae7de682df5.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/3c9911b461a90bb6c6a342add673bfe34e65728d.png b/apps/kitchen-sink/src/screens/assets/agent-builder/3c9911b461a90bb6c6a342add673bfe34e65728d.png
new file mode 100644
index 0000000000..1226edcc17
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/3c9911b461a90bb6c6a342add673bfe34e65728d.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/40475c43e8b977eef304c3d1ff922b7111d1b401.png b/apps/kitchen-sink/src/screens/assets/agent-builder/40475c43e8b977eef304c3d1ff922b7111d1b401.png
new file mode 100644
index 0000000000..c2bc7d2ba2
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/40475c43e8b977eef304c3d1ff922b7111d1b401.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/432ada78325d53e71ce8d672d1b411eb4ee25265.png b/apps/kitchen-sink/src/screens/assets/agent-builder/432ada78325d53e71ce8d672d1b411eb4ee25265.png
new file mode 100644
index 0000000000..1f10799a77
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/432ada78325d53e71ce8d672d1b411eb4ee25265.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/4b7c996683a3668ff14509660103f878b24f71d2.png b/apps/kitchen-sink/src/screens/assets/agent-builder/4b7c996683a3668ff14509660103f878b24f71d2.png
new file mode 100644
index 0000000000..d3230e4ab6
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/4b7c996683a3668ff14509660103f878b24f71d2.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/580fe30d6db6e6259d52c2ef6fc6323f1a0e7331.png b/apps/kitchen-sink/src/screens/assets/agent-builder/580fe30d6db6e6259d52c2ef6fc6323f1a0e7331.png
new file mode 100644
index 0000000000..c6b04bba01
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/580fe30d6db6e6259d52c2ef6fc6323f1a0e7331.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/5e0b1ff59bd5215cae7bd0550d7b41110fdf530f.png b/apps/kitchen-sink/src/screens/assets/agent-builder/5e0b1ff59bd5215cae7bd0550d7b41110fdf530f.png
new file mode 100644
index 0000000000..5989ae2e50
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/5e0b1ff59bd5215cae7bd0550d7b41110fdf530f.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/6bf149e9cfdbffe8e7c43b5a339134d352646bcb.png b/apps/kitchen-sink/src/screens/assets/agent-builder/6bf149e9cfdbffe8e7c43b5a339134d352646bcb.png
new file mode 100644
index 0000000000..895423abdb
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/6bf149e9cfdbffe8e7c43b5a339134d352646bcb.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/7404cf854f9f30afc0d6ed853b2758dc4daa9e49.png b/apps/kitchen-sink/src/screens/assets/agent-builder/7404cf854f9f30afc0d6ed853b2758dc4daa9e49.png
new file mode 100644
index 0000000000..1dc769cc53
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/7404cf854f9f30afc0d6ed853b2758dc4daa9e49.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/87d8479472e80436ded8aa7fd1ef991ffa65b1b7.png b/apps/kitchen-sink/src/screens/assets/agent-builder/87d8479472e80436ded8aa7fd1ef991ffa65b1b7.png
new file mode 100644
index 0000000000..642d4bc5c4
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/87d8479472e80436ded8aa7fd1ef991ffa65b1b7.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/916c29029ed9672c85007dbaa4be4d156cef3f71.png b/apps/kitchen-sink/src/screens/assets/agent-builder/916c29029ed9672c85007dbaa4be4d156cef3f71.png
new file mode 100644
index 0000000000..a0ed665593
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/916c29029ed9672c85007dbaa4be4d156cef3f71.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/a7f4c4c85c6a1ec13ae7b14dd5b0a458c568c2b4.png b/apps/kitchen-sink/src/screens/assets/agent-builder/a7f4c4c85c6a1ec13ae7b14dd5b0a458c568c2b4.png
new file mode 100644
index 0000000000..b53b59bfe2
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/a7f4c4c85c6a1ec13ae7b14dd5b0a458c568c2b4.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/b694564cbdd1bd11b64c7f582d11ea448f6da4f0.png b/apps/kitchen-sink/src/screens/assets/agent-builder/b694564cbdd1bd11b64c7f582d11ea448f6da4f0.png
new file mode 100644
index 0000000000..7d12d088e9
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/b694564cbdd1bd11b64c7f582d11ea448f6da4f0.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/b8ff41ab6f78acea6c0d0eea5d02f91fae6a5263.png b/apps/kitchen-sink/src/screens/assets/agent-builder/b8ff41ab6f78acea6c0d0eea5d02f91fae6a5263.png
new file mode 100644
index 0000000000..ef459a9d28
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/b8ff41ab6f78acea6c0d0eea5d02f91fae6a5263.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/bd1f9cc399276362a6e658b93b78156c4188adc9.png b/apps/kitchen-sink/src/screens/assets/agent-builder/bd1f9cc399276362a6e658b93b78156c4188adc9.png
new file mode 100644
index 0000000000..9e273fa4bb
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/bd1f9cc399276362a6e658b93b78156c4188adc9.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/c4397e9c0efee34cc7a3796dcadedc1e0deca954.png b/apps/kitchen-sink/src/screens/assets/agent-builder/c4397e9c0efee34cc7a3796dcadedc1e0deca954.png
new file mode 100644
index 0000000000..3d21f049eb
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/c4397e9c0efee34cc7a3796dcadedc1e0deca954.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/ca36a1fdf071ada42093d90c3d1b03550ee7245c.png b/apps/kitchen-sink/src/screens/assets/agent-builder/ca36a1fdf071ada42093d90c3d1b03550ee7245c.png
new file mode 100644
index 0000000000..39bfb807ae
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/ca36a1fdf071ada42093d90c3d1b03550ee7245c.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/d0878858f93607fd4081f8b338d56089f366c907.png b/apps/kitchen-sink/src/screens/assets/agent-builder/d0878858f93607fd4081f8b338d56089f366c907.png
new file mode 100644
index 0000000000..4c3cb8d92a
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/d0878858f93607fd4081f8b338d56089f366c907.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/d6a6c4c92231bbbefbe3022840cc78010d11bb75.png b/apps/kitchen-sink/src/screens/assets/agent-builder/d6a6c4c92231bbbefbe3022840cc78010d11bb75.png
new file mode 100644
index 0000000000..694b7e42af
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/d6a6c4c92231bbbefbe3022840cc78010d11bb75.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/df4335b1846999a54485645e75e64c077e8beaf7.png b/apps/kitchen-sink/src/screens/assets/agent-builder/df4335b1846999a54485645e75e64c077e8beaf7.png
new file mode 100644
index 0000000000..ec610444cd
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/df4335b1846999a54485645e75e64c077e8beaf7.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/efaed24f2a2fd5ebabf386ec4007ccc11cc70d18.png b/apps/kitchen-sink/src/screens/assets/agent-builder/efaed24f2a2fd5ebabf386ec4007ccc11cc70d18.png
new file mode 100644
index 0000000000..9019d0aae3
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/efaed24f2a2fd5ebabf386ec4007ccc11cc70d18.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agent-builder/ff2eed1a20664331b7106cf299fec0aaed3bc647.png b/apps/kitchen-sink/src/screens/assets/agent-builder/ff2eed1a20664331b7106cf299fec0aaed3bc647.png
new file mode 100644
index 0000000000..1b526f62f5
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agent-builder/ff2eed1a20664331b7106cf299fec0aaed3bc647.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agents/brittany-wide.png b/apps/kitchen-sink/src/screens/assets/agents/brittany-wide.png
new file mode 100644
index 0000000000..376f5280df
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agents/brittany-wide.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agents/brittany.png b/apps/kitchen-sink/src/screens/assets/agents/brittany.png
new file mode 100644
index 0000000000..6482a70416
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agents/brittany.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agents/elena-wide.png b/apps/kitchen-sink/src/screens/assets/agents/elena-wide.png
new file mode 100644
index 0000000000..00887c0a32
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agents/elena-wide.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agents/elena.png b/apps/kitchen-sink/src/screens/assets/agents/elena.png
new file mode 100644
index 0000000000..164aec7d5e
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agents/elena.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agents/glass/agent1.png b/apps/kitchen-sink/src/screens/assets/agents/glass/agent1.png
new file mode 100644
index 0000000000..b559883d13
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agents/glass/agent1.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agents/glass/agent2.png b/apps/kitchen-sink/src/screens/assets/agents/glass/agent2.png
new file mode 100644
index 0000000000..d8a6814cbb
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agents/glass/agent2.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agents/glass/agent3.png b/apps/kitchen-sink/src/screens/assets/agents/glass/agent3.png
new file mode 100644
index 0000000000..ec610444cd
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agents/glass/agent3.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agents/glass/agent4.png b/apps/kitchen-sink/src/screens/assets/agents/glass/agent4.png
new file mode 100644
index 0000000000..24682441cd
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agents/glass/agent4.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agents/sarah-wide.png b/apps/kitchen-sink/src/screens/assets/agents/sarah-wide.png
new file mode 100644
index 0000000000..649ff3c6b7
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agents/sarah-wide.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/agents/sarah.png b/apps/kitchen-sink/src/screens/assets/agents/sarah.png
new file mode 100644
index 0000000000..076ad6ec5b
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/agents/sarah.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/ai-icons/agents.svg b/apps/kitchen-sink/src/screens/assets/ai-icons/agents.svg
new file mode 100644
index 0000000000..86a7b9ca96
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/assets/ai-icons/agents.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/apps/kitchen-sink/src/screens/assets/ai-icons/ai-sidekick.svg b/apps/kitchen-sink/src/screens/assets/ai-icons/ai-sidekick.svg
new file mode 100644
index 0000000000..649440b2bf
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/assets/ai-icons/ai-sidekick.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/kitchen-sink/src/screens/assets/ai-icons/notetaker.svg b/apps/kitchen-sink/src/screens/assets/ai-icons/notetaker.svg
new file mode 100644
index 0000000000..fc070f83a9
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/assets/ai-icons/notetaker.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/apps/kitchen-sink/src/screens/assets/ai-icons/vibe.svg b/apps/kitchen-sink/src/screens/assets/ai-icons/vibe.svg
new file mode 100644
index 0000000000..061a6731a2
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/assets/ai-icons/vibe.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/kitchen-sink/src/screens/assets/ai-icons/workflows.svg b/apps/kitchen-sink/src/screens/assets/ai-icons/workflows.svg
new file mode 100644
index 0000000000..08e3595755
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/assets/ai-icons/workflows.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/apps/kitchen-sink/src/screens/assets/app-templates/knowledge-manager.png b/apps/kitchen-sink/src/screens/assets/app-templates/knowledge-manager.png
new file mode 100644
index 0000000000..29d3cb5036
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/app-templates/knowledge-manager.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/app-templates/org-chart.png b/apps/kitchen-sink/src/screens/assets/app-templates/org-chart.png
new file mode 100644
index 0000000000..5063d8f9f2
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/app-templates/org-chart.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/app-templates/quote-calculator.png b/apps/kitchen-sink/src/screens/assets/app-templates/quote-calculator.png
new file mode 100644
index 0000000000..a788b535c4
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/app-templates/quote-calculator.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/c3e2da2431edb45e665c1d6bfc0377ef4df16956.png b/apps/kitchen-sink/src/screens/assets/c3e2da2431edb45e665c1d6bfc0377ef4df16956.png
new file mode 100644
index 0000000000..370fc142b7
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/c3e2da2431edb45e665c1d6bfc0377ef4df16956.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/cf1083401990504fa214e1814dd9e86530f6484c.png b/apps/kitchen-sink/src/screens/assets/cf1083401990504fa214e1814dd9e86530f6484c.png
new file mode 100644
index 0000000000..302cf0b520
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/cf1083401990504fa214e1814dd9e86530f6484c.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/e80552e5cd311931922a10d6dd70061713e6b1ac.png b/apps/kitchen-sink/src/screens/assets/e80552e5cd311931922a10d6dd70061713e6b1ac.png
new file mode 100644
index 0000000000..dbaecdec39
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/e80552e5cd311931922a10d6dd70061713e6b1ac.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/ec90618f4fe697ef59f9ba376c95f32ab905bf13.png b/apps/kitchen-sink/src/screens/assets/ec90618f4fe697ef59f9ba376c95f32ab905bf13.png
new file mode 100644
index 0000000000..ed56fa40b4
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/ec90618f4fe697ef59f9ba376c95f32ab905bf13.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/f0c15171c575bb8aa71b3703f917cb5be31788dd.png b/apps/kitchen-sink/src/screens/assets/f0c15171c575bb8aa71b3703f917cb5be31788dd.png
new file mode 100644
index 0000000000..ae0de11bd5
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/f0c15171c575bb8aa71b3703f917cb5be31788dd.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/home-modes/diana.png b/apps/kitchen-sink/src/screens/assets/home-modes/diana.png
new file mode 100644
index 0000000000..73e952fa57
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/home-modes/diana.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/home-modes/gmail.svg b/apps/kitchen-sink/src/screens/assets/home-modes/gmail.svg
new file mode 100644
index 0000000000..da4e902c67
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/assets/home-modes/gmail.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/kitchen-sink/src/screens/assets/home-modes/outlook.svg b/apps/kitchen-sink/src/screens/assets/home-modes/outlook.svg
new file mode 100644
index 0000000000..c10a52ab3b
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/assets/home-modes/outlook.svg
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/kitchen-sink/src/screens/assets/home-modes/sarah.png b/apps/kitchen-sink/src/screens/assets/home-modes/sarah.png
new file mode 100644
index 0000000000..3c22849c7a
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/home-modes/sarah.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/home-modes/slack.png b/apps/kitchen-sink/src/screens/assets/home-modes/slack.png
new file mode 100644
index 0000000000..56bad0842b
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/home-modes/slack.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/home-modes/vibe-thumb-1.svg b/apps/kitchen-sink/src/screens/assets/home-modes/vibe-thumb-1.svg
new file mode 100644
index 0000000000..cfcf864a4a
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/assets/home-modes/vibe-thumb-1.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/kitchen-sink/src/screens/assets/home-modes/vibe-thumb-2.svg b/apps/kitchen-sink/src/screens/assets/home-modes/vibe-thumb-2.svg
new file mode 100644
index 0000000000..d264072e56
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/assets/home-modes/vibe-thumb-2.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/kitchen-sink/src/screens/assets/home-modes/vibe-thumb-3.svg b/apps/kitchen-sink/src/screens/assets/home-modes/vibe-thumb-3.svg
new file mode 100644
index 0000000000..38dcc23cd9
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/assets/home-modes/vibe-thumb-3.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/kitchen-sink/src/screens/assets/inspirations/budget-tracker.png b/apps/kitchen-sink/src/screens/assets/inspirations/budget-tracker.png
new file mode 100644
index 0000000000..8563f1a1f0
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/inspirations/budget-tracker.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/inspirations/calendar-app.png b/apps/kitchen-sink/src/screens/assets/inspirations/calendar-app.png
new file mode 100644
index 0000000000..8c0283ace5
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/inspirations/calendar-app.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/inspirations/calendar-view.png b/apps/kitchen-sink/src/screens/assets/inspirations/calendar-view.png
new file mode 100644
index 0000000000..99caab2755
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/inspirations/calendar-view.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/inspirations/content-calendar.png b/apps/kitchen-sink/src/screens/assets/inspirations/content-calendar.png
new file mode 100644
index 0000000000..47342a7498
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/inspirations/content-calendar.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/inspirations/documentation.png b/apps/kitchen-sink/src/screens/assets/inspirations/documentation.png
new file mode 100644
index 0000000000..72a1df73e8
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/inspirations/documentation.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/inspirations/editorial-calendar.png b/apps/kitchen-sink/src/screens/assets/inspirations/editorial-calendar.png
new file mode 100644
index 0000000000..988452cca6
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/inspirations/editorial-calendar.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/inspirations/employee-directory.png b/apps/kitchen-sink/src/screens/assets/inspirations/employee-directory.png
new file mode 100644
index 0000000000..881961255d
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/inspirations/employee-directory.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/inspirations/event-portal.png b/apps/kitchen-sink/src/screens/assets/inspirations/event-portal.png
new file mode 100644
index 0000000000..963cffa714
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/inspirations/event-portal.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/inspirations/inspiration-1.png b/apps/kitchen-sink/src/screens/assets/inspirations/inspiration-1.png
new file mode 100644
index 0000000000..2402adf146
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/inspirations/inspiration-1.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/inspirations/inspiration-2.png b/apps/kitchen-sink/src/screens/assets/inspirations/inspiration-2.png
new file mode 100644
index 0000000000..000eb23832
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/inspirations/inspiration-2.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/inspirations/inspiration-3.png b/apps/kitchen-sink/src/screens/assets/inspirations/inspiration-3.png
new file mode 100644
index 0000000000..50f67e089c
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/inspirations/inspiration-3.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/inspirations/inspiration-4.png b/apps/kitchen-sink/src/screens/assets/inspirations/inspiration-4.png
new file mode 100644
index 0000000000..c7a79fe38c
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/inspirations/inspiration-4.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/inspirations/inspiration-5.png b/apps/kitchen-sink/src/screens/assets/inspirations/inspiration-5.png
new file mode 100644
index 0000000000..7495f13e69
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/inspirations/inspiration-5.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/inspirations/knowledge-base.png b/apps/kitchen-sink/src/screens/assets/inspirations/knowledge-base.png
new file mode 100644
index 0000000000..e0de65cad9
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/inspirations/knowledge-base.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/inspirations/org-chart.png b/apps/kitchen-sink/src/screens/assets/inspirations/org-chart.png
new file mode 100644
index 0000000000..6148531d04
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/inspirations/org-chart.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/inspirations/portfolio.png b/apps/kitchen-sink/src/screens/assets/inspirations/portfolio.png
new file mode 100644
index 0000000000..5807be47f1
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/inspirations/portfolio.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/inspirations/presentation.png b/apps/kitchen-sink/src/screens/assets/inspirations/presentation.png
new file mode 100644
index 0000000000..3d436e56e7
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/inspirations/presentation.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/inspirations/project-dashboard.png b/apps/kitchen-sink/src/screens/assets/inspirations/project-dashboard.png
new file mode 100644
index 0000000000..3acf4d9b49
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/inspirations/project-dashboard.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/inspirations/project-overview.png b/apps/kitchen-sink/src/screens/assets/inspirations/project-overview.png
new file mode 100644
index 0000000000..59d11367e4
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/inspirations/project-overview.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/inspirations/quota-calculator.png b/apps/kitchen-sink/src/screens/assets/inspirations/quota-calculator.png
new file mode 100644
index 0000000000..5668e101d6
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/inspirations/quota-calculator.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/sidekick/glow.png b/apps/kitchen-sink/src/screens/assets/sidekick/glow.png
new file mode 100644
index 0000000000..d5ce01d814
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/sidekick/glow.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/tools/bullet.png b/apps/kitchen-sink/src/screens/assets/tools/bullet.png
new file mode 100644
index 0000000000..0ec5f990e5
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/tools/bullet.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/tools/gmail.png b/apps/kitchen-sink/src/screens/assets/tools/gmail.png
new file mode 100644
index 0000000000..95d4afcd01
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/tools/gmail.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/tools/monday.png b/apps/kitchen-sink/src/screens/assets/tools/monday.png
new file mode 100644
index 0000000000..5c8704a980
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/tools/monday.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/tools/slack.png b/apps/kitchen-sink/src/screens/assets/tools/slack.png
new file mode 100644
index 0000000000..0a108cea45
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/tools/slack.png differ
diff --git a/apps/kitchen-sink/src/screens/assets/vibe-logo-colored.png b/apps/kitchen-sink/src/screens/assets/vibe-logo-colored.png
new file mode 100644
index 0000000000..e6bca659bf
Binary files /dev/null and b/apps/kitchen-sink/src/screens/assets/vibe-logo-colored.png differ
diff --git a/apps/kitchen-sink/src/screens/board/boardViews.tsx b/apps/kitchen-sink/src/screens/board/boardViews.tsx
new file mode 100644
index 0000000000..8ea1f30440
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/board/boardViews.tsx
@@ -0,0 +1,34 @@
+import type { SubIcon } from "@vibe/icon";
+import { Home } from "@mondaydotcomorg/icons";
+import vibeLogoColored from "../assets/vibe-logo-colored.png";
+
+export interface BoardView {
+ id: string;
+ label: string;
+ icon: SubIcon;
+}
+
+export function VibeAppColoredIcon({ size = 18 }: { size?: string | number }) {
+ return (
+
+ );
+}
+
+export const BOARD_VIEWS: BoardView[] = [
+ { id: "main-table", label: "Main table", icon: Home },
+ { id: "vibe-app-1", label: "Vibe app", icon: VibeAppColoredIcon },
+ { id: "vibe-app-2", label: "Vibe app", icon: VibeAppColoredIcon },
+ { id: "vibe-app-3", label: "Vibe app", icon: VibeAppColoredIcon },
+];
+
+export type BoardViewId = (typeof BOARD_VIEWS)[number]["id"];
+
+export function isVibeAppView(viewId: BoardViewId): boolean {
+ return viewId.startsWith("vibe-app");
+}
diff --git a/apps/kitchen-sink/src/screens/board/gridTemplate.ts b/apps/kitchen-sink/src/screens/board/gridTemplate.ts
new file mode 100644
index 0000000000..1141402af9
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/board/gridTemplate.ts
@@ -0,0 +1,16 @@
+import type { ColumnWidths } from "@/components/types";
+
+export const BOARD_GRID_CHECKBOX_COL_PX = 50;
+export const BOARD_GRID_ADD_COL_PX = 40;
+
+/** Applied in `App` and inside resize math so columns never collapse unusably thin. */
+export const MIN_COLUMN_WIDTH_PX = 50;
+
+export function boardGridTemplateColumns(widths: ColumnWidths): string {
+ return `${BOARD_GRID_CHECKBOX_COL_PX}px minmax(${widths.task}px, 1fr) ${widths.owner}px ${widths.status}px ${widths.priority}px ${widths.eta}px ${BOARD_GRID_ADD_COL_PX}px`;
+}
+
+/** Footer row mirrors data columns (owner → add). */
+export function boardFooterDataColumnsTemplate(widths: ColumnWidths): string {
+ return `${widths.owner}px ${widths.status}px ${widths.priority}px ${widths.eta}px ${BOARD_GRID_ADD_COL_PX}px`;
+}
diff --git a/apps/kitchen-sink/src/screens/components/AgentAvatarStub.tsx b/apps/kitchen-sink/src/screens/components/AgentAvatarStub.tsx
new file mode 100644
index 0000000000..ac751af05e
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/AgentAvatarStub.tsx
@@ -0,0 +1,8 @@
+import { Avatar, type AvatarProps } from "@vibe/core";
+
+type AgentAvatarProps = Omit;
+
+/** Local stand-in for monday-ui-components AgentAvatar (deep import unavailable in this worktree). */
+export default function AgentAvatar(props: AgentAvatarProps) {
+ return ;
+}
diff --git a/apps/kitchen-sink/src/screens/components/AgentBuilderConfig.module.scss b/apps/kitchen-sink/src/screens/components/AgentBuilderConfig.module.scss
new file mode 100644
index 0000000000..06873e5361
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/AgentBuilderConfig.module.scss
@@ -0,0 +1,76 @@
+.iconButton {
+ border: none;
+ background: transparent;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: var(--border-radius-small);
+ transition: background-color 0.15s ease;
+
+ &:hover {
+ background-color: rgba(0, 0, 0, 0.05);
+ }
+}
+
+.avatarButton {
+ border: none;
+ cursor: pointer;
+ background-color: var(--allgrey-background-color);
+ overflow: hidden;
+ position: relative;
+ border-radius: 12px;
+ transition: transform 0.15s ease;
+}
+
+.avatarButtonHover:hover {
+ transform: scale(1.05);
+ z-index: 10;
+}
+
+.colorButton {
+ border: none;
+ cursor: pointer;
+ transition: transform 0.15s ease;
+ position: relative;
+ border-radius: 12px;
+
+ &:hover {
+ transform: scale(1.05);
+ }
+}
+
+.onboardButton {
+ border: none;
+ cursor: pointer;
+ background-color: #333;
+ transition: background-color 0.15s ease;
+ overflow: hidden;
+
+ &:hover {
+ background-color: #222;
+ }
+ &:active {
+ background-color: #111;
+ }
+}
+
+@keyframes agentCursorBlink {
+ 0%,
+ 100% {
+ opacity: 1;
+ }
+ 50% {
+ opacity: 0;
+ }
+}
+
+.titleCursor {
+ display: inline-block;
+ width: 2px;
+ height: 18px;
+ background-color: var(--primary-text-color);
+ margin-left: 1px;
+ vertical-align: middle;
+ animation: agentCursorBlink 1s step-end infinite;
+}
diff --git a/apps/kitchen-sink/src/screens/components/AgentBuilderConfig.tsx b/apps/kitchen-sink/src/screens/components/AgentBuilderConfig.tsx
new file mode 100644
index 0000000000..ecfbb29ae5
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/AgentBuilderConfig.tsx
@@ -0,0 +1,1160 @@
+import { useState, useRef, useEffect, useCallback } from "react";
+import svgPaths from "../imports/svg-rt86nqhfv4";
+import { imgFrame2147239680 } from "../imports/svg-s2yy1";
+import imgImage721 from "../assets/agent-builder/432ada78325d53e71ce8d672d1b411eb4ee25265.png";
+import {
+ avatars,
+ colorSchemes,
+ renderAvatarVisual,
+ summarizeExpertise,
+} from "./agentBuilderData";
+import {
+ useAgentBuilder,
+ type AgentConfigInitial,
+} from "../context/AgentBuilderContext";
+import styles from "./AgentBuilderConfig.module.scss";
+
+const C_TEXT = "var(--primary-text-color)";
+const C_SUB = "var(--secondary-text-color)";
+const C_BORDER = "var(--layout-border-color)";
+const C_BORDER_LIGHT = "var(--ui-border-color)";
+const C_BG = "var(--primary-background-color)";
+const C_GREY = "var(--allgrey-background-color)";
+const FONT_TITLE = "var(--title-font-family)";
+const FONT_BODY = "var(--font-family)";
+
+export function AgentBuilderConfig({
+ initial,
+}: {
+ initial: AgentConfigInitial | null;
+}) {
+ const { openOnboarding, close } = useAgentBuilder();
+ const preselected = initial;
+
+ const [selectedColor, setSelectedColor] = useState(() => {
+ if (preselected?.avatarBg) {
+ const idx = colorSchemes.findIndex(
+ (c) => c.color === preselected.avatarBg,
+ );
+ return idx >= 0 ? idx : 0;
+ }
+ return 0;
+ });
+ const [selectedAvatar, setSelectedAvatar] = useState(
+ preselected?.avatarIndex ?? 0,
+ );
+ const [prevAvatar, setPrevAvatar] = useState(null);
+ const [transitioning, setTransitioning] = useState(false);
+ const [agentName, setAgentName] = useState("");
+ const [confirmedName, setConfirmedName] = useState(
+ preselected?.name ?? "Elena",
+ );
+ const [buttonAnimating, setButtonAnimating] = useState(false);
+ const [expertise, setExpertise] = useState("");
+ const [displayedHeader, setDisplayedHeader] = useState("");
+ const [confirmedExpertise, setConfirmedExpertise] = useState(
+ preselected?.expertise
+ ? summarizeExpertise(preselected.expertise) + " expert"
+ : "Feedback Intelligence expert",
+ );
+ const titleTimeoutsRef = useRef[]>([]);
+ const [showTitleCursor, setShowTitleCursor] = useState(false);
+ const currentHeaderRef = useRef("");
+ const currentSubtitleRef = useRef(
+ preselected?.expertise
+ ? summarizeExpertise(preselected.expertise) + " expert"
+ : "Feedback Intelligence expert",
+ );
+ const confirmedNameRef = useRef(preselected?.name ?? "Elena");
+
+ const [typewriterPhase, setTypewriterPhase] = useState<
+ "name" | "expertise" | "done"
+ >("name");
+ const typewriterDone = useRef(false);
+ const [showNameBorder, setShowNameBorder] = useState(false);
+ const [showExpertiseBorder, setShowExpertiseBorder] = useState(false);
+
+ const nameSpanRef = useRef(null);
+ const expertiseSpanRef = useRef(null);
+ const [nameWidth, setNameWidth] = useState(0);
+ const [expertiseWidth, setExpertiseWidth] = useState(0);
+
+ useEffect(() => {
+ if (nameSpanRef.current) setNameWidth(nameSpanRef.current.offsetWidth);
+ }, [agentName]);
+
+ useEffect(() => {
+ if (expertiseSpanRef.current)
+ setExpertiseWidth(expertiseSpanRef.current.offsetWidth);
+ }, [expertise]);
+
+ const handleOnboard = () => {
+ const expertiseTitle = confirmedExpertise
+ ? summarizeExpertise(confirmedExpertise) + " Agent"
+ : "Feedback Intelligence Agent";
+ openOnboarding({
+ name: confirmedName,
+ expertise: expertiseTitle,
+ avatarBg: colorSchemes[selectedColor].color,
+ avatarImg: avatars[selectedAvatar].centerImg,
+ avatarIndex: selectedAvatar,
+ });
+ };
+
+ const animateHeader = useCallback((newHeader: string) => {
+ titleTimeoutsRef.current.forEach(clearTimeout);
+ titleTimeoutsRef.current = [];
+ setShowTitleCursor(true);
+
+ const oldHeader = currentHeaderRef.current;
+ const deleteSpeed = 15;
+ const writeSpeed = 25;
+ const pauseBetween = 100;
+
+ for (let i = oldHeader.length; i >= 0; i--) {
+ const timeout = setTimeout(
+ () => {
+ setDisplayedHeader(oldHeader.slice(0, i));
+ },
+ (oldHeader.length - i) * deleteSpeed,
+ );
+ titleTimeoutsRef.current.push(timeout);
+ }
+
+ const deleteTime = oldHeader.length * deleteSpeed;
+
+ for (let i = 0; i <= newHeader.length; i++) {
+ const timeout = setTimeout(
+ () => {
+ setDisplayedHeader(newHeader.slice(0, i));
+ if (i === newHeader.length) {
+ currentHeaderRef.current = newHeader;
+ setTimeout(() => setShowTitleCursor(false), 500);
+ }
+ },
+ deleteTime + pauseBetween + i * writeSpeed,
+ );
+ titleTimeoutsRef.current.push(timeout);
+ }
+ }, []);
+
+ const confirmName = () => {
+ const newName = agentName.trim();
+ if (newName && newName !== confirmedNameRef.current) {
+ setButtonAnimating(true);
+ setConfirmedName(newName);
+ confirmedNameRef.current = newName;
+ setTimeout(() => setButtonAnimating(false), 600);
+ animateHeader(`${newName}, ${currentSubtitleRef.current}`);
+ }
+ };
+
+ const confirmExpertise = useCallback(() => {
+ if (expertise.trim() !== confirmedExpertise) {
+ setConfirmedExpertise(expertise.trim());
+ const newTitle = summarizeExpertise(expertise) + " expert";
+ if (newTitle !== currentSubtitleRef.current) {
+ currentSubtitleRef.current = newTitle;
+ animateHeader(`${confirmedNameRef.current}, ${newTitle}`);
+ }
+ }
+ }, [expertise, confirmedExpertise, animateHeader]);
+
+ const handleAvatarSelect = useCallback(
+ (idx: number) => {
+ if (idx === selectedAvatar) return;
+ setPrevAvatar(selectedAvatar);
+ setSelectedAvatar(idx);
+ setTransitioning(true);
+ },
+ [selectedAvatar],
+ );
+
+ useEffect(() => {
+ if (!transitioning) return;
+ const raf = requestAnimationFrame(() => setTransitioning(false));
+ const cleanup = setTimeout(() => setPrevAvatar(null), 600);
+ return () => {
+ cancelAnimationFrame(raf);
+ clearTimeout(cleanup);
+ };
+ }, [transitioning]);
+
+ useEffect(() => {
+ if (typewriterDone.current) return;
+ typewriterDone.current = true;
+
+ const targetName = preselected?.name ?? "Elena";
+ const targetExpertise = preselected?.expertise
+ ? summarizeExpertise(preselected.expertise) + " expert"
+ : "Feedback Intelligence expert";
+ const typeSpeed = 60;
+ const expertiseTypeSpeed = 30;
+ const pauseBetween = 400;
+ const initialDelay = 500;
+ const timeouts: ReturnType[] = [];
+
+ const showBorderT = setTimeout(() => setShowNameBorder(true), initialDelay);
+ timeouts.push(showBorderT);
+
+ const typeStartDelay = initialDelay;
+
+ for (let i = 0; i <= targetName.length; i++) {
+ const t = setTimeout(
+ () => {
+ setAgentName(targetName.slice(0, i));
+ },
+ typeStartDelay + i * typeSpeed,
+ );
+ timeouts.push(t);
+ }
+
+ const nameEndTime = typeStartDelay + targetName.length * typeSpeed;
+
+ const showExBorderT = setTimeout(() => {
+ setTypewriterPhase("expertise");
+ setShowExpertiseBorder(true);
+ }, nameEndTime + pauseBetween);
+ timeouts.push(showExBorderT);
+
+ const expertiseTypeStart = nameEndTime + pauseBetween;
+
+ for (let i = 0; i <= targetExpertise.length; i++) {
+ const t = setTimeout(
+ () => {
+ setExpertise(targetExpertise.slice(0, i));
+ },
+ expertiseTypeStart + i * expertiseTypeSpeed,
+ );
+ timeouts.push(t);
+ }
+
+ const expertiseEndTime =
+ expertiseTypeStart + targetExpertise.length * expertiseTypeSpeed;
+
+ const finishT = setTimeout(() => {
+ setTypewriterPhase("done");
+ setConfirmedExpertise(targetExpertise);
+ currentSubtitleRef.current = targetExpertise;
+ const fullHeader = `${targetName}, ${targetExpertise}`;
+ setShowTitleCursor(true);
+ const headerWriteSpeed = 25;
+ for (let i = 0; i <= fullHeader.length; i++) {
+ const ht = setTimeout(() => {
+ setDisplayedHeader(fullHeader.slice(0, i));
+ if (i === fullHeader.length) {
+ currentHeaderRef.current = fullHeader;
+ setTimeout(() => setShowTitleCursor(false), 500);
+ }
+ }, i * headerWriteSpeed);
+ timeouts.push(ht);
+ }
+ }, expertiseEndTime + 300);
+ timeouts.push(finishT);
+
+ return () => timeouts.forEach(clearTimeout);
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, []);
+
+ const activeColor = colorSchemes[selectedColor].color;
+ const isWhite = activeColor === "#ffffff";
+
+ return (
+
+
+
+
+
+
+
+
+
+ {/* Header */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {displayedHeader}
+ {showTitleCursor && (
+
+ )}
+
+
+
+
+
+
+
+
+ {/* Main content */}
+
+ {/* Colored background container (visual only) */}
+
+
+ {/* Previous avatar (fading out) */}
+ {prevAvatar !== null && (
+
+
+
+ )}
+ {/* Current avatar (fading in) */}
+
+
+
+
+ {/* Agent name + subtitle */}
+
+ {/* Name input */}
+
+
+
+ {
+ if (typewriterPhase === "done")
+ setAgentName(e.target.value);
+ }}
+ onFocus={(e) => {
+ if (typewriterPhase === "done")
+ e.currentTarget.select();
+ }}
+ onKeyDown={(e) => {
+ if (e.key === "Enter") e.currentTarget.blur();
+ }}
+ onBlur={confirmName}
+ readOnly={typewriterPhase !== "done"}
+ style={{
+ background: "transparent",
+ fontFamily: FONT_TITLE,
+ fontWeight: 500,
+ color: C_TEXT,
+ fontSize: "48px",
+ textAlign: "center",
+ letterSpacing: "-1.4753px",
+ lineHeight: 1,
+ outline: "none",
+ border: "none",
+ padding: "0 12px",
+ width: `${nameWidth + 24}px`,
+ transition: "width 80ms ease-out",
+ caretColor:
+ typewriterPhase !== "done"
+ ? "transparent"
+ : undefined,
+ }}
+ />
+
+ {agentName || "\u200b"}
+
+
+
+ {/* Expertise subtitle */}
+
+
+
+ {
+ if (typewriterPhase === "done")
+ setExpertise(e.target.value);
+ }}
+ onFocus={(e) => {
+ if (typewriterPhase === "done")
+ e.currentTarget.select();
+ }}
+ onBlur={confirmExpertise}
+ onKeyDown={(e) => {
+ if (e.key === "Enter") e.currentTarget.blur();
+ }}
+ readOnly={typewriterPhase !== "done"}
+ style={{
+ fontFamily: FONT_BODY,
+ lineHeight: 1.43,
+ color: C_SUB,
+ fontSize: "16px",
+ letterSpacing: "0.16px",
+ whiteSpace: "nowrap",
+ background: "transparent",
+ outline: "none",
+ border: "none",
+ textAlign: "center",
+ padding: "0 12px",
+ width: `${expertiseWidth + 24}px`,
+ transition: "width 80ms ease-out",
+ caretColor:
+ typewriterPhase !== "done"
+ ? "transparent"
+ : undefined,
+ }}
+ />
+
+ {expertise || "\u200b"}
+
+
+
+
+
+
+
+ {/* Left side — avatar selection */}
+
+
+
+
+
+
+ {avatars.map((avatar, idx) => {
+ const isSelected = selectedAvatar === idx;
+ return (
+
+ {isSelected ? (
+
+
+
handleAvatarSelect(idx)}
+ className={styles.avatarButton}
+ style={{ flex: "1 0 0", height: "104px" }}
+ >
+ {renderAvatarVisual(avatar, avatar.name)}
+
+
+ ) : (
+
handleAvatarSelect(idx)}
+ className={`${styles.avatarButton} ${styles.avatarButtonHover}`}
+ style={{ position: "absolute", inset: 0 }}
+ >
+ {renderAvatarVisual(avatar, avatar.name)}
+
+ )}
+
+ );
+ })}
+
+
+
+
+
+ {/* Right side — color selection */}
+
+
+
+
+ {colorSchemes.map((color) => {
+ const isSelected = selectedColor === color.id;
+ if (isSelected) {
+ return (
+
+
+
+
+ {color.border && (
+
+ )}
+
+
+
+ );
+ }
+ return (
+
setSelectedColor(color.id)}
+ className={styles.colorButton}
+ style={{
+ flex: "1 0 0",
+ height: "104px",
+ minWidth: "50px",
+ backgroundColor: color.color,
+ }}
+ >
+ {color.border && (
+
+ )}
+
+ );
+ })}
+
+
+
+ {/* Onboard button */}
+
+
+
+ Onboard{" "}
+
+ {confirmedName}
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/screens/components/AgentBuilderModal.tsx b/apps/kitchen-sink/src/screens/components/AgentBuilderModal.tsx
new file mode 100644
index 0000000000..c8101c255e
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/AgentBuilderModal.tsx
@@ -0,0 +1,27 @@
+import {
+ useAgentBuilder,
+ type AgentConfigData,
+} from "../context/AgentBuilderContext";
+import { AgentBuilderConfig } from "./AgentBuilderConfig";
+import { AgentBuilderOnboarding } from "./AgentBuilderOnboarding";
+import imgDefaultAvatar from "../assets/agent-builder/87d8479472e80436ded8aa7fd1ef991ffa65b1b7.png";
+
+const DEFAULT_AGENT: AgentConfigData = {
+ name: "Elena",
+ expertise: "Feedback Intelligence Agent",
+ avatarBg: "#f960c6",
+ avatarImg: imgDefaultAvatar,
+ avatarIndex: 0,
+};
+
+export function AgentBuilderModal() {
+ const { view, configInitial, pendingAgent } = useAgentBuilder();
+
+ if (view === "config") {
+ return ;
+ }
+ if (view === "onboarding") {
+ return ;
+ }
+ return null;
+}
diff --git a/apps/kitchen-sink/src/screens/components/AgentBuilderOnboarding.module.scss b/apps/kitchen-sink/src/screens/components/AgentBuilderOnboarding.module.scss
new file mode 100644
index 0000000000..5c134e2778
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/AgentBuilderOnboarding.module.scss
@@ -0,0 +1,95 @@
+/* Override the radii so the prompt box matches the existing chat input
+ (12px visible radius, ~111px min-height) instead of the hero composers'
+ bigger 16px radius. */
+.composerShell {
+ width: 100%;
+ border-radius: 13px;
+}
+
+.composerWrap {
+ border-radius: 12px;
+ background: var(--primary-background-color);
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ padding: 12px 0 8px;
+ min-height: 111px;
+ box-shadow:
+ rgba(50, 50, 93, 0.06) 0 4px 10px -2px,
+ rgba(0, 0, 0, 0.08) 0 2px 4px -1px;
+}
+
+.iconButton {
+ border: none;
+ background: transparent;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: var(--border-radius-small);
+ transition: background-color 0.15s ease;
+
+ &:hover {
+ background-color: rgba(0, 0, 0, 0.05);
+ }
+}
+
+.followUpButton {
+ border: none;
+ background-color: var(--primary-background-color);
+ height: 36px;
+ position: relative;
+ border-radius: 8px;
+ flex-shrink: 0;
+ cursor: pointer;
+ transition: background-color 0.15s ease;
+
+ &:hover {
+ background-color: var(--primary-background-hover-color);
+ }
+}
+
+.editButton {
+ border: none;
+ background-color: var(--primary-background-color);
+ display: flex;
+ height: 32px;
+ align-items: center;
+ justify-content: center;
+ padding: 0 8px;
+ border-radius: 6px;
+ cursor: pointer;
+ position: relative;
+ transition: background-color 0.15s ease;
+
+ &:hover {
+ background-color: var(--primary-background-hover-color);
+ }
+ &:active {
+ background-color: var(--ui-background-color);
+ }
+}
+
+.plainButton {
+ border: none;
+ background: transparent;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.tabButton {
+ border: none;
+ background: transparent;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding-bottom: 8px;
+ padding-left: 8px;
+ padding-right: 8px;
+ position: relative;
+ flex-shrink: 0;
+}
diff --git a/apps/kitchen-sink/src/screens/components/AgentBuilderOnboarding.tsx b/apps/kitchen-sink/src/screens/components/AgentBuilderOnboarding.tsx
new file mode 100644
index 0000000000..06771a015f
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/AgentBuilderOnboarding.tsx
@@ -0,0 +1,1534 @@
+import { useState, useRef, useEffect } from "react";
+import svgPaths from "../imports/svg-5v47xpc9uc";
+import imgImage685 from "../assets/agent-builder/87d8479472e80436ded8aa7fd1ef991ffa65b1b7.png";
+import { CARD_AVATAR_DATA, renderAvatarVisual } from "./agentBuilderData";
+import {
+ useAgentBuilder,
+ type AgentConfigData,
+} from "../context/AgentBuilderContext";
+import styles from "./AgentBuilderOnboarding.module.scss";
+import { StrokeSpotlight } from "@vibe/core";
+
+const C_TEXT = "var(--primary-text-color)";
+const C_SUB = "var(--secondary-text-color)";
+const C_BORDER = "var(--layout-border-color)";
+const C_BG = "var(--primary-background-color)";
+const C_GREY = "var(--allgrey-background-color)";
+const FONT_TITLE = "var(--title-font-family)";
+const FONT_BODY = "var(--font-family)";
+
+function AgentIcon({
+ avatarImg,
+ avatarBg,
+}: {
+ avatarImg?: string;
+ avatarBg?: string;
+}) {
+ const bg = avatarBg && avatarBg !== "#ffffff" ? avatarBg : "#edf1fc";
+ return (
+
+
+
+
+
+
+ );
+}
+
+function Toggle({
+ enabled,
+ onToggle,
+}: {
+ enabled: boolean;
+ onToggle: () => void;
+}) {
+ return (
+
+
+
+ );
+}
+
+function ActiveBullet() {
+ return (
+
+ );
+}
+
+function InfoIcon() {
+ return (
+
+ );
+}
+
+function ChevronDown() {
+ return (
+
+ );
+}
+
+function EnterArrowIcon() {
+ return (
+
+ );
+}
+
+const bulletPoints = [
+ "I'll collect customer feedback from a source you choose",
+ "I'll analyze sentiment (positive / neutral / negative) and spot meaningful changes",
+ "I'll group feedback into themes (bugs, feature requests, UX friction, pricing, performance, etc.)",
+ "I'll extract actionable insights (what's happening + what to do next)",
+ "I'll generate prioritized tasks with an urgency level so your team can respond strategically",
+];
+
+export function AgentBuilderOnboarding({ agent }: { agent: AgentConfigData }) {
+ const { close, openConfig } = useAgentBuilder();
+
+ const [promptValue, setPromptValue] = useState("");
+ const [activeTab, setActiveTab] = useState<"brain" | "activity">("brain");
+ const [triggers, setTriggers] = useState({ mention: true, assign: true });
+ const [typedText, setTypedText] = useState("");
+ const [showContent, setShowContent] = useState(false);
+ const textareaRef = useRef(null);
+
+ const fullGreeting = `Nice to meet you 👋`;
+
+ useEffect(() => {
+ let i = 0;
+ const interval = setInterval(() => {
+ i++;
+ setTypedText(fullGreeting.slice(0, i));
+ if (i >= fullGreeting.length) {
+ clearInterval(interval);
+ setTimeout(() => setShowContent(true), 200);
+ }
+ }, 40);
+ return () => clearInterval(interval);
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, []);
+
+ const cardData = CARD_AVATAR_DATA[agent.avatarIndex ?? 0];
+ const isWhiteBg = agent.avatarBg === "#ffffff";
+
+ return (
+
+
+
+
+ {/* Header */}
+
+
+
+
+ {agent.name}, {agent.expertise.replace(/\s*Agent$/i, "")} expert
+
+
+
+
+
+
+
+ {/* Content */}
+
+ {/* Left: chat */}
+
+
+
+
+
+
+
+ {typedText}
+
+
+
+
+ I've gone ahead and set up the basics based on what I
+ understand you want me to do.
+
+
+ Here's how I'm going to work for you:
+
+
+ {bulletPoints.map((point, i) => (
+
+
+ {point}
+
+
+ ))}
+
+
+ I'm almost ready — first, did I understand the job
+ correctly?
+
+
+
+
+ {["Yes, that's right", "Make changes"].map((label) => (
+
+
+
+
+ {label}
+
+
+
+
+ ))}
+
+
+
+
+ {/* Prompt editor */}
+
+
+
+
+ {/* Right: canvas */}
+
+
+ {/* Agent card */}
+
+
+
+
+ openConfig({
+ avatarIndex: agent.avatarIndex,
+ name: agent.name,
+ expertise: agent.expertise,
+ avatarBg: agent.avatarBg,
+ })
+ }
+ >
+
+
+ Edit agent
+
+
+
+
+
+ {cardData ? (
+ renderAvatarVisual(cardData)
+ ) : (
+
+ )}
+ {isWhiteBg && (
+
+ )}
+
+
+
+
+
+ Hi I'm {agent.name}
+
+
+ {agent.expertise}
+
+
+
+
+
+
+
+
+ {/* Tabs */}
+
+
+
+
+
+ {(["brain", "activity"] as const).map((tab) => (
+ setActiveTab(tab)}
+ className={styles.tabButton}
+ style={{
+ borderBottom:
+ activeTab === tab
+ ? `2px solid ${C_TEXT}`
+ : undefined,
+ }}
+ >
+
+ {tab}
+
+
+ ))}
+
+
+
+
+
+ {/* Triggers */}
+
+
+
+
+
+
+
+ Triggers
+
+
+
+
+
+
+
+
+
+
+ setTriggers((t) => ({ ...t, mention: !t.mention }))
+ }
+ />
+
+
+
+
+
+
+
+ setTriggers((t) => ({ ...t, assign: !t.assign }))
+ }
+ />
+
+
+
+
+
+
+
+ {/* Instructions */}
+
+
+
+
+
+
+
+ Instractions
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 📋 Overview
+
+
+ Monitor direct and indirect competitors weekly to
+ provide actionable updates and insights for strategic
+ decision-making.
+
+
+
+ 📊 Competitive research tasks
+
+
+ Identify competitors - Research and list relevant
+ direct and indirect competitors in the market.
+
+
+ Track updates - Monitor competitor news, product
+ launches, and major changes regularly.
+
+
+ Analyze strategies - Assess competitor positioning,
+ marketing tactics, and business moves.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/screens/components/AgentsPage.module.scss b/apps/kitchen-sink/src/screens/components/AgentsPage.module.scss
new file mode 100644
index 0000000000..087552144b
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/AgentsPage.module.scss
@@ -0,0 +1,158 @@
+.root {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-32);
+ padding: var(--space-24) var(--space-48) var(--space-48);
+ max-width: 1080px;
+ margin: 0 auto;
+ width: 100%;
+}
+
+.headerActions {
+ align-self: flex-end;
+}
+
+.heroBlock {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: var(--space-20);
+ width: 100%;
+ max-width: 720px;
+ margin: 0 auto;
+}
+
+.hero {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: var(--space-8);
+ text-align: center;
+}
+
+.heroTitle {
+ font-size: 40px;
+ line-height: 1.2;
+}
+
+.gradientWord {
+ background: linear-gradient(90deg, #00b2ff 0%, #6c4bff 100%);
+ background-clip: text;
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+}
+
+.composerShell {
+ width: 100%;
+}
+
+.composerWrap {
+ border-radius: 16px;
+ background: var(--primary-background-color);
+ overflow: hidden;
+ box-shadow:
+ rgba(50, 50, 93, 0.06) 0 4px 10px -2px,
+ rgba(0, 0, 0, 0.08) 0 2px 4px -1px;
+}
+
+.composerInput {
+ width: 100%;
+ min-height: 110px;
+ padding: var(--space-20) var(--space-20) var(--space-8);
+ border: none;
+ outline: none;
+ resize: none;
+ background: transparent;
+ font-family: inherit;
+ font-size: 14px;
+ line-height: 1.5;
+ color: var(--primary-text-color);
+
+ &::placeholder {
+ color: var(--secondary-text-color);
+ }
+}
+
+.composerFooter {
+ padding: var(--space-8) var(--space-12) var(--space-12);
+}
+
+.chips {
+ flex-wrap: wrap;
+ justify-content: center;
+ gap: var(--space-8);
+}
+
+.carouselSection {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-16);
+}
+
+.agentCarousel {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: var(--space-16);
+}
+
+.agentCard {
+ display: flex;
+ flex-direction: row;
+ border: 1px solid var(--ui-border-color);
+ border-radius: 12px;
+ background: var(--primary-background-color);
+ overflow: hidden;
+ cursor: pointer;
+ transition: box-shadow 0.15s ease;
+
+ &:hover {
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
+ }
+}
+
+.agentPortrait {
+ width: 38%;
+ flex-shrink: 0;
+ min-height: 150px;
+ align-self: stretch;
+ object-fit: cover;
+ display: block;
+}
+
+.agentInfo {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-4);
+ padding: var(--space-20);
+ justify-content: center;
+ min-width: 0;
+}
+
+.agentDescription {
+ margin-top: var(--space-2);
+}
+
+.agentBoard {
+ margin-top: var(--space-12);
+}
+
+.boardChip {
+ display: inline-flex;
+ align-items: center;
+ gap: var(--space-4);
+ padding: var(--space-2) var(--space-8);
+ border-radius: var(--border-radius-small);
+ background: var(--primary-selected-color);
+ font-size: 11px;
+ font-weight: 500;
+ color: var(--primary-text-color);
+ max-width: 200px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ border: 1px solid var(--ui-border-color);
+}
+
+.boardChipIcon {
+ flex-shrink: 0;
+}
diff --git a/apps/kitchen-sink/src/screens/components/AgentsPage.tsx b/apps/kitchen-sink/src/screens/components/AgentsPage.tsx
new file mode 100644
index 0000000000..cdd8b825dd
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/AgentsPage.tsx
@@ -0,0 +1,240 @@
+import { useState } from "react";
+import { Box, Button, Flex, Heading, Icon, IconButton, Text } from "@vibe/core";
+import {
+ AISkills,
+ Board,
+ MoveArrowLeft,
+ MoveArrowRight,
+ MoveArrowUp,
+ Microphone,
+} from "@mondaydotcomorg/icons";
+import { PromptChip } from "./AppMainContent";
+import { useAgentBuilder } from "../context/AgentBuilderContext";
+import { StrokeSpotlight } from "@vibe/core";
+import { STROKE_NO_PULSE_ATTR } from "@vibe/core";
+import agentElena from "../assets/agents/elena-wide.png";
+import agentSarah from "../assets/agents/sarah-wide.png";
+import agentBrittany from "../assets/agents/brittany-wide.png";
+import styles from "./AgentsPage.module.scss";
+
+const PROMPT_CHIPS = [
+ "Customer Support",
+ "Feedback Analyzer",
+ "Strategic Market Insights",
+ "Thread Follow-up",
+] as const;
+
+const AGENT_CARDS = [
+ {
+ name: "Elena",
+ role: "Response Triage & Cohort Router",
+ description:
+ "I'll review each new submission and route it to the right cohort.",
+ boardRef: "Product Design Sprint",
+ image: agentElena,
+ },
+ {
+ name: "Sarah",
+ role: "Sprint Intake Triage Lead",
+ description:
+ "I'll turn new tasks into sprint-ready work with clear owners and next steps.",
+ boardRef: "Sprint Planning Board",
+ image: agentSarah,
+ },
+ {
+ name: "Brittany",
+ role: "Leave Status Agent",
+ description:
+ "I'll keep leave statuses updated and notify the right people.",
+ boardRef: "Team Operations",
+ image: agentBrittany,
+ },
+] as const;
+
+export function AgentsPage() {
+ const [carouselOffset, setCarouselOffset] = useState(0);
+ const visibleCards = AGENT_CARDS.slice(carouselOffset, carouselOffset + 2);
+ const { openConfig } = useAgentBuilder();
+
+ return (
+
+
+
+ Bring your agent
+
+ openConfig()}>
+ + Start from blank
+
+
+
+
+
+
+ Hey Naama
+
+
+ Hey Alex, add a teammate that gets work done for you
+
+
+
+
+
+
+
+
+
+
+ + Add context
+
+
+
+
+
+ AI model ▾
+
+
+
+
+
+
+
+
+
+ {PROMPT_CHIPS.map((chip) => (
+ {chip}
+ ))}
+
+
+
+
+
+
+
+ Agents made for you
+
+
+
+
+ setCarouselOffset((o) => Math.max(0, o - 1))}
+ />
+ = AGENT_CARDS.length}
+ onClick={() =>
+ setCarouselOffset((o) =>
+ Math.min(AGENT_CARDS.length - 2, o + 1),
+ )
+ }
+ />
+
+
+
+
+ {visibleCards.map(({ name, role, description, boardRef, image }) => (
+
+
+
+
+ {name},
+
+
+ {role}
+
+
+ {description}
+
+
+
+ Based on:
+
+
+
+ {boardRef}
+
+
+
+
+ ))}
+
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/screens/components/AppMainContent.module.scss b/apps/kitchen-sink/src/screens/components/AppMainContent.module.scss
new file mode 100644
index 0000000000..dc273f3361
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/AppMainContent.module.scss
@@ -0,0 +1,360 @@
+.productPage {
+ --app-accent: var(--primary-color);
+ --app-accent-soft: var(--primary-highlighted-color);
+
+ display: flex;
+ flex: 1 1 auto;
+ flex-direction: column;
+ gap: clamp(var(--space-16), 2vw, var(--space-32));
+ width: 100%;
+ min-height: 100%;
+ padding: clamp(var(--space-24), 4vw, var(--space-48))
+ clamp(var(--space-16), 4vw, var(--space-40));
+ color: var(--primary-text-color);
+ font-family: var(--boards-font-family);
+}
+
+.sidekick {
+ --app-accent: #6161ff;
+ --app-accent-soft: color-mix(in srgb, #6161ff 10%, transparent);
+}
+
+.agents {
+ --app-accent: #7f56d9;
+ --app-accent-soft: color-mix(in srgb, #7f56d9 12%, transparent);
+}
+
+.vibe {
+ --app-accent: #00a86b;
+ --app-accent-soft: color-mix(in srgb, #00a86b 12%, transparent);
+}
+
+.notetaker {
+ --app-accent: #0073ea;
+ --app-accent-soft: color-mix(in srgb, #0073ea 12%, transparent);
+}
+
+.utility {
+ --app-accent: var(--primary-color);
+ --app-accent-soft: var(--primary-highlighted-color);
+}
+
+.productHero {
+ display: grid;
+ grid-template-columns: auto minmax(0, 1fr) auto;
+ gap: var(--space-16);
+ align-items: flex-start;
+ padding: clamp(var(--space-20), 3vw, var(--space-32));
+ border: var(--border-width) solid var(--layout-border-color);
+ border-radius: var(--border-radius-big);
+ background:
+ radial-gradient(
+ circle at top left,
+ color-mix(in srgb, var(--app-accent) 14%, transparent),
+ transparent 30%
+ ),
+ var(--primary-background-color);
+ box-shadow: var(--box-shadow-xs);
+}
+
+.heroIcon,
+.templateIcon,
+.meetingIcon {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ flex: 0 0 auto;
+ color: var(--app-accent);
+ background: var(--app-accent-soft);
+}
+
+.heroIcon {
+ width: var(--space-48);
+ height: var(--space-48);
+ border-radius: var(--border-radius-medium);
+}
+
+.heroCopy {
+ display: flex;
+ min-width: 0;
+ flex-direction: column;
+ gap: var(--space-4);
+}
+
+.eyebrow {
+ letter-spacing: 0.04em;
+ text-transform: uppercase;
+}
+
+.heroTitle {
+ margin: 0;
+}
+
+.heroDescription {
+ max-width: 44rem;
+}
+
+.heroActions {
+ flex-wrap: wrap;
+ justify-content: flex-end;
+}
+
+.sidekickGrid,
+.builderLayout,
+.notetakerLayout {
+ display: grid;
+ grid-template-columns: minmax(0, 1.4fr) minmax(18rem, 0.6fr);
+ gap: var(--space-20);
+ align-items: start;
+}
+
+.chatPanel,
+.contextPanel,
+.builderCard,
+.cardStack,
+.myAgents,
+.vibePrompt,
+.appGallery,
+.meetingsColumn,
+.summaryColumn,
+.utilityGrid {
+ border: var(--border-width) solid var(--layout-border-color);
+ border-radius: var(--border-radius-big);
+ background: var(--primary-background-color);
+ box-shadow: var(--box-shadow-xs);
+}
+
+.chatPanel,
+.builderCard,
+.vibePrompt {
+ display: flex;
+ min-height: 28rem;
+ flex-direction: column;
+ gap: var(--space-20);
+ padding: clamp(var(--space-20), 3vw, var(--space-32));
+}
+
+.contextPanel,
+.cardStack,
+.myAgents,
+.appGallery,
+.meetingsColumn,
+.summaryColumn,
+.utilityGrid {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-12);
+ padding: var(--space-20);
+}
+
+.chatGreeting,
+.builderTitle {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-4);
+}
+
+.composer {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-12);
+ padding: var(--space-12);
+ border: var(--border-width) solid var(--ui-border-color);
+ border-radius: var(--border-radius-big);
+ background: var(--secondary-background-color);
+}
+
+.composerInput {
+ min-height: 7rem;
+ width: 100%;
+ resize: vertical;
+ border: 0;
+ outline: 0;
+ background: transparent;
+ color: var(--primary-text-color);
+ font-family: var(--boards-font-family);
+ font-size: 0.875rem;
+ line-height: 1.5;
+
+ &::placeholder {
+ color: var(--placeholder-color);
+ }
+}
+
+.composerFooter {
+ gap: var(--space-12);
+ flex-wrap: wrap;
+}
+
+.promptRow {
+ flex-wrap: wrap;
+}
+
+.promptChip {
+ min-height: var(--space-32);
+ padding: 0 var(--space-12);
+ border: var(--border-width) solid var(--ui-border-color);
+ border-radius: 999px;
+ background: var(--primary-background-color);
+ color: var(--primary-text-color);
+ cursor: pointer;
+ font-family: var(--boards-font-family);
+ font-size: 0.75rem;
+
+ &:hover,
+ &:focus-visible {
+ border-color: var(--app-accent);
+ outline: none;
+ }
+}
+
+.chatTranscript {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-12);
+ margin-top: auto;
+}
+
+.userBubble,
+.assistantBubble {
+ max-width: 42rem;
+ padding: var(--space-16);
+ border-radius: var(--border-radius-big);
+}
+
+.userBubble {
+ align-self: flex-end;
+ background: var(--app-accent);
+ color: var(--fixed-light-color);
+}
+
+.assistantBubble {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-8);
+ align-self: flex-start;
+ border: var(--border-width) solid var(--layout-border-color);
+ background: var(--primary-background-color);
+}
+
+.assistantHeader {
+ color: var(--app-accent);
+}
+
+.sectionHeader {
+ gap: var(--space-8);
+ min-height: var(--space-32);
+}
+
+.templateCard,
+.meetingCard,
+.agentRow {
+ display: flex;
+ gap: var(--space-12);
+ align-items: flex-start;
+ padding: var(--space-16);
+ border: var(--border-width) solid var(--layout-border-color);
+ border-radius: var(--border-radius-medium);
+ background: var(--primary-background-color);
+}
+
+.templateCard {
+ min-height: 6.5rem;
+}
+
+.templateIcon,
+.meetingIcon {
+ width: var(--space-40);
+ height: var(--space-40);
+ border-radius: var(--border-radius-medium);
+}
+
+.templateCopy,
+.meetingCopy {
+ display: flex;
+ min-width: 0;
+ flex: 1 1 auto;
+ flex-direction: column;
+ gap: var(--space-4);
+}
+
+.badge {
+ display: inline-flex;
+ align-items: center;
+ min-height: var(--space-20);
+ padding: 0 var(--space-8);
+ border-radius: 999px;
+ background: var(--app-accent-soft);
+ color: var(--app-accent);
+ font-size: 0.6875rem;
+ font-weight: var(--font-weight-medium);
+ line-height: 1;
+}
+
+.builderLayout {
+ grid-template-columns: minmax(0, 1.1fr) minmax(18rem, 0.7fr);
+}
+
+.agentConfigGrid,
+.galleryGrid {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: var(--space-12);
+}
+
+.myAgents {
+ grid-column: 1 / -1;
+}
+
+.agentRow {
+ align-items: center;
+}
+
+.liveDot {
+ width: var(--space-8);
+ height: var(--space-8);
+ margin-left: auto;
+ border-radius: 50%;
+ background: var(--positive-color);
+}
+
+.vibeBuilder {
+ display: grid;
+ grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr);
+ gap: var(--space-20);
+ align-items: start;
+}
+
+.vibePrompt {
+ background:
+ radial-gradient(
+ circle at 90% 0,
+ color-mix(in srgb, var(--app-accent) 16%, transparent),
+ transparent 35%
+ ),
+ var(--primary-background-color);
+}
+
+.notetakerLayout {
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
+}
+
+.meetingCard {
+ align-items: center;
+}
+
+@media (max-width: 960px) {
+ .productHero,
+ .sidekickGrid,
+ .builderLayout,
+ .vibeBuilder,
+ .notetakerLayout,
+ .agentConfigGrid,
+ .galleryGrid {
+ grid-template-columns: 1fr;
+ }
+
+ .heroActions {
+ justify-content: flex-start;
+ }
+}
diff --git a/apps/kitchen-sink/src/screens/components/AppMainContent.tsx b/apps/kitchen-sink/src/screens/components/AppMainContent.tsx
new file mode 100644
index 0000000000..76dda95d7f
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/AppMainContent.tsx
@@ -0,0 +1,321 @@
+import {
+ Avatar,
+ AvatarGroup,
+ Box,
+ Button,
+ Flex,
+ Heading,
+ Icon,
+ Text,
+} from "@vibe/core";
+import {
+ Board,
+ Doc,
+ MoveArrowUp,
+ VideoMeeting,
+ Work,
+} from "@mondaydotcomorg/icons";
+import type { RailItemId } from "./NavigationRail";
+import styles from "./AppMainContent.module.scss";
+import { SidekickPage } from "./SidekickPage";
+import { SidekickChatPage } from "./SidekickChatPage";
+import { useAgentsView } from "../context/AgentsViewContext";
+import { useSidekickView } from "../context/SidekickViewContext";
+import { AgentsPage } from "./AgentsPage";
+import { ManageAgentsPage } from "./ManageAgentsPage";
+import { VibePage } from "./VibePage";
+import { NotetakerPage } from "./NotetakerPage";
+import { HomeModesPage } from "./HomeModesPage";
+
+type ProductIcon = React.FC<{ size?: string | number; className?: string }>;
+
+interface AppMainContentProps {
+ activeRailItem: RailItemId;
+ renderWorkspace: () => React.ReactNode;
+}
+
+export interface ProductPageProps {
+ tone: "sidekick" | "agents" | "vibe" | "notetaker" | "utility";
+ eyebrow: string;
+ title: string;
+ description: string;
+ icon: ProductIcon;
+ children: React.ReactNode;
+ primaryAction?: string;
+ secondaryAction?: string;
+}
+
+export interface TemplateCardProps {
+ icon: ProductIcon;
+ title: string;
+ description: string;
+ badge?: string;
+}
+
+export interface MeetingCardProps {
+ title: string;
+ time: string;
+ detail: string;
+ status?: string;
+}
+
+export function ProductPage({
+ tone,
+ eyebrow,
+ title,
+ description,
+ icon,
+ children,
+ primaryAction,
+ secondaryAction,
+}: ProductPageProps) {
+ return (
+
+
+
+
+
+
+
+ {eyebrow}
+
+
+ {title}
+
+
+ {description}
+
+
+ {(primaryAction || secondaryAction) && (
+
+ {secondaryAction && (
+
+ {secondaryAction}
+
+ )}
+ {primaryAction && (
+
+ {primaryAction}
+
+ )}
+
+ )}
+
+ {children}
+
+ );
+}
+
+export function TemplateCard({
+ icon,
+ title,
+ description,
+ badge,
+}: TemplateCardProps) {
+ return (
+
+
+
+
+
+
+
+ {title}
+
+ {badge && {badge} }
+
+
+ {description}
+
+
+
+ );
+}
+
+export function SectionHeader({
+ title,
+ action,
+}: {
+ title: string;
+ action?: string;
+}) {
+ return (
+
+
+ {title}
+
+ {action && (
+
+ {action}
+
+ )}
+
+ );
+}
+
+export function PromptChip({ children }: { children: React.ReactNode }) {
+ return (
+
+ {children}
+
+ );
+}
+
+export function ChatComposer({
+ label,
+ placeholder,
+ actionLabel,
+}: {
+ label: string;
+ placeholder: string;
+ actionLabel: string;
+}) {
+ return (
+
+
+
+
+ Connects to boards, docs, updates, and files
+
+
+ {actionLabel}
+
+
+
+ );
+}
+
+export function MeetingCard({ title, time, detail, status }: MeetingCardProps) {
+ return (
+
+
+
+
+
+
+
+ {title}
+
+ {status && {status} }
+
+
+ {time}
+
+
+ {detail}
+
+
+
+
+
+
+
+ );
+}
+
+function UtilityPage({
+ activeRailItem,
+}: {
+ activeRailItem: Extract;
+}) {
+ const isFavorites = activeRailItem === "favorites";
+
+ return (
+
+
+ {(isFavorites
+ ? [
+ ["New icon to Vibe - request form", "Board"],
+ ["Icons catalog instructions", "Doc"],
+ ["Approved icon workflow", "Board"],
+ ]
+ : [
+ ["Dashboards", "Visualize workspace data"],
+ ["Apps marketplace", "Extend your workflow"],
+ ["Trash", "Restore deleted work"],
+ ]
+ ).map(([title, description]) => (
+
+ ))}
+
+
+ );
+}
+
+export function AppMainContent({
+ activeRailItem,
+ renderWorkspace,
+}: AppMainContentProps) {
+ const { view: agentsView } = useAgentsView();
+ const { view: sidekickView, chatId, chatTitle } = useSidekickView();
+
+ switch (activeRailItem) {
+ case "workspace":
+ return <>{renderWorkspace()}>;
+ case "home-modes":
+ return ;
+ case "sidekick":
+ if (sidekickView === "chat") {
+ return (
+
+ );
+ }
+ return ;
+ case "agents":
+ if (agentsView === "manage") {
+ return ;
+ }
+ return ;
+ case "vibe":
+ return ;
+ case "notetaker":
+ return ;
+ case "favorites":
+ case "more":
+ return ;
+ default:
+ return <>{renderWorkspace()}>;
+ }
+}
diff --git a/apps/kitchen-sink/src/screens/components/BoardGroup.module.scss b/apps/kitchen-sink/src/screens/components/BoardGroup.module.scss
new file mode 100644
index 0000000000..5144f2ca3e
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/BoardGroup.module.scss
@@ -0,0 +1,358 @@
+.groupTitle {
+ * {
+ color: currentcolor;
+ }
+}
+
+.headerRow {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ overflow: visible;
+ margin-bottom: var(--space-2);
+}
+
+.titleRow {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ overflow: visible;
+ cursor: pointer;
+ flex: 1 1 0%;
+}
+
+.completeBtn {
+ border: var(--border-width) solid var(--ui-border-color);
+}
+
+.gridHeader {
+ overflow: visible;
+ display: grid;
+ border-bottom: var(--border-width) solid var(--layout-border-color);
+ border-top: var(--border-width) solid var(--layout-border-color);
+ border-right: var(--border-width) solid var(--layout-border-color);
+ background-color: var(--secondary-background-color);
+ border-top-right-radius: var(--border-radius-small);
+}
+
+.cellCheckboxHead {
+ height: calc(var(--space-32) + var(--space-4));
+ width: 100%;
+ border-right: var(--border-width) solid var(--layout-border-color);
+ position: relative;
+ overflow: visible;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ /* Offset the left stripe so the checkbox is optically centered in the visible cell. */
+ padding-left: calc(var(--space-4) + var(--space-2));
+}
+
+.stripe {
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: calc(var(--space-4) + var(--space-2));
+ z-index: 1;
+}
+
+.stripeHeader {
+ height: calc(var(--space-32) + var(--space-8) - var(--space-2));
+ border-top-left-radius: var(--border-radius-small);
+}
+
+.colHead {
+ height: calc(var(--space-32) + var(--space-4));
+ border-right: var(--border-width) solid var(--layout-border-color);
+ position: relative;
+}
+
+.colHeadTask {
+ padding-left: var(--space-8);
+}
+
+.colHeadAdd {
+ color: var(--secondary-text-color);
+}
+
+.row {
+ overflow: visible;
+ display: grid;
+ border-bottom: var(--border-width) solid var(--layout-border-color);
+ border-right: var(--border-width) solid var(--layout-border-color);
+ background-color: var(--secondary-background-color);
+
+ &:hover {
+ background-color: var(--primary-background-hover-color);
+
+ .cellCheckbox,
+ .stripeRow {
+ background-color: var(--primary-background-hover-color);
+ }
+
+ .taskActions {
+ opacity: 1;
+ }
+ }
+
+ .cellCheckbox,
+ .stripeRow {
+ background-color: var(--secondary-background-color);
+ }
+}
+
+.cellCheckbox {
+ height: calc(var(--space-32) + var(--space-8) - var(--space-2));
+ width: 100%;
+ border-right: var(--border-width) solid var(--layout-border-color);
+ position: relative;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ /* Offset the left stripe so the checkbox is optically centered in the visible cell. */
+ padding-left: calc(var(--space-4) + var(--space-2));
+}
+
+.stripeRow {
+ position: absolute;
+ left: 0;
+ top: 0;
+ height: calc(100% + var(--border-width));
+ width: calc(var(--space-4) + var(--space-2));
+ z-index: 1;
+}
+
+.cellTask {
+ height: calc(var(--space-32) + var(--space-8) - var(--space-2));
+ padding-left: var(--space-16);
+ padding-right: 0;
+ border-right: var(--border-width) solid var(--layout-border-color);
+ overflow: visible;
+}
+
+.taskActions {
+ opacity: 0;
+ transition: opacity var(--motion-productive-medium)
+ var(--motion-timing-transition);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: calc(var(--space-48) + var(--space-8));
+ height: 100%;
+ border-left: var(--border-width) solid var(--layout-border-color);
+}
+
+.taskActionsIcon {
+ color: var(--secondary-text-color);
+ flex-shrink: 0;
+}
+
+.ownerStack {
+ display: inline-flex;
+ align-items: center;
+ flex-direction: row;
+ isolation: isolate;
+}
+
+.ownerStackItem {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ position: relative;
+}
+
+.ownerStackItem + .ownerStackItem {
+ margin-inline-start: -8px;
+}
+
+.unassignedAvatar {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 28px;
+ height: 28px;
+ border-radius: 50%;
+ background-color: var(
+ --primary-background-hover-color,
+ rgba(103, 104, 121, 0.1)
+ );
+ color: var(--secondary-text-color);
+ flex-shrink: 0;
+}
+
+.cellStandard {
+ display: flex;
+ align-items: stretch;
+ height: calc(var(--space-32) + var(--space-8) - var(--space-2));
+ border-right: var(--border-width) solid var(--layout-border-color);
+}
+
+.cellEmpty {
+ height: calc(var(--space-32) + var(--space-8) - var(--space-2));
+}
+
+.addRow {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ height: calc(var(--space-32) + var(--space-4));
+ background-color: var(--secondary-background-color);
+ border-bottom: var(--border-width) solid var(--layout-border-color);
+ border-right: var(--border-width) solid var(--layout-border-color);
+ position: relative;
+}
+
+.addRowCheck {
+ height: calc(var(--space-32) + var(--space-4));
+ /* Fixed 50px = the grid checkbox column; .addRow is flex, so it must not grow. */
+ width: calc(var(--space-48) + var(--space-2));
+ flex: 0 0 auto;
+ border-right: var(--border-width) solid var(--layout-border-color);
+ position: relative;
+ overflow: visible;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ /* Offset the left stripe for optical centering, matching the data-row checkbox. */
+ padding-left: calc(var(--space-4) + var(--space-2));
+}
+
+.addRowCheck :global([class*="checkbox"]) {
+ opacity: var(--disabled-component-opacity);
+}
+
+.stripeAdd {
+ position: absolute;
+ left: 0;
+ top: 0;
+ bottom: 0;
+ width: calc(var(--space-4) + var(--space-2));
+ z-index: 1;
+ border-bottom-left-radius: var(--border-radius-small);
+}
+
+.addItem {
+ display: flex;
+ opacity: var(--disabled-component-opacity);
+ flex: 1 1 0%;
+ padding-left: var(--space-24);
+ align-items: center;
+ gap: var(--space-8);
+ cursor: pointer;
+ padding-top: var(--space-4);
+ padding-bottom: var(--space-4);
+ padding-right: var(--space-8);
+ border-radius: var(--border-radius-small);
+
+ &:hover {
+ background-color: var(--primary-background-hover-color);
+ }
+}
+
+.footerSpacer {
+ display: grid;
+ height: calc(var(--space-32) + var(--space-4));
+}
+
+.footerSpacerInner {
+ grid-column: 1 / 3;
+}
+
+.footer {
+ display: grid;
+ background-color: var(--secondary-background-color);
+ border: var(--border-width) solid var(--layout-border-color);
+ border-top: 0;
+ border-bottom-left-radius: var(--border-radius-medium);
+ box-shadow: var(--box-shadow-small);
+}
+
+.footerCell {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ border-right: var(--border-width) solid var(--layout-border-color);
+}
+
+.footerCellPadded {
+ padding-left: var(--space-8);
+ padding-right: var(--space-8);
+}
+
+.barTrack {
+ display: flex;
+ flex-direction: row;
+ height: var(--space-24);
+ width: 100%;
+ border-radius: 0;
+ overflow: hidden;
+}
+
+.barSeg {
+ height: 100%;
+}
+
+.barSeg30 {
+ width: 30%;
+}
+
+.barSeg40 {
+ width: 40%;
+}
+
+.barSeg50 {
+ width: 50%;
+}
+
+.barSeg20 {
+ width: 20%;
+}
+
+.barSegColorDone {
+ background-color: var(--color-done-green);
+}
+
+.barSegColorWorking {
+ background-color: var(--color-working_orange);
+}
+
+.barSegColorStuck {
+ background-color: var(--color-stuck-red);
+}
+
+.barSegColorDarkBlue {
+ background-color: var(--color-dark-blue);
+}
+
+.barSegColorPurple {
+ background-color: var(--color-purple);
+}
+
+.barSegColorGray {
+ background-color: var(--color-american_gray);
+}
+
+.resizeHandle {
+ position: absolute;
+ right: calc(-1 * var(--space-4));
+ top: 0;
+ bottom: 0;
+ width: calc(var(--space-8) + var(--border-width));
+ cursor: col-resize;
+ z-index: 10;
+ opacity: 0;
+ transition: opacity var(--motion-productive-medium)
+ var(--motion-timing-transition);
+
+ &:hover {
+ opacity: 1;
+ }
+}
+
+.resizeHandleLine {
+ width: var(--border-width);
+ height: 100%;
+ background-color: var(--primary-color);
+ margin-left: auto;
+ margin-right: auto;
+}
diff --git a/apps/kitchen-sink/src/screens/components/BoardGroup.tsx b/apps/kitchen-sink/src/screens/components/BoardGroup.tsx
new file mode 100644
index 0000000000..d41894441f
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/BoardGroup.tsx
@@ -0,0 +1,330 @@
+import { useState } from "react";
+import {
+ Box,
+ Flex,
+ EditableHeading,
+ Text,
+ IconButton,
+ EditableText,
+ Avatar,
+ Icon,
+ Checkbox,
+} from "@vibe/core";
+import {
+ DropdownChevronDown,
+ DropdownChevronRight,
+ Add,
+ AddUpdate,
+ Person,
+} from "@mondaydotcomorg/icons";
+import { boardGridTemplateColumns } from "@/board/gridTemplate";
+import { useDocumentColumnResize } from "@/hooks/useDocumentColumnResize";
+import { BoardGroupDevToolbar } from "./BoardGroupDevToolbar";
+import { BoardGroupFooter } from "./BoardGroupFooter";
+import { Group, ColumnWidths, Item } from "./types";
+import { StatusCell } from "./StatusCell";
+import { GlassAgentTile } from "./GlassAgentTile";
+import type { ConfigProductName } from "../productConfig";
+import styles from "./BoardGroup.module.scss";
+
+interface BoardGroupProps {
+ group: Group;
+ columnWidths: ColumnWidths;
+ product: ConfigProductName;
+ onColumnResize: (columnId: keyof ColumnWidths, newWidth: number) => void;
+ onOpenItem?: (item: Item) => void;
+}
+
+const ResizeHandle = ({
+ onResizeStart,
+}: {
+ onResizeStart: (e: React.MouseEvent) => void;
+}) => (
+
+);
+
+export const BoardGroup: React.FC = ({
+ group,
+ columnWidths,
+ onColumnResize,
+ product,
+ onOpenItem,
+}) => {
+ const [isCollapsed, setIsCollapsed] = useState(false);
+ const [selectedItemIds, setSelectedItemIds] = useState([]);
+
+ const gridTemplate = boardGridTemplateColumns(columnWidths);
+ const startResize = useDocumentColumnResize(columnWidths, onColumnResize);
+
+ const allSelected =
+ group.items.length > 0 && selectedItemIds.length === group.items.length;
+ const isIndeterminate =
+ selectedItemIds.length > 0 && selectedItemIds.length < group.items.length;
+
+ const handleHeaderCheckboxChange = () => {
+ if (allSelected) {
+ setSelectedItemIds([]);
+ } else {
+ setSelectedItemIds(group.items.map((item) => item.id));
+ }
+ };
+
+ const handleItemCheckboxChange = (itemId: string) => {
+ if (selectedItemIds.includes(itemId)) {
+ setSelectedItemIds(selectedItemIds.filter((id) => id !== itemId));
+ } else {
+ setSelectedItemIds([...selectedItemIds, itemId]);
+ }
+ };
+
+ return (
+
+
+
+ setIsCollapsed(!isCollapsed)}
+ icon={isCollapsed ? DropdownChevronRight : DropdownChevronDown}
+ />
+
+
+
+ {product === "dev" && }
+
+
+ {!isCollapsed && (
+
+
+
+
+
+
+
+
+
+ Task
+
+
+
+
+
+
+ Owner
+
+
+
+
+
+
+ Status
+
+
+
+
+
+
+ Priority
+
+
+
+
+
+
+ ETA
+
+
+
+
+
+
+
+
+
+ {group.items.map((item) => (
+
+
+
+ handleItemCheckboxChange(item.id)}
+ aria-label={`Select ${item.name}`}
+ />
+
+
+
+
+ onOpenItem?.(item)}
+ role={onOpenItem ? "button" : undefined}
+ tabIndex={onOpenItem ? 0 : undefined}
+ aria-label={onOpenItem ? `Open ${item.name}` : undefined}
+ onKeyDown={(e: React.KeyboardEvent) => {
+ if (onOpenItem && (e.key === "Enter" || e.key === " ")) {
+ e.preventDefault();
+ onOpenItem(item);
+ }
+ }}
+ >
+
+
+
+
+
+
+ {item.agents?.map((variant, idx) => (
+
+
+
+ ))}
+ {item.person ? (
+
+
+
+ ) : (
+
+
+
+
+
+ )}
+
+
+
+
+
+
+
+
+
+
+
+
+ {item.date}
+
+
+
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )}
+
+ );
+};
diff --git a/apps/kitchen-sink/src/screens/components/BoardGroupDevToolbar.module.scss b/apps/kitchen-sink/src/screens/components/BoardGroupDevToolbar.module.scss
new file mode 100644
index 0000000000..d018c87099
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/BoardGroupDevToolbar.module.scss
@@ -0,0 +1,21 @@
+/* Sprint “active” pill — sizes from spacing scale (was ad-hoc px in Figma). */
+.sprintStatusOuter {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: calc(var(--space-12) + var(--space-2));
+ height: var(--space-12);
+ border-radius: calc(var(--space-16) + var(--space-4));
+ background-color: color-mix(
+ in srgb,
+ var(--color-done-green) 30%,
+ transparent
+ );
+}
+
+.sprintStatusInner {
+ width: calc(var(--space-4) + var(--space-2));
+ height: calc(var(--space-4) + var(--space-2));
+ border-radius: var(--space-8);
+ background-color: var(--color-done-green);
+}
diff --git a/apps/kitchen-sink/src/screens/components/BoardGroupDevToolbar.tsx b/apps/kitchen-sink/src/screens/components/BoardGroupDevToolbar.tsx
new file mode 100644
index 0000000000..be5a4526ca
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/BoardGroupDevToolbar.tsx
@@ -0,0 +1,44 @@
+import { Box, Flex, Text, IconButton, Button } from "@vibe/core";
+import { Menu, Update } from "@mondaydotcomorg/icons";
+import boardStyles from "./BoardGroup.module.scss";
+import styles from "./BoardGroupDevToolbar.module.scss";
+
+/** Sprint-style group affordances shown only for the `dev` product theme. */
+export function BoardGroupDevToolbar() {
+ return (
+
+
+
+
+
+
+ Jan 5 - 19
+
+
+
+
+ Capacity
+
+
+
+ Daily standup
+
+
+
+ Complete
+
+
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/screens/components/BoardGroupFooter.tsx b/apps/kitchen-sink/src/screens/components/BoardGroupFooter.tsx
new file mode 100644
index 0000000000..5944d42a8d
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/BoardGroupFooter.tsx
@@ -0,0 +1,110 @@
+import { Box, Flex, AvatarGroup, Avatar } from "@vibe/core";
+import type { ColumnWidths } from "./types";
+import { boardFooterDataColumnsTemplate } from "@/board/gridTemplate";
+import styles from "./BoardGroup.module.scss";
+
+interface BoardGroupFooterProps {
+ gridTemplate: string;
+ columnWidths: ColumnWidths;
+}
+
+export function BoardGroupFooter({
+ gridTemplate,
+ columnWidths,
+}: BoardGroupFooterProps) {
+ const footerDataColumns = boardFooterDataColumnsTemplate(columnWidths);
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/screens/components/BoardHeader.module.scss b/apps/kitchen-sink/src/screens/components/BoardHeader.module.scss
new file mode 100644
index 0000000000..f753545c90
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/BoardHeader.module.scss
@@ -0,0 +1,32 @@
+.root {
+ overflow: visible;
+ background-color: var(--primary-background-color);
+ padding-top: calc(var(--space-16) + var(--space-2));
+}
+
+.titleRow {
+ overflow: visible;
+ margin-bottom: var(--space-12);
+}
+
+.cluster {
+ overflow: visible;
+}
+
+.dividerShort {
+ height: calc(var(--space-16) + var(--space-4));
+ margin-left: var(--space-4);
+ margin-right: var(--space-4);
+}
+
+.dividerTall {
+ height: var(--space-24);
+}
+
+/* MenuButton merges fixed 32×32 wrapper classes onto custom triggers — reset so
+ the secondary Button hugs its label again. */
+.vibeAppMenuIcon {
+ display: block;
+ flex-shrink: 0;
+ object-fit: contain;
+}
diff --git a/apps/kitchen-sink/src/screens/components/BoardHeader.tsx b/apps/kitchen-sink/src/screens/components/BoardHeader.tsx
new file mode 100644
index 0000000000..27623292dd
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/BoardHeader.tsx
@@ -0,0 +1,172 @@
+import { useState } from "react";
+import styles from "./BoardHeader.module.scss";
+import { InviteBoardModal } from "./InviteBoardModal";
+import {
+ Box,
+ Flex,
+ Button,
+ IconButton,
+ AvatarGroup,
+ Avatar,
+ EditableHeading,
+ SplitButton,
+ MenuItem,
+ Menu as VibeMenu,
+ MenuButton,
+ MenuDivider,
+ Divider
+} from "@vibe/core";
+import {
+ Add,
+ DropdownChevronDown,
+ Edit,
+ Robot,
+ API,
+ Search,
+ Person,
+ Filter,
+ Sort,
+ Hide,
+ Group,
+ Menu
+} from "@mondaydotcomorg/icons";
+import { DEMO_AVATAR_1, DEMO_AVATAR_2 } from "@/demo/demoPeople";
+import { BOARD_VIEWS, isVibeAppView, type BoardViewId } from "../board/boardViews";
+
+interface BoardHeaderProps {
+ activeViewId: BoardViewId;
+ onViewChange: (viewId: BoardViewId) => void;
+ onNewItem?: () => void;
+}
+
+export const BoardHeader: React.FC = ({ activeViewId, onViewChange, onNewItem }) => {
+ const activeView = BOARD_VIEWS.find(view => view.id === activeViewId) ?? BOARD_VIEWS[0];
+ const triggerIcon = activeView.icon;
+ const [inviteOpen, setInviteOpen] = useState(false);
+
+ return (
+
+ {/* Top Row: Title and Top Actions */}
+
+ {/* Title Area */}
+
+
+
+
+
+ {/* Top Right Actions */}
+
+
+ Integrate
+
+
+ Automate
+
+
+
+
+
+
+
+
+
+
+ setInviteOpen(true)}>
+ Invite / 1
+
+
+
+
+
+ {/* Bottom Row: Toolbar */}
+
+
+ {/* Main Table View Dropdown */}
+
+
+ {isVibeAppView(activeViewId) ? (
+ <>
+
+ Publish
+
+
+ Edit
+
+ >
+ ) : (
+ <>
+
+
+
+
+
+ }
+ >
+ New Item
+
+
+
+ Search
+
+
+ Person
+
+
+ Filter
+
+
+ Sort
+
+
+ Hide
+
+
+ Group By
+
+
+ >
+ )}
+
+
+ {/* Collapse Chevron */}
+
+
+ setInviteOpen(false)} />
+
+ );
+};
diff --git a/apps/kitchen-sink/src/screens/components/ChipsNav.module.scss b/apps/kitchen-sink/src/screens/components/ChipsNav.module.scss
new file mode 100644
index 0000000000..dfb08f06d8
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/ChipsNav.module.scss
@@ -0,0 +1,128 @@
+.nav {
+ position: relative;
+ flex: 1 1 0;
+ min-width: 0;
+ height: 32px;
+ overflow: hidden;
+}
+
+.scroller {
+ display: flex;
+ align-items: center;
+ gap: var(--space-8);
+ height: 100%;
+ overflow-x: auto;
+ overflow-y: hidden;
+ scroll-snap-type: x mandatory;
+ -webkit-overflow-scrolling: touch;
+ scrollbar-width: none;
+ -ms-overflow-style: none;
+
+ &::-webkit-scrollbar {
+ display: none;
+ }
+
+ > * {
+ scroll-snap-align: start;
+ flex-shrink: 0;
+ }
+}
+
+@media (hover: hover) {
+ .navControl {
+ opacity: 0;
+ transition: opacity var(--motion-productive-short, 0.1s) ease;
+ }
+
+ .arrowSlot.navControl {
+ pointer-events: none;
+ }
+
+ .nav:hover .navControl,
+ .nav:focus-within .navControl {
+ opacity: 1;
+ }
+
+ .nav:hover .arrowSlot.navControl,
+ .nav:focus-within .arrowSlot.navControl {
+ pointer-events: auto;
+ }
+}
+
+.edgeFade {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ width: 72px;
+ pointer-events: none;
+ z-index: 1;
+}
+
+.edgeFadeLeft {
+ left: 0;
+ background: linear-gradient(
+ to right,
+ var(--primary-background-color),
+ transparent
+ );
+}
+
+.edgeFadeRight {
+ right: 0;
+ background: linear-gradient(
+ to left,
+ var(--primary-background-color),
+ transparent
+ );
+}
+
+[dir="rtl"] .edgeFadeLeft {
+ left: auto;
+ right: 0;
+ background: linear-gradient(
+ to left,
+ var(--primary-background-color),
+ transparent
+ );
+}
+
+[dir="rtl"] .edgeFadeRight {
+ right: auto;
+ left: 0;
+ background: linear-gradient(
+ to right,
+ var(--primary-background-color),
+ transparent
+ );
+}
+
+.arrowSlot {
+ position: absolute;
+ top: 50%;
+ z-index: 2;
+ display: flex;
+ transform: translateY(-50%);
+}
+
+.arrowSlotLeft {
+ left: var(--space-4);
+}
+
+.arrowSlotRight {
+ right: var(--space-4);
+}
+
+[dir="rtl"] .arrowSlotLeft {
+ left: auto;
+ right: var(--space-4);
+}
+
+[dir="rtl"] .arrowSlotRight {
+ right: auto;
+ left: var(--space-4);
+}
+
+.arrowButton {
+ background-color: var(--primary-background-color) !important;
+ box-shadow: none !important;
+}
diff --git a/apps/kitchen-sink/src/screens/components/ChipsNav.tsx b/apps/kitchen-sink/src/screens/components/ChipsNav.tsx
new file mode 100644
index 0000000000..92f2aa1e05
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/ChipsNav.tsx
@@ -0,0 +1,163 @@
+import {
+ useCallback,
+ useEffect,
+ useRef,
+ useState,
+ type ReactNode,
+} from "react";
+import { IconButton, Tooltip } from "@vibe/core";
+import {
+ DropdownChevronLeft,
+ DropdownChevronRight,
+} from "@mondaydotcomorg/icons";
+import styles from "./ChipsNav.module.scss";
+
+const SCROLL_EDGE_TOLERANCE_PX = 1;
+
+const cx = (...classes: (string | false | undefined)[]) =>
+ classes.filter(Boolean).join(" ");
+
+interface ChipsNavProps {
+ children: ReactNode;
+ className?: string;
+}
+
+// Ported from the mini-home redesign's components/chips-nav/ChipsNav.tsx:
+// a horizontal scroller with edge fades and hover-revealed prev/next arrows
+// that step one chip at a time.
+export function ChipsNav({ children, className }: ChipsNavProps) {
+ const containerRef = useRef(null);
+ const scrollerRef = useRef(null);
+ const [showLeft, setShowLeft] = useState(false);
+ const [showRight, setShowRight] = useState(false);
+
+ const updateArrowVisibility = useCallback(() => {
+ const scroller = scrollerRef.current;
+ if (!scroller) return;
+
+ const { scrollLeft, clientWidth, scrollWidth } = scroller;
+ setShowLeft(scrollLeft > SCROLL_EDGE_TOLERANCE_PX);
+ setShowRight(
+ scrollLeft + clientWidth < scrollWidth - SCROLL_EDGE_TOLERANCE_PX,
+ );
+ }, []);
+
+ const scrollByOneChip = useCallback((direction: "left" | "right") => {
+ const scroller = scrollerRef.current;
+ if (!scroller) return;
+
+ const chips = [...scroller.querySelectorAll("[data-chip]")];
+ if (chips.length === 0) return;
+
+ const { scrollLeft } = scroller;
+ let activeIndex = 0;
+ for (let i = 0; i < chips.length; i++) {
+ if (chips[i].offsetLeft <= scrollLeft + SCROLL_EDGE_TOLERANCE_PX) {
+ activeIndex = i;
+ }
+ }
+
+ const targetIndex =
+ direction === "right"
+ ? Math.min(activeIndex + 1, chips.length - 1)
+ : Math.max(activeIndex - 1, 0);
+ if (targetIndex === activeIndex) return;
+
+ scroller.scrollTo({
+ left: chips[targetIndex].offsetLeft,
+ behavior: "smooth",
+ });
+ }, []);
+
+ useEffect(() => {
+ const scroller = scrollerRef.current;
+ const container = containerRef.current;
+ if (!scroller) return;
+
+ updateArrowVisibility();
+ scroller.addEventListener("scroll", updateArrowVisibility, {
+ passive: true,
+ });
+
+ const resizeObserver = container
+ ? new ResizeObserver(() => updateArrowVisibility())
+ : null;
+ if (container && resizeObserver) {
+ resizeObserver.observe(container);
+ }
+
+ return () => {
+ scroller.removeEventListener("scroll", updateArrowVisibility);
+ resizeObserver?.disconnect();
+ };
+ }, [updateArrowVisibility]);
+
+ useEffect(() => {
+ const frameId = requestAnimationFrame(updateArrowVisibility);
+ return () => cancelAnimationFrame(frameId);
+ }, [children, updateArrowVisibility]);
+
+ return (
+
+
+ {children}
+
+ {showLeft && (
+ <>
+
+
+
+ scrollByOneChip("left")}
+ />
+
+
+ >
+ )}
+ {showRight && (
+ <>
+
+
+
+ scrollByOneChip("right")}
+ />
+
+
+ >
+ )}
+
+ );
+}
diff --git a/apps/kitchen-sink/src/screens/components/FaceliftDocPage.module.scss b/apps/kitchen-sink/src/screens/components/FaceliftDocPage.module.scss
new file mode 100644
index 0000000000..49317ef8dd
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/FaceliftDocPage.module.scss
@@ -0,0 +1,226 @@
+.docPage {
+ display: flex;
+ flex: 0 0 auto;
+ flex-direction: column;
+ min-height: 100%;
+ width: 100%;
+ // The doc page lives inside .pageScroll which has padding-bottom that creates
+ // empty space below the doc. Negate it so the white surface fills all the way down.
+ margin-bottom: calc(-1 * clamp(var(--space-16), 4vw, var(--space-32)));
+ background: var(--primary-background-color);
+ color: var(--primary-text-color);
+ font-family: var(--boards-font-family);
+}
+
+// The page surface lives inside .pageScroll which has horizontal padding.
+// Pull the toolbar out with negative margins so its bottom border stretches
+// edge-to-edge of the work surface.
+.toolbarBar {
+ position: sticky;
+ top: 0;
+ z-index: 2;
+ display: flex;
+ align-items: center;
+ flex-shrink: 0;
+ min-height: var(--space-48);
+ width: auto;
+ margin-left: calc(
+ -1 * clamp(var(--space-8), 5vw, calc(var(--space-24) + var(--space-12)))
+ );
+ margin-right: calc(-1 * clamp(var(--space-4), 2vw, var(--space-12)));
+ padding: var(--space-8) clamp(var(--space-16), 4vw, var(--space-40));
+ background: var(--primary-background-color);
+ border-bottom: var(--border-width) solid var(--layout-border-color);
+}
+
+.toolbar {
+ width: 100%;
+ flex-wrap: wrap;
+ row-gap: var(--space-4);
+
+ // Vibe IconButton and tertiary Button paint with --primary-text-color by
+ // default. The doc toolbar's icons should follow the theme's --icon-color
+ // token so they swap with the rest of the icons in the app.
+ button[aria-label] svg,
+ :global([class*="kindTertiary"]) svg {
+ color: var(--icon-color);
+ fill: currentColor;
+ }
+
+ // Primary Add — match app primary hover (see LeftPaneContent utilityPrimaryAction).
+ // Icon color is preserved globally for kindPrimary; only background shifts here.
+ :global([class*="kindPrimary"]) {
+ color: var(--text-color-on-primary);
+
+ &:hover,
+ &:focus-visible {
+ background-color: var(--primary-hover-color);
+ color: var(--text-color-on-primary);
+ }
+ }
+}
+
+.dividerTall {
+ height: var(--space-20);
+ align-self: center;
+ background: var(--ui-border-color);
+}
+
+.docScroll {
+ flex: 0 0 auto;
+ width: 100%;
+ padding: clamp(var(--space-24), 4vw, var(--space-48))
+ clamp(var(--space-16), 4vw, var(--space-40));
+}
+
+.docSurface {
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ max-width: 880px;
+ gap: var(--space-24);
+}
+
+.docHeader {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-12);
+ padding-bottom: var(--space-12);
+}
+
+.docTitleRow {
+ width: 100%;
+}
+
+.docTitle {
+ font-family: var(--title-font-family);
+ font-size: clamp(32px, 3vw, 44px);
+ line-height: 1.15;
+ letter-spacing: -0.01em;
+ margin: 0;
+}
+
+.docTitleFav {
+ color: var(--secondary-text-color);
+}
+
+.metaRow {
+ row-gap: var(--space-8);
+ color: var(--secondary-text-color);
+}
+
+.metaIcon {
+ color: var(--secondary-text-color);
+}
+
+.metaSeparator {
+ width: 1px;
+ height: var(--space-16);
+ background: var(--layout-border-color);
+}
+
+.docBody {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-16);
+}
+
+.h1 {
+ margin: var(--space-24) 0 var(--space-4);
+ font-family: var(--title-font-family);
+ font-size: clamp(26px, 2.4vw, 34px);
+ line-height: 1.2;
+ letter-spacing: -0.005em;
+}
+
+.h2 {
+ margin: var(--space-24) 0 var(--space-4);
+ font-family: var(--title-font-family);
+ font-size: clamp(22px, 2vw, 28px);
+ line-height: 1.25;
+}
+
+.h3 {
+ margin: var(--space-16) 0 var(--space-4);
+ font-family: var(--title-font-family);
+ font-size: clamp(18px, 1.6vw, 22px);
+ line-height: 1.3;
+ font-weight: var(--font-weight-medium);
+}
+
+.h3Muted {
+ color: var(--secondary-text-color);
+ font-weight: var(--font-weight-normal);
+}
+
+.muted {
+ color: var(--secondary-text-color);
+ font-weight: var(--font-weight-normal);
+}
+
+.teamTitle {
+ font-weight: var(--font-weight-bold);
+}
+
+.paragraph {
+ margin: 0;
+ font-size: var(--font-size-text1, 16px);
+ line-height: 1.6;
+ color: var(--primary-text-color);
+}
+
+.bold {
+ font-weight: var(--font-weight-bold);
+ color: var(--primary-text-color);
+}
+
+.italic {
+ font-style: italic;
+}
+
+.link {
+ color: var(--link-color, var(--primary-color));
+ text-decoration: underline;
+ text-underline-offset: 2px;
+
+ &:hover {
+ text-decoration-thickness: 2px;
+ }
+}
+
+.teamBlock {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-8);
+ padding: var(--space-8) 0;
+}
+
+.bulletList {
+ margin: 0;
+ padding-left: var(--space-24);
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-8);
+ list-style: disc;
+ color: var(--primary-text-color);
+}
+
+.bulletListSub {
+ margin-top: var(--space-8);
+ list-style: circle;
+}
+
+.bulletItem {
+ font-size: var(--font-size-text1, 16px);
+ line-height: 1.6;
+}
+
+.docEndSpacer {
+ display: flex;
+ align-items: center;
+ justify-content: flex-start;
+ margin-top: var(--space-32);
+ padding: var(--space-12) 0;
+ color: var(--secondary-text-color);
+ border-top: var(--border-width) solid var(--layout-border-color);
+}
diff --git a/apps/kitchen-sink/src/screens/components/FaceliftDocPage.tsx b/apps/kitchen-sink/src/screens/components/FaceliftDocPage.tsx
new file mode 100644
index 0000000000..c103fb842f
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/FaceliftDocPage.tsx
@@ -0,0 +1,499 @@
+import type { ReactNode } from "react";
+import {
+ Box,
+ Flex,
+ Heading,
+ Text,
+ Avatar,
+ Icon,
+ IconButton,
+ Button,
+ Divider,
+ Tooltip,
+} from "@vibe/core";
+import {
+ Add,
+ AlignLeft,
+ Bold,
+ Bullet,
+ Check,
+ Doc,
+ DropdownChevronDown,
+ Favorite,
+ Link,
+ Mention,
+ MondayVibeLogo,
+ Numbers,
+ Redo,
+ Time,
+ Undo,
+} from "@mondaydotcomorg/icons";
+import styles from "./FaceliftDocPage.module.scss";
+
+function FaceliftDocToolbar() {
+ return (
+
+
+ Add
+
+
+
+
+
+
+
+ H1 Large title
+
+
+
+
+
+
+
+
+
+
+
+
+ Style
+
+
+
+
+
+
+
+
+ );
+}
+
+function DocMetaRow() {
+ return (
+
+
+
+
+ Creator{" "}
+
+ Itamar Ben Shushan
+
+
+
+
+
+
+
+ Created{" "}
+
+ Aug 01, 2025, 17:39
+
+
+
+
+
+
+
+ Last updated{" "}
+
+ Jan 14, 2026, 17:26
+
+
+
+
+ );
+}
+
+function Paragraph({ children }: { children: ReactNode }) {
+ return (
+
+ {children}
+
+ );
+}
+
+function B({ children }: { children: ReactNode }) {
+ return {children} ;
+}
+
+function I({ children }: { children: ReactNode }) {
+ return {children} ;
+}
+
+function LinkInline({
+ children,
+ href = "#",
+}: {
+ children: ReactNode;
+ href?: string;
+}) {
+ return (
+
+ {children}
+
+ );
+}
+
+function H1({ children, id }: { children: ReactNode; id?: string }) {
+ return (
+
+ {children}
+
+ );
+}
+
+function H2({ children, id }: { children: ReactNode; id?: string }) {
+ return (
+
+ {children}
+
+ );
+}
+
+function H3({ children, muted }: { children: ReactNode; muted?: ReactNode }) {
+ return (
+
+ {children}
+ {muted && {muted} }
+
+ );
+}
+
+function TeamBlock({
+ letter,
+ title,
+ formerly,
+ oneLiner,
+ description,
+ land,
+}: {
+ letter: string;
+ title: string;
+ formerly: string;
+ oneLiner: ReactNode;
+ description: ReactNode;
+ land: string;
+}) {
+ return (
+
+ (Formerly {formerly})}>
+ Team {letter}: {title}
+
+
+ One-Liner: {oneLiner}
+
+
+ Description: {description}
+
+
+ Land: {" "}
+
+ {land}
+
+
+
+ );
+}
+
+function BulletList({ children }: { children: ReactNode }) {
+ return ;
+}
+
+function SubBulletList({ children }: { children: ReactNode }) {
+ return (
+
+ );
+}
+
+function LI({ children }: { children: ReactNode }) {
+ return {children} ;
+}
+
+export function FaceliftDocPage() {
+ return (
+
+
+
+
+
+
+
+
+
+
+ New group plan
+
+
+
+
+
+
+
+
+
+
+ The{" "}
+
+ “Connective Tissue”
+ {" "}
+ Group
+
+
+
+ We create the foundational layer that unites teams and empowers
+ seamless collaboration across the entire platform.
+
+
+
+ Purpose: Our mission is to transform how teams work
+ together by building the foundational collaborative layers that
+ run across every monday.com product. We
+ create a system that provides the right context and an actionable
+ experience, empowering teams to operate as one. Our goal is to
+ make multi‑product collaboration feel intuitive, giving every user
+ a clear path to their next step.
+
+
+ Team structure
+
+
+ Our mission is to build the core foundation for true
+ collaboration.
+
+
+
+ We've chosen five verbs to define our teams because they
+ represent the essential actions our users take every day. These
+ verbs: Harmonize, Communicate, Scale, Discover, and{" "}
+ Curate are not just team names; they are the fundamental
+ behaviors that connect people and content.
+
+
+
+ This team builds the essential structure for collaboration
+ through workspaces and folders . We ensure teams have a
+ unified environment to work from, making it easy to organize
+ content, see the bigger picture, and stay aligned. Our work is
+ the connective tissue that holds everything in a project
+ together.
+ >
+ }
+ land="Workspace page, Folders, Home, LP, Topbar"
+ />
+
+
+ This team is the central hub for all communication. We empower
+ users to collaborate seamlessly through{" "}
+ notifications and mentions . By providing a rich
+ conversation feed, we ensure every team member is always in
+ the loop, facilitating the meaningful conversations that drive
+ projects forward.
+ >
+ }
+ land="Notification, mentions, Updates"
+ />
+
+
+ This team builds the core tools for defining and distributing
+ processes across an organization. Whether you're a small
+ team needing a starting point or a large enterprise scaling
+ operations, our templates ensure consistency and
+ provide top-level visibility. We make it easy to manage work
+ as you grow.
+ >
+ }
+ land="Temple center, temples, managed temple"
+ />
+
+
+ This team is redefining the search experience to be more than
+ just a query tool. Our focus is on{" "}
+ actionable, intelligent search that helps you not only
+ find content but also discover relevant insights. By
+ leveraging AI, we guide you to the most valuable information
+ at the right moment.
+ >
+ }
+ land="Search, Discover surfaces, AI suggestions"
+ />
+
+ Group goals and KR's
+
+
+ Goal 1: Drive Deeper Collaboration and Increase User Retention
+
+
+
+ Objective: To build the core capabilities that transform
+ individual work into powerful team collaboration. Our goal is to
+ make the platform so effective and valuable for all teams—
+ regardless of size—that it becomes an indispensable part of how
+ they work, leading to higher engagement and retention.
+
+
+
+ Possible KR's: {" "}
+
+ (its shitty now)
+
+
+
+
+ Increase Team collaboration: Achieve a x% increase {" "}
+ in the average number of collaborative actions per user per month
+ (e.g., mentions, comments, reactions). This directly measures the
+ value of your team's communication tools.
+
+
+
+ Boost Collaborative Surface Adoption: Grow the number of
+ users who actively participate in shared spaces (e.g., creating
+ and interacting with content in workspaces or folders) by{" "}
+ x% within the next two quarters. This measures how well
+ your tools are helping teams organize and align.
+
+
+
+ Improve Feature-Driven Retention: Increase the 90-day
+ retention rate of users who frequently engage with our
+ group's core features by x% . This is a powerful signal
+ that our work creates long-term value, making the product
+ "stickier."
+
+
+ Drive Contextual and Personalized Communication
+
+
+ Goal: Elevate communication from simple alerts to
+ an intelligent feed by using advanced discovery logic to
+ provide a personalized and prioritized experience for
+ every user.
+
+
+ Teams Involved:
+
+
+ Communicate: Owns the notifications and mentions
+ system.
+
+
+ Discover: Uses AI and contextual data to determine
+ the importance and relevance of a message.
+
+
+ Personalize: Provides the front-end experience that
+ presents this information in a unique, curated view for the
+ user.
+
+
+
+
+
+ Streamline Onboarding and Time-to-Value
+
+
+ Goal: Accelerate the time it takes for a new user to
+ achieve meaningful value by using personalized insights
+ to suggest the most relevant scaled templates and a clear{" "}
+ harmonized starting point.
+
+
+ Teams Involved:
+
+
+ Personalize: Identifies the user's role and
+ needs upon onboarding.
+
+
+ Scale: Provides the templates that will be
+ recommended as a starting point.
+
+
+ Harmonize: The templates are deployed into a
+ workspace, providing the user with a structured, aligned
+ starting point for their work.
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default FaceliftDocPage;
diff --git a/apps/kitchen-sink/src/screens/components/GlassAgentTile.module.scss b/apps/kitchen-sink/src/screens/components/GlassAgentTile.module.scss
new file mode 100644
index 0000000000..dca5f8e2ae
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/GlassAgentTile.module.scss
@@ -0,0 +1,33 @@
+.wrapper {
+ position: relative;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ /* Bounding box for a 40px tile rotated 5° = 40 * (cos5° + sin5°) ≈ 43.34px */
+ width: calc(var(--glass-tile-size, 40px) * 1.0833);
+ height: calc(var(--glass-tile-size, 40px) * 1.0833);
+ flex: 0 0 calc(var(--glass-tile-size, 40px) * 1.0833);
+ overflow: visible;
+}
+
+.tile {
+ position: relative;
+ display: block;
+ width: var(--glass-tile-size, 40px);
+ height: var(--glass-tile-size, 40px);
+ border-radius: calc(var(--glass-tile-size, 40px) * 0.2153);
+ background-color: var(--glass-tile-bg);
+ box-shadow: 0 calc(var(--glass-tile-size, 40px) * 0.07178)
+ calc(var(--glass-tile-size, 40px) * 0.14353) 0 rgba(0, 0, 0, 0.2);
+ overflow: hidden;
+ transform: rotate(-5deg);
+ transform-origin: 50% 50%;
+}
+
+.image {
+ position: absolute;
+ display: block;
+ max-width: none;
+ pointer-events: none;
+ user-select: none;
+}
diff --git a/apps/kitchen-sink/src/screens/components/GlassAgentTile.tsx b/apps/kitchen-sink/src/screens/components/GlassAgentTile.tsx
new file mode 100644
index 0000000000..529e9b67e5
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/GlassAgentTile.tsx
@@ -0,0 +1,95 @@
+import styles from "./GlassAgentTile.module.scss";
+
+export type GlassAgentTileVariant = 1 | 2 | 3 | 4;
+
+import agent1 from "../assets/agents/glass/agent1.png";
+import agent2 from "../assets/agents/glass/agent2.png";
+import agent3 from "../assets/agents/glass/agent3.png";
+import agent4 from "../assets/agents/glass/agent4.png";
+
+interface VariantSpec {
+ src: string;
+ bg: string;
+ imageStyle: React.CSSProperties;
+}
+
+const VARIANTS: Record = {
+ 1: {
+ src: agent1,
+ bg: "rgba(148, 80, 253, 0.4)",
+ imageStyle: {
+ left: "-2.09%",
+ top: "-3.71%",
+ width: "100.24%",
+ height: "184.27%",
+ },
+ },
+ 2: {
+ src: agent2,
+ bg: "rgba(157, 255, 0, 0.4)",
+ imageStyle: {
+ left: "-8.19%",
+ top: "-5.4%",
+ width: "113.12%",
+ height: "205.08%",
+ },
+ },
+ 3: {
+ src: agent3,
+ bg: "rgba(147, 190, 255, 0.4)",
+ imageStyle: {
+ left: "-5.77%",
+ top: "-1.53%",
+ width: "112.16%",
+ height: "202.71%",
+ },
+ },
+ 4: {
+ src: agent4,
+ bg: "rgba(255, 255, 255, 0.4)",
+ imageStyle: {
+ left: "-6.57%",
+ top: "5.43%",
+ width: "105.79%",
+ height: "151.5%",
+ },
+ },
+};
+
+interface GlassAgentTileProps {
+ variant: GlassAgentTileVariant;
+ size?: number;
+ ariaLabel?: string;
+ className?: string;
+}
+
+export function GlassAgentTile({
+ variant,
+ size = 40,
+ ariaLabel,
+ className,
+}: GlassAgentTileProps) {
+ const spec = VARIANTS[variant];
+ return (
+
+
+
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/screens/components/HomeModesPage.module.scss b/apps/kitchen-sink/src/screens/components/HomeModesPage.module.scss
new file mode 100644
index 0000000000..be3d9b2410
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/HomeModesPage.module.scss
@@ -0,0 +1,506 @@
+.root {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ width: 100%;
+ min-height: 100%;
+ padding: 80px 24px 24px;
+ background:
+ radial-gradient(
+ 720px 420px at 50% 28%,
+ rgba(129, 129, 255, 0.1),
+ transparent 70%
+ ),
+ #fffefc;
+}
+
+.rootAgents {
+ background:
+ radial-gradient(
+ 720px 420px at 50% 28%,
+ rgba(28, 213, 247, 0.08),
+ transparent 70%
+ ),
+ #fffefc;
+}
+
+.rootVibe {
+ background:
+ radial-gradient(
+ 720px 420px at 50% 28%,
+ rgba(255, 146, 232, 0.12),
+ transparent 70%
+ ),
+ #fffefc;
+}
+
+.whatsNew {
+ position: absolute;
+ top: 16px;
+ right: 24px;
+ display: inline-flex;
+ align-items: center;
+ gap: 4px;
+ height: 32px;
+ padding: 0 8px 0 6px;
+ border: none;
+ border-radius: 8px;
+ background: transparent;
+ color: var(--primary-text-color);
+ font: inherit;
+ font-size: 14px;
+ line-height: 24px;
+ cursor: pointer;
+
+ &:hover {
+ background: var(--primary-background-hover-color);
+ }
+}
+
+.heroBlock {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 32px;
+ width: 100%;
+ max-width: 644px;
+ font-family: Figtree, sans-serif;
+}
+
+.hero {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 4px;
+ text-align: center;
+ font-family: Figtree, sans-serif;
+}
+
+.heroTitle {
+ margin: 0;
+ font-family: Figtree, sans-serif;
+ font-size: 32px;
+ font-weight: 500;
+ line-height: 40px;
+ letter-spacing: -0.5px;
+ color: var(--primary-text-color);
+}
+
+.heroSubtitle {
+ margin: 0;
+ font-family: Figtree, sans-serif;
+ font-size: 16px;
+ font-weight: 400;
+ line-height: 22px;
+ color: var(--primary-text-color);
+ text-align: center;
+}
+
+/* Outer width for StrokeSpotlight shell (matches production prompt box). */
+.composerShell {
+ width: 100%;
+ max-width: 644px;
+ height: 180px;
+}
+
+.composer {
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ height: 100%;
+ border-radius: 16px;
+ background: var(--primary-background-color, #fffefc);
+ box-shadow: var(--glaze-shadow-prompt, rgba(0, 0, 0, 0.14) 0 1px 3px);
+ transition: box-shadow
+ var(
+ --glaze-shadow-prompt-motion,
+ var(--motion-productive-medium, 150ms) var(--motion-timing-transition, ease)
+ );
+ overflow: hidden;
+}
+
+.composerFocused {
+ box-shadow:
+ rgba(50, 50, 93, 0.1) 0 6px 14px -4px,
+ rgba(0, 0, 0, 0.12) 0 4px 8px -4px;
+}
+
+.composerInput {
+ flex: 1;
+ width: 100%;
+ min-height: 0;
+ padding: 12px 16px;
+ border: none;
+ outline: none;
+ resize: none;
+ background: transparent;
+ font-family: inherit;
+ font-size: 16px;
+ font-weight: 300;
+ line-height: 21.6px;
+ color: var(--primary-text-color);
+
+ &::placeholder {
+ color: #919399;
+ }
+}
+
+.composerFooter {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 8px;
+ padding: 0 12px 12px;
+}
+
+.composerLeft,
+.composerRight {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+}
+
+.addMenuButton {
+ display: inline-flex;
+}
+
+.addMenu {
+ min-width: 220px;
+ font-family: Figtree, sans-serif;
+}
+
+.toolBadges {
+ display: inline-flex;
+ align-items: center;
+ margin-inline-start: -6px;
+}
+
+.toolBadge {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 20px;
+ height: 20px;
+ margin-inline-start: -6px;
+ overflow: hidden;
+ border: 1px solid #dcdfec;
+ border-radius: 70px;
+ background: #fff;
+
+ &:first-child {
+ margin-inline-start: 0;
+ }
+
+ img {
+ width: 12px;
+ height: 12px;
+ object-fit: contain;
+ }
+}
+
+.modeControl {
+ --allgrey-background-color: #eeeceb;
+}
+
+.modelButton {
+ height: 32px;
+ padding-inline: 8px 4px;
+ border: none;
+ border-radius: 6px;
+ background: transparent;
+ color: var(--primary-text-color);
+ font: inherit;
+ font-size: 14px;
+ line-height: 20px;
+ cursor: pointer;
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+
+ &:hover {
+ background: var(--primary-background-hover-color);
+ }
+}
+
+.sendButton {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 32px;
+ height: 32px;
+ border: none;
+ border-radius: 6px;
+ background: #eeeceb;
+ color: var(--icon-color);
+ cursor: pointer;
+
+ &:hover {
+ background: var(--primary-color);
+ color: var(--text-color-on-primary);
+ }
+}
+
+.chipRow {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ justify-content: center;
+ gap: 8px;
+ width: 100%;
+}
+
+.chip {
+ display: inline-flex;
+ align-items: center;
+ gap: 4px;
+ height: 32px;
+ padding: 0 12px;
+ border: 1px solid #eeeceb;
+ border-radius: 16px;
+ background: var(--primary-background-color);
+ backdrop-filter: blur(3.5px);
+ color: var(--primary-text-color);
+ font: inherit;
+ font-size: 14px;
+ line-height: 20px;
+ cursor: pointer;
+
+ &:hover {
+ background: var(--primary-background-hover-color);
+ }
+}
+
+.chipMore {
+ width: 32px;
+ padding: 0;
+ justify-content: center;
+ border-radius: 40px;
+}
+
+.content {
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+ width: 100%;
+ max-width: 952px;
+ margin-top: 180px;
+ animation: homeModesFadeIn 220ms cubic-bezier(0.22, 1, 0.36, 1);
+}
+
+@keyframes homeModesFadeIn {
+ from {
+ opacity: 0;
+ transform: translateY(8px);
+ }
+
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .content {
+ animation: none;
+ }
+}
+
+.sectionHeader {
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+ gap: 16px;
+ width: 100%;
+ padding-inline: 4px;
+}
+
+.sectionCopy {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.sectionTitle {
+ margin: 0;
+ font-size: 16px;
+ font-weight: 600;
+ line-height: 22px;
+ color: #121212;
+}
+
+.sectionSubtitle {
+ margin: 0;
+ font-size: 16px;
+ font-weight: 400;
+ line-height: 1.1;
+ color: var(--secondary-text-color);
+}
+
+.starterGrid {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 20px;
+ width: 100%;
+}
+
+.starterCard {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ width: 304px;
+ height: 125px;
+ padding: 16px 20px 16px;
+ border: 1px solid var(--ui-border-color, #e7e9ef);
+ border-radius: 16px;
+ background: #fff;
+ text-align: left;
+ cursor: pointer;
+
+ &:hover {
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
+ }
+}
+
+.starterCopy {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+}
+
+.starterTitle {
+ margin: 0;
+ font-size: 16px;
+ font-weight: 500;
+ line-height: 16px;
+ color: #0f0f10;
+}
+
+.starterDescription {
+ margin: 0;
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 20px;
+ color: var(--primary-text-color);
+}
+
+.starterBadge {
+ display: inline-flex;
+ align-items: center;
+ gap: 4px;
+ align-self: flex-start;
+ padding: 2px 6px;
+ border-radius: 16px;
+ font-size: 12px;
+ line-height: 16px;
+ color: var(--primary-text-color);
+}
+
+.agentGrid,
+.vibeGrid {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 16px;
+ width: 100%;
+}
+
+.agentCard,
+.vibeCard {
+ display: flex;
+ flex: 1 1 420px;
+ gap: 16px;
+ min-width: min(100%, 420px);
+ padding: 8px;
+ border: 1px solid #eeeceb;
+ border-radius: 16px;
+ background: #fff;
+ text-align: left;
+ cursor: pointer;
+
+ &:hover {
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
+ }
+}
+
+.agentThumb {
+ width: 144px;
+ height: 146px;
+ flex-shrink: 0;
+ overflow: hidden;
+ border-radius: 8px;
+ background: #f6f4f1;
+
+ img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ }
+}
+
+.vibeThumb {
+ width: 200px;
+ height: 104px;
+ flex-shrink: 0;
+ overflow: hidden;
+ border-radius: 8px;
+ background: #f6f7fb;
+
+ img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ }
+}
+
+.cardBody {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ justify-content: space-between;
+ gap: 12px;
+ min-width: 0;
+ padding: 8px 16px 8px 0;
+}
+
+.cardTitle {
+ margin: 0 0 6px;
+ font-size: 16px;
+ font-weight: 500;
+ line-height: 16px;
+ color: #0f0f10;
+}
+
+.cardDescription {
+ margin: 0;
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 1.3;
+ color: var(--secondary-text-color);
+}
+
+.basedOn {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ min-width: 0;
+ font-size: 14px;
+ line-height: 16px;
+ color: var(--secondary-text-color);
+}
+
+.basedOnChip {
+ display: inline-flex;
+ align-items: center;
+ gap: 3px;
+ max-width: 133px;
+ height: 20px;
+ padding: 0 4px;
+ overflow: hidden;
+ border-radius: 16px;
+ background: #e7e7e7;
+ color: var(--primary-text-color);
+ font-size: 12px;
+ line-height: 1;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
diff --git a/apps/kitchen-sink/src/screens/components/HomeModesPage.tsx b/apps/kitchen-sink/src/screens/components/HomeModesPage.tsx
new file mode 100644
index 0000000000..5590fd96dd
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/HomeModesPage.tsx
@@ -0,0 +1,491 @@
+import { useState } from "react";
+import {
+ Box,
+ Button,
+ Icon,
+ IconButton,
+ Menu,
+ MenuButton,
+ MenuItem,
+ SegmentedControl,
+} from "@vibe/core";
+import { Mention } from "@vibe/icons";
+import {
+ Add,
+ AISkills,
+ AttachSlanted,
+ Board,
+ Doc,
+ DropdownChevronDown,
+ Idea,
+ Image,
+ Menu as MenuIcon,
+ Microphone,
+ MoveArrowUp,
+ Present,
+ RegenerateAI,
+ Search,
+ SlashCommand,
+} from "@mondaydotcomorg/icons";
+import agentSarah from "../assets/home-modes/sarah.png";
+import agentDiana from "../assets/home-modes/diana.png";
+import vibeThumb1 from "../assets/home-modes/vibe-thumb-1.svg";
+import vibeThumb2 from "../assets/home-modes/vibe-thumb-2.svg";
+import vibeThumb3 from "../assets/home-modes/vibe-thumb-3.svg";
+import gmailIcon from "../assets/home-modes/gmail.svg";
+import slackIcon from "../assets/home-modes/slack.png";
+import outlookIcon from "../assets/home-modes/outlook.svg";
+import styles from "./HomeModesPage.module.scss";
+import { StrokeSpotlight } from "@vibe/core";
+import { STROKE_NO_PULSE_ATTR } from "@vibe/core";
+
+type HomeMode = "sidekick" | "agents" | "vibe";
+
+const MODE_OPTIONS = [
+ { value: "sidekick", label: "Sidekick" },
+ { value: "agents", label: "Agents" },
+ { value: "vibe", label: "Vibe" },
+] as const;
+
+const MODE_COPY: Record<
+ HomeMode,
+ { title: string; subtitle: string; placeholder: string }
+> = {
+ sidekick: {
+ title: "Hey Naama",
+ subtitle: "what do you want to work on today?",
+ placeholder: "Create reports",
+ },
+ agents: {
+ title: "Hey Naama",
+ subtitle: "build your agent with a simple description",
+ placeholder: "Build your agent",
+ },
+ vibe: {
+ title: "Hey Naama",
+ subtitle: "build a new Vibe app with a simple description",
+ placeholder: "Build your new application",
+ },
+};
+
+const SIDEKICK_CHIPS = [
+ { label: "Create a board", icon: Board },
+ { label: "Write a doc", icon: Doc },
+ { label: "Research online", icon: Search },
+] as const;
+
+const VIBE_CHIPS = [
+ { label: "Design Asset Library" },
+ { label: "Design Feedback Loop" },
+ { label: "Design Sprint Planner" },
+] as const;
+
+const SIDEKICK_STARTERS = [
+ {
+ title: "Structured board",
+ description:
+ "Create a structured board with owners, milestones, and timelines",
+ badge: "Board",
+ badgeBg: "#e8e7fd",
+ },
+ {
+ title: "Clear document",
+ description: "Draft a clear document with goals and next steps",
+ badge: "Doc",
+ badgeBg: "#dff5f2",
+ },
+ {
+ title: "Progress summary",
+ description: "Get a snapshot of progress, risks, and priorities",
+ badge: "Insights",
+ badgeBg: "rgba(255,146,232,0.3)",
+ },
+ {
+ title: "Brainstorm ideas",
+ description: "Generate ideas to solve a concrete work challenge",
+ badge: "Brainstorm",
+ badgeBg: "rgba(3,201,250,0.12)",
+ },
+ {
+ title: "Research topics",
+ description: "Research a topic or alternatives for better decisions",
+ badge: "Research",
+ badgeBg: "rgba(255,214,51,0.3)",
+ },
+ {
+ title: "Image creating",
+ description: "Create an image to explain a plan or workflow",
+ badge: "Image",
+ badgeBg: "#e8e7fd",
+ },
+] as const;
+
+const AGENT_CARDS = [
+ {
+ title: "Figma-to-Request Validator",
+ description:
+ "I'll validate each request's Figma link and flag what's missing.",
+ basedOn: "Task - Vibe team",
+ image: agentSarah,
+ },
+ {
+ title: "Design-to-Dev Handoff Enforcer",
+ description:
+ "I'll block “Code review” until the task has a real spec and links.",
+ basedOn: "Design Sprint",
+ image: agentDiana,
+ },
+] as const;
+
+const VIBE_CARDS = [
+ {
+ title: "Creative Studio Hub",
+ description:
+ "Use AI to analyze communication history and sentiment to score lead engagement, and automatically suggest personalized follow-up strategies to improve conversion rates.",
+ basedOn: "Task - Vibe team",
+ image: vibeThumb1,
+ },
+ {
+ title: "Project control",
+ description: "Team leads multi-project visibility hub",
+ basedOn: "Task - Vibe team",
+ image: vibeThumb2,
+ },
+ {
+ title: "Knowledge manager",
+ description: "Centralize docs, decisions, and team knowledge in one place.",
+ basedOn: "Home",
+ image: vibeThumb3,
+ },
+ {
+ title: "Org chart",
+ description: "Map roles, reporting lines, and ownership across teams.",
+ basedOn: "Home",
+ image: vibeThumb1,
+ },
+] as const;
+
+function ConnectToolsBadges() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+function BasedOnChip({ label }: { label: string }) {
+ return (
+
+ Based on
+
+
+ {label}
+
+
+ );
+}
+
+export function HomeModesPage() {
+ const [mode, setMode] = useState("sidekick");
+ const [composerFocused, setComposerFocused] = useState(false);
+ const copy = MODE_COPY[mode];
+
+ return (
+
+
+
+ What's new
+
+
+
+
+
{copy.title}
+
{copy.subtitle}
+
+
+
+
+ {mode === "sidekick" && (
+
+ {SIDEKICK_CHIPS.map(({ label, icon }) => (
+
+
+ {label}
+
+ ))}
+
+
+
+
+ )}
+
+ {mode === "vibe" && (
+
+ {VIBE_CHIPS.map(({ label }) => (
+
+ {label}
+
+ ))}
+
+
+
+
+ )}
+
+
+
+ {mode === "sidekick" && (
+ <>
+
+
+
Suggested starters
+
+ Pick a tailored suggested starter for your work
+
+
+
+ Regenerate
+
+
+
+ {SIDEKICK_STARTERS.map((card) => (
+
+
+
{card.title}
+
+ {card.description}
+
+
+
+ {card.badge === "Brainstorm" && (
+
+ )}
+ {card.badge === "Image" && (
+
+ )}
+ {card.badge}
+
+
+ ))}
+
+ >
+ )}
+
+ {mode === "agents" && (
+ <>
+
+
+
Agents made for you
+
+ Based on your workspace activity
+
+
+
+ Regenerate
+
+
+
+ {AGENT_CARDS.map((card) => (
+
+
+
+
+
+
+
{card.title}
+
+ {card.description}
+
+
+
+
+
+ ))}
+
+ >
+ )}
+
+ {mode === "vibe" && (
+ <>
+
+
+
+ Live suggestions, made for you
+
+
+ Prompts tailored to your team, boards, and current projects
+
+
+
+ Regenerate
+
+
+
+ {VIBE_CARDS.map((card) => (
+
+
+
+
+
+
+
{card.title}
+
+ {card.description}
+
+
+
+
+
+ ))}
+
+ >
+ )}
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/screens/components/InviteBoardModal.module.scss b/apps/kitchen-sink/src/screens/components/InviteBoardModal.module.scss
new file mode 100644
index 0000000000..e7c936e279
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/InviteBoardModal.module.scss
@@ -0,0 +1,285 @@
+.scrim {
+ position: fixed;
+ inset: 0;
+ background: var(--app-scrim-color);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 200;
+ padding: var(--space-24);
+ animation: scrimIn var(--motion-productive-medium) var(--motion-timing-enter);
+
+ :global(html.warmth) &::before {
+ content: "";
+ position: absolute;
+ inset: 0;
+ pointer-events: none;
+ backdrop-filter: blur(6px);
+ -webkit-backdrop-filter: blur(6px);
+ mask-image: linear-gradient(to top, black 0%, transparent 100%);
+ -webkit-mask-image: linear-gradient(to top, black 0%, transparent 100%);
+ }
+}
+
+@keyframes scrimIn {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+}
+
+.modal {
+ position: relative;
+ z-index: 1;
+ width: 100%;
+ max-width: 560px;
+ height: min(760px, calc(100vh - 48px));
+ display: flex;
+ flex-direction: column;
+ background: var(--modal-background-color, var(--primary-background-color));
+ color: var(--primary-text-color);
+ border-radius: var(--border-radius-big);
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.18);
+ font-family: var(--boards-font-family, var(--font-family));
+ animation: modalIn var(--motion-productive-medium) var(--motion-timing-enter);
+ overflow: hidden;
+}
+
+@keyframes modalIn {
+ from {
+ transform: translateY(8px);
+ opacity: 0;
+ }
+ to {
+ transform: translateY(0);
+ opacity: 1;
+ }
+}
+
+.header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: var(--space-12);
+ padding: var(--space-24) var(--space-24) var(--space-16);
+ flex: 0 0 auto;
+}
+
+.title {
+ margin: 0;
+ flex: 1 1 auto;
+ font-family: var(--boards-font-family, var(--title-font-family));
+ font-size: 1.5rem;
+ font-weight: var(--font-weight-bold);
+ line-height: 1.25;
+ color: var(--primary-text-color);
+}
+
+.headerActions {
+ display: inline-flex;
+ align-items: center;
+ gap: var(--space-4);
+ flex: 0 0 auto;
+}
+
+.iconBtn {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 32px;
+ height: 32px;
+ padding: 0;
+ border: none;
+ background: transparent;
+ color: var(--secondary-text-color);
+ cursor: pointer;
+ border-radius: var(--border-radius-small);
+
+ &:hover {
+ background: var(--primary-background-hover-color);
+ color: var(--primary-text-color);
+ }
+}
+
+.searchWrap {
+ padding: 0 var(--space-24);
+ flex: 0 0 auto;
+}
+
+.search {
+ width: 100%;
+ padding: var(--space-12) var(--space-16);
+ font: inherit;
+ font-family: var(--boards-font-family, var(--font-family));
+ font-size: 0.875rem;
+ color: var(--primary-text-color);
+ background: var(--primary-background-color);
+ border: var(--border-width) solid var(--ui-border-color);
+ border-radius: var(--border-radius-medium);
+
+ &::placeholder {
+ color: var(--placeholder-color, var(--secondary-text-color));
+ }
+
+ &:focus {
+ outline: none;
+ border-color: var(--primary-color);
+ }
+}
+
+.tabs {
+ display: flex;
+ align-items: stretch;
+ gap: var(--space-32);
+ padding: 0 var(--space-24);
+ border-block-end: var(--border-width) solid var(--ui-border-color);
+ margin-block-start: var(--space-16);
+ flex: 0 0 auto;
+}
+
+.tab {
+ padding: var(--space-12) 0;
+ border: none;
+ background: transparent;
+ color: var(--secondary-text-color);
+ cursor: pointer;
+ font: inherit;
+ font-family: var(--boards-font-family, var(--font-family));
+ font-size: 1rem;
+ font-weight: var(--font-weight-bold);
+ border-block-end: 2px solid transparent;
+ margin-block-end: -1px;
+
+ &:hover {
+ color: var(--primary-text-color);
+ }
+}
+
+.tabActive {
+ color: var(--primary-color);
+ border-block-end-color: var(--primary-color);
+}
+
+.list {
+ flex: 1 1 auto;
+ overflow-y: auto;
+ padding: var(--space-8) var(--space-24);
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-4);
+}
+
+.row {
+ display: flex;
+ align-items: center;
+ gap: var(--space-12);
+ padding: var(--space-8) 0;
+ min-height: 56px;
+}
+
+.rowAvatar {
+ flex: 0 0 auto;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 40px;
+ height: 40px;
+}
+
+.rowAvatarTile {
+ flex: 0 0 auto;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 44px;
+ height: 44px;
+}
+
+.rowText {
+ flex: 1 1 auto;
+ display: flex;
+ flex-direction: column;
+ min-width: 0;
+ gap: 2px;
+}
+
+.rowName {
+ font-size: 0.875rem;
+ font-weight: var(--font-weight-bold);
+ color: var(--primary-text-color);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.rowMeta {
+ font-size: 0.875rem;
+ color: var(--secondary-text-color);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.rowMetaSmall {
+ display: inline-flex;
+ align-items: center;
+ gap: var(--space-4);
+ font-size: 0.8125rem;
+ color: var(--secondary-text-color);
+}
+
+.rowRole {
+ flex: 0 0 auto;
+ min-width: 180px;
+}
+
+.footer {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-8);
+ padding: var(--space-16) var(--space-24) var(--space-24);
+ border-block-start: var(--border-width) solid var(--ui-border-color);
+ flex: 0 0 auto;
+}
+
+.footerHeading {
+ font-size: 0.875rem;
+ font-weight: var(--font-weight-bold);
+ color: var(--primary-text-color);
+}
+
+.footerRow {
+ display: flex;
+ align-items: center;
+ gap: var(--space-12);
+}
+
+.footerIcon {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 40px;
+ height: 40px;
+ border-radius: var(--border-radius-small);
+ background: var(--primary-background-hover-color);
+ color: var(--secondary-text-color);
+ flex: 0 0 auto;
+}
+
+.footerText {
+ flex: 1 1 auto;
+ font-size: 0.875rem;
+ color: var(--primary-text-color);
+ min-width: 0;
+
+ strong {
+ font-weight: var(--font-weight-bold);
+ }
+}
+
+.footerRole {
+ flex: 0 0 auto;
+ min-width: 140px;
+}
diff --git a/apps/kitchen-sink/src/screens/components/InviteBoardModal.tsx b/apps/kitchen-sink/src/screens/components/InviteBoardModal.tsx
new file mode 100644
index 0000000000..c89f7c5b39
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/InviteBoardModal.tsx
@@ -0,0 +1,234 @@
+import { useEffect, useState } from "react";
+import { createPortal } from "react-dom";
+import { Avatar, Icon, Dropdown, type DropdownOption } from "@vibe/core";
+import { Close, Comment, Workspace } from "@mondaydotcomorg/icons";
+import { GlassAgentTile, type GlassAgentTileVariant } from "./GlassAgentTile";
+import { DEMO_AVATAR_1, DEMO_AVATAR_2 } from "@/demo/demoPeople";
+import styles from "./InviteBoardModal.module.scss";
+
+interface InviteBoardModalProps {
+ open: boolean;
+ onClose: () => void;
+ workspaceName?: string;
+}
+
+type Tab = "people" | "agents";
+
+const PEOPLE = [
+ {
+ name: "Itamar Ben Shushan",
+ role: "Senior Product Design Lead",
+ avatar: DEMO_AVATAR_1,
+ defaultRole: "Owner",
+ },
+ {
+ name: "Arava Sheleff Itelson",
+ role: "Director of Product Design",
+ avatar: DEMO_AVATAR_2,
+ defaultRole: "Default (Editor)",
+ },
+ {
+ name: "Nati Bawer",
+ role: "Director of Product Design",
+ avatar:
+ "https://images.unsplash.com/photo-1500648767791-00dcc994a43e?w=80&h=80&fit=crop&crop=face&auto=format",
+ defaultRole: "Default (Editor)",
+ },
+];
+
+interface AgentInfo {
+ name: string;
+ role: string;
+ variant: GlassAgentTileVariant;
+ owner: string;
+}
+
+const AGENTS: AgentInfo[] = [
+ {
+ name: "Diane, Design Task Intake Agent",
+ role: "Design Task Intake Agent",
+ variant: 1,
+ owner: "Itamar Ben Shushan",
+ },
+ {
+ name: "Kelly, Design Operations Agent",
+ role: "Design Operations Agent",
+ variant: 2,
+ owner: "Itamar Ben Shushan",
+ },
+ {
+ name: "Tasko, Task Intake Clarifier",
+ role: "Task Intake Clarifier",
+ variant: 3,
+ owner: "Itamar Ben Shushan",
+ },
+ {
+ name: "Joyce, Personal Fitness Assistant",
+ role: "Personal Fitness Assistant",
+ variant: 4,
+ owner: "Itamar Ben Shushan",
+ },
+];
+
+const ROLE_OPTIONS: DropdownOption[] = [
+ { value: "owner", label: "Owner" },
+ { value: "editor", label: "Default (Editor)" },
+ { value: "viewer", label: "Viewer" },
+];
+
+const ACCESS_OPTIONS: DropdownOption[] = [
+ { value: "editor", label: "Editor" },
+ { value: "viewer", label: "Viewer" },
+ { value: "none", label: "No access" },
+];
+
+export function InviteBoardModal({
+ open,
+ onClose,
+ workspaceName = "Personal workspace - Itamar Ben Shushan",
+}: InviteBoardModalProps) {
+ const [tab, setTab] = useState("people");
+
+ useEffect(() => {
+ if (!open) return;
+ const onKey = (e: KeyboardEvent) => {
+ if (e.key === "Escape") onClose();
+ };
+ window.addEventListener("keydown", onKey);
+ return () => window.removeEventListener("keydown", onKey);
+ }, [open, onClose]);
+
+ if (!open) return null;
+
+ return createPortal(
+
+
e.stopPropagation()}
+ >
+
+ Invite to this board
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ setTab("people")}
+ >
+ People
+
+ setTab("agents")}
+ >
+ Agents
+
+
+
+
+ {tab === "people"
+ ? PEOPLE.map((person) => (
+
+
+
+
+
+ {person.name}
+ {person.role}
+
+
+ o.label === person.defaultRole,
+ ) ?? ROLE_OPTIONS[1]
+ }
+ />
+
+
+ ))
+ : AGENTS.map((agent) => (
+
+
+
+
+
+
{agent.name}
+
+
+ {agent.owner}
+
+
+
+ ))}
+
+
+
+
+
,
+ document.body,
+ );
+}
diff --git a/apps/kitchen-sink/src/screens/components/ItemDetailsPanel.module.scss b/apps/kitchen-sink/src/screens/components/ItemDetailsPanel.module.scss
new file mode 100644
index 0000000000..f8b44e884b
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/ItemDetailsPanel.module.scss
@@ -0,0 +1,396 @@
+.scrim {
+ position: fixed;
+ inset: 0;
+ background: transparent;
+ pointer-events: none;
+ opacity: 0;
+ z-index: 90;
+ transition: opacity var(--motion-productive-medium)
+ var(--motion-timing-transition);
+}
+
+.scrimOpen {
+ background: var(--app-scrim-color);
+ pointer-events: auto;
+ opacity: 1;
+
+ :global(html.warmth) & {
+ backdrop-filter: blur(6px);
+ -webkit-backdrop-filter: blur(6px);
+ mask-image: linear-gradient(to top, black 0%, transparent 100%);
+ -webkit-mask-image: linear-gradient(to top, black 0%, transparent 100%);
+ }
+}
+
+.panel {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ width: min(560px, 100vw);
+ background: var(--primary-background-color);
+ border-inline-start: var(--border-width) solid var(--ui-border-color);
+ box-shadow: -8px 0 24px rgba(0, 0, 0, 0.06);
+ display: flex;
+ flex-direction: column;
+ transform: translateX(100%);
+ transition: transform var(--motion-productive-medium)
+ var(--motion-timing-transition);
+ z-index: 100;
+ font-family: var(--boards-font-family, var(--font-family));
+ color: var(--primary-text-color);
+}
+
+.panelOpen {
+ transform: translateX(0);
+}
+
+.iconBtn {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 28px;
+ height: 28px;
+ padding: 0;
+ border: none;
+ background: transparent;
+ color: var(--icon-color, var(--secondary-text-color));
+ cursor: pointer;
+ border-radius: var(--border-radius-small);
+
+ &:hover {
+ background: var(--primary-background-hover-color);
+ color: var(--primary-text-color);
+ }
+}
+
+.closeBtn {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 32px;
+ height: 32px;
+ padding: 0;
+ border: none;
+ background: transparent;
+ color: var(--secondary-text-color);
+ cursor: pointer;
+ border-radius: var(--border-radius-small);
+ flex: 0 0 auto;
+
+ &:hover {
+ background: var(--primary-background-hover-color);
+ color: var(--primary-text-color);
+ }
+}
+
+.header {
+ display: flex;
+ align-items: center;
+ gap: var(--space-12);
+ padding: var(--space-16) var(--space-16) var(--space-12);
+ border-block-end: var(--border-width) solid var(--ui-border-color);
+}
+
+.title {
+ flex: 1 1 auto;
+ margin: 0;
+ font-family: var(--boards-font-family, var(--title-font-family));
+ font-size: 1.25rem;
+ font-weight: var(--font-weight-bold);
+ line-height: 1.3;
+ color: var(--primary-text-color);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ min-width: 0;
+}
+
+.headerActions {
+ display: flex;
+ align-items: center;
+ gap: var(--space-8);
+ flex: 0 0 auto;
+}
+
+.brandDot {
+ display: inline-block;
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ background: radial-gradient(circle at 30% 30%, #ff7a5c, #f65f7c 60%, #c73d6f);
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.08);
+}
+
+.tabs {
+ display: flex;
+ align-items: stretch;
+ gap: var(--space-4);
+ padding: 0 var(--space-12);
+ border-block-end: var(--border-width) solid var(--ui-border-color);
+ overflow-x: auto;
+ scrollbar-width: none;
+
+ &::-webkit-scrollbar {
+ display: none;
+ }
+}
+
+.tab {
+ display: inline-flex;
+ align-items: center;
+ gap: var(--space-4);
+ padding: var(--space-12) var(--space-8);
+ border: none;
+ background: transparent;
+ color: var(--secondary-text-color);
+ cursor: pointer;
+ font: inherit;
+ font-size: 0.875rem;
+ white-space: nowrap;
+ border-block-end: 2px solid transparent;
+ margin-block-end: -1px;
+
+ &:hover {
+ color: var(--primary-text-color);
+ }
+}
+
+.tabActive {
+ color: var(--primary-text-color);
+ border-block-end-color: var(--primary-color);
+ font-weight: var(--font-weight-bold);
+}
+
+.tabIcon {
+ flex: 0 0 auto;
+ color: currentColor;
+}
+
+.tabLabel {
+ display: inline-block;
+}
+
+.tabAdd {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ padding: var(--space-8);
+ background: transparent;
+ border: none;
+ color: var(--secondary-text-color);
+ cursor: pointer;
+ font: inherit;
+ font-size: 1rem;
+ border-radius: var(--border-radius-small);
+
+ &:hover {
+ background: var(--primary-background-hover-color);
+ color: var(--primary-text-color);
+ }
+}
+
+.subActions {
+ display: flex;
+ align-items: center;
+ gap: var(--space-12);
+ padding: var(--space-12) var(--space-16);
+}
+
+.subAction {
+ display: inline-flex;
+ align-items: center;
+ gap: var(--space-4);
+ padding: 0;
+ background: transparent;
+ border: none;
+ color: var(--secondary-text-color);
+ cursor: pointer;
+ font: inherit;
+ font-size: 0.875rem;
+
+ &:hover {
+ color: var(--primary-text-color);
+ }
+}
+
+.subActionDivider {
+ display: inline-block;
+ width: 1px;
+ height: 14px;
+ background: var(--ui-border-color);
+}
+
+.body {
+ flex: 1 1 auto;
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-16);
+ padding: var(--space-12) var(--space-16) var(--space-24);
+ overflow-y: auto;
+}
+
+.composer {
+ display: flex;
+ flex-direction: column;
+ border: var(--border-width) solid var(--ui-border-color);
+ border-radius: var(--border-radius-medium);
+ background: var(--secondary-background-color);
+ padding: var(--space-12);
+ gap: var(--space-8);
+
+ &:hover {
+ border-color: var(--primary-color);
+ }
+}
+
+.composerInput {
+ font-size: 0.875rem;
+ color: var(--secondary-text-color);
+ min-height: var(--space-24);
+ padding: var(--space-4) 0;
+ cursor: text;
+}
+
+.composerToolbar {
+ display: flex;
+ align-items: center;
+ gap: var(--space-4);
+}
+
+.composerAi {
+ position: relative;
+ display: inline-flex;
+ align-items: center;
+}
+
+.composerAiDot {
+ position: absolute;
+ top: 2px;
+ right: 2px;
+ width: 6px;
+ height: 6px;
+ border-radius: 50%;
+ background: var(--primary-color);
+ box-shadow: 0 0 0 2px var(--primary-background-color);
+}
+
+.update {
+ display: flex;
+ flex-direction: column;
+ border: var(--border-width) solid var(--ui-border-color);
+ border-radius: var(--border-radius-medium);
+ background: var(--secondary-background-color);
+}
+
+.updateHeader {
+ display: flex;
+ align-items: center;
+ gap: var(--space-8);
+ padding: var(--space-12) var(--space-12) var(--space-8);
+}
+
+.updateMeta {
+ flex: 1 1 auto;
+ display: flex;
+ align-items: baseline;
+ gap: var(--space-8);
+ min-width: 0;
+}
+
+.updateAuthor {
+ font-size: 0.875rem;
+ font-weight: var(--font-weight-bold);
+ color: var(--primary-text-color);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.updateTimestamp {
+ font-size: 0.75rem;
+ color: var(--secondary-text-color);
+ flex: 0 0 auto;
+}
+
+.updateActions {
+ display: flex;
+ align-items: center;
+ gap: var(--space-2);
+ flex: 0 0 auto;
+}
+
+.updateBody {
+ padding: 0 var(--space-12) var(--space-12);
+ font-size: 0.875rem;
+ line-height: 1.5;
+ color: var(--primary-text-color);
+
+ p {
+ margin: 0 0 var(--space-12);
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+
+ strong {
+ font-weight: var(--font-weight-bold);
+ color: var(--primary-text-color);
+ }
+
+ em {
+ font-style: italic;
+ }
+}
+
+.updateFooter {
+ display: flex;
+ align-items: center;
+ gap: var(--space-16);
+ padding: var(--space-8) var(--space-12);
+ border-block-start: var(--border-width) solid var(--ui-border-color);
+}
+
+.updateFooterAction {
+ display: inline-flex;
+ align-items: center;
+ gap: var(--space-4);
+ padding: var(--space-4) 0;
+ background: transparent;
+ border: none;
+ color: var(--secondary-text-color);
+ cursor: pointer;
+ font: inherit;
+ font-size: 0.875rem;
+
+ &:hover {
+ color: var(--primary-text-color);
+ }
+}
+
+.replyRow {
+ display: flex;
+ align-items: center;
+ gap: var(--space-8);
+ padding: var(--space-8) var(--space-12) var(--space-12);
+ border-block-start: var(--border-width) solid var(--ui-border-color);
+}
+
+.replyInput {
+ flex: 1 1 auto;
+ display: flex;
+ align-items: center;
+ padding: var(--space-8) var(--space-12);
+ border: var(--border-width) solid var(--ui-border-color);
+ border-radius: var(--border-radius-medium);
+ background: var(--primary-background-color);
+ font-size: 0.875rem;
+ color: var(--secondary-text-color);
+ min-height: var(--space-32);
+ cursor: text;
+
+ &:hover {
+ border-color: var(--primary-color);
+ }
+}
diff --git a/apps/kitchen-sink/src/screens/components/ItemDetailsPanel.tsx b/apps/kitchen-sink/src/screens/components/ItemDetailsPanel.tsx
new file mode 100644
index 0000000000..419edc1e01
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/ItemDetailsPanel.tsx
@@ -0,0 +1,217 @@
+import { createPortal } from "react-dom";
+import { Avatar, Icon, AvatarGroup } from "@vibe/core";
+import {
+ Attach,
+ Bookmark,
+ Close,
+ Email,
+ Emoji,
+ Feedback,
+ Gif,
+ Home,
+ Mention,
+ MoreActions,
+ Notifications,
+ Reply,
+ ThumbsUp,
+ Wand,
+} from "@mondaydotcomorg/icons";
+import type { Item } from "./types";
+import styles from "./ItemDetailsPanel.module.scss";
+
+interface ItemDetailsPanelProps {
+ item: Item | null;
+ onClose: () => void;
+}
+
+const TABS = [
+ { id: "updates", label: "Updates / 1", icon: Home },
+ { id: "files", label: "Files" },
+ { id: "activity", label: "Activity Log" },
+ { id: "info", label: "Info Boxes" },
+ { id: "workforms", label: "WorkForms Item View" },
+];
+
+const DEMO_AVATAR =
+ "https://images.unsplash.com/photo-1535713875002-d1d0cf377fde?w=80&h=80&fit=crop&crop=face&auto=format";
+
+// eslint-disable-next-line @typescript-eslint/no-explicit-any
+type AnyIcon = React.FC;
+
+function IconBtn({
+ icon,
+ label,
+ className,
+}: {
+ icon: AnyIcon;
+ label: string;
+ className?: string;
+}) {
+ return (
+
+
+
+ );
+}
+
+export function ItemDetailsPanel({ item, onClose }: ItemDetailsPanelProps) {
+ const open = !!item;
+
+ return createPortal(
+ <>
+
+
+ >,
+ document.body,
+ );
+}
diff --git a/apps/kitchen-sink/src/screens/components/LeftPaneContent.module.scss b/apps/kitchen-sink/src/screens/components/LeftPaneContent.module.scss
new file mode 100644
index 0000000000..f9f1197791
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/LeftPaneContent.module.scss
@@ -0,0 +1,1588 @@
+.root {
+ display: flex;
+ flex-direction: column;
+ align-items: stretch;
+ position: relative;
+ width: 100%;
+ height: 100%;
+}
+
+.panel {
+ display: flex;
+ flex: 1 0 0;
+ flex-direction: column;
+ min-width: 0;
+ min-height: 0;
+ padding: var(--space-16) 0 var(--space-4);
+ position: relative;
+ width: 100%;
+ overflow: hidden;
+ background-color: var(--primary-background-color);
+ font-family: var(--boards-font-family);
+}
+
+.panelVibe {
+ --vibe-sidebar-surface: var(--primary-background-color);
+ --vibe-sidebar-surface-hover: var(--primary-background-hover-color);
+ --vibe-sidebar-selected: var(--primary-selected-color);
+ --vibe-sidebar-selected-hover: var(--primary-selected-hover-color);
+ --vibe-sidebar-divider: color-mix(
+ in srgb,
+ var(--ui-border-color) 40%,
+ transparent
+ );
+
+ padding: var(--space-16) 0;
+ background-color: var(--vibe-sidebar-surface);
+
+ .panelBgLayerBase {
+ background-color: var(--vibe-sidebar-surface);
+ }
+
+ .panelInner {
+ --panel-content-padding-inline: var(--space-16);
+
+ gap: var(--space-16);
+ overflow: hidden;
+ }
+
+ .panelHeader {
+ min-height: var(--space-32);
+ padding-inline-start: var(--space-4);
+ }
+
+ .panelTitle {
+ padding-inline-end: var(--space-28);
+ color: var(--secondary-text-color);
+ font-size: 0.8125rem;
+ text-transform: capitalize;
+ }
+
+ .panelIconButton,
+ .panelHeaderIconButton {
+ width: calc(var(--space-32) - var(--space-4));
+ min-width: calc(var(--space-32) - var(--space-4));
+ height: calc(var(--space-32) - var(--space-4));
+ }
+
+ .panelIconButton:hover,
+ .panelIconButton:focus-visible {
+ background-color: var(--vibe-sidebar-surface-hover);
+ }
+}
+
+.panelInner {
+ --panel-content-padding-inline: var(--space-20);
+
+ display: flex;
+ flex: 1 1 auto;
+ flex-direction: column;
+ gap: calc(var(--space-4) + var(--space-2));
+ min-height: 0;
+ padding-inline: var(--panel-content-padding-inline);
+ position: relative;
+ z-index: 1;
+ width: 100%;
+ box-sizing: border-box;
+}
+
+.panelHeader {
+ display: flex;
+ width: 100%;
+ min-height: var(--space-32);
+ align-items: center;
+ gap: var(--space-4);
+}
+
+.panelTitle {
+ flex: 1 1 auto;
+ min-width: 0;
+ font-size: 0.875rem;
+ font-weight: var(--font-weight-medium);
+ color: var(--secondary-text-color);
+}
+
+.panelHeaderActions {
+ display: flex;
+ flex: 0 0 auto;
+ align-items: center;
+ justify-content: flex-end;
+ gap: var(--space-4);
+}
+
+.panelHeaderIconButton {
+ width: var(--space-32);
+ height: var(--space-32);
+ min-width: var(--space-32);
+ flex: 0 0 auto;
+ color: var(--icon-color);
+
+ svg {
+ color: var(--icon-color);
+ fill: currentColor;
+ }
+}
+
+.panelIconButton {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: var(--space-32);
+ height: var(--space-32);
+ padding: 0;
+ border: 0;
+ border-radius: var(--border-radius-small);
+ background: transparent;
+ color: var(--icon-color);
+ cursor: pointer;
+
+ &:hover,
+ &:focus-visible {
+ background-color: var(--primary-background-hover-color);
+ color: var(--secondary-text-color);
+ outline: none;
+ }
+
+ &:focus-visible {
+ box-shadow: inset 0 0 0 var(--border-width) var(--primary-color);
+ }
+
+ &:active {
+ background-color: color-mix(in srgb, var(--icon-color) 16%, transparent);
+ color: var(--secondary-text-color);
+ }
+
+ transition:
+ color 150ms ease,
+ background-color 150ms ease;
+}
+
+.panelIcon {
+ display: block;
+ width: var(--space-20);
+ height: var(--space-20);
+ flex: 0 0 auto;
+}
+
+.workspaceCard {
+ display: flex;
+ align-items: center;
+ gap: var(--space-4);
+ width: 100%;
+ min-height: var(--space-32);
+}
+
+.workspaceDropdownWrap {
+ flex: 1 1 0%;
+ min-width: 0;
+
+ :global([class*="inputWrapper"]) {
+ min-height: var(--space-32);
+ padding-inline-start: var(--space-8);
+ padding-inline-end: var(--space-12);
+ }
+}
+
+.workspaceDropdownValue {
+ flex: 1 1 0%;
+ min-width: 0;
+ align-items: center;
+}
+
+.workspaceAvatar {
+ flex: 0 0 auto;
+}
+
+.workspaceDropdownValueLabel {
+ flex: 1 1 0%;
+ min-width: 0;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.workspaceAddButton {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: var(--space-32);
+ height: var(--space-32);
+ flex: 0 0 auto;
+ padding: 0;
+ border: var(--border-width) solid var(--ui-border-color);
+ border-radius: var(--border-radius-small);
+ background-color: transparent;
+ color: var(--primary-text-color);
+ cursor: pointer;
+
+ &:hover,
+ &:focus-visible {
+ border-color: var(--ui-background-hover-color);
+ background-color: var(--primary-background-hover-color);
+ outline: none;
+ }
+}
+
+.workspaceAddIcon {
+ display: block;
+ width: var(--space-16);
+ height: var(--space-16);
+}
+
+.sectionRow {
+ display: flex;
+ width: 100%;
+ height: var(--space-32);
+ align-items: center;
+ justify-content: flex-start;
+ gap: var(--space-4);
+ padding: var(--space-8) 0 var(--space-8) var(--space-8);
+ border: none;
+ border-radius: var(--border-radius-small);
+ background: transparent;
+ color: var(--primary-text-color);
+ cursor: pointer;
+ font: inherit;
+ text-align: start;
+
+ &:hover {
+ background-color: var(--primary-background-hover-color);
+ }
+}
+
+.sectionLabelGroup {
+ display: inline-flex;
+ align-items: center;
+ gap: var(--space-4);
+ min-width: 0;
+}
+
+.workspaceAgentStack {
+ display: inline-flex;
+ align-items: center;
+ margin-inline-start: auto;
+ padding-inline-end: var(--space-8);
+}
+
+.workspaceAgentStackItem {
+ display: inline-flex;
+ width: 22px;
+ height: 22px;
+ border-radius: 50%;
+ overflow: hidden;
+ box-shadow: 0 0 0 2px var(--primary-background-color);
+
+ & + & {
+ margin-inline-start: -6px;
+ }
+}
+
+.workspaceAgentsBlock {
+ display: flex;
+ flex-direction: column;
+ margin-block-start: var(--space-12);
+ margin-block-end: var(--space-12);
+}
+
+.workspaceAgentsList {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-2);
+ width: 100%;
+}
+
+.workspaceAgentRow {
+ display: flex;
+ width: 100%;
+ align-items: center;
+ gap: var(--space-12);
+ min-height: var(--space-40);
+ padding-block: var(--space-4);
+ padding-inline: var(--space-8);
+ border: var(--border-width) solid transparent;
+ border-radius: var(--border-radius-small);
+ background-color: transparent;
+ color: var(--primary-text-color);
+ cursor: pointer;
+ font: inherit;
+ text-align: start;
+ min-width: 0;
+
+ &:hover,
+ &:focus-visible {
+ background-color: var(--primary-background-hover-color);
+ outline: none;
+ }
+}
+
+.workspaceAgentRowAvatar {
+ position: relative;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ flex: 0 0 44px;
+ width: 44px;
+ height: 44px;
+}
+
+.workspaceAgentRowText {
+ display: flex;
+ flex: 1 1 auto;
+ flex-direction: column;
+ gap: 0;
+ min-width: 0;
+}
+
+.workspaceAgentRowName,
+.workspaceAgentRowRole {
+ display: block;
+ font-family: var(--boards-font-family);
+ font-size: 0.75rem;
+ line-height: var(--space-16);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.workspaceAgentRowName {
+ font-weight: var(--font-weight-bold);
+ color: var(--primary-text-color);
+}
+
+.workspaceAgentRowRole {
+ color: var(--secondary-text-color);
+}
+
+.sectionLabel {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ color: var(--primary-text-color);
+ font-family: var(--boards-font-family);
+ font-size: 0.75rem;
+ font-weight: var(--font-weight-bold);
+ line-height: var(--space-16);
+}
+
+.chevron {
+ display: inline-flex;
+ width: var(--space-12);
+ height: var(--space-12);
+ align-items: center;
+ justify-content: center;
+ flex: 0 0 auto;
+ line-height: 0;
+ color: var(--secondary-text-color);
+
+ svg {
+ display: block;
+ flex: 0 0 auto;
+ }
+}
+
+.treeChevron {
+ width: var(--space-16);
+ height: var(--space-16);
+ flex: 0 0 var(--space-16);
+ line-height: 0;
+
+ svg {
+ width: var(--space-16);
+ height: var(--space-16);
+ flex-basis: var(--space-16);
+ }
+}
+
+.contentSection {
+ display: flex;
+ flex-direction: column;
+ min-height: 0;
+ width: 100%;
+}
+
+.navTree {
+ display: flex;
+ flex: 1 1 auto;
+ flex-direction: column;
+ gap: 1px;
+ min-height: 0;
+ width: 100%;
+ overflow: hidden auto;
+ padding-bottom: var(--space-12);
+}
+
+.folderGroup {
+ display: flex;
+ flex-direction: column;
+ gap: 1px;
+ width: 100%;
+}
+
+.treeRow {
+ --tree-indent: 0px;
+
+ display: flex;
+ width: calc(100% - var(--tree-indent));
+ height: var(--space-32);
+ align-items: center;
+ gap: var(--space-8);
+ margin-inline-start: var(--tree-indent);
+ padding-block: var(--space-8);
+ padding-inline-end: 0;
+ padding-inline-start: var(--space-8);
+ border: var(--border-width) solid transparent;
+ border-radius: var(--border-radius-small);
+ background: transparent;
+ color: var(--secondary-text-color);
+ cursor: pointer;
+ font-family: var(--boards-font-family);
+ font-size: 0.875rem;
+ font-weight: var(--font-weight-normal);
+ line-height: var(--space-20);
+ min-width: 0;
+ position: relative;
+ text-align: start;
+
+ &:hover {
+ background-color: var(--primary-background-hover-color);
+ }
+}
+
+.treeRowSelected {
+ background-color: var(--primary-selected-color);
+ color: var(--primary-text-color);
+ overflow: visible;
+
+ &:hover {
+ background-color: var(--primary-selected-hover-color);
+ }
+
+ .treeRowIcon,
+ .treeRowChevron {
+ color: var(--primary-text-color);
+ }
+}
+
+.treeRowFolder {
+ color: var(--folder-color, var(--secondary-text-color));
+
+ .treeChevron {
+ color: currentColor;
+ }
+}
+
+.treeRowIcon,
+.treeRowChevron {
+ flex: 0 0 auto;
+ color: var(--secondary-text-color);
+}
+
+.treeRowTrailingIcon {
+ flex: 0 0 auto;
+ margin-inline-start: auto;
+ margin-inline-end: var(--space-8);
+ color: var(--secondary-text-color);
+}
+
+.treeRowBadge {
+ flex: 0 0 auto;
+ margin-inline-start: auto;
+ margin-inline-end: var(--space-8);
+ pointer-events: none;
+}
+
+.treeRowBadge + .treeRowTrailingIcon {
+ margin-inline-start: 0;
+}
+
+.treeRowLabel {
+ display: block;
+ flex: 1 1 auto;
+ min-width: 0;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ color: currentColor;
+ font-family: var(--boards-font-family);
+ font-size: 0.875rem;
+ line-height: var(--space-20);
+}
+
+.panelBg {
+ position: absolute;
+ inset: 0;
+ pointer-events: none;
+}
+
+.panelBgLayer {
+ position: absolute;
+ inset: 0;
+}
+
+.panelBgLayerBase {
+ background-color: var(--primary-background-color);
+}
+
+.panelBgLayerSheen {
+ background-image: none;
+}
+
+.workspaceMenuDialog {
+ z-index: 10000;
+}
+
+.utilityPanelContent {
+ display: flex;
+ flex: 1 1 auto;
+ flex-direction: column;
+ gap: var(--space-12);
+ min-height: 0;
+ padding-block-end: 0;
+ overflow: hidden auto;
+}
+
+.utilityHero {
+ --utility-hero-sheen: color-mix(
+ in srgb,
+ var(--primary-highlighted-color) 88%,
+ transparent
+ );
+ --utility-hero-base: var(--primary-surface-color);
+ --utility-hero-end: color-mix(
+ in srgb,
+ var(--ui-background-color) 58%,
+ var(--primary-surface-color)
+ );
+
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-8);
+ padding: var(--space-16);
+ border: var(--border-width) solid
+ color-mix(in srgb, var(--ui-border-color) 70%, transparent);
+ border-radius: calc(var(--border-radius-big) + var(--space-2));
+ background:
+ radial-gradient(
+ circle at 85% 15%,
+ var(--utility-hero-sheen),
+ transparent 34%
+ ),
+ linear-gradient(
+ 135deg,
+ var(--utility-hero-base) 0%,
+ var(--utility-hero-end) 100%
+ );
+ box-shadow: var(--box-shadow-small);
+}
+
+.panelToneSidekick {
+ --product-panel-accent: var(--primary-color);
+ --product-panel-accent-soft: color-mix(
+ in srgb,
+ var(--primary-color) 12%,
+ transparent
+ );
+ --product-panel-surface: color-mix(
+ in srgb,
+ var(--primary-background-color) 86%,
+ var(--primary-surface-color)
+ );
+}
+
+.panelToneAgents {
+ --product-panel-accent: var(--positive-color);
+ --product-panel-accent-soft: color-mix(
+ in srgb,
+ var(--positive-color) 11%,
+ transparent
+ );
+ --product-panel-surface: color-mix(
+ in srgb,
+ var(--primary-background-color) 90%,
+ var(--primary-surface-color)
+ );
+}
+
+.panelToneVibe {
+ --product-panel-accent: var(--primary-color);
+ --product-panel-accent-soft: color-mix(
+ in srgb,
+ var(--primary-color) 10%,
+ transparent
+ );
+ --product-panel-surface: var(--vibe-sidebar-surface, #f3f8ff);
+ --product-panel-surface-strong: color-mix(
+ in srgb,
+ var(--vibe-sidebar-surface, var(--primary-background-color)) 88%,
+ var(--primary-background-color)
+ );
+}
+
+.panelToneNotetaker {
+ --product-panel-accent: var(--primary-color);
+ --product-panel-accent-soft: color-mix(
+ in srgb,
+ var(--primary-color) 8%,
+ transparent
+ );
+}
+
+.panelToneFavorites {
+ --product-panel-accent: var(--primary-color);
+ --product-panel-accent-soft: color-mix(
+ in srgb,
+ var(--primary-color) 10%,
+ transparent
+ );
+}
+
+.panelToneMore {
+ --product-panel-accent: var(--secondary-text-color);
+ --product-panel-accent-soft: color-mix(
+ in srgb,
+ var(--secondary-text-color) 8%,
+ transparent
+ );
+}
+
+.utilityEyebrow {
+ width: fit-content;
+ padding: var(--space-2) var(--space-8);
+ border-radius: var(--border-radius-big);
+ background-color: color-mix(
+ in srgb,
+ var(--ui-background-color) 72%,
+ transparent
+ );
+ color: var(--secondary-text-color);
+ font-family: var(--boards-font-family);
+ font-size: 0.75rem;
+ font-weight: var(--font-weight-medium);
+ line-height: var(--space-16);
+}
+
+.utilityHeroTitle {
+ line-height: 1.25;
+}
+
+.utilityHeroDescription {
+ line-height: 1.35;
+}
+
+.utilityPrimaryAction {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: fit-content;
+ min-height: var(--space-32);
+ margin-top: var(--space-4);
+ padding: 0 var(--space-12);
+ border: none;
+ border-radius: var(--border-radius-small);
+ background-color: var(--primary-color);
+ color: var(--text-color-on-primary);
+ cursor: pointer;
+ font-family: var(--boards-font-family);
+ font-size: 0.75rem;
+ font-weight: var(--font-weight-medium);
+
+ &:hover,
+ &:focus-visible {
+ background-color: var(--primary-hover-color);
+ outline: none;
+ }
+}
+
+.utilityQuickActions {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: var(--space-8);
+}
+
+.utilityQuickAction {
+ min-height: var(--space-48);
+ padding: var(--space-8);
+ border: var(--border-width) solid var(--ui-border-color);
+ border-radius: var(--border-radius-medium);
+ background-color: color-mix(
+ in srgb,
+ var(--primary-background-color) 84%,
+ transparent
+ );
+ color: var(--primary-text-color);
+ cursor: pointer;
+ font-family: var(--boards-font-family);
+ font-size: 0.75rem;
+ line-height: 1.25;
+ text-align: start;
+
+ &:hover,
+ &:focus-visible {
+ border-color: color-mix(
+ in srgb,
+ var(--primary-color) 36%,
+ var(--ui-border-color)
+ );
+ background-color: var(--primary-background-hover-color);
+ outline: none;
+ }
+}
+
+.utilityListBlock {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-8);
+}
+
+.utilityListHeader {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: var(--space-8) 0 var(--space-8) var(--space-8);
+ color: var(--primary-text-color);
+ font-family: var(--boards-font-family);
+ font-size: 0.75rem;
+ font-weight: var(--font-weight-bold);
+}
+
+.utilityListHeaderAction {
+ border: none;
+ background: transparent;
+ color: var(--primary-color);
+ cursor: pointer;
+ font-family: var(--boards-font-family);
+ font-size: 0.75rem;
+ font-weight: var(--font-weight-medium);
+}
+
+.utilityList {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-4);
+}
+
+.utilityListItem {
+ display: flex;
+ align-items: center;
+ gap: var(--space-8);
+ min-height: var(--space-48);
+ padding: var(--space-8);
+ border: none;
+ border-radius: var(--border-radius-medium);
+ background-color: color-mix(
+ in srgb,
+ var(--primary-background-color) 72%,
+ transparent
+ );
+ color: var(--primary-text-color);
+ cursor: pointer;
+ font: inherit;
+ text-align: start;
+
+ &:hover,
+ &:focus-visible {
+ background-color: var(--primary-background-hover-color);
+ outline: none;
+ }
+}
+
+.utilityListItemIcon {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: calc(var(--space-24) + var(--space-4));
+ height: calc(var(--space-24) + var(--space-4));
+ flex: 0 0 auto;
+ border-radius: var(--border-radius-small);
+ background-color: color-mix(
+ in srgb,
+ var(--primary-color) 16%,
+ var(--primary-surface-color)
+ );
+ color: var(--primary-color);
+ font-family: var(--boards-font-family);
+ font-size: 0.75rem;
+ font-weight: var(--font-weight-medium);
+}
+
+.utilityListItemText {
+ display: flex;
+ flex: 1 1 auto;
+ flex-direction: column;
+ gap: var(--space-2);
+ min-width: 0;
+}
+
+.utilityListItemLabel,
+.utilityListItemMeta {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ font-family: var(--boards-font-family);
+}
+
+.utilityListItemLabel {
+ color: var(--primary-text-color);
+ font-size: 0.75rem;
+ line-height: 1.2;
+}
+
+.utilityListItemMeta {
+ color: var(--secondary-text-color);
+ font-size: 0.75rem;
+ line-height: 1.2;
+}
+
+.utilityListItemAccent {
+ flex: 0 0 auto;
+ padding: var(--space-2) calc(var(--space-4) + var(--space-2));
+ border-radius: var(--border-radius-small);
+ background-color: color-mix(
+ in srgb,
+ var(--primary-selected-color) 74%,
+ transparent
+ );
+ color: var(--primary-color);
+ font-family: var(--boards-font-family);
+ font-size: 0.75rem;
+ font-weight: var(--font-weight-medium);
+}
+
+.productPanelContent {
+ --product-panel-accent: var(--primary-color);
+ --product-panel-accent-soft: color-mix(
+ in srgb,
+ var(--primary-color) 10%,
+ transparent
+ );
+ --product-panel-surface: color-mix(
+ in srgb,
+ var(--primary-background-color) 88%,
+ var(--primary-surface-color)
+ );
+ --product-panel-surface-strong: color-mix(
+ in srgb,
+ var(--primary-background-color) 96%,
+ var(--primary-surface-color)
+ );
+ --product-panel-border: color-mix(
+ in srgb,
+ var(--ui-border-color) 72%,
+ transparent
+ );
+ --product-panel-shadow: 0 var(--border-width) var(--space-4)
+ color-mix(in srgb, var(--primary-text-color) 8%, transparent);
+
+ gap: var(--space-8);
+ padding-block-end: 0;
+}
+
+.vibePanelContent {
+ gap: var(--space-4);
+ overflow-x: hidden;
+ padding-block-end: 0;
+
+ .productSection {
+ flex-shrink: 0;
+ }
+
+ .productSection + .productSection {
+ margin-top: var(--space-12);
+ }
+
+ .productSectionHeader {
+ height: var(--space-32);
+ min-height: var(--space-32);
+ margin-bottom: var(--space-4);
+ padding-inline: var(--space-8) 0;
+ }
+
+ .productSectionTitle {
+ color: var(--primary-text-color);
+ font-size: 0.75rem;
+ font-weight: var(--font-weight-medium);
+ letter-spacing: 0;
+ }
+
+ .productRows {
+ gap: 0;
+ }
+
+ .productRow {
+ min-width: 0;
+ min-height: calc(var(--space-32) + var(--space-12));
+ gap: var(--space-8);
+ padding: var(--space-8);
+ border: 0;
+ border-radius: var(--border-radius-small);
+ transition: background-color 150ms ease;
+
+ &:hover,
+ &:focus-visible {
+ background-color: var(--vibe-sidebar-surface-hover);
+ outline: none;
+
+ .productRowAppIconNeutral {
+ background-color: color-mix(
+ in srgb,
+ var(--product-panel-accent) 14%,
+ var(--primary-background-color)
+ );
+ color: var(--product-panel-accent);
+
+ .productRowAppGlyph,
+ svg[class*="icon_"] {
+ color: var(--product-panel-accent);
+ }
+ }
+ }
+ }
+
+ .productRowAppIcon {
+ width: calc(var(--space-24) + var(--space-4));
+ height: calc(var(--space-24) + var(--space-4));
+ border-radius: 10px;
+ }
+
+ .productRowAppGlyph {
+ width: var(--space-16);
+ height: var(--space-16);
+ }
+
+ .productRowText {
+ gap: 0;
+ overflow: hidden;
+ }
+
+ .productRowLabel,
+ .productRowMeta {
+ min-width: 0;
+ font-size: 0.75rem;
+ line-height: var(--space-16);
+ }
+
+ .productRowLabel {
+ font-weight: var(--font-weight-medium);
+ }
+
+ .productRowMeta {
+ color: var(--secondary-text-color);
+ }
+
+ .productPanelFooter {
+ margin-top: auto;
+ padding-top: var(--space-8);
+ border-top-color: var(--product-panel-border);
+ }
+
+ .productFooterAction {
+ display: flex;
+ align-items: center;
+ gap: var(--space-8);
+ min-height: var(--space-32);
+ padding: 0 var(--space-8);
+ color: var(--secondary-text-color);
+ font-size: 0.875rem;
+
+ &:hover,
+ &:focus-visible {
+ background-color: var(--vibe-sidebar-surface-hover);
+ color: var(--primary-text-color);
+ }
+ }
+}
+
+.productPrimaryAction {
+ width: 100%;
+ justify-content: flex-start;
+ min-height: var(--space-32);
+ color: var(--primary-text-color);
+
+ // Match the top-bar Search icon — secondary text color.
+ svg {
+ color: var(--secondary-text-color);
+ }
+}
+
+.vibePrimaryAction {
+ min-width: 0;
+ border-radius: var(--border-radius-small);
+ background-color: var(--vibe-sidebar-selected) !important;
+ color: var(--primary-text-color) !important;
+ font-size: 0.875rem;
+ font-weight: var(--font-weight-normal);
+
+ &:hover,
+ &:focus-visible {
+ background-color: var(--vibe-sidebar-selected-hover) !important;
+ }
+}
+
+.productNavList {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-4);
+ width: 100%;
+}
+
+.productPrimaryActionIcon {
+ width: var(--space-16);
+ height: var(--space-16);
+ flex: 0 0 auto;
+}
+
+.productSearchField {
+ display: flex;
+ align-items: center;
+ gap: var(--space-6);
+ min-height: var(--space-32);
+ padding: 0 var(--space-8);
+ border: var(--border-width) solid var(--product-panel-border);
+ border-radius: var(--border-radius-small);
+ background-color: var(--product-panel-surface-strong);
+ color: var(--secondary-text-color);
+
+ &:focus-within {
+ border-color: color-mix(
+ in srgb,
+ var(--product-panel-accent) 42%,
+ var(--product-panel-border)
+ );
+ box-shadow: 0 0 0 var(--border-width) var(--product-panel-accent-soft);
+ }
+}
+
+.productSearchIcon {
+ width: var(--space-16);
+ height: var(--space-16);
+ flex: 0 0 auto;
+}
+
+.productSearchInput {
+ width: 100%;
+ min-width: 0;
+ border: 0;
+ background: transparent;
+ color: var(--primary-text-color);
+ font: inherit;
+ font-size: 0.75rem;
+ outline: none;
+
+ &::placeholder {
+ color: var(--placeholder-color);
+ }
+}
+
+.productHero {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-6);
+ padding: var(--space-12);
+ border: var(--border-width) solid var(--product-panel-border);
+ border-radius: var(--border-radius-medium);
+ background:
+ radial-gradient(
+ circle at 92% 0,
+ var(--product-panel-accent-soft),
+ transparent 38%
+ ),
+ var(--product-panel-surface);
+ box-shadow: var(--product-panel-shadow);
+}
+
+.productHeroEyebrow {
+ width: fit-content;
+ padding: 0 var(--space-6);
+ border-radius: var(--border-radius-big);
+ background-color: var(--product-panel-accent-soft);
+ line-height: var(--space-16);
+}
+
+.productHeroTitle {
+ margin: 0;
+ line-height: 1.18;
+}
+
+.productHeroDescription {
+ line-height: 1.3;
+}
+
+.productHeroMetrics {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: var(--space-6);
+ margin-top: var(--space-2);
+}
+
+.productHeroMetric {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-2);
+ min-width: 0;
+ padding: var(--space-6) var(--space-8);
+ border: var(--border-width) solid var(--product-panel-border);
+ border-radius: var(--border-radius-small);
+ background-color: color-mix(
+ in srgb,
+ var(--primary-background-color) 78%,
+ transparent
+ );
+}
+
+.productHeroMetricValue,
+.productHeroMetricLabel {
+ display: block;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.productHeroMetricValue {
+ line-height: var(--space-16);
+}
+
+.productHeroMetricLabel {
+ line-height: var(--space-12);
+}
+
+.productHeroAction {
+ width: 100%;
+ justify-content: center;
+ margin-top: var(--space-2);
+}
+
+.productChips {
+ display: flex;
+ flex-wrap: wrap;
+ gap: var(--space-4);
+}
+
+.productChip {
+ padding: 0 var(--space-6);
+ border: var(--border-width) solid var(--product-panel-border);
+ border-radius: var(--border-radius-small);
+ background-color: var(--product-panel-surface-strong);
+ line-height: var(--space-16);
+}
+
+.productSection {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-4);
+}
+
+.productSectionHeader {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ min-height: var(--space-32);
+ padding: var(--space-8) 0 var(--space-8) var(--space-8);
+}
+
+.productSectionTitle {
+ letter-spacing: 0.01em;
+ line-height: var(--space-16);
+ font-size: 0.75rem;
+ font-weight: var(--font-weight-bold);
+ color: var(--primary-text-color);
+}
+
+.productSectionAction {
+ border: 0;
+ background: transparent;
+ color: var(--primary-color);
+ cursor: pointer;
+ font: inherit;
+}
+
+.productRows {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-2);
+}
+
+/* Vibe Menu used for single-line sidebar lists (chats, nav) — strip its default
+ chrome so it sits flush in the panel. */
+/* Vibe Menu used for single-line sidebar lists (chats, nav) — strip its default
+ chrome so it sits flush in the panel. */
+.productSimpleRows {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-4);
+ min-width: 0;
+}
+
+.productSimpleRow {
+ display: flex;
+ align-items: center;
+ gap: var(--space-8);
+ width: 100%;
+ min-width: 0;
+ min-height: var(--space-32);
+ padding: 0 var(--space-8);
+ border: 0;
+ border-radius: var(--border-radius-small);
+ background: transparent;
+ color: var(--secondary-text-color);
+ cursor: pointer;
+ font: inherit;
+ text-align: start;
+
+ &:hover,
+ &:focus-visible {
+ background-color: var(
+ --vibe-sidebar-surface-hover,
+ var(--primary-background-hover-color)
+ );
+ color: var(--primary-text-color);
+ outline: none;
+ }
+}
+
+.productSimpleRowSelected {
+ background-color: var(--vibe-sidebar-selected, var(--primary-selected-color));
+ color: var(--primary-text-color);
+}
+
+.productSimpleRowIcon {
+ width: var(--space-20);
+ height: var(--space-20);
+ flex: 0 0 auto;
+ color: var(--icon-color);
+}
+
+.productSimpleRowLabel {
+ flex: 1 1 auto;
+ min-width: 0;
+}
+
+.productMenu {
+ width: 100%;
+ min-width: 0;
+ padding: 0;
+ background: transparent;
+ box-shadow: none;
+ border: none;
+
+ :global([class*="menuItem"]):not([class*="selected"]),
+ :global([class*="menuItem"]):not([class*="selected"])
+ :global([class*="menuTitle"]) {
+ color: var(--secondary-text-color);
+ }
+}
+
+.productRow {
+ display: flex;
+ align-items: center;
+ gap: var(--space-12);
+ width: 100%;
+ min-height: var(--space-40);
+ padding-block: var(--space-8);
+ padding-inline: var(--space-8);
+ border: var(--border-width) solid transparent;
+ border-radius: var(--border-radius-small);
+ background-color: transparent;
+ color: var(--primary-text-color);
+ cursor: pointer;
+ font: inherit;
+ position: relative;
+ text-align: start;
+
+ &:hover,
+ &:focus-visible {
+ background-color: var(--primary-background-hover-color);
+ outline: none;
+ }
+
+ &:focus-visible {
+ box-shadow: inset 0 0 0 var(--border-width) var(--product-panel-accent);
+ }
+}
+
+.productRowGlass {
+ position: relative;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ flex: 0 0 44px;
+ width: 44px;
+ height: 44px;
+}
+
+.productRowAvatar {
+ position: relative;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ flex: 0 0 var(--space-32);
+ width: var(--space-32);
+ height: var(--space-32);
+ border-radius: var(--border-radius-small);
+ overflow: hidden;
+
+ :global([class*="avatar_"]),
+ :global([class*="circle_"]) {
+ width: var(--space-32) !important;
+ height: var(--space-32) !important;
+ min-width: var(--space-32);
+ min-height: var(--space-32);
+ border-radius: var(--border-radius-small);
+ }
+}
+
+.productRowOnline {
+ position: absolute;
+ right: -1px;
+ bottom: -1px;
+ width: 9px;
+ height: 9px;
+ border-radius: 50%;
+ background-color: var(--positive-color);
+ border: 1.5px solid var(--primary-background-color);
+}
+
+.productRowAppIcon {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: var(--space-32);
+ height: var(--space-32);
+ flex: 0 0 auto;
+ border-radius: var(--border-radius-small);
+}
+
+.productRowAppIconNeutral {
+ background-color: color-mix(
+ in srgb,
+ var(--secondary-text-color) 8%,
+ var(--primary-background-color)
+ );
+ color: var(--primary-text-color);
+ border: var(--border-width) solid transparent;
+ box-sizing: border-box;
+ transition:
+ background-color 150ms ease,
+ color 150ms ease,
+ border-color 150ms ease;
+}
+
+.productRowAppIcon:not(.productRowAppIconNeutral) {
+ color: var(--fixed-light-color);
+}
+
+.productRowAppGlyph {
+ width: var(--space-20);
+ height: var(--space-20);
+ color: currentColor;
+}
+
+/* Keep the Vibe logo white on the gradient tile in every theme (global icon-color
+ rule would otherwise darken it). */
+.productRowAppIcon:not(.productRowAppIconNeutral) svg[class*="icon_"] {
+ color: currentColor;
+}
+
+.productRowCompact {
+ min-height: var(--space-28);
+ padding-block: var(--space-4);
+ padding-inline: var(--space-6);
+ border-color: transparent;
+ background-color: transparent;
+
+ .productRowIcon {
+ width: var(--space-20);
+ height: var(--space-20);
+ font-size: 0.75rem;
+ }
+}
+
+.productRowSelected {
+ border-color: color-mix(
+ in srgb,
+ var(--product-panel-accent) 32%,
+ transparent
+ );
+ background-color: var(--primary-selected-color);
+
+ &::before {
+ content: "";
+ position: absolute;
+ inset-block: var(--space-6);
+ inset-inline-start: 0;
+ width: var(--border-width);
+ border-radius: var(--border-radius-big);
+ background-color: var(--product-panel-accent);
+ }
+}
+
+.productRowIcon {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: var(--space-24);
+ height: var(--space-24);
+ flex: 0 0 auto;
+ border-radius: var(--border-radius-small);
+ background-color: color-mix(
+ in srgb,
+ var(--product-panel-accent) 11%,
+ var(--primary-surface-color)
+ );
+ color: var(--product-panel-accent);
+ font-family: var(--boards-font-family);
+ font-size: 0.75rem;
+ font-weight: var(--font-weight-medium);
+ line-height: 1;
+}
+
+.productRowIconConversation {
+ background-color: var(--product-panel-accent-soft);
+}
+
+.productRowIconPrompt {
+ background-color: color-mix(
+ in srgb,
+ var(--product-panel-accent) 14%,
+ var(--primary-background-color)
+ );
+}
+
+.productRowIconAgent,
+.productRowIconApp,
+.productRowIconMeeting,
+.productRowIconFavorite,
+.productRowIconTool {
+ background-color: color-mix(
+ in srgb,
+ var(--secondary-text-color) 8%,
+ var(--primary-background-color)
+ );
+ color: var(--primary-text-color);
+}
+
+.productRowText {
+ display: flex;
+ flex: 1 1 auto;
+ flex-direction: column;
+ gap: 1px;
+ min-width: 0;
+}
+
+.productRowLabel,
+.productRowMeta,
+.productRowTrailing {
+ display: block;
+ font-size: 0.75rem;
+ line-height: var(--space-16);
+}
+
+.productRowLabel {
+ font-weight: var(--font-weight-bold);
+}
+
+.productRowText {
+ gap: 0;
+}
+
+.productRowTrailing {
+ flex: 0 0 auto;
+ max-width: var(--space-48);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.productBadge {
+ flex: 0 0 auto;
+ padding: 0 var(--space-6);
+ border-radius: var(--border-radius-small);
+ background-color: var(--product-panel-accent-soft);
+ line-height: var(--space-16);
+}
+
+.productPanelFooter {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-2);
+ margin-top: auto;
+ padding-top: var(--space-8);
+ padding-bottom: var(--space-4);
+ border-top: var(--border-width) solid var(--product-panel-border);
+}
+
+.productFooterAction {
+ display: flex;
+ align-items: center;
+ min-height: var(--space-32);
+ padding: var(--space-4) var(--space-8);
+ border: 0;
+ border-radius: var(--border-radius-small);
+ background: transparent;
+ color: var(--secondary-text-color);
+ cursor: pointer;
+ font-family: var(--boards-font-family);
+ font-size: 0.875rem;
+ font-weight: var(--font-weight-normal);
+ line-height: var(--space-20);
+ text-align: start;
+
+ &:hover,
+ &:focus-visible {
+ background-color: var(--primary-background-hover-color);
+ color: var(--primary-text-color);
+ outline: none;
+ }
+}
+
+.productFooterActionIcon {
+ width: var(--space-20);
+ height: var(--space-20);
+ flex: 0 0 auto;
+ color: var(--icon-color);
+}
+
+.productFooterActionLabel {
+ min-width: 0;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+/* Dark/black — ui-surface hovers (matches My apps / productSimpleRow); override light accent tint */
+:global(html.dark-app-theme),
+:global(html.black-app-theme) {
+ .panelVibe {
+ --vibe-sidebar-surface-hover: var(--ui-background-hover-color);
+ }
+
+ .productRowAppIconNeutral {
+ background-color: var(--ui-background-color);
+ color: var(--icon-color);
+ }
+
+ .vibePanelContent {
+ .productRow {
+ &:hover,
+ &:focus-visible {
+ .productRowAppIconNeutral {
+ background-color: color-mix(
+ in srgb,
+ var(--product-panel-accent) 10%,
+ var(--ui-background-color)
+ );
+ border-color: color-mix(
+ in srgb,
+ var(--product-panel-accent) 24%,
+ var(--ui-border-color)
+ );
+ color: var(--product-panel-accent);
+
+ .productRowAppGlyph,
+ svg[class*="icon_"] {
+ color: var(--product-panel-accent);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/apps/kitchen-sink/src/screens/components/LeftPaneContent.tsx b/apps/kitchen-sink/src/screens/components/LeftPaneContent.tsx
new file mode 100644
index 0000000000..d29ffc93f9
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/LeftPaneContent.tsx
@@ -0,0 +1,1562 @@
+import { useState, useCallback } from "react";
+import { useWorkspaceSelection } from "../context/WorkspaceSelectionContext";
+import {
+ Box,
+ Flex,
+ Text,
+ Heading,
+ Avatar,
+ Button,
+ Icon,
+ IconButton,
+ Dropdown,
+ Menu,
+ MenuItem,
+ Search,
+ Label,
+ type DropdownOption,
+ type AvatarProps,
+} from "@vibe/core";
+import {
+ ActivityLog,
+ Add,
+ AgentsLogo,
+ Board,
+ Doc,
+ Edit,
+ Favorite,
+ Feedback,
+ Home,
+ MondayVibeLogo,
+ SidebarCollapsed,
+} from "@mondaydotcomorg/icons";
+import {
+ DEFAULT_EXPANDED_FOLDERS,
+ WORKSPACE_NAV_TREE,
+ type NavItemIcon,
+ type NavTreeNode,
+} from "../data/workspaceNavTree";
+// Deep import (not the package barrel) — the barrel pulls chat-client → trident-runtime
+// (monolith-only) which breaks the Vite build. AgentAvatar only needs @vibe/core.
+import AgentAvatar from "@mondaydotcomorg/monday-ui-components/dist/esm/monday-ui-components/src/components/AgentAvatar/AgentAvatar.js";
+import type { AgentsView } from "../context/AgentsViewContext";
+import { useAgentsView } from "../context/AgentsViewContext";
+import { useSidekickView } from "../context/SidekickViewContext";
+import type { RailItemId } from "./NavigationRail";
+import { SIDEKICK_CHATS } from "../data/sidekickChats";
+import { GlassAgentTile, type GlassAgentTileVariant } from "./GlassAgentTile";
+import styles from "./LeftPaneContent.module.scss";
+
+// eslint-disable-next-line @typescript-eslint/no-explicit-any
+type AnyIcon = React.FC;
+
+const NAV_ITEM_ICONS: Record = {
+ home: Home,
+ board: Board,
+ doc: Doc,
+ apps: Board,
+ star: Favorite,
+};
+
+type WorkspaceOption = DropdownOption<{
+ avatarText: string;
+ backgroundColor: NonNullable;
+}>;
+
+const WORKSPACE_OPTIONS: WorkspaceOption[] = [
+ {
+ value: "vibe-design",
+ label: "Vibe - Design",
+ avatarText: "V",
+ backgroundColor: "dark_purple",
+ },
+];
+
+type UtilityPanelId = Exclude;
+
+interface InlinePanelIconProps {
+ className?: string;
+}
+
+interface UtilityPanelRow {
+ label: string;
+ /** Leading icon for nav-button rows (Vibe Button leftIcon). */
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ leftIcon?: React.FC;
+ meta?: string;
+ badge?: string;
+ avatarText?: string;
+ /** Circular profile image (e.g. agent photo). */
+ image?: string;
+ /** Tint behind agent portrait tiles (Glaze agent rows). */
+ avatarBg?: string;
+ /** When set, renders a coded glass agent tile instead of an image avatar. */
+ glassVariant?: GlassAgentTileVariant;
+ /** Show a green presence dot on the avatar. */
+ online?: boolean;
+ /** CSS gradient for the app-tile icon (Vibe apps). */
+ iconGradient?: string;
+ indicator?:
+ | "conversation"
+ | "prompt"
+ | "agent"
+ | "app"
+ | "meeting"
+ | "favorite"
+ | "tool";
+ trailing?: string;
+ selected?: boolean;
+ /** Agents panel nav — switches main content view when clicked. */
+ navAction?: AgentsView;
+ /** Sidekick chat list — opens the chat surface for this scenario when clicked. */
+ chatId?: string;
+ /** Icon used when the parent section renders as a workspace-style nav tree. */
+ treeIcon?: NavItemIcon;
+ /** Optional trailing icon for nav-tree rows. */
+ treeTrailingIcon?: NavItemIcon;
+}
+
+interface UtilityPanelSection {
+ title?: string;
+ action?: string;
+ rows: UtilityPanelRow[];
+ /** Render rows as plain single-line items (no icon, meta, or border) — e.g. chat history. */
+ simpleList?: boolean;
+ /** Render rows as full-width tertiary buttons matching the panel's primary action. */
+ navButtons?: boolean;
+ /** Render rows as workspace-style nav tree items (icon + label, no meta). */
+ navTree?: boolean;
+}
+
+interface UtilityHero {
+ eyebrow?: string;
+ title: string;
+ description: string;
+ primaryAction?: string;
+ chips?: string[];
+ metrics?: UtilityHeroMetric[];
+}
+
+interface UtilityHeroMetric {
+ label: string;
+ value: string;
+}
+
+interface UtilityPanelState {
+ title: string;
+ menuLabel: string;
+ primaryAction: string;
+ primaryActionIcon?: "edit" | "plus";
+ searchPlaceholder?: string;
+ navSections: UtilityPanelSection[];
+ hero?: UtilityHero;
+ contentSections: UtilityPanelSection[];
+ footerActions: string[];
+}
+
+const UTILITY_PANEL_STATES: Record = {
+ "home-modes": {
+ title: "Home",
+ menuLabel: "Home menu",
+ primaryAction: "New chat",
+ primaryActionIcon: "edit",
+ searchPlaceholder: "Search conversations",
+ navSections: [
+ {
+ title: "All chats",
+ simpleList: true,
+ rows: SIDEKICK_CHATS.map((chat) => ({
+ label: chat.title,
+ chatId: chat.id,
+ })),
+ },
+ ],
+ contentSections: [],
+ footerActions: ["Settings", "Give feedback"],
+ },
+ sidekick: {
+ title: "Sidekick",
+ menuLabel: "Sidekick menu",
+ primaryAction: "New chat",
+ primaryActionIcon: "edit",
+ searchPlaceholder: "Search Sidekick history",
+ navSections: [
+ {
+ title: "All chats",
+ simpleList: true,
+ rows: SIDEKICK_CHATS.map((chat) => ({
+ label: chat.title,
+ chatId: chat.id,
+ })),
+ },
+ ],
+ contentSections: [],
+ footerActions: ["Get Sidekick on mobile", "Settings", "Give feedback"],
+ },
+ agents: {
+ title: "Agents",
+ menuLabel: "Agents menu",
+ primaryAction: "New agent",
+ navSections: [
+ {
+ navButtons: true,
+ rows: [
+ { label: "Manage agents", navAction: "manage", leftIcon: AgentsLogo },
+ { label: "Feed", navAction: "feed", leftIcon: ActivityLog },
+ ],
+ },
+ ],
+ contentSections: [
+ {
+ title: "My agents",
+ rows: [
+ {
+ label: "Elena",
+ meta: "Response Triage & Cohort Router",
+ glassVariant: 1,
+ indicator: "agent",
+ },
+ {
+ label: "Fiona",
+ meta: "Response Triage & Cohort Router",
+ glassVariant: 2,
+ indicator: "agent",
+ },
+ {
+ label: "Sarah",
+ meta: "Sprint Intake Triage Lead",
+ glassVariant: 3,
+ indicator: "agent",
+ },
+ {
+ label: "Brittany",
+ meta: "Leave Status Agent",
+ glassVariant: 4,
+ online: true,
+ indicator: "agent",
+ },
+ ],
+ },
+ ],
+ footerActions: ["Skill hub", "Give us feedback"],
+ },
+ vibe: {
+ title: "Vibe",
+ menuLabel: "Vibe menu",
+ primaryAction: "New Vibe app",
+ navSections: [
+ {
+ simpleList: true,
+ rows: [{ label: "My apps" }],
+ },
+ ],
+ contentSections: [
+ {
+ title: "Recent apps",
+ rows: [
+ {
+ label: "Onboarding Progress",
+ meta: "Published",
+ indicator: "app",
+ },
+ {
+ label: "Vibe Activity",
+ meta: "Published",
+ indicator: "app",
+ },
+ {
+ label: "Design System Feed",
+ meta: "Draft",
+ indicator: "app",
+ },
+ {
+ label: "Workshop Insights",
+ meta: "Published",
+ indicator: "app",
+ },
+ {
+ label: "Code Progress",
+ meta: "Draft",
+ indicator: "app",
+ },
+ ],
+ },
+ ],
+ footerActions: ["Give us feedback"],
+ },
+ notetaker: {
+ title: "AI Notetaker",
+ menuLabel: "Notetaker menu",
+ primaryAction: "Invite via URL",
+ navSections: [],
+ contentSections: [
+ {
+ title: "Upcoming",
+ rows: [
+ {
+ label: "Lunch break",
+ meta: "Now, today at 12:00 pm",
+ badge: "Next",
+ indicator: "meeting",
+ },
+ {
+ label: "Weekly 1:1",
+ meta: "Today at 2:00 pm",
+ indicator: "meeting",
+ },
+ {
+ label: "Team Weekly Sync",
+ meta: "Today at 3:00 pm",
+ indicator: "meeting",
+ },
+ {
+ label: "Candidate Interview",
+ meta: "Today at 4:00 pm",
+ indicator: "meeting",
+ },
+ ],
+ },
+ {
+ title: "Meeting summaries",
+ rows: [
+ {
+ label: "Product Sync",
+ meta: "Recorded · 36m 48s",
+ indicator: "meeting",
+ },
+ {
+ label: "Design Review",
+ meta: "Recorded · 35m 40s",
+ indicator: "meeting",
+ },
+ {
+ label: "Engineering Sync",
+ meta: "Recorded · 46m 20s",
+ indicator: "meeting",
+ },
+ ],
+ },
+ ],
+ footerActions: ["Learn more", "Give feedback", "Settings"],
+ },
+ favorites: {
+ title: "Favorites",
+ menuLabel: "Favorites menu",
+ primaryAction: "Add favorite",
+ navSections: [],
+ contentSections: [
+ {
+ title: "Favorites",
+ navTree: true,
+ rows: [
+ { label: "New icon to Vibe - request form", treeIcon: "board" },
+ { label: "Icons catalog instructions", treeIcon: "doc" },
+ { label: "Approved icon workflow", treeIcon: "board" },
+ ],
+ },
+ {
+ title: "Recents",
+ navTree: true,
+ rows: [
+ {
+ label: "Asset deprecation template",
+ treeIcon: "board",
+ treeTrailingIcon: "star",
+ },
+ {
+ label: "Dropdown deprecation",
+ treeIcon: "doc",
+ treeTrailingIcon: "star",
+ },
+ {
+ label: "Modal deprecation",
+ treeIcon: "doc",
+ treeTrailingIcon: "star",
+ },
+ {
+ label: "Team weekly meeting",
+ treeIcon: "board",
+ treeTrailingIcon: "star",
+ },
+ {
+ label: "Marketing campaign",
+ treeIcon: "board",
+ treeTrailingIcon: "star",
+ },
+ ],
+ },
+ ],
+ footerActions: ["Manage favorites"],
+ },
+ more: {
+ title: "More",
+ menuLabel: "More tools menu",
+ primaryAction: "Browse tools",
+ navSections: [],
+ hero: {
+ title: "More workspace tools",
+ description:
+ "Templates, dashboards, marketplace apps, imports, and admin tools.",
+ },
+ contentSections: [
+ {
+ title: "Common tools",
+ rows: [
+ {
+ label: "Dashboards",
+ meta: "Visualize workspace data",
+ indicator: "tool",
+ },
+ {
+ label: "Apps marketplace",
+ meta: "Extend your workflow",
+ badge: "Popular",
+ indicator: "tool",
+ },
+ { label: "Trash", meta: "Restore deleted work", indicator: "tool" },
+ ],
+ },
+ ],
+ footerActions: ["Open marketplace"],
+ },
+};
+
+const PANEL_TONE_CLASSES: Record = {
+ "home-modes": styles.panelToneSidekick,
+ sidekick: styles.panelToneSidekick,
+ agents: styles.panelToneAgents,
+ vibe: styles.panelToneVibe,
+ notetaker: styles.panelToneNotetaker,
+ favorites: styles.panelToneFavorites,
+ more: styles.panelToneMore,
+};
+
+const ROW_INDICATOR_CLASSES: Record<
+ NonNullable,
+ string
+> = {
+ conversation: styles.productRowIconConversation,
+ prompt: styles.productRowIconPrompt,
+ agent: styles.productRowIconAgent,
+ app: styles.productRowIconApp,
+ meeting: styles.productRowIconMeeting,
+ favorite: styles.productRowIconFavorite,
+ tool: styles.productRowIconTool,
+};
+
+function workspaceOptionRow(option: WorkspaceOption) {
+ return (
+
+
+
+ {option.label}
+
+
+ );
+}
+
+function PanelBackground() {
+ return (
+
+ );
+}
+
+function PanelEllipsisIcon({ className }: InlinePanelIconProps) {
+ return (
+
+
+
+
+
+ );
+}
+
+function PanelSearchIcon({ className }: InlinePanelIconProps) {
+ return (
+
+
+
+
+ );
+}
+
+function PanelPlusIcon({ className }: InlinePanelIconProps) {
+ return (
+
+
+
+ );
+}
+
+function PanelIconButton({
+ label,
+ children,
+ onClick,
+ className,
+ testId,
+}: {
+ label: string;
+ children: React.ReactNode;
+ onClick?: () => void;
+ className?: string;
+ testId?: string;
+}) {
+ return (
+
+ {children}
+
+ );
+}
+
+function Chevron({
+ isExpanded,
+ variant = "section",
+}: {
+ isExpanded: boolean;
+ variant?: "section" | "tree";
+}) {
+ if (variant === "tree") {
+ return (
+
+
+
+
+
+ );
+ }
+
+ return (
+
+
+
+
+
+ );
+}
+
+function PanelHeader({
+ title,
+ menuLabel,
+ onCloseNavigation,
+}: {
+ title: string;
+ menuLabel: string;
+ onCloseNavigation: () => void;
+}) {
+ return (
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+function WorkspacePanelContent({
+ selectedItem,
+ onSelect,
+ onCloseNavigation,
+}: {
+ selectedItem: string;
+ onSelect: (id: string) => void;
+ onCloseNavigation: () => void;
+}) {
+ return (
+ <>
+
+
+
+
+ >
+ );
+}
+
+function UtilityPanelContent({
+ activePanel,
+ onCloseNavigation,
+}: {
+ activePanel: UtilityPanelId;
+ onCloseNavigation: () => void;
+}) {
+ const { view: agentsView, setView: setAgentsView } = useAgentsView();
+ const {
+ view: sidekickView,
+ chatTitle: sidekickChatTitle,
+ openChat: openSidekickChat,
+ goHome: goSidekickHome,
+ } = useSidekickView();
+ const state = UTILITY_PANEL_STATES[activePanel];
+ const isSidekick = activePanel === "sidekick";
+ const isVibePanel = activePanel === "vibe";
+
+ return (
+ <>
+
+
+ {isVibePanel ? (
+ <>
+
+ {state.primaryAction}
+
+
+ {state.navSections.map((section) => (
+
+ ))}
+
+ {state.contentSections.map((section) => (
+
+ ))}
+
+
+ {state.footerActions.map((action) => (
+
+
+
+ {action}
+
+
+ ))}
+
+ >
+ ) : (
+ <>
+ {(() => {
+ const [firstNav, ...restNav] = state.navSections;
+ const inlineNav = firstNav?.navButtons ? firstNav : undefined;
+ const otherNav = inlineNav ? restNav : state.navSections;
+ return (
+ <>
+
+ setAgentsView("home")
+ : isSidekick
+ ? () => goSidekickHome()
+ : undefined
+ }
+ >
+ {state.primaryAction}
+
+ {inlineNav?.rows.map((row) => {
+ const isActive = row.navAction
+ ? agentsView === row.navAction
+ : !!row.selected;
+ return (
+ setAgentsView(row.navAction!)
+ : undefined
+ }
+ >
+ {row.label}
+
+ );
+ })}
+
+
+ {state.searchPlaceholder && (
+
+ )}
+
+ {otherNav.map((section) => (
+
+ ))}
+ >
+ );
+ })()}
+
+ {state.hero &&
}
+
+ {state.contentSections.map((section) => (
+
+ ))}
+
+
+ {state.footerActions.map((action) => (
+
+ {action}
+
+ ))}
+
+ >
+ )}
+
+ >
+ );
+}
+
+function getUtilitySectionKey(section: UtilityPanelSection, fallback: string) {
+ return (
+ section.title ??
+ `${fallback}-${section.rows.map((row) => row.label).join("-")}`
+ );
+}
+
+function UtilityPanelHero({ hero }: { hero: UtilityHero }) {
+ return (
+
+ {hero.eyebrow && (
+
+ {hero.eyebrow}
+
+ )}
+
+ {hero.title}
+
+
+ {hero.description}
+
+ {hero.metrics && (
+
+ {hero.metrics.map((metric) => (
+
+
+ {metric.value}
+
+
+ {metric.label}
+
+
+ ))}
+
+ )}
+ {hero.primaryAction && (
+
+ {hero.primaryAction}
+
+ )}
+ {hero.chips && (
+
+ {hero.chips.map((chip) => (
+
+ {chip}
+
+ ))}
+
+ )}
+
+ );
+}
+
+function UtilityPanelSectionView({
+ section,
+ compact = false,
+ variant = "default",
+ onNavAction,
+ activeNavAction,
+ onChatOpen,
+ activeChatTitle,
+}: {
+ section: UtilityPanelSection;
+ compact?: boolean;
+ variant?: "default" | "vibe";
+ onNavAction?: (action: AgentsView) => void;
+ activeNavAction?: AgentsView;
+ onChatOpen?: (chatId: string, chatTitle: string) => void;
+ activeChatTitle?: string;
+}) {
+ return (
+
+ {(section.title || section.action) && (
+
+ {section.title && (
+
+ {section.title}
+
+ )}
+ {section.action && (
+
+ {section.action}
+
+ )}
+
+ )}
+ {section.simpleList && variant === "vibe" ? (
+
+ {section.rows.map((row) => (
+
+
+
+ {row.label}
+
+
+ ))}
+
+ ) : section.navButtons ? (
+
+ {section.rows.map((row) => {
+ const isActive = row.navAction
+ ? activeNavAction === row.navAction
+ : !!row.selected;
+ return (
+ onNavAction(row.navAction!)
+ : undefined
+ }
+ >
+ {row.label}
+
+ );
+ })}
+
+ ) : section.navTree ? (
+
+ {section.rows.map((row) => (
+ {}}
+ />
+ ))}
+
+ ) : section.simpleList ? (
+
+ {section.rows.map((row) => (
+ onNavAction(row.navAction!)
+ : row.chatId && onChatOpen
+ ? () => onChatOpen(row.chatId!, row.label)
+ : undefined
+ }
+ />
+ ))}
+
+ ) : (
+
+ {section.rows.map((row) => (
+
+ ))}
+
+ )}
+
+ );
+}
+
+function UtilityPanelRowButton({
+ row,
+ compact,
+}: {
+ row: UtilityPanelRow;
+ compact: boolean;
+}) {
+ const indicator = row.indicator ?? "tool";
+
+ return (
+
+ {row.glassVariant ? (
+
+
+ {row.online && (
+
+ )}
+
+ ) : row.image ? (
+
+
+ {row.online && (
+
+ )}
+
+ ) : row.indicator === "app" && !row.iconGradient ? (
+
+
+
+ ) : row.iconGradient ? (
+
+
+
+ ) : row.avatarText ? (
+
+
+
+ ) : (
+
+ {getRowIndicatorLabel(indicator, row.label)}
+
+ )}
+
+
+ {row.label}
+
+ {row.meta && (
+
+ {row.meta}
+
+ )}
+
+ {row.trailing && (
+
+ {row.trailing}
+
+ )}
+ {row.badge && (
+
+ {row.badge}
+
+ )}
+
+ );
+}
+
+function getRowIndicatorLabel(
+ indicator: NonNullable,
+ fallback: string,
+) {
+ const indicatorLabels: Record<
+ NonNullable,
+ string
+ > = {
+ conversation: "S",
+ prompt: "AI",
+ agent: "A",
+ app: "V",
+ meeting: "N",
+ favorite: "*",
+ tool: fallback.charAt(0),
+ };
+
+ return indicatorLabels[indicator];
+}
+
+function WorkspaceSelector() {
+ const [workspace, setWorkspace] = useState(
+ WORKSPACE_OPTIONS[0],
+ );
+
+ return (
+
+
+ id="left-pane-workspace"
+ className={styles.workspaceDropdownWrap}
+ aria-label="Workspace"
+ menuAriaLabel="Workspaces"
+ size="small"
+ clearable={false}
+ searchable
+ options={WORKSPACE_OPTIONS}
+ value={workspace}
+ onChange={(option) => {
+ if (option) setWorkspace(option);
+ }}
+ valueRenderer={(option) => workspaceOptionRow(option)}
+ optionRenderer={(option) => workspaceOptionRow(option)}
+ />
+
+
+
+
+ );
+}
+
+const WORKSPACE_AGENTS: {
+ name: string;
+ role: string;
+ variant: GlassAgentTileVariant;
+}[] = [
+ { name: "Elena", role: "Response Triage & Cohort Router", variant: 1 },
+ { name: "Fiona", role: "Response Triage & Cohort Router", variant: 2 },
+ { name: "Sarah", role: "Sprint Intake Triage Lead", variant: 3 },
+];
+
+function MyWorkspaceAgentsRow() {
+ const [expanded, setExpanded] = useState(false);
+
+ return (
+
+
setExpanded((prev) => !prev)}
+ aria-expanded={expanded}
+ aria-label="My workspace agents"
+ >
+
+ My workspace agents
+
+
+ {!expanded && (
+
+ {WORKSPACE_AGENTS.map((agent) => (
+
+
+
+ ))}
+
+ )}
+
+ {expanded && (
+
+ {WORKSPACE_AGENTS.map((agent) => (
+
+
+
+
+
+
+ {agent.name}
+
+
+ {agent.role}
+
+
+
+ ))}
+
+ )}
+
+ );
+}
+
+function NavTreeItemRow({
+ label,
+ icon: ItemIcon,
+ trailingIcon: TrailingIcon,
+ badge,
+ depth,
+ selected,
+ onSelect,
+}: {
+ label: string;
+ icon: AnyIcon;
+ trailingIcon?: AnyIcon;
+ badge?: string;
+ depth: number;
+ selected: boolean;
+ onSelect: () => void;
+}) {
+ return (
+
+
+ {label}
+ {badge && (
+
+ )}
+ {TrailingIcon && (
+
+ )}
+
+ );
+}
+
+function NavTreeNodes({
+ nodes,
+ depth,
+ selectedItem,
+ expandedFolders,
+ onSelect,
+ onToggleFolder,
+}: {
+ nodes: NavTreeNode[];
+ depth: number;
+ selectedItem: string;
+ expandedFolders: Record;
+ onSelect: (id: string) => void;
+ onToggleFolder: (folderId: string) => void;
+}) {
+ return (
+ <>
+ {nodes.map((node) => {
+ if (node.type === "folder") {
+ const isExpanded = !!expandedFolders[node.id];
+ return (
+
+ onToggleFolder(node.id)}
+ aria-expanded={isExpanded}
+ aria-label={`Toggle ${node.label} folder`}
+ >
+
+ {node.label}
+
+ {isExpanded && node.children.length > 0 && (
+
+ )}
+
+ );
+ }
+
+ return (
+ onSelect(node.id)}
+ />
+ );
+ })}
+ >
+ );
+}
+
+function ContentSection({
+ selectedItem,
+ onSelect,
+}: {
+ selectedItem: string;
+ onSelect: (id: string) => void;
+}) {
+ const [contentExpanded, setContentExpanded] = useState(true);
+ const [expandedFolders, setExpandedFolders] = useState(
+ DEFAULT_EXPANDED_FOLDERS,
+ );
+
+ const toggleFolder = useCallback((folderId: string) => {
+ setExpandedFolders((prev) => ({ ...prev, [folderId]: !prev[folderId] }));
+ }, []);
+
+ return (
+
+
setContentExpanded((prev) => !prev)}
+ aria-expanded={contentExpanded}
+ aria-label="Toggle Content"
+ >
+
+ Content
+
+
+
+ {contentExpanded && (
+
+
+
+ )}
+
+ );
+}
+
+export interface LeftPaneContentProps {
+ activePanel: RailItemId;
+ onCloseNavigation: () => void;
+}
+
+export default function LeftPaneContent({
+ activePanel,
+ onCloseNavigation,
+}: LeftPaneContentProps) {
+ const { selectedId: selectedItem, setSelectedId } = useWorkspaceSelection();
+
+ const handleSelect = useCallback(
+ (id: string) => {
+ setSelectedId(id);
+ },
+ [setSelectedId],
+ );
+
+ return (
+
+
+
+
+ {activePanel === "workspace" ? (
+
+ ) : (
+
+ )}
+
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/screens/components/MainLayout.module.scss b/apps/kitchen-sink/src/screens/components/MainLayout.module.scss
new file mode 100644
index 0000000000..a90185e994
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/MainLayout.module.scss
@@ -0,0 +1,475 @@
+.root {
+ display: flex;
+ flex-direction: column;
+ align-items: stretch;
+ background-color: var(--primary-surface-color);
+ position: relative;
+ width: 100%;
+ max-width: 100%;
+ min-width: 0;
+ height: 100vh;
+ height: 100dvh;
+ overflow: hidden;
+}
+
+.topBarSlot {
+ height: var(--space-48);
+ width: 100%;
+ flex-shrink: 0;
+ background-color: var(--primary-surface-color);
+}
+
+.topBar {
+ display: flex;
+ height: 100%;
+ width: 100%;
+ align-items: center;
+ justify-content: space-between;
+ background-color: transparent;
+ padding: 0 var(--space-24) 0 var(--space-4);
+ position: relative;
+ font-size: 0.875rem;
+ line-height: 1.5;
+}
+
+.topBarLeft {
+ display: flex;
+ min-width: 0;
+ flex: 0 1 24rem;
+ align-items: center;
+ gap: var(--space-8);
+ overflow: hidden;
+ z-index: 1;
+}
+
+.topBarProductButton {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ /* Rail icons center at 36px from the shell edge; the top bar's 4px left padding
+ means a 64px (4rem) button centers the 32px mark at exactly 36px. */
+ width: 4rem;
+ height: var(--space-40);
+ flex: 0 0 auto;
+ border-radius: var(--border-radius-small);
+ overflow: hidden;
+}
+
+.topBarRight {
+ display: flex;
+ min-width: 0;
+ flex: 1 1 0%;
+ align-items: center;
+ justify-content: flex-end;
+ overflow-x: auto;
+ overflow-y: hidden;
+ flex-wrap: nowrap;
+ z-index: 1;
+}
+
+.topBarSearchSlot {
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ display: flex;
+ width: min(25rem, 36vw);
+ transform: translate(-50%, -50%);
+ z-index: 2;
+}
+
+.globalSearch {
+ display: flex;
+ align-items: center;
+ width: 100%;
+ height: var(--space-32);
+ gap: calc(var(--space-4) + var(--space-2));
+ padding: 0 var(--space-8);
+ border: var(--border-width) solid transparent;
+ border-radius: 100px;
+ background-color: var(--primary-background-color);
+ color: var(--secondary-text-color);
+ cursor: pointer;
+ font: inherit;
+
+ &:hover,
+ &:focus-visible {
+ background-color: var(--primary-highlighted-color);
+ border-color: var(--ui-border-color);
+ outline: none;
+ }
+}
+
+.globalSearchIcon {
+ flex: 0 0 auto;
+ color: var(--secondary-text-color);
+}
+
+.globalSearchLabel {
+ flex: 1 1 auto;
+ min-width: 0;
+ overflow: hidden;
+ text-align: start;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ font-family: var(--boards-font-family);
+ font-size: 0.75rem;
+}
+
+.globalSearchShortcut {
+ flex: 0 0 auto;
+ color: var(--secondary-text-color);
+ font-family: var(--boards-font-family);
+ font-size: 0.6875rem;
+ opacity: 0.72;
+}
+
+.avatarButton {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: var(--space-32);
+ height: var(--space-32);
+ padding: 0;
+ border: 0;
+ position: relative;
+ flex-shrink: 0;
+ border-radius: 50%;
+ background-color: transparent;
+ color: var(--primary-text-color);
+ cursor: pointer;
+
+ &:hover,
+ &:focus-visible {
+ background-color: var(--primary-background-hover-color);
+ outline: none;
+ }
+}
+
+.rightContainer {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: var(--space-4);
+ position: relative;
+ flex-shrink: 0;
+}
+
+/* Positioning wrapper so the notification badge/counter can overlay the Vibe IconButton. */
+.topBarAction {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ position: relative;
+ color: var(--primary-text-color);
+}
+
+.topBarActionIcon {
+ display: block;
+ width: var(--space-20);
+ height: var(--space-20);
+ flex: 0 0 auto;
+}
+
+.topBarNotificationBadge {
+ position: absolute;
+ top: 0;
+ right: 0;
+ display: inline-flex;
+ min-width: var(--space-16);
+ height: var(--space-16);
+ align-items: center;
+ justify-content: center;
+ padding: 0 var(--space-4);
+ border: var(--border-width) solid var(--primary-surface-color);
+ border-radius: 999px;
+ background-color: var(--negative-color);
+ color: var(--fixed-light-color);
+ font-family: var(--boards-font-family);
+ font-size: 0.625rem;
+ font-weight: var(--font-weight-medium);
+ line-height: 1;
+}
+
+.topBarCounter {
+ position: absolute;
+ top: 0;
+ right: var(--space-2);
+ color: var(--primary-text-color);
+ font-family: var(--boards-font-family);
+ font-size: 0.625rem;
+ font-weight: var(--font-weight-medium);
+ line-height: var(--space-12);
+}
+
+.divider28 {
+ height: calc(var(--space-24) + var(--space-4));
+ align-self: center;
+ margin-inline: var(--space-4);
+}
+
+.vibeWrap {
+ display: inline-flex;
+}
+
+.content {
+ display: flex;
+ flex-direction: column;
+ flex: 1 1 0%;
+ min-height: 0;
+ min-width: 0;
+ position: relative;
+ width: 100%;
+ max-width: 100%;
+}
+
+.contentRow {
+ display: flex;
+ flex-direction: row;
+ align-content: stretch;
+ align-items: stretch;
+ flex: 1 1 0%;
+ gap: 0;
+ isolation: isolate;
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 0;
+ padding-bottom: 0;
+ position: relative;
+ width: 100%;
+ max-width: 100%;
+ min-width: 0;
+ min-height: 0;
+ overflow: hidden;
+}
+
+.page {
+ display: flex;
+ flex-direction: column;
+ flex: 1 1 0%;
+ background-color: transparent;
+ min-height: 0;
+ min-width: 0;
+ max-width: 100%;
+ position: relative;
+ margin-top: 0;
+ border-top: var(--border-width) solid var(--layout-border-color);
+ border-top-left-radius: 0;
+ z-index: 1;
+ overflow: hidden;
+ box-shadow: none;
+ transition: border-top-left-radius var(--motion-productive-medium) ease;
+}
+
+.pageWithCollapsedWorkspacePanel {
+ border-left: var(--border-width) solid var(--layout-border-color);
+ border-top-left-radius: var(--border-radius-big);
+}
+
+.pageWithCollapsedWorkspacePanel .pageScroll {
+ border-top-left-radius: var(--border-radius-big);
+}
+
+.pageScroll {
+ display: flex;
+ flex-direction: column;
+ flex: 1 1 0%;
+ min-height: 0;
+ min-width: 0;
+ align-items: stretch;
+ align-content: stretch;
+ padding-bottom: clamp(var(--space-16), 4vw, var(--space-32));
+ padding-left: clamp(
+ var(--space-8),
+ 5vw,
+ calc(var(--space-24) + var(--space-12))
+ );
+ padding-right: clamp(var(--space-4), 2vw, var(--space-12));
+ width: 100%;
+ max-width: 100%;
+ border-top-left-radius: 0;
+ clip-path: none;
+ background-color: var(--primary-background-color);
+ overflow: auto;
+}
+
+/* Sidekick chat surface is full-bleed: it manages its own padding.
+ Qualified with .page so it outranks theme overrides such as
+ :global(html.glaze) .pageScroll (specificity 0,2,1). */
+.page .pageScroll.pageScrollFullBleed {
+ padding-left: 0;
+ padding-right: 0;
+ padding-bottom: 0;
+}
+
+.leftNav {
+ display: flex;
+ flex-direction: row;
+ align-items: stretch;
+ align-self: stretch;
+ gap: 0;
+ min-height: 0;
+ flex-shrink: 0;
+ z-index: 2;
+ color: var(--primary-text-color);
+ background-color: var(--primary-surface-color);
+}
+
+.workspacePanel {
+ display: flex;
+ flex-direction: column;
+ width: var(--workspace-panel-width, 17.3125rem);
+ min-width: 15rem;
+ max-width: 22.5rem;
+ flex-shrink: 0;
+ align-self: flex-start;
+ height: calc(100% - var(--space-4));
+ min-height: 0;
+ position: relative;
+ overflow: hidden;
+ background-color: var(--primary-background-color);
+ border: var(--border-width) solid var(--layout-border-color);
+ border-bottom: 0;
+ border-top-left-radius: var(--border-radius-big);
+ opacity: 1;
+ transform: translateX(0);
+ transition:
+ width var(--motion-productive-medium) ease,
+ min-width var(--motion-productive-medium) ease,
+ max-width var(--motion-productive-medium) ease,
+ opacity var(--motion-productive-short) ease,
+ transform var(--motion-productive-medium) ease,
+ border-color var(--motion-productive-short) ease,
+ visibility 0s linear 0s;
+ will-change: width, opacity, transform;
+}
+
+.workspacePanelClosed {
+ width: 0;
+ min-width: 0;
+ max-width: 0;
+ border-color: transparent;
+ opacity: 0;
+ pointer-events: none;
+ transform: translateX(calc(-1 * var(--space-8)));
+ visibility: hidden;
+ transition:
+ width var(--motion-productive-medium) ease,
+ min-width var(--motion-productive-medium) ease,
+ max-width var(--motion-productive-medium) ease,
+ opacity var(--motion-productive-short) ease,
+ transform var(--motion-productive-medium) ease,
+ border-color var(--motion-productive-short) ease,
+ visibility 0s linear var(--motion-productive-medium);
+}
+
+.workspacePanelOpen {
+ visibility: visible;
+}
+
+.workspacePanelScroll {
+ width: 100%;
+ height: calc(100% - var(--space-4));
+ min-height: 0;
+ overflow-x: hidden;
+ overflow-y: auto;
+ border-top-left-radius: var(--border-radius-big);
+}
+
+.toolPanel {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-16);
+ min-height: 100%;
+ padding: var(--space-20) var(--space-16);
+ font-family: var(--boards-font-family);
+ color: var(--primary-text-color);
+}
+
+.toolPanelHeader {
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+ gap: var(--space-8);
+}
+
+.toolPanelTitle {
+ margin: 0;
+ color: var(--primary-text-color);
+ font-family: var(--boards-font-family);
+ font-size: 0.875rem;
+ font-weight: var(--font-weight-medium);
+ line-height: 1.5;
+}
+
+.toolPanelDescription {
+ margin: var(--space-4) 0 0;
+ color: var(--secondary-text-color);
+ font-family: var(--boards-font-family);
+ font-size: 0.75rem;
+ line-height: var(--space-16);
+}
+
+.closeToolPanelButton {
+ transform: rotate(180deg);
+}
+
+.toolPanelList {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-4);
+}
+
+.toolPanelItem {
+ display: flex;
+ align-items: center;
+ min-height: var(--space-32);
+ padding: 0 var(--space-8);
+ border: none;
+ border-radius: var(--border-radius-small);
+ background: transparent;
+ color: var(--primary-text-color);
+ cursor: pointer;
+ font-family: var(--boards-font-family);
+ font-size: 0.75rem;
+ text-align: start;
+
+ &:hover {
+ background-color: var(--primary-background-hover-color);
+ }
+}
+
+.leftpaneResizer {
+ position: absolute;
+ top: calc(-1 * var(--border-width));
+ right: calc(-1 * var(--border-width));
+ bottom: calc(-1 * (var(--space-4) + var(--border-width)));
+ width: var(--space-4);
+ padding: 0;
+ border: 0;
+ background: transparent;
+ cursor: col-resize;
+ z-index: 4;
+
+ &::after {
+ position: absolute;
+ top: 0;
+ right: var(--space-2);
+ bottom: 0;
+ width: var(--border-width);
+ background-color: transparent;
+ content: "";
+ transition: background-color var(--motion-productive-short) ease;
+ }
+
+ &:hover::after,
+ &:focus-visible::after {
+ background-color: var(--primary-color);
+ }
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .workspacePanel,
+ .workspacePanelClosed {
+ transition: none;
+ }
+}
diff --git a/apps/kitchen-sink/src/screens/components/MainLayout.tsx b/apps/kitchen-sink/src/screens/components/MainLayout.tsx
new file mode 100644
index 0000000000..ba133952cc
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/MainLayout.tsx
@@ -0,0 +1,326 @@
+import React from "react";
+import { Box, Icon, IconButton, Flex, Divider, Avatar } from "@vibe/core";
+import type { SubIcon } from "@vibe/core";
+import {
+ Apps,
+ Help,
+ Inbox,
+ Invite,
+ Notifications,
+ Search,
+ Switcher,
+} from "@mondaydotcomorg/icons";
+import imgAvatarContainer from "figma:asset/6f1e4ef08a4e8899bba87998c3410a8132536714.png";
+import type { ConfigProductName } from "../productConfig";
+import { MondayMulticolorMark } from "./ProductLogos";
+import LeftPaneContent from "./LeftPaneContent";
+import { NavigationRail, type RailItemId } from "./NavigationRail";
+import { useSidekickView } from "../context/SidekickViewContext";
+import styles from "./MainLayout.module.scss";
+
+function TopBarActionButton({
+ label,
+ icon,
+ badge,
+ count,
+}: {
+ label: string;
+ icon: SubIcon;
+ badge?: string;
+ count?: string;
+}) {
+ return (
+
+
+ {badge && {badge} }
+ {count && {count} }
+
+ );
+}
+
+function AvatarButton() {
+ return (
+
+
+
+ );
+}
+
+function RightContainer() {
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+function GlobalSearch() {
+ return (
+
+
+ Search for anything...
+ ⌘ K
+
+ );
+}
+
+function TopBarInternal({ product }: { product: ConfigProductName }) {
+ return (
+
+ );
+}
+
+function LeftPane({
+ activeRailItem,
+ isWorkspacePanelOpen,
+ onActiveRailItemChange,
+ onWorkspacePanelOpenChange,
+}: {
+ activeRailItem: RailItemId;
+ isWorkspacePanelOpen: boolean;
+ onActiveRailItemChange: (activeRailItem: RailItemId) => void;
+ onWorkspacePanelOpenChange: (isOpen: boolean) => void;
+}) {
+ const [workspacePanelWidth, setWorkspacePanelWidth] = React.useState(279);
+
+ React.useEffect(() => {
+ const handleKeyDown = (e: KeyboardEvent) => {
+ if (e.metaKey && e.key === ".") {
+ e.preventDefault();
+ onWorkspacePanelOpenChange(!isWorkspacePanelOpen);
+ }
+ };
+ window.addEventListener("keydown", handleKeyDown);
+ return () => window.removeEventListener("keydown", handleKeyDown);
+ }, [isWorkspacePanelOpen, onWorkspacePanelOpenChange]);
+
+ const handleSelectRailItem = (id: RailItemId) => {
+ onActiveRailItemChange(id);
+ onWorkspacePanelOpenChange(true);
+ };
+
+ const handleResizeStart = (event: React.MouseEvent) => {
+ event.preventDefault();
+
+ const startX = event.clientX;
+ const startWidth = workspacePanelWidth;
+
+ const handleMouseMove = (moveEvent: MouseEvent) => {
+ const nextWidth = startWidth + moveEvent.clientX - startX;
+ setWorkspacePanelWidth(Math.min(360, Math.max(240, nextWidth)));
+ };
+
+ const handleMouseUp = () => {
+ document.removeEventListener("mousemove", handleMouseMove);
+ document.removeEventListener("mouseup", handleMouseUp);
+ };
+
+ document.addEventListener("mousemove", handleMouseMove);
+ document.addEventListener("mouseup", handleMouseUp);
+ };
+
+ return (
+
+ {
+ onActiveRailItemChange("workspace");
+ onWorkspacePanelOpenChange(true);
+ }}
+ />
+
+
+ onWorkspacePanelOpenChange(false)}
+ />
+
+
+
+
+ );
+}
+
+function PageContent({
+ children,
+ isWorkspacePanelOpen,
+ fullBleed,
+}: {
+ children: React.ReactNode;
+ isWorkspacePanelOpen: boolean;
+ fullBleed?: boolean;
+}) {
+ return (
+
+
+ {children}
+
+
+ );
+}
+
+type MainLayoutChildren =
+ | React.ReactNode
+ | ((activeRailItem: RailItemId) => React.ReactNode);
+
+function Content({
+ children,
+ activeRailItem: controlledActiveRailItem,
+ onActiveRailItemChange,
+}: {
+ children: MainLayoutChildren;
+ activeRailItem?: RailItemId;
+ onActiveRailItemChange?: (activeRailItem: RailItemId) => void;
+}) {
+ const [uncontrolledActiveRailItem, setUncontrolledActiveRailItem] =
+ React.useState("workspace");
+ const [isWorkspacePanelOpen, setIsWorkspacePanelOpen] = React.useState(true);
+ const { view: sidekickView } = useSidekickView();
+ const activeRailItem = controlledActiveRailItem ?? uncontrolledActiveRailItem;
+ const isSidekickChat =
+ activeRailItem === "sidekick" && sidekickView === "chat";
+ const pageContent =
+ typeof children === "function" ? children(activeRailItem) : children;
+
+ const handleActiveRailItemChange = React.useCallback(
+ (nextActiveRailItem: RailItemId) => {
+ setUncontrolledActiveRailItem(nextActiveRailItem);
+ onActiveRailItemChange?.(nextActiveRailItem);
+ },
+ [onActiveRailItemChange],
+ );
+
+ return (
+
+
+
+
+ {pageContent}
+
+
+
+ );
+}
+
+export const MainLayout: React.FC<{
+ children: MainLayoutChildren;
+ product: ConfigProductName;
+ activeRailItem?: RailItemId;
+ onActiveRailItemChange?: (activeRailItem: RailItemId) => void;
+}> = ({ children, product, activeRailItem, onActiveRailItemChange }) => {
+ return (
+
+
+
+
+
+ {children}
+
+
+ );
+};
diff --git a/apps/kitchen-sink/src/screens/components/ManageAgentsPage.module.scss b/apps/kitchen-sink/src/screens/components/ManageAgentsPage.module.scss
new file mode 100644
index 0000000000..c941192141
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/ManageAgentsPage.module.scss
@@ -0,0 +1,248 @@
+.root {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-32);
+ padding: var(--space-32) 0;
+ width: 100%;
+ max-width: 1200px;
+ margin: 0 auto;
+}
+
+.header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: var(--space-16);
+ width: 100%;
+}
+
+.title {
+ font-size: var(--font-size-40);
+ font-weight: var(--font-weight-bold);
+ line-height: var(--space-24);
+ letter-spacing: -0.1px;
+}
+
+.headerActions {
+ display: flex;
+ align-items: center;
+ gap: var(--space-8);
+ flex-shrink: 0;
+}
+
+.listSection {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-16);
+ width: 100%;
+}
+
+.filters {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: var(--space-16);
+ width: 100%;
+}
+
+.filterGroup {
+ display: flex;
+ align-items: center;
+ gap: var(--space-8);
+}
+
+.filterLabel {
+ font-size: var(--font-size-20);
+ font-weight: 600;
+ line-height: var(--space-20);
+ color: var(--primary-text-color);
+}
+
+.filterRight {
+ display: flex;
+ align-items: center;
+ gap: var(--space-16);
+}
+
+.viewToggle {
+ display: inline-flex;
+ align-items: center;
+}
+
+.table {
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ border-top: var(--border-width) solid var(--layout-border-color);
+}
+
+.tableHeader,
+.tableRow {
+ display: grid;
+ grid-template-columns:
+ minmax(220px, 300px)
+ 130px
+ 154px
+ 154px
+ 140px
+ var(--space-32);
+ align-items: center;
+ column-gap: var(--space-16);
+ width: 100%;
+}
+
+.tableHeader {
+ min-height: var(--space-48);
+ border-bottom: var(--border-width) solid var(--layout-border-color);
+}
+
+.colHeader {
+ font-size: var(--font-size-20);
+ line-height: var(--space-20);
+ color: var(--secondary-text-color);
+}
+
+.colHeaderStatus {
+ display: flex;
+ align-items: center;
+ gap: var(--space-8);
+ padding-left: var(--space-16);
+}
+
+.tableRow {
+ padding: var(--space-16) 0;
+ border-bottom: var(--border-width) solid var(--layout-border-color);
+ background-color: var(--primary-background-color);
+}
+
+.agentCell {
+ display: flex;
+ align-items: flex-start;
+ gap: var(--space-16);
+ min-width: 0;
+}
+
+.agentAvatar {
+ width: var(--space-64);
+ height: var(--space-64);
+ flex: 0 0 auto;
+ overflow: hidden;
+ border-radius: var(--space-12);
+ box-shadow: 0 3px 9px rgba(0, 0, 0, 0.1);
+}
+
+.agentAvatarImage {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ display: block;
+}
+
+.agentCopy {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-8);
+ min-width: 0;
+ height: fit-content;
+}
+
+/* Vibe's Text component adds a 24px margin between adjacent elements
+ (p.text + p). Neutralize it so the flex gap is the only spacing. */
+.agentCopy .agentName,
+.agentCopy .agentCreator {
+ margin-block: 0;
+}
+
+.agentName {
+ font-size: var(--font-size-30);
+ font-weight: var(--font-weight-normal);
+ line-height: 22px;
+ color: var(--primary-text-color);
+}
+
+.agentCreator {
+ font-size: var(--font-size-20);
+ line-height: var(--space-20);
+ color: var(--secondary-text-color);
+}
+
+.toolsCell {
+ display: flex;
+ align-items: center;
+ padding-left: var(--space-16);
+}
+
+.toolStack {
+ display: flex;
+ align-items: center;
+}
+
+.toolBadge {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: var(--space-24);
+ height: var(--space-24);
+ margin-right: calc(-1 * var(--space-6));
+ border-radius: 50%;
+ background-color: var(--primary-background-color);
+ overflow: hidden;
+
+ &:last-child {
+ margin-right: 0;
+ }
+}
+
+.toolBadgeImage {
+ width: 18px;
+ height: 18px;
+ object-fit: contain;
+ display: block;
+}
+
+.toolOverflow {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ height: var(--space-24);
+ padding: 0 var(--space-8);
+ margin-left: var(--space-2);
+ border: var(--border-width) solid var(--primary-background-color);
+ border-radius: 100px;
+ background-color: var(--ui-background-color);
+ color: var(--primary-text-color);
+ font-size: var(--font-size-20);
+ line-height: var(--space-20);
+}
+
+.statusCell,
+.activityCell,
+.creditsCell {
+ display: flex;
+ align-items: center;
+ gap: var(--space-4);
+ padding-left: var(--space-16);
+ font-size: var(--font-size-20);
+ line-height: var(--space-20);
+ color: var(--primary-text-color);
+}
+
+.statusDot {
+ width: var(--space-20);
+ height: var(--space-20);
+ flex: 0 0 auto;
+ object-fit: contain;
+ display: block;
+}
+
+.statusDotLive {
+ filter: none;
+}
+
+.statusDotPaused {
+ filter: grayscale(100%);
+}
+
+.rowMenu {
+ justify-self: end;
+}
diff --git a/apps/kitchen-sink/src/screens/components/ManageAgentsPage.tsx b/apps/kitchen-sink/src/screens/components/ManageAgentsPage.tsx
new file mode 100644
index 0000000000..b2aac5f832
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/ManageAgentsPage.tsx
@@ -0,0 +1,212 @@
+import { useState } from "react";
+import { Box, Button, Flex, Heading, Icon, IconButton, Text } from "@vibe/core";
+import {
+ AddSmall,
+ AICredits,
+ Bullets,
+ DropdownChevronDown,
+ LastUpdated,
+ Menu,
+ PersonAI,
+ Sort,
+ Workspace,
+} from "@mondaydotcomorg/icons";
+import {
+ MANAGE_AGENTS,
+ TOOL_IMAGES,
+ TOOL_LABELS,
+ type AgentStatus,
+ type ManageAgentRow,
+} from "../data/manageAgents";
+import bulletImage from "../assets/tools/bullet.png";
+import { useAgentBuilder } from "../context/AgentBuilderContext";
+import styles from "./ManageAgentsPage.module.scss";
+
+function StatusDot({ status }: { status: AgentStatus }) {
+ return (
+
+ );
+}
+
+function AgentTools({ agent }: { agent: ManageAgentRow }) {
+ const visibleTools = agent.tools.slice(0, 3);
+
+ return (
+
+
+ {visibleTools.map((tool) => (
+
+
+
+ ))}
+ {agent.extraTools ? (
+
+{agent.extraTools}
+ ) : null}
+
+
+ );
+}
+
+function AgentTableRow({ agent }: { agent: ManageAgentRow }) {
+ return (
+
+
+
+
+
+
+
+ {agent.name}, {agent.role}
+
+
+ By {agent.creator}
+
+
+
+
+
+
+
+
+ {agent.status === "live" ? "Live" : "Paused"}
+
+
+
+
+ {agent.lastActivity}
+
+
+
+
+ {agent.creditsUsed}
+
+
+
+
+ );
+}
+
+export function ManageAgentsPage() {
+ const [listView, setListView] = useState(true);
+ const { openConfig } = useAgentBuilder();
+
+ return (
+
+
+
+ Manage agents
+
+
+
+ Bring your own agent
+
+ openConfig()}
+ >
+ New agent
+
+
+
+
+
+
+
+ Filter by:
+
+ Type
+
+
+ Status
+
+
+
+
+
+ Newest
+
+
+ setListView(true)}
+ />
+ setListView(false)}
+ />
+
+
+
+
+
+
+ Agent name
+ Tools
+
+ Status
+
+ Last activity
+ AI credits used
+
+
+
+ {MANAGE_AGENTS.map((agent) => (
+
+ ))}
+
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/screens/components/NavigationRail.module.scss b/apps/kitchen-sink/src/screens/components/NavigationRail.module.scss
new file mode 100644
index 0000000000..5349439ba8
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/NavigationRail.module.scss
@@ -0,0 +1,160 @@
+.rail {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ flex-shrink: 0;
+ width: 4.5rem;
+ min-width: 4.5rem;
+ padding: 0 var(--space-4);
+ gap: 0;
+ align-self: stretch;
+ min-height: 0;
+ background-color: var(--primary-surface-color);
+ border-top-left-radius: 0;
+ font-family: var(--boards-font-family);
+ margin-top: 0;
+ height: 100%;
+}
+
+.railOpenButtonSlot {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: flex-start;
+ gap: var(--space-4);
+ width: 58px;
+ height: 58px;
+ padding: calc(var(--space-4) + var(--space-2)) 0 var(--space-4);
+ flex: 0 0 auto;
+}
+
+.railOpenButton {
+ width: var(--space-32);
+ height: var(--space-32);
+ min-width: var(--space-32);
+ flex: 0 0 auto;
+ border-radius: var(--border-radius-medium);
+ color: var(--icon-color);
+
+ &:hover,
+ &:active,
+ &:focus-visible {
+ border-radius: var(--border-radius-medium);
+ color: var(--icon-color);
+ }
+}
+
+.railOpenButtonLabelSpacer {
+ display: block;
+ width: 100%;
+ height: calc(var(--space-16) - var(--space-4));
+ flex-shrink: 0;
+ pointer-events: none;
+}
+
+.railNavIcon {
+ display: block;
+ width: var(--space-20);
+ height: var(--space-20);
+ flex: 0 0 auto;
+}
+
+.railItems {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 0;
+ width: 100%;
+ flex: 1 1 auto;
+ min-height: 0;
+ overflow-y: auto;
+ overflow-x: hidden;
+}
+
+.railItem {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: flex-start;
+ gap: var(--space-4);
+ width: 58px;
+ height: 64px;
+ padding: calc(var(--space-4) + var(--space-2)) 0;
+ border: none;
+ border-radius: 0;
+ background: transparent;
+ cursor: pointer;
+ color: inherit;
+ font: inherit;
+ outline: none;
+
+ &:hover:not(.railItemActive) .railItemIcon {
+ background-color: var(--primary-background-hover-color);
+ color: var(--icon-color);
+ }
+
+ &:focus-visible .railItemIcon {
+ box-shadow: 0 0 0 var(--border-width) var(--primary-color);
+ }
+}
+
+.railItemActive {
+ background-color: transparent;
+}
+
+.railItemIcon {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: var(--space-32);
+ height: var(--space-32);
+ flex-shrink: 0;
+ color: var(--icon-color);
+ border-radius: var(--border-radius-medium);
+ transition:
+ background-color var(--motion-productive-short) ease,
+ color var(--motion-productive-short) ease;
+}
+
+.svgIcon {
+ width: 18px;
+ height: 18px;
+}
+
+.railItemActive .railItemIcon {
+ background-color: var(--primary-selected-color);
+ color: var(--primary-text-color);
+}
+
+.railItemActive:hover .railItemIcon {
+ background-color: var(--primary-selected-hover-color);
+ color: var(--primary-text-color);
+}
+
+.railItemLabel {
+ display: block;
+ width: 100%;
+ font-family: var(--boards-font-family);
+ font-size: 0.6875rem;
+ font-weight: var(--font-weight-normal);
+ line-height: var(--space-16);
+ text-align: center;
+ color: var(--secondary-text-color);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.railItemActive .railItemLabel {
+ color: var(--primary-text-color);
+ font-weight: var(--font-weight-medium);
+}
+
+.railDivider {
+ display: block;
+ width: calc(var(--space-32) + var(--space-8));
+ height: var(--border-width);
+ margin: calc(var(--space-8) + var(--space-4)) 0 var(--space-4);
+ flex-shrink: 0;
+ background-color: var(--layout-border-color);
+}
diff --git a/apps/kitchen-sink/src/screens/components/NavigationRail.tsx b/apps/kitchen-sink/src/screens/components/NavigationRail.tsx
new file mode 100644
index 0000000000..06dc61e21a
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/NavigationRail.tsx
@@ -0,0 +1,212 @@
+import React from "react";
+import { IconButton } from "@vibe/core";
+import { SidebarExpand } from "@mondaydotcomorg/icons";
+import styles from "./NavigationRail.module.scss";
+
+export type RailItemId =
+ | "workspace"
+ | "home-modes"
+ | "sidekick"
+ | "agents"
+ | "vibe"
+ | "notetaker"
+ | "favorites"
+ | "more";
+
+interface RailItem {
+ id: RailItemId;
+ label: string;
+ ariaLabel: string;
+ icon: React.ReactNode;
+ dividerAfter?: boolean;
+}
+
+function RailIcon({ children }: { children: React.ReactNode }) {
+ return (
+
+ {children}
+
+ );
+}
+
+const RAIL_ITEMS: RailItem[] = [
+ {
+ id: "workspace",
+ label: "Workspace",
+ ariaLabel: "Workspace",
+ icon: (
+
+
+
+ ),
+ },
+ {
+ id: "home-modes",
+ label: "Home",
+ ariaLabel: "Home modes — Sidekick, Agents, Vibe",
+ icon: (
+
+
+
+ ),
+ },
+ {
+ id: "sidekick",
+ label: "Sidekick",
+ ariaLabel: "Sidekick",
+ icon: (
+
+
+
+ ),
+ },
+ {
+ id: "agents",
+ label: "Agents",
+ ariaLabel: "Agents",
+ icon: (
+
+
+
+ ),
+ dividerAfter: true,
+ },
+ {
+ id: "vibe",
+ label: "Vibe",
+ ariaLabel: "Vibe",
+ icon: (
+
+
+
+ ),
+ },
+ {
+ id: "notetaker",
+ label: "Notetaker",
+ ariaLabel: "Notetaker",
+ icon: (
+
+
+
+
+ ),
+ dividerAfter: true,
+ },
+ {
+ id: "favorites",
+ label: "Favorites",
+ ariaLabel: "Favorites",
+ icon: (
+
+
+
+ ),
+ },
+ {
+ id: "more",
+ label: "More",
+ ariaLabel: "More tools menu",
+ icon: (
+
+
+
+ ),
+ },
+];
+
+export interface NavigationRailProps {
+ activeRailItem: RailItemId;
+ isWorkspacePanelOpen: boolean;
+ onSelectRailItem: (id: RailItemId) => void;
+ onOpenWorkspacePanel: () => void;
+}
+
+export function NavigationRail({
+ activeRailItem,
+ isWorkspacePanelOpen,
+ onSelectRailItem,
+ onOpenWorkspacePanel,
+}: NavigationRailProps) {
+ return (
+
+ {!isWorkspacePanelOpen && (
+
+
+
+
+ )}
+
+
+ {RAIL_ITEMS.map((item) => (
+
+ onSelectRailItem(item.id)}
+ >
+ {item.icon}
+ {item.label}
+
+ {item.dividerAfter && }
+
+ ))}
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/screens/components/NotetakerPage.module.scss b/apps/kitchen-sink/src/screens/components/NotetakerPage.module.scss
new file mode 100644
index 0000000000..e0c8e86933
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/NotetakerPage.module.scss
@@ -0,0 +1,106 @@
+.root {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-32);
+ padding: var(--space-32) var(--space-40);
+ max-width: 1100px;
+ margin: 0 auto;
+ width: 100%;
+}
+
+.sectionTitle {
+ display: block;
+ margin-bottom: var(--space-16);
+}
+
+.upcomingStrip {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: var(--space-12);
+}
+
+.upcomingCard {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-8);
+ padding: var(--space-16);
+ border: 1px solid var(--ui-border-color);
+ border-radius: var(--border-radius-medium);
+ background: var(--primary-background-color);
+}
+
+.nextBadge {
+ position: absolute;
+ top: var(--space-8);
+ right: var(--space-8);
+ padding: var(--space-2) var(--space-8);
+ border-radius: var(--border-radius-small);
+ background: var(--positive-color);
+ font-size: 11px;
+ font-weight: 600;
+ color: #fff;
+}
+
+.cardTime {
+ display: block;
+}
+
+.inviteBtn {
+ margin-top: var(--space-4);
+ width: 100%;
+}
+
+.filterRow {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: var(--space-16) 0 var(--space-12);
+ gap: var(--space-16);
+}
+
+.filterSearch {
+ width: 240px;
+}
+
+.meetingTable {
+ width: 100%;
+ border-collapse: collapse;
+}
+
+.th {
+ text-align: left;
+ padding: var(--space-8) var(--space-12);
+ border-bottom: 1px solid var(--ui-border-color);
+}
+
+.tr {
+ cursor: pointer;
+ transition: background 0.1s ease;
+
+ &:hover {
+ background: var(--primary-background-hover-color);
+ }
+}
+
+.td {
+ padding: var(--space-12);
+ border-bottom: 1px solid var(--ui-border-color);
+ vertical-align: middle;
+}
+
+.recordingDot {
+ display: inline-block;
+ width: 8px;
+ height: 8px;
+ border-radius: 50%;
+ background: var(--positive-color);
+ flex-shrink: 0;
+}
+
+.upcomingTabContent {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: var(--space-12);
+ margin-top: var(--space-16);
+}
diff --git a/apps/kitchen-sink/src/screens/components/NotetakerPage.tsx b/apps/kitchen-sink/src/screens/components/NotetakerPage.tsx
new file mode 100644
index 0000000000..6ba6f5ed22
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/NotetakerPage.tsx
@@ -0,0 +1,261 @@
+import { useState } from "react";
+import {
+ Avatar,
+ AvatarGroup,
+ Box,
+ Button,
+ Flex,
+ Search,
+ Tab,
+ TabList,
+ TabPanel,
+ TabPanels,
+ TabsContext,
+ Text,
+} from "@vibe/core";
+import { DropdownChevronDown } from "@mondaydotcomorg/icons";
+import styles from "./NotetakerPage.module.scss";
+
+interface UpcomingMeeting {
+ title: string;
+ time: string;
+ participants: string[];
+ isNext?: boolean;
+}
+
+interface RecordedMeeting {
+ title: string;
+ participants: string[];
+ date: string;
+ duration: string;
+}
+
+const UPCOMING: UpcomingMeeting[] = [
+ {
+ title: "Weekly 1:1",
+ time: "Today at 2:00 pm",
+ participants: ["AR", "JL"],
+ },
+ {
+ title: "Team Weekly Sync",
+ time: "Today at 3:00 pm",
+ participants: ["SC", "MD", "AR"],
+ isNext: true,
+ },
+ {
+ title: "Candidate Interview",
+ time: "Today at 4:00 pm",
+ participants: ["TB", "CP", "AR", "JL"],
+ },
+ {
+ title: "Daily Standup",
+ time: "Tomorrow at 11:30 am",
+ participants: ["KP", "DV", "AR", "SC", "TB"],
+ },
+];
+
+const RECORDED: RecordedMeeting[] = [
+ {
+ title: "Product Sync",
+ participants: ["SC", "AR", "MD", "TB"],
+ date: "Jun 2, 2026",
+ duration: "36m 48s",
+ },
+ {
+ title: "Roadmap Planning",
+ participants: ["TB", "CP", "SC", "AR", "MD", "JL"],
+ date: "Jun 1, 2026",
+ duration: "38m 33s",
+ },
+ {
+ title: "Design Critique",
+ participants: ["KP", "AR", "SC", "TB"],
+ date: "May 31, 2026",
+ duration: "28m 57s",
+ },
+ {
+ title: "Design Review",
+ participants: ["SC", "TB", "AR", "CP", "JL"],
+ date: "May 28, 2026",
+ duration: "35m 40s",
+ },
+ {
+ title: "Engineering Sync",
+ participants: ["SC", "AR", "MD", "CP", "TB", "JL", "KP", "DV", "RB"],
+ date: "May 28, 2026",
+ duration: "46m 20s",
+ },
+ {
+ title: "Team Weekly Sync",
+ participants: ["SC", "MD"],
+ date: "May 27, 2026",
+ duration: "3m 14s",
+ },
+];
+
+function UpcomingCard({ title, time, participants, isNext }: UpcomingMeeting) {
+ return (
+
+ {isNext && Next }
+
+ {title}
+
+
+ {time}
+
+
+ {participants.map((p) => (
+
+ ))}
+
+
+ Invite Notetaker
+
+
+ );
+}
+
+function FilterRow() {
+ const [searchValue, setSearchValue] = useState("");
+
+ return (
+
+
+
+
+ Recorded only
+
+
+ My meetings
+
+
+
+ );
+}
+
+function MeetingTable({ meetings }: { meetings: RecordedMeeting[] }) {
+ return (
+
+
+
+
+
+ Meeting summaries
+
+
+
+
+ Participants
+
+
+
+
+ Date
+
+
+
+
+ Recording
+
+
+
+
+ Status
+
+
+
+
+
+ {meetings.map(({ title, participants, date, duration }) => (
+
+
+
+ {title}
+
+
+
+
+ {participants.map((p) => (
+
+ ))}
+
+
+
+
+ {date}
+
+
+
+
+
+
+ Recorded · {duration}
+
+
+
+
+
+ —
+
+
+
+ ))}
+
+
+ );
+}
+
+export function NotetakerPage() {
+ const [activeTab, setActiveTab] = useState(0);
+
+ return (
+
+
+
+ Upcoming
+
+
+ {UPCOMING.map((m) => (
+
+ ))}
+
+
+
+
+
+ Meeting summaries
+ Upcoming meetings
+
+
+
+
+
+
+
+
+ {UPCOMING.map((m) => (
+
+ ))}
+
+
+
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/screens/components/ProductLogos.module.scss b/apps/kitchen-sink/src/screens/components/ProductLogos.module.scss
new file mode 100644
index 0000000000..7f62888d52
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/ProductLogos.module.scss
@@ -0,0 +1,56 @@
+.productLogoLarge {
+ position: absolute;
+ aspect-ratio: 1;
+ left: 15.63%;
+ right: 15.63%;
+ top: 50%;
+ transform: translateY(-50%);
+}
+
+.productLogoUnion {
+ position: absolute;
+ inset: 8.14% 6.65% 7.93% 6.51%;
+}
+
+.productLogoSmall {
+ overflow: visible;
+ position: relative;
+ border-radius: var(--border-radius-medium);
+ flex-shrink: 0;
+ width: var(--space-32);
+ height: var(--space-32);
+}
+
+.productLogoFull {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ height: var(--space-40);
+ padding-right: var(--space-8);
+ position: relative;
+ border-radius: var(--border-radius-small);
+ flex-shrink: 1;
+ min-width: 0;
+}
+
+.productLogoProductLabel {
+ min-width: 0;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.mondayMark {
+ overflow: clip;
+ position: relative;
+ flex-shrink: 0;
+ width: var(--space-32);
+ height: var(--space-32);
+}
+
+.mondayMarkSvg {
+ position: absolute;
+ inset: 0;
+ width: 100%;
+ height: 100%;
+}
diff --git a/apps/kitchen-sink/src/screens/components/ProductLogos.tsx b/apps/kitchen-sink/src/screens/components/ProductLogos.tsx
new file mode 100644
index 0000000000..d64294eff9
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/ProductLogos.tsx
@@ -0,0 +1,179 @@
+import { Box, Flex, Text } from "@vibe/core";
+import type { ConfigProductName } from "@/productConfig";
+import styles from "./ProductLogos.module.scss";
+
+function formatProductDisplayName(product: ConfigProductName): string {
+ return product
+ .split("_")
+ .map((w: string) => w.charAt(0).toUpperCase() + w.slice(1))
+ .join(" ");
+}
+
+function ProductLogoLarge({ product }: { product: ConfigProductName }) {
+ switch (product) {
+ case "work_management":
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ case "dev":
+ return (
+
+
+
+
+ );
+ case "service":
+ return (
+
+
+
+
+ );
+ case "crm":
+ return (
+
+
+
+
+ );
+ }
+}
+
+function ProductLogoSmall({ product }: { product: ConfigProductName }) {
+ return (
+
+
+
+ );
+}
+
+export function ProductLogoFull({ product }: { product: ConfigProductName }) {
+ const label = formatProductDisplayName(product);
+
+ return (
+
+
+
+ monday
+
+
+ {label}
+
+
+ );
+}
+
+export function MondayMulticolorMark() {
+ return (
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/screens/components/ResponseStream.tsx b/apps/kitchen-sink/src/screens/components/ResponseStream.tsx
new file mode 100644
index 0000000000..dcdfa74e6b
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/ResponseStream.tsx
@@ -0,0 +1,393 @@
+import { useCallback, useEffect, useRef, useState } from "react";
+
+export type Mode = "typewriter" | "fade";
+
+export interface UseTextStreamOptions {
+ textStream: string | AsyncIterable;
+ speed?: number;
+ mode?: Mode;
+ onComplete?: () => void;
+ fadeDuration?: number;
+ segmentDelay?: number;
+ characterChunkSize?: number;
+ onError?: (error: unknown) => void;
+}
+
+export interface UseTextStreamResult {
+ displayedText: string;
+ isComplete: boolean;
+ segments: { text: string; index: number }[];
+ getFadeDuration: () => number;
+ getSegmentDelay: () => number;
+ reset: () => void;
+ startStreaming: () => void;
+ pause: () => void;
+ resume: () => void;
+}
+
+function useTextStream({
+ textStream,
+ speed = 20,
+ mode = "typewriter",
+ onComplete,
+ fadeDuration,
+ segmentDelay,
+ characterChunkSize,
+ onError,
+}: UseTextStreamOptions): UseTextStreamResult {
+ const [displayedText, setDisplayedText] = useState("");
+ const [isComplete, setIsComplete] = useState(false);
+ const [segments, setSegments] = useState<{ text: string; index: number }[]>(
+ [],
+ );
+
+ const speedRef = useRef(speed);
+ const modeRef = useRef(mode);
+ const currentIndexRef = useRef(0);
+ const animationRef = useRef(null);
+ const fadeDurationRef = useRef(fadeDuration);
+ const segmentDelayRef = useRef(segmentDelay);
+ const characterChunkSizeRef = useRef(characterChunkSize);
+ const streamRef = useRef(null);
+ const completedRef = useRef(false);
+ const onCompleteRef = useRef(onComplete);
+
+ useEffect(() => {
+ speedRef.current = speed;
+ modeRef.current = mode;
+ fadeDurationRef.current = fadeDuration;
+ segmentDelayRef.current = segmentDelay;
+ characterChunkSizeRef.current = characterChunkSize;
+ }, [speed, mode, fadeDuration, segmentDelay, characterChunkSize]);
+
+ useEffect(() => {
+ onCompleteRef.current = onComplete;
+ }, [onComplete]);
+
+ const getChunkSize = useCallback(() => {
+ if (typeof characterChunkSizeRef.current === "number") {
+ return Math.max(1, characterChunkSizeRef.current);
+ }
+
+ const normalizedSpeed = Math.min(100, Math.max(1, speedRef.current));
+
+ if (modeRef.current === "typewriter") {
+ if (normalizedSpeed < 25) return 1;
+ return Math.max(1, Math.round((normalizedSpeed - 25) / 10));
+ } else if (modeRef.current === "fade") {
+ return 1;
+ }
+
+ return 1;
+ }, []);
+
+ const getProcessingDelay = useCallback(() => {
+ if (typeof segmentDelayRef.current === "number") {
+ return Math.max(0, segmentDelayRef.current);
+ }
+
+ const normalizedSpeed = Math.min(100, Math.max(1, speedRef.current));
+ return Math.max(1, Math.round(100 / Math.sqrt(normalizedSpeed)));
+ }, []);
+
+ const getFadeDuration = useCallback(() => {
+ if (typeof fadeDurationRef.current === "number")
+ return Math.max(10, fadeDurationRef.current);
+
+ const normalizedSpeed = Math.min(100, Math.max(1, speedRef.current));
+ return Math.round(1000 / Math.sqrt(normalizedSpeed));
+ }, []);
+
+ const getSegmentDelay = useCallback(() => {
+ if (typeof segmentDelayRef.current === "number")
+ return Math.max(0, segmentDelayRef.current);
+
+ const normalizedSpeed = Math.min(100, Math.max(1, speedRef.current));
+ return Math.max(1, Math.round(100 / Math.sqrt(normalizedSpeed)));
+ }, []);
+
+ const updateSegments = useCallback(
+ (text: string) => {
+ if (modeRef.current === "fade") {
+ try {
+ const segmenter = new Intl.Segmenter(navigator.language, {
+ granularity: "word",
+ });
+ const segmentIterator = segmenter.segment(text);
+ const newSegments = Array.from(segmentIterator).map(
+ (segment, index) => ({
+ text: segment.segment,
+ index,
+ }),
+ );
+ setSegments(newSegments);
+ } catch (error) {
+ const newSegments = text
+ .split(/(\s+)/)
+ .filter(Boolean)
+ .map((word, index) => ({
+ text: word,
+ index,
+ }));
+ setSegments(newSegments);
+ onError?.(error);
+ }
+ }
+ },
+ [onError],
+ );
+
+ const markComplete = useCallback(() => {
+ if (!completedRef.current) {
+ completedRef.current = true;
+ setIsComplete(true);
+ onCompleteRef.current?.();
+ }
+ }, []);
+
+ const reset = useCallback(() => {
+ currentIndexRef.current = 0;
+ setDisplayedText("");
+ setSegments([]);
+ setIsComplete(false);
+ completedRef.current = false;
+
+ if (animationRef.current) {
+ cancelAnimationFrame(animationRef.current);
+ animationRef.current = null;
+ }
+ }, []);
+
+ const processStringTypewriter = useCallback(
+ (text: string) => {
+ let lastFrameTime = 0;
+
+ const streamContent = (timestamp: number) => {
+ const delay = getProcessingDelay();
+ if (delay > 0 && timestamp - lastFrameTime < delay) {
+ animationRef.current = requestAnimationFrame(streamContent);
+ return;
+ }
+ lastFrameTime = timestamp;
+
+ if (currentIndexRef.current >= text.length) {
+ markComplete();
+ return;
+ }
+
+ const chunkSize = getChunkSize();
+ const endIndex = Math.min(
+ currentIndexRef.current + chunkSize,
+ text.length,
+ );
+ const newDisplayedText = text.slice(0, endIndex);
+
+ setDisplayedText(newDisplayedText);
+ if (modeRef.current === "fade") {
+ updateSegments(newDisplayedText);
+ }
+
+ currentIndexRef.current = endIndex;
+
+ if (endIndex < text.length) {
+ animationRef.current = requestAnimationFrame(streamContent);
+ } else {
+ markComplete();
+ }
+ };
+
+ animationRef.current = requestAnimationFrame(streamContent);
+ },
+ [getProcessingDelay, getChunkSize, updateSegments, markComplete],
+ );
+
+ const processAsyncIterable = useCallback(
+ async (stream: AsyncIterable) => {
+ const controller = new AbortController();
+ streamRef.current = controller;
+
+ let displayed = "";
+
+ try {
+ for await (const chunk of stream) {
+ if (controller.signal.aborted) return;
+
+ displayed += chunk;
+ setDisplayedText(displayed);
+ updateSegments(displayed);
+ }
+
+ markComplete();
+ } catch (error) {
+ console.error("Error processing text stream:", error);
+ markComplete();
+ onError?.(error);
+ }
+ },
+ [updateSegments, markComplete, onError],
+ );
+
+ const startStreaming = useCallback(() => {
+ reset();
+
+ if (typeof textStream === "string") {
+ processStringTypewriter(textStream);
+ } else if (textStream) {
+ processAsyncIterable(textStream);
+ }
+ }, [textStream, reset, processStringTypewriter, processAsyncIterable]);
+
+ const pause = useCallback(() => {
+ if (animationRef.current) {
+ cancelAnimationFrame(animationRef.current);
+ animationRef.current = null;
+ }
+ }, []);
+
+ const resume = useCallback(() => {
+ if (typeof textStream === "string" && !isComplete) {
+ processStringTypewriter(textStream);
+ }
+ }, [textStream, isComplete, processStringTypewriter]);
+
+ useEffect(() => {
+ startStreaming();
+
+ return () => {
+ if (animationRef.current) {
+ cancelAnimationFrame(animationRef.current);
+ }
+ if (streamRef.current) {
+ streamRef.current.abort();
+ }
+ };
+ }, [textStream, startStreaming]);
+
+ return {
+ displayedText,
+ isComplete,
+ segments,
+ getFadeDuration,
+ getSegmentDelay,
+ reset,
+ startStreaming,
+ pause,
+ resume,
+ };
+}
+
+export interface ResponseStreamProps {
+ textStream: string | AsyncIterable;
+ mode?: Mode;
+ speed?: number;
+ className?: string;
+ onComplete?: () => void;
+ as?: keyof React.JSX.IntrinsicElements;
+ fadeDuration?: number;
+ segmentDelay?: number;
+ characterChunkSize?: number;
+}
+
+export function ResponseStream({
+ textStream,
+ mode = "typewriter",
+ speed = 20,
+ className = "",
+ onComplete,
+ as = "div",
+ fadeDuration,
+ segmentDelay,
+ characterChunkSize,
+}: ResponseStreamProps) {
+ const animationEndRef = useRef<(() => void) | null>(null);
+
+ const {
+ displayedText,
+ isComplete,
+ segments,
+ getFadeDuration,
+ getSegmentDelay,
+ } = useTextStream({
+ textStream,
+ speed,
+ mode,
+ onComplete,
+ fadeDuration,
+ segmentDelay,
+ characterChunkSize,
+ });
+
+ useEffect(() => {
+ animationEndRef.current = onComplete ?? null;
+ }, [onComplete]);
+
+ const handleLastSegmentAnimationEnd = useCallback(() => {
+ if (animationEndRef.current && isComplete) {
+ animationEndRef.current();
+ }
+ }, [isComplete]);
+
+ const fadeStyle = `
+ @keyframes sidekickFadeIn {
+ from { opacity: 0; }
+ to { opacity: 1; }
+ }
+
+ .sidekick-fade-segment {
+ display: inline-block;
+ opacity: 0;
+ animation: sidekickFadeIn ${getFadeDuration()}ms ease-out forwards;
+ }
+
+ .sidekick-fade-segment-space {
+ white-space: pre;
+ }
+ `;
+
+ const renderContent = () => {
+ switch (mode) {
+ case "typewriter":
+ return <>{displayedText}>;
+
+ case "fade":
+ return (
+ <>
+
+
+ {segments.map((segment, idx) => {
+ const isWhitespace = /^\s+$/.test(segment.text);
+ const isLastSegment = idx === segments.length - 1;
+
+ return (
+
+ {segment.text}
+
+ );
+ })}
+
+ >
+ );
+
+ default:
+ return <>{displayedText}>;
+ }
+ };
+
+ const Container = as;
+
+ return {renderContent()} ;
+}
diff --git a/apps/kitchen-sink/src/screens/components/SidekickChatPage.module.scss b/apps/kitchen-sink/src/screens/components/SidekickChatPage.module.scss
new file mode 100644
index 0000000000..b7cda4648b
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/SidekickChatPage.module.scss
@@ -0,0 +1,420 @@
+.root {
+ flex: 1;
+ height: 100%;
+ position: relative;
+ overflow: hidden;
+ background-color: var(--primary-background-color);
+}
+
+.glow {
+ position: absolute;
+ width: 1184px;
+ height: 578px;
+ left: 50%;
+ bottom: 0;
+ transform: translateX(-50%) translateY(40%);
+ z-index: 1;
+ pointer-events: none;
+}
+
+.stage {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ width: 100%;
+ height: 100%;
+ position: relative;
+ z-index: 1;
+}
+
+.stageInner {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ position: relative;
+ width: 100%;
+ height: 100%;
+}
+
+.header {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ z-index: 5;
+ pointer-events: auto;
+}
+
+.headerBar {
+ background-color: var(--primary-background-color);
+}
+
+.headerFade {
+ height: var(--space-16);
+ pointer-events: none;
+ background: linear-gradient(
+ to bottom,
+ var(--primary-background-color),
+ transparent
+ );
+}
+
+.breadcrumb {
+ width: 100%;
+ flex-shrink: 0;
+ padding: var(--space-12) var(--space-24);
+}
+
+.breadcrumbInner {
+ display: flex;
+ align-items: center;
+ gap: var(--space-4);
+ padding: var(--space-4) var(--space-8);
+ border-radius: var(--border-radius-small);
+}
+
+.breadcrumbCrumb {
+ display: flex;
+ align-items: center;
+ gap: var(--space-4);
+}
+
+.breadcrumbTitle {
+ font-family: var(--font-family);
+ font-size: 14px;
+ font-weight: 600;
+ line-height: 20px;
+ color: var(--primary-text-color);
+}
+
+.breadcrumbSub {
+ font-family: var(--font-family);
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 20px;
+ color: var(--primary-text-color);
+}
+
+.breadcrumbChevron {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border: none;
+ background: transparent;
+ border-radius: var(--border-radius-small);
+ width: var(--space-24);
+ height: var(--space-24);
+ cursor: pointer;
+ color: var(--primary-text-color);
+ transition: background-color 0.15s ease;
+
+ &:hover {
+ background-color: var(--primary-background-hover-color);
+ }
+}
+
+.body {
+ display: flex;
+ flex-direction: column;
+ isolation: isolate;
+ align-items: center;
+ flex: 1;
+ min-height: 0;
+ width: 100%;
+}
+
+.scrollOuter {
+ flex: 1;
+ min-height: 0;
+ width: 100%;
+ max-width: 660px;
+ padding: 0 var(--space-16);
+}
+
+.scrollContainer {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-12);
+ align-items: flex-start;
+ overflow-y: auto;
+ width: 100%;
+ height: 100%;
+ z-index: 3;
+ padding-bottom: var(--space-16);
+ padding-top: 64px;
+ scrollbar-width: none;
+
+ &::-webkit-scrollbar {
+ display: none;
+ }
+}
+
+.composerWrap {
+ display: flex;
+ flex-direction: column;
+ isolation: isolate;
+ align-items: center;
+ padding-bottom: var(--space-16);
+ flex-shrink: 0;
+ width: 100%;
+ max-width: 692px;
+ padding-left: var(--space-16);
+ padding-right: var(--space-16);
+ z-index: 2;
+}
+
+.bottomSpacer {
+ flex-shrink: 0;
+}
+
+/* User message */
+.userMessage {
+ width: 100%;
+ flex-shrink: 0;
+ padding-bottom: 36px;
+}
+
+.userMessageInner {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+ padding-left: var(--space-24);
+}
+
+.userAvatarWrap {
+ display: flex;
+ align-items: center;
+ border-radius: 50%;
+ flex-shrink: 0;
+}
+
+.userAvatar {
+ border-radius: 50%;
+ object-fit: cover;
+ width: var(--space-32);
+ height: var(--space-32);
+}
+
+.userBubble {
+ margin-top: var(--space-4);
+ max-width: 560px;
+ overflow: hidden;
+ padding: 10px var(--space-16);
+ background-color: var(--primary-surface-color);
+ border-radius: 8px 2px 8px 8px;
+}
+
+.userBubbleText {
+ font-family: var(--font-family);
+ font-size: 16px;
+ font-weight: 400;
+ line-height: 1.5;
+ color: var(--primary-text-color);
+ margin: 0;
+}
+
+/* Sidekick response */
+.response {
+ width: 100%;
+ flex-shrink: 0;
+}
+
+.responseInner {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-12);
+ align-items: flex-start;
+ padding-left: 1px;
+ padding-right: 1px;
+ width: 100%;
+}
+
+.responseStack {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-8);
+ align-items: flex-start;
+ width: 100%;
+}
+
+.responseText {
+ width: 100%;
+ padding-right: 40px;
+ font-family: var(--font-family);
+ font-size: 16px;
+ font-weight: 400;
+ line-height: 1.6;
+ color: var(--primary-text-color);
+
+ p {
+ margin: 0 0 var(--space-12) 0;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+
+ ul {
+ list-style: disc;
+ padding-left: 1.25em;
+ margin: 0;
+ }
+
+ strong {
+ font-weight: 600;
+ }
+}
+
+.responseCard {
+ width: 100%;
+}
+
+.feedbackFooterWrap {
+ width: 100%;
+}
+
+.feedbackFooterHidden {
+ width: 100%;
+ opacity: 0;
+ transition: opacity 0.15s ease;
+
+ .response:hover & {
+ opacity: 1;
+ }
+}
+
+.feedbackFooter {
+ display: flex;
+ align-items: center;
+ gap: var(--space-4);
+ width: 100%;
+}
+
+.feedbackSpacer {
+ flex: 1;
+}
+
+/* Thought process header */
+.thoughtHeader {
+ display: flex;
+ align-items: center;
+ gap: var(--space-8);
+ border: none;
+ background: transparent;
+ cursor: pointer;
+ padding: 0;
+}
+
+.thoughtLabel {
+ font-family: var(--font-family);
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 20px;
+ color: var(--secondary-text-color);
+}
+
+.thoughtChevron {
+ width: var(--space-16);
+ height: var(--space-16);
+ flex-shrink: 0;
+ transition: transform 0.15s ease;
+ color: var(--secondary-text-color);
+}
+
+.thoughtChevronExpanded {
+ transform: rotate(90deg);
+}
+
+/* Approval label */
+.approval {
+ width: 100%;
+ flex-shrink: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding-top: var(--space-4);
+ padding-bottom: var(--space-24);
+}
+
+.approvalChip {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ border-radius: var(--border-radius-small);
+ background-color: var(--allgrey-background-color);
+ padding: var(--space-4) var(--space-12);
+}
+
+.approvalText {
+ font-family: var(--font-family);
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 20px;
+ color: var(--secondary-text-color);
+}
+
+/* Thinking indicator */
+.thinking {
+ width: 100%;
+ flex-shrink: 0;
+ animation: messageSlideUp 0.3s ease-out;
+}
+
+.thinkingInner {
+ display: flex;
+ align-items: center;
+ gap: var(--space-8);
+ padding-left: 1px;
+ padding-right: 1px;
+}
+
+.thinkingLabel {
+ font-family: var(--font-family);
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 20px;
+ color: var(--secondary-text-color);
+}
+
+.thinkingDots {
+ display: flex;
+ gap: var(--space-2);
+}
+
+.thinkingDot {
+ display: inline-block;
+ width: var(--space-4);
+ height: var(--space-4);
+ border-radius: 50%;
+ background-color: var(--secondary-text-color);
+ animation: thinkingBounce 1s infinite;
+}
+
+.slideUp {
+ animation: messageSlideUp 0.3s ease-out;
+}
+
+.slideUpSlow {
+ animation: messageSlideUp 0.4s ease-out;
+}
+
+@keyframes messageSlideUp {
+ from {
+ opacity: 0;
+ transform: translateY(12px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+@keyframes thinkingBounce {
+ 0%,
+ 100% {
+ transform: translateY(0);
+ }
+ 50% {
+ transform: translateY(-25%);
+ }
+}
diff --git a/apps/kitchen-sink/src/screens/components/SidekickChatPage.tsx b/apps/kitchen-sink/src/screens/components/SidekickChatPage.tsx
new file mode 100644
index 0000000000..612012b328
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/SidekickChatPage.tsx
@@ -0,0 +1,425 @@
+import { useEffect, useRef, useState } from "react";
+import { Button, IconButton } from "@vibe/core";
+import {
+ Info,
+ ThumbsUp,
+ ThumbsDown,
+ Duplicate,
+ Menu,
+ Check,
+ DropdownChevronDown,
+ DropdownChevronRight,
+} from "@mondaydotcomorg/icons";
+import { AiSidekickIcon } from "./ai-icons";
+import { SidekickPromptEditor } from "./SidekickPromptEditor";
+import { ResponseStream } from "./ResponseStream";
+import { generateSidekickResponse } from "../data/sidekickResponses";
+import { CHAT_SCENARIOS } from "../data/sidekickChatScenarios";
+import glowImg from "../assets/sidekick/glow.png";
+import userAvatar from "figma:asset/6f1e4ef08a4e8899bba87998c3410a8132536714.png";
+import styles from "./SidekickChatPage.module.scss";
+
+type MessageType =
+ | { id: string; role: "user"; text: string }
+ | {
+ id: string;
+ role: "sidekick";
+ content: React.ReactNode;
+ card?: React.ReactNode;
+ followUp?: React.ReactNode;
+ sourceCount?: number;
+ showThoughtProcess?: boolean;
+ thoughtProcessLabel?: string;
+ }
+ | { id: string; role: "approval"; text: string }
+ | { id: string; role: "thinking" };
+
+function Breadcrumb({ chatTitle }: { chatTitle: string }) {
+ return (
+
+
+
+
+
AI Sidekick
+
/ {chatTitle}
+
+
+
+
+
+
+ );
+}
+
+function UserMessage({
+ text,
+ isNew,
+ msgId,
+}: {
+ text?: string;
+ isNew?: boolean;
+ msgId?: string;
+}) {
+ return (
+
+
+
+
+
+
+
+
+ );
+}
+
+function ThoughtProcessHeader({ label }: { label?: string }) {
+ const [expanded, setExpanded] = useState(false);
+ return (
+ setExpanded((e) => !e)}
+ className={styles.thoughtHeader}
+ >
+ {label || "Thought process"}
+
+
+
+
+ );
+}
+
+function FeedbackFooter({ sourceCount }: { sourceCount?: number }) {
+ return (
+
+
+
+
+
+
+
+
+ {sourceCount != null && sourceCount > 0 && (
+
+ {sourceCount} {sourceCount === 1 ? "source" : "sources"}
+
+ )}
+
+ );
+}
+
+function SidekickResponse({
+ content,
+ card,
+ followUp,
+ isNew,
+ sourceCount,
+ showThoughtProcess,
+ thoughtProcessLabel,
+ isLast,
+}: {
+ content: React.ReactNode;
+ card?: React.ReactNode;
+ followUp?: React.ReactNode;
+ isNew?: boolean;
+ sourceCount?: number;
+ showThoughtProcess?: boolean;
+ thoughtProcessLabel?: string;
+ isLast?: boolean;
+}) {
+ const [introComplete, setIntroComplete] = useState(!isNew);
+
+ return (
+
+
+ {showThoughtProcess && (
+
+ )}
+
+
+
+ {isNew && typeof content === "string" ? (
+
setIntroComplete(true)}
+ />
+ ) : (
+ {content}
+ )}
+
+
+ {card &&
{card}
}
+
+ {followUp && introComplete && (
+
+ {isNew && typeof followUp === "string" ? (
+
+ ) : (
+
{followUp}
+ )}
+
+ )}
+
+
+
+
+
+
+
+ );
+}
+
+function ApprovalLabel({ text }: { text: string }) {
+ return (
+
+ );
+}
+
+function ThinkingIndicator() {
+ return (
+
+ );
+}
+
+function scenarioToMessages(chatId: string): MessageType[] {
+ const scenario = CHAT_SCENARIOS[chatId];
+ if (!scenario) return [];
+ return scenario.messages.map((msg, i) => {
+ if (msg.role === "user") {
+ return { id: `${chatId}-${i}`, role: "user" as const, text: msg.text };
+ }
+ if (msg.role === "approval") {
+ return {
+ id: `${chatId}-${i}`,
+ role: "approval" as const,
+ text: msg.text,
+ };
+ }
+ return {
+ id: `${chatId}-${i}`,
+ role: "sidekick" as const,
+ content: msg.content,
+ card: msg.card,
+ sourceCount: msg.sourceCount,
+ showThoughtProcess: msg.showThoughtProcess,
+ thoughtProcessLabel: msg.thoughtProcessLabel,
+ };
+ });
+}
+
+interface SidekickChatPageProps {
+ chatId: string;
+ chatTitle: string;
+}
+
+export function SidekickChatPage({ chatId, chatTitle }: SidekickChatPageProps) {
+ const presetMessages = scenarioToMessages(chatId);
+ const [extraMessages, setExtraMessages] = useState([]);
+ const [newMessageIds, setNewMessageIds] = useState>(new Set());
+ const scrollContainerRef = useRef(null);
+ const [scrollToMsgId, setScrollToMsgId] = useState(null);
+ const [bottomSpacerHeight, setBottomSpacerHeight] = useState(0);
+
+ const allMessages = [...presetMessages, ...extraMessages];
+
+ useEffect(() => {
+ if (!scrollToMsgId) return;
+ const container = scrollContainerRef.current;
+ if (!container) return;
+
+ requestAnimationFrame(() => {
+ requestAnimationFrame(() => {
+ const targetEl = container.querySelector(
+ `[data-msg-id="${scrollToMsgId}"]`,
+ );
+ if (!targetEl) return;
+
+ const containerHeight = container.clientHeight;
+ const targetOffsetTop = targetEl.offsetTop;
+ const scrollTarget = Math.max(0, targetOffsetTop - 28);
+ const contentBelowTarget =
+ container.scrollHeight - targetOffsetTop - bottomSpacerHeight;
+ const neededSpacer = Math.max(0, containerHeight - contentBelowTarget);
+
+ if (neededSpacer !== bottomSpacerHeight) {
+ setBottomSpacerHeight(neededSpacer);
+ requestAnimationFrame(() => {
+ requestAnimationFrame(() => {
+ container.scrollTo({ top: scrollTarget, behavior: "smooth" });
+ setScrollToMsgId(null);
+ });
+ });
+ } else {
+ container.scrollTo({ top: scrollTarget, behavior: "smooth" });
+ setScrollToMsgId(null);
+ }
+ });
+ });
+ }, [scrollToMsgId, allMessages.length, bottomSpacerHeight]);
+
+ const handleSend = (text: string) => {
+ const userId = Date.now().toString();
+ const userMsg: MessageType = { id: userId, role: "user", text };
+
+ const response = generateSidekickResponse(text);
+ const sidekickId = `sidekick-${Date.now() + 1}`;
+ const sidekickMsg: MessageType = {
+ id: sidekickId,
+ role: "sidekick",
+ content: response.intro,
+ followUp: response.followUp,
+ };
+
+ setNewMessageIds((prev) => new Set(prev).add(userId).add(sidekickId));
+ setExtraMessages((prev) => [...prev, userMsg, sidekickMsg]);
+ setScrollToMsgId(userId);
+
+ setTimeout(() => {
+ setNewMessageIds(new Set());
+ }, 5000);
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+ {allMessages.map((msg, idx) => {
+ if (msg.role === "user") {
+ return (
+
+ );
+ }
+ if (msg.role === "approval") {
+ return
;
+ }
+ if (msg.role === "thinking") {
+ return
;
+ }
+ if (msg.role === "sidekick") {
+ const isLastSidekick = !allMessages
+ .slice(idx + 1)
+ .some((m) => m.role === "sidekick");
+ return (
+
+ );
+ }
+ return null;
+ })}
+
0
+ ? `${bottomSpacerHeight}px`
+ : "1px",
+ }}
+ />
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/screens/components/SidekickPage.module.scss b/apps/kitchen-sink/src/screens/components/SidekickPage.module.scss
new file mode 100644
index 0000000000..99c7a68881
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/SidekickPage.module.scss
@@ -0,0 +1,217 @@
+.root {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: var(--space-48);
+ padding: var(--space-48) var(--space-48);
+ max-width: 1040px;
+ margin: 0 auto;
+ width: 100%;
+}
+
+.heroBlock {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: var(--space-24);
+ width: 100%;
+ max-width: 720px;
+}
+
+.hero {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: var(--space-4);
+ text-align: center;
+}
+
+.heroGreeting {
+ font-size: 34px;
+ line-height: 1.2;
+}
+
+.heroQuestion {
+ font-size: 24px;
+ font-weight: 400;
+ color: var(--secondary-text-color);
+}
+
+/* Shell for StrokeSpotlight (animated stroke replaces static gradient border). */
+.composerShell {
+ width: 100%;
+}
+
+.composerWrap {
+ border-radius: 16px;
+ background: var(--primary-background-color);
+ overflow: hidden;
+ box-shadow:
+ rgba(50, 50, 93, 0.06) 0 4px 10px -2px,
+ rgba(0, 0, 0, 0.08) 0 2px 4px -1px;
+}
+
+.composerInput {
+ width: 100%;
+ min-height: 88px;
+ padding: var(--space-20) var(--space-20) var(--space-8);
+ border: none;
+ outline: none;
+ resize: none;
+ background: transparent;
+ font-family: inherit;
+ font-size: 14px;
+ line-height: 1.5;
+ color: var(--primary-text-color);
+
+ &::placeholder {
+ color: var(--secondary-text-color);
+ }
+}
+
+.composerFooter {
+ padding: var(--space-8) var(--space-12) var(--space-12);
+}
+
+.contextButton {
+ display: inline-flex;
+ align-items: center;
+ height: var(--space-32);
+ padding: 0 var(--space-8);
+ border: none;
+ border-radius: var(--border-radius-small);
+ background: transparent;
+ color: var(--secondary-text-color);
+ cursor: pointer;
+ font-family: inherit;
+ font-size: 14px;
+
+ &:hover {
+ background: var(--primary-background-hover-color);
+ }
+}
+
+.sendButton {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: var(--space-32);
+ height: var(--space-32);
+ flex-shrink: 0;
+ border: none;
+ border-radius: 50%;
+ background: var(--disabled-background-color);
+ color: var(--icon-color);
+ cursor: pointer;
+ transition:
+ background 0.1s ease,
+ color 0.1s ease;
+
+ &:hover {
+ background: var(--primary-color);
+ color: var(--text-color-on-primary);
+ }
+}
+
+/* Action shortcuts: colored circular icon badge with the label below. */
+.shortcutRow {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: flex-start;
+ gap: var(--space-16);
+}
+
+.shortcut {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: var(--space-8);
+ width: 84px;
+ padding: 0;
+ border: none;
+ background: transparent;
+ cursor: pointer;
+
+ &:hover .shortcutCircle {
+ filter: brightness(0.96);
+ }
+}
+
+.shortcutCircle {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 52px;
+ height: 52px;
+ border-radius: 50%;
+ background: var(--chip-bg, var(--primary-selected-color));
+ color: var(--primary-text-color);
+ transition: filter 0.1s ease;
+}
+
+.shortcutLabel {
+ text-align: center;
+ line-height: 1.3;
+}
+
+.cardsSection {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: var(--space-20);
+ width: 100%;
+}
+
+.sectionTitle {
+ text-align: center;
+}
+
+.starterGrid {
+ display: grid;
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+ gap: var(--space-16);
+ width: 100%;
+}
+
+.starterCard {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ align-items: flex-start;
+ gap: var(--space-16);
+ min-height: 150px;
+ padding: var(--space-16);
+ border: 1px solid var(--ui-border-color);
+ border-radius: 12px;
+ background: var(--primary-background-color);
+ text-align: left;
+ cursor: pointer;
+ transition: box-shadow 0.15s ease;
+
+ &:hover {
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
+ }
+}
+
+.starterCopy {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-4);
+}
+
+.starterTitle {
+ display: block;
+}
+
+.starterChip {
+ display: inline-flex;
+ align-items: center;
+ align-self: flex-start;
+ padding: var(--space-2) var(--space-8);
+ border-radius: var(--border-radius-small);
+ background: var(--primary-selected-color);
+ font-size: 11px;
+ font-weight: 500;
+ color: var(--primary-text-color);
+}
diff --git a/apps/kitchen-sink/src/screens/components/SidekickPage.tsx b/apps/kitchen-sink/src/screens/components/SidekickPage.tsx
new file mode 100644
index 0000000000..71b35ec09a
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/SidekickPage.tsx
@@ -0,0 +1,224 @@
+import { Box, Flex, Heading, Icon, IconButton, Text } from "@vibe/core";
+import {
+ AISkills,
+ Apps,
+ AttachSlanted,
+ Board,
+ BulletsAI,
+ Camera,
+ Doc,
+ Microphone,
+ MoveArrowUp,
+ SearchAI,
+ Work,
+} from "@mondaydotcomorg/icons";
+import styles from "./SidekickPage.module.scss";
+import { StrokeSpotlight } from "@vibe/core";
+import { STROKE_NO_PULSE_ATTR } from "@vibe/core";
+
+type ShortcutColorVar = `var(--color-${string})`;
+
+interface ActionShortcut {
+ icon: React.FC<{ size?: string | number; className?: string }>;
+ label: string;
+ color: ShortcutColorVar;
+}
+
+const ACTION_SHORTCUTS: ActionShortcut[] = [
+ {
+ icon: Board,
+ label: "Create a board",
+ color: "var(--color-lavender-selected)",
+ },
+ {
+ icon: Doc,
+ label: "Write a doc",
+ color: "var(--color-aquamarine-selected)",
+ },
+ {
+ icon: SearchAI,
+ label: "Research online",
+ color: "var(--color-egg_yolk-selected)",
+ },
+ {
+ icon: BulletsAI,
+ label: "Analyze data",
+ color: "var(--color-lipstick-selected)",
+ },
+ {
+ icon: Camera,
+ label: "Generate an image",
+ color: "var(--color-done-green-selected)",
+ },
+ {
+ icon: Work,
+ label: "Build a Vibe app",
+ color: "var(--color-orchid-selected)",
+ },
+ {
+ icon: AISkills,
+ label: "Learn about",
+ color: "var(--color-bright-blue-selected)",
+ },
+];
+
+const SUGGESTED_STARTERS = [
+ {
+ title: "Create a structured board",
+ description: "Build a board with owners, milestones, and timelines.",
+ chip: "Board",
+ },
+ {
+ title: "Draft a clear document",
+ description: "Turn goals and decisions into a crisp written document.",
+ chip: "Doc",
+ },
+ {
+ title: "Get a snapshot of progress",
+ description: "Summarize what's done, in progress, and at risk.",
+ chip: "Insights",
+ },
+ {
+ title: "Generate ideas to solve a concrete work challenge",
+ description: "Brainstorm approaches and turn them into an action plan.",
+ chip: "Brainstorm",
+ },
+] as const;
+
+export function SidekickPage() {
+ return (
+
+
+
+
+ Hey Naama
+
+
+ What would you like to work on today?
+
+
+
+
+
+
+
+
+
+
+
+
+ @ Add context
+
+
+
+
+
+
+
+
+
+
+
+
+ {ACTION_SHORTCUTS.map(({ icon, label, color }) => (
+
+
+
+
+
+ {label}
+
+
+ ))}
+
+
+
+
+
+ Suggested starters tailored for your work
+
+
+
+ {SUGGESTED_STARTERS.map(({ title, description, chip }) => (
+
+
+
+ {title}
+
+
+ {description}
+
+
+ {chip}
+
+ ))}
+
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/screens/components/SidekickPromptEditor.module.scss b/apps/kitchen-sink/src/screens/components/SidekickPromptEditor.module.scss
new file mode 100644
index 0000000000..c7987ea3c5
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/SidekickPromptEditor.module.scss
@@ -0,0 +1,145 @@
+/* Match the chat input's existing radius/size — the hero composer
+ defaults use 16px; this one uses a smaller radius via StrokeSpotlight. */
+.composerShell {
+ width: 100%;
+ z-index: 2;
+}
+
+.composerWrap {
+ width: 100%;
+ border-radius: var(--border-radius-big);
+ background-color: var(--primary-background-color);
+ min-height: 100px;
+ overflow: hidden;
+ box-shadow:
+ rgba(50, 50, 93, 0.06) 0 4px 10px -2px,
+ rgba(0, 0, 0, 0.08) 0 2px 4px -1px;
+}
+
+.editor {
+ width: 100%;
+ border-radius: var(--border-radius-big);
+ background-color: var(--primary-background-color);
+ min-height: 100px;
+}
+
+.inner {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ min-height: 100px;
+ padding: var(--space-12) var(--space-16);
+}
+
+.inputRow {
+ display: flex;
+ align-items: center;
+ gap: var(--space-2);
+ flex-shrink: 0;
+}
+
+.textarea {
+ width: 100%;
+ resize: none;
+ border: none;
+ outline: none;
+ background: transparent;
+ font-family: var(--font-family);
+ font-size: 16px;
+ font-weight: 400;
+ line-height: 22px;
+ color: var(--primary-text-color);
+ caret-color: var(--primary-text-color);
+
+ &::placeholder {
+ color: var(--secondary-text-color);
+ }
+}
+
+.actionRow {
+ display: flex;
+ align-items: center;
+ gap: var(--space-12);
+ width: 100%;
+}
+
+.leftActions {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+}
+
+.iconButton {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border: none;
+ background: transparent;
+ border-radius: var(--border-radius-small);
+ width: var(--space-24);
+ height: var(--space-24);
+ cursor: pointer;
+ color: var(--primary-text-color);
+ transition: background-color 0.15s ease;
+
+ &:hover {
+ background-color: var(--primary-background-hover-color);
+ }
+}
+
+.addContext {
+ display: flex;
+ align-items: center;
+ gap: var(--space-8);
+ height: var(--space-24);
+ padding: 0 var(--space-8);
+ border: none;
+ background: transparent;
+ border-radius: var(--border-radius-small);
+ cursor: pointer;
+ color: var(--primary-text-color);
+ transition: background-color 0.15s ease;
+
+ &:hover {
+ background-color: var(--primary-background-hover-color);
+ }
+}
+
+.addContextLabel {
+ font-family: var(--font-family);
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 20px;
+ color: var(--primary-text-color);
+ white-space: nowrap;
+}
+
+.spacer {
+ flex: 1;
+ min-height: 1px;
+ min-width: 1px;
+}
+
+.sendButton {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border: none;
+ border-radius: var(--border-radius-medium);
+ width: var(--space-24);
+ height: var(--space-24);
+ cursor: pointer;
+ background-color: var(--disabled-background-color);
+ color: var(--disabled-text-color);
+ transition: background-color 0.15s ease;
+
+ &:not(:disabled) {
+ background-color: var(--inverted-color-background);
+ color: var(--text-color-on-inverted);
+ cursor: pointer;
+ }
+
+ &:disabled {
+ cursor: default;
+ }
+}
diff --git a/apps/kitchen-sink/src/screens/components/SidekickPromptEditor.tsx b/apps/kitchen-sink/src/screens/components/SidekickPromptEditor.tsx
new file mode 100644
index 0000000000..59c7733228
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/SidekickPromptEditor.tsx
@@ -0,0 +1,102 @@
+import { useState } from "react";
+import {
+ AISkills,
+ AttachSlanted,
+ Add,
+ MoveArrowUp,
+} from "@mondaydotcomorg/icons";
+import styles from "./SidekickPromptEditor.module.scss";
+import { StrokeSpotlight } from "@vibe/core";
+import { STROKE_NO_PULSE_ATTR } from "@vibe/core";
+
+interface SidekickPromptEditorProps {
+ onSend?: (message: string) => void;
+}
+
+export function SidekickPromptEditor({ onSend }: SidekickPromptEditorProps) {
+ const [inputValue, setInputValue] = useState("");
+ const hasInput = inputValue.trim().length > 0;
+
+ const handleSend = () => {
+ if (!hasInput) return;
+ onSend?.(inputValue.trim());
+ setInputValue("");
+ };
+
+ const handleKeyDown = (e: React.KeyboardEvent
) => {
+ if (e.key === "Enter" && !e.shiftKey) {
+ e.preventDefault();
+ handleSend();
+ }
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Add context
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/screens/components/StatusCell.module.scss b/apps/kitchen-sink/src/screens/components/StatusCell.module.scss
new file mode 100644
index 0000000000..53cbf93d6f
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/StatusCell.module.scss
@@ -0,0 +1,31 @@
+.cell {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ height: 100%;
+ cursor: pointer;
+}
+
+.chip {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ height: 100%;
+ transition: opacity var(--motion-productive-medium)
+ var(--motion-timing-transition);
+
+ &:hover {
+ opacity: 0.8;
+ }
+}
+
+.label {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ width: 100%;
+ padding-left: var(--space-4);
+ padding-right: var(--space-4);
+}
diff --git a/apps/kitchen-sink/src/screens/components/StatusCell.tsx b/apps/kitchen-sink/src/screens/components/StatusCell.tsx
new file mode 100644
index 0000000000..c4f046f09a
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/StatusCell.tsx
@@ -0,0 +1,62 @@
+import { Clickable, Text } from "@vibe/core";
+import styles from "./StatusCell.module.scss";
+import { StatusType, PriorityType } from "./types";
+
+interface StatusCellProps {
+ status: StatusType | PriorityType;
+ onClick?: () => void;
+}
+
+const getStatusColor = (status: StatusType | PriorityType): string => {
+ switch (status) {
+ // Statuses
+ case "Done":
+ return "var(--color-done-green)";
+ case "Working on it":
+ return "var(--color-working_orange)";
+ case "Stuck":
+ return "var(--color-stuck-red)";
+ case "Waiting":
+ return "var(--color-dark_purple)";
+ case "Sync with other team":
+ return "var(--color-dark_indigo)";
+
+ // Priorities
+ case "High":
+ return "var(--color-stuck-red)";
+ case "Medium":
+ return "var(--color-egg_yolk)";
+ case "Low":
+ return "var(--color-bright-blue)";
+ case "Critical":
+ return "var(--color-blackish)";
+
+ default:
+ return "var(--color-american_gray)";
+ }
+};
+
+export const StatusCell: React.FC = ({ status, onClick }) => {
+ const backgroundColor = getStatusColor(status);
+
+ return (
+
+
+
+ {status || ""}
+
+
+
+ );
+};
diff --git a/apps/kitchen-sink/src/screens/components/ThemeSwitcher.module.scss b/apps/kitchen-sink/src/screens/components/ThemeSwitcher.module.scss
new file mode 100644
index 0000000000..2af4fa2c1a
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/ThemeSwitcher.module.scss
@@ -0,0 +1,332 @@
+.container {
+ position: fixed;
+ bottom: 24px;
+ right: 24px;
+ z-index: 50;
+ // Pin the switcher to its own font stack so picking a new font for the app
+ // doesn't restyle this menu. Children inherit unless they opt in (e.g. the
+ // font-row labels preview themselves in their own font).
+ font-family:
+ "Figtree", "Poppins", "Inter", "Helvetica Neue", Arial, sans-serif;
+}
+
+.popover {
+ position: absolute;
+ bottom: calc(100% + 8px);
+ right: 0;
+ border-radius: var(--border-radius-medium);
+ border: 1px solid;
+ box-shadow: var(--box-shadow-medium);
+}
+
+.popoverInner {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ padding: 8px;
+}
+
+.sectionLabel {
+ padding-left: 12px;
+ padding-right: 12px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ font-size: 12px;
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+}
+
+.swatchRow {
+ display: flex;
+ width: 100%;
+ align-items: center;
+ gap: 12px;
+ border-radius: var(--border-radius-small);
+ padding-left: 12px;
+ padding-right: 12px;
+ padding-top: 8px;
+ padding-bottom: 8px;
+ text-align: left;
+ transition:
+ color 0.15s,
+ background-color 0.15s,
+ border-color 0.15s;
+ cursor: pointer;
+ background: transparent;
+ border: none;
+ font: inherit;
+
+ &:hover {
+ background: var(--primary-highlighted-color);
+ }
+
+ &.active {
+ background: var(--primary-selected-color);
+ }
+
+ &:not(.active) {
+ background: var(--primary-background-color);
+ }
+}
+
+.swatchColors {
+ display: flex;
+ flex-shrink: 0;
+ gap: 4px;
+}
+
+.swatch {
+ height: 20px;
+ width: 20px;
+ border-radius: var(--border-radius-small);
+}
+
+.swatchBordered {
+ height: 20px;
+ width: 20px;
+ border-radius: var(--border-radius-small);
+ border: 1px solid var(--ui-border-color);
+}
+
+.swatchLabel {
+ flex: 1;
+ font-size: 14px;
+ font-weight: 500;
+}
+
+.activeCheck {
+ font-size: 14px;
+ font-weight: 600;
+}
+
+.divider {
+ margin-top: 4px;
+ margin-bottom: 4px;
+ border-top: 1px solid var(--ui-border-color);
+}
+
+.modeButtons {
+ display: flex;
+ gap: 4px;
+ padding-left: 4px;
+ padding-right: 4px;
+ padding-bottom: 4px;
+}
+
+.modeButton {
+ flex: 1;
+ border-radius: var(--border-radius-small);
+ padding-top: 6px;
+ padding-bottom: 6px;
+ font-size: 12px;
+ font-weight: 600;
+ transition:
+ color 0.15s,
+ background-color 0.15s,
+ border-color 0.15s;
+ cursor: pointer;
+ border: none;
+ font-family: inherit;
+}
+
+.fontSubsection {
+ display: flex;
+ flex-direction: column;
+}
+
+.fontSubsectionHeader {
+ display: flex;
+ width: 100%;
+ align-items: center;
+ gap: 8px;
+ border-radius: var(--border-radius-small);
+ padding: 8px 12px;
+ text-align: left;
+ cursor: pointer;
+ background: transparent;
+ border: none;
+ font: inherit;
+ transition: background-color 0.15s;
+
+ &:hover {
+ background: var(--primary-highlighted-color);
+ }
+}
+
+.fontSubsectionChevron {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ color: var(--secondary-text-color);
+ transition: transform 0.15s;
+ flex-shrink: 0;
+}
+
+.chevronExpanded {
+ transform: rotate(90deg);
+}
+
+.fontSubsectionTitle {
+ font-size: 12px;
+ font-weight: 600;
+}
+
+.fontSubsectionValue {
+ margin-left: auto;
+ font-size: 12px;
+ font-weight: 500;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ max-width: 50%;
+}
+
+.fontSubsectionContent {
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+ padding: 4px 0 8px 12px;
+}
+
+.fontRowWrapper {
+ position: relative;
+ display: flex;
+ align-items: stretch;
+ border-radius: var(--border-radius-small);
+ transition: background-color 0.15s;
+
+ &:hover {
+ background: var(--primary-highlighted-color);
+
+ .removeFontButton {
+ opacity: 1;
+ pointer-events: auto;
+ }
+ }
+
+ &.active {
+ background: var(--primary-selected-color);
+ }
+}
+
+.fontRow {
+ display: flex;
+ flex: 1;
+ min-width: 0;
+ align-items: center;
+ gap: 12px;
+ border-radius: var(--border-radius-small);
+ padding: 8px 12px;
+ text-align: left;
+ cursor: pointer;
+ background: transparent;
+ border: none;
+ font: inherit;
+ transition: color 0.15s;
+}
+
+.removeFontButton {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 28px;
+ margin-right: 4px;
+ padding: 0;
+ background: transparent;
+ border: none;
+ border-radius: var(--border-radius-small);
+ color: var(--secondary-text-color);
+ cursor: pointer;
+ opacity: 0;
+ pointer-events: none;
+ transition:
+ opacity 0.15s,
+ color 0.15s,
+ background-color 0.15s;
+
+ &:hover {
+ color: var(--negative-color, #d83a52);
+ background: var(--primary-background-color);
+ }
+
+ &:focus-visible {
+ opacity: 1;
+ pointer-events: auto;
+ outline: 2px solid var(--primary-color);
+ outline-offset: -2px;
+ }
+}
+
+.fontLabel {
+ flex: 1;
+ font-size: 14px;
+ font-weight: 500;
+}
+
+.customFontRow {
+ display: flex;
+ gap: 4px;
+ padding: 4px 4px 4px 4px;
+}
+
+.customFontInput {
+ flex: 1;
+ min-width: 0;
+ border-radius: var(--border-radius-small);
+ border: 1px solid var(--ui-border-color);
+ padding: 6px 8px;
+ font-size: 12px;
+ font-family: inherit;
+ background: var(--primary-background-color);
+ color: var(--primary-text-color);
+
+ &:focus {
+ outline: none;
+ border-color: var(--primary-color);
+ }
+}
+
+.customFontApply {
+ border-radius: var(--border-radius-small);
+ padding: 6px 12px;
+ font-size: 12px;
+ font-weight: 600;
+ cursor: pointer;
+ border: none;
+ font-family: inherit;
+ background: var(--primary-color);
+ color: #ffffff;
+
+ &:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+ }
+}
+
+.customFontAdd {
+ border-radius: var(--border-radius-small);
+ padding: 6px 12px;
+ font-size: 12px;
+ font-weight: 600;
+ cursor: pointer;
+ font-family: inherit;
+ background: var(--ui-background-color);
+ color: var(--primary-text-color);
+ border: 1px solid var(--ui-border-color);
+
+ &:hover:not(:disabled) {
+ background: var(--primary-highlighted-color);
+ }
+
+ &:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+ }
+}
+
+.triggerWrap {
+ overflow: hidden;
+ border-radius: 9999px;
+ box-shadow: var(--box-shadow-small);
+}
diff --git a/apps/kitchen-sink/src/screens/components/ThemeSwitcher.tsx b/apps/kitchen-sink/src/screens/components/ThemeSwitcher.tsx
new file mode 100644
index 0000000000..d84a4e4290
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/ThemeSwitcher.tsx
@@ -0,0 +1,520 @@
+import { useEffect, useRef, useState } from "react";
+import { IconButton } from "@vibe/core";
+import { ColorPicker } from "@mondaydotcomorg/icons";
+import styles from "./ThemeSwitcher.module.scss";
+import {
+ CURATED_FONTS,
+ PROTECTED_FONTS,
+ verifyGoogleFont,
+} from "./fontsConfig";
+
+interface ThemeSwitcherProps {
+ activeTheme: string;
+ onThemeChange: (theme: string) => void;
+ activeMode: string;
+ onModeChange: (mode: string) => void;
+ activeHeadingFont: string;
+ onHeadingFontChange: (font: string) => void;
+ activeTextFont: string;
+ onTextFontChange: (font: string) => void;
+ customFonts: string[];
+ removedFonts: string[];
+ onAddCustomFont: (font: string) => void;
+ onRemoveFont: (font: string) => void;
+ onError: (message: string) => void;
+}
+
+interface FontSubsectionProps {
+ title: string;
+ activeFont: string;
+ onFontChange: (font: string) => void;
+ customFonts: string[];
+ removedFonts: string[];
+ onAddCustomFont: (font: string) => void;
+ onRemoveFont: (font: string) => void;
+ onError: (message: string) => void;
+}
+
+function TrashIcon() {
+ return (
+
+
+
+ );
+}
+
+function FontSubsection({
+ title,
+ activeFont,
+ onFontChange,
+ customFonts,
+ removedFonts,
+ onAddCustomFont,
+ onRemoveFont,
+ onError,
+}: FontSubsectionProps) {
+ const [expanded, setExpanded] = useState(false);
+ const [customFont, setCustomFont] = useState("");
+ const [validating, setValidating] = useState(false);
+
+ const removedSet = new Set(removedFonts);
+ const allFonts = [
+ ...CURATED_FONTS.filter((f) => !removedSet.has(f.value)),
+ ...customFonts.map((f) => ({
+ value: f,
+ label: f,
+ googleFontParam: undefined as string | undefined,
+ })),
+ ];
+
+ async function handleApplyCustom() {
+ const trimmed = customFont.trim();
+ if (!trimmed) return;
+ setValidating(true);
+ const ok = await verifyGoogleFont(trimmed);
+ setValidating(false);
+ if (!ok) {
+ onError(`Font "${trimmed}" not found on Google Fonts`);
+ return;
+ }
+ onFontChange(trimmed);
+ }
+
+ async function handleAddCustom() {
+ const trimmed = customFont.trim();
+ if (!trimmed) return;
+ setValidating(true);
+ const ok = await verifyGoogleFont(trimmed);
+ setValidating(false);
+ if (!ok) {
+ onError(`Font "${trimmed}" not found on Google Fonts`);
+ return;
+ }
+ onAddCustomFont(trimmed);
+ setCustomFont("");
+ }
+
+ return (
+
+
setExpanded((v) => !v)}
+ aria-expanded={expanded}
+ >
+
+
+
+
+
+
+ {title}
+
+
+ {activeFont}
+
+
+
+ {expanded && (
+
+ {allFonts.map((font) => {
+ const isActive = activeFont === font.value;
+ const removable = !PROTECTED_FONTS.has(font.value);
+ return (
+
+ onFontChange(font.value)}
+ aria-pressed={isActive}
+ >
+
+ {font.label}
+
+ {isActive && (
+
+ ✓
+
+ )}
+
+ {removable && (
+ {
+ e.stopPropagation();
+ onRemoveFont(font.value);
+ }}
+ aria-label={`Remove ${font.value}`}
+ title={`Remove ${font.value}`}
+ >
+
+
+ )}
+
+ );
+ })}
+
+
+ setCustomFont(e.target.value)}
+ onKeyDown={(e) => {
+ if (e.key === "Enter") handleApplyCustom();
+ }}
+ aria-label={`Custom Google Font name for ${title}`}
+ />
+
+ {validating ? "..." : "Apply"}
+
+
+ Add
+
+
+
+ )}
+
+ );
+}
+
+interface ThemeDefinition {
+ value: string;
+ label: string;
+ colors: {
+ primary: string;
+ surface: string;
+ ui: string;
+ };
+}
+
+const THEMES: ThemeDefinition[] = [
+ {
+ value: "",
+ label: "Default",
+ colors: { primary: "#0073ea", surface: "#f0f2f8", ui: "#e7e9ef" },
+ },
+ {
+ value: "slick",
+ label: "Slick",
+ colors: { primary: "#1d1d1f", surface: "#f2f3f5", ui: "#e8e8ed" },
+ },
+ {
+ value: "glaze",
+ label: "Glaze",
+ colors: { primary: "#404643", surface: "#f4f5f3", ui: "#f2f3f2" },
+ },
+ {
+ value: "glaze-neue",
+ label: "Glaze Neue",
+ colors: { primary: "#2d5bff", surface: "#f4f3f1", ui: "#f1f0ee" },
+ },
+ {
+ value: "warmth",
+ label: "Warmth",
+ colors: { primary: "#2d5bff", surface: "#f9f7f7", ui: "#f5f1ef" },
+ },
+ {
+ value: "editorial-amber",
+ label: "Amber",
+ colors: { primary: "#b45309", surface: "#fdf8f0", ui: "#f5ead8" },
+ },
+ {
+ value: "editorial-terracotta",
+ label: "Terracotta",
+ colors: { primary: "#c2410c", surface: "#fdf4ef", ui: "#f5e4d8" },
+ },
+ {
+ value: "editorial-espresso",
+ label: "Espresso",
+ colors: { primary: "#3d2a1e", surface: "#f7f3ef", ui: "#ede4da" },
+ },
+];
+
+const MODES = [
+ { value: "", label: "Light" },
+ { value: "dark-app-theme", label: "Dark" },
+ { value: "black-app-theme", label: "Black" },
+];
+
+function SwatchCard({
+ theme,
+ isActive,
+ onClick,
+}: {
+ theme: ThemeDefinition;
+ isActive: boolean;
+ onClick: () => void;
+}) {
+ return (
+
+ {/* Hardcoded color previews — CSS vars can't be scoped to a child element */}
+
+
+ {/* Label */}
+
+ {theme.label}
+
+
+ {/* Active indicator */}
+ {isActive && (
+
+ ✓
+
+ )}
+
+ );
+}
+
+export function ThemeSwitcher({
+ activeTheme,
+ onThemeChange,
+ activeMode,
+ onModeChange,
+ activeHeadingFont,
+ onHeadingFontChange,
+ activeTextFont,
+ onTextFontChange,
+ customFonts,
+ removedFonts,
+ onAddCustomFont,
+ onRemoveFont,
+ onError,
+}: ThemeSwitcherProps) {
+ const [open, setOpen] = useState(false);
+ const containerRef = useRef(null);
+
+ useEffect(() => {
+ if (!open) return;
+ function handleClick(e: MouseEvent) {
+ if (
+ containerRef.current &&
+ !containerRef.current.contains(e.target as Node)
+ ) {
+ setOpen(false);
+ }
+ }
+ function handleKey(e: KeyboardEvent) {
+ if (e.key === "Escape") setOpen(false);
+ }
+ document.addEventListener("mousedown", handleClick);
+ document.addEventListener("keydown", handleKey);
+ return () => {
+ document.removeEventListener("mousedown", handleClick);
+ document.removeEventListener("keydown", handleKey);
+ };
+ }, [open]);
+
+ function handleThemeChange(value: string) {
+ onThemeChange(value);
+ setOpen(false);
+ }
+
+ return (
+
+ {/* Popover panel — renders above the button */}
+ {open && (
+
+
+
+ Theme
+
+ {THEMES.map((theme) => (
+
handleThemeChange(theme.value)}
+ />
+ ))}
+
+ {/* Divider */}
+
+
+ {/* Font section */}
+
+ Font
+
+
+
+
+ {/* Divider */}
+
+
+ {/* Mode section */}
+
+ Mode
+
+
+ {MODES.map((mode) => {
+ const isActive = activeMode === mode.value;
+ const isDarkPill = mode.value === "dark-app-theme";
+ const isBlackPill = mode.value === "black-app-theme";
+ return (
+ onModeChange(mode.value)}
+ className={styles.modeButton}
+ style={
+ isActive
+ ? {
+ background:
+ isDarkPill || isBlackPill
+ ? isDarkPill
+ ? "#1b1b20"
+ : "#000000"
+ : "var(--primary-color)",
+ color: "#ffffff",
+ }
+ : {
+ background: "var(--ui-background-color)",
+ color: "var(--primary-text-color)",
+ }
+ }
+ >
+ {mode.label}
+
+ );
+ })}
+
+
+
+ )}
+
+ {/* Trigger button with background */}
+
+ setOpen((v) => !v)}
+ />
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/screens/components/VibeAppBoardView.module.scss b/apps/kitchen-sink/src/screens/components/VibeAppBoardView.module.scss
new file mode 100644
index 0000000000..ff6de7845b
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/VibeAppBoardView.module.scss
@@ -0,0 +1,242 @@
+@import url("https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;500;600;700&family=Syne:wght@600;700&display=swap");
+
+.root {
+ --vibe-app-bg: #edf3ed;
+ --vibe-app-primary: #2d6a4f;
+ --vibe-app-primary-light: #7aa193;
+ --vibe-app-text: #163326;
+ --vibe-app-text-secondary: #5f7866;
+ --vibe-app-glass-border: rgba(255, 255, 255, 0.55);
+ --vibe-app-shadow: 0 8px 24px rgba(45, 106, 79, 0.1);
+ --vibe-app-shadow-soft: 0 8px 12px rgba(45, 106, 79, 0.1);
+
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ min-height: 680px;
+ overflow: hidden;
+ border-radius: var(--border-radius-medium);
+ background-color: #ffffff;
+}
+
+.nav {
+ display: flex;
+ align-items: center;
+ gap: 14px;
+ height: 60px;
+ padding-inline: 32px;
+ border-bottom: 1px solid var(--vibe-app-glass-border);
+ background: rgba(237, 243, 237, 0.8);
+ backdrop-filter: blur(6px);
+}
+
+.brand {
+ display: flex;
+ align-items: center;
+ gap: var(--space-8);
+ flex-shrink: 0;
+}
+
+.brandMark {
+ width: 22px;
+ height: 22px;
+ border-radius: 20px;
+ background: linear-gradient(135deg, #2d6a4f 14.645%, #96b4a7 85.355%);
+}
+
+.brandName {
+ font-family: "Syne", var(--boards-font-family);
+ font-size: 14px;
+ font-weight: 600;
+ letter-spacing: -0.28px;
+ color: var(--vibe-app-text);
+}
+
+.navLinks {
+ display: flex;
+ flex: 1 1 auto;
+ align-items: center;
+ gap: 28px;
+ min-width: 0;
+ padding-left: 32px;
+ overflow: hidden;
+}
+
+.navLink {
+ flex-shrink: 0;
+ font-family: "Playfair Display", serif;
+ font-size: 12px;
+ color: var(--vibe-app-text-secondary);
+ white-space: nowrap;
+}
+
+.navActions {
+ display: flex;
+ align-items: center;
+ gap: var(--space-8);
+ flex-shrink: 0;
+}
+
+.navButtonSecondary,
+.navButtonPrimary,
+.heroCtaPrimary,
+.heroCtaSecondary {
+ border: 1px solid var(--vibe-app-glass-border);
+ cursor: pointer;
+ font-family: "Playfair Display", serif;
+ white-space: nowrap;
+}
+
+.navButtonSecondary {
+ height: 34px;
+ padding-inline: 14px;
+ border-radius: 12px;
+ background: transparent;
+ box-shadow: var(--vibe-app-shadow-soft);
+ font-size: 12px;
+ font-weight: 500;
+ color: var(--vibe-app-text-secondary);
+}
+
+.navButtonPrimary {
+ height: 34px;
+ padding-inline: 14px;
+ border-radius: 12px;
+ background-color: var(--vibe-app-primary);
+ box-shadow: var(--vibe-app-shadow);
+ font-size: 12px;
+ font-weight: 500;
+ color: #ffffff;
+}
+
+.hero {
+ position: relative;
+ display: flex;
+ flex: 1 1 auto;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding: 80px 48px 64px;
+ background-color: var(--vibe-app-bg);
+ text-align: center;
+}
+
+.heroGlow {
+ position: absolute;
+ inset: 0;
+ pointer-events: none;
+ background: radial-gradient(
+ ellipse 90% 72% at 50% 83%,
+ rgba(45, 106, 79, 0.14) 0%,
+ transparent 60%
+ );
+}
+
+.heroBadge {
+ position: relative;
+ z-index: 1;
+ display: inline-flex;
+ align-items: center;
+ gap: var(--space-8);
+ padding: 5px 12px 5px 5px;
+ border: 1px solid var(--vibe-app-glass-border);
+ border-radius: 9999px;
+ background: rgba(255, 255, 255, 0.7);
+ backdrop-filter: blur(8px);
+ box-shadow: var(--vibe-app-shadow);
+}
+
+.badgeNew {
+ padding: 2px 8px;
+ border-radius: 9999px;
+ background-color: var(--vibe-app-primary);
+ font-family: "Playfair Display", serif;
+ font-size: 10px;
+ font-weight: 700;
+ letter-spacing: 0.8px;
+ color: #ffffff;
+}
+
+.badgeText {
+ font-family: "Playfair Display", serif;
+ font-size: 11px;
+ font-weight: 500;
+ color: var(--vibe-app-text-secondary);
+}
+
+.heroTitle {
+ position: relative;
+ z-index: 1;
+ margin: 22px 0 0;
+ max-width: 920px;
+ font-family: "Syne", var(--boards-font-family);
+ font-size: clamp(40px, 5.5vw, 80px);
+ font-weight: 600;
+ line-height: 1.15;
+ letter-spacing: -0.02em;
+ color: var(--vibe-app-text);
+}
+
+.heroTitleLine {
+ display: block;
+}
+
+.heroTitleAccent {
+ background: linear-gradient(160.89deg, #2d6a4f 13.4%, #7aa193 86.6%);
+ background-clip: text;
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+}
+
+.heroSubtitle {
+ position: relative;
+ z-index: 1;
+ margin: 22px 0 0;
+ max-width: 580px;
+ font-family: "Playfair Display", serif;
+ font-size: 18px;
+ line-height: 1.55;
+ color: var(--vibe-app-text-secondary);
+}
+
+.heroActions {
+ position: relative;
+ z-index: 1;
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ gap: var(--space-8);
+ margin-top: 22px;
+}
+
+.heroCtaPrimary {
+ height: 46px;
+ padding-inline: 22px;
+ border-radius: 12px;
+ background-color: var(--vibe-app-primary);
+ box-shadow: var(--vibe-app-shadow);
+ font-size: 14px;
+ font-weight: 600;
+ color: #ffffff;
+}
+
+.heroCtaSecondary {
+ height: 46px;
+ padding-inline: 22px;
+ border-radius: 12px;
+ background: transparent;
+ box-shadow: var(--vibe-app-shadow-soft);
+ font-size: 14px;
+ font-weight: 600;
+ color: var(--vibe-app-text-secondary);
+}
+
+.heroNote {
+ position: relative;
+ z-index: 1;
+ margin: 22px 0 0;
+ font-family: "Playfair Display", serif;
+ font-size: 11px;
+ color: var(--vibe-app-text-secondary);
+ opacity: 0.67;
+}
diff --git a/apps/kitchen-sink/src/screens/components/VibeAppBoardView.tsx b/apps/kitchen-sink/src/screens/components/VibeAppBoardView.tsx
new file mode 100644
index 0000000000..b479f217da
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/VibeAppBoardView.tsx
@@ -0,0 +1,76 @@
+import styles from "./VibeAppBoardView.module.scss";
+
+const NAV_LINKS = [
+ "Product",
+ "Solutions",
+ "Customers",
+ "Pricing",
+ "Docs",
+ "Blog",
+] as const;
+
+export function VibeAppBoardView() {
+ return (
+
+
+
+
+
+
+
+ NEW
+
+ AI-powered anomaly detection is live
+
+
+
+
+ Analytics that ship
+
+ with your team
+
+
+
+
+ Real-time visibility into what your users do and what your systems do
+ — connected, in one place, without the dashboard maintenance tax.
+
+
+
+
+ Start free trial
+
+
+ ▶ Watch 90s demo
+
+
+
+
+ ✓ Free 14-day trial · No credit card · Cancel anytime
+
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/screens/components/VibePage.module.scss b/apps/kitchen-sink/src/screens/components/VibePage.module.scss
new file mode 100644
index 0000000000..413000de4a
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/VibePage.module.scss
@@ -0,0 +1,768 @@
+.root {
+ --vibe-mini-home-font-family: var(--boards-font-family);
+ --font-family: var(--vibe-mini-home-font-family);
+ --title-font-family: var(--vibe-mini-home-font-family);
+
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ flex: 1 1 auto;
+ gap: 64px;
+ min-width: 0;
+ padding: 72px clamp(var(--space-24), 4vw, var(--space-80)) var(--space-64);
+ width: 100%;
+ max-width: 100%;
+ height: 100%;
+ min-height: 0;
+ border-radius: var(--border-radius-big) 0 0 0;
+ font-family: var(--vibe-mini-home-font-family);
+ background:
+ radial-gradient(
+ 37.96% 20% at 49.96% 20%,
+ rgba(236, 129, 255, 0.08) 0%,
+ rgba(236, 129, 255, 0) 100%
+ ),
+ var(--primary-background-color);
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.heroBlock {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: var(--space-16);
+ width: 100%;
+ max-width: 620px;
+ margin-bottom: var(--space-80);
+}
+
+.hero {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: var(--space-24);
+ text-align: center;
+}
+
+.heroTitle {
+ font-family: var(--vibe-mini-home-font-family);
+ font-size: 32px;
+ font-weight: 400;
+ line-height: 40px;
+}
+
+/* ---- Composer (StrokeSpotlight animated stroke) ---- */
+
+.composerShell {
+ width: 100%;
+ max-width: 620px;
+}
+
+.composerWrap {
+ border-radius: 16px;
+ background: var(--primary-background-color);
+ overflow: hidden;
+ box-shadow:
+ rgba(50, 50, 93, 0.06) 0 4px 10px -2px,
+ rgba(0, 0, 0, 0.08) 0 2px 4px -1px;
+}
+
+.composerInput {
+ width: 100%;
+ min-height: 120px;
+ padding: var(--space-20) var(--space-20) var(--space-8);
+ border: none;
+ outline: none;
+ resize: none;
+ background: transparent;
+ font-family: inherit;
+ font-size: 14px;
+ line-height: 1.5;
+ color: var(--primary-text-color);
+
+ &::placeholder {
+ color: var(--secondary-text-color);
+ }
+}
+
+.composerFooter {
+ padding: var(--space-8) var(--space-12) var(--space-12);
+ flex-wrap: nowrap;
+}
+
+.promptActionsLeft {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ flex: 1 1 auto;
+ min-width: 0;
+}
+
+.promptActionsRight {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ flex: 0 0 auto;
+ margin-left: auto;
+}
+
+.compactActionsAnchor {
+ display: inline-flex;
+}
+
+.compactActionsButton {
+ flex-shrink: 0;
+}
+
+.modelButton {
+ height: 32px;
+ padding: 0 var(--space-4);
+ border-radius: 6px;
+ font-weight: 400;
+ flex-shrink: 0;
+}
+
+.planToggleWrapper {
+ display: inline-flex;
+ align-items: center;
+ height: 32px;
+ margin-right: calc(-1 * var(--space-4));
+}
+
+.planToggle {
+ flex-shrink: 0;
+}
+
+.planToggleSelected.planToggleSelected {
+ background-color: var(--primary-text-color);
+}
+
+.submitButton {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 32px;
+ min-width: 32px;
+ height: 32px;
+ padding: 0;
+ border-radius: 6px;
+
+ svg {
+ flex-shrink: 0;
+ }
+}
+
+/* ---- Prompt chips row ---- */
+
+.promptChipsRow {
+ display: flex;
+ align-items: center;
+ width: 100%;
+ max-width: 620px;
+}
+
+.promptChip {
+ box-sizing: border-box;
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ flex-shrink: 0;
+ height: 32px;
+ padding: 0 11px 0 var(--space-8);
+ background: var(--primary-background-color);
+ border: 1px var(--border-style, solid) var(--ui-background-color);
+ border-radius: 10px;
+ backdrop-filter: blur(3.5px);
+ cursor: pointer;
+ font-family: var(--vibe-mini-home-font-family);
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 1;
+ color: var(--primary-text-color);
+ white-space: nowrap;
+ transition:
+ background-color var(--motion-productive-medium, 0.1s) ease,
+ border-color var(--motion-productive-medium, 0.1s) ease;
+
+ &:hover:not(:disabled) {
+ background-color: var(--primary-background-hover-color);
+ border-color: var(--ui-background-color);
+ }
+}
+
+.promptChipIcon {
+ width: 16px;
+ height: 16px;
+ flex-shrink: 0;
+ color: var(--primary-text-color);
+}
+
+/* ---- Shared section header ---- */
+
+.sectionHeader {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ width: 100%;
+ padding: 0 var(--space-4);
+}
+
+.sectionHeaderText {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 5px;
+ min-width: 0;
+ max-width: 100%;
+}
+
+.liveTitle {
+ font-family: var(--vibe-mini-home-font-family);
+ display: inline-block;
+ font-size: 18px;
+ font-weight: 400;
+ line-height: 1.3;
+ color: var(--primary-text-color);
+ max-width: 100%;
+}
+
+.liveSubtitle {
+ font-size: 16px;
+ font-weight: 300;
+ line-height: 1.1;
+ color: var(--secondary-text-color);
+ max-width: 100%;
+}
+
+.sectionSubtitle {
+ font-weight: 400;
+}
+
+/* ---- Live suggestions ---- */
+
+.liveSection {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-20);
+ width: 100%;
+ max-width: min(1040px, 100%);
+}
+
+.liveCards {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
+ align-items: flex-start;
+ gap: var(--space-16);
+ width: 100%;
+}
+
+.liveCard {
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: var(--space-12);
+ padding: var(--space-16);
+ width: 100%;
+ min-width: 0;
+ min-height: 110px;
+ background: var(--primary-background-color);
+ border: 1px solid var(--ui-background-color);
+ border-radius: var(--border-radius-big);
+ cursor: pointer;
+ text-align: left;
+ font-family: inherit;
+ transition:
+ border-color 0.1s ease,
+ background-color 0.15s ease;
+
+ &:hover {
+ background-color: var(--allgrey-background-color);
+ }
+}
+
+.liveCardTop {
+ display: flex;
+ align-items: center;
+ gap: var(--space-12);
+ align-self: stretch;
+ width: 100%;
+ min-width: 0;
+}
+
+.liveGlyph {
+ width: 40px;
+ height: 40px;
+ border-radius: 10px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+}
+
+.liveGlyphIcon {
+ width: 24px;
+ height: 24px;
+ color: #ffffff;
+}
+
+.liveInfo {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: center;
+ gap: 4px;
+ flex: 1 1 0;
+ min-width: 0;
+ width: 100%;
+ max-width: 100%;
+}
+
+.liveCardTitle {
+ font-size: 16px;
+ font-weight: 400;
+ line-height: 1.25;
+ color: var(--primary-text-color);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ width: 100%;
+}
+
+.liveCardDescription {
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 1.35;
+ letter-spacing: 0.03px;
+ color: var(--secondary-text-color);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ width: 100%;
+}
+
+.liveCardBottom {
+ display: flex;
+ align-items: center;
+ justify-content: flex-start;
+ width: 100%;
+ min-width: 0;
+ gap: var(--space-8);
+}
+
+.basedOnConnector {
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 1.35;
+ letter-spacing: 0.03px;
+ color: var(--secondary-text-color);
+ white-space: nowrap;
+ flex-shrink: 0;
+}
+
+.chipsRow {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ flex: 1 1 auto;
+ min-width: 0;
+ overflow: hidden;
+}
+
+.chip {
+ display: inline-flex;
+ flex-direction: row;
+ align-items: center;
+ gap: 3.33px;
+ height: 24px;
+ padding: 0.83px var(--space-4);
+ border: 1px solid var(--layout-border-color);
+ border-radius: 3.33px;
+ background: transparent;
+ min-width: 32px;
+ max-width: 100px;
+ flex: 0 1 auto;
+}
+
+.chipIcon {
+ width: 15px;
+ height: 15px;
+ color: var(--secondary-text-color);
+ flex: none;
+}
+
+.chipLabel {
+ font-size: 11.67px;
+ font-weight: 400;
+ line-height: 17px;
+ color: var(--secondary-text-color);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ min-width: 0;
+}
+
+.overflowChip {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ height: 24px;
+ padding: 0.83px var(--space-6);
+ border: 1px solid var(--layout-border-color);
+ border-radius: 3.33px;
+ background: transparent;
+ font-size: 11.67px;
+ font-weight: 400;
+ line-height: 17px;
+ color: var(--secondary-text-color);
+ white-space: nowrap;
+ flex: 0 0 auto;
+ min-width: 28px;
+}
+
+/* ---- App templates ---- */
+
+.templateSection {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-16);
+ width: 100%;
+ max-width: min(1040px, 100%);
+}
+
+.templateCards {
+ display: flex;
+ align-items: flex-start;
+ gap: var(--space-16);
+ width: 100%;
+}
+
+.templateCard {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-16);
+ flex: 1 1 0;
+ min-width: 0;
+ padding: 0;
+ border: none;
+ background: transparent;
+ color: inherit;
+ font-family: inherit;
+ text-align: left;
+ cursor: pointer;
+}
+
+.templateThumbnail {
+ position: relative;
+ width: 100%;
+ aspect-ratio: 341.33 / 191.99;
+ flex-shrink: 0;
+ overflow: hidden;
+ border-radius: var(--space-12);
+ background: var(--allgrey-background-color);
+}
+
+.templateThumbnailFrame {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 76.17%;
+ aspect-ratio: 260 / 143.14;
+ overflow: hidden;
+ border: 1px solid var(--ui-background-color);
+ border-radius: var(--space-12);
+ background: var(--primary-background-color);
+ transform: translate(-50%, -50%);
+ transition: transform 0.2s ease-out;
+}
+
+.templateThumbnailImage {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ aspect-ratio: 259.7 / 161.44;
+ object-fit: cover;
+ object-position: top center;
+ pointer-events: none;
+ user-select: none;
+}
+
+.templateBadge {
+ position: absolute;
+ right: 11px;
+ bottom: 9.66px;
+ z-index: 2;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 32px;
+ height: 32px;
+ border: 0.8px solid var(--ui-border-color);
+ border-radius: 24px;
+ background: var(--primary-background-color);
+}
+
+.templateBadgeLogo {
+ width: 20px;
+ height: 20px;
+ pointer-events: none;
+}
+
+.viewTemplateButton {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ z-index: 3;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ height: 32px;
+ padding: 0 var(--space-12);
+ border-radius: var(--border-radius-small);
+ background: var(--primary-background-color);
+ color: var(--primary-text-color);
+ font-size: 14px;
+ font-weight: 500;
+ line-height: 1;
+ opacity: 0;
+ transform: translate(-50%, -50%) scale(0.96);
+ transition:
+ opacity 0.15s ease-out,
+ transform 0.2s ease-out;
+}
+
+.templateThumbnail::after {
+ content: "";
+ position: absolute;
+ inset: 0;
+ z-index: 1;
+ background: rgba(0, 0, 0, 0.28);
+ opacity: 0;
+ pointer-events: none;
+ transition: opacity 0.15s ease-out;
+}
+
+.templateCard:hover .templateThumbnail::after,
+.templateCard:focus-visible .templateThumbnail::after,
+.templateCard:hover .viewTemplateButton,
+.templateCard:focus-visible .viewTemplateButton {
+ opacity: 1;
+}
+
+.templateCard:hover .templateThumbnailFrame,
+.templateCard:focus-visible .templateThumbnailFrame {
+ transform: translate(-50%, calc(-50% - 4px)) scale(1.04);
+}
+
+.templateCard:hover .viewTemplateButton,
+.templateCard:focus-visible .viewTemplateButton {
+ transform: translate(-50%, -50%) scale(1);
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .templateThumbnailFrame,
+ .viewTemplateButton {
+ transition: none;
+ }
+
+ .templateCard:hover .templateThumbnailFrame,
+ .templateCard:focus-visible .templateThumbnailFrame {
+ transform: translate(-50%, -50%);
+ }
+
+ .templateCard:hover .viewTemplateButton,
+ .templateCard:focus-visible .viewTemplateButton {
+ transform: translate(-50%, -50%);
+ }
+}
+
+.templateInfo {
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+ width: 100%;
+ min-width: 0;
+}
+
+.templateTitle {
+ font-size: 16px;
+ font-weight: 400;
+ line-height: 22px;
+ color: var(--primary-text-color);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.templateDescription {
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 20px;
+ letter-spacing: 0.03px;
+ color: var(--secondary-text-color);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+/* ---- Get inspired ---- */
+
+.inspiredSection {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-20);
+ width: 100%;
+ max-width: min(1040px, 100%);
+}
+
+.inspiredGrid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(175px, 1fr));
+ align-items: flex-start;
+ gap: 25px var(--space-16);
+ width: 100%;
+}
+
+.inspiredCard {
+ display: flex;
+ flex-direction: column;
+ align-items: stretch;
+ gap: var(--space-16);
+ min-width: 0;
+ cursor: pointer;
+ background: transparent;
+ border: none;
+ padding: 0;
+ text-align: inherit;
+ font-family: inherit;
+ color: inherit;
+}
+
+.inspiredImage {
+ position: relative;
+ width: 100%;
+ aspect-ratio: 217 / 303;
+ border-radius: var(--space-16);
+ border: 1px solid var(--ui-background-color);
+ overflow: hidden;
+ background: #ebebeb;
+ transition: border-color 0.15s ease;
+
+ &::after {
+ content: "";
+ position: absolute;
+ inset: 0;
+ background: rgba(0, 0, 0, 0.28);
+ opacity: 0;
+ pointer-events: none;
+ z-index: 1;
+ transition: opacity 0.15s ease-out;
+ }
+}
+
+.inspiredThumbnail {
+ position: absolute;
+ inset: 0;
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ pointer-events: none;
+}
+
+.styleBadge {
+ position: absolute;
+ right: 11px;
+ bottom: 9.66px;
+ width: 32px;
+ height: 32px;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ background: var(--primary-background-color);
+ border: 0.8px solid var(--ui-border-color);
+ border-radius: 24px;
+ color: var(--primary-text-color);
+ opacity: 0;
+ transition: opacity 0.15s ease-out;
+ z-index: 2;
+}
+
+.useInspirationButton {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ height: 32px;
+ padding: 0 var(--space-12);
+ background: var(--primary-background-color);
+ color: var(--primary-text-color);
+ font-size: 14px;
+ font-weight: 500;
+ line-height: 1;
+ white-space: nowrap;
+ border-radius: var(--border-radius-small);
+ pointer-events: none;
+ opacity: 0;
+ transform: translate(-50%, -50%) scale(0.96);
+ transition:
+ opacity 0.15s ease-out,
+ transform 0.2s ease-out;
+ z-index: 3;
+}
+
+.inspiredCard:hover .inspiredImage,
+.inspiredCard:focus-visible .inspiredImage {
+ border-color: var(--ui-border-color);
+}
+
+.inspiredCard:hover .inspiredImage::after,
+.inspiredCard:focus-visible .inspiredImage::after {
+ opacity: 1;
+}
+
+.inspiredCard:hover .styleBadge,
+.inspiredCard:focus-visible .styleBadge {
+ opacity: 1;
+}
+
+.inspiredCard:hover .useInspirationButton,
+.inspiredCard:focus-visible .useInspirationButton {
+ opacity: 1;
+ transform: translate(-50%, -50%) scale(1);
+}
+
+.inspiredLabelStack {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 2px;
+ width: 100%;
+ min-width: 0;
+}
+
+.inspiredLabel {
+ font-size: 16px;
+ font-weight: 400;
+ line-height: 22px;
+ color: var(--primary-text-color);
+ width: 100%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.inspiredDescription {
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 20px;
+ color: var(--secondary-text-color);
+ width: 100%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
diff --git a/apps/kitchen-sink/src/screens/components/VibePage.tsx b/apps/kitchen-sink/src/screens/components/VibePage.tsx
new file mode 100644
index 0000000000..b1e2929f5c
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/VibePage.tsx
@@ -0,0 +1,399 @@
+import React from "react";
+import {
+ Box,
+ Button,
+ Flex,
+ Heading,
+ IconButton,
+ Toggle,
+ Tooltip,
+} from "@vibe/core";
+import {
+ Add,
+ DropdownChevronDown,
+ DropdownChevronRight,
+ MoveArrowUp,
+ RegenerateAI,
+} from "@mondaydotcomorg/icons";
+import { ChipsNav } from "./ChipsNav";
+import {
+ APP_TEMPLATES,
+ INSPIRATIONS,
+ LIVE_SUGGESTIONS,
+ buildPaletteBackground,
+} from "../data/vibeHome";
+import { PROMPT_CHIPS } from "../data/promptChips";
+import mondayVibeLogo from "../assets/vibe-logo-colored.png";
+import { StrokeSpotlight } from "@vibe/core";
+import { STROKE_NO_PULSE_ATTR } from "@vibe/core";
+import styles from "./VibePage.module.scss";
+
+const MAX_NAMED_CHIPS = 2;
+
+function PaletteIcon() {
+ return (
+
+
+
+
+
+
+
+ );
+}
+
+export function VibePage() {
+ const [isPlanMode, setIsPlanMode] = React.useState(false);
+
+ return (
+
+
+
+
+ Hey Naama
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Model
+
+
+
+
+ setIsPlanMode(value)}
+ size="small"
+ offOverrideText="Plan"
+ onOverrideText=""
+ className={styles.planToggle}
+ toggleSelectedClassName={styles.planToggleSelected}
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+ {PROMPT_CHIPS.map((chip) => {
+ const ChipIcon = chip.icon;
+ return (
+
+
+ {chip.label}
+
+ );
+ })}
+
+
+
+
+
+
+
+
+ Live suggestions, made for you
+
+
+ Prompts tailored to your team, boards, and current projects.
+
+
+
+
+
+ Regenerate
+
+
+
+
+
+
+ {LIVE_SUGGESTIONS.map((suggestion) => {
+ const Glyph = suggestion.glyph;
+ const namedChips = suggestion.basedOn.slice(0, MAX_NAMED_CHIPS);
+ return (
+
+
+
+
+
+
+
+ {suggestion.name}
+
+
+ {suggestion.description}
+
+
+
+
+
Based on
+
+ {namedChips.map((board) => {
+ const ChipIcon = board.icon;
+ return (
+
+
+
+ {board.label}
+
+
+ );
+ })}
+ {suggestion.overflowCount ? (
+
+ +{suggestion.overflowCount}
+
+ ) : null}
+
+
+
+ );
+ })}
+
+
+
+
+
+
+ App templates
+
+ Quick start with a pre-built app template
+
+
+
+ All templates
+
+
+
+
+ {APP_TEMPLATES.map((template) => (
+
+
+
+
+
+
+
+
+
Use template
+
+
+ {template.title}
+
+ {template.description}
+
+
+
+ ))}
+
+
+
+
+
+
+ Get inspired
+
+ Find a theme you love, then make it yours.
+
+
+
+
+
+ All inspirations
+
+
+
+
+
+
+ {INSPIRATIONS.map((inspiration) => (
+
+
+
+
+
+
+
+ Use inspiration
+
+
+
+
+ {inspiration.label}
+
+
+ {inspiration.theme}
+
+
+
+ ))}
+
+
+
+ );
+}
diff --git a/apps/kitchen-sink/src/screens/components/agentBuilderData.tsx b/apps/kitchen-sink/src/screens/components/agentBuilderData.tsx
new file mode 100644
index 0000000000..f30c069481
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/agentBuilderData.tsx
@@ -0,0 +1,1407 @@
+
+// Thumbnail / center avatar images (config screen)
+import imgNbEnhancedImage from "../assets/agent-builder/87d8479472e80436ded8aa7fd1ef991ffa65b1b7.png";
+import imgImage685 from "../assets/agent-builder/30c2ff5ee32d2a6508ca1717ab594ae7de682df5.png";
+import imgImage686 from "../assets/agent-builder/16500cfa3be970c70a57416816f4afe3cd395907.png";
+import imgImage687 from "../assets/agent-builder/df4335b1846999a54485645e75e64c077e8beaf7.png";
+import imgImage688 from "../assets/agent-builder/bd1f9cc399276362a6e658b93b78156c4188adc9.png";
+import imgImage689 from "../assets/agent-builder/d0878858f93607fd4081f8b338d56089f366c907.png";
+import imgImage690 from "../assets/agent-builder/d6a6c4c92231bbbefbe3022840cc78010d11bb75.png";
+import imgImage695 from "../assets/agent-builder/4b7c996683a3668ff14509660103f878b24f71d2.png";
+import imgNbEnhancedImage1 from "../assets/agent-builder/c4397e9c0efee34cc7a3796dcadedc1e0deca954.png";
+import imgAvatar10 from "../assets/agent-builder/ca36a1fdf071ada42093d90c3d1b03550ee7245c.png";
+import imgAvatar11 from "../assets/agent-builder/40475c43e8b977eef304c3d1ff922b7111d1b401.png";
+import imgAvatar12 from "../assets/agent-builder/1f8ad43927aa82f5179150ee505c6d1e74950330.png";
+
+// Center (large) avatar images — transparent background versions
+import imgCenter0 from "../assets/agent-builder/145f62e704627cfd6303bb369765d12daf7a685e.png";
+import imgCenter1 from "../assets/agent-builder/580fe30d6db6e6259d52c2ef6fc6323f1a0e7331.png";
+import imgCenter2 from "../assets/agent-builder/5e0b1ff59bd5215cae7bd0550d7b41110fdf530f.png";
+import imgCenter3 from "../assets/agent-builder/7404cf854f9f30afc0d6ed853b2758dc4daa9e49.png";
+import imgCenter4 from "../assets/agent-builder/6bf149e9cfdbffe8e7c43b5a339134d352646bcb.png";
+import imgCenter5 from "../assets/agent-builder/b694564cbdd1bd11b64c7f582d11ea448f6da4f0.png";
+import imgCenter6 from "../assets/agent-builder/916c29029ed9672c85007dbaa4be4d156cef3f71.png";
+import imgCenter7 from "../assets/agent-builder/a7f4c4c85c6a1ec13ae7b14dd5b0a458c568c2b4.png";
+import imgCenter8 from "../assets/agent-builder/b8ff41ab6f78acea6c0d0eea5d02f91fae6a5263.png";
+import imgCenter9 from "../assets/agent-builder/efaed24f2a2fd5ebabf386ec4007ccc11cc70d18.png";
+import imgCenter10 from "../assets/agent-builder/ff2eed1a20664331b7106cf299fec0aaed3bc647.png";
+import imgCenter11 from "../assets/agent-builder/1faacca1c0059536e0a5356866fd6a1989ee4c86.png";
+
+// Onboarding card crops
+import imgCard8 from "../assets/agent-builder/3c9911b461a90bb6c6a342add673bfe34e65728d.png";
+
+export type AvatarRenderType = "nested" | "cover" | "flipped";
+
+export interface AvatarVisual {
+ position: React.CSSProperties;
+ renderType: AvatarRenderType;
+ img: string;
+ imgStyle?: React.CSSProperties;
+ flipSize?: { h: number; w: number };
+}
+
+export interface AvatarItem extends AvatarVisual {
+ id: number;
+ centerImg: string;
+ name: string;
+}
+
+const tX = "translateX(-50%)";
+const tXY = "translate(-50%, -50%)";
+
+export const avatars: AvatarItem[] = [
+ {
+ id: 0,
+ img: imgNbEnhancedImage,
+ centerImg: imgCenter1,
+ name: "Avatar 1",
+ renderType: "nested",
+ position: {
+ position: "absolute",
+ height: "175px",
+ width: "115px",
+ left: "calc(50% - 0.5px)",
+ top: "7px",
+ transform: tX,
+ },
+ imgStyle: {
+ height: "120.34%",
+ left: "1.36%",
+ top: "-11.19%",
+ width: "100.45%",
+ },
+ },
+ {
+ id: 1,
+ img: imgImage685,
+ centerImg: imgCenter2,
+ name: "Avatar 2",
+ renderType: "nested",
+ position: {
+ position: "absolute",
+ height: "123px",
+ width: "92px",
+ left: "calc(50% - 0.5px)",
+ top: "10px",
+ transform: tX,
+ },
+ imgStyle: { height: "131.48%", left: "5.19%", top: "0", width: "87.78%" },
+ },
+ {
+ id: 2,
+ img: imgImage686,
+ centerImg: imgCenter8,
+ name: "Avatar 3",
+ renderType: "nested",
+ position: {
+ position: "absolute",
+ height: "115px",
+ width: "87px",
+ left: "calc(50% - 5.25px)",
+ top: "8px",
+ transform: tX,
+ },
+ imgStyle: {
+ height: "137.18%",
+ left: "-14.28%",
+ top: "-16.25%",
+ width: "137.56%",
+ },
+ },
+ {
+ id: 3,
+ img: imgImage687,
+ centerImg: imgCenter6,
+ name: "Avatar 4",
+ renderType: "nested",
+ position: {
+ position: "absolute",
+ height: "150px",
+ width: "98px",
+ left: "calc(50% - 0.5px)",
+ top: "5px",
+ transform: tX,
+ },
+ imgStyle: { height: "116%", left: "0", top: "-1.62%", width: "100%" },
+ },
+ {
+ id: 4,
+ img: imgImage688,
+ centerImg: imgCenter5,
+ name: "Avatar 5",
+ renderType: "cover",
+ position: {
+ position: "absolute",
+ height: "169px",
+ width: "127px",
+ left: "calc(50% - 0.5px)",
+ top: "19px",
+ transform: tX,
+ },
+ },
+ {
+ id: 5,
+ img: imgImage689,
+ centerImg: imgCenter0,
+ name: "Avatar 6",
+ renderType: "cover",
+ position: {
+ position: "absolute",
+ height: "148px",
+ width: "102px",
+ left: "50%",
+ top: "6px",
+ transform: tX,
+ },
+ },
+ {
+ id: 6,
+ img: imgImage690,
+ centerImg: imgCenter4,
+ name: "Avatar 7",
+ renderType: "nested",
+ position: {
+ position: "absolute",
+ height: "130px",
+ width: "92px",
+ left: "calc(50% - 0.75px)",
+ top: "6px",
+ transform: tX,
+ },
+ imgStyle: { height: "125.81%", left: "0", top: "-10.21%", width: "100%" },
+ },
+ {
+ id: 7,
+ img: imgImage695,
+ centerImg: imgCenter7,
+ name: "Avatar 8",
+ renderType: "nested",
+ position: {
+ position: "absolute",
+ height: "164px",
+ width: "145px",
+ left: "calc(50% + 0.5px)",
+ bottom: "-72px",
+ transform: tX,
+ },
+ imgStyle: { height: "100%", left: "0.08%", top: "0", width: "99.9%" },
+ },
+ {
+ id: 8,
+ img: imgNbEnhancedImage1,
+ centerImg: imgCenter3,
+ name: "Avatar 9",
+ renderType: "cover",
+ position: {
+ position: "absolute",
+ height: "175px",
+ width: "96px",
+ left: "calc(50% - 5.25px)",
+ top: "calc(50% + 28.5px)",
+ transform: tXY,
+ },
+ },
+ {
+ id: 9,
+ img: imgAvatar10,
+ centerImg: imgCenter9,
+ name: "Avatar 10",
+ renderType: "flipped",
+ position: {
+ position: "absolute",
+ height: "176px",
+ width: "99px",
+ left: "50%",
+ top: "calc(50% + 28px)",
+ transform: tXY,
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "center",
+ },
+ flipSize: { h: 176, w: 99 },
+ },
+ {
+ id: 10,
+ img: imgAvatar11,
+ centerImg: imgCenter10,
+ name: "Avatar 11",
+ renderType: "flipped",
+ position: {
+ position: "absolute",
+ height: "175px",
+ width: "98px",
+ left: "calc(50% + 0.25px)",
+ top: "calc(50% + 27.5px)",
+ transform: tXY,
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "center",
+ },
+ flipSize: { h: 175, w: 98 },
+ },
+ {
+ id: 11,
+ img: imgAvatar12,
+ centerImg: imgCenter11,
+ name: "Avatar 12",
+ renderType: "cover",
+ position: {
+ position: "absolute",
+ height: "199px",
+ width: "112px",
+ left: "calc(50% - 2px)",
+ top: "-15px",
+ transform: tX,
+ },
+ },
+];
+
+export const colorSchemes: { id: number; color: string; border?: boolean }[] = [
+ { id: 0, color: "#ffffff", border: true },
+ { id: 1, color: "#f1c238" },
+ { id: 2, color: "#03e8f9" },
+ { id: 3, color: "#f960c6" },
+ { id: 4, color: "#0291fb" },
+ { id: 5, color: "#313131" },
+ { id: 6, color: "#00ba5f" },
+ { id: 7, color: "#9450fd" },
+];
+
+// Onboarding agent-card avatar crops (fitted portrait layout)
+export const CARD_AVATAR_DATA: AvatarVisual[] = [
+ {
+ img: imgNbEnhancedImage,
+ renderType: "nested",
+ position: {
+ position: "absolute",
+ height: "169.116px",
+ width: "129px",
+ left: "50%",
+ top: "5.51px",
+ transform: tX,
+ },
+ imgStyle: {
+ height: "345.91%",
+ left: "-72.86%",
+ top: "-31.71%",
+ width: "248.68%",
+ },
+ },
+ {
+ img: imgImage685,
+ renderType: "nested",
+ position: {
+ position: "absolute",
+ height: "298px",
+ width: "225px",
+ left: "50%",
+ top: "19px",
+ transform: tX,
+ },
+ imgStyle: { height: "131.48%", left: "5.19%", top: "0", width: "87.78%" },
+ },
+ {
+ img: imgImage686,
+ renderType: "nested",
+ position: {
+ position: "absolute",
+ height: "277px",
+ width: "209px",
+ left: "calc(50% - 13px)",
+ top: "11px",
+ transform: tX,
+ },
+ imgStyle: {
+ height: "137.18%",
+ left: "-14.28%",
+ top: "-16.25%",
+ width: "137.56%",
+ },
+ },
+ {
+ img: imgImage687,
+ renderType: "nested",
+ position: {
+ position: "absolute",
+ height: "398px",
+ width: "260px",
+ left: "calc(50% + 0.5px)",
+ top: "0",
+ transform: tX,
+ },
+ imgStyle: { height: "116%", left: "0", top: "-1.62%", width: "100%" },
+ },
+ {
+ img: imgImage688,
+ renderType: "cover",
+ position: {
+ position: "absolute",
+ height: "375px",
+ width: "283px",
+ left: "calc(50% - 6px)",
+ top: "19px",
+ transform: tX,
+ },
+ },
+ {
+ img: imgImage689,
+ renderType: "cover",
+ position: {
+ position: "absolute",
+ height: "325px",
+ width: "225px",
+ left: "calc(50% - 2px)",
+ top: "8px",
+ transform: tX,
+ },
+ },
+ {
+ img: imgImage690,
+ renderType: "nested",
+ position: {
+ position: "absolute",
+ height: "279px",
+ width: "197px",
+ left: "50%",
+ top: "12px",
+ transform: tX,
+ },
+ imgStyle: { height: "125.81%", left: "0", top: "-10.21%", width: "100%" },
+ },
+ {
+ img: imgImage695,
+ renderType: "nested",
+ position: {
+ position: "absolute",
+ height: "342px",
+ width: "301px",
+ left: "calc(50% + 10px)",
+ top: "13px",
+ transform: tX,
+ },
+ imgStyle: { height: "100%", left: "0.08%", top: "0", width: "99.9%" },
+ },
+ {
+ img: imgCard8,
+ renderType: "cover",
+ position: {
+ position: "absolute",
+ height: "347px",
+ width: "190px",
+ left: "calc(50% - 6.5px)",
+ top: "-3px",
+ transform: tX,
+ },
+ },
+ {
+ img: imgAvatar10,
+ renderType: "flipped",
+ position: {
+ position: "absolute",
+ height: "387px",
+ width: "218px",
+ left: "calc(50% + 5.5px)",
+ top: "calc(50% + 79.32px)",
+ transform: tXY,
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "center",
+ },
+ flipSize: { h: 387, w: 218 },
+ },
+ {
+ img: imgAvatar11,
+ renderType: "flipped",
+ position: {
+ position: "absolute",
+ height: "430px",
+ width: "241px",
+ left: "calc(50% + 4px)",
+ top: "calc(50% + 99.82px)",
+ transform: tXY,
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "center",
+ },
+ flipSize: { h: 430, w: 241 },
+ },
+ {
+ img: imgAvatar12,
+ renderType: "cover",
+ position: {
+ position: "absolute",
+ height: "432.476px",
+ width: "243.268px",
+ left: "calc(50% - 0.13px)",
+ top: "-30.09px",
+ transform: tX,
+ },
+ },
+];
+
+export function renderAvatarVisual(v: AvatarVisual, alt = "") {
+ if (v.renderType === "flipped" && v.flipSize) {
+ return (
+
+
+
+
+
+
+
+ );
+ }
+
+ if (v.renderType === "cover") {
+ return (
+
+
+
+ );
+ }
+
+ // nested
+ return (
+
+
+
+
+
+ );
+}
+
+// ─── Contextual Name / Expertise Summarizer ──────────────────────────────────
+
+const STOP_WORDS = new Set([
+ "i",
+ "me",
+ "my",
+ "we",
+ "our",
+ "you",
+ "your",
+ "the",
+ "a",
+ "an",
+ "and",
+ "or",
+ "but",
+ "in",
+ "on",
+ "at",
+ "to",
+ "for",
+ "of",
+ "with",
+ "by",
+ "from",
+ "is",
+ "am",
+ "are",
+ "was",
+ "were",
+ "be",
+ "been",
+ "being",
+ "have",
+ "has",
+ "had",
+ "do",
+ "does",
+ "did",
+ "will",
+ "would",
+ "could",
+ "should",
+ "shall",
+ "may",
+ "might",
+ "can",
+ "that",
+ "this",
+ "these",
+ "those",
+ "it",
+ "its",
+ "not",
+ "no",
+ "so",
+ "if",
+ "then",
+ "than",
+ "what",
+ "which",
+ "who",
+ "whom",
+ "how",
+ "when",
+ "where",
+ "why",
+ "all",
+ "each",
+ "every",
+ "both",
+ "few",
+ "more",
+ "most",
+ "other",
+ "some",
+ "such",
+ "only",
+ "also",
+ "just",
+ "about",
+ "up",
+ "out",
+ "into",
+ "over",
+ "after",
+ "before",
+ "between",
+ "under",
+ "above",
+ "very",
+ "too",
+ "here",
+ "there",
+ "again",
+ "once",
+ "well",
+ "back",
+ "even",
+ "still",
+ "already",
+ "always",
+ "never",
+ "often",
+ "sometimes",
+ "usually",
+ "really",
+ "quite",
+ "much",
+ "many",
+ "any",
+ "own",
+ "same",
+ "able",
+ "specialize",
+ "specializing",
+ "focus",
+ "focusing",
+ "help",
+ "helping",
+ "work",
+ "working",
+ "make",
+ "making",
+ "use",
+ "using",
+ "provide",
+ "providing",
+ "ensure",
+ "ensuring",
+ "like",
+ "need",
+ "want",
+ "get",
+ "got",
+ "go",
+ "going",
+ "take",
+ "taking",
+ "come",
+ "know",
+ "think",
+ "see",
+ "look",
+ "find",
+ "give",
+ "tell",
+ "try",
+ "ask",
+ "seem",
+ "feel",
+ "leave",
+ "call",
+ "keep",
+ "let",
+ "begin",
+ "show",
+ "hear",
+ "play",
+ "run",
+ "move",
+ "live",
+ "believe",
+ "bring",
+ "happen",
+ "set",
+ "put",
+ "pay",
+ "hold",
+ "learn",
+ "change",
+ "lead",
+ "understand",
+ "across",
+ "through",
+ "during",
+ "around",
+ "among",
+ "along",
+ "within",
+ "without",
+ "toward",
+ "upon",
+ "act",
+]);
+
+interface DomainEntry {
+ domain: string;
+ keywords: string[];
+ weight: number;
+}
+
+const DOMAIN_MAP: DomainEntry[] = [
+ {
+ domain: "Feedback",
+ keywords: [
+ "feedback",
+ "reviews",
+ "ratings",
+ "survey",
+ "surveys",
+ "nps",
+ "csat",
+ ],
+ weight: 1,
+ },
+ {
+ domain: "Customer",
+ keywords: [
+ "customer",
+ "customers",
+ "client",
+ "clients",
+ "user",
+ "users",
+ "consumer",
+ ],
+ weight: 1,
+ },
+ {
+ domain: "Sales",
+ keywords: [
+ "sales",
+ "revenue",
+ "pipeline",
+ "deals",
+ "quota",
+ "crm",
+ "leads",
+ "conversion",
+ "upsell",
+ "churn",
+ ],
+ weight: 1,
+ },
+ {
+ domain: "Marketing",
+ keywords: [
+ "marketing",
+ "campaign",
+ "campaigns",
+ "brand",
+ "branding",
+ "seo",
+ "advertising",
+ "ads",
+ "social media",
+ "engagement",
+ ],
+ weight: 1,
+ },
+ {
+ domain: "Product",
+ keywords: [
+ "product",
+ "products",
+ "roadmap",
+ "feature",
+ "features",
+ "backlog",
+ "sprint",
+ "agile",
+ "scrum",
+ "prioritize",
+ "prioritization",
+ ],
+ weight: 1,
+ },
+ {
+ domain: "Engineering",
+ keywords: [
+ "code",
+ "coding",
+ "engineer",
+ "engineering",
+ "developer",
+ "development",
+ "software",
+ "programming",
+ "api",
+ "backend",
+ "frontend",
+ "fullstack",
+ "devops",
+ "cicd",
+ "deploy",
+ "debug",
+ "refactor",
+ ],
+ weight: 1,
+ },
+ {
+ domain: "Design",
+ keywords: [
+ "design",
+ "ux",
+ "ui",
+ "figma",
+ "wireframe",
+ "prototype",
+ "visual",
+ "layout",
+ "typography",
+ "accessibility",
+ ],
+ weight: 1,
+ },
+ {
+ domain: "Data",
+ keywords: [
+ "data",
+ "database",
+ "sql",
+ "analytics",
+ "metrics",
+ "kpi",
+ "dashboard",
+ "visualization",
+ "warehouse",
+ "etl",
+ "pipeline",
+ ],
+ weight: 1,
+ },
+ {
+ domain: "Research",
+ keywords: [
+ "research",
+ "study",
+ "studies",
+ "findings",
+ "hypothesis",
+ "experiment",
+ "experiments",
+ "insights",
+ "discovery",
+ "literature",
+ ],
+ weight: 1,
+ },
+ {
+ domain: "Content",
+ keywords: [
+ "content",
+ "writing",
+ "write",
+ "blog",
+ "article",
+ "articles",
+ "copy",
+ "copywriting",
+ "editorial",
+ "publishing",
+ "documentation",
+ "docs",
+ ],
+ weight: 1,
+ },
+ {
+ domain: "Finance",
+ keywords: [
+ "finance",
+ "financial",
+ "budget",
+ "budgeting",
+ "accounting",
+ "revenue",
+ "cost",
+ "costs",
+ "expense",
+ "forecast",
+ "forecasting",
+ "profit",
+ "invoice",
+ ],
+ weight: 1,
+ },
+ {
+ domain: "HR",
+ keywords: [
+ "hr",
+ "hiring",
+ "recruit",
+ "recruiting",
+ "recruitment",
+ "onboarding",
+ "talent",
+ "employee",
+ "employees",
+ "workforce",
+ "culture",
+ "retention",
+ "benefits",
+ "payroll",
+ ],
+ weight: 1,
+ },
+ {
+ domain: "Security",
+ keywords: [
+ "security",
+ "cybersecurity",
+ "vulnerability",
+ "threat",
+ "threats",
+ "compliance",
+ "audit",
+ "encryption",
+ "authentication",
+ "authorization",
+ "firewall",
+ ],
+ weight: 1,
+ },
+ {
+ domain: "Support",
+ keywords: [
+ "support",
+ "helpdesk",
+ "ticket",
+ "tickets",
+ "issue",
+ "issues",
+ "troubleshoot",
+ "troubleshooting",
+ "resolution",
+ "escalation",
+ "sla",
+ ],
+ weight: 1,
+ },
+ {
+ domain: "Operations",
+ keywords: [
+ "operations",
+ "ops",
+ "logistics",
+ "supply",
+ "chain",
+ "inventory",
+ "procurement",
+ "process",
+ "processes",
+ "workflow",
+ "workflows",
+ "automation",
+ "efficiency",
+ ],
+ weight: 1,
+ },
+ {
+ domain: "Legal",
+ keywords: [
+ "legal",
+ "law",
+ "contract",
+ "contracts",
+ "compliance",
+ "regulation",
+ "regulations",
+ "policy",
+ "policies",
+ "intellectual property",
+ "patent",
+ "trademark",
+ ],
+ weight: 1,
+ },
+ {
+ domain: "Communication",
+ keywords: [
+ "communication",
+ "email",
+ "emails",
+ "messaging",
+ "meetings",
+ "presentation",
+ "presentations",
+ "reports",
+ "reporting",
+ "stakeholder",
+ ],
+ weight: 1,
+ },
+ {
+ domain: "AI",
+ keywords: [
+ "ai",
+ "artificial intelligence",
+ "machine learning",
+ "ml",
+ "deep learning",
+ "nlp",
+ "natural language",
+ "model",
+ "models",
+ "neural",
+ "training",
+ "inference",
+ "llm",
+ "gpt",
+ "prompt",
+ ],
+ weight: 1,
+ },
+ {
+ domain: "Sentiment",
+ keywords: [
+ "sentiment",
+ "emotion",
+ "emotions",
+ "tone",
+ "mood",
+ "opinion",
+ "opinions",
+ "perception",
+ "feeling",
+ "feelings",
+ "satisfaction",
+ ],
+ weight: 1,
+ },
+ {
+ domain: "Strategy",
+ keywords: [
+ "strategy",
+ "strategic",
+ "planning",
+ "plan",
+ "vision",
+ "mission",
+ "goals",
+ "objectives",
+ "okr",
+ "initiative",
+ "initiatives",
+ "transformation",
+ ],
+ weight: 1,
+ },
+ {
+ domain: "Quality",
+ keywords: [
+ "quality",
+ "qa",
+ "testing",
+ "test",
+ "tests",
+ "bug",
+ "bugs",
+ "defect",
+ "defects",
+ "regression",
+ "validation",
+ "verification",
+ ],
+ weight: 1,
+ },
+ {
+ domain: "Education",
+ keywords: [
+ "education",
+ "learning",
+ "training",
+ "course",
+ "courses",
+ "curriculum",
+ "teaching",
+ "mentoring",
+ "coaching",
+ "tutorial",
+ "tutorials",
+ "lesson",
+ ],
+ weight: 1,
+ },
+ {
+ domain: "Health",
+ keywords: [
+ "health",
+ "healthcare",
+ "medical",
+ "clinical",
+ "patient",
+ "patients",
+ "wellness",
+ "diagnosis",
+ "treatment",
+ "pharmaceutical",
+ ],
+ weight: 1,
+ },
+ {
+ domain: "Project",
+ keywords: [
+ "project",
+ "projects",
+ "milestone",
+ "milestones",
+ "deliverable",
+ "deliverables",
+ "timeline",
+ "deadline",
+ "deadlines",
+ "gantt",
+ "task",
+ "tasks",
+ ],
+ weight: 1,
+ },
+];
+
+interface ActionEntry {
+ role: string;
+ keywords: string[];
+}
+
+const ACTION_MAP: ActionEntry[] = [
+ {
+ role: "Analysis",
+ keywords: [
+ "analyze",
+ "analyzing",
+ "analysis",
+ "examine",
+ "evaluate",
+ "evaluating",
+ "assess",
+ "assessing",
+ "measure",
+ "measuring",
+ "audit",
+ "inspect",
+ "review",
+ "reviewing",
+ "interpret",
+ ],
+ },
+ {
+ role: "Intelligence",
+ keywords: [
+ "uncover",
+ "discover",
+ "identify",
+ "identifying",
+ "detect",
+ "detecting",
+ "insight",
+ "insights",
+ "intelligence",
+ "monitor",
+ "monitoring",
+ "track",
+ "tracking",
+ "observe",
+ "recognize",
+ ],
+ },
+ {
+ role: "Strategy",
+ keywords: [
+ "strategy",
+ "strategic",
+ "plan",
+ "planning",
+ "advise",
+ "advising",
+ "recommend",
+ "recommending",
+ "optimize",
+ "optimizing",
+ "improve",
+ "improving",
+ "transform",
+ "prioritize",
+ "prioritizing",
+ ],
+ },
+ {
+ role: "Creation",
+ keywords: [
+ "create",
+ "creating",
+ "generate",
+ "generating",
+ "build",
+ "building",
+ "craft",
+ "crafting",
+ "compose",
+ "composing",
+ "produce",
+ "producing",
+ "draft",
+ "drafting",
+ "write",
+ "writing",
+ ],
+ },
+ {
+ role: "Automation",
+ keywords: [
+ "automate",
+ "automating",
+ "automation",
+ "streamline",
+ "streamlining",
+ "accelerate",
+ "simplify",
+ "simplifying",
+ "scale",
+ "scaling",
+ "orchestrate",
+ ],
+ },
+ {
+ role: "Support",
+ keywords: [
+ "support",
+ "supporting",
+ "assist",
+ "assisting",
+ "resolve",
+ "resolving",
+ "troubleshoot",
+ "troubleshooting",
+ "respond",
+ "responding",
+ "guide",
+ "guiding",
+ "answer",
+ "answering",
+ ],
+ },
+ {
+ role: "Synthesis",
+ keywords: [
+ "synthesize",
+ "synthesizing",
+ "summarize",
+ "summarizing",
+ "aggregate",
+ "aggregating",
+ "consolidate",
+ "compile",
+ "compiling",
+ "distill",
+ "combine",
+ "merge",
+ "unify",
+ ],
+ },
+ {
+ role: "Orchestration",
+ keywords: [
+ "coordinate",
+ "coordinating",
+ "manage",
+ "managing",
+ "orchestrate",
+ "orchestrating",
+ "organize",
+ "organizing",
+ "facilitate",
+ "facilitating",
+ "delegate",
+ "delegating",
+ ],
+ },
+ {
+ role: "Prediction",
+ keywords: [
+ "predict",
+ "predicting",
+ "forecast",
+ "forecasting",
+ "anticipate",
+ "anticipating",
+ "project",
+ "projecting",
+ "estimate",
+ "estimating",
+ "model",
+ "modeling",
+ "simulate",
+ ],
+ },
+ {
+ role: "Curation",
+ keywords: [
+ "curate",
+ "curating",
+ "select",
+ "selecting",
+ "filter",
+ "filtering",
+ "sort",
+ "sorting",
+ "categorize",
+ "categorizing",
+ "classify",
+ "classifying",
+ "tag",
+ "tagging",
+ "label",
+ ],
+ },
+];
+
+export function summarizeExpertise(text: string): string {
+ if (!text || text.trim().length === 0) return "General Purpose";
+
+ const lower = text.toLowerCase();
+ const words = lower
+ .split(/[^a-z0-9]+/)
+ .filter((w) => w.length > 1 && !STOP_WORDS.has(w));
+
+ const domainScores = DOMAIN_MAP.map((entry) => {
+ let score = 0;
+ for (const kw of entry.keywords) {
+ if (kw.includes(" ")) {
+ if (lower.includes(kw)) score += 2;
+ } else {
+ for (const w of words) {
+ if (w === kw) score += 2;
+ else if (
+ w.startsWith(kw.slice(0, Math.min(kw.length, 4))) &&
+ kw.length > 3
+ )
+ score += 1;
+ else if (
+ kw.startsWith(w.slice(0, Math.min(w.length, 4))) &&
+ w.length > 3
+ )
+ score += 1;
+ }
+ }
+ }
+ return { domain: entry.domain, score };
+ })
+ .filter((d) => d.score > 0)
+ .sort((a, b) => b.score - a.score);
+
+ const actionScores = ACTION_MAP.map((entry) => {
+ let score = 0;
+ for (const kw of entry.keywords) {
+ for (const w of words) {
+ if (w === kw) score += 2;
+ else if (w.startsWith(kw.slice(0, Math.min(kw.length, 5)))) score += 1;
+ }
+ }
+ return { role: entry.role, score };
+ })
+ .filter((a) => a.score > 0)
+ .sort((a, b) => b.score - a.score);
+
+ const topDomain = domainScores[0]?.domain;
+ const secondDomain = domainScores[1]?.domain;
+ const topAction = actionScores[0]?.role;
+
+ if (topDomain && topAction) {
+ if (
+ secondDomain &&
+ domainScores[1].score >= domainScores[0].score * 0.7 &&
+ secondDomain !== topDomain
+ ) {
+ return `${topDomain} & ${secondDomain} ${topAction}`;
+ }
+ return `${topDomain} ${topAction}`;
+ }
+
+ if (topDomain) return `${topDomain} Intelligence`;
+ if (topAction) return `${topAction}`;
+
+ const freq: Record = {};
+ for (const w of words) {
+ freq[w] = (freq[w] || 0) + 1;
+ }
+ const topWord = Object.entries(freq).sort((a, b) => b[1] - a[1])[0];
+ if (topWord) {
+ const capitalized =
+ topWord[0].charAt(0).toUpperCase() + topWord[0].slice(1);
+ return `${capitalized} Specialist`;
+ }
+
+ return "AI Assistant";
+}
diff --git a/apps/kitchen-sink/src/screens/components/ai-icons.tsx b/apps/kitchen-sink/src/screens/components/ai-icons.tsx
new file mode 100644
index 0000000000..885d8d82c6
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/ai-icons.tsx
@@ -0,0 +1,25 @@
+import aiSidekickSvg from "../assets/ai-icons/ai-sidekick.svg";
+import vibeSvg from "../assets/ai-icons/vibe.svg";
+import workflowsSvg from "../assets/ai-icons/workflows.svg";
+import agentsSvg from "../assets/ai-icons/agents.svg";
+import notetakerSvg from "../assets/ai-icons/notetaker.svg";
+
+const AiIcon: React.FC<{ src: string; alt: string; size?: number }> = ({
+ src,
+ alt,
+ size = 16,
+}) => ;
+
+export const AiSidekickIcon: React.FC<{ size?: number }> = ({ size }) => (
+
+);
+export const VibeAppIcon: React.FC = () => ;
+export const AiWorkflowsIcon: React.FC = () => (
+
+);
+export const AiAgentsIcon: React.FC = () => (
+
+);
+export const AiNotetakerIcon: React.FC = () => (
+
+);
diff --git a/apps/kitchen-sink/src/screens/components/figma/ImageWithFallback.module.scss b/apps/kitchen-sink/src/screens/components/figma/ImageWithFallback.module.scss
new file mode 100644
index 0000000000..b4ac370261
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/figma/ImageWithFallback.module.scss
@@ -0,0 +1,11 @@
+.fallback {
+ display: inline-block;
+ background-color: var(--allgrey-background-color);
+ text-align: center;
+ vertical-align: middle;
+}
+
+.fallbackInner {
+ width: 100%;
+ height: 100%;
+}
diff --git a/apps/kitchen-sink/src/screens/components/figma/ImageWithFallback.tsx b/apps/kitchen-sink/src/screens/components/figma/ImageWithFallback.tsx
new file mode 100644
index 0000000000..2c77f0f4ee
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/figma/ImageWithFallback.tsx
@@ -0,0 +1,42 @@
+import { useState } from "react";
+import { Box, Flex } from "@vibe/core";
+import styles from "./ImageWithFallback.module.scss";
+
+const ERROR_IMG_SRC =
+ "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODgiIGhlaWdodD0iODgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBvcGFjaXR5PSIuMyIgZmlsbD0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIzLjciPjxyZWN0IHg9IjE2IiB5PSIxNiIgd2lkdGg9IjU2IiBoZWlnaHQ9IjU2IiByeD0iNiIvPjxwYXRoIGQ9Im0xNiA1OCAxNi0xOCAzMiAzMiIvPjxjaXJjbGUgY3g9IjUzIiBjeT0iMzUiIHI9IjciLz48L3N2Zz4KCg==";
+
+export function ImageWithFallback(
+ props: React.ImgHTMLAttributes,
+) {
+ const [didError, setDidError] = useState(false);
+
+ const handleError = () => {
+ setDidError(true);
+ };
+
+ const { src, alt, style, className, ...rest } = props;
+
+ const merged = [className, styles.fallback].filter(Boolean).join(" ");
+
+ return didError ? (
+
+
+
+
+
+ ) : (
+
+ );
+}
diff --git a/apps/kitchen-sink/src/screens/components/fontsConfig.ts b/apps/kitchen-sink/src/screens/components/fontsConfig.ts
new file mode 100644
index 0000000000..79b1170d57
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/fontsConfig.ts
@@ -0,0 +1,76 @@
+export interface FontDefinition {
+ /** CSS font-family name (also used as the unique identifier). */
+ value: string;
+ /** UI label shown in the picker. */
+ label: string;
+ /** Google Fonts URL family parameter, e.g. "DM+Sans:wght@400;500;600;700". */
+ googleFontParam: string;
+}
+
+/**
+ * Curated list of fonts available in the ThemeSwitcher Font section.
+ * To add a new font, append an entry here.
+ *
+ * Custom fonts not in this list can still be applied via the free-text input
+ * in the ThemeSwitcher — they'll be loaded on demand from Google Fonts.
+ */
+export const CURATED_FONTS: FontDefinition[] = [
+ {
+ value: "Poppins",
+ label: "Poppins",
+ googleFontParam: "Poppins:wght@400;500;600;700",
+ },
+ {
+ value: "Figtree",
+ label: "Figtree",
+ googleFontParam: "Figtree:wght@400;500;600;700",
+ },
+ {
+ value: "DM Sans",
+ label: "DM Sans",
+ googleFontParam: "DM+Sans:wght@400;500;600;700",
+ },
+ {
+ value: "Hanken Grotesk",
+ label: "Hanken Grotesk",
+ googleFontParam: "Hanken+Grotesk:wght@400;500;600;700",
+ },
+ {
+ value: "Geist",
+ label: "Geist",
+ googleFontParam: "Geist:wght@400;500;600;700",
+ },
+];
+
+/** Default for the Heading subsection. */
+export const DEFAULT_HEADING_FONT = "Poppins";
+/** Default for the Text subsection. */
+export const DEFAULT_TEXT_FONT = "Figtree";
+
+/**
+ * Fonts that cannot be removed from the picker via the trash icon.
+ * Defaults + a safety net so the user can always fall back to a known-good choice.
+ */
+export const PROTECTED_FONTS = new Set([
+ "Poppins",
+ "Figtree",
+ "DM Sans",
+]);
+
+/**
+ * Verify a font family exists on Google Fonts by hitting the css2 endpoint.
+ * Returns true if the response is OK (font exists), false otherwise (network
+ * error, 400 unknown family, etc.). Used to validate custom user input before
+ * applying or adding it to the list.
+ */
+export async function verifyGoogleFont(family: string): Promise {
+ const param = `${family.replace(/\s+/g, "+")}:wght@400`;
+ try {
+ const res = await fetch(
+ `https://fonts.googleapis.com/css2?family=${param}`,
+ );
+ return res.ok;
+ } catch {
+ return false;
+ }
+}
diff --git a/apps/kitchen-sink/src/screens/components/types.ts b/apps/kitchen-sink/src/screens/components/types.ts
new file mode 100644
index 0000000000..1e6861c8ac
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/components/types.ts
@@ -0,0 +1,37 @@
+export type StatusType =
+ | "Done"
+ | "Working on it"
+ | "Stuck"
+ | "Waiting"
+ | "Sync with other team"
+ | "";
+export type PriorityType = "High" | "Medium" | "Low" | "Critical" | "";
+
+export interface Item {
+ id: string;
+ name: string;
+ person?: string; // image URL
+ personName?: string; // owner label (avatar tooltip / aria-label)
+ /** Agent glass tile variants stacked before the user avatar in the Owner column. */
+ agents?: (1 | 2 | 3 | 4)[];
+ status: StatusType;
+ date: string;
+ priority: PriorityType;
+}
+
+export interface Group {
+ id: string;
+ title: string;
+ color: string; // Hex color for the group side stripe
+ items: Item[];
+}
+
+export type ColumnId = "task" | "owner" | "status" | "priority" | "eta";
+
+export interface ColumnWidths {
+ task: number;
+ owner: number;
+ status: number;
+ priority: number;
+ eta: number;
+}
diff --git a/apps/kitchen-sink/src/screens/context/AgentBuilderContext.tsx b/apps/kitchen-sink/src/screens/context/AgentBuilderContext.tsx
new file mode 100644
index 0000000000..b5f186310e
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/context/AgentBuilderContext.tsx
@@ -0,0 +1,97 @@
+import {
+ createContext,
+ useCallback,
+ useContext,
+ useMemo,
+ useState,
+ type ReactNode,
+} from "react";
+
+export type AgentBuilderView = "closed" | "config" | "onboarding";
+
+export interface AgentConfigData {
+ name: string;
+ expertise: string;
+ avatarBg: string;
+ avatarImg: string;
+ avatarIndex?: number;
+}
+
+export interface AgentConfigInitial {
+ avatarIndex?: number;
+ name?: string;
+ expertise?: string;
+ avatarBg?: string;
+}
+
+interface AgentBuilderContextValue {
+ view: AgentBuilderView;
+ configInitial: AgentConfigInitial | null;
+ pendingAgent: AgentConfigData | null;
+ /** Open the builder at the config step (optionally seeded with values). */
+ openConfig: (initial?: AgentConfigInitial) => void;
+ /** Advance from config to the onboarding step with the built agent. */
+ openOnboarding: (data: AgentConfigData) => void;
+ /** Close the whole builder modal. */
+ close: () => void;
+}
+
+const AgentBuilderContext = createContext(
+ null,
+);
+
+export function AgentBuilderProvider({ children }: { children: ReactNode }) {
+ const [view, setView] = useState("closed");
+ const [configInitial, setConfigInitial] = useState(
+ null,
+ );
+ const [pendingAgent, setPendingAgent] = useState(
+ null,
+ );
+
+ const openConfig = useCallback((initial?: AgentConfigInitial) => {
+ setConfigInitial(initial ?? null);
+ setView("config");
+ }, []);
+
+ const openOnboarding = useCallback((data: AgentConfigData) => {
+ setPendingAgent(data);
+ setConfigInitial({
+ avatarIndex: data.avatarIndex,
+ name: data.name,
+ expertise: data.expertise,
+ avatarBg: data.avatarBg,
+ });
+ setView("onboarding");
+ }, []);
+
+ const close = useCallback(() => {
+ setView("closed");
+ }, []);
+
+ const value = useMemo(
+ () => ({
+ view,
+ configInitial,
+ pendingAgent,
+ openConfig,
+ openOnboarding,
+ close,
+ }),
+ [view, configInitial, pendingAgent, openConfig, openOnboarding, close],
+ );
+
+ return (
+
+ {children}
+
+ );
+}
+
+export function useAgentBuilder(): AgentBuilderContextValue {
+ const ctx = useContext(AgentBuilderContext);
+ if (!ctx) {
+ throw new Error("useAgentBuilder must be used within AgentBuilderProvider");
+ }
+ return ctx;
+}
diff --git a/apps/kitchen-sink/src/screens/context/AgentsViewContext.tsx b/apps/kitchen-sink/src/screens/context/AgentsViewContext.tsx
new file mode 100644
index 0000000000..e43de7de9f
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/context/AgentsViewContext.tsx
@@ -0,0 +1,53 @@
+import {
+ createContext,
+ useCallback,
+ useContext,
+ useMemo,
+ useState,
+ type ReactNode,
+} from "react";
+
+export type AgentsView = "home" | "manage" | "feed";
+
+interface AgentsViewContextValue {
+ view: AgentsView;
+ setView: (view: AgentsView) => void;
+}
+
+const AgentsViewContext = createContext(null);
+
+export function AgentsViewProvider({
+ children,
+ initialView = "home",
+ onViewChange,
+}: {
+ children: ReactNode;
+ initialView?: AgentsView;
+ onViewChange?: (view: AgentsView) => void;
+}) {
+ const [view, setViewState] = useState(initialView);
+
+ const setView = useCallback(
+ (next: AgentsView) => {
+ setViewState(next);
+ onViewChange?.(next);
+ },
+ [onViewChange],
+ );
+
+ const value = useMemo(() => ({ view, setView }), [view, setView]);
+
+ return (
+
+ {children}
+
+ );
+}
+
+export function useAgentsView(): AgentsViewContextValue {
+ const context = useContext(AgentsViewContext);
+ if (!context) {
+ throw new Error("useAgentsView must be used within AgentsViewProvider");
+ }
+ return context;
+}
diff --git a/apps/kitchen-sink/src/screens/context/SidekickViewContext.tsx b/apps/kitchen-sink/src/screens/context/SidekickViewContext.tsx
new file mode 100644
index 0000000000..189f11b075
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/context/SidekickViewContext.tsx
@@ -0,0 +1,77 @@
+import {
+ createContext,
+ useCallback,
+ useContext,
+ useMemo,
+ useState,
+ type ReactNode,
+} from "react";
+import { getSidekickChatTitle } from "../data/sidekickChats";
+
+export type SidekickView = "home" | "chat";
+
+interface SidekickViewContextValue {
+ view: SidekickView;
+ chatId: string;
+ chatTitle: string;
+ openChat: (chatId: string, chatTitle: string) => void;
+ goHome: () => void;
+}
+
+const SidekickViewContext = createContext(
+ null,
+);
+
+export function SidekickViewProvider({
+ children,
+ initialChatId = null,
+ onChatOpen,
+ onHome,
+}: {
+ children: ReactNode;
+ initialChatId?: string | null;
+ onChatOpen?: (chatId: string) => void;
+ onHome?: () => void;
+}) {
+ const [view, setView] = useState(
+ initialChatId ? "chat" : "home",
+ );
+ const [chatId, setChatId] = useState(initialChatId ?? "1");
+ const [chatTitle, setChatTitle] = useState(
+ initialChatId ? getSidekickChatTitle(initialChatId) : "New chat",
+ );
+
+ const openChat = useCallback(
+ (nextId: string, nextTitle: string) => {
+ setChatId(nextId);
+ setChatTitle(nextTitle);
+ setView("chat");
+ onChatOpen?.(nextId);
+ },
+ [onChatOpen],
+ );
+
+ const goHome = useCallback(() => {
+ setView("home");
+ onHome?.();
+ }, [onHome]);
+
+ const value = useMemo(
+ () => ({ view, chatId, chatTitle, openChat, goHome }),
+ [view, chatId, chatTitle, openChat, goHome],
+ );
+
+ return (
+
+ {children}
+
+ );
+}
+
+export function useSidekickView(): SidekickViewContextValue {
+ const context = useContext(SidekickViewContext);
+ if (!context) {
+ throw new Error("useSidekickView must be used within SidekickViewProvider");
+ }
+ return context;
+}
diff --git a/apps/kitchen-sink/src/screens/context/WorkspaceSelectionContext.tsx b/apps/kitchen-sink/src/screens/context/WorkspaceSelectionContext.tsx
new file mode 100644
index 0000000000..cfc87db6f3
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/context/WorkspaceSelectionContext.tsx
@@ -0,0 +1,45 @@
+import {
+ createContext,
+ useContext,
+ useMemo,
+ useState,
+ type ReactNode,
+} from "react";
+
+export const MARKETING_CAMPAIGN_NAV_ID = "marketing-campaign";
+export const FACELIFT_TEST_NAV_ID = "facelift-test";
+
+interface WorkspaceSelectionContextValue {
+ selectedId: string;
+ setSelectedId: (id: string) => void;
+}
+
+const WorkspaceSelectionContext =
+ createContext(null);
+
+export function WorkspaceSelectionProvider({
+ children,
+ initialSelectedId = MARKETING_CAMPAIGN_NAV_ID,
+}: {
+ children: ReactNode;
+ initialSelectedId?: string;
+}) {
+ const [selectedId, setSelectedId] = useState(initialSelectedId);
+ const value = useMemo(() => ({ selectedId, setSelectedId }), [selectedId]);
+
+ return (
+
+ {children}
+
+ );
+}
+
+export function useWorkspaceSelection(): WorkspaceSelectionContextValue {
+ const ctx = useContext(WorkspaceSelectionContext);
+ if (!ctx) {
+ throw new Error(
+ "useWorkspaceSelection must be used within WorkspaceSelectionProvider",
+ );
+ }
+ return ctx;
+}
diff --git a/apps/kitchen-sink/src/screens/data/initialGroups.ts b/apps/kitchen-sink/src/screens/data/initialGroups.ts
new file mode 100644
index 0000000000..df4ba4534b
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/data/initialGroups.ts
@@ -0,0 +1,103 @@
+import type { Group } from "@/components/types";
+import {
+ DEMO_AVATAR_1,
+ DEMO_AVATAR_2,
+ DEMO_PERSON_1_NAME,
+ DEMO_PERSON_2_NAME,
+} from "@/demo/demoPeople";
+
+export const INITIAL_GROUPS: Group[] = [
+ {
+ id: "g1",
+ title: "This Month",
+ color: "var(--primary-color)",
+ items: [
+ {
+ id: "1",
+ name: "Website Redesign",
+ status: "Working on it",
+ date: "2023-10-25",
+ priority: "High",
+ agents: [2, 3],
+ person: DEMO_AVATAR_1,
+ personName: DEMO_PERSON_1_NAME,
+ },
+ {
+ id: "2",
+ name: "Q4 Marketing Plan - Comprehensive Strategy for Global Expansion",
+ status: "Done",
+ date: "2023-10-20",
+ priority: "High",
+ agents: [1],
+ person: DEMO_AVATAR_2,
+ personName: DEMO_PERSON_2_NAME,
+ },
+ {
+ id: "3",
+ name: "Social Media Campaign",
+ status: "Stuck",
+ date: "2023-10-28",
+ priority: "Medium",
+ agents: [4, 2, 1],
+ },
+ {
+ id: "6",
+ name: "Competitor Analysis",
+ status: "Done",
+ date: "2023-10-22",
+ priority: "Medium",
+ agents: [3],
+ person: DEMO_AVATAR_2,
+ personName: DEMO_PERSON_2_NAME,
+ },
+ {
+ id: "7",
+ name: "Update Analytics",
+ status: "Working on it",
+ date: "2023-10-30",
+ priority: "Low",
+ },
+ ],
+ },
+ {
+ id: "g2",
+ title: "Next Month",
+ color: "var(--color-dark_purple)",
+ items: [
+ {
+ id: "4",
+ name: "Product Launch",
+ status: "Waiting",
+ date: "2023-11-15",
+ priority: "High",
+ agents: [1, 2],
+ person: DEMO_AVATAR_1,
+ personName: DEMO_PERSON_1_NAME,
+ },
+ {
+ id: "5",
+ name: "Blog Content Strategy",
+ status: "Sync with other team",
+ date: "2023-11-05",
+ priority: "Low",
+ },
+ {
+ id: "8",
+ name: "Newsletter Draft",
+ status: "Waiting",
+ date: "2023-11-08",
+ priority: "Medium",
+ agents: [4],
+ person: DEMO_AVATAR_2,
+ personName: DEMO_PERSON_2_NAME,
+ },
+ {
+ id: "9",
+ name: "Client Meeting Preparation",
+ status: "Working on it",
+ date: "2023-11-12",
+ priority: "High",
+ },
+ ],
+ },
+];
diff --git a/apps/kitchen-sink/src/screens/data/manageAgents.ts b/apps/kitchen-sink/src/screens/data/manageAgents.ts
new file mode 100644
index 0000000000..b183d7c60b
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/data/manageAgents.ts
@@ -0,0 +1,82 @@
+import agentElena from "../assets/agents/elena-wide.png";
+import agentSarah from "../assets/agents/sarah-wide.png";
+import agentBrittany from "../assets/agents/brittany-wide.png";
+import toolSlack from "../assets/tools/slack.png";
+import toolGmail from "../assets/tools/gmail.png";
+import toolMonday from "../assets/tools/monday.png";
+
+export type AgentStatus = "live" | "paused";
+
+export type AgentToolId = "slack" | "gmail" | "monday";
+
+export interface ManageAgentRow {
+ id: string;
+ name: string;
+ role: string;
+ creator: string;
+ image: string;
+ avatarBg: string;
+ tools: AgentToolId[];
+ extraTools?: number;
+ status: AgentStatus;
+ lastActivity: string;
+ creditsUsed: number;
+}
+
+export const MANAGE_AGENTS: ManageAgentRow[] = [
+ {
+ id: "zara",
+ name: "Zara",
+ role: "Campaign Strategist",
+ creator: "Jon snow",
+ image: agentElena,
+ avatarBg: "rgba(255, 132, 228, 0.5)",
+ tools: ["slack"],
+ status: "paused",
+ lastActivity: "1 hour ago",
+ creditsUsed: 20,
+ },
+ {
+ id: "kai",
+ name: "Kai",
+ role: "Marketing Content Writer",
+ creator: "Jon snow",
+ image: agentSarah,
+ avatarBg: "rgba(157, 255, 0, 0.5)",
+ tools: ["slack", "gmail", "monday"],
+ extraTools: 1,
+ status: "live",
+ lastActivity: "4 hours ago",
+ creditsUsed: 48,
+ },
+ {
+ id: "jamie",
+ name: "Jamie",
+ role: "Marketing Designer",
+ creator: "Jon snow",
+ image: agentBrittany,
+ avatarBg: "rgba(148, 80, 253, 0.5)",
+ tools: ["slack", "gmail"],
+ status: "live",
+ lastActivity: "Yesterday",
+ creditsUsed: 48,
+ },
+];
+
+export const TOOL_LABELS: Record = {
+ slack: "Slack",
+ gmail: "Gmail",
+ monday: "monday",
+};
+
+export const TOOL_COLORS: Record = {
+ slack: "#611f69",
+ gmail: "#ea4335",
+ monday: "#ff3d57",
+};
+
+export const TOOL_IMAGES: Record = {
+ slack: toolSlack,
+ gmail: toolGmail,
+ monday: toolMonday,
+};
diff --git a/apps/kitchen-sink/src/screens/data/promptChips.ts b/apps/kitchen-sink/src/screens/data/promptChips.ts
new file mode 100644
index 0000000000..7775adcee3
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/data/promptChips.ts
@@ -0,0 +1,44 @@
+import {
+ AgileProject,
+ Calendar,
+ CRM,
+ CustomerFeedback,
+ Deals,
+ EnabledUser,
+ Goals,
+ IncidentManager,
+ Knowledge,
+ Megaphone,
+ Roadmap,
+ Speedometer,
+ Tasks,
+ ToDoList,
+ WorkspaceHome,
+} from "@mondaydotcomorg/icons";
+import type { ComponentType, SVGProps } from "react";
+
+export interface PromptChip {
+ id: string;
+ label: string;
+ icon: ComponentType>;
+}
+
+// Ported 1:1 from the mini-home redesign's prompt-chips.constants.ts +
+// translations.json (the static prototype omits the full prompt payloads).
+export const PROMPT_CHIPS: readonly PromptChip[] = [
+ { id: "track_project", label: "Track a project", icon: WorkspaceHome },
+ { id: "plan_event", label: "Plan an event", icon: Tasks },
+ { id: "plan_content", label: "Plan content", icon: Calendar },
+ { id: "run_hiring", label: "Run hiring", icon: EnabledUser },
+ { id: "collect_requests", label: "Collect requests", icon: Roadmap },
+ { id: "track_budget", label: "Track budget", icon: Speedometer },
+ { id: "launch_campaign", label: "Launch campaign", icon: Megaphone },
+ { id: "manage_crm", label: "Manage CRM", icon: CRM },
+ { id: "close_deals", label: "Close deals", icon: Deals },
+ { id: "knowledge_hub", label: "Centralize docs", icon: Knowledge },
+ { id: "set_okrs", label: "Set OKRs", icon: Goals },
+ { id: "triage_incidents", label: "Triage incidents", icon: IncidentManager },
+ { id: "plan_sprint", label: "Plan sprint", icon: AgileProject },
+ { id: "gather_feedback", label: "Gather feedback", icon: CustomerFeedback },
+ { id: "organize_tasks", label: "Organize tasks", icon: ToDoList },
+];
diff --git a/apps/kitchen-sink/src/screens/data/sidekickChatScenarios.tsx b/apps/kitchen-sink/src/screens/data/sidekickChatScenarios.tsx
new file mode 100644
index 0000000000..4f46d03dbc
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/data/sidekickChatScenarios.tsx
@@ -0,0 +1,652 @@
+import { Button, IconButton } from "@vibe/core";
+import { Robot, Open, Check } from "@mondaydotcomorg/icons";
+import ownerAvatar from "figma:asset/6f1e4ef08a4e8899bba87998c3410a8132536714.png";
+
+// Token-driven font stacks so theme/font-menu changes apply to chat cards too.
+const BODY_FONT = "var(--font-family)";
+const TITLE_FONT = "var(--title-font-family)";
+
+export type PresetMessage =
+ | { role: "user"; text: string }
+ | {
+ role: "sidekick";
+ content: React.ReactNode;
+ card?: React.ReactNode;
+ sourceCount?: number;
+ showThoughtProcess?: boolean;
+ thoughtProcessLabel?: string;
+ }
+ | { role: "approval"; text: string };
+
+export interface ChatScenario {
+ title: string;
+ messages: PresetMessage[];
+}
+
+function S({ n }: { n: number }) {
+ return (
+
+ {n}
+
+ );
+}
+
+function SSOBlockerCard() {
+ return (
+
+
+
+
+
+
+ Vendor SSO setup incomplete
+
+
+
+
+
+
+
+
+ Stuck
+
+
+
+
+
+ Yes
+
+
+
+
+
+
+ );
+}
+
+const boldClause: React.CSSProperties = {
+ fontFamily: TITLE_FONT,
+ fontSize: "18px",
+ fontWeight: 500,
+ lineHeight: "28px",
+ letterSpacing: "0",
+ color: "var(--primary-text-color)",
+};
+
+function AutomationRuleCard() {
+ return (
+
+
+
+
+
+
+
+ When status changes to{" "}
+ Critical and{" "}
+ release type is{" "}
+ Customer release ,{" "}
+ notify me via{" "}
+ Sidekick
+
+
+
+
+ );
+}
+
+const labelStyle: React.CSSProperties = {
+ fontFamily: BODY_FONT,
+ fontSize: "16px",
+ fontWeight: 400,
+ lineHeight: "22px",
+ color: "var(--secondary-text-color)",
+};
+const valueStyle: React.CSSProperties = {
+ fontFamily: BODY_FONT,
+ fontSize: "16px",
+ fontWeight: 600,
+ lineHeight: "22px",
+ color: "var(--primary-text-color)",
+};
+
+function VendorCaseCard() {
+ return (
+
+
+ {/* Header */}
+
+
+
+
+
+
+
+ Vendor Portal
+
+
+
+
+
+
+ {/* Body */}
+
+ {/* Info section */}
+
+
+ {/* Row 1: Case title + Severity */}
+
+
+ Case title
+ Vendor SSO setup incomplete
+
+
+ Severity
+
+ Severity 1 - Critical
+
+
+
+ {/* Row 2: Product + Linked Board */}
+
+
+ Product
+ Okta SSO
+
+
+ Linked Board
+
+ Enterprise Pilot board
+
+
+
+
+
+
+ {/* Description section */}
+
+
+
Description
+
+ SSO configuration is blocking the June 12 pilot launch.
+ Authentication handshake fails on first login. Vendor owns the
+ next step — no internal workaround available.
+
+
+
+
+
+ {/* Footer */}
+
+
+ Submitted
+
+
+
+
+ );
+}
+
+export const CHAT_IDS = ["1", "2", "3"] as const;
+
+export const CHAT_SCENARIOS: Record = {
+ "1": {
+ title: "Trusted cross account insights",
+ messages: [
+ {
+ role: "user",
+ text: "Where are my biggest risks right now",
+ },
+ {
+ role: "sidekick",
+ content: (
+ <>
+
+ Ranked using your program priorities, milestones, teams in scope,
+ and the context your org marked for this program {" "}
+ — the program brief, operating plan, and escalation policy.
+
+
+
+ Enterprise pilot is slipping behind plan.{" "}
+
+
+
+ AI rollout is drifting across two dependent
+ teams.
+
+
+ Design handoff is slowing a key milestone.{" "}
+
+
+
+
+ I also weighted customer-facing milestones higher {" "}
+ based on how you typically rank risk in weekly reviews.
+
+ >
+ ),
+ sourceCount: 5,
+ showThoughtProcess: true,
+ thoughtProcessLabel: "Read 5 boards, 3 docs",
+ },
+ {
+ role: "user",
+ text: "What should I do first?",
+ },
+ {
+ role: "sidekick",
+ content: (
+
+ Start with the pilot. Resolve the onboarding blockers and update the
+ timeline before your next program review.
+
+ ),
+ sourceCount: 2,
+ showThoughtProcess: true,
+ thoughtProcessLabel: "Read pilot board, review doc",
+ },
+ ],
+ },
+
+ "2": {
+ title: "Proactive Sidekick",
+ messages: [
+ {
+ role: "sidekick",
+ content: (
+
+ Quick flag, Adi — in your weekly risk check,{" "}
+ Enterprise pilot came up as the top issue.
+ Onboarding blockers are still open and the timeline may slip.{" "}
+
+
+ ),
+ sourceCount: 3,
+ showThoughtProcess: true,
+ thoughtProcessLabel: "Read 3 boards, 2 docs",
+ },
+ {
+ role: "user",
+ text: "From now on, as soon as an open onboarding blocker puts a customer-facing milestone at risk, surface it — even if the board is still green",
+ },
+ {
+ role: "sidekick",
+ content: (
+ Saved. I'll surface it as soon as those signals line up.
+ ),
+ },
+ ],
+ },
+
+ "3": {
+ title: "Doing the work",
+ messages: [
+ {
+ role: "sidekick",
+ content: (
+
+ Heads up Adi — in your weekly risk check,{" "}
+ Vendor SSO setup incomplete is now the biggest risk
+ to the June 12 pilot launch . It's still open and
+ the vendor owns the next step.
+
+ ),
+ card: ,
+ sourceCount: 2,
+ showThoughtProcess: true,
+ thoughtProcessLabel: "Read 2 boards, 1 doc",
+ },
+ {
+ role: "user",
+ text: "Open a vendor case",
+ },
+ {
+ role: "sidekick",
+ content: (
+
+ Sure, I can do that using your{" "}
+ Case management skill — it'll open this case
+ directly in Zendesk . Does everything look right
+ before I submit?
+
+ ),
+ card: ,
+ showThoughtProcess: true,
+ thoughtProcessLabel: "Connected to Case management skill",
+ },
+ {
+ role: "approval",
+ text: "Case submission approved",
+ },
+ {
+ role: "sidekick",
+ content: (
+
+ Submitted a Severity 1 case for Vendor SSO setup
+ incomplete and linked it to your program board.
+
+ ),
+ sourceCount: 1,
+ showThoughtProcess: true,
+ thoughtProcessLabel: "Opened vendor case, updated board",
+ },
+ {
+ role: "user",
+ text: "Next time, do this as soon as it affects a customer-facing milestone",
+ },
+ {
+ role: "sidekick",
+ content: (
+
+ Saved. I'll open the case as soon as an open blocker puts a
+ customer-facing milestone at risk.
+
+ ),
+ card: ,
+ },
+ ],
+ },
+};
diff --git a/apps/kitchen-sink/src/screens/data/sidekickChats.ts b/apps/kitchen-sink/src/screens/data/sidekickChats.ts
new file mode 100644
index 0000000000..0464442435
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/data/sidekickChats.ts
@@ -0,0 +1,14 @@
+export interface SidekickChatLink {
+ id: string;
+ title: string;
+}
+
+export const SIDEKICK_CHATS: SidekickChatLink[] = [
+ { id: "1", title: "Board progress summary" },
+ { id: "2", title: "Weekly update draft" },
+ { id: "3", title: "Sprint risks and blockers" },
+];
+
+export function getSidekickChatTitle(chatId: string): string {
+ return SIDEKICK_CHATS.find((chat) => chat.id === chatId)?.title ?? "New chat";
+}
diff --git a/apps/kitchen-sink/src/screens/data/sidekickResponses.ts b/apps/kitchen-sink/src/screens/data/sidekickResponses.ts
new file mode 100644
index 0000000000..1439cd16ff
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/data/sidekickResponses.ts
@@ -0,0 +1,102 @@
+// Generates a contextual Sidekick response based on user input
+export function generateSidekickResponse(userMessage: string): {
+ intro: string;
+ followUp: string;
+} {
+ const lower = userMessage.toLowerCase();
+
+ if (lower.includes("onboarding") || lower.includes("onboard")) {
+ return {
+ intro:
+ "I've drafted an onboarding board tailored to help get your new team member up to speed. It includes key milestones, introductions, and first-week tasks.",
+ followUp:
+ "Want me to assign owners to each task, add due dates based on a start date, or share the board with the team?",
+ };
+ }
+
+ if (
+ lower.includes("meeting") ||
+ lower.includes("recap") ||
+ lower.includes("summary")
+ ) {
+ return {
+ intro:
+ "Here's a clean meeting recap based on your request. You can review and tweak any details as needed.",
+ followUp:
+ "Want me to turn the action items into tasks, post this as a doc update, or share it with the team?",
+ };
+ }
+
+ if (
+ lower.includes("task") ||
+ lower.includes("to-do") ||
+ lower.includes("todo")
+ ) {
+ return {
+ intro:
+ "I've organized the tasks based on your input. Each item includes a suggested priority and timeline.",
+ followUp:
+ "Should I assign these to specific team members, set due dates, or create a timeline view?",
+ };
+ }
+
+ if (
+ lower.includes("report") ||
+ lower.includes("status") ||
+ lower.includes("update")
+ ) {
+ return {
+ intro:
+ "Here's a status report based on the current state of your boards. I've highlighted key blockers and upcoming deadlines.",
+ followUp:
+ "Want me to email this to stakeholders, schedule a recurring update, or break down the blockers into action items?",
+ };
+ }
+
+ if (
+ lower.includes("board") ||
+ lower.includes("create") ||
+ lower.includes("build")
+ ) {
+ return {
+ intro:
+ "I've set up a new board structure based on your description. It includes relevant columns and groups to get you started.",
+ followUp:
+ "Would you like me to add sample items, customize the columns, or invite collaborators to this board?",
+ };
+ }
+
+ if (
+ lower.includes("email") ||
+ lower.includes("write") ||
+ lower.includes("draft")
+ ) {
+ return {
+ intro:
+ "I've drafted the content based on your request. Feel free to review and adjust the tone or details.",
+ followUp:
+ "Should I save this as a doc, copy it to your clipboard, or refine any specific section?",
+ };
+ }
+
+ if (
+ lower.includes("help") ||
+ lower.includes("how") ||
+ lower.includes("what")
+ ) {
+ return {
+ intro:
+ "Great question. Here's what I found based on your request. I've kept the answer concise and actionable.",
+ followUp:
+ "Want me to go deeper on any of these points, or would you like me to help you take action on something specific?",
+ };
+ }
+
+ // Default response
+ return {
+ intro:
+ "I've processed your request and put together a response. Let me know if this captures what you had in mind.",
+ followUp:
+ "Would you like me to refine this further, save it as a doc, or take any follow-up actions?",
+ };
+}
diff --git a/apps/kitchen-sink/src/screens/data/vibeHome.ts b/apps/kitchen-sink/src/screens/data/vibeHome.ts
new file mode 100644
index 0000000000..50b302196d
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/data/vibeHome.ts
@@ -0,0 +1,290 @@
+import { Board, Bolt, Chart, Graph, Group, Idea } from "@mondaydotcomorg/icons";
+import type { ComponentType, SVGProps } from "react";
+
+import budgetTracker from "../assets/inspirations/budget-tracker.png";
+import calendarApp from "../assets/inspirations/calendar-app.png";
+import calendarView from "../assets/inspirations/calendar-view.png";
+import contentCalendar from "../assets/inspirations/content-calendar.png";
+import documentation from "../assets/inspirations/documentation.png";
+import editorialCalendar from "../assets/inspirations/editorial-calendar.png";
+import employeeDirectory from "../assets/inspirations/employee-directory.png";
+import eventPortal from "../assets/inspirations/event-portal.png";
+import inspiration1 from "../assets/inspirations/inspiration-1.png";
+import inspiration2 from "../assets/inspirations/inspiration-2.png";
+import inspiration3 from "../assets/inspirations/inspiration-3.png";
+import inspiration4 from "../assets/inspirations/inspiration-4.png";
+import inspiration5 from "../assets/inspirations/inspiration-5.png";
+import knowledgeBase from "../assets/inspirations/knowledge-base.png";
+import orgChart from "../assets/inspirations/org-chart.png";
+import portfolio from "../assets/inspirations/portfolio.png";
+import presentation from "../assets/inspirations/presentation.png";
+import projectDashboard from "../assets/inspirations/project-dashboard.png";
+import projectOverview from "../assets/inspirations/project-overview.png";
+import quotaCalculator from "../assets/inspirations/quota-calculator.png";
+import knowledgeManagerTemplate from "../assets/app-templates/knowledge-manager.png";
+import orgChartTemplate from "../assets/app-templates/org-chart.png";
+import quoteCalculatorTemplate from "../assets/app-templates/quote-calculator.png";
+
+type IconComponent = ComponentType>;
+
+// Brand-gradient palette set ported from the mini-home redesign
+// (gradientPalettes.ts). A radial highlight is painted on top of a linear base.
+interface GradientPalette {
+ base: string;
+ radialColor: string;
+ radialCenter: string;
+}
+
+const PALETTES: readonly GradientPalette[] = [
+ {
+ base: "linear-gradient(90deg, rgb(79, 195, 247) 0%, rgb(41, 182, 246) 100%)",
+ radialColor: "rgba(111, 232, 154, 1)",
+ radialCenter: "33.333% 33.333%",
+ },
+ {
+ base: "linear-gradient(90deg, rgb(79, 216, 160) 0%, rgb(0, 186, 95) 100%)",
+ radialColor: "rgba(255, 204, 0, 1)",
+ radialCenter: "-10.952% 5.714%",
+ },
+ {
+ base: "linear-gradient(90deg, rgb(255, 184, 64) 0%, rgb(254, 155, 11) 100%)",
+ radialColor: "rgba(255, 204, 0, 1)",
+ radialCenter: "4.096% 35.904%",
+ },
+ {
+ base: "linear-gradient(90deg, rgb(217, 145, 230) 0%, rgb(186, 86, 217) 100%)",
+ radialColor: "rgba(255, 161, 199, 1)",
+ radialCenter: "78% 28%",
+ },
+ {
+ base: "linear-gradient(90deg, rgb(149, 134, 247) 0%, rgb(112, 95, 230) 100%)",
+ radialColor: "rgba(180, 220, 255, 1)",
+ radialCenter: "14% 70%",
+ },
+ {
+ base: "linear-gradient(90deg, rgb(91, 192, 235) 0%, rgb(54, 154, 233) 100%)",
+ radialColor: "rgba(168, 233, 255, 1)",
+ radialCenter: "85% 85%",
+ },
+];
+
+export function buildPaletteBackground(index: number): string {
+ const palette = PALETTES[index % PALETTES.length];
+ return `radial-gradient(circle at ${palette.radialCenter}, ${palette.radialColor} 0%, ${palette.radialColor} 15%, transparent 70%), ${palette.base}`;
+}
+
+export interface LiveSuggestionBoard {
+ label: string;
+ icon: IconComponent;
+}
+
+export interface LiveSuggestion {
+ name: string;
+ description: string;
+ glyph: IconComponent;
+ paletteIndex: number;
+ basedOn: LiveSuggestionBoard[];
+ overflowCount?: number;
+}
+
+// Static stand-in for the data-driven live suggestions. Each card renders up to
+// two named board chips with an optional "+N" overflow chip.
+export const LIVE_SUGGESTIONS: readonly LiveSuggestion[] = [
+ {
+ name: "Creative Request Hub",
+ description:
+ "Build a creative intake portal that designers and stakeholders use to submit and track requests.",
+ glyph: Idea,
+ paletteIndex: 0,
+ basedOn: [
+ { label: "Design backlog", icon: Board },
+ { label: "Tasks - Vibe agent core", icon: Board },
+ ],
+ overflowCount: 1,
+ },
+ {
+ name: "Design Project Tracker",
+ description:
+ "Create a project management suite that creative leads use to align status and ownership.",
+ glyph: Graph,
+ paletteIndex: 1,
+ basedOn: [
+ { label: "Vibe Platform Tasks", icon: Board },
+ { label: "Tasks", icon: Board },
+ ],
+ },
+ {
+ name: "Brand Asset Library",
+ description:
+ "Launch a brand asset manager that designers and marketing teams use daily.",
+ glyph: Bolt,
+ paletteIndex: 3,
+ basedOn: [
+ { label: "Infra Drift board", icon: Board },
+ { label: "Vibe Platform Backlog", icon: Board },
+ ],
+ overflowCount: 1,
+ },
+];
+
+// Available for future cards that want a generic glyph/group icon.
+export const FALLBACK_GLYPHS: readonly IconComponent[] = [Chart, Group];
+
+export interface AppTemplate {
+ id: string;
+ title: string;
+ description: string;
+ thumbnail: string;
+}
+
+export const APP_TEMPLATES: readonly AppTemplate[] = [
+ {
+ id: "knowledge-manager",
+ title: "Knowledge manager",
+ description: "Centralize your team's knowledge in one searchable hub",
+ thumbnail: knowledgeManagerTemplate,
+ },
+ {
+ id: "org-chart",
+ title: "Org chart",
+ description: "Visualize your company's structure in a clear org chart",
+ thumbnail: orgChartTemplate,
+ },
+ {
+ id: "quote-calculator",
+ title: "Quote calculator",
+ description: "Create sales quotes on the spot",
+ thumbnail: quoteCalculatorTemplate,
+ },
+];
+
+export interface Inspiration {
+ slug: string;
+ label: string;
+ theme: string;
+ thumbnail: string;
+}
+
+// Ported 1:1 from the redesign's inspirations.constants.ts + translations.json.
+export const INSPIRATIONS: readonly Inspiration[] = [
+ {
+ slug: "editorial",
+ label: "Reading list",
+ theme: "Editorial",
+ thumbnail: inspiration1,
+ },
+ {
+ slug: "playful",
+ label: "Project tracker",
+ theme: "Playful",
+ thumbnail: inspiration2,
+ },
+ {
+ slug: "minimal",
+ label: "Note taking",
+ theme: "Minimalistic",
+ thumbnail: inspiration3,
+ },
+ {
+ slug: "monochrome",
+ label: "Document hub",
+ theme: "Monochrome",
+ thumbnail: inspiration4,
+ },
+ {
+ slug: "dense-data",
+ label: "Data dashboard",
+ theme: "Dense data",
+ thumbnail: inspiration5,
+ },
+ {
+ slug: "portfolio",
+ label: "Portfolio",
+ theme: "Tactile",
+ thumbnail: portfolio,
+ },
+ {
+ slug: "project-dashboard",
+ label: "Project dashboard",
+ theme: "Dark mode",
+ thumbnail: projectDashboard,
+ },
+ {
+ slug: "budget-tracker",
+ label: "Budget tracker",
+ theme: "Spreadsheet",
+ thumbnail: budgetTracker,
+ },
+ {
+ slug: "presentation",
+ label: "Presentation",
+ theme: "Soft",
+ thumbnail: presentation,
+ },
+ {
+ slug: "quota-calculator",
+ label: "Quota calculator",
+ theme: "Bright",
+ thumbnail: quotaCalculator,
+ },
+ {
+ slug: "knowledge-base",
+ label: "Knowledge base",
+ theme: "Sci-fi",
+ thumbnail: knowledgeBase,
+ },
+ {
+ slug: "org-chart",
+ label: "Org chart",
+ theme: "Corporate",
+ thumbnail: orgChart,
+ },
+ {
+ slug: "project-overview",
+ label: "Project overview",
+ theme: "Sticker",
+ thumbnail: projectOverview,
+ },
+ {
+ slug: "content-calendar",
+ label: "Content calendar",
+ theme: "Magazine",
+ thumbnail: contentCalendar,
+ },
+ {
+ slug: "calendar-app",
+ label: "Calendar app",
+ theme: "Modernist",
+ thumbnail: calendarApp,
+ },
+ {
+ slug: "editorial-calendar",
+ label: "Editorial calendar",
+ theme: "Newspaper",
+ thumbnail: editorialCalendar,
+ },
+ {
+ slug: "calendar-view",
+ label: "Calendar view",
+ theme: "Pop",
+ thumbnail: calendarView,
+ },
+ {
+ slug: "employee-directory",
+ label: "Employee directory",
+ theme: "Card grid",
+ thumbnail: employeeDirectory,
+ },
+ {
+ slug: "event-portal",
+ label: "Event portal",
+ theme: "Marketing",
+ thumbnail: eventPortal,
+ },
+ {
+ slug: "documentation",
+ label: "Documentation",
+ theme: "Calm",
+ thumbnail: documentation,
+ },
+];
diff --git a/apps/kitchen-sink/src/screens/data/workspaceNavTree.ts b/apps/kitchen-sink/src/screens/data/workspaceNavTree.ts
new file mode 100644
index 0000000000..c6fa8df337
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/data/workspaceNavTree.ts
@@ -0,0 +1,131 @@
+export type NavItemIcon = "home" | "board" | "doc" | "apps" | "star";
+
+export type NavTreeNode =
+ | {
+ type: "item";
+ id: string;
+ label: string;
+ icon: NavItemIcon;
+ /** Optional trailing label text (e.g. "New") */
+ badge?: string;
+ }
+ | {
+ type: "folder";
+ id: string;
+ label: string;
+ color?: string;
+ defaultExpanded?: boolean;
+ children: NavTreeNode[];
+ };
+
+export const DEFAULT_SELECTED_NAV_ID = "marketing-campaign";
+
+export const WORKSPACE_NAV_TREE: NavTreeNode[] = [
+ {
+ type: "item",
+ id: "workspace-home",
+ label: "Workspace home",
+ icon: "home",
+ },
+ {
+ type: "folder",
+ id: "workspace-apps",
+ label: "Workspace apps",
+ defaultExpanded: false,
+ children: [],
+ },
+ {
+ type: "item",
+ id: "marketing-campaign",
+ label: "Marketing campaign",
+ icon: "board",
+ badge: "New",
+ },
+ {
+ type: "item",
+ id: "designers-meeting",
+ label: "Team weekly meeting",
+ icon: "board",
+ },
+ {
+ type: "folder",
+ id: "forms-processes",
+ label: "Forms & Processes",
+ color: "#784bd1",
+ defaultExpanded: true,
+ children: [
+ {
+ type: "folder",
+ id: "migrations",
+ label: "Migrations and deprecations",
+ color: "#ff5ac4",
+ defaultExpanded: true,
+ children: [
+ {
+ type: "item",
+ id: "vibe-asset-deprecation",
+ label: "Asset deprecation template",
+ icon: "board",
+ },
+ {
+ type: "item",
+ id: "dropdown-deprecation",
+ label: "Dropdown deprecation",
+ icon: "doc",
+ },
+ {
+ type: "item",
+ id: "modal-deprecation",
+ label: "Modal deprecation",
+ icon: "doc",
+ },
+ ],
+ },
+ {
+ type: "folder",
+ id: "icons",
+ label: "Icons",
+ color: "#df2f4a",
+ defaultExpanded: true,
+ children: [
+ {
+ type: "item",
+ id: "new-icon-vibe-request",
+ label: "New icon to Vibe - request form",
+ icon: "board",
+ },
+ {
+ type: "item",
+ id: "vibe-feedback",
+ label: "Icons catalog instructions",
+ icon: "doc",
+ },
+ {
+ type: "item",
+ id: "approved-icon-workflow",
+ label: "Approved icon workflow",
+ icon: "board",
+ },
+ ],
+ },
+ ],
+ },
+];
+
+function collectDefaultExpanded(
+ nodes: NavTreeNode[],
+ acc: Record = {},
+): Record {
+ for (const node of nodes) {
+ if (node.type === "folder") {
+ if (node.defaultExpanded) {
+ acc[node.id] = true;
+ }
+ collectDefaultExpanded(node.children, acc);
+ }
+ }
+ return acc;
+}
+
+export const DEFAULT_EXPANDED_FOLDERS =
+ collectDefaultExpanded(WORKSPACE_NAV_TREE);
diff --git a/apps/kitchen-sink/src/screens/demo/demoPeople.ts b/apps/kitchen-sink/src/screens/demo/demoPeople.ts
new file mode 100644
index 0000000000..d383a57f2f
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/demo/demoPeople.ts
@@ -0,0 +1,9 @@
+/** Shared placeholder people assets for prototype boards (header + table). */
+export const DEMO_AVATAR_1 =
+ "https://images.unsplash.com/photo-1672685667592-0392f458f46f?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxwcm9mZXNzaW9uYWwlMjBoZWFkc2hvdCUyMHBvcnRyYWl0fGVufDF8fHx8MTc2NzYzNzg0NHww&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral";
+
+export const DEMO_AVATAR_2 =
+ "https://images.unsplash.com/photo-1655249493799-9cee4fe983bb?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3Nzg4Nzd8MHwxfHNlYXJjaHwxfHxwcm9mZXNzaW9uYWwlMjB3b21hbiUyMGhlYWRzaG90fGVufDF8fHx8MTc2NzYyNDAxNHww&ixlib=rb-4.1.0&q=80&w=1080&utm_source=figma&utm_medium=referral";
+
+export const DEMO_PERSON_1_NAME = "Jordan Martinez";
+export const DEMO_PERSON_2_NAME = "Sam Taylor";
diff --git a/apps/kitchen-sink/src/screens/guidelines/GlazeTheme.md b/apps/kitchen-sink/src/screens/guidelines/GlazeTheme.md
new file mode 100644
index 0000000000..ba9574157f
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/guidelines/GlazeTheme.md
@@ -0,0 +1,111 @@
+# Glaze theme spec
+
+Editorial, refined, monday-aware design facelift. See the full component recipes in the source design doc; this file tracks **implementation decisions** for this prototype.
+
+## Scoping rule
+
+**All Glaze-specific UI changes must apply only when `glaze` is active** (``). Do not change default theme styles globally.
+
+| Approach | When to use |
+|---|---|
+| `:root.glaze { … }` in `globals.css` | Design tokens (colors, typography, radius, shadows) |
+| `:global(html.glaze) { … }` in `*.module.scss` | Component layout and visual overrides |
+| `:global(html.glaze) &` nested in a module class | Single-component tweaks |
+
+Never set Glaze values on base selectors, never pass theme props for styling when a scoped CSS override suffices, and never change shared `Flex`/`Box` props (e.g. `gap`) for all themes.
+
+## Surfaces
+
+| Token | Value | CSS variable | Usage |
+|---|---|---|---|
+| Canvas / gap | `#F4F5F3` | `--primary-surface-color` | App background visible between floating panels, top bar area, navigation rail |
+| Panel | `#FFFFFF` | `--secondary-background-color` | Workspace panel, main content — flat white cards, 16px radius, no shadow |
+| UI rail | `#F2F3F2` | `--ui-background-color` | Segmented controls, toolbar surfaces |
+
+Layout shells have **no borders and no elevation** (no `box-shadow`). The workspace panel and main content area are flat white surfaces separated by a **12px `#F4F5F3` gap** — applied only under `html.glaze` via `MainLayout.module.scss` (not on the `Flex` component, so other themes stay flush). Both panels use **16px** border radius (`var(--space-16)`).
+
+## Borders
+
+| Token | Light value | Usage |
+|---|---|---|
+| `--layout-border-color` | `#E9EBEA` | Board grid, table rows, structural dividers |
+| `--ui-border-color` | `#E2E4E3` | Buttons, inputs, cards, segmented controls |
+| `--glaze-input-focus-border-color` | `#BABBBC` | Input/dropdown hover, focus, and open states (overrides Vibe’s `--primary-color` border) |
+| `--glaze-border-hairline` | `rgba(0, 0, 0, 0.04)` | Ultra-subtle dividers |
+
+## Icon colors
+
+Glaze uses **two icon tiers**. Do not collapse them into a single `--icon-color` without updating call sites.
+
+| Tier | Value | CSS variable | When to use |
+|---|---|---|---|
+| **Primary** | `#676879` | `--glaze-icon-color-primary` | Icons on the **canvas surface** (`#F4F5F3`) — e.g. the left navigation rail |
+| **Secondary** | `#BABBBC` | `--glaze-icon-color-secondary` | Default app-wide icon tier; maps to `--icon-color`. Icons on **white panels** and toolbars where they should sit behind text |
+
+**Hover:** `--icon-hover` is `#676879` (same as primary tier) — icons lift to primary weight on interaction.
+
+### Left navigation rail
+
+The icon rail sits directly on the `#F4F5F3` canvas (not inside a white card). It **must use primary icon color**:
+
+```scss
+/* NavigationRail.module.scss */
+:global(html.glaze) .rail {
+ background-color: var(--primary-surface-color);
+ --icon-color: var(--glaze-icon-color-primary);
+}
+```
+
+Active rail items use `--glaze-rail-selected-color` (`#E0E2E1`, slightly darker than `#E6E8E7`) for the icon pill background; hover uses `--glaze-rail-selected-hover-color` (`#DADCDB`). Icon color stays `--primary-text-color` for selected-state contrast.
+
+### Everywhere else
+
+Toolbar, board header, workspace panel (white card), and top bar icons use the **secondary** tier via the global `--icon-color` token (`#BCBBBA`).
+
+## Typography
+
+**DM Sans** for body and display. Max weight: Medium (500).
+
+## Border radius
+
+| Element | Radius | CSS variable | Notes |
+|---|---|---|---|
+| Layout shells (workspace panel, main content) | **16px** | `var(--space-16)` | Set explicitly on layout — not via control tokens |
+| **All buttons and inputs** | **8px** | `--glaze-radius-control` | Aliased to `--border-radius-small` and `--border-radius-medium` under `:root.glaze` so Vibe `Button`, `IconButton`, `SplitButton`, `TextField`, and project controls inherit 8px |
+| Modals / prominent surfaces | 14px | `--border-radius-big` | Unchanged |
+
+**Exceptions:** Pill-shaped controls keep their own radius (e.g. global search `100px`, avatars `50%`, notification badges `999px`).
+
+## Board
+
+| Element | Glaze value | Default (other themes) | File |
+|---|---|---|---|
+| Group accent stripe | **3px** width | 6px (`calc(var(--space-4) + var(--space-2))`) | `BoardGroup.module.scss` |
+| Status / priority cells | **4px** radius, **2px** inset padding | Full-bleed fill, no radius | `StatusCell.module.scss` |
+| Row column dividers | **None** (no vertical borders between cells) | `border-right` on each cell | `BoardGroup.module.scss` |
+
+Iconic cell colors stay full saturation in Glaze; only geometry changes. Horizontal row separators remain.
+
+## AI product pages (Sidekick, Agents, Vibe)
+
+Under `html.glaze` only, the hero block (H1, subtitle, composer) is aligned across all three pages via `_productHeroGlaze.scss`: **34px** H1, **18px** subtitle, **88px** composer min-height, **720px** max-width, **48px** page padding. Other themes keep each page’s original layout and sizes.
+
+## Implementation map
+
+| Spec token | CSS variable |
+|---|---|
+| `--bg-canvas` | `--primary-surface-color` (`#F4F5F3`) |
+| `--bg-surface` | `--secondary-background-color` (`#FFFFFF`) |
+| `--text-primary` | `--primary-text-color` |
+| `--text-secondary` | `--secondary-text-color` |
+| `--icon-primary` | `--glaze-icon-color-primary` |
+| `--icon-secondary` | `--glaze-icon-color-secondary` / `--icon-color` |
+| `--border-layout` | `--layout-border-color` (`#E9EBEA`) |
+| `--border-ui` | `--ui-border-color` (`#E2E4E3`) |
+| `--primary` | `--primary-color` (`#404643`) |
+| `--shadow-card` | `--glaze-shadow-card` |
+| `--shadow-lift` | `--glaze-shadow-lift` |
+| `--bg-rail-selected` | `--glaze-rail-selected-color` (`#E0E2E1`) |
+| `--r-md` (controls) | `--glaze-radius-control` (`8px`) |
+
+Theme class: `glaze` on ``. Toggle via `ThemeSwitcher`.
diff --git a/apps/kitchen-sink/src/screens/guidelines/Guidelines.md b/apps/kitchen-sink/src/screens/guidelines/Guidelines.md
new file mode 100644
index 0000000000..e68574c3e7
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/guidelines/Guidelines.md
@@ -0,0 +1,3299 @@
+# Vibe Design System Guidelines for Figma Make
+
+Use this file to provide the AI with rules and guidelines for using the Vibe Design System and its components. This document outlines design system foundations, component usage patterns, accessibility requirements, and best practices.
+
+## Quick Reference
+
+**Critical Rules:**
+
+- Always import from `@vibe/core` or `@vibe/core/next` (for newer components)
+- **Always use icons from `@mondaydotcomorg/icons`** - Never use other icon libraries
+- Always wrap icons with `Icon` component from `@vibe/core`
+- Use `Box` and `Flex` for layout instead of custom CSS
+- **Always add padding to layouts** - Never create layouts without proper padding
+- Use semantic colors for UI elements, content colors ONLY for data visualization
+- **Content color naming** - Preserve exact names (some use underscores `_`, some use dashes `-`)
+- Always provide accessibility attributes (`id`, `ariaLabel`, etc.)
+- **Always use spacing tokens** - In CSS use `var(--space-4)`, `var(--space-8)`, `var(--space-16)`, etc. In React props use `xs`, `small`, `medium`, `large`, etc.
+- Use shadow tokens (`xs`, `small`, `medium`, `large`) for elevation and interactions
+- Default to white/transparent backgrounds - use colors sparingly
+- Use spacing tokens and typography for hierarchy, not colors
+- Prefer subtle borders over colored backgrounds
+- Use generous white space with spacing tokens - let content breathe
+- Create visual balance - distribute elements evenly, balance heavy and light elements
+- Maintain visual consistency - use consistent spacing, sizing, and styling patterns
+- Establish visual rhythm - use consistent spacing intervals throughout
+- Guide visual flow - use hierarchy, spacing, and alignment to guide the eye naturally
+- Never use raw HTML elements — Always use Button, IconButton, or SplitButton from @vibe/core instead of native tags, including in Figma-imported code
+- **Toggle without labels** - When using `Toggle` in compact UI (cards, toolbars, table rows), always add `areLabelsHidden` and pair with `ariaLabel`
+
+**Package Imports:**
+
+- Components: `@vibe/core` or `@vibe/core/next`
+- Icons: `@mondaydotcomorg/icons`
+- New components: `@vibe/core/next` (Modal, Dropdown, AttentionBox)
+
+---
+
+# General Guidelines
+
+## Code Quality and Structure
+
+- Only use absolute positioning when necessary. Opt for responsive and well-structured layouts that use flexbox and grid by default.
+- Refactor code as you go to keep code clean and maintainable.
+- Keep file sizes small and put helper functions and components in their own files.
+- Always import components from `@vibe/core` or `@vibe/core/next` (for newer components).
+- Use TypeScript for type safety and better developer experience.
+- Follow React best practices: use functional components, hooks, and proper state management.
+
+## Layout and Spacing
+
+- Use the `Box` and `Flex` components for layout instead of custom CSS.
+- Use consistent spacing values from the design system spacing scale (4px, 8px, 12px, 16px, 20px, 24px, 32px, 40px, 48px, 64px).
+- Apply spacing tokens using CSS custom properties: `var(--space-8)`, `var(--space-16)`, etc.
+- Group related items together using similar spacing.
+- Use larger spacing around elements to emphasize their importance.
+- **Always add padding to layouts** - Never create layouts without proper padding. Use `Box` with `padding` prop or `Flex` with appropriate spacing to ensure content doesn't touch container edges.
+- **Page-level layouts** should have padding of at least `medium` (16px) or `large` (24px) on all sides.
+- **Component containers** should have appropriate padding based on content density (typically `small` (8px) to `medium` (16px)).
+- **Modal and Dialog content** must have proper padding - use `ModalContent` which includes default padding, or wrap content in `Box` with padding.
+- **Card-like components** should have padding of at least `medium` (16px) to ensure content is readable and visually comfortable.
+
+## Responsive Design
+
+- Build responsive layouts that work across different screen sizes.
+- Use the `Flex` component for one-dimensional layouts (horizontal or vertical).
+- Use `Flex` with `wrap` prop for simple responsive multi-line layouts.
+- Use CSS Grid for two-dimensional layouts requiring precise control over rows and columns.
+- Use `Box` component for containers that need spacing, borders, or rounded corners.
+- Avoid fixed widths when possible; prefer flexible layouts.
+- Use `minmax()` with appropriate minimum widths for responsive grids and flex wrap items.
+- Test layouts at different screen sizes to ensure proper wrapping and spacing.
+
+## Accessibility
+
+Web Accessibility ensures people with disabilities can equally perceive, understand, navigate, and interact with digital content. Follow WCAG (Web Content Accessibility Guidelines) principles.
+
+### Core Accessibility Principles
+
+- **Perceivable:** Information must be presentable to users in ways they can perceive
+- **Operable:** Interface components must be operable by all users
+- **Understandable:** Information and UI operation must be understandable
+- **Robust:** Content must be robust enough for various assistive technologies
+
+### Accessibility Requirements
+
+- Always provide proper labels and ARIA attributes for interactive components.
+- Ensure keyboard navigation works for all interactive elements.
+- Use semantic HTML elements where appropriate.
+- Provide meaningful text alternatives for icons and images.
+- Ensure sufficient color contrast for text and interactive elements.
+
+### Color Contrast
+
+**Text Color Contrast:**
+
+- Text and images must have a contrast ratio of at least **4.5:1** with the background
+- Large text (18pt/24px or 14pt/18.66px and bold) must have at least **3:1** contrast ratio
+- Exceptions: Incidental text, decorative elements, inactive UI, logotypes
+
+**Non-Text Color Contrast:**
+
+- UI components (borders, focus indicators, active states) must have at least **3:1** contrast ratio
+- Graphical objects required to understand content must have sufficient contrast
+
+### Imagery
+
+**Information Images:**
+
+- Alt-text must convey the same information as the image
+- Keep alt-text short and appropriate to context
+- If information is already present as text, mark image as decorative
+- Don't use phrases like "graphic", "An image of", "A picture of", "an icon of"
+
+**Decorative Images:**
+
+- Should not convey information
+- Should be ignored by screen readers
+- Use `role="presentation"` or empty alt attribute
+- Can be defined as background images in stylesheet
+
+### Keyboard Navigation
+
+- All active elements operable with mouse must be operable by keyboard
+- Dynamic components (dialogs, menus) must receive keyboard focus
+- Elements showing content on hover must be in tab order and keyboard operable
+- Annotate tab-order in designs
+
+### Focus Management
+
+- Provide visible focus indicators for all interactive elements
+- In rich applications, users tab to complex components then use arrow keys within them
+- When dynamic components close, focus returns to the point where interaction started
+- Receiving focus must not cause substantial page changes
+
+### Semantic Markup
+
+- Use proper heading hierarchy (H1-H6) - only one H1 per page
+- Don't skip heading levels
+- Use semantic elements: headings, regions/landmarks, lists, emphasized text, tables
+- Ensure reading order matches visual presentation
+
+### Screen Reader Support
+
+- Ensure all content is accessible to screen readers
+- Use ARIA attributes when semantic HTML isn't sufficient
+- Provide clear, descriptive labels for all interactive elements
+- Test with screen readers (JAWS, NVDA, VoiceOver)
+
+---
+
+# Design System Guidelines
+
+## Typography
+
+### Fonts
+
+We use two fonts for our UI hierarchy:
+
+- **Poppins** - Used for main titles (headings)
+- **Figtree** - Used for text, labels, and paragraphs
+
+Include fonts using this link tag:
+
+```html
+
+```
+
+### Type Styles
+
+**Headings:**
+
+- H1 - 32px (use `Heading` component with `type="h1"`)
+- H2 - 24px (use `Heading` component with `type="h2"`)
+- H3 - 18px (use `Heading` component with `type="h3"`)
+
+**Text:**
+
+- Text1 - 16px (use `Text` component with `type="text1"`)
+- Text2 - 14px (use `Text` component with `type="text2"`)
+- Text3 - 12px (use `Text` component with `type="text3"`)
+
+**Weights:** light, normal, medium, bold
+
+### Typography Best Practices
+
+- Avoid using text size smaller than 14px.
+- Don't underline words. For typographic emphasis, use bold text.
+- Don't use 2 different sizes of text in the same line.
+- Use sentence-case capitalization for buttons and labels.
+- Keep button labels to 1-2 words, no longer than 4 words, with fewer than 20 characters including spaces.
+
+## Icons
+
+**CRITICAL:** Always use icons from `@mondaydotcomorg/icons` package. Never use other icon libraries (Font Awesome, Material Icons, etc.) or custom icon fonts. The `@mondaydotcomorg/icons` package provides all icons needed for the Vibe Design System.
+
+### Icon Package
+
+The `@mondaydotcomorg/icons` package includes all icons from the Vibe Design System, available as React components, lazy-loaded components, and SVG path data.
+
+### Installation
+
+```bash
+npm install @mondaydotcomorg/icons
+```
+
+### Import Methods
+
+#### Standard React Components (Recommended)
+
+Import icons directly as React components:
+
+```js
+import { Close, Search, Check, ArrowRight } from "@mondaydotcomorg/icons";
+```
+
+#### Lazy-Loaded Components (For Performance)
+
+Use lazy-loaded icons for better performance when you have many icons or want to reduce initial bundle size:
+
+```js
+import { Close } from "@mondaydotcomorg/icons/lazy";
+```
+
+#### SVG path data
+
+Import path data when you need direct SVG access (not React components):
+
+```js
+import { Close as ClosePath } from "@mondaydotcomorg/icons/svgPathData";
+```
+
+#### Icon Metadata
+
+Access icon metadata for programmatic use (icon pickers, filtering, etc.):
+
+```js
+import iconsMetaData from "@mondaydotcomorg/icons/meta";
+```
+
+### Using Icons with Icon Component
+
+Always wrap icons with the `Icon` component from `@vibe/core` for consistent styling and behavior:
+
+```jsx
+import { Icon } from "@vibe/core";
+import { Close, Search } from "@mondaydotcomorg/icons";
+
+// Basic usage
+
+
+// With size
+
+
+// In buttons
+Close
+```
+
+### Icon Usage Guidelines
+
+- **Always use `@mondaydotcomorg/icons`** - Never import icons from other libraries
+- **Always wrap icons with Icon component** - Use the `Icon` component from `@vibe/core` to wrap all icons
+- **Provide accessible labels** - When using icons alone (without text), always provide an `ariaLabel` or use them within components that have accessible labels
+- **Use icons alongside text when possible** - Icons enhance text but shouldn't replace it for important information
+- **Use appropriate icon sizes** - Icons inherit color from their parent container by default
+- **Use lazy loading for performance** - Import from `@mondaydotcomorg/icons/lazy` when you have many icons or want to optimize bundle size
+
+### Icon Best Practices
+
+- Use icons to enhance visual communication and provide visual cues
+- Icons should be semantically meaningful and match their context
+- Maintain consistent icon usage throughout the application
+- Use the same icon for the same action across the application
+- Icons in buttons should be positioned appropriately (left or right)
+- For icon-only buttons, always provide `ariaLabel` prop
+- Icons inherit color from parent - use semantic colors for proper contrast
+
+### Examples
+
+```jsx
+// Icon in a button
+import { Button } from "@vibe/core";
+import { Save } from "@mondaydotcomorg/icons";
+
+Save ;
+
+// Icon with Icon component
+import { Icon } from "@vibe/core";
+import { Check } from "@mondaydotcomorg/icons";
+
+ ;
+
+// Icon-only button with accessibility
+import { IconButton } from "@vibe/core";
+import { Close } from "@mondaydotcomorg/icons";
+
+ ;
+
+// Icon in TextField
+import { TextField } from "@vibe/core";
+import { Search } from "@mondaydotcomorg/icons";
+
+ ;
+```
+
+### Finding Icons
+
+- Browse available icons in Storybook: [Vibe Icons List](https://vibe.monday.com/?path=/story/media-icon--icons-list-story)
+- Use icon metadata to programmatically search and filter icons
+- Icons are exported by their PascalCase name (e.g., `DoubleCheck`, `ArrowRight`, `Close`)
+
+## Colors
+
+The color system helps users identify status, see actions, locate help, and indicate next steps. Colors are designed to be clear and accessible, available in three color themes (light, dark, black).
+
+### Color Usage Rules
+
+**CRITICAL DISTINCTION:**
+
+- **Semantic Colors** - Use for UI elements (buttons, alerts, status indicators, feedback)
+- **Content Colors** - Use ONLY for data visualization (groups, statuses, timeline bars, color coding)
+
+**Important:** Content colors should appear on the board/data visualization and nowhere else in the UI. Never use content colors for UI elements like buttons, alerts, or status indicators.
+
+### Semantic Colors (For UI Elements)
+
+Semantic colors convey meaning and are used for UI components, status indicators, and user feedback.
+
+#### Primary Colors
+
+- `--primary-color` - Main brand color for primary actions
+- `--primary-hover-color` - Hover state for primary elements
+- `--primary-selected-color` - Selected state background
+- `--primary-selected-hover-color` - Selected hover state
+- `--primary-highlighted-color` - Highlighted background
+- `--primary-surface-color` - Surface/container background
+
+#### Status Colors
+
+- `--positive-color` - Success states, positive feedback
+- `--positive-color-hover` - Hover state for positive elements
+- `--positive-color-selected` - Selected positive state
+- `--positive-color-selected-hover` - Selected hover for positive
+
+- `--negative-color` - Error states, destructive actions
+- `--negative-color-hover` - Hover state for negative elements
+- `--negative-color-selected` - Selected negative state
+- `--negative-color-selected-hover` - Selected hover for negative
+
+- `--warning-color` - Warning states, caution indicators
+- `--warning-color-hover` - Hover state for warning elements
+- `--warning-color-selected` - Selected warning state
+- `--warning-color-selected-hover` - Selected hover for warning
+
+#### Other Semantic Colors
+
+- `--inverted-color-background` - Dark background for inverted content
+- `--icon-color` - Default icon color
+- `--fixed-light-color` - Fixed white color
+- `--fixed-dark-color` - Fixed dark color
+
+### Content Colors (For Data Visualization ONLY)
+
+Content colors are used EXCLUSIVELY for color coding purposes like groups, statuses, timeline bars, etc. These colors give understanding and indication of orientation and belonging in data visualization contexts.
+
+**IMPORTANT: Content Color Naming Convention**
+
+Content color names use both **underscores** (`_`) and **dashes** (`-`). This is intentional and must be preserved exactly as specified:
+
+- **Underscores** (`_`) are used in names like: `grass_green`, `egg_yolk`, `working_orange`, `dark_purple`, `dark_indigo`, `american_gray`, `sofia_pink`
+- **Dashes** (`-`) are used in names like: `done-green`, `bright-green`, `dark-orange`, `dark-red`, `stuck-red`, `bright-blue`, `dark-blue`, `chili-blue`
+
+**Always use the exact name as specified** - don't convert underscores to dashes or vice versa. The naming convention is inconsistent by design and must be preserved.
+
+**Available Content Colors:**
+
+- `grass_green` (underscore)
+- `done-green` (dash)
+- `bright-green` (dash)
+- `saladish`
+- `egg_yolk` (underscore)
+- `working_orange` (underscore)
+- `dark-orange` (dash)
+- `peach`
+- `sunset`
+- `stuck-red` (dash)
+- `dark-red` (dash)
+- `sofia_pink` (underscore)
+- `lipstick`
+- `bubble`
+- `purple`
+- `dark_purple` (underscore)
+- `berry`
+- `dark_indigo` (underscore)
+- `indigo`
+- `navy`
+- `bright-blue` (dash)
+- `dark-blue` (dash)
+- `aquamarine`
+- `chili-blue` (dash)
+- `river`
+- `winter`
+- `explosive`
+- `american_gray` (underscore)
+- `blackish`
+- `brown`
+- `orchid`
+- `tan`
+- `sky`
+- `coffee`
+- `royal`
+- `teal`
+- `lavender`
+- `steel`
+- `lilac`
+- `pecan`
+
+**Content Color States:**
+Each content color has three states:
+
+- **Default** - Base color
+- **Hover** - Hover state
+- **Selected** - Selected/active state
+
+### Background Colors
+
+Used for surfaces and containers:
+
+- `--primary-background-color` - Main background
+- `--primary-background-hover-color` - Hover background
+- `--secondary-background-color` - Secondary background
+- `--allgrey-background-color` - Grey background
+- `--ui-background-color` - UI element background
+- `--ui-background-hover-color` - UI hover background
+- `--grey-background-color` - Grey background variant
+- `--disabled-background-color` - Disabled state background
+
+### Text Colors
+
+Used for text content with proper contrast:
+
+- `--primary-text-color` - Main text color
+- `--secondary-text-color` - Secondary text color
+- `--text-color-on-inverted` - Text on dark backgrounds
+- `--text-color-on-primary` - Text on primary color
+- `--text-color-on-brand` - Text on brand color
+- `--placeholder-color` - Placeholder text color
+
+### Border Colors
+
+Used for borders and dividers:
+
+- `--ui-border-color` - UI element borders
+- `--layout-border-color` - Layout borders
+
+### Color Usage Best Practices
+
+- Use semantic colors consistently to indicate status, actions, and feedback in UI
+- **NEVER use content colors for UI elements** - they are only for data visualization
+- Ensure sufficient contrast between text and background colors (4.5:1 for normal text, 3:1 for large text)
+- Use color in combination with other indicators (icons, text) - don't rely on color alone
+- Test color combinations for accessibility across all themes
+- Use appropriate hover and selected states for interactive elements
+
+### Using Color Tokens in Code
+
+**CSS Custom Properties:**
+
+```css
+/* Semantic colors */
+background-color: var(--positive-color);
+color: var(--primary-text-color);
+border-color: var(--ui-border-color);
+
+/* Content colors (for data visualization only) */
+/* IMPORTANT: Preserve exact naming - some use underscores, some use dashes */
+background-color: var(
+ --color-grass-green
+); /* underscore in name */
+background-color: var(--color-done-green); /* dash in name */
+background-color: var(
+ --color-done-green-selected
+); /* with state */
+```
+
+**In React Components:**
+
+```jsx
+// Using semantic colors via props
+Save
+Error message
+
+// Using Box component with semantic colors
+Success message
+
+// Content colors should only be used in data visualization components
+// IMPORTANT: Use exact color names as specified (preserve underscores and dashes)
+Status {/* underscore */}
+Status {/* dash */}
+Status {/* dash */}
+Status {/* underscore */}
+```
+
+## CSS Grid
+
+CSS Grid is a powerful two-dimensional layout system that should be used when you need precise control over both rows and columns simultaneously.
+
+### When to Use CSS Grid vs Flex
+
+**Use CSS Grid when:**
+
+- You need **two-dimensional layouts** (both rows AND columns)
+- You need **precise control** over item placement in a grid
+- You need **complex layouts** with overlapping items
+- You need **responsive grids** with auto-fit/auto-fill
+- You're building **dashboard layouts** or **card grids** with specific column requirements
+
+**Use Flex (with or without wrap) when:**
+
+- You need **one-dimensional layouts** (row OR column)
+- Items should **flow naturally** and wrap based on available space
+- You need **simple responsive layouts** that adapt to content
+- You're building **toolbars, navigation, or lists**
+
+### CSS Grid Best Practices
+
+- **Use design system spacing tokens** - Always use spacing tokens (`var(--space-8)`, `var(--space-16)`, etc.) for grid gaps
+- **Prefer auto-fit/auto-fill** - Use `repeat(auto-fit, minmax(...))` for responsive grids that adapt to container width
+- **Set minimum item widths** - Use `minmax()` with appropriate minimum widths (typically 250px-300px for cards)
+- **Use consistent gaps** - Apply consistent gap values using spacing tokens
+- **Wrap in Box component** - Use `Box` component for grid containers to leverage padding and other utilities
+- **Consider accessibility** - Ensure grid layouts maintain logical reading order
+
+### CSS Grid Examples
+
+**Responsive Card Grid:**
+
+```jsx
+import { Box } from "@vibe/core";
+
+
+
+ {cards.map(card => (
+
+ ))}
+
+ ;
+```
+
+**Fixed Column Grid:**
+
+```jsx
+
+
+ Column 1
+ Column 2
+ Column 3
+
+
+```
+
+**Responsive Grid with Breakpoints:**
+
+```jsx
+
+
+ {items.map(item => (
+
+ ))}
+
+
+```
+
+**Grid with Different Row/Column Gaps:**
+
+```jsx
+
+ {items.map(item => (
+
+ ))}
+
+```
+
+**Dashboard Layout Grid:**
+
+```jsx
+
+
+ Header
+ Main Content
+ Sidebar
+ Footer
+
+
+```
+
+### CSS Grid Auto-Fit Patterns
+
+**Common auto-fit patterns using spacing tokens:**
+
+```jsx
+// Small cards (120px minimum)
+gridTemplateColumns: "repeat(auto-fit, minmax(120px, 1fr))";
+
+// Medium cards (180px minimum) - recommended for most card grids
+gridTemplateColumns: "repeat(auto-fit, minmax(180px, 1fr))";
+
+// Large cards (240px minimum)
+gridTemplateColumns: "repeat(auto-fit, minmax(240px, 1fr))";
+
+// Extra large cards (300px minimum)
+gridTemplateColumns: "repeat(auto-fit, minmax(300px, 1fr))";
+```
+
+### Grid vs Flex Wrap Decision Guide
+
+**Choose Flex Wrap when:**
+
+- Items have **variable widths** and should flow naturally
+- You want **simple responsive behavior** without precise control
+- Items should **wrap based on available space** automatically
+- You're building **tag lists, button groups, or flexible toolbars**
+
+**Choose CSS Grid when:**
+
+- You need **specific column counts** or **equal-width columns**
+- You need **precise control** over item placement
+- You're building **dashboard layouts** or **complex multi-column layouts**
+- You need **different row and column gaps**
+- You need **overlapping items** or **complex positioning**
+
+### Grid Best Practices
+
+- **Always use spacing tokens** - Never use arbitrary pixel values for gaps
+- **Set appropriate minimum widths** - Use `minmax()` with sensible minimums (250px-300px for cards)
+- **Test responsive behavior** - Ensure grids work well at all screen sizes
+- **Use Box for containers** - Wrap grid containers in `Box` for padding and other utilities
+- **Maintain accessibility** - Ensure grid items maintain logical tab order
+- **Consider content density** - Don't make grids too dense; use appropriate gaps
+- **Use auto-fit for responsive** - Prefer `auto-fit` or `auto-fill` over fixed column counts for responsive layouts
+
+## Spacing
+
+### Spacing Scale
+
+The spacing scale includes: 4px (xs), 8px (small), 12px, 16px (medium), 20px, 24px (large), 32px, 40px, 48px, 64px
+
+### Spacing Best Practices
+
+- Stay consistent with paddings and sizes across similar UI patterns.
+- Group similar items together using similar spacing.
+- The distance between elements creates semantic meaning: elements placed close together are assumed to be related.
+- Use larger spacing around elements to emphasize their importance.
+- Use small-sized spacing to group related items together.
+- Use the same spacing for similar items or patterns.
+
+## Shadows
+
+Shadows express the level of elevation between surfaces and must be used consistently. Virtual light in the platform always comes from the top and creates shadows from layout and UI elements like in the real world.
+
+### Shadow Levels
+
+Shadows are available in four levels:
+
+- **XS** (`xs`) - Subtle shadow for slight elevation
+- **Small** (`small`) - Light shadow for cards and hover states
+- **Medium** (`medium`) - Moderate shadow for elevated elements
+- **Large** (`large`) - Strong shadow for high elevation (modals, dialogs)
+
+### Shadow Tokens
+
+**CSS Custom Properties:**
+
+```css
+/* Shadow tokens */
+box-shadow: var(--box-shadow-xs); /* XS shadow */
+box-shadow: var(--box-shadow-small); /* Small shadow */
+box-shadow: var(--box-shadow-medium); /* Medium shadow */
+box-shadow: var(--box-shadow-large); /* Large shadow */
+```
+
+**In React Components:**
+
+```jsx
+// Using Box component with shadow prop
+Card content
+Elevated card
+Modal-like elevation
+
+// Shadow values: "xs", "small", "medium", "large"
+```
+
+### Shadow Usage Guidelines
+
+- **Use shadows to explain interactions** - Shadows indicate hover states, drag states, and elevation levels.
+- **Items with the same shadow cannot occupy the same space** - Different elevation levels require different shadow values.
+- **Virtual light always comes from the top** - All shadows are cast downward.
+- **Use consistent shadow levels** - Similar UI elements should use the same shadow level throughout your application.
+- **Hover states** - Use `small` or `medium` shadow to indicate hover elevation.
+- **Cards and containers** - Use `small` or `medium` shadow for card-like components.
+- **Modals and dialogs** - Use `large` shadow for maximum elevation.
+- **Drag interactions** - Use `medium` or `large` shadow to indicate elements being dragged.
+- **Don't overuse shadows** - Too many shadows create visual noise. Use shadows purposefully to indicate hierarchy.
+
+### Shadow Best Practices
+
+- **Start with no shadow** - Only add shadows when elevation needs to be communicated.
+- **Use progressive elevation** - Increase shadow level as elements get closer to the user (hover, active, dragged states).
+- **Maintain consistency** - Use the same shadow level for similar UI patterns across your application.
+- **Consider context** - Shadows should be subtle enough not to distract but visible enough to communicate elevation.
+- **Test across themes** - Shadow appearance varies across light, dark, and black themes - ensure they work in all contexts.
+
+---
+
+# Visual Design & Aesthetic Guidelines
+
+This section provides comprehensive aesthetic principles for creating clean, minimalist interfaces that align with the Vibe Design System's minimalist nature.
+
+## Minimalist Design Principles
+
+- Default to clean, uncluttered layouts
+- Use white space as a design element
+- Prefer subtle over bold visual treatments
+- Let content breathe with adequate spacing tokens
+- Avoid visual noise and unnecessary decorations
+
+## Color Usage Philosophy
+
+- Use colors sparingly and purposefully
+- Default to transparent/white backgrounds unless there's a specific need
+- Use semantic colors only when meaning needs to be conveyed (status, actions, feedback)
+- Avoid colored backgrounds for containers - use borders or white space instead
+- Never use content colors for UI elements
+- Use subtle background colors only when grouping related content
+
+## Spacing and White Space
+
+- Use generous white space to create visual breathing room
+- **Always use spacing tokens** - Never use pixel values directly
+- **CSS Custom Properties**: Use `var(--space-4)`, `var(--space-8)`, `var(--space-16)`, `var(--space-24)`, etc.
+- **React Component Props** (Box, Flex): Use `xs`, `small`, `medium`, `large` which map to tokens internally
+- Available spacing tokens: `space-2` (2px), `space-4` (4px), `space-8` (8px), `space-12` (12px), `space-16` (16px), `space-20` (20px), `space-24` (24px), `space-32` (32px), `space-40` (40px), `space-48` (48px), `space-64` (64px), `space-80` (80px)
+- Group related items with smaller spacing tokens (`space-8` or `space-16` / `small` or `medium` props)
+- Separate distinct sections with larger spacing tokens (`space-24`, `space-32`, or `space-48` / `large`, `xl`, or `xxl` props)
+- Never let content touch container edges - always add padding using spacing tokens (`padding="medium"` or `padding="large"` / `var(--space-16)` or `var(--space-24)`)
+- Use spacing tokens to create hierarchy, not just colors
+- **In CSS, always use**: `var(--space-8)`, `var(--space-16)`, `var(--space-24)` instead of `8px`, `16px`, `24px`
+- **In React props, always use**: `gap="small"`, `padding="medium"`, `margin="large"` instead of `gap={8}`, `padding={16}`, `margin={24}`
+
+## Visual Hierarchy Without Color
+
+- Use typography (size, weight) to establish hierarchy
+- Use spacing tokens to group and separate content (`gap="small"` for related items, `gap="large"` for sections)
+- Use subtle borders (not colored backgrounds) to define sections
+- Use shadows sparingly and only for elevation (modals, cards on hover)
+- Let the content structure create visual flow
+
+## Container and Background Guidelines
+
+- Default containers should be transparent or use `primaryBackgroundColor` (white/light)
+- Avoid colored backgrounds unless grouping related content
+- Use subtle borders (`border` prop) instead of colored backgrounds for separation
+- Use `secondaryBackgroundColor` sparingly, only for subtle grouping
+- Never use multiple background colors on the same page unnecessarily
+
+## Border Usage
+
+- Use borders to define sections, not colored backgrounds
+- Prefer subtle borders (`border` prop) over heavy visual treatments
+- Use borders sparingly - white space often works better
+- Borders should be subtle and functional, not decorative
+
+## Shadow Usage
+
+- Use shadows only for elevation (modals, dialogs, cards on hover)
+- Avoid shadows for decorative purposes
+- Use the smallest shadow level that achieves the effect (`xs` or `small` for most cases)
+- Don't use shadows to create depth where spacing tokens would work better
+
+## Typography-Based Hierarchy
+
+- Use Heading sizes (H1, H2, H3) to establish clear hierarchy
+- Use Text types (text1, text2, text3) consistently
+- Use weight (normal, medium, bold) sparingly for emphasis
+- Let typography create visual interest, not colors
+
+## Layout Cleanliness
+
+- Keep layouts simple and uncluttered
+- Use consistent alignment (left-align text, consistent button placement)
+- Avoid mixing too many visual styles on one page
+- Group related functionality together with appropriate spacing tokens (`gap="small"` or `gap="medium"`)
+- Use clear visual separation between sections with spacing tokens (`gap="large"` or `gap="xl"`)
+
+## Visual Balance and Composition
+
+- **Balance visual weight** - Distribute elements evenly across the layout to create visual harmony
+- **Create focal points** - Use size, spacing, or subtle emphasis to guide attention to important elements
+- **Avoid visual clutter** - Remove unnecessary elements that compete for attention
+- **Use symmetry and asymmetry intentionally** - Symmetrical layouts feel stable; asymmetrical layouts create interest
+- **Balance heavy and light elements** - Large headings, images, or buttons should be balanced with lighter text and white space
+- **Group related elements** - Use proximity (spacing tokens) to create visual groups that feel cohesive
+- **Create visual breathing room** - Don't fill every pixel; let the layout breathe with generous spacing
+
+## Content Density Guidelines
+
+- **Match density to context** - Dense layouts for data-heavy interfaces (tables, dashboards); spacious layouts for content-focused pages
+- **Use consistent density** - Maintain similar content density throughout related sections
+- **Balance information and space** - Too dense feels overwhelming; too sparse feels empty
+- **Progressive disclosure** - Show essential information first, reveal details on demand
+- **Consider user goals** - Quick scanning needs denser layouts; reading needs more space
+- **Use spacing tokens to control density** - Smaller gaps (`gap="small"`) for dense layouts, larger gaps (`gap="large"`) for spacious layouts
+
+## Visual Rhythm and Patterns
+
+- **Create consistent patterns** - Repeat spacing, sizing, and styling patterns throughout the interface
+- **Establish visual rhythm** - Use consistent spacing intervals (e.g., `space-16` between items, `space-32` between sections)
+- **Maintain pattern consistency** - Once you establish a pattern (e.g., card padding), use it consistently
+- **Use repetition for familiarity** - Similar components should look and behave similarly
+- **Break patterns intentionally** - Use variation sparingly to draw attention to important elements
+- **Create visual flow** - Guide the eye through the interface using consistent spacing and alignment
+
+## Card Design Best Practices
+
+- **Use consistent card padding** - Apply `padding="medium"` or `padding="large"` consistently across cards
+- **Maintain card spacing** - Use `gap="medium"` or `gap="large"` between cards in grids
+- **Keep card content scannable** - Use clear typography hierarchy and adequate spacing within cards
+- **Use subtle borders or shadows** - Prefer `border` prop or `shadow="small"` for card definition, not colored backgrounds
+- **Maintain card proportions** - Keep card sizes consistent within a grid or list
+- **Group related card content** - Use `Flex` with `gap="small"` to group related information within cards
+- **Avoid over-styling cards** - Let content be the focus, not decorative elements
+
+## Visual Flow and Eye Movement
+
+- **Guide the eye naturally** - Place important elements where users naturally look (top-left, center)
+- **Use visual hierarchy to create flow** - Larger, bolder elements draw attention first
+- **Create clear entry points** - Use headings, spacing, and alignment to guide users into content
+- **Maintain reading flow** - Left-align text (in LTR languages) for natural reading patterns
+- **Use spacing to create pauses** - Larger spacing (`gap="large"`) creates visual pauses between sections
+- **Balance visual weight** - Distribute important elements evenly to avoid visual imbalance
+- **Create clear paths** - Use alignment and spacing to create clear visual paths through the interface
+
+## Alignment and Grid Systems
+
+- **Maintain consistent alignment** - Align related elements to create visual order
+- **Use grid systems for structure** - CSS Grid or Flex with consistent spacing creates visual harmony
+- **Align to a baseline** - Keep text and elements aligned to create a clean, professional look
+- **Use consistent margins** - Apply consistent spacing tokens for margins and padding
+- **Create visual columns** - Use consistent widths and spacing to create implied columns
+- **Respect the grid** - Don't break alignment unless intentionally creating emphasis
+- **Use Flex and Grid for alignment** - Leverage `justify` and `align` props for precise alignment
+
+## Visual Consistency
+
+- **Maintain consistent spacing** - Use the same spacing tokens for similar elements throughout
+- **Use consistent component sizes** - Keep button sizes, input heights, and spacing consistent
+- **Apply consistent styling** - Similar elements should look and behave similarly
+- **Create visual language** - Establish patterns (spacing, borders, shadows) and use them consistently
+- **Avoid one-off styles** - If you style something one way, apply that style consistently
+- **Use design tokens** - Always use spacing tokens, color tokens, and shadow tokens for consistency
+
+## Common Anti-Patterns to Avoid
+
+- ❌ Using colored backgrounds when white space would work
+- ❌ Overusing borders and shadows
+- ❌ Creating visual hierarchy with colors instead of typography/spacing tokens
+- ❌ Using multiple background colors unnecessarily
+- ❌ Tight spacing that makes content feel cramped (use appropriate spacing tokens)
+- ❌ Inconsistent spacing throughout the interface (use spacing tokens consistently)
+- ❌ **Using pixel values instead of spacing tokens** (`gap={8}` instead of `gap="small"`, `padding={16}` instead of `padding="medium"`, `margin: 16px` instead of `margin: var(--space-16)`)
+- ❌ Using content colors for UI elements
+- ❌ Adding decorative elements that don't serve a purpose
+- ❌ Creating unbalanced layouts with uneven visual weight distribution
+- ❌ Mixing dense and sparse layouts inconsistently
+- ❌ Breaking visual patterns without clear purpose
+- ❌ Inconsistent card designs within the same interface
+- ❌ Poor alignment that creates visual chaos
+- ❌ Ignoring visual flow and natural eye movement patterns
+
+## Examples: Good vs Bad
+
+**Good: Clean layout with white space and subtle borders using spacing tokens**
+
+```jsx
+
+
+ Section Title
+ Content here
+
+
+```
+
+**Bad: Overuse of colored backgrounds**
+
+```jsx
+
+
+ Content
+
+
+```
+
+**Good: Typography-based hierarchy with proper spacing tokens**
+
+```jsx
+
+ Main Title
+
+ Subsection
+ Content
+
+
+```
+
+**Bad: Color-based hierarchy**
+
+```jsx
+
+ Content
+
+```
+
+**Good: Consistent, generous spacing using tokens**
+
+```jsx
+
+ {items.map(item => (
+
+ Item
+
+ ))}
+
+```
+
+**Bad: Inconsistent spacing or using pixel values**
+
+```jsx
+
+ {items.map(item => (
+
+ Item
+
+ ))}
+
+```
+
+**Good: Balanced card layout with consistent spacing and visual rhythm**
+
+```jsx
+
+
+ {cards.map(card => (
+
+
+ {card.title}
+ {card.description}
+
+
+ ))}
+
+
+```
+
+**Bad: Unbalanced layout with inconsistent card styling**
+
+```jsx
+
+
+ {cards.map(card => (
+
+ {card.title}
+ {card.description}
+
+ ))}
+
+
+```
+
+**Good: Visual flow with clear hierarchy and spacing**
+
+```jsx
+
+
+ Page Title
+
+ Section Title
+
+ First paragraph with adequate spacing.
+ Second paragraph maintains visual rhythm.
+
+
+
+
+```
+
+**Bad: Poor visual flow with inconsistent spacing**
+
+```jsx
+
+ Page Title
+ Section Title
+ Content without proper spacing hierarchy.
+ Creates visual confusion.
+
+```
+
+---
+
+# Component Guidelines
+
+## Button
+
+Replacing Figma-Imported Buttons
+
+Figma code imports often produce raw elements with custom Tailwind classes. These must be converted to the appropriate @vibe/core component:
+
+### Import
+
+```js
+import { Button } from "@vibe/core";
+```
+
+### Usage
+
+- Buttons may contain icons on the left or right side.
+- Use 8px spacing between buttons.
+- Replace text with a loader if action is submitted but still processing.
+- Button width is set by its content; avoid changing its width.
+- Use only one primary button, and any remaining calls to action should be represented as lower emphasis buttons.
+
+### Variants
+
+**Kinds:**
+
+- **Primary** - Used for the main action on a page or in a section
+- **Secondary** - Used for alternative or supporting actions
+- **Tertiary** - Used for the least important actions
+
+**Sizes:** Small, Medium, Large
+
+**States:** Regular, Hover, Active, Disabled, Loading, Success
+
+### Accessibility
+
+- Using an `id` is recommended for all instances to ensure proper label association.
+- Always provide descriptive text content for buttons, or use `ariaLabel` prop when buttons contain only icons.
+- Use `ariaLabel` prop when you need to provide a custom accessible name that differs from the visible button text.
+- Use `ariaLabeledBy` prop when an external element provides the accessible name.
+- Use `ariaHasPopup` prop when the button triggers a popup menu or dialog.
+- Use `ariaExpanded` prop to indicate when a popup triggered by the button is open or closed.
+
+### Best Practices
+
+- Use 1 or 2 words, no longer than 4 words, with fewer than 20 characters including spaces.
+- Don't use punctuation marks such as periods or exclamation points.
+- Use sentence-case capitalization (not title case or all caps).
+- Use primary button as the main action; put tertiary as the second option.
+- Use active verbs or phrases that clearly indicate action (avoid vague labels like "Yes" or "No").
+
+## TextField
+
+An input field includes a label and a text field users can type text into. They typically appear in forms and dialogs.
+
+### Import
+
+```js
+import { TextField } from "@vibe/core";
+```
+
+### Usage
+
+- Always use placeholder in input field.
+- Icons can be used to message alerts as well. Pair them with error messages to provide redundant alerts.
+- Character or word counters should be used if there is a character or word limit.
+
+### Variants
+
+**Sizes:** Small (32px), Medium (40px), Large (48px)
+
+**States:** Default, Focus, Disabled, Error, Success
+
+### Accessibility
+
+- Using an `id` is highly recommended for all instances to ensure the best accessibility.
+- Always provide a visible `title` or an `inputAriaLabel` to ensure the input's purpose is clear.
+- When using `title` or validation text, you must also provide an `id`.
+- For required fields, use the `required` prop.
+- Provide descriptive error messages using `validation` prop with status 'error'.
+- When using icons, provide meaningful labels through `iconsNames.primary` and `iconsNames.secondary` props.
+- For search inputs, use `type='search'` and provide `searchResultsContainerId`.
+
+### Best Practices
+
+- Make sure your text field has a short, descriptive label above it.
+- Avoid phrasing your labels as questions. Keep labels concise; reserve instructions for helper text.
+- Use the help text description to convey requirements or show formatting examples.
+- Avoid repeating the field label in help text if the label provides sufficient context.
+
+## Dropdown (New)
+
+Dropdown presents a list of options from which a user can select one or several.
+
+### Import
+
+```js
+import { Dropdown } from "@vibe/core/next";
+```
+
+**Note:** Use the new Dropdown from `@vibe/core/next`, not the deprecated one from `@vibe/core`.
+
+### Usage
+
+- Dropdown menus are typically used when you have 5-8 items to choose from.
+- Use a consistent size of form components on the same page.
+- Avoid having multiple lines of text in a dropdown. If text is too long, add an ellipsis (…).
+- When the menu is open, each option should be the same height as the field.
+- When organizing dropdown menu items, sort the list logically by putting the most selected option at the top.
+
+### Variants
+
+**Sizes:** Small, Medium, Large
+
+**States:** Default, Disabled, Readonly, Multi-select
+
+### Accessibility
+
+- Using an `id` is highly recommended for all instances.
+- Always provide a `label` prop to ensure the dropdown's purpose is clear.
+- Use `ariaLabel` prop when you need to provide a custom accessible name.
+- Use `clearAriaLabel` prop when dropdown is clearable.
+- Use `inputAriaLabel` prop for searchable dropdowns.
+- Use `menuAriaLabel` prop for the dropdown menu.
+- Use `autoFocus` prop when the dropdown should receive initial focus.
+
+### Best Practices
+
+- Use the dropdown as a closed component. Users should normally be allowed only to click on the items.
+- Don't keep the dropdown component in open mode as permanent state. If this is required, consider using Combobox instead.
+
+## Modal
+
+Modals help users focus on a single task or piece of information by popping up and blocking the rest of the page's content.
+
+### Import
+
+```ts
+import {
+ Modal,
+ ModalHeader,
+ ModalContent,
+ ModalMedia,
+ ModalFooter,
+ ModalFooterWizard,
+ ModalBasicLayout,
+ ModalSideBySideLayout,
+ ModalMediaLayout,
+} from "@vibe/core/next";
+```
+
+**Note:** Import Modal components from `@vibe/core/next`, not from `@vibe/core`.
+
+### Usage
+
+- Use modals only when you need the user's full, immediate attention.
+- Modals are centered on the page. The rest of the page is dimmed to put the modal in focus.
+- All modals must have a title, a call to action, and a close button.
+- By default, users can close modals by clicking the close button, clicking outside the modal, or pressing ESC.
+
+### Modal Structure
+
+Always use the proper modal layout components:
+
+**Basic Modal Layout:**
+
+```jsx
+
+
+
+ {/* Your content here - ModalContent includes default padding */}
+
+
+
+ Cancel
+
+ Save
+
+
+
+
+```
+
+**Side-by-Side Modal Layout:**
+
+```jsx
+
+
+
+ {/* Left side content */}
+ {/* Right side media content */}
+ {/* Footer content */}
+
+
+```
+
+**Media Modal Layout:**
+
+```jsx
+
+
+
+ {/* Media content at top */}
+ {/* Text content below media */}
+ {/* Footer content */}
+
+
+```
+
+### Modal Types
+
+**Basic Modal:** Intended for straightforward tasks, like selecting items or gathering basic information. Does not support images or videos.
+
+**Side-by-Side Modal:** Offers two distinct sections - left for text/inputs, right for supporting visuals. Ideal when users need to reference media alongside information.
+
+**Media Modal:** Includes a highlighted media section followed by text, perfect for grabbing attention with visuals. Ideal for introducing new features or onboarding.
+
+### Padding and Spacing
+
+- **ModalContent automatically includes padding** - You don't need to add extra padding to content inside `ModalContent`.
+- **If wrapping content in Box inside ModalContent**, use minimal padding (xs or small) as `ModalContent` already provides base padding.
+- **ModalHeader and ModalFooter** have their own internal padding - don't add extra padding to these components.
+- **Form fields inside modals** should use consistent spacing (typically 16px gap between fields).
+- **ModalFooter buttons** should use `ButtonGroup` for proper spacing (8px between buttons).
+- **For custom layouts**, wrap content in `Box` with appropriate padding (typically `medium` or `large`).
+
+### Accessibility
+
+- **Scroll lock:** Prevents background content from scrolling while modal is open.
+- **Focus lock:** Keeps focus within the modal elements, preventing tabbing outside.
+- **ARIA attributes:** Using `ModalHeader` with string values for `title` and `description` automatically sets necessary ARIA attributes.
+- **Manual ARIA:** If passing ReactNode as title/description, assign unique `id` and pass to Modal using `aria-labelledby` or `aria-describedby`.
+- **Always provide a close button** - Users must be able to dismiss the modal.
+- **Focus management:** Focus automatically moves to the first focusable element when modal opens and returns to trigger element when closed.
+
+### Best Practices
+
+- **Modal must include backdrop element** - Always use the backdrop prop or ensure backdrop is enabled.
+- **Use proper layout components** - Always use `ModalBasicLayout`, `ModalSideBySideLayout`, or `ModalMediaLayout` instead of manually structuring modal content.
+- **Keep modals focused** - Each modal should handle one task or decision. Don't create complex multi-step flows in a single modal.
+- **Use Skeleton component if loading is needed** - Try to have actions appear immediately.
+- **Don't use Loader component for necessary loading** - Use Skeleton for better UX.
+- **Use one primary button as your main call to action** - For extra buttons use the tertiary button.
+- **Don't use more than one primary button** - Only one primary action per modal.
+- **Button placement** - Primary action should be on the right (in left-to-right languages), secondary/tertiary on the left.
+- **Modal width** - Use default modal width unless content specifically requires more space. Don't make modals too wide (max recommended: 600px for basic modals).
+- **Modal height** - Let content determine height, but ensure modals don't exceed viewport height. Use scrollable content if needed.
+- **Loading states** - Show loading states within the modal content, not as a blocking loader.
+- **Error handling** - Display errors within the modal content, not as separate modals.
+- **Form validation** - Validate forms before submission. Show validation errors inline within the form.
+- **Confirmation modals** - Use clear, action-oriented language. Make destructive actions clearly distinguishable.
+
+## Menu
+
+A menu is a navigable contextual list of items that can be selected.
+
+### Import
+
+```js
+import { Menu } from "@vibe/core";
+```
+
+### Usage
+
+- A menu offers a list of actions or functions that a user can access.
+- Menu height is dynamic according to the content it contains and its location on the screen.
+- Closing menus can be done by selecting a value or clicking anywhere outside the menu.
+- Menu items can include icons, radio buttons, and checkboxes.
+- If a menu dropdown contains a mix of links and buttons, separate them with a content divider with links at the top and buttons at the bottom.
+- Menu should contain at least two menu items.
+
+### Variants
+
+**Sizes:** Small, Medium, Large
+
+### Accessibility
+
+- Provide an `id` for the Menu to enable proper accessibility associations.
+- Use the `ariaLabel` prop to provide a meaningful accessible name.
+- Use the `ariaDescribedBy` prop to link the menu to additional descriptive text.
+- It is recommended to use `focusItemIndexOnMount={0}` to focus the first menu item when the menu opens.
+- Ensure menu items have clear, descriptive text or use appropriate `ariaLabel` props on individual menu items.
+
+### Best Practices
+
+- Use menus for simple actions.
+- Don't place a search component near menu for filter capability. Use Combobox instead.
+- Keep to the default menu width.
+- Don't change the width of the menu, only change the height.
+
+## Table
+
+Tables are used to organize data, making it easier to understand.
+
+### Import
+
+```js
+import { Table, TableHeader, TableHeaderCell, TableBody, TableRow, TableCell } from "@vibe/core";
+```
+
+### Usage
+
+- Tables organize data in rows and columns for easy scanning and comparison.
+- Use tables when you need to display structured data with multiple attributes.
+
+### Variants
+
+**Sizes:** Small (32px), Medium (40px), Large (48px)
+
+**Borders:** With or without outer border. When using a table inside another component (like a modal), remove the outer border for a cleaner look.
+
+### Best Practices
+
+- If there's a need to insert an icon, use for all columns.
+- Don't use icons if not applied to all column titles.
+- If there's a need, remove only the outer border.
+- Don't remove border between the rows.
+
+## Tabs
+
+Tabs allow users to navigate between related views of content while remaining in the context of the page.
+
+### Import
+
+```js
+import { Tabs, TabPanel, TabPanels, TabList, Tab, TabsContext } from "@vibe/core";
+```
+
+### Usage
+
+- Tabs organize and allow navigation between groups of content that are related and at the same level of hierarchy.
+- Align navigation tabs and content tabs left (in left-to-right languages) and never center within a page or content area.
+- The first tab is selected by default. The default tab is the most important use case of the page.
+- Stick to only one row of tabs.
+
+### Variants
+
+**Types:** Default (compact), Stretched, Stretched Underline
+
+### Accessibility
+
+- Provide an `id` for the `TabList` and individual `Tab` components.
+- Ensure each `Tab` has clear, descriptive text content or appropriate icon with accessible name.
+- Use the `tabPanelIds` prop in `TabList` to establish proper relationships between tabs and their corresponding tab panels.
+- Provide unique `id` props for each `TabPanel`.
+
+### Best Practices
+
+- Use either all text labels, all icon labels, or both, across all labels.
+- Don't mix tabs that contain only text with tabs that contain only icons.
+- When there are too many tabs to fit horizontally, use a "More" dropdown.
+- Do not cut the tabs name just to make them fit horizontally.
+
+## Checkbox
+
+Checkboxes allow users to select one or more items from a set of options.
+
+### Import
+
+```js
+import { Checkbox } from "@vibe/core";
+```
+
+### Usage
+
+- Use checkboxes to select one or more options from a list.
+- Use checkboxes to turn an item on or off in a desktop environment.
+- Use checkboxes independently from each other: selecting one checkbox shouldn't change the selection status of another checkbox in the list (except for bulk selection).
+- Ensure both label and input are clickable to select the checkbox field.
+- Keep a positive tone of voice. For example: "Turn on notifications" instead of "Turn off notifications".
+- Checkboxes should be listed according to a logical order.
+- Place checkboxes vertically, using 16px spacing.
+- Checkbox will always appear with a label.
+
+### Variants
+
+**States:** Regular, Hover, Selected, Disabled, Indeterminate
+
+### Accessibility
+
+- Using an `id` is highly recommended for all instances.
+- Always provide a visible `label` prop.
+- It is recommended to use `separateLabel` mode for better screen reader support.
+- Use `ariaLabel` prop when you need to provide a custom accessible name.
+- Use `ariaLabelledBy` prop when the checkbox is described by external elements.
+- Use `indeterminate` prop for mixed selection states.
+
+### Best Practices
+
+- Use checkboxes when one or more items can be selected.
+- Don't use checkboxes when only one item can be selected from a list. Use radio buttons instead.
+- Use the checkbox label's prop to describe the option purpose.
+- Don't use a separate div which is not related to the Checkbox component.
+- Place the checkbox on the left side of the label.
+- Always keep a positive tone of voice.
+
+## Box
+
+Box component is used as a wrapper component for scaffolding compositions while using Vibe's prop keys without writing new CSS.
+
+### Import
+
+```js
+import { Box } from "@vibe/core";
+```
+
+### Usage
+
+- Use as a styled container.
+- Use to add spacing, borders, and rounded corners to areas of content.
+- Use as an inner component for spacing or styles.
+- Prefer Box over custom CSS for styling containers.
+
+### Utility Props
+
+**Background Colors:** Use `backgroundColor` prop with semantic color tokens (e.g., `"primaryBackgroundColor"`, `"positiveSelected"`, `"negativeSelected"`).
+
+**Text Colors:** Use `color` prop with text color tokens (e.g., `"primaryTextColor"`, `"secondaryTextColor"`).
+
+**Border:** Use `border` prop (boolean) or `borderWidth` with size values.
+
+**Border Color:** Use `borderColor` prop with color tokens.
+
+**Rounded Corners:** Use `rounded` prop with size values (xs, small, medium, large).
+
+**Shadow:** Use `shadow` prop with shadow level values.
+
+**Margin:** Use `margin`, `marginX`, `marginY`, `marginTop`, `marginEnd`, `marginBottom`, `marginStart` props with spacing values (xs, small, medium, large, or custom px).
+
+**Padding:** Use `padding`, `paddingX`, `paddingY`, `paddingTop`, `paddingEnd`, `paddingBottom`, `paddingStart` props with spacing values.
+
+**Scrollable:** Use `scrollable` prop for scrollable containers.
+
+### Examples
+
+```jsx
+// Container with border and padding
+
+ Content here
+
+
+// Scrollable container
+
+
+ {items.map(item => )}
+
+
+
+// Box with semantic background color
+
+ Success message
+
+```
+
+## Flex
+
+Use Flex component to position group of sub-elements in one dimension, horizontal or vertical, without being dependent on a custom CSS file.
+
+### Import
+
+```js
+import { Flex } from "@vibe/core";
+```
+
+### Usage
+
+- Use flex component whenever you want to define a layout with one dimension.
+- Flex layout can be either horizontal or vertical.
+- You can define the spacing between the layout children by using fixed sizes: xs (4px), small (8px), medium (16px), or large (24px).
+- You can also use custom pixel values for gap (e.g., `gap={32}`).
+
+### Variants
+
+**Directions:** Row (horizontal, default), Column (vertical)
+
+**Spacing:** xs (4px), small (8px), medium (16px), large (24px), or custom number in px
+
+**Justify (horizontal alignment):** start, center, end, space-between, space-around, stretch
+
+**Align (vertical alignment):** start, center, end, stretch, baseline
+
+**Wrap:** Use `wrap` prop for multi-line layouts
+
+### Flex Wrap - Responsive Multi-Line Layouts
+
+Flex wrap allows items to wrap to multiple lines when they don't fit in a single row or column. This is essential for responsive layouts.
+
+**When to Use Flex Wrap:**
+
+- **Card grids** - When displaying multiple cards that should wrap to new rows
+- **Tag lists** - When tags should wrap to multiple lines
+- **Button groups** - When buttons should wrap on smaller screens
+- **Responsive toolbars** - When toolbar items should wrap on mobile
+- **Any collection** - When items need to flow naturally and wrap based on container width
+
+**Flex Wrap Best Practices:**
+
+- **Always use consistent gap** - Use `gap` prop to maintain spacing between wrapped items (both horizontal and vertical)
+- **Set minimum item widths** - Use `minWidth` on child items to control when wrapping occurs
+- **Use appropriate gap sizes** - Typically `small` (8px) or `medium` (16px) for wrapped layouts
+- **Consider item sizing** - Items should have consistent or flexible widths for predictable wrapping
+- **Test responsive behavior** - Ensure wrapping works well at different screen sizes
+
+**Flex Wrap Examples:**
+
+```jsx
+// Card grid with wrapping
+
+
+ {cards.map(card => (
+
+
+
+ ))}
+
+
+
+// Tags/chips that wrap
+
+ {tags.map(tag => (
+ {tag.label}
+ ))}
+
+
+// Responsive button group
+
+ Primary Action
+ Secondary
+ Tertiary
+
+
+// Responsive toolbar
+
+
+
+ Filter
+ Sort
+
+ Export
+
+
+// Form fields that wrap on mobile
+
+
+
+
+
+
+
+
+
+
+```
+
+**Flex Wrap with Item Sizing:**
+
+```jsx
+// Items with flexible sizing - will wrap when container is too narrow
+
+ {/* Each item takes equal space, minimum 250px, wraps when needed */}
+ {items.map(item => (
+
+
+
+ ))}
+
+
+// Fixed width items that wrap
+
+ {badges.map(badge => (
+
+ {badge.label}
+
+ ))}
+
+```
+
+**Common Flex Wrap Patterns:**
+
+- **Equal-width cards:** Use `flex="1 1 300px"` with `minWidth={300}` on each card
+- **Fixed-width items:** Set explicit width on items, they'll wrap naturally
+- **Responsive columns:** Use `flex="1 1 250px"` for items that should be 2-3 per row on desktop, 1 per row on mobile
+- **Flexible grid:** Use `flex="1 1 auto"` with `minWidth` for items that grow/shrink but wrap when too narrow
+
+### Examples
+
+```jsx
+// Horizontal toolbar
+
+ Action 1
+ Action 2
+
+
+// Vertical stack
+
+
+
+
+
+// Centered content
+
+
+
+
+// With custom gap
+
+
+
+
+
+// Wrapped layout - cards grid
+
+
+ {items.map(item => (
+
+
+
+ ))}
+
+
+```
+
+## Text
+
+Text component is used for displaying text content with consistent typography.
+
+### Import
+
+```js
+import { Text } from "@vibe/core";
+```
+
+### Usage
+
+- Use Text component instead of raw HTML text elements for consistent typography.
+- Choose appropriate text type (text1, text2, text3) based on hierarchy.
+- Use appropriate weight (light, normal, medium, bold) for emphasis.
+
+## Heading
+
+Heading component is used for displaying headings with consistent typography.
+
+### Import
+
+```js
+import { Heading } from "@vibe/core";
+```
+
+### Usage
+
+- Use Heading component for all headings (h1, h2, h3).
+- Choose appropriate heading type based on hierarchy (h1 for main titles, h2 for section titles, h3 for subsection titles).
+- Use appropriate weight for emphasis.
+
+## AlertBanner
+
+Alert banners show pressing and high-signal messages, such as system alerts. They are meant to be noticed and prompt users to take action.
+
+### Import
+
+```js
+import { AlertBanner, AlertBannerText, AlertBannerLink, AlertBannerButton } from "@vibe/core";
+```
+
+### Usage
+
+- Alert banners should have a call for action and an option to dismiss.
+- Don't include more than one call to action in an alert banner.
+- Place the banner on the top of the screen, and push all other content below it.
+- Use banners for system messages, background processes, and general updates.
+- Don't use banners for notifying a user of an action they have taken. Instead, provide visual feedback with a Toast.
+
+### Variants
+
+**Types:** Primary, Positive, Negative, Warning, Inverted (dark)
+
+**Components:**
+
+- `AlertBannerText` - For the main message text
+- `AlertBannerLink` - For link actions
+- `AlertBannerButton` - For button actions
+
+### Accessibility
+
+- Use the `ariaLabel` prop to provide a descriptive accessible name for the banner.
+- For dismissible AlertBanners, use the `closeButtonAriaLabel` prop for the close button.
+
+### Best Practices
+
+- Use banners for system messages, background processes, and general updates.
+- Don't use banners for user action confirmations (use Toast instead).
+- If two actions are needed, use two different call to actions (link and button).
+- Don't include more than one action of the same type in an alert banner.
+- Use only the 4 color types: primary, negative, positive, and inverted. Keep it consistent.
+
+## AttentionBox
+
+Attention boxes draw attention to important information or actions.
+
+### Import
+
+```js
+import { AttentionBox } from "@vibe/core";
+```
+
+### Usage
+
+- Use attention boxes to highlight important information that users should notice.
+- Can include links or actions within the attention box.
+- Use appropriate component type based on the importance and nature of the information.
+
+## Avatar
+
+Avatar is a graphical representation of a person through a profile picture, image, icon, or set of initials.
+
+### Import
+
+```js
+import { Avatar } from "@vibe/core";
+```
+
+### Usage
+
+- Use an avatar to help a user in the platform efficiently identify another person or a team.
+- When there is no personal photo to show, use initials.
+- If an image fails to load, fall back to the default user avatar.
+- An avatar may contain a status icon to indicate a user's status (working from home, busy, etc.).
+- Use a tooltip or dialog when hovering over the avatar to offer more information (e.g., person's name).
+
+### Variants
+
+**Sizes:** XS, Small, Medium, Large
+
+**Types:**
+
+- Image (`type="img"`) - For profile pictures
+- Text (`type="text"`) - For initials
+- Icon (`type="icon"`) - For icon avatars
+
+**Shapes:** Circular (default), Square (for non-person avatars like workspaces or teams)
+
+**States:** Regular, Disabled (for inactive users)
+
+### Accessibility
+
+- Always provide an `ariaLabel` prop to describe the person or entity represented by the avatar (e.g., "John Smith", "Design Team", "Guest User").
+- Use the `role` prop when the avatar represents something other than a person (e.g., `role="img"` for team avatars, `role="button"` for clickable workspace avatars).
+- For clickable avatars, ensure the `ariaLabel` describes the action that will occur when clicked.
+- For avatars with badges (status indicators), ensure the `ariaLabel` includes relevant status information.
+
+### Best Practices
+
+- Use consistent avatar sizes for common use cases to convey their purpose.
+- Avoid using a mix of avatar sizes that display together and create design imbalance.
+- Use branded generic avatars when a user has not set their avatar image.
+- Don't make assumptions and use gendered placeholder avatars.
+- Use square avatars for non-person entities (workspaces, teams).
+
+## Badge
+
+Badge component is responsible for layout an indicator/counter on a child component.
+
+### Import
+
+```js
+import { Badge, Indicator } from "@vibe/core";
+```
+
+### Usage
+
+- Badge can be of type Indicator or type Counter.
+- Use badges to display status indicators, counts, or labels on other components.
+- Badges are small and unobtrusive.
+
+### Variants
+
+**Types:**
+
+- **Indicator** - Small dot indicator for status
+- **Counter** - Numeric count badge
+
+**Alignments:**
+
+- **RECTANGULAR** - Use when using Badge on a Button element to attach it to the element
+- **CIRCULAR** - Use when using Badge on an Avatar element to attach it to the element
+- **OUTSIDE** - Use when using Badge on an inline element to attach it to the element
+
+**Anchors:** For circular badges, anchor at the top-right edge.
+
+### Best Practices
+
+- When using the badge on an inline component, apply OUTSIDE alignment to it.
+- Do not leave the indicator inside the element boundaries.
+- Choose a color that does not blend with the one of the child component.
+- Do not use a color that blends with the child component.
+- When using Indicator badge, anchor it at the top-right edge.
+- Do not place it on any other edge.
+
+## BreadcrumbsBar
+
+Breadcrumbs provide navigation context and show the user's location in the hierarchy.
+
+### Import
+
+```js
+import { BreadcrumbsBar } from "@vibe/core";
+```
+
+### Usage
+
+- Use breadcrumbs to show navigation hierarchy.
+- Help users understand where they are and navigate back.
+- Keep breadcrumb labels concise.
+
+## ButtonGroup
+
+ButtonGroup component groups related buttons together with consistent spacing and alignment.
+
+### Import
+
+```js
+import { ButtonGroup } from "@vibe/core";
+```
+
+### Usage
+
+- Use ButtonGroup to group related buttons.
+- Provides consistent spacing and alignment.
+- Supports different alignment options (center, end, justify, stack).
+
+## Chips
+
+Chips allow users to enter information, make selections, filter content, or trigger actions.
+
+### Import
+
+```js
+import { Chips } from "@vibe/core";
+```
+
+### Usage
+
+- Use chips for tags, filters, or selections.
+- Chips can be removable or read-only.
+- Use appropriate colors to convey meaning.
+
+## Combobox
+
+Combobox combines an input field with a dropdown menu, allowing users to type to filter options.
+
+### Import
+
+```js
+import { Combobox } from "@vibe/core";
+```
+
+### Usage
+
+- Use combobox when users need to search and select from a list of options.
+- Ideal for long lists where typing helps users find options quickly.
+- Supports single and multi-select modes.
+
+## Dialog
+
+Dialog component displays modal dialogs for user interactions.
+
+### Import
+
+```js
+import { Dialog } from "@vibe/core";
+```
+
+### Usage
+
+- Use dialogs for focused user interactions.
+- Dialogs block interaction with the rest of the page.
+- Always provide a way to close the dialog (close button, ESC key, or clicking outside).
+
+## Divider
+
+Divider component creates visual separation between content sections.
+
+### Import
+
+```js
+import { Divider } from "@vibe/core";
+```
+
+### Usage
+
+- Use dividers to separate content sections.
+- Can be horizontal or vertical.
+- Use appropriate spacing around dividers.
+
+## Icon
+
+Icon component displays icons from the Vibe icon library. Always use icons from `@mondaydotcomorg/icons` package.
+
+### Import
+
+```js
+import { Icon } from "@vibe/core";
+import { Close, Search, Check } from "@mondaydotcomorg/icons";
+```
+
+### Usage
+
+- **Always use icons from `@mondaydotcomorg/icons`** - Never use other icon libraries
+- Always wrap icons with the `Icon` component for consistent styling
+- Use icons to enhance visual communication
+- Icons should have accessible labels when used alone (use `ariaLabel` prop)
+- Use appropriate icon sizes based on context
+- Icons inherit color from their parent container by default
+
+### Examples
+
+```jsx
+// Basic icon usage
+
+
+// Icon with size
+
+
+// Icon in button
+Save
+```
+
+## IconButton
+
+IconButton is a button that contains only an icon.
+
+### Import
+
+```js
+import { IconButton } from "@vibe/core";
+import { Close, Edit, Delete } from "@mondaydotcomorg/icons";
+```
+
+### Usage
+
+- Use icon buttons for compact actions.
+- **Always use icons from `@mondaydotcomorg/icons`** - Never use other icon libraries
+- Always provide an `ariaLabel` for icon-only buttons.
+- Use appropriate sizes and variants.
+
+### Examples
+
+```jsx
+
+
+
+```
+
+## Link
+
+Link component creates navigable links.
+
+### Import
+
+```js
+import { Link } from "@vibe/core";
+```
+
+### Usage
+
+- Use links for navigation to other pages or sections.
+- Links should be clearly distinguishable from regular text.
+- Use appropriate link styles (underline, color) based on context.
+
+## List
+
+List component displays a list of items.
+
+### Import
+
+```js
+import { List, ListItem, ListItemAvatar, ListItemIcon, ListTitle } from "@vibe/core";
+```
+
+### Usage
+
+- Use lists to display collections of related items.
+- Lists can include avatars, icons, and titles.
+- Maintain consistent spacing between list items.
+
+### Sub-Components
+
+- `List` - Main container component
+- `ListItem` - Individual list item wrapper
+- `ListItemAvatar` - Avatar within a list item
+- `ListItemIcon` - Icon within a list item
+- `ListTitle` - Title/heading for list sections
+
+### Example
+
+```jsx
+import { List, ListItem, ListItemIcon, ListTitle, Text } from "@vibe/core";
+import { User } from "@mondaydotcomorg/icons";
+
+
+
+
+
+ John Doe
+
+
;
+```
+
+## Loader
+
+Loader component displays loading indicators.
+
+### Import
+
+```js
+import { Loader } from "@vibe/core";
+```
+
+### Usage
+
+- Use loaders to indicate that content is loading.
+- Show loaders for async operations.
+- Use appropriate loader sizes based on context.
+
+## RadioButton
+
+RadioButton allows users to select a single option from a set of options.
+
+### Import
+
+```js
+import { RadioButton } from "@vibe/core";
+```
+
+### Usage
+
+- Use radio buttons when only one option can be selected from a group.
+- Radio buttons should be grouped together.
+- Always provide labels for radio buttons.
+
+## Search
+
+Search component provides a search input field.
+
+### Import
+
+```js
+import { Search } from "@vibe/core";
+```
+
+### Usage
+
+- Use search components for filtering or finding content.
+- Provide clear placeholder text.
+- Show search results or feedback when appropriate.
+
+## Skeleton
+
+Skeleton component displays placeholder content while data is loading.
+
+### Import
+
+```js
+import { Skeleton } from "@vibe/core";
+```
+
+### Usage
+
+- Use skeletons to show loading states instead of spinners.
+- Skeletons should match the shape and size of the content being loaded.
+- Prefer skeletons over loaders for better perceived performance.
+
+## Slider
+
+Slider component allows users to select a value from a range.
+
+### Import
+
+```js
+import { Slider } from "@vibe/core";
+```
+
+### Usage
+
+- Use sliders for selecting numeric values within a range.
+- Provide clear labels and value indicators.
+- Support keyboard navigation for accessibility.
+
+## Switch
+
+Switch component allows users to toggle between two states.
+
+### Import
+
+```js
+import { Switch } from "@vibe/core";
+```
+
+### Usage
+
+- Use switches for binary on/off states.
+- Provide clear labels indicating what the switch controls.
+- Use switches instead of checkboxes for settings or preferences.
+
+## TextArea
+
+TextArea component provides a multi-line text input field.
+
+### Import
+
+```js
+import { TextArea } from "@vibe/core";
+```
+
+### Usage
+
+- Use text areas for longer text input (multiple lines).
+- Provide appropriate placeholder text.
+- Consider character limits and validation.
+
+## Toast
+
+Toast component displays temporary notification messages.
+
+### Import
+
+```js
+import { Toast } from "@vibe/core";
+```
+
+### Usage
+
+- Use toasts for temporary, non-blocking notifications.
+- Toasts should auto-dismiss after a few seconds.
+- Use appropriate toast types (success, error, warning, info).
+
+## Tooltip
+
+Tooltip component displays additional information on hover or focus.
+
+### Import
+
+```js
+import { Tooltip } from "@vibe/core";
+```
+
+### Usage
+
+- Use tooltips to provide additional context or information.
+- Tooltips should be concise and helpful.
+- Ensure tooltips are accessible via keyboard navigation.
+
+## Toggle
+
+Toggle component allows users to switch between two states.
+
+### Import
+
+```js
+import { Toggle } from "@vibe/core";
+```
+
+### Usage
+
+- Use toggles for binary on/off states in forms or settings.
+- Provide clear labels indicating what the toggle controls.
+- Ensure toggles are accessible via keyboard.
+- When using Toggle without visible labels (e.g., inside cards, toolbars, or compact UI), use the `areLabelsHidden` prop to hide the default "On"/"Off" text labels. Always pair with an `ariaLabel` prop so the toggle remains accessible.
+
+```jsx
+// Toggle with visible labels (default)
+
+
+// Toggle without visible labels (compact contexts)
+
+```
+
+## ThemeProvider
+
+ThemeProvider component enables theme switching and provides theme context to all child components.
+
+### Import
+
+```js
+import { ThemeProvider } from "@vibe/core";
+```
+
+### Usage
+
+- Wrap your application root with ThemeProvider to enable theming.
+- Supports light, dark, black, and hacker themes.
+- All components automatically inherit theme colors.
+
+### Example
+
+```jsx
+import { ThemeProvider } from "@vibe/core";
+
+
+
+ ;
+```
+
+## Accordion
+
+Accordion is a vertically stacked list of items. Each item can be "expanded" or "collapsed" to reveal the content within.
+
+### Import
+
+```js
+import { Accordion, AccordionItem } from "@vibe/core";
+```
+
+### Usage
+
+- Use accordion to reduce clutter and chunk information one by one.
+- Accordion label must be short, clear, and understandable to indicate what's inside.
+- Default state of accordion is closed unless used for navigation.
+- Accordion content can include icons, radio buttons, and checkboxes.
+
+### Variants
+
+**Multi Active:** Each section can be expanded without closing the others.
+
+**Single Active:** Only one section can be open at a time.
+
+### Accessibility
+
+- Provide an `id` for the Accordion to enable proper accessibility associations.
+- Provide unique `id` props for each AccordionItem.
+- Use descriptive `title` props for AccordionItem headers.
+- Use `defaultIndex` prop to set initial expanded states appropriately.
+
+## AvatarGroup
+
+Use AvatarGroup component if you need to stack avatars as a group.
+
+### Import
+
+```js
+import { AvatarGroup } from "@vibe/core";
+```
+
+### Usage
+
+- Use to display multiple avatars together.
+- Shows a counter for additional avatars beyond the max displayed.
+- Can be clickable (opens Menu) or hoverable (shows Tooltip).
+
+### Variants
+
+**Sizes:** XS, Small, Medium, Large
+
+**Color Variants:** Light or Dark counter color
+
+**Clickable vs. Hover:** Clickable avatars display via Menu, hoverable display in Tooltip.
+
+### Accessibility
+
+- Use `counterAriaLabel` prop to describe the counter (e.g., "3 additional team members").
+- Ensure each Avatar in the group has a meaningful `ariaLabel` prop.
+
+## EmptyState
+
+An empty state component communicates to users that a particular section contains no data or content at the moment.
+
+### Import
+
+```js
+import { EmptyState } from "@vibe/core";
+```
+
+### Usage
+
+- Provide a clear and concise message that informs the user about the expected outcome.
+- Handle errors and edge cases that might occur during data loading or rendering.
+- Use to provide an initial state that prevents confusion when no data is available.
+
+### Variants
+
+**Layouts:** Default, Compact
+
+**Actions:** Can include main action button, supporting action button, or link.
+
+### Best Practices
+
+- Provide clear guidance and an action to help users resolve the empty state.
+- Offer clear next steps with supporting information when needed.
+- Use appropriate layout (default or compact) based on available space.
+
+## Steps
+
+Steps display progress through a sequence of logical and numbered steps. They may also be used for navigation.
+
+### Import
+
+```js
+import { Steps } from "@vibe/core";
+```
+
+### Usage
+
+- The stepper shows users where they are in the process, and can be used to navigate through the process by selecting steps.
+- If a task needs more than six steps, consider simplifying the process or breaking it up into multiple tasks.
+
+### Variants
+
+**Types:** Number view, Gallery view
+
+**On Primary:** Can be displayed on primary color background.
+
+### Best Practices
+
+- Use steps with numbers type for use cases with more than 5 steps.
+- Don't use the gallery type steps component for more than 5 steps.
+
+## MultiStepIndicator
+
+Tabular navigation component that helps users visualize and interact with a multi-step process.
+
+### Import
+
+```js
+import { MultiStepIndicator } from "@vibe/core";
+```
+
+### Usage
+
+- Use wizard to break a larger goal into manageable steps.
+- If a workflow needs more than 6 steps, consider simplifying it or breaking it up into multiple tasks.
+- Always position the wizard at the top of the multi-step process.
+
+### Variants
+
+**Placements:** Horizontal, Vertical
+
+**Types:** Primary, Success, Danger, Dark
+
+**Sizes:** Compact, Regular
+
+### Best Practices
+
+- Be consistent with the information you include under each step.
+- Keep the default spacing between the wizard steps, even if the wizard width is smaller than the page width.
+
+## NumberField
+
+The NumberField component provides an accessible, strictly numeric input with built-in vertical stepper controls for incrementing or decrementing values.
+
+### Import
+
+```js
+import { NumberField } from "@vibe/core";
+```
+
+### Usage
+
+- Always pass both `value` and `onChange` props to use the component in controlled mode.
+- Use `min`, `max`, and `step` to enforce value boundaries and configure stepping behavior.
+- Use `allowOutOfBounds` when you want to allow users to enter invalid values and handle validation externally.
+- Leverage validation states (`error`, `success`) with `infoText` to provide clear feedback.
+
+### Variants
+
+**Sizes:** Small (32px), Medium (40px), Large (48px)
+
+**States:** Default, Success, Error, Disabled, Read-only
+
+### Accessibility
+
+- Using an `id` is highly recommended for all instances.
+- Always provide a visible `label` or `aria-label`.
+- When using `label` or `infoText`, you must also provide an `id`.
+
+## DatePicker
+
+A simple and reusable DatePicker component for selecting dates.
+
+### Import
+
+```js
+import { DatePicker } from "@vibe/core";
+```
+
+### Usage
+
+- Use for date selection in forms.
+- Supports single date or date range selection.
+- Can display multiple months.
+
+### Variants
+
+**Single Day:** Allows users to select a single date.
+
+**Date Range:** Allows users to select a date range.
+
+**Number of Months:** Can display one or multiple months.
+
+## SplitButton
+
+A split button is a dual-function menu button that offers a default action as well as the possibility of choosing a secondary action.
+
+### Import
+
+```js
+import { SplitButton, SplitButtonMenu } from "@vibe/core";
+```
+
+### Usage
+
+- Try limiting the overall number of choices within the menu to less than four.
+- Order the items within the menu by popularity for a small number of items, or alphabetically for a larger number.
+- Avoid submenus within split button menu.
+- Split button contains two actions: One primary action and a list of secondary actions.
+
+### Variants
+
+**Types:** Primary, Secondary, Tertiary
+
+**Sizes:** Small, Medium, Large
+
+### Best Practices
+
+- Use only one primary action within a single view.
+- Use split button if there are more than one action within the menu.
+- Don't use split button if there's only one option within the menu (use Button instead).
+- Use a split button to display an action with related actions.
+
+## LinearProgressBar
+
+Progress bars show continuous progress through a process, such as a percentage value.
+
+### Import
+
+```js
+import { LinearProgressBar } from "@vibe/core";
+```
+
+### Usage
+
+- Give users an indication of how much of the task has been completed and how much is left.
+- Use only when process has start and finish point.
+
+### Variants
+
+**Regular:** Standard progress bar.
+
+**With Secondary Value:** Shows additional information.
+
+**Multi Progress Bar:** Multiple progress bars stacked.
+
+### Best Practices
+
+- Use a progress bar only when process has start and finish point.
+- Don't use an infinite scalable indicator (use Loader instead).
+
+## MenuButton
+
+MenuButton is a component that opens a Dialog next to a button, the content of the dialog could be anything you want.
+
+### Import
+
+```js
+import { MenuButton } from "@vibe/core";
+```
+
+### Usage
+
+- When you want to place content next to an element.
+- When the content needs to be on top of adjacent content.
+
+### Variants
+
+**Sizes:** Small, Medium, Large
+
+**With Text:** Can include text alongside icon.
+
+**Custom Trigger:** Can use any element as a trigger.
+
+### Accessibility
+
+- Provide an `id` for the MenuButton.
+- Use descriptive `ariaLabel` values.
+- Use `ariaControls` prop to link the MenuButton to its menu content.
+
+## Label
+
+A label indicates the status of an item.
+
+### Import
+
+```js
+import { Label } from "@vibe/core";
+```
+
+### Usage
+
+- Label will always appear in context next to the item it classifies.
+- Displays a short message like new, beta, coming soon, etc.
+- Use only UI colors, not content colors (like status colors).
+
+### Variants
+
+**Kinds:** Line, Fill
+
+**Sizes:** Small, Medium
+
+**Colors:** Primary, Positive, Negative, Warning
+
+**Clickable:** Can be clickable.
+
+### Best Practices
+
+- Use label to indicate the status of an item, for example: "New".
+- Don't use the label component to indicate numbers (use Counter instead).
+- Use label only once per item (use Chips for multiple labels).
+
+## Info
+
+An info component is a contextual container that provides supplemental information to help users understand related content.
+
+### Import
+
+```js
+import { Info } from "@vibe/core";
+```
+
+### Usage
+
+- Use to provide supplemental or explanatory context that supports, but is not essential to, task completion.
+- Keep content informational, not instructional - avoid critical actions or blocking messages.
+- Prefer when tooltips are too limited or the explanation requires paragraph-like text.
+
+### Variants
+
+**Directions:** Top, Bottom, Left, Right
+
+### Accessibility
+
+- Provide an `id` for the Info component.
+- Provide an accessible name using `aria-label` prop.
+- Use `aria-labelledby` prop when an external element provides the accessible name.
+
+## Tipseen
+
+Tipseen is a virtual unboxing experience that helps users get started with the system and discover new features.
+
+### Import
+
+```js
+import { Tipseen, TipseenMedia, TipseenImage, TipseenContent, TipseenWizard } from "@vibe/core";
+```
+
+### Usage
+
+- Use for onboarding screens, new features discovery, or any guidance a user needs.
+- Use when the user is not yet familiar with the system's UI or ready to learn about it.
+- The tip will appear until closed by an X button or call to action button.
+
+### Variants
+
+**Colors:** Inverted (default), Primary
+
+**With Wizard:** Use when you want to teach something in steps.
+
+**With Image:** Can include images or custom media.
+
+### Best Practices
+
+- Use inverted color for feature discovery or general guidance.
+- Use primary color to bring attention to updates about your product offering.
+
+## Counter
+
+Counter component displays numeric counts or badges.
+
+### Import
+
+```js
+import { Counter } from "@vibe/core";
+```
+
+### Usage
+
+- Use to display numeric counts or quantities.
+- Can be used with Badge component for visual indicators.
+
+## EditableHeading
+
+EditableHeading allows users to edit heading text inline.
+
+### Import
+
+```js
+import { EditableHeading } from "@vibe/core";
+```
+
+### Usage
+
+- Use when users need to edit headings directly in place.
+- Provides inline editing functionality with proper validation.
+
+## EditableText
+
+EditableText allows users to edit text content inline.
+
+### Import
+
+```js
+import { EditableText } from "@vibe/core";
+```
+
+### Usage
+
+- Use when users need to edit text directly in place.
+- Provides inline editing functionality.
+
+## ExpandCollapse
+
+ExpandCollapse component allows expanding and collapsing content sections.
+
+### Import
+
+```js
+import { ExpandCollapse } from "@vibe/core";
+```
+
+### Usage
+
+- Use for simple expand/collapse functionality.
+- Similar to Accordion but for single sections.
+
+## TextWithHighlight
+
+TextWithHighlight component displays text with highlighted search terms.
+
+### Import
+
+```js
+import { TextWithHighlight } from "@vibe/core";
+```
+
+### Usage
+
+- Use to highlight search terms within text content.
+- Useful for search results and filtered content.
+
+## VirtualizedGrid
+
+VirtualizedGrid component displays large datasets efficiently using virtualization.
+
+### Import
+
+```js
+import { VirtualizedGrid } from "@vibe/core";
+```
+
+### Usage
+
+- Use for displaying large amounts of data efficiently.
+- Only renders visible items for better performance.
+
+## VirtualizedList
+
+VirtualizedList component displays large lists efficiently using virtualization.
+
+### Import
+
+```js
+import { VirtualizedList } from "@vibe/core";
+```
+
+### Usage
+
+- Use for displaying large lists efficiently.
+- Only renders visible items for better performance.
+
+## ColorPicker
+
+ColorPicker component allows users to select colors.
+
+### Import
+
+```js
+import { ColorPicker } from "@vibe/core";
+```
+
+### Usage
+
+- Use for color selection in forms or settings.
+- Supports various color formats and presets.
+
+---
+
+# Component Import Reference
+
+## Main Package (`@vibe/core`)
+
+Most components are available from the main package:
+
+```js
+import {
+ Accordion,
+ AlertBanner,
+ AttentionBox,
+ Avatar,
+ AvatarGroup,
+ Badge,
+ Box,
+ BreadcrumbsBar,
+ Button,
+ ButtonGroup,
+ Checkbox,
+ Chips,
+ Combobox,
+ Counter,
+ DatePicker,
+ Dialog,
+ Divider,
+ Dropdown, // Deprecated - use from @vibe/core/next
+ EditableHeading,
+ EditableText,
+ EmptyState,
+ ExpandCollapse,
+ Flex,
+ Heading,
+ Icon,
+ IconButton,
+ Info,
+ Label,
+ LinearProgressBar,
+ Link,
+ List,
+ Loader,
+ Menu,
+ MenuButton,
+ MultiStepIndicator,
+ NumberField,
+ RadioButton,
+ Search,
+ Skeleton,
+ Slider,
+ SplitButton,
+ Steps,
+ Switch,
+ Table,
+ Tabs,
+ Text,
+ TextArea,
+ TextField,
+ TextWithHighlight,
+ ThemeProvider,
+ Tipseen,
+ Toast,
+ Toggle,
+ Tooltip,
+ VirtualizedGrid,
+ VirtualizedList
+ // ... and more
+} from "@vibe/core";
+```
+
+## Next Package (`@vibe/core/next`)
+
+Newer components and updated versions are available from the next package:
+
+```js
+import {
+ Dropdown, // New version
+ Modal,
+ ModalHeader,
+ ModalContent,
+ ModalFooter,
+ ModalBasicLayout,
+ ModalSideBySideLayout,
+ ModalMediaLayout,
+ AttentionBox // New version
+} from "@vibe/core/next";
+```
+
+**Important:** Always check which package a component comes from. Newer components should be imported from `@vibe/core/next` to ensure you're using the latest version.
+
+---
+
+# Form Components Best Practices
+
+## Form Layout
+
+- Use consistent sizing for all form components on the same page.
+- Group related form fields together.
+- Use appropriate spacing between form fields (typically 16px or 24px).
+- Provide clear labels for all form inputs.
+- Use helper text to provide additional context or instructions.
+
+## Form Validation
+
+- Provide real-time validation feedback when possible.
+- Use error states to clearly indicate validation issues.
+- Provide helpful error messages that explain how to fix the issue.
+- Use success states to confirm valid input.
+
+## Required Fields
+
+- Clearly indicate required fields (using asterisk or "required" text).
+- Use the `required` prop on form components for proper accessibility.
+- Don't make too many fields required - only mark truly necessary fields.
+
+---
+
+# Layout Best Practices
+
+## Using Box and Flex
+
+- **Box:** Use for containers that need spacing, borders, rounded corners, or background colors.
+- **Flex:** Use for one-dimensional layouts (horizontal or vertical) with consistent spacing between children.
+- **Always add padding to containers** - Use `Box` with `padding` prop (typically `medium` or `large` for page-level containers, `small` to `medium` for component containers).
+- **Never create layouts without padding** - Content should never touch container edges. Always ensure adequate breathing room.
+
+## Spacing Between Components
+
+- Use consistent spacing tokens throughout your layout.
+- **Always use spacing tokens** - In CSS use `var(--space-8)`, `var(--space-16)`, `var(--space-24)`, etc. In React props use `gap="small"`, `padding="medium"`, `margin="large"`, etc.
+- Group related components with smaller spacing tokens (`gap="small"` or `gap="medium"`).
+- Separate distinct sections with larger spacing tokens (`gap="large"` or `gap="xl"`).
+- Use Flex component's `gap` prop for automatic spacing between children.
+
+## Visual Design Principles
+
+- Emphasize white space as a design element using spacing tokens
+- Default to transparent/white backgrounds - avoid colored backgrounds unless grouping related content
+- Use borders sparingly and functionally - prefer white space over borders when possible
+- Let spacing tokens create visual separation (`gap="small"` for groups, `gap="large"` for sections)
+- Use typography and spacing for hierarchy, not colors
+
+## Responsive Considerations
+
+- Design layouts that work across different screen sizes.
+- Use Flex component's wrap mode for responsive layouts.
+- Consider using different component sizes on mobile vs desktop.
+
+---
+
+# Accessibility Checklist
+
+When building interfaces with Vibe components, ensure:
+
+- ✅ All interactive elements have proper labels or ARIA labels
+- ✅ Form inputs are properly associated with their labels (use `id` and `title` or `inputAriaLabel`)
+- ✅ Keyboard navigation works for all interactive elements
+- ✅ Focus indicators are visible and meet contrast requirements (3:1)
+- ✅ Color contrast meets WCAG standards (4.5:1 for text, 3:1 for large text)
+- ✅ Screen reader announcements are clear and helpful
+- ✅ Error messages are accessible and descriptive
+- ✅ Loading states are communicated to assistive technologies
+- ✅ Modal dialogs properly trap focus and return focus on close
+- ✅ Icons have text alternatives when used alone (use `ariaLabel`)
+- ✅ Images have appropriate alt text (informative or decorative)
+- ✅ Semantic HTML is used (headings, lists, landmarks)
+- ✅ Heading hierarchy is logical (H1 → H2 → H3, no skipping)
+- ✅ Reading order matches visual presentation
+- ✅ Dynamic content changes are announced to screen readers
+- ✅ Form validation errors are clearly associated with inputs
+- ✅ Color is not the only means of conveying information
+
+---
+
+# Common Patterns
+
+## Form with Validation
+
+```jsx
+
+
+
+```
+
+## Button Group
+
+```jsx
+
+ Cancel
+ Save
+
+```
+
+## Modal with Form
+
+```jsx
+import {
+ Modal,
+ ModalBasicLayout,
+ ModalHeader,
+ ModalContent,
+ ModalFooter,
+ TextField,
+ ButtonGroup,
+ Button,
+ Flex
+} from "@vibe/core/next";
+
+
+
+
+
+ {/* ModalContent includes default padding, so no need to wrap in Box */}
+
+
+
+
+
+
+
+
+ Cancel
+
+ Save
+
+
+
+ ;
+```
+
+## List with Icons
+
+```jsx
+
+
+
+ List item text
+
+
+```
+
+## Complete Form Example
+
+```jsx
+import { Box, Flex, TextField, Button, ButtonGroup, Checkbox } from "@vibe/core";
+import { Save, Cancel } from "@mondaydotcomorg/icons";
+
+
+
+
+
+
+
+
+ Cancel
+
+ Save
+
+
+ ;
+```
+
+## Card Layout Pattern
+
+```jsx
+import { Box, Flex, Heading, Text, Button, Avatar } from "@vibe/core";
+import { Edit } from "@mondaydotcomorg/icons";
+
+
+
+
+
+
+ Card Title
+ Card description text
+
+
+
+ Edit
+
+
+ ;
+```
+
+## Page Layout Pattern
+
+```jsx
+import { Box, Flex, Heading, Button, BreadcrumbsBar } from "@vibe/core";
+import { Add } from "@mondaydotcomorg/icons";
+
+
+
+ {/* Breadcrumbs */}
+
+
+ {/* Header */}
+
+ Page Title
+ Add Item
+
+
+ {/* Content */}
+ {/* Page content here */}
+
+ ;
+```
+
+## Loading State Pattern
+
+```jsx
+import { Box, Skeleton, Flex } from "@vibe/core";
+
+// Use Skeleton instead of Loader for better UX
+
+
+
+
+
+
+ ;
+```
+
+## Error State Pattern
+
+```jsx
+import { Box, AlertBanner, AlertBannerText, AlertBannerButton } from "@vibe/core";
+import { Refresh } from "@mondaydotcomorg/icons";
+
+
+
+
+ Retry
+
+ ;
+```
+
+## Empty State Pattern
+
+```jsx
+import { EmptyState, Button, Text } from "@vibe/core";
+import { Add } from "@mondaydotcomorg/icons";
+
+ }>
+ Create Item
+;
+```
+
+---
+
+# Component Relationships and Combinations
+
+## Common Component Combinations
+
+**Form Layout:**
+
+- `Box` (container) → `Flex` (form layout) → `TextField`/`TextArea`/`Dropdown` → `ButtonGroup` (actions)
+
+**Card Pattern:**
+
+- `Box` (card container) → `Flex` (card layout) → `Avatar` + `Heading`/`Text` + `Button`
+
+**Modal Pattern:**
+
+- `Modal` → `ModalHeader` → `ModalContent` → `ModalFooter` → `ButtonGroup`
+
+**List Pattern:**
+
+- `List` → `ListItem` → `ListItemIcon`/`ListItemAvatar` + `Text`/`Heading`
+
+**Page Layout:**
+
+- `Box` (page container) → `Flex` (column) → `BreadcrumbsBar` + `Flex` (header) + `Box` (content)
+
+## Component Hierarchy Best Practices
+
+- Always wrap content in `Box` or `Flex` for proper spacing
+- Use `Flex` for one-dimensional layouts (toolbars, stacks)
+- Use `Box` for containers that need borders, backgrounds, or padding
+- Nest `Flex` inside `Box` for complex layouts
+- Use `ButtonGroup` to group related buttons
+- Use `List` for collections of similar items
+- Use `Table` for structured data display
+
+# Troubleshooting Common Issues
+
+## Import Errors
+
+**Problem:** Component not found
+
+- **Solution:** Check if component is in `@vibe/core` or `@vibe/core/next`
+- Newer components (Modal, Dropdown, AttentionBox) are in `@vibe/core/next`
+
+**Problem:** Icon not found
+
+- **Solution:** Ensure importing from `@mondaydotcomorg/icons`, not other libraries
+- Icons are PascalCase (e.g., `Close`, `Search`, `ArrowRight`)
+
+## Layout Issues
+
+**Problem:** Components not aligning properly
+
+- **Solution:** Use `Flex` with appropriate `justify` and `align` props
+- Check spacing with `gap` prop
+
+**Problem:** Spacing looks inconsistent
+
+- **Solution:** Use spacing tokens (xs, small, medium, large) instead of arbitrary values
+- Ensure consistent spacing throughout the page
+
+## Styling Issues
+
+**Problem:** Custom styles not working
+
+- **Solution:** Use `Box` and `Flex` props instead of custom CSS
+- Use design system tokens for colors, spacing, shadows
+
+**Problem:** Colors not appearing correctly
+
+- **Solution:** Check if using semantic colors (for UI) vs content colors (for data only)
+- Ensure ThemeProvider is wrapping the app
+
+## Accessibility Issues
+
+**Problem:** Screen reader not announcing content
+
+- **Solution:** Add `id`, `ariaLabel`, or `title` props
+- Ensure proper label associations for form inputs
+
+**Problem:** Keyboard navigation not working
+
+- **Solution:** Ensure all interactive elements are keyboard accessible
+- Check focus management for modals and dialogs
+
+# Additional Resources
+
+For more detailed information about components, refer to:
+
+- Storybook documentation: Each component has comprehensive documentation with examples
+- Component MDX files: Located in `packages/core/src/components/[ComponentName]/__stories__/[ComponentName].mdx`
+- Design system foundations: Typography, Colors, Spacing, Shadows documentation
+- Vibe Storybook: [vibe.monday.com](https://vibe.monday.com)
+
+---
+
+# Notes for AI
+
+## Critical Rules
+
+- Always use the correct import path (`@vibe/core` vs `@vibe/core/next`)
+- **Always use icons from `@mondaydotcomorg/icons`** - Never use other icon libraries (Font Awesome, Material Icons, etc.)
+- Always wrap icons with the `Icon` component from `@vibe/core`
+- Use `Box` and `Flex` for all layout needs - avoid custom CSS
+- Use semantic colors for UI elements, content colors ONLY for data visualization
+- Always provide accessibility attributes (`id`, `ariaLabel`, `title`, etc.)
+
+## Code Generation Guidelines
+
+- Use TypeScript for type safety
+- Import components at the top of the file
+- Use functional components with hooks
+- Provide proper prop types and default values
+- Follow React best practices (keys for lists, proper event handlers)
+- Use consistent spacing tokens throughout
+- Group related components together
+- Use appropriate component sizes consistently
+
+## Common Mistakes to Avoid
+
+- ❌ Using raw HTML elements instead of Button / IconButton from @vibe/core
+- ❌ Using other icon libraries instead of `@mondaydotcomorg/icons`
+- ❌ Using custom CSS instead of Box/Flex components
+- ❌ Creating layouts without padding
+- ❌ Using content colors for UI elements (buttons, alerts, etc.)
+- ❌ Changing content color names (converting underscores to dashes or vice versa)
+- ❌ Missing accessibility attributes (id, ariaLabel, etc.)
+- ❌ Inconsistent spacing (use spacing tokens, not arbitrary values)
+- ❌ Mixing component sizes on the same page
+- ❌ Using deprecated components (check if component is in `@vibe/core/next`)
+- ❌ Forgetting to wrap icons with Icon component
+- ❌ Using absolute positioning when flexbox/grid would work
+- ❌ Not providing labels for form inputs
+- ❌ Overusing shadows or using inconsistent shadow levels
+- ❌ Overusing colored backgrounds and surfaces
+- ❌ Creating visual hierarchy with colors instead of typography/spacing tokens
+- ❌ Cramped spacing and layouts (use appropriate spacing tokens)
+- ❌ Inconsistent spacing throughout the interface (use spacing tokens consistently)
+- ❌ **Using pixel values for spacing instead of spacing tokens** (`gap={16}` instead of `gap="medium"`, `padding={24}` instead of `padding="large"`, `margin: 16px` instead of `margin: var(--space-16)`)
+- ❌ Using shadows and borders decoratively instead of functionally
+- ❌ Using `Toggle` without `areLabelsHidden` in compact contexts (cards, toolbars, table rows) — always hide labels and provide `ariaLabel` instead
+
+## Component Selection Guide
+
+**For Forms:**
+
+- Text input: `TextField`
+- Multi-line text: `TextArea`
+- Number input: `NumberField`
+- Date selection: `DatePicker`
+- Single select: `Dropdown` (from `@vibe/core/next`)
+- Multi-select: `Dropdown` with multi-select or `Combobox`
+- Search: `Search` or `Combobox`
+- Checkbox: `Checkbox`
+- Radio: `RadioButton`
+- Toggle: `Toggle` or `Switch`
+- Color selection: `ColorPicker`
+
+**For Actions:**
+
+- Primary action: `Button` (kind="primary")
+- Secondary action: `Button` (kind="secondary")
+- Tertiary action: `Button` (kind="tertiary")
+- Icon-only action: `IconButton`
+- Multiple actions: `ButtonGroup`
+- Split action: `SplitButton`
+- Menu button: `MenuButton`
+
+**For Feedback:**
+
+- Success/Error messages: `AlertBanner` or `Toast`
+- Important info: `AttentionBox`
+- Loading: `Skeleton` (preferred) or `Loader`
+- Progress: `LinearProgressBar`
+- Tooltips: `Tooltip` or `Tipseen`
+- Supplemental info: `Info`
+- Empty states: `EmptyState`
+
+**For Layout:**
+
+- Container: `Box`
+- One-dimensional layout: `Flex`
+- Responsive multi-line layout: `Flex` with `wrap` prop
+- Two-dimensional grid: CSS Grid (for precise control) or `Flex` with wrap (for flexible flow)
+- Complex dashboard layouts: CSS Grid with `gridTemplateColumns` and `gridTemplateRows`
+- Scrollable list: `VirtualizedList` or `List` with `Box scrollable`
+- Large datasets: `VirtualizedGrid` or `VirtualizedList`
+
+**For Navigation:**
+
+- Breadcrumbs: `BreadcrumbsBar`
+- Tabs: `Tabs`
+- Menu: `Menu` or `MenuButton`
+- Steps: `Steps` or `MultiStepIndicator`
+- Accordion: `Accordion`
+- Expand/Collapse: `ExpandCollapse`
+
+## TypeScript Best Practices
+
+- Import types when available: `import type { ButtonProps } from "@vibe/core"`
+- Use proper event handler types: `onClick: (e: React.MouseEvent) => void`
+- Provide proper types for form values and state
+- Use const assertions for arrays when appropriate
+- Leverage TypeScript's type inference for props
\ No newline at end of file
diff --git a/apps/kitchen-sink/src/screens/hooks/useCursorGlow.ts b/apps/kitchen-sink/src/screens/hooks/useCursorGlow.ts
new file mode 100644
index 0000000000..70080a0008
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/hooks/useCursorGlow.ts
@@ -0,0 +1,26 @@
+import { useEffect, useRef } from "react";
+
+/**
+ * Tracks pointer position over an element and writes it as CSS custom properties
+ * (`--mx`, `--my`) so styles can render a cursor-following spotlight.
+ * Values are in pixels relative to the element's top-left corner.
+ */
+export function useCursorGlow() {
+ const ref = useRef(null);
+
+ useEffect(() => {
+ const el = ref.current;
+ if (!el) return;
+
+ const onMove = (e: PointerEvent) => {
+ const rect = el.getBoundingClientRect();
+ el.style.setProperty("--mx", `${e.clientX - rect.left}px`);
+ el.style.setProperty("--my", `${e.clientY - rect.top}px`);
+ };
+
+ el.addEventListener("pointermove", onMove);
+ return () => el.removeEventListener("pointermove", onMove);
+ }, []);
+
+ return ref;
+}
diff --git a/apps/kitchen-sink/src/screens/hooks/useDocumentColumnResize.ts b/apps/kitchen-sink/src/screens/hooks/useDocumentColumnResize.ts
new file mode 100644
index 0000000000..bbc01b45a8
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/hooks/useDocumentColumnResize.ts
@@ -0,0 +1,56 @@
+import {
+ useCallback,
+ useRef,
+ useEffect,
+ type MouseEvent as ReactMouseEvent,
+} from "react";
+import type { ColumnWidths } from "@/components/types";
+import { MIN_COLUMN_WIDTH_PX } from "@/board/gridTemplate";
+
+type OnResize = (columnId: keyof ColumnWidths, nextWidth: number) => void;
+
+/**
+ * Pointer-driven column resize using document-level listeners (board grid pattern).
+ * Widths are read at mousedown so parent re-renders during drag do not desync start width.
+ */
+export function useDocumentColumnResize(
+ columnWidths: ColumnWidths,
+ onColumnResize: OnResize,
+) {
+ const widthsRef = useRef(columnWidths);
+ const onResizeRef = useRef(onColumnResize);
+
+ useEffect(() => {
+ widthsRef.current = columnWidths;
+ }, [columnWidths]);
+
+ useEffect(() => {
+ onResizeRef.current = onColumnResize;
+ }, [onColumnResize]);
+
+ const startResize = useCallback((columnId: keyof ColumnWidths) => {
+ return (e: ReactMouseEvent) => {
+ e.preventDefault();
+ const startX = e.clientX;
+ const startWidth = widthsRef.current[columnId];
+
+ const handleMouseMove = (moveEvent: MouseEvent) => {
+ const delta = moveEvent.clientX - startX;
+ onResizeRef.current(
+ columnId,
+ Math.max(MIN_COLUMN_WIDTH_PX, startWidth + delta),
+ );
+ };
+
+ const handleMouseUp = () => {
+ document.removeEventListener("mousemove", handleMouseMove);
+ document.removeEventListener("mouseup", handleMouseUp);
+ };
+
+ document.addEventListener("mousemove", handleMouseMove);
+ document.addEventListener("mouseup", handleMouseUp);
+ };
+ }, []);
+
+ return startResize;
+}
diff --git a/apps/kitchen-sink/src/screens/imports/svg-5v47xpc9uc.ts b/apps/kitchen-sink/src/screens/imports/svg-5v47xpc9uc.ts
new file mode 100644
index 0000000000..9f7470e63d
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/imports/svg-5v47xpc9uc.ts
@@ -0,0 +1,64 @@
+export default {
+ p15f10700:
+ "M6.00832 3.25109C6.14116 3.16232 6.29735 3.11495 6.45712 3.11495C6.67136 3.11495 6.87683 3.20005 7.02833 3.35155C7.17983 3.50305 7.26493 3.70852 7.26493 3.92276C7.26493 4.08253 7.21756 4.23871 7.12879 4.37156C7.04003 4.50441 6.91386 4.60795 6.76626 4.66909C6.61864 4.73023 6.45622 4.74623 6.29952 4.71506C6.14283 4.68389 5.99888 4.60696 5.88591 4.49398C5.77293 4.381 5.69599 4.23706 5.66482 4.08036C5.63365 3.92366 5.64965 3.76124 5.71079 3.61363C5.77193 3.46602 5.87547 3.33986 6.00832 3.25109Z",
+ p19a04340:
+ "M11.8542 1.59561V1.59561L2.80915 10.6503L1.81363 14.189L5.35682 13.1957L14.4018 4.14C14.4746 4.06722 14.5161 3.96795 14.5161 3.86503C14.5161 3.76221 14.4753 3.6636 14.4026 3.59083V3.59083L12.4038 1.59568C12.3309 1.52292 12.232 1.48197 12.1289 1.48197C12.026 1.48197 11.927 1.52297 11.8542 1.59561ZM10.8051 0.547542C11.1562 0.196951 11.6324 0 12.1289 0C12.6254 0 13.1016 0.196925 13.4527 0.547473V0.547473L15.4515 2.54263C15.8026 2.89333 16 3.36914 16 3.86503C16 4.36091 15.8028 4.8365 15.4518 5.18719L6.26993 14.3799C6.17984 14.4701 6.06798 14.5356 5.94516 14.57L0.942441 15.9724C0.68418 16.0448 0.406903 15.9723 0.217253 15.7829C0.0276032 15.5934 -0.0448822 15.3165 0.0276754 15.0586L1.43296 10.0633C1.46728 9.94132 1.53237 9.83014 1.62199 9.74042L10.8051 0.547542Z",
+ p1a7d0570:
+ "M5.4624 3.38056C6.12238 2.72058 7.01751 2.3498 7.95087 2.3498C8.88423 2.3498 9.77936 2.72058 10.4393 3.38056C11.0993 4.04055 11.4701 4.93568 11.4701 5.86904C11.4701 6.80239 11.0993 7.69752 10.4393 8.35751C9.77936 9.01749 8.88423 9.38827 7.95087 9.38827C7.01751 9.38827 6.12238 9.01749 5.4624 8.35751C4.80242 7.69752 4.43164 6.80239 4.43164 5.86904C4.43164 4.93568 4.80242 4.04055 5.4624 3.38056ZM7.95087 3.8498C7.41534 3.8498 6.90174 4.06254 6.52306 4.44122C6.14438 4.8199 5.93164 5.3335 5.93164 5.86904C5.93164 6.40457 6.14438 6.91817 6.52306 7.29685C6.90174 7.67553 7.41534 7.88827 7.95087 7.88827C8.4864 7.88827 9 7.67553 9.37868 7.29685C9.75736 6.91817 9.9701 6.40457 9.9701 5.86904C9.9701 5.3335 9.75736 4.8199 9.37868 4.44122C9 4.06254 8.4864 3.8498 7.95087 3.8498Z",
+ p1b71e300:
+ "M3.10923 4.03225C3.32505 4.25592 3.67495 4.25592 3.89077 4.03225L6.83814 0.977707C7.05395 0.754043 7.05395 0.391412 6.83814 0.167748C6.62232 -0.055916 6.27241 -0.055916 6.0566 0.167748L3.5 2.81731L0.943401 0.167748C0.727585 -0.055916 0.377678 -0.055916 0.161862 0.167748C-0.053954 0.391412 -0.053954 0.754043 0.161862 0.977707L3.10923 4.03225Z",
+ p1c4cc900:
+ "M7.77481 0H7.76796C6.61855 0.00017792 5.4835 0.255391 4.44463 0.74724C3.40577 1.23909 2.48899 1.95532 1.76037 2.84429C1.03176 3.73327 0.509475 4.77283 0.231173 5.88805C-0.0471301 7.00326 -0.0745161 8.16633 0.150989 9.2934C0.376494 10.4205 0.849272 11.4835 1.53524 12.4058C2.2212 13.328 3.10326 14.0866 4.11782 14.6268C5.13238 15.167 6.25417 15.4754 7.4023 15.5297C8.55043 15.5839 9.6963 15.3828 10.7573 14.9407C11.1396 14.7814 11.3205 14.3423 11.1611 13.9599C11.0018 13.5776 10.5627 13.3968 10.1804 13.5561C9.32422 13.9128 8.39959 14.0751 7.47313 14.0313C6.54667 13.9875 5.64147 13.7387 4.82279 13.3028C4.00411 12.8669 3.29235 12.2548 2.73883 11.5106C2.1853 10.7663 1.8038 9.90858 1.62184 8.99911C1.43987 8.08965 1.46197 7.15113 1.68654 6.25123C1.91111 5.35134 2.33256 4.51248 2.9205 3.79514C3.50843 3.0778 4.24822 2.49986 5.0865 2.10297C5.92376 1.70657 6.83845 1.50065 7.76477 1.5C8.86593 1.51048 9.94562 1.80591 10.8987 2.35757C11.8528 2.90981 12.6475 3.69993 13.2051 4.65086L13.2104 4.65968C14.5841 6.93038 13.9161 8.71162 13.0869 9.51636C12.6346 9.95531 12.2424 10.0219 12.0877 9.98605C12.0343 9.97369 11.9837 9.94755 11.9315 9.86242C11.8699 9.76187 11.7944 9.55361 11.7944 9.17299V7.77875C11.7944 7.77563 11.7944 7.77251 11.7944 7.76939C11.7946 7.24064 11.6905 6.71681 11.4883 6.22828C11.286 5.73967 10.9894 5.29572 10.6154 4.92178C10.2415 4.54784 9.79756 4.25126 9.30895 4.04896C8.82042 3.8467 8.29683 3.74267 7.76809 3.74281C6.97184 3.74286 6.19324 3.979 5.53118 4.42137C4.86906 4.86379 4.35299 5.49262 4.04825 6.22833C3.7435 6.96405 3.66377 7.77361 3.81913 8.55464C3.97448 9.33567 4.35795 10.0531 4.92105 10.6162C5.48414 11.1793 6.20156 11.5627 6.98259 11.7181C7.76362 11.8735 8.57318 11.7937 9.3089 11.489C9.80515 11.2834 10.2528 10.9817 10.6274 10.6039C10.6356 10.6181 10.644 10.6322 10.6526 10.6462C10.9112 11.0682 11.2976 11.3428 11.7493 11.4474C12.6047 11.6454 13.4949 11.2106 14.1316 10.5928C15.4795 9.28462 16.2153 6.73269 14.4964 3.88766C13.8077 2.71502 12.8272 1.74063 11.6501 1.05936C10.4716 0.37723 9.13643 0.0122197 7.77481 0ZM10.2944 7.76524L10.2944 7.76916V7.77675C10.2929 8.27376 10.1448 8.75935 9.86865 9.17269C9.59106 9.58814 9.1965 9.91195 8.73487 10.1032C8.27325 10.2944 7.76529 10.3444 7.27523 10.2469C6.78517 10.1494 6.33502 9.90884 5.98171 9.55552C5.62839 9.20221 5.38778 8.75206 5.2903 8.262C5.19283 7.77194 5.24286 7.26398 5.43407 6.80236C5.62528 6.34073 5.94908 5.94617 6.36454 5.66858C6.77999 5.39098 7.26843 5.24281 7.76809 5.24281C8.09985 5.2427 8.42863 5.30797 8.73516 5.43488C9.04168 5.56179 9.3202 5.74785 9.55479 5.98244C9.78938 6.21703 9.97544 6.49555 10.1024 6.80207C10.2288 7.10748 10.294 7.43472 10.2944 7.76524Z",
+ p1e821d80:
+ "M12.214 9.00006C12.0561 12.0562 10.9305 14.9829 8.99972 17.3572C7.06899 14.9829 5.94332 12.0562 5.78544 9.00006C5.94332 5.94393 7.06899 3.01718 8.99972 0.642918C10.9305 3.01718 12.0561 5.94393 12.214 9.00006Z",
+ p1f332300:
+ "M9 17.3571C13.6156 17.3571 17.3571 13.6156 17.3571 9C17.3571 4.38448 13.6156 0.642857 9 0.642857C4.38448 0.642857 0.642857 4.38448 0.642857 9C0.642857 13.6156 4.38448 17.3571 9 17.3571Z",
+ p2019d100:
+ "M2.048 9.6136C1.30283 9.61294 0.616728 9.22497 0.25608 8.60035C-0.104569 7.97572 -0.082954 7.21282 0.312532 6.60785L4.00259 0.964728C4.38161 0.350267 5.07884 -0.0188187 5.82363 0.000740566C6.56843 0.0202998 7.2435 0.425424 7.5868 1.05885C7.9301 1.69228 7.88757 2.45427 7.47572 3.04902L3.78785 8.69215C3.41275 9.26631 2.75509 9.61462 2.048 9.6136V9.6136Z",
+ p20777200:
+ "M5.28125 0C5.69546 0 6.03125 0.335786 6.03125 0.75C6.03125 1.16421 5.69546 1.5 5.28125 1.5H4.78125C2.96907 1.5 1.5 2.96907 1.5 4.78125C1.5 6.59343 2.96907 8.0625 4.78125 8.0625H5.28125C5.69546 8.0625 6.03125 8.39829 6.03125 8.8125C6.03125 9.22671 5.69546 9.5625 5.28125 9.5625H4.78125C2.14064 9.5625 0 7.42186 0 4.78125C0 2.14064 2.14064 0 4.78125 0H5.28125Z",
+ p21175a00:
+ "M5.01049 7.47729C5.22542 7.24545 5.21316 6.88193 4.9831 6.66533C4.75305 6.44874 4.39232 6.4611 4.17739 6.69293L1.1401 9.96915V8.17009C1.1401 7.85282 0.884881 7.59562 0.570051 7.59562C0.25522 7.59562 0 7.85282 0 8.17009V11.4254C0 11.4921 0.0112922 11.5562 0.0320556 11.6158C0.061514 11.7006 0.111213 11.7797 0.180891 11.8453C0.293941 11.9517 0.438547 12.0029 0.5819 11.9999H3.58797C3.9028 11.9999 4.15802 11.7427 4.15802 11.4254C4.15802 11.1081 3.9028 10.8509 3.58797 10.8509H1.88287L5.01049 7.47729Z",
+ p225c1f00:
+ "M6.2 0C6.53137 0 6.8 0.268629 6.8 0.6V5.6H11.8C12.1314 5.6 12.4 5.86863 12.4 6.2C12.4 6.53137 12.1314 6.8 11.8 6.8H6.8V11.8C6.8 12.1314 6.53137 12.4 6.2 12.4C5.86863 12.4 5.6 12.1314 5.6 11.8V6.8H0.6C0.268629 6.8 0 6.53137 0 6.2C0 5.86863 0.268629 5.6 0.6 5.6H5.6V0.6C5.6 0.268629 5.86863 0 6.2 0Z",
+ p2398d00:
+ "M0.732233 0.732233C1.20107 0.263392 1.83696 0 2.5 0C3.16304 0 3.79893 0.263392 4.26777 0.732233C4.73661 1.20107 5 1.83696 5 2.5C5 2.90626 4.90111 3.30232 4.71667 3.65601L8.5633 7.50264C9.36861 6.91936 10.3426 6.59961 11.3496 6.59961L11.375 6.59968L11.7419 4.76513C11.4806 4.64309 11.2399 4.47561 11.032 4.26777C10.5632 3.79893 10.2998 3.16304 10.2998 2.5C10.2998 1.83696 10.5632 1.20107 11.032 0.732233C11.5009 0.263392 12.1368 0 12.7998 0C13.4628 0 14.0987 0.263392 14.5676 0.732233C15.0364 1.20107 15.2998 1.83696 15.2998 2.5C15.2998 3.16304 15.0364 3.79893 14.5676 4.26777C14.2019 4.63342 13.7347 4.87411 13.2321 4.96234L12.8557 6.84469C13.5473 7.07592 14.183 7.4655 14.7084 7.99085C15.5992 8.88165 16.0996 10.0898 16.0996 11.3496C16.0996 12.6094 15.5992 13.8176 14.7084 14.7084C13.8176 15.5992 12.6094 16.0996 11.3496 16.0996C10.0898 16.0996 8.88165 15.5992 7.99085 14.7084C7.4655 14.183 7.07592 13.5473 6.84469 12.8557L4.96234 13.2321C4.87411 13.7347 4.63342 14.2019 4.26777 14.5676C3.79893 15.0364 3.16304 15.2998 2.5 15.2998C1.83696 15.2998 1.20107 15.0364 0.732233 14.5676C0.263392 14.0987 0 13.4628 0 12.7998C0 12.1368 0.263392 11.5009 0.732233 11.032C1.20107 10.5632 1.83696 10.2998 2.5 10.2998C3.16304 10.2998 3.79893 10.5632 4.26777 11.032C4.47561 11.2399 4.64309 11.4806 4.76513 11.7419L6.59968 11.375C6.59963 11.3665 6.59961 11.3581 6.59961 11.3496C6.59961 10.3426 6.91936 9.36861 7.50264 8.5633L3.65601 4.71667C3.30232 4.90111 2.90626 5 2.5 5C1.83696 5 1.20107 4.73661 0.732233 4.26777C0.263392 3.79893 0 3.16304 0 2.5C0 1.83696 0.263392 1.20107 0.732233 0.732233ZM2.5 1.5C2.23478 1.5 1.98043 1.60536 1.79289 1.79289C1.60536 1.98043 1.5 2.23478 1.5 2.5C1.5 2.76522 1.60536 3.01957 1.79289 3.20711C1.98043 3.39464 2.23478 3.5 2.5 3.5C2.76522 3.5 3.01957 3.39464 3.20711 3.20711C3.39464 3.01957 3.5 2.76522 3.5 2.5C3.5 2.23478 3.39464 1.98043 3.20711 1.79289C3.01957 1.60536 2.76522 1.5 2.5 1.5ZM11.3496 8.09961C10.4877 8.09961 9.661 8.44202 9.05151 9.05151C8.44202 9.661 8.09961 10.4877 8.09961 11.3496C8.09961 12.2116 8.44202 13.0382 9.05151 13.6477C9.661 14.2572 10.4877 14.5996 11.3496 14.5996C12.2116 14.5996 13.0382 14.2572 13.6477 13.6477C14.2572 13.0382 14.5996 12.2116 14.5996 11.3496C14.5996 10.4877 14.2572 9.66101 13.6477 9.05151C13.0382 8.44202 12.2116 8.09961 11.3496 8.09961ZM1.79289 12.0927C1.98043 11.9052 2.23478 11.7998 2.5 11.7998C2.76522 11.7998 3.01957 11.9052 3.20711 12.0927C3.39464 12.2802 3.5 12.5346 3.5 12.7998C3.5 13.065 3.39464 13.3194 3.20711 13.5069C3.01957 13.6944 2.76522 13.7998 2.5 13.7998C2.23478 13.7998 1.98043 13.6944 1.79289 13.5069C1.60536 13.3194 1.5 13.065 1.5 12.7998C1.5 12.5346 1.60536 12.2802 1.79289 12.0927ZM12.7998 1.5C12.5346 1.5 12.2802 1.60536 12.0927 1.79289C11.9052 1.98043 11.7998 2.23478 11.7998 2.5C11.7998 2.76522 11.9052 3.01957 12.0927 3.20711C12.2802 3.39464 12.5346 3.5 12.7998 3.5C13.065 3.5 13.3194 3.39464 13.5069 3.20711C13.6944 3.01957 13.7998 2.76522 13.7998 2.5C13.7998 2.23478 13.6944 1.98043 13.5069 1.79289C13.3194 1.60536 13.065 1.5 12.7998 1.5Z",
+ p2474a900:
+ "M4.275 0C4.64779 0 4.95 0.302208 4.95 0.675V3.6H7.875C8.24779 3.6 8.55 3.90221 8.55 4.275C8.55 4.64779 8.24779 4.95 7.875 4.95H4.95V7.875C4.95 8.24779 4.64779 8.55 4.275 8.55C3.90221 8.55 3.6 8.24779 3.6 7.875V4.95H0.675C0.302208 4.95 0 4.64779 0 4.275C0 3.90221 0.302208 3.6 0.675 3.6H3.6V0.675C3.6 0.302208 3.90221 0 4.275 0Z",
+ p25262000:
+ "M5.32692 12.5137C4.99555 12.5137 4.72692 12.2451 4.72692 11.9137L4.72692 2.04853L1.02426 5.75118C0.789949 5.9855 0.41005 5.9855 0.175736 5.75118C-0.0585785 5.51687 -0.0585787 5.13697 0.175736 4.90265L4.90265 0.175736C5.13697 -0.0585786 5.51687 -0.0585786 5.75118 0.175736L10.4781 4.90265C10.7124 5.13697 10.7124 5.51687 10.4781 5.75118C10.2438 5.9855 9.86389 5.9855 9.62957 5.75118L5.92692 2.04853L5.92692 11.9137C5.92692 12.2451 5.65829 12.5137 5.32692 12.5137Z",
+ p2544a780:
+ "M1.86765 1.86765C3.06348 0.671814 4.68539 0 6.37655 0C8.06772 0 9.68962 0.671814 10.8855 1.86765C12.0813 3.06348 12.7531 4.68539 12.7531 6.37655C12.7531 8.06772 12.0813 9.68962 10.8855 10.8855C9.68962 12.0813 8.06772 12.7531 6.37655 12.7531C4.68539 12.7531 3.06348 12.0813 1.86765 10.8855C0.671814 9.68962 0 8.06772 0 6.37655C0 4.68539 0.671814 3.06348 1.86765 1.86765ZM6.37655 1.2C5.00365 1.2 3.68697 1.74539 2.71618 2.71618C1.74539 3.68697 1.2 5.00365 1.2 6.37655C1.2 7.74946 1.74539 9.06614 2.71618 10.0369C3.68697 11.0077 5.00365 11.5531 6.37655 11.5531C7.74946 11.5531 9.06614 11.0077 10.0369 10.0369C11.0077 9.06614 11.5531 7.74946 11.5531 6.37655C11.5531 5.00365 11.0077 3.68697 10.0369 2.71618C9.06614 1.74539 7.74946 1.2 6.37655 1.2Z",
+ p26c54f00:
+ "M14.5731 9.75875C15.7064 9.75875 16.6252 8.84613 16.6252 7.72035C16.6252 6.59457 15.7064 5.68195 14.5731 5.68195C13.4398 5.68195 12.521 6.59457 12.521 7.72035C12.521 8.84613 13.4398 9.75875 14.5731 9.75875Z",
+ p28df1d00:
+ "M20 14C23.3137 14 26 11.3137 26 8C26 4.68629 23.3137 2 20 2C16.6863 2 14 4.68629 14 8C14 11.3137 16.6863 14 20 14Z",
+ p2d4adc00:
+ "M7.95 0C5.84153 0 3.81942 0.837587 2.3285 2.3285C0.837587 3.81942 0 5.84153 0 7.95C0 10.0585 0.837587 12.0806 2.3285 13.5715C2.4524 13.6954 2.57997 13.8148 2.71095 13.9296C2.7203 13.9381 2.72991 13.9465 2.73977 13.9547C4.18079 15.2052 6.02958 15.9 7.95 15.9C10.0585 15.9 12.0806 15.0624 13.5715 13.5715C15.0624 12.0806 15.9 10.0585 15.9 7.95C15.9 5.84153 15.0624 3.81942 13.5715 2.3285C12.0806 0.837587 10.0585 0 7.95 0ZM4.24172 13.2275C5.32041 13.9854 6.61383 14.4 7.95 14.4C9.28607 14.4 10.5794 13.9855 11.658 13.2276C11.2807 12.7658 10.8191 12.3769 10.2958 12.0828C9.57945 11.6802 8.77154 11.4688 7.94981 11.4688C7.12808 11.4688 6.32018 11.6802 5.60382 12.0828C5.08057 12.3769 4.61904 12.7657 4.24172 13.2275ZM12.7775 12.2276C13.8199 11.0513 14.4 9.53056 14.4 7.95C14.4 6.23935 13.7204 4.59877 12.5108 3.38916C11.3012 2.17955 9.66065 1.5 7.95 1.5C6.23935 1.5 4.59877 2.17955 3.38916 3.38916C2.17955 4.59877 1.5 6.23935 1.5 7.95C1.5 9.53047 2.08006 11.0511 3.12228 12.2274C3.60987 11.6433 4.20113 11.1505 4.86893 10.7752C5.80969 10.2465 6.87067 9.96875 7.94981 9.96875C9.02895 9.96875 10.0899 10.2465 11.0307 10.7752C11.6986 11.1505 12.2899 11.6434 12.7775 12.2276Z",
+ p2f93e900:
+ "M3.82812 4.7666C3.82812 4.35239 4.16391 4.0166 4.57812 4.0166H11.3302C11.7444 4.0166 12.0802 4.35239 12.0802 4.7666C12.0802 5.18082 11.7444 5.5166 11.3302 5.5166H4.57812C4.16391 5.5166 3.82812 5.18082 3.82812 4.7666Z",
+ p30a9e100:
+ "M10 16.5C13.5899 16.5 16.5 13.5899 16.5 10C16.5 6.41015 13.5899 3.5 10 3.5C6.41015 3.5 3.5 6.41015 3.5 10C3.5 13.5899 6.41015 16.5 10 16.5Z",
+ p35083680:
+ "M7.61181 0C7.29698 0 7.04176 0.257198 7.04176 0.574468C7.04176 0.891738 7.29698 1.14894 7.61181 1.14894H9.31725L6.18951 4.52272C5.97458 4.75455 5.98685 5.11808 6.2169 5.33467C6.44695 5.55126 6.80768 5.53891 7.02261 5.30707L10.0597 2.03109V3.82979C10.0597 4.14706 10.3149 4.40425 10.6297 4.40425C10.9446 4.40425 11.1998 4.14706 11.1998 3.82979V0.590688C11.2042 0.431763 11.1435 0.271766 11.0191 0.154696C10.9093 0.0513059 10.7697 8.43434e-05 10.6304 4.05427e-07L7.61181 0Z",
+ p39933f40:
+ "M8 14C11.3137 14 14 11.3137 14 8C14 4.68629 11.3137 2 8 2C4.68629 2 2 4.68629 2 8C2 11.3137 4.68629 14 8 14Z",
+ p3b347b40:
+ "M6.37656 5.77658C6.70793 5.77658 6.97656 6.04521 6.97656 6.37658V9.26486C6.97656 9.59623 6.70793 9.86486 6.37656 9.86486C6.04518 9.86486 5.77656 9.59623 5.77656 9.26486V6.37658C5.77656 6.04521 6.04518 5.77658 6.37656 5.77658Z",
+ p3bd83000:
+ "M1.27573 0.218874C0.983884 -0.0729648 0.510717 -0.0729548 0.218878 0.218884C-0.0729611 0.510734 -0.072961 0.9839 0.218888 1.27574L4.94357 6.00033L0.219516 10.7243C-0.0723234 11.0161 -0.0723334 11.4893 0.219506 11.7811C0.511345 12.073 0.984521 12.073 1.27636 11.7811L6.00046 7.05712L10.7245 11.7811C11.0163 12.073 11.4895 12.073 11.7813 11.7811C12.0732 11.4893 12.0732 11.0161 11.7813 10.7243L7.05726 6.00033L11.7819 1.27574C12.0738 0.9839 12.0738 0.510734 11.7819 0.218884C11.4901 -0.0729548 11.017 -0.0729648 10.7251 0.218874L6.00046 4.94348L1.27573 0.218874Z",
+ p3c54bc80:
+ "M14.582 0C14.9972 0.000131926 15.334 0.336762 15.334 0.751953V6.18945C15.334 8.60674 13.3742 10.5671 10.957 10.5674H2.56934L5.5127 13.5107C5.80617 13.8044 5.80624 14.2806 5.5127 14.5742C5.21922 14.8672 4.74374 14.8671 4.4502 14.5742L0.241211 10.3643C0.218689 10.3433 0.198528 10.3204 0.178711 10.2969C0.172699 10.2898 0.16684 10.2826 0.161133 10.2754C0.0616767 10.1479 4.13127e-05 9.98958 0 9.81543C0 9.74478 0.0120494 9.67713 0.0302734 9.6123C0.0383621 9.58308 0.0459268 9.55366 0.0576172 9.52539C0.06297 9.5126 0.0701439 9.5007 0.0761719 9.48828C0.111959 9.41378 0.158901 9.34305 0.220703 9.28125L4.4502 5.05176C4.74384 4.75816 5.21907 4.75813 5.5127 5.05176C5.80617 5.3454 5.80624 5.82066 5.5127 6.11426L2.56348 9.06348H10.957C12.5437 9.06317 13.8301 7.7762 13.8301 6.18945V0.751953C13.8301 0.33668 14.1668 0 14.582 0Z",
+ p3dc45800:
+ "M0 1.8C0 0.805887 0.805887 0 1.8 0H12.6C13.5941 0 14.4 0.805887 14.4 1.8V10.8C14.4 11.7941 13.5941 12.6 12.6 12.6H1.8C0.805887 12.6 0 11.7941 0 10.8V1.8ZM4.95 1.35H12.6C12.8485 1.35 13.05 1.55147 13.05 1.8V10.8C13.05 11.0485 12.8485 11.25 12.6 11.25H4.95L4.95 1.35ZM3.6 1.35H1.8C1.55147 1.35 1.35 1.55147 1.35 1.8V10.8C1.35 11.0485 1.55147 11.25 1.8 11.25H3.6L3.6 1.35Z",
+ p3ed45c80:
+ "M9.9375 0.75C9.9375 0.335786 10.2733 0 10.6875 0H11.1562C13.7969 0 15.9375 2.14064 15.9375 4.78125C15.9375 7.42186 13.7969 9.5625 11.1562 9.5625H10.6875C10.2733 9.5625 9.9375 9.22671 9.9375 8.8125C9.9375 8.39829 10.2733 8.0625 10.6875 8.0625H11.1562C12.9684 8.0625 14.4375 6.59343 14.4375 4.78125C14.4375 2.96907 12.9684 1.5 11.1562 1.5H10.6875C10.2733 1.5 9.9375 1.16421 9.9375 0.75Z",
+ p7fcde80:
+ "M10 13.25C11.7949 13.25 13.25 11.7949 13.25 10C13.25 8.20507 11.7949 6.75 10 6.75C8.20507 6.75 6.75 8.20507 6.75 10C6.75 11.7949 8.20507 13.25 10 13.25Z",
+ pc26a300:
+ "M8.12153 14.0371C7.23387 14.9691 6.02191 15.5 4.75 15.5C3.47809 15.5 2.26613 14.9691 1.37847 14.0371C0.491994 13.1063 4.79856e-07 11.8513 3.6609e-07 10.55L0 6.36244C-3.62117e-08 5.94822 0.335787 5.61244 0.75 5.61244C1.16421 5.61244 1.5 5.94822 1.5 6.36244L1.5 10.55C1.5 11.4765 1.85086 12.3581 2.46468 13.0026C3.07731 13.6459 3.90018 14 4.75 14C5.59982 14 6.42269 13.6459 7.03532 13.0026C7.64914 12.3581 8 11.4765 8 10.55L8 3.55C8 2.99482 7.78961 2.4693 7.42585 2.08734C7.06326 1.70663 6.57953 1.5 6.08333 1.5C5.58714 1.5 5.1034 1.70663 4.74082 2.08734C4.37705 2.4693 4.16667 2.99482 4.16667 3.55L4.16667 10.55C4.16667 10.7339 4.23658 10.9033 4.35029 11.0227C4.46283 11.1409 4.60743 11.2 4.75 11.2C4.89258 11.2 5.03717 11.1409 5.14971 11.0227C5.26342 10.9033 5.33333 10.7339 5.33333 10.55L5.33333 6.37363C5.33333 5.95942 5.66912 5.62363 6.08333 5.62363C6.49755 5.62363 6.83333 5.95942 6.83333 6.37363V10.55C6.83333 11.1087 6.62229 11.6515 6.23591 12.0572C5.84835 12.4641 5.31467 12.7 4.75 12.7C4.18533 12.7 3.65165 12.4641 3.26409 12.0572C2.87771 11.6515 2.66667 11.1087 2.66667 10.55L2.66667 3.55C2.66667 2.61997 3.01818 1.72111 3.65461 1.05286C4.29222 0.383369 5.16504 8.02796e-08 6.08333 0C7.00162 -8.02796e-08 7.87444 0.383368 8.51205 1.05286C9.14848 1.72111 9.5 2.61997 9.5 3.55V10.55C9.5 11.8513 9.00801 13.1063 8.12153 14.0371Z",
+ pe7b2900:
+ "M3.55341 4.60829C3.80005 4.8639 4.19995 4.8639 4.44659 4.60829L7.81501 1.11738C8.06166 0.861763 8.06166 0.447328 7.81501 0.191712C7.56837 -0.063904 7.16847 -0.063904 6.92183 0.191712L4 3.21979L1.07817 0.191712C0.831526 -0.063904 0.431632 -0.063904 0.184985 0.191712C-0.0616617 0.447328 -0.0616617 0.861763 0.184985 1.11738L3.55341 4.60829Z",
+ pf8ea70:
+ "M8.1263 9.6136C7.38235 9.61294 6.69737 9.2259 6.33731 8.60276C5.97725 7.97961 5.99883 7.21853 6.39367 6.61499L10.0766 0.985273C10.4497 0.36185 11.1493 -0.0160713 11.8997 0.000525018C12.6501 0.0171213 13.3308 0.425572 13.6734 1.06482C14.016 1.70407 13.9655 2.47154 13.5419 3.06462L9.85893 8.69434C9.48527 9.26587 8.83068 9.61317 8.1263 9.6136V9.6136Z",
+};
diff --git a/apps/kitchen-sink/src/screens/imports/svg-rt86nqhfv4.ts b/apps/kitchen-sink/src/screens/imports/svg-rt86nqhfv4.ts
new file mode 100644
index 0000000000..134fc715dd
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/imports/svg-rt86nqhfv4.ts
@@ -0,0 +1,6 @@
+export default {
+ p3bd83000:
+ "M1.27573 0.218874C0.983884 -0.0729648 0.510717 -0.0729548 0.218878 0.218884C-0.0729611 0.510734 -0.072961 0.9839 0.218888 1.27574L4.94357 6.00033L0.219516 10.7243C-0.0723234 11.0161 -0.0723334 11.4893 0.219506 11.7811C0.511345 12.073 0.984521 12.073 1.27636 11.7811L6.00046 7.05712L10.7245 11.7811C11.0163 12.073 11.4895 12.073 11.7813 11.7811C12.0732 11.4893 12.0732 11.0161 11.7813 10.7243L7.05726 6.00033L11.7819 1.27574C12.0738 0.9839 12.0738 0.510734 11.7819 0.218884C11.4901 -0.0729548 11.017 -0.0729648 10.7251 0.218874L6.00046 4.94348L1.27573 0.218874Z",
+ p892e440:
+ "M4.75 0C5.16421 0 5.5 0.335786 5.5 0.75V4H8.75C9.16421 4 9.5 4.33579 9.5 4.75C9.5 5.16421 9.16421 5.5 8.75 5.5H5.5V8.75C5.5 9.16421 5.16421 9.5 4.75 9.5C4.33579 9.5 4 9.16421 4 8.75V5.5H0.75C0.335786 5.5 0 5.16421 0 4.75C0 4.33579 0.335786 4 0.75 4H4V0.75C4 0.335786 4.33579 0 4.75 0Z",
+};
diff --git a/apps/kitchen-sink/src/screens/imports/svg-s2yy1.tsx b/apps/kitchen-sink/src/screens/imports/svg-s2yy1.tsx
new file mode 100644
index 0000000000..75b330296d
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/imports/svg-s2yy1.tsx
@@ -0,0 +1,2 @@
+export const imgFrame2147239680 =
+ "data:image/svg+xml,%3Csvg%20preserveAspectRatio%3D%22none%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20overflow%3D%22visible%22%20style%3D%22display%3A%20block%3B%22%20viewBox%3D%220%200%20310%20439%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%3Crect%20id%3D%22Rectangle%201000001916%22%20width%3D%22310%22%20height%3D%22439%22%20fill%3D%22url(%23paint0_linear_2001_21148)%22%2F%3E%0A%3Cdefs%3E%0A%3ClinearGradient%20id%3D%22paint0_linear_2001_21148%22%20x1%3D%22155%22%20y1%3D%22322.97%22%20x2%3D%22155%22%20y2%3D%22439%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22white%22%2F%3E%0A%3Cstop%20offset%3D%220.3%22%20stop-color%3D%22white%22%20stop-opacity%3D%220.33%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22white%22%20stop-opacity%3D%220%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3C%2Fdefs%3E%0A%3C%2Fsvg%3E%0A";
diff --git a/apps/kitchen-sink/src/screens/index.css b/apps/kitchen-sink/src/screens/index.css
new file mode 100644
index 0000000000..7632f3642e
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/index.css
@@ -0,0 +1 @@
+@import "./styles/globals.css";
diff --git a/apps/kitchen-sink/src/screens/productConfig.ts b/apps/kitchen-sink/src/screens/productConfig.ts
new file mode 100644
index 0000000000..9b3bf63211
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/productConfig.ts
@@ -0,0 +1,5 @@
+export type ConfigProductName = "work_management" | "dev" | "service" | "crm";
+
+export function initProduct(productName: ConfigProductName) {
+ document.body.classList.add(productName);
+}
diff --git a/apps/kitchen-sink/src/screens/routing/hashRoute.ts b/apps/kitchen-sink/src/screens/routing/hashRoute.ts
new file mode 100644
index 0000000000..6086fdde44
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/routing/hashRoute.ts
@@ -0,0 +1,170 @@
+import { BOARD_VIEWS, type BoardViewId } from "../board/boardViews";
+import {
+ DEFAULT_HEADING_FONT,
+ DEFAULT_TEXT_FONT,
+} from "../components/fontsConfig";
+import type { AgentsView } from "../context/AgentsViewContext";
+import type { RailItemId } from "../components/NavigationRail";
+
+export const ROUTE_THEME_CLASSES = [
+ "slick",
+ "glaze",
+ "glaze-neue",
+ "warmth",
+ "editorial-amber",
+ "editorial-terracotta",
+ "editorial-espresso",
+] as const;
+
+export const ROUTE_MODE_CLASSES = [
+ "dark-app-theme",
+ "black-app-theme",
+] as const;
+
+export type RouteTheme = "" | (typeof ROUTE_THEME_CLASSES)[number];
+export type RouteMode = "" | (typeof ROUTE_MODE_CLASSES)[number];
+
+export interface HashRoute {
+ railItem: RailItemId;
+ boardViewId: BoardViewId;
+ agentsView: AgentsView;
+ sidekickChatId: string | null;
+ theme: RouteTheme;
+ mode: RouteMode;
+ headingFont: string | null;
+ textFont: string | null;
+}
+
+export const DEFAULT_HASH_ROUTE: HashRoute = {
+ railItem: "workspace",
+ boardViewId: "main-table",
+ agentsView: "home",
+ sidekickChatId: null,
+ theme: "",
+ mode: "",
+ headingFont: null,
+ textFont: null,
+};
+
+const RAIL_ITEMS = [
+ "workspace",
+ "home-modes",
+ "sidekick",
+ "agents",
+ "vibe",
+ "notetaker",
+ "favorites",
+ "more",
+] as const satisfies readonly RailItemId[];
+
+function decodeRouteSegment(value: string | undefined): string | null {
+ if (!value) return null;
+ try {
+ return decodeURIComponent(value);
+ } catch {
+ return value;
+ }
+}
+
+function isRailItem(value: string | undefined): value is RailItemId {
+ return RAIL_ITEMS.includes(value as RailItemId);
+}
+
+function isTheme(value: string | null): value is Exclude {
+ return ROUTE_THEME_CLASSES.includes(value as Exclude);
+}
+
+function isBoardViewId(value: string | null): value is BoardViewId {
+ return BOARD_VIEWS.some((view) => view.id === value);
+}
+
+function parseMode(value: string | null): RouteMode {
+ if (value === "dark") return "dark-app-theme";
+ if (value === "black") return "black-app-theme";
+ return "";
+}
+
+function modeToParam(mode: RouteMode): string | null {
+ if (mode === "dark-app-theme") return "dark";
+ if (mode === "black-app-theme") return "black";
+ return null;
+}
+
+function normalizeFontParam(value: string | null): string | null {
+ const trimmed = value?.trim();
+ return trimmed ? trimmed : null;
+}
+
+export function parseHashRoute(hash = window.location.hash): HashRoute {
+ const raw = hash.replace(/^#/, "");
+ const [pathPart = "", queryPart = ""] = raw.split("?");
+ const segments = pathPart.replace(/^\//, "").split("/").filter(Boolean);
+ const params = new URLSearchParams(queryPart);
+
+ const railItem = isRailItem(segments[0]) ? segments[0] : "workspace";
+ const viewParam = params.get("view");
+ const themeParam = params.get("theme");
+ const boardViewId = isBoardViewId(viewParam)
+ ? viewParam
+ : DEFAULT_HASH_ROUTE.boardViewId;
+ const theme: RouteTheme = isTheme(themeParam) ? themeParam : "";
+ const mode = parseMode(params.get("mode"));
+
+ const route: HashRoute = {
+ ...DEFAULT_HASH_ROUTE,
+ railItem,
+ boardViewId,
+ theme,
+ mode,
+ headingFont: normalizeFontParam(params.get("heading")),
+ textFont: normalizeFontParam(params.get("text")),
+ };
+
+ if (railItem === "agents") {
+ route.agentsView =
+ segments[1] === "manage" || segments[1] === "feed" ? segments[1] : "home";
+ }
+
+ if (railItem === "sidekick" && segments[1] === "chat") {
+ route.sidekickChatId = decodeRouteSegment(segments[2]);
+ }
+
+ return route;
+}
+
+export function buildHashRoute(route: HashRoute): string {
+ const params = new URLSearchParams();
+ let path = `/${route.railItem}`;
+
+ if (route.railItem === "workspace") {
+ params.set("view", route.boardViewId);
+ }
+
+ if (route.railItem === "agents" && route.agentsView !== "home") {
+ path = `/agents/${route.agentsView}`;
+ }
+
+ if (route.railItem === "sidekick" && route.sidekickChatId) {
+ path = `/sidekick/chat/${encodeURIComponent(route.sidekickChatId)}`;
+ }
+
+ if (route.theme) params.set("theme", route.theme);
+
+ const modeParam = modeToParam(route.mode);
+ if (modeParam) params.set("mode", modeParam);
+
+ if (route.headingFont && route.headingFont !== DEFAULT_HEADING_FONT) {
+ params.set("heading", route.headingFont);
+ }
+
+ if (route.textFont && route.textFont !== DEFAULT_TEXT_FONT) {
+ params.set("text", route.textFont);
+ }
+
+ const query = params.toString();
+ return `#${path}${query ? `?${query}` : ""}`;
+}
+
+export function routesEqual(a: HashRoute, b: HashRoute): boolean {
+ return buildHashRoute(a) === buildHashRoute(b);
+}
diff --git a/apps/kitchen-sink/src/screens/styles/facelift-theme.css b/apps/kitchen-sink/src/screens/styles/facelift-theme.css
new file mode 100644
index 0000000000..a53a3ad4b9
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/styles/facelift-theme.css
@@ -0,0 +1,402 @@
+/**
+ * Facelift theme (Glaze) — Vibe token names, Glaze values.
+ * Source: :root.glaze in globals.css
+ *
+ * Tokens without a Glaze override keep Vibe default light values.
+ * Dark / black blocks override only what Glaze defines for those modes.
+ */
+
+:root,
+.light-app-theme,
+.default-app-theme {
+ /* Typography — Glaze uses DM Sans (app-level; not in Vibe core export) */
+ --font-family:
+ "DM Sans", system-ui, "Figtree", "Inter", "Helvetica Neue", Arial,
+ sans-serif;
+ --title-font-family: var(--font-family);
+
+ --primary-color: #404643;
+ --primary-hover-color: #000000;
+ --primary-selected-color: #eef0ef;
+ --primary-selected-hover-color: #e6e8e7;
+ --primary-highlighted-color: #f4f5f3;
+ --primary-surface-color: #f4f5f3;
+
+ --primary-text-color: #323338;
+ --secondary-text-color: #676879;
+ --text-color-on-inverted: #ffffff;
+ --text-color-on-primary: #f9faf9;
+ --disabled-text-color: rgba(50, 51, 56, var(--disabled-component-opacity));
+ --inverted-color-background: #323338;
+
+ --fixed-dark-color: #323338;
+ --fixed-light-color: #ffffff;
+
+ --primary-background-color: #ffffff;
+ --primary-background-hover-color: #f2f3f2;
+ --secondary-background-color: #ffffff;
+ --allgrey-background-color: #f4f5f3;
+ --backdrop-color: rgba(50, 51, 56, 0.7);
+ --ui-border-color: #e2e4e3;
+ --ui-background-color: #f2f3f2;
+ --ui-background-hover-color: #eaeceb;
+ --layout-border-color: #e9ebea;
+
+ --placeholder-color: #a6a8a7;
+ --icon-color: #babbbc;
+ --disabled-background-color: #f2f3f2;
+ --link-color: #404643;
+
+ --brand-color: #404643;
+ --brand-hover-color: #000000;
+ --brand-selected-color: #eef0ef;
+ --brand-selected-hover-color: #e6e8e7;
+
+ --positive-color: #00854d;
+ --positive-color-hover: #007038;
+ --positive-color-selected: #bbdbc9;
+ --positive-color-selected-hover: #b5cec0;
+ --negative-color: #d83a52;
+ --negative-color-hover: #b63546;
+ --negative-color-selected: #f4c3cb;
+ --negative-color-selected-hover: #ecb7bf;
+ --warning-color: #ffcb00;
+ --warning-color-hover: #eaaa15;
+ --warning-color-selected: #fceba1;
+ --warning-color-selected-hover: #f2d973;
+
+ --color-highlight_blue: #cce5ff; /* stylelint-disable-line custom-property-pattern */
+ --color-basic_blue: #0073ea; /* stylelint-disable-line custom-property-pattern */
+ --color-dark_blue: #0060b9; /* stylelint-disable-line custom-property-pattern */
+ --color-bazooka: #f65f7c;
+ --color-snow_white: #ffffff; /* stylelint-disable-line custom-property-pattern */
+ --color-riverstone_gray: #f6f7fb; /* stylelint-disable-line custom-property-pattern */
+ --color-ui_grey: #dcdfec; /* stylelint-disable-line custom-property-pattern */
+ --color-wolf_gray: #c3c6d4; /* stylelint-disable-line custom-property-pattern */
+ --color-asphalt: #676879;
+ --color-mud_black: #323338; /* stylelint-disable-line custom-property-pattern */
+ --color-black: #000000;
+ --color-success: #00854d;
+ --color-success-hover: #007038;
+ --color-success-highlight: #bbdbc9;
+ --color-error: #d83a52;
+ --color-error-hover: #b63546;
+ --color-error-highlight: #f4c3cb;
+ --color-link_color: #404643; /* stylelint-disable-line custom-property-pattern */
+ --color-surface: #292f4c;
+ --grey-background-color: #f4f5f3;
+ --text-color-on-brand: #f9faf9;
+
+ --box-shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.06);
+ --box-shadow-small: 0 4px 8px rgba(0, 0, 0, 0.2);
+ --box-shadow-medium: 0px 6px 20px rgba(0, 0, 0, 0.2);
+ --box-shadow-large: 0px 15px 50px rgba(0, 0, 0, 0.3);
+
+ --border-radius-small: 8px;
+ --border-radius-medium: 8px;
+ --border-radius-big: 14px;
+ --border-radius-full: 99px;
+
+ --color-grass_green: #037f4c; /* stylelint-disable-line custom-property-pattern */
+ --color-grass_green-hover: #116846; /* stylelint-disable-line custom-property-pattern */
+ --color-grass_green-selected: #81bfa5; /* stylelint-disable-line custom-property-pattern */
+ --color-done-green: #00ca72;
+ --color-done-green-hover: #0f9b63;
+ --color-done-green-selected: #80e3ba;
+ --color-done-green-selected-with-opacity: rgba(128, 227, 186, 0.6);
+ --color-bright-green: #9cd326;
+ --color-bright-green-hover: #7ca32b;
+ --color-bright-green-selected: #cde992;
+ --color-saladish: #cab641;
+ --color-saladish-hover: #9d8f3e;
+ --color-saladish-selected: #e4daa0;
+ --color-egg_yolk: #ffcb00; /* stylelint-disable-line custom-property-pattern */
+ --color-egg_yolk-hover: #eaaa15; /* stylelint-disable-line custom-property-pattern */
+ --color-egg_yolk-selected: #ffe580; /* stylelint-disable-line custom-property-pattern */
+ --color-egg_yolk-rgb: 255, 213, 51; /* stylelint-disable-line custom-property-pattern */
+ --color-working_orange: #fdab3d; /* stylelint-disable-line custom-property-pattern */
+ --color-working_orange-hover: #c0873c; /* stylelint-disable-line custom-property-pattern */
+ --color-working_orange-selected: #fed59e; /* stylelint-disable-line custom-property-pattern */
+ --color-dark-orange: #ff6d3b;
+ --color-dark-orange-hover: #c25531;
+ --color-dark-orange-selected: #ffb196;
+ --color-peach: #ffadad;
+ --color-peach-hover: #c2888a;
+ --color-peach-selected: #ffd6d6;
+ --color-sunset: #ff7575;
+ --color-sunset-hover: #c26163;
+ --color-sunset-selected: #ffbaba;
+ --color-sunset-selected-with-opacity: rgba(255, 186, 186, 0.6);
+ --color-stuck-red: #df2f4a;
+ --color-stuck-red-hover: #ad3f51;
+ --color-stuck-red-selected: #f0a1ad;
+ --color-dark-red: #bb3354;
+ --color-dark-red-hover: #92334c;
+ --color-dark-red-selected: #dd99a9;
+ --color-sofia_pink: #e50073; /* stylelint-disable-line custom-property-pattern */
+ --color-sofia_pink-hover: #c20062; /* stylelint-disable-line custom-property-pattern */
+ --color-sofia_pink-selected: #ff8ac4; /* stylelint-disable-line custom-property-pattern */
+ --color-lipstick: #ff5ac4;
+ --color-lipstick-hover: #c24e9a;
+ --color-lipstick-selected: #fface1;
+ --color-bubble: #faa1f1;
+ --color-bubble-hover: #be80ba;
+ --color-bubble-selected: #fcd0f8;
+ --color-purple: #9d50dd;
+ --color-purple-hover: #7d45b0;
+ --color-purple-selected: #d0aeed;
+ --color-dark_purple: #784bd1; /* stylelint-disable-line custom-property-pattern */
+ --color-dark_purple-hover: #6344a3; /* stylelint-disable-line custom-property-pattern */
+ --color-dark_purple-selected: #bba5e8; /* stylelint-disable-line custom-property-pattern */
+ --color-berry: #7e3b8a;
+ --color-berry-hover: #673971;
+ --color-berry-selected: #be9dc4;
+ --color-dark_indigo: #401694; /* stylelint-disable-line custom-property-pattern */
+ --color-dark_indigo-hover: #3c1f78; /* stylelint-disable-line custom-property-pattern */
+ --color-dark_indigo-selected: #a08bc9; /* stylelint-disable-line custom-property-pattern */
+ --color-indigo: #5559df;
+ --color-indigo-hover: #4b4ead;
+ --color-indigo-selected: #aaacef;
+ --color-navy: #225091;
+ --color-navy-hover: #274776;
+ --color-navy-selected: #90a7c8;
+ --color-bright-blue: #579bfc;
+ --color-bright-blue-hover: #4c7cc1;
+ --color-bright-blue-selected: #abcdfd;
+ --color-dark-blue: #007eb5;
+ --color-dark-blue-hover: #0f6d97;
+ --color-dark-blue-selected: #80c2df;
+ --color-aquamarine: #4eccc6;
+ --color-aquamarine-hover: #469e9b;
+ --color-aquamarine-selected: #a6e5e2;
+ --color-chili-blue: #66ccff;
+ --color-chili-blue-hover: #569ec3;
+ --color-chili-blue-selected: #b2e5ff;
+ --color-river: #74afcc;
+ --color-river-hover: #588095;
+ --color-river-selected: #b3d0de;
+ --color-winter: #9aadbd;
+ --color-winter-hover: #7b8895;
+ --color-winter-selected: #ccd6de;
+ --color-explosive: #c4c4c4;
+ --color-explosive-hover: #98999a;
+ --color-explosive-selected: #e1e1e1;
+ --color-american_gray: #757575; /* stylelint-disable-line custom-property-pattern */
+ --color-american_gray-hover: #69696a; /* stylelint-disable-line custom-property-pattern */
+ --color-american_gray-selected: #bfbfbf; /* stylelint-disable-line custom-property-pattern */
+ --color-blackish: #333333;
+ --color-blackish-hover: #222222;
+ --color-blackish-selected: #999999;
+ --color-brown: #7f5347;
+ --color-brown-hover: #684943;
+ --color-brown-selected: #bfa9a3;
+ --color-orchid: #e484bd;
+ --color-orchid-hover: #ae5d8d;
+ --color-orchid-selected: #ecbad7;
+ --color-tan: #bca58a;
+ --color-tan-hover: #8a7862;
+ --color-tan-selected: #d6cabc;
+ --color-sky: #a1e3f6;
+ --color-sky-hover: #81b6c5;
+ --color-sky-selected: #d0f1fa;
+ --color-coffee: #cd9282;
+ --color-coffee-hover: #976758;
+ --color-coffee-selected: #dec0b7;
+ --color-royal: #216edf;
+ --color-royal-hover: #225eb7;
+ --color-royal-selected: #95bbf2;
+ --color-teal: #175a63;
+ --color-teal-hover: #12484f;
+ --color-teal-selected: #8bacb1;
+ --color-lavender: #bda8f9;
+ --color-lavender-hover: #9786c7;
+ --color-lavender-selected: #ded4fc;
+ --color-steel: #a9bee8;
+ --color-steel-hover: #8798ba;
+ --color-steel-selected: #d4dff4;
+ --color-lilac: #9d99b9;
+ --color-lilac-hover: #7e7a94;
+ --color-lilac-selected: #ceccdc;
+ --color-pecan: #563e3e;
+ --color-pecan-hover: #453232;
+ --color-pecan-selected: #ab9f9f;
+
+ /* LEGACY VALUES */
+ --color-dark_marble: #f1f1f1; /* stylelint-disable-line custom-property-pattern */
+ --color-marble: #f7f7f7;
+ --color-gainsboro: #e1e1e1;
+ --color-extra_light_gray: #edeef0; /* stylelint-disable-line custom-property-pattern */
+ --color-glitter: #d9f0ff;
+ --color-ultra_light_gray: #ebebeb; /* stylelint-disable-line custom-property-pattern */
+ --color-very_light_gray: #a1a1a1; /* stylelint-disable-line custom-property-pattern */
+ --color-jaco_gray: #9699a6; /* stylelint-disable-line custom-property-pattern */
+ --color-storm_gray: #6b6d77; /* stylelint-disable-line custom-property-pattern */
+ --color-trolley-grey: #757575;
+ --color-basic_light_blue: #c7e6fa; /* stylelint-disable-line custom-property-pattern */
+ --color-light_blue: #61caf7; /* stylelint-disable-line custom-property-pattern */
+ --color-turquoise: #66ccff;
+ --color-aqua: #00d1d1;
+ --color-live_blue: #009aff; /* stylelint-disable-line custom-property-pattern */
+ --color-jeans: #597bfc;
+ --color-burned_eggplant: #181d37; /* stylelint-disable-line custom-property-pattern */
+ --color-light-pink: #ff5ac4;
+ --color-dark-pink: #ff007f;
+ --color-dark_red: #bb3354; /* stylelint-disable-line custom-property-pattern */
+ --color-yellow: #ffcb00;
+ --color-mustered: #cab641;
+ --color-orange: #fdab3d;
+ --color-lime-green: #9cd326;
+ --color-jade: #03c875;
+ --color-green-haze: #00a359;
+ --color-grass-green: #037f4c;
+ --color-amethyst: #9d50dd;
+ --color-dark-purple: #784bd1;
+ --color-blue_links: #007eb5; /* stylelint-disable-line custom-property-pattern */
+ --color-blue-links: #007eb5;
+ --color-private: #f65f7c;
+ --color-public: #009aff;
+ --color-board_views_grey: #6e6f8f; /* stylelint-disable-line custom-property-pattern */
+ --color-board_views_grey_hover: #b2b3d0; /* stylelint-disable-line custom-property-pattern */
+ --color-board_views_blue: #1c1f3b; /* stylelint-disable-line custom-property-pattern */
+ --color-board_views_blue_secondary: #363a52; /* stylelint-disable-line custom-property-pattern */
+ --color-border_light_gray: #f5f6f8; /* stylelint-disable-line custom-property-pattern */
+ --color-brand-blue: #00a9ff;
+ --color-brand-charcoal: #2b2c5c;
+ --color-brand-gold: #ffcc00;
+ --color-brand-green: #11dd80;
+ --color-brand-iris: #595ad4;
+ --color-brand-light-blue: #00cff4;
+ --color-brand-malachite: #00cd6f;
+ --color-brand-purple: #a358d0;
+ --color-brand-red: #f74875;
+ --color-deadline_upcoming_indication: #5d6387; /* stylelint-disable-line custom-property-pattern */
+ --color-default_group_color: #579bfc; /* stylelint-disable-line custom-property-pattern */
+ --color-form_btn_hover: #0083d9; /* stylelint-disable-line custom-property-pattern */
+ --color-form_purple: #575c96; /* stylelint-disable-line custom-property-pattern */
+ --color-highlight: #dff0ff;
+ --color-green_shadow: #00c875; /* stylelint-disable-line custom-property-pattern */
+ --color-green-shadow: #00c875;
+ --color-red_shadow: #df2f4a; /* stylelint-disable-line custom-property-pattern */
+ --color-red-shadow: #df2f4a;
+ --color-pulse_bg: #f0f0f0; /* stylelint-disable-line custom-property-pattern */
+ --color-pulse_text_color: #333333; /* stylelint-disable-line custom-property-pattern */
+ --color-placholder_gray: #d8d8d8; /* stylelint-disable-line custom-property-pattern */
+ --color-placeholder_light_gray: #efefef; /* stylelint-disable-line custom-property-pattern */
+ --color-excel-green: #207245;
+ --color-media-blue: #2ea2e9;
+ --color-pdf-red: #bb0706;
+ --color-ppt-orange: #d64e2a;
+ --color-word-blue: #2a5699;
+ --color-zip-orange: #e4901c;
+ --color-like_red: #fb275d; /* stylelint-disable-line custom-property-pattern */
+ --color-scrollbar_gray: #b2b2b2; /* stylelint-disable-line custom-property-pattern */
+ --color-timeline_grid_blue: #454662; /* stylelint-disable-line custom-property-pattern */
+ --color-timeline_blue: #1c1f3b; /* stylelint-disable-line custom-property-pattern */
+ --color-highlight_blue-rgb: 204, 229, 255; /* stylelint-disable-line custom-property-pattern */
+ --color-snow_white-with-opacity: rgba(255, 255, 255, 0.4); /* stylelint-disable-line custom-property-pattern */
+ --color-wolf_gray-with-opacity: rgba(195, 198, 212, 0.1); /* stylelint-disable-line custom-property-pattern */
+ --color-asphalt-with-opacity: rgba(103, 104, 121, 0.1);
+ --primary-on-secondary-color: #404643;
+ --primary-hover-on-secondary-color: #000000;
+ --primary-selected-color-rgb: 238, 240, 239;
+ --primary-selected-on-secondary-color: #eef0ef;
+ --primary-text-on-secondary-color: #323338;
+ --text-color-on-primary-with-opacity: rgba(255, 255, 255, 0.4);
+ --secondary-text-on-secondary-color: #676879;
+ --placeholder-color-with-opacity: rgba(103, 104, 121, 0.1);
+ --placeholder-on-secondary-color: #a6a8a7;
+ --icon-on-secondary-color: #babbbc;
+ --link-on-secondary-color: #404643;
+ --label-background-color: #f4f5f3;
+ --label-background-on-secondary-color: #eef0ef;
+ --primary-background-color-rgb: 255, 255, 255;
+ --primary-background-hover-on-secondary-color: #eaeceb;
+ --modal-background-color: #ffffff;
+ --secondary-background-color-rgb: 255, 255, 255;
+ --disabled-background-on-secondary-color: #f2f3f2;
+ --disabled-text-on-secondary-color: rgba(50, 51, 56, var(--disabled-component-opacity));
+ --ui-border-on-secondary-color: #e2e4e3;
+ --layout-border-on-secondary-color: #e9ebea;
+ --dark-background-color: #f4f5f3;
+ --dark-background-on-secondary-color: #f4f5f3;
+ --dialog-background-color: #ffffff;
+ --box-shadow-mediun: 0px 6px 20px rgba(0, 0, 0, 0.2);
+}
+
+/* Glaze — dark mode */
+:root.dark-app-theme {
+ --primary-color: #d4d2ce;
+ --primary-hover-color: #f0eeea;
+ --text-color-on-primary: #1a1a19;
+ --text-color-on-inverted: #1a1a19;
+ --primary-background-color: #2a2a28;
+ --primary-background-hover-color: rgba(255, 255, 255, 0.08);
+ --primary-background-hover-on-secondary-color: #363634;
+ --primary-surface-color: #363634;
+ --secondary-background-color: #2e2e2c;
+ --allgrey-background-color: #2e2e2c;
+ --grey-background-color: #2a2a28;
+ --dark-background-color: #363634;
+ --modal-background-color: #2a2a28;
+ --dialog-background-color: #323230;
+ --disabled-background-color: #323230;
+ --label-background-color: #363634;
+ --inverted-color-background: #e8e6e2;
+ --primary-text-color: #e4e2de;
+ --secondary-text-color: #9a9894;
+ --icon-color: #6e6c68;
+ --placeholder-color: #5a5854;
+ --link-color: #d4d2ce;
+ --ui-background-color: #3e3e3c;
+ --ui-background-hover-color: #464644;
+ --ui-border-color: #525250;
+ --layout-border-color: #4a4a48;
+ --primary-selected-color: #424240;
+ --primary-selected-hover-color: #4a4a48;
+ --primary-highlighted-color: #323230;
+ --brand-color: #d4d2ce;
+ --brand-hover-color: #f0eeea;
+ --brand-selected-color: #424240;
+ --brand-selected-hover-color: #4a4a48;
+ --text-color-on-brand: #1a1a19;
+ --backdrop-color: rgba(50, 51, 56, 0.7);
+}
+
+/* Glaze — black mode */
+:root.black-app-theme {
+ --primary-color: #e0deda;
+ --primary-hover-color: #f2f3f2;
+ --text-color-on-primary: #090908;
+ --text-color-on-inverted: #090908;
+ --primary-background-color: #090908;
+ --primary-background-hover-color: rgba(255, 255, 255, 0.04);
+ --primary-background-hover-on-secondary-color: #121211;
+ --primary-surface-color: #111110;
+ --secondary-background-color: #0d0d0c;
+ --allgrey-background-color: #0b0b0a;
+ --grey-background-color: #090908;
+ --dark-background-color: #111110;
+ --modal-background-color: #090908;
+ --dialog-background-color: #10100f;
+ --disabled-background-color: #121211;
+ --label-background-color: #171716;
+ --inverted-color-background: #e8e6e2;
+ --primary-text-color: #eceae6;
+ --secondary-text-color: #8a8884;
+ --icon-color: #5e5c58;
+ --placeholder-color: #4a4844;
+ --link-color: #e0deda;
+ --ui-background-color: #121211;
+ --ui-background-hover-color: #171716;
+ --ui-border-color: #20201f;
+ --layout-border-color: #181817;
+ --primary-selected-color: #151514;
+ --primary-selected-hover-color: #1a1a19;
+ --primary-highlighted-color: #111110;
+ --brand-color: #e0deda;
+ --brand-hover-color: #f2f3f2;
+ --brand-selected-color: #151514;
+ --brand-selected-hover-color: #1a1a19;
+ --text-color-on-brand: #090908;
+ --backdrop-color: rgba(50, 51, 56, 0.7);
+}
diff --git a/apps/kitchen-sink/src/screens/styles/globals.css b/apps/kitchen-sink/src/screens/styles/globals.css
new file mode 100644
index 0000000000..774840b0a1
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/styles/globals.css
@@ -0,0 +1,1045 @@
+:root {
+ --boards-font-family: var(
+ --font-family,
+ "Figtree",
+ "Poppins",
+ "Inter",
+ "Helvetica Neue",
+ Arial,
+ sans-serif
+ );
+
+ /* Scrim — overlay color used behind modals and side panels.
+ Defined per-theme so dialogs read correctly across every palette. */
+ --app-scrim-color: rgba(34, 80, 145, 0.8); /* #225091 @ 80% */
+}
+
+:root.slick {
+ --boards-font-family:
+ "Geist", "Figtree", "Poppins", "Inter", "Helvetica Neue", Arial, sans-serif;
+
+ /* Typography - Geist replaces Poppins (title) + Figtree (body) */
+ --font-family: var(--boards-font-family);
+ --title-font-family: var(--boards-font-family);
+
+ /* Primary color - near-black replaces monday blue */
+ /* Primary action stays blue */
+ --primary-color: #0073ea;
+ --primary-hover-color: #0060c2;
+ --primary-selected-color: #f2e4e0;
+ --primary-selected-hover-color: #e8d4cf;
+ --primary-highlighted-color: #f9f7f7;
+
+ /* Surfaces — warm greige cast */
+ --primary-background-color: #fefefe;
+ --primary-background-hover-color: rgba(99, 92, 90, 0.08);
+ --primary-surface-color: #f9f7f7;
+ --secondary-background-color: #f9f7f7;
+ --allgrey-background-color: #f9f7f7;
+ --grey-background-color: #f9f7f7;
+ --ui-background-color: #edeae9;
+ --ui-background-hover-color: #e3dedc;
+
+ /* Borders — warm grey-pink */
+ --layout-border-color: #ddd7d5;
+ --ui-border-color: #c9c3c1;
+
+ /* Text & icons — warm dark grey / deep warm charcoal */
+ --primary-text-color: #302b2a;
+ --secondary-text-color: #635c5a;
+ --icon-color: #8a8482;
+ --placeholder-color: #635c5a;
+ --link-color: #0073ea;
+
+ /* Border radius — rounder, more modern */
+ --border-radius-small: 8px;
+ --border-radius-medium: 12px;
+ --border-radius-big: 24px;
+
+ /* Scrim — deep navy with warm undertone to match slick palette */
+ --app-scrim-color: rgba(48, 43, 42, 0.75);
+}
+
+/* Scrim — dark mode variants need a heavier, blacker overlay */
+:root.dark-app-theme,
+:root.black-app-theme {
+ --app-scrim-color: rgba(0, 0, 0, 0.7);
+}
+
+/* Glaze — editorial facelift: cool-neutral surface, hairline borders */
+:root.glaze {
+ /* Primary — refined charcoal */
+ --primary-color: #404643;
+ --primary-hover-color: #000000;
+ --primary-selected-color: #eef0ef;
+ --primary-selected-hover-color: #e6e8e7;
+ --primary-highlighted-color: #f4f5f3;
+
+ /* Surfaces — canvas via --primary-surface-color */
+ --primary-background-color: #ffffff;
+ --primary-background-hover-color: #f2f3f2;
+ --primary-background-hover-on-secondary-color: #eaeceb;
+ --primary-surface-color: #f4f5f3;
+ --secondary-background-color: #ffffff;
+ --allgrey-background-color: #f4f5f3;
+ --grey-background-color: #f4f5f3;
+ --ui-background-color: #f2f3f2;
+ --ui-background-hover-color: #eaeceb;
+ --dark-background-color: #f4f5f3;
+ --modal-background-color: #ffffff;
+ --dialog-background-color: #ffffff;
+ --disabled-background-color: #f2f3f2;
+ --label-background-color: #f4f5f3;
+
+ /* Borders */
+ --layout-border-color: #e9ebea;
+ --ui-border-color: #e2e4e3;
+
+ /* Text & icons */
+ --primary-text-color: #323338;
+ --secondary-text-color: #676879;
+ --icon-color: #babbbc;
+ --placeholder-color: #a6a8a7;
+ --link-color: #404643;
+ --text-color-on-primary: #f9faf9;
+ --text-color-on-inverted: #ffffff;
+ --inverted-color-background: #323338;
+
+ /* Radius */
+ --border-radius-small: 8px;
+ --border-radius-medium: 8px;
+ --border-radius-big: 14px;
+
+ --app-scrim-color: rgba(50, 51, 56, 0.7);
+}
+
+/* Warmth — warm-cast variant of Glaze (blush-grey canvas, taupe borders, vibrant blue action) */
+:root.warmth {
+ --boards-font-family:
+ "DM Sans", system-ui, "Figtree", "Inter", "Helvetica Neue", Arial,
+ sans-serif;
+ --font-family: var(--boards-font-family);
+ --title-font-family: var(--boards-font-family);
+
+ /* Primary — vibrant blue-indigo */
+ --primary-color: #3543fc;
+ --primary-hover-color: #2434e8;
+
+ /* Semantic */
+ --positive-color: #166d30;
+ --positive-color-hover: #1a7e38;
+ --negative-color: #cd0026;
+ --negative-color-hover: #b50020;
+ --primary-selected-color: #ebe6e3;
+ --primary-selected-hover-color: #e2dcd8;
+ --primary-highlighted-color: #f5f4f2;
+
+ /* Surfaces — neutral greige with a faint warm tint (white surfaces preserved) */
+ --primary-background-color: #ffffff;
+ --primary-background-hover-color: #f0eeec;
+ --primary-background-hover-on-secondary-color: #e8e6e3;
+ --primary-surface-color: #f5f4f2;
+ --secondary-background-color: #ffffff;
+ --allgrey-background-color: #f5f4f2;
+ --grey-background-color: #f5f4f2;
+ --ui-background-color: #f0eeec;
+ --ui-background-hover-color: #e8e6e3;
+ --dark-background-color: #f5f4f2;
+ --modal-background-color: #ffffff;
+ --dialog-background-color: #ffffff;
+ --disabled-background-color: #f0eeec;
+ --label-background-color: #f5f4f2;
+
+ /* Borders — warm taupe / mauve-grey */
+ --layout-border-color: #c9c0bc;
+ --ui-border-color: #c9c0bc;
+ --glaze-input-focus-border-color: #b0a6a2;
+
+ /* Text & icons — warm charcoal + brown-grey */
+ --primary-text-color: #323338;
+ --secondary-text-color: #5d5552;
+ --icon-color: #b5acaa;
+ --glaze-icon-color-primary: #635c5a;
+ --glaze-icon-color-secondary: #b5acaa;
+ --icon-hover: #574f4d;
+ --placeholder-color: #a89e9b;
+ --link-color: #3543fc;
+ --text-color-on-primary: #ffffff;
+ --text-color-on-inverted: #ffffff;
+ --inverted-color-background: #323338;
+
+ /* Radius — match Glaze */
+ --glaze-radius-control: 8px;
+ --border-radius-small: var(--glaze-radius-control);
+ --border-radius-medium: var(--glaze-radius-control);
+ --border-radius-big: 14px;
+
+ /* Shared Glaze tokens — warm-shifted rail selection, identical shadows/brand */
+ --glaze-rail-selected-color: #e6e1de;
+ --glaze-rail-selected-hover-color: #ddd7d3;
+ --glaze-layout-gap: var(--space-8);
+ --glaze-shadow-lift: 0 1px 2px rgba(0, 0, 0, 0.06);
+ --glaze-shadow-card: 0 1px 3px rgba(0, 0, 0, 0.04);
+ --glaze-shadow-small: 0 4px 8px rgba(0, 0, 0, 0.2);
+ --glaze-border-hairline: rgba(0, 0, 0, 0.04);
+ --glaze-brand-done: #00ca72;
+ --glaze-brand-working: #fdab3d;
+ --glaze-brand-stuck: #df2f4a;
+ --glaze-brand-bright-blue: #579bfc;
+ --glaze-brand-dark-blue: #007eb5;
+ --glaze-brand-dark-purple: #784bd1;
+ --glaze-brand-purple: #9d50dd;
+ --glaze-brand-lipstick: #ff5ac4;
+ --glaze-brand-sunset: #ff7575;
+ --glaze-brand-dark-orange: #ff6d3b;
+ --glaze-brand-egg-yolk: #ffcb00;
+ --glaze-brand-private: #f65f7c;
+
+ /* Scrim — neutral charcoal with a faint warm tint */
+ --app-scrim-color: rgba(58, 52, 49, 0.55);
+}
+
+/* Glaze Neue — Glaze layout with warmer surfaces, Warmth blue primary, Hanken Grotesk headings */
+:root.glaze-neue {
+ --boards-font-family:
+ "DM Sans", system-ui, "Figtree", "Inter", "Helvetica Neue", Arial,
+ sans-serif;
+ --font-family: var(--boards-font-family);
+ --title-font-family:
+ "Hanken Grotesk", system-ui, "Figtree", "Inter", "Helvetica Neue", Arial,
+ sans-serif;
+
+ /* Primary — Warmth vibrant blue */
+ --primary-color: #2d5bff;
+ --primary-hover-color: #1f47e0;
+ --primary-selected-color: #ebe6e3;
+ --primary-selected-hover-color: #e2dcd8;
+ --primary-highlighted-color: #f4f3f1;
+
+ /* Surfaces — Glaze-like, slightly warmer cast */
+ --primary-background-color: #ffffff;
+ --primary-background-hover-color: #f1f0ee;
+ --primary-background-hover-on-secondary-color: #eae9e7;
+ --primary-surface-color: #f4f3f1;
+ --secondary-background-color: #ffffff;
+ --allgrey-background-color: #f4f3f1;
+ --grey-background-color: #f4f3f1;
+ --ui-background-color: #f1f0ee;
+ --ui-background-hover-color: #eae9e7;
+ --dark-background-color: #f4f3f1;
+ --modal-background-color: #ffffff;
+ --dialog-background-color: #ffffff;
+ --disabled-background-color: #f1f0ee;
+ --label-background-color: #f4f3f1;
+
+ /* Borders — Glaze cool-gray hairlines */
+ --layout-border-color: #e9ebea;
+ --ui-border-color: #e2e4e3;
+ --glaze-input-focus-border-color: #babbbc;
+
+ /* Text & icons — Glaze */
+ --primary-text-color: #323338;
+ --secondary-text-color: #676879;
+ --icon-color: #babbbc;
+ --glaze-icon-color-primary: #676879;
+ --glaze-icon-color-secondary: #babbbc;
+ --icon-hover: #676879;
+ --placeholder-color: #a6a8a7;
+ --link-color: #2d5bff;
+ --text-color-on-primary: #ffffff;
+ --text-color-on-inverted: #ffffff;
+ --inverted-color-background: #323338;
+
+ /* Radius — match Glaze */
+ --glaze-radius-control: 8px;
+ --border-radius-small: var(--glaze-radius-control);
+ --border-radius-medium: var(--glaze-radius-control);
+ --border-radius-big: 14px;
+
+ /* Glaze-specific tokens */
+ --glaze-rail-selected-color: #e0e2e1;
+ --glaze-rail-selected-hover-color: #dadcdb;
+ --glaze-layout-gap: var(--space-8);
+ --glaze-shadow-lift: 0 1px 2px rgba(0, 0, 0, 0.06);
+ --glaze-shadow-card: 0 1px 3px rgba(0, 0, 0, 0.04);
+ --glaze-shadow-small: 0 4px 8px rgba(0, 0, 0, 0.2);
+ --glaze-border-hairline: rgba(0, 0, 0, 0.04);
+ --glaze-brand-done: #00ca72;
+ --glaze-brand-working: #fdab3d;
+ --glaze-brand-stuck: #df2f4a;
+ --glaze-brand-bright-blue: #579bfc;
+ --glaze-brand-dark-blue: #007eb5;
+ --glaze-brand-dark-purple: #784bd1;
+ --glaze-brand-purple: #9d50dd;
+ --glaze-brand-lipstick: #ff5ac4;
+ --glaze-brand-sunset: #ff7575;
+ --glaze-brand-dark-orange: #ff6d3b;
+ --glaze-brand-egg-yolk: #ffcb00;
+ --glaze-brand-private: #f65f7c;
+
+ /* Scrim — cool charcoal (Glaze) */
+ --app-scrim-color: rgba(50, 51, 56, 0.7);
+}
+
+html {
+ box-sizing: border-box;
+ font-family: var(--boards-font-family);
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: inherit;
+}
+
+html,
+body,
+#root {
+ min-height: 100vh;
+ height: 100%;
+ margin: 0;
+ max-width: 100%;
+}
+
+body {
+ margin: 0;
+ padding: 0;
+ font-family: var(--boards-font-family);
+ font-synthesis: none;
+ background-color: var(--primary-background-color, #ffffff);
+}
+
+/* Invisible scrollbars — preserve scroll, hide chrome (Firefox + WebKit) */
+.main-area--no-padding * {
+ scrollbar-width: none;
+ -ms-overflow-style: none;
+}
+
+.main-area--no-padding *::-webkit-scrollbar {
+ display: none;
+}
+
+.dev {
+ --primary-surface-color: #ebf5ef;
+}
+
+.service {
+ --primary-surface-color: #f5eff1;
+}
+
+.crm {
+ --primary-surface-color: #e7f4f6;
+}
+
+/* Vibe icons use currentColor — set icon-color on all icon SVGs except primary buttons */
+svg[class*="icon_"] {
+ color: var(--icon-color);
+ transition: color 150ms ease;
+}
+
+/* Button icons should follow the button's own color (per kind + color prop),
+ not the standalone icon-color. Let Vibe drive them via inherit. */
+[class*="kindPrimary"] svg[class*="icon_"],
+[class*="kindSecondary"] svg[class*="icon_"],
+[class*="kindTertiary"] svg[class*="icon_"] {
+ color: inherit;
+}
+
+/* Form-control checkmarks (Checkbox/Radio) set their own on-primary color; the broad
+ icon-color rule above would otherwise darken the check. Restore it. */
+[class*="checkbox_"] svg[class*="icon_"],
+[class*="radio"] svg[class*="icon_"] {
+ color: var(--text-color-on-primary);
+}
+
+/* Warm-theme hover: non-primary Vibe button icons shift from inherit to
+ --secondary-text-color. Primary buttons already use color: inherit on icons
+ and keep on-primary / on-inverted text on hover — only the background changes. */
+[class*="button_"]:not([class*="kindPrimary"]):hover svg[class*="icon_"],
+[class*="iconButton"]:not([class*="kindPrimary"]):hover svg[class*="icon_"],
+[class*="kindTertiary"]:hover svg[class*="icon_"],
+[class*="kindSecondary"]:hover svg[class*="icon_"] {
+ color: var(--secondary-text-color);
+}
+
+/* Editorial — Amber: structured, confident — bold Lora titles + Inter body */
+:root.editorial-amber {
+ --font-family: "Inter", sans-serif;
+ --title-font-family: "Lora", serif;
+}
+
+/* Editorial — Terracotta: high-contrast magazine — Playfair Display titles + DM Sans body */
+:root.editorial-terracotta {
+ --font-family: "DM Sans", sans-serif;
+ --title-font-family: "Playfair Display", serif;
+}
+
+/* Editorial — Espresso: refined luxury — Cormorant Garamond titles + Source Sans 3 body */
+:root.editorial-espresso {
+ --font-family: "Source Sans 3", sans-serif;
+ --title-font-family: "Cormorant Garamond", serif;
+}
+
+/* Editorial — Amber: earthy, confident, structured radius */
+:root.editorial-amber {
+ --title-font-weight: 700;
+ /* Primary — amber/gold */
+ --primary-color: #b45309;
+ --primary-hover-color: #92400e;
+ --primary-selected-color: #fef3c7;
+ --primary-selected-hover-color: #fde68a;
+ --primary-highlighted-color: #fffbeb;
+
+ /* Surfaces — cream */
+ --primary-surface-color: #fdf8f0;
+ --secondary-background-color: #fdf8f0;
+ --allgrey-background-color: #fdf8f0;
+ --grey-background-color: #fdf8f0;
+ --ui-background-color: #f5ead8;
+ --ui-background-hover-color: #edd9b8;
+
+ /* Borders */
+ --layout-border-color: #e8e0d5;
+ --ui-border-color: #d5c9b8;
+
+ /* Text & icons */
+ --primary-text-color: #1c1309;
+ --secondary-text-color: #78716c;
+ --icon-color: #78716c;
+ --placeholder-color: #78716c;
+ --link-color: #b45309;
+
+ /* Border radius — structured */
+ --border-radius-small: 4px;
+ --border-radius-medium: 8px;
+ --border-radius-big: 16px;
+
+ /* Scrim — warm amber-cast brown */
+ --app-scrim-color: rgba(94, 50, 12, 0.78);
+}
+
+/* Editorial — Terracotta: bold, editorial-magazine, sharpest radius */
+:root.editorial-terracotta {
+ /* Primary — rust/terracotta */
+ --primary-color: #c2410c;
+ --primary-hover-color: #9a3412;
+ --primary-selected-color: #ffedd5;
+ --primary-selected-hover-color: #fed7aa;
+ --primary-highlighted-color: #fff7ed;
+
+ /* Surfaces — warm off-white */
+ --primary-surface-color: #fdf4ef;
+ --secondary-background-color: #fdf4ef;
+ --allgrey-background-color: #fdf4ef;
+ --grey-background-color: #fdf4ef;
+ --ui-background-color: #f5e4d8;
+ --ui-background-hover-color: #edcfb8;
+
+ /* Borders */
+ --layout-border-color: #e8ddd5;
+ --ui-border-color: #d5c4b8;
+
+ /* Text & icons */
+ --primary-text-color: #1c0e08;
+ --secondary-text-color: #78716c;
+ --icon-color: #78716c;
+ --placeholder-color: #78716c;
+ --link-color: #c2410c;
+
+ /* Border radius — sharpest */
+ --border-radius-small: 2px;
+ --border-radius-medium: 4px;
+ --border-radius-big: 8px;
+
+ /* Scrim — rust to match terracotta primary */
+ --app-scrim-color: rgba(120, 50, 20, 0.78);
+}
+
+/* Editorial — Espresso: sophisticated, neutral-warm, softest radius */
+:root.editorial-espresso {
+ /* Primary — deep brown */
+ --primary-color: #3d2a1e;
+ --primary-hover-color: #2a1c12;
+ --primary-selected-color: #f0e8e0;
+ --primary-selected-hover-color: #e2d4c8;
+ --primary-highlighted-color: #faf7f4;
+
+ /* Surfaces — parchment */
+ --primary-surface-color: #f7f3ef;
+ --secondary-background-color: #f7f3ef;
+ --allgrey-background-color: #f7f3ef;
+ --grey-background-color: #f7f3ef;
+ --ui-background-color: #ede4da;
+ --ui-background-hover-color: #e0d0c0;
+
+ /* Borders */
+ --layout-border-color: #e2d8cf;
+ --ui-border-color: #cfc4b8;
+
+ /* Text & icons */
+ --primary-text-color: #1c1309;
+ --secondary-text-color: #7c6f65;
+ --icon-color: #7c6f65;
+ --placeholder-color: #7c6f65;
+ --link-color: #3d2a1e;
+
+ /* Border radius — softest */
+ --border-radius-small: 8px;
+ --border-radius-medium: 14px;
+ --border-radius-big: 28px;
+
+ /* Scrim — deep espresso brown */
+ --app-scrim-color: rgba(45, 30, 22, 0.82);
+}
+
+/* Default theme — dark mode */
+:root.dark-app-theme:not(.slick):not(.glaze):not(.glaze-neue):not(.warmth):not(
+ .editorial-amber
+ ):not(.editorial-terracotta):not(.editorial-espresso) {
+ --primary-background-color: #2a3040;
+ --primary-background-hover-color: rgba(255, 255, 255, 0.08);
+ --primary-background-hover-on-secondary-color: #484e60;
+ --primary-surface-color: #363d4e;
+ --secondary-background-color: #2e3444;
+ --allgrey-background-color: #2e3444;
+ --grey-background-color: #2a3040;
+ --dark-background-color: #363d4e;
+ --modal-background-color: #2a3040;
+ --dialog-background-color: #363d4e;
+ --disabled-background-color: #323848;
+ --label-background-color: #404858;
+ --inverted-color-background: #e6e9ef;
+ --primary-text-color: #d5d8e0;
+ --secondary-text-color: #8890a4;
+ --icon-color: #8890a4;
+ --placeholder-color: #525a6e;
+ --link-color: #6eb1ff;
+ --ui-background-color: #404858;
+ --ui-background-hover-color: #484e60;
+ --ui-border-color: #525a6e;
+ --layout-border-color: #484e60;
+ --primary-selected-color: #484e60;
+ --primary-selected-hover-color: #525a6e;
+ --primary-highlighted-color: #363d4e;
+}
+
+/* Default theme — black mode */
+:root.black-app-theme:not(.slick):not(.glaze):not(.glaze-neue):not(.warmth):not(
+ .editorial-amber
+ ):not(.editorial-terracotta):not(.editorial-espresso) {
+ --primary-background-color: #000000;
+ --primary-background-hover-color: rgba(255, 255, 255, 0.05);
+ --primary-background-hover-on-secondary-color: #1a1e2a;
+ --primary-surface-color: #0c0f18;
+ --secondary-background-color: #060810;
+ --allgrey-background-color: #060810;
+ --grey-background-color: #000000;
+ --dark-background-color: #0c0f18;
+ --modal-background-color: #000000;
+ --dialog-background-color: #0c0f18;
+ --disabled-background-color: #141826;
+ --label-background-color: #1a1e2c;
+ --inverted-color-background: #e6e9ef;
+ --primary-text-color: #e0e2e8;
+ --secondary-text-color: #6e7688;
+ --icon-color: #6e7688;
+ --placeholder-color: #404858;
+ --link-color: #6eb1ff;
+ --ui-background-color: #141826;
+ --ui-background-hover-color: #1a1e2a;
+ --ui-border-color: #262c3a;
+ --layout-border-color: #1c2030;
+ --primary-selected-color: #121828;
+ --primary-selected-hover-color: #1a2234;
+ --primary-highlighted-color: #0a0e1a;
+}
+
+/* Glaze — dark mode */
+:root.glaze.dark-app-theme {
+ --primary-color: #d4d2ce;
+ --primary-hover-color: #f0eeea;
+ --text-color-on-primary: #1a1a19;
+ --text-color-on-inverted: #1a1a19;
+ --primary-background-color: #2a2a28;
+ --primary-background-hover-color: rgba(255, 255, 255, 0.08);
+ --primary-background-hover-on-secondary-color: #363634;
+ --primary-surface-color: #363634;
+ --secondary-background-color: #2e2e2c;
+ --allgrey-background-color: #2e2e2c;
+ --grey-background-color: #2a2a28;
+ --dark-background-color: #363634;
+ --modal-background-color: #2a2a28;
+ --dialog-background-color: #323230;
+ --disabled-background-color: #323230;
+ --label-background-color: #363634;
+ --inverted-color-background: #e8e6e2;
+ --primary-text-color: #e4e2de;
+ --secondary-text-color: #9a9894;
+ --icon-color: #6e6c68;
+ --placeholder-color: #5a5854;
+ --link-color: #d4d2ce;
+ --ui-background-color: #3e3e3c;
+ --ui-background-hover-color: #464644;
+ --ui-border-color: #525250;
+ --layout-border-color: #4a4a48;
+ --primary-selected-color: #424240;
+ --primary-selected-hover-color: #4a4a48;
+ --primary-highlighted-color: #323230;
+}
+
+/* Glaze — black mode */
+:root.glaze.black-app-theme {
+ --primary-color: #e0deda;
+ --primary-hover-color: #f2f3f2;
+ --text-color-on-primary: #090908;
+ --text-color-on-inverted: #090908;
+ --primary-background-color: #090908;
+ --primary-background-hover-color: rgba(255, 255, 255, 0.04);
+ --primary-background-hover-on-secondary-color: #121211;
+ --primary-surface-color: #111110;
+ --secondary-background-color: #0d0d0c;
+ --allgrey-background-color: #0b0b0a;
+ --grey-background-color: #090908;
+ --dark-background-color: #111110;
+ --modal-background-color: #090908;
+ --dialog-background-color: #10100f;
+ --disabled-background-color: #121211;
+ --label-background-color: #171716;
+ --inverted-color-background: #e8e6e2;
+ --primary-text-color: #eceae6;
+ --secondary-text-color: #8a8884;
+ --icon-color: #5e5c58;
+ --placeholder-color: #4a4844;
+ --link-color: #e0deda;
+ --ui-background-color: #121211;
+ --ui-background-hover-color: #171716;
+ --ui-border-color: #20201f;
+ --layout-border-color: #181817;
+ --primary-selected-color: #151514;
+ --primary-selected-hover-color: #1a1a19;
+ --primary-highlighted-color: #111110;
+}
+
+/* Warmth — dark mode */
+:root.warmth.dark-app-theme {
+ --positive-color: #2aad52;
+ --positive-color-hover: #35c060;
+ --negative-color: #e8003a;
+ --negative-color-hover: #f52050;
+ --primary-color: #7080ff;
+ --primary-hover-color: #8a9aff;
+ --text-color-on-primary: #1a1716;
+ --text-color-on-inverted: #1a1716;
+ --primary-surface-color: #383432;
+ --dark-background-color: #2c2826;
+ --grey-background-color: #2c2826;
+ --allgrey-background-color: #302c2a;
+ --primary-background-color: #2c2826;
+ --primary-background-hover-color: rgba(255, 255, 255, 0.08);
+ --primary-background-hover-on-secondary-color: #363230;
+ --secondary-background-color: #302c2a;
+ --ui-background-color: #34302e;
+ --ui-background-hover-color: #3a3634;
+ --modal-background-color: #2c2826;
+ --dialog-background-color: #32302e;
+ --disabled-background-color: #302c2a;
+ --label-background-color: #3a3634;
+ --inverted-color-background: #ece4e2;
+ --primary-text-color: #ece4e2;
+ --secondary-text-color: #a89e9b;
+ --icon-color: #948a87;
+ --glaze-icon-color-primary: #a89e9b;
+ --glaze-icon-color-secondary: #948a87;
+ --icon-hover: #c4bab7;
+ --placeholder-color: #645a57;
+ --link-color: #8a9aff;
+ --ui-border-color: #5a5452;
+ --layout-border-color: #524c49;
+ --glaze-input-focus-border-color: #948a87;
+ --glaze-rail-selected-color: #484442;
+ --glaze-rail-selected-hover-color: #524e4c;
+ --primary-selected-color: #484442;
+ --primary-selected-hover-color: #524e4c;
+ --primary-highlighted-color: #32302e;
+}
+
+/* Warmth — black mode */
+:root.warmth.black-app-theme {
+ --positive-color: #35c060;
+ --positive-color-hover: #42d06e;
+ --negative-color: #f03050;
+ --negative-color-hover: #f85070;
+ --primary-color: #8b97ff;
+ --primary-hover-color: #a4b0ff;
+ --text-color-on-primary: #0a0807;
+ --text-color-on-inverted: #0a0807;
+ --primary-surface-color: #242220;
+ --dark-background-color: #060504;
+ --grey-background-color: #060504;
+ --allgrey-background-color: #0a0807;
+ --primary-background-color: #0f0d0c;
+ --primary-background-hover-color: rgba(255, 255, 255, 0.07);
+ --primary-background-hover-on-secondary-color: #171514;
+ --secondary-background-color: #131110;
+ --ui-background-color: #171514;
+ --ui-background-hover-color: #1b1918;
+ --modal-background-color: #060504;
+ --dialog-background-color: #0a0807;
+ --disabled-background-color: #0c0a09;
+ --label-background-color: #1a1716;
+ --inverted-color-background: #efe7e5;
+ --primary-text-color: #efe7e5;
+ --secondary-text-color: #948a87;
+ --icon-color: #948a87;
+ --glaze-icon-color-primary: #948a87;
+ --glaze-icon-color-secondary: #948a87;
+ --icon-hover: #b4aaa7;
+ --placeholder-color: #4d4441;
+ --link-color: #a4b0ff;
+ --ui-border-color: #443e3b;
+ --layout-border-color: #383432;
+ --glaze-input-focus-border-color: #948a87;
+ --glaze-rail-selected-color: #302c2a;
+ --glaze-rail-selected-hover-color: #3a3634;
+ --primary-selected-color: #302c2a;
+ --primary-selected-hover-color: #3a3634;
+ --primary-highlighted-color: #0a0807;
+}
+
+/* Glaze Neue — dark mode */
+:root.glaze-neue.dark-app-theme {
+ --primary-color: #6e8eff;
+ --primary-hover-color: #8aa3ff;
+ --text-color-on-primary: #1a1716;
+ --text-color-on-inverted: #1a1716;
+ --primary-background-color: #2a2a28;
+ --primary-background-hover-color: rgba(255, 255, 255, 0.08);
+ --primary-background-hover-on-secondary-color: #363634;
+ --primary-surface-color: #363634;
+ --secondary-background-color: #2e2e2c;
+ --allgrey-background-color: #2e2e2c;
+ --grey-background-color: #2a2a28;
+ --dark-background-color: #363634;
+ --modal-background-color: #2a2a28;
+ --dialog-background-color: #323230;
+ --disabled-background-color: #323230;
+ --label-background-color: #363634;
+ --inverted-color-background: #e8e6e2;
+ --primary-text-color: #e4e2de;
+ --secondary-text-color: #9a9894;
+ --icon-color: #6e6c68;
+ --glaze-icon-color-primary: #9a9894;
+ --glaze-icon-color-secondary: #6e6c68;
+ --icon-hover: #9a9894;
+ --placeholder-color: #5a5854;
+ --link-color: #8aa3ff;
+ --ui-background-color: #3e3e3c;
+ --ui-background-hover-color: #464644;
+ --ui-border-color: #525250;
+ --layout-border-color: #4a4a48;
+ --glaze-input-focus-border-color: #6e6c68;
+ --glaze-rail-selected-color: #424240;
+ --glaze-rail-selected-hover-color: #4a4a48;
+ --primary-selected-color: #424240;
+ --primary-selected-hover-color: #4a4a48;
+ --primary-highlighted-color: #323230;
+}
+
+/* Glaze Neue — black mode */
+:root.glaze-neue.black-app-theme {
+ --primary-color: #8aa3ff;
+ --primary-hover-color: #a6b8ff;
+ --text-color-on-primary: #090908;
+ --text-color-on-inverted: #090908;
+ --primary-background-color: #090908;
+ --primary-background-hover-color: rgba(255, 255, 255, 0.04);
+ --primary-background-hover-on-secondary-color: #121211;
+ --primary-surface-color: #111110;
+ --secondary-background-color: #0d0d0c;
+ --allgrey-background-color: #0b0b0a;
+ --grey-background-color: #090908;
+ --dark-background-color: #111110;
+ --modal-background-color: #090908;
+ --dialog-background-color: #10100f;
+ --disabled-background-color: #121211;
+ --label-background-color: #171716;
+ --inverted-color-background: #e8e6e2;
+ --primary-text-color: #eceae6;
+ --secondary-text-color: #8a8884;
+ --icon-color: #5e5c58;
+ --glaze-icon-color-primary: #8a8884;
+ --glaze-icon-color-secondary: #5e5c58;
+ --icon-hover: #8a8884;
+ --placeholder-color: #4a4844;
+ --link-color: #a6b8ff;
+ --ui-background-color: #121211;
+ --ui-background-hover-color: #171716;
+ --ui-border-color: #20201f;
+ --layout-border-color: #181817;
+ --glaze-input-focus-border-color: #5e5c58;
+ --glaze-rail-selected-color: #1c1816;
+ --glaze-rail-selected-hover-color: #221d1b;
+ --primary-selected-color: #161830;
+ --primary-selected-hover-color: #1c1f3a;
+ --primary-highlighted-color: #111110;
+}
+
+/* Slick — dark mode */
+:root.slick.dark-app-theme {
+ --primary-color: #c0c0c8;
+ --primary-hover-color: #d0d0d8;
+ --text-color-on-primary: #1d1d1f;
+ --text-color-on-inverted: #1d1d1f;
+ --primary-background-color: #252528;
+ --primary-background-hover-color: rgba(255, 255, 255, 0.06);
+ --primary-background-hover-on-secondary-color: #4a4a54;
+ --primary-surface-color: #303036;
+ --secondary-background-color: #2c2c32;
+ --allgrey-background-color: #2c2c32;
+ --grey-background-color: #252528;
+ --dark-background-color: #303036;
+ --modal-background-color: #252528;
+ --dialog-background-color: #303036;
+ --disabled-background-color: #32323c;
+ --label-background-color: #3a3a46;
+ --inverted-color-background: #e8e8ed;
+ --primary-text-color: #d5d5d8;
+ --secondary-text-color: #9090a0;
+ --icon-color: #9090a0;
+ --placeholder-color: #5a5a68;
+ --link-color: #9a9aa2;
+ --ui-background-color: #3e3e46;
+ --ui-background-hover-color: #4a4a54;
+ --ui-border-color: #52525e;
+ --layout-border-color: #42424e;
+ --primary-selected-color: #32323c;
+ --primary-selected-hover-color: #3a3a46;
+ --primary-highlighted-color: #2c2c34;
+}
+
+/* Slick — black mode */
+:root.slick.black-app-theme {
+ --primary-color: #c8c8d0;
+ --primary-hover-color: #d8d8e0;
+ --text-color-on-primary: #1d1d1f;
+ --text-color-on-inverted: #1d1d1f;
+ --primary-background-color: #000000;
+ --primary-background-hover-color: rgba(255, 255, 255, 0.05);
+ --primary-background-hover-on-secondary-color: #242428;
+ --primary-surface-color: #111113;
+ --secondary-background-color: #0d0d0f;
+ --allgrey-background-color: #0d0d0f;
+ --grey-background-color: #000000;
+ --dark-background-color: #111113;
+ --modal-background-color: #000000;
+ --dialog-background-color: #111113;
+ --disabled-background-color: #1a1a1e;
+ --label-background-color: #222226;
+ --inverted-color-background: #e8e8ed;
+ --primary-text-color: #e0e0e3;
+ --secondary-text-color: #737380;
+ --icon-color: #737380;
+ --placeholder-color: #4a4a56;
+ --link-color: #909098;
+ --ui-background-color: #1c1c20;
+ --ui-background-hover-color: #242428;
+ --ui-border-color: #303036;
+ --layout-border-color: #222226;
+ --primary-selected-color: #1e1e26;
+ --primary-selected-hover-color: #242430;
+ --primary-highlighted-color: #18181c;
+}
+
+/* Amber — dark mode */
+:root.editorial-amber.dark-app-theme {
+ --primary-color: #c97c30;
+ --primary-hover-color: #d98f48;
+ --text-color-on-inverted: #1c1309;
+ --primary-background-color: #231f18;
+ --primary-background-hover-color: rgba(255, 255, 255, 0.05);
+ --primary-background-hover-on-secondary-color: #463c2e;
+ --primary-surface-color: #2e2820;
+ --secondary-background-color: #231f18;
+ --allgrey-background-color: #28221a;
+ --grey-background-color: #231f18;
+ --dark-background-color: #2e2820;
+ --modal-background-color: #231f18;
+ --dialog-background-color: #2e2820;
+ --disabled-background-color: #342c22;
+ --label-background-color: #3c3228;
+ --inverted-color-background: #fdf8f0;
+ --primary-text-color: #ead6b8;
+ --secondary-text-color: #a08868;
+ --icon-color: #a08868;
+ --placeholder-color: #6a5840;
+ --link-color: #c97c30;
+ --ui-background-color: #3c3228;
+ --ui-background-hover-color: #463c2e;
+ --ui-border-color: #564535;
+ --layout-border-color: #46382a;
+ --primary-selected-color: #362c20;
+ --primary-selected-hover-color: #40342a;
+ --primary-highlighted-color: #2a2318;
+}
+
+/* Amber — black mode */
+:root.editorial-amber.black-app-theme {
+ --primary-color: #d4924a;
+ --primary-hover-color: #e0a860;
+ --text-color-on-inverted: #1c1309;
+ --primary-background-color: #110e09;
+ --primary-background-hover-color: rgba(255, 255, 255, 0.04);
+ --primary-background-hover-on-secondary-color: #2a221a;
+ --primary-surface-color: #181410;
+ --secondary-background-color: #110e09;
+ --allgrey-background-color: #14110c;
+ --grey-background-color: #110e09;
+ --dark-background-color: #181410;
+ --modal-background-color: #110e09;
+ --dialog-background-color: #181410;
+ --disabled-background-color: #1e1810;
+ --label-background-color: #221c16;
+ --inverted-color-background: #fdf8f0;
+ --primary-text-color: #f0e4d0;
+ --secondary-text-color: #847060;
+ --icon-color: #847060;
+ --placeholder-color: #584838;
+ --link-color: #d4924a;
+ --ui-background-color: #221c16;
+ --ui-background-hover-color: #2a221a;
+ --ui-border-color: #382e24;
+ --layout-border-color: #2c2420;
+ --primary-selected-color: #201810;
+ --primary-selected-hover-color: #281e16;
+ --primary-highlighted-color: #1a1510;
+}
+
+/* Terracotta — dark mode */
+:root.editorial-terracotta.dark-app-theme {
+ --primary-color: #ea580c;
+ --primary-hover-color: #f97316;
+ --text-color-on-inverted: #1c0e08;
+ --primary-background-color: #211810;
+ --primary-background-hover-color: rgba(255, 255, 255, 0.05);
+ --primary-background-hover-on-secondary-color: #42301e;
+ --primary-surface-color: #2a2018;
+ --secondary-background-color: #211810;
+ --allgrey-background-color: #261c14;
+ --grey-background-color: #211810;
+ --dark-background-color: #2a2018;
+ --modal-background-color: #211810;
+ --dialog-background-color: #2a2018;
+ --disabled-background-color: #302018;
+ --label-background-color: #382818;
+ --inverted-color-background: #fdf4ef;
+ --primary-text-color: #ead4c4;
+ --secondary-text-color: #9c8070;
+ --icon-color: #9c8070;
+ --placeholder-color: #685040;
+ --link-color: #ea580c;
+ --ui-background-color: #382818;
+ --ui-background-hover-color: #42301e;
+ --ui-border-color: #523c28;
+ --layout-border-color: #443020;
+ --primary-selected-color: #342418;
+ --primary-selected-hover-color: #3e2e20;
+ --primary-highlighted-color: #271e14;
+}
+
+/* Terracotta — black mode */
+:root.editorial-terracotta.black-app-theme {
+ --primary-color: #f97316;
+ --primary-hover-color: #fb923c;
+ --text-color-on-inverted: #1c0e08;
+ --primary-background-color: #100c07;
+ --primary-background-hover-color: rgba(255, 255, 255, 0.04);
+ --primary-background-hover-on-secondary-color: #231a12;
+ --primary-surface-color: #151009;
+ --secondary-background-color: #100c07;
+ --allgrey-background-color: #130e08;
+ --grey-background-color: #100c07;
+ --dark-background-color: #151009;
+ --modal-background-color: #100c07;
+ --dialog-background-color: #151009;
+ --disabled-background-color: #1a1208;
+ --label-background-color: #1c1510;
+ --inverted-color-background: #fdf4ef;
+ --primary-text-color: #f0d8c8;
+ --secondary-text-color: #8a6e60;
+ --icon-color: #8a6e60;
+ --placeholder-color: #564030;
+ --link-color: #f97316;
+ --ui-background-color: #1c1510;
+ --ui-background-hover-color: #231a12;
+ --ui-border-color: #30221a;
+ --layout-border-color: #261c14;
+ --primary-selected-color: #1c1210;
+ --primary-selected-hover-color: #241816;
+ --primary-highlighted-color: #16100c;
+}
+
+/* Espresso — dark mode */
+:root.editorial-espresso.dark-app-theme {
+ --primary-color: #c4a882;
+ --primary-hover-color: #d4b896;
+ --text-color-on-primary: #1c1309;
+ --text-color-on-inverted: #1c1309;
+ --primary-background-color: #1c1610;
+ --primary-background-hover-color: rgba(255, 255, 255, 0.05);
+ --primary-background-hover-on-secondary-color: #3a2e20;
+ --primary-surface-color: #241e18;
+ --secondary-background-color: #1c1610;
+ --allgrey-background-color: #201a14;
+ --grey-background-color: #1c1610;
+ --dark-background-color: #241e18;
+ --modal-background-color: #1c1610;
+ --dialog-background-color: #241e18;
+ --disabled-background-color: #2a2218;
+ --label-background-color: #302618;
+ --inverted-color-background: #f7f3ef;
+ --primary-text-color: #e2d5c8;
+ --secondary-text-color: #9a8878;
+ --icon-color: #9a8878;
+ --placeholder-color: #645448;
+ --link-color: #c4a882;
+ --ui-background-color: #302618;
+ --ui-background-hover-color: #3a2e20;
+ --ui-border-color: #4a3c2a;
+ --layout-border-color: #3c2e20;
+ --primary-selected-color: #2c2218;
+ --primary-selected-hover-color: #382c20;
+ --primary-highlighted-color: #221a12;
+}
+
+/* Espresso — black mode */
+:root.editorial-espresso.black-app-theme {
+ --primary-color: #d4b896;
+ --primary-hover-color: #e0c8a8;
+ --text-color-on-primary: #1c1309;
+ --text-color-on-inverted: #1c1309;
+ --primary-background-color: #0e0b08;
+ --primary-background-hover-color: rgba(255, 255, 255, 0.04);
+ --primary-background-hover-on-secondary-color: #221a12;
+ --primary-surface-color: #141009;
+ --secondary-background-color: #0e0b08;
+ --allgrey-background-color: #110d08;
+ --grey-background-color: #0e0b08;
+ --dark-background-color: #141009;
+ --modal-background-color: #0e0b08;
+ --dialog-background-color: #141009;
+ --disabled-background-color: #181210;
+ --label-background-color: #1c1610;
+ --inverted-color-background: #f7f3ef;
+ --primary-text-color: #ede0d2;
+ --secondary-text-color: #887868;
+ --icon-color: #887868;
+ --placeholder-color: #504038;
+ --link-color: #d4b896;
+ --ui-background-color: #1c1610;
+ --ui-background-hover-color: #221a12;
+ --ui-border-color: #302418;
+ --layout-border-color: #261c14;
+ --primary-selected-color: #181210;
+ --primary-selected-hover-color: #201816;
+ --primary-highlighted-color: #150f0a;
+}
diff --git a/apps/kitchen-sink/src/screens/types/monday-ui-components.d.ts b/apps/kitchen-sink/src/screens/types/monday-ui-components.d.ts
new file mode 100644
index 0000000000..fd7f829661
--- /dev/null
+++ b/apps/kitchen-sink/src/screens/types/monday-ui-components.d.ts
@@ -0,0 +1,11 @@
+// Type shim for deep-importing AgentAvatar from @mondaydotcomorg/monday-ui-components.
+// We import the component module directly (not the package barrel) because the barrel
+// re-exports chat-client → @mondaydotcomorg/trident-runtime, a monolith-only package
+// that is not published for standalone bundling and breaks the Vite build. AgentAvatar
+// itself only depends on @vibe/core, so the deep import bundles cleanly.
+declare module "@mondaydotcomorg/monday-ui-components/dist/esm/monday-ui-components/src/components/AgentAvatar/AgentAvatar.js" {
+ import type { FC } from "react";
+ import type { AvatarProps } from "@vibe/core";
+ const AgentAvatar: FC>;
+ export default AgentAvatar;
+}
diff --git a/apps/kitchen-sink/src/section.ts b/apps/kitchen-sink/src/section.ts
new file mode 100644
index 0000000000..2d509cf596
--- /dev/null
+++ b/apps/kitchen-sink/src/section.ts
@@ -0,0 +1 @@
+export type { Section, ControlDef, ControlOption } from "./types";
diff --git a/apps/kitchen-sink/src/sections/Button.section.tsx b/apps/kitchen-sink/src/sections/Button.section.tsx
new file mode 100644
index 0000000000..15d704eb0f
--- /dev/null
+++ b/apps/kitchen-sink/src/sections/Button.section.tsx
@@ -0,0 +1,80 @@
+import { Button } from "@vibe/core";
+import { Bolt } from "@vibe/icons";
+import type { Section } from "../section";
+
+const controls: Section["controls"] = [
+ {
+ key: "kind",
+ label: "Kind",
+ type: "select",
+ options: [
+ { value: "primary", label: "Primary" },
+ { value: "secondary", label: "Secondary" },
+ { value: "tertiary", label: "Tertiary" },
+ ],
+ },
+ {
+ key: "size",
+ label: "Size",
+ type: "select",
+ options: [
+ { value: "xs", label: "XS" },
+ { value: "small", label: "Small" },
+ { value: "medium", label: "Medium" },
+ { value: "large", label: "Large" },
+ ],
+ },
+ {
+ key: "leftIcon",
+ label: "Left icon",
+ type: "select",
+ options: [
+ { value: "none", label: "None" },
+ { value: "left", label: "Left" },
+ ],
+ },
+ {
+ key: "rightIcon",
+ label: "Right icon",
+ type: "select",
+ options: [
+ { value: "none", label: "None" },
+ { value: "right", label: "Right" },
+ ],
+ },
+ { key: "disabled", label: "Disabled", type: "boolean" },
+ { key: "loading", label: "Loading", type: "boolean" },
+];
+
+const defaultState = {
+ kind: "primary",
+ size: "medium",
+ leftIcon: "none",
+ rightIcon: "none",
+ disabled: false,
+ loading: false,
+};
+
+const Demo: Section["Demo"] = ({ state }) => (
+ {}}
+ >
+ Click me
+
+);
+
+const section: Section = {
+ id: "button",
+ title: "Button",
+ defaultState,
+ controls,
+ Demo,
+};
+
+export default section;
diff --git a/apps/kitchen-sink/src/sections/ButtonGroup.section.tsx b/apps/kitchen-sink/src/sections/ButtonGroup.section.tsx
new file mode 100644
index 0000000000..d4c04ffa50
--- /dev/null
+++ b/apps/kitchen-sink/src/sections/ButtonGroup.section.tsx
@@ -0,0 +1,119 @@
+import { ButtonGroup, SegmentedControl, type SegmentedControlSize } from "@vibe/core";
+import { Board, Calendar, Chart } from "@vibe/icons";
+import { useEffect, useState } from "react";
+import type { Section } from "../section";
+import { isCurrentVibeSource } from "../lib/vibeSource";
+
+const buttonGroupControls: Section["controls"] = [
+ {
+ key: "kind",
+ label: "Kind",
+ type: "select",
+ options: [
+ { value: "primary", label: "Primary" },
+ { value: "secondary", label: "Secondary" },
+ { value: "tertiary", label: "Tertiary" },
+ ],
+ },
+ {
+ key: "size",
+ label: "Size",
+ type: "select",
+ options: [
+ { value: "small", label: "Small" },
+ { value: "medium", label: "Medium" },
+ { value: "large", label: "Large" },
+ ],
+ },
+ { key: "disabled", label: "Disabled", type: "boolean" },
+];
+
+const buttonGroupDefaultState = {
+ kind: "primary",
+ size: "medium",
+ disabled: false,
+};
+
+const ButtonGroupDemo: Section["Demo"] = ({ state }) => (
+
+);
+
+const segmentedControlControls: Section["controls"] = [
+ {
+ key: "size",
+ label: "Size",
+ type: "select",
+ options: [
+ { value: "xs", label: "XS" },
+ { value: "small", label: "Small" },
+ { value: "medium", label: "Medium" },
+ { value: "large", label: "Large" },
+ ],
+ },
+ { key: "withIcons", label: "With icons", type: "boolean" },
+ { key: "fullWidth", label: "Full width", type: "boolean" },
+ { key: "disabled", label: "Disabled", type: "boolean" },
+ { key: "disabledSegment", label: "Disable last option", type: "boolean" },
+];
+
+const segmentedControlDefaultState = {
+ size: "medium",
+ withIcons: false,
+ fullWidth: false,
+ disabled: false,
+ disabledSegment: false,
+};
+
+const SegmentedControlDemo: Section["Demo"] = ({ state }) => {
+ const withIcons = Boolean(state.withIcons);
+ const [value, setValue] = useState(withIcons ? "board" : "week");
+
+ useEffect(() => {
+ setValue(withIcons ? "board" : "week");
+ }, [withIcons]);
+
+ const options = withIcons
+ ? [
+ { value: "calendar", label: "Calendar", icon: Calendar },
+ { value: "board", label: "Board", icon: Board },
+ { value: "chart", label: "Chart", icon: Chart, disabled: Boolean(state.disabledSegment) },
+ ]
+ : [
+ { value: "day", label: "Day" },
+ { value: "week", label: "Week" },
+ { value: "month", label: "Month", disabled: Boolean(state.disabledSegment) },
+ ];
+
+ return (
+
+ );
+};
+
+const section: Section = {
+ id: "button-group",
+ title: "Button Group",
+ defaultState: isCurrentVibeSource ? segmentedControlDefaultState : buttonGroupDefaultState,
+ controls: isCurrentVibeSource ? segmentedControlControls : buttonGroupControls,
+ Demo: isCurrentVibeSource ? SegmentedControlDemo : ButtonGroupDemo,
+};
+
+export default section;
diff --git a/apps/kitchen-sink/src/sections/Chip.section.tsx b/apps/kitchen-sink/src/sections/Chip.section.tsx
new file mode 100644
index 0000000000..a1b8d38136
--- /dev/null
+++ b/apps/kitchen-sink/src/sections/Chip.section.tsx
@@ -0,0 +1,54 @@
+import { Chips } from "@vibe/core";
+import type { Section } from "../section";
+
+const controls: Section["controls"] = [
+ {
+ key: "color",
+ label: "Color",
+ type: "select",
+ options: [
+ { value: "primary", label: "Primary" },
+ { value: "positive", label: "Positive" },
+ { value: "negative", label: "Negative" },
+ { value: "warning", label: "Warning" },
+ ],
+ },
+ {
+ key: "size",
+ label: "Size",
+ type: "select",
+ options: [
+ { value: "small", label: "Small" },
+ { value: "medium", label: "Medium" },
+ ],
+ },
+ { key: "disabled", label: "Disabled", type: "boolean" },
+ { key: "readOnly", label: "Read only", type: "boolean" },
+];
+
+const defaultState = {
+ color: "primary",
+ size: "medium",
+ disabled: false,
+ readOnly: true,
+};
+
+const Demo: Section["Demo"] = ({ state }) => (
+
+);
+
+const section: Section = {
+ id: "chip",
+ title: "Chip",
+ defaultState,
+ controls,
+ Demo,
+};
+
+export default section;
diff --git a/apps/kitchen-sink/src/sections/Dropdown.section.tsx b/apps/kitchen-sink/src/sections/Dropdown.section.tsx
new file mode 100644
index 0000000000..357b546793
--- /dev/null
+++ b/apps/kitchen-sink/src/sections/Dropdown.section.tsx
@@ -0,0 +1,60 @@
+import { Dropdown } from "@vibe/core";
+import type { Section } from "../section";
+
+const options = [
+ { value: "low", label: "Low" },
+ { value: "medium", label: "Medium" },
+ { value: "high", label: "High" },
+];
+
+const controls: Section["controls"] = [
+ {
+ key: "size",
+ label: "Size",
+ type: "select",
+ options: [
+ { value: "small", label: "Small" },
+ { value: "medium", label: "Medium" },
+ { value: "large", label: "Large" },
+ ],
+ },
+ { key: "disabled", label: "Disabled", type: "boolean" },
+ { key: "multi", label: "Multi select", type: "boolean" },
+];
+
+const defaultState = {
+ size: "medium",
+ disabled: false,
+ multi: false,
+};
+
+const Demo: Section["Demo"] = ({ state }) => (
+
+ {state.multi ? (
+
+ ) : (
+
+ )}
+
+);
+
+const section: Section = {
+ id: "dropdown",
+ title: "Dropdown",
+ defaultState,
+ controls,
+ Demo,
+};
+
+export default section;
diff --git a/apps/kitchen-sink/src/sections/IconButton.section.tsx b/apps/kitchen-sink/src/sections/IconButton.section.tsx
new file mode 100644
index 0000000000..795ddf576b
--- /dev/null
+++ b/apps/kitchen-sink/src/sections/IconButton.section.tsx
@@ -0,0 +1,54 @@
+import { IconButton } from "@vibe/core";
+import { Add } from "@vibe/icons";
+import type { Section } from "../section";
+
+const controls: Section["controls"] = [
+ {
+ key: "kind",
+ label: "Kind",
+ type: "select",
+ options: [
+ { value: "primary", label: "Primary" },
+ { value: "secondary", label: "Secondary" },
+ { value: "tertiary", label: "Tertiary" },
+ ],
+ },
+ {
+ key: "size",
+ label: "Size",
+ type: "select",
+ options: [
+ { value: "small", label: "Small" },
+ { value: "medium", label: "Medium" },
+ { value: "large", label: "Large" },
+ ],
+ },
+ { key: "disabled", label: "Disabled", type: "boolean" },
+];
+
+const defaultState = {
+ kind: "primary",
+ size: "medium",
+ disabled: false,
+};
+
+const Demo: Section["Demo"] = ({ state }) => (
+ {}}
+ />
+);
+
+const section: Section = {
+ id: "icon-button",
+ title: "Icon Button",
+ defaultState,
+ controls,
+ Demo,
+};
+
+export default section;
diff --git a/apps/kitchen-sink/src/sections/Label.section.tsx b/apps/kitchen-sink/src/sections/Label.section.tsx
new file mode 100644
index 0000000000..26346b2bff
--- /dev/null
+++ b/apps/kitchen-sink/src/sections/Label.section.tsx
@@ -0,0 +1,48 @@
+import { Label } from "@vibe/core";
+import type { Section } from "../section";
+
+const controls: Section["controls"] = [
+ {
+ key: "color",
+ label: "Color",
+ type: "select",
+ options: [
+ { value: "primary", label: "Primary" },
+ { value: "positive", label: "Positive" },
+ { value: "negative", label: "Negative" },
+ { value: "dark", label: "Dark" },
+ ],
+ },
+ {
+ key: "size",
+ label: "Size",
+ type: "select",
+ options: [
+ { value: "small", label: "Small" },
+ { value: "medium", label: "Medium" },
+ ],
+ },
+];
+
+const defaultState = {
+ color: "primary",
+ size: "medium",
+};
+
+const Demo: Section["Demo"] = ({ state }) => (
+
+);
+
+const section: Section = {
+ id: "label",
+ title: "Label",
+ defaultState,
+ controls,
+ Demo,
+};
+
+export default section;
diff --git a/apps/kitchen-sink/src/sections/Menu.section.tsx b/apps/kitchen-sink/src/sections/Menu.section.tsx
new file mode 100644
index 0000000000..8b4555d77b
--- /dev/null
+++ b/apps/kitchen-sink/src/sections/Menu.section.tsx
@@ -0,0 +1,49 @@
+import { DialogContentContainer, Menu, MenuDivider, MenuItem, MenuTitle } from "@vibe/core";
+import { Delete, Email, Info } from "@vibe/icons";
+import type { Section } from "../section";
+
+const controls: Section["controls"] = [
+ {
+ key: "size",
+ label: "Size",
+ type: "select",
+ options: [
+ { value: "small", label: "Small" },
+ { value: "medium", label: "Medium" },
+ { value: "large", label: "Large" },
+ ],
+ },
+ { key: "withIcons", label: "With icons", type: "boolean" },
+];
+
+const defaultState = {
+ size: "medium",
+ withIcons: false,
+};
+
+const Demo: Section["Demo"] = ({ state }) => {
+ const size = state.size as "small" | "medium" | "large";
+ const withIcons = Boolean(state.withIcons);
+
+ return (
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const section: Section = {
+ id: "menu",
+ title: "Menu",
+ defaultState,
+ controls,
+ Demo,
+};
+
+export default section;
diff --git a/apps/kitchen-sink/src/sections/SegmentedControl.section.tsx b/apps/kitchen-sink/src/sections/SegmentedControl.section.tsx
new file mode 100644
index 0000000000..f5db3167bf
--- /dev/null
+++ b/apps/kitchen-sink/src/sections/SegmentedControl.section.tsx
@@ -0,0 +1,73 @@
+import { SegmentedControl, type SegmentedControlSize } from "@vibe/core";
+import { Board, Calendar, Chart } from "@vibe/icons";
+import { useEffect, useState } from "react";
+import type { Section } from "../section";
+
+const controls: Section["controls"] = [
+ {
+ key: "size",
+ label: "Size",
+ type: "select",
+ options: [
+ { value: "xs", label: "XS" },
+ { value: "small", label: "Small" },
+ { value: "medium", label: "Medium" },
+ { value: "large", label: "Large" },
+ ],
+ },
+ { key: "withIcons", label: "With icons", type: "boolean" },
+ { key: "fullWidth", label: "Full width", type: "boolean" },
+ { key: "disabled", label: "Disabled", type: "boolean" },
+ { key: "disabledSegment", label: "Disable last option", type: "boolean" },
+];
+
+const defaultState = {
+ size: "medium",
+ withIcons: false,
+ fullWidth: false,
+ disabled: false,
+ disabledSegment: false,
+};
+
+const Demo: Section["Demo"] = ({ state }) => {
+ const withIcons = Boolean(state.withIcons);
+ const [value, setValue] = useState(withIcons ? "board" : "week");
+
+ useEffect(() => {
+ setValue(withIcons ? "board" : "week");
+ }, [withIcons]);
+
+ const options = withIcons
+ ? [
+ { value: "calendar", label: "Calendar", icon: Calendar },
+ { value: "board", label: "Board", icon: Board },
+ { value: "chart", label: "Chart", icon: Chart, disabled: Boolean(state.disabledSegment) },
+ ]
+ : [
+ { value: "day", label: "Day" },
+ { value: "week", label: "Week" },
+ { value: "month", label: "Month", disabled: Boolean(state.disabledSegment) },
+ ];
+
+ return (
+
+ );
+};
+
+const section: Section = {
+ id: "segmented-control",
+ title: "Segmented Control",
+ defaultState,
+ controls,
+ Demo,
+};
+
+export default section;
diff --git a/apps/kitchen-sink/src/sections/StrokeSpotlight.section.tsx b/apps/kitchen-sink/src/sections/StrokeSpotlight.section.tsx
new file mode 100644
index 0000000000..16ad4124f1
--- /dev/null
+++ b/apps/kitchen-sink/src/sections/StrokeSpotlight.section.tsx
@@ -0,0 +1,86 @@
+import { StrokeSpotlight, type StrokeSpotlightPalette } from "@vibe/core";
+import type { Section } from "../section";
+
+const controls: Section["controls"] = [
+ {
+ key: "palette",
+ label: "Palette",
+ type: "select",
+ options: [
+ { value: "default", label: "Default (Agents)" },
+ { value: "sidekick", label: "Sidekick" },
+ { value: "vibe", label: "Vibe" },
+ ],
+ },
+ {
+ key: "borderWidth",
+ label: "Border width",
+ type: "select",
+ options: [
+ { value: "1.5", label: "1.5" },
+ { value: "2", label: "2" },
+ { value: "3", label: "3" },
+ ],
+ },
+];
+
+const defaultState = {
+ palette: "default",
+ borderWidth: "1.5",
+};
+
+const Demo: Section["Demo"] = ({ state }) => (
+
+
+
+
+
+ Click for pulse · focus to pause traveling stroke
+
+
+
+
+);
+
+const section: Section = {
+ id: "stroke-spotlight",
+ title: "Stroke Spotlight",
+ defaultState,
+ controls,
+ Demo,
+};
+
+export default section;
diff --git a/apps/kitchen-sink/src/sections/Tabs.section.tsx b/apps/kitchen-sink/src/sections/Tabs.section.tsx
new file mode 100644
index 0000000000..6be43ec1a2
--- /dev/null
+++ b/apps/kitchen-sink/src/sections/Tabs.section.tsx
@@ -0,0 +1,72 @@
+import {
+ Tab,
+ TabList,
+ TabPanel,
+ TabPanels,
+ TabsContext,
+ Text,
+} from "@vibe/core";
+import type { Section } from "../section";
+
+const controls: Section["controls"] = [
+ {
+ key: "size",
+ label: "Size",
+ type: "select",
+ options: [
+ { value: "small", label: "Small" },
+ { value: "medium", label: "Medium" },
+ { value: "large", label: "Large" },
+ ],
+ },
+ {
+ key: "activeTab",
+ label: "Active tab",
+ type: "select",
+ options: [
+ { value: "0", label: "Overview" },
+ { value: "1", label: "Activity" },
+ { value: "2", label: "Settings" },
+ ],
+ },
+];
+
+const defaultState = {
+ size: "medium",
+ activeTab: 0,
+};
+
+const Demo: Section["Demo"] = ({ state }) => {
+ const activeTabId = Number(state.activeTab);
+
+ return (
+
+
+ Overview
+ Activity
+ Settings
+
+
+
+ Overview panel content.
+
+
+ Activity panel content.
+
+
+ Settings panel content.
+
+
+
+ );
+};
+
+const section: Section = {
+ id: "tabs",
+ title: "Tabs",
+ defaultState,
+ controls,
+ Demo,
+};
+
+export default section;
diff --git a/apps/kitchen-sink/src/sections/TextField.section.tsx b/apps/kitchen-sink/src/sections/TextField.section.tsx
new file mode 100644
index 0000000000..559e355e8c
--- /dev/null
+++ b/apps/kitchen-sink/src/sections/TextField.section.tsx
@@ -0,0 +1,63 @@
+import { TextField } from "@vibe/core";
+import type { Section } from "../section";
+
+const controls: Section["controls"] = [
+ {
+ key: "size",
+ label: "Size",
+ type: "select",
+ options: [
+ { value: "small", label: "Small" },
+ { value: "medium", label: "Medium" },
+ { value: "large", label: "Large" },
+ ],
+ },
+ {
+ key: "validation",
+ label: "Validation",
+ type: "select",
+ options: [
+ { value: "none", label: "None" },
+ { value: "success", label: "Success" },
+ { value: "error", label: "Error" },
+ ],
+ },
+ { key: "disabled", label: "Disabled", type: "boolean" },
+ { key: "withTitle", label: "Show title", type: "boolean" },
+];
+
+const defaultState = {
+ size: "medium",
+ disabled: false,
+ validation: "none",
+ withTitle: false,
+};
+
+const Demo: Section["Demo"] = ({ state }) => {
+ const validation =
+ state.validation === "success"
+ ? { status: "success" as const, text: "Looks good" }
+ : state.validation === "error"
+ ? { status: "error" as const, text: "This field needs attention" }
+ : undefined;
+
+ return (
+
+ );
+};
+
+const section: Section = {
+ id: "text-field",
+ title: "Text Field",
+ defaultState,
+ controls,
+ Demo,
+};
+
+export default section;
diff --git a/apps/kitchen-sink/src/sections/Toast.section.tsx b/apps/kitchen-sink/src/sections/Toast.section.tsx
new file mode 100644
index 0000000000..634fa9e48d
--- /dev/null
+++ b/apps/kitchen-sink/src/sections/Toast.section.tsx
@@ -0,0 +1,53 @@
+import { useState } from "react";
+import { Button, Toast } from "@vibe/core";
+import type { Section } from "../section";
+
+const controls: Section["controls"] = [
+ {
+ key: "type",
+ label: "Type",
+ type: "select",
+ options: [
+ { value: "positive", label: "Positive" },
+ { value: "negative", label: "Negative" },
+ { value: "warning", label: "Warning" },
+ { value: "normal", label: "Normal" },
+ { value: "dark", label: "Dark" },
+ ],
+ },
+ { key: "withAction", label: "Show action", type: "boolean" },
+];
+
+const defaultState = {
+ type: "positive",
+ withAction: false,
+};
+
+const Demo: Section["Demo"] = ({ state }) => {
+ const [open, setOpen] = useState(false);
+
+ return (
+ <>
+ setOpen(true)}>Show toast
+ setOpen(false)}
+ actions={state.withAction ? [{ type: "button", content: "Undo" }] : undefined}
+ >
+ Changes saved successfully
+
+ >
+ );
+};
+
+const section: Section = {
+ id: "toast",
+ title: "Toast",
+ defaultState,
+ controls,
+ Demo,
+};
+
+export default section;
diff --git a/apps/kitchen-sink/src/sections/index.ts b/apps/kitchen-sink/src/sections/index.ts
new file mode 100644
index 0000000000..bd189f427f
--- /dev/null
+++ b/apps/kitchen-sink/src/sections/index.ts
@@ -0,0 +1,28 @@
+import type { Section } from "../section";
+
+const SECTION_ORDER = [
+ "icon-button",
+ "button",
+ "button-group",
+ "tabs",
+ "label",
+ "chip",
+ "text-field",
+ "dropdown",
+ "menu",
+ "toast",
+ "stroke-spotlight",
+] as const;
+
+const modules = import.meta.glob<{ default: Section }>("./*.section.tsx", {
+ eager: true,
+});
+
+export const sections: Section[] = Object.values(modules)
+ .map((mod) => mod.default)
+ .filter((section) => SECTION_ORDER.includes(section.id as (typeof SECTION_ORDER)[number]))
+ .sort(
+ (a, b) =>
+ SECTION_ORDER.indexOf(a.id as (typeof SECTION_ORDER)[number]) -
+ SECTION_ORDER.indexOf(b.id as (typeof SECTION_ORDER)[number])
+ );
diff --git a/apps/kitchen-sink/src/styles.css b/apps/kitchen-sink/src/styles.css
new file mode 100644
index 0000000000..c781186104
--- /dev/null
+++ b/apps/kitchen-sink/src/styles.css
@@ -0,0 +1,1358 @@
+* {
+ box-sizing: border-box;
+}
+
+/*
+ * The surface tokens (--surface-* / --text-on-surface-*) now ship in the style
+ * package, so the Current pane picks them up from the workspace build. They are
+ * deliberately NOT polyfilled here: the Original pane running published Vibe 3
+ * should show the pre-facelift look, which is the point of the comparison.
+ */
+
+body {
+ margin: 0;
+ font-family: Figtree, Roboto, -apple-system, BlinkMacSystemFont, sans-serif;
+ background: var(--primary-background-color, #f6f7fb);
+ color: var(--primary-text-color, #323338);
+}
+
+.layout {
+ --left-pane-width: 240px;
+ display: flex;
+ min-height: 100vh;
+}
+
+.layout.is-left-pane-collapsed {
+ --left-pane-width: 56px;
+}
+
+.left-pane {
+ position: sticky;
+ top: 0;
+ width: var(--left-pane-width);
+ flex-shrink: 0;
+ height: 100vh;
+ overflow-x: hidden;
+ overflow-y: auto;
+ padding: 24px 12px;
+ background: var(--secondary-background-color, #ffffff);
+ border-right: 1px solid var(--layout-border-color, #e6e9ef);
+ display: flex;
+ flex-direction: column;
+ transition: width 200ms ease;
+}
+
+.left-pane.is-collapsed {
+ padding: 24px 8px;
+}
+
+.left-pane-header {
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+ gap: 8px;
+ margin-bottom: 20px;
+ min-height: 28px;
+}
+
+.left-pane.is-collapsed .left-pane-header {
+ justify-content: center;
+ margin-bottom: 0;
+}
+
+.left-pane-title {
+ margin: 0;
+ font-size: 18px;
+ font-weight: 700;
+ line-height: 1.3;
+ flex: 1;
+ min-width: 0;
+}
+
+.left-pane-toggle {
+ flex-shrink: 0;
+ width: 32px;
+ height: 32px;
+ padding: 0;
+ border: 1px solid var(--layout-border-color, #e6e9ef);
+ border-radius: var(--border-radius-small, 4px);
+ background: var(--secondary-background-color, #ffffff);
+ font: inherit;
+ font-size: 18px;
+ line-height: 1;
+ cursor: pointer;
+ color: var(--secondary-text-color, #676879);
+}
+
+.left-pane-toggle:hover {
+ background: var(--primary-background-hover-color, #eff1f8);
+}
+
+.left-pane.is-collapsed .left-pane-nav,
+.left-pane.is-collapsed .left-pane-footer {
+ opacity: 0;
+ visibility: hidden;
+ pointer-events: none;
+}
+
+.left-pane-nav {
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+ flex: 1;
+}
+
+.left-pane-link,
+.left-pane-sublink,
+.left-pane-theme-mode {
+ padding: 7px 10px;
+ border: none;
+ border-radius: 4px;
+ background: none;
+ font: inherit;
+ font-size: 14px;
+ text-align: left;
+ cursor: pointer;
+ color: var(--primary-text-color, #323338);
+}
+
+.left-pane-sublink {
+ padding-left: 24px;
+ font-size: 13px;
+}
+
+.left-pane-sublink--deep {
+ padding-left: 38px;
+}
+
+.left-pane-link:hover,
+.left-pane-sublink:hover,
+.left-pane-theme-mode:hover {
+ background: var(--primary-background-hover-color, #eff1f8);
+}
+
+.left-pane-link.is-active,
+.left-pane-sublink.is-active,
+.left-pane-theme-mode.is-active {
+ background: var(--primary-selected-color, #cce5ff);
+ font-weight: 600;
+}
+
+.left-pane-footer {
+ margin-top: auto;
+ padding-top: 16px;
+ border-top: 1px solid var(--layout-border-color, #e6e9ef);
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+
+.left-pane-footer-section {
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+}
+
+.left-pane-footer-label {
+ padding: 0 10px 4px;
+ font-size: 11px;
+ font-weight: 600;
+ letter-spacing: 0.4px;
+ text-transform: uppercase;
+ color: var(--secondary-text-color, #676879);
+}
+
+.left-pane-footer-button-group {
+ padding: 0 10px;
+}
+
+.main-area {
+ flex: 1;
+ min-width: 0;
+ min-height: 100vh;
+ padding: 32px;
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+}
+
+.component-grid {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 20px;
+}
+
+.component-card {
+ position: relative;
+ min-height: 220px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ background: var(--secondary-background-color, #ffffff);
+ border: 1px solid var(--layout-border-color, #e6e9ef);
+ border-radius: var(--border-radius-medium, 8px);
+ padding: 16px;
+ cursor: pointer;
+}
+
+.component-card.is-static {
+ cursor: default;
+}
+
+.component-card.is-focused {
+ border-color: var(--primary-color, #0073ea);
+ outline: 2px solid var(--primary-selected-color, #cce5ff);
+}
+
+.component-card-title {
+ position: absolute;
+ top: 16px;
+ left: 16px;
+ margin: 0;
+ font-size: 13px;
+ font-weight: 600;
+ color: var(--secondary-text-color, #676879);
+ text-transform: uppercase;
+ letter-spacing: 0.4px;
+}
+
+.component-card-demo {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ max-width: 100%;
+ padding-top: 24px;
+ overflow-x: auto;
+}
+
+.components-view {
+ display: flex;
+ flex-direction: column;
+ flex: 1;
+ min-height: 0;
+ gap: 20px;
+ padding-bottom: 160px;
+}
+
+.control-bar-dock {
+ position: fixed;
+ bottom: 40px;
+ left: calc(var(--left-pane-width) + 32px);
+ right: 32px;
+ display: grid;
+ z-index: 10;
+ transition: left 200ms ease;
+ min-height: 72px;
+}
+
+.control-bar {
+ grid-area: 1 / 1;
+ display: flex;
+ flex-wrap: wrap;
+ gap: 12px;
+ align-items: center;
+ padding: 16px 20px;
+ border-radius: var(--border-radius-large, 12px);
+ background: var(--secondary-background-color, #ffffff);
+ box-shadow: var(--box-shadow-large, 0 12px 32px rgba(0, 0, 0, 0.18));
+ will-change: transform, opacity;
+}
+
+.control-bar--enter {
+ animation: control-bar-enter 360ms cubic-bezier(0.22, 1, 0.36, 1) both;
+}
+
+.control-bar--exit {
+ animation: control-bar-exit 300ms cubic-bezier(0.4, 0, 0.2, 1) forwards;
+ pointer-events: none;
+}
+
+@keyframes control-bar-enter {
+ from {
+ opacity: 0;
+ transform: translateY(20px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+@keyframes control-bar-exit {
+ from {
+ opacity: 1;
+ transform: translateY(0);
+ }
+ to {
+ opacity: 0;
+ transform: translateY(20px);
+ }
+}
+
+.control-bar-label {
+ font-size: 14px;
+ font-weight: 600;
+ margin-right: 8px;
+}
+
+.theme-panel {
+ display: flex;
+ flex-direction: column;
+ gap: 24px;
+ max-width: 720px;
+}
+
+.theme-page {
+ display: flex;
+ flex-direction: column;
+ gap: 64px;
+ width: 100%;
+ max-width: none;
+ padding-bottom: 48px;
+}
+
+.theme-page-header {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+ max-width: 720px;
+}
+
+.theme-section-tabs {
+ margin-top: -32px;
+}
+
+.theme-section-row {
+ display: flex;
+ gap: 22px;
+ align-items: flex-start;
+}
+
+.theme-section-copy {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+ flex: 0 0 168px;
+ max-width: 196px;
+}
+
+.theme-swatch-panel {
+ flex: 1;
+ min-width: 0;
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
+ gap: 22px 17px;
+ padding: 22px;
+ border-radius: 17px;
+ background: var(--allgrey-background-color, #f6f7fb);
+}
+
+.theme-token-panel {
+ grid-template-columns: repeat(auto-fill, minmax(154px, 1fr));
+}
+
+.theme-color-swatch {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ gap: 11px;
+ min-width: 0;
+}
+
+.theme-color-swatch.is-overridden .theme-color-swatch-preview {
+ outline: 2px solid var(--primary-color, #0073ea);
+ outline-offset: 2px;
+}
+
+.theme-color-swatch-preview {
+ width: 100%;
+ height: 84px;
+ border: none;
+ border-radius: 11px;
+ padding: 0;
+ cursor: pointer;
+}
+
+.theme-color-swatch-preview.has-border {
+ border: 2px solid var(--primary-text-color, #323338);
+}
+
+.theme-color-swatch-picker {
+ position: absolute;
+ width: 0;
+ height: 0;
+ opacity: 0;
+ pointer-events: none;
+}
+
+.theme-color-swatch-meta {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ padding: 0 4px;
+}
+
+.theme-color-swatch-editor {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+
+.theme-color-alpha-field {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+}
+
+.theme-color-alpha-picker {
+ width: 100%;
+ height: 32px;
+ padding: 0;
+ border: 1px solid var(--ui-border-color, #c5c7d0);
+ border-radius: 8px;
+ cursor: pointer;
+ background: none;
+}
+
+.theme-color-alpha-slider-row {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+
+.theme-color-alpha-slider {
+ flex: 1;
+}
+
+.theme-color-swatch-reset {
+ align-self: flex-start;
+ border: none;
+ background: none;
+ padding: 0;
+ font: inherit;
+ font-size: 12px;
+ color: var(--link-color, #1f76c2);
+ cursor: pointer;
+}
+
+.theme-color-swatch-reset:hover {
+ text-decoration: underline;
+}
+
+.theme-token-card {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ padding: 16px;
+ border-radius: 16px;
+ background: var(--primary-background-color, #fff);
+}
+
+.theme-radius-preview-box {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ height: 84px;
+ background: var(--ui-background-color, #e6e9ef);
+}
+
+.theme-field {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+}
+
+.theme-preview-strip {
+ display: flex;
+ gap: 16px;
+ align-items: center;
+ padding: 16px;
+ border: 1px dashed var(--layout-border-color, #e6e9ef);
+ border-radius: var(--border-radius-medium, 8px);
+}
+
+.card-error {
+ font-size: 12px;
+ color: var(--negative-color, #d83a52);
+ text-align: center;
+ padding: 8px;
+}
+
+/* Remove padding from main-area when showing screens view */
+.main-area--no-padding {
+ padding: 0;
+ gap: 0;
+}
+
+/* Screens view */
+.screens-view {
+ display: flex;
+ flex-direction: column;
+ flex: 1;
+ min-height: 0;
+}
+
+.screens-tab-bar {
+ display: flex;
+ gap: 2px;
+ padding: 0 12px;
+ height: 48px;
+ align-items: center;
+ border-bottom: 1px solid var(--layout-border-color, #e6e9ef);
+ background: var(--secondary-background-color, #ffffff);
+ flex-shrink: 0;
+}
+
+.screens-tab {
+ padding: 6px 14px;
+ border: none;
+ border-radius: 4px;
+ background: none;
+ font: inherit;
+ font-size: 14px;
+ cursor: pointer;
+ color: var(--secondary-text-color, #676879);
+}
+
+.screens-tab:hover {
+ background: var(--primary-background-hover-color, #eff1f8);
+ color: var(--primary-text-color, #323338);
+}
+
+.screens-tab.is-active {
+ background: var(--primary-selected-color, #cce5ff);
+ color: var(--primary-text-color, #323338);
+ font-weight: 600;
+}
+
+.screens-iframe {
+ width: 100%;
+ height: calc(100vh - 48px);
+ border: none;
+ display: block;
+ flex: 1;
+}
+
+/* Facelift theme toggle */
+.theme-mode-toggle-row {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ padding: 16px 22px;
+ border-radius: 17px;
+ background: var(--allgrey-background-color, #f6f7fb);
+}
+
+.theme-mode-toggle-label {
+ font-size: 13px;
+ font-weight: 600;
+ color: var(--secondary-text-color, #676879);
+ text-transform: uppercase;
+ letter-spacing: 0.4px;
+ flex-shrink: 0;
+}
+
+.theme-mode-toggle-group {
+ display: flex;
+ gap: 4px;
+}
+
+.theme-mode-toggle-btn {
+ padding: 6px 16px;
+ border: 1px solid var(--ui-border-color, #c5c7d0);
+ border-radius: 6px;
+ background: var(--primary-background-color, #ffffff);
+ font: inherit;
+ font-size: 14px;
+ cursor: pointer;
+ color: var(--primary-text-color, #323338);
+ transition: background 100ms ease;
+}
+
+.theme-mode-toggle-btn:hover {
+ background: var(--primary-background-hover-color, #eff1f8);
+}
+
+.theme-mode-toggle-btn.is-active {
+ background: var(--primary-color, #0073ea);
+ border-color: var(--primary-color, #0073ea);
+ color: var(--text-color-on-primary, #ffffff);
+ font-weight: 600;
+}
+
+.component-gallery,
+.toast-gallery {
+ display: flex;
+ flex-direction: column;
+ gap: 24px;
+}
+
+.component-gallery-header,
+.toast-gallery-header {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.component-gallery-title,
+.toast-gallery-title {
+ margin: 0;
+ font-size: 28px;
+ font-weight: 600;
+ color: var(--primary-text-color, #323338);
+}
+
+.component-gallery-description,
+.toast-gallery-description {
+ margin: 0;
+ font-size: 14px;
+ color: var(--secondary-text-color, #676879);
+}
+
+.component-gallery-grid,
+.toast-gallery-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(380px, 1fr));
+ gap: 20px;
+}
+
+.component-gallery-item,
+.toast-gallery-item {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ padding: 20px;
+ border: 1px solid var(--layout-border-color, #e6e9ef);
+ border-radius: var(--border-radius-medium, 8px);
+ background: var(--secondary-background-color, #ffffff);
+}
+
+.component-gallery-item-label,
+.toast-gallery-item-label {
+ margin: 0;
+ font-size: 13px;
+ font-weight: 600;
+ color: var(--secondary-text-color, #676879);
+ text-transform: uppercase;
+ letter-spacing: 0.4px;
+}
+
+.component-gallery-item-preview {
+ display: flex;
+ align-items: flex-start;
+ justify-content: center;
+ min-height: 88px;
+ padding: 16px;
+ border-radius: var(--border-radius-small, 4px);
+ background: var(--allgrey-background-color, #f6f7fb);
+}
+
+.chips-gallery .component-gallery-item-preview,
+.segmented-control-gallery .component-gallery-item-preview {
+ background: var(--primary-background-color, #ffffff);
+}
+
+.toast-gallery-item-preview {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ min-height: 88px;
+ padding: 16px;
+ border-radius: var(--border-radius-small, 4px);
+ background: var(--allgrey-background-color, #f6f7fb);
+}
+
+.button-gallery,
+.chips-gallery,
+.tabs-gallery,
+.text-field-gallery {
+ gap: 40px;
+ max-width: 960px;
+ padding-bottom: 48px;
+}
+
+.button-gallery-section,
+.chips-gallery-section,
+.tabs-gallery-section,
+.text-field-gallery-section {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+}
+
+.button-gallery-section-title,
+.chips-gallery-section-title,
+.tabs-gallery-section-title,
+.text-field-gallery-section-title {
+ margin: 0;
+ font-size: 16px;
+ font-weight: 600;
+ line-height: 1.3;
+ color: var(--primary-text-color, #323338);
+}
+
+.button-gallery-row,
+.chips-gallery-row {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: 12px;
+}
+
+.menu-gallery-preview {
+ /* Original: hug published Menu width. Current overrides to a fixed shell width. */
+ width: fit-content;
+ max-width: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: stretch;
+ gap: 8px;
+}
+
+.menu-gallery-preview-label {
+ font-size: 12px;
+ font-weight: 600;
+ color: var(--secondary-text-color, #676879);
+}
+
+.menu-gallery-row {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: flex-start;
+ gap: 20px;
+ width: 100%;
+}
+
+.menu-gallery .component-gallery-item-preview {
+ justify-content: flex-start;
+ overflow: visible;
+}
+
+.menu-gallery .component-gallery-item:has(.menu-gallery-row) .component-gallery-item-preview {
+ min-height: auto;
+}
+
+@scope (body.current-vibe-source) {
+/* Menu popover shell: 8px padding, 12px radius; items fill width with 8px radius */
+.menu-gallery-preview {
+ width: 280px;
+}
+
+.menu-gallery {
+ --border-radius-medium: 12px;
+}
+
+.menu-gallery-shell {
+ width: 100% !important;
+ padding: 8px !important;
+ box-sizing: border-box !important;
+ border-radius: 12px !important;
+}
+
+.menu-gallery-shell [data-vibe="Menu"],
+.menu-gallery-shell ul[role="menu"],
+.menu-gallery-shell ul {
+ width: 100% !important;
+ min-width: 0 !important;
+ max-width: none !important;
+ padding: 0 !important;
+ margin: 0 !important;
+ box-sizing: border-box !important;
+}
+
+.menu-gallery-shell [role="menuitem"],
+.menu-gallery-shell [data-testid^="menu-item"],
+.menu-gallery-shell li {
+ width: 100% !important;
+ max-width: 100% !important;
+ box-sizing: border-box !important;
+ border-radius: var(--border-radius-medium, 8px) !important;
+}
+
+/* legacy class — keep in sync while HMR catches up */
+.menu-gallery-popover,
+.menu-gallery [data-testid="dialog-content-container"],
+.menu-gallery [class*="dialogContentContainer"][class*="typePopover"],
+.menu-gallery [class*="typePopover"] {
+ width: 100% !important;
+ padding: 8px !important;
+ box-sizing: border-box !important;
+ border-radius: 12px !important;
+}
+
+.menu-gallery-popover [data-vibe="Menu"],
+.menu-gallery-popover ul[role="menu"],
+.menu-gallery-popover ul {
+ width: 100% !important;
+ min-width: 0 !important;
+ max-width: none !important;
+ padding: 0 !important;
+ margin: 0 !important;
+ box-sizing: border-box !important;
+}
+
+.menu-gallery-popover [role="menuitem"],
+.menu-gallery-popover [data-testid^="menu-item"],
+.menu-gallery-popover li {
+ width: 100% !important;
+ max-width: 100% !important;
+ box-sizing: border-box !important;
+ border-radius: var(--border-radius-medium, 8px) !important;
+}
+
+.tabs-gallery-block {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ width: 100%;
+}
+
+.tabs-gallery-full-width {
+ width: 100%;
+}
+
+.tabs-gallery-panel {
+ width: 100%;
+ max-width: 480px;
+ min-height: 96px;
+ padding: 16px;
+ border-radius: var(--border-radius-medium, 8px);
+ background: var(--allgrey-background-color, #f6f7fb);
+ color: var(--primary-text-color, #323338);
+ font-size: 14px;
+ line-height: 1.4;
+}
+
+.tabs-gallery-with-panels {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+}
+
+.text-field-gallery-stack {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+ max-width: 320px;
+}
+
+.text-field-gallery-field {
+ width: 100%;
+}
+
+@scope (body.current-vibe-source) {
+/* TextField — 8px corner radius */
+.text-field-gallery [data-vibe="TextField"],
+.text-field-gallery [class*="inputWrapper"] input {
+ border-radius: 8px !important;
+}
+
+/* Medium TextField — 14px input text, 36px height */
+.text-field-gallery .wrapperSizeMedium_a12436bdfe,
+.text-field-gallery [class*="wrapperSizeMedium"] {
+ height: 36px !important;
+}
+
+.text-field-gallery .wrapperSizeMedium_a12436bdfe .input_701407b76d,
+.text-field-gallery [class*="wrapperSizeMedium"] [data-vibe="TextField"],
+.text-field-gallery [class*="wrapperSizeMedium"] input {
+ font: var(--font-text2-normal, 400 14px/20px var(--font-family)) !important;
+ font-size: 14px !important;
+}
+
+/* Large TextField — 40px height */
+.text-field-gallery .wrapperSizeLarge_758d5a2181,
+.text-field-gallery [class*="wrapperSizeLarge"] {
+ height: 40px !important;
+}
+
+/* Leading (left) icon inside TextField */
+.text-field-gallery .text-field-icon-left [class*="iconContainer"] {
+ left: 8px !important;
+ right: auto !important;
+ opacity: 1 !important;
+ pointer-events: none !important;
+}
+
+.text-field-gallery .text-field-icon-left [class*="iconContainer"] [class*="icon"] {
+ opacity: 1 !important;
+ transform: none !important;
+ color: var(--icon-color, #babbbc) !important;
+}
+
+.text-field-gallery .text-field-icon-left [class*="tooltipContainer"] {
+ left: 0 !important;
+ right: auto !important;
+}
+
+.text-field-gallery .text-field-icon-left input {
+ padding-left: 36px !important;
+ padding-right: 8px !important;
+}
+}
+
+.button-gallery-on-color,
+.button-gallery-on-inverted {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: 12px;
+ padding: 16px;
+ border-radius: var(--border-radius-medium, 8px);
+}
+
+.button-gallery-on-color {
+ background: var(--primary-color, #0073ea);
+}
+
+.button-gallery-on-inverted {
+ background: var(--inverted-color-background, #323338);
+}
+
+@scope (body.current-vibe-source) {
+/* Button sizes — medium 36px, large 40px */
+.button-gallery [data-vibe="Button"].sizeMedium_f3e10ffa49,
+.button-gallery [data-vibe="Button"][class*="sizeMedium"] {
+ height: 36px !important;
+}
+
+.button-gallery [data-vibe="Button"].sizeLarge_f3e10ffa49,
+.button-gallery [data-vibe="Button"][class*="sizeLarge"] {
+ height: 40px !important;
+}
+
+[data-vibe="Chips"] {
+ border-radius: var(--border-radius-full, 99px) !important;
+}
+
+/* Chip icons match the chip text color */
+[data-vibe="Chips"] [class*="icon"]:not([class*="close"]),
+[data-vibe="Chips"] [class*="icon"]:not([class*="close"]) svg,
+[data-vibe="Chips"] [class*="icon"]:not([class*="close"]) path {
+ color: currentColor !important;
+ fill: currentColor !important;
+}
+
+/* Chip padding by size + icon presence
+ Medium: no icons 8px; icon side 4px; both sides 4px
+ Small: no icons 4px; icon side 2px; both sides 2px */
+.chips-gallery [data-vibe="Chips"] {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ padding-left: 8px !important;
+ padding-right: 8px !important;
+}
+
+.chips-gallery [data-vibe="Chips"].chips-has-left,
+.chips-gallery [data-vibe="Chips"]:has(.left_7fa2edfc6a),
+.chips-gallery [data-vibe="Chips"]:has([class*="icon"][class*="left"]) {
+ padding-left: 4px !important;
+}
+
+.chips-gallery [data-vibe="Chips"].chips-has-right,
+.chips-gallery [data-vibe="Chips"]:has(.right_428a2f3a3b),
+.chips-gallery [data-vibe="Chips"]:has([class*="icon"][class*="right"]) {
+ padding-right: 4px !important;
+}
+
+.chips-gallery [data-vibe="Chips"].chips-size-small,
+.chips-gallery [data-vibe="Chips"].small_6b913f7642 {
+ padding-left: 4px !important;
+ padding-right: 4px !important;
+}
+
+.chips-gallery [data-vibe="Chips"].chips-size-small.chips-has-left,
+.chips-gallery [data-vibe="Chips"].small_6b913f7642.chips-has-left,
+.chips-gallery [data-vibe="Chips"].chips-size-small:has(.left_7fa2edfc6a),
+.chips-gallery [data-vibe="Chips"].small_6b913f7642:has(.left_7fa2edfc6a),
+.chips-gallery [data-vibe="Chips"].chips-size-small:has([class*="icon"][class*="left"]),
+.chips-gallery [data-vibe="Chips"].small_6b913f7642:has([class*="icon"][class*="left"]) {
+ padding-left: 2px !important;
+}
+
+.chips-gallery [data-vibe="Chips"].chips-size-small.chips-has-right,
+.chips-gallery [data-vibe="Chips"].small_6b913f7642.chips-has-right,
+.chips-gallery [data-vibe="Chips"].chips-size-small:has(.right_428a2f3a3b),
+.chips-gallery [data-vibe="Chips"].small_6b913f7642:has(.right_428a2f3a3b),
+.chips-gallery [data-vibe="Chips"].chips-size-small:has([class*="icon"][class*="right"]),
+.chips-gallery [data-vibe="Chips"].small_6b913f7642:has([class*="icon"][class*="right"]) {
+ padding-right: 2px !important;
+}
+
+/* Read only — no interaction affordance */
+[data-vibe="Chips"].chips-readonly {
+ cursor: default !important;
+ pointer-events: none;
+}
+
+/* Label — filled style: 4px radius, no stroke */
+[data-vibe="Label"] .label_df5becdf59,
+[data-vibe="Label"] [class*="label_"] {
+ border-radius: 4px !important;
+ border: none !important;
+}
+
+[data-vibe="Label"] .label_df5becdf59.small_c6c98c47b1,
+[data-vibe="Label"] [class*="label_"][class*="small_"] {
+ border-radius: 4px !important;
+ padding-block: 2px !important;
+}
+
+[data-vibe="Label"] .withLeg_78e0674148,
+[data-vibe="Label"] [class*="withLeg_"] {
+ border-radius: 4px 4px 4px 0 !important;
+ border-start-start-radius: 4px !important;
+ border-start-end-radius: 4px !important;
+ border-end-end-radius: 4px !important;
+ border-end-start-radius: 0 !important;
+}
+
+/* Fill colors + text */
+[data-vibe="Label"] [class*="kindFill"] {
+ border: none !important;
+ padding: 2px var(--spacing-small, 8px) !important;
+}
+
+[data-vibe="Label"] [class*="kindFill"][class*="small"] {
+ padding: 2px var(--spacing-xs, 4px) !important;
+}
+
+[data-vibe="Label"] [class*="kindFill"][class*="colorPrimary"] {
+ background-color: var(--surface-primary, var(--primary-selected-color)) !important;
+}
+
+[data-vibe="Label"] [class*="kindFill"][class*="colorPrimary"],
+[data-vibe="Label"] [class*="kindFill"][class*="colorPrimary"] [class*="onPrimary"],
+[data-vibe="Label"] [class*="kindFill"][class*="colorPrimary"] [class*="onInverted"],
+[data-vibe="Label"] [class*="kindFill"][class*="colorPrimary"] *:not(svg):not(path) {
+ color: var(--primary-color) !important;
+}
+
+[data-vibe="Label"] [class*="kindFill"][class*="colorPrimary"] svg path {
+ fill: var(--surface-primary, var(--primary-selected-color)) !important;
+}
+
+[data-vibe="Label"] [class*="kindFill"][class*="colorPositive"] {
+ background-color: var(--surface-positive, var(--positive-color-selected)) !important;
+}
+
+[data-vibe="Label"] [class*="kindFill"][class*="colorPositive"],
+[data-vibe="Label"] [class*="kindFill"][class*="colorPositive"] [class*="onPrimary"],
+[data-vibe="Label"] [class*="kindFill"][class*="colorPositive"] [class*="onInverted"],
+[data-vibe="Label"] [class*="kindFill"][class*="colorPositive"] *:not(svg):not(path) {
+ color: var(--positive-color) !important;
+}
+
+[data-vibe="Label"] [class*="kindFill"][class*="colorPositive"] svg path {
+ fill: var(--surface-positive, var(--positive-color-selected)) !important;
+}
+
+[data-vibe="Label"] [class*="kindFill"][class*="colorNegative"] {
+ background-color: var(--surface-negative, var(--negative-color-selected)) !important;
+}
+
+[data-vibe="Label"] [class*="kindFill"][class*="colorNegative"],
+[data-vibe="Label"] [class*="kindFill"][class*="colorNegative"] [class*="onPrimary"],
+[data-vibe="Label"] [class*="kindFill"][class*="colorNegative"] [class*="onInverted"],
+[data-vibe="Label"] [class*="kindFill"][class*="colorNegative"] *:not(svg):not(path) {
+ color: var(--negative-color) !important;
+}
+
+[data-vibe="Label"] [class*="kindFill"][class*="colorNegative"] svg path {
+ fill: var(--surface-negative, var(--negative-color-selected)) !important;
+}
+
+[data-vibe="Label"] [class*="kindFill"][class*="colorDark"] {
+ background-color: var(--ui-background-color) !important;
+}
+
+[data-vibe="Label"] [class*="kindFill"][class*="colorDark"],
+[data-vibe="Label"] [class*="kindFill"][class*="colorDark"] [class*="onPrimary"],
+[data-vibe="Label"] [class*="kindFill"][class*="colorDark"] [class*="onInverted"],
+[data-vibe="Label"] [class*="kindFill"][class*="colorDark"] *:not(svg):not(path) {
+ color: var(--primary-text-color) !important;
+}
+
+[data-vibe="Label"] [class*="kindFill"][class*="colorDark"] svg path {
+ fill: var(--ui-background-color) !important;
+}
+
+/* Filterable — primary theme only: default / hover / pressed */
+[data-vibe="Chips"].chips-filterable {
+ background-color: var(--ui-background-color) !important;
+ color: var(--primary-text-color) !important;
+ cursor: pointer !important;
+ pointer-events: auto;
+}
+
+[data-vibe="Chips"].chips-filterable *:not(svg):not(path) {
+ color: var(--primary-text-color) !important;
+}
+
+[data-vibe="Chips"].chips-filterable [class*="icon"]:not([class*="close"]),
+[data-vibe="Chips"].chips-filterable [class*="icon"]:not([class*="close"]) svg,
+[data-vibe="Chips"].chips-filterable [class*="icon"]:not([class*="close"]) path {
+ color: currentColor !important;
+ fill: currentColor !important;
+}
+
+[data-vibe="Chips"].chips-filterable:hover:not(.chips-filterable--pressed):not(.chips-filterable--hover),
+[data-vibe="Chips"].chips-filterable:active:not(.chips-filterable--pressed):not(.chips-filterable--hover) {
+ background-color: var(--ui-background-hover-color) !important;
+ color: var(--primary-text-color) !important;
+}
+
+[data-vibe="Chips"].chips-filterable:hover:not(.chips-filterable--pressed):not(.chips-filterable--hover)
+ *:not(svg):not(path),
+[data-vibe="Chips"].chips-filterable:active:not(.chips-filterable--pressed):not(.chips-filterable--hover)
+ *:not(svg):not(path) {
+ color: var(--primary-text-color) !important;
+}
+
+/* Gallery example — permanently show hover colors */
+[data-vibe="Chips"].chips-filterable--hover {
+ background-color: var(--ui-background-hover-color) !important;
+ color: var(--primary-text-color) !important;
+}
+
+[data-vibe="Chips"].chips-filterable--hover *:not(svg):not(path) {
+ color: var(--primary-text-color) !important;
+}
+
+[data-vibe="Chips"].chips-filterable--pressed {
+ background-color: var(--primary-color) !important;
+ color: var(--text-color-on-inverted) !important;
+}
+
+[data-vibe="Chips"].chips-filterable--pressed *:not(svg):not(path) {
+ color: var(--text-color-on-inverted) !important;
+}
+
+[data-vibe="Chips"].chips-filterable--pressed [class*="icon"]:not([class*="close"]),
+[data-vibe="Chips"].chips-filterable--pressed [class*="icon"]:not([class*="close"]) svg,
+[data-vibe="Chips"].chips-filterable--pressed [class*="icon"]:not([class*="close"]) path {
+ color: currentColor !important;
+ fill: currentColor !important;
+}
+
+[data-vibe="Chips"].chips-filterable[aria-disabled="true"],
+[data-vibe="Chips"].chips-filterable--disabled {
+ background-color: var(--disabled-background-color) !important;
+ cursor: not-allowed !important;
+ pointer-events: none;
+}
+
+/* Size — small: 20px height, 12px text */
+[data-vibe="Chips"].chips-size-small {
+ height: 20px !important;
+}
+
+[data-vibe="Chips"].chips-size-small,
+[data-vibe="Chips"].chips-size-small * {
+ font-size: 12px !important;
+ line-height: 16px !important;
+}
+
+/* Theme fills are the component's job now: Chips styles its semantic colors with
+ `color-*` classes off --surface-*, so the gallery just passes `color` and these
+ !important overrides are gone. They were only ever needed because the fill used
+ to be an inline style, which nothing but !important can outrank. */
+
+/* Removable — close on hover; lock width & truncate label so chip doesn't grow */
+.chips-gallery [data-vibe="Chips"]:has([data-testid$="-close"]),
+[data-vibe="Chips"].chips-close-on-hover {
+ position: relative !important;
+ box-sizing: border-box !important;
+}
+
+.chips-gallery [data-vibe="Chips"]:has([data-testid$="-close"]) [class*="label"],
+[data-vibe="Chips"].chips-close-on-hover [class*="label"] {
+ min-width: 0 !important;
+ flex: 1 1 auto !important;
+ overflow: hidden !important;
+ text-overflow: ellipsis !important;
+ white-space: nowrap !important;
+}
+
+.chips-gallery [data-vibe="Chips"]:has([data-testid$="-close"]) [class*="close"],
+[data-vibe="Chips"].chips-close-on-hover [class*="close"] {
+ position: absolute !important;
+ inset-inline-end: 4px !important;
+ top: 50% !important;
+ transform: translateY(-50%) !important;
+ margin: 0 !important;
+ opacity: 0 !important;
+ pointer-events: none !important;
+ z-index: 1 !important;
+}
+
+.chips-gallery [data-vibe="Chips"]:has([data-testid$="-close"]):hover,
+.chips-gallery [data-vibe="Chips"]:has([data-testid$="-close"]):focus-within,
+[data-vibe="Chips"].chips-close-on-hover:hover,
+[data-vibe="Chips"].chips-close-on-hover:focus-within {
+ padding-inline-end: 26px !important;
+}
+
+.chips-gallery [data-vibe="Chips"]:has([data-testid$="-close"]):hover [class*="close"],
+.chips-gallery [data-vibe="Chips"]:has([data-testid$="-close"]):focus-within [class*="close"],
+[data-vibe="Chips"].chips-close-on-hover:hover [class*="close"],
+[data-vibe="Chips"].chips-close-on-hover:focus-within [class*="close"] {
+ opacity: 1 !important;
+ pointer-events: auto !important;
+}
+
+/* Tabs — remove continuous list stroke; keep selected underline only */
+.tabs-gallery [data-vibe="Tab"],
+.tabs-gallery .tabWrapper_64bb561a42 {
+ border: none !important;
+ border-bottom: none !important;
+ box-sizing: border-box !important;
+ position: relative !important;
+ height: 100% !important;
+ padding-inline: 0 !important;
+}
+
+/* Medium / default: 32px button → list 36px */
+.tabs-gallery [class*="tabsList"]:not([class*="lg"]):not([class*="sm"]) {
+ height: 36px !important;
+}
+
+/* Small: 28px button → list 32px */
+.tabs-gallery [class*="tabsList"][class*="sm"] {
+ height: 32px !important;
+}
+
+/* Large: 36px button → list 40px */
+.tabs-gallery [class*="tabsList"][class*="lg"] {
+ height: 40px !important;
+}
+
+/* Published Tab ::after — replaced by gliding selected stroke */
+.tabs-gallery [data-vibe="Tab"]::after,
+.tabs-gallery .tabWrapper_64bb561a42::after {
+ display: none !important;
+ content: none !important;
+}
+
+/*
+ * Tokens — remove this block once design system tokens are live
+ * Pattern: slide-transition (tab indicator)
+ * Tokens used: position · ease-transition · duration-long-250
+ */
+.tabs-gallery {
+ --duration-long-250: 250ms;
+ --duration-short-70: 70ms;
+ --ease-transition: cubic-bezier(0.4, 0, 0.2, 1);
+ --ease-linear: linear;
+}
+
+.tabs-gallery [data-testid="tab-list"],
+.tabs-gallery [class*="tabsWrapper"] {
+ position: relative !important;
+}
+
+.tabs-gallery .tabs-glide-indicator {
+ position: absolute !important;
+ bottom: 0 !important;
+ left: 0;
+ width: 0;
+ height: 2px !important;
+ background-color: var(--primary-color, #0073ea) !important;
+ border-radius: 1px;
+ opacity: 0;
+ z-index: 2 !important;
+ pointer-events: none !important;
+ transition:
+ left var(--duration-long-250) var(--ease-transition),
+ width var(--duration-long-250) var(--ease-transition),
+ opacity var(--duration-short-70) var(--ease-linear);
+}
+
+.tabs-gallery .tabs-glide-indicator.is-visible {
+ opacity: 1;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .tabs-gallery .tabs-glide-indicator {
+ /* Keep the state change legible, drop the movement */
+ transition: opacity var(--duration-short-70) var(--ease-linear);
+ }
+}
+
+.tabs-gallery [data-vibe="Tab"] [class*="tabInner"],
+.tabs-gallery .tabInner_9a6c557a1b {
+ border-radius: 8px !important;
+ /* Fills list height minus 2px gap + 2px stroke */
+ height: calc(100% - 4px) !important;
+ width: fit-content !important;
+ box-sizing: border-box !important;
+ padding: 4px 8px !important;
+ margin-bottom: 0 !important;
+ margin-top: 0 !important;
+ vertical-align: top !important;
+}
+
+.tabs-gallery [class*="stretched"] [data-vibe="Tab"] [class*="tabInner"],
+.tabs-gallery [class*="stretched"] .tabInner_9a6c557a1b,
+.tabs-gallery [class*="stretched"] .tabListTabInner_9508aad887 {
+ width: 100% !important;
+}
+
+.tabs-gallery [data-vibe="Tab"]:not([aria-disabled="true"]) {
+ color: var(--secondary-text-color, #676879) !important;
+}
+
+.tabs-gallery [data-vibe="Tab"]:not([aria-disabled="true"]) [class*="tabInner"],
+.tabs-gallery [data-vibe="Tab"]:not([aria-disabled="true"]) [class*="tabIcon"] {
+ color: var(--secondary-text-color, #676879) !important;
+}
+
+.tabs-gallery [data-vibe="Tab"][class*="active"]:not([aria-disabled="true"]),
+.tabs-gallery [data-vibe="Tab"][aria-selected="true"]:not([aria-disabled="true"]) {
+ color: var(--primary-text-color, #323338) !important;
+}
+
+.tabs-gallery [data-vibe="Tab"][class*="active"]:not([aria-disabled="true"]) [class*="tabInner"],
+.tabs-gallery [data-vibe="Tab"][aria-selected="true"]:not([aria-disabled="true"]) [class*="tabInner"],
+.tabs-gallery [data-vibe="Tab"][class*="active"]:not([aria-disabled="true"]) [class*="tabIcon"],
+.tabs-gallery [data-vibe="Tab"][aria-selected="true"]:not([aria-disabled="true"]) [class*="tabIcon"] {
+ color: var(--primary-text-color, #323338) !important;
+}
+
+.tabs-gallery [data-vibe="Tab"]:not([aria-disabled="true"]):not([aria-selected="true"]):hover [class*="tabInner"],
+.tabs-gallery [data-vibe="Tab"]:not([aria-disabled="true"]):not([aria-selected="true"]):hover [class*="tabIcon"] {
+ color: var(--primary-text-color, #323338) !important;
+}
+
+.tabs-gallery [data-vibe="Tab"][aria-disabled="true"],
+.tabs-gallery [data-vibe="Tab"][aria-disabled="true"] [class*="tabInner"],
+.tabs-gallery [data-vibe="Tab"][aria-disabled="true"] [class*="tabIcon"] {
+ color: var(--disabled-text-color) !important;
+}
+
+.tabs-gallery [data-vibe="TabList"],
+.tabs-gallery [class*="tabsWrapper"][class*="stretchedUnderline"],
+.tabs-gallery .tabsWrapper_741545fd59.stretchedUnderline_63d1041144 {
+ border-bottom: none !important;
+}
+
+/* 4px gap between tab list and panels */
+.tabs-gallery [class*="tabsWrapper"] + * {
+ margin-top: 4px !important;
+}
+
+/*
+ * TextField focus/active border = primary color.
+ * Match published CSS-module specificity so this wins over injected package styles.
+ */
+.textField_1072f10d5c .inputWrapper_e7231e136e .input_701407b76d:focus,
+.textField_1072f10d5c .inputWrapper_e7231e136e .input_701407b76d:active,
+.textField_1072f10d5c .inputWrapper_e7231e136e .input_701407b76d.inputActive_b69cdfec31,
+[class*="textField"] [class*="inputWrapper"] [data-vibe="TextField"]:focus,
+[class*="textField"] [class*="inputWrapper"] [data-vibe="TextField"]:active,
+[class*="textField"] [class*="inputWrapper"] [class*="inputActive"] {
+ border-color: var(--primary-color, #0073ea) !important;
+}
diff --git a/apps/kitchen-sink/src/styles/themes/warmth.css b/apps/kitchen-sink/src/styles/themes/warmth.css
new file mode 100644
index 0000000000..86305e001d
--- /dev/null
+++ b/apps/kitchen-sink/src/styles/themes/warmth.css
@@ -0,0 +1,241 @@
+/*
+ * Warmth theme — token overrides for the kitchen sink.
+ *
+ * A port of mf-topbar/src/styles/themes/warmth.css. Values are copied verbatim
+ * from that file (itself sourced from Figma "Facelift — Vibe to Sense" → colors,
+ * node 684:115861) so the kitchen sink and mf-topbar render the same palette.
+ * Keep the two in sync; only the selectors differ.
+ *
+ * mf-topbar puts `.warmth` on and relies on the host's light/dark/black
+ * class on . The kitchen sink's AppThemeShell instead puts
+ * `facelift--app-theme` on , so the selectors are rewritten to match.
+ * They stay qualified with `body`: the style package defines
+ * `.facelift-*-app-theme` at the same one-class specificity, and in dev its CSS is
+ * injected after this file, so an unqualified selector would lose on source order.
+ *
+ * Only base tokens are set for light mode. Dark/black set explicit --surface-*
+ * overrides: 8% semantic tint on solid fill (--primary-background-color).
+ */
+
+/* ============================== LIGHT ============================== */
+/*
+ * Surface / border / hover overrides from Figma
+ * Facelift — Vibe to Sense → colors (684:115861)
+ * https://www.figma.com/design/KjthywmxSm5hyCSa1Ln4tA/Facelift---Vibe-to-Sense?node-id=684-115861
+ */
+body.facelift-light-app-theme {
+ --boards-font-family: 'DM Sans', system-ui, 'Figtree', 'Inter', 'Helvetica Neue', Arial, sans-serif;
+ --font-family: var(--boards-font-family);
+ --title-font-family: var(--boards-font-family);
+
+ /* Primary — vibrant blue-indigo */
+ --primary-color: #3543fc;
+ --primary-hover-color: #2434e8;
+
+ /* Semantic */
+ --positive-color: #166d30;
+ --positive-color-hover: #1a7e38;
+ --negative-color: #cd0026;
+ --negative-color-hover: #b50020;
+ --primary-selected-color: #eeeceb;
+ --primary-selected-hover-color: #e8e6e6;
+ --primary-highlighted-color: #f6f4f1;
+
+ /* Surfaces — Figma light overrides */
+ --primary-background-color: #fffefc; /* surface color (card) */
+ --primary-background-hover-color: #eeeceb; /* hover/active color */
+ --primary-background-hover-on-secondary-color: #e8e6e6; /* hover/active on surface */
+ --primary-surface-color: #f6f4f1; /* layout surface color */
+ --secondary-background-color: #fffefc; /* surface color (card) */
+ --allgrey-background-color: #f6f4f1;
+ --grey-background-color: #f6f4f1;
+ --ui-background-color: #ece8e3; /* ui background color */
+ --ui-background-hover-color: #e8e6e6;
+ --dark-background-color: #f6f4f1;
+ --modal-background-color: #fffefc;
+ --dialog-background-color: #fffefc;
+ --disabled-background-color: #eeeceb;
+ --label-background-color: #f6f4f1;
+
+ /* Borders — Figma light overrides */
+ --layout-border-color: #edeaea; /* layout border color */
+ --ui-border-color: #dcd6d8; /* ui border color */
+ --glaze-input-focus-border-color: #dad8da; /* ui border color 2 */
+
+ /* Text & icons — warm charcoal + brown-grey */
+ --primary-text-color: #323338;
+ --secondary-text-color: #5d5552;
+ --icon-color: #b5acaa;
+ --glaze-icon-color-primary: #635c5a;
+ --glaze-icon-color-secondary: #b5acaa;
+ --icon-hover: #574f4d;
+ --placeholder-color: #a89e9b;
+ --link-color: #3543fc;
+ --text-color-on-primary: #ffffff;
+ --text-color-on-inverted: #ffffff;
+ --inverted-color-background: #323338;
+
+ /* Radius — matches Glaze */
+ --glaze-radius-control: 8px;
+ --border-radius-small: var(--glaze-radius-control);
+ --border-radius-medium: var(--glaze-radius-control);
+ --border-radius-big: 14px;
+
+ /* Shared Glaze tokens — warm-shifted rail selection, identical shadows/brand */
+ --glaze-rail-selected-color: #e6e1de;
+ --glaze-rail-selected-hover-color: #ddd7d3;
+ --glaze-layout-gap: var(--space-8);
+ --glaze-shadow-lift: 0 1px 2px rgba(0, 0, 0, 0.06);
+ --glaze-shadow-card: 0 1px 3px rgba(0, 0, 0, 0.04);
+ --glaze-shadow-small: 0 4px 8px rgba(0, 0, 0, 0.2);
+ --glaze-border-hairline: rgba(0, 0, 0, 0.04);
+ --glaze-brand-done: #00ca72;
+ --glaze-brand-working: #fdab3d;
+ --glaze-brand-stuck: #df2f4a;
+ --glaze-brand-bright-blue: #579bfc;
+ --glaze-brand-dark-blue: #007eb5;
+ --glaze-brand-dark-purple: #784bd1;
+ --glaze-brand-purple: #9d50dd;
+ --glaze-brand-lipstick: #ff5ac4;
+ --glaze-brand-sunset: #ff7575;
+ --glaze-brand-dark-orange: #ff6d3b;
+ --glaze-brand-egg-yolk: #ffcb00;
+ --glaze-brand-private: #f65f7c;
+
+ /* Scrim — neutral charcoal with a faint warm tint */
+ --app-scrim-color: rgba(58, 52, 49, 0.55);
+
+ /* RGB companions (for rgba() usage) */
+ --primary-selected-color-rgb: 238, 236, 235;
+ --primary-background-color-rgb: 255, 254, 252;
+ --secondary-background-color-rgb: 255, 254, 252;
+}
+
+/* ============================== DARK ================================ */
+body.facelift-dark-app-theme {
+ --positive-color: #2aad52;
+ --positive-color-hover: #35c060;
+ --negative-color: #e8003a;
+ --negative-color-hover: #f52050;
+ --primary-color: #7080ff;
+ --primary-hover-color: #8a9aff;
+ --text-color-on-primary: #1a1716;
+ --text-color-on-inverted: #1a1716;
+
+ /* Surfaces — platform-style dark grey (lighter base, elevated layers) */
+ --primary-surface-color: #383432;
+ --dark-background-color: #2c2826;
+ --grey-background-color: #2c2826;
+ --allgrey-background-color: #2e2a28;
+ --primary-background-color: #2c2826;
+ --primary-background-hover-color: rgba(255, 255, 255, 0.08);
+ --primary-background-hover-on-secondary-color: #363230;
+ --secondary-background-color: #302c2a;
+ --ui-background-color: #34302e;
+ --ui-background-hover-color: #3a3634;
+ --modal-background-color: #2c2826;
+ --dialog-background-color: #32302e;
+ --disabled-background-color: #302c2a;
+ --label-background-color: #3a3634;
+ --inverted-color-background: #ece4e2;
+ --primary-text-color: #ece4e2;
+ --secondary-text-color: #a89e9b;
+ --icon-color: #948a87;
+ --glaze-icon-color-primary: #a89e9b;
+ --glaze-icon-color-secondary: #948a87;
+ --icon-hover: #c4bab7;
+ --placeholder-color: #645a57;
+ --link-color: #8a9aff;
+ --ui-border-color: #5a5452;
+ --layout-border-color: #524c49;
+ --glaze-input-focus-border-color: #948a87;
+ --glaze-rail-selected-color: #484442;
+ --glaze-rail-selected-hover-color: #524e4c;
+ --primary-selected-color: #484442;
+ --primary-selected-hover-color: #524e4c;
+ --primary-highlighted-color: #32302e;
+
+ /* Semantic surfaces — 8% tint on solid fill */
+ --surface-primary: color-mix(in srgb, var(--primary-color) 8%, var(--primary-background-color));
+ --surface-positive: color-mix(in srgb, var(--positive-color) 8%, var(--primary-background-color));
+ --surface-negative: color-mix(in srgb, var(--negative-color) 8%, var(--primary-background-color));
+ --surface-warning: color-mix(in srgb, var(--warning-color) 8%, var(--primary-background-color));
+ --surface-neutral: color-mix(in srgb, var(--primary-text-color) 8%, var(--primary-background-color));
+ --surface-info: color-mix(in srgb, var(--primary-color) 8%, var(--primary-background-color));
+ --text-on-surface-primary: var(--primary-color);
+ --text-on-surface-positive: var(--positive-color);
+ --text-on-surface-negative: var(--negative-color);
+ --text-on-surface-warning: var(--warning-color);
+ --text-on-surface-neutral: var(--primary-text-color);
+ --text-on-surface-info: var(--primary-color);
+
+ /* RGB companions */
+ --primary-selected-color-rgb: 72, 68, 66;
+ --primary-background-color-rgb: 44, 40, 38;
+ --secondary-background-color-rgb: 48, 44, 42;
+}
+
+/* ============================== BLACK ================================ */
+body.facelift-black-app-theme {
+ --positive-color: #35c060;
+ --positive-color-hover: #42d06e;
+ --negative-color: #f03050;
+ --negative-color-hover: #f85070;
+ --primary-color: #8b97ff;
+ --primary-hover-color: #a4b0ff;
+ --text-color-on-primary: #0a0807;
+ --text-color-on-inverted: #0a0807;
+
+ /* Surfaces — dark base → lighter surface → lightest secondary */
+ --primary-surface-color: #242220;
+ --dark-background-color: #060504;
+ --grey-background-color: #060504;
+ --allgrey-background-color: #0a0807;
+ --primary-background-color: #0f0d0c;
+ --primary-background-hover-color: rgba(255, 255, 255, 0.07);
+ --primary-background-hover-on-secondary-color: #171514;
+ --secondary-background-color: #131110;
+ --ui-background-color: #171514;
+ --ui-background-hover-color: #1b1918;
+ --modal-background-color: #060504;
+ --dialog-background-color: #0a0807;
+ --disabled-background-color: #0c0a09;
+ --label-background-color: #1a1716;
+ --inverted-color-background: #efe7e5;
+ --primary-text-color: #efe7e5;
+ --secondary-text-color: #948a87;
+ --icon-color: #948a87;
+ --glaze-icon-color-primary: #948a87;
+ --glaze-icon-color-secondary: #948a87;
+ --icon-hover: #b4aaa7;
+ --placeholder-color: #4d4441;
+ --link-color: #a4b0ff;
+ --ui-border-color: #443e3b;
+ --layout-border-color: #383432;
+ --glaze-input-focus-border-color: #948a87;
+ --glaze-rail-selected-color: #302c2a;
+ --glaze-rail-selected-hover-color: #3a3634;
+ --primary-selected-color: #302c2a;
+ --primary-selected-hover-color: #3a3634;
+ --primary-highlighted-color: #0a0807;
+
+ /* Semantic surfaces — 8% tint on solid fill */
+ --surface-primary: color-mix(in srgb, var(--primary-color) 8%, var(--primary-background-color));
+ --surface-positive: color-mix(in srgb, var(--positive-color) 8%, var(--primary-background-color));
+ --surface-negative: color-mix(in srgb, var(--negative-color) 8%, var(--primary-background-color));
+ --surface-warning: color-mix(in srgb, var(--warning-color) 8%, var(--primary-background-color));
+ --surface-neutral: color-mix(in srgb, var(--primary-text-color) 8%, var(--primary-background-color));
+ --surface-info: color-mix(in srgb, var(--primary-color) 8%, var(--primary-background-color));
+ --text-on-surface-primary: var(--primary-color);
+ --text-on-surface-positive: var(--positive-color);
+ --text-on-surface-negative: var(--negative-color);
+ --text-on-surface-warning: var(--warning-color);
+ --text-on-surface-neutral: var(--primary-text-color);
+ --text-on-surface-info: var(--primary-color);
+
+ /* RGB companions */
+ --primary-selected-color-rgb: 48, 44, 42;
+ --primary-background-color-rgb: 15, 13, 12;
+ --secondary-background-color-rgb: 19, 17, 16;
+}
+
diff --git a/apps/kitchen-sink/src/tests/cssVarOverrides.test.ts b/apps/kitchen-sink/src/tests/cssVarOverrides.test.ts
new file mode 100644
index 0000000000..b7466b32d6
--- /dev/null
+++ b/apps/kitchen-sink/src/tests/cssVarOverrides.test.ts
@@ -0,0 +1,21 @@
+import { describe, expect, it } from "vitest";
+import { buildCssVarStyle } from "../lib/cssVarOverrides";
+import { EMPTY_TOKEN_OVERRIDES } from "../lib/tokenDefinitions";
+
+describe("buildCssVarStyle", () => {
+ it("maps radius spacing typography overrides to CSS properties", () => {
+ const style = buildCssVarStyle(
+ {
+ ...EMPTY_TOKEN_OVERRIDES,
+ radius: { "--border-radius-medium": "12px" },
+ spacing: { "--space-16": "20px" },
+ typography: { "--font-size-30": "18px" },
+ },
+ "light",
+ "original"
+ );
+ expect(style["--border-radius-medium"]).toBe("12px");
+ expect(style["--space-16"]).toBe("20px");
+ expect(style["--font-size-30"]).toBe("18px");
+ });
+});
diff --git a/apps/kitchen-sink/src/tests/setupLocalStorage.ts b/apps/kitchen-sink/src/tests/setupLocalStorage.ts
new file mode 100644
index 0000000000..fb1b2be1b4
--- /dev/null
+++ b/apps/kitchen-sink/src/tests/setupLocalStorage.ts
@@ -0,0 +1,36 @@
+/**
+ * Vitest's "node" environment does not provide a global `localStorage`.
+ * This minimal in-memory polyfill lets storage.ts tests run without pulling
+ * in a full DOM environment (jsdom/happy-dom).
+ */
+class MemoryStorage implements Storage {
+ private store = new Map();
+
+ get length(): number {
+ return this.store.size;
+ }
+
+ clear(): void {
+ this.store.clear();
+ }
+
+ getItem(key: string): string | null {
+ return this.store.has(key) ? this.store.get(key)! : null;
+ }
+
+ key(index: number): string | null {
+ return Array.from(this.store.keys())[index] ?? null;
+ }
+
+ removeItem(key: string): void {
+ this.store.delete(key);
+ }
+
+ setItem(key: string, value: string): void {
+ this.store.set(key, String(value));
+ }
+}
+
+if (typeof globalThis.localStorage === "undefined") {
+ globalThis.localStorage = new MemoryStorage();
+}
diff --git a/apps/kitchen-sink/src/tests/storage.test.ts b/apps/kitchen-sink/src/tests/storage.test.ts
new file mode 100644
index 0000000000..66fd54ebdf
--- /dev/null
+++ b/apps/kitchen-sink/src/tests/storage.test.ts
@@ -0,0 +1,39 @@
+import { describe, expect, it, beforeEach } from "vitest";
+import { loadPersistedState, savePersistedState, createInitialAppState } from "../lib/storage";
+import { STORAGE_KEY, STORAGE_VERSION } from "../types";
+
+beforeEach(() => {
+ localStorage.clear();
+});
+
+describe("storage", () => {
+ it("returns initial state when nothing stored", () => {
+ const state = loadPersistedState();
+ expect(state.view).toBe("components");
+ expect(state.systemTheme).toBe("light");
+ expect(state.componentStates.button.kind).toBe("primary");
+ });
+
+ it("round-trips persisted fields", () => {
+ const initial = createInitialAppState();
+ initial.systemTheme = "dark";
+ initial.componentStates.button = { ...initial.componentStates.button, kind: "secondary" };
+ savePersistedState(initial);
+
+ const loaded = loadPersistedState();
+ expect(loaded.systemTheme).toBe("dark");
+ expect(loaded.componentStates.button.kind).toBe("secondary");
+ });
+
+ it("resets when version mismatches", () => {
+ localStorage.setItem(
+ STORAGE_KEY,
+ JSON.stringify({ version: 999, systemTheme: "black" })
+ );
+ const loaded = loadPersistedState();
+ expect(loaded.systemTheme).toBe("light");
+
+ const persisted = JSON.parse(localStorage.getItem(STORAGE_KEY) ?? "{}") as { version: number };
+ expect(persisted.version).toBe(STORAGE_VERSION);
+ });
+});
diff --git a/apps/kitchen-sink/src/types.ts b/apps/kitchen-sink/src/types.ts
new file mode 100644
index 0000000000..f6a3fd1e40
--- /dev/null
+++ b/apps/kitchen-sink/src/types.ts
@@ -0,0 +1,89 @@
+import type React from "react";
+
+export type SystemTheme = "light" | "dark" | "black";
+export type ThemeFamily = "original" | "facelift";
+export type AppView = "components" | "theme" | "screens";
+export type ThemeSubPage = "colors" | "radius" | "typography";
+export type ComponentGalleryId =
+ | "icon-button"
+ | "button"
+ | "button-group"
+ | "segmented-control"
+ | "tabs"
+ | "label"
+ | "chip"
+ | "menu"
+ | "text-field"
+ | "dropdown"
+ | "menu"
+ | "toast"
+ | "stroke-spotlight";
+
+export type ComponentSubPage = "grid" | ComponentGalleryId;
+
+export type ThemeColorOverrides = Partial>>;
+
+export type TokenOverrides = {
+ colors: Partial>;
+ radius: Record;
+ spacing: Record;
+ typography: Record;
+};
+
+export type ComponentStateMap = Record>;
+
+export type AppState = {
+ view: AppView;
+ themeSubPage: ThemeSubPage;
+ componentSubPage: ComponentSubPage;
+ systemTheme: SystemTheme;
+ tokenOverrides: TokenOverrides;
+ componentStates: ComponentStateMap;
+ focusedComponentId: string | null;
+ faceliftTheme: boolean;
+};
+
+export const STORAGE_VERSION = 2;
+export const STORAGE_KEY = "facelift-kitchen-sink-state";
+
+export type PersistedState = {
+ version: number;
+ view: AppView;
+ themeSubPage: ThemeSubPage;
+ componentSubPage?: ComponentSubPage;
+ systemTheme: SystemTheme;
+ tokenOverrides: TokenOverrides;
+ componentStates: ComponentStateMap;
+ focusedComponentId: string | null;
+ faceliftTheme: boolean;
+};
+
+export type ControlOption = { value: string; label: string };
+
+export type ControlDef =
+ | {
+ key: string;
+ label: string;
+ type: "select";
+ options: ControlOption[];
+ }
+ | {
+ key: string;
+ label: string;
+ type: "boolean";
+ };
+
+export interface Section {
+ id: string;
+ title: string;
+ defaultState: Record;
+ controls: ControlDef[];
+ Demo: React.FC<{ state: Record }>;
+}
+
+export function getThemeFamily(faceliftTheme: boolean): ThemeFamily {
+ return faceliftTheme ? "facelift" : "original";
+}
+
+export type TokenFieldDef =
+ | { id: string; label: string; kind: "css-var"; cssVar: string; unit?: string; defaultValue: string; description?: string };
diff --git a/apps/kitchen-sink/tsconfig.json b/apps/kitchen-sink/tsconfig.json
new file mode 100644
index 0000000000..24200c8663
--- /dev/null
+++ b/apps/kitchen-sink/tsconfig.json
@@ -0,0 +1,42 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "useDefineForClassFields": true,
+ "lib": ["ES2020", "ES2022.Intl", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx",
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true,
+ "types": ["vite/client"],
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/screens/*"],
+ "@vibe/core/tokens": ["./node_modules/@vibe/core/dist/tokens/tokens.css"],
+ "@vibe/core/next": ["../../packages/core/src/components/next.ts"],
+ "@vibe/core": ["../../packages/core/src/index.ts"],
+ "@vibe/icons": ["../../packages/icons/src/react/index.ts"],
+ "@vibe/hooks": ["../../packages/hooks/src/index.ts"],
+ "@vibe/shared": ["../../packages/shared/src/index.ts"],
+ "@vibe/base": ["../../packages/base/src/index.ts"],
+ "@vibe/button": ["../../packages/components/button/src/index.ts"],
+ "@vibe/clickable": ["../../packages/components/clickable/src/index.ts"],
+ "@vibe/dialog": ["../../packages/components/dialog/src/index.ts"],
+ "@vibe/icon": ["../../packages/components/icon/src/index.ts"],
+ "@vibe/icon-button": ["../../packages/components/icon-button/src/index.ts"],
+ "@vibe/layer": ["../../packages/components/layer/src/index.ts"],
+ "@vibe/layout": ["../../packages/components/layout/src/index.ts"],
+ "@vibe/loader": ["../../packages/components/loader/src/index.ts"],
+ "@vibe/tooltip": ["../../packages/components/tooltip/src/index.ts"],
+ "@vibe/typography": ["../../packages/components/typography/src/index.ts"]
+ }
+ },
+ "include": ["src"]
+}
diff --git a/apps/kitchen-sink/vite.config.ts b/apps/kitchen-sink/vite.config.ts
new file mode 100644
index 0000000000..d8ced5b137
--- /dev/null
+++ b/apps/kitchen-sink/vite.config.ts
@@ -0,0 +1,159 @@
+import { defineConfig, type AliasOptions } from "vite";
+import react from "@vitejs/plugin-react";
+import fs from "fs";
+import path from "path";
+import { fileURLToPath } from "url";
+
+const rootDir = path.dirname(fileURLToPath(import.meta.url));
+const repoRoot = path.resolve(rootDir, "../..");
+const packagesDir = path.resolve(repoRoot, "packages");
+
+type Tsconfig = {
+ compilerOptions?: {
+ baseUrl?: string;
+ paths?: Record;
+ };
+};
+
+/**
+ * Yarn workspaces already symlink `@vibe/*` into node_modules.
+ * Package exports still point at `dist`, so we remap to source via tsconfig paths
+ * (single source of truth for IDE + Vite).
+ */
+function aliasesFromTsconfig(): AliasOptions {
+ const tsconfigPath = path.join(rootDir, "tsconfig.json");
+ const tsconfig = JSON.parse(fs.readFileSync(tsconfigPath, "utf8")) as Tsconfig;
+ const baseUrl = path.resolve(rootDir, tsconfig.compilerOptions?.baseUrl ?? ".");
+ const paths = tsconfig.compilerOptions?.paths ?? {};
+
+ // Longer keys first so `@vibe/core/next` wins over `@vibe/core`.
+ return Object.entries(paths)
+ .map(([pattern, targets]) => {
+ const find = pattern.replace(/\/\*$/, "");
+ const target = (targets[0] ?? "").replace(/\/\*$/, "");
+ return {
+ find,
+ replacement: path.resolve(baseUrl, target),
+ };
+ })
+ .sort((a, b) => b.find.length - a.find.length);
+}
+
+const tsconfigAliases = aliasesFromTsconfig();
+const vibePackageNames = tsconfigAliases
+ .map(alias => (typeof alias.find === "string" ? alias.find : null))
+ .filter((name): name is string => !!name?.startsWith("@vibe/"));
+
+export default defineConfig({
+ plugins: [react()],
+ server: {
+ host: "127.0.0.1",
+ port: 5220,
+ strictPort: false,
+ fs: {
+ // Workspace packages live outside kitchen-sink/; allow reading their sources.
+ allow: [repoRoot],
+ },
+ },
+ define: {
+ // react-dates (Vibe v3 dep) references Node's `global`; shim it for browsers.
+ global: "globalThis",
+ },
+ optimizeDeps: {
+ // Workspace packages are linked by Yarn; keep them out of the dep optimizer
+ // so Vite always serves the TypeScript/SCSS sources from tsconfig paths.
+ exclude: vibePackageNames,
+ },
+ resolve: {
+ // Prefer a single React copy across workspace packages.
+ // Also dedupe deps imported by aliased @vibe/* sources — Vite resolves those
+ // from packages/core (etc.), which walks up to vibe/ (no node_modules) instead
+ // of apps/kitchen-sink/node_modules.
+ dedupe: ["react", "react-dom", "es-toolkit"],
+ alias: [
+ {
+ find: "es-toolkit",
+ replacement: path.resolve(rootDir, "node_modules/es-toolkit"),
+ },
+ ...tsconfigAliases,
+ // Sass `~@vibe/style/...` / legacy `~/...` imports from component SCSS.
+ // Resolve to the installed package (has built `dist/mixins`); local `packages/style`
+ // often has no dist until `yarn workspace @vibe/style build`.
+ {
+ find: "@vibe/style/dist/index.min.css",
+ replacement: path.resolve(rootDir, "node_modules/@vibe/style/dist/index.min.css"),
+ },
+ {
+ find: "~@vibe/style",
+ replacement: path.resolve(rootDir, "node_modules/@vibe/style"),
+ },
+ {
+ find: "@vibe/style",
+ replacement: path.resolve(rootDir, "node_modules/@vibe/style"),
+ },
+ { find: "~", replacement: path.resolve(repoRoot, "node_modules") },
+ // Deep AgentAvatar import — package barrel pulls monolith-only deps; stub locally when unavailable.
+ {
+ find: "@mondaydotcomorg/monday-ui-components/dist/esm/monday-ui-components/src/components/AgentAvatar/AgentAvatar.js",
+ replacement: path.resolve(rootDir, "./src/screens/components/AgentAvatarStub.tsx"),
+ },
+ // figma:asset/... imports used by screens/ (facelift-prototype) components
+ {
+ find: "figma:asset/f0c15171c575bb8aa71b3703f917cb5be31788dd.png",
+ replacement: path.resolve(rootDir, "./src/screens/assets/f0c15171c575bb8aa71b3703f917cb5be31788dd.png"),
+ },
+ {
+ find: "figma:asset/ec90618f4fe697ef59f9ba376c95f32ab905bf13.png",
+ replacement: path.resolve(rootDir, "./src/screens/assets/ec90618f4fe697ef59f9ba376c95f32ab905bf13.png"),
+ },
+ {
+ find: "figma:asset/e80552e5cd311931922a10d6dd70061713e6b1ac.png",
+ replacement: path.resolve(rootDir, "./src/screens/assets/e80552e5cd311931922a10d6dd70061713e6b1ac.png"),
+ },
+ {
+ find: "figma:asset/cf1083401990504fa214e1814dd9e86530f6484c.png",
+ replacement: path.resolve(rootDir, "./src/screens/assets/cf1083401990504fa214e1814dd9e86530f6484c.png"),
+ },
+ {
+ find: "figma:asset/c3e2da2431edb45e665c1d6bfc0377ef4df16956.png",
+ replacement: path.resolve(rootDir, "./src/screens/assets/c3e2da2431edb45e665c1d6bfc0377ef4df16956.png"),
+ },
+ {
+ find: "figma:asset/99ba70c9442119f320638528787cb086eabb5871.png",
+ replacement: path.resolve(rootDir, "./src/screens/assets/99ba70c9442119f320638528787cb086eabb5871.png"),
+ },
+ {
+ find: "figma:asset/956984e2f299222affe9c3f9d1b91d646e618dbf.png",
+ replacement: path.resolve(rootDir, "./src/screens/assets/956984e2f299222affe9c3f9d1b91d646e618dbf.png"),
+ },
+ {
+ find: "figma:asset/8128ea9b2697cf84d6336d0cf0bbd261c3cae4a6.png",
+ replacement: path.resolve(rootDir, "./src/screens/assets/8128ea9b2697cf84d6336d0cf0bbd261c3cae4a6.png"),
+ },
+ {
+ find: "figma:asset/6f1e4ef08a4e8899bba87998c3410a8132536714.png",
+ replacement: path.resolve(rootDir, "./src/screens/assets/6f1e4ef08a4e8899bba87998c3410a8132536714.png"),
+ },
+ {
+ find: "figma:asset/4791b41afa3cbdfd3b5bceec099dbf0fe05b97cd.png",
+ replacement: path.resolve(rootDir, "./src/screens/assets/4791b41afa3cbdfd3b5bceec099dbf0fe05b97cd.png"),
+ },
+ {
+ find: "figma:asset/44a0d931f8b012dcfc18715f7a64847e76751825.png",
+ replacement: path.resolve(rootDir, "./src/screens/assets/44a0d931f8b012dcfc18715f7a64847e76751825.png"),
+ },
+ {
+ find: "figma:asset/41836246ebeea8335f78a1ba2a938aabf44d0607.png",
+ replacement: path.resolve(rootDir, "./src/screens/assets/41836246ebeea8335f78a1ba2a938aabf44d0607.png"),
+ },
+ {
+ find: "figma:asset/31a207ddb210814d45f4e60c5afe26c81fb55207.png",
+ replacement: path.resolve(rootDir, "./src/screens/assets/31a207ddb210814d45f4e60c5afe26c81fb55207.png"),
+ },
+ {
+ find: "figma:asset/15ef82c8ee79f6111e42949aea8f2307269524d3.png",
+ replacement: path.resolve(rootDir, "./src/screens/assets/15ef82c8ee79f6111e42949aea8f2307269524d3.png"),
+ },
+ ],
+ },
+});
diff --git a/apps/kitchen-sink/vite.original.config.ts b/apps/kitchen-sink/vite.original.config.ts
new file mode 100644
index 0000000000..5e043814ad
--- /dev/null
+++ b/apps/kitchen-sink/vite.original.config.ts
@@ -0,0 +1,75 @@
+import { createRequire } from "node:module";
+import path from "node:path";
+import { fileURLToPath } from "node:url";
+import { defineConfig, type UserConfig } from "vite";
+import currentConfig from "./vite.config";
+
+const rootDir = path.dirname(fileURLToPath(import.meta.url));
+const publishedModules = path.join(rootDir, "published-vibe", "node_modules");
+const publishedRequire = createRequire(path.join(publishedModules, "package.json"));
+const baseConfig = currentConfig as UserConfig;
+
+const publishedSpecifiers = [
+ "@vibe/style/dist/index.min.css",
+ "@vibe/base",
+ "@vibe/button",
+ "@vibe/clickable",
+ "@vibe/dialog",
+ "@vibe/hooks",
+ "@vibe/icon",
+ "@vibe/icon-button",
+ "@vibe/icons",
+ "@vibe/layer",
+ "@vibe/layout",
+ "@vibe/loader",
+ "@vibe/shared",
+ "@vibe/style",
+ "@vibe/tooltip",
+ "@vibe/typography"
+];
+
+const baseAliases = Array.isArray(baseConfig.resolve?.alias) ? baseConfig.resolve.alias : [];
+const sharedAliases = baseAliases.filter(alias => {
+ if (!("find" in alias) || typeof alias.find !== "string") return true;
+ return !alias.find.startsWith("@vibe/") && !alias.find.startsWith("~@vibe/");
+});
+
+export default defineConfig({
+ ...baseConfig,
+ cacheDir: path.join(publishedModules, ".vite"),
+ server: {
+ ...baseConfig.server,
+ port: 5221,
+ strictPort: true
+ },
+ optimizeDeps: {
+ ...baseConfig.optimizeDeps,
+ exclude: []
+ },
+ resolve: {
+ ...baseConfig.resolve,
+ alias: [
+ {
+ find: "@vibe/core/tokens",
+ replacement: publishedRequire.resolve("@vibe/core/tokens")
+ },
+ {
+ find: "@vibe/core/next",
+ replacement: publishedRequire.resolve("@vibe/core/next")
+ },
+ {
+ find: "@vibe-original/core",
+ replacement: publishedRequire.resolve("@vibe/core")
+ },
+ {
+ find: "@vibe/core",
+ replacement: path.join(rootDir, "src/original-vibe-core.js")
+ },
+ ...publishedSpecifiers.map(find => ({
+ find,
+ replacement: publishedRequire.resolve(find)
+ })),
+ ...sharedAliases
+ ]
+ }
+});
diff --git a/apps/kitchen-sink/vitest.config.ts b/apps/kitchen-sink/vitest.config.ts
new file mode 100644
index 0000000000..ce9fb457ec
--- /dev/null
+++ b/apps/kitchen-sink/vitest.config.ts
@@ -0,0 +1,9 @@
+import { defineConfig } from "vitest/config";
+
+export default defineConfig({
+ test: {
+ environment: "node",
+ include: ["src/tests/**/*.test.ts"],
+ setupFiles: ["src/tests/setupLocalStorage.ts"],
+ },
+});
diff --git a/packages/components/button-group/src/ButtonGroup/ButtonGroup.module.scss b/packages/components/button-group/src/ButtonGroup/ButtonGroup.module.scss
index 3280eadf23..e63f2b44b2 100644
--- a/packages/components/button-group/src/ButtonGroup/ButtonGroup.module.scss
+++ b/packages/components/button-group/src/ButtonGroup/ButtonGroup.module.scss
@@ -21,35 +21,32 @@
}
.button {
- border-style: solid;
- border-width: 1px 0;
+ border-style: var(--border-style);
+ border-width: var(--border-width) 0;
background-color: var(--primary-background-color);
- border-color: var(--ui-border-color);
+ border-color: var(--layout-border-color);
- // &:first-of-type {
- // border-inline-start-width: 1px;
- // }
-
- // &:last-of-type {
- // border-inline-end-width: 1px;
- // }
-
- &.activeButton {
- background-color: var(--primary-selected-color);
+ &.activeButton:not(.disabled) {
+ background-color: var(--primary-color);
+ color: var(--text-color-on-primary);
border-color: var(--primary-color);
- border-inline-start-width: 1px;
- border-inline-end-width: 1px;
+ border-inline-width: var(--border-width);
- &:hover {
- background-color: var(--primary-selected-color);
+ &:hover:not(.disabled) {
+ background-color: var(--primary-hover-color);
+ border-color: var(--primary-hover-color);
}
}
&.disabled,
&.buttonDisabled {
background-color: var(--disabled-background-color);
- opacity: 0.5;
+ color: var(--disabled-text-color);
cursor: not-allowed;
+
+ &:hover {
+ background-color: var(--disabled-background-color);
+ }
}
&.startBorder {
diff --git a/packages/components/button/src/Button/Button.module.scss b/packages/components/button/src/Button/Button.module.scss
index ad95129ef4..439c68e127 100644
--- a/packages/components/button/src/Button/Button.module.scss
+++ b/packages/components/button/src/Button/Button.module.scss
@@ -4,6 +4,8 @@ $disabled-on-primary-color-opacity: 0.5;
.button {
--loader-padding: 8px;
+ --icon-gap: var(--space-4);
+ --padding-inline: var(--space-16);
outline: none;
border: none;
height: auto;
@@ -13,8 +15,10 @@ $disabled-on-primary-color-opacity: 0.5;
transition: var(--motion-productive-short) transform,
var(--motion-productive-medium) var(--motion-timing-transition) min-width;
display: inline-flex;
+ flex-shrink: 0;
align-items: center;
justify-content: center;
+ gap: var(--icon-gap);
@include focus-style();
/* Prevent text selection */
-webkit-user-select: none;
@@ -24,7 +28,11 @@ $disabled-on-primary-color-opacity: 0.5;
min-width: auto;
.loader {
- height: 100%;
+ height: 20px;
+
+ &.xxs {
+ width: 10px;
+ }
.loaderSvg {
position: static;
@@ -34,7 +42,9 @@ $disabled-on-primary-color-opacity: 0.5;
}
.textPlaceholder {
- display: inline-block;
+ display: inline-flex;
+ align-items: center;
+ gap: var(--icon-gap);
opacity: 0;
height: 0;
visibility: hidden;
@@ -51,16 +61,17 @@ $disabled-on-primary-color-opacity: 0.5;
display: inline-flex;
align-items: center;
justify-content: center;
+ gap: var(--icon-gap);
}
}
-}
-.marginRight {
- margin-inline-end: var(--space-8);
-}
+ &.hasLeftIcon {
+ padding-inline-start: calc(var(--padding-inline) - var(--space-2));
+ }
-.marginLeft {
- margin-inline-start: var(--space-8);
+ &.hasRightIcon {
+ padding-inline-end: calc(var(--padding-inline) - var(--space-2));
+ }
}
.rightFlat {
@@ -77,18 +88,12 @@ $disabled-on-primary-color-opacity: 0.5;
transform: scale(0.95) translate3d(0, 0, 0);
}
-.button .leftIcon {
- margin-inline-end: var(--space-8);
-}
-
-.button .rightIcon {
- margin-inline-start: var(--space-8);
-}
-
.sizeXxs {
@include smoothing-text;
@include vibe-text(text2, normal);
- padding: 2px var(--space-4);
+ --icon-gap: var(--space-2);
+ --padding-inline: var(--space-4);
+ padding-inline: var(--padding-inline);
height: 16px;
line-height: 16px;
}
@@ -96,7 +101,9 @@ $disabled-on-primary-color-opacity: 0.5;
.sizeXs {
@include smoothing-text;
@include vibe-text(text2, normal);
- padding: var(--space-4) var(--space-8);
+ --icon-gap: var(--space-4);
+ --padding-inline: var(--space-8);
+ padding-inline: var(--padding-inline);
height: 24px;
line-height: 21px;
}
@@ -104,7 +111,9 @@ $disabled-on-primary-color-opacity: 0.5;
.sizeSmall {
@include smoothing-text;
@include vibe-text(text2, normal);
- padding: var(--space-4) var(--space-8);
+ --icon-gap: var(--space-4);
+ --padding-inline: var(--space-8);
+ padding-inline: var(--padding-inline);
height: 32px;
line-height: 24px;
}
@@ -116,14 +125,18 @@ $disabled-on-primary-color-opacity: 0.5;
.sizeMedium {
@include smoothing-text;
@include vibe-text(text1, normal);
- padding: var(--space-8) var(--space-16);
+ --icon-gap: var(--space-4);
+ --padding-inline: var(--space-12);
+ padding-inline: var(--padding-inline);
height: 40px;
}
.sizeLarge {
@include smoothing-text;
@include vibe-text(text1, normal);
- padding: 12px var(--space-24);
+ --padding-inline: var(--space-16);
+ --icon-gap: var(--space-8);
+ padding-inline: var(--padding-inline);
height: 48px;
}
@@ -284,12 +297,10 @@ $disabled-on-primary-color-opacity: 0.5;
.kindSecondary.colorPrimaryActive {
background-color: var(--primary-selected-color);
- border-color: var(--primary-color);
}
.kindSecondary.colorPrimaryActive:hover {
background-color: var(--primary-selected-hover-color);
- border-color: var(--primary-color);
}
.kindSecondary.colorBrandActive {
@@ -569,7 +580,7 @@ $disabled-on-primary-color-opacity: 0.5;
background-color: transparent;
}
-.noSidePadding {
+.button.noSidePadding {
padding-inline: 0;
}
diff --git a/packages/components/button/src/Button/Button.tsx b/packages/components/button/src/Button/Button.tsx
index 8d86b98f52..3700f21188 100644
--- a/packages/components/button/src/Button/Button.tsx
+++ b/packages/components/button/src/Button/Button.tsx
@@ -193,6 +193,8 @@ const Button = forwardRef(
[onMouseDown, disabled, loading, success]
);
+ const hasRenderableChildren = useMemo(() => React.Children.toArray(children).some(Boolean), [children]);
+
const classNames = useMemo(() => {
const calculatedColor = success ? "positive" : color;
return cx(
@@ -212,7 +214,9 @@ const Button = forwardRef(
[styles.preventClickAnimation]: preventClickAnimation,
[styles.noSidePadding]: noSidePadding,
[styles.disabled]: disabled,
- [styles.insetFocusStyle]: insetFocus
+ [styles.insetFocusStyle]: insetFocus,
+ [styles.hasLeftIcon]: !!leftIcon && hasRenderableChildren,
+ [styles.hasRightIcon]: !!rightIcon && hasRenderableChildren
}
);
}, [
@@ -222,6 +226,9 @@ const Button = forwardRef(
size,
kind,
active,
+ leftIcon,
+ rightIcon,
+ hasRenderableChildren,
activeButtonClassName,
marginRight,
marginLeft,
@@ -301,37 +308,19 @@ const Button = forwardRef(
[size]
);
- const hasRenderableChildren = useMemo(() => React.Children.toArray(children).some(Boolean), [children]);
-
const buttonContent = useMemo(
() => (
<>
{leftIcon ? (
-
+
) : null}
{children}
{rightIcon ? (
-
+
) : null}
>
),
- [children, hasRenderableChildren, iconSize, leftIcon, rightIcon]
+ [children, iconSize, leftIcon, rightIcon]
);
if (loading) {
@@ -352,15 +341,7 @@ const Button = forwardRef(
{successIcon ? (
-
+
) : null}
{successText}
diff --git a/packages/components/button/src/Button/__tests__/Button.test.tsx b/packages/components/button/src/Button/__tests__/Button.test.tsx
index b9e39cd772..1621f27260 100644
--- a/packages/components/button/src/Button/__tests__/Button.test.tsx
+++ b/packages/components/button/src/Button/__tests__/Button.test.tsx
@@ -44,12 +44,12 @@ describe(" ", () => {
expect(container.firstChild).toBeEmptyDOMElement();
});
- it("should add leftIcon className when children are renderable", () => {
+ it("should add hasLeftIcon className when children are renderable", () => {
const { getByTestId } = render(Child );
- expect(getByTestId("icon")).toHaveClass("leftIcon");
+ expect(getByTestId("button")).toHaveClass("hasLeftIcon");
});
- it("should not add leftIcon className when children are non-renderable", () => {
+ it("should not add hasLeftIcon className when children are non-renderable", () => {
const { getByTestId } = render(
{false}
@@ -57,7 +57,7 @@ describe(" ", () => {
{undefined}
);
- expect(getByTestId("icon")).not.toHaveClass("leftIcon");
+ expect(getByTestId("button")).not.toHaveClass("hasLeftIcon");
});
});
diff --git a/packages/components/button/src/Button/__tests__/__snapshots__/Button.snapshot.test.tsx.snap b/packages/components/button/src/Button/__tests__/__snapshots__/Button.snapshot.test.tsx.snap
index 4e567d9a77..8af08d5daa 100644
--- a/packages/components/button/src/Button/__tests__/__snapshots__/Button.snapshot.test.tsx.snap
+++ b/packages/components/button/src/Button/__tests__/__snapshots__/Button.snapshot.test.tsx.snap
@@ -393,7 +393,7 @@ exports[`Button renders correctly > renders correctly with leftIcon 1`] = `
renders correctly with leftIcon 1`] = `
>
renders correctly with rightIcon 1`] = `
renders correctly with rightIcon 1`] = `
Button
(() => {
- if (!isShown) return [];
+ if (!isPositioningActive) return [];
const middlewareList: Middleware[] = [];
@@ -142,7 +146,7 @@ function Dialog({
}
return middlewareList;
- }, [isShown, moveBy.main, moveBy.secondary, tooltip, hideWhenReferenceHidden, middlewareProp]);
+ }, [isPositioningActive, moveBy.main, moveBy.secondary, tooltip, hideWhenReferenceHidden, middlewareProp]);
// Configure autoUpdate for position tracking
const whileElementsMounted = useCallback(
@@ -155,11 +159,11 @@ function Dialog({
[observeContentResize]
);
- // Use Floating UI hook — whileElementsMounted is omitted when closed to skip autoUpdate setup
+ // Use Floating UI hook — whileElementsMounted is omitted when positioning is inactive to skip autoUpdate
const { refs, floatingStyles, placement, middlewareData } = useFloating({
placement: position as Placement,
middleware: floatingMiddleware,
- whileElementsMounted: isShown ? whileElementsMounted : undefined,
+ whileElementsMounted: isPositioningActive ? whileElementsMounted : undefined,
elements: {
reference: referenceElement
}
diff --git a/packages/components/dialog/src/Dialog/Dialog.types.ts b/packages/components/dialog/src/Dialog/Dialog.types.ts
index 9cc02e448c..43728dd499 100644
--- a/packages/components/dialog/src/Dialog/Dialog.types.ts
+++ b/packages/components/dialog/src/Dialog/Dialog.types.ts
@@ -148,6 +148,11 @@ export interface DialogProps extends VibeComponentProps {
* Controlled open state for derived state pattern.
*/
isOpen?: boolean;
+ /**
+ * Whether Floating UI tracks the dialog's position (gated by the shown state). Defaults to `true`;
+ * pass your own open state for a permanently-mounted dialog to avoid always-on tracking.
+ */
+ positioningActive?: boolean;
/**
* CSS class names that, when present on target, prevent showing the dialog.
*/
diff --git a/packages/components/dialog/src/DialogContentContainer/DialogContentContainer.module.scss b/packages/components/dialog/src/DialogContentContainer/DialogContentContainer.module.scss
index 9a926dc690..775eceab26 100644
--- a/packages/components/dialog/src/DialogContentContainer/DialogContentContainer.module.scss
+++ b/packages/components/dialog/src/DialogContentContainer/DialogContentContainer.module.scss
@@ -16,7 +16,7 @@
.typePopover {
box-shadow: var(--box-shadow-medium);
- border-radius: var(--border-radius-medium);
+ border-radius: 12px;
background-color: var(--secondary-background-color);
:global(.dark-app-theme) &,
diff --git a/packages/components/label/src/Label/Label.module.scss b/packages/components/label/src/Label/Label.module.scss
index 441d05a623..e7f246cece 100644
--- a/packages/components/label/src/Label/Label.module.scss
+++ b/packages/components/label/src/Label/Label.module.scss
@@ -15,86 +15,110 @@
display: inline-flex;
align-items: center;
justify-content: center;
- border-radius: var(--border-radius-small);
- padding: 2px var(--space-8);
+ border-radius: 4px;
+ padding: 2px var(--spacing-small);
position: relative;
&.small {
- padding: 0 var(--space-4);
- border-radius: 2px;
+ padding: 2px var(--spacing-xs);
+ border-radius: 4px;
}
}
.withLeg {
- border-start-start-radius: var(--border-radius-small);
- border-start-end-radius: var(--border-radius-small);
- border-end-end-radius: var(--border-radius-small);
- border-end-start-radius: 0;
+ border-radius: 4px 4px 4px 0;
}
.legWrapper {
position: absolute;
height: 8px;
top: 100%;
- inset-inline-start: 0;
+ left: 0;
display: inline-flex;
}
.kindFill {
+ border: none;
+ background-color: transparent;
+ padding: 2px var(--spacing-small);
+
+ &.small {
+ padding: 2px var(--spacing-xs);
+ }
+
+ /* Each semantic pairs a --surface-* fill with its --text-on-surface-* text.
+ The leg (svg path) is filled with the surface so it reads as part of the label. */
&.colorPrimary {
- background-color: var(--primary-color);
+ background-color: var(--surface-primary);
+ color: var(--text-on-surface-primary);
svg path {
- fill: var(--primary-color);
+ fill: var(--surface-primary);
}
&.clickable:hover,
&.clickable:active {
- background-color: var(--primary-hover-color);
+ background-color: var(--surface-primary);
}
}
&.colorDark {
- background-color: var(--inverted-color-background);
+ background-color: var(--surface-neutral);
+ color: var(--text-on-surface-neutral);
svg path {
- fill: var(--inverted-color-background);
+ fill: var(--surface-neutral);
+ }
+
+ &.clickable:hover,
+ &.clickable:active {
+ background-color: var(--surface-neutral);
}
}
&.colorNegative {
- background-color: var(--negative-color);
+ background-color: var(--surface-negative);
+ color: var(--text-on-surface-negative);
svg path {
- fill: var(--negative-color);
+ fill: var(--surface-negative);
}
&.clickable:hover,
&.clickable:active {
- background-color: var(--negative-color-hover);
+ background-color: var(--surface-negative);
}
}
&.colorPositive {
- background-color: var(--positive-color);
+ background-color: var(--surface-positive);
+ color: var(--text-on-surface-positive);
svg path {
- fill: var(--positive-color);
+ fill: var(--surface-positive);
}
&.clickable:hover,
&.clickable:active {
- background-color: var(--positive-color-hover);
+ background-color: var(--surface-positive);
}
}
+
+ .smallText {
+ line-height: 14px;
+ }
}
.kindLine {
border: 1px solid currentColor;
- padding: 1px var(--space-8);
+ padding: 1px var(--spacing-small);
+
+ &.small {
+ padding: 0 var(--spacing-xs);
+ }
.legWrapper {
- inset-inline-start: -1px;
+ left: -1px;
top: calc(100% + 1px);
}
@@ -112,10 +136,10 @@
}
&.colorDark {
- color: var(--inverted-color-background);
+ color: var(--primary-text-color);
svg path {
- fill: var(--inverted-color-background);
+ fill: var(--primary-text-color);
}
&.clickable:hover,
diff --git a/packages/components/label/src/Label/Label.tsx b/packages/components/label/src/Label/Label.tsx
index 55dfd705b7..98e466bca9 100644
--- a/packages/components/label/src/Label/Label.tsx
+++ b/packages/components/label/src/Label/Label.tsx
@@ -141,7 +141,7 @@ const Label = forwardRef(
element="span"
type={mapSizesToTextSize[size]}
className={classNames}
- color={color === "dark" ? "onInverted" : "onPrimary"}
+ color="primary"
data-celebration-text={isCelebrationAnimation}
>
(
isLegIncluded,
size,
backgroundColorStyle,
+ kind,
color
]);
diff --git a/packages/core/rollup.config.js b/packages/core/rollup.config.js
index b186c6bad3..252dd8106b 100644
--- a/packages/core/rollup.config.js
+++ b/packages/core/rollup.config.js
@@ -130,6 +130,7 @@ export default {
extensions: [...EXTENSIONS, ".json", ".css"]
}),
typescript({
+ check: false,
tsconfigOverride: {
exclude: ["**/__tests__", "**/__stories__", path.join(SRC_PATH, "storybook")]
}
diff --git a/packages/core/src/__tests__/__snapshots__/exports.test.ts.snap b/packages/core/src/__tests__/__snapshots__/exports.test.ts.snap
index b2ee49832e..ce6fae7498 100644
--- a/packages/core/src/__tests__/__snapshots__/exports.test.ts.snap
+++ b/packages/core/src/__tests__/__snapshots__/exports.test.ts.snap
@@ -75,6 +75,7 @@ exports[`exports > should export all components 1`] = `
"ProgressBar",
"RadioButton",
"Search",
+ "SegmentedControl",
"Skeleton",
"Slider",
"SplitButton",
diff --git a/packages/core/src/components/AttentionBox/AttentionBox.module.scss b/packages/core/src/components/AttentionBox/AttentionBox.module.scss
index 48de2c4698..919c4b17af 100644
--- a/packages/core/src/components/AttentionBox/AttentionBox.module.scss
+++ b/packages/core/src/components/AttentionBox/AttentionBox.module.scss
@@ -23,23 +23,24 @@
animation: attentionBoxAnimation 200ms var(--motion-timing-transition);
}
+ /* Semantic surfaces, per Facelift "surface colors" (Figma 630:106200). */
&.primary {
- background-color: var(--primary-selected-color);
+ background-color: var(--surface-primary);
}
&.positive {
- background-color: var(--positive-color-selected);
+ background-color: var(--surface-positive);
}
&.negative {
- background-color: var(--negative-color-selected);
+ background-color: var(--surface-negative);
}
&.warning {
- background-color: var(--warning-color-selected);
+ background-color: var(--surface-warning);
}
&.neutral {
- background-color: var(--allgrey-background-color);
+ background-color: var(--surface-neutral);
}
}
diff --git a/packages/core/src/components/AttentionBox/components/AttentionBoxLeadingIcon/AttentionBoxLeadingIcon.module.scss b/packages/core/src/components/AttentionBox/components/AttentionBoxLeadingIcon/AttentionBoxLeadingIcon.module.scss
index 4ecc4891b0..90a746218e 100644
--- a/packages/core/src/components/AttentionBox/components/AttentionBoxLeadingIcon/AttentionBoxLeadingIcon.module.scss
+++ b/packages/core/src/components/AttentionBox/components/AttentionBoxLeadingIcon/AttentionBoxLeadingIcon.module.scss
@@ -1,4 +1,5 @@
.icon {
- color: var(--primary-text-color);
+ /* Track the attention box's text colour rather than pinning it. */
+ color: currentColor;
flex-shrink: 0;
}
diff --git a/packages/core/src/components/BaseItem/BaseItem.module.scss b/packages/core/src/components/BaseItem/BaseItem.module.scss
index 024a56bddd..3fdb5332fc 100644
--- a/packages/core/src/components/BaseItem/BaseItem.module.scss
+++ b/packages/core/src/components/BaseItem/BaseItem.module.scss
@@ -4,7 +4,7 @@
display: flex;
align-items: center;
gap: var(--space-4);
- border-radius: var(--border-radius-small);
+ border-radius: 6px;
color: var(--primary-text-color);
cursor: pointer;
@include focus-style-inset();
@@ -23,15 +23,6 @@
cursor: default;
}
- &.selected {
- background-color: var(--primary-selected-color);
-
- &.highlighted,
- &:hover:not(.disabled):not(.readOnly) {
- background-color: var(--primary-selected-hover-color);
- }
- }
-
&.small {
padding: 6px var(--space-8);
}
@@ -57,5 +48,12 @@
padding-inline-start: var(--space-8);
margin-inline-start: auto;
display: flex;
+ align-items: center;
+ gap: var(--space-4);
+ }
+
+ .selectedCheck {
+ flex-shrink: 0;
+ color: var(--icon-color);
}
}
diff --git a/packages/core/src/components/BaseItem/BaseItem.tsx b/packages/core/src/components/BaseItem/BaseItem.tsx
index ad7651c3dd..fb6f6ae60b 100644
--- a/packages/core/src/components/BaseItem/BaseItem.tsx
+++ b/packages/core/src/components/BaseItem/BaseItem.tsx
@@ -6,6 +6,8 @@ import { Text, type TextType } from "@vibe/typography";
import { type BaseItemData, type BaseItemProps } from "./BaseItem.types";
import { useListItemProps } from "./hooks/useListItemProps";
import { Tooltip } from "@vibe/tooltip";
+import { Icon } from "@vibe/icon";
+import { Check } from "@vibe/icons";
import { renderSideElement } from "./utils";
import styles from "./BaseItem.module.scss";
@@ -38,6 +40,7 @@ const BaseItem = forwardRef(
}, [listItemProps]);
const { label = "", disabled = false, startElement, endElement, tooltipProps = {} } = item;
+ const showSelectedCheck = selected && !readOnly;
const listItemClassNames = useMemo(
() =>
@@ -82,8 +85,19 @@ const BaseItem = forwardRef(
{label}
- {endElement && (
- {renderSideElement(endElement, disabled, textVariant)}
+ {(endElement || showSelectedCheck) && (
+
+ {endElement && renderSideElement(endElement, disabled, textVariant)}
+ {showSelectedCheck && (
+
+ )}
+
)}
>
)}
diff --git a/packages/core/src/components/BaseItem/__tests__/BaseItem.test.tsx b/packages/core/src/components/BaseItem/__tests__/BaseItem.test.tsx
index 676263101c..ce558c6cf1 100644
--- a/packages/core/src/components/BaseItem/__tests__/BaseItem.test.tsx
+++ b/packages/core/src/components/BaseItem/__tests__/BaseItem.test.tsx
@@ -74,6 +74,23 @@ describe("BaseItem", () => {
expect(getByText("Default Item").parentNode).toHaveClass("selected");
});
+ it("should show a check icon when selected", () => {
+ const { getByTestId } = renderBaseItem({
+ item: { label, value: "item1" },
+ selected: true
+ });
+ expect(getByTestId("icon")).toBeInTheDocument();
+ });
+
+ it("should not show a check icon when selected and read-only", () => {
+ const { queryByTestId } = renderBaseItem({
+ item: { label, value: "item1" },
+ selected: true,
+ readOnly: true
+ });
+ expect(queryByTestId("icon")).not.toBeInTheDocument();
+ });
+
it("should apply the disabled class", () => {
const { getByText } = renderBaseItem({
item: {
diff --git a/packages/core/src/components/Chips/Chips.module.scss b/packages/core/src/components/Chips/Chips.module.scss
index d279e22285..ef9c3b4a70 100644
--- a/packages/core/src/components/Chips/Chips.module.scss
+++ b/packages/core/src/components/Chips/Chips.module.scss
@@ -7,15 +7,26 @@
display: inline-flex;
overflow: hidden;
height: 24px;
- border-radius: 4px;
+ border-radius: var(--border-radius-full);
padding: 0 8px;
align-items: center;
justify-content: center;
- margin: var(--chips-margin, #{0 var(--space-4)});
+ margin: var(--chips-margin, #{0 var(--spacing-xs)});
user-select: none;
@include smoothing-text;
color: var(--primary-text-color);
+ /* The fill comes from --chips-surface: semantic colors set it via the color-* classes
+ below, content colors pass it in as an inline custom property. Keeping
+ `background-color` itself in CSS means hover is a plain :hover rule (no React state)
+ and consumers can override the fill without !important. */
+ background-color: var(--chips-surface);
animation: chips-pop-in-emphasized var(--motion-productive-medium) var(--motion-timing-emphasize);
+
+ &.clickable:hover,
+ &.clickable:focus-within {
+ background-color: var(--chips-surface-hover, var(--chips-surface));
+ }
+
&.border {
border: 1px solid var(--primary-background-color);
}
@@ -27,22 +38,69 @@
margin: 0;
}
+ /* Medium: 8px default; 4px on sides that have an icon */
+ &.withLeftIcon {
+ padding-inline-start: 4px;
+ }
+
+ &.withRightIcon {
+ padding-inline-end: 4px;
+ }
+
+ &.withClose {
+ position: relative;
+ box-sizing: border-box;
+
+ .label {
+ min-width: 0;
+ flex: 1 1 auto;
+ }
+
+ .icon.close {
+ position: absolute;
+ inset-inline-end: 4px;
+ top: 50%;
+ transform: translateY(-50%);
+ margin: 0;
+ opacity: 0;
+ pointer-events: none;
+ z-index: 1;
+ }
+
+ &:hover,
+ &:focus-within {
+ /* Keep overall width stable; carve space for the close control inside the chip */
+ padding-inline-end: 26px;
+
+ .icon.close {
+ opacity: 1;
+ pointer-events: auto;
+ }
+ }
+
+ &.small:hover,
+ &.small:focus-within {
+ padding-inline-end: 22px;
+ }
+ }
+
&.small {
height: 20px;
+ /* Small: 4px default; 2px on sides that have an icon */
padding: 0 4px;
+ &.withLeftIcon {
+ padding-inline-start: 2px;
+ }
+
+ &.withRightIcon {
+ padding-inline-end: 2px;
+ }
+
.icon,
.avatar,
.customRenderer {
- &.left {
- margin-inline-end: var(--space-2);
- }
- &.right {
- margin-inline-start: var(--space-2);
- }
- &.close {
- margin-inline-start: var(--space-2);
- }
+ min-width: 14px;
}
}
@@ -59,18 +117,66 @@
.customRenderer {
min-width: 18px;
&.left {
- margin-inline-end: var(--space-4);
+ margin-right: var(--spacing-xs);
}
&.right {
- margin-inline-start: var(--space-4);
+ margin-left: var(--spacing-xs);
}
&.close {
- margin-inline-start: var(--space-4);
- color: var(--primary-text-color);
+ margin-left: var(--spacing-xs);
}
}
+ /* Icons and the close IconButton track the chip's colour, which for semantic colors
+ is --text-on-surface-* (set inline on the root). This beats IconButton's own
+ `.kindTertiary { color: --primary-text-color }` on specificity. */
+ .icon {
+ color: currentColor;
+ }
+
+ /* Semantic colors: surface + its paired text, same `color-*` class pattern Label uses.
+ Hover keeps the existing *-color-selected-hover tokens. */
+ &.colorPrimary {
+ --chips-surface: var(--surface-primary);
+ --chips-surface-hover: var(--ui-background-hover-color);
+ color: var(--text-on-surface-primary);
+ }
+
+ &.colorPositive {
+ --chips-surface: var(--surface-positive);
+ --chips-surface-hover: var(--positive-color-selected-hover);
+ color: var(--text-on-surface-positive);
+ }
+
+ &.colorNegative {
+ --chips-surface: var(--surface-negative);
+ --chips-surface-hover: var(--negative-color-selected-hover);
+ color: var(--text-on-surface-negative);
+ }
+
+ &.colorWarning {
+ --chips-surface: var(--surface-warning);
+ --chips-surface-hover: var(--warning-color-selected-hover);
+ color: var(--text-on-surface-warning);
+ }
+
+ &.colorInfo {
+ --chips-surface: var(--surface-info);
+ --chips-surface-hover: var(--info-color-selected-hover);
+ color: var(--text-on-surface-info);
+ }
+
+ &.colorNeutral {
+ --chips-surface: var(--surface-neutral);
+ --chips-surface-hover: var(--ui-background-hover-color);
+ color: var(--text-on-surface-neutral);
+ }
+
+ /* After the color-* classes so it wins the tie on equal specificity. */
&.disabled {
+ --chips-surface: var(--disabled-background-color);
+ --chips-surface-hover: var(--disabled-background-color);
+
.icon {
color: var(--disabled-text-color);
}
@@ -83,6 +189,43 @@
cursor: default;
}
+ &.readOnly {
+ cursor: default;
+ }
+
+ &.filterable {
+ background-color: var(--ui-background-color);
+ color: var(--primary-text-color);
+ cursor: pointer;
+
+ .icon,
+ .label {
+ color: currentColor;
+ }
+
+ &:hover:not(.disabled):not(.pressed),
+ &:active:not(.disabled):not(.pressed) {
+ background-color: var(--ui-background-hover-color);
+ color: var(--primary-text-color);
+ }
+
+ &.pressed:not(.disabled) {
+ background-color: var(--primary-color);
+ color: var(--text-color-on-inverted);
+
+ .icon,
+ .label,
+ .close {
+ color: currentColor;
+ }
+ }
+
+ &.disabled {
+ background-color: var(--disabled-background-color);
+ cursor: not-allowed;
+ }
+ }
+
&.clickable {
@include clickable;
&.disabled {
diff --git a/packages/core/src/components/Chips/Chips.tsx b/packages/core/src/components/Chips/Chips.tsx
index be6f642caa..b7882be542 100644
--- a/packages/core/src/components/Chips/Chips.tsx
+++ b/packages/core/src/components/Chips/Chips.tsx
@@ -1,37 +1,55 @@
-import React, { forwardRef, useCallback, useMemo, useRef, useState } from "react";
+import React, { forwardRef, useCallback, useLayoutEffect, useMemo, useRef } from "react";
+import { camelCase } from "es-toolkit";
import cx from "classnames";
import { Icon } from "@vibe/icon";
-import { useMergeRef } from "@vibe/shared";
+import { getStyle, useMergeRef } from "@vibe/shared";
import { CloseSmall } from "@vibe/icons";
-import { getCSSVar } from "../../services/themes";
-import { type ElementAllowedColor, getElementColor } from "../../types/Colors";
+import { type ElementAllowedColor, getElementColor, isSemanticElementColor } from "../../types/Colors";
import { Avatar, type AvatarType } from "@vibe/avatar";
import { IconButton } from "@vibe/icon-button";
import { Text } from "@vibe/typography";
import { ComponentDefaultTestId, getTestId } from "../../tests/test-ids-utils";
import { type ElementContent, type VibeComponentProps } from "../../types";
import { type SubIcon } from "@vibe/icon";
-import useSetFocus from "../../hooks/useSetFocus";
import { useClickableProps } from "@vibe/clickable";
import styles from "./Chips.module.scss";
import { ComponentVibeId } from "../../tests/constants";
-import { type ChipsSize } from "./Chips.types";
+import { type ChipsVariant, type ChipsSize } from "./Chips.types";
const CHIPS_AVATAR_SIZE = 18;
+const CHIPS_AVATAR_SIZE_SMALL = 14;
export interface ChipsProps extends VibeComponentProps {
/**
* The text or content displayed inside the chip.
*/
label?: ElementContent;
+ /**
+ * Visual and behavioral variant of the chip.
+ * - `default` — standard chip (colors, optional remove / click)
+ * - `readOnly` — display only; no interaction
+ * - `filterable` — primary theme only; default / hover / pressed states
+ */
+ variant?: ChipsVariant;
/**
* If true, the chip is disabled.
*/
disabled?: boolean;
/**
- * If true, the chip is read-only and cannot be deleted.
+ * If true, the chip is read-only and cannot be deleted or interacted with.
+ * Prefer `variant="readOnly"` for new usage.
*/
readOnly?: boolean;
+ /**
+ * When `variant="filterable"`, shows the pressed (selected) state.
+ */
+ pressed?: boolean;
+ /**
+ * The size of the chip.
+ * - `medium` — default (24px height)
+ * - `small` — 20px height, 12px text
+ */
+ size?: ChipsSize;
/**
* A React element displayed on the right side.
*/
@@ -74,6 +92,7 @@ export interface ChipsProps extends VibeComponentProps {
avatarClassName?: string;
/**
* The background color of the chip.
+ * Ignored when `variant="filterable"` (always primary).
*/
color?: Exclude;
/**
@@ -103,11 +122,15 @@ export interface ChipsProps extends VibeComponentProps {
/**
* The label of the chip for accessibility.
*/
- "aria-label"?: string;
+ ariaLabel?: string;
/**
* If true, indicates that the chip has a popup.
*/
- "aria-haspopup"?: boolean;
+ ariaHasPopup?: boolean;
+ /**
+ * If true, disables all click behaviors.
+ */
+ disableClickableBehavior?: boolean;
/**
* If true, displays a border around the chip.
*/
@@ -120,10 +143,6 @@ export interface ChipsProps extends VibeComponentProps {
* If true, removes the default margin from the chip.
*/
noMargin?: boolean;
- /**
- * The size of the chip.
- */
- size?: ChipsSize;
}
const Chips = forwardRef(
@@ -139,67 +158,103 @@ const Chips = forwardRef(
leftAvatar = null,
rightAvatar = null,
disabled = false,
+ variant = "default",
readOnly = false,
+ pressed = false,
+ size = "medium",
allowTextSelection = false,
color = "primary",
- iconSize = 18,
+ iconSize,
onDelete = (_id: string, _e: React.MouseEvent) => {},
onMouseDown,
onClick,
noAnimation = true,
- "aria-label": ariaLabel,
- "aria-haspopup": ariaHasPopup = false,
+ ariaLabel,
+ ariaHasPopup = false,
"data-testid": dataTestId,
+ disableClickableBehavior = false,
leftAvatarType = "img",
rightAvatarType = "img",
showBorder = false,
leftRenderer,
rightRenderer,
closeButtonAriaLabel = "Remove",
- noMargin = false,
- size = "medium"
+ noMargin = false
}: ChipsProps,
ref: React.ForwardedRef
) => {
const componentDataTestId = dataTestId || getTestId(ComponentDefaultTestId.CHIP, id);
- const hasClickableWrapper = !!onClick || !!onMouseDown;
- const hasCloseButton = !readOnly && !disabled;
+ const isFilterable = variant === "filterable";
+ const isReadOnly = !isFilterable && (readOnly || variant === "readOnly");
+ const isSmall = size === "small";
+ const resolvedColor = isFilterable ? "primary" : color;
const overrideAriaLabel = ariaLabel || (typeof label === "string" && label) || "";
+ const resolvedIconSize = iconSize ?? (isSmall ? 14 : 18);
+ const resolvedAvatarSize = isSmall ? CHIPS_AVATAR_SIZE_SMALL : CHIPS_AVATAR_SIZE;
+
+ const hasCloseButton = !isReadOnly && !disabled && !isFilterable;
+ const hasClickableWrapper =
+ !isReadOnly && ((!disableClickableBehavior && (!!onClick || !!onMouseDown)) || isFilterable);
const iconButtonRef = useRef(null);
const componentRef = useRef(null);
- const [isHovered, setIsHovered] = useState(false);
- const handleMouseEnter = useCallback(() => setIsHovered(true), []);
- const handleMouseLeave = useCallback(() => setIsHovered(false), []);
- const { isFocused } = useSetFocus({ ref: componentRef });
-
const mergedRef = useMergeRef(ref, componentRef);
- const overrideClassName = cx(styles.chips, className, {
+ // Lock resting width (close is absolutely positioned) so hover padding truncates label instead of growing the chip
+ useLayoutEffect(() => {
+ if (!hasCloseButton || !componentRef.current) return;
+ const el = componentRef.current;
+ el.style.width = "";
+ el.style.width = `${el.getBoundingClientRect().width}px`;
+ }, [hasCloseButton, label, size, leftIcon, rightIcon, leftAvatar, rightAvatar, leftRenderer, rightRenderer]);
+
+ const hasLeftIcon = Boolean(leftIcon || leftAvatar || leftRenderer);
+ const hasRightIcon = Boolean(rightIcon || rightAvatar || rightRenderer);
+
+ // Semantic colors are styled by class (same `color-*` pattern as Label), so the fill
+ // lives in CSS and consumers can override it without !important. `filterable` owns its
+ // own fill, so it opts out.
+ const semanticColorClassName =
+ !isFilterable && isSemanticElementColor(resolvedColor)
+ ? getStyle(styles, camelCase("color-" + resolvedColor))
+ : undefined;
+
+ const overrideClassName = cx(styles.chips, className, semanticColorClassName, {
[styles.disabled]: disabled,
[styles.noAnimation]: noAnimation,
[styles.withUserSelect]: allowTextSelection,
[styles.border]: showBorder,
[styles.noMargin]: noMargin,
- [styles.small]: size === "small"
+ [styles.small]: isSmall,
+ [styles.readOnly]: isReadOnly,
+ [styles.defaultCursor]: isReadOnly,
+ [styles.filterable]: isFilterable,
+ [styles.pressed]: isFilterable && pressed,
+ [styles.withClose]: hasCloseButton,
+ [styles.withLeftIcon]: hasLeftIcon,
+ [styles.withRightIcon]: hasRightIcon
});
const clickableClassName = cx(styles.clickable, overrideClassName, {
[styles.disabled]: disabled,
[styles.disableTextSelection]: !allowTextSelection
});
- const backgroundColorStyle = useMemo(() => {
- let cssVar;
- if (disabled) {
- cssVar = getCSSVar("disabled-background-color");
- } else if (hasClickableWrapper && (isHovered || isFocused)) {
- cssVar = getElementColor(color, true, true);
- } else {
- cssVar = getElementColor(color, true);
+ /**
+ * Content colors (there are ~40) can't reasonably each get a class, so they pass their
+ * palette in as custom properties and CSS applies them. That keeps `background-color`
+ * out of the inline style, so hover is a plain `:hover` rule rather than React state,
+ * and consumers can restyle a chip with ordinary specificity.
+ */
+ const contentColorStyle = useMemo(() => {
+ if (isFilterable || disabled || semanticColorClassName) {
+ return undefined;
}
- return { backgroundColor: cssVar };
- }, [disabled, hasClickableWrapper, isHovered, isFocused, color]);
+ // No --chips-surface-hover: content colors have no `--color-*-selected-hover` token,
+ // so getElementColor ignores the hover palette for them. The CSS falls back to the
+ // resting fill, which is what the previous JS hover branch also produced.
+ return { "--chips-surface": getElementColor(resolvedColor, true) } as React.CSSProperties;
+ }, [disabled, resolvedColor, isFilterable, semanticColorClassName]);
const onDeleteCallback = useCallback(
(e: React.MouseEvent) => {
@@ -213,25 +268,38 @@ const Chips = forwardRef(
const onClickCallback = useCallback(
(e: React.MouseEvent) => {
+ if (isReadOnly || disabled) {
+ return;
+ }
if (onClick !== undefined && (e.target as HTMLElement) !== iconButtonRef.current) {
e.preventDefault();
onClick(e);
}
},
- [onClick]
+ [onClick, isReadOnly, disabled]
+ );
+
+ const onMouseDownCallback = useCallback(
+ (e: React.MouseEvent) => {
+ if (isReadOnly || disabled) {
+ return;
+ }
+ onMouseDown?.(e);
+ },
+ [onMouseDown, isReadOnly, disabled]
);
const clickableProps = useClickableProps(
{
onClick: onClickCallback,
- onMouseDown,
- disabled,
+ onMouseDown: onMouseDownCallback,
+ disabled: disabled || isReadOnly,
id,
"data-testid": componentDataTestId,
- "aria-label": overrideAriaLabel,
- "aria-hidden": false,
- "aria-haspopup": ariaHasPopup,
- "aria-expanded": false
+ ariaLabel: overrideAriaLabel,
+ ariaHidden: false,
+ ariaHasPopup,
+ ariaExpanded: false
},
mergedRef
);
@@ -240,33 +308,34 @@ const Chips = forwardRef(
...clickableProps,
ref: mergedRef,
className: clickableClassName,
- style: backgroundColorStyle,
- onMouseEnter: handleMouseEnter,
- onMouseLeave: handleMouseLeave
+ style: contentColorStyle,
+ ...(isFilterable ? { "aria-pressed": pressed } : {})
}
: {
className: overrideClassName,
"aria-label": overrideAriaLabel,
- style: backgroundColorStyle,
+ style: contentColorStyle,
ref: mergedRef,
- onClick: onClickCallback,
- onMouseDown,
+ onClick: isReadOnly ? undefined : onClickCallback,
+ onMouseDown: isReadOnly ? undefined : onMouseDownCallback,
id: id,
- "data-testid": componentDataTestId,
- onMouseEnter: handleMouseEnter,
- onMouseLeave: handleMouseLeave
+ "data-testid": componentDataTestId
};
const leftAvatarProps = leftAvatarType === "text" ? { text: leftAvatar } : { src: leftAvatar };
const rightAvatarProps = leftAvatarType === "text" ? { text: rightAvatar } : { src: rightAvatar };
return (
-
+
{leftAvatar ? (
) : null}
{leftRenderer &&
{leftRenderer}
}
-
+ {/* `inherit` so the label follows the chip's colour (--text-on-surface-* for semantic
+ colors, set inline on the root). Text's default would pin --primary-text-color and
+ leave the label out of step with the icons, which use currentColor. */}
+
{label}
{rightIcon ? (
) : null}
@@ -298,7 +370,7 @@ const Chips = forwardRef(
{
expect(tree).toMatchSnapshot();
});
+ it("renders correctly with readOnly variant", () => {
+ const tree = renderer.create( ).toJSON();
+ expect(tree).toMatchSnapshot();
+ });
+
+ it("renders correctly with filterable variant", () => {
+ const tree = renderer.create( ).toJSON();
+ expect(tree).toMatchSnapshot();
+ });
+
+ it("renders correctly with filterable pressed state", () => {
+ const tree = renderer.create( ).toJSON();
+ expect(tree).toMatchSnapshot();
+ });
+
+ it("renders correctly with small size", () => {
+ const tree = renderer.create( ).toJSON();
+ expect(tree).toMatchSnapshot();
+ });
+
it("renders correctly with text", () => {
const tree = renderer.create( ).toJSON();
expect(tree).toMatchSnapshot();
diff --git a/packages/core/src/components/Chips/__tests__/Chips.test.tsx b/packages/core/src/components/Chips/__tests__/Chips.test.tsx
index 772990bf51..0e5bea6e9e 100644
--- a/packages/core/src/components/Chips/__tests__/Chips.test.tsx
+++ b/packages/core/src/components/Chips/__tests__/Chips.test.tsx
@@ -41,4 +41,56 @@ describe("Chips tests", () => {
fireEvent.click(screen.getByTestId(defaultTestId));
expect(onMouseDown.mock.calls.length).toBe(0);
});
+ it("Should not call onClick when variant is readOnly", () => {
+ const onClick = vi.fn();
+ render( );
+ fireEvent.click(screen.getByTestId(defaultTestId));
+ expect(onClick).not.toHaveBeenCalled();
+ });
+ it("Should not render close button when variant is readOnly", () => {
+ render( );
+ expect(screen.queryByTestId(`${defaultTestId}-close`)).toBeNull();
+ });
+ it("Should not render close button when variant is filterable", () => {
+ render( );
+ expect(screen.queryByTestId(`${defaultTestId}-close`)).toBeNull();
+ });
+ it("Should call onClick when filterable chip is clicked", () => {
+ const onClick = vi.fn();
+ render( );
+ fireEvent.click(screen.getByTestId(defaultTestId));
+ expect(onClick).toHaveBeenCalledTimes(1);
+ });
+ it("Should set aria-pressed when filterable chip is pressed", () => {
+ render( );
+ expect(screen.getByTestId(defaultTestId)).toHaveAttribute("aria-pressed", "true");
+ });
+
+ describe("fill", () => {
+ it("Should style a semantic color by class, with no inline fill to override", () => {
+ render( );
+ const chip = screen.getByTestId(defaultTestId);
+ expect(chip).toHaveClass("colorNegative");
+ expect(chip.style.backgroundColor).toBe("");
+ expect(chip.style.getPropertyValue("--chips-surface")).toBe("");
+ });
+
+ it("Should pass a content color's palette in as custom properties", () => {
+ render( );
+ const chip = screen.getByTestId(defaultTestId);
+ expect(chip.className).not.toMatch(/color[A-Z]/);
+ expect(chip.style.getPropertyValue("--chips-surface")).toBe("var(--color-lipstick-selected)");
+ // Content colors have no `--color-*-selected-hover` token, so no hover fill is set and
+ // the CSS falls back to the resting one.
+ expect(chip.style.getPropertyValue("--chips-surface-hover")).toBe("");
+ expect(chip.style.backgroundColor).toBe("");
+ });
+
+ it("Should leave the fill to CSS when disabled", () => {
+ render( );
+ const chip = screen.getByTestId(defaultTestId);
+ expect(chip).toHaveClass("disabled");
+ expect(chip.style.getPropertyValue("--chips-surface")).toBe("");
+ });
+ });
});
diff --git a/packages/core/src/components/Chips/__tests__/__snapshots__/Chips.snapshot.test.tsx.snap b/packages/core/src/components/Chips/__tests__/__snapshots__/Chips.snapshot.test.tsx.snap
index 408b8730b4..c88aad55d1 100644
--- a/packages/core/src/components/Chips/__tests__/__snapshots__/Chips.snapshot.test.tsx.snap
+++ b/packages/core/src/components/Chips/__tests__/__snapshots__/Chips.snapshot.test.tsx.snap
@@ -3,20 +3,15 @@
exports[`Chips renders correctly > renders correctly disabled chip 1`] = `
@@ -26,21 +21,14 @@ exports[`Chips renders correctly > renders correctly disabled chip 1`] = `
exports[`Chips renders correctly > renders correctly with a custom label 1`] = `
This is mandatory
@@ -54,20 +42,15 @@ exports[`Chips renders correctly > renders correctly with a custom label 1`] = `
exports[`Chips renders correctly > renders correctly with color 1`] = `
@@ -76,7 +59,7 @@ exports[`Chips renders correctly > renders correctly with color 1`] = `
aria-busy={false}
aria-disabled={false}
aria-label="Remove"
- className="icon close button sizeMedium kindTertiary colorOnPrimaryColor noSidePadding"
+ className="icon close button sizeMedium kindTertiary colorPrimary noSidePadding"
data-testid="chip-close"
data-vibe="Button"
onBlur={[Function]}
@@ -116,20 +99,15 @@ exports[`Chips renders correctly > renders correctly with color 1`] = `
exports[`Chips renders correctly > renders correctly with empty props 1`] = `
@@ -138,7 +116,7 @@ exports[`Chips renders correctly > renders correctly with empty props 1`] = `
aria-busy={false}
aria-disabled={false}
aria-label="Remove"
- className="icon close button sizeMedium kindTertiary colorOnPrimaryColor noSidePadding"
+ className="icon close button sizeMedium kindTertiary colorPrimary noSidePadding"
data-testid="chip-close"
data-vibe="Button"
onBlur={[Function]}
@@ -175,20 +153,61 @@ exports[`Chips renders correctly > renders correctly with empty props 1`] = `
`;
-exports[`Chips renders correctly > renders correctly with left avatar 1`] = `
+exports[`Chips renders correctly > renders correctly with filterable pressed state 1`] = `
+`;
+
+exports[`Chips renders correctly > renders correctly with filterable variant 1`] = `
+
+`;
+
+exports[`Chips renders correctly > renders correctly with left avatar 1`] = `
+
renders correctly with left avatar 1`] = `
@@ -226,17 +245,12 @@ exports[`Chips renders correctly > renders correctly with left avatar 1`] = `
exports[`Chips renders correctly > renders correctly with left custom renderer 1`] = `
renders correctly with left custom renderer 1
@@ -255,7 +269,7 @@ exports[`Chips renders correctly > renders correctly with left custom renderer 1
aria-busy={false}
aria-disabled={false}
aria-label="Remove"
- className="icon close button sizeMedium kindTertiary colorOnPrimaryColor noSidePadding"
+ className="icon close button sizeMedium kindTertiary colorPrimary noSidePadding"
data-testid="chip-close"
data-vibe="Button"
onBlur={[Function]}
@@ -295,17 +309,10 @@ exports[`Chips renders correctly > renders correctly with left custom renderer 1
exports[`Chips renders correctly > renders correctly with left icon 1`] = `
renders correctly with left icon 1`] = `
data-testid="icon"
data-vibe="Icon"
fill="currentColor"
- height="18"
+ height="16"
viewBox="0 0 20 20"
- width="18"
+ width="16"
>
renders correctly with left icon 1`] = `
/>
@@ -333,23 +340,33 @@ exports[`Chips renders correctly > renders correctly with left icon 1`] = `
`;
+exports[`Chips renders correctly > renders correctly with readOnly variant 1`] = `
+
+`;
+
exports[`Chips renders correctly > renders correctly with right avatar 1`] = `
@@ -384,20 +401,15 @@ exports[`Chips renders correctly > renders correctly with right avatar 1`] = `
exports[`Chips renders correctly > renders correctly with right custom renderer 1`] = `
@@ -413,7 +425,7 @@ exports[`Chips renders correctly > renders correctly with right custom renderer
aria-busy={false}
aria-disabled={false}
aria-label="Remove"
- className="icon close button sizeMedium kindTertiary colorOnPrimaryColor noSidePadding"
+ className="icon close button sizeMedium kindTertiary colorPrimary noSidePadding"
data-testid="chip-close"
data-vibe="Button"
onBlur={[Function]}
@@ -453,20 +465,13 @@ exports[`Chips renders correctly > renders correctly with right custom renderer
exports[`Chips renders correctly > renders correctly with right icon 1`] = `
@@ -477,9 +482,9 @@ exports[`Chips renders correctly > renders correctly with right icon 1`] = `
data-testid="icon"
data-vibe="Icon"
fill="currentColor"
- height="18"
+ height="16"
viewBox="0 0 20 20"
- width="18"
+ width="16"
>
renders correctly with right icon 1`] = `
exports[`Chips renders correctly > renders correctly with small size 1`] = `
small chip
@@ -516,7 +516,7 @@ exports[`Chips renders correctly > renders correctly with small size 1`] = `
aria-busy={false}
aria-disabled={false}
aria-label="Remove"
- className="icon close button sizeMedium kindTertiary colorOnPrimaryColor noSidePadding"
+ className="icon close button sizeMedium kindTertiary colorPrimary noSidePadding"
data-testid="chip-close"
data-vibe="Button"
onBlur={[Function]}
@@ -553,23 +553,35 @@ exports[`Chips renders correctly > renders correctly with small size 1`] = `
`;
+exports[`Chips renders correctly > renders correctly with small size 2`] = `
+
+`;
+
exports[`Chips renders correctly > renders correctly with text 1`] = `
text
@@ -578,7 +590,7 @@ exports[`Chips renders correctly > renders correctly with text 1`] = `
aria-busy={false}
aria-disabled={false}
aria-label="Remove"
- className="icon close button sizeMedium kindTertiary colorOnPrimaryColor noSidePadding"
+ className="icon close button sizeMedium kindTertiary colorPrimary noSidePadding"
data-testid="chip-close"
data-vibe="Button"
onBlur={[Function]}
@@ -618,20 +630,13 @@ exports[`Chips renders correctly > renders correctly with text 1`] = `
exports[`Chips renders correctly > renders correctly without close button 1`] = `
diff --git a/packages/core/src/components/Chips/index.ts b/packages/core/src/components/Chips/index.ts
index 82c7846eeb..29520a1a33 100644
--- a/packages/core/src/components/Chips/index.ts
+++ b/packages/core/src/components/Chips/index.ts
@@ -1,2 +1,2 @@
export { default as Chips, type ChipsProps } from "./Chips";
-export * from "./Chips.types";
+export type { ChipsVariant, ChipsSize } from "./Chips.types";
diff --git a/packages/core/src/components/Dropdown/components/DropdownPopup/DropdownPopup.tsx b/packages/core/src/components/Dropdown/components/DropdownPopup/DropdownPopup.tsx
index 940d850622..e6487e76f0 100644
--- a/packages/core/src/components/Dropdown/components/DropdownPopup/DropdownPopup.tsx
+++ b/packages/core/src/components/Dropdown/components/DropdownPopup/DropdownPopup.tsx
@@ -7,12 +7,14 @@ import SingleSelectTrigger from "../Trigger/SingleSelectTrigger";
import MultiSelectTrigger from "../Trigger/MultiSelectTrigger";
const DropdownPopup = () => {
- const { multi } = useDropdownContext();
+ const { multi, isOpen } = useDropdownContext();
return (
>>() => {
return (
/>
diff --git a/packages/core/src/components/Dropdown/components/MultiSelectedValues/MultiSelectedValues.tsx b/packages/core/src/components/Dropdown/components/MultiSelectedValues/MultiSelectedValues.tsx
index d7bd117a36..d9f7bcd2eb 100644
--- a/packages/core/src/components/Dropdown/components/MultiSelectedValues/MultiSelectedValues.tsx
+++ b/packages/core/src/components/Dropdown/components/MultiSelectedValues/MultiSelectedValues.tsx
@@ -85,7 +85,7 @@ function MultiSelectedValues- >>
const dialogContent = useMemo(() => {
return () => (
-
+
{hiddenItems.map(item => {
return (
diff --git a/packages/core/src/components/ListItem/ListItem.module.scss b/packages/core/src/components/ListItem/ListItem.module.scss
index 0ce64eaab6..fbd8c4b35e 100644
--- a/packages/core/src/components/ListItem/ListItem.module.scss
+++ b/packages/core/src/components/ListItem/ListItem.module.scss
@@ -5,7 +5,7 @@
display: flex;
align-items: center;
padding: 8px 16px;
- border-radius: 4px;
+ border-radius: var(--border-radius-small);
cursor: pointer;
@include focus-style-inset();
}
diff --git a/packages/core/src/components/Menu/Menu/Menu.module.scss b/packages/core/src/components/Menu/Menu/Menu.module.scss
index 311bdec285..c45365adab 100644
--- a/packages/core/src/components/Menu/Menu/Menu.module.scss
+++ b/packages/core/src/components/Menu/Menu/Menu.module.scss
@@ -2,8 +2,11 @@
.menu {
margin: unset;
- padding: unset;
+ padding: 8px;
position: relative;
+ overflow: visible;
+ box-sizing: border-box;
+ width: 100%;
}
.menu:focus {
@@ -11,13 +14,13 @@
}
.small {
- width: 200px;
+ min-width: 200px;
}
.medium {
- width: 220px;
+ min-width: 220px;
}
.large {
- width: 240px;
+ min-width: 240px;
}
diff --git a/packages/core/src/components/Menu/MenuItem/MenuItem.tsx b/packages/core/src/components/Menu/MenuItem/MenuItem.tsx
index dc5e19e686..802277dcc8 100644
--- a/packages/core/src/components/Menu/MenuItem/MenuItem.tsx
+++ b/packages/core/src/components/Menu/MenuItem/MenuItem.tsx
@@ -214,7 +214,7 @@ const MenuItem = forwardRef(
const renderLabel = useMemo(() => {
if (!label) return;
if (typeof label === "string") {
- return ;
+ return ;
}
if (React.isValidElement(label) && label.type === Label) {
return label;
diff --git a/packages/core/src/components/Menu/MenuItem/__tests__/__snapshots__/MenuItem.snapshot.test.tsx.snap b/packages/core/src/components/Menu/MenuItem/__tests__/__snapshots__/MenuItem.snapshot.test.tsx.snap
index eac60a0c29..19ef41450a 100644
--- a/packages/core/src/components/Menu/MenuItem/__tests__/__snapshots__/MenuItem.snapshot.test.tsx.snap
+++ b/packages/core/src/components/Menu/MenuItem/__tests__/__snapshots__/MenuItem.snapshot.test.tsx.snap
@@ -78,11 +78,11 @@ exports[`Snapshots > renders correctly with a label 1`] = `
data-vibe="Label"
>
New
@@ -165,9 +165,9 @@ exports[`Snapshots > renders correctly with title and SVG icon 1`] = `
data-testid="icon"
data-vibe="Icon"
fill="currentColor"
- height="18"
+ height="20"
viewBox="0 0 20 20"
- width="18"
+ width="20"
>
);
diff --git a/packages/core/src/components/Menu/MenuItem/components/MenuItemSubMenu/MenuItemSubMenu.tsx b/packages/core/src/components/Menu/MenuItem/components/MenuItemSubMenu/MenuItemSubMenu.tsx
index ef5e0a4b5a..e9b7cfc927 100644
--- a/packages/core/src/components/Menu/MenuItem/components/MenuItemSubMenu/MenuItemSubMenu.tsx
+++ b/packages/core/src/components/Menu/MenuItem/components/MenuItemSubMenu/MenuItemSubMenu.tsx
@@ -56,7 +56,7 @@ const MenuItemSubMenu = ({
data-popper-placement={actualPlacement}
>
{subMenu && open && (
-
+
{React.cloneElement(subMenu, {
...subMenu?.props,
isVisible: open,
diff --git a/packages/core/src/components/MenuButton/MenuButton.tsx b/packages/core/src/components/MenuButton/MenuButton.tsx
index 89b9828da0..e58e47f58b 100644
--- a/packages/core/src/components/MenuButton/MenuButton.tsx
+++ b/packages/core/src/components/MenuButton/MenuButton.tsx
@@ -189,7 +189,7 @@ const MenuButton = forwardRef(
dialogOffset = MOVE_BY,
dialogPosition = "bottom-start",
dialogClassName,
- dialogPaddingSize = "small",
+ dialogPaddingSize = "none",
dialogShowTriggerIgnoreClass,
dialogHideTriggerIgnoreClass,
onMenuHide = NOOP,
diff --git a/packages/core/src/components/SegmentedControl/SegmentedControl.module.scss b/packages/core/src/components/SegmentedControl/SegmentedControl.module.scss
new file mode 100644
index 0000000000..f170895f23
--- /dev/null
+++ b/packages/core/src/components/SegmentedControl/SegmentedControl.module.scss
@@ -0,0 +1,148 @@
+.segmentedControl {
+ --track-padding: var(--space-2);
+ --segment-radius: var(--border-radius-small);
+
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: repeat(var(--segment-count), 1fr);
+ gap: var(--space-2);
+ align-items: stretch;
+ padding: var(--track-padding);
+ background: var(--allgrey-background-color);
+ border-radius: calc(var(--segment-radius) + var(--track-padding));
+ isolation: isolate;
+}
+
+.fullWidth {
+ width: 100%;
+}
+
+.disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+}
+
+.thumb {
+ position: absolute;
+ z-index: 0;
+ inset-block: var(--track-padding);
+ inset-inline-start: var(--track-padding);
+ width: calc((100% - var(--track-padding) * 2) / var(--segment-count));
+ transform: translateX(calc(var(--selected-index) * 100%));
+ background: var(--primary-background-color);
+
+ border-radius: var(--segment-radius);
+ box-shadow: var(--box-shadow-xs), 0 0 3px 1px var(--ui-border-color);
+ transition: transform var(--motion-expressive-short) cubic-bezier(0.22, 1, 0.36, 1);
+}
+
+.thumbHidden {
+ opacity: 0;
+}
+
+.segment {
+ position: relative;
+ z-index: 1;
+ gap: var(--space-4);
+ padding-inline: var(--space-12);
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ background-color: transparent;
+ border: none;
+ border-radius: var(--segment-radius);
+ color: var(--primary-text-color);
+ font: inherit;
+ white-space: nowrap;
+ transition: color var(--motion-productive-long) var(--motion-timing-transition),
+ background var(--motion-productive-short) var(--motion-timing-transition),
+ scale var(--motion-productive-short) var(--motion-timing-transition);
+ cursor: pointer;
+ user-select: none;
+
+ &:hover {
+ color: var(--primary-text-color);
+ background: color-mix(in srgb, currentColor 8%, transparent);
+ }
+
+ &:active {
+ color: var(--primary-text-color);
+ background: color-mix(in srgb, currentColor 10%, transparent);
+ scale: 0.98;
+ }
+}
+
+.segment:focus-visible {
+ outline: 2px solid var(--primary-color);
+ outline-offset: -2px;
+}
+
+.segment[aria-checked="true"] {
+ color: var(--primary-text-color);
+
+ &:hover,
+ &:active {
+ background: transparent;
+ scale: 1;
+ }
+}
+
+.segment[aria-disabled="true"] {
+ color: var(--disabled-text-color);
+ cursor: not-allowed;
+
+ &:hover,
+ &:active {
+ color: var(--disabled-text-color);
+ background: transparent;
+ scale: 1;
+ }
+}
+
+.segmentContent {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ gap: var(--space-4);
+}
+
+.segmentIcon {
+ color: var(--icon-color);
+}
+
+.segment:hover .segmentIcon,
+.segment:active .segmentIcon,
+.segment[aria-checked="true"] .segmentIcon {
+ color: var(--primary-text-color);
+}
+
+.segment[aria-disabled="true"] .segmentIcon {
+ color: var(--disabled-text-color);
+}
+
+.sizeXs {
+ height: 24px;
+ font-size: 12px;
+}
+
+.sizeSmall {
+ height: 32px;
+ font-size: 14px;
+}
+
+.sizeMedium {
+ height: 40px;
+ font-size: 14px;
+}
+
+.sizeLarge {
+ height: 48px;
+ font-size: 16px;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .thumb,
+ .segment {
+ transition: none;
+ }
+}
diff --git a/packages/core/src/components/SegmentedControl/SegmentedControl.tsx b/packages/core/src/components/SegmentedControl/SegmentedControl.tsx
new file mode 100644
index 0000000000..7432b9e062
--- /dev/null
+++ b/packages/core/src/components/SegmentedControl/SegmentedControl.tsx
@@ -0,0 +1,224 @@
+import React, { forwardRef, useCallback, useRef, useState, type CSSProperties, type KeyboardEvent } from "react";
+import cx from "classnames";
+import { isNil } from "es-toolkit";
+import { Icon } from "@vibe/icon";
+import { Tooltip } from "@vibe/tooltip";
+import { useMergeRef } from "@vibe/shared";
+import { ComponentDefaultTestId, getTestId } from "../../tests/test-ids-utils";
+import { ComponentVibeId } from "../../tests/constants";
+import {
+ type SegmentedControlOption,
+ type SegmentedControlProps,
+ type SegmentedControlSize
+} from "./SegmentedControl.types";
+import styles from "./SegmentedControl.module.scss";
+
+const ICON_SIZE_BY_CONTROL_SIZE: Record = {
+ xs: 14,
+ small: 16,
+ medium: 16,
+ large: 20
+};
+
+const SIZE_CLASS_MAP: Record = {
+ xs: styles.sizeXs,
+ small: styles.sizeSmall,
+ medium: styles.sizeMedium,
+ large: styles.sizeLarge
+};
+
+type SegmentButtonProps = {
+ option: SegmentedControlOption;
+ index: number;
+ isSelected: boolean;
+ isDisabled: boolean;
+ selectedIndex: number;
+ iconSize: number;
+ onSelect: (index: number) => void;
+ onKeyDown: (event: KeyboardEvent) => void;
+ segmentRef: (element: HTMLButtonElement | null) => void;
+};
+
+const SegmentButton = ({
+ option,
+ index,
+ isSelected,
+ isDisabled,
+ selectedIndex,
+ iconSize,
+ onSelect,
+ onKeyDown,
+ segmentRef
+}: SegmentButtonProps) => {
+ const button = (
+ onSelect(index)}
+ onKeyDown={onKeyDown}
+ >
+
+ {option.icon && }
+ {option.label}
+
+
+ );
+
+ if (!isNil(option.tooltip)) {
+ return (
+
+ {button}
+
+ );
+ }
+
+ return button;
+};
+
+const SegmentedControl = forwardRef(
+ (
+ {
+ className,
+ id,
+ "data-testid": dataTestId,
+ options,
+ value,
+ defaultValue,
+ onChange,
+ size = "medium",
+ disabled = false,
+ fullWidth = false,
+ ariaLabel,
+ "aria-labelledby": ariaLabelledby
+ }: SegmentedControlProps,
+ ref: React.ForwardedRef
+ ) => {
+ const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue ?? options[0]?.value);
+ const segmentRefs = useRef>([]);
+ const internalRef = useRef(null);
+ const mergedRef = useMergeRef(ref, internalRef);
+
+ const isControlled = value !== undefined;
+ const selectedValue = isControlled ? value : uncontrolledValue;
+ const selectedIndex = options.findIndex(option => option.value === selectedValue);
+ const resolvedSelectedIndex = selectedIndex === -1 ? 0 : selectedIndex;
+ const iconSize = ICON_SIZE_BY_CONTROL_SIZE[size];
+
+ const select = useCallback(
+ (index: number) => {
+ const option = options[index];
+ if (!option || option.disabled || disabled) return;
+ if (!isControlled) setUncontrolledValue(option.value);
+ onChange?.(option.value);
+ segmentRefs.current[index]?.focus();
+ },
+ [options, disabled, isControlled, onChange]
+ );
+
+ const moveBy = useCallback(
+ (step: number) => {
+ const count = options.length;
+ const from = selectedIndex === -1 ? 0 : selectedIndex;
+ for (let offset = 1; offset <= count; offset++) {
+ const next = (from + step * offset + count * count) % count;
+ if (!options[next]?.disabled) {
+ select(next);
+ return;
+ }
+ }
+ },
+ [options, selectedIndex, select]
+ );
+
+ const onKeyDown = useCallback(
+ (event: KeyboardEvent) => {
+ if (disabled) return;
+
+ switch (event.key) {
+ case "ArrowRight":
+ case "ArrowDown":
+ event.preventDefault();
+ moveBy(1);
+ break;
+ case "ArrowLeft":
+ case "ArrowUp":
+ event.preventDefault();
+ moveBy(-1);
+ break;
+ case "Home":
+ event.preventDefault();
+ select(options.findIndex(option => !option.disabled));
+ break;
+ case "End": {
+ event.preventDefault();
+ const lastEnabled = [...options].reverse().findIndex(option => !option.disabled);
+ if (lastEnabled !== -1) select(options.length - 1 - lastEnabled);
+ break;
+ }
+ default:
+ break;
+ }
+ },
+ [disabled, moveBy, options, select]
+ );
+
+ return (
+
+
+ {options.map((option, index) => {
+ const isSelected = index === selectedIndex;
+ const isDisabled = disabled || Boolean(option.disabled);
+
+ return (
+ {
+ segmentRefs.current[index] = element;
+ }}
+ />
+ );
+ })}
+
+ );
+ }
+);
+
+export default SegmentedControl;
diff --git a/packages/core/src/components/SegmentedControl/SegmentedControl.types.ts b/packages/core/src/components/SegmentedControl/SegmentedControl.types.ts
new file mode 100644
index 0000000000..69bda70cf6
--- /dev/null
+++ b/packages/core/src/components/SegmentedControl/SegmentedControl.types.ts
@@ -0,0 +1,51 @@
+import { type SubIcon } from "@vibe/icon";
+import { type VibeComponentProps } from "../../types";
+
+export type SegmentedControlSize = "xs" | "small" | "medium" | "large";
+
+export type SegmentedControlOption = {
+ value: string;
+ label: string;
+ disabled?: boolean;
+ icon?: SubIcon;
+ tooltip?: string;
+};
+
+export interface SegmentedControlProps extends VibeComponentProps {
+ /**
+ * The list of segment options.
+ */
+ options: SegmentedControlOption[];
+ /**
+ * The currently selected segment value (controlled).
+ */
+ value?: string;
+ /**
+ * The default selected segment value (uncontrolled).
+ */
+ defaultValue?: string;
+ /**
+ * Callback fired when the selected segment changes.
+ */
+ onChange?: (value: string) => void;
+ /**
+ * The size of the segmented control.
+ */
+ size?: SegmentedControlSize;
+ /**
+ * If true, disables the entire segmented control.
+ */
+ disabled?: boolean;
+ /**
+ * If true, makes the segmented control take the full width of its container.
+ */
+ fullWidth?: boolean;
+ /**
+ * Accessible label for the radiogroup.
+ */
+ ariaLabel?: string;
+ /**
+ * ID of the element that labels the radiogroup.
+ */
+ "aria-labelledby"?: string;
+}
diff --git a/packages/core/src/components/SegmentedControl/__stories__/SegmentedControl.stories.tsx b/packages/core/src/components/SegmentedControl/__stories__/SegmentedControl.stories.tsx
new file mode 100644
index 0000000000..d0737c6211
--- /dev/null
+++ b/packages/core/src/components/SegmentedControl/__stories__/SegmentedControl.stories.tsx
@@ -0,0 +1,101 @@
+import React from "react";
+import { createComponentTemplate } from "vibe-storybook-components";
+import { Calendar, Board, Chart } from "@vibe/icons";
+import { type Meta, type StoryObj } from "@storybook/react";
+import SegmentedControl from "../SegmentedControl";
+
+type Story = StoryObj;
+
+export default {
+ title: "Components/SegmentedControl",
+ component: SegmentedControl
+} satisfies Meta;
+
+const segmentedControlTemplate = createComponentTemplate(SegmentedControl);
+
+export const Overview: Story = {
+ render: segmentedControlTemplate.bind({}),
+ args: {
+ ariaLabel: "View options",
+ defaultValue: "week",
+ options: [
+ { value: "day", label: "Day" },
+ { value: "week", label: "Week" },
+ { value: "month", label: "Month" }
+ ]
+ }
+};
+
+export const Sizes: Story = {
+ render: () => (
+
+ {(["xs", "small", "medium", "large"] as const).map(size => (
+
+ ))}
+
+ )
+};
+
+export const FullWidth: Story = {
+ render: segmentedControlTemplate.bind({}),
+ args: {
+ ariaLabel: "View options",
+ fullWidth: true,
+ defaultValue: "week",
+ options: [
+ { value: "day", label: "Day" },
+ { value: "week", label: "Week" },
+ { value: "month", label: "Month" }
+ ]
+ }
+};
+
+export const WithIcons: Story = {
+ render: segmentedControlTemplate.bind({}),
+ args: {
+ ariaLabel: "View options",
+ defaultValue: "board",
+ options: [
+ { value: "calendar", label: "Calendar", icon: Calendar },
+ { value: "board", label: "Board", icon: Board },
+ { value: "chart", label: "Chart", icon: Chart }
+ ]
+ }
+};
+
+export const Disabled: Story = {
+ render: segmentedControlTemplate.bind({}),
+ args: {
+ ariaLabel: "View options",
+ defaultValue: "week",
+ options: [
+ { value: "day", label: "Day" },
+ { value: "week", label: "Week" },
+ { value: "month", label: "Month", disabled: true }
+ ]
+ }
+};
+
+export const DisabledGroup: Story = {
+ render: segmentedControlTemplate.bind({}),
+ args: {
+ ariaLabel: "View options",
+ defaultValue: "week",
+ disabled: true,
+ options: [
+ { value: "day", label: "Day" },
+ { value: "week", label: "Week" },
+ { value: "month", label: "Month" }
+ ]
+ }
+};
diff --git a/packages/core/src/components/SegmentedControl/__tests__/SegmentedControl.test.tsx b/packages/core/src/components/SegmentedControl/__tests__/SegmentedControl.test.tsx
new file mode 100644
index 0000000000..f5cc1a0434
--- /dev/null
+++ b/packages/core/src/components/SegmentedControl/__tests__/SegmentedControl.test.tsx
@@ -0,0 +1,128 @@
+import { vi, beforeEach, describe, it, expect, type Mock } from "vitest";
+import React, { useState } from "react";
+import { fireEvent, render, screen } from "@testing-library/react";
+import SegmentedControl from "../SegmentedControl";
+
+const defaultOptions = [
+ { value: "day", label: "Day" },
+ { value: "week", label: "Week" },
+ { value: "month", label: "Month" }
+];
+
+describe("SegmentedControl", () => {
+ let onChangeMock: Mock;
+
+ beforeEach(() => {
+ onChangeMock = vi.fn();
+ });
+
+ it("renders all segment labels", () => {
+ render( );
+
+ expect(screen.getByRole("radio", { name: "Day" })).toBeInTheDocument();
+ expect(screen.getByRole("radio", { name: "Week" })).toBeInTheDocument();
+ expect(screen.getByRole("radio", { name: "Month" })).toBeInTheDocument();
+ });
+
+ it("selects a segment on click (uncontrolled)", () => {
+ render(
+
+ );
+
+ fireEvent.click(screen.getByRole("radio", { name: "Month" }));
+
+ expect(onChangeMock).toHaveBeenCalledWith("month");
+ expect(screen.getByRole("radio", { name: "Month" })).toHaveAttribute("aria-checked", "true");
+ });
+
+ it("supports controlled mode", () => {
+ const Controlled = () => {
+ const [value, setValue] = useState("week");
+ return ;
+ };
+
+ render( );
+
+ fireEvent.click(screen.getByRole("radio", { name: "Day" }));
+ expect(screen.getByRole("radio", { name: "Day" })).toHaveAttribute("aria-checked", "true");
+ });
+
+ it("does not select disabled segments", () => {
+ render(
+
+ );
+
+ fireEvent.click(screen.getByRole("radio", { name: "Month" }));
+
+ expect(onChangeMock).not.toHaveBeenCalled();
+ expect(screen.getByRole("radio", { name: "Week" })).toHaveAttribute("aria-checked", "true");
+ });
+
+ it("disables all segments when group is disabled", () => {
+ render(
+
+ );
+
+ expect(screen.getByRole("radiogroup")).toHaveAttribute("aria-disabled", "true");
+ fireEvent.click(screen.getByRole("radio", { name: "Day" }));
+ expect(onChangeMock).not.toHaveBeenCalled();
+ });
+
+ it("selects with arrow keys", () => {
+ render(
+
+ );
+
+ const weekSegment = screen.getByRole("radio", { name: "Week" });
+ fireEvent.keyDown(weekSegment, { key: "ArrowRight" });
+
+ expect(onChangeMock).toHaveBeenCalledWith("month");
+ expect(screen.getByRole("radio", { name: "Month" })).toHaveAttribute("aria-checked", "true");
+ });
+
+ it("skips disabled segments with arrow keys", () => {
+ render(
+
+ );
+
+ fireEvent.keyDown(screen.getByRole("radio", { name: "Day" }), { key: "ArrowRight" });
+
+ expect(onChangeMock).toHaveBeenCalledWith("month");
+ });
+
+ it("sets aria-label on the radiogroup", () => {
+ render( );
+
+ expect(screen.getByRole("radiogroup", { name: "View options" })).toBeInTheDocument();
+ });
+
+ it("sets data-vibe attribute", () => {
+ render( );
+
+ expect(screen.getByRole("radiogroup")).toHaveAttribute("data-vibe", "SegmentedControl");
+ });
+});
diff --git a/packages/core/src/components/SegmentedControl/index.ts b/packages/core/src/components/SegmentedControl/index.ts
new file mode 100644
index 0000000000..d3bc7e33d8
--- /dev/null
+++ b/packages/core/src/components/SegmentedControl/index.ts
@@ -0,0 +1,2 @@
+export { default as SegmentedControl } from "./SegmentedControl";
+export type { SegmentedControlProps, SegmentedControlOption, SegmentedControlSize } from "./SegmentedControl.types";
diff --git a/packages/core/src/components/SplitButton/__tests__/__snapshots__/SplitButton.snapshot.test.tsx.snap b/packages/core/src/components/SplitButton/__tests__/__snapshots__/SplitButton.snapshot.test.tsx.snap
index 6cbab73046..70d9f8d38a 100644
--- a/packages/core/src/components/SplitButton/__tests__/__snapshots__/SplitButton.snapshot.test.tsx.snap
+++ b/packages/core/src/components/SplitButton/__tests__/__snapshots__/SplitButton.snapshot.test.tsx.snap
@@ -227,7 +227,7 @@ exports[`SplitButton renders correctly > with left icon 1`] = `
with left icon 1`] = `
>
with right icon 1`] = `
with right icon 1`] = `
split button
(
+ (
+ {
+ children,
+ className,
+ proximity,
+ inactiveZone,
+ edgeFade,
+ spread,
+ movementDuration,
+ borderWidth = 2,
+ glowBlur = 12,
+ palette = "default",
+ radius = 16,
+ id,
+ "data-testid": dataTestId
+ },
+ forwardedRef
+ ) => {
+ const localRef = useRef(null);
+
+ useStrokeSpotlight(localRef, SPOTLIGHT_ACTIVE_CLASS, CLICK_PULSING_CLASS, {
+ proximity,
+ inactiveZone,
+ edgeFade,
+ spread,
+ movementDuration
+ });
+
+ const setRefs = (node: HTMLDivElement | null) => {
+ localRef.current = node;
+ if (typeof forwardedRef === "function") {
+ forwardedRef(node);
+ } else if (forwardedRef) {
+ (forwardedRef as React.MutableRefObject).current = node;
+ }
+ };
+
+ const style = {
+ "--border": borderWidth,
+ "--glow-blur": `${glowBlur}px`,
+ "--radius": radius
+ } as CSSProperties;
+
+ const paletteClass =
+ palette === "sidekick" ? styles.paletteSidekick : palette === "vibe" ? styles.paletteVibe : undefined;
+
+ return (
+
+ );
+ }
+);
+
+export default StrokeSpotlight;
diff --git a/packages/core/src/components/StrokeSpotlight/StrokeSpotlight.types.ts b/packages/core/src/components/StrokeSpotlight/StrokeSpotlight.types.ts
new file mode 100644
index 0000000000..04d2c13c29
--- /dev/null
+++ b/packages/core/src/components/StrokeSpotlight/StrokeSpotlight.types.ts
@@ -0,0 +1,17 @@
+import { type ReactNode } from "react";
+import { type VibeComponentProps } from "../../types";
+import { type StrokeSpotlightOptions } from "./useStrokeSpotlight";
+
+export type StrokeSpotlightPalette = "default" | "sidekick" | "vibe";
+
+export interface StrokeSpotlightProps extends VibeComponentProps, StrokeSpotlightOptions {
+ children: ReactNode;
+ /** Border stroke width in px; mirrored to CSS `--border`. */
+ borderWidth?: number;
+ /** Blur radius in px of the halo bleeding outward from the stroke. */
+ glowBlur?: number;
+ /** Stroke/glow color palette. Default matches agents cyan→blue→violet. */
+ palette?: StrokeSpotlightPalette;
+ /** Corner radius in px (unitless CSS var `--radius`). */
+ radius?: number;
+}
diff --git a/packages/core/src/components/StrokeSpotlight/__tests__/StrokeSpotlight.test.tsx b/packages/core/src/components/StrokeSpotlight/__tests__/StrokeSpotlight.test.tsx
new file mode 100644
index 0000000000..d43ef30646
--- /dev/null
+++ b/packages/core/src/components/StrokeSpotlight/__tests__/StrokeSpotlight.test.tsx
@@ -0,0 +1,49 @@
+import React from "react";
+import { render, screen } from "@testing-library/react";
+import { beforeEach, describe, it, expect, vi } from "vitest";
+import StrokeSpotlight from "../StrokeSpotlight";
+import { STROKE_NO_PULSE_ATTR } from "../useStrokeSpotlight";
+
+describe("StrokeSpotlight", () => {
+ beforeEach(() => {
+ Object.defineProperty(window, "matchMedia", {
+ writable: true,
+ value: vi.fn().mockImplementation((query: string) => ({
+ matches: false,
+ media: query,
+ onchange: null,
+ addListener: vi.fn(),
+ removeListener: vi.fn(),
+ addEventListener: vi.fn(),
+ removeEventListener: vi.fn(),
+ dispatchEvent: vi.fn()
+ }))
+ });
+ });
+
+ it("renders children and default test id / data-vibe", () => {
+ render(
+
+ Compose
+
+ );
+
+ const root = screen.getByTestId("stroke-spotlight");
+ expect(root).toBeInTheDocument();
+ expect(root).toHaveAttribute("data-vibe", "StrokeSpotlight");
+ expect(screen.getByRole("button", { name: "Compose" })).toBeInTheDocument();
+ });
+
+ it("applies palette class and exports no-pulse attr", () => {
+ render(
+
+
+ Attach
+
+
+ );
+
+ expect(screen.getByTestId("spotlight")).toBeInTheDocument();
+ expect(screen.getByRole("button", { name: "Attach" })).toHaveAttribute(STROKE_NO_PULSE_ATTR);
+ });
+});
diff --git a/packages/core/src/components/StrokeSpotlight/index.ts b/packages/core/src/components/StrokeSpotlight/index.ts
new file mode 100644
index 0000000000..dec0513dca
--- /dev/null
+++ b/packages/core/src/components/StrokeSpotlight/index.ts
@@ -0,0 +1,3 @@
+export { default as StrokeSpotlight } from "./StrokeSpotlight";
+export type { StrokeSpotlightProps, StrokeSpotlightPalette } from "./StrokeSpotlight.types";
+export { STROKE_NO_PULSE_ATTR, type StrokeSpotlightOptions } from "./useStrokeSpotlight";
diff --git a/packages/core/src/components/StrokeSpotlight/useStrokeSpotlight.ts b/packages/core/src/components/StrokeSpotlight/useStrokeSpotlight.ts
new file mode 100644
index 0000000000..46a929ae31
--- /dev/null
+++ b/packages/core/src/components/StrokeSpotlight/useStrokeSpotlight.ts
@@ -0,0 +1,273 @@
+import { type RefObject, useEffect } from "react";
+
+export interface StrokeSpotlightOptions {
+ /** How far outside the box (px) the glow still responds. */
+ proximity?: number;
+ /** Fraction of half-min-side; inside this radius from center, glow is off. */
+ inactiveZone?: number;
+ /**
+ * Outward distance from the outer margins (px) over which the stroke fades
+ * from full to off. Inside the box stays full strength.
+ */
+ edgeFade?: number;
+ /** Angular width of the glowing arc (degrees). */
+ spread?: number;
+ /** Seconds for angle interpolation. */
+ movementDuration?: number;
+}
+
+const DEFAULTS = {
+ proximity: 64,
+ inactiveZone: 0.01,
+ edgeFade: 48,
+ spread: 40,
+ movementDuration: 1.5
+} as const;
+
+/** Mark controls that should not trigger the click pulse (e.g. attach, model picker). */
+export const STROKE_NO_PULSE_ATTR = "data-stroke-no-pulse";
+const STROKE_NO_PULSE_SELECTOR = `[${STROKE_NO_PULSE_ATTR}]`;
+
+/**
+ * Pointer-following conic border glow via `--start` / `--active`, plus one-shot
+ * click pulse. Traveling stroke is suppressed while the box is `:focus-within`
+ * and resumes on hover after focus leaves.
+ */
+export function useStrokeSpotlight(
+ ref: RefObject,
+ activeClassName: string,
+ clickPulsingClassName: string,
+ options: StrokeSpotlightOptions = {}
+) {
+ const proximity = options.proximity ?? DEFAULTS.proximity;
+ const inactiveZone = options.inactiveZone ?? DEFAULTS.inactiveZone;
+ const edgeFade = options.edgeFade ?? DEFAULTS.edgeFade;
+ const spread = options.spread ?? DEFAULTS.spread;
+ const movementDuration = options.movementDuration ?? DEFAULTS.movementDuration;
+
+ useEffect(() => {
+ const el = ref.current;
+ if (!el || !activeClassName || !clickPulsingClassName) return;
+
+ const pulseEl = el.querySelector("[data-stroke-click-pulse]");
+ const mql = window.matchMedia("(prefers-reduced-motion: reduce)");
+ let reducedMotion = mql.matches;
+ // One-shot click pulse: after the first choose, don't re-pulse until blur.
+ let engaged = false;
+ let cachedRect = el.getBoundingClientRect();
+ let rafId: number | null = null;
+ let lastX = 0;
+ let lastY = 0;
+ let hasPointer = false;
+ let angleRafId: number | null = null;
+ let angleFrom = 0;
+ let angleTo = 0;
+ let angleStartMs = 0;
+
+ el.style.setProperty("--spread", String(spread));
+ el.style.setProperty("--start", "0");
+ el.style.setProperty("--active", "0");
+
+ const clearClickPulse = () => {
+ el.classList.remove(clickPulsingClassName);
+ };
+
+ const stopAngleAnimation = () => {
+ if (angleRafId !== null) {
+ cancelAnimationFrame(angleRafId);
+ angleRafId = null;
+ }
+ };
+
+ const easeOutExpo = (t: number) => (t >= 1 ? 1 : 1 - Math.pow(2, -10 * t));
+
+ const tickAngle = (now: number) => {
+ const t = Math.min(1, (now - angleStartMs) / (movementDuration * 1000));
+ const value = angleFrom + (angleTo - angleFrom) * easeOutExpo(t);
+ el.style.setProperty("--start", String(value));
+ if (t < 1) {
+ angleRafId = requestAnimationFrame(tickAngle);
+ } else {
+ angleRafId = null;
+ }
+ };
+
+ const animateAngle = (from: number, to: number) => {
+ stopAngleAnimation();
+ angleFrom = from;
+ angleTo = to;
+ angleStartMs = performance.now();
+ angleRafId = requestAnimationFrame(tickAngle);
+ };
+
+ const deactivate = () => {
+ el.style.setProperty("--active", "0");
+ el.classList.remove(activeClassName);
+ stopAngleAnimation();
+ };
+
+ const applyGlow = (clientX: number, clientY: number, rect: DOMRect) => {
+ // No traveling stroke while the prompt (or anything inside) is focused.
+ if (el.matches(":focus-within")) {
+ deactivate();
+ return;
+ }
+
+ if (rect.width <= 0 || rect.height <= 0) return;
+
+ const centerX = rect.left + rect.width * 0.5;
+ const centerY = rect.top + rect.height * 0.5;
+ const distanceFromCenter = Math.hypot(clientX - centerX, clientY - centerY);
+ const inactiveRadius = 0.5 * Math.min(rect.width, rect.height) * inactiveZone;
+
+ if (distanceFromCenter < inactiveRadius) {
+ deactivate();
+ return;
+ }
+
+ const isActive =
+ clientX > rect.left - proximity &&
+ clientX < rect.left + rect.width + proximity &&
+ clientY > rect.top - proximity &&
+ clientY < rect.top + rect.height + proximity;
+
+ if (!isActive) {
+ deactivate();
+ return;
+ }
+
+ const localX = clientX - rect.left;
+ const localY = clientY - rect.top;
+ const outsideX = Math.max(0 - localX, 0, localX - rect.width);
+ const outsideY = Math.max(0 - localY, 0, localY - rect.height);
+ const distOutside = Math.sqrt(outsideX * outsideX + outsideY * outsideY);
+ const fadeRange = edgeFade > 0 ? edgeFade : proximity;
+ const active = distOutside <= 0 ? 1 : Math.max(0, Math.min(1, 1 - distOutside / fadeRange));
+
+ el.style.setProperty("--active", String(active));
+ el.classList.add(activeClassName);
+
+ const currentAngle = parseFloat(el.style.getPropertyValue("--start")) || 0;
+ const targetAngle = (180 * Math.atan2(clientY - centerY, clientX - centerX)) / Math.PI + 90;
+ const angleDiff = ((targetAngle - currentAngle + 180) % 360) - 180;
+ animateAngle(currentAngle, currentAngle + angleDiff);
+ };
+
+ const scheduleGlow = (clientX: number, clientY: number) => {
+ lastX = clientX;
+ lastY = clientY;
+ hasPointer = true;
+ if (rafId !== null) return;
+ rafId = requestAnimationFrame(() => {
+ rafId = null;
+ cachedRect = el.getBoundingClientRect();
+ applyGlow(lastX, lastY, cachedRect);
+ });
+ };
+
+ const onMotionChange = () => {
+ reducedMotion = mql.matches;
+ if (reducedMotion) {
+ deactivate();
+ clearClickPulse();
+ }
+ };
+ mql.addEventListener("change", onMotionChange);
+
+ const refreshRect = () => {
+ cachedRect = el.getBoundingClientRect();
+ };
+
+ const onWindowPointerMove = (e: PointerEvent) => {
+ if (reducedMotion || !el.isConnected) {
+ deactivate();
+ return;
+ }
+
+ if (e.clientX < 0 || e.clientY < 0 || e.clientX > window.innerWidth || e.clientY > window.innerHeight) {
+ if (!el.matches(":focus-within")) engaged = false;
+ hasPointer = false;
+ deactivate();
+ return;
+ }
+
+ scheduleGlow(e.clientX, e.clientY);
+ };
+
+ const onWindowBlur = () => {
+ engaged = false;
+ hasPointer = false;
+ deactivate();
+ };
+
+ const restartClickPulse = () => {
+ el.classList.remove(clickPulsingClassName);
+ void el.offsetWidth;
+ el.classList.add(clickPulsingClassName);
+ };
+
+ const onPulseAnimationEnd = (e: AnimationEvent) => {
+ if (e.target !== pulseEl) return;
+ clearClickPulse();
+ };
+
+ const onFocusIn = () => {
+ engaged = true;
+ deactivate();
+ };
+
+ const onFocusOut = () => {
+ // Wait a frame so :focus-within reflects the new target.
+ requestAnimationFrame(() => {
+ if (!el.isConnected || el.matches(":focus-within")) return;
+ engaged = false;
+ // Resume hover stroke immediately if the pointer is still nearby.
+ if (hasPointer) {
+ cachedRect = el.getBoundingClientRect();
+ applyGlow(lastX, lastY, cachedRect);
+ }
+ });
+ };
+
+ const onDown = (e: PointerEvent) => {
+ if (reducedMotion) return;
+ const target = e.target;
+ if (target instanceof Element && target.closest(STROKE_NO_PULSE_SELECTOR)) return;
+ if (engaged || el.matches(":focus-within")) {
+ deactivate();
+ return;
+ }
+ engaged = true;
+ deactivate();
+ restartClickPulse();
+ };
+
+ window.addEventListener("pointermove", onWindowPointerMove, {
+ passive: true
+ });
+ window.addEventListener("blur", onWindowBlur);
+ window.addEventListener("scroll", refreshRect, { passive: true });
+ window.addEventListener("resize", refreshRect, { passive: true });
+ el.addEventListener("pointerdown", onDown);
+ el.addEventListener("focusin", onFocusIn);
+ el.addEventListener("focusout", onFocusOut);
+ pulseEl?.addEventListener("animationend", onPulseAnimationEnd);
+
+ return () => {
+ mql.removeEventListener("change", onMotionChange);
+ if (rafId !== null) cancelAnimationFrame(rafId);
+ stopAngleAnimation();
+ el.classList.remove(activeClassName);
+ clearClickPulse();
+ el.style.setProperty("--active", "0");
+ window.removeEventListener("pointermove", onWindowPointerMove);
+ window.removeEventListener("blur", onWindowBlur);
+ window.removeEventListener("scroll", refreshRect);
+ window.removeEventListener("resize", refreshRect);
+ el.removeEventListener("pointerdown", onDown);
+ el.removeEventListener("focusin", onFocusIn);
+ el.removeEventListener("focusout", onFocusOut);
+ pulseEl?.removeEventListener("animationend", onPulseAnimationEnd);
+ };
+ }, [ref, activeClassName, clickPulsingClassName, proximity, inactiveZone, edgeFade, spread, movementDuration]);
+}
diff --git a/packages/core/src/components/Tabs/Tab/Tab.module.scss b/packages/core/src/components/Tabs/Tab/Tab.module.scss
index 250aeee5e2..41aa791005 100644
--- a/packages/core/src/components/Tabs/Tab/Tab.module.scss
+++ b/packages/core/src/components/Tabs/Tab/Tab.module.scss
@@ -5,44 +5,41 @@
.tabWrapper {
position: relative;
display: inline-block;
- padding-inline: 1px;
- border-top: 1px solid transparent;
- border-bottom: 2px solid;
- border-bottom-color: var(--ui-background-color);
- color: var(--primary-text-color);
+ padding-left: 0;
+ padding-right: 0;
+ border: none;
+ color: var(--secondary-text-color);
text-align: center;
height: 100%;
margin: 0;
+ box-sizing: border-box;
&.stretchedUnderline {
border-bottom: 0;
}
}
+/* Selected stroke is rendered once on TabList (slide-transition) */
.tabWrapper:after {
- display: block;
- position: absolute;
- inset-inline: 0;
- content: "";
- border-bottom: solid 2px;
- border-bottom-color: var(--primary-color);
- transform: scaleX(0);
- z-index: 0;
+ display: none;
}
.tabWrapper .tabInner {
- $margin-bottom: 1px;
- height: calc(100% - #{$margin-bottom});
+ /* Leaves 2px gap + 2px underline within the list height */
+ height: calc(100% - 4px);
+ width: fit-content;
+ box-sizing: border-box;
display: flex;
align-items: center;
justify-content: center;
text-decoration: none;
- padding: 4px 16px;
+ padding: 4px 8px;
+ border-radius: 8px;
@include vibe-text(text1, normal);
user-select: none;
- margin-bottom: $margin-bottom;
+ margin-bottom: 0;
cursor: pointer;
- color: var(--primary-text-color);
+ color: var(--secondary-text-color);
}
.tabWrapper .tabInner:focus {
@@ -50,13 +47,13 @@
}
.tabWrapper .tabInner .tabIcon {
- color: var(--icon-color);
- margin-inline-end: var(--space-8);
+ color: var(--secondary-text-color);
+ margin-right: var(--spacing-small);
}
.tabWrapper .tabInner .tabIcon.right {
- margin-inline-end: 0;
- margin-inline-start: var(--space-8);
+ margin-right: 0;
+ margin-left: var(--spacing-small);
}
.tabWrapper.tabFocusVisibleInset {
@@ -64,9 +61,16 @@
position: relative;
}
-.tabWrapper.active:after {
- transform: scaleX(1);
- transition: transform var(--motion-productive-medium) var(--motion-timing-enter);
+.tabWrapper.active {
+ color: var(--primary-text-color);
+
+ .tabInner {
+ color: var(--primary-text-color);
+ }
+
+ .tabInner .tabIcon {
+ color: var(--primary-text-color);
+ }
}
.tabWrapper.disabled .tabInner {
@@ -74,7 +78,22 @@
cursor: not-allowed;
}
-.tabWrapper:not(.disabled) .tabInner:hover {
- border-radius: 4px;
+.tabWrapper.disabled .tabInner .tabIcon {
+ color: var(--disabled-text-color);
+}
+
+.tabWrapper:not(.disabled):not(.active) .tabInner:hover {
+ border-radius: 8px;
+ background-color: var(--primary-background-hover-color);
+ color: var(--primary-text-color);
+
+ .tabIcon {
+ color: var(--primary-text-color);
+ }
+}
+
+.tabWrapper.active:not(.disabled) .tabInner:hover {
+ border-radius: 8px;
background-color: var(--primary-background-hover-color);
+ color: var(--primary-text-color);
}
diff --git a/packages/core/src/components/Tabs/TabList/TabList.module.scss b/packages/core/src/components/Tabs/TabList/TabList.module.scss
index 5f36c697cc..3fa4bf3998 100644
--- a/packages/core/src/components/Tabs/TabList/TabList.module.scss
+++ b/packages/core/src/components/Tabs/TabList/TabList.module.scss
@@ -1,22 +1,62 @@
@import "../../../styles/typography";
+/* Tokens — remove once design system Sense motion tokens are live */
+/* Pattern: slide-transition · Tokens: position · ease-transition · duration-long-250 */
+.tabsWrapper {
+ position: relative;
+ --duration-long-250: 250ms;
+ --duration-short-70: 70ms;
+ --ease-transition: cubic-bezier(0.4, 0, 0.2, 1);
+ --ease-linear: linear;
+}
+
.tabsWrapper .tabsList {
display: flex;
flex-direction: row;
list-style-type: none;
font-size: 0;
position: relative;
- height: 40px;
+ /* Medium: 32px button + 2px gap + 2px selected underline */
+ height: 36px;
outline: none;
padding: 0;
}
+.tabsWrapper .selectedIndicator {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 0;
+ height: 2px;
+ background-color: var(--primary-color);
+ border-radius: 1px;
+ opacity: 0;
+ z-index: 2;
+ pointer-events: none;
+ transition:
+ left var(--duration-long-250) var(--ease-transition),
+ width var(--duration-long-250) var(--ease-transition),
+ opacity var(--duration-short-70) var(--ease-linear);
+}
+
+.tabsWrapper .selectedIndicator.visible {
+ opacity: 1;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .tabsWrapper .selectedIndicator {
+ transition: opacity var(--duration-short-70) var(--ease-linear);
+ }
+}
+
.tabsWrapper .tabsList.sm {
+ /* Small: 28px button + 2px gap + 2px underline */
height: 32px;
}
.tabsWrapper .tabsList.lg {
- height: 48px;
+ /* Large: 36px button + 2px gap + 2px underline */
+ height: 40px;
}
.tabsWrapper.stretched .tabsList {
@@ -39,5 +79,5 @@
}
.tabsWrapper.stretchedUnderline {
- border-bottom: 2px solid var(--ui-background-color);
+ border-bottom: none;
}
diff --git a/packages/core/src/components/Tabs/TabList/TabList.tsx b/packages/core/src/components/Tabs/TabList/TabList.tsx
index fab7e64fb6..506006e8d8 100644
--- a/packages/core/src/components/Tabs/TabList/TabList.tsx
+++ b/packages/core/src/components/Tabs/TabList/TabList.tsx
@@ -6,6 +6,7 @@ import React, {
type ReactElement,
useCallback,
useEffect,
+ useLayoutEffect,
useMemo,
useRef,
useState
@@ -20,6 +21,8 @@ import { ComponentDefaultTestId, getTestId } from "../../../tests/test-ids-utils
import styles from "./TabList.module.scss";
+const SELECTED_INDICATOR_INSET_PX = 4;
+
export interface TabListProps extends VibeComponentProps {
/**
* Callback fired when the active tab changes.
@@ -69,8 +72,13 @@ const TabList: FC = forwardRef(
const componentRef = useRef(null);
const mergedRef = useMergeRef(ref, componentRef);
const tabRefs = useRef>({});
+ const ulRef = useRef(null);
+ const indicatorRef = useRef(null);
+ const indicatorReadyRef = useRef(false);
+ const lastGeometryRef = useRef<{ left: number; width: number } | null>(null);
const [activeTabState, setActiveTabState] = useState(activeTabId);
+ const [indicatorVisible, setIndicatorVisible] = useState(false);
const prevActiveTabIdProp = usePrevious(activeTabId);
const prevActiveTabState = usePrevious(activeTabState);
@@ -122,7 +130,6 @@ const TabList: FC = forwardRef(
);
const getItemByIndex = useCallback((index: number): ReactElement => children[index], [children]);
const disabledIndexes = useMemo(() => Array.from(disabledTabIds), [disabledTabIds]);
- const ulRef = useRef();
const { activeIndex: focusIndex, onSelectionAction } = useGridKeyboardNavigation({
ref: ulRef,
numberOfItemsInLine: children?.length,
@@ -141,6 +148,73 @@ const TabList: FC = forwardRef(
}
}, [focusIndex, prevFocusIndex]);
+ const updateSelectedIndicator = useCallback(
+ (animate: boolean) => {
+ const wrapper = componentRef.current as HTMLElement | null;
+ const indicator = indicatorRef.current;
+ const tab = tabRefs.current[activeTabState];
+ if (!wrapper || !indicator || !tab) return;
+
+ const wrapperRect = wrapper.getBoundingClientRect();
+ const tabRect = tab.getBoundingClientRect();
+ const toLeft = tabRect.left - wrapperRect.left + wrapper.scrollLeft + SELECTED_INDICATOR_INSET_PX;
+ const toWidth = Math.max(0, tabRect.width - SELECTED_INDICATOR_INSET_PX * 2);
+
+ // A non-animated update that lands on the geometry we already applied would only
+ // cancel an in-flight glide. ResizeObserver.observe() always fires one such callback,
+ // so bail out unless the target actually moved.
+ const lastGeometry = lastGeometryRef.current;
+ if (!animate && lastGeometry && lastGeometry.left === toLeft && lastGeometry.width === toWidth) {
+ setIndicatorVisible(true);
+ return;
+ }
+ lastGeometryRef.current = { left: toLeft, width: toWidth };
+
+ const prefersReducedMotion =
+ typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
+ const shouldAnimate = animate && indicatorReadyRef.current && !prefersReducedMotion;
+
+ if (!shouldAnimate) {
+ const previousTransition = indicator.style.transition;
+ indicator.style.transition = "none";
+ indicator.style.left = `${toLeft}px`;
+ indicator.style.width = `${toWidth}px`;
+ void indicator.offsetWidth;
+ indicator.style.transition = previousTransition;
+ } else {
+ indicator.style.left = `${toLeft}px`;
+ indicator.style.width = `${toWidth}px`;
+ }
+
+ indicatorReadyRef.current = true;
+ setIndicatorVisible(true);
+ },
+ [activeTabState]
+ );
+
+ // Lets the ResizeObserver stay subscribed across tab changes.
+ const updateSelectedIndicatorRef = useRef(updateSelectedIndicator);
+ updateSelectedIndicatorRef.current = updateSelectedIndicator;
+
+ useLayoutEffect(() => {
+ updateSelectedIndicator(true);
+ }, [activeTabState, children, size, tabType, updateSelectedIndicator]);
+
+ useEffect(() => {
+ const wrapper = componentRef.current as HTMLElement | null;
+ if (!wrapper || typeof ResizeObserver === "undefined") return;
+
+ const resizeObserver = new ResizeObserver(() => {
+ updateSelectedIndicatorRef.current(false);
+ });
+ resizeObserver.observe(wrapper);
+ Object.values(tabRefs.current).forEach(tab => {
+ if (tab) resizeObserver.observe(tab);
+ });
+
+ return () => resizeObserver.disconnect();
+ }, [children]);
+
const tabsToRender = useMemo(() => {
const childrenToRender = React.Children.map(children, (child, index) => {
const isActive = activeTabState === index;
@@ -177,6 +251,11 @@ const TabList: FC = forwardRef(
+
);
}
diff --git a/packages/core/src/components/Tabs/TabList/__tests__/__snapshots__/TabList.snapshot.test.jsx.snap b/packages/core/src/components/Tabs/TabList/__tests__/__snapshots__/TabList.snapshot.test.jsx.snap
index 250fba2184..9c5a704d1e 100644
--- a/packages/core/src/components/Tabs/TabList/__tests__/__snapshots__/TabList.snapshot.test.jsx.snap
+++ b/packages/core/src/components/Tabs/TabList/__tests__/__snapshots__/TabList.snapshot.test.jsx.snap
@@ -44,6 +44,10 @@ exports[`TabList renders correctly > with activeTabId 1`] = `
+
`;
@@ -74,6 +78,10 @@ exports[`TabList renders correctly > with children 1`] = `
+
`;
@@ -104,6 +112,10 @@ exports[`TabList renders correctly > with className 1`] = `
+
`;
@@ -135,6 +147,10 @@ exports[`TabList renders correctly > with id 1`] = `
+
`;
@@ -182,6 +198,10 @@ exports[`TabList renders correctly > with size 1`] = `
+
`;
@@ -229,6 +249,10 @@ exports[`TabList renders correctly > with stretchedUnderline 1`] = `
+
`;
@@ -276,5 +300,9 @@ exports[`TabList renders correctly > with tabType 1`] = `
+
`;
diff --git a/packages/core/src/components/Tabs/TabList/__tests__/__snapshots__/TabList.snapshot.test.tsx.snap b/packages/core/src/components/Tabs/TabList/__tests__/__snapshots__/TabList.snapshot.test.tsx.snap
index 250fba2184..9c5a704d1e 100644
--- a/packages/core/src/components/Tabs/TabList/__tests__/__snapshots__/TabList.snapshot.test.tsx.snap
+++ b/packages/core/src/components/Tabs/TabList/__tests__/__snapshots__/TabList.snapshot.test.tsx.snap
@@ -44,6 +44,10 @@ exports[`TabList renders correctly > with activeTabId 1`] = `
+
`;
@@ -74,6 +78,10 @@ exports[`TabList renders correctly > with children 1`] = `
+
`;
@@ -104,6 +112,10 @@ exports[`TabList renders correctly > with className 1`] = `
+
`;
@@ -135,6 +147,10 @@ exports[`TabList renders correctly > with id 1`] = `
+
`;
@@ -182,6 +198,10 @@ exports[`TabList renders correctly > with size 1`] = `
+
`;
@@ -229,6 +249,10 @@ exports[`TabList renders correctly > with stretchedUnderline 1`] = `
+
`;
@@ -276,5 +300,9 @@ exports[`TabList renders correctly > with tabType 1`] = `
+
`;
diff --git a/packages/core/src/components/Tabs/TabsContext/__tests__/__snapshots__/TabsContext.snapshot.test.jsx.snap b/packages/core/src/components/Tabs/TabsContext/__tests__/__snapshots__/TabsContext.snapshot.test.jsx.snap
index df9e3aa882..32270c4089 100644
--- a/packages/core/src/components/Tabs/TabsContext/__tests__/__snapshots__/TabsContext.snapshot.test.jsx.snap
+++ b/packages/core/src/components/Tabs/TabsContext/__tests__/__snapshots__/TabsContext.snapshot.test.jsx.snap
@@ -47,6 +47,10 @@ exports[`TabsContext renders correctly > with activeTabId 1`] = `
+
with className 1`] = `
+
with empty props 1`] = `
+
with id 1`] = `
+
with activeTabId 1`] = `
+
with className 1`] = `
+
with empty props 1`] = `
+
with id 1`] = `
+