diff --git a/.github/workflows/ui-next-ci.yml b/.github/workflows/ui-next-ci.yml
new file mode 100644
index 0000000000..c9b15ad67f
--- /dev/null
+++ b/.github/workflows/ui-next-ci.yml
@@ -0,0 +1,61 @@
+name: UI v2 CI
+
+on:
+ pull_request:
+ branches:
+ - main
+ paths:
+ - "ui-next/**"
+
+permissions:
+ contents: read
+
+jobs:
+ lint-format-test:
+ name: Lint, Format & Test
+ runs-on: ubuntu-latest
+ defaults:
+ run:
+ working-directory: ui-next
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: 22
+
+ - name: Setup pnpm
+ uses: pnpm/action-setup@v4
+ with:
+ version: 10.32.0
+
+ - name: Get pnpm store directory
+ id: pnpm-cache
+ run: echo "store=$(pnpm store path)" >> $GITHUB_OUTPUT
+
+ - name: Cache pnpm store
+ uses: actions/cache@v4
+ with:
+ path: ${{ steps.pnpm-cache.outputs.store }}
+ key: ${{ runner.os }}-pnpm-${{ hashFiles('ui-next/pnpm-lock.yaml') }}
+ restore-keys: ${{ runner.os }}-pnpm-
+
+ - name: Install dependencies
+ run: pnpm install --frozen-lockfile
+
+ - name: Prettier check
+ run: pnpm prettier:check
+
+ - name: Lint
+ run: pnpm lint
+
+ - name: Type check
+ run: pnpm typecheck
+
+ - name: Test
+ run: pnpm test
+
+ - name: Build
+ run: pnpm build
diff --git a/ui-next/.env b/ui-next/.env
new file mode 100644
index 0000000000..4e5b3adcb8
--- /dev/null
+++ b/ui-next/.env
@@ -0,0 +1,8 @@
+# OSS Conductor UI – defaults for local dev
+
+# Backend API (Conductor server). Default: local server.
+VITE_WF_SERVER=http://localhost:8080
+
+# Optional
+# VITE_PUBLIC_URL=/
+# GENERATE_SOURCEMAP=false
diff --git a/ui-next/.gitignore b/ui-next/.gitignore
new file mode 100644
index 0000000000..7d4dfc8a78
--- /dev/null
+++ b/ui-next/.gitignore
@@ -0,0 +1,26 @@
+# Dependencies
+node_modules
+
+# Local env (may contain secrets)
+.env.local
+.env.*.local
+
+# Build output
+dist
+build
+storybook-static
+
+# Test / Playwright
+/test-results/
+/playwright-report/
+/playwright/.cache/
+
+# Turbo
+.turbo
+
+# Vite
+.vite
+
+# IDE / OS
+.DS_Store
+
diff --git a/ui-next/.npmrc b/ui-next/.npmrc
new file mode 100644
index 0000000000..5406fe67db
--- /dev/null
+++ b/ui-next/.npmrc
@@ -0,0 +1,7 @@
+# Hoist these packages so they are directly importable without needing explicit
+# devDependency declarations for each transitive package.
+public-hoist-pattern[]=@mui/*
+public-hoist-pattern[]=@use-gesture/*
+public-hoist-pattern[]=@eslint/*
+public-hoist-pattern[]=globals
+public-hoist-pattern[]=monaco-editor
\ No newline at end of file
diff --git a/ui-next/.prettierignore b/ui-next/.prettierignore
new file mode 100644
index 0000000000..08437e2d75
--- /dev/null
+++ b/ui-next/.prettierignore
@@ -0,0 +1,10 @@
+build
+storybook-static
+/test-results/
+/playwright-report/
+/playwright/.cache/
+tests-examples
+playwright
+public/context.js
+/dist/
+pnpm-lock.yaml
diff --git a/ui-next/.prettierrc.json b/ui-next/.prettierrc.json
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/ui-next/.prettierrc.json
@@ -0,0 +1 @@
+{}
diff --git a/ui-next/README.md b/ui-next/README.md
new file mode 100644
index 0000000000..1ec124ae73
--- /dev/null
+++ b/ui-next/README.md
@@ -0,0 +1,171 @@
+# Conductor UI v2
+
+The open-source React UI for [Conductor](https://github.com/conductor-oss/conductor). It ships as both a **standalone web application** and an **npm library** that enterprise packages can extend via a plugin system.
+
+## Running locally
+
+### Prerequisites
+
+- Node.js 22+
+- [pnpm](https://pnpm.io/) 10.32.0 (`corepack use pnpm@10.32.0`)
+- A running Conductor server (default: `http://localhost:8080`)
+
+### Setup
+
+```bash
+pnpm install
+```
+
+Configure the backend URL in `.env` (see `.env` for defaults):
+
+```bash
+VITE_WF_SERVER=http://localhost:8080
+```
+
+### Start the dev server
+
+```bash
+pnpm dev
+```
+
+The app will be available at `http://localhost:1234`.
+
+### Runtime configuration
+
+The app reads runtime config from `public/context.js`, which is loaded at startup (not bundled). Copy the example and edit as needed:
+
+```bash
+cp public/context.js.example public/context.js
+```
+
+This file sets feature flags (`window.conductor`) and auth config (`window.authConfig`) without requiring a rebuild.
+
+## Available scripts
+
+| Script | Description |
+| --------------------- | ------------------------------- |
+| `pnpm dev` | Start dev server with HMR |
+| `pnpm build` | Build standalone app to `dist/` |
+| `pnpm build:lib` | Build npm library to `dist/` |
+| `pnpm build:all` | Build both app and library |
+| `pnpm lint` | Run ESLint |
+| `pnpm lint:fix` | Run ESLint with auto-fix |
+| `pnpm prettier:check` | Check formatting |
+| `pnpm prettier:write` | Auto-format all files |
+| `pnpm typecheck` | Type-check without emitting |
+| `pnpm test` | Run unit tests |
+| `pnpm test:watch` | Run tests in watch mode |
+| `pnpm test:coverage` | Run tests with coverage report |
+
+## Using as an npm library
+
+Install the package:
+
+```bash
+npm install conductor-ui
+```
+
+Import styles in your app entry point:
+
+```tsx
+import "conductor-ui/styles.css"; // component styles
+import "conductor-ui/global.css"; // global body/font styles (optional)
+```
+
+### Extending with plugins
+
+The plugin system lets you register additional routes, sidebar items, task forms, auth providers, and more without modifying the core package.
+
+```tsx
+import { pluginRegistry, App } from "conductor-ui";
+
+// Register a custom sidebar item
+pluginRegistry.registerSidebarItem({
+ position: { target: "root", after: "definitionsSubMenu" },
+ item: {
+ id: "myFeature",
+ title: "My Feature",
+ icon: ,
+ linkTo: "/my-feature",
+ shortcuts: [],
+ hidden: false,
+ position: 350,
+ },
+});
+
+// Register a custom route
+pluginRegistry.registerRoutes([
+ {
+ path: "/my-feature",
+ element: ,
+ },
+]);
+
+// Render the app
+function Root() {
+ return ;
+}
+```
+
+### Plugin extension points
+
+| Extension | Method | Description |
+| --------------- | ------------------------------ | -------------------------------------------------- |
+| Routes | `registerRoutes(routes)` | Add authenticated routes |
+| Public routes | `registerPublicRoutes(routes)` | Add unauthenticated routes |
+| Sidebar items | `registerSidebarItem(reg)` | Inject items into the sidebar |
+| Task forms | `registerTaskForm(reg)` | Custom forms for task types in the workflow editor |
+| Task menu items | `registerTaskMenuItem(reg)` | Add task types to the "Add Task" menu |
+| Auth provider | `registerAuthProvider(reg)` | Replace the auth implementation |
+| Search provider | `registerSearchProvider(reg)` | Add results to global search |
+
+### Sidebar item positioning
+
+Sidebar items use numeric positions so plugins can inject between core items without collisions. The core OSS positions are exported for reference:
+
+```tsx
+import { CORE_SIDEBAR_POSITIONS } from "conductor-ui";
+
+// CORE_SIDEBAR_POSITIONS.ROOT:
+// executionsSubMenu: 100
+// runWorkflow: 200
+// definitionsSubMenu:300
+// helpMenu: 400
+// swaggerItem: 500
+
+pluginRegistry.registerSidebarItem({
+ position: { target: "root" },
+ item: {
+ id: "myItem",
+ position: 350, // between definitionsSubMenu (300) and helpMenu (400)
+ // ...
+ },
+});
+```
+
+## Project structure
+
+```
+src/
+├── components/ # Shared UI components
+│ └── Sidebar/ # Sidebar with plugin-injectable menu
+├── pages/ # Route-level page components
+├── plugins/ # Plugin registry and fetch utilities
+├── shared/ # Auth state machine and context
+├── theme/ # MUI theme provider
+├── types/ # Shared TypeScript types
+└── utils/ # Feature flags, constants, helpers
+public/
+├── context.js # Runtime config (gitignored, not bundled)
+└── context.js.example
+```
+
+## Peer dependencies
+
+When consuming as a library, the following must be provided by the host app:
+
+- `react` ^18
+- `react-dom` ^18
+- `react-router` / `react-router-dom` ^7
+- `@mui/material`, `@mui/icons-material`, `@mui/system`, `@mui/x-date-pickers`
+- `@emotion/react`, `@emotion/styled`
diff --git a/ui-next/eslint.config.mjs b/ui-next/eslint.config.mjs
new file mode 100644
index 0000000000..9606a2f09e
--- /dev/null
+++ b/ui-next/eslint.config.mjs
@@ -0,0 +1,105 @@
+import eslintReact from "@eslint-react/eslint-plugin";
+import js from "@eslint/js";
+import vitest from "@vitest/eslint-plugin";
+import reactHooks from "eslint-plugin-react-hooks";
+import reactRefresh from "eslint-plugin-react-refresh";
+import { globalIgnores } from "eslint/config";
+import globals from "globals";
+import tseslint from "typescript-eslint";
+
+const commonRules = {
+ "@typescript-eslint/no-explicit-any": "warn",
+ "@typescript-eslint/no-unused-vars": [
+ "error",
+ { argsIgnorePattern: "^_", varsIgnorePattern: "^_" },
+ ],
+ // TODO: Remove this and fix types properly
+ "@typescript-eslint/ban-ts-comment": "warn",
+ // Prevent direct imports from date-fns and date-fns-tz except in utils/date.ts
+ "no-restricted-imports": [
+ "error",
+ {
+ patterns: [
+ {
+ group: ["date-fns"],
+ message:
+ "Direct imports from 'date-fns' are not allowed. Please import from 'src/utils/date' instead.",
+ },
+ {
+ group: ["date-fns-tz"],
+ message:
+ "Direct imports from 'date-fns-tz' are not allowed. Please import from 'src/utils/date' instead.",
+ },
+ ],
+ },
+ ],
+};
+
+const baseConfig = {
+ extends: [
+ js.configs.recommended,
+ tseslint.configs.recommended,
+ reactHooks.configs["recommended-latest"],
+ reactRefresh.configs.vite,
+ eslintReact.configs.recommended,
+ ],
+ languageOptions: {
+ ecmaVersion: 2020,
+ sourceType: "module",
+ globals: {
+ ...globals.browser,
+ ...globals.node,
+ },
+ },
+ rules: {
+ "no-undef": "error",
+ ...commonRules,
+ },
+};
+
+export default tseslint.config([
+ globalIgnores(["dist", "node_modules"]),
+
+ // Test files (Vitest + testing globals)
+ {
+ files: [
+ "**/__tests__/**/*.{js,jsx,ts,tsx}",
+ "**/*.{test,spec}.{js,jsx,ts,tsx}",
+ ],
+ ...baseConfig,
+ plugins: { vitest, ...baseConfig.plugins },
+ rules: {
+ ...vitest.configs.recommended.rules,
+ ...commonRules,
+ },
+ },
+
+ // JSX files (allow PropTypes)
+ {
+ files: ["**/*.jsx"],
+ ...baseConfig,
+ rules: {
+ ...baseConfig.rules,
+ "react/prop-types": "off",
+ "@eslint-react/no-prop-types": "off",
+ },
+ },
+
+ // Non-test files (TS/TSX)
+ {
+ files: ["**/*.{js,ts,tsx}"],
+ ignores: [
+ "**/__tests__/**/*.{js,jsx,ts,tsx}",
+ "**/*.{test,spec}.{js,jsx,ts,tsx}",
+ ],
+ ...baseConfig,
+ },
+
+ // Allow date-fns and date-fns-tz imports in utils/date.ts
+ {
+ files: ["src/utils/date.ts"],
+ rules: {
+ "no-restricted-imports": "off",
+ },
+ },
+]);
diff --git a/ui-next/index.html b/ui-next/index.html
new file mode 100644
index 0000000000..55c878eff6
--- /dev/null
+++ b/ui-next/index.html
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Conductor UI
+
+
+
+
+
+
+
+
+
diff --git a/ui-next/package.json b/ui-next/package.json
new file mode 100644
index 0000000000..beb0a28aea
--- /dev/null
+++ b/ui-next/package.json
@@ -0,0 +1,174 @@
+{
+ "name": "conductor-ui",
+ "version": "0.0.0",
+ "description": "Open Source Conductor UI - Core components, pages, and plugin infrastructure",
+ "type": "module",
+ "main": "./dist/conductor-ui.js",
+ "module": "./dist/conductor-ui.js",
+ "types": "./dist/index.d.ts",
+ "exports": {
+ ".": {
+ "import": "./dist/conductor-ui.js",
+ "types": "./dist/index.d.ts"
+ },
+ "./styles.css": "./dist/style.css",
+ "./global.css": "./dist/global.css"
+ },
+ "files": [
+ "dist"
+ ],
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "build:lib": "vite build --mode lib && cp src/index.css dist/global.css",
+ "build:all": "vite build && vite build --mode lib",
+ "preview": "vite preview",
+ "typecheck": "tsc --noEmit",
+ "test": "vitest run",
+ "test:watch": "vitest --watch",
+ "test:coverage": "vitest run --coverage",
+ "lint": "eslint 'src/**/*.{js,jsx,ts,tsx}' --quiet",
+ "lint:fix": "eslint 'src/**/*.{js,jsx,ts,tsx}' --fix",
+ "prettier:write": "prettier --write .",
+ "prettier:check": "prettier --check ."
+ },
+ "peerDependencies": {
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0"
+ },
+ "dependencies": {
+ "@auth0/auth0-react": "^1.12.0",
+ "@datasert/cronjs-matcher": "^1.4.0",
+ "@dnd-kit/core": "^6.1.0",
+ "@dnd-kit/sortable": "^8.0.0",
+ "@emotion/react": "^11.11.1",
+ "@emotion/styled": "^11.10.8",
+ "@growthbook/growthbook": "^1.5.1",
+ "@growthbook/growthbook-react": "^1.5.1",
+ "@hookform/resolvers": "^5.2.1",
+ "@jsonforms/core": "^3.6.0",
+ "@jsonforms/material-renderers": "^3.6.0",
+ "@jsonforms/react": "^3.6.0",
+ "@monaco-editor/react": "^4.7.0",
+ "@mui/icons-material": "^7.3.1",
+ "@mui/material": "^7.3.1",
+ "@mui/system": "^7.3.1",
+ "@mui/x-date-pickers": "^6.16",
+ "@okta/okta-auth-js": "^6.9.0",
+ "@okta/okta-react": "^6.6.0",
+ "@okta/okta-signin-widget": "^6.9.0",
+ "@phosphor-icons/react": "^2.1.10",
+ "@use-gesture/react": "^10.2.21",
+ "@xstate/inspect": "^0.8.0",
+ "@xstate/react": "^3.2.1",
+ "ajv": "^8.17.1",
+ "ajv-errors": "^3.0.0",
+ "ajv-formats": "^3.0.1",
+ "autosuggest-highlight": "^3.3.4",
+ "classnames": "^2.3.1",
+ "color": "^4.2.3",
+ "cron-validate": "^1.4.3",
+ "cronstrue": "^2.32.0",
+ "date-fns": "^2.29.3",
+ "date-fns-tz": "^2.0.0",
+ "dom-to-image": "^2.6.0",
+ "fast-deep-equal": "^3.1.3",
+ "fuse.js": "^6.6.2",
+ "highlight.js": "^11.11.1",
+ "jotai": "^2.15.0",
+ "lodash": "^4.17.20",
+ "mock-json-schema": "^1.1.1",
+ "monaco-languages-jq": "^1.0.0",
+ "path-to-regexp": "^8.2.0",
+ "prismjs": "^1.27.0",
+ "prop-types": "^15.7.2",
+ "qs": "^6.14.0",
+ "react-confetti": "^6.4.0",
+ "react-container-query": "^0.12.0",
+ "react-data-table-component": "^7.5.3",
+ "react-datepicker": "^6.1.0",
+ "react-helmet": "^6.1.0",
+ "react-highlight": "^0.15.0",
+ "react-hook-form": "^7.62.0",
+ "react-hotkeys-hook": "^4.4.1",
+ "react-markdown": "10.1.0",
+ "react-number-format": "^5.3.1",
+ "react-player": "^2.16.0",
+ "react-query": "^3.39.2",
+ "react-router": "^7.12.0",
+ "react-router-dom": "^7.9.2",
+ "react-router-use-location-state": "^3.1.2",
+ "react-syntax-highlighter": "^15.5.0",
+ "react-vis-timeline": "^2.0.3",
+ "reaflow": "5.1.2",
+ "recharts": "^2.10.3",
+ "remark-directive": "^3.0.0",
+ "remark-gfm": "^4.0.0",
+ "styled-components": "^5.3.8",
+ "swagger-ui-react": "^5.29.4",
+ "ts-key-enum": "^2.0.12",
+ "unist-util-visit": "^5.0.0",
+ "url-parse": "^1.5.9",
+ "uuid": "^8.3.2",
+ "xstate": "^4.38.3",
+ "yup": "^1.7.0"
+ },
+ "devDependencies": {
+ "@eslint-react/eslint-plugin": "^1.53.0",
+ "@io-orkes/conductor-javascript": "^2.1.4",
+ "@playwright/test": "^1.56.0",
+ "@testing-library/dom": "^10.4.0",
+ "@testing-library/jest-dom": "^6.6.3",
+ "@testing-library/react": "^16.3.0",
+ "@testing-library/user-event": "^14.6.1",
+ "@types/autosuggest-highlight": "^3.2.0",
+ "@types/dom-to-image": "^2.6.7",
+ "@types/lodash": "^4.14.178",
+ "@types/node": "^24.10.1",
+ "@types/qs": "^6.14.0",
+ "@types/react": "^18.2.0",
+ "@types/react-beautiful-dnd": "^13.1.3",
+ "@types/react-datepicker": "^6.0.1",
+ "@types/react-dom": "^18.2.0",
+ "@types/react-helmet": "^6.1.5",
+ "@types/react-highlight": "^0.12.8",
+ "@types/react-syntax-highlighter": "^15.5.13",
+ "@types/swagger-ui-react": "^5.18.0",
+ "@types/url-parse": "^1.4.11",
+ "@types/uuid": "^8.3.4",
+ "@types/yup": "^0.32.0",
+ "@vitejs/plugin-react": "^4.6.0",
+ "@vitest/eslint-plugin": "^1.3.4",
+ "dotenv": "^16.4.5",
+ "eslint": "9.32.0",
+ "eslint-import-resolver-typescript": "^3.6.1",
+ "eslint-plugin-import": "^2.28.1",
+ "eslint-plugin-react-hooks": "^5.2.0",
+ "eslint-plugin-react-refresh": "^0.4.20",
+ "eslint-plugin-unused-imports": "^3.0.0",
+ "jsdom": "^26.1.0",
+ "monaco-editor": "^0.55.1",
+ "prettier": "^3.6.2",
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1",
+ "sass": "^1.50.0",
+ "typescript": "^5.9.2",
+ "typescript-eslint": "^8.35.1",
+ "vite": "^7.1.11",
+ "vite-plugin-dts": "^4.5.0",
+ "vite-plugin-svgr": "^4.3.0",
+ "vite-tsconfig-paths": "^5.1.4",
+ "vitest": "^3.2.4"
+ },
+ "resolutions": {
+ "vis-timeline": "7.3.6",
+ "mini-css-extract-plugin": "2.4.5"
+ },
+ "pnpm": {
+ "overrides": {
+ "vis-timeline": "7.3.6",
+ "mini-css-extract-plugin": "2.4.5"
+ }
+ },
+ "packageManager": "pnpm@10.32.0+sha512.9b2634bb3fed5601c33633f2d92593f506270a3963b8c51d2b2d6a828da615ce4e9deebef9614ccebbc13ac8d3c0f9c9ccceb583c69c8578436fa477dbb20d70"
+}
diff --git a/ui-next/pnpm-lock.yaml b/ui-next/pnpm-lock.yaml
new file mode 100644
index 0000000000..85ca453668
--- /dev/null
+++ b/ui-next/pnpm-lock.yaml
@@ -0,0 +1,11935 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+overrides:
+ vis-timeline: 7.3.6
+ mini-css-extract-plugin: 2.4.5
+
+importers:
+
+ .:
+ dependencies:
+ '@auth0/auth0-react':
+ specifier: ^1.12.0
+ version: 1.12.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@datasert/cronjs-matcher':
+ specifier: ^1.4.0
+ version: 1.4.0
+ '@dnd-kit/core':
+ specifier: ^6.1.0
+ version: 6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@dnd-kit/sortable':
+ specifier: ^8.0.0
+ version: 8.0.0(@dnd-kit/core@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)
+ '@emotion/react':
+ specifier: ^11.11.1
+ version: 11.14.0(@types/react@18.3.28)(react@18.3.1)
+ '@emotion/styled':
+ specifier: ^11.10.8
+ version: 11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1)
+ '@growthbook/growthbook':
+ specifier: ^1.5.1
+ version: 1.6.5
+ '@growthbook/growthbook-react':
+ specifier: ^1.5.1
+ version: 1.6.5(react@18.3.1)
+ '@hookform/resolvers':
+ specifier: ^5.2.1
+ version: 5.2.2(react-hook-form@7.71.2(react@18.3.1))
+ '@jsonforms/core':
+ specifier: ^3.6.0
+ version: 3.7.0
+ '@jsonforms/material-renderers':
+ specifier: ^3.6.0
+ version: 3.7.0(9e4c19b25267976d34663ea61a4c9150)
+ '@jsonforms/react':
+ specifier: ^3.6.0
+ version: 3.7.0(@jsonforms/core@3.7.0)(react@18.3.1)
+ '@monaco-editor/react':
+ specifier: ^4.7.0
+ version: 4.7.0(monaco-editor@0.55.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@mui/icons-material':
+ specifier: ^7.3.1
+ version: 7.3.9(@mui/material@7.3.9(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.28)(react@18.3.1)
+ '@mui/material':
+ specifier: ^7.3.1
+ version: 7.3.9(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@mui/system':
+ specifier: ^7.3.1
+ version: 7.3.9(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1)
+ '@mui/x-date-pickers':
+ specifier: ^6.16
+ version: 6.20.2(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@mui/material@7.3.9(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.9(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(date-fns@2.30.0)(dayjs@1.10.7)(luxon@3.7.2)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@okta/okta-auth-js':
+ specifier: ^6.9.0
+ version: 6.9.0
+ '@okta/okta-react':
+ specifier: ^6.6.0
+ version: 6.10.0(@okta/okta-auth-js@6.9.0)(react-dom@18.3.1(react@18.3.1))(react-router-dom@7.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)
+ '@okta/okta-signin-widget':
+ specifier: ^6.9.0
+ version: 6.9.0
+ '@phosphor-icons/react':
+ specifier: ^2.1.10
+ version: 2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@use-gesture/react':
+ specifier: ^10.2.21
+ version: 10.3.1(react@18.3.1)
+ '@xstate/inspect':
+ specifier: ^0.8.0
+ version: 0.8.0(ws@8.19.0)(xstate@4.38.3)
+ '@xstate/react':
+ specifier: ^3.2.1
+ version: 3.2.2(@types/react@18.3.28)(react@18.3.1)(xstate@4.38.3)
+ ajv:
+ specifier: ^8.17.1
+ version: 8.18.0
+ ajv-errors:
+ specifier: ^3.0.0
+ version: 3.0.0(ajv@8.18.0)
+ ajv-formats:
+ specifier: ^3.0.1
+ version: 3.0.1(ajv@8.18.0)
+ autosuggest-highlight:
+ specifier: ^3.3.4
+ version: 3.3.4
+ classnames:
+ specifier: ^2.3.1
+ version: 2.5.1
+ color:
+ specifier: ^4.2.3
+ version: 4.2.3
+ cron-validate:
+ specifier: ^1.4.3
+ version: 1.5.3
+ cronstrue:
+ specifier: ^2.32.0
+ version: 2.61.0
+ date-fns:
+ specifier: ^2.29.3
+ version: 2.30.0
+ date-fns-tz:
+ specifier: ^2.0.0
+ version: 2.0.1(date-fns@2.30.0)
+ dom-to-image:
+ specifier: ^2.6.0
+ version: 2.6.0
+ fast-deep-equal:
+ specifier: ^3.1.3
+ version: 3.1.3
+ fuse.js:
+ specifier: ^6.6.2
+ version: 6.6.2
+ highlight.js:
+ specifier: ^11.11.1
+ version: 11.11.1
+ jotai:
+ specifier: ^2.15.0
+ version: 2.18.1(@babel/core@7.29.0)(@babel/template@7.28.6)(@types/react@18.3.28)(react@18.3.1)
+ lodash:
+ specifier: ^4.17.20
+ version: 4.17.23
+ mock-json-schema:
+ specifier: ^1.1.1
+ version: 1.1.2
+ monaco-languages-jq:
+ specifier: ^1.0.0
+ version: 1.0.0
+ path-to-regexp:
+ specifier: ^8.2.0
+ version: 8.3.0
+ prismjs:
+ specifier: ^1.27.0
+ version: 1.30.0
+ prop-types:
+ specifier: ^15.7.2
+ version: 15.8.1
+ qs:
+ specifier: ^6.14.0
+ version: 6.15.0
+ react-confetti:
+ specifier: ^6.4.0
+ version: 6.4.0(react@18.3.1)
+ react-container-query:
+ specifier: ^0.12.0
+ version: 0.12.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react-data-table-component:
+ specifier: ^7.5.3
+ version: 7.7.0(react@18.3.1)(styled-components@5.3.11(@babel/core@7.29.0)(react-dom@18.3.1(react@18.3.1))(react-is@19.2.4)(react@18.3.1))
+ react-datepicker:
+ specifier: ^6.1.0
+ version: 6.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react-helmet:
+ specifier: ^6.1.0
+ version: 6.1.0(react@18.3.1)
+ react-highlight:
+ specifier: ^0.15.0
+ version: 0.15.0
+ react-hook-form:
+ specifier: ^7.62.0
+ version: 7.71.2(react@18.3.1)
+ react-hotkeys-hook:
+ specifier: ^4.4.1
+ version: 4.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react-markdown:
+ specifier: 10.1.0
+ version: 10.1.0(@types/react@18.3.28)(react@18.3.1)
+ react-number-format:
+ specifier: ^5.3.1
+ version: 5.4.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react-player:
+ specifier: ^2.16.0
+ version: 2.16.1(react@18.3.1)
+ react-query:
+ specifier: ^3.39.2
+ version: 3.39.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react-router:
+ specifier: ^7.12.0
+ version: 7.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react-router-dom:
+ specifier: ^7.9.2
+ version: 7.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react-router-use-location-state:
+ specifier: ^3.1.2
+ version: 3.1.2(@types/react@18.3.28)(next@16.1.6(@babel/core@7.29.0)(@playwright/test@1.58.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.97.3))(react-router@7.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)
+ react-syntax-highlighter:
+ specifier: ^15.5.0
+ version: 15.6.6(react@18.3.1)
+ react-vis-timeline:
+ specifier: ^2.0.3
+ version: 2.0.3(lodash@4.17.23)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ reaflow:
+ specifier: 5.1.2
+ version: 5.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ recharts:
+ specifier: ^2.10.3
+ version: 2.15.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ remark-directive:
+ specifier: ^3.0.0
+ version: 3.0.1
+ remark-gfm:
+ specifier: ^4.0.0
+ version: 4.0.1
+ styled-components:
+ specifier: ^5.3.8
+ version: 5.3.11(@babel/core@7.29.0)(react-dom@18.3.1(react@18.3.1))(react-is@19.2.4)(react@18.3.1)
+ swagger-ui-react:
+ specifier: ^5.29.4
+ version: 5.32.0(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ ts-key-enum:
+ specifier: ^2.0.12
+ version: 2.0.13
+ unist-util-visit:
+ specifier: ^5.0.0
+ version: 5.1.0
+ url-parse:
+ specifier: ^1.5.9
+ version: 1.5.10
+ uuid:
+ specifier: ^8.3.2
+ version: 8.3.2
+ xstate:
+ specifier: ^4.38.3
+ version: 4.38.3
+ yup:
+ specifier: ^1.7.0
+ version: 1.7.1
+ devDependencies:
+ '@eslint-react/eslint-plugin':
+ specifier: ^1.53.0
+ version: 1.53.1(eslint@9.32.0)(ts-api-utils@2.4.0(typescript@5.9.3))(typescript@5.9.3)
+ '@io-orkes/conductor-javascript':
+ specifier: ^2.1.4
+ version: 2.4.1
+ '@playwright/test':
+ specifier: ^1.56.0
+ version: 1.58.2
+ '@testing-library/dom':
+ specifier: ^10.4.0
+ version: 10.4.1
+ '@testing-library/jest-dom':
+ specifier: ^6.6.3
+ version: 6.9.1
+ '@testing-library/react':
+ specifier: ^16.3.0
+ version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@testing-library/user-event':
+ specifier: ^14.6.1
+ version: 14.6.1(@testing-library/dom@10.4.1)
+ '@types/autosuggest-highlight':
+ specifier: ^3.2.0
+ version: 3.2.3
+ '@types/dom-to-image':
+ specifier: ^2.6.7
+ version: 2.6.7
+ '@types/lodash':
+ specifier: ^4.14.178
+ version: 4.17.24
+ '@types/node':
+ specifier: ^24.10.1
+ version: 24.12.0
+ '@types/qs':
+ specifier: ^6.14.0
+ version: 6.15.0
+ '@types/react':
+ specifier: ^18.2.0
+ version: 18.3.28
+ '@types/react-beautiful-dnd':
+ specifier: ^13.1.3
+ version: 13.1.8
+ '@types/react-datepicker':
+ specifier: ^6.0.1
+ version: 6.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@types/react-dom':
+ specifier: ^18.2.0
+ version: 18.3.7(@types/react@18.3.28)
+ '@types/react-helmet':
+ specifier: ^6.1.5
+ version: 6.1.11
+ '@types/react-highlight':
+ specifier: ^0.12.8
+ version: 0.12.8
+ '@types/react-syntax-highlighter':
+ specifier: ^15.5.13
+ version: 15.5.13
+ '@types/swagger-ui-react':
+ specifier: ^5.18.0
+ version: 5.18.0
+ '@types/url-parse':
+ specifier: ^1.4.11
+ version: 1.4.11
+ '@types/uuid':
+ specifier: ^8.3.4
+ version: 8.3.4
+ '@types/yup':
+ specifier: ^0.32.0
+ version: 0.32.0
+ '@vitejs/plugin-react':
+ specifier: ^4.6.0
+ version: 4.7.0(vite@7.3.1(@types/node@24.12.0)(sass@1.97.3))
+ '@vitest/eslint-plugin':
+ specifier: ^1.3.4
+ version: 1.6.10(eslint@9.32.0)(typescript@5.9.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jsdom@26.1.0)(sass@1.97.3))
+ dotenv:
+ specifier: ^16.4.5
+ version: 16.6.1
+ eslint:
+ specifier: 9.32.0
+ version: 9.32.0
+ eslint-import-resolver-typescript:
+ specifier: ^3.6.1
+ version: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.32.0)
+ eslint-plugin-import:
+ specifier: ^2.28.1
+ version: 2.32.0(@typescript-eslint/parser@8.57.0(eslint@9.32.0)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0)
+ eslint-plugin-react-hooks:
+ specifier: ^5.2.0
+ version: 5.2.0(eslint@9.32.0)
+ eslint-plugin-react-refresh:
+ specifier: ^0.4.20
+ version: 0.4.26(eslint@9.32.0)
+ eslint-plugin-unused-imports:
+ specifier: ^3.0.0
+ version: 3.2.0(eslint@9.32.0)
+ jsdom:
+ specifier: ^26.1.0
+ version: 26.1.0
+ monaco-editor:
+ specifier: ^0.55.1
+ version: 0.55.1
+ prettier:
+ specifier: ^3.6.2
+ version: 3.8.1
+ react:
+ specifier: ^18.3.1
+ version: 18.3.1
+ react-dom:
+ specifier: ^18.3.1
+ version: 18.3.1(react@18.3.1)
+ sass:
+ specifier: ^1.50.0
+ version: 1.97.3
+ typescript:
+ specifier: ^5.9.2
+ version: 5.9.3
+ typescript-eslint:
+ specifier: ^8.35.1
+ version: 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ vite:
+ specifier: ^7.1.11
+ version: 7.3.1(@types/node@24.12.0)(sass@1.97.3)
+ vite-plugin-dts:
+ specifier: ^4.5.0
+ version: 4.5.4(@types/node@24.12.0)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.12.0)(sass@1.97.3))
+ vite-plugin-svgr:
+ specifier: ^4.3.0
+ version: 4.5.0(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.12.0)(sass@1.97.3))
+ vite-tsconfig-paths:
+ specifier: ^5.1.4
+ version: 5.1.4(typescript@5.9.3)(vite@7.3.1(@types/node@24.12.0)(sass@1.97.3))
+ vitest:
+ specifier: ^3.2.4
+ version: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jsdom@26.1.0)(sass@1.97.3)
+
+packages:
+
+ '@adobe/css-tools@4.4.4':
+ resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==}
+
+ '@asamuzakjp/css-color@3.2.0':
+ resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==}
+
+ '@auth0/auth0-react@1.12.1':
+ resolution: {integrity: sha512-8+ecK/4rE0AGsxLW2IDcr1oPbT55tuE6cQEzEIOkQjB6QGQxxWMzQy0D4nMKw3JUAc7nYcFVOABNFNbc471n9Q==}
+ peerDependencies:
+ react: ^16.11.0 || ^17 || ^18
+ react-dom: ^16.11.0 || ^17 || ^18
+
+ '@auth0/auth0-spa-js@1.22.6':
+ resolution: {integrity: sha512-iL3O0vWanfKFVgy1J2ZHDPlAUK6EVHWEHWS6mUXwHEuPiK39tjlQtyUKQIJI1F5YsZB75ijGgRWMTawSDXlwCA==}
+
+ '@babel/code-frame@7.29.0':
+ resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/compat-data@7.29.0':
+ resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.29.0':
+ resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/generator@7.29.1':
+ resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-annotate-as-pure@7.27.3':
+ resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-compilation-targets@7.28.6':
+ resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-globals@7.28.0':
+ resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-imports@7.28.6':
+ resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-transforms@7.28.6':
+ resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-plugin-utils@7.28.6':
+ resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.27.1':
+ resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.28.5':
+ resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-option@7.27.1':
+ resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.28.6':
+ resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.29.0':
+ resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/plugin-syntax-jsx@7.28.6':
+ resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx-self@7.27.1':
+ resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx-source@7.27.1':
+ resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/runtime-corejs3@7.29.0':
+ resolution: {integrity: sha512-TgUkdp71C9pIbBcHudc+gXZnihEDOjUAmXO1VO4HHGES7QLZcShR0stfKIxLSNIYx2fqhmJChOjm/wkF8wv4gA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/runtime@7.28.6':
+ resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/template@7.28.6':
+ resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.29.0':
+ resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.29.0':
+ resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==}
+ engines: {node: '>=6.9.0'}
+
+ '@csstools/color-helpers@5.1.0':
+ resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==}
+ engines: {node: '>=18'}
+
+ '@csstools/css-calc@2.1.4':
+ resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@csstools/css-parser-algorithms': ^3.0.5
+ '@csstools/css-tokenizer': ^3.0.4
+
+ '@csstools/css-color-parser@3.1.0':
+ resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@csstools/css-parser-algorithms': ^3.0.5
+ '@csstools/css-tokenizer': ^3.0.4
+
+ '@csstools/css-parser-algorithms@3.0.5':
+ resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@csstools/css-tokenizer': ^3.0.4
+
+ '@csstools/css-tokenizer@3.0.4':
+ resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==}
+ engines: {node: '>=18'}
+
+ '@datasert/cronjs-matcher@1.4.0':
+ resolution: {integrity: sha512-5wAAKYfClZQDWjOeGReEnGLlBKds5K0CitnTv17sH32X4PSuck1dysX71zzCgrm0JCSpobDNg4b292ewhoy6ww==}
+
+ '@datasert/cronjs-parser@1.4.0':
+ resolution: {integrity: sha512-zHGlrWanS4Zjgf0aMi/sp/HTSa2xWDEtXW9xshhlGf/jPx3zTIqfX14PZnoFF7XVOwzC49Zy0SFWG90rlRY36Q==}
+
+ '@date-io/core@3.2.0':
+ resolution: {integrity: sha512-hqwXvY8/YBsT9RwQITG868ZNb1MVFFkF7W1Ecv4P472j/ZWa7EFcgSmxy8PUElNVZfvhdvfv+a8j6NWJqOX5mA==}
+
+ '@date-io/dayjs@3.2.0':
+ resolution: {integrity: sha512-+3LV+3N+cpQbEtmrFo8odg07k02AFY7diHgbi2EKYYANOOCPkDYUjDr2ENiHuYNidTs3tZwzDKckZoVNN4NXxg==}
+ peerDependencies:
+ dayjs: ^1.8.17
+ peerDependenciesMeta:
+ dayjs:
+ optional: true
+
+ '@dnd-kit/accessibility@3.1.1':
+ resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==}
+ peerDependencies:
+ react: '>=16.8.0'
+
+ '@dnd-kit/core@6.3.1':
+ resolution: {integrity: sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ '@dnd-kit/sortable@8.0.0':
+ resolution: {integrity: sha512-U3jk5ebVXe1Lr7c2wU7SBZjcWdQP+j7peHJfCspnA81enlu88Mgd7CC8Q+pub9ubP7eKVETzJW+IBAhsqbSu/g==}
+ peerDependencies:
+ '@dnd-kit/core': ^6.1.0
+ react: '>=16.8.0'
+
+ '@dnd-kit/utilities@3.2.2':
+ resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==}
+ peerDependencies:
+ react: '>=16.8.0'
+
+ '@egjs/hammerjs@2.0.17':
+ resolution: {integrity: sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==}
+ engines: {node: '>=0.8.0'}
+
+ '@emnapi/core@1.8.1':
+ resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==}
+
+ '@emnapi/runtime@1.8.1':
+ resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==}
+
+ '@emnapi/wasi-threads@1.1.0':
+ resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==}
+
+ '@emotion/babel-plugin@11.13.5':
+ resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==}
+
+ '@emotion/cache@11.14.0':
+ resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==}
+
+ '@emotion/hash@0.9.2':
+ resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==}
+
+ '@emotion/is-prop-valid@0.8.8':
+ resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==}
+
+ '@emotion/is-prop-valid@1.4.0':
+ resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==}
+
+ '@emotion/memoize@0.7.4':
+ resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==}
+
+ '@emotion/memoize@0.9.0':
+ resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==}
+
+ '@emotion/react@11.14.0':
+ resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: '>=16.8.0'
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@emotion/serialize@1.3.3':
+ resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==}
+
+ '@emotion/sheet@1.4.0':
+ resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==}
+
+ '@emotion/styled@11.14.1':
+ resolution: {integrity: sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==}
+ peerDependencies:
+ '@emotion/react': ^11.0.0-rc.0
+ '@types/react': '*'
+ react: '>=16.8.0'
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@emotion/stylis@0.8.5':
+ resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==}
+
+ '@emotion/unitless@0.10.0':
+ resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==}
+
+ '@emotion/unitless@0.7.5':
+ resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==}
+
+ '@emotion/use-insertion-effect-with-fallbacks@1.2.0':
+ resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==}
+ peerDependencies:
+ react: '>=16.8.0'
+
+ '@emotion/utils@1.4.2':
+ resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==}
+
+ '@emotion/weak-memoize@0.4.0':
+ resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==}
+
+ '@esbuild/aix-ppc64@0.27.3':
+ resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.27.3':
+ resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.27.3':
+ resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.27.3':
+ resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.27.3':
+ resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.27.3':
+ resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.27.3':
+ resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.27.3':
+ resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.27.3':
+ resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.27.3':
+ resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.27.3':
+ resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.27.3':
+ resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.27.3':
+ resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.27.3':
+ resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.27.3':
+ resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.27.3':
+ resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.27.3':
+ resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-arm64@0.27.3':
+ resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.27.3':
+ resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-arm64@0.27.3':
+ resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.27.3':
+ resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openharmony-arm64@0.27.3':
+ resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@esbuild/sunos-x64@0.27.3':
+ resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.27.3':
+ resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.27.3':
+ resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.27.3':
+ resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@eslint-community/eslint-utils@4.9.1':
+ resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
+ '@eslint-community/regexpp@4.12.2':
+ resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+ '@eslint-react/ast@1.53.1':
+ resolution: {integrity: sha512-qvUC99ewtriJp9quVEOvZ6+RHcsMLfVQ0OhZ4/LupZUDhjW7GiX1dxJsFaxHdJ9rLNLhQyLSPmbAToeqUrSruQ==}
+ engines: {node: '>=18.18.0'}
+
+ '@eslint-react/core@1.53.1':
+ resolution: {integrity: sha512-8prroos5/Uvvh8Tjl1HHCpq4HWD3hV9tYkm7uXgKA6kqj0jHlgRcQzuO6ZPP7feBcK3uOeug7xrq03BuG8QKCA==}
+ engines: {node: '>=18.18.0'}
+
+ '@eslint-react/eff@1.53.1':
+ resolution: {integrity: sha512-uq20lPRAmsWRjIZm+mAV/2kZsU2nDqn5IJslxGWe3Vfdw23hoyhEw3S1KKlxbftwbTvsZjKvVP0iw3bZo/NUpg==}
+ engines: {node: '>=18.18.0'}
+
+ '@eslint-react/eslint-plugin@1.53.1':
+ resolution: {integrity: sha512-JZ2ciXNCC9CtBBAqYtwWH+Jy/7ZzLw+whei8atP4Fxsbh+Scs30MfEwBzuiEbNw6uF9eZFfPidchpr5RaEhqxg==}
+ engines: {node: '>=18.18.0'}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: ^4.9.5 || ^5.3.3
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@eslint-react/kit@1.53.1':
+ resolution: {integrity: sha512-zOi2le9V4rMrJvQV4OeedGvMGvDT46OyFPOwXKs7m0tQu5vXVJ8qwIPaVQT1n/WIuvOg49OfmAVaHpGxK++xLQ==}
+ engines: {node: '>=18.18.0'}
+
+ '@eslint-react/shared@1.53.1':
+ resolution: {integrity: sha512-gomJQmFqQgQVI3Ra4vTMG/s6a4bx3JqeNiTBjxBJt4C9iGaBj458GkP4LJHX7TM6xUzX+fMSKOPX7eV3C/+UCw==}
+ engines: {node: '>=18.18.0'}
+
+ '@eslint-react/var@1.53.1':
+ resolution: {integrity: sha512-yzwopvPntcHU7mmDvWzRo1fb8QhjD8eDRRohD11rTV1u7nWO4QbJi0pOyugQakvte1/W11Y0Vr8Of0Ojk/A6zg==}
+ engines: {node: '>=18.18.0'}
+
+ '@eslint/config-array@0.21.2':
+ resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/config-helpers@0.3.1':
+ resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/core@0.15.2':
+ resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/eslintrc@3.3.5':
+ resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/js@9.32.0':
+ resolution: {integrity: sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/object-schema@2.1.7':
+ resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/plugin-kit@0.3.5':
+ resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@floating-ui/core@1.7.5':
+ resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==}
+
+ '@floating-ui/dom@1.7.6':
+ resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==}
+
+ '@floating-ui/react-dom@2.1.8':
+ resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ '@floating-ui/react@0.26.28':
+ resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ '@floating-ui/utils@0.2.11':
+ resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==}
+
+ '@growthbook/growthbook-react@1.6.5':
+ resolution: {integrity: sha512-afi/RUbwazVNKv2acn6wDQz4BJNRAEpwIuHfggQup2/aE5PLAxy3+95gjjRMgCcPR0Pf3sFmhYGvOmxLD0ZRbQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ react: ^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0
+
+ '@growthbook/growthbook@1.6.5':
+ resolution: {integrity: sha512-mUaMsgeUTpRIUOTn33EUXHRK6j7pxBjwqH4WpQyq+pukjd1AIzWlEa6w7i6bInJUcweGgP2beXZmaP6b6UPn7A==}
+ engines: {node: '>=10'}
+
+ '@hookform/resolvers@5.2.2':
+ resolution: {integrity: sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA==}
+ peerDependencies:
+ react-hook-form: ^7.55.0
+
+ '@humanfs/core@0.19.1':
+ resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/node@0.16.7':
+ resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanwhocodes/module-importer@1.0.1':
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+
+ '@humanwhocodes/retry@0.4.3':
+ resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
+ engines: {node: '>=18.18'}
+
+ '@img/colour@1.1.0':
+ resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==}
+ engines: {node: '>=18'}
+
+ '@img/sharp-darwin-arm64@0.34.5':
+ resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-darwin-x64@0.34.5':
+ resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-arm64@1.2.4':
+ resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-x64@1.2.4':
+ resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-libvips-linux-arm64@1.2.4':
+ resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linux-arm@1.2.4':
+ resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linux-ppc64@1.2.4':
+ resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linux-riscv64@1.2.4':
+ resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linux-s390x@1.2.4':
+ resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linux-x64@1.2.4':
+ resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
+ resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@img/sharp-libvips-linuxmusl-x64@1.2.4':
+ resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@img/sharp-linux-arm64@0.34.5':
+ resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-arm@0.34.5':
+ resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-ppc64@0.34.5':
+ resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-riscv64@0.34.5':
+ resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-s390x@0.34.5':
+ resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-x64@0.34.5':
+ resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linuxmusl-arm64@0.34.5':
+ resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@img/sharp-linuxmusl-x64@0.34.5':
+ resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@img/sharp-wasm32@0.34.5':
+ resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [wasm32]
+
+ '@img/sharp-win32-arm64@0.34.5':
+ resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [win32]
+
+ '@img/sharp-win32-ia32@0.34.5':
+ resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ia32]
+ os: [win32]
+
+ '@img/sharp-win32-x64@0.34.5':
+ resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [win32]
+
+ '@io-orkes/conductor-javascript@2.4.1':
+ resolution: {integrity: sha512-2ANrH2jhwPdF5kGq9KPCBd45XYMkRp1lR/l7X0xRO5g4S+PmigPOeK7Lpy7INIt0RnvadjA3VH+tSC7goe0YVA==}
+ engines: {node: '>=18'}
+
+ '@jridgewell/gen-mapping@0.3.13':
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+
+ '@jridgewell/remapping@2.3.5':
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
+
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/sourcemap-codec@1.5.5':
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+
+ '@jsonforms/core@3.7.0':
+ resolution: {integrity: sha512-CE9viWtwi9QWLqlWLeOul1/R1GRAyOA9y6OoUpsCc0FhyR+g5p29F3k0fUExHWxL0Sf4KHcXYkfhtqfRBPS8ww==}
+
+ '@jsonforms/material-renderers@3.7.0':
+ resolution: {integrity: sha512-WO9D3zigJ/x/gCckEGxvfQgrdLuy6X6g76hHMlo3KCsusEvabLQHvYz3EJmOOBsuEu8JYXgZetTKjZ44WaBXww==}
+ peerDependencies:
+ '@emotion/react': ^11.5.0
+ '@emotion/styled': ^11.3.0
+ '@jsonforms/core': 3.7.0
+ '@jsonforms/react': 3.7.0
+ '@mui/icons-material': ^7.0.0
+ '@mui/material': ^7.0.0
+ '@mui/x-date-pickers': ^8.0.0
+ react: ^16.12.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ '@jsonforms/react@3.7.0':
+ resolution: {integrity: sha512-HkY7qAx8vW97wPEgZ7GxCB3iiXG1c95GuObxtcDHGPBJWMwnxWBnVYJmv5h7nthrInKsQKHZL5OusnC/sj/1GQ==}
+ peerDependencies:
+ '@jsonforms/core': 3.7.0
+ react: ^16.12.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ '@ljharb/resumer@0.0.1':
+ resolution: {integrity: sha512-skQiAOrCfO7vRTq53cxznMpks7wS1va95UCidALlOVWqvBAzwPVErwizDwoMqNVMEn1mDq0utxZd02eIrvF1lw==}
+ engines: {node: '>= 0.4'}
+
+ '@ljharb/through@2.3.14':
+ resolution: {integrity: sha512-ajBvlKpWucBB17FuQYUShqpqy8GRgYEpJW0vWJbUu1CV9lWyrDCapy0lScU8T8Z6qn49sSwJB3+M+evYIdGg+A==}
+ engines: {node: '>= 0.4'}
+
+ '@microsoft/api-extractor-model@7.33.4':
+ resolution: {integrity: sha512-u1LTaNTikZAQ9uK6KG1Ms7nvNedsnODnspq/gH2dcyETWvH4hVNGNDvRAEutH66kAmxA4/necElqGNs1FggC8w==}
+
+ '@microsoft/api-extractor@7.57.7':
+ resolution: {integrity: sha512-kmnmVs32MFWbV5X6BInC1/TfCs7y1ugwxv1xHsAIj/DyUfoe7vtO0alRUgbQa57+yRGHBBjlNcEk33SCAt5/dA==}
+ hasBin: true
+
+ '@microsoft/tsdoc-config@0.18.1':
+ resolution: {integrity: sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==}
+
+ '@microsoft/tsdoc@0.16.0':
+ resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==}
+
+ '@monaco-editor/loader@1.7.0':
+ resolution: {integrity: sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA==}
+
+ '@monaco-editor/react@4.7.0':
+ resolution: {integrity: sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==}
+ peerDependencies:
+ monaco-editor: '>= 0.25.0 < 1'
+ 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
+
+ '@motionone/animation@10.18.0':
+ resolution: {integrity: sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==}
+
+ '@motionone/dom@10.18.0':
+ resolution: {integrity: sha512-bKLP7E0eyO4B2UaHBBN55tnppwRnaE3KFfh3Ps9HhnAkar3Cb69kUCJY9as8LrccVYKgHA+JY5dOQqJLOPhF5A==}
+
+ '@motionone/easing@10.18.0':
+ resolution: {integrity: sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==}
+
+ '@motionone/generators@10.18.0':
+ resolution: {integrity: sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==}
+
+ '@motionone/types@10.17.1':
+ resolution: {integrity: sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==}
+
+ '@motionone/utils@10.18.0':
+ resolution: {integrity: sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==}
+
+ '@mui/base@5.0.0-beta.70':
+ resolution: {integrity: sha512-Tb/BIhJzb0pa5zv/wu7OdokY9ZKEDqcu1BDFnohyvGCoHuSXbEr90rPq1qeNW3XvTBIbNWHEF7gqge+xpUo6tQ==}
+ engines: {node: '>=14.0.0'}
+ deprecated: This package has been replaced by @base-ui/react
+ peerDependencies:
+ '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
+ react: ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@mui/core-downloads-tracker@7.3.9':
+ resolution: {integrity: sha512-MOkOCTfbMJwLshlBCKJ59V2F/uaLYfmKnN76kksj6jlGUVdI25A9Hzs08m+zjBRdLv+sK7Rqdsefe8X7h/6PCw==}
+
+ '@mui/icons-material@7.3.9':
+ resolution: {integrity: sha512-BT+zPJXss8Hg/oEMRmHl17Q97bPACG4ufFSfGEdhiE96jOyR5Dz1ty7ZWt1fVGR0y1p+sSgEwQT/MNZQmoWDCw==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ '@mui/material': ^7.3.9
+ '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
+ react: ^17.0.0 || ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@mui/material@7.3.9':
+ resolution: {integrity: sha512-I8yO3t4T0y7bvDiR1qhIN6iBWZOTBfVOnmLlM7K6h3dx5YX2a7rnkuXzc2UkZaqhxY9NgTnEbdPlokR1RxCNRQ==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ '@emotion/react': ^11.5.0
+ '@emotion/styled': ^11.3.0
+ '@mui/material-pigment-css': ^7.3.9
+ '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
+ react: ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@emotion/react':
+ optional: true
+ '@emotion/styled':
+ optional: true
+ '@mui/material-pigment-css':
+ optional: true
+ '@types/react':
+ optional: true
+
+ '@mui/private-theming@7.3.9':
+ resolution: {integrity: sha512-ErIyRQvsiQEq7Yvcvfw9UDHngaqjMy9P3JDPnRAaKG5qhpl2C4tX/W1S4zJvpu+feihmZJStjIyvnv6KDbIrlw==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
+ react: ^17.0.0 || ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@mui/styled-engine@7.3.9':
+ resolution: {integrity: sha512-JqujWt5bX4okjUPGpVof/7pvgClqh7HvIbsIBIOOlCh2u3wG/Bwp4+E1bc1dXSwkrkp9WUAoNdI5HEC+5HKvMw==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ '@emotion/react': ^11.4.1
+ '@emotion/styled': ^11.3.0
+ react: ^17.0.0 || ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@emotion/react':
+ optional: true
+ '@emotion/styled':
+ optional: true
+
+ '@mui/system@7.3.9':
+ resolution: {integrity: sha512-aL1q9am8XpRrSabv9qWf5RHhJICJql34wnrc1nz0MuOglPRYF/liN+c8VqZdTvUn9qg+ZjRVbKf4sJVFfIDtmg==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ '@emotion/react': ^11.5.0
+ '@emotion/styled': ^11.3.0
+ '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
+ react: ^17.0.0 || ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@emotion/react':
+ optional: true
+ '@emotion/styled':
+ optional: true
+ '@types/react':
+ optional: true
+
+ '@mui/types@7.2.24':
+ resolution: {integrity: sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==}
+ peerDependencies:
+ '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@mui/types@7.4.12':
+ resolution: {integrity: sha512-iKNAF2u9PzSIj40CjvKJWxFXJo122jXVdrmdh0hMYd+FR+NuJMkr/L88XwWLCRiJ5P1j+uyac25+Kp6YC4hu6w==}
+ peerDependencies:
+ '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@mui/utils@5.17.1':
+ resolution: {integrity: sha512-jEZ8FTqInt2WzxDV8bhImWBqeQRD99c/id/fq83H0ER9tFl+sfZlaAoCdznGvbSQQ9ividMxqSV2c7cC1vBcQg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
+ react: ^17.0.0 || ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@mui/utils@6.4.9':
+ resolution: {integrity: sha512-Y12Q9hbK9g+ZY0T3Rxrx9m2m10gaphDuUMgWxyV5kNJevVxXYCLclYUCC9vXaIk1/NdNDTcW2Yfr2OGvNFNmHg==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
+ react: ^17.0.0 || ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@mui/utils@7.3.9':
+ resolution: {integrity: sha512-U6SdZaGbfb65fqTsH3V5oJdFj9uYwyLE2WVuNvmbggTSDBb8QHrFsqY8BN3taK9t3yJ8/BPHD/kNvLNyjwM7Yw==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0
+ react: ^17.0.0 || ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@mui/x-date-pickers@6.20.2':
+ resolution: {integrity: sha512-x1jLg8R+WhvkmUETRfX2wC+xJreMii78EXKLl6r3G+ggcAZlPyt0myID1Amf6hvJb9CtR7CgUo8BwR+1Vx9Ggw==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ '@emotion/react': ^11.9.0
+ '@emotion/styled': ^11.8.1
+ '@mui/material': ^5.8.6
+ '@mui/system': ^5.8.0
+ date-fns: ^2.25.0 || ^3.2.0
+ date-fns-jalali: ^2.13.0-0
+ dayjs: ^1.10.7
+ luxon: ^3.0.2
+ moment: ^2.29.4
+ moment-hijri: ^2.1.2
+ moment-jalaali: ^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0
+ react: ^17.0.0 || ^18.0.0
+ react-dom: ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ '@emotion/react':
+ optional: true
+ '@emotion/styled':
+ optional: true
+ date-fns:
+ optional: true
+ date-fns-jalali:
+ optional: true
+ dayjs:
+ optional: true
+ luxon:
+ optional: true
+ moment:
+ optional: true
+ moment-hijri:
+ optional: true
+ moment-jalaali:
+ optional: true
+
+ '@napi-rs/wasm-runtime@0.2.12':
+ resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==}
+
+ '@next/env@16.1.6':
+ resolution: {integrity: sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==}
+
+ '@next/swc-darwin-arm64@16.1.6':
+ resolution: {integrity: sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@next/swc-darwin-x64@16.1.6':
+ resolution: {integrity: sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@next/swc-linux-arm64-gnu@16.1.6':
+ resolution: {integrity: sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@next/swc-linux-arm64-musl@16.1.6':
+ resolution: {integrity: sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@next/swc-linux-x64-gnu@16.1.6':
+ resolution: {integrity: sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@next/swc-linux-x64-musl@16.1.6':
+ resolution: {integrity: sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@next/swc-win32-arm64-msvc@16.1.6':
+ resolution: {integrity: sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@next/swc-win32-x64-msvc@16.1.6':
+ resolution: {integrity: sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [win32]
+
+ '@nolyfill/is-core-module@1.0.39':
+ resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==}
+ engines: {node: '>=12.4.0'}
+
+ '@okta/okta-auth-js@6.9.0':
+ resolution: {integrity: sha512-IAh9mh2iGT4bsGeRMSSGBYoeEJ4f3ABTO+Jf9mYr0MbKgyU+X+7RwYAo/z8JHJ9AW0ynmjERTMOgDJ7/H/N+Dw==}
+ engines: {node: '>=11.0', yarn: ^1.7.0}
+
+ '@okta/okta-react@6.10.0':
+ resolution: {integrity: sha512-0zgWeThYhH61GL0AfNHgvpBDzQNZcMDG/XOk4nkRdxckFKSg35vPgtKoF6IB6Khics8KzwiaAQCuXStcnLhbRQ==}
+ engines: {node: '>=10.3', yarn: ^1.7.0}
+ peerDependencies:
+ '@okta/okta-auth-js': ^5.3.1 || ^6.0.0 || ^7.0.0
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+ react-router-dom: '>=5.1.0'
+
+ '@okta/okta-signin-widget@6.9.0':
+ resolution: {integrity: sha512-UElSmcXRpRmYJqv2mz8IAnEjOK4Nt9fniw89bcmj3BK4q506oVgOheE7dxq5wnHLMYsJuuiDgc3gUrcFsrw+rw==}
+ engines: {node: '>=12.22', yarn: ^1.7.0}
+
+ '@parcel/watcher-android-arm64@2.5.6':
+ resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [android]
+
+ '@parcel/watcher-darwin-arm64@2.5.6':
+ resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@parcel/watcher-darwin-x64@2.5.6':
+ resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@parcel/watcher-freebsd-x64@2.5.6':
+ resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@parcel/watcher-linux-arm-glibc@2.5.6':
+ resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
+ '@parcel/watcher-linux-arm-musl@2.5.6':
+ resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm]
+ os: [linux]
+ libc: [musl]
+
+ '@parcel/watcher-linux-arm64-glibc@2.5.6':
+ resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@parcel/watcher-linux-arm64-musl@2.5.6':
+ resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@parcel/watcher-linux-x64-glibc@2.5.6':
+ resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@parcel/watcher-linux-x64-musl@2.5.6':
+ resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@parcel/watcher-win32-arm64@2.5.6':
+ resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@parcel/watcher-win32-ia32@2.5.6':
+ resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@parcel/watcher-win32-x64@2.5.6':
+ resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==}
+ engines: {node: '>= 10.0.0'}
+ cpu: [x64]
+ os: [win32]
+
+ '@parcel/watcher@2.5.6':
+ resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==}
+ engines: {node: '>= 10.0.0'}
+
+ '@peculiar/asn1-schema@2.6.0':
+ resolution: {integrity: sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==}
+
+ '@peculiar/json-schema@1.1.12':
+ resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==}
+ engines: {node: '>=8.0.0'}
+
+ '@peculiar/webcrypto@1.5.0':
+ resolution: {integrity: sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==}
+ engines: {node: '>=10.12.0'}
+
+ '@phosphor-icons/react@2.1.10':
+ resolution: {integrity: sha512-vt8Tvq8GLjheAZZYa+YG/pW7HDbov8El/MANW8pOAz4eGxrwhnbfrQZq0Cp4q8zBEu8NIhHdnr+r8thnfRSNYA==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ react: '>= 16.8'
+ react-dom: '>= 16.8'
+
+ '@playwright/test@1.58.2':
+ resolution: {integrity: sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ '@popperjs/core@2.11.8':
+ resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==}
+
+ '@rolldown/pluginutils@1.0.0-beta.27':
+ resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==}
+
+ '@rollup/pluginutils@5.3.0':
+ resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
+ '@rollup/rollup-android-arm-eabi@4.59.0':
+ resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==}
+ cpu: [arm]
+ os: [android]
+
+ '@rollup/rollup-android-arm64@4.59.0':
+ resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==}
+ cpu: [arm64]
+ os: [android]
+
+ '@rollup/rollup-darwin-arm64@4.59.0':
+ resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-x64@4.59.0':
+ resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-freebsd-arm64@4.59.0':
+ resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@rollup/rollup-freebsd-x64@4.59.0':
+ resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.59.0':
+ resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-arm-musleabihf@4.59.0':
+ resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==}
+ cpu: [arm]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-arm64-gnu@4.59.0':
+ resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-arm64-musl@4.59.0':
+ resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-loong64-gnu@4.59.0':
+ resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==}
+ cpu: [loong64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-loong64-musl@4.59.0':
+ resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==}
+ cpu: [loong64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-ppc64-gnu@4.59.0':
+ resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-ppc64-musl@4.59.0':
+ resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-riscv64-gnu@4.59.0':
+ resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-riscv64-musl@4.59.0':
+ resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-linux-s390x-gnu@4.59.0':
+ resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-x64-gnu@4.59.0':
+ resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@rollup/rollup-linux-x64-musl@4.59.0':
+ resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@rollup/rollup-openbsd-x64@4.59.0':
+ resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@rollup/rollup-openharmony-arm64@4.59.0':
+ resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@rollup/rollup-win32-arm64-msvc@4.59.0':
+ resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rollup/rollup-win32-ia32-msvc@4.59.0':
+ resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-gnu@4.59.0':
+ resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==}
+ cpu: [x64]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.59.0':
+ resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==}
+ cpu: [x64]
+ os: [win32]
+
+ '@rtsao/scc@1.1.0':
+ resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
+
+ '@rushstack/node-core-library@5.20.3':
+ resolution: {integrity: sha512-95JgEPq2k7tHxhF9/OJnnyHDXfC9cLhhta0An/6MlkDsX2A6dTzDrTUG18vx4vjc280V0fi0xDH9iQczpSuWsw==}
+ peerDependencies:
+ '@types/node': '*'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@rushstack/problem-matcher@0.2.1':
+ resolution: {integrity: sha512-gulfhBs6n+I5b7DvjKRfhMGyUejtSgOHTclF/eONr8hcgF1APEDjhxIsfdUYYMzC3rvLwGluqLjbwCFZ8nxrog==}
+ peerDependencies:
+ '@types/node': '*'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@rushstack/rig-package@0.7.2':
+ resolution: {integrity: sha512-9XbFWuqMYcHUso4mnETfhGVUSaADBRj6HUAAEYk50nMPn8WRICmBuCphycQGNB3duIR6EEZX3Xj3SYc2XiP+9A==}
+
+ '@rushstack/terminal@0.22.3':
+ resolution: {integrity: sha512-gHC9pIMrUPzAbBiI4VZMU7Q+rsCzb8hJl36lFIulIzoceKotyKL3Rd76AZ2CryCTKEg+0bnTj406HE5YY5OQvw==}
+ peerDependencies:
+ '@types/node': '*'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@rushstack/ts-command-line@5.3.3':
+ resolution: {integrity: sha512-c+ltdcvC7ym+10lhwR/vWiOhsrm/bP3By2VsFcs5qTKv+6tTmxgbVrtJ5NdNjANiV5TcmOZgUN+5KYQ4llsvEw==}
+
+ '@scarf/scarf@1.4.0':
+ resolution: {integrity: sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==}
+
+ '@sindresorhus/to-milliseconds@1.2.0':
+ resolution: {integrity: sha512-nHpLEF6oRZJZ0ym8hmxz4jeSdnOqwWd5GC75GNQqNjfSG1IY55RE3AaGEC/QUDElLTuaPSBVa1rnV/C/rUkAUw==}
+ engines: {node: '>=8'}
+
+ '@standard-schema/utils@0.3.0':
+ resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==}
+
+ '@svgr/babel-plugin-add-jsx-attribute@8.0.0':
+ resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-remove-jsx-attribute@8.0.0':
+ resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0':
+ resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0':
+ resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-svg-dynamic-title@8.0.0':
+ resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-svg-em-dimensions@8.0.0':
+ resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-transform-react-native-svg@8.1.0':
+ resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-plugin-transform-svg-component@8.0.0':
+ resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/babel-preset@8.1.0':
+ resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@svgr/core@8.1.0':
+ resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==}
+ engines: {node: '>=14'}
+
+ '@svgr/hast-util-to-babel-ast@8.0.0':
+ resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==}
+ engines: {node: '>=14'}
+
+ '@svgr/plugin-jsx@8.1.0':
+ resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@svgr/core': '*'
+
+ '@swagger-api/apidom-ast@1.6.0':
+ resolution: {integrity: sha512-ez1KnBdAzoh5a6ijDXzu5nADkVZXlnL1RkLl8n2u2tjiNg9597xxmFdEHLVa31Vxr1yYj0WtYGLA5e2Kp0KNrQ==}
+
+ '@swagger-api/apidom-core@1.6.0':
+ resolution: {integrity: sha512-gA1MVoXe19sjFLKGkWxp5VvSw3Tk0CSChfItJjFeFHpLSGrfm+LlXp37TmNSns53Ky0F7x7TB/5kAX5I/TO4xw==}
+
+ '@swagger-api/apidom-error@1.6.0':
+ resolution: {integrity: sha512-xp/cQ1xQ/4Vd/hhQfONK7ea9oVc3JUXAYyfRzvDR0lxISly/SyD2jMcqXzHtrylBAnv7V2HSsbC1BWo7ZJDLSQ==}
+
+ '@swagger-api/apidom-json-pointer@1.6.0':
+ resolution: {integrity: sha512-RO6P5Gt64AnthGXKeqIFjQCLVFbAJvLYAb67TkvRQ9US4lNixFtFsYJnhLCC4ymz4dTT1hacG0cmTRGcEHF9ig==}
+
+ '@swagger-api/apidom-ns-api-design-systems@1.6.0':
+ resolution: {integrity: sha512-EYJfQ4JYuUo2J4QiiLnA/8LmM1k7AQcf1XVE+NrIpZ1160GIzqE+W5uOXkhAOImkP2Cb7EZZdE2cFE/tMYxNvw==}
+
+ '@swagger-api/apidom-ns-arazzo-1@1.6.0':
+ resolution: {integrity: sha512-5rF8PyBiIHh6NfC5Y0WypW11X6hQIWr88EKNOQbBuT/nnzAsOznrUCfQ99FYGLucwdOHaMIBn/b/n4ejGBto/A==}
+
+ '@swagger-api/apidom-ns-asyncapi-2@1.6.0':
+ resolution: {integrity: sha512-tOodfX+o7lonEAnSAxet7nCayW+EqtKPegT06WXt7Llq1LS9eYZ9YzXdFgIwCm8UzfEpZdVLqtxbdLX9vuUtSg==}
+
+ '@swagger-api/apidom-ns-asyncapi-3@1.6.0':
+ resolution: {integrity: sha512-lRMvwTdtuPcwJEYLTX/UGtECpHi9UNYeT9rmWMw3LiKZrZzYc2L8q4ipPbpWwH8t7QfsF2u0iggCODU99lXCnw==}
+
+ '@swagger-api/apidom-ns-json-schema-2019-09@1.6.0':
+ resolution: {integrity: sha512-dee1i8wcAFgDEOzTsyoCzQhFLZ2JKzkK5KkRuryabvwS0hG2mKlogToFc8cO2MkkiLSpERm7DREALwSTFVHa0w==}
+
+ '@swagger-api/apidom-ns-json-schema-2020-12@1.6.0':
+ resolution: {integrity: sha512-ldTxSnnIXskwpN6yCJkasqs32pJXwoXyad95crKT0xjZZr4fTrcAXXIyzdjBubiY9tK6elSrQGQxinJcV7ivWw==}
+
+ '@swagger-api/apidom-ns-json-schema-draft-4@1.6.0':
+ resolution: {integrity: sha512-t9HvHwrevEG7usosO6AdXmC8oYqje5nxHpUmODr72tUtCeAeGEGEb9lgqx7fBhjc3BYsRzOL1hX56m1gjEyCog==}
+
+ '@swagger-api/apidom-ns-json-schema-draft-6@1.6.0':
+ resolution: {integrity: sha512-aoyvQWgAOcZGTe5OfJ3r24DvXHHbrkKtAnxTOEdZzV/uOm6/cbuT8m02+aMOqWPxei1naC3ZHW9iHrETtfgV3w==}
+
+ '@swagger-api/apidom-ns-json-schema-draft-7@1.6.0':
+ resolution: {integrity: sha512-GjmC4+AHQh22fRZOmV+jSYMJTXh243XvdACfIQ//39kQu7gQsimF4PVSY2IgWSvS/I1ukWdPBYmDvOKryBPGrw==}
+
+ '@swagger-api/apidom-ns-openapi-2@1.6.0':
+ resolution: {integrity: sha512-xbmYzagnB8rO7sYwNGVyxYbNBkjCWnMhlnMrxkPtfQ/2u2ANAmTnCB/S/cMswX5XofiRJbznKAjLDSKBS+mLpQ==}
+
+ '@swagger-api/apidom-ns-openapi-3-0@1.6.0':
+ resolution: {integrity: sha512-AOvW7a2H27inepcTBAWaBMjJLrCh5IPWD4nTU+gysULC7IW6gphO8hj3iUuTmFBcGh9be89GBbvv2y/EGAfx9w==}
+
+ '@swagger-api/apidom-ns-openapi-3-1@1.6.0':
+ resolution: {integrity: sha512-jCVypc8503zDSxAQlyV8j1vzwc75VBdWHtE2O0F+q5j9qNtGxw/ekbDkgrydYRaGBl92mf16dtPjtp5LwJD0Hw==}
+
+ '@swagger-api/apidom-ns-openapi-3-2@1.6.0':
+ resolution: {integrity: sha512-QcFAUucaPaWiOKOEaaGqSfK3OtjeGJodWZLsuBQ0vrHaHkWyQ7jwsM1DJbc1Y8geOBeD2wIwdrdRjoulmqU1SA==}
+
+ '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.6.0':
+ resolution: {integrity: sha512-vz/9k0X/kh6mLm+Fi+LGNk/yyFq28wxI29ZVLW+b7ulcODikv+NaDnyN2n2kLKCvIchPATzAEvqMvVMuuQwWlg==}
+
+ '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.6.0':
+ resolution: {integrity: sha512-QAq4H6YzRtysSpvLtlJ8WZ22/1Mht+/iarrUOijxDZQPAGfYeUoIicnCqxkVZYSea85sQl+3kiCCB3nhSH+L0g==}
+
+ '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.6.0':
+ resolution: {integrity: sha512-syKPG3a9IGRvlGhXIEUzWhwbEuFbj+UwwtqaKu8zu771V+DRtH+wxyOkX54vKAIlApz/FgeUbmlWA1ZtYBlSIQ==}
+
+ '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.6.0':
+ resolution: {integrity: sha512-IVVLn+a8Q1iQcQsm4tXiAPghHJuJSB1rhIlDyHe3tSQgt9HOSiVpbnJDpwE/JBxxDxSAkeT6Ovo+fi2T5AmHYg==}
+
+ '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.6.0':
+ resolution: {integrity: sha512-aSUi22ELTDvdCLA3nIUOehuNBcHSeCqU7S7YNiHP/mwE4Q07pwQrYXijH2PROfCdjlZNNN34m6Ptakd92jliJQ==}
+
+ '@swagger-api/apidom-parser-adapter-asyncapi-json-3@1.6.0':
+ resolution: {integrity: sha512-Ic53vcFF9zniDyCXOGSwwuAdEBUn5lFEAa0m2i30R36cQFHBCCuvbzbMQjWdr+oML0Aw4XoqOwZCQgkJJICpPA==}
+
+ '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.6.0':
+ resolution: {integrity: sha512-d/w7X+T4vT+KPqb+8xUm6n4pbHsGB28jdxE9rNVbxhu6D3owny2uxfglwaFh4fJG6FQMavCwl/QzfB4newdoKQ==}
+
+ '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3@1.6.0':
+ resolution: {integrity: sha512-Wmf0LY59TZxQhqrJU2pcnUikcChVB4IqGPgjtOFLUoqPpz8FSwYbJ/SPnSMSl+QuncxROheSFsgZ6Tupv0sPHw==}
+
+ '@swagger-api/apidom-parser-adapter-json@1.6.0':
+ resolution: {integrity: sha512-WdAS+dBAB2t18HuUgSZy5b8JM7uXfn1RlPymJNRMUsrKYCTtPrQ/0q3YfnBjPhtjSSNCp+p1wajxHAFS7cj2VA==}
+
+ '@swagger-api/apidom-parser-adapter-openapi-json-2@1.6.0':
+ resolution: {integrity: sha512-Q36W1FzdVaY7Oh98533dzCUghwb8k3ZMdlnV37V1H13FlUkj3tVZiWaeaCLwIakzQ7XXYaQTOP+VrRhDRjzhUA==}
+
+ '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.6.0':
+ resolution: {integrity: sha512-UY+obOLTPHJvnXscdMY9XwZyuqcnBe6cu9TURjJgkO/QpOpPDqqZoRyurKZgRrX0Pv9B1zR3EIzhl01u/jeUaw==}
+
+ '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.6.0':
+ resolution: {integrity: sha512-4ch04/96lYMXQu6odqa6H0aJmV8UefnBJKX1CPuL4qcPSPMFCurcXHGpPHrwMu1p/4Q9H+yRVlYeNQV10xvM0w==}
+
+ '@swagger-api/apidom-parser-adapter-openapi-json-3-2@1.6.0':
+ resolution: {integrity: sha512-fWR2gjMQg00QIimcXQMSVeLnCH/2iuDD/Dx8TzVHmKV/IKlu+TnmIVosdlDfRmOB+4duwU6/yfoA79IEhFeZdw==}
+
+ '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.6.0':
+ resolution: {integrity: sha512-dkEh1Rw9uvuIAOTfKjWRX2rLWP+xJ/Eqdkqeo0I0BWFKXX49YcDpHJV4XHpmd5FbsjJ9vBYr0hAmkbl32TtR4g==}
+
+ '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.6.0':
+ resolution: {integrity: sha512-6azq5YonWdzHcO9llK9zn1a+rGxlTz2Uf8p8NWDQnl2AZ56neDLYEL3mNDlrMXAy8dSJIHw+u9VF1OOzdslIHQ==}
+
+ '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.6.0':
+ resolution: {integrity: sha512-g2tGCXyIAC0IA6JjA0HVxHWyCovyfAxDQ+pMAJ6qm4PfrZHB+oXKWKZHNNmQaFiKdc/SVdMQq6Up0mXOQs7IOQ==}
+
+ '@swagger-api/apidom-parser-adapter-openapi-yaml-3-2@1.6.0':
+ resolution: {integrity: sha512-NGkdG9X5Svi89ZBluNseyUBNdgB9MkbTTNmerVKKOmCCHaVbzIb6UFPXf1MifSFyT+wTeGZk6WZLgRIDsTAZ5Q==}
+
+ '@swagger-api/apidom-parser-adapter-yaml-1-2@1.6.0':
+ resolution: {integrity: sha512-UwSE5pPUJ+ag7ZCbesgx/SJ8zUD3Sx+2U4AD3/1G1EJ+0gb7FMYgihuOT8ujmBfZVGGm3HMIEIa1w3zha08v2g==}
+
+ '@swagger-api/apidom-reference@1.6.0':
+ resolution: {integrity: sha512-gYTDfWQM1heqrCCrCsZH+EWDyAkIGqEJnSJcVWKngwOkXJKeUwat8p1TOW4q3rkaTT+fBaYbrjTr9SkFtVbdMg==}
+
+ '@swaggerexpert/cookie@2.0.2':
+ resolution: {integrity: sha512-DPI8YJ0Vznk4CT+ekn3rcFNq1uQwvUHZhH6WvTSPD0YKBIlMS9ur2RYKghXuxxOiqOam/i4lHJH4xTIiTgs3Mg==}
+ engines: {node: '>=12.20.0'}
+
+ '@swaggerexpert/json-pointer@2.10.2':
+ resolution: {integrity: sha512-qMx1nOrzoB+PF+pzb26Q4Tc2sOlrx9Ba2UBNX9hB31Omrq+QoZ2Gly0KLrQWw4Of1AQ4J9lnD+XOdwOdcdXqqw==}
+ engines: {node: '>=12.20.0'}
+
+ '@swc/helpers@0.5.15':
+ resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
+
+ '@testing-library/dom@10.4.1':
+ resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==}
+ engines: {node: '>=18'}
+
+ '@testing-library/jest-dom@6.9.1':
+ resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==}
+ engines: {node: '>=14', npm: '>=6', yarn: '>=1'}
+
+ '@testing-library/react@16.3.2':
+ resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@testing-library/dom': ^10.0.0
+ '@types/react': ^18.0.0 || ^19.0.0
+ '@types/react-dom': ^18.0.0 || ^19.0.0
+ react: ^18.0.0 || ^19.0.0
+ react-dom: ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@testing-library/user-event@14.6.1':
+ resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==}
+ engines: {node: '>=12', npm: '>=6'}
+ peerDependencies:
+ '@testing-library/dom': '>=7.21.4'
+
+ '@tree-sitter-grammars/tree-sitter-yaml@0.7.1':
+ resolution: {integrity: sha512-AynBwkIoQCTgjDR33bDUp9Mqq+YTco0is3n5hRApMqG9of/6A4eQsfC1/uSEeHSUyMQSYawcAWamsexnVpIP4Q==}
+ peerDependencies:
+ tree-sitter: ^0.22.4
+ peerDependenciesMeta:
+ tree-sitter:
+ optional: true
+
+ '@tybys/wasm-util@0.10.1':
+ resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
+
+ '@types/argparse@1.0.38':
+ resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==}
+
+ '@types/aria-query@5.0.4':
+ resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
+
+ '@types/autosuggest-highlight@3.2.3':
+ resolution: {integrity: sha512-8Mb21KWtpn6PvRQXjsKhrXIcxbSloGqNH50RntwGeJsGPW4xvNhfml+3kKulaKpO/7pgZfOmzsJz7VbepArlGQ==}
+
+ '@types/babel__core@7.20.5':
+ resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
+
+ '@types/babel__generator@7.27.0':
+ resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==}
+
+ '@types/babel__template@7.4.4':
+ resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
+
+ '@types/babel__traverse@7.28.0':
+ resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==}
+
+ '@types/backbone@1.4.23':
+ resolution: {integrity: sha512-B/hN/DAJdWFOusEkEoa5xgfVuxJJPOR/6JQ2uwURPDyKL24PuC76IR6EcSRJ6lvGWtxHRQYMJQhJYm6KpMDtGQ==}
+
+ '@types/chai@5.2.3':
+ resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==}
+
+ '@types/d3-array@3.2.2':
+ resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==}
+
+ '@types/d3-color@3.1.3':
+ resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==}
+
+ '@types/d3-ease@3.0.2':
+ resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==}
+
+ '@types/d3-interpolate@3.0.4':
+ resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==}
+
+ '@types/d3-path@3.1.1':
+ resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==}
+
+ '@types/d3-scale@4.0.9':
+ resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==}
+
+ '@types/d3-shape@3.1.8':
+ resolution: {integrity: sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==}
+
+ '@types/d3-time@3.0.4':
+ resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==}
+
+ '@types/d3-timer@3.0.2':
+ resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==}
+
+ '@types/debug@4.1.12':
+ resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+
+ '@types/deep-eql@4.0.2':
+ resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==}
+
+ '@types/dom-to-image@2.6.7':
+ resolution: {integrity: sha512-me5VbCv+fcXozblWwG13krNBvuEOm6kA5xoa4RrjDJCNFOZSWR3/QLtOXimBHk1Fisq69Gx3JtOoXtg1N1tijg==}
+
+ '@types/estree-jsx@1.0.5':
+ resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
+
+ '@types/estree@1.0.8':
+ resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+
+ '@types/hammerjs@2.0.46':
+ resolution: {integrity: sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==}
+
+ '@types/hast@2.3.10':
+ resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==}
+
+ '@types/hast@3.0.4':
+ resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
+
+ '@types/jquery@3.5.34':
+ resolution: {integrity: sha512-3m3939S3erqmTLJANS/uy0B6V7BorKx7RorcGZVjZ62dF5PAGbKEDZK1CuLtKombJkFA2T1jl8LAIIs7IV6gBQ==}
+
+ '@types/jqueryui@1.12.24':
+ resolution: {integrity: sha512-E2sGULwzMhg4kAeOV+gYcXjg988RuPkviWCt09jLe6GGK9sHM7dTqS8H7JMuUWoZQBucIBzBAgM5o/ezKUFkeg==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/json5@0.0.29':
+ resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+
+ '@types/lodash@4.17.24':
+ resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==}
+
+ '@types/mdast@4.0.4':
+ resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
+
+ '@types/ms@2.1.0':
+ resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
+
+ '@types/node@24.12.0':
+ resolution: {integrity: sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==}
+
+ '@types/parse-json@4.0.2':
+ resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==}
+
+ '@types/prismjs@1.26.6':
+ resolution: {integrity: sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==}
+
+ '@types/prop-types@15.7.15':
+ resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==}
+
+ '@types/q@1.5.8':
+ resolution: {integrity: sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==}
+
+ '@types/qs@6.15.0':
+ resolution: {integrity: sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==}
+
+ '@types/ramda@0.30.2':
+ resolution: {integrity: sha512-PyzHvjCalm2BRYjAU6nIB3TprYwMNOUY/7P/N8bSzp9W/yM2YrtGtAnnVtaCNSeOZ8DzKyFDvaqQs7LnWwwmBA==}
+
+ '@types/react-beautiful-dnd@13.1.8':
+ resolution: {integrity: sha512-E3TyFsro9pQuK4r8S/OL6G99eq7p8v29sX0PM7oT8Z+PJfZvSQTx4zTQbUJ+QZXioAF0e7TGBEcA1XhYhCweyQ==}
+
+ '@types/react-datepicker@6.2.0':
+ resolution: {integrity: sha512-+JtO4Fm97WLkJTH8j8/v3Ldh7JCNRwjMYjRaKh4KHH0M3jJoXtwiD3JBCsdlg3tsFIw9eQSqyAPeVDN2H2oM9Q==}
+
+ '@types/react-dom@18.3.7':
+ resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==}
+ peerDependencies:
+ '@types/react': ^18.0.0
+
+ '@types/react-helmet@6.1.11':
+ resolution: {integrity: sha512-0QcdGLddTERotCXo3VFlUSWO3ztraw8nZ6e3zJSgG7apwV5xt+pJUS8ewPBqT4NYB1optGLprNQzFleIY84u/g==}
+
+ '@types/react-highlight@0.12.8':
+ resolution: {integrity: sha512-V7O7zwXUw8WSPd//YUO8sz489J/EeobJljASGhP0rClrvq+1Y1qWEpToGu+Pp7YuChxhAXSgkLkrOYpZX5A62g==}
+
+ '@types/react-syntax-highlighter@15.5.13':
+ resolution: {integrity: sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==}
+
+ '@types/react-transition-group@4.4.12':
+ resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==}
+ peerDependencies:
+ '@types/react': '*'
+
+ '@types/react@18.3.28':
+ resolution: {integrity: sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==}
+
+ '@types/selectize@0.12.39':
+ resolution: {integrity: sha512-ABnSEXM1MyO9ZZXl2yXLqzHcENuGh6kyXisnq87OQCubbJrMaargMYV/NPVmJA3lJGnDM6hzc1ce7yQM/RwI5g==}
+
+ '@types/sizzle@2.3.10':
+ resolution: {integrity: sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==}
+
+ '@types/swagger-ui-react@5.18.0':
+ resolution: {integrity: sha512-c2M9adVG7t28t1pq19K9Jt20VLQf0P/fwJwnfcmsVVsdkwCWhRmbKDu+tIs0/NGwJ/7GY8lBx+iKZxuDI5gDbw==}
+
+ '@types/trusted-types@2.0.7':
+ resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
+
+ '@types/underscore@1.13.0':
+ resolution: {integrity: sha512-L6LBgy1f0EFQZ+7uSA57+n2g/s4Qs5r06Vwrwn0/nuK1de+adz00NWaztRQ30aEqw5qOaWbPI8u2cGQ52lj6VA==}
+
+ '@types/unist@2.0.11':
+ resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==}
+
+ '@types/unist@3.0.3':
+ resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
+
+ '@types/url-parse@1.4.11':
+ resolution: {integrity: sha512-FKvKIqRaykZtd4n47LbK/W/5fhQQ1X7cxxzG9A48h0BGN+S04NH7ervcCjM8tyR0lyGru83FAHSmw2ObgKoESg==}
+
+ '@types/use-sync-external-store@0.0.6':
+ resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==}
+
+ '@types/uuid@8.3.4':
+ resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==}
+
+ '@types/yup@0.32.0':
+ resolution: {integrity: sha512-Gr2lllWTDxGVYHgWfL8szjdedERpNgm44L9BDL2cmcHG7Bfd6taEpiW3ayMFLaYvlJr/6bFXDJdh6L406AGlFg==}
+ deprecated: This is a stub types definition. yup provides its own type definitions, so you do not need this installed.
+
+ '@typescript-eslint/eslint-plugin@8.57.0':
+ resolution: {integrity: sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^8.57.0
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/parser@8.57.0':
+ resolution: {integrity: sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/project-service@8.57.0':
+ resolution: {integrity: sha512-pR+dK0BlxCLxtWfaKQWtYr7MhKmzqZxuii+ZjuFlZlIGRZm22HnXFqa2eY+90MUz8/i80YJmzFGDUsi8dMOV5w==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/scope-manager@8.57.0':
+ resolution: {integrity: sha512-nvExQqAHF01lUM66MskSaZulpPL5pgy5hI5RfrxviLgzZVffB5yYzw27uK/ft8QnKXI2X0LBrHJFr1TaZtAibw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/tsconfig-utils@8.57.0':
+ resolution: {integrity: sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/type-utils@8.57.0':
+ resolution: {integrity: sha512-yjgh7gmDcJ1+TcEg8x3uWQmn8ifvSupnPfjP21twPKrDP/pTHlEQgmKcitzF/rzPSmv7QjJ90vRpN4U+zoUjwQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/types@8.57.0':
+ resolution: {integrity: sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/typescript-estree@8.57.0':
+ resolution: {integrity: sha512-m7faHcyVg0BT3VdYTlX8GdJEM7COexXxS6KqGopxdtkQRvBanK377QDHr4W/vIPAR+ah9+B/RclSW5ldVniO1Q==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/utils@8.57.0':
+ resolution: {integrity: sha512-5iIHvpD3CZe06riAsbNxxreP+MuYgVUsV0n4bwLH//VJmgtt54sQeY2GszntJ4BjYCpMzrfVh2SBnUQTtys2lQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/visitor-keys@8.57.0':
+ resolution: {integrity: sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@ungap/structured-clone@1.3.0':
+ resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
+
+ '@unrs/resolver-binding-android-arm-eabi@1.11.1':
+ resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==}
+ cpu: [arm]
+ os: [android]
+
+ '@unrs/resolver-binding-android-arm64@1.11.1':
+ resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==}
+ cpu: [arm64]
+ os: [android]
+
+ '@unrs/resolver-binding-darwin-arm64@1.11.1':
+ resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@unrs/resolver-binding-darwin-x64@1.11.1':
+ resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@unrs/resolver-binding-freebsd-x64@1.11.1':
+ resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1':
+ resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==}
+ cpu: [arm]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1':
+ resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==}
+ cpu: [arm]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-arm64-gnu@1.11.1':
+ resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@unrs/resolver-binding-linux-arm64-musl@1.11.1':
+ resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1':
+ resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1':
+ resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
+ '@unrs/resolver-binding-linux-riscv64-musl@1.11.1':
+ resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [musl]
+
+ '@unrs/resolver-binding-linux-s390x-gnu@1.11.1':
+ resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
+ '@unrs/resolver-binding-linux-x64-gnu@1.11.1':
+ resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@unrs/resolver-binding-linux-x64-musl@1.11.1':
+ resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@unrs/resolver-binding-wasm32-wasi@1.11.1':
+ resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+
+ '@unrs/resolver-binding-win32-arm64-msvc@1.11.1':
+ resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@unrs/resolver-binding-win32-ia32-msvc@1.11.1':
+ resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@unrs/resolver-binding-win32-x64-msvc@1.11.1':
+ resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==}
+ cpu: [x64]
+ os: [win32]
+
+ '@use-gesture/core@10.3.1':
+ resolution: {integrity: sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==}
+
+ '@use-gesture/react@10.3.1':
+ resolution: {integrity: sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==}
+ peerDependencies:
+ react: '>= 16.8.0'
+
+ '@vitejs/plugin-react@4.7.0':
+ resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0
+
+ '@vitest/eslint-plugin@1.6.10':
+ resolution: {integrity: sha512-/cOf+mTu4HBJIYHTETo8/OFCSZv3T2p+KfGnouzKfjK063cWLZp0TzvK7EU5B3eFG7ypUNtw6l+jK+SA+p1g8g==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ eslint: '>=8.57.0'
+ typescript: '>=5.0.0'
+ vitest: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ vitest:
+ optional: true
+
+ '@vitest/expect@3.2.4':
+ resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==}
+
+ '@vitest/mocker@3.2.4':
+ resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==}
+ peerDependencies:
+ msw: ^2.4.9
+ vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0
+ peerDependenciesMeta:
+ msw:
+ optional: true
+ vite:
+ optional: true
+
+ '@vitest/pretty-format@3.2.4':
+ resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==}
+
+ '@vitest/runner@3.2.4':
+ resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==}
+
+ '@vitest/snapshot@3.2.4':
+ resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==}
+
+ '@vitest/spy@3.2.4':
+ resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==}
+
+ '@vitest/utils@3.2.4':
+ resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==}
+
+ '@volar/language-core@2.4.28':
+ resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==}
+
+ '@volar/source-map@2.4.28':
+ resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==}
+
+ '@volar/typescript@2.4.28':
+ resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==}
+
+ '@vue/compiler-core@3.5.30':
+ resolution: {integrity: sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==}
+
+ '@vue/compiler-dom@3.5.30':
+ resolution: {integrity: sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==}
+
+ '@vue/compiler-vue2@2.7.16':
+ resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==}
+
+ '@vue/language-core@2.2.0':
+ resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@vue/shared@3.5.30':
+ resolution: {integrity: sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==}
+
+ '@xstate/inspect@0.8.0':
+ resolution: {integrity: sha512-wSkFeOnp+7dhn+zTThO0M4D2FEqZN9lGIWowJu5JLa2ojjtlzRwK8SkjcHZ4rLX8VnMev7kGjgQLrGs8kxy+hw==}
+ peerDependencies:
+ '@types/ws': ^8.0.0
+ ws: ^8.0.0
+ xstate: ^4.37.0
+ peerDependenciesMeta:
+ '@types/ws':
+ optional: true
+
+ '@xstate/react@3.2.2':
+ resolution: {integrity: sha512-feghXWLedyq8JeL13yda3XnHPZKwYDN5HPBLykpLeuNpr9178tQd2/3d0NrH6gSd0sG5mLuLeuD+ck830fgzLQ==}
+ peerDependencies:
+ '@xstate/fsm': ^2.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ xstate: ^4.37.2
+ peerDependenciesMeta:
+ '@xstate/fsm':
+ optional: true
+ xstate:
+ optional: true
+
+ Base64@1.1.0:
+ resolution: {integrity: sha512-qeacf8dvGpf+XAT27ESHMh7z84uRzj/ua2pQdJg483m3bEXv/kVFtDnMgvf70BQGqzbZhR9t6BmASzKvqfJf3Q==}
+
+ abortcontroller-polyfill@1.7.8:
+ resolution: {integrity: sha512-9f1iZ2uWh92VcrU9Y8x+LdM4DLj75VE0MJB8zuF1iUnroEptStw+DQ8EQPMUdfe5k+PkB1uUfDQfWbhstH8LrQ==}
+
+ acorn-jsx@5.3.2:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ acorn@8.16.0:
+ resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ agent-base@7.1.4:
+ resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==}
+ engines: {node: '>= 14'}
+
+ ajv-draft-04@1.0.0:
+ resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==}
+ peerDependencies:
+ ajv: ^8.5.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv-errors@3.0.0:
+ resolution: {integrity: sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==}
+ peerDependencies:
+ ajv: ^8.0.1
+
+ ajv-formats@2.1.1:
+ resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv-formats@3.0.1:
+ resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv@6.14.0:
+ resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==}
+
+ ajv@8.18.0:
+ resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==}
+
+ alien-signals@0.4.14:
+ resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==}
+
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ ansi-styles@5.2.0:
+ resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
+ engines: {node: '>=10'}
+
+ apg-lite@1.0.5:
+ resolution: {integrity: sha512-SlI+nLMQDzCZfS39ihzjGp3JNBQfJXyMi6cg9tkLOCPVErgFsUIAEdO9IezR7kbP5Xd0ozcPNQBkf9TO5cHgWw==}
+
+ argparse@1.0.10:
+ resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ aria-query@5.3.0:
+ resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
+
+ aria-query@5.3.2:
+ resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
+ engines: {node: '>= 0.4'}
+
+ array-buffer-byte-length@1.0.2:
+ resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
+ engines: {node: '>= 0.4'}
+
+ array-includes@3.1.9:
+ resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.findlastindex@1.2.6:
+ resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.flat@1.3.3:
+ resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.flatmap@1.3.3:
+ resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==}
+ engines: {node: '>= 0.4'}
+
+ arraybuffer.prototype.slice@1.0.4:
+ resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
+ engines: {node: '>= 0.4'}
+
+ asn1js@3.0.7:
+ resolution: {integrity: sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==}
+ engines: {node: '>=12.0.0'}
+
+ assertion-error@2.0.1:
+ resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
+ engines: {node: '>=12'}
+
+ async-function@1.0.0:
+ resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
+ engines: {node: '>= 0.4'}
+
+ asynckit@0.4.0:
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
+ atob@2.1.2:
+ resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==}
+ engines: {node: '>= 4.5.0'}
+ hasBin: true
+
+ autolinker@3.16.2:
+ resolution: {integrity: sha512-JiYl7j2Z19F9NdTmirENSUUIIL/9MytEWtmzhfmsKPCp9E+G35Y0UNCMoM9tFigxT59qSc8Ml2dlZXOCVTYwuA==}
+
+ autosuggest-highlight@3.3.4:
+ resolution: {integrity: sha512-j6RETBD2xYnrVcoV1S5R4t3WxOlWZKyDQjkwnggDPSjF5L4jV98ZltBpvPvbkM1HtoSe5o+bNrTHyjPbieGeYA==}
+
+ available-typed-arrays@1.0.7:
+ resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
+ engines: {node: '>= 0.4'}
+
+ axios@1.13.6:
+ resolution: {integrity: sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==}
+
+ babel-plugin-macros@3.1.0:
+ resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==}
+ engines: {node: '>=10', npm: '>=6'}
+
+ babel-plugin-styled-components@2.1.4:
+ resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==}
+ peerDependencies:
+ styled-components: '>= 2'
+
+ bail@2.0.2:
+ resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ balanced-match@4.0.4:
+ resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
+ engines: {node: 18 || 20 || >=22}
+
+ base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+ baseline-browser-mapping@2.10.0:
+ resolution: {integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ batch-processor@1.0.0:
+ resolution: {integrity: sha512-xoLQD8gmmR32MeuBHgH0Tzd5PuSZx71ZsbhVxOCRbgktZEPe4SQy7s9Z50uPp0F/f7iw2XmkHN2xkgbMfckMDA==}
+
+ big-integer@1.6.52:
+ resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==}
+ engines: {node: '>=0.6'}
+
+ birecord@0.1.1:
+ resolution: {integrity: sha512-VUpsf/qykW0heRlC8LooCq28Kxn3mAqKohhDG/49rrsQ1dT1CXyj/pgXS+5BSRzFTR/3DyIBOqQOrGyZOh71Aw==}
+
+ body-scroll-lock-upgrade@1.1.0:
+ resolution: {integrity: sha512-nnfVAS+tB7CS9RaksuHVTpgHWHF7fE/ptIBJnwZrMqImIvWJF1OGcLnMpBhC6qhkx9oelvyxmWXwmIJXCV98Sw==}
+
+ brace-expansion@1.1.12:
+ resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
+
+ brace-expansion@2.0.2:
+ resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
+
+ brace-expansion@5.0.4:
+ resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==}
+ engines: {node: 18 || 20 || >=22}
+
+ broadcast-channel@3.7.0:
+ resolution: {integrity: sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==}
+
+ broadcast-channel@4.17.0:
+ resolution: {integrity: sha512-r2GSQMNgZv7eAsbdsu9xofSjc3J2diCQTPkSuyVhLBfx8fylLCVhi5KheuhuAQBJNd4pxqUyz9U6rvdnt7GZng==}
+
+ browser-tabs-lock@1.3.0:
+ resolution: {integrity: sha512-g6nHaobTiT0eMZ7jh16YpD2kcjAp+PInbiVq3M1x6KKaEIVhT4v9oURNIpZLOZ3LQbQ3XYfNhMAb/9hzNLIWrw==}
+
+ browserslist@4.28.1:
+ resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ btoa@1.2.1:
+ resolution: {integrity: sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==}
+ engines: {node: '>= 0.4.0'}
+ hasBin: true
+
+ buffer@6.0.3:
+ resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
+
+ cac@6.7.14:
+ resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+ engines: {node: '>=8'}
+
+ calculate-size@1.1.1:
+ resolution: {integrity: sha512-jJZ7pvbQVM/Ss3VO789qpsypN3xmnepg242cejOAslsmlZLYw2dnj7knnNowabQ0Kzabzx56KFTy2Pot/y6FmA==}
+
+ call-bind-apply-helpers@1.0.2:
+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+ engines: {node: '>= 0.4'}
+
+ call-bind@1.0.8:
+ resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
+ engines: {node: '>= 0.4'}
+
+ call-bound@1.0.4:
+ resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
+ engines: {node: '>= 0.4'}
+
+ callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ camelcase@6.3.0:
+ resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+ engines: {node: '>=10'}
+
+ camelize@1.0.1:
+ resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==}
+
+ caniuse-lite@1.0.30001777:
+ resolution: {integrity: sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==}
+
+ ccount@2.0.1:
+ resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
+
+ chai@5.3.3:
+ resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==}
+ engines: {node: '>=18'}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
+ character-entities-html4@2.1.0:
+ resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
+
+ character-entities-legacy@1.1.4:
+ resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==}
+
+ character-entities-legacy@3.0.0:
+ resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}
+
+ character-entities@1.2.4:
+ resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==}
+
+ character-entities@2.0.2:
+ resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
+
+ character-reference-invalid@1.1.4:
+ resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==}
+
+ character-reference-invalid@2.0.1:
+ resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==}
+
+ check-error@2.1.3:
+ resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==}
+ engines: {node: '>= 16'}
+
+ chokidar@4.0.3:
+ resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
+ engines: {node: '>= 14.16.0'}
+
+ classnames@2.5.1:
+ resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==}
+
+ client-only@0.0.1:
+ resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
+
+ clipboard@1.7.1:
+ resolution: {integrity: sha512-smkaRaIQsrnKN1F3wd1/vY9Q+DeR4L8ZCXKeHCFC2j8RZuSBbuImcLdnIO4GTxmzJxQuDGNKkyfpGoPW7Ua5bQ==}
+
+ clone@2.1.2:
+ resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==}
+ engines: {node: '>=0.8'}
+
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ color-string@1.9.1:
+ resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
+
+ color@4.2.3:
+ resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
+ engines: {node: '>=12.5.0'}
+
+ combined-stream@1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+
+ comma-separated-tokens@1.0.8:
+ resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==}
+
+ comma-separated-tokens@2.0.3:
+ resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
+
+ compare-versions@4.1.4:
+ resolution: {integrity: sha512-FemMreK9xNyL8gQevsdRMrvO4lFCkQP7qbuktn1q8ndcNk1+0mz7lgE7b/sNvbhVgY4w6tMN1FDp6aADjqw2rw==}
+
+ compare-versions@6.1.1:
+ resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==}
+
+ component-emitter@1.3.1:
+ resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ confbox@0.1.8:
+ resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+
+ confbox@0.2.4:
+ resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==}
+
+ container-query-toolkit@0.1.3:
+ resolution: {integrity: sha512-B1EvYaLzFKz81vgWDm+zL0X7fzFUjlN6lF/RivDeNT4xW9mFsTh1oiC9rtvFFiwG52e3JUmYLXwPpqNBf2AXHA==}
+
+ convert-source-map@1.9.0:
+ resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
+
+ convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+ cookie@1.1.1:
+ resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==}
+ engines: {node: '>=18'}
+
+ copy-to-clipboard@3.3.3:
+ resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==}
+
+ core-js-pure@3.48.0:
+ resolution: {integrity: sha512-1slJgk89tWC51HQ1AEqG+s2VuwpTRr8ocu4n20QUcH1v9lAN0RXen0Q0AABa/DK1I7RrNWLucplOHMx8hfTGTw==}
+
+ core-js@3.48.0:
+ resolution: {integrity: sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==}
+
+ cosmiconfig@7.1.0:
+ resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==}
+ engines: {node: '>=10'}
+
+ cosmiconfig@8.3.6:
+ resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ typescript: '>=4.9.5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ cron-validate@1.5.3:
+ resolution: {integrity: sha512-jcu8g/3wZL8OBr4MkEcbeIdLpM8pp5Y6UoOlRktcJG3WjgpifijR0s26Yac7ywR0gC2ABtevOsz5mlD3l3gzwA==}
+
+ cronstrue@2.61.0:
+ resolution: {integrity: sha512-ootN5bvXbIQI9rW94+QsXN5eROtXWwew6NkdGxIRpS/UFWRggL0G5Al7a9GTBFEsuvVhJ2K3CntIIVt7L2ILhA==}
+ deprecated: Non-backwards compatible Breaking changes
+ hasBin: true
+
+ cross-fetch@3.2.0:
+ resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==}
+
+ cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+ engines: {node: '>= 8'}
+
+ css-color-keywords@1.0.0:
+ resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==}
+ engines: {node: '>=4'}
+
+ css-to-react-native@3.2.0:
+ resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==}
+
+ css.escape@1.5.1:
+ resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==}
+
+ cssstyle@4.6.0:
+ resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==}
+ engines: {node: '>=18'}
+
+ csstype@3.2.3:
+ resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
+
+ d3-array@3.2.4:
+ resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==}
+ engines: {node: '>=12'}
+
+ d3-color@3.1.0:
+ resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==}
+ engines: {node: '>=12'}
+
+ d3-ease@3.0.1:
+ resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==}
+ engines: {node: '>=12'}
+
+ d3-format@3.1.2:
+ resolution: {integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==}
+ engines: {node: '>=12'}
+
+ d3-interpolate@3.0.1:
+ resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
+ engines: {node: '>=12'}
+
+ d3-path@3.1.0:
+ resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==}
+ engines: {node: '>=12'}
+
+ d3-scale@4.0.2:
+ resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==}
+ engines: {node: '>=12'}
+
+ d3-shape@3.2.0:
+ resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==}
+ engines: {node: '>=12'}
+
+ d3-time-format@4.1.0:
+ resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==}
+ engines: {node: '>=12'}
+
+ d3-time@3.1.0:
+ resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==}
+ engines: {node: '>=12'}
+
+ d3-timer@3.0.1:
+ resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==}
+ engines: {node: '>=12'}
+
+ data-urls@5.0.0:
+ resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==}
+ engines: {node: '>=18'}
+
+ data-view-buffer@1.0.2:
+ resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
+ engines: {node: '>= 0.4'}
+
+ data-view-byte-length@1.0.2:
+ resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==}
+ engines: {node: '>= 0.4'}
+
+ data-view-byte-offset@1.0.1:
+ resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
+ engines: {node: '>= 0.4'}
+
+ date-fns-tz@2.0.1:
+ resolution: {integrity: sha512-fJCG3Pwx8HUoLhkepdsP7Z5RsucUi+ZBOxyM5d0ZZ6c4SdYustq0VMmOu6Wf7bli+yS/Jwp91TOCqn9jMcVrUA==}
+ peerDependencies:
+ date-fns: 2.x
+
+ date-fns@2.30.0:
+ resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
+ engines: {node: '>=0.11'}
+
+ date-fns@3.6.0:
+ resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==}
+
+ dayjs@1.10.7:
+ resolution: {integrity: sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==}
+
+ de-indent@1.0.2:
+ resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
+
+ debug@3.2.7:
+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@4.4.3:
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ decimal.js-light@2.5.1:
+ resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==}
+
+ decimal.js@10.6.0:
+ resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==}
+
+ decode-named-character-reference@1.3.0:
+ resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==}
+
+ deep-copy@1.4.2:
+ resolution: {integrity: sha512-VxZwQ/1+WGQPl5nE67uLhh7OqdrmqI1OazrraO9Bbw/M8Bt6Mol/RxzDA6N6ZgRXpsG/W9PgUj8E1LHHBEq2GQ==}
+ engines: {node: '>=4.0.0'}
+
+ deep-eql@5.0.2:
+ resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
+ engines: {node: '>=6'}
+
+ deep-equal@1.1.2:
+ resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==}
+ engines: {node: '>= 0.4'}
+
+ deep-extend@0.6.0:
+ resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
+ engines: {node: '>=4.0.0'}
+
+ deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
+ deepmerge@4.3.1:
+ resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+ engines: {node: '>=0.10.0'}
+
+ defaulty@2.1.0:
+ resolution: {integrity: sha512-dNWjHNxL32khAaX/kS7/a3rXsgvqqp7cptqt477wAVnJLgaOKjcQt+53jKgPofn6hL2xyG51MegPlB5TKImXjA==}
+
+ define-data-property@1.1.4:
+ resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+ engines: {node: '>= 0.4'}
+
+ define-properties@1.2.1:
+ resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+ engines: {node: '>= 0.4'}
+
+ defined@1.0.1:
+ resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==}
+
+ delayed-stream@1.0.0:
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+ engines: {node: '>=0.4.0'}
+
+ delegate@3.2.0:
+ resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==}
+
+ dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+
+ detect-libc@2.1.2:
+ resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
+ engines: {node: '>=8'}
+
+ detect-node@2.1.0:
+ resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
+
+ devlop@1.1.0:
+ resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
+
+ diff@8.0.3:
+ resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==}
+ engines: {node: '>=0.3.1'}
+
+ doctrine@2.1.0:
+ resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
+ engines: {node: '>=0.10.0'}
+
+ dom-accessibility-api@0.5.16:
+ resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
+
+ dom-accessibility-api@0.6.3:
+ resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==}
+
+ dom-helpers@5.2.1:
+ resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==}
+
+ dom-mutator@0.6.0:
+ resolution: {integrity: sha512-iCt9o0aYfXMUkz/43ZOAUFQYotjGB+GNbYJiJdz4TgXkyToXbbRy5S6FbTp72lRBtfpUMwEc1KmpFEU4CZeoNg==}
+ engines: {node: '>=10'}
+
+ dom-to-image@2.6.0:
+ resolution: {integrity: sha512-Dt0QdaHmLpjURjU7Tnu3AgYSF2LuOmksSGsUcE6ItvJoCWTBEmiMXcqBdNSAm9+QbbwD7JMoVsuuKX6ZVQv1qA==}
+
+ dompurify@3.2.6:
+ resolution: {integrity: sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==}
+
+ dompurify@3.2.7:
+ resolution: {integrity: sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==}
+
+ dot-case@3.0.4:
+ resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
+
+ dotenv@16.6.1:
+ resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==}
+ engines: {node: '>=12'}
+
+ dotignore@0.1.2:
+ resolution: {integrity: sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==}
+ hasBin: true
+
+ drange@1.1.1:
+ resolution: {integrity: sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==}
+ engines: {node: '>=4'}
+
+ dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+
+ electron-to-chromium@1.5.307:
+ resolution: {integrity: sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==}
+
+ element-resize-detector@1.1.13:
+ resolution: {integrity: sha512-QzMTvOM+hSXzPGxO4XeHq8OJAJZ/0kZQRbIBVGlR4GRVWHdfv/I/udYzIcQCZtzN1LdwkrGsNPWTIDbC8Tj7PA==}
+
+ elkjs@0.8.2:
+ resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==}
+
+ ellipsize@0.2.0:
+ resolution: {integrity: sha512-InJhblLPZbBjw3N49knOWonfprgKPLKGySmG6bGHi7WsD5OkXIIlLkU4AguROmaMZ0v1BRdo267wEc0Pexw8ww==}
+
+ entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+
+ entities@6.0.1:
+ resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
+ engines: {node: '>=0.12'}
+
+ entities@7.0.1:
+ resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==}
+ engines: {node: '>=0.12'}
+
+ error-ex@1.3.4:
+ resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==}
+
+ es-abstract@1.24.1:
+ resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==}
+ engines: {node: '>= 0.4'}
+
+ es-cookie@1.3.2:
+ resolution: {integrity: sha512-UTlYYhXGLOy05P/vKVT2Ui7WtC7NiRzGtJyAKKn32g5Gvcjn7KAClLPWlipCtxIus934dFg9o9jXiBL0nP+t9Q==}
+
+ es-define-property@1.0.1:
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+ engines: {node: '>= 0.4'}
+
+ es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+
+ es-module-lexer@1.7.0:
+ resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
+
+ es-object-atoms@1.1.1:
+ resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+ engines: {node: '>= 0.4'}
+
+ es-set-tostringtag@2.1.0:
+ resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
+ engines: {node: '>= 0.4'}
+
+ es-shim-unscopables@1.1.0:
+ resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==}
+ engines: {node: '>= 0.4'}
+
+ es-to-primitive@1.3.0:
+ resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
+ engines: {node: '>= 0.4'}
+
+ esbuild@0.27.3:
+ resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ escape-string-regexp@5.0.0:
+ resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+ engines: {node: '>=12'}
+
+ eslint-import-resolver-node@0.3.9:
+ resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
+
+ eslint-import-resolver-typescript@3.10.1:
+ resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '*'
+ eslint-plugin-import: '*'
+ eslint-plugin-import-x: '*'
+ peerDependenciesMeta:
+ eslint-plugin-import:
+ optional: true
+ eslint-plugin-import-x:
+ optional: true
+
+ eslint-module-utils@2.12.1:
+ resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: '*'
+ eslint-import-resolver-node: '*'
+ eslint-import-resolver-typescript: '*'
+ eslint-import-resolver-webpack: '*'
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+ eslint:
+ optional: true
+ eslint-import-resolver-node:
+ optional: true
+ eslint-import-resolver-typescript:
+ optional: true
+ eslint-import-resolver-webpack:
+ optional: true
+
+ eslint-plugin-import@2.32.0:
+ resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+
+ eslint-plugin-react-debug@1.53.1:
+ resolution: {integrity: sha512-WNOiQ6jhodJE88VjBU/IVDM+2Zr9gKHlBFDUSA3fQ0dMB5RiBVj5wMtxbxRuipK/GqNJbteqHcZoYEod7nfddg==}
+ engines: {node: '>=18.18.0'}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: ^4.9.5 || ^5.3.3
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ eslint-plugin-react-dom@1.53.1:
+ resolution: {integrity: sha512-UYrWJ2cS4HpJ1A5XBuf1HfMpPoLdfGil+27g/ldXfGemb4IXqlxHt4ANLyC8l2CWcE3SXGJW7mTslL34MG0qTQ==}
+ engines: {node: '>=18.18.0'}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: ^4.9.5 || ^5.3.3
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ eslint-plugin-react-hooks-extra@1.53.1:
+ resolution: {integrity: sha512-fshTnMWNn9NjFLIuy7HzkRgGK29vKv4ZBO9UMr+kltVAfKLMeXXP6021qVKk66i/XhQjbktiS+vQsu1Rd3ZKvg==}
+ engines: {node: '>=18.18.0'}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: ^4.9.5 || ^5.3.3
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ eslint-plugin-react-hooks@5.2.0:
+ resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0
+
+ eslint-plugin-react-naming-convention@1.53.1:
+ resolution: {integrity: sha512-rvZ/B/CSVF8d34HQ4qIt90LRuxotVx+KUf3i1OMXAyhsagEFMRe4gAlPJiRufZ+h9lnuu279bEdd+NINsXOteA==}
+ engines: {node: '>=18.18.0'}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: ^4.9.5 || ^5.3.3
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ eslint-plugin-react-refresh@0.4.26:
+ resolution: {integrity: sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==}
+ peerDependencies:
+ eslint: '>=8.40'
+
+ eslint-plugin-react-web-api@1.53.1:
+ resolution: {integrity: sha512-INVZ3Cbl9/b+sizyb43ChzEPXXYuDsBGU9BIg7OVTNPyDPloCXdI+dQFAcSlDocZhPrLxhPV3eT6+gXbygzYXg==}
+ engines: {node: '>=18.18.0'}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: ^4.9.5 || ^5.3.3
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ eslint-plugin-react-x@1.53.1:
+ resolution: {integrity: sha512-MwMNnVwiPem0U6SlejDF/ddA4h/lmP6imL1RDZ2m3pUBrcdcOwOx0gyiRVTA3ENnhRlWfHljHf5y7m8qDSxMEg==}
+ engines: {node: '>=18.18.0'}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ ts-api-utils: ^2.1.0
+ typescript: ^4.9.5 || ^5.3.3
+ peerDependenciesMeta:
+ ts-api-utils:
+ optional: true
+ typescript:
+ optional: true
+
+ eslint-plugin-unused-imports@3.2.0:
+ resolution: {integrity: sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ '@typescript-eslint/eslint-plugin': 6 - 7
+ eslint: '8'
+ peerDependenciesMeta:
+ '@typescript-eslint/eslint-plugin':
+ optional: true
+
+ eslint-rule-composer@0.3.0:
+ resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==}
+ engines: {node: '>=4.0.0'}
+
+ eslint-scope@8.4.0:
+ resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint-visitor-keys@4.2.1:
+ resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint-visitor-keys@5.0.1:
+ resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ eslint@9.32.0:
+ resolution: {integrity: sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ hasBin: true
+ peerDependencies:
+ jiti: '*'
+ peerDependenciesMeta:
+ jiti:
+ optional: true
+
+ espree@10.4.0:
+ resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ esquery@1.7.0:
+ resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==}
+ engines: {node: '>=0.10'}
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
+ estree-util-is-identifier-name@3.0.0:
+ resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==}
+
+ estree-walker@2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+ estree-walker@3.0.3:
+ resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+
+ esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+
+ eventemitter3@4.0.7:
+ resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
+
+ expect-type@1.3.0:
+ resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==}
+ engines: {node: '>=12.0.0'}
+
+ exsolve@1.0.8:
+ resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==}
+
+ extend@3.0.2:
+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+
+ fast-deep-equal@1.1.0:
+ resolution: {integrity: sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw==}
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ fast-equals@5.4.0:
+ resolution: {integrity: sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==}
+ engines: {node: '>=6.0.0'}
+
+ fast-json-patch@3.1.1:
+ resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==}
+
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+ fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+ fast-safe-stringify@2.1.1:
+ resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==}
+
+ fast-text-encoding@1.0.6:
+ resolution: {integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==}
+
+ fast-uri@3.1.0:
+ resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==}
+
+ fault@1.0.4:
+ resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==}
+
+ fdir@6.5.0:
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
+ file-entry-cache@8.0.0:
+ resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+ engines: {node: '>=16.0.0'}
+
+ find-root@1.1.0:
+ resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==}
+
+ find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+
+ flat-cache@4.0.1:
+ resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+ engines: {node: '>=16'}
+
+ flatted@3.4.1:
+ resolution: {integrity: sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==}
+
+ follow-redirects@1.15.11:
+ resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ debug: '*'
+ peerDependenciesMeta:
+ debug:
+ optional: true
+
+ for-each@0.3.5:
+ resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
+ engines: {node: '>= 0.4'}
+
+ form-data@4.0.5:
+ resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==}
+ engines: {node: '>= 6'}
+
+ format@0.2.2:
+ resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==}
+ engines: {node: '>=0.4.x'}
+
+ framer-motion@10.18.0:
+ resolution: {integrity: sha512-oGlDh1Q1XqYPksuTD/usb0I70hq95OUzmL9+6Zd+Hs4XV0oaISBa/UUMSjYiq6m8EUF32132mOJ8xVZS+I0S6w==}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ peerDependenciesMeta:
+ react:
+ optional: true
+ react-dom:
+ optional: true
+
+ framer-motion@7.10.3:
+ resolution: {integrity: sha512-k2ccYeZNSpPg//HTaqrU+4pRq9f9ZpaaN7rr0+Rx5zA4wZLbk547wtDzge2db1sB+1mnJ6r59P4xb+aEIi/W+w==}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+
+ fs-extra@11.3.4:
+ resolution: {integrity: sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==}
+ engines: {node: '>=14.14'}
+
+ fs.realpath@1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+ fsevents@2.3.2:
+ resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ function.prototype.name@1.1.8:
+ resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==}
+ engines: {node: '>= 0.4'}
+
+ functions-have-names@1.2.3:
+ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+
+ fuse.js@6.6.2:
+ resolution: {integrity: sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==}
+ engines: {node: '>=10'}
+
+ generator-function@2.0.1:
+ resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==}
+ engines: {node: '>= 0.4'}
+
+ gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+
+ get-intrinsic@1.3.0:
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+ engines: {node: '>= 0.4'}
+
+ get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+
+ get-symbol-description@1.1.0:
+ resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
+ engines: {node: '>= 0.4'}
+
+ get-tsconfig@4.13.6:
+ resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==}
+
+ glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+
+ glob@7.2.3:
+ resolution: {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
+
+ globals@14.0.0:
+ resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
+ engines: {node: '>=18'}
+
+ globalthis@1.0.4:
+ resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
+ engines: {node: '>= 0.4'}
+
+ globrex@0.1.2:
+ resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
+
+ good-listener@1.2.2:
+ resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==}
+
+ gopd@1.2.0:
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+ engines: {node: '>= 0.4'}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ hammerjs@2.0.8:
+ resolution: {integrity: sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==}
+ engines: {node: '>=0.8.0'}
+
+ handlebars@4.7.8:
+ resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==}
+ engines: {node: '>=0.4.7'}
+ hasBin: true
+
+ has-bigints@1.1.0:
+ resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
+ engines: {node: '>= 0.4'}
+
+ has-flag@3.0.0:
+ resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+ engines: {node: '>=4'}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ has-property-descriptors@1.0.2:
+ resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+
+ has-proto@1.2.0:
+ resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==}
+ engines: {node: '>= 0.4'}
+
+ has-symbols@1.1.0:
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+ engines: {node: '>= 0.4'}
+
+ has-tostringtag@1.0.2:
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+ engines: {node: '>= 0.4'}
+
+ has@1.0.4:
+ resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==}
+ engines: {node: '>= 0.4.0'}
+
+ hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
+
+ hast-util-parse-selector@2.2.5:
+ resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==}
+
+ hast-util-parse-selector@4.0.0:
+ resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
+
+ hast-util-to-jsx-runtime@2.3.6:
+ resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==}
+
+ hast-util-whitespace@3.0.0:
+ resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
+
+ hastscript@6.0.0:
+ resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==}
+
+ hastscript@9.0.1:
+ resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==}
+
+ he@1.2.0:
+ resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+ hasBin: true
+
+ hey-listen@1.0.8:
+ resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==}
+
+ highlight.js@10.7.3:
+ resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==}
+
+ highlight.js@11.11.1:
+ resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==}
+ engines: {node: '>=12.0.0'}
+
+ highlightjs-vue@1.0.0:
+ resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==}
+
+ hoist-non-react-statics@3.3.2:
+ resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
+
+ html-encoding-sniffer@4.0.0:
+ resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==}
+ engines: {node: '>=18'}
+
+ html-url-attributes@3.0.1:
+ resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==}
+
+ http-proxy-agent@7.0.2:
+ resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
+ engines: {node: '>= 14'}
+
+ https-proxy-agent@7.0.6:
+ resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==}
+ engines: {node: '>= 14'}
+
+ iconv-lite@0.6.3:
+ resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+ engines: {node: '>=0.10.0'}
+
+ ieee754@1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+
+ ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+ engines: {node: '>= 4'}
+
+ ignore@7.0.5:
+ resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
+ engines: {node: '>= 4'}
+
+ immutable@3.8.3:
+ resolution: {integrity: sha512-AUY/VyX0E5XlibOmWt10uabJzam1zlYjwiEgQSDc5+UIkFNaF9WM0JxXKaNMGf+F/ffUF+7kRKXM9A7C0xXqMg==}
+ engines: {node: '>=0.10.0'}
+
+ immutable@5.1.5:
+ resolution: {integrity: sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==}
+
+ import-fresh@3.3.1:
+ resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
+ engines: {node: '>=6'}
+
+ import-lazy@4.0.0:
+ resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==}
+ engines: {node: '>=8'}
+
+ imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+
+ indent-string@4.0.0:
+ resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
+ engines: {node: '>=8'}
+
+ inflight@1.0.6:
+ resolution: {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.
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ inline-style-parser@0.2.7:
+ resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==}
+
+ internal-slot@1.1.0:
+ resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
+ engines: {node: '>= 0.4'}
+
+ internmap@2.0.3:
+ resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==}
+ engines: {node: '>=12'}
+
+ invariant@2.2.4:
+ resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
+
+ is-alphabetical@1.0.4:
+ resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==}
+
+ is-alphabetical@2.0.1:
+ resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==}
+
+ is-alphanumerical@1.0.4:
+ resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==}
+
+ is-alphanumerical@2.0.1:
+ resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==}
+
+ is-arguments@1.2.0:
+ resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==}
+ engines: {node: '>= 0.4'}
+
+ is-array-buffer@3.0.5:
+ resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
+ engines: {node: '>= 0.4'}
+
+ is-arrayish@0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+ is-arrayish@0.3.4:
+ resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==}
+
+ is-async-function@2.1.1:
+ resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==}
+ engines: {node: '>= 0.4'}
+
+ is-bigint@1.1.0:
+ resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
+ engines: {node: '>= 0.4'}
+
+ is-boolean-object@1.2.2:
+ resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
+ engines: {node: '>= 0.4'}
+
+ is-bun-module@2.0.0:
+ resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==}
+
+ is-callable@1.2.7:
+ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+ engines: {node: '>= 0.4'}
+
+ is-core-module@2.16.1:
+ resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
+ engines: {node: '>= 0.4'}
+
+ is-data-view@1.0.2:
+ resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==}
+ engines: {node: '>= 0.4'}
+
+ is-date-object@1.1.0:
+ resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
+ engines: {node: '>= 0.4'}
+
+ is-decimal@1.0.4:
+ resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==}
+
+ is-decimal@2.0.1:
+ resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==}
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-finalizationregistry@1.1.1:
+ resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
+ engines: {node: '>= 0.4'}
+
+ is-generator-function@1.1.2:
+ resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==}
+ engines: {node: '>= 0.4'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-hexadecimal@1.0.4:
+ resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==}
+
+ is-hexadecimal@2.0.1:
+ resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==}
+
+ is-immutable-type@5.0.1:
+ resolution: {integrity: sha512-LkHEOGVZZXxGl8vDs+10k3DvP++SEoYEAJLRk6buTFi6kD7QekThV7xHS0j6gpnUCQ0zpud/gMDGiV4dQneLTg==}
+ peerDependencies:
+ eslint: '*'
+ typescript: '>=4.7.4'
+
+ is-map@2.0.3:
+ resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
+ engines: {node: '>= 0.4'}
+
+ is-negative-zero@2.0.3:
+ resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
+ engines: {node: '>= 0.4'}
+
+ is-number-object@1.1.1:
+ resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
+ engines: {node: '>= 0.4'}
+
+ is-plain-obj@4.1.0:
+ resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
+ engines: {node: '>=12'}
+
+ is-potential-custom-element-name@1.0.1:
+ resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
+
+ is-regex@1.1.4:
+ resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
+ engines: {node: '>= 0.4'}
+
+ is-regex@1.2.1:
+ resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
+ engines: {node: '>= 0.4'}
+
+ is-set@2.0.3:
+ resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
+ engines: {node: '>= 0.4'}
+
+ is-shared-array-buffer@1.0.4:
+ resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
+ engines: {node: '>= 0.4'}
+
+ is-string@1.1.1:
+ resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
+ engines: {node: '>= 0.4'}
+
+ is-symbol@1.1.1:
+ resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
+ engines: {node: '>= 0.4'}
+
+ is-typed-array@1.1.15:
+ resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
+ engines: {node: '>= 0.4'}
+
+ is-weakmap@2.0.2:
+ resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
+ engines: {node: '>= 0.4'}
+
+ is-weakref@1.1.1:
+ resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==}
+ engines: {node: '>= 0.4'}
+
+ is-weakset@2.0.4:
+ resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
+ engines: {node: '>= 0.4'}
+
+ isarray@2.0.5:
+ resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ jju@1.4.0:
+ resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==}
+
+ jotai@2.18.1:
+ resolution: {integrity: sha512-e0NOzK+yRFwHo7DOp0DS0Ycq74KMEAObDWFGmfEL28PD9nLqBTt3/Ug7jf9ca72x0gC9LQZG9zH+0ISICmy3iA==}
+ engines: {node: '>=12.20.0'}
+ peerDependencies:
+ '@babel/core': '>=7.0.0'
+ '@babel/template': '>=7.0.0'
+ '@types/react': '>=17.0.0'
+ react: '>=17.0.0'
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+ '@babel/template':
+ optional: true
+ '@types/react':
+ optional: true
+ react:
+ optional: true
+
+ js-cookie@3.0.5:
+ resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==}
+ engines: {node: '>=14'}
+
+ js-file-download@0.4.12:
+ resolution: {integrity: sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg==}
+
+ js-sha3@0.8.0:
+ resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==}
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ js-tokens@9.0.1:
+ resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
+
+ js-yaml@4.1.1:
+ resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
+ hasBin: true
+
+ jsdom@26.1.0:
+ resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ canvas: ^3.0.0
+ peerDependenciesMeta:
+ canvas:
+ optional: true
+
+ jsesc@3.1.0:
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+ json-parse-even-better-errors@2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+ json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
+ json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+ json5@1.0.2:
+ resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+ hasBin: true
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ jsonfile@6.2.0:
+ resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==}
+
+ jsonpath-plus@6.0.1:
+ resolution: {integrity: sha512-EvGovdvau6FyLexFH2OeXfIITlgIbgZoAZe3usiySeaIDm5QS+A10DKNpaPBBqqRSZr2HN6HVNXxtwUAr2apEw==}
+ engines: {node: '>=10.0.0'}
+
+ keycharm@0.3.1:
+ resolution: {integrity: sha512-zn47Ti4FJT9zdF+YBBLWJsfKF/fYQHkrYlBeB5Ez5e2PjW7SoIxr43yehAne2HruulIoid4NKZZxO0dHBygCtQ==}
+
+ keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
+ kld-affine@2.1.1:
+ resolution: {integrity: sha512-NIS9sph8ZKdnQxZa5TcggaFs/Qr9zX3brFlGwE0+0Z4EzFIvAFuqLSwNeU4GkEpaX8ndh3ggGmWV7BPPcS3vjQ==}
+ engines: {node: '>= 10.15.3'}
+
+ kld-intersections@0.7.0:
+ resolution: {integrity: sha512-/KuBU7Y5bRPGfc0yQ3QIoXPKqOQ6cBWDRl1XVMMa3pm4V6Ydbgy9e2fZoRxlSIU0gZSBt1c6gWLOzSGKbU8I3A==}
+ engines: {node: '>= 10.15.3'}
+
+ kld-path-parser@0.2.1:
+ resolution: {integrity: sha512-C1EqY6vzqv5tdKeMF31L+JXq97n5zo67LiSEhZf4sPq8YeM+8ytp/qMGSKN8VdSPvFa6h1SR35aF4+T2JtxZww==}
+ engines: {node: '>= 10.15.3'}
+
+ kld-polynomial@0.3.0:
+ resolution: {integrity: sha512-PEfxjQ6tsxL9DHBIhM2UZsSes0GI+OIMjbE0kj60jr80Biq/xXl1eGfnyzmfoackAMdKZtw2060L09HdjkPP5w==}
+ engines: {node: '>= 10.15.3'}
+
+ kolorist@1.8.0:
+ resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
+
+ levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+
+ lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+ load-script@1.0.0:
+ resolution: {integrity: sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA==}
+
+ local-pkg@1.1.2:
+ resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==}
+ engines: {node: '>=14'}
+
+ locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+
+ lodash.debounce@4.0.8:
+ resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
+
+ lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+ lodash@4.17.23:
+ resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==}
+
+ longest-streak@3.1.0:
+ resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
+
+ loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+
+ loupe@3.2.1:
+ resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==}
+
+ lower-case@2.0.2:
+ resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
+
+ lowlight@1.20.0:
+ resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==}
+
+ lru-cache@10.4.3:
+ resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
+
+ lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+ lru-cache@6.0.0:
+ resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
+ engines: {node: '>=10'}
+
+ luxon@3.7.2:
+ resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==}
+ engines: {node: '>=12'}
+
+ lz-string@1.5.0:
+ resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
+ hasBin: true
+
+ magic-string@0.30.21:
+ resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+
+ markdown-table@3.0.4:
+ resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
+
+ marked@14.0.0:
+ resolution: {integrity: sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==}
+ engines: {node: '>= 18'}
+ hasBin: true
+
+ match-sorter@6.3.4:
+ resolution: {integrity: sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==}
+
+ math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+
+ mdast-util-directive@3.1.0:
+ resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==}
+
+ mdast-util-find-and-replace@3.0.2:
+ resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==}
+
+ mdast-util-from-markdown@2.0.3:
+ resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==}
+
+ mdast-util-gfm-autolink-literal@2.0.1:
+ resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==}
+
+ mdast-util-gfm-footnote@2.1.0:
+ resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==}
+
+ mdast-util-gfm-strikethrough@2.0.0:
+ resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==}
+
+ mdast-util-gfm-table@2.0.0:
+ resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==}
+
+ mdast-util-gfm-task-list-item@2.0.0:
+ resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==}
+
+ mdast-util-gfm@3.1.0:
+ resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==}
+
+ mdast-util-mdx-expression@2.0.1:
+ resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==}
+
+ mdast-util-mdx-jsx@3.2.0:
+ resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==}
+
+ mdast-util-mdxjs-esm@2.0.1:
+ resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==}
+
+ mdast-util-phrasing@4.1.0:
+ resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==}
+
+ mdast-util-to-hast@13.2.1:
+ resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==}
+
+ mdast-util-to-markdown@2.1.2:
+ resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==}
+
+ mdast-util-to-string@4.0.0:
+ resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
+
+ memoize-one@5.2.1:
+ resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==}
+
+ micromark-core-commonmark@2.0.3:
+ resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==}
+
+ micromark-extension-directive@3.0.2:
+ resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==}
+
+ micromark-extension-gfm-autolink-literal@2.1.0:
+ resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==}
+
+ micromark-extension-gfm-footnote@2.1.0:
+ resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==}
+
+ micromark-extension-gfm-strikethrough@2.1.0:
+ resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==}
+
+ micromark-extension-gfm-table@2.1.1:
+ resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==}
+
+ micromark-extension-gfm-tagfilter@2.0.0:
+ resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==}
+
+ micromark-extension-gfm-task-list-item@2.1.0:
+ resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==}
+
+ micromark-extension-gfm@3.0.0:
+ resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
+
+ micromark-factory-destination@2.0.1:
+ resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==}
+
+ micromark-factory-label@2.0.1:
+ resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==}
+
+ micromark-factory-space@2.0.1:
+ resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==}
+
+ micromark-factory-title@2.0.1:
+ resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==}
+
+ micromark-factory-whitespace@2.0.1:
+ resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==}
+
+ micromark-util-character@2.1.1:
+ resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==}
+
+ micromark-util-chunked@2.0.1:
+ resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==}
+
+ micromark-util-classify-character@2.0.1:
+ resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==}
+
+ micromark-util-combine-extensions@2.0.1:
+ resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==}
+
+ micromark-util-decode-numeric-character-reference@2.0.2:
+ resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==}
+
+ micromark-util-decode-string@2.0.1:
+ resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==}
+
+ micromark-util-encode@2.0.1:
+ resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==}
+
+ micromark-util-html-tag-name@2.0.1:
+ resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==}
+
+ micromark-util-normalize-identifier@2.0.1:
+ resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==}
+
+ micromark-util-resolve-all@2.0.1:
+ resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==}
+
+ micromark-util-sanitize-uri@2.0.1:
+ resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==}
+
+ micromark-util-subtokenize@2.1.0:
+ resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==}
+
+ micromark-util-symbol@2.0.1:
+ resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==}
+
+ micromark-util-types@2.0.2:
+ resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==}
+
+ micromark@4.0.2:
+ resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==}
+
+ microseconds@0.2.0:
+ resolution: {integrity: sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==}
+
+ mime-db@1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+
+ mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+
+ min-indent@1.0.1:
+ resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
+ engines: {node: '>=4'}
+
+ minim@0.23.8:
+ resolution: {integrity: sha512-bjdr2xW1dBCMsMGGsUeqM4eFI60m94+szhxWys+B1ztIt6gWSfeGBdSVCIawezeHYLYn0j6zrsXdQS/JllBzww==}
+ engines: {node: '>=6'}
+
+ minimatch@10.2.3:
+ resolution: {integrity: sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==}
+ engines: {node: 18 || 20 || >=22}
+
+ minimatch@10.2.4:
+ resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==}
+ engines: {node: 18 || 20 || >=22}
+
+ minimatch@3.1.5:
+ resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==}
+
+ minimatch@9.0.9:
+ resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ mlly@1.8.1:
+ resolution: {integrity: sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==}
+
+ mock-json-schema@1.1.2:
+ resolution: {integrity: sha512-3IyduYlhfzPy+nFN8wxUjloUi1hM7l8lN5LITuauUNMQltynJIOfLf/DADwTAp2d6kvSBtWojly1EuxX5B0WkA==}
+
+ mock-property@1.0.3:
+ resolution: {integrity: sha512-2emPTb1reeLLYwHxyVx993iYyCHEiRRO+y8NFXFPL5kl5q14sgTK76cXyEKkeKCHeRw35SfdkUJ10Q1KfHuiIQ==}
+ engines: {node: '>= 0.4'}
+
+ moment@2.30.1:
+ resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==}
+
+ monaco-editor@0.55.1:
+ resolution: {integrity: sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==}
+
+ monaco-languages-jq@1.0.0:
+ resolution: {integrity: sha512-zOPxmPh2mEQs9GzGFR4KJIZ8IP4sWQZLIB1DYC5cchRkN1mcViFNf4a/XHO/vAwXD2X7kLDvYMpphFqikZLokQ==}
+
+ mousetrap@1.6.5:
+ resolution: {integrity: sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ muggle-string@0.4.1:
+ resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
+
+ nano-time@1.0.0:
+ resolution: {integrity: sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==}
+
+ nanoid@3.3.11:
+ resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ napi-postinstall@0.3.4:
+ resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==}
+ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+ hasBin: true
+
+ natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+ neo-async@2.6.2:
+ resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
+
+ neotraverse@0.6.18:
+ resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==}
+ engines: {node: '>= 10'}
+
+ next@16.1.6:
+ resolution: {integrity: sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==}
+ engines: {node: '>=20.9.0'}
+ hasBin: true
+ peerDependencies:
+ '@opentelemetry/api': ^1.1.0
+ '@playwright/test': ^1.51.1
+ babel-plugin-react-compiler: '*'
+ react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
+ react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
+ sass: ^1.3.0
+ peerDependenciesMeta:
+ '@opentelemetry/api':
+ optional: true
+ '@playwright/test':
+ optional: true
+ babel-plugin-react-compiler:
+ optional: true
+ sass:
+ optional: true
+
+ no-case@3.0.4:
+ resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
+
+ node-abort-controller@3.1.1:
+ resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==}
+
+ node-addon-api@7.1.1:
+ resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
+
+ node-addon-api@8.6.0:
+ resolution: {integrity: sha512-gBVjCaqDlRUk0EwoPNKzIr9KkS9041G/q31IBShPs1Xz6UTA+EXdZADbzqAJQrpDRq71CIMnOP5VMut3SL0z5Q==}
+ engines: {node: ^18 || ^20 || >= 21}
+
+ node-cache@5.1.2:
+ resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==}
+ engines: {node: '>= 8.0.0'}
+
+ node-domexception@1.0.0:
+ resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
+ engines: {node: '>=10.5.0'}
+ deprecated: Use your platform's native DOMException instead
+
+ node-fetch-commonjs@3.3.2:
+ resolution: {integrity: sha512-VBlAiynj3VMLrotgwOS3OyECFxas5y7ltLcK4t41lMUZeaK15Ym4QRkqN0EQKAFL42q9i21EPKjzLUPfltR72A==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ node-fetch@2.7.0:
+ resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+
+ node-gyp-build@4.8.4:
+ resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==}
+ hasBin: true
+
+ node-releases@2.0.36:
+ resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==}
+
+ nwsapi@2.2.23:
+ resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==}
+
+ object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ object-inspect@1.12.3:
+ resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==}
+
+ object-inspect@1.13.4:
+ resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
+ engines: {node: '>= 0.4'}
+
+ object-is@1.1.6:
+ resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==}
+ engines: {node: '>= 0.4'}
+
+ object-keys@1.1.1:
+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+ engines: {node: '>= 0.4'}
+
+ object.assign@4.1.7:
+ resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
+ engines: {node: '>= 0.4'}
+
+ object.fromentries@2.0.8:
+ resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
+ engines: {node: '>= 0.4'}
+
+ object.groupby@1.0.3:
+ resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==}
+ engines: {node: '>= 0.4'}
+
+ object.values@1.2.1:
+ resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==}
+ engines: {node: '>= 0.4'}
+
+ oblivious-set@1.0.0:
+ resolution: {integrity: sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==}
+
+ oblivious-set@1.1.1:
+ resolution: {integrity: sha512-Oh+8fK09mgGmAshFdH6hSVco6KZmd1tTwNFWj35OvzdmJTMZtAkbn05zar2iG3v6sDs1JLEtOiBGNb6BHwkb2w==}
+
+ once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+ openapi-path-templating@2.2.1:
+ resolution: {integrity: sha512-eN14VrDvl/YyGxxrkGOHkVkWEoPyhyeydOUrbvjoz8K5eIGgELASwN1eqFOJ2CTQMGCy2EntOK1KdtJ8ZMekcg==}
+ engines: {node: '>=12.20.0'}
+
+ openapi-server-url-templating@1.3.0:
+ resolution: {integrity: sha512-DPlCms3KKEbjVQb0spV6Awfn6UWNheuG/+folQPzh/wUaKwuqvj8zt5gagD7qoyxtE03cIiKPgLFS3Q8Bz00uQ==}
+ engines: {node: '>=12.20.0'}
+
+ optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+ engines: {node: '>= 0.8.0'}
+
+ own-keys@1.0.1:
+ resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
+ engines: {node: '>= 0.4'}
+
+ p-cancelable@2.1.1:
+ resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==}
+ engines: {node: '>=8'}
+
+ p-cancelable@3.0.0:
+ resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==}
+ engines: {node: '>=12.20'}
+
+ p-finally@1.0.0:
+ resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==}
+ engines: {node: '>=4'}
+
+ p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+
+ p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+
+ p-queue@6.6.2:
+ resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==}
+ engines: {node: '>=8'}
+
+ p-timeout@3.2.0:
+ resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==}
+ engines: {node: '>=8'}
+
+ parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+
+ parse-entities@2.0.0:
+ resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==}
+
+ parse-entities@4.0.2:
+ resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==}
+
+ parse-json@5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
+
+ parse-ms@2.1.0:
+ resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==}
+ engines: {node: '>=6'}
+
+ parse5@7.3.0:
+ resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
+
+ path-browserify@1.0.1:
+ resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ path-is-absolute@1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+ path-to-regexp@8.3.0:
+ resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==}
+
+ path-type@4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+
+ pathe@2.0.3:
+ resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+
+ pathval@2.0.1:
+ resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==}
+ engines: {node: '>= 14.16'}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+ picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+
+ picomatch@4.0.3:
+ resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
+ engines: {node: '>=12'}
+
+ pkg-types@1.3.1:
+ resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
+
+ pkg-types@2.3.0:
+ resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==}
+
+ playwright-core@1.58.2:
+ resolution: {integrity: sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ playwright@1.58.2:
+ resolution: {integrity: sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ popper.js@1.16.1:
+ resolution: {integrity: sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==}
+ deprecated: You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1
+
+ possible-typed-array-names@1.1.0:
+ resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
+ engines: {node: '>= 0.4'}
+
+ postcss-value-parser@4.2.0:
+ resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+
+ postcss@8.4.31:
+ resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ postcss@8.5.8:
+ resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+
+ prettier@3.8.1:
+ resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ pretty-format@27.5.1:
+ resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
+ engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+
+ prismjs@1.27.0:
+ resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==}
+ engines: {node: '>=6'}
+
+ prismjs@1.30.0:
+ resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==}
+ engines: {node: '>=6'}
+
+ promise-polyfill@8.3.0:
+ resolution: {integrity: sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg==}
+
+ prop-types@15.8.1:
+ resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+
+ propagating-hammerjs@1.5.0:
+ resolution: {integrity: sha512-3PUXWmomwutoZfydC+lJwK1bKCh6sK6jZGB31RUX6+4EXzsbkDZrK4/sVR7gBrvJaEIwpTVyxQUAd29FKkmVdw==}
+
+ property-expr@2.0.6:
+ resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==}
+
+ property-information@5.6.0:
+ resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==}
+
+ property-information@7.1.0:
+ resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==}
+
+ proxy-from-env@1.1.0:
+ resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
+ pvtsutils@1.3.6:
+ resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==}
+
+ pvutils@1.1.5:
+ resolution: {integrity: sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==}
+ engines: {node: '>=16.0.0'}
+
+ q@1.4.1:
+ resolution: {integrity: sha512-/CdEdaw49VZVmyIDGUQKDDT53c7qBkO6g5CefWz91Ae+l4+cRtcDYwMTXh6me4O8TMldeGHG3N2Bl84V78Ywbg==}
+ engines: {node: '>=0.6.0', teleport: '>=0.2.0'}
+ deprecated: |-
+ You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.
+
+ (For a CapTP with native promises, see @endo/eventual-send and @endo/captp)
+
+ qs@6.15.0:
+ resolution: {integrity: sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==}
+ engines: {node: '>=0.6'}
+
+ quansync@0.2.11:
+ resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==}
+
+ query-state-core@3.1.0:
+ resolution: {integrity: sha512-92ZOQw7TW3yVZYk4V7K7CrRhvXTjbGW6nP9PshtY2yaGkixoGsbGi+DAgDaaxN7VaErYUmLjOmNmU64QQvg4mA==}
+
+ querystringify@2.2.0:
+ resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
+
+ ramda-adjunct@5.1.0:
+ resolution: {integrity: sha512-8qCpl2vZBXEJyNbi4zqcgdfHtcdsWjOGbiNSEnEBrM6Y0OKOT8UxJbIVGm1TIcjaSu2MxaWcgtsNlKlCk7o7qg==}
+ engines: {node: '>=0.10.3'}
+ peerDependencies:
+ ramda: '>= 0.30.0'
+
+ ramda@0.30.1:
+ resolution: {integrity: sha512-tEF5I22zJnuclswcZMc8bDIrwRHRzf+NqVEmqg50ShAZMP7MWeR/RGDthfM/p+BlqvF2fXAzpn8i+SJcYD3alw==}
+
+ randexp@0.5.3:
+ resolution: {integrity: sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==}
+ engines: {node: '>=4'}
+
+ randombytes@2.1.0:
+ resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
+
+ rdk@6.6.3:
+ resolution: {integrity: sha512-+l6HyGiPDZnFMYci6/qv6cXxLEKiPrPPngAUV1iCBmtxMvEgMlhRi20x4SRAOwCUIsZDpjniibYbDOZ9/PfBcg==}
+ deprecated: 'deprecated: use reablocks instead'
+ peerDependencies:
+ react: '>=16'
+ react-dom: '>=16'
+
+ react-confetti@6.4.0:
+ resolution: {integrity: sha512-5MdGUcqxrTU26I2EU7ltkWPwxvucQTuqMm8dUz72z2YMqTD6s9vMcDUysk7n9jnC+lXuCPeJJ7Knf98VEYE9Rg==}
+ engines: {node: '>=16'}
+ peerDependencies:
+ react: ^16.3.0 || ^17.0.1 || ^18.0.0 || ^19.0.0
+
+ react-container-query@0.12.1:
+ resolution: {integrity: sha512-ObSKMpM/AcwnZk4oXZhApaw+wevpXLh7CM18wsZbUqJWzn+k5WKM1M5lV/crUZ2Ht8RnF5CTCnoi9et2Ji0j9w==}
+ peerDependencies:
+ react: ^0.14.0 || ^15.0.0-0 || ^16.0.0-0 || ^17
+ react-dom: ^0.14.0 || ^15.0.0-0 || ^16.0.0-0 || ^17
+
+ react-cool-dimensions@2.0.7:
+ resolution: {integrity: sha512-z1VwkAAJ5d8QybDRuYIXTE41RxGr5GYsv1bQhbOBE8cMfoZQZpcF0odL64vdgrQVzat2jayedj1GoYi80FWcbA==}
+ peerDependencies:
+ react: '>= 16.8.0'
+
+ react-copy-to-clipboard@5.1.0:
+ resolution: {integrity: sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==}
+ peerDependencies:
+ react: ^15.3.0 || 16 || 17 || 18
+
+ react-data-table-component@7.7.0:
+ resolution: {integrity: sha512-5knL6zMSKlbvzu9P04KM5Lx8/EyQujb4I9z3rWeoVX++IDJadQ7aR4X5J6EeS90wjK0Xoa6btaVeglnCAqD2ag==}
+ peerDependencies:
+ react: '>= 17.0.0'
+ styled-components: '>= 5.0.0'
+
+ react-datepicker@6.9.0:
+ resolution: {integrity: sha512-QTxuzeem7BUfVFWv+g5WuvzT0c5BPo+XTCNbMTZKSZQLU+cMMwSUHwspaxuIcDlwNcOH0tiJ+bh1fJ2yxOGYWA==}
+ peerDependencies:
+ react: ^16.9.0 || ^17 || ^18
+ react-dom: ^16.9.0 || ^17 || ^18
+
+ react-debounce-input@3.3.0:
+ resolution: {integrity: sha512-VEqkvs8JvY/IIZvh71Z0TC+mdbxERvYF33RcebnodlsUZ8RSgyKe2VWaHXv4+/8aoOgXLxWrdsYs2hDhcwbUgA==}
+ peerDependencies:
+ react: ^15.3.0 || 16 || 17 || 18
+
+ react-dom@18.3.1:
+ resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
+ peerDependencies:
+ react: ^18.3.1
+
+ react-fast-compare@3.2.2:
+ resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==}
+
+ react-helmet@6.1.0:
+ resolution: {integrity: sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==}
+ peerDependencies:
+ react: '>=16.3.0'
+
+ react-highlight@0.15.0:
+ resolution: {integrity: sha512-5uV/b/N4Z421GSVVe05fz+OfTsJtFzx/fJBdafZyw4LS70XjIZwgEx3Lrkfc01W/RzZ2Dtfb0DApoaJFAIKBtA==}
+
+ react-hook-form@7.71.2:
+ resolution: {integrity: sha512-1CHvcDYzuRUNOflt4MOq3ZM46AronNJtQ1S7tnX6YN4y72qhgiUItpacZUAQ0TyWYci3yz1X+rXaSxiuEm86PA==}
+ engines: {node: '>=18.0.0'}
+ peerDependencies:
+ react: ^16.8.0 || ^17 || ^18 || ^19
+
+ react-hotkeys-hook@4.6.2:
+ resolution: {integrity: sha512-FmP+ZriY3EG59Ug/lxNfrObCnW9xQShgk7Nb83+CkpfkcCpfS95ydv+E9JuXA5cp8KtskU7LGlIARpkc92X22Q==}
+ peerDependencies:
+ react: '>=16.8.1'
+ react-dom: '>=16.8.1'
+
+ react-immutable-proptypes@2.2.0:
+ resolution: {integrity: sha512-Vf4gBsePlwdGvSZoLSBfd4HAP93HDauMY4fDjXhreg/vg6F3Fj/MXDNyTbltPC/xZKmZc+cjLu3598DdYK6sgQ==}
+ peerDependencies:
+ immutable: '>=3.6.2'
+
+ react-immutable-pure-component@2.2.2:
+ resolution: {integrity: sha512-vkgoMJUDqHZfXXnjVlG3keCxSO/U6WeDQ5/Sl0GK2cH8TOxEzQ5jXqDXHEL/jqk6fsNxV05oH5kD7VNMUE2k+A==}
+ peerDependencies:
+ immutable: '>= 2 || >= 4.0.0-rc'
+ react: '>= 16.6'
+ react-dom: '>= 16.6'
+
+ react-inspector@6.0.2:
+ resolution: {integrity: sha512-x+b7LxhmHXjHoU/VrFAzw5iutsILRoYyDq97EDYdFpPLcvqtEzk4ZSZSQjnFPbr5T57tLXnHcqFYoN1pI6u8uQ==}
+ peerDependencies:
+ react: ^16.8.4 || ^17.0.0 || ^18.0.0
+
+ react-is@16.13.1:
+ resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+
+ react-is@17.0.2:
+ resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
+
+ react-is@18.3.1:
+ resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
+
+ react-is@19.2.4:
+ resolution: {integrity: sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==}
+
+ react-markdown@10.1.0:
+ resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==}
+ peerDependencies:
+ '@types/react': '>=18'
+ react: '>=18'
+
+ react-number-format@5.4.4:
+ resolution: {integrity: sha512-wOmoNZoOpvMminhifQYiYSTCLUDOiUbBunrMrMjA+dV52sY+vck1S4UhR6PkgnoCquvvMSeJjErXZ4qSaWCliA==}
+ peerDependencies:
+ react: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ react-onclickoutside@6.13.2:
+ resolution: {integrity: sha512-h6Hbf1c8b7tIYY4u90mDdBLY4+AGQVMFtIE89HgC0DtVCh/JfKl477gYqUtGLmjZBKK3MJxomP/lFiLbz4sq9A==}
+ peerDependencies:
+ react: ^15.5.x || ^16.x || ^17.x || ^18.x
+ react-dom: ^15.5.x || ^16.x || ^17.x || ^18.x
+
+ react-player@2.16.1:
+ resolution: {integrity: sha512-mxP6CqjSWjidtyDoMOSHVPdhX0pY16aSvw5fVr44EMaT7X5Xz46uQ4b/YBm1v2x+3hHkB9PmjEEkmbHb9PXQ4w==}
+ peerDependencies:
+ react: '>=16.6.0'
+
+ react-query@3.39.3:
+ resolution: {integrity: sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ react-dom: '*'
+ react-native: '*'
+ peerDependenciesMeta:
+ react-dom:
+ optional: true
+ react-native:
+ optional: true
+
+ react-redux@9.2.0:
+ resolution: {integrity: sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==}
+ peerDependencies:
+ '@types/react': ^18.2.25 || ^19
+ react: ^18.0 || ^19
+ redux: ^5.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ redux:
+ optional: true
+
+ react-refresh@0.17.0:
+ resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==}
+ engines: {node: '>=0.10.0'}
+
+ react-router-dom@7.13.1:
+ resolution: {integrity: sha512-UJnV3Rxc5TgUPJt2KJpo1Jpy0OKQr0AjgbZzBFjaPJcFOb2Y8jA5H3LT8HUJAiRLlWrEXWHbF1Z4SCZaQjWDHw==}
+ engines: {node: '>=20.0.0'}
+ peerDependencies:
+ react: '>=18'
+ react-dom: '>=18'
+
+ react-router-use-location-state@3.1.2:
+ resolution: {integrity: sha512-qtpp9cPRxU2rPBt9EByzyvQ8XIUOA8kM94VuO4OZnio1HZlO0ANWfY8puYBT5Z/gKuycCK0/gqcxF94hF15nwQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.2 || ^18.0.0
+ react-router: ^6.0.2
+
+ react-router@7.13.1:
+ resolution: {integrity: sha512-td+xP4X2/6BJvZoX6xw++A2DdEi++YypA69bJUV5oVvqf6/9/9nNlD70YO1e9d3MyamJEBQFEzk6mbfDYbqrSA==}
+ engines: {node: '>=20.0.0'}
+ peerDependencies:
+ react: '>=18'
+ react-dom: '>=18'
+ peerDependenciesMeta:
+ react-dom:
+ optional: true
+
+ react-side-effect@2.1.2:
+ resolution: {integrity: sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==}
+ peerDependencies:
+ react: ^16.3.0 || ^17.0.0 || ^18.0.0
+
+ react-smooth@4.0.4:
+ resolution: {integrity: sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==}
+ 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
+
+ react-syntax-highlighter@15.6.6:
+ resolution: {integrity: sha512-DgXrc+AZF47+HvAPEmn7Ua/1p10jNoVZVI/LoPiYdtY+OM+/nG5yefLHKJwdKqY1adMuHFbeyBaG9j64ML7vTw==}
+ peerDependencies:
+ react: '>= 0.14.0'
+
+ react-syntax-highlighter@16.1.1:
+ resolution: {integrity: sha512-PjVawBGy80C6YbC5DDZJeUjBmC7skaoEUdvfFQediQHgCL7aKyVHe57SaJGfQsloGDac+gCpTfRdtxzWWKmCXA==}
+ engines: {node: '>= 16.20.2'}
+ peerDependencies:
+ react: '>= 0.14.0'
+
+ react-transition-group@4.4.5:
+ resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==}
+ peerDependencies:
+ react: '>=16.6.0'
+ react-dom: '>=16.6.0'
+
+ react-use-gesture@8.0.1:
+ resolution: {integrity: sha512-CXzUNkulUdgouaAlvAsC5ZVo0fi9KGSBSk81WrE4kOIcJccpANe9zZkAYr5YZZhqpicIFxitsrGVS4wmoMun9A==}
+ deprecated: This package is no longer maintained. Please use @use-gesture/react instead
+ peerDependencies:
+ react: '>= 16.8.0'
+
+ react-vis-timeline@2.0.3:
+ resolution: {integrity: sha512-ltU3ZH005hErhe6tTU6/QAyIGLJwkka8sK5at/xyLLh/y3ZbJGaqmzFPcal1+zkEtGJe2JL0EUGLSGzNFkhPBQ==}
+ peerDependencies:
+ lodash: ^4.17.15
+ moment: ^2.25
+ react: ^0.14 || ^15.0 || ^16.0
+ react-dom: ^0.14 || ^15.0 || ^16.0
+
+ react@18.3.1:
+ resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
+ engines: {node: '>=0.10.0'}
+
+ readdirp@4.1.2:
+ resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
+ engines: {node: '>= 14.18.0'}
+
+ reaflow@5.1.2:
+ resolution: {integrity: sha512-8DctXn+sudiITeOmr5/AbALjVe3IBOzCvKdT9VZydXxMp0xbJiWBKiO8duFktPnYL293zOBTmgLjm7CcJXG32w==}
+ peerDependencies:
+ react: '>=16'
+ react-dom: '>=16'
+
+ reakeys@1.3.1:
+ resolution: {integrity: sha512-k75rJxIiNtA9B6a9ijgj3n7CJKhdY9hctFzac5IBnMKEzk5RpwHtOZON1xqP9fQQAscpa922lbkUMW8q94M0fg==}
+ peerDependencies:
+ react: '>=16'
+ react-dom: '>=16'
+
+ recharts-scale@0.4.5:
+ resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==}
+
+ recharts@2.15.4:
+ resolution: {integrity: sha512-UT/q6fwS3c1dHbXv2uFgYJ9BMFHu3fwnd7AYZaEQhXuYQ4hgsxLvsUXzGdKeZrW5xopzDCvuA2N41WJ88I7zIw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ redent@3.0.0:
+ resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
+ engines: {node: '>=8'}
+
+ redux-immutable@4.0.0:
+ resolution: {integrity: sha512-SchSn/DWfGb3oAejd+1hhHx01xUoxY+V7TeK0BKqpkLKiQPVFf7DYzEaKmrEVxsWxielKfSK9/Xq66YyxgR1cg==}
+ peerDependencies:
+ immutable: ^3.8.1 || ^4.0.0-rc.1
+
+ redux@5.0.1:
+ resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==}
+
+ reflect.getprototypeof@1.0.10:
+ resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
+ engines: {node: '>= 0.4'}
+
+ refractor@3.6.0:
+ resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==}
+
+ refractor@5.0.0:
+ resolution: {integrity: sha512-QXOrHQF5jOpjjLfiNk5GFnWhRXvxjUVnlFxkeDmewR5sXkr3iM46Zo+CnRR8B+MDVqkULW4EcLVcRBNOPXHosw==}
+
+ regexp.prototype.flags@1.5.4:
+ resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
+ engines: {node: '>= 0.4'}
+
+ remark-directive@3.0.1:
+ resolution: {integrity: sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==}
+
+ remark-gfm@4.0.1:
+ resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==}
+
+ remark-parse@11.0.0:
+ resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==}
+
+ remark-rehype@11.1.2:
+ resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==}
+
+ remark-stringify@11.0.0:
+ resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==}
+
+ remarkable@2.0.1:
+ resolution: {integrity: sha512-YJyMcOH5lrR+kZdmB0aJJ4+93bEojRZ1HGDn9Eagu6ibg7aVZhc3OWbbShRid+Q5eAfsEqWxpe+g5W5nYNfNiA==}
+ engines: {node: '>= 6.0.0'}
+ hasBin: true
+
+ remove-accents@0.4.4:
+ resolution: {integrity: sha512-EpFcOa/ISetVHEXqu+VwI96KZBmq+a8LJnGkaeFw45epGlxIZz5dhEEnNZMsQXgORu3qaMoLX4qJCzOik6ytAg==}
+
+ remove-accents@0.5.0:
+ resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==}
+
+ repeat-string@1.6.1:
+ resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==}
+ engines: {node: '>=0.10'}
+
+ require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+
+ requires-port@1.0.0:
+ resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
+
+ reselect@5.1.1:
+ resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==}
+
+ resize-observer-lite@0.2.3:
+ resolution: {integrity: sha512-k/p+pjCTQkQ7x94bWsxcVwEJI5SrcO95j7czrCKMpHjXFQ+HmKRGLTdAkZoL3+wG1Pe/4L9Sl652zy9lU54dFg==}
+
+ resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+
+ resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
+ resolve@1.22.11:
+ resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==}
+ engines: {node: '>= 0.4'}
+ hasBin: true
+
+ ret@0.2.2:
+ resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==}
+ engines: {node: '>=4'}
+
+ rimraf@3.0.2:
+ resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+ deprecated: Rimraf versions prior to v4 are no longer supported
+ hasBin: true
+
+ rollup@4.59.0:
+ resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ rrweb-cssom@0.8.0:
+ resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==}
+
+ safe-array-concat@1.1.3:
+ resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
+ engines: {node: '>=0.4'}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ safe-push-apply@1.0.0:
+ resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
+ engines: {node: '>= 0.4'}
+
+ safe-regex-test@1.1.0:
+ resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
+ engines: {node: '>= 0.4'}
+
+ safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+ sass@1.97.3:
+ resolution: {integrity: sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+
+ saxes@6.0.0:
+ resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
+ engines: {node: '>=v12.22.7'}
+
+ scheduler@0.23.2:
+ resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
+
+ select@1.1.2:
+ resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==}
+
+ semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
+ semver@7.5.4:
+ resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ semver@7.7.4:
+ resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ serialize-error@8.1.0:
+ resolution: {integrity: sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==}
+ engines: {node: '>=10'}
+
+ set-cookie-parser@2.7.2:
+ resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==}
+
+ set-function-length@1.2.2:
+ resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+ engines: {node: '>= 0.4'}
+
+ set-function-name@2.0.2:
+ resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
+ engines: {node: '>= 0.4'}
+
+ set-proto@1.0.0:
+ resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
+ engines: {node: '>= 0.4'}
+
+ sha.js@2.4.12:
+ resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==}
+ engines: {node: '>= 0.10'}
+ hasBin: true
+
+ shallowequal@1.1.0:
+ resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==}
+
+ sharp@0.34.5:
+ resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ short-unique-id@5.3.2:
+ resolution: {integrity: sha512-KRT/hufMSxXKEDSQujfVE0Faa/kZ51ihUcZQAcmP04t00DvPj7Ox5anHke1sJYUtzSuiT/Y5uyzg/W7bBEGhCg==}
+ hasBin: true
+
+ side-channel-list@1.0.0:
+ resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-map@1.0.1:
+ resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-weakmap@1.0.2:
+ resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+ engines: {node: '>= 0.4'}
+
+ side-channel@1.1.0:
+ resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
+ engines: {node: '>= 0.4'}
+
+ siginfo@2.0.0:
+ resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
+
+ simple-swizzle@0.2.4:
+ resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==}
+
+ snake-case@3.0.4:
+ resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==}
+
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.5.7:
+ resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ space-separated-tokens@1.1.5:
+ resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==}
+
+ space-separated-tokens@2.0.2:
+ resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
+
+ sprintf-js@1.0.3:
+ resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+
+ stable-hash@0.0.5:
+ resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==}
+
+ stackback@0.0.2:
+ resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
+
+ state-local@1.0.7:
+ resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==}
+
+ std-env@3.10.0:
+ resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==}
+
+ stop-iteration-iterator@1.1.0:
+ resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
+ engines: {node: '>= 0.4'}
+
+ string-argv@0.3.2:
+ resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
+ engines: {node: '>=0.6.19'}
+
+ string-ts@2.3.1:
+ resolution: {integrity: sha512-xSJq+BS52SaFFAVxuStmx6n5aYZU571uYUnUrPXkPFCfdHyZMMlbP2v2Wx5sNBnAVzq/2+0+mcBLBa3Xa5ubYw==}
+
+ string.prototype.trim@1.2.10:
+ resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.trimend@1.0.9:
+ resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.trimstart@1.0.8:
+ resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+ engines: {node: '>= 0.4'}
+
+ stringify-entities@4.0.4:
+ resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
+
+ strip-bom@3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+ engines: {node: '>=4'}
+
+ strip-indent@3.0.0:
+ resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
+ engines: {node: '>=8'}
+
+ strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+
+ strip-literal@3.1.0:
+ resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==}
+
+ style-to-js@1.1.21:
+ resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==}
+
+ style-to-object@1.0.14:
+ resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==}
+
+ styled-components@5.3.11:
+ resolution: {integrity: sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ react: '>= 16.8.0'
+ react-dom: '>= 16.8.0'
+ react-is: '>= 16.8.0'
+
+ styled-jsx@5.1.6:
+ resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==}
+ engines: {node: '>= 12.0.0'}
+ peerDependencies:
+ '@babel/core': '*'
+ babel-plugin-macros: '*'
+ react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0'
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+ babel-plugin-macros:
+ optional: true
+
+ stylis@4.2.0:
+ resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==}
+
+ supports-color@5.5.0:
+ resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+ engines: {node: '>=4'}
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
+ supports-color@8.1.1:
+ resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+ engines: {node: '>=10'}
+
+ supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+
+ svg-parser@2.0.4:
+ resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==}
+
+ swagger-client@3.37.0:
+ resolution: {integrity: sha512-pzU+B+DkUbrSwlj4/E8sGeP1w84/CFgDJAt80fHu650TxnOHbqFLGQjiE6luvpRxTPdfK2zRHJP7I6CgUkI8yA==}
+
+ swagger-ui-react@5.32.0:
+ resolution: {integrity: sha512-2mmrtvfp0EA90pdT8qXTMu26ex03TG2bsjvDAwXhdfCm+9foyadYJN+nEvDHM6/c6/xtXbdAsb6cVxBvbltnpw==}
+ peerDependencies:
+ react: '>=16.8.0 <20'
+ react-dom: '>=16.8.0 <20'
+
+ symbol-tree@3.2.4:
+ resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
+
+ tabbable@6.4.0:
+ resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==}
+
+ tape@4.17.0:
+ resolution: {integrity: sha512-KCuXjYxCZ3ru40dmND+oCLsXyuA8hoseu2SS404Px5ouyS0A99v8X/mdiLqsR5MTAyamMBN7PRwt2Dv3+xGIxw==}
+ hasBin: true
+
+ text-encoding@0.7.0:
+ resolution: {integrity: sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==}
+ deprecated: no longer maintained
+
+ tiny-case@1.0.3:
+ resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==}
+
+ tiny-emitter@1.1.0:
+ resolution: {integrity: sha512-HFhr+OKGIHRO6krgzEt9MqbMO98wPDzDPr1BOpM/nZCChkK40UYn8b70nSjcan4jTzDSQecy1KRVVQRohIRWrw==}
+
+ tiny-emitter@2.1.0:
+ resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==}
+
+ tiny-invariant@1.3.3:
+ resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
+
+ tinybench@2.9.0:
+ resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
+
+ tinyexec@0.3.2:
+ resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
+
+ tinyglobby@0.2.15:
+ resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
+ engines: {node: '>=12.0.0'}
+
+ tinypool@1.1.1:
+ resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+
+ tinyrainbow@2.0.0:
+ resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==}
+ engines: {node: '>=14.0.0'}
+
+ tinyspy@4.0.4:
+ resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==}
+ engines: {node: '>=14.0.0'}
+
+ tldts-core@6.1.86:
+ resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==}
+
+ tldts@6.1.86:
+ resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==}
+ hasBin: true
+
+ to-buffer@1.2.2:
+ resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==}
+ engines: {node: '>= 0.4'}
+
+ toggle-selection@1.0.6:
+ resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==}
+
+ toposort@2.0.2:
+ resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==}
+
+ tough-cookie@5.1.2:
+ resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==}
+ engines: {node: '>=16'}
+
+ tr46@0.0.3:
+ resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+
+ tr46@5.1.1:
+ resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==}
+ engines: {node: '>=18'}
+
+ tree-sitter-json@0.24.8:
+ resolution: {integrity: sha512-Tc9ZZYwHyWZ3Tt1VEw7Pa2scu1YO7/d2BCBbKTx5hXwig3UfdQjsOPkPyLpDJOn/m1UBEWYAtSdGAwCSyagBqQ==}
+ peerDependencies:
+ tree-sitter: ^0.21.1
+ peerDependenciesMeta:
+ tree-sitter:
+ optional: true
+
+ tree-sitter@0.21.1:
+ resolution: {integrity: sha512-7dxoA6kYvtgWw80265MyqJlkRl4yawIjO7S5MigytjELkX43fV2WsAXzsNfO7sBpPPCF5Gp0+XzHk0DwLCq3xQ==}
+
+ tree-sitter@0.22.4:
+ resolution: {integrity: sha512-usbHZP9/oxNsUY65MQUsduGRqDHQOou1cagUSwjhoSYAmSahjQDAVsh9s+SlZkn8X8+O1FULRGwHu7AFP3kjzg==}
+
+ trim-lines@3.0.1:
+ resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
+
+ trough@2.2.0:
+ resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
+
+ ts-api-utils@2.4.0:
+ resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==}
+ engines: {node: '>=18.12'}
+ peerDependencies:
+ typescript: '>=4.8.4'
+
+ ts-declaration-location@1.0.7:
+ resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==}
+ peerDependencies:
+ typescript: '>=4.0.0'
+
+ ts-key-enum@2.0.13:
+ resolution: {integrity: sha512-zixs6j8+NhzazLUQ1SiFrlo1EFWG/DbqLuUGcWWZ5zhwjRT7kbi1hBlofxdqel+h28zrby2It5TrOyKp04kvqw==}
+
+ ts-mixer@6.0.4:
+ resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==}
+
+ ts-pattern@5.9.0:
+ resolution: {integrity: sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==}
+
+ ts-toolbelt@9.6.0:
+ resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==}
+
+ tsconfck@3.1.6:
+ resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==}
+ engines: {node: ^18 || >=20}
+ hasBin: true
+ peerDependencies:
+ typescript: ^5.0.0
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ tsconfig-paths@3.15.0:
+ resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
+
+ tslib@2.4.0:
+ resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==}
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ tween-functions@1.2.0:
+ resolution: {integrity: sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==}
+
+ type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+
+ type-fest@0.20.2:
+ resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
+ engines: {node: '>=10'}
+
+ type-fest@2.19.0:
+ resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
+ engines: {node: '>=12.20'}
+
+ typed-array-buffer@1.0.3:
+ resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-byte-length@1.0.3:
+ resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-byte-offset@1.0.4:
+ resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-length@1.0.7:
+ resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
+ engines: {node: '>= 0.4'}
+
+ types-ramda@0.30.1:
+ resolution: {integrity: sha512-1HTsf5/QVRmLzcGfldPFvkVsAdi1db1BBKzi7iW3KBUlOICg/nKnFS+jGqDJS3YD8VsWbAh7JiHeBvbsw8RPxA==}
+
+ typescript-eslint@8.57.0:
+ resolution: {integrity: sha512-W8GcigEMEeB07xEZol8oJ26rigm3+bfPHxHvwbYUlu1fUDsGuQ7Hiskx5xGW/xM4USc9Ephe3jtv7ZYPQntHeA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ typescript@5.8.2:
+ resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ typescript@5.9.3:
+ resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ u2f-api-polyfill@0.4.3:
+ resolution: {integrity: sha512-0DVykdzG3tKft2GciQCGzgO8BinDEfIhTBo7FKbLBmA+sVTPYmNOFbsZuduYQmnc3+ykUadTHNqXVqnvBfLCvg==}
+
+ ufo@1.6.3:
+ resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==}
+
+ uglify-js@3.19.3:
+ resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==}
+ engines: {node: '>=0.8.0'}
+ hasBin: true
+
+ unbox-primitive@1.1.0:
+ resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
+ engines: {node: '>= 0.4'}
+
+ underscore@1.13.1:
+ resolution: {integrity: sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==}
+
+ undici-types@7.16.0:
+ resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
+
+ undici@7.22.0:
+ resolution: {integrity: sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==}
+ engines: {node: '>=20.18.1'}
+
+ undoo@0.5.0:
+ resolution: {integrity: sha512-SPlDcde+AUHoFKeVlH2uBJxqVkw658I4WR2rPoygC1eRCzm3GeoP8S6xXZVJeBVOQQid8X2xUBW0N4tOvvHH3Q==}
+
+ unfetch@4.2.0:
+ resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==}
+
+ unified@11.0.5:
+ resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
+
+ unist-util-is@6.0.1:
+ resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==}
+
+ unist-util-position@5.0.0:
+ resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
+
+ unist-util-stringify-position@4.0.0:
+ resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
+
+ unist-util-visit-parents@6.0.2:
+ resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==}
+
+ unist-util-visit@5.1.0:
+ resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==}
+
+ universalify@2.0.1:
+ resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+ engines: {node: '>= 10.0.0'}
+
+ unload@2.2.0:
+ resolution: {integrity: sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==}
+
+ unload@2.3.1:
+ resolution: {integrity: sha512-MUZEiDqvAN9AIDRbbBnVYVvfcR6DrjCqeU2YQMmliFZl9uaBUjTkhuDQkBiyAy8ad5bx1TXVbqZ3gg7namsWjA==}
+
+ unraw@3.0.0:
+ resolution: {integrity: sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg==}
+
+ unrs-resolver@1.11.1:
+ resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==}
+
+ update-browserslist-db@1.2.3:
+ resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+ url-parse@1.5.10:
+ resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
+
+ use-isomorphic-layout-effect@1.2.1:
+ resolution: {integrity: sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ use-location-state@3.1.2:
+ resolution: {integrity: sha512-zHZMRkFhswmMuEnSaqYKfTT13i7WIPJWyVGt+/wiVW8lna5MaLIq0uV9+oG5ZJ+oG1BooO0NsE2lJHJfzbfZpA==}
+ peerDependencies:
+ '@types/react': ^16.8.0 || ^17.0.2 || ^18.0.0
+ next: '*'
+ react: ^16.8.0 || ^17.0.2 || ^18.0.0
+
+ use-sync-external-store@1.6.0:
+ resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ uuid@7.0.3:
+ resolution: {integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==}
+ hasBin: true
+
+ uuid@8.3.2:
+ resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
+ hasBin: true
+
+ vfile-message@4.0.3:
+ resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==}
+
+ vfile@6.0.3:
+ resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
+
+ victory-vendor@36.9.2:
+ resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==}
+
+ vis-data@6.6.1:
+ resolution: {integrity: sha512-xmujDB2Dzf8T04rGFJ9OP4OA6zRVrz8R9hb0CVKryBrZRCljCga9JjSfgctA8S7wdZu7otDtUIwX4ZOgfV/57w==}
+ peerDependencies:
+ moment: ^2.24.0
+ uuid: ^7.0.0 || ^8.0.0
+ vis-util: ^4.0.0
+
+ vis-timeline@7.3.6:
+ resolution: {integrity: sha512-ddmAvHWGcIwIn7tTgR/5h2cNXbPtfRR5MWyO1njJYZTAo9fh+2WjnrV3K05qHLBH0gCQTXvO3ue/DeLPEl7dkw==}
+ peerDependencies:
+ '@egjs/hammerjs': ^2.0.0
+ component-emitter: ^1.3.0
+ keycharm: ^0.3.0
+ moment: ^2.24.0
+ propagating-hammerjs: ^1.4.0
+ uuid: ^3.4.0 || ^7.0.0
+ vis-data: ^6.3.0
+ vis-util: ^3.0.0 || ^4.0.0
+
+ vis-util@4.3.4:
+ resolution: {integrity: sha512-hJIZNrwf4ML7FYjs+m+zjJfaNvhjk3/1hbMdQZVnwwpOFJS/8dMG8rdbOHXcKoIEM6U5VOh3HNpaDXxGkOZGpw==}
+ engines: {node: '>=8'}
+
+ vite-node@3.2.4:
+ resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ hasBin: true
+
+ vite-plugin-dts@4.5.4:
+ resolution: {integrity: sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==}
+ peerDependencies:
+ typescript: '*'
+ vite: '*'
+ peerDependenciesMeta:
+ vite:
+ optional: true
+
+ vite-plugin-svgr@4.5.0:
+ resolution: {integrity: sha512-W+uoSpmVkSmNOGPSsDCWVW/DDAyv+9fap9AZXBvWiQqrboJ08j2vh0tFxTD/LjwqwAd3yYSVJgm54S/1GhbdnA==}
+ peerDependencies:
+ vite: '>=2.6.0'
+
+ vite-tsconfig-paths@5.1.4:
+ resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==}
+ peerDependencies:
+ vite: '*'
+ peerDependenciesMeta:
+ vite:
+ optional: true
+
+ vite@7.3.1:
+ resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+ 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
+
+ vitest@3.2.4:
+ resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ hasBin: true
+ peerDependencies:
+ '@edge-runtime/vm': '*'
+ '@types/debug': ^4.1.12
+ '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
+ '@vitest/browser': 3.2.4
+ '@vitest/ui': 3.2.4
+ 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
+
+ vscode-uri@3.1.0:
+ resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==}
+
+ w3c-xmlserializer@5.0.0:
+ resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
+ engines: {node: '>=18'}
+
+ web-streams-polyfill@3.3.3:
+ resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
+ engines: {node: '>= 8'}
+
+ web-tree-sitter@0.24.5:
+ resolution: {integrity: sha512-+J/2VSHN8J47gQUAvF8KDadrfz6uFYVjxoxbKWDoXVsH2u7yLdarCnIURnrMA6uSRkgX3SdmqM5BOoQjPdSh5w==}
+
+ webcrypto-core@1.8.1:
+ resolution: {integrity: sha512-P+x1MvlNCXlKbLSOY4cYrdreqPG5hbzkmawbcXLKN/mf6DZW0SdNNkZ+sjwsqVkI4A4Ko2sPZmkZtCKY58w83A==}
+
+ webcrypto-shim@0.1.7:
+ resolution: {integrity: sha512-JAvAQR5mRNRxZW2jKigWMjCMkjSdmP5cColRP1U/pTg69VgHXEi1orv5vVpJ55Zc5MIaPc1aaurzd9pjv2bveg==}
+
+ webidl-conversions@3.0.1:
+ resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+
+ webidl-conversions@7.0.0:
+ resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
+ engines: {node: '>=12'}
+
+ whatwg-encoding@3.1.1:
+ resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
+ engines: {node: '>=18'}
+ deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation
+
+ whatwg-mimetype@4.0.0:
+ resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
+ engines: {node: '>=18'}
+
+ whatwg-url@14.2.0:
+ resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==}
+ engines: {node: '>=18'}
+
+ whatwg-url@5.0.0:
+ resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+
+ which-boxed-primitive@1.1.1:
+ resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
+ engines: {node: '>= 0.4'}
+
+ which-builtin-type@1.2.1:
+ resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==}
+ engines: {node: '>= 0.4'}
+
+ which-collection@1.0.2:
+ resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
+ engines: {node: '>= 0.4'}
+
+ which-typed-array@1.1.20:
+ resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==}
+ engines: {node: '>= 0.4'}
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ why-is-node-running@2.3.0:
+ resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
+ engines: {node: '>=8'}
+ hasBin: true
+
+ word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
+
+ wordwrap@1.0.0:
+ resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==}
+
+ wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ ws@8.19.0:
+ resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: '>=5.0.2'
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+
+ xhr2@0.1.3:
+ resolution: {integrity: sha512-6RmGK22QwC7yXB1CRwyLWuS2opPcKOlAu0ViAnyZjDlzrEmCKL4kLHkfvB8oMRWeztMsNoDGAjsMZY15w/4tTw==}
+ engines: {node: '>= 0.6'}
+
+ xml-but-prettier@1.0.1:
+ resolution: {integrity: sha512-C2CJaadHrZTqESlH03WOyw0oZTtoy2uEg6dSDF6YRg+9GnYNub53RRemLpnvtbHDFelxMx4LajiFsYeR6XJHgQ==}
+
+ xml-name-validator@5.0.0:
+ resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==}
+ engines: {node: '>=18'}
+
+ xml@1.0.1:
+ resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==}
+
+ xmlchars@2.2.0:
+ resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
+
+ xstate@4.38.3:
+ resolution: {integrity: sha512-SH7nAaaPQx57dx6qvfcIgqKRXIh4L0A1iYEqim4s1u7c9VoCgzZc+63FY90AKU4ZzOC2cfJzTnpO4zK7fCUzzw==}
+
+ xtend@4.0.2:
+ resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
+ engines: {node: '>=0.4'}
+
+ yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+ yallist@4.0.0:
+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+
+ yaml@1.10.2:
+ resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
+ engines: {node: '>= 6'}
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+
+ yup@1.7.1:
+ resolution: {integrity: sha512-GKHFX2nXul2/4Dtfxhozv701jLQHdf6J34YDh2cEkpqoo8le5Mg6/LrdseVLrFarmFygZTlfIhHx/QKfb/QWXw==}
+
+ zenscroll@4.0.2:
+ resolution: {integrity: sha512-jEA1znR7b4C/NnaycInCU6h/d15ZzCd1jmsruqOKnZP6WXQSMH3W2GL+OXbkruslU4h+Tzuos0HdswzRUk/Vgg==}
+
+ zod@4.3.6:
+ resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==}
+
+ zwitch@2.0.4:
+ resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
+
+snapshots:
+
+ '@adobe/css-tools@4.4.4': {}
+
+ '@asamuzakjp/css-color@3.2.0':
+ dependencies:
+ '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
+ '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
+ '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
+ '@csstools/css-tokenizer': 3.0.4
+ lru-cache: 10.4.3
+
+ '@auth0/auth0-react@1.12.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@auth0/auth0-spa-js': 1.22.6
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ '@auth0/auth0-spa-js@1.22.6':
+ dependencies:
+ abortcontroller-polyfill: 1.7.8
+ browser-tabs-lock: 1.3.0
+ core-js: 3.48.0
+ es-cookie: 1.3.2
+ fast-text-encoding: 1.0.6
+ promise-polyfill: 8.3.0
+ unfetch: 4.2.0
+
+ '@babel/code-frame@7.29.0':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.28.5
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
+ '@babel/compat-data@7.29.0': {}
+
+ '@babel/core@7.29.0':
+ dependencies:
+ '@babel/code-frame': 7.29.0
+ '@babel/generator': 7.29.1
+ '@babel/helper-compilation-targets': 7.28.6
+ '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0)
+ '@babel/helpers': 7.28.6
+ '@babel/parser': 7.29.0
+ '@babel/template': 7.28.6
+ '@babel/traverse': 7.29.0(supports-color@5.5.0)
+ '@babel/types': 7.29.0
+ '@jridgewell/remapping': 2.3.5
+ convert-source-map: 2.0.0
+ debug: 4.4.3(supports-color@5.5.0)
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/generator@7.29.1':
+ dependencies:
+ '@babel/parser': 7.29.0
+ '@babel/types': 7.29.0
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ jsesc: 3.1.0
+
+ '@babel/helper-annotate-as-pure@7.27.3':
+ dependencies:
+ '@babel/types': 7.29.0
+
+ '@babel/helper-compilation-targets@7.28.6':
+ dependencies:
+ '@babel/compat-data': 7.29.0
+ '@babel/helper-validator-option': 7.27.1
+ browserslist: 4.28.1
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ '@babel/helper-globals@7.28.0': {}
+
+ '@babel/helper-module-imports@7.28.6(supports-color@5.5.0)':
+ dependencies:
+ '@babel/traverse': 7.29.0(supports-color@5.5.0)
+ '@babel/types': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-module-imports': 7.28.6(supports-color@5.5.0)
+ '@babel/helper-validator-identifier': 7.28.5
+ '@babel/traverse': 7.29.0(supports-color@5.5.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-plugin-utils@7.28.6': {}
+
+ '@babel/helper-string-parser@7.27.1': {}
+
+ '@babel/helper-validator-identifier@7.28.5': {}
+
+ '@babel/helper-validator-option@7.27.1': {}
+
+ '@babel/helpers@7.28.6':
+ dependencies:
+ '@babel/template': 7.28.6
+ '@babel/types': 7.29.0
+
+ '@babel/parser@7.29.0':
+ dependencies:
+ '@babel/types': 7.29.0
+
+ '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/runtime-corejs3@7.29.0':
+ dependencies:
+ core-js-pure: 3.48.0
+
+ '@babel/runtime@7.28.6': {}
+
+ '@babel/template@7.28.6':
+ dependencies:
+ '@babel/code-frame': 7.29.0
+ '@babel/parser': 7.29.0
+ '@babel/types': 7.29.0
+
+ '@babel/traverse@7.29.0(supports-color@5.5.0)':
+ dependencies:
+ '@babel/code-frame': 7.29.0
+ '@babel/generator': 7.29.1
+ '@babel/helper-globals': 7.28.0
+ '@babel/parser': 7.29.0
+ '@babel/template': 7.28.6
+ '@babel/types': 7.29.0
+ debug: 4.4.3(supports-color@5.5.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/types@7.29.0':
+ dependencies:
+ '@babel/helper-string-parser': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+
+ '@csstools/color-helpers@5.1.0': {}
+
+ '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)':
+ dependencies:
+ '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
+ '@csstools/css-tokenizer': 3.0.4
+
+ '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)':
+ dependencies:
+ '@csstools/color-helpers': 5.1.0
+ '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
+ '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
+ '@csstools/css-tokenizer': 3.0.4
+
+ '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)':
+ dependencies:
+ '@csstools/css-tokenizer': 3.0.4
+
+ '@csstools/css-tokenizer@3.0.4': {}
+
+ '@datasert/cronjs-matcher@1.4.0':
+ dependencies:
+ '@datasert/cronjs-parser': 1.4.0
+ luxon: 3.7.2
+
+ '@datasert/cronjs-parser@1.4.0': {}
+
+ '@date-io/core@3.2.0': {}
+
+ '@date-io/dayjs@3.2.0(dayjs@1.10.7)':
+ dependencies:
+ '@date-io/core': 3.2.0
+ optionalDependencies:
+ dayjs: 1.10.7
+
+ '@dnd-kit/accessibility@3.1.1(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ tslib: 2.8.1
+
+ '@dnd-kit/core@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@dnd-kit/accessibility': 3.1.1(react@18.3.1)
+ '@dnd-kit/utilities': 3.2.2(react@18.3.1)
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ tslib: 2.8.1
+
+ '@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@dnd-kit/core': 6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@dnd-kit/utilities': 3.2.2(react@18.3.1)
+ react: 18.3.1
+ tslib: 2.8.1
+
+ '@dnd-kit/utilities@3.2.2(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ tslib: 2.8.1
+
+ '@egjs/hammerjs@2.0.17':
+ dependencies:
+ '@types/hammerjs': 2.0.46
+
+ '@emnapi/core@1.8.1':
+ dependencies:
+ '@emnapi/wasi-threads': 1.1.0
+ tslib: 2.8.1
+ optional: true
+
+ '@emnapi/runtime@1.8.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@emnapi/wasi-threads@1.1.0':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@emotion/babel-plugin@11.13.5':
+ dependencies:
+ '@babel/helper-module-imports': 7.28.6(supports-color@5.5.0)
+ '@babel/runtime': 7.28.6
+ '@emotion/hash': 0.9.2
+ '@emotion/memoize': 0.9.0
+ '@emotion/serialize': 1.3.3
+ babel-plugin-macros: 3.1.0
+ convert-source-map: 1.9.0
+ escape-string-regexp: 4.0.0
+ find-root: 1.1.0
+ source-map: 0.5.7
+ stylis: 4.2.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@emotion/cache@11.14.0':
+ dependencies:
+ '@emotion/memoize': 0.9.0
+ '@emotion/sheet': 1.4.0
+ '@emotion/utils': 1.4.2
+ '@emotion/weak-memoize': 0.4.0
+ stylis: 4.2.0
+
+ '@emotion/hash@0.9.2': {}
+
+ '@emotion/is-prop-valid@0.8.8':
+ dependencies:
+ '@emotion/memoize': 0.7.4
+ optional: true
+
+ '@emotion/is-prop-valid@1.4.0':
+ dependencies:
+ '@emotion/memoize': 0.9.0
+
+ '@emotion/memoize@0.7.4':
+ optional: true
+
+ '@emotion/memoize@0.9.0': {}
+
+ '@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.28.6
+ '@emotion/babel-plugin': 11.13.5
+ '@emotion/cache': 11.14.0
+ '@emotion/serialize': 1.3.3
+ '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1)
+ '@emotion/utils': 1.4.2
+ '@emotion/weak-memoize': 0.4.0
+ hoist-non-react-statics: 3.3.2
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.28
+ transitivePeerDependencies:
+ - supports-color
+
+ '@emotion/serialize@1.3.3':
+ dependencies:
+ '@emotion/hash': 0.9.2
+ '@emotion/memoize': 0.9.0
+ '@emotion/unitless': 0.10.0
+ '@emotion/utils': 1.4.2
+ csstype: 3.2.3
+
+ '@emotion/sheet@1.4.0': {}
+
+ '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.28.6
+ '@emotion/babel-plugin': 11.13.5
+ '@emotion/is-prop-valid': 1.4.0
+ '@emotion/react': 11.14.0(@types/react@18.3.28)(react@18.3.1)
+ '@emotion/serialize': 1.3.3
+ '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1)
+ '@emotion/utils': 1.4.2
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.28
+ transitivePeerDependencies:
+ - supports-color
+
+ '@emotion/stylis@0.8.5': {}
+
+ '@emotion/unitless@0.10.0': {}
+
+ '@emotion/unitless@0.7.5': {}
+
+ '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+
+ '@emotion/utils@1.4.2': {}
+
+ '@emotion/weak-memoize@0.4.0': {}
+
+ '@esbuild/aix-ppc64@0.27.3':
+ optional: true
+
+ '@esbuild/android-arm64@0.27.3':
+ optional: true
+
+ '@esbuild/android-arm@0.27.3':
+ optional: true
+
+ '@esbuild/android-x64@0.27.3':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.27.3':
+ optional: true
+
+ '@esbuild/darwin-x64@0.27.3':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.27.3':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.27.3':
+ optional: true
+
+ '@esbuild/linux-arm64@0.27.3':
+ optional: true
+
+ '@esbuild/linux-arm@0.27.3':
+ optional: true
+
+ '@esbuild/linux-ia32@0.27.3':
+ optional: true
+
+ '@esbuild/linux-loong64@0.27.3':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.27.3':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.27.3':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.27.3':
+ optional: true
+
+ '@esbuild/linux-s390x@0.27.3':
+ optional: true
+
+ '@esbuild/linux-x64@0.27.3':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.27.3':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.27.3':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.27.3':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.27.3':
+ optional: true
+
+ '@esbuild/openharmony-arm64@0.27.3':
+ optional: true
+
+ '@esbuild/sunos-x64@0.27.3':
+ optional: true
+
+ '@esbuild/win32-arm64@0.27.3':
+ optional: true
+
+ '@esbuild/win32-ia32@0.27.3':
+ optional: true
+
+ '@esbuild/win32-x64@0.27.3':
+ optional: true
+
+ '@eslint-community/eslint-utils@4.9.1(eslint@9.32.0)':
+ dependencies:
+ eslint: 9.32.0
+ eslint-visitor-keys: 3.4.3
+
+ '@eslint-community/regexpp@4.12.2': {}
+
+ '@eslint-react/ast@1.53.1(eslint@9.32.0)(typescript@5.9.3)':
+ dependencies:
+ '@eslint-react/eff': 1.53.1
+ '@typescript-eslint/types': 8.57.0
+ '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ string-ts: 2.3.1
+ ts-pattern: 5.9.0
+ transitivePeerDependencies:
+ - eslint
+ - supports-color
+ - typescript
+
+ '@eslint-react/core@1.53.1(eslint@9.32.0)(typescript@5.9.3)':
+ dependencies:
+ '@eslint-react/ast': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/eff': 1.53.1
+ '@eslint-react/kit': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/shared': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/var': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@typescript-eslint/scope-manager': 8.57.0
+ '@typescript-eslint/type-utils': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ '@typescript-eslint/types': 8.57.0
+ '@typescript-eslint/utils': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ birecord: 0.1.1
+ ts-pattern: 5.9.0
+ transitivePeerDependencies:
+ - eslint
+ - supports-color
+ - typescript
+
+ '@eslint-react/eff@1.53.1': {}
+
+ '@eslint-react/eslint-plugin@1.53.1(eslint@9.32.0)(ts-api-utils@2.4.0(typescript@5.9.3))(typescript@5.9.3)':
+ dependencies:
+ '@eslint-react/eff': 1.53.1
+ '@eslint-react/kit': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/shared': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@typescript-eslint/scope-manager': 8.57.0
+ '@typescript-eslint/type-utils': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ '@typescript-eslint/types': 8.57.0
+ '@typescript-eslint/utils': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ eslint: 9.32.0
+ eslint-plugin-react-debug: 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ eslint-plugin-react-dom: 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ eslint-plugin-react-hooks-extra: 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ eslint-plugin-react-naming-convention: 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ eslint-plugin-react-web-api: 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ eslint-plugin-react-x: 1.53.1(eslint@9.32.0)(ts-api-utils@2.4.0(typescript@5.9.3))(typescript@5.9.3)
+ optionalDependencies:
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+ - ts-api-utils
+
+ '@eslint-react/kit@1.53.1(eslint@9.32.0)(typescript@5.9.3)':
+ dependencies:
+ '@eslint-react/eff': 1.53.1
+ '@typescript-eslint/utils': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ ts-pattern: 5.9.0
+ zod: 4.3.6
+ transitivePeerDependencies:
+ - eslint
+ - supports-color
+ - typescript
+
+ '@eslint-react/shared@1.53.1(eslint@9.32.0)(typescript@5.9.3)':
+ dependencies:
+ '@eslint-react/eff': 1.53.1
+ '@eslint-react/kit': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ ts-pattern: 5.9.0
+ zod: 4.3.6
+ transitivePeerDependencies:
+ - eslint
+ - supports-color
+ - typescript
+
+ '@eslint-react/var@1.53.1(eslint@9.32.0)(typescript@5.9.3)':
+ dependencies:
+ '@eslint-react/ast': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/eff': 1.53.1
+ '@typescript-eslint/scope-manager': 8.57.0
+ '@typescript-eslint/types': 8.57.0
+ '@typescript-eslint/utils': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ string-ts: 2.3.1
+ ts-pattern: 5.9.0
+ transitivePeerDependencies:
+ - eslint
+ - supports-color
+ - typescript
+
+ '@eslint/config-array@0.21.2':
+ dependencies:
+ '@eslint/object-schema': 2.1.7
+ debug: 4.4.3(supports-color@5.5.0)
+ minimatch: 3.1.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/config-helpers@0.3.1': {}
+
+ '@eslint/core@0.15.2':
+ dependencies:
+ '@types/json-schema': 7.0.15
+
+ '@eslint/eslintrc@3.3.5':
+ dependencies:
+ ajv: 6.14.0
+ debug: 4.4.3(supports-color@5.5.0)
+ espree: 10.4.0
+ globals: 14.0.0
+ ignore: 5.3.2
+ import-fresh: 3.3.1
+ js-yaml: 4.1.1
+ minimatch: 3.1.5
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/js@9.32.0': {}
+
+ '@eslint/object-schema@2.1.7': {}
+
+ '@eslint/plugin-kit@0.3.5':
+ dependencies:
+ '@eslint/core': 0.15.2
+ levn: 0.4.1
+
+ '@floating-ui/core@1.7.5':
+ dependencies:
+ '@floating-ui/utils': 0.2.11
+
+ '@floating-ui/dom@1.7.6':
+ dependencies:
+ '@floating-ui/core': 1.7.5
+ '@floating-ui/utils': 0.2.11
+
+ '@floating-ui/react-dom@2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@floating-ui/dom': 1.7.6
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ '@floating-ui/react@0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@floating-ui/react-dom': 2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@floating-ui/utils': 0.2.11
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ tabbable: 6.4.0
+
+ '@floating-ui/utils@0.2.11': {}
+
+ '@growthbook/growthbook-react@1.6.5(react@18.3.1)':
+ dependencies:
+ '@growthbook/growthbook': 1.6.5
+ react: 18.3.1
+
+ '@growthbook/growthbook@1.6.5':
+ dependencies:
+ dom-mutator: 0.6.0
+
+ '@hookform/resolvers@5.2.2(react-hook-form@7.71.2(react@18.3.1))':
+ dependencies:
+ '@standard-schema/utils': 0.3.0
+ react-hook-form: 7.71.2(react@18.3.1)
+
+ '@humanfs/core@0.19.1': {}
+
+ '@humanfs/node@0.16.7':
+ dependencies:
+ '@humanfs/core': 0.19.1
+ '@humanwhocodes/retry': 0.4.3
+
+ '@humanwhocodes/module-importer@1.0.1': {}
+
+ '@humanwhocodes/retry@0.4.3': {}
+
+ '@img/colour@1.1.0':
+ optional: true
+
+ '@img/sharp-darwin-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-darwin-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-libvips-darwin-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-darwin-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-ppc64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-riscv64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-s390x@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-linux-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-arm@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-ppc64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-ppc64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-riscv64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-riscv64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-s390x@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-s390x': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-linuxmusl-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-linuxmusl-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-wasm32@0.34.5':
+ dependencies:
+ '@emnapi/runtime': 1.8.1
+ optional: true
+
+ '@img/sharp-win32-arm64@0.34.5':
+ optional: true
+
+ '@img/sharp-win32-ia32@0.34.5':
+ optional: true
+
+ '@img/sharp-win32-x64@0.34.5':
+ optional: true
+
+ '@io-orkes/conductor-javascript@2.4.1':
+ optionalDependencies:
+ undici: 7.22.0
+
+ '@jridgewell/gen-mapping@0.3.13':
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/remapping@2.3.5':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/sourcemap-codec@1.5.5': {}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ '@jsonforms/core@3.7.0':
+ dependencies:
+ '@types/json-schema': 7.0.15
+ ajv: 8.18.0
+ ajv-formats: 2.1.1(ajv@8.18.0)
+ lodash: 4.17.23
+
+ '@jsonforms/material-renderers@3.7.0(9e4c19b25267976d34663ea61a4c9150)':
+ dependencies:
+ '@date-io/dayjs': 3.2.0(dayjs@1.10.7)
+ '@emotion/react': 11.14.0(@types/react@18.3.28)(react@18.3.1)
+ '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1)
+ '@jsonforms/core': 3.7.0
+ '@jsonforms/react': 3.7.0(@jsonforms/core@3.7.0)(react@18.3.1)
+ '@mui/icons-material': 7.3.9(@mui/material@7.3.9(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.28)(react@18.3.1)
+ '@mui/material': 7.3.9(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@mui/x-date-pickers': 6.20.2(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@mui/material@7.3.9(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.9(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(date-fns@2.30.0)(dayjs@1.10.7)(luxon@3.7.2)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ dayjs: 1.10.7
+ lodash: 4.17.23
+ react: 18.3.1
+
+ '@jsonforms/react@3.7.0(@jsonforms/core@3.7.0)(react@18.3.1)':
+ dependencies:
+ '@jsonforms/core': 3.7.0
+ lodash: 4.17.23
+ react: 18.3.1
+
+ '@ljharb/resumer@0.0.1':
+ dependencies:
+ '@ljharb/through': 2.3.14
+
+ '@ljharb/through@2.3.14':
+ dependencies:
+ call-bind: 1.0.8
+
+ '@microsoft/api-extractor-model@7.33.4(@types/node@24.12.0)':
+ dependencies:
+ '@microsoft/tsdoc': 0.16.0
+ '@microsoft/tsdoc-config': 0.18.1
+ '@rushstack/node-core-library': 5.20.3(@types/node@24.12.0)
+ transitivePeerDependencies:
+ - '@types/node'
+
+ '@microsoft/api-extractor@7.57.7(@types/node@24.12.0)':
+ dependencies:
+ '@microsoft/api-extractor-model': 7.33.4(@types/node@24.12.0)
+ '@microsoft/tsdoc': 0.16.0
+ '@microsoft/tsdoc-config': 0.18.1
+ '@rushstack/node-core-library': 5.20.3(@types/node@24.12.0)
+ '@rushstack/rig-package': 0.7.2
+ '@rushstack/terminal': 0.22.3(@types/node@24.12.0)
+ '@rushstack/ts-command-line': 5.3.3(@types/node@24.12.0)
+ diff: 8.0.3
+ lodash: 4.17.23
+ minimatch: 10.2.3
+ resolve: 1.22.11
+ semver: 7.5.4
+ source-map: 0.6.1
+ typescript: 5.8.2
+ transitivePeerDependencies:
+ - '@types/node'
+
+ '@microsoft/tsdoc-config@0.18.1':
+ dependencies:
+ '@microsoft/tsdoc': 0.16.0
+ ajv: 8.18.0
+ jju: 1.4.0
+ resolve: 1.22.11
+
+ '@microsoft/tsdoc@0.16.0': {}
+
+ '@monaco-editor/loader@1.7.0':
+ dependencies:
+ state-local: 1.0.7
+
+ '@monaco-editor/react@4.7.0(monaco-editor@0.55.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@monaco-editor/loader': 1.7.0
+ monaco-editor: 0.55.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ '@motionone/animation@10.18.0':
+ dependencies:
+ '@motionone/easing': 10.18.0
+ '@motionone/types': 10.17.1
+ '@motionone/utils': 10.18.0
+ tslib: 2.4.0
+
+ '@motionone/dom@10.18.0':
+ dependencies:
+ '@motionone/animation': 10.18.0
+ '@motionone/generators': 10.18.0
+ '@motionone/types': 10.17.1
+ '@motionone/utils': 10.18.0
+ hey-listen: 1.0.8
+ tslib: 2.4.0
+
+ '@motionone/easing@10.18.0':
+ dependencies:
+ '@motionone/utils': 10.18.0
+ tslib: 2.4.0
+
+ '@motionone/generators@10.18.0':
+ dependencies:
+ '@motionone/types': 10.17.1
+ '@motionone/utils': 10.18.0
+ tslib: 2.4.0
+
+ '@motionone/types@10.17.1': {}
+
+ '@motionone/utils@10.18.0':
+ dependencies:
+ '@motionone/types': 10.17.1
+ hey-listen: 1.0.8
+ tslib: 2.4.0
+
+ '@mui/base@5.0.0-beta.70(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.28.6
+ '@floating-ui/react-dom': 2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@mui/types': 7.2.24(@types/react@18.3.28)
+ '@mui/utils': 6.4.9(@types/react@18.3.28)(react@18.3.1)
+ '@popperjs/core': 2.11.8
+ clsx: 2.1.1
+ prop-types: 15.8.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.28
+
+ '@mui/core-downloads-tracker@7.3.9': {}
+
+ '@mui/icons-material@7.3.9(@mui/material@7.3.9(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.28)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.28.6
+ '@mui/material': 7.3.9(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.28
+
+ '@mui/material@7.3.9(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.28.6
+ '@mui/core-downloads-tracker': 7.3.9
+ '@mui/system': 7.3.9(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1)
+ '@mui/types': 7.4.12(@types/react@18.3.28)
+ '@mui/utils': 7.3.9(@types/react@18.3.28)(react@18.3.1)
+ '@popperjs/core': 2.11.8
+ '@types/react-transition-group': 4.4.12(@types/react@18.3.28)
+ clsx: 2.1.1
+ csstype: 3.2.3
+ prop-types: 15.8.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-is: 19.2.4
+ react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ optionalDependencies:
+ '@emotion/react': 11.14.0(@types/react@18.3.28)(react@18.3.1)
+ '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1)
+ '@types/react': 18.3.28
+
+ '@mui/private-theming@7.3.9(@types/react@18.3.28)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.28.6
+ '@mui/utils': 7.3.9(@types/react@18.3.28)(react@18.3.1)
+ prop-types: 15.8.1
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.28
+
+ '@mui/styled-engine@7.3.9(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.28.6
+ '@emotion/cache': 11.14.0
+ '@emotion/serialize': 1.3.3
+ '@emotion/sheet': 1.4.0
+ csstype: 3.2.3
+ prop-types: 15.8.1
+ react: 18.3.1
+ optionalDependencies:
+ '@emotion/react': 11.14.0(@types/react@18.3.28)(react@18.3.1)
+ '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1)
+
+ '@mui/system@7.3.9(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.28.6
+ '@mui/private-theming': 7.3.9(@types/react@18.3.28)(react@18.3.1)
+ '@mui/styled-engine': 7.3.9(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(react@18.3.1)
+ '@mui/types': 7.4.12(@types/react@18.3.28)
+ '@mui/utils': 7.3.9(@types/react@18.3.28)(react@18.3.1)
+ clsx: 2.1.1
+ csstype: 3.2.3
+ prop-types: 15.8.1
+ react: 18.3.1
+ optionalDependencies:
+ '@emotion/react': 11.14.0(@types/react@18.3.28)(react@18.3.1)
+ '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1)
+ '@types/react': 18.3.28
+
+ '@mui/types@7.2.24(@types/react@18.3.28)':
+ optionalDependencies:
+ '@types/react': 18.3.28
+
+ '@mui/types@7.4.12(@types/react@18.3.28)':
+ dependencies:
+ '@babel/runtime': 7.28.6
+ optionalDependencies:
+ '@types/react': 18.3.28
+
+ '@mui/utils@5.17.1(@types/react@18.3.28)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.28.6
+ '@mui/types': 7.2.24(@types/react@18.3.28)
+ '@types/prop-types': 15.7.15
+ clsx: 2.1.1
+ prop-types: 15.8.1
+ react: 18.3.1
+ react-is: 19.2.4
+ optionalDependencies:
+ '@types/react': 18.3.28
+
+ '@mui/utils@6.4.9(@types/react@18.3.28)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.28.6
+ '@mui/types': 7.2.24(@types/react@18.3.28)
+ '@types/prop-types': 15.7.15
+ clsx: 2.1.1
+ prop-types: 15.8.1
+ react: 18.3.1
+ react-is: 19.2.4
+ optionalDependencies:
+ '@types/react': 18.3.28
+
+ '@mui/utils@7.3.9(@types/react@18.3.28)(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.28.6
+ '@mui/types': 7.4.12(@types/react@18.3.28)
+ '@types/prop-types': 15.7.15
+ clsx: 2.1.1
+ prop-types: 15.8.1
+ react: 18.3.1
+ react-is: 19.2.4
+ optionalDependencies:
+ '@types/react': 18.3.28
+
+ '@mui/x-date-pickers@6.20.2(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@mui/material@7.3.9(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mui/system@7.3.9(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(date-fns@2.30.0)(dayjs@1.10.7)(luxon@3.7.2)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.28.6
+ '@mui/base': 5.0.0-beta.70(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@mui/material': 7.3.9(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@mui/system': 7.3.9(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1)
+ '@mui/utils': 5.17.1(@types/react@18.3.28)(react@18.3.1)
+ '@types/react-transition-group': 4.4.12(@types/react@18.3.28)
+ clsx: 2.1.1
+ prop-types: 15.8.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ optionalDependencies:
+ '@emotion/react': 11.14.0(@types/react@18.3.28)(react@18.3.1)
+ '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1)
+ date-fns: 2.30.0
+ dayjs: 1.10.7
+ luxon: 3.7.2
+ moment: 2.30.1
+ transitivePeerDependencies:
+ - '@types/react'
+
+ '@napi-rs/wasm-runtime@0.2.12':
+ dependencies:
+ '@emnapi/core': 1.8.1
+ '@emnapi/runtime': 1.8.1
+ '@tybys/wasm-util': 0.10.1
+ optional: true
+
+ '@next/env@16.1.6': {}
+
+ '@next/swc-darwin-arm64@16.1.6':
+ optional: true
+
+ '@next/swc-darwin-x64@16.1.6':
+ optional: true
+
+ '@next/swc-linux-arm64-gnu@16.1.6':
+ optional: true
+
+ '@next/swc-linux-arm64-musl@16.1.6':
+ optional: true
+
+ '@next/swc-linux-x64-gnu@16.1.6':
+ optional: true
+
+ '@next/swc-linux-x64-musl@16.1.6':
+ optional: true
+
+ '@next/swc-win32-arm64-msvc@16.1.6':
+ optional: true
+
+ '@next/swc-win32-x64-msvc@16.1.6':
+ optional: true
+
+ '@nolyfill/is-core-module@1.0.39': {}
+
+ '@okta/okta-auth-js@6.9.0':
+ dependencies:
+ '@babel/runtime': 7.28.6
+ '@babel/runtime-corejs3': 7.29.0
+ '@peculiar/webcrypto': 1.5.0
+ Base64: 1.1.0
+ atob: 2.1.2
+ broadcast-channel: 4.17.0
+ btoa: 1.2.1
+ core-js: 3.48.0
+ cross-fetch: 3.2.0
+ js-cookie: 3.0.5
+ jsonpath-plus: 6.0.1
+ node-cache: 5.1.2
+ p-cancelable: 2.1.1
+ text-encoding: 0.7.0
+ tiny-emitter: 1.1.0
+ webcrypto-shim: 0.1.7
+ xhr2: 0.1.3
+ transitivePeerDependencies:
+ - encoding
+
+ '@okta/okta-react@6.10.0(@okta/okta-auth-js@6.9.0)(react-dom@18.3.1(react@18.3.1))(react-router-dom@7.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.28.6
+ '@okta/okta-auth-js': 6.9.0
+ compare-versions: 4.1.4
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-router-dom: 7.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+
+ '@okta/okta-signin-widget@6.9.0':
+ dependencies:
+ '@okta/okta-auth-js': 6.9.0
+ '@sindresorhus/to-milliseconds': 1.2.0
+ '@types/backbone': 1.4.23
+ '@types/jquery': 3.5.34
+ '@types/jqueryui': 1.12.24
+ '@types/q': 1.5.8
+ '@types/selectize': 0.12.39
+ '@types/underscore': 1.13.0
+ clipboard: 1.7.1
+ cross-fetch: 3.2.0
+ handlebars: 4.7.8
+ parse-ms: 2.1.0
+ q: 1.4.1
+ u2f-api-polyfill: 0.4.3
+ underscore: 1.13.1
+ optionalDependencies:
+ fsevents: 2.3.3
+ transitivePeerDependencies:
+ - encoding
+
+ '@parcel/watcher-android-arm64@2.5.6':
+ optional: true
+
+ '@parcel/watcher-darwin-arm64@2.5.6':
+ optional: true
+
+ '@parcel/watcher-darwin-x64@2.5.6':
+ optional: true
+
+ '@parcel/watcher-freebsd-x64@2.5.6':
+ optional: true
+
+ '@parcel/watcher-linux-arm-glibc@2.5.6':
+ optional: true
+
+ '@parcel/watcher-linux-arm-musl@2.5.6':
+ optional: true
+
+ '@parcel/watcher-linux-arm64-glibc@2.5.6':
+ optional: true
+
+ '@parcel/watcher-linux-arm64-musl@2.5.6':
+ optional: true
+
+ '@parcel/watcher-linux-x64-glibc@2.5.6':
+ optional: true
+
+ '@parcel/watcher-linux-x64-musl@2.5.6':
+ optional: true
+
+ '@parcel/watcher-win32-arm64@2.5.6':
+ optional: true
+
+ '@parcel/watcher-win32-ia32@2.5.6':
+ optional: true
+
+ '@parcel/watcher-win32-x64@2.5.6':
+ optional: true
+
+ '@parcel/watcher@2.5.6':
+ dependencies:
+ detect-libc: 2.1.2
+ is-glob: 4.0.3
+ node-addon-api: 7.1.1
+ picomatch: 4.0.3
+ optionalDependencies:
+ '@parcel/watcher-android-arm64': 2.5.6
+ '@parcel/watcher-darwin-arm64': 2.5.6
+ '@parcel/watcher-darwin-x64': 2.5.6
+ '@parcel/watcher-freebsd-x64': 2.5.6
+ '@parcel/watcher-linux-arm-glibc': 2.5.6
+ '@parcel/watcher-linux-arm-musl': 2.5.6
+ '@parcel/watcher-linux-arm64-glibc': 2.5.6
+ '@parcel/watcher-linux-arm64-musl': 2.5.6
+ '@parcel/watcher-linux-x64-glibc': 2.5.6
+ '@parcel/watcher-linux-x64-musl': 2.5.6
+ '@parcel/watcher-win32-arm64': 2.5.6
+ '@parcel/watcher-win32-ia32': 2.5.6
+ '@parcel/watcher-win32-x64': 2.5.6
+ optional: true
+
+ '@peculiar/asn1-schema@2.6.0':
+ dependencies:
+ asn1js: 3.0.7
+ pvtsutils: 1.3.6
+ tslib: 2.8.1
+
+ '@peculiar/json-schema@1.1.12':
+ dependencies:
+ tslib: 2.8.1
+
+ '@peculiar/webcrypto@1.5.0':
+ dependencies:
+ '@peculiar/asn1-schema': 2.6.0
+ '@peculiar/json-schema': 1.1.12
+ pvtsutils: 1.3.6
+ tslib: 2.8.1
+ webcrypto-core: 1.8.1
+
+ '@phosphor-icons/react@2.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ '@playwright/test@1.58.2':
+ dependencies:
+ playwright: 1.58.2
+
+ '@popperjs/core@2.11.8': {}
+
+ '@rolldown/pluginutils@1.0.0-beta.27': {}
+
+ '@rollup/pluginutils@5.3.0(rollup@4.59.0)':
+ dependencies:
+ '@types/estree': 1.0.8
+ estree-walker: 2.0.2
+ picomatch: 4.0.3
+ optionalDependencies:
+ rollup: 4.59.0
+
+ '@rollup/rollup-android-arm-eabi@4.59.0':
+ optional: true
+
+ '@rollup/rollup-android-arm64@4.59.0':
+ optional: true
+
+ '@rollup/rollup-darwin-arm64@4.59.0':
+ optional: true
+
+ '@rollup/rollup-darwin-x64@4.59.0':
+ optional: true
+
+ '@rollup/rollup-freebsd-arm64@4.59.0':
+ optional: true
+
+ '@rollup/rollup-freebsd-x64@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-arm-musleabihf@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-gnu@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-musl@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-loong64-gnu@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-loong64-musl@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-ppc64-gnu@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-ppc64-musl@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-gnu@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-musl@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-s390x-gnu@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-x64-gnu@4.59.0':
+ optional: true
+
+ '@rollup/rollup-linux-x64-musl@4.59.0':
+ optional: true
+
+ '@rollup/rollup-openbsd-x64@4.59.0':
+ optional: true
+
+ '@rollup/rollup-openharmony-arm64@4.59.0':
+ optional: true
+
+ '@rollup/rollup-win32-arm64-msvc@4.59.0':
+ optional: true
+
+ '@rollup/rollup-win32-ia32-msvc@4.59.0':
+ optional: true
+
+ '@rollup/rollup-win32-x64-gnu@4.59.0':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.59.0':
+ optional: true
+
+ '@rtsao/scc@1.1.0': {}
+
+ '@rushstack/node-core-library@5.20.3(@types/node@24.12.0)':
+ dependencies:
+ ajv: 8.18.0
+ ajv-draft-04: 1.0.0(ajv@8.18.0)
+ ajv-formats: 3.0.1(ajv@8.18.0)
+ fs-extra: 11.3.4
+ import-lazy: 4.0.0
+ jju: 1.4.0
+ resolve: 1.22.11
+ semver: 7.5.4
+ optionalDependencies:
+ '@types/node': 24.12.0
+
+ '@rushstack/problem-matcher@0.2.1(@types/node@24.12.0)':
+ optionalDependencies:
+ '@types/node': 24.12.0
+
+ '@rushstack/rig-package@0.7.2':
+ dependencies:
+ resolve: 1.22.11
+ strip-json-comments: 3.1.1
+
+ '@rushstack/terminal@0.22.3(@types/node@24.12.0)':
+ dependencies:
+ '@rushstack/node-core-library': 5.20.3(@types/node@24.12.0)
+ '@rushstack/problem-matcher': 0.2.1(@types/node@24.12.0)
+ supports-color: 8.1.1
+ optionalDependencies:
+ '@types/node': 24.12.0
+
+ '@rushstack/ts-command-line@5.3.3(@types/node@24.12.0)':
+ dependencies:
+ '@rushstack/terminal': 0.22.3(@types/node@24.12.0)
+ '@types/argparse': 1.0.38
+ argparse: 1.0.10
+ string-argv: 0.3.2
+ transitivePeerDependencies:
+ - '@types/node'
+
+ '@scarf/scarf@1.4.0': {}
+
+ '@sindresorhus/to-milliseconds@1.2.0': {}
+
+ '@standard-schema/utils@0.3.0': {}
+
+ '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+
+ '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+
+ '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+
+ '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+
+ '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+
+ '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+
+ '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+
+ '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+
+ '@svgr/babel-preset@8.1.0(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.29.0)
+ '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.29.0)
+ '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.29.0)
+ '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.29.0)
+ '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.29.0)
+ '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.29.0)
+ '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.29.0)
+ '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.29.0)
+
+ '@svgr/core@8.1.0(typescript@5.9.3)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@svgr/babel-preset': 8.1.0(@babel/core@7.29.0)
+ camelcase: 6.3.0
+ cosmiconfig: 8.3.6(typescript@5.9.3)
+ snake-case: 3.0.4
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ '@svgr/hast-util-to-babel-ast@8.0.0':
+ dependencies:
+ '@babel/types': 7.29.0
+ entities: 4.5.0
+
+ '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.9.3))':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@svgr/babel-preset': 8.1.0(@babel/core@7.29.0)
+ '@svgr/core': 8.1.0(typescript@5.9.3)
+ '@svgr/hast-util-to-babel-ast': 8.0.0
+ svg-parser: 2.0.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@swagger-api/apidom-ast@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-error': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ unraw: 3.0.0
+
+ '@swagger-api/apidom-core@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-ast': 1.6.0
+ '@swagger-api/apidom-error': 1.6.0
+ '@types/ramda': 0.30.2
+ minim: 0.23.8
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ short-unique-id: 5.3.2
+ ts-mixer: 6.0.4
+
+ '@swagger-api/apidom-error@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+
+ '@swagger-api/apidom-json-pointer@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-error': 1.6.0
+ '@swaggerexpert/json-pointer': 2.10.2
+
+ '@swagger-api/apidom-ns-api-design-systems@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-error': 1.6.0
+ '@swagger-api/apidom-ns-openapi-3-1': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ ts-mixer: 6.0.4
+ optional: true
+
+ '@swagger-api/apidom-ns-arazzo-1@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-ns-json-schema-2020-12': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ ts-mixer: 6.0.4
+ optional: true
+
+ '@swagger-api/apidom-ns-asyncapi-2@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-ns-json-schema-draft-7': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ ts-mixer: 6.0.4
+ optional: true
+
+ '@swagger-api/apidom-ns-asyncapi-3@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-ns-asyncapi-2': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ ts-mixer: 6.0.4
+ optional: true
+
+ '@swagger-api/apidom-ns-json-schema-2019-09@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-error': 1.6.0
+ '@swagger-api/apidom-ns-json-schema-draft-7': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ ts-mixer: 6.0.4
+
+ '@swagger-api/apidom-ns-json-schema-2020-12@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-error': 1.6.0
+ '@swagger-api/apidom-ns-json-schema-2019-09': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ ts-mixer: 6.0.4
+
+ '@swagger-api/apidom-ns-json-schema-draft-4@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-ast': 1.6.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ ts-mixer: 6.0.4
+
+ '@swagger-api/apidom-ns-json-schema-draft-6@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-error': 1.6.0
+ '@swagger-api/apidom-ns-json-schema-draft-4': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ ts-mixer: 6.0.4
+
+ '@swagger-api/apidom-ns-json-schema-draft-7@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-error': 1.6.0
+ '@swagger-api/apidom-ns-json-schema-draft-6': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ ts-mixer: 6.0.4
+
+ '@swagger-api/apidom-ns-openapi-2@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-error': 1.6.0
+ '@swagger-api/apidom-ns-json-schema-draft-4': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ ts-mixer: 6.0.4
+ optional: true
+
+ '@swagger-api/apidom-ns-openapi-3-0@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-error': 1.6.0
+ '@swagger-api/apidom-ns-json-schema-draft-4': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ ts-mixer: 6.0.4
+
+ '@swagger-api/apidom-ns-openapi-3-1@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-ast': 1.6.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-json-pointer': 1.6.0
+ '@swagger-api/apidom-ns-json-schema-2020-12': 1.6.0
+ '@swagger-api/apidom-ns-openapi-3-0': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ ts-mixer: 6.0.4
+
+ '@swagger-api/apidom-ns-openapi-3-2@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-ast': 1.6.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-json-pointer': 1.6.0
+ '@swagger-api/apidom-ns-json-schema-2020-12': 1.6.0
+ '@swagger-api/apidom-ns-openapi-3-0': 1.6.0
+ '@swagger-api/apidom-ns-openapi-3-1': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ ts-mixer: 6.0.4
+
+ '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-ns-api-design-systems': 1.6.0
+ '@swagger-api/apidom-parser-adapter-json': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ optional: true
+
+ '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-ns-api-design-systems': 1.6.0
+ '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ optional: true
+
+ '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-ns-arazzo-1': 1.6.0
+ '@swagger-api/apidom-parser-adapter-json': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ optional: true
+
+ '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-ns-arazzo-1': 1.6.0
+ '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ optional: true
+
+ '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-ns-asyncapi-2': 1.6.0
+ '@swagger-api/apidom-parser-adapter-json': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ optional: true
+
+ '@swagger-api/apidom-parser-adapter-asyncapi-json-3@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-ns-asyncapi-3': 1.6.0
+ '@swagger-api/apidom-parser-adapter-json': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ optional: true
+
+ '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-ns-asyncapi-2': 1.6.0
+ '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ optional: true
+
+ '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-ns-asyncapi-3': 1.6.0
+ '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ optional: true
+
+ '@swagger-api/apidom-parser-adapter-json@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-ast': 1.6.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-error': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ tree-sitter: 0.21.1
+ tree-sitter-json: 0.24.8(tree-sitter@0.21.1)
+ web-tree-sitter: 0.24.5
+ optional: true
+
+ '@swagger-api/apidom-parser-adapter-openapi-json-2@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-ns-openapi-2': 1.6.0
+ '@swagger-api/apidom-parser-adapter-json': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ optional: true
+
+ '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-ns-openapi-3-0': 1.6.0
+ '@swagger-api/apidom-parser-adapter-json': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ optional: true
+
+ '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-ns-openapi-3-1': 1.6.0
+ '@swagger-api/apidom-parser-adapter-json': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ optional: true
+
+ '@swagger-api/apidom-parser-adapter-openapi-json-3-2@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-ns-openapi-3-2': 1.6.0
+ '@swagger-api/apidom-parser-adapter-json': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ optional: true
+
+ '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-ns-openapi-2': 1.6.0
+ '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ optional: true
+
+ '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-ns-openapi-3-0': 1.6.0
+ '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ optional: true
+
+ '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-ns-openapi-3-1': 1.6.0
+ '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ optional: true
+
+ '@swagger-api/apidom-parser-adapter-openapi-yaml-3-2@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-ns-openapi-3-2': 1.6.0
+ '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.6.0
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ optional: true
+
+ '@swagger-api/apidom-parser-adapter-yaml-1-2@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-ast': 1.6.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-error': 1.6.0
+ '@tree-sitter-grammars/tree-sitter-yaml': 0.7.1(tree-sitter@0.22.4)
+ '@types/ramda': 0.30.2
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ tree-sitter: 0.22.4
+ web-tree-sitter: 0.24.5
+ optional: true
+
+ '@swagger-api/apidom-reference@1.6.0':
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-error': 1.6.0
+ '@types/ramda': 0.30.2
+ axios: 1.13.6
+ minimatch: 10.2.4
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ optionalDependencies:
+ '@swagger-api/apidom-json-pointer': 1.6.0
+ '@swagger-api/apidom-ns-arazzo-1': 1.6.0
+ '@swagger-api/apidom-ns-asyncapi-2': 1.6.0
+ '@swagger-api/apidom-ns-openapi-2': 1.6.0
+ '@swagger-api/apidom-ns-openapi-3-0': 1.6.0
+ '@swagger-api/apidom-ns-openapi-3-1': 1.6.0
+ '@swagger-api/apidom-ns-openapi-3-2': 1.6.0
+ '@swagger-api/apidom-parser-adapter-api-design-systems-json': 1.6.0
+ '@swagger-api/apidom-parser-adapter-api-design-systems-yaml': 1.6.0
+ '@swagger-api/apidom-parser-adapter-arazzo-json-1': 1.6.0
+ '@swagger-api/apidom-parser-adapter-arazzo-yaml-1': 1.6.0
+ '@swagger-api/apidom-parser-adapter-asyncapi-json-2': 1.6.0
+ '@swagger-api/apidom-parser-adapter-asyncapi-json-3': 1.6.0
+ '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2': 1.6.0
+ '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3': 1.6.0
+ '@swagger-api/apidom-parser-adapter-json': 1.6.0
+ '@swagger-api/apidom-parser-adapter-openapi-json-2': 1.6.0
+ '@swagger-api/apidom-parser-adapter-openapi-json-3-0': 1.6.0
+ '@swagger-api/apidom-parser-adapter-openapi-json-3-1': 1.6.0
+ '@swagger-api/apidom-parser-adapter-openapi-json-3-2': 1.6.0
+ '@swagger-api/apidom-parser-adapter-openapi-yaml-2': 1.6.0
+ '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0': 1.6.0
+ '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1': 1.6.0
+ '@swagger-api/apidom-parser-adapter-openapi-yaml-3-2': 1.6.0
+ '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.6.0
+ transitivePeerDependencies:
+ - debug
+
+ '@swaggerexpert/cookie@2.0.2':
+ dependencies:
+ apg-lite: 1.0.5
+
+ '@swaggerexpert/json-pointer@2.10.2':
+ dependencies:
+ apg-lite: 1.0.5
+
+ '@swc/helpers@0.5.15':
+ dependencies:
+ tslib: 2.8.1
+
+ '@testing-library/dom@10.4.1':
+ dependencies:
+ '@babel/code-frame': 7.29.0
+ '@babel/runtime': 7.28.6
+ '@types/aria-query': 5.0.4
+ aria-query: 5.3.0
+ dom-accessibility-api: 0.5.16
+ lz-string: 1.5.0
+ picocolors: 1.1.1
+ pretty-format: 27.5.1
+
+ '@testing-library/jest-dom@6.9.1':
+ dependencies:
+ '@adobe/css-tools': 4.4.4
+ aria-query: 5.3.2
+ css.escape: 1.5.1
+ dom-accessibility-api: 0.6.3
+ picocolors: 1.1.1
+ redent: 3.0.0
+
+ '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.28.6
+ '@testing-library/dom': 10.4.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.28
+ '@types/react-dom': 18.3.7(@types/react@18.3.28)
+
+ '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)':
+ dependencies:
+ '@testing-library/dom': 10.4.1
+
+ '@tree-sitter-grammars/tree-sitter-yaml@0.7.1(tree-sitter@0.22.4)':
+ dependencies:
+ node-addon-api: 8.6.0
+ node-gyp-build: 4.8.4
+ optionalDependencies:
+ tree-sitter: 0.22.4
+ optional: true
+
+ '@tybys/wasm-util@0.10.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@types/argparse@1.0.38': {}
+
+ '@types/aria-query@5.0.4': {}
+
+ '@types/autosuggest-highlight@3.2.3': {}
+
+ '@types/babel__core@7.20.5':
+ dependencies:
+ '@babel/parser': 7.29.0
+ '@babel/types': 7.29.0
+ '@types/babel__generator': 7.27.0
+ '@types/babel__template': 7.4.4
+ '@types/babel__traverse': 7.28.0
+
+ '@types/babel__generator@7.27.0':
+ dependencies:
+ '@babel/types': 7.29.0
+
+ '@types/babel__template@7.4.4':
+ dependencies:
+ '@babel/parser': 7.29.0
+ '@babel/types': 7.29.0
+
+ '@types/babel__traverse@7.28.0':
+ dependencies:
+ '@babel/types': 7.29.0
+
+ '@types/backbone@1.4.23':
+ dependencies:
+ '@types/jquery': 3.5.34
+ '@types/underscore': 1.13.0
+
+ '@types/chai@5.2.3':
+ dependencies:
+ '@types/deep-eql': 4.0.2
+ assertion-error: 2.0.1
+
+ '@types/d3-array@3.2.2': {}
+
+ '@types/d3-color@3.1.3': {}
+
+ '@types/d3-ease@3.0.2': {}
+
+ '@types/d3-interpolate@3.0.4':
+ dependencies:
+ '@types/d3-color': 3.1.3
+
+ '@types/d3-path@3.1.1': {}
+
+ '@types/d3-scale@4.0.9':
+ dependencies:
+ '@types/d3-time': 3.0.4
+
+ '@types/d3-shape@3.1.8':
+ dependencies:
+ '@types/d3-path': 3.1.1
+
+ '@types/d3-time@3.0.4': {}
+
+ '@types/d3-timer@3.0.2': {}
+
+ '@types/debug@4.1.12':
+ dependencies:
+ '@types/ms': 2.1.0
+
+ '@types/deep-eql@4.0.2': {}
+
+ '@types/dom-to-image@2.6.7': {}
+
+ '@types/estree-jsx@1.0.5':
+ dependencies:
+ '@types/estree': 1.0.8
+
+ '@types/estree@1.0.8': {}
+
+ '@types/hammerjs@2.0.46': {}
+
+ '@types/hast@2.3.10':
+ dependencies:
+ '@types/unist': 2.0.11
+
+ '@types/hast@3.0.4':
+ dependencies:
+ '@types/unist': 3.0.3
+
+ '@types/jquery@3.5.34':
+ dependencies:
+ '@types/sizzle': 2.3.10
+
+ '@types/jqueryui@1.12.24':
+ dependencies:
+ '@types/jquery': 3.5.34
+
+ '@types/json-schema@7.0.15': {}
+
+ '@types/json5@0.0.29': {}
+
+ '@types/lodash@4.17.24': {}
+
+ '@types/mdast@4.0.4':
+ dependencies:
+ '@types/unist': 3.0.3
+
+ '@types/ms@2.1.0': {}
+
+ '@types/node@24.12.0':
+ dependencies:
+ undici-types: 7.16.0
+
+ '@types/parse-json@4.0.2': {}
+
+ '@types/prismjs@1.26.6': {}
+
+ '@types/prop-types@15.7.15': {}
+
+ '@types/q@1.5.8': {}
+
+ '@types/qs@6.15.0': {}
+
+ '@types/ramda@0.30.2':
+ dependencies:
+ types-ramda: 0.30.1
+
+ '@types/react-beautiful-dnd@13.1.8':
+ dependencies:
+ '@types/react': 18.3.28
+
+ '@types/react-datepicker@6.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@floating-ui/react': 0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@types/react': 18.3.28
+ date-fns: 3.6.0
+ transitivePeerDependencies:
+ - react
+ - react-dom
+
+ '@types/react-dom@18.3.7(@types/react@18.3.28)':
+ dependencies:
+ '@types/react': 18.3.28
+
+ '@types/react-helmet@6.1.11':
+ dependencies:
+ '@types/react': 18.3.28
+
+ '@types/react-highlight@0.12.8':
+ dependencies:
+ '@types/react': 18.3.28
+
+ '@types/react-syntax-highlighter@15.5.13':
+ dependencies:
+ '@types/react': 18.3.28
+
+ '@types/react-transition-group@4.4.12(@types/react@18.3.28)':
+ dependencies:
+ '@types/react': 18.3.28
+
+ '@types/react@18.3.28':
+ dependencies:
+ '@types/prop-types': 15.7.15
+ csstype: 3.2.3
+
+ '@types/selectize@0.12.39': {}
+
+ '@types/sizzle@2.3.10': {}
+
+ '@types/swagger-ui-react@5.18.0':
+ dependencies:
+ '@types/react': 18.3.28
+
+ '@types/trusted-types@2.0.7':
+ optional: true
+
+ '@types/underscore@1.13.0': {}
+
+ '@types/unist@2.0.11': {}
+
+ '@types/unist@3.0.3': {}
+
+ '@types/url-parse@1.4.11': {}
+
+ '@types/use-sync-external-store@0.0.6': {}
+
+ '@types/uuid@8.3.4': {}
+
+ '@types/yup@0.32.0':
+ dependencies:
+ yup: 1.7.1
+
+ '@typescript-eslint/eslint-plugin@8.57.0(@typescript-eslint/parser@8.57.0(eslint@9.32.0)(typescript@5.9.3))(eslint@9.32.0)(typescript@5.9.3)':
+ dependencies:
+ '@eslint-community/regexpp': 4.12.2
+ '@typescript-eslint/parser': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ '@typescript-eslint/scope-manager': 8.57.0
+ '@typescript-eslint/type-utils': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.57.0
+ eslint: 9.32.0
+ ignore: 7.0.5
+ natural-compare: 1.4.0
+ ts-api-utils: 2.4.0(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/parser@8.57.0(eslint@9.32.0)(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 8.57.0
+ '@typescript-eslint/types': 8.57.0
+ '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.57.0
+ debug: 4.4.3(supports-color@5.5.0)
+ eslint: 9.32.0
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/project-service@8.57.0(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@5.9.3)
+ '@typescript-eslint/types': 8.57.0
+ debug: 4.4.3(supports-color@5.5.0)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/scope-manager@8.57.0':
+ dependencies:
+ '@typescript-eslint/types': 8.57.0
+ '@typescript-eslint/visitor-keys': 8.57.0
+
+ '@typescript-eslint/tsconfig-utils@8.57.0(typescript@5.9.3)':
+ dependencies:
+ typescript: 5.9.3
+
+ '@typescript-eslint/type-utils@8.57.0(eslint@9.32.0)(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/types': 8.57.0
+ '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ debug: 4.4.3(supports-color@5.5.0)
+ eslint: 9.32.0
+ ts-api-utils: 2.4.0(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/types@8.57.0': {}
+
+ '@typescript-eslint/typescript-estree@8.57.0(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/project-service': 8.57.0(typescript@5.9.3)
+ '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@5.9.3)
+ '@typescript-eslint/types': 8.57.0
+ '@typescript-eslint/visitor-keys': 8.57.0
+ debug: 4.4.3(supports-color@5.5.0)
+ minimatch: 10.2.4
+ semver: 7.7.4
+ tinyglobby: 0.2.15
+ ts-api-utils: 2.4.0(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/utils@8.57.0(eslint@9.32.0)(typescript@5.9.3)':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.1(eslint@9.32.0)
+ '@typescript-eslint/scope-manager': 8.57.0
+ '@typescript-eslint/types': 8.57.0
+ '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3)
+ eslint: 9.32.0
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/visitor-keys@8.57.0':
+ dependencies:
+ '@typescript-eslint/types': 8.57.0
+ eslint-visitor-keys: 5.0.1
+
+ '@ungap/structured-clone@1.3.0': {}
+
+ '@unrs/resolver-binding-android-arm-eabi@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-android-arm64@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-darwin-arm64@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-darwin-x64@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-freebsd-x64@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-arm64-gnu@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-arm64-musl@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-riscv64-musl@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-s390x-gnu@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-x64-gnu@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-x64-musl@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-wasm32-wasi@1.11.1':
+ dependencies:
+ '@napi-rs/wasm-runtime': 0.2.12
+ optional: true
+
+ '@unrs/resolver-binding-win32-arm64-msvc@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-win32-ia32-msvc@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-win32-x64-msvc@1.11.1':
+ optional: true
+
+ '@use-gesture/core@10.3.1': {}
+
+ '@use-gesture/react@10.3.1(react@18.3.1)':
+ dependencies:
+ '@use-gesture/core': 10.3.1
+ react: 18.3.1
+
+ '@vitejs/plugin-react@4.7.0(vite@7.3.1(@types/node@24.12.0)(sass@1.97.3))':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0)
+ '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0)
+ '@rolldown/pluginutils': 1.0.0-beta.27
+ '@types/babel__core': 7.20.5
+ react-refresh: 0.17.0
+ vite: 7.3.1(@types/node@24.12.0)(sass@1.97.3)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@vitest/eslint-plugin@1.6.10(eslint@9.32.0)(typescript@5.9.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jsdom@26.1.0)(sass@1.97.3))':
+ dependencies:
+ '@typescript-eslint/scope-manager': 8.57.0
+ '@typescript-eslint/utils': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ eslint: 9.32.0
+ optionalDependencies:
+ typescript: 5.9.3
+ vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jsdom@26.1.0)(sass@1.97.3)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@vitest/expect@3.2.4':
+ dependencies:
+ '@types/chai': 5.2.3
+ '@vitest/spy': 3.2.4
+ '@vitest/utils': 3.2.4
+ chai: 5.3.3
+ tinyrainbow: 2.0.0
+
+ '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@24.12.0)(sass@1.97.3))':
+ dependencies:
+ '@vitest/spy': 3.2.4
+ estree-walker: 3.0.3
+ magic-string: 0.30.21
+ optionalDependencies:
+ vite: 7.3.1(@types/node@24.12.0)(sass@1.97.3)
+
+ '@vitest/pretty-format@3.2.4':
+ dependencies:
+ tinyrainbow: 2.0.0
+
+ '@vitest/runner@3.2.4':
+ dependencies:
+ '@vitest/utils': 3.2.4
+ pathe: 2.0.3
+ strip-literal: 3.1.0
+
+ '@vitest/snapshot@3.2.4':
+ dependencies:
+ '@vitest/pretty-format': 3.2.4
+ magic-string: 0.30.21
+ pathe: 2.0.3
+
+ '@vitest/spy@3.2.4':
+ dependencies:
+ tinyspy: 4.0.4
+
+ '@vitest/utils@3.2.4':
+ dependencies:
+ '@vitest/pretty-format': 3.2.4
+ loupe: 3.2.1
+ tinyrainbow: 2.0.0
+
+ '@volar/language-core@2.4.28':
+ dependencies:
+ '@volar/source-map': 2.4.28
+
+ '@volar/source-map@2.4.28': {}
+
+ '@volar/typescript@2.4.28':
+ dependencies:
+ '@volar/language-core': 2.4.28
+ path-browserify: 1.0.1
+ vscode-uri: 3.1.0
+
+ '@vue/compiler-core@3.5.30':
+ dependencies:
+ '@babel/parser': 7.29.0
+ '@vue/shared': 3.5.30
+ entities: 7.0.1
+ estree-walker: 2.0.2
+ source-map-js: 1.2.1
+
+ '@vue/compiler-dom@3.5.30':
+ dependencies:
+ '@vue/compiler-core': 3.5.30
+ '@vue/shared': 3.5.30
+
+ '@vue/compiler-vue2@2.7.16':
+ dependencies:
+ de-indent: 1.0.2
+ he: 1.2.0
+
+ '@vue/language-core@2.2.0(typescript@5.9.3)':
+ dependencies:
+ '@volar/language-core': 2.4.28
+ '@vue/compiler-dom': 3.5.30
+ '@vue/compiler-vue2': 2.7.16
+ '@vue/shared': 3.5.30
+ alien-signals: 0.4.14
+ minimatch: 9.0.9
+ muggle-string: 0.4.1
+ path-browserify: 1.0.1
+ optionalDependencies:
+ typescript: 5.9.3
+
+ '@vue/shared@3.5.30': {}
+
+ '@xstate/inspect@0.8.0(ws@8.19.0)(xstate@4.38.3)':
+ dependencies:
+ fast-safe-stringify: 2.1.1
+ ws: 8.19.0
+ xstate: 4.38.3
+
+ '@xstate/react@3.2.2(@types/react@18.3.28)(react@18.3.1)(xstate@4.38.3)':
+ dependencies:
+ react: 18.3.1
+ use-isomorphic-layout-effect: 1.2.1(@types/react@18.3.28)(react@18.3.1)
+ use-sync-external-store: 1.6.0(react@18.3.1)
+ optionalDependencies:
+ xstate: 4.38.3
+ transitivePeerDependencies:
+ - '@types/react'
+
+ Base64@1.1.0: {}
+
+ abortcontroller-polyfill@1.7.8: {}
+
+ acorn-jsx@5.3.2(acorn@8.16.0):
+ dependencies:
+ acorn: 8.16.0
+
+ acorn@8.16.0: {}
+
+ agent-base@7.1.4: {}
+
+ ajv-draft-04@1.0.0(ajv@8.18.0):
+ optionalDependencies:
+ ajv: 8.18.0
+
+ ajv-errors@3.0.0(ajv@8.18.0):
+ dependencies:
+ ajv: 8.18.0
+
+ ajv-formats@2.1.1(ajv@8.18.0):
+ optionalDependencies:
+ ajv: 8.18.0
+
+ ajv-formats@3.0.1(ajv@8.18.0):
+ optionalDependencies:
+ ajv: 8.18.0
+
+ ajv@6.14.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+
+ ajv@8.18.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-uri: 3.1.0
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+
+ alien-signals@0.4.14: {}
+
+ ansi-regex@5.0.1: {}
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ ansi-styles@5.2.0: {}
+
+ apg-lite@1.0.5: {}
+
+ argparse@1.0.10:
+ dependencies:
+ sprintf-js: 1.0.3
+
+ argparse@2.0.1: {}
+
+ aria-query@5.3.0:
+ dependencies:
+ dequal: 2.0.3
+
+ aria-query@5.3.2: {}
+
+ array-buffer-byte-length@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ is-array-buffer: 3.0.5
+
+ array-includes@3.1.9:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-object-atoms: 1.1.1
+ get-intrinsic: 1.3.0
+ is-string: 1.1.1
+ math-intrinsics: 1.1.0
+
+ array.prototype.findlastindex@1.2.6:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ es-shim-unscopables: 1.1.0
+
+ array.prototype.flat@1.3.3:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-shim-unscopables: 1.1.0
+
+ array.prototype.flatmap@1.3.3:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-shim-unscopables: 1.1.0
+
+ arraybuffer.prototype.slice@1.0.4:
+ dependencies:
+ array-buffer-byte-length: 1.0.2
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ is-array-buffer: 3.0.5
+
+ asn1js@3.0.7:
+ dependencies:
+ pvtsutils: 1.3.6
+ pvutils: 1.1.5
+ tslib: 2.8.1
+
+ assertion-error@2.0.1: {}
+
+ async-function@1.0.0: {}
+
+ asynckit@0.4.0: {}
+
+ atob@2.1.2: {}
+
+ autolinker@3.16.2:
+ dependencies:
+ tslib: 2.8.1
+
+ autosuggest-highlight@3.3.4:
+ dependencies:
+ remove-accents: 0.4.4
+
+ available-typed-arrays@1.0.7:
+ dependencies:
+ possible-typed-array-names: 1.1.0
+
+ axios@1.13.6:
+ dependencies:
+ follow-redirects: 1.15.11
+ form-data: 4.0.5
+ proxy-from-env: 1.1.0
+ transitivePeerDependencies:
+ - debug
+
+ babel-plugin-macros@3.1.0:
+ dependencies:
+ '@babel/runtime': 7.28.6
+ cosmiconfig: 7.1.0
+ resolve: 1.22.11
+
+ babel-plugin-styled-components@2.1.4(@babel/core@7.29.0)(styled-components@5.3.11(@babel/core@7.29.0)(react-dom@18.3.1(react@18.3.1))(react-is@19.2.4)(react@18.3.1))(supports-color@5.5.0):
+ dependencies:
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-module-imports': 7.28.6(supports-color@5.5.0)
+ '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0)
+ lodash: 4.17.23
+ picomatch: 2.3.1
+ styled-components: 5.3.11(@babel/core@7.29.0)(react-dom@18.3.1(react@18.3.1))(react-is@19.2.4)(react@18.3.1)
+ transitivePeerDependencies:
+ - '@babel/core'
+ - supports-color
+
+ bail@2.0.2: {}
+
+ balanced-match@1.0.2: {}
+
+ balanced-match@4.0.4: {}
+
+ base64-js@1.5.1: {}
+
+ baseline-browser-mapping@2.10.0: {}
+
+ batch-processor@1.0.0: {}
+
+ big-integer@1.6.52: {}
+
+ birecord@0.1.1: {}
+
+ body-scroll-lock-upgrade@1.1.0: {}
+
+ brace-expansion@1.1.12:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ brace-expansion@2.0.2:
+ dependencies:
+ balanced-match: 1.0.2
+
+ brace-expansion@5.0.4:
+ dependencies:
+ balanced-match: 4.0.4
+
+ broadcast-channel@3.7.0:
+ dependencies:
+ '@babel/runtime': 7.28.6
+ detect-node: 2.1.0
+ js-sha3: 0.8.0
+ microseconds: 0.2.0
+ nano-time: 1.0.0
+ oblivious-set: 1.0.0
+ rimraf: 3.0.2
+ unload: 2.2.0
+
+ broadcast-channel@4.17.0:
+ dependencies:
+ '@babel/runtime': 7.28.6
+ oblivious-set: 1.1.1
+ p-queue: 6.6.2
+ rimraf: 3.0.2
+ unload: 2.3.1
+
+ browser-tabs-lock@1.3.0:
+ dependencies:
+ lodash: 4.17.23
+
+ browserslist@4.28.1:
+ dependencies:
+ baseline-browser-mapping: 2.10.0
+ caniuse-lite: 1.0.30001777
+ electron-to-chromium: 1.5.307
+ node-releases: 2.0.36
+ update-browserslist-db: 1.2.3(browserslist@4.28.1)
+
+ btoa@1.2.1: {}
+
+ buffer@6.0.3:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+
+ cac@6.7.14: {}
+
+ calculate-size@1.1.1: {}
+
+ call-bind-apply-helpers@1.0.2:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+
+ call-bind@1.0.8:
+ 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
+
+ call-bound@1.0.4:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ get-intrinsic: 1.3.0
+
+ callsites@3.1.0: {}
+
+ camelcase@6.3.0: {}
+
+ camelize@1.0.1: {}
+
+ caniuse-lite@1.0.30001777: {}
+
+ ccount@2.0.1: {}
+
+ chai@5.3.3:
+ dependencies:
+ assertion-error: 2.0.1
+ check-error: 2.1.3
+ deep-eql: 5.0.2
+ loupe: 3.2.1
+ pathval: 2.0.1
+
+ chalk@4.1.2:
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ character-entities-html4@2.1.0: {}
+
+ character-entities-legacy@1.1.4: {}
+
+ character-entities-legacy@3.0.0: {}
+
+ character-entities@1.2.4: {}
+
+ character-entities@2.0.2: {}
+
+ character-reference-invalid@1.1.4: {}
+
+ character-reference-invalid@2.0.1: {}
+
+ check-error@2.1.3: {}
+
+ chokidar@4.0.3:
+ dependencies:
+ readdirp: 4.1.2
+
+ classnames@2.5.1: {}
+
+ client-only@0.0.1: {}
+
+ clipboard@1.7.1:
+ dependencies:
+ good-listener: 1.2.2
+ select: 1.1.2
+ tiny-emitter: 2.1.0
+
+ clone@2.1.2: {}
+
+ clsx@2.1.1: {}
+
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-name@1.1.4: {}
+
+ color-string@1.9.1:
+ dependencies:
+ color-name: 1.1.4
+ simple-swizzle: 0.2.4
+
+ color@4.2.3:
+ dependencies:
+ color-convert: 2.0.1
+ color-string: 1.9.1
+
+ combined-stream@1.0.8:
+ dependencies:
+ delayed-stream: 1.0.0
+
+ comma-separated-tokens@1.0.8: {}
+
+ comma-separated-tokens@2.0.3: {}
+
+ compare-versions@4.1.4: {}
+
+ compare-versions@6.1.1: {}
+
+ component-emitter@1.3.1: {}
+
+ concat-map@0.0.1: {}
+
+ confbox@0.1.8: {}
+
+ confbox@0.2.4: {}
+
+ container-query-toolkit@0.1.3: {}
+
+ convert-source-map@1.9.0: {}
+
+ convert-source-map@2.0.0: {}
+
+ cookie@1.1.1: {}
+
+ copy-to-clipboard@3.3.3:
+ dependencies:
+ toggle-selection: 1.0.6
+
+ core-js-pure@3.48.0: {}
+
+ core-js@3.48.0: {}
+
+ cosmiconfig@7.1.0:
+ dependencies:
+ '@types/parse-json': 4.0.2
+ import-fresh: 3.3.1
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ yaml: 1.10.2
+
+ cosmiconfig@8.3.6(typescript@5.9.3):
+ dependencies:
+ import-fresh: 3.3.1
+ js-yaml: 4.1.1
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ optionalDependencies:
+ typescript: 5.9.3
+
+ cron-validate@1.5.3:
+ dependencies:
+ yup: 1.7.1
+
+ cronstrue@2.61.0: {}
+
+ cross-fetch@3.2.0:
+ dependencies:
+ node-fetch: 2.7.0
+ transitivePeerDependencies:
+ - encoding
+
+ cross-spawn@7.0.6:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ css-color-keywords@1.0.0: {}
+
+ css-to-react-native@3.2.0:
+ dependencies:
+ camelize: 1.0.1
+ css-color-keywords: 1.0.0
+ postcss-value-parser: 4.2.0
+
+ css.escape@1.5.1: {}
+
+ cssstyle@4.6.0:
+ dependencies:
+ '@asamuzakjp/css-color': 3.2.0
+ rrweb-cssom: 0.8.0
+
+ csstype@3.2.3: {}
+
+ d3-array@3.2.4:
+ dependencies:
+ internmap: 2.0.3
+
+ d3-color@3.1.0: {}
+
+ d3-ease@3.0.1: {}
+
+ d3-format@3.1.2: {}
+
+ d3-interpolate@3.0.1:
+ dependencies:
+ d3-color: 3.1.0
+
+ d3-path@3.1.0: {}
+
+ d3-scale@4.0.2:
+ dependencies:
+ d3-array: 3.2.4
+ d3-format: 3.1.2
+ d3-interpolate: 3.0.1
+ d3-time: 3.1.0
+ d3-time-format: 4.1.0
+
+ d3-shape@3.2.0:
+ dependencies:
+ d3-path: 3.1.0
+
+ d3-time-format@4.1.0:
+ dependencies:
+ d3-time: 3.1.0
+
+ d3-time@3.1.0:
+ dependencies:
+ d3-array: 3.2.4
+
+ d3-timer@3.0.1: {}
+
+ data-urls@5.0.0:
+ dependencies:
+ whatwg-mimetype: 4.0.0
+ whatwg-url: 14.2.0
+
+ data-view-buffer@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ data-view-byte-length@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ data-view-byte-offset@1.0.1:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ date-fns-tz@2.0.1(date-fns@2.30.0):
+ dependencies:
+ date-fns: 2.30.0
+
+ date-fns@2.30.0:
+ dependencies:
+ '@babel/runtime': 7.28.6
+
+ date-fns@3.6.0: {}
+
+ dayjs@1.10.7: {}
+
+ de-indent@1.0.2: {}
+
+ debug@3.2.7:
+ dependencies:
+ ms: 2.1.3
+
+ debug@4.4.3(supports-color@5.5.0):
+ dependencies:
+ ms: 2.1.3
+ optionalDependencies:
+ supports-color: 5.5.0
+
+ decimal.js-light@2.5.1: {}
+
+ decimal.js@10.6.0: {}
+
+ decode-named-character-reference@1.3.0:
+ dependencies:
+ character-entities: 2.0.2
+
+ deep-copy@1.4.2: {}
+
+ deep-eql@5.0.2: {}
+
+ deep-equal@1.1.2:
+ dependencies:
+ is-arguments: 1.2.0
+ is-date-object: 1.1.0
+ is-regex: 1.1.4
+ object-is: 1.1.6
+ object-keys: 1.1.1
+ regexp.prototype.flags: 1.5.4
+
+ deep-extend@0.6.0: {}
+
+ deep-is@0.1.4: {}
+
+ deepmerge@4.3.1: {}
+
+ defaulty@2.1.0:
+ dependencies:
+ deep-copy: 1.4.2
+
+ define-data-property@1.1.4:
+ dependencies:
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ define-properties@1.2.1:
+ dependencies:
+ define-data-property: 1.1.4
+ has-property-descriptors: 1.0.2
+ object-keys: 1.1.1
+
+ defined@1.0.1: {}
+
+ delayed-stream@1.0.0: {}
+
+ delegate@3.2.0: {}
+
+ dequal@2.0.3: {}
+
+ detect-libc@2.1.2:
+ optional: true
+
+ detect-node@2.1.0: {}
+
+ devlop@1.1.0:
+ dependencies:
+ dequal: 2.0.3
+
+ diff@8.0.3: {}
+
+ doctrine@2.1.0:
+ dependencies:
+ esutils: 2.0.3
+
+ dom-accessibility-api@0.5.16: {}
+
+ dom-accessibility-api@0.6.3: {}
+
+ dom-helpers@5.2.1:
+ dependencies:
+ '@babel/runtime': 7.28.6
+ csstype: 3.2.3
+
+ dom-mutator@0.6.0: {}
+
+ dom-to-image@2.6.0: {}
+
+ dompurify@3.2.6:
+ optionalDependencies:
+ '@types/trusted-types': 2.0.7
+
+ dompurify@3.2.7:
+ optionalDependencies:
+ '@types/trusted-types': 2.0.7
+
+ dot-case@3.0.4:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.8.1
+
+ dotenv@16.6.1: {}
+
+ dotignore@0.1.2:
+ dependencies:
+ minimatch: 3.1.5
+
+ drange@1.1.1: {}
+
+ dunder-proto@1.0.1:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ electron-to-chromium@1.5.307: {}
+
+ element-resize-detector@1.1.13:
+ dependencies:
+ batch-processor: 1.0.0
+
+ elkjs@0.8.2: {}
+
+ ellipsize@0.2.0:
+ dependencies:
+ tape: 4.17.0
+
+ entities@4.5.0: {}
+
+ entities@6.0.1: {}
+
+ entities@7.0.1: {}
+
+ error-ex@1.3.4:
+ dependencies:
+ is-arrayish: 0.2.1
+
+ es-abstract@1.24.1:
+ 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.20
+
+ es-cookie@1.3.2: {}
+
+ es-define-property@1.0.1: {}
+
+ es-errors@1.3.0: {}
+
+ es-module-lexer@1.7.0: {}
+
+ es-object-atoms@1.1.1:
+ dependencies:
+ es-errors: 1.3.0
+
+ es-set-tostringtag@2.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+
+ es-shim-unscopables@1.1.0:
+ dependencies:
+ hasown: 2.0.2
+
+ es-to-primitive@1.3.0:
+ dependencies:
+ is-callable: 1.2.7
+ is-date-object: 1.1.0
+ is-symbol: 1.1.1
+
+ esbuild@0.27.3:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.27.3
+ '@esbuild/android-arm': 0.27.3
+ '@esbuild/android-arm64': 0.27.3
+ '@esbuild/android-x64': 0.27.3
+ '@esbuild/darwin-arm64': 0.27.3
+ '@esbuild/darwin-x64': 0.27.3
+ '@esbuild/freebsd-arm64': 0.27.3
+ '@esbuild/freebsd-x64': 0.27.3
+ '@esbuild/linux-arm': 0.27.3
+ '@esbuild/linux-arm64': 0.27.3
+ '@esbuild/linux-ia32': 0.27.3
+ '@esbuild/linux-loong64': 0.27.3
+ '@esbuild/linux-mips64el': 0.27.3
+ '@esbuild/linux-ppc64': 0.27.3
+ '@esbuild/linux-riscv64': 0.27.3
+ '@esbuild/linux-s390x': 0.27.3
+ '@esbuild/linux-x64': 0.27.3
+ '@esbuild/netbsd-arm64': 0.27.3
+ '@esbuild/netbsd-x64': 0.27.3
+ '@esbuild/openbsd-arm64': 0.27.3
+ '@esbuild/openbsd-x64': 0.27.3
+ '@esbuild/openharmony-arm64': 0.27.3
+ '@esbuild/sunos-x64': 0.27.3
+ '@esbuild/win32-arm64': 0.27.3
+ '@esbuild/win32-ia32': 0.27.3
+ '@esbuild/win32-x64': 0.27.3
+
+ escalade@3.2.0: {}
+
+ escape-string-regexp@4.0.0: {}
+
+ escape-string-regexp@5.0.0: {}
+
+ eslint-import-resolver-node@0.3.9:
+ dependencies:
+ debug: 3.2.7
+ is-core-module: 2.16.1
+ resolve: 1.22.11
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.32.0):
+ dependencies:
+ '@nolyfill/is-core-module': 1.0.39
+ debug: 4.4.3(supports-color@5.5.0)
+ eslint: 9.32.0
+ get-tsconfig: 4.13.6
+ is-bun-module: 2.0.0
+ stable-hash: 0.0.5
+ tinyglobby: 0.2.15
+ unrs-resolver: 1.11.1
+ optionalDependencies:
+ eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.57.0(eslint@9.32.0)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-module-utils@2.12.1(@typescript-eslint/parser@8.57.0(eslint@9.32.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0):
+ dependencies:
+ debug: 3.2.7
+ optionalDependencies:
+ '@typescript-eslint/parser': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ eslint: 9.32.0
+ eslint-import-resolver-node: 0.3.9
+ eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.32.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.0(eslint@9.32.0)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0):
+ dependencies:
+ '@rtsao/scc': 1.1.0
+ array-includes: 3.1.9
+ array.prototype.findlastindex: 1.2.6
+ array.prototype.flat: 1.3.3
+ array.prototype.flatmap: 1.3.3
+ debug: 3.2.7
+ doctrine: 2.1.0
+ eslint: 9.32.0
+ eslint-import-resolver-node: 0.3.9
+ eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.57.0(eslint@9.32.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0)
+ hasown: 2.0.2
+ is-core-module: 2.16.1
+ is-glob: 4.0.3
+ minimatch: 3.1.5
+ object.fromentries: 2.0.8
+ object.groupby: 1.0.3
+ object.values: 1.2.1
+ semver: 6.3.1
+ string.prototype.trimend: 1.0.9
+ tsconfig-paths: 3.15.0
+ optionalDependencies:
+ '@typescript-eslint/parser': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ transitivePeerDependencies:
+ - eslint-import-resolver-typescript
+ - eslint-import-resolver-webpack
+ - supports-color
+
+ eslint-plugin-react-debug@1.53.1(eslint@9.32.0)(typescript@5.9.3):
+ dependencies:
+ '@eslint-react/ast': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/core': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/eff': 1.53.1
+ '@eslint-react/kit': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/shared': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/var': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@typescript-eslint/scope-manager': 8.57.0
+ '@typescript-eslint/type-utils': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ '@typescript-eslint/types': 8.57.0
+ '@typescript-eslint/utils': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ eslint: 9.32.0
+ string-ts: 2.3.1
+ ts-pattern: 5.9.0
+ optionalDependencies:
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-plugin-react-dom@1.53.1(eslint@9.32.0)(typescript@5.9.3):
+ dependencies:
+ '@eslint-react/ast': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/core': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/eff': 1.53.1
+ '@eslint-react/kit': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/shared': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/var': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@typescript-eslint/scope-manager': 8.57.0
+ '@typescript-eslint/types': 8.57.0
+ '@typescript-eslint/utils': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ compare-versions: 6.1.1
+ eslint: 9.32.0
+ string-ts: 2.3.1
+ ts-pattern: 5.9.0
+ optionalDependencies:
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-plugin-react-hooks-extra@1.53.1(eslint@9.32.0)(typescript@5.9.3):
+ dependencies:
+ '@eslint-react/ast': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/core': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/eff': 1.53.1
+ '@eslint-react/kit': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/shared': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/var': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@typescript-eslint/scope-manager': 8.57.0
+ '@typescript-eslint/type-utils': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ '@typescript-eslint/types': 8.57.0
+ '@typescript-eslint/utils': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ eslint: 9.32.0
+ string-ts: 2.3.1
+ ts-pattern: 5.9.0
+ optionalDependencies:
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-plugin-react-hooks@5.2.0(eslint@9.32.0):
+ dependencies:
+ eslint: 9.32.0
+
+ eslint-plugin-react-naming-convention@1.53.1(eslint@9.32.0)(typescript@5.9.3):
+ dependencies:
+ '@eslint-react/ast': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/core': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/eff': 1.53.1
+ '@eslint-react/kit': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/shared': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/var': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@typescript-eslint/scope-manager': 8.57.0
+ '@typescript-eslint/type-utils': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ '@typescript-eslint/types': 8.57.0
+ '@typescript-eslint/utils': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ eslint: 9.32.0
+ string-ts: 2.3.1
+ ts-pattern: 5.9.0
+ optionalDependencies:
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-plugin-react-refresh@0.4.26(eslint@9.32.0):
+ dependencies:
+ eslint: 9.32.0
+
+ eslint-plugin-react-web-api@1.53.1(eslint@9.32.0)(typescript@5.9.3):
+ dependencies:
+ '@eslint-react/ast': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/core': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/eff': 1.53.1
+ '@eslint-react/kit': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/shared': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/var': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@typescript-eslint/scope-manager': 8.57.0
+ '@typescript-eslint/types': 8.57.0
+ '@typescript-eslint/utils': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ eslint: 9.32.0
+ string-ts: 2.3.1
+ ts-pattern: 5.9.0
+ optionalDependencies:
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-plugin-react-x@1.53.1(eslint@9.32.0)(ts-api-utils@2.4.0(typescript@5.9.3))(typescript@5.9.3):
+ dependencies:
+ '@eslint-react/ast': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/core': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/eff': 1.53.1
+ '@eslint-react/kit': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/shared': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@eslint-react/var': 1.53.1(eslint@9.32.0)(typescript@5.9.3)
+ '@typescript-eslint/scope-manager': 8.57.0
+ '@typescript-eslint/type-utils': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ '@typescript-eslint/types': 8.57.0
+ '@typescript-eslint/utils': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ compare-versions: 6.1.1
+ eslint: 9.32.0
+ is-immutable-type: 5.0.1(eslint@9.32.0)(typescript@5.9.3)
+ string-ts: 2.3.1
+ ts-pattern: 5.9.0
+ optionalDependencies:
+ ts-api-utils: 2.4.0(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-plugin-unused-imports@3.2.0(eslint@9.32.0):
+ dependencies:
+ eslint: 9.32.0
+ eslint-rule-composer: 0.3.0
+
+ eslint-rule-composer@0.3.0: {}
+
+ eslint-scope@8.4.0:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+
+ eslint-visitor-keys@3.4.3: {}
+
+ eslint-visitor-keys@4.2.1: {}
+
+ eslint-visitor-keys@5.0.1: {}
+
+ eslint@9.32.0:
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.1(eslint@9.32.0)
+ '@eslint-community/regexpp': 4.12.2
+ '@eslint/config-array': 0.21.2
+ '@eslint/config-helpers': 0.3.1
+ '@eslint/core': 0.15.2
+ '@eslint/eslintrc': 3.3.5
+ '@eslint/js': 9.32.0
+ '@eslint/plugin-kit': 0.3.5
+ '@humanfs/node': 0.16.7
+ '@humanwhocodes/module-importer': 1.0.1
+ '@humanwhocodes/retry': 0.4.3
+ '@types/estree': 1.0.8
+ '@types/json-schema': 7.0.15
+ ajv: 6.14.0
+ chalk: 4.1.2
+ cross-spawn: 7.0.6
+ debug: 4.4.3(supports-color@5.5.0)
+ escape-string-regexp: 4.0.0
+ eslint-scope: 8.4.0
+ eslint-visitor-keys: 4.2.1
+ espree: 10.4.0
+ esquery: 1.7.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 8.0.0
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ ignore: 5.3.2
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ json-stable-stringify-without-jsonify: 1.0.1
+ lodash.merge: 4.6.2
+ minimatch: 3.1.5
+ natural-compare: 1.4.0
+ optionator: 0.9.4
+ transitivePeerDependencies:
+ - supports-color
+
+ espree@10.4.0:
+ dependencies:
+ acorn: 8.16.0
+ acorn-jsx: 5.3.2(acorn@8.16.0)
+ eslint-visitor-keys: 4.2.1
+
+ esquery@1.7.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ esrecurse@4.3.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ estraverse@5.3.0: {}
+
+ estree-util-is-identifier-name@3.0.0: {}
+
+ estree-walker@2.0.2: {}
+
+ estree-walker@3.0.3:
+ dependencies:
+ '@types/estree': 1.0.8
+
+ esutils@2.0.3: {}
+
+ eventemitter3@4.0.7: {}
+
+ expect-type@1.3.0: {}
+
+ exsolve@1.0.8: {}
+
+ extend@3.0.2: {}
+
+ fast-deep-equal@1.1.0: {}
+
+ fast-deep-equal@3.1.3: {}
+
+ fast-equals@5.4.0: {}
+
+ fast-json-patch@3.1.1: {}
+
+ fast-json-stable-stringify@2.1.0: {}
+
+ fast-levenshtein@2.0.6: {}
+
+ fast-safe-stringify@2.1.1: {}
+
+ fast-text-encoding@1.0.6: {}
+
+ fast-uri@3.1.0: {}
+
+ fault@1.0.4:
+ dependencies:
+ format: 0.2.2
+
+ fdir@6.5.0(picomatch@4.0.3):
+ optionalDependencies:
+ picomatch: 4.0.3
+
+ file-entry-cache@8.0.0:
+ dependencies:
+ flat-cache: 4.0.1
+
+ find-root@1.1.0: {}
+
+ find-up@5.0.0:
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+
+ flat-cache@4.0.1:
+ dependencies:
+ flatted: 3.4.1
+ keyv: 4.5.4
+
+ flatted@3.4.1: {}
+
+ follow-redirects@1.15.11: {}
+
+ for-each@0.3.5:
+ dependencies:
+ is-callable: 1.2.7
+
+ form-data@4.0.5:
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ es-set-tostringtag: 2.1.0
+ hasown: 2.0.2
+ mime-types: 2.1.35
+
+ format@0.2.2: {}
+
+ framer-motion@10.18.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ tslib: 2.8.1
+ optionalDependencies:
+ '@emotion/is-prop-valid': 0.8.8
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ framer-motion@7.10.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@motionone/dom': 10.18.0
+ hey-listen: 1.0.8
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ tslib: 2.4.0
+ optionalDependencies:
+ '@emotion/is-prop-valid': 0.8.8
+
+ fs-extra@11.3.4:
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.2.0
+ universalify: 2.0.1
+
+ fs.realpath@1.0.0: {}
+
+ fsevents@2.3.2:
+ optional: true
+
+ fsevents@2.3.3:
+ optional: true
+
+ function-bind@1.1.2: {}
+
+ function.prototype.name@1.1.8:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ functions-have-names: 1.2.3
+ hasown: 2.0.2
+ is-callable: 1.2.7
+
+ functions-have-names@1.2.3: {}
+
+ fuse.js@6.6.2: {}
+
+ generator-function@2.0.1: {}
+
+ gensync@1.0.0-beta.2: {}
+
+ get-intrinsic@1.3.0:
+ 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
+
+ get-proto@1.0.1:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.1
+
+ get-symbol-description@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+
+ get-tsconfig@4.13.6:
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+
+ glob-parent@6.0.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob@7.2.3:
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.5
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+
+ globals@14.0.0: {}
+
+ globalthis@1.0.4:
+ dependencies:
+ define-properties: 1.2.1
+ gopd: 1.2.0
+
+ globrex@0.1.2: {}
+
+ good-listener@1.2.2:
+ dependencies:
+ delegate: 3.2.0
+
+ gopd@1.2.0: {}
+
+ graceful-fs@4.2.11: {}
+
+ hammerjs@2.0.8: {}
+
+ handlebars@4.7.8:
+ dependencies:
+ minimist: 1.2.8
+ neo-async: 2.6.2
+ source-map: 0.6.1
+ wordwrap: 1.0.0
+ optionalDependencies:
+ uglify-js: 3.19.3
+
+ has-bigints@1.1.0: {}
+
+ has-flag@3.0.0: {}
+
+ has-flag@4.0.0: {}
+
+ has-property-descriptors@1.0.2:
+ dependencies:
+ es-define-property: 1.0.1
+
+ has-proto@1.2.0:
+ dependencies:
+ dunder-proto: 1.0.1
+
+ has-symbols@1.1.0: {}
+
+ has-tostringtag@1.0.2:
+ dependencies:
+ has-symbols: 1.1.0
+
+ has@1.0.4: {}
+
+ hasown@2.0.2:
+ dependencies:
+ function-bind: 1.1.2
+
+ hast-util-parse-selector@2.2.5: {}
+
+ hast-util-parse-selector@4.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hast-util-to-jsx-runtime@2.3.6:
+ dependencies:
+ '@types/estree': 1.0.8
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ hast-util-whitespace: 3.0.0
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.2.0
+ mdast-util-mdxjs-esm: 2.0.1
+ property-information: 7.1.0
+ space-separated-tokens: 2.0.2
+ style-to-js: 1.1.21
+ unist-util-position: 5.0.0
+ vfile-message: 4.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ hast-util-whitespace@3.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hastscript@6.0.0:
+ dependencies:
+ '@types/hast': 2.3.10
+ comma-separated-tokens: 1.0.8
+ hast-util-parse-selector: 2.2.5
+ property-information: 5.6.0
+ space-separated-tokens: 1.1.5
+
+ hastscript@9.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ comma-separated-tokens: 2.0.3
+ hast-util-parse-selector: 4.0.0
+ property-information: 7.1.0
+ space-separated-tokens: 2.0.2
+
+ he@1.2.0: {}
+
+ hey-listen@1.0.8: {}
+
+ highlight.js@10.7.3: {}
+
+ highlight.js@11.11.1: {}
+
+ highlightjs-vue@1.0.0: {}
+
+ hoist-non-react-statics@3.3.2:
+ dependencies:
+ react-is: 16.13.1
+
+ html-encoding-sniffer@4.0.0:
+ dependencies:
+ whatwg-encoding: 3.1.1
+
+ html-url-attributes@3.0.1: {}
+
+ http-proxy-agent@7.0.2:
+ dependencies:
+ agent-base: 7.1.4
+ debug: 4.4.3(supports-color@5.5.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ https-proxy-agent@7.0.6:
+ dependencies:
+ agent-base: 7.1.4
+ debug: 4.4.3(supports-color@5.5.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ iconv-lite@0.6.3:
+ dependencies:
+ safer-buffer: 2.1.2
+
+ ieee754@1.2.1: {}
+
+ ignore@5.3.2: {}
+
+ ignore@7.0.5: {}
+
+ immutable@3.8.3: {}
+
+ immutable@5.1.5: {}
+
+ import-fresh@3.3.1:
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+
+ import-lazy@4.0.0: {}
+
+ imurmurhash@0.1.4: {}
+
+ indent-string@4.0.0: {}
+
+ inflight@1.0.6:
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+
+ inherits@2.0.4: {}
+
+ inline-style-parser@0.2.7: {}
+
+ internal-slot@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ hasown: 2.0.2
+ side-channel: 1.1.0
+
+ internmap@2.0.3: {}
+
+ invariant@2.2.4:
+ dependencies:
+ loose-envify: 1.4.0
+
+ is-alphabetical@1.0.4: {}
+
+ is-alphabetical@2.0.1: {}
+
+ is-alphanumerical@1.0.4:
+ dependencies:
+ is-alphabetical: 1.0.4
+ is-decimal: 1.0.4
+
+ is-alphanumerical@2.0.1:
+ dependencies:
+ is-alphabetical: 2.0.1
+ is-decimal: 2.0.1
+
+ is-arguments@1.2.0:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-array-buffer@3.0.5:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+
+ is-arrayish@0.2.1: {}
+
+ is-arrayish@0.3.4: {}
+
+ is-async-function@2.1.1:
+ dependencies:
+ async-function: 1.0.0
+ call-bound: 1.0.4
+ get-proto: 1.0.1
+ has-tostringtag: 1.0.2
+ safe-regex-test: 1.1.0
+
+ is-bigint@1.1.0:
+ dependencies:
+ has-bigints: 1.1.0
+
+ is-boolean-object@1.2.2:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-bun-module@2.0.0:
+ dependencies:
+ semver: 7.7.4
+
+ is-callable@1.2.7: {}
+
+ is-core-module@2.16.1:
+ dependencies:
+ hasown: 2.0.2
+
+ is-data-view@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ is-typed-array: 1.1.15
+
+ is-date-object@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-decimal@1.0.4: {}
+
+ is-decimal@2.0.1: {}
+
+ is-extglob@2.1.1: {}
+
+ is-finalizationregistry@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+
+ is-generator-function@1.1.2:
+ dependencies:
+ call-bound: 1.0.4
+ generator-function: 2.0.1
+ get-proto: 1.0.1
+ has-tostringtag: 1.0.2
+ safe-regex-test: 1.1.0
+
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
+
+ is-hexadecimal@1.0.4: {}
+
+ is-hexadecimal@2.0.1: {}
+
+ is-immutable-type@5.0.1(eslint@9.32.0)(typescript@5.9.3):
+ dependencies:
+ '@typescript-eslint/type-utils': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ eslint: 9.32.0
+ ts-api-utils: 2.4.0(typescript@5.9.3)
+ ts-declaration-location: 1.0.7(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ is-map@2.0.3: {}
+
+ is-negative-zero@2.0.3: {}
+
+ is-number-object@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-plain-obj@4.1.0: {}
+
+ is-potential-custom-element-name@1.0.1: {}
+
+ is-regex@1.1.4:
+ dependencies:
+ call-bind: 1.0.8
+ has-tostringtag: 1.0.2
+
+ is-regex@1.2.1:
+ dependencies:
+ call-bound: 1.0.4
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+
+ is-set@2.0.3: {}
+
+ is-shared-array-buffer@1.0.4:
+ dependencies:
+ call-bound: 1.0.4
+
+ is-string@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-symbol@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+ has-symbols: 1.1.0
+ safe-regex-test: 1.1.0
+
+ is-typed-array@1.1.15:
+ dependencies:
+ which-typed-array: 1.1.20
+
+ is-weakmap@2.0.2: {}
+
+ is-weakref@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+
+ is-weakset@2.0.4:
+ dependencies:
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+
+ isarray@2.0.5: {}
+
+ isexe@2.0.0: {}
+
+ jju@1.4.0: {}
+
+ jotai@2.18.1(@babel/core@7.29.0)(@babel/template@7.28.6)(@types/react@18.3.28)(react@18.3.1):
+ optionalDependencies:
+ '@babel/core': 7.29.0
+ '@babel/template': 7.28.6
+ '@types/react': 18.3.28
+ react: 18.3.1
+
+ js-cookie@3.0.5: {}
+
+ js-file-download@0.4.12: {}
+
+ js-sha3@0.8.0: {}
+
+ js-tokens@4.0.0: {}
+
+ js-tokens@9.0.1: {}
+
+ js-yaml@4.1.1:
+ dependencies:
+ argparse: 2.0.1
+
+ jsdom@26.1.0:
+ dependencies:
+ cssstyle: 4.6.0
+ data-urls: 5.0.0
+ decimal.js: 10.6.0
+ html-encoding-sniffer: 4.0.0
+ http-proxy-agent: 7.0.2
+ https-proxy-agent: 7.0.6
+ is-potential-custom-element-name: 1.0.1
+ nwsapi: 2.2.23
+ parse5: 7.3.0
+ rrweb-cssom: 0.8.0
+ saxes: 6.0.0
+ symbol-tree: 3.2.4
+ tough-cookie: 5.1.2
+ w3c-xmlserializer: 5.0.0
+ webidl-conversions: 7.0.0
+ whatwg-encoding: 3.1.1
+ whatwg-mimetype: 4.0.0
+ whatwg-url: 14.2.0
+ ws: 8.19.0
+ xml-name-validator: 5.0.0
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
+ jsesc@3.1.0: {}
+
+ json-buffer@3.0.1: {}
+
+ json-parse-even-better-errors@2.3.1: {}
+
+ json-schema-traverse@0.4.1: {}
+
+ json-schema-traverse@1.0.0: {}
+
+ json-stable-stringify-without-jsonify@1.0.1: {}
+
+ json5@1.0.2:
+ dependencies:
+ minimist: 1.2.8
+
+ json5@2.2.3: {}
+
+ jsonfile@6.2.0:
+ dependencies:
+ universalify: 2.0.1
+ optionalDependencies:
+ graceful-fs: 4.2.11
+
+ jsonpath-plus@6.0.1: {}
+
+ keycharm@0.3.1: {}
+
+ keyv@4.5.4:
+ dependencies:
+ json-buffer: 3.0.1
+
+ kld-affine@2.1.1: {}
+
+ kld-intersections@0.7.0:
+ dependencies:
+ kld-affine: 2.1.1
+ kld-path-parser: 0.2.1
+ kld-polynomial: 0.3.0
+
+ kld-path-parser@0.2.1: {}
+
+ kld-polynomial@0.3.0: {}
+
+ kolorist@1.8.0: {}
+
+ levn@0.4.1:
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+
+ lines-and-columns@1.2.4: {}
+
+ load-script@1.0.0: {}
+
+ local-pkg@1.1.2:
+ dependencies:
+ mlly: 1.8.1
+ pkg-types: 2.3.0
+ quansync: 0.2.11
+
+ locate-path@6.0.0:
+ dependencies:
+ p-locate: 5.0.0
+
+ lodash.debounce@4.0.8: {}
+
+ lodash.merge@4.6.2: {}
+
+ lodash@4.17.23: {}
+
+ longest-streak@3.1.0: {}
+
+ loose-envify@1.4.0:
+ dependencies:
+ js-tokens: 4.0.0
+
+ loupe@3.2.1: {}
+
+ lower-case@2.0.2:
+ dependencies:
+ tslib: 2.8.1
+
+ lowlight@1.20.0:
+ dependencies:
+ fault: 1.0.4
+ highlight.js: 10.7.3
+
+ lru-cache@10.4.3: {}
+
+ lru-cache@5.1.1:
+ dependencies:
+ yallist: 3.1.1
+
+ lru-cache@6.0.0:
+ dependencies:
+ yallist: 4.0.0
+
+ luxon@3.7.2: {}
+
+ lz-string@1.5.0: {}
+
+ magic-string@0.30.21:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ markdown-table@3.0.4: {}
+
+ marked@14.0.0: {}
+
+ match-sorter@6.3.4:
+ dependencies:
+ '@babel/runtime': 7.28.6
+ remove-accents: 0.5.0
+
+ math-intrinsics@1.1.0: {}
+
+ mdast-util-directive@3.1.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ ccount: 2.0.1
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ parse-entities: 4.0.2
+ stringify-entities: 4.0.4
+ unist-util-visit-parents: 6.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-find-and-replace@3.0.2:
+ dependencies:
+ '@types/mdast': 4.0.4
+ escape-string-regexp: 5.0.0
+ unist-util-is: 6.0.1
+ unist-util-visit-parents: 6.0.2
+
+ mdast-util-from-markdown@2.0.3:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ decode-named-character-reference: 1.3.0
+ devlop: 1.1.0
+ mdast-util-to-string: 4.0.0
+ micromark: 4.0.2
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-decode-string: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ unist-util-stringify-position: 4.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-autolink-literal@2.0.1:
+ dependencies:
+ '@types/mdast': 4.0.4
+ ccount: 2.0.1
+ devlop: 1.1.0
+ mdast-util-find-and-replace: 3.0.2
+ micromark-util-character: 2.1.1
+
+ mdast-util-gfm-footnote@2.1.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ micromark-util-normalize-identifier: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-strikethrough@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-table@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ markdown-table: 3.0.4
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-task-list-item@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm@3.1.0:
+ dependencies:
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-gfm-autolink-literal: 2.0.1
+ mdast-util-gfm-footnote: 2.1.0
+ mdast-util-gfm-strikethrough: 2.0.0
+ mdast-util-gfm-table: 2.0.0
+ mdast-util-gfm-task-list-item: 2.0.0
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdx-expression@2.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdx-jsx@3.2.0:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ ccount: 2.0.1
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ parse-entities: 4.0.2
+ stringify-entities: 4.0.4
+ unist-util-stringify-position: 4.0.0
+ vfile-message: 4.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdxjs-esm@2.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-phrasing@4.1.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ unist-util-is: 6.0.1
+
+ mdast-util-to-hast@13.2.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ '@ungap/structured-clone': 1.3.0
+ devlop: 1.1.0
+ micromark-util-sanitize-uri: 2.0.1
+ trim-lines: 3.0.1
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.1.0
+ vfile: 6.0.3
+
+ mdast-util-to-markdown@2.1.2:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ longest-streak: 3.1.0
+ mdast-util-phrasing: 4.1.0
+ mdast-util-to-string: 4.0.0
+ micromark-util-classify-character: 2.0.1
+ micromark-util-decode-string: 2.0.1
+ unist-util-visit: 5.1.0
+ zwitch: 2.0.4
+
+ mdast-util-to-string@4.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+
+ memoize-one@5.2.1: {}
+
+ micromark-core-commonmark@2.0.3:
+ dependencies:
+ decode-named-character-reference: 1.3.0
+ devlop: 1.1.0
+ micromark-factory-destination: 2.0.1
+ micromark-factory-label: 2.0.1
+ micromark-factory-space: 2.0.1
+ micromark-factory-title: 2.0.1
+ micromark-factory-whitespace: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-chunked: 2.0.1
+ micromark-util-classify-character: 2.0.1
+ micromark-util-html-tag-name: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-subtokenize: 2.1.0
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-directive@3.0.2:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-factory-whitespace: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ parse-entities: 4.0.2
+
+ micromark-extension-gfm-autolink-literal@2.1.0:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-footnote@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.3
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-strikethrough@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.1
+ micromark-util-classify-character: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-table@2.1.1:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-tagfilter@2.0.0:
+ dependencies:
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-task-list-item@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm@3.0.0:
+ dependencies:
+ micromark-extension-gfm-autolink-literal: 2.1.0
+ micromark-extension-gfm-footnote: 2.1.0
+ micromark-extension-gfm-strikethrough: 2.1.0
+ micromark-extension-gfm-table: 2.1.1
+ micromark-extension-gfm-tagfilter: 2.0.0
+ micromark-extension-gfm-task-list-item: 2.1.0
+ micromark-util-combine-extensions: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-destination@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-label@2.0.1:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-space@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-title@2.0.1:
+ dependencies:
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-whitespace@2.0.1:
+ dependencies:
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-character@2.1.1:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-chunked@2.0.1:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-classify-character@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-combine-extensions@2.0.1:
+ dependencies:
+ micromark-util-chunked: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-decode-numeric-character-reference@2.0.2:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-decode-string@2.0.1:
+ dependencies:
+ decode-named-character-reference: 1.3.0
+ micromark-util-character: 2.1.1
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-encode@2.0.1: {}
+
+ micromark-util-html-tag-name@2.0.1: {}
+
+ micromark-util-normalize-identifier@2.0.1:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-resolve-all@2.0.1:
+ dependencies:
+ micromark-util-types: 2.0.2
+
+ micromark-util-sanitize-uri@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-encode: 2.0.1
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-subtokenize@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-symbol@2.0.1: {}
+
+ micromark-util-types@2.0.2: {}
+
+ micromark@4.0.2:
+ dependencies:
+ '@types/debug': 4.1.12
+ debug: 4.4.3(supports-color@5.5.0)
+ decode-named-character-reference: 1.3.0
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.3
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-chunked: 2.0.1
+ micromark-util-combine-extensions: 2.0.1
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-encode: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-subtokenize: 2.1.0
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ microseconds@0.2.0: {}
+
+ mime-db@1.52.0: {}
+
+ mime-types@2.1.35:
+ dependencies:
+ mime-db: 1.52.0
+
+ min-indent@1.0.1: {}
+
+ minim@0.23.8:
+ dependencies:
+ lodash: 4.17.23
+
+ minimatch@10.2.3:
+ dependencies:
+ brace-expansion: 5.0.4
+
+ minimatch@10.2.4:
+ dependencies:
+ brace-expansion: 5.0.4
+
+ minimatch@3.1.5:
+ dependencies:
+ brace-expansion: 1.1.12
+
+ minimatch@9.0.9:
+ dependencies:
+ brace-expansion: 2.0.2
+
+ minimist@1.2.8: {}
+
+ mlly@1.8.1:
+ dependencies:
+ acorn: 8.16.0
+ pathe: 2.0.3
+ pkg-types: 1.3.1
+ ufo: 1.6.3
+
+ mock-json-schema@1.1.2:
+ dependencies:
+ lodash: 4.17.23
+
+ mock-property@1.0.3:
+ dependencies:
+ define-data-property: 1.1.4
+ functions-have-names: 1.2.3
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+ hasown: 2.0.2
+ isarray: 2.0.5
+
+ moment@2.30.1: {}
+
+ monaco-editor@0.55.1:
+ dependencies:
+ dompurify: 3.2.7
+ marked: 14.0.0
+
+ monaco-languages-jq@1.0.0: {}
+
+ mousetrap@1.6.5: {}
+
+ ms@2.1.3: {}
+
+ muggle-string@0.4.1: {}
+
+ nano-time@1.0.0:
+ dependencies:
+ big-integer: 1.6.52
+
+ nanoid@3.3.11: {}
+
+ napi-postinstall@0.3.4: {}
+
+ natural-compare@1.4.0: {}
+
+ neo-async@2.6.2: {}
+
+ neotraverse@0.6.18: {}
+
+ next@16.1.6(@babel/core@7.29.0)(@playwright/test@1.58.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.97.3):
+ dependencies:
+ '@next/env': 16.1.6
+ '@swc/helpers': 0.5.15
+ baseline-browser-mapping: 2.10.0
+ caniuse-lite: 1.0.30001777
+ postcss: 8.4.31
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ styled-jsx: 5.1.6(@babel/core@7.29.0)(react@18.3.1)
+ optionalDependencies:
+ '@next/swc-darwin-arm64': 16.1.6
+ '@next/swc-darwin-x64': 16.1.6
+ '@next/swc-linux-arm64-gnu': 16.1.6
+ '@next/swc-linux-arm64-musl': 16.1.6
+ '@next/swc-linux-x64-gnu': 16.1.6
+ '@next/swc-linux-x64-musl': 16.1.6
+ '@next/swc-win32-arm64-msvc': 16.1.6
+ '@next/swc-win32-x64-msvc': 16.1.6
+ '@playwright/test': 1.58.2
+ sass: 1.97.3
+ sharp: 0.34.5
+ transitivePeerDependencies:
+ - '@babel/core'
+ - babel-plugin-macros
+
+ no-case@3.0.4:
+ dependencies:
+ lower-case: 2.0.2
+ tslib: 2.8.1
+
+ node-abort-controller@3.1.1: {}
+
+ node-addon-api@7.1.1:
+ optional: true
+
+ node-addon-api@8.6.0:
+ optional: true
+
+ node-cache@5.1.2:
+ dependencies:
+ clone: 2.1.2
+
+ node-domexception@1.0.0: {}
+
+ node-fetch-commonjs@3.3.2:
+ dependencies:
+ node-domexception: 1.0.0
+ web-streams-polyfill: 3.3.3
+
+ node-fetch@2.7.0:
+ dependencies:
+ whatwg-url: 5.0.0
+
+ node-gyp-build@4.8.4:
+ optional: true
+
+ node-releases@2.0.36: {}
+
+ nwsapi@2.2.23: {}
+
+ object-assign@4.1.1: {}
+
+ object-inspect@1.12.3: {}
+
+ object-inspect@1.13.4: {}
+
+ object-is@1.1.6:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+
+ object-keys@1.1.1: {}
+
+ object.assign@4.1.7:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+ has-symbols: 1.1.0
+ object-keys: 1.1.1
+
+ object.fromentries@2.0.8:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-object-atoms: 1.1.1
+
+ object.groupby@1.0.3:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+
+ object.values@1.2.1:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+
+ oblivious-set@1.0.0: {}
+
+ oblivious-set@1.1.1: {}
+
+ once@1.4.0:
+ dependencies:
+ wrappy: 1.0.2
+
+ openapi-path-templating@2.2.1:
+ dependencies:
+ apg-lite: 1.0.5
+
+ openapi-server-url-templating@1.3.0:
+ dependencies:
+ apg-lite: 1.0.5
+
+ optionator@0.9.4:
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.5
+
+ own-keys@1.0.1:
+ dependencies:
+ get-intrinsic: 1.3.0
+ object-keys: 1.1.1
+ safe-push-apply: 1.0.0
+
+ p-cancelable@2.1.1: {}
+
+ p-cancelable@3.0.0: {}
+
+ p-finally@1.0.0: {}
+
+ p-limit@3.1.0:
+ dependencies:
+ yocto-queue: 0.1.0
+
+ p-locate@5.0.0:
+ dependencies:
+ p-limit: 3.1.0
+
+ p-queue@6.6.2:
+ dependencies:
+ eventemitter3: 4.0.7
+ p-timeout: 3.2.0
+
+ p-timeout@3.2.0:
+ dependencies:
+ p-finally: 1.0.0
+
+ parent-module@1.0.1:
+ dependencies:
+ callsites: 3.1.0
+
+ parse-entities@2.0.0:
+ dependencies:
+ character-entities: 1.2.4
+ character-entities-legacy: 1.1.4
+ character-reference-invalid: 1.1.4
+ is-alphanumerical: 1.0.4
+ is-decimal: 1.0.4
+ is-hexadecimal: 1.0.4
+
+ parse-entities@4.0.2:
+ dependencies:
+ '@types/unist': 2.0.11
+ character-entities-legacy: 3.0.0
+ character-reference-invalid: 2.0.1
+ decode-named-character-reference: 1.3.0
+ is-alphanumerical: 2.0.1
+ is-decimal: 2.0.1
+ is-hexadecimal: 2.0.1
+
+ parse-json@5.2.0:
+ dependencies:
+ '@babel/code-frame': 7.29.0
+ error-ex: 1.3.4
+ json-parse-even-better-errors: 2.3.1
+ lines-and-columns: 1.2.4
+
+ parse-ms@2.1.0: {}
+
+ parse5@7.3.0:
+ dependencies:
+ entities: 6.0.1
+
+ path-browserify@1.0.1: {}
+
+ path-exists@4.0.0: {}
+
+ path-is-absolute@1.0.1: {}
+
+ path-key@3.1.1: {}
+
+ path-parse@1.0.7: {}
+
+ path-to-regexp@8.3.0: {}
+
+ path-type@4.0.0: {}
+
+ pathe@2.0.3: {}
+
+ pathval@2.0.1: {}
+
+ picocolors@1.1.1: {}
+
+ picomatch@2.3.1: {}
+
+ picomatch@4.0.3: {}
+
+ pkg-types@1.3.1:
+ dependencies:
+ confbox: 0.1.8
+ mlly: 1.8.1
+ pathe: 2.0.3
+
+ pkg-types@2.3.0:
+ dependencies:
+ confbox: 0.2.4
+ exsolve: 1.0.8
+ pathe: 2.0.3
+
+ playwright-core@1.58.2: {}
+
+ playwright@1.58.2:
+ dependencies:
+ playwright-core: 1.58.2
+ optionalDependencies:
+ fsevents: 2.3.2
+
+ popper.js@1.16.1: {}
+
+ possible-typed-array-names@1.1.0: {}
+
+ postcss-value-parser@4.2.0: {}
+
+ postcss@8.4.31:
+ dependencies:
+ nanoid: 3.3.11
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ postcss@8.5.8:
+ dependencies:
+ nanoid: 3.3.11
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ prelude-ls@1.2.1: {}
+
+ prettier@3.8.1: {}
+
+ pretty-format@27.5.1:
+ dependencies:
+ ansi-regex: 5.0.1
+ ansi-styles: 5.2.0
+ react-is: 17.0.2
+
+ prismjs@1.27.0: {}
+
+ prismjs@1.30.0: {}
+
+ promise-polyfill@8.3.0: {}
+
+ prop-types@15.8.1:
+ dependencies:
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+ react-is: 16.13.1
+
+ propagating-hammerjs@1.5.0:
+ dependencies:
+ hammerjs: 2.0.8
+
+ property-expr@2.0.6: {}
+
+ property-information@5.6.0:
+ dependencies:
+ xtend: 4.0.2
+
+ property-information@7.1.0: {}
+
+ proxy-from-env@1.1.0: {}
+
+ punycode@2.3.1: {}
+
+ pvtsutils@1.3.6:
+ dependencies:
+ tslib: 2.8.1
+
+ pvutils@1.1.5: {}
+
+ q@1.4.1: {}
+
+ qs@6.15.0:
+ dependencies:
+ side-channel: 1.1.0
+
+ quansync@0.2.11: {}
+
+ query-state-core@3.1.0: {}
+
+ querystringify@2.2.0: {}
+
+ ramda-adjunct@5.1.0(ramda@0.30.1):
+ dependencies:
+ ramda: 0.30.1
+
+ ramda@0.30.1: {}
+
+ randexp@0.5.3:
+ dependencies:
+ drange: 1.1.1
+ ret: 0.2.2
+
+ randombytes@2.1.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ rdk@6.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ body-scroll-lock-upgrade: 1.1.0
+ classnames: 2.5.1
+ framer-motion: 10.18.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ popper.js: 1.16.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ react-confetti@6.4.0(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ tween-functions: 1.2.0
+
+ react-container-query@0.12.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ container-query-toolkit: 0.1.3
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ resize-observer-lite: 0.2.3
+
+ react-cool-dimensions@2.0.7(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+
+ react-copy-to-clipboard@5.1.0(react@18.3.1):
+ dependencies:
+ copy-to-clipboard: 3.3.3
+ prop-types: 15.8.1
+ react: 18.3.1
+
+ react-data-table-component@7.7.0(react@18.3.1)(styled-components@5.3.11(@babel/core@7.29.0)(react-dom@18.3.1(react@18.3.1))(react-is@19.2.4)(react@18.3.1)):
+ dependencies:
+ deepmerge: 4.3.1
+ react: 18.3.1
+ styled-components: 5.3.11(@babel/core@7.29.0)(react-dom@18.3.1(react@18.3.1))(react-is@19.2.4)(react@18.3.1)
+
+ react-datepicker@6.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@floating-ui/react': 0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ clsx: 2.1.1
+ date-fns: 3.6.0
+ prop-types: 15.8.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-onclickoutside: 6.13.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+
+ react-debounce-input@3.3.0(react@18.3.1):
+ dependencies:
+ lodash.debounce: 4.0.8
+ prop-types: 15.8.1
+ react: 18.3.1
+
+ react-dom@18.3.1(react@18.3.1):
+ dependencies:
+ loose-envify: 1.4.0
+ react: 18.3.1
+ scheduler: 0.23.2
+
+ react-fast-compare@3.2.2: {}
+
+ react-helmet@6.1.0(react@18.3.1):
+ dependencies:
+ object-assign: 4.1.1
+ prop-types: 15.8.1
+ react: 18.3.1
+ react-fast-compare: 3.2.2
+ react-side-effect: 2.1.2(react@18.3.1)
+
+ react-highlight@0.15.0:
+ dependencies:
+ highlight.js: 10.7.3
+
+ react-hook-form@7.71.2(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+
+ react-hotkeys-hook@4.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ react-immutable-proptypes@2.2.0(immutable@3.8.3):
+ dependencies:
+ immutable: 3.8.3
+ invariant: 2.2.4
+
+ react-immutable-pure-component@2.2.2(immutable@3.8.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ immutable: 3.8.3
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ react-inspector@6.0.2(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+
+ react-is@16.13.1: {}
+
+ react-is@17.0.2: {}
+
+ react-is@18.3.1: {}
+
+ react-is@19.2.4: {}
+
+ react-markdown@10.1.0(@types/react@18.3.28)(react@18.3.1):
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ '@types/react': 18.3.28
+ devlop: 1.1.0
+ hast-util-to-jsx-runtime: 2.3.6
+ html-url-attributes: 3.0.1
+ mdast-util-to-hast: 13.2.1
+ react: 18.3.1
+ remark-parse: 11.0.0
+ remark-rehype: 11.1.2
+ unified: 11.0.5
+ unist-util-visit: 5.1.0
+ vfile: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ react-number-format@5.4.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ react-onclickoutside@6.13.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ react-player@2.16.1(react@18.3.1):
+ dependencies:
+ deepmerge: 4.3.1
+ load-script: 1.0.0
+ memoize-one: 5.2.1
+ prop-types: 15.8.1
+ react: 18.3.1
+ react-fast-compare: 3.2.2
+
+ react-query@3.39.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.28.6
+ broadcast-channel: 3.7.0
+ match-sorter: 6.3.4
+ react: 18.3.1
+ optionalDependencies:
+ react-dom: 18.3.1(react@18.3.1)
+
+ react-redux@9.2.0(@types/react@18.3.28)(react@18.3.1)(redux@5.0.1):
+ dependencies:
+ '@types/use-sync-external-store': 0.0.6
+ react: 18.3.1
+ use-sync-external-store: 1.6.0(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.28
+ redux: 5.0.1
+
+ react-refresh@0.17.0: {}
+
+ react-router-dom@7.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-router: 7.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+
+ react-router-use-location-state@3.1.2(@types/react@18.3.28)(next@16.1.6(@babel/core@7.29.0)(@playwright/test@1.58.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.97.3))(react-router@7.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ react-router: 7.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ use-location-state: 3.1.2(@types/react@18.3.28)(next@16.1.6(@babel/core@7.29.0)(@playwright/test@1.58.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.97.3))(react@18.3.1)
+ transitivePeerDependencies:
+ - '@types/react'
+ - next
+
+ react-router@7.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ cookie: 1.1.1
+ react: 18.3.1
+ set-cookie-parser: 2.7.2
+ optionalDependencies:
+ react-dom: 18.3.1(react@18.3.1)
+
+ react-side-effect@2.1.2(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+
+ react-smooth@4.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ fast-equals: 5.4.0
+ prop-types: 15.8.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+
+ react-syntax-highlighter@15.6.6(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.28.6
+ highlight.js: 10.7.3
+ highlightjs-vue: 1.0.0
+ lowlight: 1.20.0
+ prismjs: 1.30.0
+ react: 18.3.1
+ refractor: 3.6.0
+
+ react-syntax-highlighter@16.1.1(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.28.6
+ highlight.js: 10.7.3
+ highlightjs-vue: 1.0.0
+ lowlight: 1.20.0
+ prismjs: 1.30.0
+ react: 18.3.1
+ refractor: 5.0.0
+
+ react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.28.6
+ dom-helpers: 5.2.1
+ loose-envify: 1.4.0
+ prop-types: 15.8.1
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ react-use-gesture@8.0.1(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+
+ react-vis-timeline@2.0.3(lodash@4.17.23)(moment@2.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@egjs/hammerjs': 2.0.17
+ component-emitter: 1.3.1
+ keycharm: 0.3.1
+ lodash: 4.17.23
+ moment: 2.30.1
+ propagating-hammerjs: 1.5.0
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ uuid: 7.0.3
+ vis-data: 6.6.1(moment@2.30.1)(uuid@8.3.2)(vis-util@4.3.4)
+ vis-timeline: 7.3.6(@egjs/hammerjs@2.0.17)(component-emitter@1.3.1)(keycharm@0.3.1)(moment@2.30.1)(propagating-hammerjs@1.5.0)(uuid@7.0.3)(vis-data@6.6.1(moment@2.30.1)(uuid@7.0.3)(vis-util@4.3.4))(vis-util@4.3.4)
+ vis-util: 4.3.4
+
+ react@18.3.1:
+ dependencies:
+ loose-envify: 1.4.0
+
+ readdirp@4.1.2: {}
+
+ reaflow@5.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ calculate-size: 1.1.1
+ classnames: 2.5.1
+ d3-shape: 3.2.0
+ elkjs: 0.8.2
+ ellipsize: 0.2.0
+ framer-motion: 7.10.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ kld-affine: 2.1.1
+ kld-intersections: 0.7.0
+ p-cancelable: 3.0.0
+ rdk: 6.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react: 18.3.1
+ react-cool-dimensions: 2.0.7(react@18.3.1)
+ react-dom: 18.3.1(react@18.3.1)
+ react-fast-compare: 3.2.2
+ react-use-gesture: 8.0.1(react@18.3.1)
+ reakeys: 1.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ undoo: 0.5.0
+
+ reakeys@1.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ mousetrap: 1.6.5
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ recharts-scale@0.4.5:
+ dependencies:
+ decimal.js-light: 2.5.1
+
+ recharts@2.15.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ clsx: 2.1.1
+ eventemitter3: 4.0.7
+ lodash: 4.17.23
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-is: 18.3.1
+ react-smooth: 4.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ recharts-scale: 0.4.5
+ tiny-invariant: 1.3.3
+ victory-vendor: 36.9.2
+
+ redent@3.0.0:
+ dependencies:
+ indent-string: 4.0.0
+ strip-indent: 3.0.0
+
+ redux-immutable@4.0.0(immutable@3.8.3):
+ dependencies:
+ immutable: 3.8.3
+
+ redux@5.0.1: {}
+
+ reflect.getprototypeof@1.0.10:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ which-builtin-type: 1.2.1
+
+ refractor@3.6.0:
+ dependencies:
+ hastscript: 6.0.0
+ parse-entities: 2.0.0
+ prismjs: 1.27.0
+
+ refractor@5.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/prismjs': 1.26.6
+ hastscript: 9.0.1
+ parse-entities: 4.0.2
+
+ regexp.prototype.flags@1.5.4:
+ 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
+
+ remark-directive@3.0.1:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-directive: 3.1.0
+ micromark-extension-directive: 3.0.2
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-gfm@4.0.1:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-gfm: 3.1.0
+ micromark-extension-gfm: 3.0.0
+ remark-parse: 11.0.0
+ remark-stringify: 11.0.0
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-parse@11.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-from-markdown: 2.0.3
+ micromark-util-types: 2.0.2
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-rehype@11.1.2:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ mdast-util-to-hast: 13.2.1
+ unified: 11.0.5
+ vfile: 6.0.3
+
+ remark-stringify@11.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-to-markdown: 2.1.2
+ unified: 11.0.5
+
+ remarkable@2.0.1:
+ dependencies:
+ argparse: 1.0.10
+ autolinker: 3.16.2
+
+ remove-accents@0.4.4: {}
+
+ remove-accents@0.5.0: {}
+
+ repeat-string@1.6.1: {}
+
+ require-from-string@2.0.2: {}
+
+ requires-port@1.0.0: {}
+
+ reselect@5.1.1: {}
+
+ resize-observer-lite@0.2.3:
+ dependencies:
+ element-resize-detector: 1.1.13
+
+ resolve-from@4.0.0: {}
+
+ resolve-pkg-maps@1.0.0: {}
+
+ resolve@1.22.11:
+ dependencies:
+ is-core-module: 2.16.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ ret@0.2.2: {}
+
+ rimraf@3.0.2:
+ dependencies:
+ glob: 7.2.3
+
+ rollup@4.59.0:
+ dependencies:
+ '@types/estree': 1.0.8
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.59.0
+ '@rollup/rollup-android-arm64': 4.59.0
+ '@rollup/rollup-darwin-arm64': 4.59.0
+ '@rollup/rollup-darwin-x64': 4.59.0
+ '@rollup/rollup-freebsd-arm64': 4.59.0
+ '@rollup/rollup-freebsd-x64': 4.59.0
+ '@rollup/rollup-linux-arm-gnueabihf': 4.59.0
+ '@rollup/rollup-linux-arm-musleabihf': 4.59.0
+ '@rollup/rollup-linux-arm64-gnu': 4.59.0
+ '@rollup/rollup-linux-arm64-musl': 4.59.0
+ '@rollup/rollup-linux-loong64-gnu': 4.59.0
+ '@rollup/rollup-linux-loong64-musl': 4.59.0
+ '@rollup/rollup-linux-ppc64-gnu': 4.59.0
+ '@rollup/rollup-linux-ppc64-musl': 4.59.0
+ '@rollup/rollup-linux-riscv64-gnu': 4.59.0
+ '@rollup/rollup-linux-riscv64-musl': 4.59.0
+ '@rollup/rollup-linux-s390x-gnu': 4.59.0
+ '@rollup/rollup-linux-x64-gnu': 4.59.0
+ '@rollup/rollup-linux-x64-musl': 4.59.0
+ '@rollup/rollup-openbsd-x64': 4.59.0
+ '@rollup/rollup-openharmony-arm64': 4.59.0
+ '@rollup/rollup-win32-arm64-msvc': 4.59.0
+ '@rollup/rollup-win32-ia32-msvc': 4.59.0
+ '@rollup/rollup-win32-x64-gnu': 4.59.0
+ '@rollup/rollup-win32-x64-msvc': 4.59.0
+ fsevents: 2.3.3
+
+ rrweb-cssom@0.8.0: {}
+
+ safe-array-concat@1.1.3:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ has-symbols: 1.1.0
+ isarray: 2.0.5
+
+ safe-buffer@5.2.1: {}
+
+ safe-push-apply@1.0.0:
+ dependencies:
+ es-errors: 1.3.0
+ isarray: 2.0.5
+
+ safe-regex-test@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-regex: 1.2.1
+
+ safer-buffer@2.1.2: {}
+
+ sass@1.97.3:
+ dependencies:
+ chokidar: 4.0.3
+ immutable: 5.1.5
+ source-map-js: 1.2.1
+ optionalDependencies:
+ '@parcel/watcher': 2.5.6
+
+ saxes@6.0.0:
+ dependencies:
+ xmlchars: 2.2.0
+
+ scheduler@0.23.2:
+ dependencies:
+ loose-envify: 1.4.0
+
+ select@1.1.2: {}
+
+ semver@6.3.1: {}
+
+ semver@7.5.4:
+ dependencies:
+ lru-cache: 6.0.0
+
+ semver@7.7.4: {}
+
+ serialize-error@8.1.0:
+ dependencies:
+ type-fest: 0.20.2
+
+ set-cookie-parser@2.7.2: {}
+
+ set-function-length@1.2.2:
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.3.0
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+
+ set-function-name@2.0.2:
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ functions-have-names: 1.2.3
+ has-property-descriptors: 1.0.2
+
+ set-proto@1.0.0:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+
+ sha.js@2.4.12:
+ dependencies:
+ inherits: 2.0.4
+ safe-buffer: 5.2.1
+ to-buffer: 1.2.2
+
+ shallowequal@1.1.0: {}
+
+ sharp@0.34.5:
+ dependencies:
+ '@img/colour': 1.1.0
+ detect-libc: 2.1.2
+ semver: 7.7.4
+ optionalDependencies:
+ '@img/sharp-darwin-arm64': 0.34.5
+ '@img/sharp-darwin-x64': 0.34.5
+ '@img/sharp-libvips-darwin-arm64': 1.2.4
+ '@img/sharp-libvips-darwin-x64': 1.2.4
+ '@img/sharp-libvips-linux-arm': 1.2.4
+ '@img/sharp-libvips-linux-arm64': 1.2.4
+ '@img/sharp-libvips-linux-ppc64': 1.2.4
+ '@img/sharp-libvips-linux-riscv64': 1.2.4
+ '@img/sharp-libvips-linux-s390x': 1.2.4
+ '@img/sharp-libvips-linux-x64': 1.2.4
+ '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
+ '@img/sharp-libvips-linuxmusl-x64': 1.2.4
+ '@img/sharp-linux-arm': 0.34.5
+ '@img/sharp-linux-arm64': 0.34.5
+ '@img/sharp-linux-ppc64': 0.34.5
+ '@img/sharp-linux-riscv64': 0.34.5
+ '@img/sharp-linux-s390x': 0.34.5
+ '@img/sharp-linux-x64': 0.34.5
+ '@img/sharp-linuxmusl-arm64': 0.34.5
+ '@img/sharp-linuxmusl-x64': 0.34.5
+ '@img/sharp-wasm32': 0.34.5
+ '@img/sharp-win32-arm64': 0.34.5
+ '@img/sharp-win32-ia32': 0.34.5
+ '@img/sharp-win32-x64': 0.34.5
+ optional: true
+
+ shebang-command@2.0.0:
+ dependencies:
+ shebang-regex: 3.0.0
+
+ shebang-regex@3.0.0: {}
+
+ short-unique-id@5.3.2: {}
+
+ side-channel-list@1.0.0:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-map@1.0.1:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-weakmap@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-map: 1.0.1
+
+ side-channel@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-list: 1.0.0
+ side-channel-map: 1.0.1
+ side-channel-weakmap: 1.0.2
+
+ siginfo@2.0.0: {}
+
+ simple-swizzle@0.2.4:
+ dependencies:
+ is-arrayish: 0.3.4
+
+ snake-case@3.0.4:
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.8.1
+
+ source-map-js@1.2.1: {}
+
+ source-map@0.5.7: {}
+
+ source-map@0.6.1: {}
+
+ space-separated-tokens@1.1.5: {}
+
+ space-separated-tokens@2.0.2: {}
+
+ sprintf-js@1.0.3: {}
+
+ stable-hash@0.0.5: {}
+
+ stackback@0.0.2: {}
+
+ state-local@1.0.7: {}
+
+ std-env@3.10.0: {}
+
+ stop-iteration-iterator@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ internal-slot: 1.1.0
+
+ string-argv@0.3.2: {}
+
+ string-ts@2.3.1: {}
+
+ string.prototype.trim@1.2.10:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-data-property: 1.1.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-object-atoms: 1.1.1
+ has-property-descriptors: 1.0.2
+
+ string.prototype.trimend@1.0.9:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+
+ string.prototype.trimstart@1.0.8:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+
+ stringify-entities@4.0.4:
+ dependencies:
+ character-entities-html4: 2.1.0
+ character-entities-legacy: 3.0.0
+
+ strip-bom@3.0.0: {}
+
+ strip-indent@3.0.0:
+ dependencies:
+ min-indent: 1.0.1
+
+ strip-json-comments@3.1.1: {}
+
+ strip-literal@3.1.0:
+ dependencies:
+ js-tokens: 9.0.1
+
+ style-to-js@1.1.21:
+ dependencies:
+ style-to-object: 1.0.14
+
+ style-to-object@1.0.14:
+ dependencies:
+ inline-style-parser: 0.2.7
+
+ styled-components@5.3.11(@babel/core@7.29.0)(react-dom@18.3.1(react@18.3.1))(react-is@19.2.4)(react@18.3.1):
+ dependencies:
+ '@babel/helper-module-imports': 7.28.6(supports-color@5.5.0)
+ '@babel/traverse': 7.29.0(supports-color@5.5.0)
+ '@emotion/is-prop-valid': 1.4.0
+ '@emotion/stylis': 0.8.5
+ '@emotion/unitless': 0.7.5
+ babel-plugin-styled-components: 2.1.4(@babel/core@7.29.0)(styled-components@5.3.11(@babel/core@7.29.0)(react-dom@18.3.1(react@18.3.1))(react-is@19.2.4)(react@18.3.1))(supports-color@5.5.0)
+ css-to-react-native: 3.2.0
+ hoist-non-react-statics: 3.3.2
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-is: 19.2.4
+ shallowequal: 1.1.0
+ supports-color: 5.5.0
+ transitivePeerDependencies:
+ - '@babel/core'
+
+ styled-jsx@5.1.6(@babel/core@7.29.0)(react@18.3.1):
+ dependencies:
+ client-only: 0.0.1
+ react: 18.3.1
+ optionalDependencies:
+ '@babel/core': 7.29.0
+
+ stylis@4.2.0: {}
+
+ supports-color@5.5.0:
+ dependencies:
+ has-flag: 3.0.0
+
+ supports-color@7.2.0:
+ dependencies:
+ has-flag: 4.0.0
+
+ supports-color@8.1.1:
+ dependencies:
+ has-flag: 4.0.0
+
+ supports-preserve-symlinks-flag@1.0.0: {}
+
+ svg-parser@2.0.4: {}
+
+ swagger-client@3.37.0:
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@scarf/scarf': 1.4.0
+ '@swagger-api/apidom-core': 1.6.0
+ '@swagger-api/apidom-error': 1.6.0
+ '@swagger-api/apidom-json-pointer': 1.6.0
+ '@swagger-api/apidom-ns-openapi-3-1': 1.6.0
+ '@swagger-api/apidom-ns-openapi-3-2': 1.6.0
+ '@swagger-api/apidom-reference': 1.6.0
+ '@swaggerexpert/cookie': 2.0.2
+ deepmerge: 4.3.1
+ fast-json-patch: 3.1.1
+ js-yaml: 4.1.1
+ neotraverse: 0.6.18
+ node-abort-controller: 3.1.1
+ node-fetch-commonjs: 3.3.2
+ openapi-path-templating: 2.2.1
+ openapi-server-url-templating: 1.3.0
+ ramda: 0.30.1
+ ramda-adjunct: 5.1.0(ramda@0.30.1)
+ transitivePeerDependencies:
+ - debug
+
+ swagger-ui-react@5.32.0(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime-corejs3': 7.29.0
+ '@scarf/scarf': 1.4.0
+ base64-js: 1.5.1
+ buffer: 6.0.3
+ classnames: 2.5.1
+ css.escape: 1.5.1
+ deep-extend: 0.6.0
+ dompurify: 3.2.6
+ ieee754: 1.2.1
+ immutable: 3.8.3
+ js-file-download: 0.4.12
+ js-yaml: 4.1.1
+ lodash: 4.17.23
+ prop-types: 15.8.1
+ randexp: 0.5.3
+ randombytes: 2.1.0
+ react: 18.3.1
+ react-copy-to-clipboard: 5.1.0(react@18.3.1)
+ react-debounce-input: 3.3.0(react@18.3.1)
+ react-dom: 18.3.1(react@18.3.1)
+ react-immutable-proptypes: 2.2.0(immutable@3.8.3)
+ react-immutable-pure-component: 2.2.2(immutable@3.8.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react-inspector: 6.0.2(react@18.3.1)
+ react-redux: 9.2.0(@types/react@18.3.28)(react@18.3.1)(redux@5.0.1)
+ react-syntax-highlighter: 16.1.1(react@18.3.1)
+ redux: 5.0.1
+ redux-immutable: 4.0.0(immutable@3.8.3)
+ remarkable: 2.0.1
+ reselect: 5.1.1
+ serialize-error: 8.1.0
+ sha.js: 2.4.12
+ swagger-client: 3.37.0
+ url-parse: 1.5.10
+ xml: 1.0.1
+ xml-but-prettier: 1.0.1
+ zenscroll: 4.0.2
+ transitivePeerDependencies:
+ - '@types/react'
+ - debug
+
+ symbol-tree@3.2.4: {}
+
+ tabbable@6.4.0: {}
+
+ tape@4.17.0:
+ dependencies:
+ '@ljharb/resumer': 0.0.1
+ '@ljharb/through': 2.3.14
+ call-bind: 1.0.8
+ deep-equal: 1.1.2
+ defined: 1.0.1
+ dotignore: 0.1.2
+ for-each: 0.3.5
+ glob: 7.2.3
+ has: 1.0.4
+ inherits: 2.0.4
+ is-regex: 1.1.4
+ minimist: 1.2.8
+ mock-property: 1.0.3
+ object-inspect: 1.12.3
+ resolve: 1.22.11
+ string.prototype.trim: 1.2.10
+
+ text-encoding@0.7.0: {}
+
+ tiny-case@1.0.3: {}
+
+ tiny-emitter@1.1.0: {}
+
+ tiny-emitter@2.1.0: {}
+
+ tiny-invariant@1.3.3: {}
+
+ tinybench@2.9.0: {}
+
+ tinyexec@0.3.2: {}
+
+ tinyglobby@0.2.15:
+ dependencies:
+ fdir: 6.5.0(picomatch@4.0.3)
+ picomatch: 4.0.3
+
+ tinypool@1.1.1: {}
+
+ tinyrainbow@2.0.0: {}
+
+ tinyspy@4.0.4: {}
+
+ tldts-core@6.1.86: {}
+
+ tldts@6.1.86:
+ dependencies:
+ tldts-core: 6.1.86
+
+ to-buffer@1.2.2:
+ dependencies:
+ isarray: 2.0.5
+ safe-buffer: 5.2.1
+ typed-array-buffer: 1.0.3
+
+ toggle-selection@1.0.6: {}
+
+ toposort@2.0.2: {}
+
+ tough-cookie@5.1.2:
+ dependencies:
+ tldts: 6.1.86
+
+ tr46@0.0.3: {}
+
+ tr46@5.1.1:
+ dependencies:
+ punycode: 2.3.1
+
+ tree-sitter-json@0.24.8(tree-sitter@0.21.1):
+ dependencies:
+ node-addon-api: 8.6.0
+ node-gyp-build: 4.8.4
+ optionalDependencies:
+ tree-sitter: 0.21.1
+ optional: true
+
+ tree-sitter@0.21.1:
+ dependencies:
+ node-addon-api: 8.6.0
+ node-gyp-build: 4.8.4
+ optional: true
+
+ tree-sitter@0.22.4:
+ dependencies:
+ node-addon-api: 8.6.0
+ node-gyp-build: 4.8.4
+ optional: true
+
+ trim-lines@3.0.1: {}
+
+ trough@2.2.0: {}
+
+ ts-api-utils@2.4.0(typescript@5.9.3):
+ dependencies:
+ typescript: 5.9.3
+
+ ts-declaration-location@1.0.7(typescript@5.9.3):
+ dependencies:
+ picomatch: 4.0.3
+ typescript: 5.9.3
+
+ ts-key-enum@2.0.13: {}
+
+ ts-mixer@6.0.4: {}
+
+ ts-pattern@5.9.0: {}
+
+ ts-toolbelt@9.6.0: {}
+
+ tsconfck@3.1.6(typescript@5.9.3):
+ optionalDependencies:
+ typescript: 5.9.3
+
+ tsconfig-paths@3.15.0:
+ dependencies:
+ '@types/json5': 0.0.29
+ json5: 1.0.2
+ minimist: 1.2.8
+ strip-bom: 3.0.0
+
+ tslib@2.4.0: {}
+
+ tslib@2.8.1: {}
+
+ tween-functions@1.2.0: {}
+
+ type-check@0.4.0:
+ dependencies:
+ prelude-ls: 1.2.1
+
+ type-fest@0.20.2: {}
+
+ type-fest@2.19.0: {}
+
+ typed-array-buffer@1.0.3:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-typed-array: 1.1.15
+
+ typed-array-byte-length@1.0.3:
+ dependencies:
+ call-bind: 1.0.8
+ for-each: 0.3.5
+ gopd: 1.2.0
+ has-proto: 1.2.0
+ is-typed-array: 1.1.15
+
+ typed-array-byte-offset@1.0.4:
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.8
+ for-each: 0.3.5
+ gopd: 1.2.0
+ has-proto: 1.2.0
+ is-typed-array: 1.1.15
+ reflect.getprototypeof: 1.0.10
+
+ typed-array-length@1.0.7:
+ dependencies:
+ call-bind: 1.0.8
+ 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
+
+ types-ramda@0.30.1:
+ dependencies:
+ ts-toolbelt: 9.6.0
+
+ typescript-eslint@8.57.0(eslint@9.32.0)(typescript@5.9.3):
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 8.57.0(@typescript-eslint/parser@8.57.0(eslint@9.32.0)(typescript@5.9.3))(eslint@9.32.0)(typescript@5.9.3)
+ '@typescript-eslint/parser': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.57.0(eslint@9.32.0)(typescript@5.9.3)
+ eslint: 9.32.0
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ typescript@5.8.2: {}
+
+ typescript@5.9.3: {}
+
+ u2f-api-polyfill@0.4.3: {}
+
+ ufo@1.6.3: {}
+
+ uglify-js@3.19.3:
+ optional: true
+
+ unbox-primitive@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ has-bigints: 1.1.0
+ has-symbols: 1.1.0
+ which-boxed-primitive: 1.1.1
+
+ underscore@1.13.1: {}
+
+ undici-types@7.16.0: {}
+
+ undici@7.22.0:
+ optional: true
+
+ undoo@0.5.0:
+ dependencies:
+ defaulty: 2.1.0
+ fast-deep-equal: 1.1.0
+
+ unfetch@4.2.0: {}
+
+ unified@11.0.5:
+ dependencies:
+ '@types/unist': 3.0.3
+ bail: 2.0.2
+ devlop: 1.1.0
+ extend: 3.0.2
+ is-plain-obj: 4.1.0
+ trough: 2.2.0
+ vfile: 6.0.3
+
+ unist-util-is@6.0.1:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-position@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-stringify-position@4.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-visit-parents@6.0.2:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.1
+
+ unist-util-visit@5.1.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.1
+ unist-util-visit-parents: 6.0.2
+
+ universalify@2.0.1: {}
+
+ unload@2.2.0:
+ dependencies:
+ '@babel/runtime': 7.28.6
+ detect-node: 2.1.0
+
+ unload@2.3.1:
+ dependencies:
+ '@babel/runtime': 7.28.6
+ detect-node: 2.1.0
+
+ unraw@3.0.0: {}
+
+ unrs-resolver@1.11.1:
+ dependencies:
+ napi-postinstall: 0.3.4
+ optionalDependencies:
+ '@unrs/resolver-binding-android-arm-eabi': 1.11.1
+ '@unrs/resolver-binding-android-arm64': 1.11.1
+ '@unrs/resolver-binding-darwin-arm64': 1.11.1
+ '@unrs/resolver-binding-darwin-x64': 1.11.1
+ '@unrs/resolver-binding-freebsd-x64': 1.11.1
+ '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1
+ '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1
+ '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1
+ '@unrs/resolver-binding-linux-arm64-musl': 1.11.1
+ '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1
+ '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1
+ '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1
+ '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1
+ '@unrs/resolver-binding-linux-x64-gnu': 1.11.1
+ '@unrs/resolver-binding-linux-x64-musl': 1.11.1
+ '@unrs/resolver-binding-wasm32-wasi': 1.11.1
+ '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1
+ '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1
+ '@unrs/resolver-binding-win32-x64-msvc': 1.11.1
+
+ update-browserslist-db@1.2.3(browserslist@4.28.1):
+ dependencies:
+ browserslist: 4.28.1
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
+ uri-js@4.4.1:
+ dependencies:
+ punycode: 2.3.1
+
+ url-parse@1.5.10:
+ dependencies:
+ querystringify: 2.2.0
+ requires-port: 1.0.0
+
+ use-isomorphic-layout-effect@1.2.1(@types/react@18.3.28)(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.28
+
+ use-location-state@3.1.2(@types/react@18.3.28)(next@16.1.6(@babel/core@7.29.0)(@playwright/test@1.58.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.97.3))(react@18.3.1):
+ dependencies:
+ '@types/react': 18.3.28
+ next: 16.1.6(@babel/core@7.29.0)(@playwright/test@1.58.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.97.3)
+ query-state-core: 3.1.0
+ react: 18.3.1
+
+ use-sync-external-store@1.6.0(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+
+ uuid@7.0.3: {}
+
+ uuid@8.3.2: {}
+
+ vfile-message@4.0.3:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-stringify-position: 4.0.0
+
+ vfile@6.0.3:
+ dependencies:
+ '@types/unist': 3.0.3
+ vfile-message: 4.0.3
+
+ victory-vendor@36.9.2:
+ dependencies:
+ '@types/d3-array': 3.2.2
+ '@types/d3-ease': 3.0.2
+ '@types/d3-interpolate': 3.0.4
+ '@types/d3-scale': 4.0.9
+ '@types/d3-shape': 3.1.8
+ '@types/d3-time': 3.0.4
+ '@types/d3-timer': 3.0.2
+ d3-array: 3.2.4
+ d3-ease: 3.0.1
+ d3-interpolate: 3.0.1
+ d3-scale: 4.0.2
+ d3-shape: 3.2.0
+ d3-time: 3.1.0
+ d3-timer: 3.0.1
+
+ vis-data@6.6.1(moment@2.30.1)(uuid@8.3.2)(vis-util@4.3.4):
+ dependencies:
+ moment: 2.30.1
+ uuid: 8.3.2
+ vis-util: 4.3.4
+
+ vis-timeline@7.3.6(@egjs/hammerjs@2.0.17)(component-emitter@1.3.1)(keycharm@0.3.1)(moment@2.30.1)(propagating-hammerjs@1.5.0)(uuid@7.0.3)(vis-data@6.6.1(moment@2.30.1)(uuid@7.0.3)(vis-util@4.3.4))(vis-util@4.3.4):
+ dependencies:
+ '@egjs/hammerjs': 2.0.17
+ component-emitter: 1.3.1
+ keycharm: 0.3.1
+ moment: 2.30.1
+ propagating-hammerjs: 1.5.0
+ uuid: 7.0.3
+ vis-data: 6.6.1(moment@2.30.1)(uuid@8.3.2)(vis-util@4.3.4)
+ vis-util: 4.3.4
+
+ vis-util@4.3.4: {}
+
+ vite-node@3.2.4(@types/node@24.12.0)(sass@1.97.3):
+ dependencies:
+ cac: 6.7.14
+ debug: 4.4.3(supports-color@5.5.0)
+ es-module-lexer: 1.7.0
+ pathe: 2.0.3
+ vite: 7.3.1(@types/node@24.12.0)(sass@1.97.3)
+ transitivePeerDependencies:
+ - '@types/node'
+ - jiti
+ - less
+ - lightningcss
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - tsx
+ - yaml
+
+ vite-plugin-dts@4.5.4(@types/node@24.12.0)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.12.0)(sass@1.97.3)):
+ dependencies:
+ '@microsoft/api-extractor': 7.57.7(@types/node@24.12.0)
+ '@rollup/pluginutils': 5.3.0(rollup@4.59.0)
+ '@volar/typescript': 2.4.28
+ '@vue/language-core': 2.2.0(typescript@5.9.3)
+ compare-versions: 6.1.1
+ debug: 4.4.3(supports-color@5.5.0)
+ kolorist: 1.8.0
+ local-pkg: 1.1.2
+ magic-string: 0.30.21
+ typescript: 5.9.3
+ optionalDependencies:
+ vite: 7.3.1(@types/node@24.12.0)(sass@1.97.3)
+ transitivePeerDependencies:
+ - '@types/node'
+ - rollup
+ - supports-color
+
+ vite-plugin-svgr@4.5.0(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.12.0)(sass@1.97.3)):
+ dependencies:
+ '@rollup/pluginutils': 5.3.0(rollup@4.59.0)
+ '@svgr/core': 8.1.0(typescript@5.9.3)
+ '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3))
+ vite: 7.3.1(@types/node@24.12.0)(sass@1.97.3)
+ transitivePeerDependencies:
+ - rollup
+ - supports-color
+ - typescript
+
+ vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.3.1(@types/node@24.12.0)(sass@1.97.3)):
+ dependencies:
+ debug: 4.4.3(supports-color@5.5.0)
+ globrex: 0.1.2
+ tsconfck: 3.1.6(typescript@5.9.3)
+ optionalDependencies:
+ vite: 7.3.1(@types/node@24.12.0)(sass@1.97.3)
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ vite@7.3.1(@types/node@24.12.0)(sass@1.97.3):
+ dependencies:
+ esbuild: 0.27.3
+ fdir: 6.5.0(picomatch@4.0.3)
+ picomatch: 4.0.3
+ postcss: 8.5.8
+ rollup: 4.59.0
+ tinyglobby: 0.2.15
+ optionalDependencies:
+ '@types/node': 24.12.0
+ fsevents: 2.3.3
+ sass: 1.97.3
+
+ vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.12.0)(jsdom@26.1.0)(sass@1.97.3):
+ dependencies:
+ '@types/chai': 5.2.3
+ '@vitest/expect': 3.2.4
+ '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@24.12.0)(sass@1.97.3))
+ '@vitest/pretty-format': 3.2.4
+ '@vitest/runner': 3.2.4
+ '@vitest/snapshot': 3.2.4
+ '@vitest/spy': 3.2.4
+ '@vitest/utils': 3.2.4
+ chai: 5.3.3
+ debug: 4.4.3(supports-color@5.5.0)
+ expect-type: 1.3.0
+ magic-string: 0.30.21
+ pathe: 2.0.3
+ picomatch: 4.0.3
+ std-env: 3.10.0
+ tinybench: 2.9.0
+ tinyexec: 0.3.2
+ tinyglobby: 0.2.15
+ tinypool: 1.1.1
+ tinyrainbow: 2.0.0
+ vite: 7.3.1(@types/node@24.12.0)(sass@1.97.3)
+ vite-node: 3.2.4(@types/node@24.12.0)(sass@1.97.3)
+ why-is-node-running: 2.3.0
+ optionalDependencies:
+ '@types/debug': 4.1.12
+ '@types/node': 24.12.0
+ jsdom: 26.1.0
+ transitivePeerDependencies:
+ - jiti
+ - less
+ - lightningcss
+ - msw
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - tsx
+ - yaml
+
+ vscode-uri@3.1.0: {}
+
+ w3c-xmlserializer@5.0.0:
+ dependencies:
+ xml-name-validator: 5.0.0
+
+ web-streams-polyfill@3.3.3: {}
+
+ web-tree-sitter@0.24.5:
+ optional: true
+
+ webcrypto-core@1.8.1:
+ dependencies:
+ '@peculiar/asn1-schema': 2.6.0
+ '@peculiar/json-schema': 1.1.12
+ asn1js: 3.0.7
+ pvtsutils: 1.3.6
+ tslib: 2.8.1
+
+ webcrypto-shim@0.1.7: {}
+
+ webidl-conversions@3.0.1: {}
+
+ webidl-conversions@7.0.0: {}
+
+ whatwg-encoding@3.1.1:
+ dependencies:
+ iconv-lite: 0.6.3
+
+ whatwg-mimetype@4.0.0: {}
+
+ whatwg-url@14.2.0:
+ dependencies:
+ tr46: 5.1.1
+ webidl-conversions: 7.0.0
+
+ whatwg-url@5.0.0:
+ dependencies:
+ tr46: 0.0.3
+ webidl-conversions: 3.0.1
+
+ which-boxed-primitive@1.1.1:
+ dependencies:
+ is-bigint: 1.1.0
+ is-boolean-object: 1.2.2
+ is-number-object: 1.1.1
+ is-string: 1.1.1
+ is-symbol: 1.1.1
+
+ which-builtin-type@1.2.1:
+ dependencies:
+ call-bound: 1.0.4
+ function.prototype.name: 1.1.8
+ has-tostringtag: 1.0.2
+ is-async-function: 2.1.1
+ is-date-object: 1.1.0
+ is-finalizationregistry: 1.1.1
+ is-generator-function: 1.1.2
+ is-regex: 1.2.1
+ is-weakref: 1.1.1
+ isarray: 2.0.5
+ which-boxed-primitive: 1.1.1
+ which-collection: 1.0.2
+ which-typed-array: 1.1.20
+
+ which-collection@1.0.2:
+ dependencies:
+ is-map: 2.0.3
+ is-set: 2.0.3
+ is-weakmap: 2.0.2
+ is-weakset: 2.0.4
+
+ which-typed-array@1.1.20:
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ for-each: 0.3.5
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+
+ which@2.0.2:
+ dependencies:
+ isexe: 2.0.0
+
+ why-is-node-running@2.3.0:
+ dependencies:
+ siginfo: 2.0.0
+ stackback: 0.0.2
+
+ word-wrap@1.2.5: {}
+
+ wordwrap@1.0.0: {}
+
+ wrappy@1.0.2: {}
+
+ ws@8.19.0: {}
+
+ xhr2@0.1.3: {}
+
+ xml-but-prettier@1.0.1:
+ dependencies:
+ repeat-string: 1.6.1
+
+ xml-name-validator@5.0.0: {}
+
+ xml@1.0.1: {}
+
+ xmlchars@2.2.0: {}
+
+ xstate@4.38.3: {}
+
+ xtend@4.0.2: {}
+
+ yallist@3.1.1: {}
+
+ yallist@4.0.0: {}
+
+ yaml@1.10.2: {}
+
+ yocto-queue@0.1.0: {}
+
+ yup@1.7.1:
+ dependencies:
+ property-expr: 2.0.6
+ tiny-case: 1.0.3
+ toposort: 2.0.2
+ type-fest: 2.19.0
+
+ zenscroll@4.0.2: {}
+
+ zod@4.3.6: {}
+
+ zwitch@2.0.4: {}
diff --git a/ui-next/public/conductorLogo-dark.svg b/ui-next/public/conductorLogo-dark.svg
new file mode 100644
index 0000000000..4af00ae300
--- /dev/null
+++ b/ui-next/public/conductorLogo-dark.svg
@@ -0,0 +1,93 @@
+
+
diff --git a/ui-next/public/conductorLogo.png b/ui-next/public/conductorLogo.png
new file mode 100644
index 0000000000..5c05ecbd9d
Binary files /dev/null and b/ui-next/public/conductorLogo.png differ
diff --git a/ui-next/public/conductorLogo.svg b/ui-next/public/conductorLogo.svg
new file mode 100644
index 0000000000..57feb5b0fb
--- /dev/null
+++ b/ui-next/public/conductorLogo.svg
@@ -0,0 +1,93 @@
+
+
diff --git a/ui-next/public/conductorLogoSmall.png b/ui-next/public/conductorLogoSmall.png
new file mode 100644
index 0000000000..f5ecd975ab
Binary files /dev/null and b/ui-next/public/conductorLogoSmall.png differ
diff --git a/ui-next/public/conductorLogoSmall.svg b/ui-next/public/conductorLogoSmall.svg
new file mode 100644
index 0000000000..1cd90c0ca4
--- /dev/null
+++ b/ui-next/public/conductorLogoSmall.svg
@@ -0,0 +1,52 @@
+
+
diff --git a/ui-next/public/context.js b/ui-next/public/context.js
new file mode 100644
index 0000000000..adc7cc1a9e
--- /dev/null
+++ b/ui-next/public/context.js
@@ -0,0 +1,42 @@
+// OSS Conductor UI Runtime Configuration
+// This file configures feature flags at runtime for the OSS UI
+
+window.conductor = {
+ // Authentication - DISABLED for OSS
+ ACCESS_MANAGEMENT: false,
+ RBAC: false,
+ COPY_TOKEN: false,
+
+ // OSS Core Features
+ SCHEDULER: true,
+ TASK_VISIBILITY: "READ",
+ CREATOR_ENABLE_CREATOR: true,
+ CREATOR_ENABLE_REAFLOW_DIAGRAM: true,
+ TASK_INDEXING: false,
+ SHOW_EVENT_MONITOR: true,
+ ENABLE_DARK_MODE_TOGGLE: true,
+
+ // Enterprise Features - DISABLED for OSS
+ WORKFLOW_INTROSPECTION: false,
+ HUMAN_TASK: false,
+ INTEGRATIONS: false,
+ SECRETS: false,
+ WEBHOOKS: false,
+ SERVICE_REGISTRY: false,
+ GATEWAY_ENABLED: false,
+ REMOTE_SERVICES: false,
+ SENDGRID_TASK_ENABLED: false,
+ SKU_ENABLED: false,
+
+ // UI Configuration
+ PLAYGROUND: false,
+ ENABLE_METRICS_DASHBOARD: false,
+ METRICS_ORIGIN_URL: "",
+ CUSTOM_LOGO_URL: "",
+ MULTITENANCY_TYPE: "user_based",
+ DEFAULT_ROLES: "ADMIN",
+};
+
+// No authentication configuration for OSS
+window.authConfig = undefined;
+window.auth0Identifiers = undefined;
diff --git a/ui-next/public/context.js.example b/ui-next/public/context.js.example
new file mode 100644
index 0000000000..73747f4045
--- /dev/null
+++ b/ui-next/public/context.js.example
@@ -0,0 +1,35 @@
+window.conductor = {
+ "ENABLE_METRICS_DASHBOARD" : false,
+ "MULTITENANCY_TYPE" : "none",
+ "TASK_INDEXING" : "true",
+ "CREATOR_ENABLE_REAFLOW_DIAGRAM" : "true",
+ "SHOW_EVENT_MONITOR" : "false",
+ "ENABLE_NEW_INPUTS" : "true",
+ "SKU_ENABLED" : "false",
+ "WEBHOOKS" : "false",
+ "SERVICE_REGISTRY" : "true",
+ "SCHEDULER" : "true",
+ "TASK_VISIBILITY" : "READ",
+ "SECRETS" : "false",
+ "INTEGRATIONS" : "true",
+ "CREATOR_ENABLE_CREATOR" : "false",
+ "DIAGRAM_DOTTED_BACKGROUND" : "true",
+ "ENABLE_NEW_SIDEBAR" : "true",
+ "ACCESS_MANAGEMENT" : true,
+ "SENDGRID_TASK" : "false",
+ "COPY_TOKEN" : "true",
+ "METRICS_ORIGIN_URL" : "false",
+ "CUSTOM_LOGO_URL" : "",
+ "RBAC" : "true",
+ "PLAYGROUND" : "false",
+ "ENABLE_DRAG_DROP_TASK" : "true",
+ "HUMAN_TASK" : true,
+ "DEFAULT_ROLES" : "USER"
+};
+
+window.authConfig = {
+ type: "auth0",
+ domain: "orkes-test.us.auth0.com",
+ clientId: "wPylSt0D6cJviO3IRFWYHFeyTSldMTWR",
+ isTestEnvironment: true,
+};
diff --git a/ui-next/public/diagramDotBg.svg b/ui-next/public/diagramDotBg.svg
new file mode 100644
index 0000000000..487e2c1594
--- /dev/null
+++ b/ui-next/public/diagramDotBg.svg
@@ -0,0 +1,7493 @@
+
diff --git a/ui-next/public/enterIcon.svg b/ui-next/public/enterIcon.svg
new file mode 100644
index 0000000000..48f57e2548
--- /dev/null
+++ b/ui-next/public/enterIcon.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/ui-next/public/enterprise-add-ons/integrations.webp b/ui-next/public/enterprise-add-ons/integrations.webp
new file mode 100644
index 0000000000..eac19d464d
Binary files /dev/null and b/ui-next/public/enterprise-add-ons/integrations.webp differ
diff --git a/ui-next/public/favicon.ico b/ui-next/public/favicon.ico
new file mode 100644
index 0000000000..01be939389
Binary files /dev/null and b/ui-next/public/favicon.ico differ
diff --git a/ui-next/public/icons/apple-touch-icon.png b/ui-next/public/icons/apple-touch-icon.png
new file mode 100644
index 0000000000..b0688f642b
Binary files /dev/null and b/ui-next/public/icons/apple-touch-icon.png differ
diff --git a/ui-next/public/icons/favicon-16x16.png b/ui-next/public/icons/favicon-16x16.png
new file mode 100644
index 0000000000..8a66765f4c
Binary files /dev/null and b/ui-next/public/icons/favicon-16x16.png differ
diff --git a/ui-next/public/icons/favicon-32x32.png b/ui-next/public/icons/favicon-32x32.png
new file mode 100644
index 0000000000..01be939389
Binary files /dev/null and b/ui-next/public/icons/favicon-32x32.png differ
diff --git a/ui-next/public/icons/icon-144x144.png b/ui-next/public/icons/icon-144x144.png
new file mode 100644
index 0000000000..aa15302b8a
Binary files /dev/null and b/ui-next/public/icons/icon-144x144.png differ
diff --git a/ui-next/public/icons/icon-192x192.png b/ui-next/public/icons/icon-192x192.png
new file mode 100644
index 0000000000..8afcbe14c2
Binary files /dev/null and b/ui-next/public/icons/icon-192x192.png differ
diff --git a/ui-next/public/icons/icon-256x256.png b/ui-next/public/icons/icon-256x256.png
new file mode 100644
index 0000000000..edae10df5b
Binary files /dev/null and b/ui-next/public/icons/icon-256x256.png differ
diff --git a/ui-next/public/icons/icon-384x384.png b/ui-next/public/icons/icon-384x384.png
new file mode 100644
index 0000000000..034006da87
Binary files /dev/null and b/ui-next/public/icons/icon-384x384.png differ
diff --git a/ui-next/public/icons/icon-48x48.png b/ui-next/public/icons/icon-48x48.png
new file mode 100644
index 0000000000..00697a941a
Binary files /dev/null and b/ui-next/public/icons/icon-48x48.png differ
diff --git a/ui-next/public/icons/icon-512x512.png b/ui-next/public/icons/icon-512x512.png
new file mode 100644
index 0000000000..4f23c538b8
Binary files /dev/null and b/ui-next/public/icons/icon-512x512.png differ
diff --git a/ui-next/public/icons/icon-72x72.png b/ui-next/public/icons/icon-72x72.png
new file mode 100644
index 0000000000..249fdd8676
Binary files /dev/null and b/ui-next/public/icons/icon-72x72.png differ
diff --git a/ui-next/public/icons/icon-96x96.png b/ui-next/public/icons/icon-96x96.png
new file mode 100644
index 0000000000..c76aa4c495
Binary files /dev/null and b/ui-next/public/icons/icon-96x96.png differ
diff --git a/ui-next/public/icons/info-icon.svg b/ui-next/public/icons/info-icon.svg
new file mode 100644
index 0000000000..0385079013
--- /dev/null
+++ b/ui-next/public/icons/info-icon.svg
@@ -0,0 +1,8 @@
+
diff --git a/ui-next/public/integrations-icons/airtable.svg b/ui-next/public/integrations-icons/airtable.svg
new file mode 100644
index 0000000000..adb9cf19bd
--- /dev/null
+++ b/ui-next/public/integrations-icons/airtable.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/amazon.svg b/ui-next/public/integrations-icons/amazon.svg
new file mode 100644
index 0000000000..0941b450b1
--- /dev/null
+++ b/ui-next/public/integrations-icons/amazon.svg
@@ -0,0 +1,9 @@
+
diff --git a/ui-next/public/integrations-icons/amqp.svg b/ui-next/public/integrations-icons/amqp.svg
new file mode 100644
index 0000000000..830904d6c4
--- /dev/null
+++ b/ui-next/public/integrations-icons/amqp.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/anthropic.svg b/ui-next/public/integrations-icons/anthropic.svg
new file mode 100644
index 0000000000..135a8b9f33
--- /dev/null
+++ b/ui-next/public/integrations-icons/anthropic.svg
@@ -0,0 +1,16 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/apachekafka.svg b/ui-next/public/integrations-icons/apachekafka.svg
new file mode 100644
index 0000000000..dc2b7b8bac
--- /dev/null
+++ b/ui-next/public/integrations-icons/apachekafka.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/asana.svg b/ui-next/public/integrations-icons/asana.svg
new file mode 100644
index 0000000000..fcc1674fda
--- /dev/null
+++ b/ui-next/public/integrations-icons/asana.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/aws-lambda.svg b/ui-next/public/integrations-icons/aws-lambda.svg
new file mode 100644
index 0000000000..9046496388
--- /dev/null
+++ b/ui-next/public/integrations-icons/aws-lambda.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/aws-s3.svg b/ui-next/public/integrations-icons/aws-s3.svg
new file mode 100644
index 0000000000..797c2e7e8d
--- /dev/null
+++ b/ui-next/public/integrations-icons/aws-s3.svg
@@ -0,0 +1,34 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/aws-ses.svg b/ui-next/public/integrations-icons/aws-ses.svg
new file mode 100644
index 0000000000..f4ad29f54d
--- /dev/null
+++ b/ui-next/public/integrations-icons/aws-ses.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/aws-sns.svg b/ui-next/public/integrations-icons/aws-sns.svg
new file mode 100644
index 0000000000..f3766f02a5
--- /dev/null
+++ b/ui-next/public/integrations-icons/aws-sns.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/aws.svg b/ui-next/public/integrations-icons/aws.svg
new file mode 100644
index 0000000000..6a7ef0ccdc
--- /dev/null
+++ b/ui-next/public/integrations-icons/aws.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/azure-devops.svg b/ui-next/public/integrations-icons/azure-devops.svg
new file mode 100644
index 0000000000..7dfe84d18c
--- /dev/null
+++ b/ui-next/public/integrations-icons/azure-devops.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/azure-functions.svg b/ui-next/public/integrations-icons/azure-functions.svg
new file mode 100644
index 0000000000..1ecacdf37a
--- /dev/null
+++ b/ui-next/public/integrations-icons/azure-functions.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/azure-storage.svg b/ui-next/public/integrations-icons/azure-storage.svg
new file mode 100644
index 0000000000..49ebfea9ff
--- /dev/null
+++ b/ui-next/public/integrations-icons/azure-storage.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/azure.svg b/ui-next/public/integrations-icons/azure.svg
new file mode 100644
index 0000000000..7aa96bc980
--- /dev/null
+++ b/ui-next/public/integrations-icons/azure.svg
@@ -0,0 +1,9 @@
+
diff --git a/ui-next/public/integrations-icons/azureOpenAI.svg b/ui-next/public/integrations-icons/azureOpenAI.svg
new file mode 100644
index 0000000000..60cd4418cc
--- /dev/null
+++ b/ui-next/public/integrations-icons/azureOpenAI.svg
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/azure_openai.svg b/ui-next/public/integrations-icons/azure_openai.svg
new file mode 100644
index 0000000000..86dd9e3d39
--- /dev/null
+++ b/ui-next/public/integrations-icons/azure_openai.svg
@@ -0,0 +1,10 @@
+
diff --git a/ui-next/public/integrations-icons/azure_service_bus.svg b/ui-next/public/integrations-icons/azure_service_bus.svg
new file mode 100644
index 0000000000..10975d7216
--- /dev/null
+++ b/ui-next/public/integrations-icons/azure_service_bus.svg
@@ -0,0 +1,54 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/bedrock.svg b/ui-next/public/integrations-icons/bedrock.svg
new file mode 100644
index 0000000000..3bca424ed7
--- /dev/null
+++ b/ui-next/public/integrations-icons/bedrock.svg
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/bitbucket.svg b/ui-next/public/integrations-icons/bitbucket.svg
new file mode 100644
index 0000000000..20cfca483a
--- /dev/null
+++ b/ui-next/public/integrations-icons/bitbucket.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/circleci.svg b/ui-next/public/integrations-icons/circleci.svg
new file mode 100644
index 0000000000..6e69e373ed
--- /dev/null
+++ b/ui-next/public/integrations-icons/circleci.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/cloudflare.svg b/ui-next/public/integrations-icons/cloudflare.svg
new file mode 100644
index 0000000000..66cc020865
--- /dev/null
+++ b/ui-next/public/integrations-icons/cloudflare.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/cohere.svg b/ui-next/public/integrations-icons/cohere.svg
new file mode 100644
index 0000000000..543bc2d6ca
--- /dev/null
+++ b/ui-next/public/integrations-icons/cohere.svg
@@ -0,0 +1,30 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/commonroom.svg b/ui-next/public/integrations-icons/commonroom.svg
new file mode 100644
index 0000000000..4a93b4196e
--- /dev/null
+++ b/ui-next/public/integrations-icons/commonroom.svg
@@ -0,0 +1,8 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/conductor.svg b/ui-next/public/integrations-icons/conductor.svg
new file mode 100644
index 0000000000..4e6767fba9
--- /dev/null
+++ b/ui-next/public/integrations-icons/conductor.svg
@@ -0,0 +1,9 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/confluent.svg b/ui-next/public/integrations-icons/confluent.svg
new file mode 100644
index 0000000000..d6c16c2196
--- /dev/null
+++ b/ui-next/public/integrations-icons/confluent.svg
@@ -0,0 +1,11 @@
+
diff --git a/ui-next/public/integrations-icons/datadog.svg b/ui-next/public/integrations-icons/datadog.svg
new file mode 100644
index 0000000000..ab43731901
--- /dev/null
+++ b/ui-next/public/integrations-icons/datadog.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/default.svg b/ui-next/public/integrations-icons/default.svg
new file mode 100644
index 0000000000..133b576d6a
--- /dev/null
+++ b/ui-next/public/integrations-icons/default.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/digitalocean.svg b/ui-next/public/integrations-icons/digitalocean.svg
new file mode 100644
index 0000000000..9d5750296c
--- /dev/null
+++ b/ui-next/public/integrations-icons/digitalocean.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/discord.svg b/ui-next/public/integrations-icons/discord.svg
new file mode 100644
index 0000000000..ef25142a35
--- /dev/null
+++ b/ui-next/public/integrations-icons/discord.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/discourse.svg b/ui-next/public/integrations-icons/discourse.svg
new file mode 100644
index 0000000000..4cbb8c87b3
--- /dev/null
+++ b/ui-next/public/integrations-icons/discourse.svg
@@ -0,0 +1,8 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/docker.svg b/ui-next/public/integrations-icons/docker.svg
new file mode 100644
index 0000000000..f1b97ba55b
--- /dev/null
+++ b/ui-next/public/integrations-icons/docker.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/freshdesk.svg b/ui-next/public/integrations-icons/freshdesk.svg
new file mode 100644
index 0000000000..ecb5c6e0c6
--- /dev/null
+++ b/ui-next/public/integrations-icons/freshdesk.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/gcp_pubsub.svg b/ui-next/public/integrations-icons/gcp_pubsub.svg
new file mode 100644
index 0000000000..b200409185
--- /dev/null
+++ b/ui-next/public/integrations-icons/gcp_pubsub.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/gemini.svg b/ui-next/public/integrations-icons/gemini.svg
new file mode 100644
index 0000000000..3c03da6610
--- /dev/null
+++ b/ui-next/public/integrations-icons/gemini.svg
@@ -0,0 +1,11 @@
+
diff --git a/ui-next/public/integrations-icons/git.svg b/ui-next/public/integrations-icons/git.svg
new file mode 100644
index 0000000000..5f19a87f75
--- /dev/null
+++ b/ui-next/public/integrations-icons/git.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/github.svg b/ui-next/public/integrations-icons/github.svg
new file mode 100644
index 0000000000..a8d1174049
--- /dev/null
+++ b/ui-next/public/integrations-icons/github.svg
@@ -0,0 +1,3 @@
+
diff --git a/ui-next/public/integrations-icons/gitlab.svg b/ui-next/public/integrations-icons/gitlab.svg
new file mode 100644
index 0000000000..52b926cc70
--- /dev/null
+++ b/ui-next/public/integrations-icons/gitlab.svg
@@ -0,0 +1,22 @@
+
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/gmail.svg b/ui-next/public/integrations-icons/gmail.svg
new file mode 100644
index 0000000000..6c9a3c870e
--- /dev/null
+++ b/ui-next/public/integrations-icons/gmail.svg
@@ -0,0 +1,26 @@
+
diff --git a/ui-next/public/integrations-icons/google-cloud-functions.svg b/ui-next/public/integrations-icons/google-cloud-functions.svg
new file mode 100644
index 0000000000..0429220013
--- /dev/null
+++ b/ui-next/public/integrations-icons/google-cloud-functions.svg
@@ -0,0 +1,38 @@
+
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/google-cloud-storage.svg b/ui-next/public/integrations-icons/google-cloud-storage.svg
new file mode 100644
index 0000000000..842c121a7b
--- /dev/null
+++ b/ui-next/public/integrations-icons/google-cloud-storage.svg
@@ -0,0 +1,38 @@
+
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/google-docs.svg b/ui-next/public/integrations-icons/google-docs.svg
new file mode 100644
index 0000000000..7b7cb14e08
--- /dev/null
+++ b/ui-next/public/integrations-icons/google-docs.svg
@@ -0,0 +1,88 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/google-drive.svg b/ui-next/public/integrations-icons/google-drive.svg
new file mode 100644
index 0000000000..a8cefd5b28
--- /dev/null
+++ b/ui-next/public/integrations-icons/google-drive.svg
@@ -0,0 +1,8 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/google-sheets.svg b/ui-next/public/integrations-icons/google-sheets.svg
new file mode 100644
index 0000000000..bd5d938c78
--- /dev/null
+++ b/ui-next/public/integrations-icons/google-sheets.svg
@@ -0,0 +1,89 @@
+
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/google-slides.svg b/ui-next/public/integrations-icons/google-slides.svg
new file mode 100644
index 0000000000..deeb2482a9
--- /dev/null
+++ b/ui-next/public/integrations-icons/google-slides.svg
@@ -0,0 +1,96 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/google_sheets.svg b/ui-next/public/integrations-icons/google_sheets.svg
new file mode 100644
index 0000000000..7eaeadd011
--- /dev/null
+++ b/ui-next/public/integrations-icons/google_sheets.svg
@@ -0,0 +1,26 @@
+
diff --git a/ui-next/public/integrations-icons/googleads.svg b/ui-next/public/integrations-icons/googleads.svg
new file mode 100644
index 0000000000..e098e77754
--- /dev/null
+++ b/ui-next/public/integrations-icons/googleads.svg
@@ -0,0 +1,13 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/googleanalytics.svg b/ui-next/public/integrations-icons/googleanalytics.svg
new file mode 100644
index 0000000000..d98900882b
--- /dev/null
+++ b/ui-next/public/integrations-icons/googleanalytics.svg
@@ -0,0 +1,10 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/googlecalendar.svg b/ui-next/public/integrations-icons/googlecalendar.svg
new file mode 100644
index 0000000000..91f0e23104
--- /dev/null
+++ b/ui-next/public/integrations-icons/googlecalendar.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/googledrive.svg b/ui-next/public/integrations-icons/googledrive.svg
new file mode 100644
index 0000000000..7263ef3124
--- /dev/null
+++ b/ui-next/public/integrations-icons/googledrive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/googlegemini.svg b/ui-next/public/integrations-icons/googlegemini.svg
new file mode 100644
index 0000000000..e15e53ce01
--- /dev/null
+++ b/ui-next/public/integrations-icons/googlegemini.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/grok.svg b/ui-next/public/integrations-icons/grok.svg
new file mode 100644
index 0000000000..c5736c1dc9
--- /dev/null
+++ b/ui-next/public/integrations-icons/grok.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/hubspot.svg b/ui-next/public/integrations-icons/hubspot.svg
new file mode 100644
index 0000000000..0ed8b1d3e8
--- /dev/null
+++ b/ui-next/public/integrations-icons/hubspot.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/huggingFace.svg b/ui-next/public/integrations-icons/huggingFace.svg
new file mode 100644
index 0000000000..7d70fe5b7b
--- /dev/null
+++ b/ui-next/public/integrations-icons/huggingFace.svg
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/ibm_mq.svg b/ui-next/public/integrations-icons/ibm_mq.svg
new file mode 100644
index 0000000000..e72268177f
--- /dev/null
+++ b/ui-next/public/integrations-icons/ibm_mq.svg
@@ -0,0 +1,18 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/instaclustr.svg b/ui-next/public/integrations-icons/instaclustr.svg
new file mode 100644
index 0000000000..6268e9e739
--- /dev/null
+++ b/ui-next/public/integrations-icons/instaclustr.svg
@@ -0,0 +1,15 @@
+
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/intercom.svg b/ui-next/public/integrations-icons/intercom.svg
new file mode 100644
index 0000000000..cce4b72cd0
--- /dev/null
+++ b/ui-next/public/integrations-icons/intercom.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/jira.svg b/ui-next/public/integrations-icons/jira.svg
new file mode 100644
index 0000000000..841a768230
--- /dev/null
+++ b/ui-next/public/integrations-icons/jira.svg
@@ -0,0 +1,26 @@
+
diff --git a/ui-next/public/integrations-icons/kafka.svg b/ui-next/public/integrations-icons/kafka.svg
new file mode 100644
index 0000000000..d041b8d7a1
--- /dev/null
+++ b/ui-next/public/integrations-icons/kafka.svg
@@ -0,0 +1,17 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/kafka_confluent.svg b/ui-next/public/integrations-icons/kafka_confluent.svg
new file mode 100644
index 0000000000..0b821f23fa
--- /dev/null
+++ b/ui-next/public/integrations-icons/kafka_confluent.svg
@@ -0,0 +1,30 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/kafka_msk.svg b/ui-next/public/integrations-icons/kafka_msk.svg
new file mode 100644
index 0000000000..2be58c7679
--- /dev/null
+++ b/ui-next/public/integrations-icons/kafka_msk.svg
@@ -0,0 +1,10 @@
+
diff --git a/ui-next/public/integrations-icons/kubernetes.svg b/ui-next/public/integrations-icons/kubernetes.svg
new file mode 100644
index 0000000000..4e52a4bc46
--- /dev/null
+++ b/ui-next/public/integrations-icons/kubernetes.svg
@@ -0,0 +1,19 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/linear.svg b/ui-next/public/integrations-icons/linear.svg
new file mode 100644
index 0000000000..9ac4481309
--- /dev/null
+++ b/ui-next/public/integrations-icons/linear.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/mailgun.svg b/ui-next/public/integrations-icons/mailgun.svg
new file mode 100644
index 0000000000..e18cc4a260
--- /dev/null
+++ b/ui-next/public/integrations-icons/mailgun.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/menuBook.svg b/ui-next/public/integrations-icons/menuBook.svg
new file mode 100644
index 0000000000..41351de629
--- /dev/null
+++ b/ui-next/public/integrations-icons/menuBook.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/mistral.svg b/ui-next/public/integrations-icons/mistral.svg
new file mode 100644
index 0000000000..348ec9c081
--- /dev/null
+++ b/ui-next/public/integrations-icons/mistral.svg
@@ -0,0 +1,25 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/mistralai.svg b/ui-next/public/integrations-icons/mistralai.svg
new file mode 100644
index 0000000000..00ee1b9e51
--- /dev/null
+++ b/ui-next/public/integrations-icons/mistralai.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/mixpanel.svg b/ui-next/public/integrations-icons/mixpanel.svg
new file mode 100644
index 0000000000..8ebc7d08b2
--- /dev/null
+++ b/ui-next/public/integrations-icons/mixpanel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/mongo.svg b/ui-next/public/integrations-icons/mongo.svg
new file mode 100644
index 0000000000..22474a2578
--- /dev/null
+++ b/ui-next/public/integrations-icons/mongo.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/mongodb.svg b/ui-next/public/integrations-icons/mongodb.svg
new file mode 100644
index 0000000000..b7db5d8267
--- /dev/null
+++ b/ui-next/public/integrations-icons/mongodb.svg
@@ -0,0 +1,26 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/mongovector.svg b/ui-next/public/integrations-icons/mongovector.svg
new file mode 100644
index 0000000000..8460916be3
--- /dev/null
+++ b/ui-next/public/integrations-icons/mongovector.svg
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/mysql.svg b/ui-next/public/integrations-icons/mysql.svg
new file mode 100644
index 0000000000..06449afc4a
--- /dev/null
+++ b/ui-next/public/integrations-icons/mysql.svg
@@ -0,0 +1,26 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/nats.svg b/ui-next/public/integrations-icons/nats.svg
new file mode 100644
index 0000000000..2085f20e52
--- /dev/null
+++ b/ui-next/public/integrations-icons/nats.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/notion.svg b/ui-next/public/integrations-icons/notion.svg
new file mode 100644
index 0000000000..201f7bb6dc
--- /dev/null
+++ b/ui-next/public/integrations-icons/notion.svg
@@ -0,0 +1,9 @@
+
diff --git a/ui-next/public/integrations-icons/okta.svg b/ui-next/public/integrations-icons/okta.svg
new file mode 100644
index 0000000000..f9a4633850
--- /dev/null
+++ b/ui-next/public/integrations-icons/okta.svg
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/ollama.svg b/ui-next/public/integrations-icons/ollama.svg
new file mode 100644
index 0000000000..432f73e738
--- /dev/null
+++ b/ui-next/public/integrations-icons/ollama.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/openAI.svg b/ui-next/public/integrations-icons/openAI.svg
new file mode 100644
index 0000000000..60cd4418cc
--- /dev/null
+++ b/ui-next/public/integrations-icons/openAI.svg
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/pagerduty.svg b/ui-next/public/integrations-icons/pagerduty.svg
new file mode 100644
index 0000000000..f9dffb1e0a
--- /dev/null
+++ b/ui-next/public/integrations-icons/pagerduty.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/perplexity.svg b/ui-next/public/integrations-icons/perplexity.svg
new file mode 100644
index 0000000000..38addf13c1
Binary files /dev/null and b/ui-next/public/integrations-icons/perplexity.svg differ
diff --git a/ui-next/public/integrations-icons/pgvector.svg b/ui-next/public/integrations-icons/pgvector.svg
new file mode 100644
index 0000000000..f290ec44f7
--- /dev/null
+++ b/ui-next/public/integrations-icons/pgvector.svg
@@ -0,0 +1,22 @@
+
+
+
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/pinecone.svg b/ui-next/public/integrations-icons/pinecone.svg
new file mode 100644
index 0000000000..2f5f7f4f21
--- /dev/null
+++ b/ui-next/public/integrations-icons/pinecone.svg
@@ -0,0 +1,6 @@
+
diff --git a/ui-next/public/integrations-icons/pipedrive.svg b/ui-next/public/integrations-icons/pipedrive.svg
new file mode 100644
index 0000000000..70d590aec4
--- /dev/null
+++ b/ui-next/public/integrations-icons/pipedrive.svg
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/postgres.svg b/ui-next/public/integrations-icons/postgres.svg
new file mode 100644
index 0000000000..709b5c1114
--- /dev/null
+++ b/ui-next/public/integrations-icons/postgres.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/private-ai.svg b/ui-next/public/integrations-icons/private-ai.svg
new file mode 100644
index 0000000000..5336cd36e0
--- /dev/null
+++ b/ui-next/public/integrations-icons/private-ai.svg
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/rabbitmq.svg b/ui-next/public/integrations-icons/rabbitmq.svg
new file mode 100644
index 0000000000..990c6d42ce
--- /dev/null
+++ b/ui-next/public/integrations-icons/rabbitmq.svg
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/redis.svg b/ui-next/public/integrations-icons/redis.svg
new file mode 100644
index 0000000000..c2834d260f
--- /dev/null
+++ b/ui-next/public/integrations-icons/redis.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/relational_db.svg b/ui-next/public/integrations-icons/relational_db.svg
new file mode 100644
index 0000000000..ebb2849812
--- /dev/null
+++ b/ui-next/public/integrations-icons/relational_db.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/sendgrid.svg b/ui-next/public/integrations-icons/sendgrid.svg
new file mode 100644
index 0000000000..53e44f09f9
--- /dev/null
+++ b/ui-next/public/integrations-icons/sendgrid.svg
@@ -0,0 +1,23 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/sentry.svg b/ui-next/public/integrations-icons/sentry.svg
new file mode 100644
index 0000000000..60a0746893
--- /dev/null
+++ b/ui-next/public/integrations-icons/sentry.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/slack.svg b/ui-next/public/integrations-icons/slack.svg
new file mode 100644
index 0000000000..60518a6736
--- /dev/null
+++ b/ui-next/public/integrations-icons/slack.svg
@@ -0,0 +1,9 @@
+
diff --git a/ui-next/public/integrations-icons/stripe.svg b/ui-next/public/integrations-icons/stripe.svg
new file mode 100644
index 0000000000..9e21c18c33
--- /dev/null
+++ b/ui-next/public/integrations-icons/stripe.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/symphone.svg b/ui-next/public/integrations-icons/symphone.svg
new file mode 100644
index 0000000000..793a3b8ef1
--- /dev/null
+++ b/ui-next/public/integrations-icons/symphone.svg
@@ -0,0 +1,4 @@
+
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/teams.svg b/ui-next/public/integrations-icons/teams.svg
new file mode 100644
index 0000000000..353c07d054
--- /dev/null
+++ b/ui-next/public/integrations-icons/teams.svg
@@ -0,0 +1,9 @@
+
diff --git a/ui-next/public/integrations-icons/telegram.svg b/ui-next/public/integrations-icons/telegram.svg
new file mode 100644
index 0000000000..b637cb5160
--- /dev/null
+++ b/ui-next/public/integrations-icons/telegram.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/terraform.svg b/ui-next/public/integrations-icons/terraform.svg
new file mode 100644
index 0000000000..536afddac0
--- /dev/null
+++ b/ui-next/public/integrations-icons/terraform.svg
@@ -0,0 +1,8 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/trello.svg b/ui-next/public/integrations-icons/trello.svg
new file mode 100644
index 0000000000..6b5c9e27f4
--- /dev/null
+++ b/ui-next/public/integrations-icons/trello.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/twilio.svg b/ui-next/public/integrations-icons/twilio.svg
new file mode 100644
index 0000000000..2392f4bd91
--- /dev/null
+++ b/ui-next/public/integrations-icons/twilio.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/vertexAI.svg b/ui-next/public/integrations-icons/vertexAI.svg
new file mode 100644
index 0000000000..a350af8e2b
--- /dev/null
+++ b/ui-next/public/integrations-icons/vertexAI.svg
@@ -0,0 +1,285 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/weaviate.svg b/ui-next/public/integrations-icons/weaviate.svg
new file mode 100644
index 0000000000..c21035957b
--- /dev/null
+++ b/ui-next/public/integrations-icons/weaviate.svg
@@ -0,0 +1,6 @@
+
diff --git a/ui-next/public/integrations-icons/youtube.svg b/ui-next/public/integrations-icons/youtube.svg
new file mode 100644
index 0000000000..9f85f42217
--- /dev/null
+++ b/ui-next/public/integrations-icons/youtube.svg
@@ -0,0 +1,8 @@
+
\ No newline at end of file
diff --git a/ui-next/public/integrations-icons/zendesk.svg b/ui-next/public/integrations-icons/zendesk.svg
new file mode 100644
index 0000000000..72632201e7
--- /dev/null
+++ b/ui-next/public/integrations-icons/zendesk.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui-next/public/logo.png b/ui-next/public/logo.png
new file mode 100644
index 0000000000..a5997590d5
Binary files /dev/null and b/ui-next/public/logo.png differ
diff --git a/ui-next/public/orkes-logo-purple-2x.png b/ui-next/public/orkes-logo-purple-2x.png
new file mode 100644
index 0000000000..eb4539d934
Binary files /dev/null and b/ui-next/public/orkes-logo-purple-2x.png differ
diff --git a/ui-next/public/orkes-logo-purple-inverted-2x.png b/ui-next/public/orkes-logo-purple-inverted-2x.png
new file mode 100644
index 0000000000..f844d44623
Binary files /dev/null and b/ui-next/public/orkes-logo-purple-inverted-2x.png differ
diff --git a/ui-next/public/programming-language-icons/python.svg b/ui-next/public/programming-language-icons/python.svg
new file mode 100644
index 0000000000..f742e7d6ff
--- /dev/null
+++ b/ui-next/public/programming-language-icons/python.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/ui-next/public/robots.txt b/ui-next/public/robots.txt
new file mode 100644
index 0000000000..e9e57dc4d4
--- /dev/null
+++ b/ui-next/public/robots.txt
@@ -0,0 +1,3 @@
+# https://www.robotstxt.org/robotstxt.html
+User-agent: *
+Disallow:
diff --git a/ui-next/public/searchIconBg.svg b/ui-next/public/searchIconBg.svg
new file mode 100644
index 0000000000..2be345446a
--- /dev/null
+++ b/ui-next/public/searchIconBg.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/ui-next/public/wh-icons/github-icon.svg b/ui-next/public/wh-icons/github-icon.svg
new file mode 100644
index 0000000000..b02cc459e8
--- /dev/null
+++ b/ui-next/public/wh-icons/github-icon.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/ui-next/public/wh-icons/microsoft-teams-icon.svg b/ui-next/public/wh-icons/microsoft-teams-icon.svg
new file mode 100644
index 0000000000..e88affb181
--- /dev/null
+++ b/ui-next/public/wh-icons/microsoft-teams-icon.svg
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui-next/public/wh-icons/send-grid-icon.svg b/ui-next/public/wh-icons/send-grid-icon.svg
new file mode 100644
index 0000000000..9450d5f1d0
--- /dev/null
+++ b/ui-next/public/wh-icons/send-grid-icon.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui-next/public/wh-icons/slack-icon.svg b/ui-next/public/wh-icons/slack-icon.svg
new file mode 100644
index 0000000000..4b995c9aa2
--- /dev/null
+++ b/ui-next/public/wh-icons/slack-icon.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui-next/public/wh-icons/stripe-icon.svg b/ui-next/public/wh-icons/stripe-icon.svg
new file mode 100644
index 0000000000..3b95e2b531
--- /dev/null
+++ b/ui-next/public/wh-icons/stripe-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/ui-next/src/commonServices/execution.ts b/ui-next/src/commonServices/execution.ts
new file mode 100644
index 0000000000..ebc851e0c0
--- /dev/null
+++ b/ui-next/src/commonServices/execution.ts
@@ -0,0 +1,37 @@
+import { queryClient } from "queryClient";
+import { fetchWithContext, fetchContextNonHook } from "plugins/fetch";
+import { getErrors } from "../utils/utils";
+import { HasAuthHeaders } from "types/common";
+import { featureFlags, FEATURES } from "utils/flags";
+
+const fetchContext = fetchContextNonHook();
+const isWorkflowIntrospectionEnabled = featureFlags.isEnabled(
+ FEATURES.WORKFLOW_INTROSPECTION,
+);
+
+export const fetchExecution = async ({
+ authHeaders: headers,
+ executionId,
+}: HasAuthHeaders & { executionId: string }) => {
+ const url = `/workflow/${executionId}?summarize=true`;
+ const introspectionUrl = `/workflow/introspection/records?workflowId=${executionId}`;
+
+ try {
+ const workflowExecution = await queryClient.fetchQuery(
+ [fetchContext.stack, url],
+ () => fetchWithContext(url, fetchContext, { headers }),
+ );
+
+ if (isWorkflowIntrospectionEnabled) {
+ workflowExecution.workflowIntrospection = await queryClient.fetchQuery(
+ [fetchContext.stack, introspectionUrl],
+ () => fetchWithContext(introspectionUrl, fetchContext, { headers }),
+ );
+ }
+
+ return workflowExecution;
+ } catch (error) {
+ const errorDetails = await getErrors(error as Response);
+ return Promise.reject({ originalError: error, errorDetails });
+ }
+};
diff --git a/ui-next/src/commonServices/index.ts b/ui-next/src/commonServices/index.ts
new file mode 100644
index 0000000000..9e2d798e6c
--- /dev/null
+++ b/ui-next/src/commonServices/index.ts
@@ -0,0 +1 @@
+export * from "./execution";
diff --git a/ui-next/src/components/ActionButton.tsx b/ui-next/src/components/ActionButton.tsx
new file mode 100644
index 0000000000..3cd99b3058
--- /dev/null
+++ b/ui-next/src/components/ActionButton.tsx
@@ -0,0 +1,53 @@
+import { Box } from "@mui/material";
+import CircularProgress from "@mui/material/CircularProgress";
+import Button, { MuiButtonProps } from "components/MuiButton";
+
+const style = {
+ root: {
+ display: "inline-flex",
+ flexDirection: "column",
+ alignItems: "flex-start",
+ },
+ wrapper: {
+ position: "relative",
+ width: "100%",
+ },
+ buttonProgress: {
+ position: "absolute",
+ top: "50%",
+ left: "50%",
+ marginTop: "-12px",
+ marginLeft: "-12px",
+ },
+};
+
+export interface IActionButtonProps extends MuiButtonProps {
+ progress?: boolean;
+}
+
+const ActionButton = ({
+ children,
+ disabled,
+ onClick,
+ progress,
+ ...props
+}: IActionButtonProps) => {
+ return (
+
+
+
+ {progress && (
+
+ )}
+
+
+ );
+};
+
+export default ActionButton;
diff --git a/ui-next/src/components/App.tsx b/ui-next/src/components/App.tsx
new file mode 100644
index 0000000000..3f0cea5892
--- /dev/null
+++ b/ui-next/src/components/App.tsx
@@ -0,0 +1,108 @@
+import { SafariWarning } from "components/SafariWarning";
+import OnboardingQuiz from "components/v1/quiz/OnboardingQuiz";
+import React, { useState } from "react";
+import { Helmet } from "react-helmet";
+import { Outlet } from "react-router";
+import { AuthProvider as AuthProviderImport } from "shared/auth/AuthProvider";
+import SideAndTopBarsLayout from "shared/SideAndTopBarsLayout";
+import { SidebarProvider } from "components/Sidebar/context/SidebarContextProvider";
+import { UserSettingsProvider } from "shared/UserSettingsProvider";
+import { pluginRegistry } from "plugins/registry";
+import {
+ featureFlags,
+ FEATURES,
+ GTAG_LABEL,
+ isSafari,
+ useAPIReleaseVersion,
+ useMaybeEnableLogRocket,
+} from "utils";
+import { getThemeAsCSSVariables } from "utils/themeVariables";
+
+// Resolve global components once at module load time (after plugins are registered)
+const globalComponents = pluginRegistry.getGlobalComponents();
+
+const AuthProvider = AuthProviderImport as React.ComponentType<{
+ children: React.ReactNode;
+}>;
+
+const showOnboardingQuiz = featureFlags.isEnabled(
+ FEATURES.SHOW_ONBOARDING_QUIZ,
+);
+
+const isPlayground = featureFlags.isEnabled(FEATURES.PLAYGROUND);
+
+// App component that will be used as the root element
+export function App() {
+ useAPIReleaseVersion({ option: { enabled: true } });
+ useMaybeEnableLogRocket();
+
+ // Checking responsive width (Mobile)
+ const [showSafariWarning, setShowSafariWarning] = useState(isSafari);
+
+ const themeAsCSSVariables = getThemeAsCSSVariables();
+
+ return (
+
+
+
+
+ {showOnboardingQuiz ? : null}
+
+
+
+ {showSafariWarning && (
+
+ )}
+
+
+
+
+ {/* Global plugin components (e.g. pollers, invisible side-effect components) */}
+ {globalComponents.map((Component, i) => (
+
+ ))}
+ {isPlayground ? (
+
+
+
+
+
+
+
+ ) : null}
+
+
+ );
+}
diff --git a/ui-next/src/components/AutoCompleteWithDescription.tsx b/ui-next/src/components/AutoCompleteWithDescription.tsx
new file mode 100644
index 0000000000..851f103f58
--- /dev/null
+++ b/ui-next/src/components/AutoCompleteWithDescription.tsx
@@ -0,0 +1,102 @@
+import { CSSProperties, FunctionComponent, ReactNode } from "react";
+import Autocomplete, { createFilterOptions } from "@mui/material/Autocomplete";
+import Box from "@mui/material/Box";
+import { fontWeights } from "theme/tokens/variables";
+import TextField from "@mui/material/TextField";
+import { Popper } from "@mui/material";
+
+const filter = createFilterOptions();
+
+interface AutoCompleteWithDescriptionProps {
+ value?: string;
+ options?: { name: string; description: ReactNode }[];
+ error?: boolean;
+ helperText?: string;
+ onChange: (value: string) => void;
+ placeholder?: string;
+ growPopper?: boolean;
+}
+
+export const AutoCompleteWithDescription: FunctionComponent<
+ AutoCompleteWithDescriptionProps
+> = ({
+ value,
+ options = [],
+ error = false,
+ helperText,
+ onChange,
+ placeholder = "",
+ growPopper,
+}) => {
+ const popperStyle = (style: CSSProperties | undefined) => {
+ return growPopper ? { maxWidth: "300px" } : style;
+ };
+ return (
+ (
+
+ )}
+ value={value ? value : ""}
+ isOptionEqualToValue={(option: any, currentValue: any) =>
+ option?.name === currentValue
+ }
+ autoHighlight
+ componentsProps={{ paper: { elevation: 3 } }}
+ onChange={(_event, newValue: any) => {
+ onChange(newValue?.name);
+ }}
+ filterOptions={(options, params) => {
+ const filtered = filter(options, params);
+ return filtered;
+ }}
+ id="assignment-type-dialog"
+ options={options}
+ getOptionLabel={(option) => {
+ // e.g value selected with enter, right from the input
+ if (typeof option === "string") {
+ return option;
+ }
+ return option?.name;
+ }}
+ selectOnFocus
+ clearOnBlur
+ handleHomeEndKeys
+ renderOption={(props, option) => (
+
+
+
+ {option.name}
+
+ {option.description}
+
+
+ )}
+ freeSolo
+ renderInput={(params) => (
+
+ )}
+ />
+ );
+};
diff --git a/ui-next/src/components/AutoRefreshButton.tsx b/ui-next/src/components/AutoRefreshButton.tsx
new file mode 100644
index 0000000000..3d4a361089
--- /dev/null
+++ b/ui-next/src/components/AutoRefreshButton.tsx
@@ -0,0 +1,175 @@
+import {
+ IconProps,
+ ArrowCounterClockwise as Restart,
+} from "@phosphor-icons/react";
+import { useActor, useSelector } from "@xstate/react";
+import RefreshIcon from "components/v1/icons/RefreshIcon";
+import isNil from "lodash/isNil";
+import {
+ COUNT_DOWN_TYPE,
+ CountdownContext,
+ CountdownEventTypes,
+ CountdownEvents,
+} from "pages/execution/state/types";
+import {
+ ForwardRefExoticComponent,
+ FunctionComponent,
+ RefAttributes,
+ useState,
+} from "react";
+import { WorkflowExecutionStatus } from "types/Execution";
+import { ActorRef, State } from "xstate";
+import DropdownButton from "./DropdownButton";
+import Button, { MuiButtonProps } from "./MuiButton";
+import { SpinningIcon } from "./v1/SpinningIcon";
+
+interface AutoRefreshButtonProps {
+ buttonProps: MuiButtonProps;
+ countdownActor: ActorRef;
+}
+
+const SpinningRefreshIcon = SpinningIcon(
+ RefreshIcon as ForwardRefExoticComponent<
+ IconProps & RefAttributes
+ >,
+);
+
+const AutoRefreshButton: FunctionComponent = ({
+ buttonProps,
+ countdownActor,
+}) => {
+ const duration = useSelector(
+ countdownActor,
+ (state: State) => state.context.duration,
+ );
+ const elapsed = useSelector(countdownActor, (state) => state.context.elapsed);
+ const isDisabled = useSelector(countdownActor, (state) =>
+ state.matches("disabled"),
+ );
+ const [, send] = useActor(countdownActor);
+
+ const disableCounter = () => send({ type: CountdownEventTypes.DISABLE });
+ const enableCounter = () => send({ type: CountdownEventTypes.ENABLE });
+ const forceRefresh = () => send({ type: CountdownEventTypes.FORCE_FINISH });
+ const updateDuration = (
+ duration: number,
+ countdownType = COUNT_DOWN_TYPE.INFINITE,
+ ) =>
+ send({
+ type: CountdownEventTypes.UPDATE_DURATION,
+ duration,
+ countdownType,
+ });
+
+ return (
+ <>
+ {
+ updateDuration(5);
+ },
+ disabled: isDisabled,
+ },
+ {
+ label: "Refresh every 10s",
+ handler: () => {
+ updateDuration(10);
+ },
+ disabled: isDisabled,
+ },
+ {
+ label: "Refresh every 15s",
+ handler: () => {
+ updateDuration(15);
+ },
+ disabled: isDisabled,
+ },
+ {
+ label: "Refresh every 30s",
+ handler: () => {
+ updateDuration(30);
+ },
+ disabled: isDisabled,
+ },
+ {
+ label: "Refresh every 60s",
+ handler: () => {
+ updateDuration(60);
+ },
+ disabled: isDisabled,
+ },
+ {
+ label: `${isDisabled ? "Enable" : "Disable"} Auto Refresh`,
+ handler: isDisabled ? enableCounter : disableCounter,
+ },
+ ]}
+ buttonProps={buttonProps}
+ >
+ Refresh {duration - elapsed}
+
+
+ >
+ );
+};
+interface MaybeAutoRefreshProps {
+ buttonProps: MuiButtonProps;
+ countdownActor: ActorRef;
+ refetch: () => void;
+ execution: {
+ status: WorkflowExecutionStatus;
+ };
+}
+const MaybeAutoRefresh: FunctionComponent = ({
+ buttonProps,
+ countdownActor,
+ refetch,
+ execution,
+}) => {
+ const [isAnimating, setIsAnimating] = useState(false);
+
+ const handleRefetch = () => {
+ setIsAnimating(true);
+ refetch();
+ };
+ return isNil(countdownActor) ? (
+
+ ) : (
+
+ );
+};
+
+export default MaybeAutoRefresh;
diff --git a/ui-next/src/components/Banner.jsx b/ui-next/src/components/Banner.jsx
new file mode 100644
index 0000000000..705ecf2ae6
--- /dev/null
+++ b/ui-next/src/components/Banner.jsx
@@ -0,0 +1,20 @@
+import { Paper } from "@mui/material";
+
+export default function Banner({ children, ...rest }) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/ui-next/src/components/ButtonGroup.jsx b/ui-next/src/components/ButtonGroup.jsx
new file mode 100644
index 0000000000..1b1aecdcb3
--- /dev/null
+++ b/ui-next/src/components/ButtonGroup.jsx
@@ -0,0 +1,20 @@
+import { FormControl, InputLabel } from "@mui/material";
+import Button from "./MuiButton";
+import MuiButtonGroup from "./MuiButtonGroup";
+
+const ButtonGroup = ({ options, label, style, classes, ...props }) => {
+ return (
+
+ {label && {label}}
+
+ {options.map((option, idx) => (
+
+ ))}
+
+
+ );
+};
+
+export default ButtonGroup;
diff --git a/ui-next/src/components/ButtonTooltip.tsx b/ui-next/src/components/ButtonTooltip.tsx
new file mode 100644
index 0000000000..8b41e3b23f
--- /dev/null
+++ b/ui-next/src/components/ButtonTooltip.tsx
@@ -0,0 +1,66 @@
+import {
+ Fragment,
+ FunctionComponent,
+ ReactElement,
+ ReactNode,
+ useMemo,
+} from "react";
+import { IconButton, IconButtonProps, Tooltip } from "@mui/material";
+import Button, { MuiButtonProps } from "components/MuiButton";
+
+export interface ButtonTooltipProps extends MuiButtonProps {
+ tooltip: NonNullable;
+ variant?: "contained" | "text" | "outlined";
+ disabled?: boolean;
+ onClick: () => void;
+ "data-testid"?: string;
+ displayChildren?: boolean;
+}
+
+export const ButtonTooltip: FunctionComponent = ({
+ tooltip,
+ disabled = false,
+ onClick,
+ children,
+ variant = "contained",
+ displayChildren = true,
+ ...otherButtonProps
+}) => {
+ const Container = useMemo(
+ () =>
+ ({ children }: { children: ReactElement }) =>
+ !tooltip && children != null ? (
+ {children}
+ ) : (
+
+ {children}
+
+ ),
+ [tooltip],
+ );
+ return (
+
+ {displayChildren ? (
+
+ ) : (
+ theme.palette.primary.main }}
+ {...(otherButtonProps as IconButtonProps)}
+ >
+ {otherButtonProps.startIcon}
+
+ )}
+
+ );
+};
diff --git a/ui-next/src/components/CenteredSpinner.tsx b/ui-next/src/components/CenteredSpinner.tsx
new file mode 100644
index 0000000000..8c0a09ea4a
--- /dev/null
+++ b/ui-next/src/components/CenteredSpinner.tsx
@@ -0,0 +1,28 @@
+import { Box, CircularProgress, Typography } from "@mui/material";
+
+interface CenteredSpinnerProps {
+ message?: string;
+}
+
+const CenteredSpinner = ({ message }: CenteredSpinnerProps) => (
+
+
+ {message && (
+
+ {message}
+
+ )}
+
+);
+
+export default CenteredSpinner;
diff --git a/ui-next/src/components/ClipboardCopy.tsx b/ui-next/src/components/ClipboardCopy.tsx
new file mode 100644
index 0000000000..a262ad9c5e
--- /dev/null
+++ b/ui-next/src/components/ClipboardCopy.tsx
@@ -0,0 +1,108 @@
+import { CSSProperties, ReactNode, useState } from "react";
+import { Copy } from "@phosphor-icons/react";
+import { Box, Snackbar, SxProps } from "@mui/material";
+import MuiAlert from "components/MuiAlert";
+import { black } from "theme/tokens/colors";
+import { logger } from "utils";
+import IconButton from "components/MuiIconButton";
+
+export interface ClipboardCopyProps {
+ children?: ReactNode;
+ value: string;
+ buttonId?: string;
+ sx?: SxProps;
+ linkStyle?: CSSProperties;
+ iconPlacement?: "start" | "end";
+}
+
+export default function ClipboardCopy({
+ children,
+ value,
+ buttonId = "",
+ sx,
+ linkStyle,
+ iconPlacement = "end",
+}: ClipboardCopyProps) {
+ const [isToastOpen, setIsToastOpen] = useState(false);
+
+ function copyContent() {
+ setIsToastOpen(true);
+ navigator.clipboard.writeText(value).catch((e) => {
+ logger.error("Unable to copy to clipboard!", e);
+ });
+ }
+
+ return (
+ <>
+
+
+ {children}
+
+
+
+
+
+
+
+ setIsToastOpen(false)}
+ id="copied-to-clipboard-popup"
+ >
+ setIsToastOpen(false)}
+ >
+ Copied to Clipboard
+
+
+ >
+ );
+}
diff --git a/ui-next/src/components/CodeBlockInput.tsx b/ui-next/src/components/CodeBlockInput.tsx
new file mode 100644
index 0000000000..8d55b6a036
--- /dev/null
+++ b/ui-next/src/components/CodeBlockInput.tsx
@@ -0,0 +1,151 @@
+import Editor, { EditorProps } from "@monaco-editor/react";
+import { Box, BoxProps, InputLabel, Tooltip } from "@mui/material";
+import { Theme } from "@mui/material/styles";
+import { SxProps } from "@mui/system";
+import {
+ CSSProperties,
+ FunctionComponent,
+ ReactNode,
+ useCallback,
+ useContext,
+ useRef,
+} from "react";
+import { ColorModeContext } from "theme/material/ColorModeContext";
+import { inputLabelIdleStyles } from "theme/material/components/formControls";
+import { SMALL_EDITOR_DEFAULT_OPTIONS } from "utils/constants";
+import Text from "./Text";
+
+type CodeBlockInputProps = {
+ label?: ReactNode;
+ language?: string;
+ onChange?: (value: string) => void;
+ value?: string;
+ containerProps?: BoxProps;
+ error?: boolean;
+ height?: number | "auto";
+ minHeight?: number;
+ autoformat?: boolean;
+ labelStyle?: SxProps;
+ languageLabel?: string;
+ containerStyles?: CSSProperties;
+} & Partial>;
+
+const MIN_HEIGHT = 120;
+
+const CodeBlockInput: FunctionComponent = ({
+ label = "Code",
+ language = "json",
+ onChange = () => null,
+ value = "",
+ containerProps = {},
+ error = false,
+ minHeight,
+ autoformat = true,
+ labelStyle,
+ languageLabel,
+ containerStyles = {},
+ ...restOfProps
+}) => {
+ const { mode } = useContext(ColorModeContext);
+ const editorRef = useRef(null) as any;
+
+ const handleEditorDidMount = useCallback(
+ (editor: any) => {
+ editorRef.current = editor;
+ if (autoformat) {
+ editor.onDidBlurEditorWidget(() => {
+ editor.getAction("editor.action.formatDocument").run();
+ });
+ }
+ },
+ [editorRef, autoformat],
+ );
+
+ const onEditorChange = useCallback(() => {
+ const editorValue = editorRef?.current?.getValue();
+ onChange(editorValue);
+ }, [onChange]);
+
+ const minimumHeight = minHeight || MIN_HEIGHT;
+
+ return (
+
+ {label && (
+
+ {typeof label === "string" && label.length > 30 ? (
+
+ {label}
+
+ ) : (
+
+ }
+ >
+ {label}
+
+ )}
+
+
+ {languageLabel
+ ? languageLabel.toUpperCase()
+ : language.toUpperCase()}
+
+
+ )}
+ section": {
+ resize: "vertical",
+ overflow: "auto",
+ minHeight: minimumHeight,
+ },
+ ...containerStyles,
+ }}
+ >
+
+
+
+ );
+};
+
+export default CodeBlockInput;
diff --git a/ui-next/src/components/ConfirmChoiceDialog.tsx b/ui-next/src/components/ConfirmChoiceDialog.tsx
new file mode 100644
index 0000000000..5f3da127ba
--- /dev/null
+++ b/ui-next/src/components/ConfirmChoiceDialog.tsx
@@ -0,0 +1,135 @@
+import {
+ Box,
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogTitle,
+} from "@mui/material";
+import ConductorInput from "components/v1/ConductorInput";
+import SaveIcon from "components/v1/icons/SaveIcon";
+import XCloseIcon from "components/v1/icons/XCloseIcon";
+import { ReactNode, useState } from "react";
+import { Button, Text } from "components/index";
+import ActionButton from "components/ActionButton";
+
+const style = {
+ confirmationMessage: {
+ opacity: 0.8,
+ paddingLeft: "10px",
+ fontSize: "15px",
+ lineHeight: 1.5,
+ "& p": {
+ fontSize: "15px",
+ fontWeight: "normal",
+ },
+ "& svg": {
+ fontSize: "15px",
+ },
+ },
+};
+
+export default function ConfirmChoiceDialog({
+ header = "Confirmation",
+ message = "Please confirm",
+ handleConfirmationValue,
+ isInputConfirmation,
+ valueToBeDeleted,
+ cancelBtnLabel,
+ confirmBtnLabel,
+ disableBackdropClick,
+ disableEscapeKeyDown,
+ hideCancelBtn,
+ id = "confirm-choice-dialog",
+ isConfirmLoading = false,
+}: {
+ header?: string;
+ message?: string | ReactNode;
+ handleConfirmationValue: (b: boolean) => void;
+ valueToBeDeleted?: string;
+ isInputConfirmation?: boolean;
+ cancelBtnLabel?: string;
+ confirmBtnLabel?: string;
+ disableBackdropClick?: boolean;
+ disableEscapeKeyDown?: boolean;
+ hideCancelBtn?: boolean;
+ id?: string;
+ isConfirmLoading?: boolean;
+}) {
+ const [inputValue, setInputValue] = useState("");
+
+ const onClose = (
+ event: Event,
+ reason: "backdropClick" | "escapeKeyDown" | "closeButtonClick",
+ ) => {
+ if (disableBackdropClick && reason === "backdropClick") {
+ return false;
+ }
+
+ handleConfirmationValue(false);
+ };
+
+ return (
+
+ );
+}
diff --git a/ui-next/src/components/CustomButton.tsx b/ui-next/src/components/CustomButton.tsx
new file mode 100644
index 0000000000..0eb2e7e6c0
--- /dev/null
+++ b/ui-next/src/components/CustomButton.tsx
@@ -0,0 +1,48 @@
+import Button, { MuiButtonProps } from "components/MuiButton";
+
+interface CustomButtonProps extends MuiButtonProps {
+ customVariant?: string;
+ height?: string;
+}
+
+const CustomButton = ({
+ customVariant,
+ height,
+ ...props
+}: CustomButtonProps) => {
+ const commonStyle = {
+ border: `1px solid`,
+ color: "#060606",
+ borderRadius: "6px",
+ ...(height ? { height: height } : {}),
+ };
+ const primaryStyles = {
+ backgroundColor: "#C8ABFF",
+ borderColor: "#9157FF",
+ ":hover": {
+ backgroundColor: "#C8ABFF",
+ },
+ };
+ const secondaryStyles = {
+ backgroundColor: "transparent",
+ borderColor: "#161616",
+ ":hover": {
+ backgroundColor: "transparent",
+ },
+ };
+ const variantStyle = () => {
+ switch (customVariant) {
+ case "primary":
+ return primaryStyles;
+ case "secondary":
+ return secondaryStyles;
+ default:
+ return primaryStyles;
+ }
+ };
+
+ return ;
+};
+
+export type { CustomButtonProps };
+export default CustomButton;
diff --git a/ui-next/src/components/DataTable/ColumnSelector.tsx b/ui-next/src/components/DataTable/ColumnSelector.tsx
new file mode 100644
index 0000000000..ee28fb6d2b
--- /dev/null
+++ b/ui-next/src/components/DataTable/ColumnSelector.tsx
@@ -0,0 +1,121 @@
+import { useCallback, useState, FunctionComponent } from "react";
+import { ListItemText, Menu, MenuItem, Tooltip, Box } from "@mui/material";
+import { Columns } from "@phosphor-icons/react";
+import _isEmpty from "lodash/isEmpty";
+import { adjust } from "utils/array";
+import { getColumnLabel, getColumnId } from "./helpers";
+import { SerializableColumn } from "./state/types";
+import Button from "components/MuiButton";
+import MuiCheckbox from "components/MuiCheckbox";
+
+interface ColumnSorterProps {
+ columns: SerializableColumn[];
+ defaultShowColumns: string[];
+ onColumnVisibilityChange: (
+ columnsOrder: SerializableColumn[],
+ columnsVisibility: SerializableColumn[],
+ ) => void;
+}
+
+export const ColumnsSelector: FunctionComponent = ({
+ columns,
+ defaultShowColumns,
+ onColumnVisibilityChange,
+}) => {
+ const [anchorEl, setAnchorEl] = useState(null);
+
+ const handleClick = (event: any) => {
+ setAnchorEl(event.currentTarget);
+ };
+
+ const handleClose = () => {
+ setAnchorEl(null);
+ };
+
+ const handleChange = useCallback(
+ ({ checked, columnIdx }: { checked: boolean; columnIdx: number }) => {
+ const changedVisibility = adjust(
+ columnIdx,
+ () => ({
+ ...columns[columnIdx],
+ omit: checked,
+ }),
+ columns,
+ );
+ onColumnVisibilityChange(columns, changedVisibility);
+ },
+ [onColumnVisibilityChange, columns],
+ );
+
+ const reset = useCallback(() => {
+ const resetVisibility = columns.map((c) => ({
+ ...c,
+ omit: _isEmpty(defaultShowColumns)
+ ? false
+ : !defaultShowColumns.includes(getColumnId(c)),
+ }));
+
+ onColumnVisibilityChange(columns, resetVisibility);
+ }, [onColumnVisibilityChange, columns, defaultShowColumns]);
+
+ return (
+ <>
+
+
+ }
+ onClick={handleClick}
+ color="inherit"
+ >
+ Columns
+
+
+
+
+ >
+ );
+};
diff --git a/ui-next/src/components/DataTable/DataTable.tsx b/ui-next/src/components/DataTable/DataTable.tsx
new file mode 100644
index 0000000000..b4ffe60925
--- /dev/null
+++ b/ui-next/src/components/DataTable/DataTable.tsx
@@ -0,0 +1,568 @@
+import {
+ Box,
+ CircularProgress,
+ Grid,
+ GridProps,
+ Theme,
+ Tooltip,
+} from "@mui/material";
+import useMediaQuery from "@mui/material/useMediaQuery";
+import { ArrowDown as SortIcon } from "@phosphor-icons/react";
+import { useMachine, useSelector } from "@xstate/react";
+import { path as _path } from "lodash/fp";
+import _isEmpty from "lodash/isEmpty";
+import _isNil from "lodash/isNil";
+import _isString from "lodash/isString";
+import _noop from "lodash/noop";
+import _omit from "lodash/omit";
+import _stubTrue from "lodash/stubTrue";
+import {
+ FunctionComponent,
+ ReactNode,
+ useCallback,
+ useContext,
+ useEffect,
+ useMemo,
+ useState,
+} from "react";
+import RawDataTable, {
+ TableProps,
+ TableStyles,
+} from "react-data-table-component";
+import { ColorModeContext } from "theme/material/ColorModeContext";
+import { colors } from "theme/tokens/variables";
+import { createTableTitle, logger, useLocalStorage } from "utils";
+import { LOCAL_STORAGE_KEY } from "utils/constants/common";
+import { ColumnsSelector } from "./ColumnSelector";
+import { Filter } from "./Filter";
+import { TagFilter } from "./TagFilter";
+import {
+ createDefaultFilterObject,
+ defaultFilterItemsSorter,
+ formatForColumn,
+} from "./helpers";
+import { QuickSearch, QuickSearchProps } from "./QuickSearch";
+import { dataTableMachine } from "./state";
+import {
+ DataTableEventTypes,
+ FilterObjectItem,
+ SerializableColumn,
+} from "./state/types";
+import { dataTableStyles } from "./styles";
+import { ColumnCustomType, LegacyColumn, RenderableColumn } from "./types";
+
+export const DEFAULT_ROWS_PER_PAGE = 15;
+
+const headerdefaultbackcolor = "#f8f8f8";
+
+export interface DataTableProps extends TableProps {
+ columns: LegacyColumn[]; //Next step should be enforcing the use of id. in all tables
+ localStorageKey?: string;
+ customActions?: ReactNode[];
+ defaultShowColumns?: string[];
+ showColumnSelector?: boolean;
+ hideSearch?: boolean;
+ titleComponent?: ReactNode;
+ onFilterChange?: (filterObj?: FilterObjectItem) => void; // Dont really understand the undefined here
+ initialFilterObj?: FilterObjectItem;
+ quickSearchEnabled?: boolean;
+ quickSearchPlaceholder?: string;
+ quickSearchComponent?: FunctionComponent;
+ createButton?: ReactNode;
+ sortByDefault?: boolean;
+ onSearchTermChange?: (searchTerm: string) => void;
+ description?: ReactNode;
+ searchTerm?: string;
+ autoFocus?: boolean;
+ useGlobalRowsPerPage?: boolean;
+ searchModalContainerProps?: GridProps;
+ onRowMouseEnter?: (row: any) => void;
+ filterByTags?: boolean;
+}
+
+export const DataTable: FunctionComponent = (props) => {
+ const {
+ localStorageKey,
+ columns,
+ customActions,
+ data = [],
+ // options,
+ defaultShowColumns = [],
+ pagination = true,
+ paginationPerPage = 15,
+ showColumnSelector = true,
+ paginationServer = false,
+ hideSearch = false,
+ title,
+ titleComponent,
+ noDataComponent,
+ onFilterChange,
+ initialFilterObj,
+ quickSearchEnabled = false,
+ quickSearchPlaceholder = "Search",
+ customStyles,
+ createButton,
+ paginationComponent,
+ sortByDefault = true,
+ onSearchTermChange = _noop,
+ description,
+ quickSearchComponent: QuickSearchComponent = QuickSearch,
+ searchTerm: inputSearchTerm = "",
+ autoFocus = true,
+ onChangeRowsPerPage,
+ onColumnOrderChange,
+ useGlobalRowsPerPage = true,
+ searchModalContainerProps,
+ onRowMouseEnter,
+ filterByTags = false,
+ ...rest
+ } = props;
+ const { mode } = useContext(ColorModeContext);
+ const [persistRowsPerPage, setPersistRowsPerPage] = useLocalStorage(
+ LOCAL_STORAGE_KEY.ROWS_PER_PAGE,
+ paginationPerPage,
+ );
+
+ // Tag filter state
+ const [selectedTags, setSelectedTags] = useState([]);
+
+ const handleChangeRowsPerPage = (
+ rowsPerPage: number,
+ currentPage: number,
+ ) => {
+ if (useGlobalRowsPerPage) {
+ setPersistRowsPerPage(rowsPerPage);
+ }
+
+ if (onChangeRowsPerPage) {
+ onChangeRowsPerPage(rowsPerPage, currentPage);
+ }
+ };
+
+ // Checking responsive width
+ const isValidWidth = useMediaQuery((theme: Theme) =>
+ theme.breakpoints.down("sm"),
+ );
+
+ // Prepare column renderer.
+ const renderedColumns = columns.map((column): RenderableColumn => {
+ const {
+ id: _id,
+ name: _name,
+ wrap = true,
+ sortable = true,
+ selector: customSelector,
+ ...rest
+ } = column;
+ const format = formatForColumn(column as LegacyColumn);
+ return {
+ id: column.id,
+ selector: customSelector || ((row: any) => row[column.name as string]),
+ name: column.label,
+ sortable: sortable,
+ wrap: wrap,
+ // type,
+ // label,
+ omit: _isEmpty(defaultShowColumns)
+ ? false
+ : !defaultShowColumns.includes(column.id),
+ reorder: true,
+ format,
+ ...rest,
+ };
+ });
+
+ const [, send, actor] = useMachine(dataTableMachine, {
+ ...(process.env.NODE_ENV === "development" ? { devTools: true } : {}),
+ context: {
+ columnOrderAndVisibility: renderedColumns, // default to column renderer, TODO defaultShowColumns may hold the order
+ localStorageKey,
+ filterObj: initialFilterObj || createDefaultFilterObject(renderedColumns),
+ searchTerm: "",
+ },
+ });
+
+ // Will hold the order and visibility
+ const columnOrderVisibility = useSelector(
+ actor,
+ (state) => state.context.columnOrderAndVisibility,
+ );
+
+ const filterObj = useSelector(actor, (state) => state.context.filterObj);
+
+ const searchTerm = useSelector(actor, (state) => state.context.searchTerm);
+
+ // converts rendered columns to a map, extracting selector that can hold closures.
+ const renderedColumnsMap = Object.fromEntries(
+ renderedColumns.map((c) => [c.id, _omit(c, ["omit"])]),
+ );
+
+ // Using order and selector construct the resultant.
+ const orderedColumns = columnOrderVisibility.map((col) => ({
+ ...col,
+ ...renderedColumnsMap[col.id],
+ }));
+
+ const columnsWithTooltips = orderedColumns.map((column) => {
+ if (column.tooltip) {
+ return {
+ ...column,
+ name: (
+
+ {column.label}
+
+ ),
+ };
+ }
+ return column;
+ });
+
+ const handleColumnOrderChange = (
+ cols: LegacyColumn[],
+ viewCols: SerializableColumn[],
+ ) => {
+ const viewColumnsNameMapI = Object.fromEntries(
+ viewCols.map((c) => [c.id, c]),
+ );
+ const columnResult = cols.map(({ id }) => viewColumnsNameMapI[id]);
+ send({
+ type: DataTableEventTypes.SET_ORDER_AND_VISIBILITY,
+ data: columnResult,
+ });
+
+ if (onColumnOrderChange) {
+ onColumnOrderChange(columnResult);
+ }
+ };
+
+ const handleSearchTermChange = useCallback(
+ (searchTerm: string) => {
+ send({
+ type: DataTableEventTypes.SET_SEARCH_TERM,
+ searchTerm,
+ });
+ onSearchTermChange(searchTerm);
+ },
+ [onSearchTermChange, send],
+ );
+
+ useEffect(() => {
+ handleSearchTermChange(inputSearchTerm);
+ }, [handleSearchTermChange, inputSearchTerm]);
+
+ const handleFilterObjectChange = (filterObj: FilterObjectItem) => {
+ send({
+ type: DataTableEventTypes.SET_FILTER_OBJ,
+ filterObj,
+ });
+
+ // This makes no sense
+ if (onFilterChange) {
+ if (!_isEmpty(filterObj.substring)) {
+ onFilterChange(filterObj);
+ } else {
+ onFilterChange(undefined); // This makes no sense to me.
+ }
+ }
+ };
+
+ const searchTermMaybeFilterFn = useMemo(() => {
+ if (!quickSearchEnabled) return _stubTrue; // If quick search not enabled return true.
+
+ const searchableColumns = (columns as LegacyColumn[]).reduce(
+ (result: string[], col: LegacyColumn): string[] => {
+ if (col.searchable !== false) {
+ return result.concat(col.name as string);
+ }
+
+ return result;
+ },
+ [],
+ );
+
+ return (row: any) => {
+ // Don't need to filter cell that has null or undefined value
+ const rowSearchableColumns = searchableColumns.filter(
+ (key) => !_isNil(_path(key, row)),
+ );
+
+ return rowSearchableColumns.reduce((prev, curr) => {
+ const fCol = columns.find((column) => column.name === curr);
+ const rowVal = _path(curr, row);
+
+ const searchableFuncRes =
+ fCol?.searchableFunc != null
+ ? fCol
+ .searchableFunc(rowVal)
+ .toLowerCase()
+ .includes(searchTerm?.toLowerCase())
+ : rowVal
+ .toString()
+ .toLowerCase()
+ .includes(searchTerm?.toLowerCase());
+
+ return searchableFuncRes || prev;
+ }, false);
+ };
+ }, [columns, quickSearchEnabled, searchTerm]);
+
+ // Tag filter function
+ const tagFilterFn = useCallback(
+ (row: any) => {
+ if (selectedTags?.length === 0) return true;
+
+ if (!row?.tags || !Array.isArray(row?.tags)) return false;
+
+ return selectedTags.some((selectedTag) => {
+ return row?.tags?.some((tag: any) => {
+ if (tag && tag.key && tag.value) {
+ const tagString = `${tag?.key}:${tag?.value}`;
+ return tagString === selectedTag;
+ }
+ return false;
+ });
+ });
+ },
+ [selectedTags],
+ );
+
+ const filteredItems = useMemo(() => {
+ let filtered = data;
+
+ // Apply search term filter
+ filtered = filtered.filter(searchTermMaybeFilterFn);
+
+ // Apply tag filter if enabled
+ if (filterByTags) {
+ filtered = filtered.filter(tagFilterFn);
+ }
+
+ // Apply column filter if present
+ if (filterObj !== undefined) {
+ const column = renderedColumns.find(
+ (col) => col.id === filterObj.columnName,
+ ) as RenderableColumn; // This will search on all columns regardless of the column being omitted
+ if (filterObj.substring && filterObj.columnName) {
+ try {
+ const regexp = new RegExp(filterObj.substring, "i");
+ const filterObjFilterFn = (row: any, rowIdx: number) => {
+ let target;
+ if (
+ !_isNil(column?.type) &&
+ (column.type === ColumnCustomType.JSON ||
+ column.type === ColumnCustomType.DATE ||
+ column.searchable === "calculated")
+ ) {
+ target = column.format(row, rowIdx);
+
+ if (!_isString(target)) {
+ target = JSON.stringify(target);
+ }
+ } else {
+ target = column?.selector(row, rowIdx);
+ }
+
+ // Convert non-string values (including booleans) to strings for regex matching
+ if (!_isString(target)) {
+ target = String(target);
+ }
+
+ return regexp.test(target);
+ };
+
+ filtered = filtered.filter(filterObjFilterFn);
+ } catch (e) {
+ // Bad or incomplete Regexp
+ logger.error(e);
+ return [];
+ }
+ }
+ }
+
+ return filtered;
+ }, [
+ data,
+ filterObj,
+ searchTermMaybeFilterFn,
+ renderedColumns,
+ filterByTags,
+ tagFilterFn,
+ ]);
+
+ return (
+ <>
+ {quickSearchEnabled && (
+
+ )}
+
+ }
+ onRowMouseEnter={onRowMouseEnter}
+ title={
+ titleComponent ? (
+ titleComponent
+ ) : (
+
+ {title
+ ? title
+ : createTableTitle({ filteredData: filteredItems, data })}
+
+ )
+ }
+ columns={columnsWithTooltips}
+ // Sort strategy:
+ // 1. updateTime 1st (desc)
+ // 2. If updateTime isn't exist compare with createTime (desc)
+ // 3. name (asc)
+ data={
+ sortByDefault
+ ? defaultFilterItemsSorter(filteredItems)
+ : filteredItems
+ }
+ onColumnOrderChange={(col) =>
+ handleColumnOrderChange(col as LegacyColumn[], orderedColumns)
+ }
+ pagination={pagination}
+ paginationServer={paginationServer}
+ // The persistRowsPerPage variable will be used only if
+ // the default paginationComponent is used
+ paginationPerPage={
+ paginationComponent || !useGlobalRowsPerPage
+ ? paginationPerPage
+ : persistRowsPerPage
+ }
+ paginationRowsPerPageOptions={[15, 30, 100]}
+ noDataComponent={noDataComponent}
+ paginationComponent={paginationComponent}
+ progressComponent={
+
+
+
+ }
+ actions={
+
+ {customActions &&
+ customActions.length > 0 &&
+ customActions.map((component, index) => (
+
+ {component}
+
+ ))}
+
+ {!paginationServer && !quickSearchEnabled && !hideSearch && (
+
+
+
+ )}
+
+ {filterByTags && (
+
+
+
+ )}
+
+ {showColumnSelector && (
+
+
+
+ )}
+
+ }
+ onChangeRowsPerPage={handleChangeRowsPerPage}
+ {...rest}
+ />
+
+ >
+ );
+};
+export default DataTable;
diff --git a/ui-next/src/components/DataTable/Filter.tsx b/ui-next/src/components/DataTable/Filter.tsx
new file mode 100644
index 0000000000..df93dd04e9
--- /dev/null
+++ b/ui-next/src/components/DataTable/Filter.tsx
@@ -0,0 +1,104 @@
+import { Box, Button, MenuItem, Popover, Tooltip } from "@mui/material";
+import { MagnifyingGlass as SearchIcon } from "@phosphor-icons/react";
+import Input from "components/Input";
+import Select from "components/Select";
+import _get from "lodash/get";
+import _isNil from "lodash/isNil";
+import { FunctionComponent, useState } from "react";
+import { getColumnId, getColumnLabel, getColumnLabelById } from "./helpers";
+import { FilterObjectItem } from "./state";
+import { RenderableColumn } from "./types";
+
+export interface FilterProps {
+ columns: RenderableColumn[];
+ filterObj?: FilterObjectItem;
+ setFilterObj: (filterObject: FilterObjectItem) => void;
+}
+
+export const Filter: FunctionComponent = ({
+ columns,
+ filterObj,
+ setFilterObj,
+}) => {
+ const [anchorEl, setAnchorEl] = useState(null);
+
+ const handleClick = (event: any) => {
+ setAnchorEl(event.currentTarget);
+ };
+
+ const handleClose = () => {
+ setAnchorEl(null);
+ };
+
+ const handleValueChange = (v: string) => {
+ setFilterObj({
+ columnName: filterObj!.columnName,
+ substring: v,
+ });
+ };
+
+ const handleColumnChange = (c: string) => {
+ setFilterObj({
+ columnName: c,
+ substring: "",
+ });
+ };
+
+ return (
+ <>
+
+
+ }
+ onClick={handleClick}
+ color={_get(filterObj, "substring") !== "" ? "primary" : "inherit"}
+ disabled={_isNil(filterObj)}
+ >
+ Search
+
+
+
+
+
+
+
+ >
+ );
+};
diff --git a/ui-next/src/components/DataTable/QuickSearch.tsx b/ui-next/src/components/DataTable/QuickSearch.tsx
new file mode 100644
index 0000000000..46ceb9ae70
--- /dev/null
+++ b/ui-next/src/components/DataTable/QuickSearch.tsx
@@ -0,0 +1,82 @@
+import { Box, Grid, GridProps } from "@mui/material";
+import { FunctionComponent, ReactNode } from "react";
+
+import ConductorInput from "components/v1/ConductorInput";
+
+export interface QuickSearchProps {
+ autoFocusValue: boolean;
+ createButton?: ReactNode;
+ description?: ReactNode;
+ onChange: (val: string) => void;
+ quickSearchLabel?: ReactNode;
+ quickSearchPlaceholder: string;
+ searchTerm: string;
+ searchModalContainerProps?: GridProps;
+}
+
+export const QuickSearch: FunctionComponent = ({
+ autoFocusValue,
+ createButton,
+ description,
+ quickSearchLabel = "Quick search",
+ onChange,
+ quickSearchPlaceholder,
+ searchTerm,
+ searchModalContainerProps,
+}) => {
+ return (
+
+
+
+
+
+
+ {createButton && (
+
+ {createButton}
+
+ )}
+
+ {description && (
+
+ {description}
+
+ )}
+
+
+ );
+};
diff --git a/ui-next/src/components/DataTable/TableRefreshButton.tsx b/ui-next/src/components/DataTable/TableRefreshButton.tsx
new file mode 100644
index 0000000000..0a8dd67396
--- /dev/null
+++ b/ui-next/src/components/DataTable/TableRefreshButton.tsx
@@ -0,0 +1,31 @@
+import { Tooltip } from "@mui/material";
+import { Button } from "components";
+import { colors } from "theme/tokens/variables";
+import { ArrowClockwise as RefreshIcon } from "@phosphor-icons/react";
+
+interface TableRefreshButtonProps {
+ tooltipTitle: string;
+ refetch: () => void;
+}
+
+export const TableRefreshButton = ({
+ tooltipTitle,
+ refetch,
+}: TableRefreshButtonProps) => {
+ return (
+
+ }
+ onClick={() => refetch()}
+ sx={{
+ color: (theme) =>
+ theme.palette.mode === "dark" ? colors.gray13 : colors.gray02,
+ }}
+ >
+ Refresh
+
+
+ );
+};
diff --git a/ui-next/src/components/DataTable/TagFilter.tsx b/ui-next/src/components/DataTable/TagFilter.tsx
new file mode 100644
index 0000000000..4e9cd54a09
--- /dev/null
+++ b/ui-next/src/components/DataTable/TagFilter.tsx
@@ -0,0 +1,388 @@
+import React, { useState, FunctionComponent, useMemo } from "react";
+import {
+ Popover,
+ Tooltip,
+ Box,
+ Button,
+ Chip,
+ TextField,
+ InputAdornment,
+ Typography,
+ Divider,
+ List,
+ ListItem,
+ Checkbox,
+ FormControlLabel,
+ Accordion,
+ AccordionSummary,
+ AccordionDetails,
+} from "@mui/material";
+import {
+ Tag as TagIcon,
+ MagnifyingGlass as SearchIcon,
+ CaretDown as ExpandIcon,
+} from "@phosphor-icons/react";
+import { TagDto } from "types/Tag";
+
+export interface TagFilterProps {
+ data: Record[];
+ onTagFilterChange: (selectedTags: string[]) => void;
+ selectedTags: string[];
+}
+
+export const TagFilter: FunctionComponent = ({
+ data,
+ onTagFilterChange,
+ selectedTags,
+}) => {
+ const [anchorEl, setAnchorEl] = useState(null);
+ const [searchTerm, setSearchTerm] = useState("");
+ const [groupByKey, setGroupByKey] = useState(true);
+
+ const handleClick = (event: React.MouseEvent) => {
+ setAnchorEl(event.currentTarget);
+ };
+
+ const handleClose = () => {
+ setAnchorEl(null);
+ setSearchTerm("");
+ };
+
+ // Extract all unique tags from the data and group them
+ const { allTags, tagsByKey, tagKeys } = useMemo(() => {
+ const tagMap = new Map<
+ string,
+ { key: string; value: string; fullTag: string }
+ >();
+
+ data.forEach((row: Record) => {
+ if (row?.tags && Array.isArray(row?.tags)) {
+ row?.tags?.forEach((tag: TagDto) => {
+ if (tag && tag?.key && tag?.value) {
+ const fullTag = `${tag?.key}:${tag?.value}`;
+ tagMap.set(fullTag, { key: tag?.key, value: tag?.value, fullTag });
+ }
+ });
+ }
+ });
+
+ const allTags = Array.from(tagMap?.values())?.sort((a, b) =>
+ a?.fullTag?.localeCompare(b?.fullTag),
+ );
+
+ // Group by key
+ const tagsByKey = new Map();
+ allTags?.forEach((tag) => {
+ if (!tagsByKey?.has(tag?.key)) {
+ tagsByKey.set(tag?.key, []);
+ }
+ tagsByKey?.get(tag?.key)?.push(tag);
+ });
+
+ const tagKeys = Array.from(tagsByKey?.keys())?.sort();
+
+ return { allTags, tagsByKey, tagKeys };
+ }, [data]);
+
+ // Filter tags based on search term
+ const filteredTags = useMemo(() => {
+ if (!searchTerm) return allTags || [];
+
+ const lowerSearchTerm = searchTerm.toLowerCase();
+ return allTags?.filter(
+ (tag) =>
+ tag?.key?.toLowerCase()?.includes(lowerSearchTerm) ||
+ tag?.value?.toLowerCase()?.includes(lowerSearchTerm) ||
+ tag?.fullTag?.toLowerCase()?.includes(lowerSearchTerm),
+ );
+ }, [allTags, searchTerm]);
+
+ const handleTagToggle = (tag: string) => {
+ const newSelectedTags = selectedTags?.includes(tag)
+ ? selectedTags.filter((t) => t !== tag)
+ : [...selectedTags, tag];
+ onTagFilterChange(newSelectedTags);
+ };
+
+ const handleClearAll = () => {
+ onTagFilterChange([]);
+ };
+
+ const handleSelectAllInGroup = (key: string) => {
+ const groupTags = tagsByKey?.get(key) || [];
+ const groupTagStrings = groupTags?.map((tag) => tag?.fullTag);
+ const allGroupSelected = groupTagStrings.every((tag) =>
+ selectedTags.includes(tag),
+ );
+
+ if (allGroupSelected) {
+ // Deselect all in group
+ const newSelectedTags = selectedTags?.filter(
+ (tag) => !groupTagStrings.includes(tag),
+ );
+ onTagFilterChange(newSelectedTags);
+ } else {
+ // Select all in group
+ const newSelectedTags = [
+ ...new Set([...selectedTags, ...groupTagStrings]),
+ ];
+ onTagFilterChange(newSelectedTags);
+ }
+ };
+
+ const renderTagList = () => {
+ if (allTags?.length === 0) {
+ return (
+
+ No tags available
+
+ );
+ }
+
+ if (groupByKey && !searchTerm) {
+ // Grouped view
+ return (
+
+ {tagKeys.map((key) => {
+ const groupTags = tagsByKey?.get(key) || [];
+ const groupTagStrings = groupTags?.map((tag) => tag?.fullTag);
+ const selectedInGroup = groupTagStrings?.filter((tag) =>
+ selectedTags?.includes(tag),
+ );
+ const allGroupSelected =
+ groupTagStrings?.length === selectedInGroup?.length;
+ const someGroupSelected = selectedInGroup?.length > 0;
+
+ return (
+
+ }>
+ handleSelectAllInGroup(key)}
+ onClick={(e) => e.stopPropagation()}
+ size="small"
+ />
+ }
+ label={
+
+ {key} ({groupTags?.length})
+
+ }
+ onClick={(e) => e.stopPropagation()}
+ />
+
+
+
+ {groupTags?.map((tag) => (
+
+ handleTagToggle(tag?.fullTag)}
+ size="small"
+ />
+ }
+ label={
+
+ {tag?.value}
+
+ }
+ />
+
+ ))}
+
+
+
+ );
+ })}
+
+ );
+ } else {
+ // Flat list view (when searching or groupByKey is false)
+ return (
+
+ {filteredTags?.map((tag) => (
+
+ handleTagToggle(tag?.fullTag)}
+ size="small"
+ />
+ }
+ label={
+
+ {tag?.fullTag}
+
+ }
+ />
+
+ ))}
+ {filteredTags?.length === 0 && searchTerm && (
+
+
+ No tags found matching "{searchTerm}"
+
+
+ )}
+
+ );
+ }
+ };
+
+ return (
+ <>
+
+ }
+ onClick={handleClick}
+ color={selectedTags?.length > 0 ? "primary" : "inherit"}
+ sx={{
+ width: "fit-content",
+ textTransform: "none",
+ }}
+ >
+ Filter Tags
+ {selectedTags?.length > 0 && ` (${selectedTags?.length})`}
+
+
+
+
+ {/* Header */}
+
+
+ Filter by Tags
+
+ {selectedTags?.length > 0 && (
+
+ )}
+
+
+ {/* Search */}
+ setSearchTerm(e.target.value)}
+ InputProps={{
+ startAdornment: (
+
+
+
+ ),
+ }}
+ sx={{ mb: 2 }}
+ />
+
+ {/* Group by key toggle (only show when not searching) */}
+ {!searchTerm && allTags?.length > 10 && (
+ setGroupByKey(e.target.checked)}
+ size="small"
+ />
+ }
+ label="Group by key"
+ sx={{ mb: 1 }}
+ />
+ )}
+
+
+
+ {/* Tag list */}
+ {renderTagList()}
+
+ {/* Selected tags summary */}
+ {selectedTags?.length > 0 && (
+ <>
+
+
+
+ Selected ({selectedTags?.length}):
+
+
+ {selectedTags?.slice(0, 5)?.map((tag) => (
+ handleTagToggle(tag)}
+ color="primary"
+ variant="filled"
+ />
+ ))}
+ {selectedTags?.length > 5 && (
+
+ )}
+
+
+ >
+ )}
+
+
+ >
+ );
+};
diff --git a/ui-next/src/components/DataTable/helpers.test.ts b/ui-next/src/components/DataTable/helpers.test.ts
new file mode 100644
index 0000000000..43763da1d5
--- /dev/null
+++ b/ui-next/src/components/DataTable/helpers.test.ts
@@ -0,0 +1,180 @@
+import { dynamicSort } from "./helpers";
+
+const cases = [
+ {
+ name: "A greater than B",
+ objA: {
+ target: {
+ type: "INTEGRATION_PROVIDER",
+ id: "My Test integration",
+ },
+ access: ["UPDATE", "READ", "EXECUTE", "CREATE"],
+ tag: "test:test",
+ },
+ objB: {
+ target: {
+ type: "APPLICATION",
+ id: "app:8ee1b276-28a1-443c-b5a4-43892f87e222",
+ },
+ access: ["READ", "CREATE"],
+ tag: "auto:test",
+ },
+ propertyPath: "target.type",
+ expected: 1,
+ },
+ {
+ name: "A lesser than B",
+ objA: {
+ target: {
+ type: "INTEGRATION_PROVIDER",
+ id: "0_My Test integration",
+ },
+ access: ["UPDATE", "READ", "EXECUTE", "CREATE"],
+ tag: "test:test",
+ },
+ objB: {
+ target: {
+ type: "APPLICATION",
+ id: "app:8ee1b276-28a1-443c-b5a4-43892f87e222",
+ },
+ access: ["READ", "CREATE"],
+ tag: "auto:test",
+ },
+ propertyPath: "target.id",
+ expected: -1,
+ },
+ {
+ name: "A equal B",
+ objA: {
+ target: {
+ type: "INTEGRATION_PROVIDER",
+ id: "0_My Test integration",
+ number: 9,
+ },
+ access: ["UPDATE", "READ", "EXECUTE", "CREATE"],
+ tag: "test:test",
+ },
+ objB: {
+ target: {
+ type: "APPLICATION",
+ id: "app:8ee1b276-28a1-443c-b5a4-43892f87e222",
+ number: 9,
+ },
+ access: ["READ", "CREATE"],
+ tag: "auto:test",
+ },
+ propertyPath: "target.number",
+ expected: 0,
+ },
+ {
+ name: "A and B have undefined value",
+ objA: {
+ target: {
+ type: "INTEGRATION_PROVIDER",
+ id: "0_My Test integration",
+ number: 9,
+ },
+ access: ["UPDATE", "READ", "EXECUTE", "CREATE"],
+ tag: "test:test",
+ },
+ objB: {
+ target: {
+ type: "APPLICATION",
+ id: "app:8ee1b276-28a1-443c-b5a4-43892f87e222",
+ number: 9,
+ },
+ access: ["READ", "CREATE"],
+ tag: "auto:test",
+ },
+ propertyPath: "target.someProp.a.b.c",
+ expected: 0,
+ },
+ {
+ name: "A and B are arrays and have different length",
+ objA: {
+ target: {
+ type: "INTEGRATION_PROVIDER",
+ id: "0_My Test integration",
+ number: 9,
+ },
+ access: ["UPDATE", "READ", "EXECUTE", "CREATE"],
+ tag: "test:test",
+ },
+ objB: {
+ target: {
+ type: "APPLICATION",
+ id: "app:8ee1b276-28a1-443c-b5a4-43892f87e222",
+ number: 9,
+ },
+ access: ["READ", "CREATE"],
+ tag: "auto:test",
+ },
+ propertyPath: "access",
+ expected: 1,
+ },
+ {
+ name: "A and B are different objects",
+ objA: {
+ target: {
+ type: "INTEGRATION_PROVIDER",
+ id: "0_My Test integration",
+ number: 9,
+ },
+ access: ["UPDATE", "READ", "EXECUTE", "CREATE"],
+ tag: "test:test",
+ },
+ objB: {
+ target: {
+ type: "APPLICATION",
+ id: "app:8ee1b276-28a1-443c-b5a4-43892f87e222",
+ number: 9,
+ },
+ access: ["READ", "CREATE"],
+ tag: "auto:test",
+ },
+ propertyPath: "target",
+ expected: 1,
+ },
+ {
+ name: "A and B are equal objects",
+ objA: {
+ target: {
+ type: "INTEGRATION_PROVIDER",
+ id: "0_My Test integration",
+ number: 9,
+ },
+ access: ["UPDATE", "READ", "EXECUTE", "CREATE"],
+ tag: "test:test",
+ equal: {
+ a: 1,
+ b: 2,
+ },
+ },
+ objB: {
+ target: {
+ type: "APPLICATION",
+ id: "app:8ee1b276-28a1-443c-b5a4-43892f87e222",
+ number: 9,
+ },
+ access: ["READ", "CREATE"],
+ tag: "auto:test",
+ equal: {
+ a: 1,
+ b: 2,
+ },
+ },
+ propertyPath: "equal",
+ expected: 0,
+ },
+];
+
+describe("Compare 2 objects for sorting", () => {
+ test.each(cases)(
+ "testing '$name', returns $expected",
+ ({ objA, objB, propertyPath, expected }) => {
+ const result = dynamicSort({ objA, objB, propertyPath });
+
+ expect(result).toEqual(expected);
+ },
+ );
+});
diff --git a/ui-next/src/components/DataTable/helpers.ts b/ui-next/src/components/DataTable/helpers.ts
new file mode 100644
index 0000000000..9f5b185f40
--- /dev/null
+++ b/ui-next/src/components/DataTable/helpers.ts
@@ -0,0 +1,147 @@
+import fastDeepEqual from "fast-deep-equal";
+import _get from "lodash/get";
+import { TableColumn } from "react-data-table-component";
+import { timestampRenderer } from "utils/index";
+import { FilterObjectItem } from "./state/types";
+import {
+ ColumnCustomType,
+ Format,
+ LegacyColumn,
+ RenderableColumn,
+} from "./types";
+
+type ColumnWithLabel = TableColumn & { label?: string };
+
+export const getColumnLabelById = (
+ columnId: string,
+ columns: ColumnWithLabel[],
+) => {
+ const col = columns.find(
+ (c: ColumnWithLabel) => c.id === columnId || c.name === columnId,
+ );
+ return col?.label || col?.name;
+};
+export const getColumnLabel = (col: ColumnWithLabel) =>
+ (col?.label || col.name!) as string;
+
+export const getColumnId = (col: TableColumn): string => {
+ return col.id as string;
+};
+
+const compareString = (preString: string, curString: string) =>
+ preString.toLowerCase().localeCompare(curString.toLowerCase());
+
+export const defaultFilterItemsSorter = (filteredItems: any[]) =>
+ filteredItems?.sort((preValue, curValue) => {
+ if (preValue.updateTime) {
+ if (curValue.updateTime) {
+ return curValue.updateTime - preValue.updateTime;
+ }
+
+ if (curValue.createTime) {
+ return curValue.createTime - preValue.updateTime;
+ }
+ } else if (preValue.createTime) {
+ if (curValue.updateTime) {
+ return curValue.updateTime - preValue.createTime;
+ }
+
+ if (curValue.createTime) {
+ return curValue.createTime - preValue.createTime;
+ }
+ } else if (preValue.size && curValue.size) {
+ return curValue.size - preValue.size;
+ }
+ // Compare name
+ else if (preValue.name && curValue.name) {
+ return compareString(preValue.name, curValue.name);
+ }
+ // Compare id (for group)
+ else if (preValue.id && curValue.id) {
+ return compareString(preValue.id, curValue.id);
+ }
+
+ return 0;
+ });
+
+export const formatForColumn = (column: LegacyColumn): Format => {
+ if (column?.type === ColumnCustomType.DATE) {
+ return (row: any) => timestampRenderer(_get(row, column.name as string));
+ } else if (column?.type === ColumnCustomType.JSON) {
+ return (row: any) => JSON.stringify(_get(row, column.name as string));
+ }
+
+ if (column?.renderer) {
+ return (row: any) =>
+ column.renderer!(_get(row, column.name as string), row);
+ }
+ return (row: any) => _get(row, column.name as string);
+};
+
+export const createDefaultFilterObject = (
+ renderedColumns: RenderableColumn[],
+): FilterObjectItem | undefined => {
+ const maybeColumnName = renderedColumns.find(
+ (col: LegacyColumn) => col.searchable !== false,
+ )?.id;
+ if (maybeColumnName) {
+ return {
+ columnName: maybeColumnName,
+ substring: "",
+ };
+ }
+};
+
+export const getNestedValue = (obj: T, path: string): unknown => {
+ return path.split(".").reduce((acc: any, part) => acc && acc[part], obj);
+};
+
+export const dynamicSort = ({
+ objA,
+ objB,
+ propertyPath,
+}: {
+ objA: T;
+ objB: T;
+ propertyPath: string;
+}): number => {
+ const valueA = getNestedValue(objA, propertyPath);
+ const valueB = getNestedValue(objB, propertyPath);
+
+ if (
+ valueA === undefined ||
+ valueA === null ||
+ valueB === undefined ||
+ valueB === null
+ ) {
+ if (valueA === valueB) {
+ return 0;
+ }
+
+ return valueA === undefined || valueA === null ? 1 : -1;
+ }
+
+ if (typeof valueA === "string" && typeof valueB === "string") {
+ return valueA.toLowerCase().localeCompare(valueB.toLowerCase());
+ }
+
+ if (typeof valueA === "number" && typeof valueB === "number") {
+ return valueA - valueB;
+ }
+
+ if (typeof valueA === "boolean" && typeof valueB === "boolean") {
+ return valueA === valueB ? 0 : valueA ? -1 : 1;
+ }
+
+ if (Array.isArray(valueA) && Array.isArray(valueB)) {
+ return Math.sign(valueA.length - valueB.length);
+ }
+
+ if (typeof valueA === "object" && typeof valueB === "object") {
+ const result = fastDeepEqual(valueA, valueB);
+
+ return result ? 0 : 1;
+ }
+
+ return valueA.toString().localeCompare(valueB.toString());
+};
diff --git a/ui-next/src/components/DataTable/index.ts b/ui-next/src/components/DataTable/index.ts
new file mode 100644
index 0000000000..a74c24a803
--- /dev/null
+++ b/ui-next/src/components/DataTable/index.ts
@@ -0,0 +1,2 @@
+import DataTable from "./DataTable";
+export { DataTable };
diff --git a/ui-next/src/components/DataTable/state/actions.ts b/ui-next/src/components/DataTable/state/actions.ts
new file mode 100644
index 0000000000..94bdba54a9
--- /dev/null
+++ b/ui-next/src/components/DataTable/state/actions.ts
@@ -0,0 +1,32 @@
+import { assign } from "xstate";
+import {
+ DataTableMachineContext,
+ SetFilterObjectEvent,
+ SetSearchTermEvent,
+ SetTableDataOrderAndVisibility,
+} from "./types";
+// For now we are not managing state for data
+/* export const persistData = assign({ */
+/* data: (_context, { data }) => data, */
+/* }); */
+
+export const persistOrderAndVisibility = assign<
+ DataTableMachineContext,
+ SetTableDataOrderAndVisibility
+>({
+ columnOrderAndVisibility: (_context, { data }) => data,
+});
+
+export const persistSearchTerm = assign<
+ DataTableMachineContext,
+ SetSearchTermEvent
+>({
+ searchTerm: (context, { searchTerm }) => searchTerm,
+});
+
+export const persistFilterObj = assign<
+ DataTableMachineContext,
+ SetFilterObjectEvent
+>({
+ filterObj: (context, { filterObj }) => filterObj,
+});
diff --git a/ui-next/src/components/DataTable/state/guards.ts b/ui-next/src/components/DataTable/state/guards.ts
new file mode 100644
index 0000000000..8630c977fb
--- /dev/null
+++ b/ui-next/src/components/DataTable/state/guards.ts
@@ -0,0 +1,16 @@
+import { DoneInvokeEvent } from "xstate";
+import { DataTableMachineContext, SerializableColumn } from "./types";
+import { getColumnId } from "../helpers";
+
+import _isNil from "lodash/isNil";
+
+export const noLocalStorageKey = (context: DataTableMachineContext) =>
+ _isNil(context.localStorageKey);
+
+export const isLocalStorageContentTrusted = (
+ { columnOrderAndVisibility }: DataTableMachineContext,
+ { data }: DoneInvokeEvent,
+) => {
+ const existingColumns: string[] = columnOrderAndVisibility.map(getColumnId);
+ return data.every((a) => !_isNil(a) && existingColumns.includes(a?.id));
+};
diff --git a/ui-next/src/components/DataTable/state/index.ts b/ui-next/src/components/DataTable/state/index.ts
new file mode 100644
index 0000000000..79fd82215f
--- /dev/null
+++ b/ui-next/src/components/DataTable/state/index.ts
@@ -0,0 +1,2 @@
+export * from "./machine";
+export * from "./types";
diff --git a/ui-next/src/components/DataTable/state/machine.ts b/ui-next/src/components/DataTable/state/machine.ts
new file mode 100644
index 0000000000..ffb8ba6893
--- /dev/null
+++ b/ui-next/src/components/DataTable/state/machine.ts
@@ -0,0 +1,95 @@
+import { createMachine } from "xstate";
+import * as actions from "./actions";
+import * as services from "./services";
+import * as guards from "./guards";
+import {
+ DataTableMachineContext,
+ DataTableEventTypes,
+ DataTableEvents,
+} from "./types";
+
+export const dataTableMachine = createMachine<
+ DataTableMachineContext,
+ DataTableEvents
+>(
+ {
+ id: "dataTableMachine",
+ predictableActionArguments: true,
+ initial: "init",
+ context: {
+ columnOrderAndVisibility: [],
+ localStorageKey: undefined,
+ searchTerm: "",
+ },
+ on: {
+ // [DataTableEventTypes.SET_DATA]: {
+ // actions: ["persistData"],
+ // },
+ [DataTableEventTypes.SET_SEARCH_TERM]: {
+ actions: ["persistSearchTerm"],
+ },
+ [DataTableEventTypes.SET_FILTER_OBJ]: {
+ actions: ["persistFilterObj"],
+ },
+ },
+ states: {
+ init: {
+ always: [
+ {
+ cond: "noLocalStorageKey",
+ target: "renderedTable",
+ },
+ { target: "takeLocalStorageConfigurations" },
+ ],
+ },
+ renderedTable: {
+ on: {
+ [DataTableEventTypes.SET_ORDER_AND_VISIBILITY]: {
+ actions: ["persistOrderAndVisibility"],
+ },
+ },
+ },
+ renderedTableStorageSupport: {
+ on: {
+ [DataTableEventTypes.SET_ORDER_AND_VISIBILITY]: {
+ actions: ["persistOrderAndVisibility"],
+ target: "persisOrderToLocalStorage",
+ },
+ },
+ },
+ useLocalStorageOrderAndVisibility: {
+ entry: "persistOrderAndVisibility",
+ always: "renderedTableStorageSupport",
+ },
+ persisOrderToLocalStorage: {
+ invoke: {
+ src: "saveOrderAndVisibility",
+ id: "localStoragePersistOrderAndVisibility",
+ onDone: {
+ target: "renderedTableStorageSupport",
+ },
+ },
+ },
+ takeLocalStorageConfigurations: {
+ invoke: {
+ src: "maybePullOrderAndVisibility",
+ id: "localStoragePull",
+ onDone: [
+ {
+ cond: "isLocalStorageContentTrusted",
+ target: "useLocalStorageOrderAndVisibility",
+ },
+ {
+ target: "renderedTableStorageSupport",
+ },
+ ],
+ },
+ },
+ },
+ },
+ {
+ actions: actions as any,
+ services,
+ guards: guards as any,
+ },
+);
diff --git a/ui-next/src/components/DataTable/state/services.ts b/ui-next/src/components/DataTable/state/services.ts
new file mode 100644
index 0000000000..973e5974c2
--- /dev/null
+++ b/ui-next/src/components/DataTable/state/services.ts
@@ -0,0 +1,39 @@
+import { tryToJson } from "utils/utils";
+import { DataTableMachineContext } from "./types";
+import { logger } from "utils/logger";
+
+export const saveOrderAndVisibility = async (
+ context: DataTableMachineContext,
+) => {
+ const { localStorageKey, columnOrderAndVisibility } = context;
+ if (localStorageKey) {
+ window.localStorage.setItem(
+ localStorageKey,
+ JSON.stringify(columnOrderAndVisibility),
+ );
+
+ return columnOrderAndVisibility;
+ }
+ throw Error("No local storage key has been set");
+};
+
+export const maybePullOrderAndVisibility = async (
+ context: DataTableMachineContext,
+) => {
+ const { localStorageKey, columnOrderAndVisibility } = context;
+ if (localStorageKey) {
+ const savedOrder = window.localStorage.getItem(localStorageKey);
+ if (savedOrder) {
+ const parsedSavedOrder = tryToJson(savedOrder);
+ if (parsedSavedOrder !== undefined) {
+ return parsedSavedOrder;
+ } else {
+ window.localStorage.removeItem(localStorageKey);
+ logger.log(
+ "Couldn't parse savedOrder hence removing it from localStorage and returning columnOrderAndVisibility.",
+ );
+ }
+ }
+ }
+ return columnOrderAndVisibility;
+};
diff --git a/ui-next/src/components/DataTable/state/types.ts b/ui-next/src/components/DataTable/state/types.ts
new file mode 100644
index 0000000000..07545314c2
--- /dev/null
+++ b/ui-next/src/components/DataTable/state/types.ts
@@ -0,0 +1,56 @@
+import { ColumnCustomType } from "components/DataTable/types";
+import type { ReactNode } from "react";
+export interface SerializableColumn {
+ omit: boolean;
+ name: string | ReactNode;
+ id: string; // We should enforce the use of id,
+ wrap?: boolean;
+ label: string;
+ sortable?: boolean;
+ type?: ColumnCustomType;
+ searchable?: string | boolean;
+ tooltip?: string;
+}
+
+export interface FilterObjectItem {
+ columnName: string;
+ substring: string;
+}
+
+export interface DataTableMachineContext {
+ columnOrderAndVisibility: SerializableColumn[];
+ localStorageKey?: string;
+ searchTerm: string;
+ filterObj?: FilterObjectItem;
+}
+
+export enum DataTableEventTypes {
+ SET_DATA = "SET_DATA",
+ SET_ORDER_AND_VISIBILITY = "SET_ORDER_AND_VISIBILITY",
+ SET_FILTER_OBJ = "SET_FILTER_OBJ",
+ SET_SEARCH_TERM = "SET_SEARCH_TERM",
+}
+
+export type SetTableDataEvent = {
+ type: DataTableEventTypes.SET_DATA;
+ data: any[];
+};
+
+export type SetTableDataOrderAndVisibility = {
+ type: DataTableEventTypes.SET_ORDER_AND_VISIBILITY;
+ data: SerializableColumn[];
+};
+
+export type SetSearchTermEvent = {
+ type: DataTableEventTypes.SET_SEARCH_TERM;
+ searchTerm: string;
+};
+
+export type SetFilterObjectEvent = {
+ type: DataTableEventTypes.SET_FILTER_OBJ;
+ filterObj: FilterObjectItem;
+};
+
+export type DataTableEvents =
+ /* | SetTableDataEvent */
+ SetTableDataOrderAndVisibility | SetFilterObjectEvent | SetSearchTermEvent;
diff --git a/ui-next/src/components/DataTable/styles.ts b/ui-next/src/components/DataTable/styles.ts
new file mode 100644
index 0000000000..fcef06f9dd
--- /dev/null
+++ b/ui-next/src/components/DataTable/styles.ts
@@ -0,0 +1,115 @@
+import { createTheme } from "react-data-table-component";
+
+createTheme("default", {
+ background: {
+ default: "transparent",
+ text: {
+ primary: "#777777",
+ // secondary: "blue",
+ },
+ highlightOnHover: {
+ text: "#000000",
+ default: "rgba(128, 128, 128, .3)",
+ },
+ },
+});
+
+// createTheme creates a new theme named solarized that overrides the build in dark theme
+createTheme("dark", {
+ header: {
+ style: {
+ color: "#aaaaaa",
+ fontSize: "14px",
+ },
+ },
+ headRow: {
+ style: {
+ backgroundColor: "rgba(0,0,0,.03)",
+ width: "100%",
+ },
+ },
+ text: {
+ primary: "#FFFFFF",
+ secondary: "rgba(255, 255, 255, 0.7)",
+ disabled: "rgba(0,0,0,.12)",
+ },
+ background: {
+ default: "#111111",
+ },
+ context: {
+ background: "var(--primaryDarker)",
+ text: "#FFFFFF",
+ },
+ divider: {
+ default: "rgba(81, 81, 81, .5)",
+ },
+ button: {
+ default: "#FFFFFF",
+ focus: "rgba(255, 255, 255, .54)",
+ hover: "rgba(255, 255, 255, .12)",
+ disabled: "rgba(255, 255, 255, .18)",
+ },
+ selected: {
+ default: "rgba(0, 0, 0, .7)",
+ text: "#FFFFFF",
+ },
+ highlightOnHover: {
+ default: "rgba(128, 128, 128, .2)",
+ text: "#FFFFFF",
+ },
+ striped: {
+ default: "rgba(0, 0, 0, .87)",
+ text: "#FFFFFF",
+ },
+});
+
+export const dataTableStyles = {
+ // Top title (e.g. "Page 1 of Many")
+ header: {
+ style: {
+ color: "#111111",
+ fontSize: "14px",
+ flex: 0,
+ },
+ },
+ headRow: {
+ style: {
+ backgroundColor: "rgba(0,0,0,.03)",
+ width: "100%",
+ },
+ },
+ subHeader: {
+ style: {
+ backgroundColor: "blue",
+ color: "red",
+ },
+ },
+ headCells: {
+ style: {
+ display: "flex",
+ justifyContent: "start",
+ alignItems: "center",
+ textTransform: "uppercase",
+ fontSize: "11px",
+ fontWeight: 600,
+ padding: "5px 16px",
+ },
+ },
+ cells: {
+ style: {
+ padding: "10px 16px",
+ alignItems: "center",
+ fontWeight: 300,
+ },
+ },
+ contextMenu: {
+ style: {
+ borderRadius: "8px 8px 0 0",
+ },
+ },
+ pagination: {
+ style: {
+ flex: 0,
+ },
+ },
+};
diff --git a/ui-next/src/components/DataTable/types.ts b/ui-next/src/components/DataTable/types.ts
new file mode 100644
index 0000000000..ae84eb2838
--- /dev/null
+++ b/ui-next/src/components/DataTable/types.ts
@@ -0,0 +1,30 @@
+import { ReactNode } from "react";
+import type { Selector, TableColumn } from "react-data-table-component";
+
+export type Format = (row: T, rowIndex: number) => ReactNode;
+
+export type PaginationChangePage = (page: number, totalRows: number) => void;
+
+export enum ColumnCustomType {
+ DATE = "date",
+ JSON = "json",
+}
+
+export interface LegacyColumn extends TableColumn {
+ id: string;
+ name: string | ReactNode;
+ label: string;
+ type?: ColumnCustomType;
+ sortable?: boolean;
+ wrap?: boolean;
+ searchable?: string | boolean;
+ renderer?: (value: any, row: any) => ReactNode;
+ searchableFunc?: (row: any) => string;
+ tooltip?: string;
+}
+
+export interface RenderableColumn extends LegacyColumn {
+ format: Format;
+ selector: Selector;
+ omit: boolean;
+}
diff --git a/ui-next/src/components/DateRangePicker.tsx b/ui-next/src/components/DateRangePicker.tsx
new file mode 100644
index 0000000000..10860e5694
--- /dev/null
+++ b/ui-next/src/components/DateRangePicker.tsx
@@ -0,0 +1,85 @@
+import { Box, Grid } from "@mui/material";
+import { DateTimePicker } from "@mui/x-date-pickers/DateTimePicker";
+import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
+import { dateRangePickerStyle } from "shared/styles";
+import { convertToDateObject, DateAdapter, formatDate } from "utils/date";
+
+interface DateRangePickerProps {
+ onFromChange: (val: any) => void;
+ onToChange: (val: any) => void;
+ from: Date | string;
+ to: Date | string;
+ label: string;
+ labelFrom?: string;
+ labelTo?: string;
+ disabled: boolean;
+}
+
+export default function DateRangePicker({
+ onFromChange,
+ from,
+ onToChange,
+ to,
+ label,
+ labelFrom,
+ labelTo,
+ disabled,
+}: DateRangePickerProps) {
+ const actualLabelFrom =
+ labelFrom == null ? label && `${label} - from` : labelFrom;
+ const actualLabelTo = labelTo == null ? label && `${label} - to` : labelTo;
+
+ return (
+
+
+
+
+ {
+ onFromChange(formatDate(value, "yyyy-MM-dd'T'HH:mm:ss"));
+ }}
+ sx={dateRangePickerStyle.input}
+ slotProps={{
+ actionBar: {
+ actions: ["clear", "accept"],
+ },
+ }}
+ />
+
+
+ {
+ onToChange(formatDate(value, "yyyy-MM-dd'T'HH:mm:ss"));
+ }}
+ sx={dateRangePickerStyle.input}
+ slotProps={{
+ actionBar: {
+ actions: ["clear", "accept"],
+ },
+ }}
+ />
+
+
+
+
+ );
+}
diff --git a/ui-next/src/components/DiffEditor/DiffEditor.tsx b/ui-next/src/components/DiffEditor/DiffEditor.tsx
new file mode 100644
index 0000000000..1a3129659b
--- /dev/null
+++ b/ui-next/src/components/DiffEditor/DiffEditor.tsx
@@ -0,0 +1,18 @@
+import { DiffEditor as MonacoDiffEditor } from "@monaco-editor/react";
+import { type DiffEditorOptions } from "shared/editor";
+import "./diff-editor.css";
+
+const defaultOptions: DiffEditorOptions = {
+ useInlineViewWhenSpaceIsLimited: false,
+ renderGutterMenu: false,
+ scrollbar: {
+ vertical: "visible",
+ horizontal: "hidden",
+ },
+};
+
+export const DiffEditor = ({ options = {}, ...rest }) => {
+ return (
+
+ );
+};
diff --git a/ui-next/src/components/DiffEditor/diff-editor.css b/ui-next/src/components/DiffEditor/diff-editor.css
new file mode 100644
index 0000000000..27bf5bc7b7
--- /dev/null
+++ b/ui-next/src/components/DiffEditor/diff-editor.css
@@ -0,0 +1,3 @@
+.monaco-diff-editor .diffOverview .diffViewport {
+ background: rgba(100, 100, 100, 0.03);
+}
diff --git a/ui-next/src/components/DocLink.tsx b/ui-next/src/components/DocLink.tsx
new file mode 100644
index 0000000000..a9950cedf7
--- /dev/null
+++ b/ui-next/src/components/DocLink.tsx
@@ -0,0 +1,39 @@
+import React from "react";
+import MuiTypography from "./MuiTypography";
+import { colors } from "theme/tokens/variables";
+import { openInNewTab } from "utils/helpers";
+import DocsIcon from "./v1/icons/DocsIcon";
+
+interface DocLinkProps {
+ url: string;
+ label: string;
+ position?: "relative" | "absolute";
+ right?: string;
+ top?: string;
+}
+
+export const DocLink = ({
+ url,
+ label,
+ position = "absolute",
+ right = "20px",
+ top = "5px",
+}: DocLinkProps) => {
+ return (
+ openInNewTab(url)}
+ >
+ {label}
+
+ );
+};
diff --git a/ui-next/src/components/Dropdown.tsx b/ui-next/src/components/Dropdown.tsx
new file mode 100644
index 0000000000..9a35e013a4
--- /dev/null
+++ b/ui-next/src/components/Dropdown.tsx
@@ -0,0 +1,145 @@
+import CancelOutlinedIcon from "@mui/icons-material/CancelOutlined";
+import {
+ Autocomplete,
+ AutocompleteProps,
+ CSSObject,
+ Chip,
+ FormControl,
+ TextFieldPropsSizeOverrides,
+ Theme,
+} from "@mui/material";
+import { OverridableStringUnion } from "@mui/types";
+import { ForwardedRef, ReactNode, forwardRef, useEffect, useRef } from "react";
+import { colors } from "theme/tokens/variables";
+import Input, { CustomInputProps } from "./Input";
+
+const autocompleteStyle = {
+ ".MuiAutocomplete-popupIndicator": {
+ color: (theme: Theme) =>
+ theme.palette.mode === "dark" ? colors.white : colors.black,
+ },
+};
+
+// Define the option types more clearly
+type DropdownOption = string | number | { label: string };
+
+// Simplified approach that works better with MUI's complex generics
+type DropdownProps = Omit<
+ AutocompleteProps<
+ DropdownOption,
+ boolean | undefined,
+ boolean | undefined,
+ boolean | undefined
+ >,
+ "renderInput" | "onInputChange" | "options"
+> & {
+ onInputChange?: (value: string) => void;
+ label?: ReactNode;
+ style?: CSSObject;
+ error?: boolean;
+ size?: OverridableStringUnion<
+ "small" | "medium",
+ TextFieldPropsSizeOverrides
+ >;
+ helperText?: ReactNode;
+ inputProps?: CustomInputProps;
+ required?: boolean;
+ options?: readonly DropdownOption[];
+};
+
+const Dropdown = forwardRef(
+ (
+ {
+ label,
+ className,
+ style,
+ error,
+ size,
+ helperText,
+ inputProps,
+ required,
+ autoFocus,
+ onInputChange,
+ options,
+ ...props
+ }: DropdownProps,
+ ref: ForwardedRef,
+ ) => {
+ const inputRef = useRef(null);
+
+ useEffect(() => {
+ if (autoFocus && inputRef.current?.focus) {
+ inputRef.current.focus();
+ }
+ }, [autoFocus]);
+
+ const handleInputChange = (typingValue: string) => {
+ if (onInputChange) {
+ onInputChange(typingValue);
+ }
+ };
+
+ const isRequired =
+ required &&
+ (!props?.multiple ||
+ (Array.isArray(props?.value) && props?.value?.length === 0));
+
+ const { InputProps: inputPropsInputProps, ...restInputProps } =
+ inputProps || { InputProps: {} };
+
+ return (
+
+ (
+
+ )}
+ renderTags={(value, getTagProps) =>
+ (value as DropdownOption[]).map((v, index) => {
+ const renderableLabel: string =
+ typeof v === "string" || typeof v === "number"
+ ? String(v)
+ : v.label;
+ const { key, ...otherTagProps } = getTagProps({ index });
+ return (
+ }
+ />
+ );
+ })
+ }
+ options={options || []}
+ {...props}
+ />
+
+ );
+ },
+);
+
+export default Dropdown;
diff --git a/ui-next/src/components/DropdownButton.tsx b/ui-next/src/components/DropdownButton.tsx
new file mode 100644
index 0000000000..e58a9af8c1
--- /dev/null
+++ b/ui-next/src/components/DropdownButton.tsx
@@ -0,0 +1,123 @@
+import { Fragment, MouseEvent, ReactNode, useRef, useState } from "react";
+import { CaretDown } from "@phosphor-icons/react";
+import ClickAwayListener from "@mui/material/ClickAwayListener";
+import Grow from "@mui/material/Grow";
+import Popper from "@mui/material/Popper";
+import MenuItem from "@mui/material/MenuItem";
+import MenuList from "@mui/material/MenuList";
+import Paper from "./Paper"; // TODO check where this is used seems like specific
+import Button, { MuiButtonProps } from "components/MuiButton";
+import Divider from "@mui/material/Divider";
+
+export type DropdownButtonProps = {
+ buttonProps?: MuiButtonProps;
+ children?: ReactNode;
+ options: any[];
+ isOpen?: boolean;
+ onClick?: (e: MouseEvent, open: boolean) => void;
+ onClickAway?: (e: any) => void;
+};
+
+export default function DropdownButton({
+ children,
+ options,
+ buttonProps,
+ isOpen,
+ onClick,
+ onClickAway,
+}: DropdownButtonProps) {
+ const [open, setOpen] = useState(false);
+ const isOpenMenu = typeof isOpen === "boolean" ? isOpen : open;
+ const anchorRef = useRef(null);
+
+ const handleToggle = (e: MouseEvent) => {
+ setOpen((prevOpen) => !prevOpen);
+
+ if (onClick) {
+ onClick(e, !isOpenMenu);
+ }
+ };
+
+ const handleClose = (event: any) => {
+ if (anchorRef.current && anchorRef.current.contains(event.target)) {
+ return;
+ }
+
+ setOpen(false);
+
+ if (onClickAway) {
+ onClickAway(event);
+ }
+ };
+
+ return (
+
+
+
+
+ {({ TransitionProps, placement }) => (
+
+
+
+ )}
+
+
+ );
+}
diff --git a/ui-next/src/components/EditInPlace.tsx b/ui-next/src/components/EditInPlace.tsx
new file mode 100644
index 0000000000..57fd079634
--- /dev/null
+++ b/ui-next/src/components/EditInPlace.tsx
@@ -0,0 +1,78 @@
+import { FunctionComponent } from "react";
+import { Box, BoxProps } from "@mui/material";
+import { PencilSimple } from "@phosphor-icons/react";
+
+export interface EditInPlaceProps extends BoxProps {
+ text: string;
+ type: string;
+ placeholder: string;
+ childRef: any;
+ disabled?: boolean;
+ isEditing: boolean;
+ setEditing: (editing: boolean) => void;
+ toggleMetaBarEditMode?: (isMetaBarEditing: boolean) => void;
+}
+
+const EditInPlace: FunctionComponent = ({
+ text,
+ type,
+ placeholder,
+ children,
+ childRef: _childRef,
+ disabled,
+ toggleMetaBarEditMode: _toggleMetaBarEditMode,
+ isEditing,
+ setEditing,
+ ...props
+}) => {
+ const toggleEditMode = (isOpen: boolean) => {
+ setEditing(isOpen);
+ };
+
+ const handleKeyDown = (event: any, type: any) => {
+ const { key } = event;
+ const keys = ["Escape", "Tab"];
+ const enterKey = "Enter";
+ const allKeys = [...keys, enterKey];
+ if (
+ (type === "textarea" && keys.indexOf(key) > -1) ||
+ (type !== "textarea" && allKeys.indexOf(key) > -1)
+ ) {
+ toggleEditMode(false);
+ }
+ };
+
+ return (
+
+ {isEditing ? (
+ {
+ toggleEditMode(false);
+ }}
+ onKeyDown={(e) => handleKeyDown(e, type)}
+ {...props}
+ >
+ {children}
+
+ ) : (
+ {
+ return disabled ? null : toggleEditMode(true);
+ }}
+ >
+
+ {text || placeholder || "Click here to edit..."}
+ {!disabled && (
+
+ )}
+
+
+ )}
+
+ );
+};
+
+export default EditInPlace;
diff --git a/ui-next/src/components/EmptyPageIntro.tsx b/ui-next/src/components/EmptyPageIntro.tsx
new file mode 100644
index 0000000000..378359eef5
--- /dev/null
+++ b/ui-next/src/components/EmptyPageIntro.tsx
@@ -0,0 +1,218 @@
+import { Box, Button, Link, colors, Stack } from "@mui/material";
+import React from "react";
+import ReactMarkdown from "react-markdown";
+import remarkGfm from "remark-gfm";
+import ReactPlayer from "react-player";
+import TagChip from "./TagChip";
+import { logrocketTrackIfEnabled } from "utils/logrocket";
+
+export interface EmptyPageIntroProps {
+ id?: string;
+ image?: string;
+ videoUrl?: string;
+ title: React.ReactNode;
+ message: string;
+ variant?: "featureDisabled" | "default";
+ primaryAction?: {
+ text: string;
+ onClick: () => void;
+ disabled?: boolean;
+ startIcon?: React.ReactNode;
+ };
+ secondaryAction?: {
+ text: string;
+ onClick: () => void;
+ disabled?: boolean;
+ startIcon?: React.ReactNode;
+ };
+ footer?: string;
+}
+
+const EmptyPageIntro = ({
+ id,
+ image,
+ videoUrl,
+ title,
+ message,
+ primaryAction,
+ secondaryAction,
+ footer,
+ variant = "default",
+}: EmptyPageIntroProps) => {
+ let visualHeaderType = null;
+
+ // Video takes precedence
+ if (videoUrl) {
+ visualHeaderType = "video";
+ } else if (image) {
+ visualHeaderType = "image";
+ } else {
+ visualHeaderType = null;
+ }
+
+ return (
+
+
+ {variant === "featureDisabled" ? (
+
+ ) : null}
+
+ {visualHeaderType === "video" ? (
+
+
+
+ ) : null}
+
+ {visualHeaderType === "image" ? (
+
+ ) : null}
+
+
+ {title}
+
+
+
+ (
+
+ ),
+ li: ({ children }) => (
+ {children}
+ ),
+ a: ({ children, href }) => (
+ {
+ logrocketTrackIfEnabled("blank_slate_docs_link_clicked", {
+ link: href,
+ });
+
+ return true;
+ }}
+ target="_blank"
+ rel="noopener noreferrer"
+ style={{ color: colors.blue[700], textDecoration: "none" }}
+ >
+ {children}
+
+ ),
+ }}
+ >
+ {message}
+
+
+
+ {(primaryAction || secondaryAction) && (
+
+ {primaryAction && (
+
+ )}
+ {secondaryAction && (
+
+ )}
+
+ )}
+
+ {footer && (
+
+ {footer}
+
+ )}
+
+
+ );
+};
+
+export default EmptyPageIntro;
diff --git a/ui-next/src/components/ErrorBoundary.tsx b/ui-next/src/components/ErrorBoundary.tsx
new file mode 100644
index 0000000000..850f296ce3
--- /dev/null
+++ b/ui-next/src/components/ErrorBoundary.tsx
@@ -0,0 +1,77 @@
+import { Component, ErrorInfo, ReactNode } from "react";
+import { Box } from "@mui/material";
+// import { reportErrorToHeap, isHeapEnabled } from "utils";
+
+import { reportErrorToLogRocket, isLogRocketEnabled } from "utils";
+interface Props {
+ children?: ReactNode;
+ location?: any;
+}
+
+interface State {
+ hasError: boolean;
+}
+
+class ErrorBoundary extends Component {
+ public state: State = {
+ hasError: false,
+ };
+
+ public static getDerivedStateFromError(_: Error): State {
+ // Update state so the next render will show the fallback UI.
+ return { hasError: true };
+ }
+
+ public componentDidCatch(error: Error, errorInfo: ErrorInfo) {
+ console.error("Uncaught error:", error, errorInfo);
+
+ // if (isHeapEnabled()) {
+ // reportErrorToHeap(error);
+ // }
+ if (isLogRocketEnabled()) {
+ reportErrorToLogRocket(error);
+ }
+ }
+
+ componentDidUpdate(prevProps: Props) {
+ if (prevProps?.location?.pathname !== this.props.location?.pathname) {
+ this.setState({ hasError: false });
+ }
+ }
+
+ public render() {
+ if (this.state.hasError) {
+ return (
+
+
+ There was an error performing this action. Please try again.
+
+
+ Contact support if the error persists.
+
+
+ );
+ }
+
+ return this.props.children;
+ }
+}
+
+export default ErrorBoundary;
diff --git a/ui-next/src/components/FeatureDisabledComponent.tsx b/ui-next/src/components/FeatureDisabledComponent.tsx
new file mode 100644
index 0000000000..8e39abb079
--- /dev/null
+++ b/ui-next/src/components/FeatureDisabledComponent.tsx
@@ -0,0 +1,32 @@
+import React from "react";
+import EmptyPageIntro from "./EmptyPageIntro";
+import { openInNewTab } from "utils/helpers";
+import UnlockIcon from "./v1/icons/UnlockIcon";
+
+const TALK_TO_AN_EXPERT_URL = "https://orkes.io/talk-to-an-expert";
+
+const FeatureDisabledComponent = ({
+ image,
+ title,
+ message,
+}: {
+ image?: string;
+ title?: string;
+ message?: string;
+}) => {
+ return (
+ openInNewTab(TALK_TO_AN_EXPERT_URL),
+ startIcon: ,
+ }}
+ />
+ );
+};
+
+export default FeatureDisabledComponent;
diff --git a/ui-next/src/components/FeatureDisabledWrapper.tsx b/ui-next/src/components/FeatureDisabledWrapper.tsx
new file mode 100644
index 0000000000..300d83dcb4
--- /dev/null
+++ b/ui-next/src/components/FeatureDisabledWrapper.tsx
@@ -0,0 +1,69 @@
+import { Box } from "@mui/material";
+import { ReactNode } from "react";
+import { useLocation } from "react-router";
+import FeatureDisabledComponent from "./FeatureDisabledComponent";
+import { checkPathFlag } from "utils/checkPathFlag";
+import { colors } from "theme/tokens/variables";
+
+const textStyle = {
+ fontSize: "14px",
+ fontWeight: 700,
+ color: colors.sidebarBlacky,
+ a: {
+ color: colors.primary,
+ textDecoration: "none",
+ },
+};
+
+const featureDisabled = (path: string) => {
+ const flagValue = checkPathFlag(path);
+ return flagValue ? false : true;
+};
+
+export function FeatureDisabledWrapper({
+ featureDisabledCustomComponent,
+ children,
+}: {
+ children: ReactNode;
+ featureDisabledCustomComponent?: ReactNode;
+}) {
+ const { pathname } = useLocation();
+
+ return (
+
+ {featureDisabled(pathname) ? (
+ featureDisabledCustomComponent ? (
+ featureDisabledCustomComponent
+ ) : (
+
+ )
+ ) : (
+ {children}
+ )}
+
+ );
+}
+
+export function FeatureDisabledHeader() {
+ return (
+
+ {"Your trial has ended. Please "}
+
+ contact us
+
+ {" or "}
+
+ upgrade your cluster
+
+ .
+
+ );
+}
diff --git a/ui-next/src/components/FloatingMuiAlert.tsx b/ui-next/src/components/FloatingMuiAlert.tsx
new file mode 100644
index 0000000000..2cfe8924d5
--- /dev/null
+++ b/ui-next/src/components/FloatingMuiAlert.tsx
@@ -0,0 +1,49 @@
+import React from "react";
+import { Alert, AlertTitle, styled } from "@mui/material";
+
+const StyledAlert = styled(Alert)(() => ({
+ backgroundColor: "#E8F5E9",
+ color: "#1B5E20",
+ "& .MuiAlert-icon": {
+ color: "#1B5E20",
+ },
+ border: "1px solid #A5D6A7",
+ borderRadius: "4px",
+ padding: "6px 16px",
+ "& .MuiAlert-message": {
+ padding: "8px 0",
+ fontSize: "14px",
+ color: "rgba(37, 37, 37, 1)",
+ },
+ boxShadow: "4px 4px 10px 0px rgba(89, 89, 89, 0.41)",
+ position: "fixed",
+ top: "16px",
+ right: "16px",
+ zIndex: 1400,
+ "& .MuiAlertTitle-root": {
+ color: "black",
+ fontWeight: 600,
+ marginBottom: "2px",
+ },
+}));
+
+interface FloatingMuiAlertProps {
+ title?: string;
+ message?: string;
+ onClose?: () => void;
+}
+
+const FloatingMuiAlert: React.FC = ({
+ title = "Congratulations! You've created a workflow!",
+ message = "Edit whatever you want, or not, and take it for a Run!",
+ onClose,
+}) => {
+ return (
+
+ {title}
+ {message}
+
+ );
+};
+
+export default FloatingMuiAlert;
diff --git a/ui-next/src/components/GetStartedSample/GetStartedSample.tsx b/ui-next/src/components/GetStartedSample/GetStartedSample.tsx
new file mode 100644
index 0000000000..1d16cc6e06
--- /dev/null
+++ b/ui-next/src/components/GetStartedSample/GetStartedSample.tsx
@@ -0,0 +1,158 @@
+import { useState } from "react";
+import { Button, Grid, Stack } from "@mui/material";
+import DownloadIcon from "@mui/icons-material/Download";
+import { Input, Tab, Tabs } from "components";
+import {
+ CodeLanguage,
+ JavaLanguageSet,
+ OperatingSystemEnvironment,
+} from "./types";
+import { useConductorProjectBuilder } from "utils/hooks/useConductorProjectBuilder";
+import { CodeSnippet } from "./components/CodeSnippet";
+
+export const DEFAULT_TASK_NAME = "my_first_simple_task";
+
+export const GetStartedSample = ({
+ serverUrl = "your-server-url-goes-here",
+ onTaskNameUpdated,
+}: {
+ apiKey?: string;
+ apiSecret?: string;
+ serverUrl?: string;
+ environment: OperatingSystemEnvironment;
+ onTaskNameUpdated?: (taskName: string) => void;
+}) => {
+ const [selectedLanguage, setSelectedLanguage] = useState(
+ CodeLanguage.JAVA,
+ );
+
+ const [selectedJavaLanguageSet, setSelectedJavaLanguageSet] =
+ useState(JavaLanguageSet.GRADLE);
+ const [taskName, setTaskName] = useState(DEFAULT_TASK_NAME);
+ const [projectName, setProjectName] = useState(
+ "ConductorSampleProject",
+ );
+ const [packageName, setPackageName] = useState("org.example");
+ const [namespace, setNamespace] = useState("");
+
+ const { displayCode, onDownload } = useConductorProjectBuilder({
+ serverUrl,
+ taskName: taskName || DEFAULT_TASK_NAME,
+ language: selectedLanguage,
+ languageSet: selectedJavaLanguageSet,
+ namespace,
+ packageName,
+ projectName,
+ useEnvVars: true,
+ });
+
+ return (
+ <>
+ setSelectedLanguage(val)}
+ >
+ {Object.values(CodeLanguage)
+ .filter(
+ (item) =>
+ item !== CodeLanguage.CLOJURE && item !== CodeLanguage.GROOVY,
+ )
+ .map((item) => (
+
+ ))}
+
+ {selectedLanguage === CodeLanguage.JAVA && (
+ setSelectedJavaLanguageSet(val)}
+ >
+ {Object.values(JavaLanguageSet).map((item) => (
+
+ ))}
+
+ )}
+
+
+
+
+
+ {
+ setTaskName(value);
+ onTaskNameUpdated?.(value);
+ }}
+ />
+
+
+ {selectedLanguage === CodeLanguage.JAVA && (
+
+ {
+ setProjectName(value);
+ }}
+ />
+
+ )}
+
+ {[CodeLanguage.JAVA, CodeLanguage.GROOVY].includes(
+ selectedLanguage,
+ ) && (
+
+ {
+ setPackageName(value);
+ }}
+ />
+
+ )}
+
+ {[CodeLanguage.CSHARP].includes(selectedLanguage) && (
+
+ {
+ setNamespace(value);
+ }}
+ />
+
+ )}
+
+ }>
+ Download Project
+
+
+
+
+
+
+
+
+
+ >
+ );
+};
diff --git a/ui-next/src/components/GetStartedSample/components/CodeSnippet.tsx b/ui-next/src/components/GetStartedSample/components/CodeSnippet.tsx
new file mode 100644
index 0000000000..c6cb7a432d
--- /dev/null
+++ b/ui-next/src/components/GetStartedSample/components/CodeSnippet.tsx
@@ -0,0 +1,58 @@
+import { useState } from "react";
+import { Box, Button, Stack } from "@mui/material";
+import Highlight from "react-highlight";
+
+export const CodeSnippet = ({
+ code,
+ className,
+ noCopyToClipboard,
+}: {
+ code: string;
+ className?: string;
+ noCopyToClipboard?: boolean;
+}) => {
+ const [buttonText, setButtonText] = useState("Copy");
+
+ const handleCopy = () => {
+ navigator.clipboard.writeText(code);
+ setButtonText("Copied!");
+ setTimeout(() => {
+ setButtonText("Copy");
+ }, 1000);
+ };
+
+ return (
+
+ {code}
+ {!noCopyToClipboard && (
+
+
+
+ )}
+
+ );
+};
diff --git a/ui-next/src/components/GetStartedSample/types.ts b/ui-next/src/components/GetStartedSample/types.ts
new file mode 100644
index 0000000000..36c86a864e
--- /dev/null
+++ b/ui-next/src/components/GetStartedSample/types.ts
@@ -0,0 +1,19 @@
+export enum OperatingSystemEnvironment {
+ MAC = "MacOs/Linux",
+ WINDOWS = "Windows",
+}
+
+export enum CodeLanguage {
+ JAVA = "Java",
+ PYTHON = "Python",
+ GO = "Golang",
+ CSHARP = "CSharp",
+ JS = "JavaScript",
+ CLOJURE = "Clojure",
+ GROOVY = "Groovy",
+}
+
+export enum JavaLanguageSet {
+ GRADLE = "Gradle",
+ SPRING_GRADLE = "Spring + Gradle",
+}
diff --git a/ui-next/src/components/Header.tsx b/ui-next/src/components/Header.tsx
new file mode 100644
index 0000000000..599d4c3ec5
--- /dev/null
+++ b/ui-next/src/components/Header.tsx
@@ -0,0 +1,5 @@
+import LinearProgress from "components/LinearProgress";
+
+export default function Header({ loading }: { loading: boolean }) {
+ return {loading && }
;
+}
diff --git a/ui-next/src/components/Heading.jsx b/ui-next/src/components/Heading.jsx
new file mode 100644
index 0000000000..962c4345f5
--- /dev/null
+++ b/ui-next/src/components/Heading.jsx
@@ -0,0 +1,9 @@
+import MuiTypography from "./MuiTypography";
+
+const levelMap = ["h6", "h5", "h4", "h3", "h2", "h1"];
+
+const Heading = ({ level = 3, ...props }) => {
+ return ;
+};
+
+export default Heading;
diff --git a/ui-next/src/components/HelperText.jsx b/ui-next/src/components/HelperText.jsx
new file mode 100644
index 0000000000..305d4d893c
--- /dev/null
+++ b/ui-next/src/components/HelperText.jsx
@@ -0,0 +1,11 @@
+import { Box } from "@mui/material";
+
+const HelperText = ({ children }) => {
+ return (
+
+ {children}
+
+ );
+};
+
+export default HelperText;
diff --git a/ui-next/src/components/InlineEdit.tsx b/ui-next/src/components/InlineEdit.tsx
new file mode 100644
index 0000000000..7faf16545c
--- /dev/null
+++ b/ui-next/src/components/InlineEdit.tsx
@@ -0,0 +1,139 @@
+import { Box, IconButton, TextField, Theme } from "@mui/material";
+import {
+ X as Cancel,
+ Check,
+ PencilSimple as EditIcon,
+} from "@phosphor-icons/react";
+import _isEmpty from "lodash/isEmpty";
+import { ReactNode, useEffect, useState } from "react";
+
+const additionalWidth = 15;
+
+export const InlineEdit = ({
+ value,
+ editLabel = ,
+ saveLabel = ,
+ cancelLabel = ,
+ flexGrow = 0,
+ onSave,
+ onChangeMode,
+ error = false,
+ helperText,
+ notAllowedCharRegex,
+ disabled = false,
+}: {
+ value: string;
+ editLabel?: ReactNode;
+ saveLabel?: ReactNode;
+ cancelLabel?: ReactNode;
+ flexGrow?: number;
+ onSave: (val: string) => void;
+ onChangeMode?: (edit: boolean) => void;
+ error?: boolean;
+ helperText?: string;
+ notAllowedCharRegex?: RegExp;
+ disabled?: boolean;
+}) => {
+ const [edit, setEdit] = useState(false);
+ const [internalValue, setInternalValue] = useState("");
+
+ useEffect(() => {
+ setInternalValue(value);
+ }, [value]);
+
+ useEffect(() => {
+ if (onChangeMode) {
+ onChangeMode(edit);
+ }
+ }, [edit, onChangeMode]);
+
+ const handleInputChange = (newValue: string) => {
+ if (notAllowedCharRegex) {
+ if (!notAllowedCharRegex.test(newValue)) {
+ setInternalValue(newValue);
+ }
+ } else {
+ setInternalValue(newValue);
+ }
+ };
+
+ const disableSave = _isEmpty(internalValue?.trim());
+
+ return (
+
+ {edit ? (
+
+ handleInputChange(e.target.value)}
+ sx={{
+ width: `${internalValue.length + additionalWidth}ch`,
+ minWidth: "120px",
+ maxWidth: "480px",
+ }}
+ error={error}
+ helperText={helperText}
+ >
+
+ ) : (
+
+ error
+ ? {
+ border: `2px solid ${theme.palette.error.main}`,
+ borderRadius: "4px",
+ padding: 1,
+ }
+ : {}
+ }
+ >
+ {internalValue}
+
+ )}
+
+ {edit ? (
+ <>
+
+ {
+ if (internalValue !== value) {
+ onSave(internalValue);
+ }
+ setEdit(false);
+ }}
+ disabled={disableSave}
+ >
+ {saveLabel}
+
+
+
+ {
+ setInternalValue(value);
+ setEdit(false);
+ }}
+ >
+ {cancelLabel}
+
+
+ >
+ ) : (
+ setEdit(true)}
+ sx={{ cursor: "pointer", marginTop: "-6px" }}
+ disabled={disabled}
+ >
+ {editLabel}
+
+ )}
+
+
+ );
+};
diff --git a/ui-next/src/components/Input.tsx b/ui-next/src/components/Input.tsx
new file mode 100644
index 0000000000..8c8f912326
--- /dev/null
+++ b/ui-next/src/components/Input.tsx
@@ -0,0 +1,106 @@
+import InputAdornment from "@mui/material/InputAdornment";
+import TextField, { TextFieldProps } from "@mui/material/TextField";
+import { X as ClearIcon } from "@phosphor-icons/react";
+import IconButton from "components/MuiIconButton";
+import { ChangeEvent, forwardRef, useImperativeHandle, useRef } from "react";
+import { disabledInputStyle } from "shared/styles";
+
+export type CustomInputProps = Omit & {
+ clearable?: boolean;
+ onBlur?: (value: string) => void;
+ onChange?: (value: string) => void;
+};
+
+const CustomInput = forwardRef(
+ (
+ {
+ label = null,
+ clearable,
+ onBlur = () => null,
+ onChange = () => null,
+ value,
+ ...props
+ }: CustomInputProps,
+ ref,
+ ) => {
+ const inputRef = useRef(null);
+ useImperativeHandle(ref, () => inputRef?.current, [inputRef]);
+
+ function handleClear(_e: any) {
+ if (inputRef.current?.value) {
+ inputRef.current.value = "";
+ }
+
+ if (onBlur) {
+ onBlur("");
+ }
+
+ if (onChange) {
+ onChange("");
+ }
+ }
+
+ function handleBlur(
+ e: ChangeEvent,
+ ) {
+ if (onBlur) {
+ const { value } = e.target;
+
+ onBlur(value);
+ }
+ }
+
+ function handleChange(
+ e: ChangeEvent,
+ ) {
+ if (onChange) {
+ const { value } = e.target;
+
+ onChange(value);
+ }
+ }
+
+ return (
+
+
+ theme.palette.mode === "dark" ? "#fff" : null,
+ }}
+ >
+
+
+
+ ) : undefined,
+ autoFocus: props.autoFocus,
+ }}
+ onBlur={handleBlur}
+ onChange={handleChange}
+ value={value}
+ {...props}
+ />
+ );
+ },
+);
+
+export default CustomInput;
diff --git a/ui-next/src/components/InputNumber.tsx b/ui-next/src/components/InputNumber.tsx
new file mode 100644
index 0000000000..a078d4a81d
--- /dev/null
+++ b/ui-next/src/components/InputNumber.tsx
@@ -0,0 +1,81 @@
+import { TextField, TextFieldProps } from "@mui/material";
+import _isEmpty from "lodash/isEmpty";
+import _isNil from "lodash/isNil";
+import { ChangeEvent, FunctionComponent, KeyboardEvent } from "react";
+import { disabledInputStyle } from "shared/styles";
+import { logger } from "utils/logger";
+
+type InputNumberProps = Omit & {
+ onChange: (val: number | null, event: ChangeEvent) => void;
+};
+const pattern = /^(0|[1-9]\d*)?$/;
+const isaValidNumber = (value: string) => pattern.test(value);
+
+function removeNonMatchingChars(str: string) {
+ let result = "";
+ for (let i = 0; i < str.length; i++) {
+ if (pattern.test(str[i])) {
+ result += str[i];
+ }
+ }
+ return result;
+}
+
+/**
+ * The requirement for this component was
+ * "number" : null,
+ * "number" : 0,
+ * "number" : 10
+ * Meaning allow empty. and set to null if empty. no leading 0s
+ * @param param0
+ * @returns
+ */
+export const InputNumber: FunctionComponent = ({
+ onChange,
+ value,
+ ...restProps
+}) => {
+ const handleInputChange = (event: ChangeEvent) => {
+ const incomingValue = event.target.value;
+ const isValidNumber = isaValidNumber(incomingValue);
+ if (onChange && isValidNumber) {
+ onChange(_isEmpty(incomingValue) ? null : Number(incomingValue), event);
+ } else if (!isValidNumber) {
+ const result = removeNonMatchingChars(incomingValue);
+ onChange(_isEmpty(result) ? null : Number(result), event);
+ }
+
+ if (restProps.type === "number") {
+ logger.warn(
+ "Setting type to number on InputNumber will not allow to add 0",
+ );
+ }
+ };
+ const handleOnKeyDown = (e: KeyboardEvent) => {
+ if (
+ e.ctrlKey ||
+ e.shiftKey ||
+ e.key === "Backspace" ||
+ e.key === "Enter" ||
+ e.key === "Tab" ||
+ e.key === "Delete" ||
+ e.key === "ArrowLeft" ||
+ e.key === "ArrowRight" ||
+ e.key === "ArrowUp" ||
+ e.key === "ArrowDown"
+ )
+ return;
+ if (!isaValidNumber(e.key)) {
+ e.preventDefault();
+ }
+ };
+ return (
+
+ );
+};
diff --git a/ui-next/src/components/IntegrationIcon.tsx b/ui-next/src/components/IntegrationIcon.tsx
new file mode 100644
index 0000000000..2843747ba6
--- /dev/null
+++ b/ui-next/src/components/IntegrationIcon.tsx
@@ -0,0 +1,31 @@
+import { FunctionComponent } from "react";
+
+interface IntegrationIconProps {
+ integrationName?: string;
+ size?: number;
+}
+
+export const IntegrationIcon: FunctionComponent = ({
+ integrationName,
+ size = 24,
+}) => {
+ // Check if the integrationName is a URL (starts with http:// or https://)
+ const isUrl = integrationName?.match(/^https?:\/\//i);
+
+ return (
+
{
+ // Only fall back to default if it's not a URL
+ if (!isUrl) {
+ currentTarget.onerror = null;
+ currentTarget.src = `/integrations-icons/default.svg`;
+ }
+ }}
+ />
+ );
+};
diff --git a/ui-next/src/components/IntegrationsIcon.tsx b/ui-next/src/components/IntegrationsIcon.tsx
new file mode 100644
index 0000000000..b4ac82f440
--- /dev/null
+++ b/ui-next/src/components/IntegrationsIcon.tsx
@@ -0,0 +1,16 @@
+const SvgComponent = (props: any) => (
+
+
+
+);
+export default SvgComponent;
diff --git a/ui-next/src/components/KeyValueTable.jsx b/ui-next/src/components/KeyValueTable.jsx
new file mode 100644
index 0000000000..4b3b679b56
--- /dev/null
+++ b/ui-next/src/components/KeyValueTable.jsx
@@ -0,0 +1,112 @@
+import { Grid } from "@mui/material";
+import _isNil from "lodash/isNil";
+
+import { useEnv } from "plugins/env";
+import { durationRenderer, timestampRenderer } from "utils/index";
+import { customTypeRenderers } from "plugins/customTypeRenderers";
+import StatusBadge from "components/StatusBadge";
+import Paper from "./Paper";
+
+export default function KeyValueTable({ data }) {
+ const env = useEnv();
+ return (
+
+ {data.map((item, index) => {
+ let displayValue;
+ const renderer = item.type ? customTypeRenderers[item.type] : null;
+ if (renderer) {
+ displayValue = renderer(item.value, data, env);
+ } else {
+ switch (item.type) {
+ case "date":
+ displayValue =
+ !isNaN(item.value) && item.value > 0
+ ? timestampRenderer(item.value)
+ : "N/A";
+ break;
+ case "duration":
+ displayValue =
+ !isNaN(item.value) && item.value > 0
+ ? durationRenderer(item.value)
+ : "N/A";
+ break;
+
+ case "status":
+ displayValue = ;
+ break;
+
+ default:
+ displayValue = !_isNil(item.value) ? item.value : "N/A";
+ }
+ }
+
+ return (
+
+
+
+ {item.label}
+
+
+ {item.type === "error" ? (
+
+ {item.value}
+
+ ) : (
+ displayValue
+ )}
+
+
+
+ );
+ })}
+
+ );
+}
diff --git a/ui-next/src/components/LinearProgress.tsx b/ui-next/src/components/LinearProgress.tsx
new file mode 100644
index 0000000000..00657f3a8d
--- /dev/null
+++ b/ui-next/src/components/LinearProgress.tsx
@@ -0,0 +1,16 @@
+import { default as MuiLinearProgress } from "@mui/material/LinearProgress";
+
+export default function LinearProgress({ sx = {}, ...props }) {
+ return (
+
+ );
+}
diff --git a/ui-next/src/components/MetricsChart.tsx b/ui-next/src/components/MetricsChart.tsx
new file mode 100644
index 0000000000..3c001a2d3c
--- /dev/null
+++ b/ui-next/src/components/MetricsChart.tsx
@@ -0,0 +1,42 @@
+import { HistoricalData } from "types/MetricsTypes";
+import {
+ CacheChart,
+ ChartType,
+ ErrorsChart,
+ LatencyChart,
+ RequestsChart,
+} from "./charts";
+
+interface MetricsChartProps {
+ type: ChartType;
+ historicalData?: HistoricalData[];
+ visiblePercentiles?: Record;
+}
+
+export function MetricsChart({
+ type,
+ historicalData = [],
+ visiblePercentiles = { p50: true, p95: true, p99: true },
+}: MetricsChartProps) {
+ switch (type) {
+ case ChartType.REQUESTS:
+ return ;
+
+ case ChartType.LATENCY:
+ return (
+
+ );
+
+ case ChartType.ERRORS:
+ return ;
+
+ case ChartType.CACHE:
+ return ;
+
+ default:
+ return null;
+ }
+}
diff --git a/ui-next/src/components/MuiAlert.tsx b/ui-next/src/components/MuiAlert.tsx
new file mode 100644
index 0000000000..ea6ef05f24
--- /dev/null
+++ b/ui-next/src/components/MuiAlert.tsx
@@ -0,0 +1,15 @@
+import Alert, { AlertProps } from "@mui/material/Alert";
+import { CSSProperties, forwardRef } from "react";
+
+interface MuiAlertProps extends AlertProps {
+ style?: CSSProperties;
+}
+
+const MuiAlert = forwardRef(
+ ({ style, ...props }, ref) => {
+ return ;
+ },
+);
+
+export default MuiAlert;
+export type { MuiAlertProps };
diff --git a/ui-next/src/components/MuiButton.tsx b/ui-next/src/components/MuiButton.tsx
new file mode 100644
index 0000000000..20cc71c92f
--- /dev/null
+++ b/ui-next/src/components/MuiButton.tsx
@@ -0,0 +1,4 @@
+import MuiButton, { ButtonProps as MuiButtonProps } from "@mui/material/Button";
+
+export type { MuiButtonProps };
+export default MuiButton;
diff --git a/ui-next/src/components/MuiButtonGroup.tsx b/ui-next/src/components/MuiButtonGroup.tsx
new file mode 100644
index 0000000000..42de19e254
--- /dev/null
+++ b/ui-next/src/components/MuiButtonGroup.tsx
@@ -0,0 +1,6 @@
+import MuiButtonGroup, {
+ ButtonGroupProps as MuiButtonGroupProps,
+} from "@mui/material/ButtonGroup";
+
+export type { MuiButtonGroupProps };
+export default MuiButtonGroup;
diff --git a/ui-next/src/components/MuiCheckbox.tsx b/ui-next/src/components/MuiCheckbox.tsx
new file mode 100644
index 0000000000..9069f6dd3a
--- /dev/null
+++ b/ui-next/src/components/MuiCheckbox.tsx
@@ -0,0 +1,6 @@
+import MuiCheckbox, {
+ CheckboxProps as MuiCheckboxProps,
+} from "@mui/material/Checkbox";
+
+export default MuiCheckbox;
+export type { MuiCheckboxProps };
diff --git a/ui-next/src/components/MuiIconButton.tsx b/ui-next/src/components/MuiIconButton.tsx
new file mode 100644
index 0000000000..f79635c582
--- /dev/null
+++ b/ui-next/src/components/MuiIconButton.tsx
@@ -0,0 +1,6 @@
+import MuiIconButton, {
+ IconButtonProps as MuiIconButtonProps,
+} from "@mui/material/IconButton";
+
+export type { MuiIconButtonProps };
+export default MuiIconButton;
diff --git a/ui-next/src/components/MuiTypography.tsx b/ui-next/src/components/MuiTypography.tsx
new file mode 100644
index 0000000000..19a7ed7090
--- /dev/null
+++ b/ui-next/src/components/MuiTypography.tsx
@@ -0,0 +1,31 @@
+import Typography, { TypographyProps } from "@mui/material/Typography";
+import { CSSProperties, ElementType, FC } from "react";
+
+interface MuiTypographyProps extends TypographyProps {
+ style?: CSSProperties;
+ opacity?: number;
+ textDecoration?: "overline" | "line-through" | "underline";
+ cursor?: string;
+ component?: ElementType;
+}
+
+const MuiTypography: FC = ({
+ style,
+ opacity,
+ textDecoration,
+ cursor,
+ sx,
+ ...props
+}) => {
+ const customStyles: CSSProperties = {
+ ...style,
+ opacity,
+ textDecoration,
+ cursor,
+ };
+
+ return ;
+};
+
+export default MuiTypography;
+export type { MuiTypographyProps };
diff --git a/ui-next/src/components/NavLink.jsx b/ui-next/src/components/NavLink.jsx
new file mode 100644
index 0000000000..06ac0af57c
--- /dev/null
+++ b/ui-next/src/components/NavLink.jsx
@@ -0,0 +1,41 @@
+import { Link } from "@mui/material";
+import { ArrowSquareOut } from "@phosphor-icons/react";
+import { useEnv } from "plugins/env";
+import { forwardRef } from "react";
+import { Link as RouterLink } from "react-router";
+import Url from "url-parse";
+
+// 1. Strip `navigate` from props to prevent error
+// 2. Preserve stack param
+const NavLink = forwardRef((props, ref) => {
+ const { path, newTab, ...rest } = props;
+ const { stack, defaultStack } = useEnv();
+
+ const url = new Url(path, {}, true);
+ if (stack !== defaultStack) {
+ url.query.stack = stack;
+ }
+
+ if (!newTab) {
+ return (
+
+ {rest.children}
+
+ );
+ } else {
+ return (
+
+ {rest.children}
+
+
+
+ );
+ }
+});
+
+export default NavLink;
diff --git a/ui-next/src/components/NavLink.tsx b/ui-next/src/components/NavLink.tsx
new file mode 100644
index 0000000000..aecb5aa418
--- /dev/null
+++ b/ui-next/src/components/NavLink.tsx
@@ -0,0 +1,50 @@
+import { Link } from "@mui/material";
+import { ArrowSquareOut } from "@phosphor-icons/react";
+import { useEnv } from "plugins/env";
+import { CSSProperties, ForwardedRef, ReactNode, forwardRef } from "react";
+import { Link as RouterLink } from "react-router";
+import Url from "url-parse";
+
+interface NavLinkProps {
+ path: string;
+ newTab?: boolean;
+ children: ReactNode;
+ id?: string;
+ style?: CSSProperties;
+ target?: string;
+ color?: string;
+}
+
+const NavLink = forwardRef((props: NavLinkProps, ref: ForwardedRef) => {
+ const { path, newTab, ...rest } = props;
+ const { stack, defaultStack } = useEnv();
+
+ const url = new Url(path, {}, true);
+ if (stack !== defaultStack) {
+ url.query.stack = stack;
+ }
+
+ if (!newTab) {
+ return (
+
+ {rest.children}
+
+ );
+ } else {
+ return (
+
+ {rest.children}
+
+
+
+ );
+ }
+});
+NavLink.displayName = "NavLink";
+
+export default NavLink;
diff --git a/ui-next/src/components/NoDataComponent.tsx b/ui-next/src/components/NoDataComponent.tsx
new file mode 100644
index 0000000000..40fd95a46f
--- /dev/null
+++ b/ui-next/src/components/NoDataComponent.tsx
@@ -0,0 +1,65 @@
+import React from "react";
+import EmptyPageIntro, { EmptyPageIntroProps } from "./EmptyPageIntro";
+import TagChip from "./TagChip";
+import { Box } from "@mui/material";
+
+type NoDataComponentProps = {
+ id?: string;
+ title?: string;
+ titleBg?: string;
+ description: string;
+ buttonText?: string;
+ buttonHandler?: () => void;
+ disableButton?: boolean;
+ videoUrl?: string;
+};
+
+const NoDataComponent = ({
+ id,
+ title,
+ titleBg,
+ buttonText,
+ buttonHandler,
+ description,
+ disableButton = false,
+ videoUrl,
+}: NoDataComponentProps) => {
+ const props: Omit = {
+ id,
+ message: description,
+ videoUrl,
+ ...(buttonText && {
+ primaryAction: {
+ text: buttonText,
+ onClick: buttonHandler || (() => {}),
+ disabled: disableButton,
+ },
+ }),
+ };
+
+ return (
+
+ ) : (
+
+ {title || "Empty"}
+
+ )
+ }
+ />
+ );
+};
+
+export type { NoDataComponentProps };
+export default NoDataComponent;
diff --git a/ui-next/src/components/PanelAccordion.tsx b/ui-next/src/components/PanelAccordion.tsx
new file mode 100644
index 0000000000..c8160d24ad
--- /dev/null
+++ b/ui-next/src/components/PanelAccordion.tsx
@@ -0,0 +1,86 @@
+import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
+import {
+ Accordion,
+ AccordionDetails,
+ AccordionProps,
+ AccordionSummary,
+ SxProps,
+ Theme,
+ Typography,
+ alpha,
+} from "@mui/material";
+import { ReactNode, useState } from "react";
+
+const ACCORDION_HEIGHT = 51;
+
+export const PanelAccordion = ({
+ children,
+ sx = {},
+ title,
+ defaultExpanded = false,
+ ...rest
+}: {
+ children: ReactNode;
+ sx?: SxProps;
+ title: ReactNode;
+ defaultExpanded?: boolean;
+} & AccordionProps) => {
+ const [isExpanded, setIsExpanded] = useState(defaultExpanded);
+
+ return (
+ setIsExpanded(!isExpanded)}
+ sx={{
+ "&.Mui-expanded": {
+ margin: 0,
+ },
+ ...sx,
+ }}
+ {...rest}
+ >
+ }
+ sx={{
+ px: 5,
+ minHeight: ACCORDION_HEIGHT,
+ "&.Mui-expanded": {
+ minHeight: ACCORDION_HEIGHT,
+ width: "100%",
+ bgcolor: "#F3FBFF",
+ },
+ "&:hover": {
+ bgcolor: "#F3FBFF",
+ },
+ "& .MuiAccordionSummary-content": {
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "space-between",
+ width: "100%",
+ },
+ "& .MuiAccordionSummary-content.Mui-expanded": {
+ margin: 0,
+ },
+ }}
+ >
+
+ {title}
+
+
+
+ {children}
+
+
+ );
+};
diff --git a/ui-next/src/components/Paper.tsx b/ui-next/src/components/Paper.tsx
new file mode 100644
index 0000000000..e48db9a0a2
--- /dev/null
+++ b/ui-next/src/components/Paper.tsx
@@ -0,0 +1,18 @@
+import MuiPaper, { PaperProps } from "@mui/material/Paper";
+import { forwardRef, Ref } from "react";
+
+const Paper = forwardRef(function (
+ { elevation, ...props }: PaperProps,
+ ref: Ref,
+) {
+ return (
+ -1 ? elevation : 0}
+ style={{ borderRadius: 4 }}
+ {...props}
+ />
+ );
+});
+Paper.displayName = "Paper";
+export default Paper;
diff --git a/ui-next/src/components/PromptVariables.tsx b/ui-next/src/components/PromptVariables.tsx
new file mode 100644
index 0000000000..29f1259951
--- /dev/null
+++ b/ui-next/src/components/PromptVariables.tsx
@@ -0,0 +1,59 @@
+import { Grid } from "@mui/material";
+import { ConductorAutocompleteVariables } from "components/v1/FlatMapForm/ConductorAutocompleteVariables";
+import { ConductorFlatMapFormBase } from "components/v1/FlatMapForm/ConductorFlatMapForm";
+import { TaskDef } from "types";
+
+type PromptVariablesProps = {
+ currentVariables: string | Record;
+ onChange: (t: Partial) => void;
+ updateField: (
+ path: string,
+ value: unknown,
+ task: Partial,
+ ) => Partial;
+ task: Partial;
+};
+
+const PromptVariables = ({
+ currentVariables,
+ onChange,
+ updateField,
+ task,
+}: PromptVariablesProps) => {
+ return (
+ <>
+ {typeof currentVariables === "string" ? (
+
+
+ onChange(
+ updateField(`inputParameters.promptVariables`, value, task),
+ )
+ }
+ value={currentVariables}
+ label="Prompt variables"
+ />
+
+ ) : (
+
+ ) =>
+ onChange(
+ updateField(`inputParameters.promptVariables`, value, task),
+ )
+ }
+ value={{ ...currentVariables }}
+ autoFocusField={false}
+ />
+
+ )}
+ >
+ );
+};
+
+export default PromptVariables;
diff --git a/ui-next/src/components/Puller.tsx b/ui-next/src/components/Puller.tsx
new file mode 100644
index 0000000000..b8257e03b2
--- /dev/null
+++ b/ui-next/src/components/Puller.tsx
@@ -0,0 +1,17 @@
+import { styled } from "@mui/material";
+import { grey } from "@mui/material/colors";
+
+const Puller = styled("div")(({ theme }) => ({
+ width: 30,
+ height: 5,
+ backgroundColor: grey[400],
+ borderRadius: 3,
+ position: "absolute",
+ top: 8,
+ left: "calc(50% - 15px)",
+ ...theme.applyStyles("dark", {
+ backgroundColor: grey[900],
+ }),
+}));
+
+export default Puller;
diff --git a/ui-next/src/components/RadioButtonGroup.tsx b/ui-next/src/components/RadioButtonGroup.tsx
new file mode 100644
index 0000000000..5d861b4a64
--- /dev/null
+++ b/ui-next/src/components/RadioButtonGroup.tsx
@@ -0,0 +1,66 @@
+import { Box } from "@mui/material";
+import FormControlLabel from "@mui/material/FormControlLabel";
+import Radio from "@mui/material/Radio";
+import RadioGroup from "@mui/material/RadioGroup";
+import { ChangeEvent } from "react";
+import { colors } from "theme/tokens/variables";
+
+export interface RadioButtonGroupProp {
+ ariaLabel?: string;
+ items: {
+ disabled?: boolean;
+ value: string | number;
+ label: string;
+ helperText?: string;
+ }[];
+ name: string;
+ onChange?: (evt: ChangeEvent, val: string) => void;
+ value?: string | number;
+}
+
+const RadioButtonGroup = ({
+ ariaLabel,
+ items,
+ name,
+ onChange,
+ value,
+}: RadioButtonGroupProp) => {
+ return (
+
+ {items.map((item, index) => (
+ }
+ id={`${item.label}-radio-btn`}
+ label={
+
+ <>{item.label}>
+ {item.helperText && (
+
+ {item.helperText}
+
+ )}
+
+ }
+ disabled={item.disabled}
+ />
+ ))}
+
+ );
+};
+
+export default RadioButtonGroup;
diff --git a/ui-next/src/components/ReactJson.tsx b/ui-next/src/components/ReactJson.tsx
new file mode 100644
index 0000000000..a998aacf7a
--- /dev/null
+++ b/ui-next/src/components/ReactJson.tsx
@@ -0,0 +1,349 @@
+import Editor, { Monaco } from "@monaco-editor/react";
+import { Box, Paper, Tooltip } from "@mui/material";
+import {
+ CornersOut,
+ Download,
+ List,
+ ListPlus,
+ PencilSimple,
+ XCircle,
+} from "@phosphor-icons/react";
+import Button from "components/MuiButton";
+import SaveIcon from "components/v1/icons/SaveIcon";
+import XCloseIcon from "components/v1/icons/XCloseIcon";
+import { CSSProperties, Suspense, useContext, useRef, useState } from "react";
+import { defaultEditorOptions, type EditorOptions } from "shared/editor";
+import { ColorModeContext } from "theme/material/ColorModeContext";
+import { colors } from "theme/tokens/variables";
+import { tryToJson } from "utils/utils";
+
+const DARK_BACKGROUND = "#111111";
+const COLLAPSE_IDLE = "COLLAPSE_IDLE";
+const COLLAPSE_EXPAND = "COLLAPSE_EXPAND";
+const COLLAPSE_COLLAPSE = "COLLAPSE_COLLAPSE";
+
+export interface ReactJSONProps {
+ src: any;
+ title?: string;
+ className?: string;
+ style?: CSSProperties;
+ showIconText?: boolean;
+ workflowName?: string;
+ editorHeight?: string;
+ item?: any;
+ handleFullScreen?: (item: any) => void;
+ fullScreen?: any;
+ customOptions?: object;
+ overflowX?: string;
+ overflowY?: string;
+ isEditable?: boolean;
+ handleUpdate?: (value: string) => void;
+}
+
+const editorOptions: EditorOptions = {
+ ...defaultEditorOptions,
+ tabSize: 2,
+ readOnly: true,
+ quickSuggestions: true,
+ folding: true,
+ automaticLayout: true,
+ scrollbar: {
+ // this property is added because it was not allowing us to scroll when mouse pointer is over this component
+ alwaysConsumeMouseWheel: false,
+ },
+ wordWrap: "on",
+};
+
+export default function ReactJson({
+ title,
+ className = "",
+ style,
+ showIconText = true,
+ editorHeight = "500px",
+ handleFullScreen,
+ item,
+ fullScreen,
+ customOptions,
+ overflowX,
+ overflowY,
+ isEditable,
+ handleUpdate,
+ ...props
+}: ReactJSONProps) {
+ const editorRef = useRef(null);
+
+ const [collapse, setCollapse] = useState(COLLAPSE_EXPAND);
+ const [editEnabled, setEditEnabled] = useState(false);
+ const [isJsonParsable, setIsJsonParsable] = useState(true);
+ const colorModeContext = useContext(ColorModeContext);
+ let mode = "light";
+ if (colorModeContext && colorModeContext.mode) {
+ mode = colorModeContext.mode;
+ }
+
+ const handleFoldAll = () => {
+ const editor = editorRef.current;
+ if (editor) {
+ const foldAction = editor.getAction("editor.foldAll");
+ foldAction.run();
+ }
+ };
+
+ const handleUnfoldAll = () => {
+ const editor = editorRef.current;
+ if (editor) {
+ const unfoldAction = editor.getAction("editor.unfoldAll");
+ unfoldAction.run();
+ }
+ };
+
+ const toggleCollapse = () => {
+ const shouldExpand = [COLLAPSE_IDLE, COLLAPSE_COLLAPSE].includes(collapse);
+
+ if (shouldExpand) {
+ handleUnfoldAll();
+ setCollapse(COLLAPSE_EXPAND);
+ } else {
+ handleFoldAll();
+ setCollapse(COLLAPSE_COLLAPSE);
+ }
+ };
+
+ const toggleDownload = () => {
+ const a = window.document.createElement("a");
+ a.href = window.URL.createObjectURL(
+ new Blob([JSON.stringify(props.src, null, 2)], {
+ type: "application/json",
+ }),
+ );
+ a.download = `${props.workflowName}_${title}.json`;
+
+ // Append anchor to body.
+ document.body.appendChild(a);
+ a.click();
+
+ // Remove anchor from body
+ document.body.removeChild(a);
+ };
+
+ const toggleFullscreen = () => {
+ if (handleFullScreen && item) {
+ handleFullScreen(item);
+ }
+ };
+
+ const collapseButtonText =
+ collapse === COLLAPSE_IDLE || collapse === COLLAPSE_COLLAPSE
+ ? "Expand all"
+ : "Collapse all";
+
+ const handleEditorWillMount = (monaco: Monaco) => {
+ monaco.editor.defineTheme("vs-light", {
+ base: "vs",
+ inherit: true,
+ rules: [
+ {
+ token: "number",
+ foreground: colors.primaryGreen,
+ },
+ ],
+ colors: {},
+ });
+ };
+
+ const handleEditorMount = (editor: Monaco) => {
+ editorRef.current = editor;
+ };
+
+ const mainStyle: object = {
+ ...style,
+ ...(overflowX && { overflowX: overflowX }),
+ ...(overflowY && { overflowY: overflowY }),
+ };
+
+ const handleEnableEdit = (value: boolean) => {
+ setEditEnabled(value);
+ };
+
+ const onEditorChange = () => {
+ const editorValue = editorRef?.current?.getValue();
+ const tryJson = tryToJson(editorValue);
+ if (tryJson) {
+ setIsJsonParsable(true);
+ } else {
+ setIsJsonParsable(false);
+ }
+ };
+
+ const handleSave = () => {
+ const editorValue = editorRef?.current?.getValue();
+ setEditEnabled(false);
+ if (handleUpdate) {
+ handleUpdate(editorValue);
+ }
+ };
+
+ return (
+
+
+
+ {title}
+
+
+
+ {isEditable && (
+ <>
+ {!editEnabled ? (
+
+
+
+ ) : (
+
+
+
+ }
+ size="small"
+ sx={{ fontSize: "10px" }}
+ >
+ Update
+
+
+ )}
+ >
+ )}
+
+
+
+
+
+
+ ) : (
+
+ )
+ }
+ sx={{ fontSize: "10px" }}
+ >
+ {showIconText ? collapseButtonText : null}
+
+
+
+ {fullScreen && (
+
+ )}
+
+
+
+
+ Loading...}>
+
+
+
+
+ );
+}
diff --git a/ui-next/src/components/RoleTagChip.tsx b/ui-next/src/components/RoleTagChip.tsx
new file mode 100644
index 0000000000..4bbcbbb27a
--- /dev/null
+++ b/ui-next/src/components/RoleTagChip.tsx
@@ -0,0 +1,36 @@
+import { ChipProps } from "@mui/material";
+import { userRoleColorGenerator } from "utils/roles";
+import { forwardRef } from "react";
+import { toUpperFirst } from "utils";
+import TagChip from "./TagChip";
+
+const RoleTagChip = forwardRef(
+ ({ style = {}, label = "", ...props }, ref) => {
+ let combinedStyles;
+ if (typeof label === "string") {
+ combinedStyles = {
+ ...userRoleColorGenerator(label),
+ ...style,
+ };
+ } else {
+ combinedStyles = { ...style };
+ }
+ const formattedLabel = () => {
+ if (typeof label === "string") {
+ return toUpperFirst(label);
+ }
+
+ return label;
+ };
+ return (
+
+ );
+ },
+);
+
+export default RoleTagChip;
diff --git a/ui-next/src/components/SafariWarning.tsx b/ui-next/src/components/SafariWarning.tsx
new file mode 100644
index 0000000000..4f0969f236
--- /dev/null
+++ b/ui-next/src/components/SafariWarning.tsx
@@ -0,0 +1,20 @@
+import { SnackbarMessage } from "components/SnackbarMessage";
+import { isSafari } from "utils";
+
+interface SafariWarningProps {
+ setShowSafariWarning: (show: boolean) => void;
+}
+
+export const SafariWarning = ({ setShowSafariWarning }: SafariWarningProps) => {
+ if (isSafari) {
+ return (
+ {
+ setShowSafariWarning(false);
+ }}
+ />
+ );
+ }
+};
diff --git a/ui-next/src/components/SearchEverything.tsx b/ui-next/src/components/SearchEverything.tsx
new file mode 100644
index 0000000000..c5c34a3b7c
--- /dev/null
+++ b/ui-next/src/components/SearchEverything.tsx
@@ -0,0 +1,311 @@
+import SearchIcon from "@mui/icons-material/Search";
+import { Box } from "@mui/material";
+import InputBase from "@mui/material/InputBase";
+import { CaretDoubleRight, XCircle } from "@phosphor-icons/react";
+import _first from "lodash/fp/first";
+import _isEqual from "lodash/isEqual";
+import { ReactElement, useCallback, useEffect, useMemo, useState } from "react";
+import { useNavigate } from "react-router";
+import { blueLight, seGrey, seGrey2 } from "theme/tokens/colors";
+import useArrowNavigation, {
+ useArrowNavigationProps,
+} from "useArrowNavigation";
+
+type SearchResultBase = {
+ icon?: ReactElement;
+ title: string;
+ route?: string;
+};
+
+type SearchResultRoute = SearchResultBase & {
+ sub?: never;
+};
+
+type SearchResultSub = SearchResultBase & {
+ sub: SearchResults;
+};
+type SearchResultItem = SearchResultRoute | SearchResultSub;
+
+type SearchResults = Array;
+
+export interface SearchEverythingProps {
+ onChange: (change: string, max?: number) => void;
+ searchResults?: SearchResults;
+ onClear: () => void;
+ searchTerm: string;
+ setOpen?: (value: boolean) => void;
+ maxSearchResults?: number;
+}
+
+const searchBarStyle = {
+ padding: "13px",
+ borderRadius: "11px",
+ border: `1px solid ${blueLight}`,
+ display: "flex",
+ alignItems: "center",
+};
+const closeCircleStyle = {
+ marginLeft: "auto",
+ display: "flex",
+ alignItems: "center",
+ cursor: "pointer",
+};
+const searchInputStyle = {
+ padding: "0 8px",
+ width: "100%",
+ input: {
+ fontSize: "14px",
+ fontStyle: "normal",
+ fontWeight: 500,
+ lineHeight: "normal",
+ },
+};
+const resultsWrapperStyle = {
+ padding: "8px 0",
+};
+const resultGroupStyle = {
+ padding: "8px 0",
+};
+const resultTitleStyle = {
+ fontSize: "14px",
+ fontStyle: "normal",
+ fontWeight: 600,
+ lineHeight: "normal",
+ color: blueLight,
+ padding: "8px 0",
+ cursor: "pointer",
+};
+
+const noResultWrapper = {
+ display: "flex",
+ flexDirection: "column",
+ justifyContent: "center",
+ alignItems: "center",
+ padding: "50px 0px 25px 0px",
+};
+const titleWithBg = {
+ display: "flex",
+ alignItems: "center",
+ height: "60px",
+ backgroundImage: `url(searchIconBg.svg)`,
+ backgroundSize: "80px 80px",
+ backgroundRepeat: "no-repeat",
+ backgroundPosition: "center",
+};
+const noResultTitle = {
+ color: "#060606",
+ fontWeight: 600,
+ fontSize: "16px",
+ marginTop: "-15px",
+};
+const noResultSuggestion = {
+ color: blueLight,
+ fontSize: "12px",
+ lineHeight: "16px",
+ fontWeight: 700,
+ textTransform: "uppercase",
+ display: "flex",
+ alignItems: "center",
+ padding: "2px 0",
+ cursor: "pointer",
+};
+const uniqueKeyGenerator = (index: number, subIndex: number, title: string) => {
+ return `${index}-${subIndex}-${title}`;
+};
+
+const useSearchEverythingHook = (props: useArrowNavigationProps) => {
+ const firstOptionItemHash = useMemo(() => {
+ const head = _first(props?.options);
+ if (head) {
+ return props?.optionsIdGen(head);
+ }
+ return undefined;
+ }, [props]);
+
+ const [higlightedElement, setHighlighetedElement] = useState(
+ firstOptionItemHash ?? "",
+ );
+
+ useEffect(() => {
+ if (firstOptionItemHash !== undefined && firstOptionItemHash !== "") {
+ setHighlighetedElement(firstOptionItemHash);
+ }
+ }, [firstOptionItemHash]);
+
+ const arrowNavProps = useArrowNavigation({
+ ...props,
+ hoveredItem: higlightedElement,
+ setHoveredItem: setHighlighetedElement,
+ });
+ return arrowNavProps;
+};
+
+function SearchEverything({
+ onChange,
+ searchResults,
+ onClear,
+ searchTerm,
+ setOpen,
+ maxSearchResults,
+}: SearchEverythingProps) {
+ const navigate = useNavigate();
+
+ const searchItems: SearchResultBase[] = useMemo(() => {
+ const result =
+ searchResults?.map(
+ (item) =>
+ item.sub?.map((subItem) => {
+ return subItem;
+ }) || [],
+ ) ?? [];
+ if (result && result.length > 0) {
+ return result.flat();
+ }
+ return [];
+ }, [searchResults]);
+
+ const optionsIdGen = useCallback((sr: SearchResultItem) => {
+ return `${sr.route?.replace("/", "_")}`;
+ }, []);
+
+ const { inputProps, optionPropsForItem, hoveredItem } =
+ useSearchEverythingHook({
+ onSelect: (elem) => {
+ handleRedirect(elem);
+ },
+ options: searchItems || [],
+ optionsIdGen,
+ scrollToCenter: true,
+ hoveredItem: "",
+ setHoveredItem: () => {},
+ });
+
+ const subTitleStyle = (item: string) => {
+ return {
+ transition: "all 0.3s ease",
+ borderRadius: "6px",
+ background: _isEqual(item, hoveredItem) ? blueLight : seGrey,
+ color: _isEqual(item, hoveredItem) ? "#FFFFFF" : "000000",
+ padding: "12px 24px",
+ fontSize: "14px",
+ fontWeight: 500,
+ lineHeight: "normal",
+ fontStyle: "normal",
+ margin: "2px 0",
+ cursor: "pointer",
+ display: "flex",
+ alignItems: "center",
+ "&:hover #enter-icon": {
+ visibility: "visible",
+ },
+ };
+ };
+ const enterIconStyle = (item: string) => {
+ return {
+ marginLeft: "auto",
+ visibility: _isEqual(item, hoveredItem) ? "visible" : "hidden",
+ };
+ };
+ const handleChangeText = (value: string) => {
+ onChange(value, maxSearchResults);
+ };
+
+ const handleRedirect = (sub: SearchResultItem) => {
+ if (sub.route) {
+ navigate(sub.route);
+ if (setOpen) {
+ setOpen(false);
+ }
+ }
+ };
+
+ return (
+
+
+
+
+
+
+ handleChangeText(e.target.value)}
+ {...inputProps}
+ />
+
+ onClear()}>
+
+
+
+ {/* search result not found */}
+ {searchResults && searchResults.length === 0 && (
+
+
+ {`No results for "${searchTerm}"`}
+
+
+ Try searching for:
+
+
+ handleChangeText("workflow")}
+ >
+ Workflow names
+
+ handleChangeText("task")}
+ >
+ Task definitions
+
+
+
+ )}
+ {/* search results found */}
+ {searchResults && searchResults.length > 0 && (
+
+ {searchResults.map(
+ (item, index) =>
+ item.sub &&
+ item.sub.length > 0 && (
+
+ handleRedirect(item)}
+ >
+ {item.title}
+
+ {item.sub &&
+ item.sub.length > 0 &&
+ item.sub.map((subItem, subIndex) => (
+ handleRedirect(subItem)}
+ >
+ {subItem.title}
+
+
+
+
+ ))}
+
+ ),
+ )}
+
+ )}
+
+ );
+}
+
+export default SearchEverything;
diff --git a/ui-next/src/components/Select.tsx b/ui-next/src/components/Select.tsx
new file mode 100644
index 0000000000..35d583bca0
--- /dev/null
+++ b/ui-next/src/components/Select.tsx
@@ -0,0 +1,39 @@
+import {
+ FormControl,
+ InputLabel,
+ Select as MuiSelect,
+ SelectProps as MuiSelectProps,
+} from "@mui/material";
+import _isNil from "lodash/isNil";
+import { CSSProperties, ReactNode } from "react";
+
+interface SelectProps extends Omit {
+ label?: ReactNode;
+ fullWidth?: boolean;
+ nullable?: boolean;
+ style?: CSSProperties;
+ renderValue?: (value: unknown) => ReactNode;
+}
+
+const Select = ({
+ label,
+ fullWidth,
+ nullable = true,
+ style,
+ ...props
+}: SelectProps) => {
+ return (
+
+ {label && {label}}
+ (_isNil(v) ? "" : (v as ReactNode))}
+ {...props}
+ />
+
+ );
+};
+
+export default Select;
diff --git a/ui-next/src/components/Sidebar/BaseSubMenu.tsx b/ui-next/src/components/Sidebar/BaseSubMenu.tsx
new file mode 100644
index 0000000000..7154fdbb99
--- /dev/null
+++ b/ui-next/src/components/Sidebar/BaseSubMenu.tsx
@@ -0,0 +1,92 @@
+import Collapse from "@mui/material/Collapse";
+import List from "@mui/material/List";
+import { useContext, useMemo } from "react";
+import { colors } from "theme/tokens/variables";
+import { SidebarContext } from "./context/SidebarContext";
+import { SidebarItem } from "./SidebarItem";
+import { SubMenuProps } from "./types";
+
+export const BaseSubMenu = ({ items, parentId }: SubMenuProps) => {
+ const { open, openedMenus, location } = useContext(SidebarContext);
+ const isSubMenuOpen = openedMenus?.some((menu) => menu === parentId);
+
+ const treeStyle = useMemo(() => {
+ const isActive = items.some((item) => item.linkTo === location?.pathname);
+ if (open) {
+ if (isActive) {
+ return {
+ height: "22px",
+ top: "-4px",
+ };
+ }
+
+ return {
+ height: "32px",
+ top: "-14px",
+ };
+ }
+
+ return {
+ height: "26px",
+ top: "-8px",
+ };
+ }, [items, location?.pathname, open]);
+
+ return (
+
+ .MuiListItem-root": {
+ "&:first-of-type": {
+ ".MuiButtonBase-root": {
+ // mt: 1,
+ ":before": treeStyle,
+ },
+ },
+
+ ".MuiButtonBase-root": {
+ color: colors.sidebarGreyText,
+ py: 0,
+ transition: " background-color 0.3s ease-in-out",
+
+ ":before": {
+ ml: 1,
+ content: "''",
+ borderLeft: `1px solid ${colors.sidebarFaintGrey}`,
+ position: "absolute",
+ width: "10px",
+ height: "36px",
+ top: "-20px",
+ left: "15px",
+ },
+
+ ".MuiBox-root": {
+ ml: 7,
+ },
+
+ ".MuiListItemText-root": {
+ ".MuiListItemText-primary": {
+ fontSize: 12,
+ },
+ },
+ },
+ },
+ }}
+ >
+ {items.map((item) => (
+
+ ))}
+
+
+ );
+};
diff --git a/ui-next/src/components/Sidebar/ClosedLogo.tsx b/ui-next/src/components/Sidebar/ClosedLogo.tsx
new file mode 100644
index 0000000000..967dc874b6
--- /dev/null
+++ b/ui-next/src/components/Sidebar/ClosedLogo.tsx
@@ -0,0 +1,24 @@
+import OrkesIcon from "images/svg/orkes-icon.svg";
+import { featureFlags, FEATURES } from "utils/flags";
+
+// Logos
+const ConductorOSSLogo = "https://assets.conductor-oss.org/logo.png";
+
+// Determine which logo to use based on ACCESS_MANAGEMENT feature flag
+// Enterprise (ACCESS_MANAGEMENT enabled) uses Orkes icon
+// OSS (ACCESS_MANAGEMENT disabled) uses Conductor OSS logo
+const isEnterprise = featureFlags.isEnabled(FEATURES.ACCESS_MANAGEMENT);
+const defaultLogo = isEnterprise ? OrkesIcon : ConductorOSSLogo;
+const defaultAltText = isEnterprise ? "Orkes logo" : "Conductor OSS logo";
+
+export const ClosedLogo = ({ customLogo }: { customLogo?: string }) => (
+
+);
diff --git a/ui-next/src/components/Sidebar/HotKeysButton.tsx b/ui-next/src/components/Sidebar/HotKeysButton.tsx
new file mode 100644
index 0000000000..4d2c0467d3
--- /dev/null
+++ b/ui-next/src/components/Sidebar/HotKeysButton.tsx
@@ -0,0 +1,79 @@
+import Chip from "@mui/material/Chip";
+import Stack from "@mui/material/Stack";
+import { ReactNode, useMemo } from "react";
+
+// Detect if the user is on Windows
+const isWindows = () => {
+ return (
+ /Win/i.test(navigator.platform) || /Windows/i.test(navigator.userAgent)
+ );
+};
+
+// Convert shortcut display based on OS
+const formatShortcut = (
+ shortcut: ReactNode,
+ isWindowsOS: boolean,
+): ReactNode => {
+ if (typeof shortcut === "string") {
+ // Replace ⌘ with Ctrl on Windows
+ if (isWindowsOS) {
+ return shortcut.replace(/⌘/g, "Ctrl");
+ }
+ return shortcut;
+ }
+ return shortcut;
+};
+
+export default function HotKeysButton({
+ shortcuts,
+}: {
+ shortcuts: ReactNode[];
+}) {
+ const isWindowsOS = useMemo(() => isWindows(), []);
+
+ const formattedShortcuts = useMemo(
+ () => shortcuts.map((shortcut) => formatShortcut(shortcut, isWindowsOS)),
+ [shortcuts, isWindowsOS],
+ );
+
+ return (
+
+ {formattedShortcuts.map((item, index) => (
+
+ ))}
+
+ );
+}
diff --git a/ui-next/src/components/Sidebar/OpenedLogo.tsx b/ui-next/src/components/Sidebar/OpenedLogo.tsx
new file mode 100644
index 0000000000..b3bbc9f03c
--- /dev/null
+++ b/ui-next/src/components/Sidebar/OpenedLogo.tsx
@@ -0,0 +1,72 @@
+import Stack, { StackProps } from "@mui/material/Stack";
+import OrkesLogo from "images/svg/orkes-logo.svg";
+import { featureFlags, FEATURES } from "utils/flags";
+
+// Logos
+const ConductorOSSLogo = "https://assets.conductor-oss.org/logo.png";
+
+// Determine which logo to use based on ACCESS_MANAGEMENT feature flag
+// Enterprise (ACCESS_MANAGEMENT enabled) uses Orkes logo
+// OSS (ACCESS_MANAGEMENT disabled) uses Conductor OSS logo
+const isEnterprise = featureFlags.isEnabled(FEATURES.ACCESS_MANAGEMENT);
+const defaultLogo = isEnterprise ? OrkesLogo : ConductorOSSLogo;
+const defaultAltText = isEnterprise ? "Orkes logo" : "Conductor OSS logo";
+
+export const OpenedLogo = ({
+ customLogo,
+ ...rest
+}: StackProps & {
+ customLogo?: string;
+}) => (
+
+ {customLogo ? (
+
+ ) : (
+
+ )}
+
+);
diff --git a/ui-next/src/components/Sidebar/RunWorkflowButton.tsx b/ui-next/src/components/Sidebar/RunWorkflowButton.tsx
new file mode 100644
index 0000000000..d8722d3213
--- /dev/null
+++ b/ui-next/src/components/Sidebar/RunWorkflowButton.tsx
@@ -0,0 +1,59 @@
+import PlayIcon from "@mui/icons-material/PlayArrowOutlined";
+import { Box } from "@mui/material";
+
+import MuiButton from "components/MuiButton";
+import MuiIconButton from "components/MuiIconButton";
+import { usePushHistory } from "utils/hooks/usePushHistory";
+import { RUN_WORKFLOW_URL } from "utils/constants/route";
+import { useAuth } from "shared/auth";
+
+const RunWorkflowButton = ({ open }: { open: boolean }) => {
+ const pushHistory = usePushHistory();
+ const { isTrialExpired } = useAuth();
+
+ if (!open) {
+ return (
+
+ pushHistory(RUN_WORKFLOW_URL)}
+ sx={{
+ opacity: "0.7",
+ fontSize: "18px",
+ ":hover": {
+ color: "white",
+ backgroundColor: "transparent",
+ opacity: 1,
+ },
+ }}
+ >
+
+
+
+ );
+ }
+
+ return (
+
+ }
+ onClick={() => pushHistory(RUN_WORKFLOW_URL)}
+ disabled={isTrialExpired}
+ >
+ Run Workflow
+
+
+ );
+};
+
+export default RunWorkflowButton;
diff --git a/ui-next/src/components/Sidebar/Sidebar.tsx b/ui-next/src/components/Sidebar/Sidebar.tsx
new file mode 100644
index 0000000000..6511ed2db8
--- /dev/null
+++ b/ui-next/src/components/Sidebar/Sidebar.tsx
@@ -0,0 +1,203 @@
+import { Backdrop, Box, Drawer, alpha, useTheme } from "@mui/material";
+import { useMemo, useState } from "react";
+import { useAuth } from "shared/auth";
+import { colors } from "theme/tokens/variables";
+import { Auth0User } from "types/User";
+import { drawerWidthClose, drawerWidthOpen } from "./constants";
+import { useSidebarHover } from "./hooks/useSidebarHover";
+import { SidebarHeader } from "./SidebarHeader";
+import { SidebarMenu } from "./SidebarMenu";
+import { SidebarToggleButton } from "./SidebarToggleButton";
+import { MenuItemType } from "./types";
+
+interface SidebarProps {
+ menuItems: MenuItemType[];
+ open?: boolean;
+ onToggle?: (open: boolean) => void;
+ apiVersion?: string;
+ releaseVersion?: string;
+ isAnnouncementBannerVisible?: boolean;
+ customLogo?: string;
+ isMobile?: boolean;
+ toggleMenu?: () => void;
+ onSearchClick?: () => void;
+}
+
+export const Sidebar = ({
+ menuItems,
+ open: controlledOpen,
+ onToggle,
+ apiVersion,
+ releaseVersion,
+ isAnnouncementBannerVisible: _isAnnouncementBannerVisible,
+ customLogo,
+ isMobile = false,
+ toggleMenu,
+ onSearchClick,
+}: SidebarProps) => {
+ const theme = useTheme();
+ const [internalOpen, setInternalOpen] = useState(true);
+ const { user, logOut, conductorUser, isAuthenticated } = useAuth();
+ const [showCopyAlert, setShowCopyAlert] = useState(false);
+
+ const {
+ hoveredMenuId,
+ getItemRef,
+ handleMouseEnter,
+ handleMouseLeave,
+ handlePopoverMouseEnter,
+ handlePopoverMouseLeave,
+ } = useSidebarHover();
+
+ // Use controlled state if provided, otherwise use internal state
+ const open = controlledOpen !== undefined ? controlledOpen : internalOpen;
+
+ const handleToggle = () => {
+ if (toggleMenu) {
+ // Use toggleMenu if provided (for controlled state)
+ toggleMenu();
+ } else if (onToggle) {
+ // Use onToggle if provided (takes boolean)
+ onToggle(!open);
+ } else {
+ // Fall back to internal state
+ setInternalOpen(!open);
+ }
+ };
+
+ const [conductorVersion, uiVersion]: string[] = useMemo(
+ () => [apiVersion || "latest", releaseVersion || "latest"],
+ [apiVersion, releaseVersion],
+ );
+
+ const visibleItems = useMemo(
+ () => menuItems.filter((item) => !item.hidden),
+ [menuItems],
+ );
+
+ // Group items into sections
+ const sections = useMemo(() => {
+ const mainItems: MenuItemType[] = [];
+
+ visibleItems.forEach((item) => {
+ if (item.items && item.items.length > 0) {
+ // Items with children are their own sections
+ mainItems.push(item);
+ } else {
+ // Regular items go to main
+ mainItems.push(item);
+ }
+ });
+
+ return mainItems;
+ }, [visibleItems]);
+
+ const drawerCustomHeight = useMemo(() => {
+ if (isMobile) {
+ return "100vh";
+ } else {
+ return _isAnnouncementBannerVisible ? "calc(100vh - 45px)" : "100vh";
+ }
+ }, [_isAnnouncementBannerVisible, isMobile]);
+
+ const topMarginForChevronIcon = useMemo(() => {
+ if (!_isAnnouncementBannerVisible) {
+ return open ? "18px" : "50px";
+ } else {
+ return open ? "63px" : "95px";
+ }
+ }, [_isAnnouncementBannerVisible, open]);
+
+ const sidebarContent = (
+
+
+
+
+
+ );
+
+ // Wrap in Drawer for mobile, otherwise return as-is
+ return (isMobile && open) || !isMobile ? (
+ <>
+
+
+ {sidebarContent}
+
+ {isMobile && (
+ theme.zIndex.drawer - 1,
+ backdropFilter: "blur(2px)",
+ }}
+ open={!!open}
+ onClick={toggleMenu}
+ />
+ )}
+ >
+ ) : null;
+};
+
+export default Sidebar;
diff --git a/ui-next/src/components/Sidebar/SidebarFooter.tsx b/ui-next/src/components/Sidebar/SidebarFooter.tsx
new file mode 100644
index 0000000000..084711d818
--- /dev/null
+++ b/ui-next/src/components/Sidebar/SidebarFooter.tsx
@@ -0,0 +1,293 @@
+import { LogoutOutlined } from "@mui/icons-material";
+import {
+ Avatar,
+ Box,
+ Button,
+ IconButton,
+ Tooltip,
+ Typography,
+ alpha,
+ useTheme,
+} from "@mui/material";
+import { SnackbarMessage } from "components/SnackbarMessage";
+import { SidebarVersionBlock } from "./SidebarVersionBlock";
+import TokenIcon from "images/svg/token.svg";
+import { getAccessToken } from "shared/auth/tokenManagerJotai";
+import { Auth0User } from "types/User";
+import { FEATURES, featureFlags } from "utils";
+import type { ReactNode } from "react";
+
+const isPlayground = featureFlags.isEnabled(FEATURES.PLAYGROUND);
+
+interface SidebarFooterProps {
+ open: boolean;
+ isAuthenticated: boolean;
+ isMobile: boolean;
+ user: Auth0User | null;
+ conductorUser: { id: string } | null;
+ logOut?: () => void;
+ conductorVersion: string;
+ uiVersion: string;
+ showCopyAlert: boolean;
+ setShowCopyAlert: (show: boolean) => void;
+ /** When provided (e.g. by enterprise), used for user/sign-out block; version still shown below. */
+ customUserBlock?: ReactNode;
+}
+
+export const SidebarFooter = ({
+ open,
+ isAuthenticated,
+ isMobile,
+ user,
+ conductorUser,
+ logOut,
+ conductorVersion,
+ uiVersion,
+ showCopyAlert,
+ setShowCopyAlert,
+ customUserBlock,
+}: SidebarFooterProps) => {
+ const theme = useTheme();
+
+ if (customUserBlock != null) {
+ return (
+ <>
+ {customUserBlock}
+ {open && (
+
+
+
+ )}
+ >
+ );
+ }
+
+ return (
+ <>
+ {/* Footer with Signout Button when collapsed */}
+ {!open && isAuthenticated && !isMobile && (
+
+
+ {
+ if (logOut) {
+ logOut();
+ }
+ }}
+ size="small"
+ sx={{
+ color: theme.palette.text.secondary,
+ "&:hover": {
+ backgroundColor: alpha(theme.palette.action.hover, 0.08),
+ color: theme.palette.text.primary,
+ },
+ }}
+ >
+
+
+
+
+ )}
+
+ {/* Footer with UserInfo and Version */}
+ {open && (
+
+ {/* User Info, Signout and Copy Token */}
+ {isAuthenticated && (
+
+ {/* User Avatar and Info */}
+
+
+
+
+ {(user as Auth0User)?.given_name}
+
+
+ {conductorUser?.id}
+
+
+
+ {
+ if (logOut) {
+ logOut();
+ }
+ }}
+ size="small"
+ sx={{
+ color: theme.palette.text.secondary,
+ ml: "auto",
+ }}
+ >
+
+
+
+
+
+ {/* Copy Token Button */}
+
+ {/* Spacer for avatar */}
+
+ {(() => {
+ const copyTokenButton = (
+
+ );
+
+ return isPlayground ? (
+
+ {copyTokenButton}
+
+ ) : (
+ copyTokenButton
+ );
+ })()}
+ {/* Spacer for signout button */}
+
+
+
+ )}
+
+ {showCopyAlert && (
+
+ )}
+ >
+ );
+};
diff --git a/ui-next/src/components/Sidebar/SidebarHeader.tsx b/ui-next/src/components/Sidebar/SidebarHeader.tsx
new file mode 100644
index 0000000000..a4b33b7828
--- /dev/null
+++ b/ui-next/src/components/Sidebar/SidebarHeader.tsx
@@ -0,0 +1,105 @@
+import CloseIcon from "@mui/icons-material/Close";
+import SearchIcon from "@mui/icons-material/Search";
+import { Box, IconButton, Typography } from "@mui/material";
+import { useMemo } from "react";
+import { Key } from "ts-key-enum";
+import { ClosedLogo } from "./ClosedLogo";
+import { OpenedLogo } from "./OpenedLogo";
+import { SidebarItem } from "./SidebarItem";
+import { MenuItemType } from "./types";
+
+interface SidebarHeaderProps {
+ open: boolean;
+ isMobile: boolean;
+ customLogo?: string;
+ toggleMenu?: () => void;
+ onSearchClick?: () => void;
+}
+
+export const SidebarHeader = ({
+ open,
+ isMobile,
+ customLogo,
+ toggleMenu,
+ onSearchClick,
+}: SidebarHeaderProps) => {
+ // Create search item for SidebarItem component
+ const searchItem: MenuItemType = useMemo(
+ () => ({
+ id: "searchItem",
+ title: "Search",
+ icon: ,
+ shortcuts: ["⌘", "K"],
+ hotkeys: `${Key.Meta} + K`,
+ handler: onSearchClick,
+ hidden: false,
+ }),
+ [onSearchClick],
+ );
+
+ return (
+
+ {/* Logo or MENU text */}
+ {isMobile ? (
+
+
+ MENU
+
+
+
+
+
+ ) : (
+ <>
+
+ {open ? (
+
+ ) : (
+
+ )}
+
+ {/* Search item on new line */}
+ {onSearchClick && (
+
+
+
+ )}
+ >
+ )}
+
+ );
+};
diff --git a/ui-next/src/components/Sidebar/SidebarItem.tsx b/ui-next/src/components/Sidebar/SidebarItem.tsx
new file mode 100644
index 0000000000..615f4fa69d
--- /dev/null
+++ b/ui-next/src/components/Sidebar/SidebarItem.tsx
@@ -0,0 +1,435 @@
+import ChevronRightIcon from "@mui/icons-material/ChevronRight";
+import {
+ Box,
+ ClickAwayListener,
+ Collapse,
+ List,
+ ListItem,
+ ListItemButton,
+ ListItemIcon,
+ ListItemText,
+ Paper,
+ Popper,
+ alpha,
+ useTheme,
+} from "@mui/material";
+import React, {
+ ReactNode,
+ createElement,
+ useCallback,
+ useMemo,
+ useRef,
+ useState,
+} from "react";
+import { useHotkeys } from "react-hotkeys-hook";
+import { Link, matchPath, useLocation } from "react-router";
+import { colors } from "theme/tokens/variables";
+import { HOT_KEYS_SIDEBAR } from "utils/constants/common";
+import HotKeysButton from "./HotKeysButton";
+import { MenuItemType } from "./types";
+
+interface SidebarItemProps {
+ item: MenuItemType;
+ level?: number;
+ open?: boolean;
+ isActive?: boolean;
+ onItemClick?: (item: MenuItemType) => void;
+ hoveredMenuId?: string | null;
+ onMouseEnter?: () => void;
+ onMouseLeave?: () => void;
+ onPopoverMouseEnter?: () => void;
+ onPopoverMouseLeave?: () => void;
+ itemRef?: React.RefObject;
+}
+
+export const SidebarItem = ({
+ item,
+ level = 0,
+ open = true,
+ isActive = false,
+ onItemClick,
+ hoveredMenuId,
+ onMouseEnter,
+ onMouseLeave,
+ onPopoverMouseEnter,
+ onPopoverMouseLeave,
+ itemRef,
+}: SidebarItemProps) => {
+ const location = useLocation();
+ const theme = useTheme();
+
+ const hasChildren = item.items && item.items.length > 0;
+ const isRouteActive = useMemo(() => {
+ if (item.linkTo && location.pathname === item.linkTo) return true;
+ if (item.activeRoutes) {
+ return item.activeRoutes.some((route) =>
+ matchPath({ path: route, end: true }, location.pathname),
+ );
+ }
+ return false;
+ }, [item.linkTo, item.activeRoutes, location.pathname]);
+
+ const visibleChildren = useMemo(
+ () => item.items?.filter((child) => !child.hidden) || [],
+ [item.items],
+ );
+
+ // Auto-expand if any child is active
+ const hasActiveChild = useMemo(() => {
+ return visibleChildren.some((child) => {
+ if (child.linkTo && location.pathname === child.linkTo) return true;
+ if (child.activeRoutes) {
+ return child.activeRoutes.some((route) =>
+ matchPath({ path: route, end: true }, location.pathname),
+ );
+ }
+ return false;
+ });
+ }, [visibleChildren, location.pathname]);
+
+ // Initialize expanded state - all menus default expanded
+ const [isExpanded, setIsExpanded] = useState(true);
+
+ // Update expanded state when active child changes
+ const prevHasActiveChildRef = useRef(hasActiveChild);
+
+ if (hasActiveChild && !prevHasActiveChildRef.current && !isExpanded) {
+ setIsExpanded(true);
+ }
+ prevHasActiveChildRef.current = hasActiveChild;
+
+ // Parent items should show as active if any child is active
+ const active = Boolean(
+ isActive || isRouteActive || (hasChildren && hasActiveChild),
+ );
+ // Check if this is a parent with an active child (not directly active)
+ const isParentWithActiveChild =
+ hasChildren && hasActiveChild && !isRouteActive && !isActive;
+
+ const handleClick = useCallback(() => {
+ if (hasChildren) {
+ setIsExpanded((prev) => !prev);
+ }
+ if (onItemClick) {
+ onItemClick(item);
+ }
+ if (item.handler) {
+ item.handler();
+ }
+ }, [hasChildren, item, onItemClick]);
+
+ // Handle keyboard shortcuts
+ useHotkeys(
+ item.hotkeys || "",
+ (event) => {
+ if (!item.hotkeys || item.hotkeys.trim() === "") return;
+ event.preventDefault();
+ if (item.handler) {
+ item.handler();
+ } else if (item.linkTo && !hasChildren) {
+ window.location.href = item.linkTo;
+ }
+ },
+ {
+ scopes: HOT_KEYS_SIDEBAR,
+ enableOnFormTags: ["INPUT", "TEXTAREA", "SELECT"],
+ },
+ );
+
+ if (item.hidden) return null;
+
+ const isSearchItem = item.id === "searchItem";
+
+ // Generic badge: items can supply a useBadgeCount hook to show reactive counts.
+ // Enterprise plugins register items with useBadgeCount (e.g. for human task inbox).
+ // We call item.useBadgeCount if present, otherwise fall back to a no-op hook.
+ const badgeCount = (item.useBadgeCount ?? (() => 0))();
+ const showBadge = badgeCount > 0;
+
+ // Check if link should open in new tab (isOpenNewTab flag or absolute URL)
+ const isExternalLink =
+ item.isOpenNewTab ||
+ (item.linkTo &&
+ (item.linkTo.startsWith("//") ||
+ item.linkTo.startsWith("http://") ||
+ item.linkTo.startsWith("https://")));
+
+ const itemContent = (
+ 0 ? 32 : isSearchItem ? 24 : 32,
+ borderRadius: isSearchItem ? 8 : 1,
+ mx: open ? (isSearchItem ? 1.5 : 1) : 0.5,
+ mb: level > 0 ? 0.5 : isSearchItem ? 1.5 : 0.75,
+ mt: isSearchItem ? 1.5 : 0,
+ px: open ? (level > 0 ? 1.25 : isSearchItem ? 2 : 1.5) : 1,
+ py: level > 0 ? 0.75 : isSearchItem ? 1.25 : 1,
+ justifyContent: open ? "flex-start" : "center",
+ position: "relative",
+ transition: "all 0.2s ease-in-out",
+ backgroundColor: isSearchItem
+ ? alpha(theme.palette.action.hover, 0.05)
+ : isParentWithActiveChild
+ ? alpha(theme.palette.action.hover, 0.05)
+ : active
+ ? alpha(theme.palette.primary.main, 0.1)
+ : "transparent",
+ color: isSearchItem
+ ? alpha(theme.palette.text.primary, 0.8)
+ : isParentWithActiveChild
+ ? theme.palette.text.primary
+ : active
+ ? theme.palette.primary.main
+ : alpha(theme.palette.text.primary, 0.7),
+ boxShadow: isSearchItem
+ ? `0 1px 2px ${alpha(theme.palette.common.black, 0.05)}`
+ : "none",
+ "&:hover": {
+ backgroundColor: isSearchItem
+ ? alpha(theme.palette.action.hover, 0.08)
+ : isParentWithActiveChild
+ ? alpha(theme.palette.action.hover, 0.08)
+ : active
+ ? alpha(theme.palette.primary.main, 0.15)
+ : alpha(theme.palette.action.hover, 0.05),
+ borderColor: isSearchItem
+ ? alpha(theme.palette.divider, 0.5)
+ : "transparent",
+ boxShadow: isSearchItem
+ ? `0 2px 4px ${alpha(theme.palette.common.black, 0.08)}`
+ : "none",
+ color: isSearchItem
+ ? theme.palette.text.primary
+ : isParentWithActiveChild
+ ? theme.palette.text.primary
+ : active
+ ? theme.palette.primary.main
+ : theme.palette.text.primary,
+ },
+ ...(level > 0 &&
+ open && {
+ ml: 2,
+ pl: 2,
+ fontSize: "0.8125rem",
+ }),
+ }}
+ >
+ {item.icon && (
+ 0 ? 28 : isSearchItem ? 40 : 28) : "auto",
+ justifyContent: open ? "flex-start" : "center",
+ color: "inherit",
+ marginRight: open && level === 0 && !isSearchItem ? 0.5 : 0,
+ "& svg": {
+ fontSize: level > 0 ? 16 : isSearchItem ? 22 : 20,
+ },
+ }}
+ >
+ {item.icon}
+
+ )}
+ {open && (
+ <>
+
+ {item.title}
+
+ {badgeCount}
+
+
+ ) : (
+ item.title
+ )
+ }
+ primaryTypographyProps={{
+ fontSize:
+ level > 0
+ ? "0.8125rem"
+ : isSearchItem
+ ? "0.9375rem"
+ : "0.9375rem",
+ fontWeight: isSearchItem ? 600 : active ? 600 : 500,
+ sx: {
+ transition: "font-weight 0.2s ease-in-out",
+ lineHeight: level > 0 ? 1.3 : 1.5,
+ },
+ }}
+ />
+ {item.shortcuts && item.shortcuts.length > 0 && (
+
+ )}
+ {hasChildren && (
+
+ )}
+ >
+ )}
+
+ );
+
+ // If item has a custom component, render it but still show children if it has them
+ const hasCustomComponent =
+ item.component && typeof item.component !== "function";
+ const hasCustomComponentFunction =
+ item.component && typeof item.component === "function";
+
+ const isHovered = hoveredMenuId === item.id;
+ const showPopper =
+ !open &&
+ hasChildren &&
+ level === 0 &&
+ isHovered &&
+ !hasCustomComponent &&
+ !hasCustomComponentFunction;
+
+ return (
+ <>
+ {hasCustomComponentFunction && typeof item.component === "function" ? (
+ <>
+ {createElement(item.component, {
+ isParent: Boolean(hasChildren),
+ isTopParent: level === 0,
+ isRouteActive: isRouteActive,
+ isTopParentActive: level === 0 && isRouteActive,
+ active: active,
+ maybeActiveStyles: {},
+ icon: item.icon,
+ })}
+ >
+ ) : hasCustomComponent ? (
+ {item.component as ReactNode}
+ ) : (
+ }
+ disablePadding
+ sx={{ display: "block", position: "relative" }}
+ >
+ {itemContent}
+
+ )}
+ {hasChildren && open && (
+
+
+ {visibleChildren.map((child) => (
+
+
+
+ ))}
+
+
+ )}
+ {showPopper && itemRef?.current && (
+ {})}>
+
+
+
+ {visibleChildren.map((child) => (
+
+
+
+ ))}
+
+
+
+
+ )}
+ >
+ );
+};
diff --git a/ui-next/src/components/Sidebar/SidebarMenu.tsx b/ui-next/src/components/Sidebar/SidebarMenu.tsx
new file mode 100644
index 0000000000..dd5a45f1ca
--- /dev/null
+++ b/ui-next/src/components/Sidebar/SidebarMenu.tsx
@@ -0,0 +1,137 @@
+import { Box, List, Tooltip, alpha, useTheme } from "@mui/material";
+import { ReactNode, RefObject } from "react";
+import { Auth0User } from "types/User";
+import { SidebarItem } from "./SidebarItem";
+import { SidebarFooter } from "./SidebarFooter";
+import { MenuItemType } from "./types";
+
+interface SidebarMenuProps {
+ sections: MenuItemType[];
+ open: boolean;
+ hoveredMenuId: string | null;
+ getItemRef: (itemId: string) => RefObject;
+ handleMouseEnter: (itemId: string) => () => void;
+ handleMouseLeave: () => void;
+ handlePopoverMouseEnter: () => void;
+ handlePopoverMouseLeave: () => void;
+ // Footer props
+ isAuthenticated: boolean;
+ isMobile: boolean;
+ user: Auth0User | null;
+ conductorUser: { id: string } | null;
+ logOut?: () => void;
+ conductorVersion: string;
+ uiVersion: string;
+ showCopyAlert: boolean;
+ setShowCopyAlert: (show: boolean) => void;
+ /** When provided (e.g. by enterprise), used for the user block so auth comes from host app; version block still shown. */
+ customUserBlock?: ReactNode;
+}
+
+export const SidebarMenu = ({
+ sections,
+ open,
+ hoveredMenuId,
+ getItemRef,
+ handleMouseEnter,
+ handleMouseLeave,
+ handlePopoverMouseEnter,
+ handlePopoverMouseLeave,
+ isAuthenticated,
+ isMobile,
+ user,
+ conductorUser,
+ logOut,
+ conductorVersion,
+ uiVersion,
+ showCopyAlert,
+ setShowCopyAlert,
+ customUserBlock,
+}: SidebarMenuProps) => {
+ const theme = useTheme();
+
+ return (
+
+
+ {sections.map((item) => {
+ const hasChildren = item.items && item.items.length > 0;
+ const itemRef = hasChildren ? getItemRef(item.id) : undefined;
+
+ return (
+
+ {open ? (
+
+ ) : (
+
+
+
+
+
+ )}
+
+ );
+ })}
+
+
+
+ );
+};
diff --git a/ui-next/src/components/Sidebar/SidebarToggleButton.tsx b/ui-next/src/components/Sidebar/SidebarToggleButton.tsx
new file mode 100644
index 0000000000..ee76e0dc25
--- /dev/null
+++ b/ui-next/src/components/Sidebar/SidebarToggleButton.tsx
@@ -0,0 +1,54 @@
+import ChevronLeftIcon from "@mui/icons-material/ChevronLeft";
+import ChevronRightIcon from "@mui/icons-material/ChevronRight";
+import { IconButton, Tooltip, alpha, useTheme } from "@mui/material";
+import { drawerWidthClose, drawerWidthOpen } from "./constants";
+
+interface SidebarToggleButtonProps {
+ open: boolean;
+ isMobile: boolean;
+ topMargin: string;
+ onToggle: () => void;
+}
+
+export const SidebarToggleButton = ({
+ open,
+ isMobile,
+ topMargin,
+ onToggle,
+}: SidebarToggleButtonProps) => {
+ const theme = useTheme();
+
+ if (isMobile) return null;
+
+ return (
+
+
+ {open ? : }
+
+
+ );
+};
diff --git a/ui-next/src/components/Sidebar/SidebarVersionBlock.tsx b/ui-next/src/components/Sidebar/SidebarVersionBlock.tsx
new file mode 100644
index 0000000000..27f38911e2
--- /dev/null
+++ b/ui-next/src/components/Sidebar/SidebarVersionBlock.tsx
@@ -0,0 +1,89 @@
+import { Box, Typography, useTheme } from "@mui/material";
+import { alpha } from "@mui/material/styles";
+import ClipboardCopy from "components/ClipboardCopy";
+import { colors } from "theme/tokens/variables";
+import { FEATURES, featureFlags } from "utils";
+
+const isPlayground = featureFlags.isEnabled(FEATURES.PLAYGROUND);
+
+interface SidebarVersionBlockProps {
+ open: boolean;
+ conductorVersion: string;
+ uiVersion: string;
+}
+
+/**
+ * Shared version block for the sidebar footer (logo, version copy, copyright).
+ * Used by SidebarFooter and by SidebarMenu when rendering a custom userFooter.
+ */
+export function SidebarVersionBlock({
+ open,
+ conductorVersion,
+ uiVersion,
+}: SidebarVersionBlockProps) {
+ const theme = useTheme();
+
+ return (
+
+
+
+
+
+ {!isPlayground && (
+
+
+ Orkes Platform Version
+
+
+
+
+ {`${conductorVersion} | ${uiVersion}`}
+
+
+
+ )}
+
+
+ © Orkes Inc | All rights reserved
+
+
+ );
+}
diff --git a/ui-next/src/components/Sidebar/SubMenu.tsx b/ui-next/src/components/Sidebar/SubMenu.tsx
new file mode 100644
index 0000000000..258999a45e
--- /dev/null
+++ b/ui-next/src/components/Sidebar/SubMenu.tsx
@@ -0,0 +1,88 @@
+import ClickAwayListener from "@mui/material/ClickAwayListener";
+import ListItem from "@mui/material/ListItem";
+import Popper from "@mui/material/Popper";
+import Paper from "components/Paper";
+import { useCallback, useContext, useRef } from "react";
+import { matchPath } from "react-router";
+import { colors } from "theme/tokens/variables";
+import { BaseSubMenu } from "./BaseSubMenu";
+import { SidebarContext } from "./context/SidebarContext";
+import { SidebarItem } from "./SidebarItem";
+import { SubMenuProps } from "./types";
+
+export const SubMenu = (props: SubMenuProps) => {
+ const { open, openedMenus, setOpenedMenus, addMenu, location } =
+ useContext(SidebarContext);
+ const { id, items } = props;
+ const itemRef = useRef(null);
+
+ const handlePopperClose = useCallback(() => {
+ setOpenedMenus([]);
+ }, [setOpenedMenus]);
+
+ const handlePopperOpen = useCallback(() => {
+ addMenu(id);
+ }, [id, addMenu]);
+
+ const isPopperOpen = openedMenus.includes(id);
+ const isActive = items.some(
+ (item) =>
+ item.linkTo === location?.pathname ||
+ !!item.activeRoutes?.some((route) =>
+ matchPath({ path: route, end: true }, location?.pathname || ""),
+ ),
+ );
+
+ // Extract item from props (excluding items and parentId which are SubMenu-specific)
+ const { items: _, parentId: _parentId, ...item } = props;
+
+ return (
+ <>
+
+ {open ? (
+
+
+
+ ) : (
+
+
+
+
+
+
+
+ )}
+ >
+ );
+};
+
+export default SubMenu;
diff --git a/ui-next/src/components/Sidebar/UiSidebar.tsx b/ui-next/src/components/Sidebar/UiSidebar.tsx
new file mode 100644
index 0000000000..a569db3cd8
--- /dev/null
+++ b/ui-next/src/components/Sidebar/UiSidebar.tsx
@@ -0,0 +1,203 @@
+/**
+ * UiSidebar - Main sidebar component for Conductor UI
+ *
+ * This component defines the core (OSS) sidebar menu items and merges in
+ * any additional items registered by plugins (enterprise features).
+ *
+ * Core OSS items:
+ * - Executions submenu (Workflow, Queue Monitor)
+ * - Run Workflow button
+ * - Definitions submenu (Workflow, Task, Event Handler)
+ * - API Docs
+ * - Help menu
+ *
+ * Enterprise items are registered via plugins and merged at runtime.
+ */
+
+import { Sidebar } from "components/Sidebar";
+import { useAnnouncementBanner } from "components/v1/layout/header/bannerUtils";
+import { MenuItemType } from "components/Sidebar/types";
+import { pluginRegistry, SidebarItemRegistration } from "plugins/registry";
+import { FunctionComponent, useContext, useMemo } from "react";
+import { FEATURES, featureFlags } from "utils";
+import { SidebarContext } from "./context/SidebarContext";
+import { useAuth } from "../../shared/auth";
+import { getCoreSidebarItems } from "./sidebarCoreItems";
+
+const customLogo = featureFlags.getValue(FEATURES.CUSTOM_LOGO_URL);
+
+type UISidebarProps = {
+ apiVersion?: string;
+ releaseVersion?: string;
+};
+
+const POSITION_END = 99999;
+
+/** Resolve position for sorting: number as-is, "start" => 0, "end" or undefined => end. Always returns a number. */
+function sortPosition(position: SidebarItemRegistration["position"]): number {
+ if (position === "start") return 0;
+ if (position === "end" || position === undefined) return POSITION_END;
+ return Number(position);
+}
+
+/**
+ * Convert a plugin SidebarItemRegistration to the MenuItemType format used by the Sidebar component
+ */
+function pluginItemToMenuItem(item: SidebarItemRegistration): MenuItemType {
+ return {
+ id: item.id,
+ title: item.title,
+ icon: item.icon,
+ linkTo: item.linkTo,
+ activeRoutes: item.activeRoutes,
+ shortcuts: item.shortcuts || [],
+ hotkeys: item.hotkeys || "",
+ hidden: item.hidden ?? false,
+ isOpenNewTab: item.isOpenNewTab,
+ textStyle: item.textStyle,
+ buttonContainerStyle: item.buttonContainerStyle,
+ iconContainerStyles: item.iconContainerStyles,
+ handler: item.handler,
+ component: item.component,
+ position: Number(sortPosition(item.position)),
+ items: item.items?.map(pluginItemToMenuItem),
+ useBadgeCount: item.useBadgeCount,
+ };
+}
+
+/** Sort items by position (undefined last). Uses Number() so comparison is always numeric. */
+function sortItemsByPosition(items: MenuItemType[]): MenuItemType[] {
+ return [...items].sort(
+ (a, b) =>
+ Number(a.position ?? POSITION_END) - Number(b.position ?? POSITION_END),
+ );
+}
+
+/** Recursively sort each level by position. */
+function sortMenuByPosition(items: MenuItemType[]): MenuItemType[] {
+ return sortItemsByPosition(
+ items.map((item) =>
+ item.items?.length
+ ? { ...item, items: sortMenuByPosition(item.items) }
+ : item,
+ ),
+ );
+}
+
+/**
+ * Merge plugin-registered sidebar items into the core menu structure.
+ *
+ * Plugin items can:
+ * 1. Target a specific submenu (executionsSubMenu, definitionsSubMenu, etc.) to add items to it
+ * 2. Target "root" to add a new top-level menu item
+ *
+ * Items are inserted based on their position hint (start, end, or numeric index).
+ */
+function mergePluginSidebarItems(
+ coreItems: MenuItemType[],
+ pluginItems: SidebarItemRegistration[],
+): MenuItemType[] {
+ // Clone core items to avoid mutation; explicitly preserve position for sort
+ const result: MenuItemType[] = coreItems.map((item) => {
+ const cloned: MenuItemType = { ...item, position: item.position };
+ if (item.items) {
+ cloned.items = [...item.items];
+ }
+ return cloned;
+ });
+
+ // Group plugin items by target menu
+ const itemsByTarget = new Map();
+ for (const item of pluginItems) {
+ const target = item.targetMenu;
+ if (!itemsByTarget.has(target)) {
+ itemsByTarget.set(target, []);
+ }
+ itemsByTarget.get(target)!.push(item);
+ }
+
+ // Sort items within each target by position
+ for (const items of itemsByTarget.values()) {
+ items.sort((a, b) => {
+ const posA = a.position ?? "end";
+ const posB = b.position ?? "end";
+
+ if (posA === "start" && posB !== "start") return -1;
+ if (posB === "start" && posA !== "start") return 1;
+ if (posA === "end" && posB !== "end") return 1;
+ if (posB === "end" && posA !== "end") return -1;
+
+ if (typeof posA === "number" && typeof posB === "number") {
+ return posA - posB;
+ }
+
+ return 0;
+ });
+ }
+
+ // Insert plugin items; final order is determined by sortMenuByPosition (position 10, 15, 20, ...)
+ for (const [targetId, items] of itemsByTarget.entries()) {
+ for (const item of items) {
+ const menuItem = pluginItemToMenuItem(item);
+ if (targetId === "root") {
+ result.push(menuItem);
+ } else {
+ const targetMenu = result.find((i) => i.id === targetId);
+ if (targetMenu && targetMenu.items) {
+ targetMenu.items.push(menuItem);
+ }
+ }
+ }
+ }
+
+ return sortMenuByPosition(result);
+}
+
+export const UISidebar: FunctionComponent = ({
+ apiVersion,
+ releaseVersion,
+}) => {
+ const {
+ open,
+ setSearchModal,
+ toggleMenu,
+ isMobile,
+ isBannerOpen,
+ showAiStudioBanner,
+ } = useContext(SidebarContext);
+
+ const { isTrialExpired, trialExpiryDate, isAnnouncementBannerDismissed } =
+ useAuth();
+ const { showBanner } = useAnnouncementBanner(
+ isTrialExpired,
+ trialExpiryDate!,
+ isAnnouncementBannerDismissed,
+ );
+
+ // Get plugin-registered sidebar items
+ const pluginSidebarItems = useMemo(
+ () => pluginRegistry.getSidebarItems(),
+ [],
+ );
+
+ const menuItems = useMemo(() => {
+ const coreItems = getCoreSidebarItems(open);
+ return mergePluginSidebarItems(coreItems, pluginSidebarItems);
+ }, [open, pluginSidebarItems]);
+
+ return (
+ setSearchModal(true)}
+ />
+ );
+};
diff --git a/ui-next/src/components/Sidebar/UserInfo.tsx b/ui-next/src/components/Sidebar/UserInfo.tsx
new file mode 100644
index 0000000000..8ae0bedeb5
--- /dev/null
+++ b/ui-next/src/components/Sidebar/UserInfo.tsx
@@ -0,0 +1,107 @@
+import { LogoutOutlined } from "@mui/icons-material";
+import { Avatar, Box, Typography, Tooltip } from "@mui/material";
+import { useAuth } from "shared/auth";
+import { useCallback, useState } from "react";
+import { colors } from "theme/tokens/variables";
+import TokenIcon from "images/svg/token.svg";
+import { SnackbarMessage } from "components/SnackbarMessage";
+import { Auth0User } from "types/User";
+import { featureFlags, FEATURES } from "utils/flags";
+import { getAccessToken } from "shared/auth/tokenManagerJotai";
+
+const isPlayground = featureFlags.isEnabled(FEATURES.PLAYGROUND);
+
+const UserInfo = () => {
+ const { user, logOut, conductorUser, isAuthenticated } = useAuth(); // Todo this should not be here since its in v1
+ const [showCopyAlert, setShowCopyAlert] = useState(false);
+
+ const handleLogout = useCallback(() => {
+ if (logOut) {
+ logOut();
+ }
+ }, [logOut]);
+
+ const copyTokenButton = isAuthenticated ? (
+ {
+ setShowCopyAlert(true);
+ const accessToken = getAccessToken();
+ if (accessToken) {
+ navigator.clipboard.writeText(accessToken);
+ }
+ }}
+ sx={{
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "center",
+ my: 4,
+ gap: 1,
+ color: colors.black,
+ cursor: "pointer",
+ fontSize: "10px",
+ }}
+ >
+
+ Copy Token
+
+ ) : (
+
+ );
+
+ return (
+
+ {showCopyAlert && (
+
+ );
+};
+
+export default UserInfo;
diff --git a/ui-next/src/components/Sidebar/constants.ts b/ui-next/src/components/Sidebar/constants.ts
new file mode 100644
index 0000000000..f3087e5702
--- /dev/null
+++ b/ui-next/src/components/Sidebar/constants.ts
@@ -0,0 +1,2 @@
+export const drawerWidthOpen = 240;
+export const drawerWidthClose = 52;
diff --git a/ui-next/src/components/Sidebar/context/SidebarContext.tsx b/ui-next/src/components/Sidebar/context/SidebarContext.tsx
new file mode 100644
index 0000000000..bbb7321615
--- /dev/null
+++ b/ui-next/src/components/Sidebar/context/SidebarContext.tsx
@@ -0,0 +1,46 @@
+import { ReactNode, createContext } from "react";
+import { Location } from "react-router";
+import { PersistableSidebarEvent } from "shared/PersistableSidebar/state/types";
+import { ActorRef } from "xstate";
+
+export interface SidebarProviderProps {
+ children: ReactNode;
+}
+
+export interface SidebarContextState {
+ open: boolean;
+ isMobile: boolean;
+ setOpen?: (val: boolean) => void;
+ openedMenus: string[];
+ setOpenedMenus: (openMenus: string[]) => void;
+ addMenu: (id: string) => void;
+ removeMenu: (id: string) => void;
+ toggleMenu: () => void;
+ hideSideBar: boolean;
+ isSearchModalOpen: boolean;
+ setSearchModal: (val: boolean) => void;
+ isBannerOpen: boolean;
+ setBannerOpen: (val: boolean) => void;
+ location?: Location;
+ isStateless: boolean;
+ showAiStudioBanner?: boolean;
+ dismissAiStudioBanner?: () => void;
+ sidebarActor?: ActorRef;
+}
+
+export const SidebarContext = createContext({
+ isStateless: false, // If its controlled by a machine, then this is true
+ open: false,
+ isMobile: false,
+ setOpen: () => {},
+ openedMenus: [],
+ setOpenedMenus: () => {},
+ addMenu: () => {},
+ removeMenu: () => {},
+ toggleMenu: () => {},
+ hideSideBar: false,
+ isSearchModalOpen: false,
+ setSearchModal: () => {},
+ isBannerOpen: false,
+ setBannerOpen: () => {},
+});
diff --git a/ui-next/src/components/Sidebar/context/SidebarContextProvider.tsx b/ui-next/src/components/Sidebar/context/SidebarContextProvider.tsx
new file mode 100644
index 0000000000..4f0d08a09e
--- /dev/null
+++ b/ui-next/src/components/Sidebar/context/SidebarContextProvider.tsx
@@ -0,0 +1,201 @@
+import { ReactNode, useContext, useMemo, useState } from "react";
+
+import { Theme } from "@mui/material/styles";
+import useMediaQuery from "@mui/material/useMediaQuery";
+import { useSelector } from "@xstate/react";
+import {
+ SidebarContext,
+ SidebarProviderProps,
+} from "components/Sidebar/context/SidebarContext";
+import { useLocation } from "react-router";
+import { featureFlags, FEATURES } from "utils/flags";
+import { ActorRef, State } from "xstate";
+import { AuthContext } from "../../../shared/auth/context";
+import { useSidebarMenu } from "../../../shared/PersistableSidebar/state/hook";
+import { PersistableSidebarEvent } from "../../../shared/PersistableSidebar/state/types";
+import { AuthProviderMachineContext } from "../../../shared/state";
+import {
+ isAuthenticated as getIsAuthenticated,
+ noUserManagement as getIsNoUserManagement,
+ isSidebarInitialized,
+} from "../../../shared/state/selectors";
+
+const isPlayground = featureFlags.isEnabled(FEATURES.PLAYGROUND);
+const isAiStudioBannerFlagOn = featureFlags.isEnabled(
+ FEATURES.SHOW_AI_STUDIO_BANNER_FLAG,
+);
+const SidebarContextWrapper = ({
+ sidebarActor,
+ isMobile,
+ children,
+}: {
+ sidebarActor: ActorRef;
+ isMobile: boolean;
+ children: ReactNode;
+}) => {
+ const {
+ isSidebarExpanded,
+ location,
+ handleAnnouncementBanner,
+ openedMenus,
+ setOpenedMenus,
+ addMenu,
+ removeMenu,
+ toggleSidebar,
+ isSidebarHidden,
+ isSearchModalOpen,
+ handleSearchModal,
+ isBannerOpen,
+ } = useSidebarMenu(sidebarActor, isMobile);
+
+ const [isAiStudioBannerDismissed, setIsAiStudioBannerDismissed] = useState(
+ () => {
+ return localStorage.getItem("aiStudioBannerDismissed") !== null;
+ },
+ );
+
+ const showAiStudioBanner = useMemo(() => {
+ return isAiStudioBannerFlagOn && isPlayground && !isAiStudioBannerDismissed;
+ }, [isAiStudioBannerDismissed]);
+
+ const memoContextValue = useMemo(() => {
+ const dismissAiStudioBanner = () => {
+ localStorage.setItem("aiStudioBannerDismissed", Date.now().toString());
+ setIsAiStudioBannerDismissed(true);
+ };
+
+ return {
+ isStateless: false,
+ open: isSidebarExpanded,
+ openedMenus,
+ setOpenedMenus,
+ addMenu,
+ removeMenu,
+ isMobile,
+ toggleMenu: toggleSidebar,
+ hideSideBar: isSidebarHidden,
+ isSearchModalOpen,
+ setSearchModal: handleSearchModal,
+ isBannerOpen,
+ setBannerOpen: handleAnnouncementBanner,
+ location,
+ showAiStudioBanner: showAiStudioBanner,
+ dismissAiStudioBanner,
+ sidebarActor,
+ };
+ }, [
+ isSidebarExpanded,
+ openedMenus,
+ setOpenedMenus,
+ addMenu,
+ removeMenu,
+ isMobile,
+ toggleSidebar,
+ isSidebarHidden,
+ isSearchModalOpen,
+ handleSearchModal,
+ isBannerOpen,
+ handleAnnouncementBanner,
+ location,
+ showAiStudioBanner,
+ sidebarActor,
+ ]);
+
+ return (
+
+ {children}
+
+ );
+};
+
+// Inner component that uses useSelector (only rendered when authService is available)
+const SidebarProviderWithAuth = ({
+ children,
+ authService,
+ isMobile,
+ defaultContextValue,
+}: {
+ children: ReactNode;
+ authService: ActorRef;
+ isMobile: boolean;
+ defaultContextValue: any;
+}) => {
+ const isAuthenticated = useSelector(authService, getIsAuthenticated);
+ const noUserManagement = useSelector(authService, getIsNoUserManagement);
+
+ const isSideBarState = useSelector(authService, isSidebarInitialized);
+
+ const sidebarActor = useSelector(
+ authService,
+ (state: State) =>
+ state.children["sidebarMachine"],
+ );
+
+ const userManagementIsNotAvailable = noUserManagement && isSideBarState;
+
+ const withUserManagement = isAuthenticated && isSideBarState;
+
+ const withSidebarSupport =
+ isPlayground && authService?.getSnapshot().children["sidebarMachine"];
+
+ return userManagementIsNotAvailable ||
+ withUserManagement ||
+ withSidebarSupport ? (
+
+ {children}
+
+ ) : (
+
+ {children}
+
+ );
+};
+
+export const SidebarProvider = ({ children }: SidebarProviderProps) => {
+ const { authService } = useContext(AuthContext);
+
+ const isMobile = useMediaQuery((theme: Theme) =>
+ theme.breakpoints.down("sm"),
+ );
+ const location = useLocation();
+
+ // Default context value for when authService is not available or not ready
+ const defaultContextValue = useMemo(() => {
+ return {
+ isStateless: true,
+ open: true,
+ openedMenus: ["helpMenu"],
+ setOpenedMenus: () => {},
+ addMenu: () => {},
+ removeMenu: () => {},
+ isMobile,
+ toggleMenu: () => {},
+ hideSideBar: location.pathname === "/integrations/addIntegration",
+ isSearchModalOpen: false,
+ setSearchModal: () => {},
+ isBannerOpen: true,
+ setBannerOpen: () => {},
+ dismissAiStudioBanner: () => {},
+ };
+ }, [isMobile, location.pathname]);
+
+ // If authService is not available, use default context
+ if (!authService) {
+ return (
+
+ {children}
+
+ );
+ }
+
+ // authService is available, render the inner component with selectors
+ return (
+
+ {children}
+
+ );
+};
diff --git a/ui-next/src/components/Sidebar/createSidebar.ts b/ui-next/src/components/Sidebar/createSidebar.ts
new file mode 100644
index 0000000000..44a454fd89
--- /dev/null
+++ b/ui-next/src/components/Sidebar/createSidebar.ts
@@ -0,0 +1,186 @@
+/**
+ * Simple sidebar model: items are ordered by id/label; extensions merge via before/after.
+ *
+ * - SidebarItem: minimal tree node (id, label, optional children).
+ * - SidebarMenuExtension: item to insert with optional before/after anchor.
+ * - createSidebar(base, extensions): returns merged tree with extensions inserted.
+ */
+
+import type { SidebarItemRegistration } from "plugins/registry/types";
+import type { SidebarMenuTarget } from "plugins/registry/types";
+
+export type SidebarItem = {
+ id: string;
+ label: string;
+ children?: SidebarItem[];
+};
+
+export type SidebarMenuExtension = {
+ id: string;
+ label: string;
+ before?: string;
+ after?: string;
+ children?: SidebarMenuExtension[];
+};
+
+/** Base OSS sidebar tree (id + label only) used for ordering. Matches core menu structure. */
+export const baseSidebar: SidebarItem[] = [
+ {
+ id: "executionsSubMenu",
+ label: "Executions",
+ children: [
+ { id: "workflowExeItem", label: "Workflow" },
+ { id: "queueMonitorItem", label: "Queue Monitor" },
+ ],
+ },
+ { id: "runWorkflow", label: "Run Workflow" },
+ {
+ id: "definitionsSubMenu",
+ label: "Definitions",
+ children: [
+ { id: "workflowDefItem", label: "Workflow" },
+ { id: "taskDefItem", label: "Task" },
+ { id: "eventHandlerDefItem", label: "Event Handler" },
+ ],
+ },
+ {
+ id: "helpMenu",
+ label: "Help",
+ children: [
+ { id: "docsItem", label: "Docs" },
+ { id: "requestsItem", label: "Requests" },
+ { id: "supportItem", label: "Support" },
+ ],
+ },
+ { id: "swaggerItem", label: "API Docs" },
+];
+
+/** Collect ids in tree order (depth-first) for a given root. */
+function collectIds(items: SidebarItem[]): string[] {
+ const ids: string[] = [];
+ for (const item of items) {
+ ids.push(item.id);
+ if (item.children) ids.push(...collectIds(item.children));
+ }
+ return ids;
+}
+
+const rootOrder = collectIds(baseSidebar);
+const childOrderByParent = new Map();
+for (const item of baseSidebar) {
+ if (item.children) {
+ childOrderByParent.set(item.id, collectIds(item.children));
+ }
+}
+
+/**
+ * Map (targetMenu, position) from plugin API to before/after for createSidebar.
+ * Uses base sidebar order so position N means "after the (N-1)th item" or "before first" for 0.
+ */
+function positionToAnchor(
+ targetMenu: SidebarMenuTarget,
+ position: "start" | "end" | number | undefined,
+): { before?: string; after?: string } {
+ const order =
+ targetMenu === "root"
+ ? rootOrder
+ : (childOrderByParent.get(targetMenu) ?? []);
+ const pos = position ?? "end";
+
+ if (pos === "start" || (typeof pos === "number" && pos <= 0)) {
+ return order.length ? { before: order[0] } : {};
+ }
+ if (pos === "end") {
+ return order.length ? { after: order[order.length - 1] } : {};
+ }
+ const index = typeof pos === "number" ? pos : 0;
+ if (index <= 0) return order.length ? { before: order[0] } : {};
+ const afterIndex = Math.min(index - 1, order.length - 1);
+ return { after: order[afterIndex] };
+}
+
+/**
+ * Convert a plugin SidebarItemRegistration to SidebarMenuExtension (before/after).
+ * Preserves nested items (e.g. adminSubMenu with children).
+ */
+export function registrationToExtension(
+ reg: SidebarItemRegistration,
+): SidebarMenuExtension {
+ const anchor = positionToAnchor(reg.targetMenu, reg.position);
+ return {
+ id: reg.id,
+ label: reg.title,
+ ...anchor,
+ children: reg.items?.map(registrationToExtension),
+ };
+}
+
+/**
+ * Find the parent array and index of the node with the given id (depth-first search).
+ * Returns null if not found.
+ */
+function findInTree(
+ root: SidebarItem[],
+ id: string,
+): { array: SidebarItem[]; index: number } | null {
+ for (let i = 0; i < root.length; i++) {
+ if (root[i].id === id) {
+ return { array: root, index: i };
+ }
+ if (root[i].children) {
+ const found = findInTree(root[i].children!, id);
+ if (found) return found;
+ }
+ }
+ return null;
+}
+
+function extensionToItem(ext: SidebarMenuExtension): SidebarItem {
+ return {
+ id: ext.id,
+ label: ext.label,
+ children: ext.children?.map(extensionToItem),
+ };
+}
+
+function cloneTree(items: SidebarItem[]): SidebarItem[] {
+ return items.map((item) => ({
+ ...item,
+ children: item.children ? cloneTree(item.children) : undefined,
+ }));
+}
+
+/**
+ * Merge extensions into the base sidebar tree using before/after anchors.
+ * Each extension is inserted after the node with id === ext.after, or before the node with id === ext.before, or appended if neither is set.
+ */
+export function createSidebar(
+ base: SidebarItem[],
+ extensions: SidebarMenuExtension[] = [],
+): SidebarItem[] {
+ const result = cloneTree(base);
+
+ for (const ext of extensions) {
+ const item = extensionToItem(ext);
+
+ if (ext.after !== undefined) {
+ const found = findInTree(result, ext.after);
+ if (found) {
+ found.array.splice(found.index + 1, 0, item);
+ } else {
+ result.push(item);
+ }
+ } else if (ext.before !== undefined) {
+ const found = findInTree(result, ext.before);
+ if (found) {
+ found.array.splice(found.index, 0, item);
+ } else {
+ result.push(item);
+ }
+ } else {
+ result.push(item);
+ }
+ }
+
+ return result;
+}
diff --git a/ui-next/src/components/Sidebar/hooks/usePendingTasksCount.ts b/ui-next/src/components/Sidebar/hooks/usePendingTasksCount.ts
new file mode 100644
index 0000000000..adaabe2fd1
--- /dev/null
+++ b/ui-next/src/components/Sidebar/hooks/usePendingTasksCount.ts
@@ -0,0 +1,7 @@
+/**
+ * Returns the number of pending tasks to display as a badge on sidebar items.
+ *
+ * In OSS builds this always returns 0. Enterprise plugins supply their own
+ * badge counts via the `badgeCount` field on SidebarItemRegistration.
+ */
+export const usePendingTasksCount = (): number => 0;
diff --git a/ui-next/src/components/Sidebar/hooks/useSidebarHover.ts b/ui-next/src/components/Sidebar/hooks/useSidebarHover.ts
new file mode 100644
index 0000000000..ef870d379f
--- /dev/null
+++ b/ui-next/src/components/Sidebar/hooks/useSidebarHover.ts
@@ -0,0 +1,78 @@
+import { RefObject, useCallback, useEffect, useRef, useState } from "react";
+
+export const useSidebarHover = () => {
+ // Track which menu item is hovered (for showing sub items in popper when collapsed)
+ const [hoveredMenuId, setHoveredMenuId] = useState(null);
+
+ // Timeout ref for delayed closing
+ const closeTimeoutRef = useRef | null>(null);
+
+ // Refs for menu items to anchor poppers
+ const menuItemRefs = useRef>>(
+ {},
+ );
+
+ const getItemRef = useCallback((itemId: string) => {
+ if (!menuItemRefs.current[itemId]) {
+ menuItemRefs.current[itemId] = { current: null };
+ }
+ return menuItemRefs.current[itemId];
+ }, []);
+
+ const handleMouseEnter = useCallback((itemId: string) => {
+ return () => {
+ // Clear any pending close timeout
+ if (closeTimeoutRef.current) {
+ clearTimeout(closeTimeoutRef.current);
+ closeTimeoutRef.current = null;
+ }
+ setHoveredMenuId(itemId);
+ };
+ }, []);
+
+ const handleMouseLeave = useCallback(() => {
+ // Add a small delay before closing to allow mouse to move to popover
+ if (closeTimeoutRef.current) {
+ clearTimeout(closeTimeoutRef.current);
+ }
+ closeTimeoutRef.current = setTimeout(() => {
+ setHoveredMenuId(null);
+ closeTimeoutRef.current = null;
+ }, 100);
+ }, []);
+
+ const handlePopoverMouseEnter = useCallback(() => {
+ // Clear close timeout when mouse enters popover
+ if (closeTimeoutRef.current) {
+ clearTimeout(closeTimeoutRef.current);
+ closeTimeoutRef.current = null;
+ }
+ }, []);
+
+ const handlePopoverMouseLeave = useCallback(() => {
+ // Close immediately when leaving popover
+ if (closeTimeoutRef.current) {
+ clearTimeout(closeTimeoutRef.current);
+ closeTimeoutRef.current = null;
+ }
+ setHoveredMenuId(null);
+ }, []);
+
+ // Cleanup timeout on unmount
+ useEffect(() => {
+ return () => {
+ if (closeTimeoutRef.current) {
+ clearTimeout(closeTimeoutRef.current);
+ }
+ };
+ }, []);
+
+ return {
+ hoveredMenuId,
+ getItemRef,
+ handleMouseEnter,
+ handleMouseLeave,
+ handlePopoverMouseEnter,
+ handlePopoverMouseLeave,
+ };
+};
diff --git a/ui-next/src/components/Sidebar/index.ts b/ui-next/src/components/Sidebar/index.ts
new file mode 100644
index 0000000000..0bd9280a20
--- /dev/null
+++ b/ui-next/src/components/Sidebar/index.ts
@@ -0,0 +1,4 @@
+export { Sidebar } from "./Sidebar";
+export { SidebarItem } from "./SidebarItem";
+export { SidebarFooter } from "./SidebarFooter";
+export { SubMenu } from "./SubMenu";
diff --git a/ui-next/src/components/Sidebar/sidebarCoreItems.tsx b/ui-next/src/components/Sidebar/sidebarCoreItems.tsx
new file mode 100644
index 0000000000..597fa2a402
--- /dev/null
+++ b/ui-next/src/components/Sidebar/sidebarCoreItems.tsx
@@ -0,0 +1,233 @@
+/**
+ * Core (OSS) sidebar menu items for Conductor UI.
+ *
+ * These items are merged with plugin-registered items in UiSidebar.
+ * - Executions submenu (Workflow, Queue Monitor)
+ * - Run Workflow button
+ * - Definitions submenu (Workflow, Task, Event Handler)
+ * - Help menu
+ * - API Docs
+ */
+
+import CodeIcon from "@mui/icons-material/Code";
+import PlayIcon from "@mui/icons-material/PlayArrowOutlined";
+import PlaylistPlayIcon from "@mui/icons-material/PlaylistPlay";
+import SupportIcon from "@mui/icons-material/Support";
+import WebhookOutlinedIcon from "@mui/icons-material/WebhookOutlined";
+import RunWorkflowButton from "components/Sidebar/RunWorkflowButton";
+import { MenuItemType } from "components/Sidebar/types";
+import { FEATURES, featureFlags } from "utils";
+import {
+ EVENT_HANDLERS_URL,
+ NEW_TASK_DEF_URL,
+ RUN_WORKFLOW_URL,
+ TASK_DEF_URL,
+ TASK_QUEUE_URL,
+ WORKFLOW_DEFINITION_URL,
+ WORKFLOW_EXECUTION_URL,
+} from "utils/constants/route";
+
+const isPlayground = featureFlags.isEnabled(FEATURES.PLAYGROUND);
+const hideFeedbackForm = !featureFlags.isEnabled(FEATURES.SHOW_FEEDBACK_FORM);
+
+/**
+ * Core sidebar position constants. Root and submenus both use 100, 200, 300, ...
+ * so plugins can inject items in between (e.g. position 150 between 100 and 200).
+ * Export for orkes-conductor-ui to reference when registering sidebar items.
+ */
+const CORE_SIDEBAR_POSITIONS = {
+ // Root level (top-level menu items)
+ ROOT: {
+ executionsSubMenu: 100,
+ runWorkflow: 200,
+ definitionsSubMenu: 300,
+ helpMenu: 400,
+ swaggerItem: 500,
+ },
+ // Executions submenu children
+ EXECUTIONS: {
+ workflowExeItem: 100,
+ queueMonitorItem: 200,
+ },
+ // Definitions submenu children
+ DEFINITIONS: {
+ workflowDefItem: 100,
+ taskDefItem: 200,
+ eventHandlerDefItem: 300,
+ },
+ // Help submenu children
+ HELP: {
+ docsItem: 100,
+ requestsItem: 200,
+ supportItem: 300,
+ },
+} as const;
+
+/**
+ * Returns the core OSS sidebar menu items. Accepts `open` for the Run Workflow
+ * button component which depends on sidebar open state.
+ * Each item has a numeric position so plugins can inject between (e.g. 150 between 100 and 200).
+ */
+export function getCoreSidebarItems(open: boolean): MenuItemType[] {
+ const R = CORE_SIDEBAR_POSITIONS.ROOT;
+ const E = CORE_SIDEBAR_POSITIONS.EXECUTIONS;
+ const D = CORE_SIDEBAR_POSITIONS.DEFINITIONS;
+ const H = CORE_SIDEBAR_POSITIONS.HELP;
+
+ return [
+ // Executions submenu - core items only
+ {
+ id: "executionsSubMenu",
+ title: "Executions",
+ icon: ,
+ linkTo: "",
+ shortcuts: [],
+ hotkeys: "",
+ hidden: false,
+ position: R.executionsSubMenu,
+ items: [
+ {
+ id: "workflowExeItem",
+ title: "Workflow",
+ icon: null,
+ linkTo: "/executions",
+ activeRoutes: [WORKFLOW_EXECUTION_URL.WF_ID_TASK_ID],
+ shortcuts: [],
+ hotkeys: "",
+ hidden: false,
+ position: E.workflowExeItem,
+ },
+ {
+ id: "queueMonitorItem",
+ title: "Queue Monitor",
+ icon: null,
+ linkTo: TASK_QUEUE_URL.BASE,
+ shortcuts: [],
+ hotkeys: "",
+ hidden: false,
+ position: E.queueMonitorItem,
+ },
+ ],
+ },
+ // Run Workflow button
+ {
+ id: "runWorkflow",
+ title: "Run Workflow",
+ icon: ,
+ linkTo: RUN_WORKFLOW_URL,
+ shortcuts: [],
+ hidden: true,
+ position: R.runWorkflow,
+ component: ,
+ },
+ // Definitions submenu - core items only
+ {
+ id: "definitionsSubMenu",
+ title: "Definitions",
+ icon: ,
+ linkTo: "",
+ shortcuts: [],
+ hotkeys: "",
+ hidden: false,
+ position: R.definitionsSubMenu,
+ items: [
+ {
+ id: "workflowDefItem",
+ title: "Workflow",
+ icon: null,
+ linkTo: WORKFLOW_DEFINITION_URL.BASE,
+ activeRoutes: [
+ WORKFLOW_DEFINITION_URL.NEW,
+ WORKFLOW_DEFINITION_URL.NAME_VERSION,
+ ],
+ shortcuts: [],
+ hotkeys: "",
+ hidden: false,
+ position: D.workflowDefItem,
+ },
+ {
+ id: "taskDefItem",
+ title: "Task",
+ icon: null,
+ linkTo: TASK_DEF_URL.BASE,
+ activeRoutes: [NEW_TASK_DEF_URL, TASK_DEF_URL.NAME],
+ shortcuts: [],
+ hotkeys: "",
+ hidden: false,
+ position: D.taskDefItem,
+ },
+ {
+ id: "eventHandlerDefItem",
+ title: "Event Handler",
+ icon: null,
+ linkTo: EVENT_HANDLERS_URL.BASE,
+ activeRoutes: [EVENT_HANDLERS_URL.NEW, EVENT_HANDLERS_URL.NAME],
+ shortcuts: [],
+ hotkeys: "",
+ hidden: false,
+ position: D.eventHandlerDefItem,
+ },
+ ],
+ },
+ // Help menu
+ {
+ id: "helpMenu",
+ title: "Help",
+ icon: ,
+ linkTo: "",
+ shortcuts: [],
+ hotkeys: "",
+ hidden: false,
+ position: R.helpMenu,
+ items: [
+ {
+ id: "docsItem",
+ title: "Docs",
+ icon: null,
+ linkTo: "https://orkes.io/content/",
+ shortcuts: [],
+ hotkeys: "",
+ hidden: false,
+ position: H.docsItem,
+ isOpenNewTab: true,
+ },
+ {
+ id: "requestsItem",
+ title: "Requests",
+ icon: null,
+ linkTo:
+ "https://orkes.io/orkes-cloud-free-trial?utm_source=playground",
+ shortcuts: [],
+ hotkeys: "",
+ hidden: hideFeedbackForm,
+ position: H.requestsItem,
+ isOpenNewTab: true,
+ },
+ {
+ id: "supportItem",
+ title: "Support",
+ icon: null,
+ linkTo: isPlayground
+ ? "https://community.orkes.io/ "
+ : "https://orkeshelp.zendesk.com/hc/en-us/requests/new",
+ shortcuts: [],
+ hotkeys: "",
+ hidden: false,
+ position: H.supportItem,
+ isOpenNewTab: true,
+ },
+ ],
+ },
+ // API Docs
+ {
+ id: "swaggerItem",
+ title: "API Docs",
+ icon: ,
+ linkTo: "/api-reference",
+ shortcuts: [],
+ hotkeys: "",
+ hidden: false,
+ position: R.swaggerItem,
+ },
+ ];
+}
diff --git a/ui-next/src/components/Sidebar/styles.ts b/ui-next/src/components/Sidebar/styles.ts
new file mode 100644
index 0000000000..3a31ee42ea
--- /dev/null
+++ b/ui-next/src/components/Sidebar/styles.ts
@@ -0,0 +1,57 @@
+import { colors } from "theme/tokens/variables";
+import { CSSObject } from "@mui/material/styles";
+
+export const hoveringStyle: CSSObject = {
+ color: colors.sidebarBlacky,
+ backgroundColor: colors.sidebarBarelyPastWhite,
+};
+
+export const listItemButtonBaseStyle: CSSObject = {
+ display: "flex",
+ px: 2.5,
+ py: 1,
+ borderRadius: "0px 22px 22px 0px",
+ transition: "background-color 0.3s ease-in-out",
+ ":hover": {
+ zIndex: 1,
+ },
+ ":focus-visible": {
+ outline: "none",
+ },
+};
+
+export const listItemIconBaseStyle: CSSObject = {
+ color: "inherit",
+ minWidth: 0,
+ justifyContent: "center",
+ pointerEvents: "none",
+};
+
+export const listItemTextBaseStyle: CSSObject = {
+ display: "flex",
+ alignItems: "center",
+ "& .MuiListItemText-primary": {
+ fontStyle: "normal",
+ fontWeight: 500,
+ },
+};
+
+export const contentBoxBaseStyle: CSSObject = {
+ display: "flex",
+ justifyContent: "space-between",
+ alignItems: "center",
+ width: "100%",
+};
+
+export const subItemTextActiveStyle = {
+ ".MuiListItemText-primary": {
+ color: colors.sidebarBlacky,
+ // backgroundColor: colors.sidebarBarelyPastWhite,
+ borderRadius: "0 22px 22px 0",
+ height: "100%",
+ display: "flex",
+ alignItems: "center",
+ marginLeft: "-11px",
+ paddingLeft: "11px",
+ },
+};
diff --git a/ui-next/src/components/Sidebar/types.ts b/ui-next/src/components/Sidebar/types.ts
new file mode 100644
index 0000000000..1848b02fc5
--- /dev/null
+++ b/ui-next/src/components/Sidebar/types.ts
@@ -0,0 +1,52 @@
+import { ReactNode, ComponentType } from "react";
+import { CSSObject } from "@mui/material/styles";
+
+export type MenuItemComponentType =
+ | ReactNode
+ | ComponentType<{
+ isParent: boolean;
+ isTopParent: boolean;
+ isRouteActive: boolean;
+ isTopParentActive: boolean;
+ active: boolean;
+ maybeActiveStyles: CSSObject;
+ icon?: ReactNode;
+ }>;
+
+export interface MenuItemType {
+ id: string;
+ title: string;
+ icon: ReactNode;
+ linkTo?: string;
+ activeRoutes?: string[];
+ shortcuts: string[];
+ hotkeys?: string;
+ items?: MenuItemType[];
+ isSmall?: boolean;
+ component?: MenuItemComponentType;
+ hidden: boolean;
+ isOpenNewTab?: boolean;
+ textStyle?: CSSObject;
+ buttonContainerStyle?: CSSObject;
+ iconContainerStyles?: CSSObject;
+ handler?: () => void;
+ /**
+ * Optional numeric position for ordering (e.g. 10, 20, 30). Gaps allow plugins to
+ * inject items in between (e.g. position 15 between 10 and 20).
+ */
+ position?: number;
+ /**
+ * Optional React hook that returns the current badge count for this item.
+ * When the returned value is > 0, a red badge with the count is shown next
+ * to the item title. Enterprise plugins use this to show pending task counts.
+ *
+ * Must follow React hook rules (called unconditionally in component render).
+ * Default: returns 0 (no badge).
+ */
+ useBadgeCount?: () => number;
+}
+
+export interface SubMenuProps extends MenuItemType {
+ items: MenuItemType[];
+ parentId?: string;
+}
diff --git a/ui-next/src/components/SnackbarMessage.tsx b/ui-next/src/components/SnackbarMessage.tsx
new file mode 100644
index 0000000000..70b7718838
--- /dev/null
+++ b/ui-next/src/components/SnackbarMessage.tsx
@@ -0,0 +1,63 @@
+import { Snackbar, SnackbarOrigin, SxProps } from "@mui/material";
+import MuiAlert from "components/MuiAlert";
+import { WarningCircle } from "@phosphor-icons/react";
+import { ReactNode } from "react";
+// How good is it to use lab components? https://material-ui.com/components/about-the-lab/
+
+const useStyles = {
+ customErrorColor: {
+ background: "#fdeded",
+ color: "#622524",
+ },
+ customWarningColor: {
+ backgroundColor: "#FBA404",
+ },
+};
+
+export const SnackbarMessage = ({
+ message,
+ onDismiss,
+ severity = "info",
+ sx = {},
+ anchorOrigin = { vertical: "top", horizontal: "center" },
+ autoHideDuration = 3000,
+ id,
+ action,
+}: {
+ message: string;
+ onDismiss?: () => void;
+ severity: "success" | "info" | "warning" | "error";
+ sx?: SxProps;
+ anchorOrigin?: SnackbarOrigin;
+ autoHideDuration?: number;
+ id?: string;
+ action?: ReactNode;
+}) => {
+ const open = !!message;
+
+ return (
+ onDismiss && onDismiss()}
+ open={open}
+ autoHideDuration={autoHideDuration}
+ sx={sx}
+ >
+ : ""}
+ variant="filled"
+ elevation={6}
+ onClose={() => onDismiss && onDismiss()}
+ severity={severity}
+ sx={severity === "error" ? useStyles.customErrorColor : undefined}
+ id={id}
+ style={
+ severity === "warning" ? useStyles.customWarningColor : undefined
+ }
+ action={action}
+ >
+ {message}
+
+
+ );
+};
diff --git a/ui-next/src/components/SplitButton.jsx b/ui-next/src/components/SplitButton.jsx
new file mode 100644
index 0000000000..51224530de
--- /dev/null
+++ b/ui-next/src/components/SplitButton.jsx
@@ -0,0 +1,83 @@
+import React from "react";
+import Grid from "@mui/material/Grid";
+import ButtonGroup from "@mui/material/ButtonGroup";
+import { CaretDown } from "@phosphor-icons/react";
+import ClickAwayListener from "@mui/material/ClickAwayListener";
+import Grow from "@mui/material/Grow";
+import Paper from "@mui/material/Paper";
+import Popper from "@mui/material/Popper";
+import MenuItem from "@mui/material/MenuItem";
+import MenuList from "@mui/material/MenuList";
+import Button from "components/MuiButton";
+
+export default function SplitButton({ children, options, onPrimaryClick }) {
+ const [open, setOpen] = React.useState(false);
+ const anchorRef = React.useRef(null);
+
+ const handleToggle = () => {
+ setOpen((prevOpen) => !prevOpen);
+ };
+
+ const handleClose = (event) => {
+ if (anchorRef.current && anchorRef.current.contains(event.target)) {
+ return;
+ }
+
+ setOpen(false);
+ };
+
+ return (
+
+
+
+
+
+
+
+ {({ TransitionProps, placement }) => (
+
+
+
+
+
+
+
+ )}
+
+
+
+ );
+}
diff --git a/ui-next/src/components/StackTrace.tsx b/ui-next/src/components/StackTrace.tsx
new file mode 100644
index 0000000000..1a17edf95b
--- /dev/null
+++ b/ui-next/src/components/StackTrace.tsx
@@ -0,0 +1,41 @@
+import React, { useState } from "react";
+
+export function StackTraceComponent({ stacktrace }: { stacktrace: string }) {
+ const lines = stacktrace.split("\n");
+ const head = lines.slice(0, 3);
+ const tail = lines.slice(3);
+
+ const [collapsed, setCollapsed] = useState(true);
+
+ const toggleCollapsed = () => {
+ setCollapsed(!collapsed);
+ };
+
+ const linkStyle = {
+ cursor: "pointer",
+ color: "#1976d2",
+ };
+
+ const tailElement = (
+
+ {tail.join("\n")}
+
+
+ );
+ const toggleElement = (
+ 3 ? "inherit" : "none", ...linkStyle }}
+ >
+ {collapsed ? `${tail.length} more lines` : `Hide ${tail.length} lines`}
+
+ );
+
+ return (
+
+ {head.join("\n")}
+
+ {tailElement} {toggleElement}
+
+ );
+}
diff --git a/ui-next/src/components/StatusBadge.tsx b/ui-next/src/components/StatusBadge.tsx
new file mode 100644
index 0000000000..891145da2c
--- /dev/null
+++ b/ui-next/src/components/StatusBadge.tsx
@@ -0,0 +1,38 @@
+import { FunctionComponent } from "react";
+import { TaskStatus } from "types/TaskStatus";
+import { HumanTaskState as TaskState } from "types/HumanTaskTypes";
+import { getChipStatusColor } from "utils/helpers";
+import { capitalizeFirstLetter } from "utils/utils";
+import TagChip from "./TagChip";
+
+export interface StatusBadgeProps {
+ status: TaskStatus | TaskState;
+ labelConcat?: string;
+}
+
+const StatusBadge: FunctionComponent = ({
+ status,
+ labelConcat = "",
+}) => {
+ const color = getChipStatusColor(status);
+ const chipStyles =
+ color == null
+ ? {}
+ : {
+ backgroundColor: color,
+ };
+ let formattedStatus = status ? status.toLowerCase() : "";
+ formattedStatus =
+ formattedStatus && formattedStatus.length > 0
+ ? capitalizeFirstLetter(formattedStatus)
+ : "";
+ return (
+
+ );
+};
+
+export default StatusBadge;
diff --git a/ui-next/src/components/StatusTagChip.tsx b/ui-next/src/components/StatusTagChip.tsx
new file mode 100644
index 0000000000..5590170f17
--- /dev/null
+++ b/ui-next/src/components/StatusTagChip.tsx
@@ -0,0 +1,35 @@
+import CancelOutlinedIcon from "@mui/icons-material/CancelOutlined";
+import { Chip } from "@mui/material";
+import { WorkflowExecutionStatus } from "types/Execution";
+import { TaskStatus } from "types/TaskStatus";
+import { getChipStatusColor } from "utils/helpers";
+import { capitalizeFirstLetter } from "utils/utils";
+
+export const renderStatusTagChip = (value: string[], getTagProps: any) =>
+ value.map((val: string | { label: string }, index) => {
+ const chipBackground =
+ getChipStatusColor(val as TaskStatus | WorkflowExecutionStatus) || {};
+ const renderableLabel: string =
+ typeof val === "string" || typeof val === "number" ? val : val.label;
+
+ const { key, ...otherTagProps } = getTagProps({ index });
+ return (
+ }
+ />
+ );
+ });
diff --git a/ui-next/src/components/StrikedText.tsx b/ui-next/src/components/StrikedText.tsx
new file mode 100644
index 0000000000..afab61e57e
--- /dev/null
+++ b/ui-next/src/components/StrikedText.tsx
@@ -0,0 +1,23 @@
+import { CSSProperties, ReactNode } from "react";
+import MuiTypography from "./MuiTypography";
+
+interface StrikedTextProps {
+ children: ReactNode;
+ sx?: CSSProperties;
+}
+
+const StrikedText = ({ children, sx, ...props }: StrikedTextProps) => {
+ const customStyles = {
+ textDecoration: "line-through",
+ letterSpacing: "1px",
+ ...sx,
+ };
+
+ return (
+
+ {children}
+
+ );
+};
+
+export default StrikedText;
diff --git a/ui-next/src/components/StringArrayFormField.tsx b/ui-next/src/components/StringArrayFormField.tsx
new file mode 100644
index 0000000000..f331239a46
--- /dev/null
+++ b/ui-next/src/components/StringArrayFormField.tsx
@@ -0,0 +1,92 @@
+import { Grid, IconButton } from "@mui/material";
+import { Trash as DeleteIcon, Plus } from "@phosphor-icons/react";
+import { Button, Input } from "components";
+import { ChangeEvent, FunctionComponent, useState } from "react";
+import { adjust, remove } from "utils";
+
+interface StringArrayFormFieldProps {
+ inputParameters: string[];
+ onChange: (newInputParams: string[]) => void;
+ someKey?: string;
+}
+
+export const StringArrayFormField: FunctionComponent<
+ StringArrayFormFieldProps
+> = ({ inputParameters = [], onChange, someKey = "" }) => {
+ const [newItemValue, setNewItemValue] = useState("");
+ const replaceItem = (newValue: string, index: number) => {
+ onChange(adjust(index, () => newValue, inputParameters));
+ };
+
+ const deleteItem = (idx: number) => {
+ onChange(remove(idx, 1, inputParameters));
+ };
+ const addItem = () => {
+ onChange(inputParameters.concat(newItemValue));
+ setNewItemValue("");
+ };
+
+ const handleFocus = (
+ e: ChangeEvent,
+ ) => {
+ e.target.select();
+ };
+
+ return (
+ <>
+ {inputParameters.map((value, index) => (
+
+
+ {
+ replaceItem(newValue, index);
+ }}
+ value={value}
+ autoFocus
+ onFocus={(
+ e: ChangeEvent,
+ ) => handleFocus(e)}
+ placeholder="e.g.: Cache-Control..."
+ sx={{ minWidth: "150px" }}
+ />
+
+
+
+ deleteItem(index)}>
+
+
+
+
+ ))}
+
+
+
+
+
+ >
+ );
+};
diff --git a/ui-next/src/components/SubjectSelector/SubjectMultiPicker.tsx b/ui-next/src/components/SubjectSelector/SubjectMultiPicker.tsx
new file mode 100644
index 0000000000..8d0feee3fc
--- /dev/null
+++ b/ui-next/src/components/SubjectSelector/SubjectMultiPicker.tsx
@@ -0,0 +1,106 @@
+import { Autocomplete, ListItem, ListItemText, Popper } from "@mui/material";
+import {
+ AppWindow as ApplicationIcon,
+ UsersThree as GroupIcon,
+ User as UserIcon,
+} from "@phosphor-icons/react";
+import TagChip from "components/TagChip";
+import ConductorInput from "components/v1/ConductorInput";
+import XCloseIcon from "components/v1/icons/XCloseIcon";
+import { CSSProperties, FunctionComponent } from "react";
+import { autocompleteStyle } from "shared/styles";
+import { SelectableOption } from "./types";
+
+interface SubjectMultiPickerProps {
+ multiple: boolean;
+ options: SelectableOption[];
+ onChange: (val: SelectableOption | SelectableOption[]) => void;
+ label: string;
+ value?: any;
+ required?: boolean;
+ growPopper?: boolean;
+}
+
+const ICON_SIZE = 16;
+
+export const SubjectMultiPicker: FunctionComponent = ({
+ multiple,
+ options,
+ onChange,
+ label,
+ value,
+ required = false,
+ growPopper,
+}) => {
+ const popperStyle = (style: CSSProperties | undefined) => {
+ return growPopper ? { maxWidth: "300px" } : style;
+ };
+ return (
+ (
+
+ )}
+ value={value}
+ isOptionEqualToValue={(option, value) => option.id === value.id}
+ multiple={multiple}
+ options={options as SelectableOption[]}
+ getOptionLabel={(option: any) => option?.display || ""}
+ freeSolo
+ renderTags={(value, getTagProps) =>
+ value.map((option: SelectableOption, index) => {
+ const { key, ...otherTagProps } = getTagProps({ index });
+ return (
+
+ ) : option.type === "group" ? (
+
+ ) : (
+
+ )
+ }
+ label={option.display}
+ {...otherTagProps}
+ />
+ );
+ })
+ }
+ filterSelectedOptions
+ onChange={(_event, newValue: any) => {
+ if (newValue !== value) {
+ onChange(newValue as SelectableOption | SelectableOption[]);
+ }
+ }}
+ onInputChange={(_event, newInputValue, reason) => {
+ // Only handle user input, not programmatic changes
+ if (reason === "input") {
+ const newOption = {
+ value: newInputValue,
+ id: newInputValue,
+ display: newInputValue,
+ } as SelectableOption;
+ if (newOption.value !== value?.value) {
+ onChange(newOption);
+ }
+ }
+ }}
+ renderOption={(props, option) => (
+
+
+
+ )}
+ renderInput={(params) => (
+
+ )}
+ sx={[autocompleteStyle({ value })]}
+ clearIcon={}
+ />
+ );
+};
diff --git a/ui-next/src/components/SubjectSelector/SubjectSelector.tsx b/ui-next/src/components/SubjectSelector/SubjectSelector.tsx
new file mode 100644
index 0000000000..17ab339510
--- /dev/null
+++ b/ui-next/src/components/SubjectSelector/SubjectSelector.tsx
@@ -0,0 +1,146 @@
+import { FunctionComponent, useMemo } from "react";
+import { SubjectMultiPicker } from "./SubjectMultiPicker";
+import { SelectableOption, SelectableOptionType } from "./types";
+import { AccessGroup, User } from "types";
+import { Application } from "types/Application";
+import { displayUserSubject } from "./helpers";
+
+type SubjectSelectorBaseParentProps = {
+ label?: string;
+ selectableUsers: User[];
+ selectableGroups: AccessGroup[];
+ selectableApplications: Application[];
+ growPopper?: boolean;
+};
+
+type SubjectSelectorMultipleBaseProps = SubjectSelectorBaseParentProps & {
+ multiple: true;
+ onChange: (value: SelectableOption | SelectableOption[]) => void;
+ selectedSubjectsValue: string[];
+};
+
+type SubjectSelectorSingleBaseProps = SubjectSelectorBaseParentProps & {
+ multiple: false;
+ onChange: (value: SelectableOption | SelectableOption[]) => void;
+ selectedSubjectsValue?: string;
+};
+
+export const SubjectSelectorBase: FunctionComponent<
+ SubjectSelectorMultipleBaseProps | SubjectSelectorSingleBaseProps
+> = ({
+ label,
+ selectableUsers,
+ selectableGroups,
+ selectableApplications,
+ onChange,
+ selectedSubjectsValue,
+ multiple,
+ growPopper,
+}) => {
+ const options = useMemo((): SelectableOption[] => {
+ return selectableUsers
+ .map(
+ (user: User): SelectableOption => ({
+ display: displayUserSubject(user),
+ id: user.id,
+ value: `${user.id}`,
+ type: SelectableOptionType.USER,
+ }),
+ )
+ .concat(
+ selectableGroups.map(
+ (group: AccessGroup): SelectableOption => ({
+ display: group.id,
+ id: group.id,
+ value: `${group.id}`,
+ type: SelectableOptionType.GROUP,
+ }),
+ ),
+ )
+ .concat(
+ selectableApplications.map(
+ (application: Application): SelectableOption => ({
+ display: application.name,
+ id: application.id,
+ value: `USER:app:${application.id}`,
+ type: SelectableOptionType.APPLICATION,
+ }),
+ ),
+ );
+ }, [selectableUsers, selectableGroups, selectableApplications]);
+
+ const value = useMemo((): SelectableOption[] | SelectableOption => {
+ if (multiple === false) {
+ const foundElement = options.find(
+ ({ value }) => value === selectedSubjectsValue,
+ );
+ if (foundElement) {
+ return foundElement;
+ }
+ // Support for free solo
+ return {
+ value: selectedSubjectsValue,
+ id: selectedSubjectsValue,
+ display: selectedSubjectsValue,
+ } as SelectableOption;
+ }
+
+ const [users, groups, applications] = Array.isArray(selectedSubjectsValue)
+ ? selectedSubjectsValue.reduce(
+ (
+ acc: [string[], string[], string[]],
+ c: string,
+ ): [string[], string[], string[]] => {
+ const [accUsers, accGroups, accApplications] = acc;
+ if (c.includes("USER:app:")) {
+ return [
+ accUsers,
+ accGroups,
+ accApplications.concat(c.replace(/^USER:app:/, "")),
+ ];
+ }
+ if (c.includes("CONDUCTOR_USER:")) {
+ return [
+ accUsers.concat(c.replace(/^CONDUCTOR_USER:/, "")),
+ accGroups,
+ accApplications,
+ ];
+ }
+ if (c.includes("CONDUCTOR_GROUP:")) {
+ return [
+ accUsers,
+ accGroups.concat(c.replace(/^CONDUCTOR_GROUP:/, "")),
+ accApplications,
+ ];
+ }
+ return acc;
+ },
+ [[], [], []],
+ )
+ : [[], [], []];
+
+ return options.filter(({ id, type }) => {
+ if (type === SelectableOptionType.USER) {
+ return users.includes(id);
+ }
+ if (type === SelectableOptionType.GROUP) {
+ return groups.includes(id);
+ }
+ if (type === SelectableOptionType.APPLICATION) {
+ return applications.includes(id);
+ }
+ throw new Error("Unexpected type: ", type);
+ });
+ }, [options, selectedSubjectsValue, multiple]);
+
+ return (
+
+ );
+};
diff --git a/ui-next/src/components/SubjectSelector/helpers.ts b/ui-next/src/components/SubjectSelector/helpers.ts
new file mode 100644
index 0000000000..1d61e4540e
--- /dev/null
+++ b/ui-next/src/components/SubjectSelector/helpers.ts
@@ -0,0 +1,4 @@
+import { User } from "types";
+
+export const displayUserSubject = (user: User): string =>
+ `${user.id} (${user.name})`;
diff --git a/ui-next/src/components/SubjectSelector/index.ts b/ui-next/src/components/SubjectSelector/index.ts
new file mode 100644
index 0000000000..e69310635e
--- /dev/null
+++ b/ui-next/src/components/SubjectSelector/index.ts
@@ -0,0 +1,4 @@
+export * from "./SubjectSelector";
+export * from "./SubjectMultiPicker";
+export * from "./types";
+export * from "./helpers";
diff --git a/ui-next/src/components/SubjectSelector/types.ts b/ui-next/src/components/SubjectSelector/types.ts
new file mode 100644
index 0000000000..21a0daec6f
--- /dev/null
+++ b/ui-next/src/components/SubjectSelector/types.ts
@@ -0,0 +1,12 @@
+export enum SelectableOptionType {
+ USER = "user",
+ GROUP = "group",
+ APPLICATION = "application",
+}
+
+export type SelectableOption = {
+ display: string;
+ id: string;
+ value: string;
+ type: SelectableOptionType;
+};
diff --git a/ui-next/src/components/SubmitFormWrapper.jsx b/ui-next/src/components/SubmitFormWrapper.jsx
new file mode 100644
index 0000000000..d2f5f7b1c4
--- /dev/null
+++ b/ui-next/src/components/SubmitFormWrapper.jsx
@@ -0,0 +1,13 @@
+export default function SubmitFormWrapper({ onSubmit, children }) {
+ return (
+
+ );
+}
diff --git a/ui-next/src/components/Tabs.jsx b/ui-next/src/components/Tabs.jsx
new file mode 100644
index 0000000000..748e7cd6db
--- /dev/null
+++ b/ui-next/src/components/Tabs.jsx
@@ -0,0 +1,74 @@
+import React from "react";
+import { Tab as RawTab, Tabs as RawTabs } from "@mui/material";
+import { colors } from "../theme/tokens/variables";
+import { getTheme } from "../theme";
+
+// Override styles for 'Contextual' tabs
+const contextualTabStyle = {
+ root: {
+ color: colors.gray02,
+ textTransform: "none",
+ height: "38px",
+ minHeight: "38px",
+ padding: "12px 16px",
+ backgroundColor: colors.gray13,
+ [getTheme().breakpoints.up("md")]: {
+ minWidth: 0,
+ },
+ width: "auto",
+ "&:hover": {
+ backgroundColor: colors.grayXLight,
+ color: colors.gray02,
+ },
+ },
+ selected: {
+ backgroundColor: "white",
+ color: colors.black,
+ "&:hover": {
+ backgroundColor: "white",
+ color: colors.black,
+ },
+ },
+ wrapper: {
+ width: "auto",
+ },
+};
+
+const regularTabStyle = {
+ root: {
+ "& .MuiTab-root": {
+ minWidth: "130px",
+ fontWeight: "normal",
+ fontSize: "14px",
+ },
+ },
+};
+
+const contextualTabsStyle = {
+ indicator: {
+ height: 0,
+ },
+ flexContainer: {
+ backgroundColor: colors.gray13,
+ },
+};
+
+export default function Tabs({ contextual, children, ...props }) {
+ return (
+
+ {contextual
+ ? children.map((child, idx) =>
+ React.cloneElement(child, { contextual: true, key: idx }),
+ )
+ : children}
+
+ );
+}
+
+export function Tab({ contextual = null, ...props }) {
+ return ;
+}
diff --git a/ui-next/src/components/TagChip.tsx b/ui-next/src/components/TagChip.tsx
new file mode 100644
index 0000000000..857d6c6a7c
--- /dev/null
+++ b/ui-next/src/components/TagChip.tsx
@@ -0,0 +1,20 @@
+import { Chip, ChipProps } from "@mui/material";
+import { forwardRef } from "react";
+import { colors } from "theme/tokens/variables";
+
+const customStyles = {
+ background: colors.otherTag,
+ color: "black",
+ fontWeight: 400,
+ borderRadius: "100px",
+ fontSize: "12px",
+};
+
+const TagChip = forwardRef(
+ ({ style = {}, ...props }, ref) => {
+ const combinedStyles = { ...customStyles, ...style };
+ return ;
+ },
+);
+
+export default TagChip;
diff --git a/ui-next/src/components/Text.jsx b/ui-next/src/components/Text.jsx
new file mode 100644
index 0000000000..f9706de7c4
--- /dev/null
+++ b/ui-next/src/components/Text.jsx
@@ -0,0 +1,9 @@
+import MuiTypography from "./MuiTypography";
+
+const levelMap = ["caption", "body2", "body1"];
+
+const Text = ({ level = 1, sx, ...props }) => {
+ return ;
+};
+
+export default Text;
diff --git a/ui-next/src/components/TwoPanesDivider.jsx b/ui-next/src/components/TwoPanesDivider.jsx
new file mode 100644
index 0000000000..7c6693d2d1
--- /dev/null
+++ b/ui-next/src/components/TwoPanesDivider.jsx
@@ -0,0 +1,193 @@
+import { useCallback, useRef, useState } from "react";
+import { createTheme, useTheme, ThemeProvider } from "@mui/material";
+import { colors } from "theme/tokens/variables";
+
+import getTheme from "theme/theme";
+import { Box } from "@mui/material";
+import useMediaQuery from "@mui/material/useMediaQuery";
+
+const MIN_LEFT_WIDTH = 400;
+const MIN_RIGHT_WIDTH = 150;
+const SMALL_PERCENT_THREASHOLD = 34;
+
+const smallThemeCreate = (
+ _existingTheme, // ignore existingTheme for now. since it will make font bigger when not on mobile
+) =>
+ createTheme({
+ ...getTheme(),
+ breakpoints: {
+ values: {
+ xs: 0,
+ sm: 20,
+ },
+ },
+ });
+
+const TwoPanesBoxider = ({
+ leftPanelContent,
+ rightPanelContent,
+ leftPanelExpanded = false,
+ setLeftPanelExpanded,
+}) => {
+ const theme = useTheme();
+ // Checking responsive width
+ const isValidWidth = useMediaQuery((theme) => theme.breakpoints.down("sm"));
+
+ const [isHoveringResizer, setIsHoveringResizer] = useState(false);
+ const [rightPanelTheme, setRightPanelTheme] = useState({
+ theme,
+ name: "default",
+ });
+
+ const containerRef = useRef(null);
+ const leftPanelRef = useRef(null);
+ const rightPanelRef = useRef(null);
+ const resizerRef = useRef(null);
+
+ const handleMouseDown = () => {
+ document.addEventListener("mouseup", handleMouseUp, true);
+ document.addEventListener("mousemove", handleMouseMove, true);
+ };
+
+ const handleMouseUp = () => {
+ document.removeEventListener("mouseup", handleMouseUp, true);
+ document.removeEventListener("mousemove", handleMouseMove, true);
+ };
+
+ const handleMouseMove = useCallback(
+ (e) => {
+ e.preventDefault();
+
+ const boundingClientRect = leftPanelRef.current.getBoundingClientRect();
+
+ const leftWidth = e.clientX - boundingClientRect.x;
+ const containerWidth = containerRef.current.offsetWidth;
+ const rightWidth = containerWidth - leftWidth;
+
+ const leftWidthAsPercent = (leftWidth / containerWidth) * 100;
+ const rightWidthAsPercent = (rightWidth / containerWidth) * 100;
+
+ if (leftWidth >= MIN_LEFT_WIDTH && rightWidth >= MIN_RIGHT_WIDTH) {
+ leftPanelRef.current.style.width = `${leftWidthAsPercent}%`;
+ rightPanelRef.current.style.width = `${rightWidthAsPercent}%`;
+ resizerRef.current.style.left = `calc(${leftWidthAsPercent}% - 3px)`;
+ }
+
+ const isNotMobileAndRightPanelIsSmall =
+ !isValidWidth && SMALL_PERCENT_THREASHOLD > rightWidthAsPercent;
+
+ if (isNotMobileAndRightPanelIsSmall) {
+ setRightPanelTheme({ theme: smallThemeCreate(theme), name: "small" });
+ } else {
+ setRightPanelTheme({ theme, name: "default" });
+ }
+ },
+ [theme, isValidWidth],
+ );
+
+ return (
+
+
+ setLeftPanelExpanded(!leftPanelExpanded)}
+ sx={{
+ display: [leftPanelExpanded ? "none" : "block", "none"],
+ width: "100%",
+ height: "100%",
+ background: "black",
+ opacity: 0.4,
+ position: "absolute",
+ top: 0,
+ left: 0,
+ zIndex: 999,
+ }}
+ >
+
+ {leftPanelContent}
+
+
+
+
+
+
+ {rightPanelContent}
+
+
+
+
+
+ handleMouseDown(e)}
+ onMouseEnter={(_e) => setIsHoveringResizer(true)}
+ onMouseLeave={(_e) => setIsHoveringResizer(false)}
+ id="editor-panel-resize-line"
+ sx={{
+ position: "absolute",
+ left: "50%",
+ height: "100%",
+ width: "8px",
+ marginLeft: "-4px",
+ cursor: "col-resize",
+ backgroundColor: colors.primary,
+ opacity: isHoveringResizer ? 1 : 0,
+ transition: "opacity 0.10s ease-in-out",
+ zIndex: 5,
+ flexShrink: 0,
+ resize: "horizontal",
+ display: ["none", leftPanelExpanded ? "none" : "block"],
+ }}
+ />
+
+ );
+};
+
+export default TwoPanesBoxider;
diff --git a/ui-next/src/components/UIModal.tsx b/ui-next/src/components/UIModal.tsx
new file mode 100644
index 0000000000..4f1b42d2af
--- /dev/null
+++ b/ui-next/src/components/UIModal.tsx
@@ -0,0 +1,224 @@
+import { Box, DialogActions, SxProps, Theme } from "@mui/material";
+import Dialog, { DialogProps } from "@mui/material/Dialog";
+import { XCircle } from "@phosphor-icons/react";
+import React, { CSSProperties, ReactNode, forwardRef, useState } from "react";
+import {
+ defaultModalBackdropColor,
+ seGrey2,
+ blueLight,
+} from "theme/tokens/colors";
+
+type UIModalProps = Omit & {
+ style?: CSSProperties;
+ setOpen: (value: boolean) => void;
+ title?: string | React.ReactNode;
+ description?: string | React.ReactNode;
+ icon?: React.ReactNode;
+ enableCloseButton?: boolean;
+ backdropColor?: string;
+ maxWidth?: any;
+ footerChildren?: ReactNode;
+ footerSx?: SxProps;
+ titleSx?: SxProps;
+};
+
+const modalStyles = {
+ background: "#FFFFFF",
+ boxShadow: "4px 4px 10px 0px rgba(89, 89, 89, 0.41)",
+ p: 4,
+ overflow: "auto",
+};
+
+const headerStyles = {
+ display: "flex",
+ alignItems: "flex-start",
+ "& > *": {
+ padding: "3px",
+ "&:first-of-type": {
+ paddingLeft: "0px",
+ },
+ },
+};
+
+const titleStyles: SxProps = {
+ fontSize: "16px",
+ lineHeight: "16px",
+ fontWeight: 600,
+ textTransform: "uppercase",
+};
+const descStyles = {
+ color: "#858585",
+ fontSize: "12px",
+ fontWeight: 300,
+ lineHeight: "18px",
+ paddingTop: "2px",
+ display: "-webkit-box",
+ WebkitLineClamp: 2,
+ WebkitBoxOrient: "vertical",
+ overflow: "hidden",
+ textOverflow: "ellipsis",
+ cursor: "pointer",
+};
+const contentStyles = {
+ padding: "15px 22px 20px 25px",
+};
+
+const TruncatedDescription = ({
+ description,
+}: {
+ description: string | ReactNode;
+}) => {
+ const [isExpanded, setIsExpanded] = useState(false);
+
+ if (typeof description !== "string") {
+ return {description};
+ }
+
+ const maxLength = 330;
+
+ const truncatedText =
+ !isExpanded && description.length > maxLength
+ ? description.substring(0, maxLength) + "... "
+ : description;
+
+ return (
+ setIsExpanded(!isExpanded)}
+ >
+ {truncatedText}
+ {!isExpanded && description.length > maxLength && (
+ {
+ e.stopPropagation();
+ setIsExpanded(true);
+ }}
+ >
+ Read more
+
+ )}
+
+ );
+};
+
+const UIModal = forwardRef(
+ (
+ {
+ style,
+ open,
+ setOpen,
+ children,
+ icon,
+ title,
+ description,
+ enableCloseButton,
+ maxWidth,
+ backdropColor,
+ footerChildren,
+ footerSx,
+ id,
+ titleSx,
+ ...props
+ },
+ ref,
+ ) => {
+ const backdropStyles = {
+ background: backdropColor ? backdropColor : defaultModalBackdropColor,
+ opacity: "0.75 !important",
+ };
+ return (
+
+ );
+ },
+);
+
+export default UIModal;
+export type { UIModalProps };
diff --git a/ui-next/src/components/WorkflowStatusBadge.tsx b/ui-next/src/components/WorkflowStatusBadge.tsx
new file mode 100644
index 0000000000..b71bb941a8
--- /dev/null
+++ b/ui-next/src/components/WorkflowStatusBadge.tsx
@@ -0,0 +1,35 @@
+import { FunctionComponent } from "react";
+import { getChipStatusColor } from "utils/helpers";
+import { capitalizeFirstLetter } from "utils/utils";
+import TagChip from "./TagChip";
+import { WorkflowExecutionStatus } from "types/Execution";
+
+export interface WorkflowStatusBadgeProps {
+ status: WorkflowExecutionStatus;
+}
+
+const WorkflowStatusBadge: FunctionComponent = ({
+ status,
+}) => {
+ const color = getChipStatusColor(status);
+ const chipStyles =
+ color == null
+ ? {}
+ : {
+ backgroundColor: color,
+ };
+ let formattedStatus = status ? status.toLowerCase() : "";
+ formattedStatus =
+ formattedStatus && formattedStatus.length > 0
+ ? capitalizeFirstLetter(formattedStatus)
+ : "";
+ return (
+
+ );
+};
+
+export default WorkflowStatusBadge;
diff --git a/ui-next/src/components/agent/Agent.tsx b/ui-next/src/components/agent/Agent.tsx
new file mode 100644
index 0000000000..84cd125f9b
--- /dev/null
+++ b/ui-next/src/components/agent/Agent.tsx
@@ -0,0 +1,6 @@
+// OSS stub — the full Agent component lives in enterprise/components/agent/Agent
+// In OSS builds this renders nothing; enterprise wires up the real component
+// via the AgentLayout plugin.
+export default function Agent(_props: Record) {
+ return null;
+}
diff --git a/ui-next/src/components/agent/AgentContext.tsx b/ui-next/src/components/agent/AgentContext.tsx
new file mode 100644
index 0000000000..6174d3db10
--- /dev/null
+++ b/ui-next/src/components/agent/AgentContext.tsx
@@ -0,0 +1,66 @@
+import { createContext, useContext, ReactNode, useMemo } from "react";
+
+type AgentContextType = {
+ sendMessage: (message: string) => void;
+ applySuggestion: (
+ messageId: string,
+ accepted: boolean,
+ feedback?: string,
+ ) => void;
+ clearMessages: () => void;
+ cancelStream: () => void;
+ resumeStream?: () => void;
+};
+
+const AgentContext = createContext(null);
+
+export function AgentProvider({
+ children,
+ sendMessage,
+ applySuggestion,
+ clearMessages,
+ cancelStream,
+ resumeStream,
+}: {
+ children: ReactNode;
+ sendMessage: (message: string) => void;
+ applySuggestion: (
+ messageId: string,
+ accepted: boolean,
+ feedback?: string,
+ ) => void;
+ clearMessages: () => void;
+ cancelStream: () => void;
+ resumeStream?: () => void;
+}) {
+ const value = useMemo(
+ () => ({
+ sendMessage,
+ applySuggestion,
+ clearMessages,
+ cancelStream,
+ resumeStream,
+ }),
+ [sendMessage, applySuggestion, clearMessages, cancelStream, resumeStream],
+ );
+
+ return (
+ {children}
+ );
+}
+
+// eslint-disable-next-line react-refresh/only-export-components
+export function useAgentContext() {
+ const context = useContext(AgentContext);
+ if (!context) {
+ // Return no-op functions if not in provider context
+ return {
+ sendMessage: () => {},
+ applySuggestion: () => {},
+ clearMessages: () => {},
+ cancelStream: () => {},
+ resumeStream: undefined,
+ };
+ }
+ return context;
+}
diff --git a/ui-next/src/components/agent/AgentEditorController.tsx b/ui-next/src/components/agent/AgentEditorController.tsx
new file mode 100644
index 0000000000..c95b2c5810
--- /dev/null
+++ b/ui-next/src/components/agent/AgentEditorController.tsx
@@ -0,0 +1,4 @@
+// OSS stub — the full AgentEditorController lives in enterprise/components/agent/
+export function AgentEditorController(_props: Record) {
+ return null;
+}
diff --git a/ui-next/src/components/agent/agent-types.ts b/ui-next/src/components/agent/agent-types.ts
new file mode 100644
index 0000000000..d19176eb43
--- /dev/null
+++ b/ui-next/src/components/agent/agent-types.ts
@@ -0,0 +1,26 @@
+export enum AgentDisplayMode {
+ FLOATING_EXPANDED = "floating-expanded",
+ FLOATING_MINIMIZED = "floating-minimized",
+ TABBED = "tabbed",
+ CLOSED = "closed",
+ FULL_PAGE = "full-page",
+ RIGHT_SIDEBAR = "right-sidebar",
+}
+
+export enum AgentContentTab {
+ CHAT = "chat",
+ CONVERSATIONS = "conversations",
+}
+export interface Message {
+ role: "user" | "assistant";
+ content: string;
+}
+export interface Conversation {
+ sessionId: string;
+ title: string;
+ messageCount: number;
+ workflowName?: string;
+ createdAt: string;
+ updatedAt: string;
+ status: string;
+}
diff --git a/ui-next/src/components/agent/helpers.ts b/ui-next/src/components/agent/helpers.ts
new file mode 100644
index 0000000000..0be3be0000
--- /dev/null
+++ b/ui-next/src/components/agent/helpers.ts
@@ -0,0 +1,7 @@
+export const testWorkflowDefOrExecutionViewPathname = (pathname: string) => {
+ return (
+ /^\/workflowDef\/.*$/.test(pathname) ||
+ /^\/execution\/.*$/.test(pathname) ||
+ pathname.startsWith("/newWorkflowDef")
+ );
+};
diff --git a/ui-next/src/components/auth/AuthGuard.tsx b/ui-next/src/components/auth/AuthGuard.tsx
new file mode 100644
index 0000000000..f48b080827
--- /dev/null
+++ b/ui-next/src/components/auth/AuthGuard.tsx
@@ -0,0 +1,59 @@
+/**
+ * Layout wrapper for OSS mode.
+ *
+ * In OSS mode, this is simply a layout container with no authentication checks.
+ * Full auth guard logic has been moved to the enterprise package.
+ */
+import { Box } from "@mui/material";
+import { RunWorkflow } from "pages/runWorkflow";
+import React from "react";
+import { Outlet } from "react-router";
+import ErrorBoundary from "../ErrorBoundary";
+
+interface AuthGuardProps {
+ fallback?: React.ReactNode;
+ runWorkflow?: boolean;
+}
+
+const AuthGuard = ({
+ fallback: _fallback = null,
+ runWorkflow = false,
+}: AuthGuardProps) => {
+ return (
+
+ {runWorkflow && }
+
+
+
+
+
+
+ );
+};
+
+export default AuthGuard;
diff --git a/ui-next/src/components/charts/CacheChart.tsx b/ui-next/src/components/charts/CacheChart.tsx
new file mode 100644
index 0000000000..e7fc5c1fef
--- /dev/null
+++ b/ui-next/src/components/charts/CacheChart.tsx
@@ -0,0 +1,80 @@
+import {
+ Area,
+ AreaChart,
+ CartesianGrid,
+ ResponsiveContainer,
+ Tooltip,
+ XAxis,
+ YAxis,
+} from "recharts";
+import {
+ BaseChartProps,
+ formatHistoricalData,
+ formatXAxis,
+ getTimeTicks,
+ useChartColors,
+} from "./chartUtils";
+
+export function CacheChart({ historicalData = [] }: BaseChartProps) {
+ const colors = useChartColors();
+ const data = formatHistoricalData(historicalData);
+ const xTicks = getTimeTicks(data);
+
+ return (
+
+
+
+
+ `${(value * 100).toFixed(0)}%`}
+ stroke={colors.text}
+ width={60}
+ />
+ `${(Number(value) * 100).toFixed(2)}%`}
+ contentStyle={{
+ backgroundColor: colors.isDark ? "#1f2937" : "#fff",
+ borderColor: colors.grid,
+ }}
+ />
+
+
+
+
+ );
+}
diff --git a/ui-next/src/components/charts/ErrorsChart.tsx b/ui-next/src/components/charts/ErrorsChart.tsx
new file mode 100644
index 0000000000..04b4bf460b
--- /dev/null
+++ b/ui-next/src/components/charts/ErrorsChart.tsx
@@ -0,0 +1,154 @@
+import { Box, Paper, Stack, Typography } from "@mui/material";
+import _mergeWith from "lodash/mergeWith";
+import _sum from "lodash/sum";
+import { getHttpStatusText } from "utils/httpStatus";
+import {
+ Area,
+ AreaChart,
+ CartesianGrid,
+ ResponsiveContainer,
+ Tooltip,
+ XAxis,
+ YAxis,
+} from "recharts";
+import {
+ BaseChartProps,
+ formatHistoricalData,
+ formatXAxis,
+ getTimeTicks,
+ useChartColors,
+} from "./chartUtils";
+
+export function ErrorsChart({ historicalData = [] }: BaseChartProps) {
+ const colors = useChartColors();
+ const data = formatHistoricalData(historicalData);
+ const xTicks = getTimeTicks(data);
+
+ const errorBreakdown: Record = _mergeWith(
+ {},
+ ...data.map((point) => point.errorsByStatusCode || {}),
+ (objValue: number, srcValue: number) => (objValue || 0) + (srcValue || 0),
+ );
+
+ const totalErrors = _sum(Object.values(errorBreakdown));
+
+ return (
+
+
+
+
+
+ `${(value * 100).toFixed(1)}%`}
+ stroke={colors.text}
+ width={60}
+ />
+ `${(Number(value) * 100).toFixed(2)}%`}
+ contentStyle={{
+ backgroundColor: colors.isDark ? "#1f2937" : "#fff",
+ borderColor: colors.grid,
+ }}
+ />
+
+
+
+
+ {totalErrors > 0 && (
+
+
+ Error Breakdown
+
+
+ Types of errors encountered
+
+
+ {Object.entries(errorBreakdown).map(([statusCode, count]) => {
+ const percentage = ((count as number) / totalErrors) * 100;
+ const getStatusColor = (code: string) => {
+ if (code.startsWith("5")) return colors.error;
+ if (code.startsWith("4")) return colors.tertiary;
+ return colors.secondary;
+ };
+
+ return (
+
+
+
+ {statusCode} {getHttpStatusText(statusCode)}
+
+
+ {count} occurrences ({percentage.toFixed(1)}%)
+
+
+
+
+
+
+ );
+ })}
+
+
+ )}
+
+ );
+}
diff --git a/ui-next/src/components/charts/LatencyChart.tsx b/ui-next/src/components/charts/LatencyChart.tsx
new file mode 100644
index 0000000000..b840d85680
--- /dev/null
+++ b/ui-next/src/components/charts/LatencyChart.tsx
@@ -0,0 +1,110 @@
+import {
+ CartesianGrid,
+ Legend,
+ Line,
+ LineChart,
+ ResponsiveContainer,
+ Tooltip,
+ XAxis,
+ YAxis,
+} from "recharts";
+import type { ValueType } from "recharts/types/component/DefaultTooltipContent";
+import {
+ LatencyChartProps,
+ formatHistoricalData,
+ formatXAxis,
+ getTimeTicks,
+ useChartColors,
+} from "./chartUtils";
+
+export function LatencyChart({
+ historicalData = [],
+ visiblePercentiles = { p50: true, p95: true, p99: true },
+}: LatencyChartProps) {
+ const colors = useChartColors();
+ const data = formatHistoricalData(historicalData);
+ const xTicks = getTimeTicks(data);
+
+ return (
+
+
+
+
+ (v != null ? `${v} ms` : "")}
+ width={68}
+ label={{
+ value: "Latency (ms)",
+ angle: -90,
+ position: "insideLeft",
+ fill: colors.text,
+ dx: -8,
+ dy: 0,
+ style: { fontSize: 13, fontWeight: 500 },
+ }}
+ />
+ [
+ `${typeof value === "number" ? value.toFixed(2) : value} ms`,
+ name,
+ ]}
+ />
+
+ {visiblePercentiles.p50 && (
+
+ )}
+ {visiblePercentiles.p95 && (
+
+ )}
+ {visiblePercentiles.p99 && (
+
+ )}
+
+
+ );
+}
diff --git a/ui-next/src/components/charts/RequestsChart.tsx b/ui-next/src/components/charts/RequestsChart.tsx
new file mode 100644
index 0000000000..0f31440a76
--- /dev/null
+++ b/ui-next/src/components/charts/RequestsChart.tsx
@@ -0,0 +1,66 @@
+import {
+ Area,
+ AreaChart,
+ CartesianGrid,
+ ResponsiveContainer,
+ Tooltip,
+ XAxis,
+ YAxis,
+} from "recharts";
+import {
+ BaseChartProps,
+ formatHistoricalData,
+ formatXAxis,
+ getTimeTicks,
+ useChartColors,
+} from "./chartUtils";
+
+export function RequestsChart({ historicalData = [] }: BaseChartProps) {
+ const colors = useChartColors();
+ const data = formatHistoricalData(historicalData);
+ const xTicks = getTimeTicks(data);
+
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/ui-next/src/components/charts/chartUtils.ts b/ui-next/src/components/charts/chartUtils.ts
new file mode 100644
index 0000000000..5823e2afbc
--- /dev/null
+++ b/ui-next/src/components/charts/chartUtils.ts
@@ -0,0 +1,137 @@
+import { useTheme } from "@mui/material";
+import { FormattedHistoricalData, HistoricalData } from "types/MetricsTypes";
+
+export enum ChartType {
+ REQUESTS = "requests",
+ LATENCY = "latency",
+ ERRORS = "errors",
+ CACHE = "cache",
+}
+
+export enum ThemeMode {
+ DARK = "dark",
+ LIGHT = "light",
+}
+
+export interface BaseChartProps {
+ historicalData?: HistoricalData[];
+}
+
+export interface LatencyChartProps extends BaseChartProps {
+ visiblePercentiles?: Record;
+}
+
+export function formatHistoricalData(data: HistoricalData[] = []) {
+ const round2 = (x: number) =>
+ typeof x === "number" ? Math.round(x * 100) / 100 : x;
+
+ return data.map((d) => {
+ const dateObj =
+ d.time != null
+ ? typeof d.time === "number"
+ ? new Date(d.time * (d.time > 1e12 ? 1 : 1000))
+ : new Date(d.time)
+ : null;
+
+ // Calculate error rate
+ const errorRate = d.requestCount > 0 ? d.errorCount / d.requestCount : 0;
+
+ return {
+ ...d,
+ time: dateObj,
+ requests: d.requestCount ?? 0,
+ errors: errorRate,
+ p50: round2(d.p50),
+ p95: round2(d.p95),
+ p99: round2(d.p99),
+ errorsByStatusCode: d.errorsByStatusCode || {},
+ };
+ });
+}
+
+// Smart x-axis label: always show HH:mm for time ticks, and show date/year only for the very first tick if needed
+export const formatXAxis = (
+ tickItem: Date | string | number,
+ index: number,
+) => {
+ if (tickItem == null) return "";
+ let d: Date | null = null;
+ try {
+ if (typeof tickItem === "number") {
+ // Handle millisecond timestamps
+ d = new Date(tickItem);
+ } else if (typeof tickItem === "string") {
+ d = new Date(tickItem);
+ } else {
+ d = tickItem;
+ }
+
+ if (!d || !(d instanceof Date) || isNaN(d.getTime())) {
+ console.warn("Invalid date value:", tickItem);
+ return "";
+ }
+
+ // Format time as HH:mm
+ const hours = d.getHours().toString().padStart(2, "0");
+ const minutes = d.getMinutes().toString().padStart(2, "0");
+ const timeLabel = `${hours}:${minutes}`;
+
+ // For the first tick, show date and time
+ if (index === 0) {
+ const day = d.getDate().toString().padStart(2, "0");
+ const month = (d.getMonth() + 1).toString().padStart(2, "0");
+ const year = d.getFullYear();
+ const currentYear = new Date().getFullYear();
+
+ const dateLabel =
+ year !== currentYear ? `${day}/${month}/${year}` : `${day}/${month}`;
+
+ return `${dateLabel} ${timeLabel}`;
+ }
+
+ return timeLabel;
+ } catch (error) {
+ console.error("Error formatting x-axis label:", error);
+ return "";
+ }
+};
+
+// Helper to generate at least 20 ticks for X axis, evenly spaced, covering the full time range
+export const getTimeTicks = (data: FormattedHistoricalData[]) => {
+ if (!data || data.length === 0) return [];
+ const times = data
+ .filter((d) => d.time !== null)
+ .map((d) => {
+ const time = d.time instanceof Date ? d.time : new Date(d.time!);
+ return time.getTime(); // Ensure we're working with timestamps
+ });
+ if (times.length === 0) return [];
+ const min = times[0];
+ const max = times[times.length - 1];
+ const desiredTicks = 20;
+ if (max === min) return [min]; // edge case: all data at one point
+ const intervalMs = Math.max(1, Math.round((max - min) / (desiredTicks - 1)));
+ const ticks = [];
+ for (let i = 0; i < desiredTicks; i++) {
+ ticks.push(min + i * intervalMs);
+ }
+ // Ensure last tick is exactly max
+ if (ticks[ticks.length - 1] !== max) ticks[ticks.length - 1] = max;
+ return ticks;
+};
+
+export const useChartColors = () => {
+ const theme = useTheme();
+ const isDark = theme.palette.mode === ThemeMode.DARK;
+
+ return {
+ primary: isDark ? "#8884d8" : "#6366f1",
+ secondary: isDark ? "#82ca9d" : "#10b981",
+ tertiary: isDark ? "#ff7300" : "#f59e0b",
+ error: isDark ? "#ff5252" : "#ef4444",
+ success: isDark ? "#4caf50" : "#22c55e",
+ grid: isDark ? "#333" : "#ddd",
+ text: isDark ? "#ccc" : "#333",
+ isDark,
+ };
+};
diff --git a/ui-next/src/components/charts/index.ts b/ui-next/src/components/charts/index.ts
new file mode 100644
index 0000000000..9f4a96622b
--- /dev/null
+++ b/ui-next/src/components/charts/index.ts
@@ -0,0 +1,9 @@
+export { CacheChart } from "./CacheChart";
+export {
+ ChartType,
+ type BaseChartProps,
+ type LatencyChartProps,
+} from "./chartUtils";
+export { ErrorsChart } from "./ErrorsChart";
+export { LatencyChart } from "./LatencyChart";
+export { RequestsChart } from "./RequestsChart";
diff --git a/ui-next/src/components/coPilot/CoPilot.tsx b/ui-next/src/components/coPilot/CoPilot.tsx
new file mode 100644
index 0000000000..7f4c927c80
--- /dev/null
+++ b/ui-next/src/components/coPilot/CoPilot.tsx
@@ -0,0 +1,209 @@
+import ModelTrainingOutlined from "@mui/icons-material/ModelTrainingOutlined";
+import AddCircleOutlineIcon from "@mui/icons-material/AddCircleOutline";
+import MinimizeOutlinedIcon from "@mui/icons-material/MinimizeOutlined";
+import InsertEmoticonOutlinedIcon from "@mui/icons-material/InsertEmoticonOutlined";
+import AndroidOutlinedIcon from "@mui/icons-material/AndroidOutlined";
+import { Box } from "@mui/material";
+import { useRef, useState, useEffect } from "react";
+import {
+ greyBorder,
+ greyText,
+ greyText2,
+ purple,
+ white,
+} from "theme/tokens/colors";
+import ArrowBox from "components/v1/ArrowBox";
+import { RoundedInput } from "components/v1/RoundedInput";
+import ChatOutlinedIcon from "@mui/icons-material/ChatOutlined";
+
+const boxStyle = (toggle: boolean) => {
+ return {
+ position: "fixed",
+ left: 15,
+ bottom: -4,
+ borderRadius: "6px",
+ width: "100%",
+ maxWidth: "284px",
+ maxHeight: "474px",
+ height: toggle ? "100%" : "auto",
+ boxShadow: "4px 4px 10px 0px rgba(89, 89, 89, 0.41)",
+ padding: "4px",
+ background: white,
+ };
+};
+
+const headerStyle = {
+ padding: "10px",
+ display: "flex",
+ alignItems: "center",
+ fontSize: "14px",
+ fontWeight: 600,
+};
+
+const controlStyle = {
+ fontSize: "8px",
+ display: "flex",
+ alignItems: "center",
+ position: "absolute",
+ right: 10,
+ cursor: "pointer",
+};
+const contentStyle = {
+ marginTop: "20px",
+ paddingBottom: "6px",
+ height: "360px",
+ overflow: "auto",
+};
+const footerStyle = {
+ padding: "10px 7px",
+ backgroundImage: "linear-gradient(180deg, white, white)",
+};
+const userStyle = {
+ display: "flex",
+ alignItems: "center",
+};
+
+const arrowBox1Args = {
+ children:
+ "Create a workflow to send flowers to my mother. Don't spend over $100.",
+ position: "right",
+ backgroundColor: "#F4EEFF",
+ borderColor: purple,
+};
+const arrowBox2Args = {
+ children: "Here is a workflow template for sending flowers.",
+ position: "left",
+};
+
+const UserChat = () => {
+ return (
+
+
+
+
+
+
+
+
+
+ Me
+
+ 1 min ago
+
+
+
+
+ );
+};
+
+const CoPilotChat = () => {
+ return (
+
+
+
+
+
+
+ CoPilot
+
+ Just now
+
+
+
+
+
+
+
+ );
+};
+
+function CoPilot() {
+ const [toggle, setToggle] = useState(false);
+ const contentRef = useRef(null);
+ const handleToggle = () => {
+ setToggle(!toggle);
+ };
+
+ useEffect(() => {
+ if (contentRef.current) {
+ contentRef.current.scroll({
+ top: contentRef.current?.scrollHeight,
+ behavior: "smooth",
+ });
+ }
+ }, [toggle]);
+
+ return (
+
+
+
+
+
+ CoPilot
+ {/* maximize */}
+
+
+ {toggle ? (
+
+ ) : (
+
+ )}
+
+ {toggle ? "Minimize" : "Open"}
+
+
+ {toggle && (
+ <>
+
+
+
+
+
+ }
+ />
+
+ >
+ )}
+
+ );
+}
+
+export default CoPilot;
diff --git a/ui-next/src/components/conductorTooltip/ConductorTooltip.tsx b/ui-next/src/components/conductorTooltip/ConductorTooltip.tsx
new file mode 100644
index 0000000000..bad0512d95
--- /dev/null
+++ b/ui-next/src/components/conductorTooltip/ConductorTooltip.tsx
@@ -0,0 +1,59 @@
+import TooltipStateless from "components/v1/TooltipStateless";
+import { TooltipProps } from "@mui/material";
+import { ReactNode, useEffect, useState } from "react";
+
+interface ConductorTooltipProps extends Omit {
+ title: string;
+ content: ReactNode;
+ showInitial?: boolean;
+ initialTimeout?: number;
+ onClose?: () => void;
+}
+
+function ConductorTooltip({
+ title,
+ content,
+ children,
+ placement,
+ showInitial,
+ initialTimeout = 1000,
+ onClose,
+}: ConductorTooltipProps) {
+ const [open, setOpen] = useState(false);
+ const handleClose = () => {
+ setOpen(false);
+ if (onClose) {
+ onClose();
+ }
+ };
+ const handleOpen = (value: boolean) => {
+ setOpen(value);
+ };
+
+ useEffect(() => {
+ let timeoutId: any;
+ if (showInitial) {
+ setOpen(true);
+ timeoutId = setTimeout(() => {
+ handleClose();
+ }, initialTimeout);
+ }
+ return () => clearTimeout(timeoutId);
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [initialTimeout]);
+
+ return (
+
+ );
+}
+
+export default ConductorTooltip;
+export type { ConductorTooltipProps };
diff --git a/ui-next/src/components/definitionList/DefinitionList.jsx b/ui-next/src/components/definitionList/DefinitionList.jsx
new file mode 100644
index 0000000000..e9c091c017
--- /dev/null
+++ b/ui-next/src/components/definitionList/DefinitionList.jsx
@@ -0,0 +1,19 @@
+import Table from "@mui/material/Table";
+import TableBody from "@mui/material/TableBody";
+import { styled } from "@mui/material/styles";
+
+const StyledTableBody = styled(TableBody)(({ theme }) => ({
+ "& tr:first-child": {
+ borderTopColor: theme.palette.divider,
+ borderTopStyle: "solid",
+ borderTopWidth: "1px",
+ },
+}));
+
+const DefinitionList = ({ children }) => (
+
+);
+
+export default DefinitionList;
diff --git a/ui-next/src/components/diagram/diagram.scss b/ui-next/src/components/diagram/diagram.scss
new file mode 100644
index 0000000000..32cd64c511
--- /dev/null
+++ b/ui-next/src/components/diagram/diagram.scss
@@ -0,0 +1,198 @@
+$dark-color: #333;
+$light-color: #c8c8c8; /* gray11*/
+$white: #fff;
+$edge-label-color: blue;
+$outline-width: 0.6px;
+$node-text-size: 12px;
+
+.graphContainer {
+ padding: 10px;
+}
+
+.graphSvg {
+ width: 100%;
+ min-height: 600px;
+}
+
+@mixin nodeColor($colorfg, $colorbg: #fff) {
+ &.bar {
+ rect {
+ stroke: $colorfg !important;
+ fill: $colorfg;
+ }
+ }
+ text {
+ fill: $colorfg;
+ }
+ rect,
+ polygon,
+ circle {
+ fill: $colorbg;
+ stroke: $colorfg;
+ }
+}
+
+.node {
+ &:hover {
+ rect,
+ polygon {
+ filter: url("#brightness");
+ }
+ }
+
+ text {
+ fill: $dark-color;
+ font-size: 13px;
+ pointer-events: none;
+ }
+
+ rect,
+ circle,
+ polygon {
+ stroke: $dark-color;
+ fill: $white;
+ stroke-width: $outline-width;
+ }
+
+ rect {
+ rx: 5px;
+ ry: 5px;
+ }
+
+ &.type-DO_WHILE {
+ ellipse {
+ fill: $light-color;
+ }
+ }
+
+ &.type-SUB_WORKFLOW {
+ rect {
+ stroke-width: 5px;
+ }
+ }
+ &.type-TERMINAL {
+ circle {
+ stroke: $dark-color;
+ fill: #eee;
+ stroke-width: 0.6px;
+ }
+ text {
+ color: $dark-color;
+ font-weight: bold;
+ }
+ &.dimmed circle {
+ stroke: $light-color;
+ }
+ }
+
+ &.dimmed {
+ @include nodeColor($light-color);
+ }
+ &.status_COMPLETED {
+ @include nodeColor(#163e1d, #aee1b8);
+ }
+ &.status_COMPLETED_WITH_ERRORS {
+ @include nodeColor(#8b5b02, #feeac5);
+ }
+ &.status_IN_PROGRESS,
+ &.status_SCHEDULED {
+ @include nodeColor(#11497a, #cbe2f7);
+ }
+ //&.status_CANCELED { @include nodeColor(#26194b, #ded5f8); }
+ &.status_FAILED,
+ &.status_FAILED_WITH_TERMINAL_ERROR,
+ &.status_TIMED_OUT,
+ &.status_DF_PARTIAL,
+ &.status_CANCELED {
+ @include nodeColor(#7f050b, #f9c6c9);
+ }
+ &.status_SKIPPED {
+ @include nodeColor(gray);
+ }
+ &.selected {
+ filter: url("#dropShadow");
+ }
+}
+
+.node.bar {
+ &.type-FORK_JOIN_DYNAMIC {
+ rect {
+ stroke: $dark-color;
+ stroke-width: 5;
+ stroke-dasharray: 10;
+ }
+ &.dimmed {
+ rect {
+ stroke: $light-color;
+ }
+ }
+ }
+ /*
+ &.type-EXCLUSIVE_JOIN {
+ rect {
+ stroke: $dark-color;
+ fill: #fff;
+ stroke-width: $outline-width;
+ }
+ rect.underline {
+ stroke-width: 0;
+ fill: $dark-color;
+ }
+ text {
+ fill: $dark-color;
+ }
+ &.dimmed {
+ rect {
+ stroke: $light-color;
+ fill: #fff;
+ }
+ text {
+ fill: $light-color;
+ }
+ }
+ }
+*/
+ rect {
+ rx: 0px;
+ ry: 0px;
+ stroke-width: 0;
+ fill: $dark-color;
+ }
+ text {
+ fill: $white;
+ }
+
+ &.dimmed {
+ rect {
+ fill: $light-color;
+ }
+ }
+}
+
+.edgePath {
+ path {
+ stroke: $dark-color;
+ stroke-width: 1px;
+ }
+ &.dimmed {
+ path {
+ stroke: $light-color;
+ stroke-dasharray: 5;
+ }
+ marker {
+ fill: $light-color;
+ }
+ }
+ &.executed {
+ path {
+ stroke-width: 2px;
+ }
+ }
+}
+.edgeLabel {
+ fill: $edge-label-color;
+ font-size: 12px;
+ &.dimmed text {
+ fill: $light-color;
+ }
+}
diff --git a/ui-next/src/components/flow/Flow.tsx b/ui-next/src/components/flow/Flow.tsx
new file mode 100644
index 0000000000..1a74b4390e
--- /dev/null
+++ b/ui-next/src/components/flow/Flow.tsx
@@ -0,0 +1,340 @@
+import { DndContext, MouseSensor, useSensor, useSensors } from "@dnd-kit/core";
+import ConfirmChoiceDialog from "components/ConfirmChoiceDialog";
+import { isForkJoinPathEmpty } from "components/flow/nodes/mapper/forkJoin";
+import { isSwitchPathEmpty } from "components/flow/nodes/mapper/switch";
+import { getFlowTheme } from "components/flow/theme";
+import { WorkflowEditContext } from "pages/definition/state";
+import { buildDataForRemoveBranchOperation } from "pages/definition/state/taskModifier/taskModifier";
+import { usePerformOperationOnDefinition } from "pages/definition/state/usePerformOperationOnDefintion";
+import { ExecutionActionTypes } from "pages/execution/state";
+import {
+ FunctionComponent,
+ MouseEvent,
+ useCallback,
+ useContext,
+ useRef,
+ useState,
+} from "react";
+import { Canvas, Edge, EdgeData, NodeData, PortData } from "reaflow";
+import { ColorModeContext } from "theme/material/ColorModeContext";
+import { TaskStatus, TaskType } from "types";
+import { ActorRef } from "xstate";
+import { CustomLabel, CustomNode } from "./components/graphs";
+import PanAndZoomWrapper, {
+ usePanAndZoomActor,
+} from "./components/graphs/PanAndZoomWrapper";
+import { EDGE_SPACING } from "./components/graphs/PanAndZoomWrapper/constants";
+import QuickAddMenu from "./components/RichAddTaskMenu/QuickAddMenu";
+import { DraggableOverlay, useNodeCollisionDetection } from "./dragDrop";
+import {
+ DraggedNodeData,
+ FlowEvents,
+ FlowMachineContextProvider,
+ useFlowMachine,
+} from "./state";
+import { useSelector } from "@xstate/react";
+
+import "./ReaflowOverrides.scss";
+
+interface FlowProps {
+ flowActor: ActorRef;
+ readOnly?: boolean;
+ leftPanelExpanded: boolean;
+ isExecutionView?: boolean;
+}
+
+const dashedEdgeStyles = {
+ stroke: "#b1b1b7",
+ strokeDasharray: "5",
+ strokeDashoffset: 10,
+ strokeWidth: 2,
+ markerEnd: "none",
+};
+
+export const Flow: FunctionComponent = ({
+ flowActor,
+ readOnly = false,
+ leftPanelExpanded,
+ isExecutionView = false,
+}) => {
+ const mouseSensor = useSensor(MouseSensor, {});
+ const sensors = useSensors(mouseSensor);
+
+ const { mode } = useContext(ColorModeContext);
+ const theme = getFlowTheme(mode);
+
+ const [
+ {
+ selectNode,
+ toggleEdgeMenu,
+ toggleNodeMenu,
+ handleSetLayout,
+ selectEdge,
+ draggingStarts,
+ draggingNodeEnds,
+ },
+ {
+ nodes,
+ edges,
+ openedEdge,
+ selectedNode,
+ isInconsistent,
+ panAndZoomActor,
+ isShowDescription,
+ },
+ ] = useFlowMachine(flowActor);
+
+ const { workflowDefinitionActor } = useContext(WorkflowEditContext);
+ const { handleRemoveTask: onRemoveTask, handleRemoveBranch: onRemoveBranch } =
+ usePerformOperationOnDefinition(workflowDefinitionActor!);
+
+ const [showConfirmDialog, setShowConfirmDialog] = useState(false);
+ const [showConfirmDeletePathDialog, setShowConfirmDeletePathDialog] =
+ useState(false);
+ const edgeAnchorEl = useRef(null);
+ const nodeAnchorEl = useRef(null);
+ const canvasRef = useRef(null);
+
+ const [selectedOperationContext, setSelectedOperationContext] =
+ useState(null);
+
+ const onNodeClick = useCallback(
+ (event: MouseEvent, node: NodeData) => {
+ const { target } = event;
+ const targetElement = target as HTMLElement;
+
+ if (!isInconsistent) {
+ const className = targetElement.className;
+ if (className.includes("DeleteButton")) {
+ event.preventDefault();
+ nodeAnchorEl.current = targetElement;
+ setShowConfirmDialog(true);
+ } else {
+ event.stopPropagation();
+ }
+ selectNode(node);
+ }
+ },
+ [selectNode, isInconsistent],
+ );
+
+ const onToggleMenuClick = useCallback(
+ (event: MouseEvent, edge: EdgeData) => {
+ edgeAnchorEl.current = event.target as HTMLElement;
+ toggleEdgeMenu(edge);
+ event.stopPropagation();
+ },
+ [toggleEdgeMenu],
+ );
+ const collisionDetection = useNodeCollisionDetection(panAndZoomActor!);
+
+ const [
+ { notifiedEventType, viewportSize },
+ { handleSetEventType, handleCenterOnSelectedTask },
+ ] = usePanAndZoomActor(panAndZoomActor);
+
+ const richAddTaskMenuActor = (flowActor as any)?.children?.get(
+ "richAddTaskMenuMachine",
+ );
+
+ const operationContext = useSelector(
+ richAddTaskMenuActor || flowActor,
+ (state: { context: { operationContext?: any } }) =>
+ richAddTaskMenuActor ? state.context.operationContext : undefined,
+ );
+
+ return (
+
+ {!readOnly && (
+ <>
+ {showConfirmDialog && (
+ {
+ if (
+ confirmed &&
+ selectedNode?.data?.task != null &&
+ selectedNode?.data?.crumbs != null
+ ) {
+ onRemoveTask(selectedNode.data);
+ }
+ setShowConfirmDialog(false);
+ }}
+ message={"Are you sure you want to delete this task?"}
+ />
+ )}
+ {showConfirmDeletePathDialog && (
+ {
+ if (confirmed && selectedOperationContext) {
+ onRemoveBranch(selectedOperationContext);
+ }
+
+ setShowConfirmDeletePathDialog(false);
+ setSelectedOperationContext(null);
+ }}
+ message={
+ <>
+ Are you sure you want to delete the path
+ {selectedOperationContext?.branchName} ?
+ >
+ }
+ />
+ )}
+ {openedEdge ? (
+
+ ) : null}
+ >
+ )}
+ {panAndZoomActor && (
+ {
+ draggingNodeEnds(
+ event?.active?.data?.current as DraggedNodeData,
+ event?.over?.data?.current as DraggedNodeData,
+ );
+ }}
+ onDragStart={(event) => {
+ if (event?.active?.data?.current) {
+ draggingStarts(event?.active?.data?.current as DraggedNodeData);
+ }
+ }}
+ sensors={sensors}
+ collisionDetection={collisionDetection}
+ >
+ }
+ flowActor={flowActor}
+ isExecutionView={isExecutionView}
+ >
+
+ )}
+
+ );
+};
diff --git a/ui-next/src/components/flow/FlowFullscreen.scss b/ui-next/src/components/flow/FlowFullscreen.scss
new file mode 100644
index 0000000000..dd6d2f1f84
--- /dev/null
+++ b/ui-next/src/components/flow/FlowFullscreen.scss
@@ -0,0 +1,5 @@
+.FlowFullscreen {
+ flex-grow: 2;
+ display: flex;
+ overflow: hidden;
+}
diff --git a/ui-next/src/components/flow/ReaflowOverrides.scss b/ui-next/src/components/flow/ReaflowOverrides.scss
new file mode 100644
index 0000000000..2c87f11265
--- /dev/null
+++ b/ui-next/src/components/flow/ReaflowOverrides.scss
@@ -0,0 +1,5 @@
+/* Disable pointer events for all edges */
+g[class^="Edge-module_edge"],
+g[class*=" Edge-module_edge"] {
+ pointer-events: none;
+}
diff --git a/ui-next/src/components/flow/components/RichAddTaskMenu/AddTaskSidebar.tsx b/ui-next/src/components/flow/components/RichAddTaskMenu/AddTaskSidebar.tsx
new file mode 100644
index 0000000000..1efc60ce3a
--- /dev/null
+++ b/ui-next/src/components/flow/components/RichAddTaskMenu/AddTaskSidebar.tsx
@@ -0,0 +1,867 @@
+import {
+ alpha,
+ Box,
+ Button,
+ CircularProgress,
+ Grid,
+ IconButton,
+ InputBase,
+ Typography,
+} from "@mui/material";
+import {
+ ArrowRight,
+ Cpu,
+ Gear,
+ GridFour as GridLines,
+ MagnifyingGlass,
+ Plus,
+ Robot,
+ Users,
+ X,
+} from "@phosphor-icons/react";
+import { IntegrationIcon } from "components/IntegrationIcon";
+import { MessageContext } from "components/v1/layout/MessageContext";
+import { WorkflowEditContext } from "pages/definition/state";
+import { buildDataForOperation } from "pages/definition/state/taskModifier/taskModifier";
+import { DefinitionMachineEventTypes } from "pages/definition/state/types";
+import { usePerformOperationOnDefinition } from "pages/definition/state/usePerformOperationOnDefintion";
+import { pluginRegistry } from "plugins/registry";
+import React, {
+ cloneElement,
+ useCallback,
+ useContext,
+ useEffect,
+ useMemo,
+ useRef,
+ useState,
+} from "react";
+import {
+ BaseIntegration,
+ CommonTaskDef,
+ IntegrationDef,
+ SubWorkflowTaskDef,
+} from "types";
+import { getSequentiallySuffix } from "utils/strings";
+import { getInitials } from "utils/utils";
+import { ActorRef } from "xstate";
+import { itemFilterMatcher } from "./helpers";
+import { iconForTaskTypeMap } from "./iconsForTaskTypes";
+import { IntegrationDrillDownContent } from "./IntegrationDrillDownContent";
+import { useRichAddTaskMenu } from "./state/hook";
+import {
+ BaseTaskMenuItem,
+ IntegrationMenuItem,
+ TaskMenuItem as OriginalTaskMenuItem,
+ RichAddMenuTabs,
+ RichAddTaskMenuEvents,
+ RichAddTaskMenuEventTypes,
+} from "./state/types";
+import { getALL_TASKS } from "./supportedTasks";
+import {
+ generateMCPTask,
+ generateSimpleTask,
+ generateSubWorkflowTask,
+ NameGeneratorFn,
+ taskGeneratorMap,
+} from "./taskGenerator";
+
+// Extend the TaskMenuItem type to include status and onClick
+type TaskMenuItem = Omit & {
+ status?: string;
+ onClick?: () => void;
+ icon?: React.ReactElement;
+};
+type AddTaskSidebarProps = {
+ open: boolean;
+ setOpen?: (val: boolean) => void;
+ richAddTaskMenuActor: ActorRef;
+};
+
+const noRandomSuffix: NameGeneratorFn = (aPram: string) => ({
+ name: `${aPram}`,
+ taskReferenceName: `${aPram}_ref`,
+});
+
+const SIDEBAR_ITEMS = [
+ {
+ label: "All",
+ tab: RichAddMenuTabs.ALL_TAB,
+ icon: GridLines,
+ },
+ {
+ label: "System",
+ tab: RichAddMenuTabs.SYSTEMS_TAB,
+ icon: Cpu,
+ },
+ {
+ label: "AI",
+ tab: RichAddMenuTabs.AI_AGENTS_TAB,
+ icon: Robot,
+ },
+ {
+ label: "Worker Tasks",
+ tab: RichAddMenuTabs.WORKERS_TAB,
+ icon: Users,
+ },
+ {
+ label: "Integrations",
+ tab: RichAddMenuTabs.INTEGRATIONS_TAB,
+ icon: Gear,
+ },
+];
+
+const AddTaskSidebar = ({
+ open,
+ setOpen,
+ richAddTaskMenuActor,
+}: AddTaskSidebarProps) => {
+ const { workflowDefinitionActor } = useContext(WorkflowEditContext);
+ const { setMessage } = useContext(MessageContext);
+ const listRef = useRef(null);
+ const { handlePerformOperation: onPerformOperation } =
+ usePerformOperationOnDefinition(workflowDefinitionActor!);
+
+ const [
+ {
+ supportedIntegrations,
+ integrationDefs,
+ integrationDrillDownMenu,
+ scrollPosition,
+ operationContext,
+ nodes,
+ workerMenuItems,
+ subWorkflowMenuItems,
+ selectedTab,
+ isFetching,
+ searchQuery,
+ },
+ { refetchIntegrations, handleUpdateIntegrationDrillDown, handleTyping },
+ ] = useRichAddTaskMenu(richAddTaskMenuActor);
+
+ const send = richAddTaskMenuActor?.send;
+
+ const [basicIntegrationTemplate, _setBasicIntegrationTemplate] = useState<
+ BaseIntegration | undefined
+ >(undefined);
+
+ const setBasicIntegrationTemplate = useCallback(
+ (template?: BaseIntegration) => {
+ if (!template) {
+ _setBasicIntegrationTemplate(undefined);
+ return;
+ }
+ const templateNameWithoutSpaces = {
+ ...template,
+ name: template.name.replace(/\s+/g, ""),
+ };
+ _setBasicIntegrationTemplate(templateNameWithoutSpaces);
+ },
+ [_setBasicIntegrationTemplate],
+ );
+
+ const taskRefNames: string[] = useMemo(
+ () => nodes.map((node) => node?.data?.task?.taskReferenceName),
+ [nodes],
+ );
+
+ const handleEditModelClose = () => {
+ setBasicIntegrationTemplate(undefined);
+ };
+
+ const handleIntegrationSave = () => {
+ setMessage({
+ text: "Integration created successfully",
+ severity: "success",
+ });
+ setBasicIntegrationTemplate(undefined);
+ refetchIntegrations();
+ };
+
+ // Add scroll handler
+ const handleScroll = (event: any) => {
+ const x = event.currentTarget.scrollTop + event.currentTarget.clientHeight;
+ if (
+ event.currentTarget.scrollHeight - x <= 1 &&
+ selectedTab === RichAddMenuTabs.ALL_TAB
+ ) {
+ send({
+ type: RichAddTaskMenuEventTypes.GOT_TO_END,
+ lastScrollTopPosition: event.currentTarget.scrollTop,
+ });
+ }
+ };
+
+ // Add effect to restore scroll position
+ useEffect(() => {
+ if (listRef.current) {
+ listRef.current.scrollTop = scrollPosition ?? 0;
+ }
+ }, [scrollPosition]);
+
+ type TaskGeneratorFn = () => CommonTaskDef | CommonTaskDef[];
+
+ const handleAddTaskBelow = useCallback(
+ (payloadGenFn: TaskGeneratorFn) => () => {
+ const dataForOperation = buildDataForOperation(
+ operationContext?.port,
+ operationContext?.node,
+ );
+
+ onPerformOperation({
+ ...dataForOperation,
+ operation: {
+ payload: payloadGenFn(),
+ },
+ });
+ },
+ [onPerformOperation, operationContext],
+ );
+
+ const getSequentialTask = useCallback(
+ ({
+ handler,
+ overrides,
+ }: {
+ handler: any;
+ overrides?: Partial;
+ }) => {
+ let newTask = handler({
+ overrides,
+ nameGenerator: noRandomSuffix,
+ });
+
+ if (Array.isArray(newTask)) {
+ newTask = newTask.map((task) => {
+ const sequentialName = getSequentiallySuffix({
+ name: task.taskReferenceName,
+ refNames: taskRefNames,
+ });
+
+ return {
+ ...task,
+ name: overrides?.name ? task.name : sequentialName.name,
+ taskReferenceName: sequentialName.taskReferenceName,
+ };
+ });
+
+ return newTask;
+ }
+
+ const sequentialName = getSequentiallySuffix({
+ name: newTask.taskReferenceName,
+ refNames: taskRefNames,
+ });
+
+ return {
+ ...newTask,
+ name: overrides?.name ? newTask?.name : sequentialName.name,
+ taskReferenceName: sequentialName.taskReferenceName,
+ };
+ },
+ [taskRefNames],
+ );
+
+ const taskOptions = getALL_TASKS().map((bt: BaseTaskMenuItem) => {
+ const IconComponent = iconForTaskTypeMap[bt.type];
+ const generatorForType = taskGeneratorMap[bt.type];
+
+ return {
+ category: bt.category,
+ name: bt.name,
+ description: bt.description,
+ onClick: handleAddTaskBelow(() =>
+ getSequentialTask({
+ handler: generatorForType,
+ }),
+ ),
+ icon: ,
+ };
+ });
+
+ const handleChangeTab = (data: RichAddMenuTabs) => {
+ handleCloseDrillDown();
+ send({
+ type: RichAddTaskMenuEventTypes.SET_SELECTED_TAB,
+ tab: data,
+ });
+ };
+
+ const workerOptions = useMemo(
+ () =>
+ workerMenuItems.map((baseItem: BaseTaskMenuItem) => ({
+ ...baseItem,
+ onClick: handleAddTaskBelow(() =>
+ getSequentialTask({
+ overrides: {
+ name: baseItem.name,
+ taskReferenceName: `${baseItem.name}_ref`,
+ },
+ handler: generateSimpleTask,
+ }),
+ ),
+ })),
+ [getSequentialTask, handleAddTaskBelow, workerMenuItems],
+ );
+
+ const workflowDefinitionsOptions = useMemo(
+ () =>
+ subWorkflowMenuItems.map((baseItem: BaseTaskMenuItem) => ({
+ ...baseItem,
+ onClick: handleAddTaskBelow(() =>
+ getSequentialTask({
+ overrides: {
+ name: baseItem.name,
+ taskReferenceName: `${baseItem.name}_ref`,
+ subWorkflowParam: {
+ name: baseItem.name,
+ version: baseItem.version,
+ },
+ },
+ handler: generateSubWorkflowTask,
+ }),
+ ),
+ })),
+ [subWorkflowMenuItems, handleAddTaskBelow, getSequentialTask],
+ );
+
+ const options: TaskMenuItem[] = useMemo(
+ () =>
+ [
+ ...taskOptions,
+ ...workerOptions,
+ ...workflowDefinitionsOptions,
+ ...supportedIntegrations,
+ ] as TaskMenuItem[],
+ [
+ taskOptions,
+ workerOptions,
+ workflowDefinitionsOptions,
+ supportedIntegrations,
+ ],
+ );
+
+ const filteredOptions = useMemo(() => {
+ if (options) {
+ const filterer = itemFilterMatcher(searchQuery, selectedTab);
+ return options.filter(filterer);
+ } else return [];
+ }, [selectedTab, searchQuery, options]);
+
+ // Add a function to generate unique task ID
+ const getTaskUniqueId = (task: TaskMenuItem) =>
+ `${task.name}_${task.category}_${task.description}`;
+
+ const handleTaskClick = (task: TaskMenuItem) => {
+ if (
+ task.category === RichAddMenuTabs.INTEGRATIONS_TAB &&
+ task.status === "active"
+ ) {
+ handleTyping("");
+ handleUpdateIntegrationDrillDown({
+ isOpen: true,
+ selectedRootIntegration: task as IntegrationMenuItem,
+ level: "integrations",
+ selectedIntegration: null,
+ });
+ // handleFetchIntegrationTools(task as IntegrationMenuItem);
+ } else if (
+ task.category === RichAddMenuTabs.INTEGRATIONS_TAB &&
+ task.status !== "active"
+ ) {
+ const template = integrationDefs.find(
+ (integration: IntegrationDef) => integration.name === task?.name,
+ );
+ setBasicIntegrationTemplate({
+ name: template?.name,
+ description: "",
+ type: template?.type,
+ category: template?.category,
+ enabled: template?.enabled,
+ });
+ } else if (task.onClick) {
+ task.onClick();
+ }
+ };
+
+ const handleCloseMenu = useCallback(() => {
+ send({ type: RichAddTaskMenuEventTypes.CLOSE_MENU });
+ }, [send]);
+
+ const handleClose = useCallback(() => {
+ if (setOpen) {
+ setOpen(false);
+ }
+ if (workflowDefinitionActor) {
+ workflowDefinitionActor.send({
+ type: DefinitionMachineEventTypes.HANDLE_LEFT_PANEL_EXPANDED,
+ onSelectNode: false,
+ });
+ }
+ handleCloseMenu();
+ }, [handleCloseMenu, setOpen, workflowDefinitionActor]);
+
+ const handleAddToolTask = (tool: any) => {
+ return handleAddTaskBelow(() =>
+ getSequentialTask({
+ overrides: {
+ name: tool?.api,
+ taskReferenceName: `${tool?.api}_ref`,
+ description: tool?.description,
+ inputParameters: {
+ integrationName:
+ integrationDrillDownMenu?.selectedIntegration?.name,
+ method: tool?.api,
+ integrationType:
+ integrationDrillDownMenu?.selectedIntegration?.integrationType,
+ // ...generateObjectFromSchema(tool?.inputSchema?.data),
+ },
+ },
+ handler: generateMCPTask,
+ }),
+ )();
+ };
+
+ const handleCloseDrillDown = () => {
+ handleUpdateIntegrationDrillDown({
+ isOpen: false,
+ selectedIntegration: null,
+ selectedRootIntegration: null,
+ level: "integrations",
+ });
+ };
+
+ return open ? (
+
+
+ {/* Header */}
+
+
+ Add Task
+
+
+
+
+ {/* Search */}
+
+
+
+ 🔍
+
+ handleTyping(e.target.value)}
+ sx={{
+ flex: 1,
+ fontSize: "0.875rem",
+ "& input": {
+ padding: 0,
+ },
+ }}
+ endAdornment={
+ searchQuery ? (
+ handleTyping("")}
+ sx={{
+ color: "#6B7280",
+ p: 0.5,
+ "&:hover": {
+ color: "#4B5563",
+ backgroundColor: "transparent",
+ },
+ }}
+ >
+
+
+ ) : null
+ }
+ />
+ {!integrationDrillDownMenu.isOpen && (
+
+ {filteredOptions.length} results
+
+ )}
+
+
+
+ {/* Categories */}
+
+
+ {SIDEBAR_ITEMS.map((item) => (
+
+ handleChangeTab(item.tab)}
+ sx={{
+ display: "flex",
+ flexDirection: "column",
+ alignItems: "center",
+ gap: 0.75,
+ py: 1,
+ px: 0.5,
+ cursor: "pointer",
+ borderRadius: "6px",
+ backgroundColor:
+ selectedTab === item.tab ? "#F3F4F6" : "transparent",
+ transition: "all 0.2s ease",
+ border: "1px solid",
+ borderColor:
+ selectedTab === item.tab ? "#E5E7EB" : "transparent",
+ "&:hover": {
+ backgroundColor:
+ selectedTab === item.tab ? "#F3F4F6" : "#F9FAFB",
+ borderColor: "#E5E7EB",
+ },
+ }}
+ >
+
+
+ {item.label}
+
+
+
+ ))}
+
+
+
+ {/* Task List */}
+
+ {isFetching ? (
+
+
+
+ ) : !integrationDrillDownMenu.isOpen &&
+ filteredOptions.length === 0 ? (
+
+
+
+ No tasks found
+
+
+ ) : (
+ <>
+
+ {!integrationDrillDownMenu.isOpen &&
+ filteredOptions.map(
+ (task: TaskMenuItem | IntegrationMenuItem, idx: number) => (
+
+ handleTaskClick(task)}
+ sx={{
+ background: "#FFFFFF",
+ border: "1px solid #F0F0F0",
+ borderRadius: 2,
+ p: 1.5,
+ cursor: "pointer",
+ transition: "all 0.2s ease",
+ boxShadow: "0 1px 2px rgba(0, 0, 0, 0.05)",
+ "&:hover": {
+ backgroundColor: "#F9FAFB",
+ borderColor: "#E5E7EB",
+ transform: "translateY(-1px)",
+ boxShadow:
+ "0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03)",
+ "& .task-icon-box": {
+ backgroundColor: alpha("#3B82F6", 0.08),
+ color: "#3B82F6",
+ "& .task-icon-typography": {
+ color: "#3B82F6",
+ },
+ },
+ "& .task-description": {
+ color: "#1E293B",
+ },
+ },
+ }}
+ >
+
+
+ {cloneElement(
+ "iconName" in task &&
+ (task.iconName || task?.integrationType) ? (
+
+
+
+ ) : "icon" in task && task.icon ? (
+ task.icon
+ ) : (
+
+ {getInitials(task.name)}
+
+ ),
+ {
+ size: 20,
+ },
+ )}
+
+
+
+ {task.name}
+
+ {task.category !==
+ RichAddMenuTabs.INTEGRATIONS_TAB && (
+
+ {task.description}
+
+ )}
+
+ {task.category ===
+ RichAddMenuTabs.INTEGRATIONS_TAB &&
+ ((task as any)?.status === "active" ? (
+
+ ) : (
+
+ ))}
+
+
+
+ ),
+ )}
+
+ {integrationDrillDownMenu.isOpen &&
+ integrationDrillDownMenu.selectedRootIntegration && (
+ {
+ setBasicIntegrationTemplate({
+ name: template?.name,
+ description: "",
+ type: template?.type,
+ category: template?.category,
+ enabled: template?.enabled,
+ });
+ }}
+ />
+ )}
+ >
+ )}
+
+
+ {basicIntegrationTemplate &&
+ (() => {
+ const IntegrationEditModal = pluginRegistry.getNewIntegrationModal();
+ return IntegrationEditModal ? (
+
+ ) : null;
+ })()}
+
+ ) : null;
+};
+
+export default AddTaskSidebar;
diff --git a/ui-next/src/components/flow/components/RichAddTaskMenu/IntegrationDrillDownContent.tsx b/ui-next/src/components/flow/components/RichAddTaskMenu/IntegrationDrillDownContent.tsx
new file mode 100644
index 0000000000..104ae9b7ad
--- /dev/null
+++ b/ui-next/src/components/flow/components/RichAddTaskMenu/IntegrationDrillDownContent.tsx
@@ -0,0 +1,429 @@
+import React from "react";
+import {
+ Box,
+ Typography,
+ CircularProgress,
+ IconButton,
+ Button,
+} from "@mui/material";
+import { ArrowRight, Plus, MagnifyingGlass } from "@phosphor-icons/react";
+import { IntegrationMenuItem } from "./state/types";
+import { IntegrationIcon } from "components/IntegrationIcon";
+import { getInitials } from "utils/utils";
+import { IntegrationDef } from "types";
+import { useRichAddTaskMenu } from "./state/hook";
+import { ActorRef } from "xstate";
+import { RichAddTaskMenuEvents } from "./state/types";
+
+interface IntegrationDrillDownContentProps {
+ richAddTaskMenuActor: ActorRef;
+ onAddToolTask: (tool: any) => void;
+ onAddNewIntegration: (integration: IntegrationDef) => void;
+}
+
+export const IntegrationDrillDownContent: React.FC<
+ IntegrationDrillDownContentProps
+> = ({ richAddTaskMenuActor, onAddToolTask, onAddNewIntegration }) => {
+ const [
+ {
+ availableIntegrations,
+ integrationDefs,
+ integrationDrillDownMenu,
+ isFetchingIntegrationTools,
+ searchQuery,
+ },
+ {
+ handleFetchIntegrationTools,
+ handleUpdateIntegrationDrillDown,
+ handleTyping,
+ },
+ ] = useRichAddTaskMenu(richAddTaskMenuActor);
+
+ if (
+ !integrationDrillDownMenu?.isOpen ||
+ !integrationDrillDownMenu?.selectedRootIntegration
+ ) {
+ return null;
+ }
+
+ const {
+ level,
+ selectedIntegration,
+ selectedRootIntegration,
+ selectedIntegrationTools,
+ } = integrationDrillDownMenu;
+
+ const handleNavigateToTools = (integration: IntegrationMenuItem) => {
+ handleTyping("");
+ handleFetchIntegrationTools(integration);
+ };
+
+ const handleNavigateBack = () => {
+ handleTyping("");
+ handleUpdateIntegrationDrillDown({
+ ...integrationDrillDownMenu,
+ selectedIntegration: null,
+ selectedRootIntegration:
+ integrationDrillDownMenu?.level === "tools"
+ ? integrationDrillDownMenu?.selectedRootIntegration
+ : null,
+ selectedIntegrationTools: null,
+ level: "integrations",
+ });
+ };
+
+ const handleCloseDrillDown = () => {
+ handleUpdateIntegrationDrillDown({
+ isOpen: false,
+ selectedIntegration: null,
+ selectedRootIntegration: null,
+ level: "integrations",
+ });
+ };
+
+ const filterBySearchQuery = (items: any[], fields: string[]) => {
+ if (!searchQuery) return items;
+ const query = searchQuery?.toLowerCase();
+ return items?.filter((item) =>
+ fields?.some((field) => item[field]?.toLowerCase()?.includes(query)),
+ );
+ };
+ const filteredIntegrations = filterBySearchQuery(
+ (availableIntegrations || []).filter(
+ (integration: IntegrationMenuItem) =>
+ integration?.integrationType ===
+ selectedRootIntegration?.integrationType,
+ ),
+ ["name"],
+ );
+ const filteredTools = filterBySearchQuery(selectedIntegrationTools || [], [
+ "api",
+ ]);
+
+ if (level === "integrations") {
+ return (
+
+
+
+
+
+
+ {selectedRootIntegration?.name}
+
+
+ }
+ onClick={() => {
+ const template = integrationDefs.find(
+ (integration: IntegrationDef) =>
+ integration?.name === selectedRootIntegration?.name,
+ );
+ if (template) {
+ onAddNewIntegration(template);
+ }
+ }}
+ >
+ Add New
+
+
+
+
+
+ Integrations ({filteredIntegrations?.length})
+
+
+
+
+ {filteredIntegrations?.length === 0 ? (
+
+
+
+ No integrations found
+
+
+ ) : (
+ filteredIntegrations?.map(
+ (integration: IntegrationMenuItem, idx: number) => (
+ handleNavigateToTools(integration)}
+ >
+
+
+
+
+
+
+
+
+ {integration?.name}
+
+
+ {integration?.description}
+
+
+
+
+
+ ),
+ )
+ )}
+
+
+ );
+ }
+
+ if (level === "tools") {
+ return (
+
+
+
+
+
+
+ {selectedRootIntegration?.name} - {selectedIntegration?.name}
+
+
+
+
+ Tools ({filteredTools?.length})
+
+
+
+
+ {isFetchingIntegrationTools ? (
+
+
+
+ ) : filteredTools?.length === 0 ? (
+
+
+
+ No tools found
+
+
+ ) : (
+ filteredTools?.map((tool: any, idx: number) => (
+ onAddToolTask(tool)}
+ >
+
+ {tool?.integrationType ? (
+
+
+
+ ) : (
+
+ {getInitials(tool?.api)}
+
+ )}
+
+
+
+ {tool?.api}
+
+
+ {tool?.description}
+
+
+
+ ))
+ )}
+
+
+ );
+ }
+
+ return null;
+};
diff --git a/ui-next/src/components/flow/components/RichAddTaskMenu/QuickAddMenu.tsx b/ui-next/src/components/flow/components/RichAddTaskMenu/QuickAddMenu.tsx
new file mode 100644
index 0000000000..70799dba4a
--- /dev/null
+++ b/ui-next/src/components/flow/components/RichAddTaskMenu/QuickAddMenu.tsx
@@ -0,0 +1,917 @@
+import {
+ alpha,
+ Box,
+ Button,
+ CircularProgress,
+ ClickAwayListener,
+ Grid,
+ IconButton,
+ InputBase,
+ Popper,
+ Tooltip,
+ Typography,
+} from "@mui/material";
+import {
+ Check,
+ DotsThree,
+ GearIcon,
+ MagnifyingGlass,
+ X,
+} from "@phosphor-icons/react";
+import { useSelector } from "@xstate/react";
+import { WorkflowEditContext } from "pages/definition/state";
+import { buildDataForOperation } from "pages/definition/state/taskModifier/taskModifier";
+import { usePerformOperationOnDefinition } from "pages/definition/state/usePerformOperationOnDefintion";
+import { pluginRegistry } from "plugins/registry";
+import React, {
+ cloneElement,
+ ReactElement,
+ useCallback,
+ useContext,
+ useMemo,
+} from "react";
+import { NodeData } from "reaflow";
+import { CommonTaskDef, SubWorkflowTaskDef, TaskType } from "types";
+import useArrowNavigation from "useArrowNavigation";
+import { getSequentiallySuffix } from "utils/strings";
+import { getInitials } from "utils/utils";
+import { ActorRef } from "xstate";
+import { itemFilterMatcher } from "./helpers";
+import { iconForTaskTypeMap } from "./iconsForTaskTypes";
+import { useRichAddTaskMenu } from "./state/hook";
+import {
+ BaseTaskMenuItem,
+ MainStates,
+ RichAddMenuTabs,
+ RichAddTaskMenuEventTypes,
+} from "./state/types";
+import { getALL_TASKS } from "./supportedTasks";
+import {
+ generateSimpleTask,
+ generateSubWorkflowTask,
+ taskGeneratorMap,
+ uniqueTaskIdGenerator,
+} from "./taskGenerator";
+
+// Core OSS task types that always appear in the quick-add grid (in order)
+const OSS_QUICK_ADD_TYPES: TaskType[] = [
+ // row 1
+ TaskType.SIMPLE,
+ TaskType.HTTP,
+ TaskType.HTTP_POLL,
+ TaskType.GRPC,
+ TaskType.EVENT,
+ // row 2
+ TaskType.SWITCH,
+ TaskType.FORK_JOIN,
+ TaskType.DO_WHILE,
+ TaskType.SET_VARIABLE,
+ TaskType.WAIT,
+ // row 3
+ TaskType.SUB_WORKFLOW,
+ TaskType.START_WORKFLOW,
+ TaskType.TERMINATE,
+ TaskType.INLINE,
+];
+
+// AI/LLM task types for the Agentic Orchestration section
+const AI_QUICK_ADD_TYPES: TaskType[] = [
+ TaskType.LLM_CHAT_COMPLETE,
+ TaskType.LLM_TEXT_COMPLETE,
+ TaskType.LLM_GENERATE_EMBEDDINGS,
+ TaskType.LLM_GET_EMBEDDINGS,
+ TaskType.LLM_INDEX_DOCUMENT,
+ TaskType.LLM_SEARCH_INDEX,
+];
+
+const noRandomSuffix = (aPram: string) => ({
+ name: `${aPram}`,
+ taskReferenceName: `${aPram}_ref`,
+});
+
+interface QuickAddMenuProps {
+ anchorEl: HTMLElement | null;
+ richAddTaskMenuActor: ActorRef;
+}
+
+type TaskMenuItem = BaseTaskMenuItem & {
+ status?: string;
+ onClick?: () => void;
+ icon?: ReactElement;
+};
+
+const popperStyle = {
+ width: "360px",
+ boxShadow: "0px 8px 24px rgba(0, 0, 0, 0.12)",
+ borderRadius: "20px",
+ backgroundColor: "#FFFFFF",
+ overflow: "hidden",
+};
+
+const QuickAddMenu = ({
+ anchorEl,
+ richAddTaskMenuActor,
+}: QuickAddMenuProps) => {
+ const { workflowDefinitionActor } = useContext(WorkflowEditContext);
+ const { handlePerformOperation: onPerformOperation } =
+ usePerformOperationOnDefinition(workflowDefinitionActor!);
+
+ const searchQuery = useSelector(
+ richAddTaskMenuActor,
+ (state) => state.context.searchQuery,
+ );
+
+ const handleSearchChange = useCallback(
+ (value: string) => {
+ richAddTaskMenuActor.send({
+ type: RichAddTaskMenuEventTypes.TYPING,
+ text: value,
+ });
+ },
+ [richAddTaskMenuActor],
+ );
+
+ const handleClose = useCallback(() => {
+ richAddTaskMenuActor.send({ type: RichAddTaskMenuEventTypes.CLOSE_MENU });
+ }, [richAddTaskMenuActor]);
+
+ const operationContext = useSelector(
+ richAddTaskMenuActor,
+ (state) => state.context.operationContext,
+ );
+
+ const nodes = useSelector(
+ richAddTaskMenuActor,
+ (state) => state.context.nodes,
+ ) as NodeData[];
+
+ const taskRefNames: string[] = useMemo(
+ () => nodes.map((node) => node?.data?.task?.taskReferenceName),
+ [nodes],
+ );
+
+ const hoveredItem = useSelector(
+ richAddTaskMenuActor,
+ (state) => state.context.hoveredItem,
+ );
+
+ const setHoveredItem = (data: string) => {
+ richAddTaskMenuActor.send({
+ type: RichAddTaskMenuEventTypes.SET_HOVERED_ITEM,
+ data,
+ });
+ };
+
+ const getSequentialTask = useCallback(
+ ({
+ handler,
+ overrides,
+ }: {
+ handler: any;
+ overrides?: Partial;
+ }) => {
+ let newTask = handler({
+ overrides,
+ nameGenerator: noRandomSuffix,
+ });
+
+ if (Array.isArray(newTask)) {
+ newTask = newTask.map((task) => {
+ const sequentialName = getSequentiallySuffix({
+ name: task.taskReferenceName,
+ refNames: taskRefNames,
+ });
+
+ return {
+ ...task,
+ name: overrides?.name ? task.name : sequentialName.name,
+ taskReferenceName: sequentialName.taskReferenceName,
+ };
+ });
+
+ return newTask;
+ }
+
+ const sequentialName = getSequentiallySuffix({
+ name: newTask.taskReferenceName,
+ refNames: taskRefNames,
+ });
+
+ return {
+ ...newTask,
+ name: overrides?.name ? newTask?.name : sequentialName.name,
+ taskReferenceName: sequentialName.taskReferenceName,
+ };
+ },
+ [taskRefNames],
+ );
+
+ const handleAddTaskBelow = useCallback(
+ (payloadGenFn: () => CommonTaskDef | CommonTaskDef[]) => () => {
+ const dataForOperation = buildDataForOperation(
+ operationContext?.port,
+ operationContext?.node,
+ );
+
+ onPerformOperation({
+ ...dataForOperation,
+ operation: {
+ payload: payloadGenFn(),
+ },
+ });
+ },
+ [onPerformOperation, operationContext],
+ );
+
+ const taskOptions = useMemo(
+ () =>
+ getALL_TASKS().map((bt: BaseTaskMenuItem) => {
+ const IconComponent = iconForTaskTypeMap[bt.type];
+ const generatorForType = taskGeneratorMap[bt.type];
+
+ const taskRenameMap = (name: string) => {
+ switch (name) {
+ case "Event Task":
+ return "Publish Event";
+ case "Inline Task":
+ return "Javascript";
+ case "LLM Chat Complete":
+ return "Chat Complete";
+ case "LLM Index Document":
+ return "Index Document";
+ case "LLM Search Index":
+ return "Search Document";
+ case "LLM Generate Embeddings":
+ return "Generate Embeddings";
+ case "LLM Get Embeddings":
+ return "Search Embeddings";
+
+ default:
+ return name;
+ }
+ };
+ return {
+ category: bt.category,
+ name: taskRenameMap(bt.name),
+ description: bt.description,
+ onClick: handleAddTaskBelow(() =>
+ getSequentialTask({
+ handler: generatorForType,
+ }),
+ ),
+ type: bt.type,
+ icon: ,
+ };
+ }),
+ [handleAddTaskBelow, getSequentialTask],
+ );
+
+ const workerMenuItems = useSelector(
+ richAddTaskMenuActor,
+ (state) => state.context.workerMenuItems ?? [],
+ );
+
+ const subWorkflowMenuItems = useSelector(
+ richAddTaskMenuActor,
+ (state) => state.context.workflowMenuItems ?? [],
+ );
+
+ const workerOptions = useMemo(
+ () =>
+ workerMenuItems.map((baseItem: BaseTaskMenuItem) => ({
+ ...baseItem,
+ onClick: handleAddTaskBelow(() =>
+ getSequentialTask({
+ overrides: {
+ name: baseItem.name,
+ taskReferenceName: `${baseItem.name}_ref`,
+ },
+ handler: generateSimpleTask,
+ }),
+ ),
+ })),
+ [getSequentialTask, handleAddTaskBelow, workerMenuItems],
+ );
+
+ const workflowDefinitionsOptions = useMemo(
+ () =>
+ subWorkflowMenuItems.map((baseItem: BaseTaskMenuItem) => ({
+ ...baseItem,
+ onClick: handleAddTaskBelow(() =>
+ getSequentialTask({
+ overrides: {
+ name: baseItem.name,
+ taskReferenceName: `${baseItem.name}_ref`,
+ subWorkflowParam: {
+ name: baseItem.name,
+ version: baseItem.version,
+ },
+ },
+ handler: generateSubWorkflowTask,
+ }),
+ ),
+ })),
+ [subWorkflowMenuItems, handleAddTaskBelow, getSequentialTask],
+ );
+
+ const options = useMemo(
+ () =>
+ [
+ ...taskOptions,
+ ...workerOptions,
+ ...workflowDefinitionsOptions,
+ ] as TaskMenuItem[],
+ [taskOptions, workerOptions, workflowDefinitionsOptions],
+ );
+
+ const quickTasksOptions = useMemo(() => {
+ // Build quick-add types: OSS core types + plugin-registered types with quickAdd: true
+ const pluginQuickAddTypes = pluginRegistry
+ .getTaskMenuItems()
+ .filter((item) => item.quickAdd)
+ .map((item) => item.type as TaskType);
+
+ // Combine OSS and plugin types, but exclude AI tasks (they go in Agentic Orchestration)
+ const aiTaskTypesSet = new Set(AI_QUICK_ADD_TYPES as string[]);
+ const coreTaskTypes = [
+ ...OSS_QUICK_ADD_TYPES,
+ ...pluginQuickAddTypes,
+ ].filter((type) => !aiTaskTypesSet.has(type));
+
+ // Map through coreTaskTypes to preserve order and find matching tasks
+ const coreTasks = coreTaskTypes
+ ?.map((taskType) => taskOptions.find((task) => task.type === taskType))
+ ?.filter((task): task is NonNullable => task !== undefined);
+
+ // Map AI tasks for the Agentic Orchestration section
+ const aiTasks = AI_QUICK_ADD_TYPES.map((taskType) =>
+ taskOptions.find((task) => task.type === taskType),
+ )?.filter((task): task is NonNullable => task !== undefined);
+
+ // Build final list:
+ // - Core tasks (no section title)
+ // - AI tasks with "Agentic Orchestration" divider
+ const result = [...coreTasks, ...aiTasks];
+
+ // Store AI section start index for divider rendering
+ (result as any).__aiStartIndex = coreTasks.length;
+
+ return result;
+ }, [taskOptions]);
+
+ const filteredOptions = useMemo(() => {
+ if (options) {
+ const filterer = itemFilterMatcher(searchQuery, RichAddMenuTabs.ALL_TAB);
+ return options.filter(filterer);
+ } else return [];
+ }, [searchQuery, options]);
+
+ const isFetching = useSelector(
+ richAddTaskMenuActor,
+ (state) =>
+ state.matches(`init.main.${MainStates.FETCH_FOR_TASK_DEFINITIONS}`) ||
+ state.matches(`init.main.${MainStates.FETCH_FOR_WORKFLOW_DEFINITIONS}`),
+ );
+
+ const [{ menuType }, { handleChangeMenuType }] =
+ useRichAddTaskMenu(richAddTaskMenuActor);
+
+ const handleTaskClick = (task: TaskMenuItem) => {
+ if (task.category === RichAddMenuTabs.INTEGRATIONS_TAB) {
+ handleChangeMenuType("advanced");
+ } else if (task.onClick) {
+ task.onClick();
+ }
+ };
+
+ const { inputProps, optionPropsForItem } = useArrowNavigation({
+ onSelect: (elem) => {
+ if (elem?.onClick) {
+ elem?.onClick();
+ }
+ },
+ options: filteredOptions.slice(0, 3) || [],
+ optionsIdGen: uniqueTaskIdGenerator,
+ scrollToCenter: true,
+ hoveredItem,
+ setHoveredItem,
+ });
+
+ return (
+
+
+
+ {/* Search Header */}
+
+
+
+ handleSearchChange(e.target.value)}
+ autoFocus
+ sx={{
+ flex: 1,
+ fontSize: "0.9375rem",
+ color: "#1E293B",
+ "& input": {
+ padding: 0,
+ "&::placeholder": {
+ color: "#94A3B8",
+ opacity: 1,
+ },
+ },
+ }}
+ endAdornment={
+ searchQuery ? (
+ handleSearchChange("")}
+ sx={{
+ color: "#94A3B8",
+ p: 0.5,
+ "&:hover": {
+ color: "#64748B",
+ backgroundColor: "transparent",
+ },
+ }}
+ >
+
+
+ ) : null
+ }
+ />
+
+
+
+ {/* Quick Add Section */}
+ {!searchQuery ? (
+
+
+
+ QUICK ADD
+
+
+
+
+ {/* Grid Layout: 5 columns × 3 rows = 15 items max */}
+
+ {quickTasksOptions.slice(0, 15).map((item, index) => {
+ const aiStartIndex =
+ (quickTasksOptions as any).__aiStartIndex ?? 15;
+ const showDivider =
+ index === aiStartIndex && aiStartIndex < 15;
+
+ return (
+
+ {showDivider && (
+
+
+
+ Agentic Orchestration
+
+
+
+ )}
+
+
+
+
+
+ {item.icon}
+
+ {item.name}
+
+
+
+
+
+
+ );
+ })}
+
+
+ ) : (
+ // Search Results Section
+
+
+
+ SEARCH RESULTS
+
+
+ {filteredOptions.length > 3 && (
+ handleChangeMenuType("advanced")}
+ sx={{
+ display: "flex",
+ alignItems: "center",
+ gap: 0.75,
+ px: 1.5,
+ py: 0.75,
+ borderRadius: 1.5,
+ backgroundColor: alpha("#F1F5F9", 0.6),
+ color: "#64748B",
+ fontSize: "0.75rem",
+ fontWeight: 500,
+ cursor: "pointer",
+ transition: "all 0.2s ease",
+ "&:hover": {
+ backgroundColor: alpha("#3B82F6", 0.08),
+ color: "#3B82F6",
+ },
+ }}
+ >
+
+ {isFetching ? (
+
+ ) : (
+ `+${filteredOptions.length - 3} more`
+ )}
+
+
+ )}
+
+
+ {isFetching && filteredOptions.length === 0 ? (
+
+
+
+ ) : filteredOptions.length === 0 ? (
+
+
+
+ No tasks found
+
+
+ ) : (
+ <>
+ {filteredOptions.slice(0, 3).map((item, index) => (
+ handleTaskClick(item)}
+ sx={{
+ p: 2,
+ borderRadius: 2,
+ cursor: "pointer",
+ backgroundColor:
+ uniqueTaskIdGenerator(item) === hoveredItem
+ ? alpha("#F1F5F9", 0.6)
+ : "#FFFFFF",
+ border: "2px solid",
+ borderColor:
+ uniqueTaskIdGenerator(item) === hoveredItem
+ ? alpha("#3B82F6", 0.2)
+ : "transparent",
+ transition: "all 0.2s ease",
+ "&:hover": {
+ backgroundColor: alpha("#F1F5F9", 0.6),
+ borderColor: alpha("#3B82F6", 0.2),
+ transform: "translateY(-1px)",
+ "& .task-icon-box": {
+ backgroundColor: alpha("#3B82F6", 0.08),
+ },
+ },
+ }}
+ >
+
+
+ {item?.icon ? (
+ cloneElement(item.icon, {
+ color:
+ uniqueTaskIdGenerator(item) === hoveredItem
+ ? "#3B82F6"
+ : "#64748B",
+ })
+ ) : (
+
+ {getInitials(item.name)}
+
+ )}
+
+
+
+ {item.name}
+
+
+ {item.description}
+
+ {item.category ===
+ RichAddMenuTabs.INTEGRATIONS_TAB && (
+
+ {item.status === "active" ? (
+
+ ) : (
+
+ )}
+ {item.status === "active"
+ ? "Ready to use"
+ : "Setup required"}
+
+ )}
+
+
+
+ ))}
+ {isFetching && filteredOptions.length < 3 && (
+
+
+
+ )}
+ >
+ )}
+
+
+ )}
+
+
+
+ );
+};
+
+export default QuickAddMenu;
diff --git a/ui-next/src/components/flow/components/RichAddTaskMenu/helpers.ts b/ui-next/src/components/flow/components/RichAddTaskMenu/helpers.ts
new file mode 100644
index 0000000000..b67a7e5824
--- /dev/null
+++ b/ui-next/src/components/flow/components/RichAddTaskMenu/helpers.ts
@@ -0,0 +1,105 @@
+import { BaseTaskMenuItem, RichAddMenuTabs } from "./state/types";
+
+export const itemMatchesSelectedTask = (
+ item: BaseTaskMenuItem,
+ selectedTab: RichAddMenuTabs,
+) => selectedTab === RichAddMenuTabs.ALL_TAB || selectedTab === item.category;
+
+export const itemNameIncludesText = (
+ item: BaseTaskMenuItem,
+ searchQuery: string,
+) => {
+ const query = searchQuery?.toLowerCase();
+ return (
+ item?.name?.toLowerCase()?.includes(query) ||
+ item?.type?.toLowerCase()?.includes(query)
+ );
+};
+
+export const itemFilterMatcher =
+ (searchQuery: string, selectedTab: RichAddMenuTabs) =>
+ (item: BaseTaskMenuItem) =>
+ itemMatchesSelectedTask(item, selectedTab) &&
+ itemNameIncludesText(item, searchQuery);
+
+interface JSONSchemaProperty {
+ type: string;
+ properties?: Record;
+ items?: JSONSchemaProperty;
+ required?: string[];
+ enum?: any[];
+ default?: any;
+ minimum?: number;
+ maximum?: number;
+ description?: string;
+ additionalProperties?: boolean;
+ $schema?: string;
+}
+
+interface JSONSchema extends JSONSchemaProperty {
+ type: string;
+ properties?: Record;
+ required?: string[];
+}
+
+export const generateObjectFromSchema = (schema: JSONSchema): any => {
+ if (!schema?.type) {
+ return undefined;
+ }
+
+ switch (schema?.type) {
+ case "object": {
+ if (!schema.properties) {
+ return {};
+ }
+
+ const obj: Record = {};
+ Object.entries(schema?.properties || {}).forEach(([key, prop]) => {
+ if (prop?.default !== undefined) {
+ obj[key] = prop?.default;
+ } else if (prop?.enum && prop?.enum?.length > 0) {
+ obj[key] = prop?.enum[0];
+ } else if (prop?.type === "integer" || prop?.type === "number") {
+ // Handle minimum/maximum constraints
+ if (prop?.minimum !== undefined) {
+ obj[key] = prop?.minimum;
+ } else if (prop?.maximum !== undefined) {
+ obj[key] = Math.min(
+ prop?.maximum,
+ prop?.type === "integer" ? 1 : 1.0,
+ );
+ } else {
+ obj[key] = prop?.type === "integer" ? 1 : 1.0;
+ }
+ } else {
+ obj[key] = generateObjectFromSchema(prop as JSONSchema);
+ }
+ });
+ return obj;
+ }
+ case "array": {
+ if (!schema?.items) {
+ return [];
+ }
+ return [generateObjectFromSchema(schema?.items as JSONSchema)];
+ }
+ case "string": {
+ return "";
+ }
+ case "integer": {
+ return schema?.minimum !== undefined ? schema?.minimum : 1;
+ }
+ case "number": {
+ return schema?.minimum !== undefined ? schema?.minimum : 1.0;
+ }
+ case "boolean": {
+ return false;
+ }
+ case "null": {
+ return null;
+ }
+ default: {
+ return undefined;
+ }
+ }
+};
diff --git a/ui-next/src/components/flow/components/RichAddTaskMenu/iconsForTaskTypes.ts b/ui-next/src/components/flow/components/RichAddTaskMenu/iconsForTaskTypes.ts
new file mode 100644
index 0000000000..77d2ff8d0f
--- /dev/null
+++ b/ui-next/src/components/flow/components/RichAddTaskMenu/iconsForTaskTypes.ts
@@ -0,0 +1,97 @@
+import { TaskType } from "types";
+import {
+ Cards,
+ CloudArrowDown,
+ Function,
+ Hourglass,
+ Person as HumanTaskIcon,
+ Pause,
+ Repeat,
+ RocketLaunch,
+ ShieldCheck,
+ X,
+ Diamond,
+ GitFork,
+ Globe,
+ FileJsIcon,
+ HandshakeIcon,
+ ClockClockwiseIcon,
+ PersonSimpleRunIcon,
+ BroadcastIcon,
+ RowsIcon,
+ FilesIcon,
+ FileMagnifyingGlass,
+} from "@phosphor-icons/react";
+import SendgridIcon from "../shapes/TaskCard/icons/Sendgrid";
+
+import HttpPollIcon from "../shapes/TaskCard/icons/HttpPoll";
+import JsonIcon from "../shapes/TaskCard/icons/Json";
+
+import WorkerSimpleIcon from "../shapes/TaskCard/icons/Worker";
+import SimpleWorkerIcon from "../shapes/TaskCard/icons/Simple";
+import LlmTextComplete from "../shapes/TaskCard/icons/LlmTextComplete";
+import LlmGenerateEmbeddings from "../shapes/TaskCard/icons/LlmGenerateEmbeddings";
+import LlmGetEmbeddings from "../shapes/TaskCard/icons/LlmGetEmbeddings";
+import LlmStoreEmbeddings from "../shapes/TaskCard/icons/LlmStoreEmbeddings";
+import LlmSearchIndex from "../shapes/TaskCard/icons/LlmSearchIndex";
+import LlmIndexDocument from "../shapes/TaskCard/icons/LlmIndexDocument";
+import GetDocument from "../shapes/TaskCard/icons/GetDocument";
+import LlmIndexText from "../shapes/TaskCard/icons/LlmIndexText";
+import QueryProcessor from "../shapes/TaskCard/icons/QueryProcessor";
+import OpsGenie from "../shapes/TaskCard/icons/OpsGenie";
+import UpdateTaskIcon from "../shapes/TaskCard/icons/UpdateTaskIcon";
+import UpdateSecretIcon from "../shapes/TaskCard/icons/UpdateSecret";
+import LlmChatComplete from "../shapes/TaskCard/icons/LlmChatComplete";
+
+import { FormTaskType } from "types";
+import React from "react";
+import MCPIcon from "../shapes/TaskCard/icons/MCPIcon";
+import { ForkJoinIcon } from "../shapes/TaskCard/icons/ForkJoinIcon";
+
+export const iconForTaskTypeMap = {
+ [TaskType.WAIT]: Hourglass,
+ [TaskType.HTTP]: Globe,
+ [TaskType.KAFKA_PUBLISH]: WorkerSimpleIcon, // This one is not really used
+ [TaskType.HUMAN]: HumanTaskIcon,
+ [TaskType.BUSINESS_RULE]: HandshakeIcon,
+ [TaskType.SENDGRID]: SendgridIcon,
+ [TaskType.WAIT_FOR_WEBHOOK]: ClockClockwiseIcon,
+ [TaskType.HTTP_POLL]: HttpPollIcon,
+ [TaskType.DO_WHILE]: Repeat,
+ [TaskType.SIMPLE]: SimpleWorkerIcon,
+ [TaskType.YIELD]: Pause,
+ [TaskType.JDBC]: PersonSimpleRunIcon, // Would be great if it had a good icon
+ [TaskType.EVENT]: BroadcastIcon,
+ [TaskType.JOIN]: GitFork,
+ [TaskType.FORK_JOIN]: ForkJoinIcon,
+ [TaskType.FORK_JOIN_DYNAMIC]: ForkJoinIcon,
+ [TaskType.DYNAMIC]: Cards,
+ [TaskType.INLINE]: FileJsIcon,
+ [TaskType.SWITCH]: Diamond,
+ [TaskType.JSON_JQ_TRANSFORM]: JsonIcon,
+ [TaskType.TERMINATE]: X,
+ [TaskType.SET_VARIABLE]: Function,
+ [TaskType.TERMINATE_WORKFLOW]: X,
+ [TaskType.SUB_WORKFLOW]: ForkJoinIcon,
+ [TaskType.START_WORKFLOW]: RocketLaunch,
+ [TaskType.LLM_TEXT_COMPLETE]: LlmTextComplete,
+ [TaskType.LLM_GENERATE_EMBEDDINGS]: LlmGenerateEmbeddings,
+ [TaskType.LLM_GET_EMBEDDINGS]: LlmGetEmbeddings,
+ [TaskType.LLM_STORE_EMBEDDINGS]: LlmStoreEmbeddings,
+ [TaskType.LLM_INDEX_DOCUMENT]: LlmIndexDocument,
+ [TaskType.LLM_SEARCH_INDEX]: LlmSearchIndex,
+ [TaskType.LLM_INDEX_TEXT]: LlmIndexText,
+ [TaskType.UPDATE_SECRET]: UpdateSecretIcon,
+ [TaskType.GET_DOCUMENT]: GetDocument,
+ [TaskType.QUERY_PROCESSOR]: QueryProcessor,
+ [TaskType.OPS_GENIE]: OpsGenie,
+ [TaskType.GET_SIGNED_JWT]: ShieldCheck,
+ [TaskType.UPDATE_TASK]: UpdateTaskIcon,
+ [TaskType.GET_WORKFLOW]: CloudArrowDown,
+ [TaskType.LLM_CHAT_COMPLETE]: LlmChatComplete,
+ [TaskType.GRPC]: Globe,
+ [TaskType.MCP]: MCPIcon,
+ [TaskType.CHUNK_TEXT]: RowsIcon,
+ [TaskType.LIST_FILES]: FilesIcon,
+ [TaskType.PARSE_DOCUMENT]: FileMagnifyingGlass,
+} satisfies Record;
diff --git a/ui-next/src/components/flow/components/RichAddTaskMenu/index.ts b/ui-next/src/components/flow/components/RichAddTaskMenu/index.ts
new file mode 100644
index 0000000000..72ddf2c223
--- /dev/null
+++ b/ui-next/src/components/flow/components/RichAddTaskMenu/index.ts
@@ -0,0 +1,2 @@
+export * from "./state";
+export * from "./supportedTasks";
diff --git a/ui-next/src/components/flow/components/RichAddTaskMenu/state/actions.ts b/ui-next/src/components/flow/components/RichAddTaskMenu/state/actions.ts
new file mode 100644
index 0000000000..440b93bb8f
--- /dev/null
+++ b/ui-next/src/components/flow/components/RichAddTaskMenu/state/actions.ts
@@ -0,0 +1,275 @@
+import { WorkflowDef } from "types/WorkflowDef";
+import { assign, DoneInvokeEvent, raise } from "xstate";
+import {
+ RichAddTaskMenuMachineContext,
+ TypingEvent,
+ TaskDefinition,
+ SetHoveredItemEvent,
+ SetSelectedTabEvent,
+ RichAddMenuTabs,
+ GotToEndEvent,
+ BaseTaskMenuItem,
+ RichAddTaskMenuEventTypes,
+ ScrollToTopEvent,
+ SetMenuTypeEvent,
+ IntegrationMenuItem,
+ FetchIntegrationToolsEvent,
+ UpdateIntegrationDrillDownEvent,
+} from "./types";
+import { TaskType } from "types/common";
+import _first from "lodash/first";
+import { itemFilterMatcher } from "../helpers";
+import { uniqueTaskIdGenerator } from "../taskGenerator";
+
+// Type for raw integration data from API
+interface RawIntegrationData {
+ name: string;
+ description?: string;
+ type: string;
+ iconName?: string;
+ category?: string;
+}
+
+export const persistSearchQuery = assign<
+ RichAddTaskMenuMachineContext,
+ TypingEvent
+>({
+ searchQuery: (context, event) => event.text,
+});
+
+export const persistTaskDefinitions = assign<
+ RichAddTaskMenuMachineContext,
+ DoneInvokeEvent
+>((_context, event) => {
+ return {
+ taskDefinitions: event.data,
+ workerMenuItems: event.data.map(
+ (task): BaseTaskMenuItem => ({
+ category: RichAddMenuTabs.WORKERS_TAB,
+ name: task.name,
+ description: task.description,
+ type: TaskType.SIMPLE,
+ }),
+ ),
+ isTaskDefFetched: true, // FIXME, remove flags.
+ };
+});
+
+export const persistWorkflowDefinitions = assign<
+ RichAddTaskMenuMachineContext,
+ DoneInvokeEvent
+>((_context, event) => {
+ return {
+ workflowDefinitions: event.data,
+ workflowMenuItems: event.data.map(
+ (workflow): BaseTaskMenuItem => ({
+ category: RichAddMenuTabs.SUB_WORKFLOWS_TAB,
+ name: workflow.name,
+ description: workflow.description,
+ version: workflow.version,
+ type: TaskType.SUB_WORKFLOW,
+ }),
+ ),
+ isSubWfFetched: true,
+ };
+});
+
+export const persistIntegrations = assign<
+ RichAddTaskMenuMachineContext,
+ DoneInvokeEvent
+>((context, event) => {
+ const data = event.data as
+ | {
+ supportedIntegrations?: RawIntegrationData[];
+ availableIntegrations?: RawIntegrationData[];
+ }
+ | undefined;
+
+ // If the fetch failed or returned bad data, preserve existing integrations
+ if (!data || (!data.supportedIntegrations && !data.availableIntegrations)) {
+ console.warn(
+ "[persistIntegrations] No integration data received, preserving existing state",
+ );
+ return {
+ isIntegrationsFetched: true,
+ };
+ }
+
+ // Get the types that are already in availableIntegrations
+ const availableIntegrationTypes =
+ data?.availableIntegrations?.map((integration) => integration.type) || [];
+
+ return {
+ integrationDefs:
+ (data?.supportedIntegrations as never) ?? context.integrationDefs,
+ supportedIntegrations:
+ data?.supportedIntegrations?.map(
+ (integration): IntegrationMenuItem => ({
+ category: RichAddMenuTabs.INTEGRATIONS_TAB,
+ name: integration.name,
+ description: integration.description ?? "",
+ type: TaskType.MCP,
+ integrationType: integration.type,
+ iconName: integration.iconName ?? "",
+ status: availableIntegrationTypes.includes(integration.type)
+ ? "active"
+ : "inactive",
+ }),
+ ) ??
+ context.supportedIntegrations ??
+ [],
+ availableIntegrations:
+ data?.availableIntegrations?.map(
+ (integration): IntegrationMenuItem => ({
+ category: RichAddMenuTabs.INTEGRATIONS_TAB,
+ name: integration.name,
+ description: integration.description ?? "",
+ type: TaskType.MCP,
+ integrationType: integration.type,
+ iconName:
+ data?.supportedIntegrations?.find(
+ (supportedIntegration) =>
+ supportedIntegration.type === integration.type,
+ )?.iconName ?? "",
+ status: "active",
+ }),
+ ) ??
+ context.availableIntegrations ??
+ [],
+ isIntegrationsFetched: true,
+ };
+});
+
+export const persistHoveredItem = assign<
+ RichAddTaskMenuMachineContext,
+ SetHoveredItemEvent
+>({
+ hoveredItem: (context, event) => event.data,
+});
+
+export const persistSelectedTab = assign<
+ RichAddTaskMenuMachineContext,
+ SetSelectedTabEvent
+>({
+ selectedTab: (context, event) => event.tab,
+});
+
+export const setSelectedTabAll = assign({
+ selectedTab: RichAddMenuTabs.ALL_TAB,
+});
+
+export const persistLastScrollPosition = assign<
+ RichAddTaskMenuMachineContext,
+ GotToEndEvent
+>({
+ lastScrollTopPosition: (context, event) => event.lastScrollTopPosition,
+});
+
+export const updateToScrollTop = assign({
+ toScrollTop: (context) => context.lastScrollTopPosition,
+});
+
+export const persistToScrollTop = assign({
+ toScrollTop: () => 0,
+ lastScrollTopPosition: () => 0,
+});
+
+export const resetToScrollTop = raise<
+ RichAddTaskMenuMachineContext,
+ ScrollToTopEvent
+>(
+ (__, _event) => ({
+ type: RichAddTaskMenuEventTypes.SCROLL_TO_TOP,
+ }),
+ { delay: 100 },
+);
+
+export const preSelectTheFirstItem = assign<
+ RichAddTaskMenuMachineContext,
+ SetSelectedTabEvent
+>({
+ hoveredItem: (context) => {
+ const allItems = context.baseTaskMenuItems
+ .concat(context?.workerMenuItems ?? [])
+ .concat(context?.workflowMenuItems);
+
+ const finder = itemFilterMatcher(context.searchQuery, context.selectedTab);
+
+ const firstItem = allItems.find(finder);
+
+ return firstItem ? uniqueTaskIdGenerator(firstItem) : context.hoveredItem;
+ },
+});
+export const hoverFirstItem = assign({
+ hoveredItem: (context) => {
+ const firstAllTasks = _first(context.baseTaskMenuItems);
+ return firstAllTasks
+ ? uniqueTaskIdGenerator(firstAllTasks)
+ : context.hoveredItem;
+ },
+});
+
+export const persistMenuType = assign<
+ RichAddTaskMenuMachineContext,
+ SetMenuTypeEvent
+>({
+ menuType: (context, event) => event.menuType,
+});
+
+export const persistSelectedIntegration = assign<
+ RichAddTaskMenuMachineContext,
+ FetchIntegrationToolsEvent
+>({
+ integrationDrillDownMenu: (context, event) => ({
+ ...context.integrationDrillDownMenu,
+ selectedIntegration: event.integration,
+ }),
+});
+
+// export const clearSelectedIntegration = assign<
+// RichAddTaskMenuMachineContext,
+// SetSelectedTabEvent
+// >({
+// selectedIntegration: (_context) => undefined,
+// });
+
+export const persistSelectedIntegrationTools = assign<
+ RichAddTaskMenuMachineContext,
+ DoneInvokeEvent[]>
+>({
+ integrationDrillDownMenu: (context, event) => ({
+ ...context.integrationDrillDownMenu,
+ level: "tools",
+ selectedIntegrationTools: event.data,
+ }),
+});
+
+// export const clearSelectedIntegrationTools = assign<
+// RichAddTaskMenuMachineContext,
+// SetSelectedTabEvent
+// >({
+// selectedIntegrationTools: (_context) => undefined,
+// });
+
+export const persistIntegrationDrillDown = assign<
+ RichAddTaskMenuMachineContext,
+ UpdateIntegrationDrillDownEvent
+>({
+ integrationDrillDownMenu: (_context, event) => event.data,
+});
+
+export const switchToAdvancedMenu = raise<
+ RichAddTaskMenuMachineContext,
+ SetMenuTypeEvent
+>({
+ type: RichAddTaskMenuEventTypes.SET_MENU_TYPE,
+ menuType: "advanced",
+});
+
+export const switchSelectedTabToIntegrations = raise<
+ RichAddTaskMenuMachineContext,
+ SetSelectedTabEvent
+>({
+ type: RichAddTaskMenuEventTypes.SET_SELECTED_TAB,
+ tab: RichAddMenuTabs.INTEGRATIONS_TAB,
+});
diff --git a/ui-next/src/components/flow/components/RichAddTaskMenu/state/guards.ts b/ui-next/src/components/flow/components/RichAddTaskMenu/state/guards.ts
new file mode 100644
index 0000000000..67041a5c7a
--- /dev/null
+++ b/ui-next/src/components/flow/components/RichAddTaskMenu/state/guards.ts
@@ -0,0 +1,34 @@
+import {
+ RichAddMenuTabs,
+ RichAddTaskMenuMachineContext,
+ SetSelectedTabEvent,
+} from "./types";
+
+export const isTabIsWorkers = (
+ _context: RichAddTaskMenuMachineContext,
+ { tab }: SetSelectedTabEvent,
+) => {
+ return tab === RichAddMenuTabs.WORKERS_TAB;
+};
+
+export const isTabIsSubWorkflows = (
+ _context: RichAddTaskMenuMachineContext,
+ { tab }: SetSelectedTabEvent,
+) => tab === RichAddMenuTabs.SUB_WORKFLOWS_TAB;
+
+export const isTaskDefNotFetched = ({
+ isTaskDefFetched,
+}: RichAddTaskMenuMachineContext) => !isTaskDefFetched;
+
+export const isSubWfNotFetched = ({
+ isSubWfFetched,
+}: RichAddTaskMenuMachineContext) => !isSubWfFetched;
+
+export const isIntegrationsNotFetched = ({
+ isIntegrationsFetched,
+}: RichAddTaskMenuMachineContext) => !isIntegrationsFetched;
+
+export const isTabIsIntegrations = (
+ _context: RichAddTaskMenuMachineContext,
+ { tab }: SetSelectedTabEvent,
+) => tab === RichAddMenuTabs.INTEGRATIONS_TAB;
diff --git a/ui-next/src/components/flow/components/RichAddTaskMenu/state/hook.ts b/ui-next/src/components/flow/components/RichAddTaskMenu/state/hook.ts
new file mode 100644
index 0000000000..f795eba038
--- /dev/null
+++ b/ui-next/src/components/flow/components/RichAddTaskMenu/state/hook.ts
@@ -0,0 +1,158 @@
+import { useSelector } from "@xstate/react";
+import { ActorRef } from "xstate";
+
+import {
+ IntegrationDrillDownMenuProp,
+ IntegrationMenuItem,
+ MainStates,
+ RichAddTaskMenuEvents,
+ RichAddTaskMenuEventTypes,
+} from "./types";
+import { NodeData } from "reaflow";
+
+export const useRichAddTaskMenu = (
+ richAddTaskMenuActor: ActorRef,
+) => {
+ const menuType = useSelector(
+ richAddTaskMenuActor,
+ (state) => state.context.menuType,
+ );
+
+ const supportedIntegrations = useSelector(
+ richAddTaskMenuActor,
+ (state) => state.context.supportedIntegrations,
+ );
+
+ const availableIntegrations = useSelector(
+ richAddTaskMenuActor,
+ (state) => state.context.availableIntegrations,
+ );
+
+ const integrationDefs = useSelector(
+ richAddTaskMenuActor,
+ (state) => state.context.integrationDefs,
+ );
+
+ const integrationTypes = useSelector(
+ richAddTaskMenuActor,
+ (state) => state.context.integrationTypes,
+ );
+
+ const integrationDrillDownMenu = useSelector(
+ richAddTaskMenuActor,
+ (state) => state.context?.integrationDrillDownMenu,
+ );
+
+ // Add scroll position tracking
+ const scrollPosition = useSelector(
+ richAddTaskMenuActor,
+ (state) => state.context.toScrollTop,
+ );
+
+ const operationContext = useSelector(
+ richAddTaskMenuActor,
+ (state) => state.context.operationContext,
+ );
+
+ const nodes = useSelector(
+ richAddTaskMenuActor,
+ (state) => state.context.nodes,
+ ) as NodeData[];
+
+ const workerMenuItems = useSelector(
+ richAddTaskMenuActor,
+ (state) => state.context.workerMenuItems ?? [],
+ );
+
+ const subWorkflowMenuItems = useSelector(
+ richAddTaskMenuActor,
+ (state) => state.context.workflowMenuItems ?? [],
+ );
+
+ const selectedTab = useSelector(
+ richAddTaskMenuActor,
+ (state) => state.context.selectedTab,
+ );
+
+ const isFetching = useSelector(
+ richAddTaskMenuActor,
+ (state) =>
+ state.matches(`init.main.${MainStates.FETCH_FOR_TASK_DEFINITIONS}`) ||
+ state.matches(`init.main.${MainStates.FETCH_FOR_WORKFLOW_DEFINITIONS}`) ||
+ state.matches(`init.main.${MainStates.FETCH_FOR_INTEGRATIONS}`),
+ );
+
+ const isFetchingIntegrationTools = useSelector(
+ richAddTaskMenuActor,
+ (state) =>
+ state.matches(`init.main.${MainStates.FETCH_FOR_INTEGRATION_TOOLS}`),
+ );
+
+ const searchQuery = useSelector(
+ richAddTaskMenuActor,
+ (state) => state.context.searchQuery,
+ );
+
+ const handleChangeMenuType = (menuType: "quick" | "advanced") => {
+ richAddTaskMenuActor.send({
+ type: RichAddTaskMenuEventTypes.SET_MENU_TYPE,
+ menuType,
+ });
+ };
+
+ const handleFetchIntegrationTools = (integration: IntegrationMenuItem) => {
+ richAddTaskMenuActor.send({
+ type: RichAddTaskMenuEventTypes.FETCH_INTEGRATION_TOOLS,
+ integration,
+ });
+ };
+
+ const refetchIntegrations = () => {
+ richAddTaskMenuActor.send({
+ type: RichAddTaskMenuEventTypes.REFETCH_INTEGRATIONS,
+ });
+ };
+
+ const handleUpdateIntegrationDrillDown = (
+ integration: IntegrationDrillDownMenuProp,
+ ) => {
+ richAddTaskMenuActor.send({
+ type: RichAddTaskMenuEventTypes.UPDATE_INTEGRATION_DRILL_DOWN,
+ data: integration,
+ });
+ };
+
+ const handleTyping = (value: any) => {
+ richAddTaskMenuActor.send({
+ type: RichAddTaskMenuEventTypes.TYPING,
+ text: value,
+ });
+ };
+
+ return [
+ {
+ menuType,
+ supportedIntegrations: supportedIntegrations ?? [],
+ availableIntegrations: availableIntegrations ?? [],
+ integrationDefs: integrationDefs ?? [],
+ integrationTypes: integrationTypes ?? [],
+ integrationDrillDownMenu: integrationDrillDownMenu ?? {},
+ scrollPosition,
+ operationContext,
+ nodes,
+ workerMenuItems,
+ subWorkflowMenuItems,
+ selectedTab,
+ isFetching,
+ isFetchingIntegrationTools,
+ searchQuery,
+ },
+ {
+ handleChangeMenuType,
+ handleFetchIntegrationTools,
+ refetchIntegrations,
+ handleUpdateIntegrationDrillDown,
+ handleTyping,
+ },
+ ] as const;
+};
diff --git a/ui-next/src/components/flow/components/RichAddTaskMenu/state/index.ts b/ui-next/src/components/flow/components/RichAddTaskMenu/state/index.ts
new file mode 100644
index 0000000000..53401e46b9
--- /dev/null
+++ b/ui-next/src/components/flow/components/RichAddTaskMenu/state/index.ts
@@ -0,0 +1,2 @@
+export * from "./types";
+export * from "./machine";
diff --git a/ui-next/src/components/flow/components/RichAddTaskMenu/state/machine.ts b/ui-next/src/components/flow/components/RichAddTaskMenu/state/machine.ts
new file mode 100644
index 0000000000..01c2899687
--- /dev/null
+++ b/ui-next/src/components/flow/components/RichAddTaskMenu/state/machine.ts
@@ -0,0 +1,293 @@
+import { createMachine, sendParent } from "xstate";
+import {
+ RichAddTaskMenuMachineContext,
+ MainStates,
+ RichAddTaskMenuEventTypes,
+ RichAddTaskMenuEvents,
+ RichAddMenuTabs,
+} from "./types";
+import * as actions from "./actions";
+import * as services from "./services";
+import * as guards from "./guards";
+
+const MINIMUM_CHARS_TO_SEARCH = 3;
+
+export const richAddTaskMenuMachine = createMachine<
+ RichAddTaskMenuMachineContext,
+ RichAddTaskMenuEvents
+>(
+ {
+ id: "richAddTaskMenuMachine",
+ initial: "init",
+ predictableActionArguments: true,
+ context: {
+ taskDefinitions: [],
+ workflowDefinitions: [],
+ authHeaders: undefined,
+ operationContext: undefined,
+ searchQuery: "",
+ nodes: [],
+ hoveredItem: "",
+ selectedTab: RichAddMenuTabs.ALL_TAB,
+ isSubWfFetched: false,
+ isTaskDefFetched: false,
+ isIntegrationsFetched: false,
+ lastScrollTopPosition: 0,
+ toScrollTop: 0,
+ baseTaskMenuItems: [],
+ workerMenuItems: [],
+ workflowMenuItems: [],
+ supportedIntegrations: [],
+ availableIntegrations: [],
+ menuType: "quick",
+ integrationDrillDownMenu: {
+ isOpen: false,
+ selectedIntegration: null,
+ selectedRootIntegration: null,
+ level: "integrations",
+ },
+ },
+
+ states: {
+ init: {
+ type: "parallel",
+ states: {
+ main: {
+ initial: MainStates.INIT,
+ on: {
+ [RichAddTaskMenuEventTypes.CLOSE_MENU]: {
+ actions: ["setSelectedTabAll"],
+ target: `#richAddTaskMenuMachine.init.main.${MainStates.CLOSED}`,
+ },
+ [RichAddTaskMenuEventTypes.SET_HOVERED_ITEM]: {
+ actions: ["persistHoveredItem"],
+ },
+ [RichAddTaskMenuEventTypes.SET_SELECTED_TAB]: [
+ {
+ cond: (context, event) =>
+ guards.isTabIsWorkers(context, event) &&
+ guards.isTaskDefNotFetched(context),
+ actions: ["persistSelectedTab"],
+ target: `#richAddTaskMenuMachine.init.main.${MainStates.FETCH_FOR_TASK_DEFINITIONS}`,
+ },
+
+ {
+ cond: (context, event) =>
+ guards.isTabIsIntegrations(context, event) &&
+ guards.isIntegrationsNotFetched(context),
+ actions: ["persistSelectedTab"],
+ target: `#richAddTaskMenuMachine.init.main.${MainStates.FETCH_FOR_INTEGRATIONS}`,
+ },
+ {
+ actions: [
+ "persistSelectedTab",
+ "preSelectTheFirstItem",
+ "persistToScrollTop",
+ ],
+ },
+ ],
+ [RichAddTaskMenuEventTypes.SET_MENU_TYPE]: [
+ {
+ cond: (_, event) => event.menuType === "advanced",
+ actions: ["persistMenuType", sendParent((_, event) => event)],
+ },
+ {
+ actions: ["persistMenuType"],
+ },
+ ],
+ [RichAddTaskMenuEventTypes.SWITCH_TO_INTEGRATIONS]: {
+ actions: [
+ "switchToAdvancedMenu",
+ "switchSelectedTabToIntegrations",
+ ],
+ },
+ },
+ states: {
+ [MainStates.INIT]: {
+ entry: "hoverFirstItem",
+ always: {
+ target: MainStates.IDLE,
+ },
+ },
+ [MainStates.CLOSED]: {
+ always: {
+ target: "#richAddTaskMenuMachine.final",
+ },
+ },
+ [MainStates.IDLE]: {
+ after: {
+ 500: {
+ target: MainStates.FETCH_FOR_TASK_DEFINITIONS,
+ cond: (context) => {
+ const result =
+ context.searchQuery.length > MINIMUM_CHARS_TO_SEARCH;
+ return result;
+ },
+ },
+ },
+ on: {
+ [RichAddTaskMenuEventTypes.TYPING]: {
+ target: MainStates.IDLE,
+ actions: "preSelectTheFirstItem",
+ },
+ [RichAddTaskMenuEventTypes.GOT_TO_END]: {
+ actions: "persistLastScrollPosition",
+ target: "fetchForTaskDefinitions",
+ },
+ },
+ },
+ [MainStates.FETCH_FOR_TASK_DEFINITIONS]: {
+ invoke: {
+ id: "fetchForTaskDefinitions",
+ src: "fetchForTaskDefinitions",
+ onDone: {
+ actions: "persistTaskDefinitions",
+ target: MainStates.WITH_TASK_DEFINITIONS,
+ },
+ },
+ },
+
+ [MainStates.FETCH_FOR_INTEGRATIONS]: {
+ invoke: {
+ id: "fetchForMCPIntegrations",
+ src: "fetchForMCPIntegrations",
+ onDone: {
+ actions: "persistIntegrations",
+ target: MainStates.WITH_INTEGRATIONS,
+ },
+ onError: {
+ // On error, still transition to WITH_INTEGRATIONS but keep existing data
+ target: MainStates.WITH_INTEGRATIONS,
+ },
+ },
+ },
+ [MainStates.WITH_TASK_DEFINITIONS]: {
+ after: {
+ 500: {
+ target: MainStates.FETCH_FOR_INTEGRATIONS,
+ cond: (context) =>
+ context.searchQuery.length > MINIMUM_CHARS_TO_SEARCH + 1, // test event type
+ },
+ },
+ entry: ["updateToScrollTop", "preSelectTheFirstItem"],
+ on: {
+ [RichAddTaskMenuEventTypes.SET_SELECTED_TAB]: [
+ {
+ cond: (context, event) =>
+ guards.isTabIsIntegrations(context, event) &&
+ !guards.isIntegrationsNotFetched(context),
+ target: MainStates.WITH_INTEGRATIONS,
+ actions: ["persistSelectedTab"],
+ },
+ ],
+ [RichAddTaskMenuEventTypes.TYPING]: {
+ target: MainStates.WITH_TASK_DEFINITIONS,
+ },
+ [RichAddTaskMenuEventTypes.GOT_TO_END]: {
+ target: MainStates.FETCH_FOR_INTEGRATIONS,
+ actions: "persistLastScrollPosition",
+ },
+ },
+ },
+ [MainStates.WITH_WORKFLOW_DEFINITIONS]: {
+ after: {
+ 500: {
+ target: MainStates.FETCH_FOR_INTEGRATIONS,
+ cond: (context) =>
+ context.searchQuery.length > MINIMUM_CHARS_TO_SEARCH + 1,
+ },
+ },
+ entry: ["updateToScrollTop", "preSelectTheFirstItem"],
+ on: {
+ [RichAddTaskMenuEventTypes.SET_SELECTED_TAB]: [
+ {
+ cond: (context, event) =>
+ guards.isTabIsWorkers(context, event) &&
+ guards.isTaskDefNotFetched(context),
+ target: MainStates.FETCH_FOR_TASK_DEFINITIONS,
+ actions: ["persistSelectedTab"],
+ },
+ {
+ cond: (context, event) =>
+ guards.isTabIsIntegrations(context, event) &&
+ guards.isIntegrationsNotFetched(context),
+ target: MainStates.FETCH_FOR_INTEGRATIONS,
+ actions: ["persistSelectedTab"],
+ },
+ {
+ cond: (context, event) =>
+ guards.isTabIsIntegrations(context, event) &&
+ !guards.isIntegrationsNotFetched(context),
+ target: MainStates.WITH_INTEGRATIONS,
+ actions: ["persistSelectedTab"],
+ },
+ ],
+ [RichAddTaskMenuEventTypes.GOT_TO_END]: {
+ target: MainStates.FETCH_FOR_INTEGRATIONS,
+ actions: "persistLastScrollPosition",
+ },
+ },
+ },
+ [MainStates.WITH_INTEGRATIONS]: {
+ // Nothing to do here we rendered everything.
+ entry: ["updateToScrollTop", "preSelectTheFirstItem"],
+ on: {
+ [RichAddTaskMenuEventTypes.SET_SELECTED_TAB]: [
+ {
+ cond: (context, event) =>
+ guards.isTabIsWorkers(context, event) &&
+ guards.isTaskDefNotFetched(context),
+ target: MainStates.FETCH_FOR_TASK_DEFINITIONS,
+ actions: ["persistSelectedTab"],
+ },
+ ],
+ [RichAddTaskMenuEventTypes.FETCH_INTEGRATION_TOOLS]: [
+ {
+ actions: ["persistSelectedIntegration"],
+ target: MainStates.FETCH_FOR_INTEGRATION_TOOLS,
+ },
+ ],
+ [RichAddTaskMenuEventTypes.UPDATE_INTEGRATION_DRILL_DOWN]: {
+ actions: ["persistIntegrationDrillDown"],
+ target: MainStates.WITH_INTEGRATIONS,
+ },
+ [RichAddTaskMenuEventTypes.REFETCH_INTEGRATIONS]: {
+ target: MainStates.FETCH_FOR_INTEGRATIONS,
+ },
+ },
+ },
+ [MainStates.FETCH_FOR_INTEGRATION_TOOLS]: {
+ invoke: {
+ id: "fetchForIntegrationTools",
+ src: "fetchForIntegrationTools",
+ onDone: {
+ actions: "persistSelectedIntegrationTools",
+ target: MainStates.WITH_INTEGRATIONS,
+ },
+ onError: {
+ target: MainStates.WITH_INTEGRATIONS,
+ },
+ },
+ },
+ },
+ },
+ [MainStates.SEARCH_FIELD]: {
+ on: {
+ [RichAddTaskMenuEventTypes.TYPING]: {
+ actions: ["persistSearchQuery", "preSelectTheFirstItem"],
+ },
+ },
+ },
+ },
+ },
+ final: {
+ type: "final",
+ },
+ },
+ },
+ {
+ services,
+ actions: actions as any,
+ guards: guards as any,
+ },
+);
diff --git a/ui-next/src/components/flow/components/RichAddTaskMenu/state/services.ts b/ui-next/src/components/flow/components/RichAddTaskMenu/state/services.ts
new file mode 100644
index 0000000000..b0079c75f8
--- /dev/null
+++ b/ui-next/src/components/flow/components/RichAddTaskMenu/state/services.ts
@@ -0,0 +1,101 @@
+import { queryClient } from "queryClient";
+import { fetchWithContext, fetchContextNonHook } from "plugins/fetch";
+import { logger } from "utils/logger";
+
+import { featureFlags, FEATURES } from "utils/flags";
+import { RichAddTaskMenuMachineContext } from "./types";
+
+const fetchContext = fetchContextNonHook();
+
+const taskVisibility = featureFlags.getValue(FEATURES.TASK_VISIBILITY, "READ");
+
+export const fetchForTaskDefinitions = async ({
+ authHeaders: headers,
+}: RichAddTaskMenuMachineContext) => {
+ const taskDefinitionsUrl = `/metadata/taskdefs?access=${taskVisibility}`;
+
+ logger.info("Will search for task definitions", taskDefinitionsUrl);
+ try {
+ const response = await queryClient.fetchQuery(
+ [fetchContext.stack, taskDefinitionsUrl],
+ () => fetchWithContext(taskDefinitionsUrl, fetchContext, { headers }),
+ );
+ return response;
+ } catch (error) {
+ logger.error("Fetching task list page", error);
+ return Promise.reject({ message: "Error fetching task list page" });
+ }
+};
+
+export const fetchForWorkflowDefinitions = async ({
+ authHeaders: headers,
+}: RichAddTaskMenuMachineContext) => {
+ const workflowDefinitionUrl = `/metadata/workflow?short=true`;
+
+ logger.info("Will search for workflow definitions", workflowDefinitionUrl);
+ try {
+ const response = await queryClient.fetchQuery(
+ [fetchContext.stack, workflowDefinitionUrl],
+ () => fetchWithContext(workflowDefinitionUrl, fetchContext, { headers }),
+ );
+ return response;
+ } catch (error) {
+ logger.error("Fetching task list page", error);
+ return Promise.reject({ message: "Error fetching task list page" });
+ }
+};
+
+export const fetchForMCPIntegrations = async ({
+ authHeaders: headers,
+}: RichAddTaskMenuMachineContext) => {
+ const integrationsUrl = `/integrations/def`;
+ const providersUrl = `/integrations/provider?category=MCP&activeOnly=false`;
+
+ try {
+ const [integrationsResult, providersResult] = await Promise.allSettled([
+ queryClient.fetchQuery([fetchContext.stack, integrationsUrl], () =>
+ fetchWithContext(integrationsUrl, fetchContext, { headers }),
+ ),
+ queryClient.fetchQuery([fetchContext.stack, providersUrl], () =>
+ fetchWithContext(providersUrl, fetchContext, { headers }),
+ ),
+ ]);
+
+ logger.info("Returning integrations and providers", {
+ integrationsResult,
+ providersResult,
+ });
+ return {
+ supportedIntegrations:
+ integrationsResult.status === "fulfilled"
+ ? integrationsResult.value?.filter(
+ (integration: any) => integration.category === "MCP",
+ )
+ : [],
+ availableIntegrations:
+ providersResult.status === "fulfilled" ? providersResult.value : [],
+ };
+ } catch (error) {
+ logger.error("Fetching integrations", error);
+ return Promise.reject({ message: "Error fetching integrations" });
+ }
+};
+
+export const fetchForIntegrationTools = async ({
+ authHeaders: headers,
+ integrationDrillDownMenu: { selectedIntegration },
+}: RichAddTaskMenuMachineContext) => {
+ const toolsUrl = `/integrations/${selectedIntegration?.name}/def/apis`;
+
+ logger.info("Will search for integration tools", toolsUrl);
+ try {
+ const response = await queryClient.fetchQuery(
+ [fetchContext.stack, toolsUrl],
+ () => fetchWithContext(toolsUrl, fetchContext, { headers }),
+ );
+ return response;
+ } catch (error) {
+ logger.error("Fetching tools", error);
+ return Promise.reject({ message: "Error fetching tools" });
+ }
+};
diff --git a/ui-next/src/components/flow/components/RichAddTaskMenu/state/types.ts b/ui-next/src/components/flow/components/RichAddTaskMenu/state/types.ts
new file mode 100644
index 0000000000..7482f10da3
--- /dev/null
+++ b/ui-next/src/components/flow/components/RichAddTaskMenu/state/types.ts
@@ -0,0 +1,173 @@
+import { ReactElement } from "react";
+import { NodeData, PortData } from "reaflow";
+import { AuthHeaders, FormTaskType, IntegrationDef, WorkflowDef } from "types";
+
+export type TaskDefinition = {
+ name: string;
+ description: string;
+};
+
+export type OperationContextData = {
+ id: string;
+ port: PortData;
+ node: NodeData;
+};
+
+export type BaseTaskMenuItem = {
+ category: string;
+ name: string;
+ description: string;
+ type: FormTaskType;
+ version?: number;
+ flagHidden?: boolean;
+};
+
+export type IntegrationMenuItem = BaseTaskMenuItem & {
+ integrationType: string;
+ iconName: string;
+ status?: string;
+};
+
+export type TaskMenuItem = BaseTaskMenuItem & {
+ name: string;
+ description: string;
+ onClick: () => void;
+ icon: ReactElement;
+ category?: string;
+ version?: number;
+};
+
+export enum RichAddMenuTabs {
+ ALL_TAB = "ALL",
+ SYSTEMS_TAB = "System",
+ OPERATORS_TAB = "Operators",
+ ALERTING_TAB = "Alerting",
+ WORKERS_TAB = "Workers",
+ AI_AGENTS_TAB = "AI Tasks",
+ SUB_WORKFLOWS_TAB = "Sub Workflows",
+ INTEGRATIONS_TAB = "Integrations",
+}
+
+export type IntegrationDrillDownMenuProp = {
+ isOpen: boolean;
+ selectedIntegration: IntegrationMenuItem | null;
+ selectedRootIntegration: IntegrationMenuItem | null;
+ level: "integrations" | "tools";
+ selectedIntegrationTools?: Record[];
+};
+
+export interface RichAddTaskMenuMachineContext {
+ taskDefinitions: TaskDefinition[];
+ workflowDefinitions: WorkflowDef[];
+ workerMenuItems: BaseTaskMenuItem[];
+ workflowMenuItems: BaseTaskMenuItem[];
+ operationContext?: OperationContextData;
+ authHeaders?: AuthHeaders;
+ searchQuery: string;
+ nodes: NodeData[];
+ hoveredItem: string;
+ selectedTab: RichAddMenuTabs;
+ isTaskDefFetched: boolean;
+ isSubWfFetched: boolean;
+ isIntegrationsFetched: boolean;
+ lastScrollTopPosition: number;
+ toScrollTop: number;
+ baseTaskMenuItems: BaseTaskMenuItem[];
+ menuType: "quick" | "advanced";
+ supportedIntegrations: IntegrationMenuItem[];
+ availableIntegrations: IntegrationMenuItem[];
+ integrationDefs?: IntegrationDef[];
+ integrationDrillDownMenu: IntegrationDrillDownMenuProp;
+}
+
+export enum MainStates {
+ INIT = "init",
+ CLOSED = "closed",
+ IDLE = "idle",
+ FETCH_FOR_TASK_DEFINITIONS = "fetchForTaskDefinitions",
+ FETCH_FOR_WORKFLOW_DEFINITIONS = "fetchForWorkflowDefinitions",
+ FETCH_FOR_INTEGRATIONS = "fetchForIntegrations",
+ WITH_TASK_DEFINITIONS = "withTaskDefinitions",
+ WITH_WORKFLOW_DEFINITIONS = "withWorkflowDefinitions",
+ WITH_INTEGRATIONS = "withIntegrations",
+ SEARCH_FIELD = "searchField",
+ FETCH_FOR_INTEGRATION_TOOLS = "fetchForIntegrationTools",
+}
+
+export enum RichAddTaskMenuEventTypes {
+ TYPING = "TYPING",
+ CLOSE_MENU = "CLOSE_MENU",
+ GOT_TO_END = "GOT_TO_END",
+ SET_HOVERED_ITEM = "SET_HOVERED_ITEM",
+ SET_SELECTED_TAB = "SET_SELECTED_TAB",
+ SCROLL_TO_TOP = "SCROLL_TO_TOP",
+ SET_MENU_TYPE = "SET_MENU_TYPE",
+ FETCH_INTEGRATION_TOOLS = "FETCH_INTEGRATION_TOOLS",
+ SET_SELECTED_INTEGRATION = "SET_SELECTED_INTEGRATION",
+ REFETCH_INTEGRATIONS = "REFETCH_INTEGRATIONS",
+ UPDATE_INTEGRATION_DRILL_DOWN = "UPDATE_INTEGRATION_DRILL_DOWN",
+ SWITCH_TO_INTEGRATIONS = "SWITCH_TO_INTEGRATIONS",
+}
+
+export type TypingEvent = {
+ type: RichAddTaskMenuEventTypes.TYPING;
+ text: string;
+};
+
+export type CloseMenuEvent = {
+ type: RichAddTaskMenuEventTypes.CLOSE_MENU;
+};
+
+export type GotToEndEvent = {
+ type: RichAddTaskMenuEventTypes.GOT_TO_END;
+ lastScrollTopPosition: number;
+};
+export type ScrollToTopEvent = {
+ type: RichAddTaskMenuEventTypes.SCROLL_TO_TOP;
+};
+
+export type SetHoveredItemEvent = {
+ type: RichAddTaskMenuEventTypes.SET_HOVERED_ITEM;
+ data: string;
+};
+
+export type SetSelectedTabEvent = {
+ type: RichAddTaskMenuEventTypes.SET_SELECTED_TAB;
+ tab: RichAddMenuTabs;
+};
+
+export type SetMenuTypeEvent = {
+ type: RichAddTaskMenuEventTypes.SET_MENU_TYPE;
+ menuType: "quick" | "advanced";
+};
+
+export type FetchIntegrationToolsEvent = {
+ type: RichAddTaskMenuEventTypes.FETCH_INTEGRATION_TOOLS;
+ integration: IntegrationMenuItem;
+};
+
+export type RefetchIntegrationsEvent = {
+ type: RichAddTaskMenuEventTypes.REFETCH_INTEGRATIONS;
+};
+
+export type UpdateIntegrationDrillDownEvent = {
+ type: RichAddTaskMenuEventTypes.UPDATE_INTEGRATION_DRILL_DOWN;
+ data: IntegrationDrillDownMenuProp;
+};
+
+export type SwitchToIntegrationsEvent = {
+ type: RichAddTaskMenuEventTypes.SWITCH_TO_INTEGRATIONS;
+};
+
+export type RichAddTaskMenuEvents =
+ | TypingEvent
+ | CloseMenuEvent
+ | GotToEndEvent
+ | SetHoveredItemEvent
+ | SetSelectedTabEvent
+ | ScrollToTopEvent
+ | SetMenuTypeEvent
+ | FetchIntegrationToolsEvent
+ | RefetchIntegrationsEvent
+ | UpdateIntegrationDrillDownEvent
+ | SwitchToIntegrationsEvent;
diff --git a/ui-next/src/components/flow/components/RichAddTaskMenu/supportedTasks.ts b/ui-next/src/components/flow/components/RichAddTaskMenu/supportedTasks.ts
new file mode 100644
index 0000000000..caf12b4127
--- /dev/null
+++ b/ui-next/src/components/flow/components/RichAddTaskMenu/supportedTasks.ts
@@ -0,0 +1,269 @@
+/**
+ * Supported Tasks Configuration
+ *
+ * This module defines the task types available in the "Add Task" menu.
+ * Core OSS tasks are defined here, while enterprise tasks are registered
+ * via the plugin system.
+ */
+
+import { pluginRegistry } from "plugins/registry";
+import { TaskType } from "types";
+import { BaseTaskMenuItem, RichAddMenuTabs } from "./state/types";
+
+/**
+ * Core OSS System Tasks
+ * These are fundamental system tasks available in open source Conductor.
+ */
+export const SYSTEM_TASKS: BaseTaskMenuItem[] = [
+ {
+ name: "Event Task",
+ description:
+ "Publish an event to a messaging system (Kafka, AMQP, SQS, NATS, MQ).",
+ type: TaskType.EVENT,
+ category: "System",
+ },
+ {
+ name: "HTTP Task",
+ type: TaskType.HTTP,
+ description: "Call an API / Microservice.",
+ category: "System",
+ },
+ {
+ name: "HTTP Poll Task",
+ description:
+ "Poll a remote endpoint periodically until a condition is met. Useful for long running jobs.",
+ type: TaskType.HTTP_POLL,
+ category: "System",
+ },
+ {
+ name: "gRPC Task",
+ description: "Call a gRPC service method.",
+ type: TaskType.GRPC,
+ category: "System",
+ },
+ {
+ name: "Inline Task",
+ description:
+ "Run lightweight javascript code. Useful for data transformation.",
+ type: TaskType.INLINE,
+ category: "System",
+ },
+ {
+ name: "JSON JQ Transform",
+ description: "Use the power of JQ to transform JSON.",
+ type: TaskType.JSON_JQ_TRANSFORM,
+ category: "System",
+ },
+ {
+ name: "Business Rule Task",
+ description: "Evaluate business rules using Drools.",
+ type: TaskType.BUSINESS_RULE,
+ category: "System",
+ },
+ {
+ name: "SQL Query",
+ description: "Run SQL query against a database.",
+ type: TaskType.JDBC,
+ category: "System",
+ },
+ {
+ name: "Get Signed JWT Task",
+ description: "Get signed JWT task.",
+ type: TaskType.GET_SIGNED_JWT,
+ category: "System",
+ },
+ {
+ name: "Update Task",
+ description: "Update existing task with new status and properties.",
+ type: TaskType.UPDATE_TASK,
+ category: "System",
+ },
+ {
+ name: "Query Processor",
+ description: "Query from different data sources.",
+ type: TaskType.QUERY_PROCESSOR,
+ category: "System",
+ },
+];
+
+/**
+ * Core OSS Operator Tasks
+ * These are control flow operators available in open source Conductor.
+ */
+export const OPERATOR_TASKS: BaseTaskMenuItem[] = [
+ {
+ name: "Switch",
+ description: "if..then...else.",
+ type: TaskType.SWITCH,
+ category: RichAddMenuTabs.OPERATORS_TAB,
+ },
+ {
+ name: "Do While",
+ description: "Loop.",
+ type: TaskType.DO_WHILE,
+ category: RichAddMenuTabs.OPERATORS_TAB,
+ },
+ {
+ name: "Wait",
+ description:
+ "Add timer in your workflow. Wait for specific duration, time or a signal.",
+ type: TaskType.WAIT,
+ category: RichAddMenuTabs.OPERATORS_TAB,
+ },
+ {
+ name: "Dynamic Task",
+ description: "Execute a task dynamically.",
+ type: TaskType.DYNAMIC,
+ category: RichAddMenuTabs.OPERATORS_TAB,
+ },
+ {
+ name: "Set Variable",
+ description: "Set a variable.",
+ type: TaskType.SET_VARIABLE,
+ category: RichAddMenuTabs.OPERATORS_TAB,
+ },
+ {
+ name: "Sub Workflow",
+ description: "Execute a sub workflow.",
+ type: TaskType.SUB_WORKFLOW,
+ category: RichAddMenuTabs.OPERATORS_TAB,
+ },
+ {
+ name: "Terminate Workflow",
+ description: "Terminate another workflow.",
+ type: TaskType.TERMINATE_WORKFLOW,
+ category: RichAddMenuTabs.OPERATORS_TAB,
+ },
+ {
+ name: "Terminate",
+ description: "Terminate the workflow.",
+ type: TaskType.TERMINATE,
+ category: RichAddMenuTabs.OPERATORS_TAB,
+ },
+ {
+ name: "Fork Join",
+ description: "Run multiple tasks in parallel.",
+ type: TaskType.FORK_JOIN,
+ category: RichAddMenuTabs.OPERATORS_TAB,
+ },
+ {
+ name: "Dynamic Fork",
+ description: "Spawn multiple tasks dynamically.",
+ type: TaskType.FORK_JOIN_DYNAMIC,
+ category: RichAddMenuTabs.OPERATORS_TAB,
+ },
+ {
+ name: "Start Workflow Task",
+ description: "Start Workflow starts another workflow.",
+ type: TaskType.START_WORKFLOW,
+ category: RichAddMenuTabs.OPERATORS_TAB,
+ },
+ {
+ name: "Get Workflow",
+ description: "Get workflow details",
+ type: TaskType.GET_WORKFLOW,
+ category: RichAddMenuTabs.OPERATORS_TAB,
+ },
+ {
+ name: "Yield",
+ description: "Yield task",
+ type: TaskType.YIELD,
+ category: RichAddMenuTabs.OPERATORS_TAB,
+ },
+];
+
+/**
+ * Core OSS Worker Tasks
+ */
+export const WORKER_TASKS: BaseTaskMenuItem[] = [
+ {
+ name: "Worker Task (Simple)",
+ description: "Runs a Worker task.",
+ type: TaskType.SIMPLE,
+ category: RichAddMenuTabs.WORKERS_TAB,
+ },
+];
+
+/**
+ * Get all plugin-registered task menu items
+ */
+const getPluginTaskMenuItems = (): BaseTaskMenuItem[] => {
+ const pluginItems = pluginRegistry.getTaskMenuItems();
+ // Convert plugin items to BaseTaskMenuItem format
+ return pluginItems.map((item) => ({
+ name: item.name,
+ description: item.description,
+ type: item.type as any, // FormTaskType
+ category: item.category,
+ version: item.version,
+ flagHidden: item.hidden,
+ }));
+};
+
+/**
+ * AI/LLM Tasks for Agentic Orchestration
+ * These are AI-powered tasks for building intelligent workflows.
+ */
+export const AI_TASKS: BaseTaskMenuItem[] = [
+ {
+ name: "LLM Chat Complete",
+ description: "Generate text using a large language model chat interface.",
+ type: TaskType.LLM_CHAT_COMPLETE,
+ category: RichAddMenuTabs.AI_AGENTS_TAB,
+ },
+ {
+ name: "LLM Text Complete",
+ description: "Generate text using a large language model completion API.",
+ type: TaskType.LLM_TEXT_COMPLETE,
+ category: RichAddMenuTabs.AI_AGENTS_TAB,
+ },
+ {
+ name: "LLM Generate Embeddings",
+ description: "Generate vector embeddings from text.",
+ type: TaskType.LLM_GENERATE_EMBEDDINGS,
+ category: RichAddMenuTabs.AI_AGENTS_TAB,
+ },
+ {
+ name: "LLM Get Embeddings",
+ description: "Retrieve stored embeddings by ID or query.",
+ type: TaskType.LLM_GET_EMBEDDINGS,
+ category: RichAddMenuTabs.AI_AGENTS_TAB,
+ },
+ {
+ name: "LLM Index Document",
+ description: "Index a document into a vector database for semantic search.",
+ type: TaskType.LLM_INDEX_DOCUMENT,
+ category: RichAddMenuTabs.AI_AGENTS_TAB,
+ },
+ {
+ name: "LLM Search Index",
+ description: "Search indexed documents using semantic similarity.",
+ type: TaskType.LLM_SEARCH_INDEX,
+ category: RichAddMenuTabs.AI_AGENTS_TAB,
+ },
+];
+
+/**
+ * @deprecated Use AI_TASKS instead
+ */
+export const LLM_TASKS: BaseTaskMenuItem[] = AI_TASKS;
+
+const [simpleTask, ...remainingWorkerTasks] = WORKER_TASKS;
+
+/**
+ * Returns all available tasks including plugin-registered tasks.
+ * Called at runtime so plugin items (e.g. Wait For Webhook Task) are included when the menu opens.
+ */
+export const getALL_TASKS = (): BaseTaskMenuItem[] => [
+ simpleTask,
+ ...SYSTEM_TASKS,
+ ...OPERATOR_TASKS,
+ ...AI_TASKS,
+ ...getPluginTaskMenuItems(),
+ ...remainingWorkerTasks,
+];
+
+/**
+ * @deprecated Use getALL_TASKS() so plugin items are included (ALL_TASKS is computed at module load and may miss plugins).
+ */
+export const ALL_TASKS: BaseTaskMenuItem[] = getALL_TASKS();
diff --git a/ui-next/src/components/flow/components/RichAddTaskMenu/taskGenerator.ts b/ui-next/src/components/flow/components/RichAddTaskMenu/taskGenerator.ts
new file mode 100644
index 0000000000..3789559fcb
--- /dev/null
+++ b/ui-next/src/components/flow/components/RichAddTaskMenu/taskGenerator.ts
@@ -0,0 +1,783 @@
+import { randomChars as dynamicTaskSuffixGenerator } from "utils";
+import {
+ BusinessRuleTaskDef,
+ DoWhileTaskDef,
+ DynamicTaskDef,
+ EventTaskDef,
+ ForkJoinDynamicDef,
+ ForkJoinTaskDef,
+ HTTPMethods,
+ HttpPollTaskDef,
+ HttpTaskDef,
+ HumanTaskDef,
+ InlineTaskDef,
+ JDBCTaskDef,
+ JDBCType,
+ JoinTaskDef,
+ JsonJQTransformTaskDef,
+ KafkaPublishTaskDef,
+ PollingStrategy,
+ SendgridTaskDef,
+ SetVariableTaskDef,
+ SimpleTaskDef,
+ StartWorkflowTaskDef,
+ SubWorkflowTaskDef,
+ SwitchTaskDef,
+ TaskType,
+ TerminateTaskDef,
+ TerminateWorkflowTaskDef,
+ WaitForWebHookTaskDef,
+ WaitTaskDef,
+ UpdateSecretTaskDef,
+ LLMTaskTypes,
+ LLMTextCompleteTaskDef,
+ LLMGenerateEmbeddings,
+ LLMGetEmbeddings,
+ LLMStoreEmbeddings,
+ LLMIndexDocument,
+ LLMSearchIndex,
+ LLMIndexText,
+ FormTaskType,
+ GetDocumentTaskDef,
+ QueryProcessorTaskDef,
+ QueryProcessorType,
+ OpsGenieTaskDef,
+ GetSignedJWTTaskDef,
+ GetSignedJWTAlgorithmType,
+ AssignmentCompletionStrategy,
+ UpdateTaskDef,
+ GetWorkflowDef,
+ LLMChatComplete,
+ GrpcTaskDef,
+ YieldTaskDef,
+ MCPTaskDef,
+ ChunkTextTaskDef,
+ ListFilesTaskDef,
+ ParseDocumentTaskDef,
+} from "types";
+import { HTTP_TEST_ENDPOINT } from "utils/constants/common";
+import { BaseTaskMenuItem } from "./state/types";
+import { UpdateTaskStatus } from "types/UpdateTaskStatus";
+
+// THIS FILE SHOULD COME FROM THE SDK
+
+const generateNameAndTaskReference = (
+ aParam: string,
+ suffixGenerator = dynamicTaskSuffixGenerator,
+) => {
+ const suffix = suffixGenerator();
+ return {
+ name: `${aParam}_task_${suffix}`,
+ taskReferenceName: `${aParam}_task_${suffix}_ref`,
+ };
+};
+
+export type NameGeneratorFn = typeof generateNameAndTaskReference;
+
+export interface GenerateTaskNoJoinParams {
+ overrides?: Partial;
+ nameGenerator?: NameGeneratorFn;
+}
+
+type SomeFork = ForkJoinTaskDef | ForkJoinDynamicDef;
+
+export interface GenerateTaskJoinParams extends GenerateTaskNoJoinParams {
+ joinOverrides?: Partial;
+}
+
+export type GenerateTaskFn = T extends SomeFork
+ ? (params: GenerateTaskJoinParams) => [T, JoinTaskDef]
+ : (params: GenerateTaskNoJoinParams) => T;
+
+const DEFAULT_ARGS = {
+ overrides: {},
+ joinOverrides: {},
+ nameGenerator: generateNameAndTaskReference,
+};
+
+export const generateEventTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): EventTaskDef => {
+ return {
+ ...nameGenerator("event"),
+ type: TaskType.EVENT,
+ sink: "sqs:internal_event_name",
+ inputParameters: {},
+ ...overrides,
+ };
+};
+
+export const generateSimpleTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): SimpleTaskDef => {
+ return {
+ ...nameGenerator("simple"),
+ type: TaskType.SIMPLE,
+ ...overrides,
+ };
+};
+
+export const generateYieldTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): YieldTaskDef => {
+ return {
+ ...nameGenerator("yield"),
+ type: TaskType.YIELD,
+ ...overrides,
+ };
+};
+
+export const generateHTTPTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): HttpTaskDef => ({
+ ...nameGenerator("http"),
+ type: TaskType.HTTP,
+ inputParameters: {
+ uri: HTTP_TEST_ENDPOINT,
+ method: HTTPMethods.GET,
+ accept: "application/json",
+ contentType: "application/json",
+ encode: true,
+ },
+ ...overrides,
+});
+
+export const generateGRPCTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): GrpcTaskDef => ({
+ ...nameGenerator("grpc"),
+ type: TaskType.GRPC,
+ ...overrides,
+});
+
+export const generateMCPTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): MCPTaskDef => ({
+ ...nameGenerator("integration"),
+ type: TaskType.MCP,
+ ...overrides,
+});
+
+export const generateHTTPPollTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): HttpPollTaskDef => ({
+ ...nameGenerator("http_poll"),
+ type: TaskType.HTTP_POLL,
+ inputParameters: {
+ http_request: {
+ uri: HTTP_TEST_ENDPOINT,
+ method: HTTPMethods.GET,
+ accept: "application/json",
+ contentType: "application/json",
+ terminationCondition:
+ "(function(){ return $.output.response.body.randomInt > 10;})();",
+ pollingInterval: "60",
+ pollingStrategy: PollingStrategy.FIXED,
+ encode: true,
+ },
+ },
+ ...overrides,
+});
+
+export const generateJSONJQTransform: GenerateTaskFn<
+ JsonJQTransformTaskDef
+> = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): JsonJQTransformTaskDef => ({
+ ...nameGenerator("json_transform"),
+ type: TaskType.JSON_JQ_TRANSFORM,
+ inputParameters: {
+ persons: [
+ {
+ name: "some",
+ last: "name",
+ email: "mail@mail.com",
+ id: 1,
+ },
+ {
+ name: "some2",
+ last: "name2",
+ email: "mail2@mail.com",
+ id: 2,
+ },
+ ],
+ queryExpression: ".persons | map({user:{email,id}})",
+ },
+ ...overrides,
+});
+
+export const generateInlineTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): InlineTaskDef => ({
+ ...nameGenerator("inline"),
+ type: TaskType.INLINE,
+ inputParameters: {
+ expression: "(function () {\n return $.value1 + $.value2;\n})();",
+ evaluatorType: "graaljs",
+ value1: 1,
+ value2: 2,
+ },
+ ...overrides,
+});
+
+export const generateKafkaPublishTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): KafkaPublishTaskDef => ({
+ ...nameGenerator("kafka_publish"),
+ type: TaskType.KAFKA_PUBLISH,
+ inputParameters: {
+ kafka_request: {
+ topic: "userTopic",
+ value: "Message to publish",
+ bootStrapServers: "localhost:9092",
+ headers: {
+ "X-Auth": "Auth-key",
+ },
+ key: "valuekey",
+ keySerializer: "org.apache.kafka.common.serialization.IntegerSerializer",
+ },
+ },
+ ...overrides,
+});
+
+export const generateJoinTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): JoinTaskDef => ({
+ ...nameGenerator("join"),
+ inputParameters: {},
+ type: TaskType.JOIN,
+ joinOn: [],
+ optional: false,
+ asyncComplete: false,
+ ...overrides,
+});
+
+export const generateForkJoinTasks: GenerateTaskFn = ({
+ overrides: forkOverrides = {},
+ joinOverrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): [ForkJoinTaskDef, JoinTaskDef] => [
+ {
+ ...nameGenerator("fork"),
+ inputParameters: {},
+ type: TaskType.FORK_JOIN,
+ defaultCase: [],
+ forkTasks: [[]], // TODO check this in the mapper. array of array else it will break
+ ...forkOverrides,
+ } as ForkJoinTaskDef,
+ generateJoinTask({ overrides: joinOverrides, nameGenerator }),
+];
+
+export const generateSwitchTasks: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): SwitchTaskDef => ({
+ ...nameGenerator("switch"),
+ inputParameters: {
+ switchCaseValue: "",
+ },
+ type: TaskType.SWITCH,
+ decisionCases: {},
+ defaultCase: [],
+ evaluatorType: "value-param",
+ expression: "switchCaseValue",
+ ...overrides,
+});
+
+export const generateDoWhileTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): DoWhileTaskDef => ({
+ ...nameGenerator("do_while"),
+ inputParameters: {},
+ type: TaskType.DO_WHILE,
+ startDelay: 0,
+ optional: false,
+ asyncComplete: false,
+ loopCondition: "",
+ evaluatorType: "value-param",
+ loopOver: [],
+ ...overrides,
+});
+
+export const generateDynamicForkTasks: GenerateTaskFn = ({
+ overrides: dynamicOverrides = {},
+ joinOverrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): [ForkJoinDynamicDef, JoinTaskDef] => [
+ {
+ ...nameGenerator("fork_join_dynamic"),
+ inputParameters: {
+ dynamicTasks: "",
+ dynamicTasksInput: "",
+ },
+ type: TaskType.FORK_JOIN_DYNAMIC,
+ dynamicForkTasksParam: "dynamicTasks",
+ dynamicForkTasksInputParamName: "dynamicTasksInput",
+ startDelay: 0,
+ optional: false,
+ asyncComplete: false,
+ ...dynamicOverrides,
+ } as ForkJoinDynamicDef,
+ {
+ ...nameGenerator("join"),
+ inputParameters: {},
+ type: TaskType.JOIN,
+ joinOn: [],
+ optional: false,
+ asyncComplete: false,
+ ...joinOverrides,
+ },
+];
+
+export const generateWaitTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): WaitTaskDef => ({
+ ...nameGenerator("wait"),
+ type: TaskType.WAIT,
+ ...overrides,
+});
+
+export const generateDynamicTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): DynamicTaskDef => ({
+ ...nameGenerator("dynamic"),
+ inputParameters: {
+ taskToExecute: "",
+ },
+ type: TaskType.DYNAMIC,
+ dynamicTaskNameParam: "taskToExecute",
+ ...overrides,
+});
+
+export const generateTerminateTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): TerminateTaskDef => ({
+ ...nameGenerator("terminate"),
+ inputParameters: {
+ terminationStatus: "COMPLETED",
+ },
+ type: TaskType.TERMINATE,
+ startDelay: 0,
+ optional: false,
+ ...overrides,
+});
+
+export const generateSetVariableTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): SetVariableTaskDef => ({
+ ...nameGenerator("set_variable"),
+ type: TaskType.SET_VARIABLE,
+ inputParameters: {
+ name: "Orkes",
+ },
+ ...overrides,
+});
+
+export const generateSubWorkflowTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): SubWorkflowTaskDef => ({
+ ...nameGenerator("sub_workflow"),
+ inputParameters: {},
+ type: TaskType.SUB_WORKFLOW,
+ subWorkflowParam: {
+ name: "",
+ },
+ ...overrides,
+});
+
+export const generateTerminateWorkflowTask: GenerateTaskFn<
+ TerminateWorkflowTaskDef
+> = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): TerminateWorkflowTaskDef => ({
+ ...nameGenerator("TW"),
+ inputParameters: {
+ workflowId: [""],
+ terminationReason: "",
+ triggerFailureWorkflow: false,
+ },
+ type: TaskType.TERMINATE_WORKFLOW,
+ ...overrides,
+});
+
+export const generateBusinessRuleTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): BusinessRuleTaskDef => ({
+ ...nameGenerator("business_rule"),
+ inputParameters: {
+ ruleFileLocation: "https://business-rules.s3.amazonaws.com/rules.xlsx",
+ executionStrategy: "FIRE_FIRST",
+ cacheTimeoutMinutes: 60,
+ inputColumns: {},
+ outputColumns: [],
+ },
+ type: TaskType.BUSINESS_RULE,
+ ...overrides,
+});
+
+export const generateSendgridTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): SendgridTaskDef => ({
+ ...nameGenerator("sendgrid"),
+ inputParameters: {
+ from: "",
+ to: "",
+ subject: "",
+ contentType: "text/plain",
+ content: "",
+ sendgridConfiguration: "",
+ },
+ type: TaskType.SENDGRID,
+ ...overrides,
+});
+
+export const generateStartWorkflowTask: GenerateTaskFn<
+ StartWorkflowTaskDef
+> = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): StartWorkflowTaskDef => ({
+ ...nameGenerator("start_workflow"),
+ inputParameters: {
+ startWorkflow: {
+ name: "",
+ input: {},
+ },
+ },
+ type: TaskType.START_WORKFLOW,
+ ...overrides,
+});
+
+export const generateWaitForWebhookTask: GenerateTaskFn<
+ WaitForWebHookTaskDef
+> = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): WaitForWebHookTaskDef => ({
+ ...nameGenerator("webhook"),
+ inputParameters: {
+ matches: {
+ "$['event']['type']": "message",
+ "$['event']['text']": "Hello",
+ },
+ },
+ type: TaskType.WAIT_FOR_WEBHOOK,
+ ...overrides,
+});
+
+export const generateHumanTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): HumanTaskDef => ({
+ ...nameGenerator("human"),
+ inputParameters: {
+ __humanTaskDefinition: {
+ assignmentCompletionStrategy: AssignmentCompletionStrategy.LEAVE_OPEN,
+ assignments: [],
+ },
+ },
+ type: TaskType.HUMAN,
+ ...overrides,
+});
+
+export const generateJDBCTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): JDBCTaskDef => {
+ return {
+ ...nameGenerator("jdbc"),
+ inputParameters: {
+ integrationName: "",
+ statement: "SELECT * FROM tableName WHERE id=?",
+ parameters: [],
+ type: JDBCType.SELECT,
+ },
+ type: TaskType.JDBC,
+ ...overrides,
+ };
+};
+
+export const generateChunkTextTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): ChunkTextTaskDef => ({
+ ...nameGenerator("chunk_text"),
+ inputParameters: {
+ text: "",
+ chunkSize: 1024,
+ mediaType: "auto",
+ },
+ type: TaskType.CHUNK_TEXT,
+ ...overrides,
+});
+
+export const generateParseDocumentTask: GenerateTaskFn<
+ ParseDocumentTaskDef
+> = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): ParseDocumentTaskDef => {
+ return {
+ ...nameGenerator("parse_document"),
+ inputParameters: {
+ integrationName: "",
+ url: "",
+ mediaType: "auto",
+ chunkSize: 0,
+ },
+ type: TaskType.PARSE_DOCUMENT,
+ ...overrides,
+ };
+};
+
+type AILLMTaskTypes =
+ | TaskType.LLM_TEXT_COMPLETE
+ | TaskType.LLM_GENERATE_EMBEDDINGS
+ | TaskType.LLM_GET_EMBEDDINGS
+ | TaskType.LLM_STORE_EMBEDDINGS
+ | TaskType.LLM_INDEX_DOCUMENT
+ | TaskType.LLM_SEARCH_INDEX
+ | TaskType.GET_DOCUMENT
+ | TaskType.LLM_INDEX_TEXT
+ | TaskType.LLM_CHAT_COMPLETE;
+
+export const generateAITask = (
+ type: AILLMTaskTypes,
+) => {
+ const taskGen = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+ }): T => {
+ const taskProps = {
+ ...nameGenerator(type.toLowerCase()),
+ inputParameters: {},
+ type: type,
+ ...overrides,
+ };
+ const typedProps = {
+ [TaskType.LLM_TEXT_COMPLETE]: taskProps as LLMTextCompleteTaskDef,
+ [TaskType.LLM_GENERATE_EMBEDDINGS]: taskProps as LLMGenerateEmbeddings,
+ [TaskType.LLM_GET_EMBEDDINGS]: taskProps as LLMGetEmbeddings,
+ [TaskType.LLM_STORE_EMBEDDINGS]: taskProps as LLMStoreEmbeddings,
+ [TaskType.LLM_INDEX_DOCUMENT]: taskProps as LLMIndexDocument,
+ [TaskType.LLM_SEARCH_INDEX]: taskProps as LLMSearchIndex,
+ [TaskType.LLM_INDEX_TEXT]: taskProps as LLMIndexText,
+ [TaskType.GET_DOCUMENT]: taskProps as GetDocumentTaskDef,
+ [TaskType.LLM_CHAT_COMPLETE]: taskProps as LLMChatComplete,
+ } satisfies Record;
+
+ return typedProps[type] as T;
+ };
+ return taskGen as GenerateTaskFn;
+};
+
+export const generateUpdateSecretTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): UpdateSecretTaskDef => {
+ return {
+ ...nameGenerator("update_secret"),
+ inputParameters: {
+ _secrets: {
+ secretKey: "my_token",
+ secretValue: "input secret value here",
+ },
+ },
+ type: TaskType.UPDATE_SECRET,
+ ...overrides,
+ };
+};
+
+export const generateGetSignedJWTTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): GetSignedJWTTaskDef => {
+ return {
+ ...nameGenerator("get_signed_jwt"),
+ inputParameters: {
+ subject: "",
+ issuer: "",
+ privateKey: "",
+ privateKeyId: "",
+ audience: "",
+ ttlInSecond: 0,
+ scopes: [],
+ algorithm: GetSignedJWTAlgorithmType.RS256,
+ },
+ type: TaskType.GET_SIGNED_JWT,
+ ...overrides,
+ };
+};
+
+export const generateQueryProcessorTask: GenerateTaskFn<
+ QueryProcessorTaskDef
+> = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): QueryProcessorTaskDef => {
+ return {
+ ...nameGenerator("query_processor"),
+ inputParameters: {
+ workflowNames: [],
+ statuses: [],
+ correlationIds: [],
+ queryType: QueryProcessorType.CONDUCTOR_API,
+ },
+ type: TaskType.QUERY_PROCESSOR,
+ ...overrides,
+ };
+};
+
+export const generateOpsGenieTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): OpsGenieTaskDef => {
+ return {
+ ...nameGenerator("Opsgenie"),
+ inputParameters: {
+ alias: "",
+ description: "",
+ visibleTo: [
+ {
+ id: "id-1",
+ type: "type-1",
+ },
+ {
+ id: "id-2",
+ type: "type-2",
+ },
+ ],
+ message: "",
+ responders: [
+ {
+ type: "user",
+ username: "someone@someone.com",
+ },
+ ],
+ details: {},
+ },
+ ...overrides,
+ type: TaskType.OPS_GENIE,
+ };
+};
+
+export const generateUpdateTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): UpdateTaskDef => {
+ return {
+ ...nameGenerator("update_task"),
+ inputParameters: {
+ taskStatus: UpdateTaskStatus.COMPLETED,
+ mergeOutput: false,
+ workflowId: "${workflow.workflowId}",
+ taskRefName: "",
+ },
+ ...overrides,
+ type: TaskType.UPDATE_TASK,
+ };
+};
+
+export const generateGetWorkflowTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): GetWorkflowDef => {
+ return {
+ ...nameGenerator("get_workflow"),
+ inputParameters: {
+ id: "",
+ includeTasks: false,
+ },
+ ...overrides,
+ type: TaskType.GET_WORKFLOW,
+ };
+};
+
+export const generateListFilesTask: GenerateTaskFn = ({
+ overrides = {},
+ nameGenerator = generateNameAndTaskReference,
+} = DEFAULT_ARGS): ListFilesTaskDef => ({
+ ...nameGenerator("list_files"),
+ type: TaskType.LIST_FILES,
+ inputParameters: {
+ inputLocation: "",
+ fileTypes: [],
+ },
+ ...overrides,
+});
+
+export const taskGeneratorMap = {
+ [TaskType.WAIT]: generateWaitTask,
+ [TaskType.HTTP]: generateHTTPTask,
+ [TaskType.KAFKA_PUBLISH]: generateKafkaPublishTask,
+ [TaskType.HUMAN]: generateHumanTask,
+ [TaskType.BUSINESS_RULE]: generateBusinessRuleTask,
+ [TaskType.SENDGRID]: generateSendgridTask,
+ [TaskType.WAIT_FOR_WEBHOOK]: generateWaitForWebhookTask,
+ [TaskType.HTTP_POLL]: generateHTTPPollTask,
+ [TaskType.DO_WHILE]: generateDoWhileTask,
+ [TaskType.SIMPLE]: generateSimpleTask,
+ [TaskType.YIELD]: generateYieldTask,
+ [TaskType.JDBC]: generateJDBCTask,
+ [TaskType.EVENT]: generateEventTask,
+ [TaskType.JOIN]: generateJoinTask,
+ [TaskType.FORK_JOIN]: generateForkJoinTasks,
+ [TaskType.FORK_JOIN_DYNAMIC]: generateDynamicForkTasks,
+ [TaskType.DYNAMIC]: generateDynamicTask,
+ [TaskType.INLINE]: generateInlineTask,
+ [TaskType.SWITCH]: generateSwitchTasks,
+ [TaskType.JSON_JQ_TRANSFORM]: generateJSONJQTransform,
+ [TaskType.TERMINATE]: generateTerminateTask,
+ [TaskType.SET_VARIABLE]: generateSetVariableTask,
+ [TaskType.TERMINATE_WORKFLOW]: generateTerminateWorkflowTask,
+ [TaskType.SUB_WORKFLOW]: generateSubWorkflowTask,
+ [TaskType.START_WORKFLOW]: generateStartWorkflowTask,
+ [TaskType.LLM_TEXT_COMPLETE]: generateAITask(TaskType.LLM_TEXT_COMPLETE),
+ [TaskType.LLM_GENERATE_EMBEDDINGS]: generateAITask(
+ TaskType.LLM_GENERATE_EMBEDDINGS,
+ ),
+ [TaskType.LLM_GET_EMBEDDINGS]: generateAITask(TaskType.LLM_GET_EMBEDDINGS),
+ [TaskType.LLM_STORE_EMBEDDINGS]: generateAITask(
+ TaskType.LLM_STORE_EMBEDDINGS,
+ ),
+ [TaskType.LLM_INDEX_DOCUMENT]: generateAITask(TaskType.LLM_INDEX_DOCUMENT),
+ [TaskType.LLM_SEARCH_INDEX]: generateAITask(TaskType.LLM_SEARCH_INDEX),
+ [TaskType.LLM_INDEX_TEXT]: generateAITask(TaskType.LLM_INDEX_TEXT),
+ [TaskType.UPDATE_SECRET]: generateUpdateSecretTask,
+ [TaskType.GET_DOCUMENT]: generateAITask(TaskType.GET_DOCUMENT),
+ [TaskType.QUERY_PROCESSOR]: generateQueryProcessorTask,
+ [TaskType.OPS_GENIE]: generateOpsGenieTask,
+ [TaskType.GET_SIGNED_JWT]: generateGetSignedJWTTask,
+ [TaskType.UPDATE_TASK]: generateUpdateTask,
+ [TaskType.GET_WORKFLOW]: generateGetWorkflowTask,
+ [TaskType.LLM_CHAT_COMPLETE]: generateAITask(TaskType.LLM_CHAT_COMPLETE),
+ [TaskType.GRPC]: generateGRPCTask,
+ [TaskType.MCP]: generateMCPTask,
+ [TaskType.CHUNK_TEXT]: generateChunkTextTask,
+ [TaskType.LIST_FILES]: generateListFilesTask,
+ [TaskType.PARSE_DOCUMENT]: generateParseDocumentTask,
+} satisfies Record>;
+
+export const uniqueTaskIdGenerator = (sr: BaseTaskMenuItem) => {
+ return `${sr.category}-${sr.name}${sr.version ? sr.version : ""}`;
+};
diff --git a/ui-next/src/components/flow/components/graphs/CustomEdgeButton.tsx b/ui-next/src/components/flow/components/graphs/CustomEdgeButton.tsx
new file mode 100644
index 0000000000..021097ec1a
--- /dev/null
+++ b/ui-next/src/components/flow/components/graphs/CustomEdgeButton.tsx
@@ -0,0 +1,257 @@
+import { FunctionComponent, useMemo } from "react";
+import { BOTTOM_PORT_MARGIN } from "components/flow/nodes/mapper/layout";
+import PlusIcon from "../shapes/TaskCard/icons/PlusIcon";
+import MinusIcon from "../shapes/TaskCard/icons/MinusIcon";
+import { PortChildProps } from "reaflow";
+import { TaskDef, Crumb } from "types";
+import { keyframes, styled } from "@mui/system";
+import { isSafari } from "utils/utils";
+import { useDroppableNode } from "components/flow/dragDrop";
+import { DraggedNodeData } from "components/flow/state";
+import classnames from "classnames";
+
+type DataType = {
+ task: TaskDef;
+ crumbs: Crumb[];
+};
+type CustomEdgeButtonProps = PortChildProps & {
+ size: number;
+ hidden: boolean;
+ variant: "ADD" | "DELETE" | "ADD_DELETE";
+ onDeleteClick: (event: any) => void;
+ onClick: (event: any) => void;
+ onEnter: (event: any) => void;
+ onLeave: (event: any) => void;
+ data: DataType;
+ nodeId: string;
+ activeEdgeId?: string;
+};
+
+const changeColor = keyframes`
+0% {
+ background-position: left top, right bottom, left bottom, right top;
+}
+100% {
+ background-color: rgba(159,220,170,0.5);
+ background-position: left 15px top, right 15px bottom , left bottom 15px , right top 15px;
+}
+`;
+
+const pulseAnimation = keyframes`
+ 0% {
+ box-shadow: 0 0 8px 2px rgba(33, 150, 243, 0.5);
+ transform: scale(1);
+ }
+ 50% {
+ box-shadow: 0 0 12px 4px rgba(33, 150, 243, 0.7);
+ transform: scale(1.02);
+ }
+ 100% {
+ box-shadow: 0 0 8px 2px rgba(33, 150, 243, 0.5);
+ transform: scale(1);
+ }
+`;
+
+const ActiveButtonStyle = styled("div")`
+ &.active {
+ animation: ${pulseAnimation} 1.5s ease-in-out infinite;
+ background-color: #e3f2fd;
+ border: 2px solid #2196f3;
+ }
+`;
+
+const DroppablePlace = styled("div")<{
+ dropIsDisabled: boolean;
+ draggedNodeData?: DraggedNodeData;
+}>`
+ &.over {
+ background-image:
+ linear-gradient(90deg, silver 50%, transparent 50%),
+ linear-gradient(90deg, silver 50%, transparent 50%),
+ linear-gradient(0deg, silver 50%, transparent 50%),
+ linear-gradient(0deg, silver 50%, transparent 50%);
+ background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
+ background-size:
+ 15px 2px,
+ 15px 2px,
+ 2px 15px,
+ 2px 15px;
+ background-position:
+ left top,
+ right bottom,
+ left bottom,
+ right top;
+ animation: ${changeColor} 1s infinite linear;
+ }
+
+ &.dragging {
+ }
+ position: absolute;
+ top: 10px;
+ height: ${(props) =>
+ props.dropIsDisabled || props.draggedNodeData == null ? 0 : 80}px;
+ width: ${(props) =>
+ props.dropIsDisabled || props.draggedNodeData == null
+ ? 0
+ : props.draggedNodeData.width}px;
+`;
+
+export const CustomEdgeButton: FunctionComponent = ({
+ activeEdgeId,
+ x,
+ y,
+ size = 20,
+ hidden = true,
+ variant = "ADD",
+ onEnter = () => undefined,
+ onLeave = () => undefined,
+ onClick = () => undefined,
+ onDeleteClick = () => undefined,
+ data,
+ nodeId,
+ port,
+}) => {
+ const {
+ droppableResult: { isOver, setNodeRef },
+ draggedNodeData,
+ dropIsDisabled,
+ } = useDroppableNode({
+ nodeData: data,
+ position: port.side === "NORTH" ? "ABOVE" : "BELOW",
+ nodeId,
+ });
+
+ const { translateX, translateY, offset } = useMemo(() => {
+ const half = size / 2;
+ const translateX = x - half;
+ const translateY =
+ y - (half + (port.side === "SOUTH" ? BOTTOM_PORT_MARGIN : 0));
+
+ const offset = isSafari ? 15 : 0;
+
+ return { translateX, translateY, offset };
+ }, [port.side, size, x, y]);
+
+ return hidden ? null : (
+ <>
+
+ {
+ event.preventDefault();
+ event.stopPropagation();
+ onClick(event);
+ }}
+ width={size + 20}
+ height={size + 20}
+ >
+ {variant === "ADD" || variant === "DELETE" ? (
+ {
+ event.preventDefault();
+ event.stopPropagation();
+ onClick(event);
+ }}
+ onMouseEnter={onEnter}
+ onMouseLeave={onLeave}
+ >
+
+ {variant === "ADD" ? (
+
+ ) : (
+
+ )}
+
+ ) : (
+
+ {
+ event.preventDefault();
+ event.stopPropagation();
+ onClick(event);
+ }}
+ >
+
+
+ {
+ event.preventDefault();
+ event.stopPropagation();
+ onDeleteClick(event);
+ }}
+ >
+
+
+
+ )}
+
+
+ >
+ );
+};
+
+export default CustomEdgeButton;
diff --git a/ui-next/src/components/flow/components/graphs/CustomLabel.tsx b/ui-next/src/components/flow/components/graphs/CustomLabel.tsx
new file mode 100644
index 0000000000..464869a656
--- /dev/null
+++ b/ui-next/src/components/flow/components/graphs/CustomLabel.tsx
@@ -0,0 +1,85 @@
+import { FunctionComponent } from "react";
+import { getFlowTheme } from "components/flow/theme";
+import { EdgeData, LabelProps, NodeData, EdgeChildProps } from "reaflow";
+import { EDGE_SPACING } from "./PanAndZoomWrapper/constants";
+
+const HORIZONTAL_PADDING = 10;
+
+type SelectEdgePram = { edge: EdgeData };
+
+interface CustomLabelProps extends LabelProps {
+ selectEdge: (edgeData: SelectEdgePram) => void;
+ nodes: NodeData[];
+ edgeChildProps: EdgeChildProps;
+}
+
+export const CustomLabel: FunctionComponent> = ({
+ text = "",
+ x = 0,
+ y = 0,
+ originalText = "",
+ edgeChildProps: edgeProps,
+ selectEdge = (_nonEdge) => {},
+ ...labelProps
+}) => {
+ const label = text;
+ const isDefault = edgeProps?.edge.data?.isDefault ?? false;
+ const theme = getFlowTheme();
+
+ // This should be `x + labelProps.width / 2`,
+ // but the width is already divided by 2 in Reaflow, see:
+ // https://github.com/reaviz/reaflow/blob/master/src/layout/elkLayout.ts#L262
+ const labelPropsWidth = labelProps?.width || 0;
+ const centeredX = x + labelPropsWidth;
+
+ const labelSize = {
+ // Multiplying width * 2 since it's already divided by 2 in Reaflow.
+ // HORIZONTAL_PADDING is added to both sides to make sure the label is not cut off.
+ width: labelPropsWidth * 2 + HORIZONTAL_PADDING * 2,
+ height: 30,
+ x: centeredX,
+ y: y,
+ };
+
+ const onClickLabel = () => {
+ if (edgeProps?.edge) selectEdge({ edge: edgeProps.edge });
+ };
+
+ return (
+
+
+
+ {label}
+
+
+
+ );
+};
diff --git a/ui-next/src/components/flow/components/graphs/CustomNode.jsx b/ui-next/src/components/flow/components/graphs/CustomNode.jsx
new file mode 100644
index 0000000000..6c331fb8be
--- /dev/null
+++ b/ui-next/src/components/flow/components/graphs/CustomNode.jsx
@@ -0,0 +1,94 @@
+import { Node } from "reaflow";
+import { TaskShape } from "../shapes/TaskShape";
+import CustomPort from "./CustomPort";
+import _first from "lodash/first";
+
+import { isSafari } from "utils/utils";
+
+export const CustomNode = (nodeProps) => {
+ const {
+ operationContext,
+ onClick,
+ onToggleTaskMenu,
+ onDeleteBranch,
+ properties: nodeProperties,
+ isInconsistent,
+ displayDescription = false,
+ } = nodeProps;
+ const portsHidden = _first(nodeProperties?.ports || [])?.hidden === true;
+
+ return (
+ null}
+ label={<>>}
+ style={{ stroke: "none", fill: "none" }}
+ port={
+ {
+ onToggleTaskMenu(e, {
+ id: port.id,
+ port,
+ node: nodeProperties,
+ });
+ }}
+ onDeleteClick={(e, port) => {
+ onDeleteBranch(e, {
+ id: port.id,
+ port,
+ node: nodeProperties,
+ });
+ }}
+ />
+ }
+ >
+ {(event) => {
+ return (
+
+ {
+ onClick(e, nodeProperties);
+ }}
+ style={{
+ overflow: "visible",
+ }}
+ height={event.height}
+ width={event.width}
+ >
+
+
+
+ );
+ }}
+
+ );
+};
diff --git a/ui-next/src/components/flow/components/graphs/CustomPort.jsx b/ui-next/src/components/flow/components/graphs/CustomPort.jsx
new file mode 100644
index 0000000000..74036fdbdb
--- /dev/null
+++ b/ui-next/src/components/flow/components/graphs/CustomPort.jsx
@@ -0,0 +1,42 @@
+import { Port } from "reaflow";
+import CustomEdgeButton from "./CustomEdgeButton";
+import { TERMINAL_END_NAME } from "components/flow/nodes/mapper/constants";
+
+const CustomPort = ({
+ operationContext,
+ onClick,
+ onDeleteClick,
+ nodeProperties,
+ ...restProps
+}) => {
+ const portVariant =
+ ["SWITCH", "FORK_JOIN"].includes(nodeProperties.data.task.type) &&
+ restProps.properties.side === "SOUTH"
+ ? "ADD_DELETE"
+ : "ADD";
+
+ const isEndTerminal = nodeProperties.data.task.name === TERMINAL_END_NAME;
+
+ return (
+
+ {(event) => {
+ return (
+ !isEndTerminal && (
+ onClick(clkEvent, restProps)}
+ onDeleteClick={(clkEvent) => onDeleteClick(clkEvent, restProps)}
+ data={nodeProperties.data}
+ nodeId={nodeProperties.id}
+ activeEdgeId={operationContext?.port?.properties?.id}
+ />
+ )
+ );
+ }}
+
+ );
+};
+
+export default CustomPort;
diff --git a/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/PanAndZoomProvider.tsx b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/PanAndZoomProvider.tsx
new file mode 100644
index 0000000000..fd911b6f3e
--- /dev/null
+++ b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/PanAndZoomProvider.tsx
@@ -0,0 +1,19 @@
+import { ReactNode } from "react";
+import { ActorRef } from "xstate";
+import { PanAndZoomContext, PanAndZoomEvents } from "./state";
+
+export interface PanAndZoomContextProps {
+ panAndZoomActor?: ActorRef;
+ children?: ReactNode;
+}
+
+const PanAndZoomContextProvider = ({
+ children,
+ panAndZoomActor,
+}: PanAndZoomContextProps) => (
+
+ {children}
+
+);
+
+export default PanAndZoomContextProvider;
diff --git a/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/PanAndZoomWrapper.tsx b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/PanAndZoomWrapper.tsx
new file mode 100644
index 0000000000..73dd9edeac
--- /dev/null
+++ b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/PanAndZoomWrapper.tsx
@@ -0,0 +1,314 @@
+import { Box } from "@mui/material";
+import { Handler } from "@use-gesture/core/types";
+import { useDrag, usePinch, useWheel } from "@use-gesture/react";
+import { useSelector } from "@xstate/react";
+import { FlowEvents } from "components/flow/state";
+import { selectWorkflowName } from "components/flow/state/selectors";
+import domToImage from "dom-to-image";
+import {
+ FunctionComponent,
+ ReactNode,
+ Ref,
+ useCallback,
+ useContext,
+ useEffect,
+ useRef,
+ WheelEvent,
+} from "react";
+import { ColorModeContext } from "theme/material/ColorModeContext";
+import { ActorRef } from "xstate";
+import { MAX_ZOOM, MIN_ZOOM } from "./constants";
+import PanAndZoomContextProvider from "./PanAndZoomProvider";
+import { PanAndZoomEvents, usePanAndZoomActor } from "./state";
+import { ZoomControls } from "./ZoomControls";
+
+const isEventReallyWheel = (event: WheelEvent) => {
+ return Math.abs(event.deltaY) > 25;
+};
+
+const printScreen = (workflowName: string) => {
+ const node = document.getElementById("diagram-canvas-container");
+
+ if (!node?.firstChild) return;
+
+ domToImage
+ .toPng(node.firstChild)
+ .then(function (dataUrl: string) {
+ const link = document.createElement("a");
+ link.download = `${workflowName}.png`;
+ link.href = dataUrl;
+ link.click();
+ })
+ .catch(function (error: Error) {
+ console.error("Error saving image:", error);
+ });
+};
+
+interface ViewportProps {
+ viewportRef: Ref;
+ cursor: string;
+ isInconsistent: boolean;
+ children: ReactNode;
+}
+
+const Viewport: FunctionComponent = ({
+ viewportRef,
+ cursor,
+ isInconsistent,
+ children,
+}) => {
+ const { mode } = useContext(ColorModeContext);
+ const darkMode = mode === "dark";
+ const backgroundStyle = {
+ backgroundColor: darkMode ? "#000000" : "#FFFFFF",
+ backgroundImage: `url('/diagramDotBg.svg')`,
+ };
+
+ return (
+
+ {children}
+
+ );
+};
+interface PanAndZoomWrapperProps {
+ isInconsistent: boolean;
+ panAndZoomActor: ActorRef;
+ leftPanelExpanded: boolean; // TODO this has to be in xstate.
+ viewPortChildren?: ReactNode;
+ children: ReactNode;
+ flowActor: ActorRef;
+ isExecutionView?: boolean;
+}
+
+const PanAndZoomWrapper: FunctionComponent = ({
+ isInconsistent,
+ panAndZoomActor,
+ children,
+ leftPanelExpanded, // TODO this has to be in xstate.
+ viewPortChildren = null,
+ flowActor,
+ isExecutionView = false,
+}) => {
+ const [
+ { zoom, canvasSize, layout, position, panEnabled, isSearchFieldVisible },
+ {
+ handleResetZoomPosition,
+ handleSetPosition,
+ handleCenterOnSelectedTask,
+ handleSetInitialViewportOffset,
+ handleSetFitScreen,
+ handleZoom,
+ handleDrag,
+ handleTogglePan,
+ handleToggleSearchField,
+ handleSetZoomAndPosition,
+ },
+ ] = usePanAndZoomActor(panAndZoomActor);
+
+ const workflowName = useSelector(flowActor, selectWorkflowName);
+
+ const viewportRef = useRef(null);
+
+ const getRelativeCursorPosition = useCallback((event: WheelEvent) => {
+ // Get current cursor position with the viewportRef
+ const rect = viewportRef?.current?.getBoundingClientRect();
+
+ return {
+ x: event.clientX - (rect?.left ?? 0),
+ y: event.clientY - (rect?.top ?? 0),
+ };
+ }, []);
+
+ const resetPosition = useCallback(() => {
+ if (canvasSize.height > 0 && viewportRef?.current) {
+ const { offsetWidth, offsetHeight } = viewportRef.current;
+
+ handleResetZoomPosition(offsetWidth, offsetHeight);
+ }
+ }, [canvasSize, viewportRef, handleResetZoomPosition]);
+
+ const centerPosition = useCallback(() => {
+ if (viewportRef?.current) {
+ const { offsetWidth, offsetHeight } = viewportRef.current;
+
+ handleCenterOnSelectedTask(offsetWidth, offsetHeight);
+ }
+ }, [handleCenterOnSelectedTask, viewportRef]);
+
+ useEffect(() => {
+ if (viewportRef?.current) {
+ const { offsetWidth, offsetHeight } = viewportRef.current;
+
+ handleSetInitialViewportOffset(offsetWidth, offsetHeight);
+ }
+ }, [handleSetInitialViewportOffset, viewportRef]);
+
+ useEffect(() => {
+ centerPosition();
+ }, [leftPanelExpanded, centerPosition]);
+
+ usePinch(
+ ({ offset: [factor], event }: any) => {
+ event.stopPropagation();
+ // This event needs to send the position of the mouse in the viewport. to handle zoom there
+ // and should disable scroll events for a period of time.
+ if (!isEventReallyWheel(event)) {
+ const cursorPosition = getRelativeCursorPosition(event);
+
+ handleSetZoomAndPosition(
+ { x: cursorPosition.x, y: cursorPosition.y },
+ factor,
+ );
+ }
+ },
+ {
+ scaleBounds: { min: MIN_ZOOM, max: MAX_ZOOM },
+ from: zoom,
+ enabled: !!layout,
+ target: viewportRef.current!,
+ eventOptions: { passive: false },
+ },
+ );
+
+ const scrollCallback = useCallback>(
+ ({ delta, event, metaKey, ctrlKey, direction }) => {
+ event.stopPropagation();
+ event.preventDefault();
+
+ if ((metaKey || ctrlKey) && direction[1] !== 0) {
+ const zoomSensitivity = 0.001; // Adjust this value to control zoom sensitivity
+ let newZoom = zoom * (1 - event.deltaY * zoomSensitivity);
+
+ if (newZoom < MIN_ZOOM) {
+ newZoom = MIN_ZOOM;
+ } else if (newZoom > MAX_ZOOM) {
+ newZoom = MAX_ZOOM;
+ }
+
+ const cursorPosition = getRelativeCursorPosition(event);
+
+ handleSetZoomAndPosition(
+ { x: cursorPosition.x as number, y: cursorPosition.y },
+ newZoom,
+ );
+ } else {
+ const newX = position.x - delta[0];
+ const newY = position.y - delta[1];
+ handleSetPosition!({ x: newX, y: newY });
+ }
+ },
+ [
+ getRelativeCursorPosition,
+ handleSetZoomAndPosition,
+ handleSetPosition,
+ zoom,
+ position,
+ ],
+ );
+
+ useWheel(scrollCallback, {
+ enabled: !!layout,
+ target: viewportRef.current!,
+ eventOptions: { passive: false },
+ });
+
+ useDrag(
+ (props: any) => {
+ const { delta, event, tap } = props;
+ event.stopPropagation();
+ const newX = position.x + delta[0];
+ const newY = position.y + delta[1];
+
+ // Filter to prevent onClick event
+ if (!tap) {
+ handleDrag(
+ { x: newX, y: newY },
+ { x: event.clientX, y: event.clientY },
+ );
+ }
+ },
+ {
+ target: viewportRef.current!,
+ eventOptions: { passive: false },
+ filterTaps: true,
+ },
+ );
+
+ const fitToScreen = useCallback(() => {
+ if (viewportRef?.current) {
+ const { offsetWidth, offsetHeight } = viewportRef.current;
+
+ handleSetFitScreen(offsetWidth, offsetHeight);
+ }
+ }, [viewportRef, handleSetFitScreen]);
+
+ return (
+
+
+ printScreen(workflowName || "workflow_diagram"),
+ }}
+ togglePan={handleTogglePan}
+ panEnabled={panEnabled}
+ flowActor={flowActor}
+ isSearchFieldVisible={isSearchFieldVisible}
+ toggleSearchField={handleToggleSearchField}
+ isExecutionView={isExecutionView}
+ />
+ {viewPortChildren}
+
+
+
+ );
+};
+
+export default PanAndZoomWrapper;
diff --git a/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/SearchBox.tsx b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/SearchBox.tsx
new file mode 100644
index 0000000000..409ec8bcf4
--- /dev/null
+++ b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/SearchBox.tsx
@@ -0,0 +1,96 @@
+import { Box } from "@mui/material";
+import { FlowEvents, useFlowMachine } from "components/flow/state";
+
+import ClickAwayListener from "@mui/material/ClickAwayListener";
+
+import { FunctionComponent, useMemo, useState } from "react";
+
+import { ActorRef } from "xstate";
+import { usePanAndZoomActor } from "./state";
+import { AdvancedSearchFieldPopper } from "components/v1/AdvancedSearchFieldPopper";
+import { isPseudoTask } from "utils/utils";
+import { NodeData } from "reaflow";
+import { useHotkeys } from "react-hotkeys-hook";
+import { Key } from "ts-key-enum";
+
+interface SearchBoxProps {
+ flowActor: ActorRef;
+ anchorEl: any;
+}
+
+export const SearchBox: FunctionComponent = ({
+ flowActor,
+ anchorEl,
+}) => {
+ const [{ selectNode }, { nodes, panAndZoomActor }] =
+ useFlowMachine(flowActor);
+ const [
+ { viewportSize },
+ { handleToggleSearchField, handleSelectSearchResult },
+ ] = usePanAndZoomActor(panAndZoomActor);
+
+ const [filteredOptionsCount, setFilteredOptionsCount] = useState(0);
+ const [hoveredItem, setHoveredItem] = useState("");
+ const [searchTerm, setSearchTerm] = useState("");
+
+ const suggestions = nodes.reduce(
+ (
+ accumulator: { taskName: string; taskRef: string; type: string }[],
+ item: NodeData,
+ ) => {
+ if (item.data.task && !isPseudoTask(item.data.task)) {
+ accumulator.push({
+ taskName: item.text,
+ taskRef: item.id,
+ type: item.data.task.type ?? "",
+ });
+ }
+ return accumulator;
+ },
+ [],
+ );
+
+ const filteredOptions = useMemo(() => {
+ if (suggestions) {
+ const newFilteredOptions = suggestions.filter((option) =>
+ `${option.taskName}${option.taskRef}${option.type}`
+ .toLowerCase()
+ .includes(searchTerm.toLowerCase()),
+ );
+ return newFilteredOptions;
+ } else return [];
+ }, [suggestions, searchTerm]);
+
+ const handleClickSearchResult = (val: string | null) => {
+ const [selectedTask] = nodes.filter((item) => item.id === val);
+ if (selectedTask) {
+ selectNode(selectedTask);
+ handleSelectSearchResult(viewportSize?.width, viewportSize?.height);
+ }
+ };
+
+ useHotkeys(Key.Escape, handleToggleSearchField, {
+ enableOnFormTags: ["INPUT"],
+ });
+
+ return (
+
+
+
+
+
+ );
+};
diff --git a/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/ZoomControls.tsx b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/ZoomControls.tsx
new file mode 100644
index 0000000000..3ef1f21c5d
--- /dev/null
+++ b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/ZoomControls.tsx
@@ -0,0 +1,294 @@
+import HelpOutlineIcon from "@mui/icons-material/HelpOutline";
+import PrintOutlinedIcon from "@mui/icons-material/PrintOutlined";
+import { Box, Button, Stack } from "@mui/material";
+import { useSelector } from "@xstate/react";
+import { FlowActionTypes, FlowEvents } from "components/flow/state";
+import CustomTooltip from "pages/definition/EditorPanel/CustomTooltip";
+import {
+ DefinitionMachineEventTypes,
+ WorkflowDefinitionEvents,
+ WorkflowEditContext,
+} from "pages/definition/state";
+import {
+ FunctionComponent,
+ RefObject,
+ useCallback,
+ useContext,
+ useRef,
+} from "react";
+import FitToFrame from "shared/icons/FitToFrame";
+import { ZoomControlsButton } from "shared/ZoomControlsButton";
+import { ColorModeContext } from "theme/material/ColorModeContext";
+import { colors } from "theme/tokens/variables";
+import { logrocketTrackIfEnabled } from "utils/logrocket";
+import { ActorRef } from "xstate";
+import { MAX_ZOOM } from "./constants";
+import DragNDrop from "./icons/DragNDrop";
+import Home from "./icons/Home";
+import Minus from "./icons/Minus";
+import Plus from "./icons/Plus";
+import Search from "./icons/Search";
+import { SearchBox } from "./SearchBox";
+
+export interface ZoomControlsProps {
+ zoom: number;
+ setZoom: (zoomIn: boolean) => void;
+ resetPosition: () => void;
+ isInconsistent: boolean;
+ fitToScreen: () => void;
+ togglePan: () => void;
+ panEnabled: boolean;
+ flowActor: ActorRef;
+ isSearchFieldVisible: boolean;
+ toggleSearchField: () => void;
+ printScreen: () => void;
+ isExecutionView: boolean;
+}
+// FIXME this should not be here since we are coupling to the definition machine..
+// ONCE dillip confirms move it elsewhere.
+const MaybeCoolTooltip = ({
+ actor,
+ anchorEl,
+}: {
+ actor: ActorRef;
+ anchorEl: RefObject;
+}) => {
+ const shouldShowTooltip = useSelector(actor, (state) =>
+ state.hasTag("showDescriptionTooltip"),
+ );
+ const handleNextButtonClick = useCallback(() => {
+ actor.send({
+ type: DefinitionMachineEventTypes.NEXT_STEP_IMPORT_SUCCESSFUL_DIALOG,
+ });
+ }, [actor]);
+
+ const handleDismissTutorial = () => {
+ actor.send(DefinitionMachineEventTypes.DISMISS_IMPORT_SUCCESSFUL_DIALOG);
+ };
+
+ return shouldShowTooltip ? (
+
+
+
+ Diagram controls
+
+
+
+ Use diagram controls to show task descriptions, Change zoom
+ settings, Drag tasks arround and more.
+
+
+
+
+
+ }
+ />
+ ) : null;
+};
+
+export const ZoomControls: FunctionComponent = ({
+ zoom,
+ setZoom,
+ resetPosition,
+ isInconsistent,
+ fitToScreen,
+ togglePan,
+ panEnabled,
+ flowActor,
+ isSearchFieldVisible,
+ toggleSearchField,
+ printScreen,
+ isExecutionView,
+}) => {
+ const { mode } = useContext(ColorModeContext);
+ const workflowEditContext = useContext(WorkflowEditContext);
+ const darkMode = mode === "dark";
+ const zoomPercent = Math.round(zoom * 100);
+ const borderColor = darkMode ? colors.gray04 : colors.lightGrey;
+
+ const anchorRef = useRef(null);
+ const showDescriptionButtonRef = useRef(null);
+ const disableZoomIn = zoom >= MAX_ZOOM;
+
+ const isShowDescription = useSelector(flowActor, (state) =>
+ state.hasTag("showDescription"),
+ );
+ const handleToggleShowDescription = useCallback(() => {
+ flowActor.send({ type: FlowActionTypes.TOGGLE_SHOW_DESCRIPTION });
+ logrocketTrackIfEnabled("user_toggle_show_description");
+ }, [flowActor]);
+
+ return (
+
+ {
+ resetPosition();
+ }}
+ disabled={isInconsistent}
+ tooltip="Reset position"
+ >
+
+
+
+ {zoomPercent}%
+
+ {
+ setZoom(true);
+ }}
+ disabled={isInconsistent}
+ tooltip="Zoom out"
+ >
+
+
+ {
+ setZoom(false);
+ }}
+ style={{
+ borderLeft: `1px solid ${borderColor}`,
+ }}
+ disabled={isInconsistent || disableZoomIn}
+ tooltip="Zoom in"
+ >
+
+
+
+
+
+ {!isExecutionView && (
+ togglePan()}
+ disabled={isInconsistent}
+ tooltip={`${panEnabled ? "Enable" : "Disable"} dragging mode`}
+ >
+
+
+ )}
+ {
+ printScreen();
+ }}
+ tooltip="Export to image"
+ >
+
+
+
+
+
+
+
+
+
+
+
+ {isSearchFieldVisible && (
+
+ )}
+ {workflowEditContext.workflowDefinitionActor != null ? (
+
+ ) : null}
+
+ );
+};
diff --git a/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/constants.ts b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/constants.ts
new file mode 100644
index 0000000000..10b68e6a92
--- /dev/null
+++ b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/constants.ts
@@ -0,0 +1,6 @@
+export const MIN_ZOOM = 0.02;
+export const MAX_ZOOM = 2;
+
+export const INITIAL_ZOOM = 0.75;
+
+export const EDGE_SPACING = 170;
diff --git a/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/icons/DragNDrop.tsx b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/icons/DragNDrop.tsx
new file mode 100644
index 0000000000..862a4cecda
--- /dev/null
+++ b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/icons/DragNDrop.tsx
@@ -0,0 +1,18 @@
+function Icon({ size = "20", color = "#000000" }) {
+ return (
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/icons/Home.tsx b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/icons/Home.tsx
new file mode 100644
index 0000000000..5576fb9fd2
--- /dev/null
+++ b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/icons/Home.tsx
@@ -0,0 +1,18 @@
+function Icon({ size = "20", color = "#000000" }) {
+ return (
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/icons/Minus.tsx b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/icons/Minus.tsx
new file mode 100644
index 0000000000..8baceb177c
--- /dev/null
+++ b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/icons/Minus.tsx
@@ -0,0 +1,18 @@
+function Icon({ size = "20", color = "#000000" }) {
+ return (
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/icons/Plus.tsx b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/icons/Plus.tsx
new file mode 100644
index 0000000000..0472e32fc2
--- /dev/null
+++ b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/icons/Plus.tsx
@@ -0,0 +1,18 @@
+function Icon({ size = "20", color = "#000000" }) {
+ return (
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/icons/Search.tsx b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/icons/Search.tsx
new file mode 100644
index 0000000000..cdc979c455
--- /dev/null
+++ b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/icons/Search.tsx
@@ -0,0 +1,18 @@
+function Icon({ size = "20", color = "#000000" }) {
+ return (
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/index.ts b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/index.ts
new file mode 100644
index 0000000000..bc68f36df8
--- /dev/null
+++ b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/index.ts
@@ -0,0 +1,3 @@
+import PanAndZoomWrapper from "./PanAndZoomWrapper";
+export * from "./state";
+export default PanAndZoomWrapper;
diff --git a/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/state/actions.ts b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/state/actions.ts
new file mode 100644
index 0000000000..901bf91316
--- /dev/null
+++ b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/state/actions.ts
@@ -0,0 +1,273 @@
+import { assign, raise } from "xstate";
+import _isNaN from "lodash/isNaN";
+
+import {
+ CenterOnSelectedTaskEvent,
+ HandleZoomEvent,
+ PanAndZoomMachineContext,
+ ResetZoomPositionEvent,
+ SelectNodeEvent,
+ SetFitScreenEvent,
+ SetInitialViewportOffsetEvent,
+ SetLayoutEvent,
+ SetPositionEvent,
+ SetZoomEvent,
+ SetZoomToPositionEvent,
+ DragEvent,
+ PanAndZoomEventTypes,
+ ToggleSearchEvent,
+ SetNotifiedEventTypeEvent,
+} from "./types";
+
+import { MAX_ZOOM, MIN_ZOOM } from "../constants";
+import { ZOOMING_STEP } from "utils/constants/workflow";
+import {
+ applyZoomToCursor,
+ calculateZoomPosition,
+ centerInBestLayoutNode,
+ initialZoomCenter,
+ NodeWithSizeAndPosition,
+} from "./helpers";
+import { featureFlags, FEATURES } from "utils";
+
+const DRAG_DROP_TASK_INCREMENT_THRESHOLD = featureFlags.getValue(
+ FEATURES.DRAG_DROP_TASK_INCREMENT_THRESHOLD,
+);
+
+export const resetZoomPosition = assign<
+ PanAndZoomMachineContext,
+ ResetZoomPositionEvent
+>(
+ (
+ { layout, viewportSize, zoom },
+ { viewportOffsetWidth, viewportOffsetHeight },
+ ) =>
+ initialZoomCenter({
+ layout,
+ viewportOffsetWidth: viewportOffsetWidth || viewportSize.width,
+ viewportOffsetHeight: viewportOffsetHeight || viewportSize.height,
+ zoom,
+ }),
+);
+
+export const setLayout = assign(
+ (context, { layout }) => {
+ const canvasWidth = layout?.width || context.canvasSize.width;
+ const canvasHeight = layout?.height || context.canvasSize.height;
+ return {
+ canvasSize: { width: canvasWidth, height: canvasHeight },
+ layout: layout,
+ // viewportSize:{}
+ };
+ },
+);
+
+export const setZoom = assign(
+ (context, { zoom }) => {
+ return calculateZoomPosition({ context, newZoom: zoom });
+ },
+);
+
+export const setPosition = assign({
+ position: (__context, { position }) => position,
+});
+
+export const setSelectedNode = assign<
+ PanAndZoomMachineContext,
+ SelectNodeEvent
+>({
+ selectedNode: (_context, { node }) => node,
+});
+
+export const setInitialViewportOffset = assign<
+ PanAndZoomMachineContext,
+ SetInitialViewportOffsetEvent
+>((_, { viewportOffsetWidth, viewportOffsetHeight }) => ({
+ lastViewportOffsetWidth: viewportOffsetWidth,
+ lastViewportOffsetHeight: viewportOffsetHeight,
+ viewportSize: { width: viewportOffsetWidth, height: viewportOffsetHeight },
+}));
+
+export const centerUsingContext = assign(
+ ({
+ layout,
+ lastViewportOffsetWidth: viewportOffsetWidth,
+ lastViewportOffsetHeight: viewportOffsetHeight,
+ zoom,
+ }) =>
+ initialZoomCenter({
+ layout,
+ viewportOffsetWidth: viewportOffsetWidth!,
+ viewportOffsetHeight: viewportOffsetHeight!,
+ zoom,
+ }),
+);
+
+export const centerOnSelectedTask = assign<
+ PanAndZoomMachineContext,
+ CenterOnSelectedTaskEvent
+>((context, { viewportOffsetWidth, viewportOffsetHeight }) => {
+ if (context.layout) {
+ const { layout, position, selectedNode, zoom } = context;
+
+ const widthToUse = viewportOffsetWidth || context.lastViewportOffsetWidth!;
+ const heightToUse =
+ viewportOffsetHeight || context.lastViewportOffsetHeight!;
+
+ const newPosition = centerInBestLayoutNode(
+ layout?.children || [],
+ { width: widthToUse, height: heightToUse },
+ zoom,
+ selectedNode as NodeWithSizeAndPosition,
+ );
+
+ if (newPosition === null) {
+ return initialZoomCenter({
+ layout,
+ viewportOffsetWidth: widthToUse,
+ viewportOffsetHeight: heightToUse,
+ zoom,
+ });
+ }
+
+ const { x: positionX, y: positionY } = newPosition || context.position;
+
+ return {
+ position: {
+ x: _isNaN(positionX) ? (widthToUse - layout!.width!) / 2 : positionX,
+ y: _isNaN(positionY) ? position.y : positionY,
+ },
+ lastViewportOffsetWidth: widthToUse,
+ lastViewportOffsetHeight: heightToUse,
+ viewportSize: { width: widthToUse, height: heightToUse },
+ };
+ }
+
+ return context;
+});
+
+export const fitToScreen = assign(
+ (context, { viewportOffsetWidth, viewportOffsetHeight }) => {
+ const { layout } = context;
+
+ // Calculate the scale ratio for both width and height
+ const widthRatio = layout?.width ? viewportOffsetWidth / layout.width : 1;
+ const heightRatio = layout?.height
+ ? viewportOffsetHeight / layout.height
+ : 1;
+ // Use the smaller ratio to fit the canvas into the viewport
+ const scale = Math.min(widthRatio, heightRatio);
+
+ // Calculate the new diagram width and height
+ const newDiagramWidth = (layout?.width || 1) * scale;
+ const newDiagramHeight = (layout?.height || 1) * scale;
+
+ // Calculate the position of the diagram in the viewport
+ const positionX = Math.ceil(
+ widthRatio === scale ? 0 : (viewportOffsetWidth - newDiagramWidth) / 2,
+ );
+ const positionY = Math.ceil((viewportOffsetHeight - newDiagramHeight) / 2);
+
+ return {
+ position: {
+ x: positionX,
+ y: positionY,
+ },
+ zoom: scale,
+ };
+ },
+);
+
+export const setZoomToPosition = assign<
+ PanAndZoomMachineContext,
+ SetZoomToPositionEvent
+>((context, { zoom, position }) => {
+ const currentPosition = context.position;
+ const oldZoom = context.zoom;
+
+ return applyZoomToCursor(currentPosition, position, oldZoom, zoom);
+});
+
+export const handleZoom = assign(
+ (context, { isZoomOut }) => {
+ const roundedContextZoom = Math.round(context.zoom * 10) / 10;
+ const newZoom = isZoomOut
+ ? roundedContextZoom - ZOOMING_STEP
+ : roundedContextZoom + ZOOMING_STEP;
+
+ if (isZoomOut && newZoom > MIN_ZOOM) {
+ return calculateZoomPosition({ context, newZoom });
+ }
+ if (!isZoomOut && newZoom <= MAX_ZOOM) {
+ return calculateZoomPosition({ context, newZoom });
+ }
+
+ return context;
+ },
+);
+
+const INCREMENT_THRESHOLD = isNaN(DRAG_DROP_TASK_INCREMENT_THRESHOLD)
+ ? 10
+ : Number(DRAG_DROP_TASK_INCREMENT_THRESHOLD);
+
+const MIN_ALLOWED_WIDTH = 210; // Estimated from the menu bar to the left
+const MIN_ALLOWED_HEIGHT = 180; // Estimated from the menu bar to the top
+export const setPositionOfDraggingTask = assign<
+ PanAndZoomMachineContext,
+ DragEvent
+>((context, { clientMousePosition }) => {
+ let draggingUpdatedPosition = context.draggingUpdatedPosition;
+ const maxAllowedWidth = context.lastViewportOffsetWidth! - 10;
+
+ const maxAllowedHeight = context.lastViewportOffsetHeight! - 100;
+
+ const currentPosition = { ...context.position };
+
+ if (clientMousePosition.x >= maxAllowedWidth) {
+ currentPosition.x = context.position.x - INCREMENT_THRESHOLD;
+ draggingUpdatedPosition = true;
+ }
+
+ if (clientMousePosition.x <= MIN_ALLOWED_WIDTH) {
+ currentPosition.x = context.position.x + INCREMENT_THRESHOLD;
+
+ draggingUpdatedPosition = true;
+ }
+
+ if (clientMousePosition.y >= maxAllowedHeight) {
+ currentPosition.y = context.position.y - INCREMENT_THRESHOLD;
+
+ draggingUpdatedPosition = true;
+ }
+
+ if (clientMousePosition.y <= MIN_ALLOWED_HEIGHT) {
+ // Note this represents the top of the screen
+ currentPosition.y = context.position.y + INCREMENT_THRESHOLD;
+
+ draggingUpdatedPosition = true;
+ }
+ return {
+ position: currentPosition,
+ draggingUpdatedPosition,
+ };
+});
+export const cleanUpPositionUpdatedFlag = assign({
+ draggingUpdatedPosition: false,
+});
+
+export const fireToggleSearchField = raise<
+ PanAndZoomMachineContext,
+ ToggleSearchEvent
+>(
+ {
+ type: PanAndZoomEventTypes.TOGGLE_SEARCH_EVT,
+ },
+ { delay: 200 },
+);
+
+export const setNotifiedEventType = assign<
+ PanAndZoomMachineContext,
+ SetNotifiedEventTypeEvent
+>((__, event) => {
+ return { notifiedEventType: event.eventType };
+});
diff --git a/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/state/context.tsx b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/state/context.tsx
new file mode 100644
index 0000000000..787ac71b62
--- /dev/null
+++ b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/state/context.tsx
@@ -0,0 +1,12 @@
+import { createContext, ReactNode } from "react";
+import { ActorRef } from "xstate";
+import { PanAndZoomEvents } from "./types";
+
+export interface PanAndZoomContextProps {
+ panAndZoomActor?: ActorRef;
+ children?: ReactNode;
+}
+
+export const PanAndZoomContext = createContext({
+ panAndZoomActor: undefined,
+});
diff --git a/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/state/helpers.test.ts b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/state/helpers.test.ts
new file mode 100644
index 0000000000..1213867355
--- /dev/null
+++ b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/state/helpers.test.ts
@@ -0,0 +1,76 @@
+import { applyZoomToCursor } from "./helpers";
+
+const zoomCases = [
+ {
+ description: "Zoom out with same cursor position",
+ currentPosition: { x: 100, y: 100 },
+ cursorPosition: { x: 100, y: 100 },
+ oldZoom: 0.5,
+ newZoom: 0.6,
+ expected: {
+ position: {
+ x: 100,
+ y: 100,
+ },
+ zoom: 0.6,
+ },
+ },
+ {
+ description: "Zoom out with different cursor position",
+ currentPosition: { x: 100, y: 100 },
+ cursorPosition: { x: 200, y: 200 },
+ oldZoom: 0.5,
+ newZoom: 0.6,
+ expected: {
+ position: {
+ x: 80,
+ y: 80,
+ },
+ zoom: 0.6,
+ },
+ },
+ {
+ description: "Zoom in with same cursor position",
+ currentPosition: { x: 100, y: 100 },
+ cursorPosition: { x: 100, y: 100 },
+ oldZoom: 0.5,
+ newZoom: 0.4,
+ expected: {
+ position: {
+ x: 100,
+ y: 100,
+ },
+ zoom: 0.4,
+ },
+ },
+ {
+ description: "Zoom in with different cursor position",
+ currentPosition: { x: 100, y: 100 },
+ cursorPosition: { x: 200, y: 200 },
+ oldZoom: 0.5,
+ newZoom: 0.4,
+ expected: {
+ position: {
+ x: 120,
+ y: 120,
+ },
+ zoom: 0.4,
+ },
+ },
+];
+
+describe("Testing applyZoomToCursor function", () => {
+ test.each(zoomCases)(
+ "Testing $description: given $oldZoom and $newZoom as arguments, returns $expected",
+ ({ oldZoom, newZoom, currentPosition, cursorPosition, expected }) => {
+ const result = applyZoomToCursor(
+ currentPosition,
+ cursorPosition,
+ oldZoom,
+ newZoom,
+ );
+
+ expect(result).toMatchObject(expected);
+ },
+ );
+});
diff --git a/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/state/helpers.ts b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/state/helpers.ts
new file mode 100644
index 0000000000..b07075c5be
--- /dev/null
+++ b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/state/helpers.ts
@@ -0,0 +1,180 @@
+import { ElkRoot, NodeData } from "reaflow";
+import { PanAndZoomMachineContext, PositionProps, SizeProps } from "./types";
+
+type CenterParams = {
+ layout?: ElkRoot;
+ viewportOffsetWidth: number;
+ viewportOffsetHeight: number;
+ zoom: number;
+};
+
+type SizeAndPosition = PositionProps & { width: number; height: number };
+
+export const PADDING_TOP = 65;
+
+export const centerCanvasToNodePosition = (
+ containerSize: SizeProps,
+ node: SizeAndPosition,
+ scale: number,
+) => {
+ // Calculate position of the canvas to center at X coordinate
+ const viewPortCenterX = containerSize.width / 2;
+ const realXPosition = node.width / 2 + node.x; // X coordinate of the node plus half of the node width
+ const scaledXCoordinate = realXPosition * scale; // Scale X coordinate
+ const positionX = viewPortCenterX - scaledXCoordinate; // Center of the viewport minus the scaled X coordinate
+
+ const viewportCenterY = containerSize.height / 2;
+ const realYPosition = node.height / 2 + node.y; // Y coordinate of the node plus half of the node height
+ const scaledYCoordinate = realYPosition * scale; // Scale Y coordinate
+ const positionY = viewportCenterY - scaledYCoordinate; // Center of the viewport minus the scaled Y coordinate
+
+ return {
+ x: positionX,
+ y: positionY,
+ };
+};
+
+export type NodeWithSizeAndPosition = NodeData &
+ SizeAndPosition & { children?: NodeWithSizeAndPosition[] };
+
+export const centerInBestLayoutNode = (
+ children: NodeWithSizeAndPosition[],
+ containerSize: SizeProps,
+ scale: number,
+ selectedNode?: NodeWithSizeAndPosition,
+): SizeAndPosition | undefined => {
+ // No children. then nothing to do.
+ if (children.length === 0 || selectedNode == null) return undefined;
+
+ // If no selected node center somewhere
+ const nodeSelected = selectedNode; //|| _first(children)!;
+
+ for (const node of children) {
+ if (node.id === nodeSelected.id) {
+ return {
+ ...centerCanvasToNodePosition(containerSize, node, scale), // Node found cool center according to parameters
+ width: node.width,
+ height: node.height,
+ };
+ }
+ // Node not was not found but has children look for childs
+ if (node.children) {
+ const result = centerInBestLayoutNode(
+ // the node has to be centered relative to its container so in this case the paren is the container
+ node.children,
+ node,
+ 1,
+ selectedNode,
+ );
+ if (result) {
+ // result was found
+ const resultPosition = centerCanvasToNodePosition(
+ // Center using our real container size
+ containerSize,
+ {
+ x: node.x - result.x, // we move inside our new container according to the result of the previous center
+ y: node.y - result.y,
+ width: node.width,
+ height: node.height,
+ },
+ scale,
+ );
+ return {
+ ...resultPosition,
+ width: node.width,
+ height: node.height,
+ };
+ }
+ }
+ }
+};
+
+export const initialZoomCenter = ({
+ layout,
+ viewportOffsetWidth,
+ viewportOffsetHeight,
+ zoom,
+}: CenterParams): Partial => {
+ const startNode = layout?.children?.[0];
+
+ if (!startNode) {
+ return {};
+ }
+
+ const centerPosition = centerCanvasToNodePosition(
+ {
+ width: viewportOffsetWidth,
+ height: viewportOffsetHeight,
+ },
+ startNode,
+ zoom,
+ );
+
+ return {
+ position: {
+ x: centerPosition.x,
+ // Padding top & control bar height (40)
+ y: startNode.y + PADDING_TOP,
+ },
+ zoom,
+ viewportSize: { width: viewportOffsetWidth, height: viewportOffsetHeight },
+ lastViewportOffsetWidth: viewportOffsetWidth,
+ lastViewportOffsetHeight: viewportOffsetHeight,
+ };
+};
+
+export const applyZoomToCursor = (
+ currentPosition: { x: number; y: number },
+ cursorPosition: { x: number; y: number },
+ oldZoom: number,
+ newZoom: number,
+) => {
+ // Calculate the change in zoom
+ const zoomFactor = newZoom / oldZoom;
+
+ // Calculate the new position to keep the cursor in the same position relative to the canvas content
+ const deltaX = (cursorPosition.x - currentPosition.x) * (1 - zoomFactor);
+ const deltaY = (cursorPosition.y - currentPosition.y) * (1 - zoomFactor);
+
+ return {
+ position: {
+ x: currentPosition.x + deltaX,
+ y: currentPosition.y + deltaY,
+ },
+ zoom: newZoom,
+ };
+};
+
+export const calculateZoomPosition = ({
+ context,
+ newZoom,
+}: {
+ context: PanAndZoomMachineContext;
+ newZoom: number;
+}) => {
+ const { layout, position: currentPosition, zoom: oldZoom } = context;
+
+ // Strategy:
+ // Try to keep the position Y that will make the diagram zoom in/out center of X
+
+ // Old center position (C0)
+ const oldCenterX = (layout?.width ?? 0 * oldZoom) / 2;
+ // const oldCenterY = (layout?.height! * oldZoom) / 2;
+
+ // New center position (C1)
+ const newCenterX = (layout?.width ?? 0 * newZoom) / 2;
+ // const newCenterY = (layout?.height! * newZoom) / 2;
+
+ // Delta
+ const deltaX = oldCenterX - newCenterX;
+ // const deltaY = oldCenterY - newCenterY;
+
+ return {
+ zoom: newZoom,
+ position: {
+ x: currentPosition.x + deltaX,
+ // if you need to shrink/expand to the center => + deltaY
+ y: currentPosition.y,
+ },
+ };
+};
diff --git a/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/state/hook.ts b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/state/hook.ts
new file mode 100644
index 0000000000..278e11d654
--- /dev/null
+++ b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/state/hook.ts
@@ -0,0 +1,194 @@
+import { useCallback } from "react";
+import { useSelector } from "@xstate/react";
+import { ActorRef } from "xstate";
+import {
+ PanAndZoomEvents,
+ PanAndZoomEventTypes,
+ PositionProps,
+ PanAndZoomStates,
+} from "./types";
+
+export const usePanAndZoomActor = (
+ panAndZoomActor: ActorRef,
+) => {
+ const send = panAndZoomActor.send;
+
+ const handleResetZoomPosition = useCallback(
+ (viewportOffsetWidth: number, viewportOffsetHeight: number) => {
+ send({
+ type: PanAndZoomEventTypes.RESET_ZOOM_POSITION_EVT,
+ viewportOffsetWidth,
+ viewportOffsetHeight,
+ });
+ },
+ [send],
+ );
+
+ const handleSetZoom = useCallback(
+ (zoom: number) => {
+ send({ type: PanAndZoomEventTypes.SET_ZOOM_EVT, zoom });
+ },
+ [send],
+ );
+
+ const handleSetPosition = useCallback(
+ (position: PositionProps) => {
+ send({ type: PanAndZoomEventTypes.SET_POSITION_EVT, position });
+ },
+ [send],
+ );
+
+ const handleDrag = useCallback(
+ (position: PositionProps, clientMousePosition: PositionProps) => {
+ send({
+ type: PanAndZoomEventTypes.DRAG_EVENT_EVT,
+ position,
+ clientMousePosition,
+ });
+ },
+ [send],
+ );
+
+ const handleCenterOnSelectedTask = useCallback(
+ (viewportOffsetWidth: number, viewportOffsetHeight: number) => {
+ send({
+ type: PanAndZoomEventTypes.CENTER_ON_SELECTED_TASK,
+ viewportOffsetWidth,
+ viewportOffsetHeight,
+ });
+ },
+ [send],
+ );
+
+ const handleSetFullScreen = useCallback(
+ (fullScreen: boolean, viewportOffsetWidth: number) => {
+ send({
+ type: PanAndZoomEventTypes.SET_FULL_SCREEN_EVT,
+ viewportOffsetWidth,
+ fullScreen,
+ });
+ },
+ [send],
+ );
+
+ const handleSetFitScreen = useCallback(
+ (viewportOffsetWidth: number, viewportOffsetHeight: number) => {
+ send({
+ type: PanAndZoomEventTypes.SET_FIT_SCREEN_EVT,
+ viewportOffsetWidth,
+ viewportOffsetHeight,
+ });
+ },
+ [send],
+ );
+
+ const handleSetInitialViewportOffset = useCallback(
+ (viewportOffsetWidth: number, viewportOffsetHeight: number) => {
+ send({
+ type: PanAndZoomEventTypes.SET_INITIAL_VIEWPORT_OFFSET,
+ viewportOffsetWidth,
+ viewportOffsetHeight,
+ });
+ },
+ [send],
+ );
+
+ const handleZoom = useCallback(
+ (isZoomOut: boolean) => {
+ send({
+ type: PanAndZoomEventTypes.HANDLE_ZOOM_EVT,
+ isZoomOut,
+ });
+ },
+ [send],
+ );
+
+ const handleTogglePan = useCallback(
+ () => send({ type: PanAndZoomEventTypes.TOGGLE_PAN_EVT }),
+ [send],
+ );
+
+ const handleSetZoomAndPosition = useCallback(
+ (position: PositionProps, zoom: number) =>
+ send({
+ type: PanAndZoomEventTypes.SET_ZOOM_TO_POSITION_EVT,
+ zoom,
+ position,
+ }),
+ [send],
+ );
+
+ const handleToggleSearchField = useCallback(
+ () => send({ type: PanAndZoomEventTypes.TOGGLE_SEARCH_EVT }),
+ [send],
+ );
+
+ const handleSelectSearchResult = useCallback(
+ (viewportOffsetWidth: number, viewportOffsetHeight: number) =>
+ send({
+ type: PanAndZoomEventTypes.SELECT_SEARCH_RESULT,
+ viewportOffsetWidth,
+ viewportOffsetHeight,
+ }),
+ [send],
+ );
+
+ const handleSetEventType = useCallback(
+ (eventType: string) =>
+ send({ type: PanAndZoomEventTypes.SET_NOTIFIED_EVENT_TYPE, eventType }),
+ [send],
+ );
+
+ return [
+ {
+ zoom: useSelector(panAndZoomActor, (state) => state.context.zoom),
+ canvasSize: useSelector(
+ panAndZoomActor,
+ (state) => state.context.canvasSize,
+ ),
+ layout: useSelector(panAndZoomActor, (state) => state.context.layout),
+ position: useSelector(panAndZoomActor, (state) => state.context.position),
+ panEnabled: useSelector(panAndZoomActor, (state) =>
+ state.matches([
+ PanAndZoomStates.IDLE,
+ PanAndZoomStates.PAN,
+ PanAndZoomStates.PAN_ENABLED,
+ ]),
+ ),
+ viewportSize: useSelector(
+ panAndZoomActor,
+ (state) => state.context.viewportSize,
+ ),
+ isSearchFieldVisible: useSelector(panAndZoomActor, (state) =>
+ state.matches([
+ PanAndZoomStates.IDLE,
+ PanAndZoomStates.SEARCH_FIELD,
+ PanAndZoomStates.SEARCH_FIELD_VISIBLE,
+ ]),
+ ),
+ isPanAndZoomIdle: useSelector(panAndZoomActor, (state) =>
+ state.matches([PanAndZoomStates.IDLE]),
+ ),
+ notifiedEventType: useSelector(
+ panAndZoomActor,
+ (state) => state.context.notifiedEventType,
+ ),
+ },
+ {
+ handleResetZoomPosition,
+ handleSetZoom,
+ handleSetPosition,
+ handleCenterOnSelectedTask,
+ handleSetInitialViewportOffset,
+ handleSetFullScreen,
+ handleSetFitScreen,
+ handleZoom,
+ handleTogglePan,
+ handleDrag,
+ handleSetZoomAndPosition,
+ handleToggleSearchField,
+ handleSelectSearchResult,
+ handleSetEventType,
+ },
+ ] as const;
+};
diff --git a/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/state/index.ts b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/state/index.ts
new file mode 100644
index 0000000000..c5a88e2ce2
--- /dev/null
+++ b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/state/index.ts
@@ -0,0 +1,4 @@
+export * from "./hook";
+export * from "./machine";
+export * from "./types";
+export * from "./context";
diff --git a/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/state/machine.ts b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/state/machine.ts
new file mode 100644
index 0000000000..accd9e0962
--- /dev/null
+++ b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/state/machine.ts
@@ -0,0 +1,170 @@
+import { createMachine } from "xstate";
+import * as actions from "./actions";
+import _isEmpty from "lodash/isEmpty";
+import {
+ PanAndZoomMachineContext,
+ PanAndZoomEventTypes,
+ PanAndZoomEvents,
+ PanAndZoomStates,
+} from "./types";
+import { INITIAL_ZOOM } from "../constants";
+
+const NO_SIZE = { width: 0, height: 0 };
+const INITIAL_POSITION = { x: 0, y: 0 };
+
+export const panAndZoomMachine = createMachine<
+ PanAndZoomMachineContext,
+ PanAndZoomEvents
+>(
+ {
+ id: "panAndZoomMachine",
+ predictableActionArguments: true,
+ initial: PanAndZoomStates.INIT,
+ context: {
+ zoom: INITIAL_ZOOM,
+ canvasSize: NO_SIZE,
+ viewportSize: NO_SIZE,
+ position: INITIAL_POSITION,
+ isFullScreen: false,
+ draggingUpdatedPosition: false,
+ notifiedEventType: "",
+ },
+ states: {
+ [PanAndZoomStates.INIT]: {
+ on: {
+ [PanAndZoomEventTypes.SET_LAYOUT_EVT]: {
+ actions: "setLayout",
+ target: "checkIfReady",
+ },
+ [PanAndZoomEventTypes.SET_INITIAL_VIEWPORT_OFFSET]: {
+ actions: "setInitialViewportOffset",
+ target: "checkIfReady",
+ },
+ },
+ },
+ [PanAndZoomStates.CHECK_IF_READY]: {
+ always: [
+ {
+ target: PanAndZoomStates.INIT,
+ cond: ({ layout, lastViewportOffsetWidth }) =>
+ _isEmpty(layout?.children) || lastViewportOffsetWidth == null,
+ },
+ { actions: "resetZoomPosition", target: PanAndZoomStates.IDLE },
+ ],
+ },
+ [PanAndZoomStates.IDLE]: {
+ on: {
+ [PanAndZoomEventTypes.RESET_ZOOM_POSITION_EVT]: {
+ actions: "resetZoomPosition",
+ },
+ [PanAndZoomEventTypes.SET_ZOOM_EVT]: {
+ actions: "setZoom",
+ },
+ [PanAndZoomEventTypes.SET_FIT_SCREEN_EVT]: {
+ actions: ["fitToScreen"],
+ },
+ [PanAndZoomEventTypes.HANDLE_ZOOM_EVT]: {
+ actions: ["handleZoom"],
+ },
+ [PanAndZoomEventTypes.SET_ZOOM_TO_POSITION_EVT]: {
+ actions: "setZoomToPosition",
+ },
+ [PanAndZoomEventTypes.CENTER_ON_SELECTED_TASK]: {
+ actions: "centerOnSelectedTask",
+ },
+ [PanAndZoomEventTypes.SELECT_NODE_EVENT_EVT]: {
+ actions: ["setSelectedNode"],
+ },
+ [PanAndZoomEventTypes.SET_LAYOUT_EVT]: {
+ actions: ["setLayout"],
+ },
+ [PanAndZoomEventTypes.SET_POSITION_EVT]: {
+ actions: "setPosition",
+ },
+ [PanAndZoomEventTypes.SELECT_SEARCH_RESULT]: {
+ actions: ["centerOnSelectedTask", "fireToggleSearchField"],
+ },
+ [PanAndZoomEventTypes.SET_NOTIFIED_EVENT_TYPE]: {
+ actions: "setNotifiedEventType",
+ },
+ },
+ type: "parallel",
+ states: {
+ [PanAndZoomStates.PAN]: {
+ initial: PanAndZoomStates.PAN_ENABLED,
+ states: {
+ [PanAndZoomStates.PAN_ENABLED]: {
+ on: {
+ [PanAndZoomEventTypes.DRAG_EVENT_EVT]: {
+ actions: ["setPosition"],
+ },
+ [PanAndZoomEventTypes.TOGGLE_PAN_EVT]: {
+ target: PanAndZoomStates.PAN_DISABLED,
+ },
+ },
+ },
+ [PanAndZoomStates.PAN_DISABLED]: {
+ on: {
+ [PanAndZoomEventTypes.TOGGLE_PAN_EVT]: {
+ target: PanAndZoomStates.PAN_ENABLED,
+ },
+ },
+ initial: PanAndZoomStates.NOT_DRAGGING_TASK,
+ states: {
+ [PanAndZoomStates.DRAGGING_TASK]: {
+ on: {
+ [PanAndZoomEventTypes.DRAG_EVENT_EVT]: {
+ actions: ["setPositionOfDraggingTask"],
+ },
+ [PanAndZoomEventTypes.DRAG_TASK_END]: {
+ target: PanAndZoomStates.NOT_DRAGGING_TASK,
+ actions: ["cleanUpPositionUpdatedFlag"],
+ },
+ },
+ },
+ [PanAndZoomStates.NOT_DRAGGING_TASK]: {
+ on: {
+ [PanAndZoomEventTypes.DRAG_TASK_BEGIN]: {
+ target: PanAndZoomStates.DRAGGING_TASK,
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ [PanAndZoomStates.SEARCH_FIELD]: {
+ initial: PanAndZoomStates.SEARCH_FIELD_HIDDEN,
+ states: {
+ [PanAndZoomStates.SEARCH_FIELD_VISIBLE]: {
+ on: {
+ [PanAndZoomEventTypes.TOGGLE_SEARCH_EVT]: {
+ target: PanAndZoomStates.SEARCH_FIELD_HIDDEN,
+ },
+ },
+ },
+ [PanAndZoomStates.SEARCH_FIELD_HIDDEN]: {
+ on: {
+ [PanAndZoomEventTypes.TOGGLE_SEARCH_EVT]: {
+ target: PanAndZoomStates.SEARCH_FIELD_VISIBLE,
+ },
+ },
+ },
+ },
+ },
+
+ // pan
+ // pan enabled
+ // pan desabled
+
+ // searchfield
+ // visible
+ // not visible
+ },
+ },
+ },
+ },
+ {
+ actions: actions as any,
+ },
+);
diff --git a/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/state/types.ts b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/state/types.ts
new file mode 100644
index 0000000000..03a4b56bd7
--- /dev/null
+++ b/ui-next/src/components/flow/components/graphs/PanAndZoomWrapper/state/types.ts
@@ -0,0 +1,177 @@
+import { ElkRoot, NodeData } from "reaflow";
+
+export type SizeProps = { width: number; height: number };
+export type PositionProps = { x: number; y: number };
+
+export interface PanAndZoomMachineContext {
+ zoom: number;
+ canvasSize: SizeProps;
+ viewportSize: SizeProps;
+ position: PositionProps;
+ layout?: ElkRoot;
+ selectedNode?: NodeData;
+ lastViewportOffsetWidth?: number;
+ lastViewportOffsetHeight?: number;
+ isFullScreen: boolean;
+ draggingUpdatedPosition: boolean;
+ notifiedEventType: string;
+}
+
+export enum PanAndZoomStates {
+ INIT = "init",
+ CHECK_IF_READY = "checkIfReady",
+ IDLE = "idle",
+ PAN_ENABLED = "panEnabled",
+ PAN_DISABLED = "panDisabled",
+ DRAGGING_TASK = "draggingTask",
+ NOT_DRAGGING_TASK = "notDraggingTask",
+ PAN = "pan",
+ SEARCH_FIELD = "searchField",
+ SEARCH_FIELD_VISIBLE = "searchFieldVisible",
+ SEARCH_FIELD_HIDDEN = "searchFieldHidden",
+}
+
+export enum PanAndZoomEventTypes {
+ RESET_ZOOM_POSITION_EVT = "RESET_ZOOM_POSITION",
+ SET_LAYOUT_EVT = "SET_LAYOUT",
+ SET_ZOOM_EVT = "SET_ZOOM",
+ SET_POSITION_EVT = "SET_POSITION",
+ CENTER_ON_SELECTED_TASK = "CENTER_ON_SELECTED_TASK",
+ SELECT_NODE_EVENT_EVT = "SELECT_NODE_EVT",
+ SET_READ_ONLY_EVT = "SET_READ_ONLY_EVT",
+ SET_INITIAL_VIEWPORT_OFFSET = "SET_INITIAL_VIEWPORT_OFFSET",
+ SET_FULL_SCREEN_EVT = "SET_FULL_SCREEN_EVT",
+ SET_FIT_SCREEN_EVT = "SET_FIT_SCREEN_EVT",
+ HANDLE_ZOOM_EVT = "HANDLE_ZOOM_EVT",
+ TOGGLE_PAN_EVT = "TOGGLE_PAN_EVT",
+ SET_ZOOM_TO_POSITION_EVT = "SET_ZOOM_TO_POSITION_EVT",
+ INCREMENT_POSITION_Y_EVT = "INCREMENT_POSITION_Y_EVT",
+ DECREMENT_POSITION_Y_EVT = "DECREMENT_POSITION_Y_EVT",
+ INCREMENT_POSITION_X_EVT = "INCREMENT_POSITION_X_EVT",
+ DECREMENT_POSITION_X_EVT = "DECREMENT_POSITION_X_EVT",
+ DRAG_EVENT_EVT = "DRAG_EVENT_EVT",
+
+ DRAG_TASK_BEGIN = "DRAG_TASK_BEGIN",
+ DRAG_TASK_END = "DRAG_TASK_END",
+ TOGGLE_SEARCH_EVT = "TOGGLE_SEARCH_EVT",
+ SELECT_SEARCH_RESULT = "SELECT_SEARCH_RESULT",
+ SET_NOTIFIED_EVENT_TYPE = "SET_NOTIFIED_EVENT_TYPE",
+ TOGGLE_SHOW_DESCRIPTION_EVT = "TOGGLE_SHOW_DESCRIPTION_EVT",
+}
+
+export type ResetZoomPositionEvent = {
+ type: PanAndZoomEventTypes.RESET_ZOOM_POSITION_EVT;
+ viewportOffsetWidth: number;
+ viewportOffsetHeight: number;
+};
+
+export type SetLayoutEvent = {
+ type: PanAndZoomEventTypes.SET_LAYOUT_EVT;
+ layout: ElkRoot;
+};
+
+export type SetZoomEvent = {
+ type: PanAndZoomEventTypes.SET_ZOOM_EVT;
+ zoom: number;
+};
+
+export type SetZoomToPositionEvent = {
+ type: PanAndZoomEventTypes.SET_ZOOM_TO_POSITION_EVT;
+ zoom: number;
+ position: PositionProps;
+};
+
+export type SetPositionEvent = {
+ type: PanAndZoomEventTypes.SET_POSITION_EVT;
+ position: PositionProps;
+};
+
+export type DragEvent = {
+ type: PanAndZoomEventTypes.DRAG_EVENT_EVT;
+ position: PositionProps;
+ clientMousePosition: PositionProps;
+};
+
+export type CenterOnSelectedTaskEvent = {
+ type: PanAndZoomEventTypes.CENTER_ON_SELECTED_TASK;
+ viewportOffsetWidth: number;
+ viewportOffsetHeight: number;
+};
+
+export type SelectNodeEvent = {
+ type: PanAndZoomEventTypes.SELECT_NODE_EVENT_EVT;
+ node: NodeData;
+};
+
+export type SetInitialViewportOffsetEvent = {
+ type: PanAndZoomEventTypes.SET_INITIAL_VIEWPORT_OFFSET;
+ viewportOffsetWidth: number;
+ viewportOffsetHeight: number;
+};
+
+export type SetFullScreenEvent = {
+ type: PanAndZoomEventTypes.SET_FULL_SCREEN_EVT;
+ fullScreen: boolean;
+ viewportOffsetWidth: number;
+};
+
+export type SetFitScreenEvent = {
+ type: PanAndZoomEventTypes.SET_FIT_SCREEN_EVT;
+ viewportOffsetWidth: number;
+ viewportOffsetHeight: number;
+};
+
+export type HandleZoomEvent = {
+ type: PanAndZoomEventTypes.HANDLE_ZOOM_EVT;
+ isZoomOut: boolean;
+};
+
+export type TogglePanEvent = {
+ type: PanAndZoomEventTypes.TOGGLE_PAN_EVT;
+};
+
+export type EnableTaskDraggingEvent = {
+ type: PanAndZoomEventTypes.DRAG_TASK_BEGIN;
+};
+
+export type DisableTaskDraggingEvent = {
+ type: PanAndZoomEventTypes.DRAG_TASK_END;
+};
+
+export type ToggleSearchEvent = {
+ type: PanAndZoomEventTypes.TOGGLE_SEARCH_EVT;
+};
+
+export type SelectSearchResultEvent = {
+ type: PanAndZoomEventTypes.SELECT_SEARCH_RESULT;
+ viewportOffsetWidth: number;
+ viewportOffsetHeight: number;
+};
+
+export type SetNotifiedEventTypeEvent = {
+ type: PanAndZoomEventTypes.SET_NOTIFIED_EVENT_TYPE;
+ eventType: string;
+};
+export type ToggleShowDescriptionEvent = {
+ type: PanAndZoomEventTypes.TOGGLE_SHOW_DESCRIPTION_EVT;
+};
+export type PanAndZoomEvents =
+ | ResetZoomPositionEvent
+ | SetLayoutEvent
+ | SetFullScreenEvent
+ | SetFitScreenEvent
+ | SelectNodeEvent
+ | SetInitialViewportOffsetEvent
+ | CenterOnSelectedTaskEvent
+ | HandleZoomEvent
+ | SetZoomEvent
+ | TogglePanEvent
+ | SetZoomToPositionEvent
+ | SetPositionEvent
+ | DragEvent
+ | EnableTaskDraggingEvent
+ | DisableTaskDraggingEvent
+ | ToggleSearchEvent
+ | SelectSearchResultEvent
+ | SetNotifiedEventTypeEvent
+ | ToggleShowDescriptionEvent;
diff --git a/ui-next/src/components/flow/components/graphs/index.ts b/ui-next/src/components/flow/components/graphs/index.ts
new file mode 100644
index 0000000000..0cae0f576b
--- /dev/null
+++ b/ui-next/src/components/flow/components/graphs/index.ts
@@ -0,0 +1,5 @@
+export * from "./CustomEdgeButton";
+export * from "./CustomLabel";
+export * from "./CustomNode";
+export * from "./CustomPort";
+export * from "./PanAndZoomWrapper/ZoomControls";
diff --git a/ui-next/src/components/flow/components/shapes/DecisionOperator.tsx b/ui-next/src/components/flow/components/shapes/DecisionOperator.tsx
new file mode 100644
index 0000000000..0b01c393eb
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/DecisionOperator.tsx
@@ -0,0 +1,101 @@
+import StarShape from "./StarShape";
+
+import { Diamond } from "@phosphor-icons/react";
+import { NodeTaskData } from "components/flow/nodes/mapper";
+import { SwitchTaskDef } from "types/TaskType";
+import { getCardVariant } from "./styles";
+import CardAttemptsBadge from "./TaskCard/CardAttemptsBadge";
+import DeleteButton from "./TaskCard/DeleteButton";
+import { showIterationChip } from "./TaskCard/helpers";
+import SwitchAdd from "./TaskCard/SwitchAdd";
+import { TaskDescription } from "./TaskDescription";
+interface DecisionOperatorProps {
+ nodeData: NodeTaskData;
+ nodeWidth: number;
+ portsVisible: boolean;
+ isInconsistent: boolean;
+ displayDescription?: boolean;
+}
+
+const DecisionOperator = ({
+ nodeData,
+ nodeWidth,
+ portsVisible,
+ isInconsistent,
+ displayDescription,
+}: DecisionOperatorProps) => {
+ const {
+ task: { name, taskReferenceName },
+ } = nodeData;
+ const showIterationsNumber = showIterationChip(nodeData);
+ return (
+
+
+
+ {/* Definition */}
+
+ {showIterationsNumber ? (
+
+ ) : null}
+
+
+
+
+
+
+
+
{name}
+
{taskReferenceName}
+
+
+
+ {displayDescription && nodeData.task.description != null && (
+
+ )}
+
+
+ );
+};
+
+export default DecisionOperator;
diff --git a/ui-next/src/components/flow/components/shapes/DoWhileTask.jsx b/ui-next/src/components/flow/components/shapes/DoWhileTask.jsx
new file mode 100644
index 0000000000..c20b57d1c0
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/DoWhileTask.jsx
@@ -0,0 +1,185 @@
+import { IconButton, keyframes, styled } from "@mui/material";
+import { Plus, Repeat } from "@phosphor-icons/react";
+import classnames from "classnames";
+import { useDroppableNode } from "components/flow/dragDrop/hooks";
+import _isEmpty from "lodash/isEmpty";
+import { ADD_TASK_IN_DO_WHILE } from "pages/definition/state/taskModifier/constants";
+import { useMemo } from "react";
+import CardAttemptsBadge from "./TaskCard/CardAttemptsBadge";
+import CardLabel from "./TaskCard/CardLabel";
+import CardStatusBadge from "./TaskCard/CardStatusBadge";
+import DeleteButton from "./TaskCard/DeleteButton";
+import { getCardVariant } from "./styles";
+
+const changeColor = keyframes`
+0% {
+ background-position: left top, right bottom, left bottom, right top;
+}
+100% {
+ background-color: rgba(159,220,170,0.5);
+ background-position: left 15px top, right 15px bottom , left bottom 15px , right top 15px;
+}
+`;
+
+const DroppablePlace = styled("div")`
+ &.over {
+ background-image:
+ linear-gradient(90deg, silver 50%, transparent 50%),
+ linear-gradient(90deg, silver 50%, transparent 50%),
+ linear-gradient(0deg, silver 50%, transparent 50%),
+ linear-gradient(0deg, silver 50%, transparent 50%);
+ background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
+ background-size:
+ 15px 2px,
+ 15px 2px,
+ 2px 15px,
+ 2px 15px;
+ background-position:
+ left top,
+ right bottom,
+ left bottom,
+ right top;
+ animation: ${changeColor} 1s infinite linear;
+ height: 340px;
+ }
+
+ &.dragging {
+ }
+ position: absolute;
+ top: 60px;
+ height: 340px;
+ width: ${(props) =>
+ props.dropIsDisabled || props.draggedNodeData == null ? 0 : "350"}px;
+`;
+
+const DoWhileTask = ({
+ nodeData,
+ onToggleTaskMenu,
+ isInconsistent,
+ nodeId = "",
+ displayDescription = false,
+}) => {
+ const { task } = nodeData;
+ const { type } = task;
+ const {
+ droppableResult: { isOver, setNodeRef },
+ draggedNodeData,
+ dropIsDisabled,
+ } = useDroppableNode({
+ nodeData: nodeData,
+ position: "ADD_TASK_IN_DO_WHILE",
+ nodeId: nodeId + "_drag_to_dowhile",
+ });
+
+ const maybeAddButton = useMemo(
+ () =>
+ task.executionData == null && _isEmpty(task.loopOver) ? (
+ <>
+
+ {
+ onToggleTaskMenu(event, {
+ id: `${task.taskReferenceName}_inner_do_while`,
+ port: undefined,
+ node: {
+ data: { ...nodeData, action: ADD_TASK_IN_DO_WHILE },
+ },
+ });
+ }}
+ style={{
+ backgroundColor: "#ffffff",
+ }}
+ >
+
+
+ >
+ ) : null,
+ [
+ task,
+ nodeData,
+ onToggleTaskMenu,
+ setNodeRef,
+ draggedNodeData,
+ dropIsDisabled,
+ isOver,
+ ],
+ );
+
+ return (
+
+ {/* Execution */}
+
+ {nodeData?.attempts > 1 ? (
+
+ ) : null}
+
+ {/* Definition */}
+
+
+
+
+
+
+
+ {displayDescription && nodeData.task.description != null
+ ? nodeData.task.description
+ : nodeData.task.name}
+
+
+
+
+
+ {maybeAddButton}
+
+ );
+};
+
+export default DoWhileTask;
diff --git a/ui-next/src/components/flow/components/shapes/DynamicTasksCards.jsx b/ui-next/src/components/flow/components/shapes/DynamicTasksCards.jsx
new file mode 100644
index 0000000000..0d7710c291
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/DynamicTasksCards.jsx
@@ -0,0 +1,188 @@
+import { useContext, useState } from "react";
+import CardLabel from "./TaskCard/CardLabel";
+import CardStatusBadge from "./TaskCard/CardStatusBadge";
+// import CardAttemptsBadge from "./TaskCard/CardAttemptsBadge";
+import Button from "components/MuiButton";
+import { FlowExecutionContext } from "pages/execution/state";
+import { TaskStatus } from "types/TaskStatus";
+import DeleteButton from "./TaskCard/DeleteButton";
+import { getCardVariant } from "./styles";
+
+const DynamicTaskChildPlaceholder = ({
+ type,
+ nodeData,
+ x,
+ y,
+ cardHeight,
+ ellipsis,
+}) => {
+ const placeholderStyles = {
+ cursor: "pointer",
+ display: "flex",
+ width: "100%",
+ padding: "20px",
+ borderRadius: "10px",
+ position: "absolute",
+ height: `${cardHeight}px`,
+ transform: `translateX(${x}px) translateY(${y}px)`,
+ transition: "transform 0.2s ease-in-out",
+ ...getCardVariant(type, nodeData.status, nodeData.selected),
+ outlineStyle: ellipsis ? "dashed" : "solid",
+ };
+
+ if (ellipsis) {
+ placeholderStyles.outlineColor = "#444444";
+ placeholderStyles.backgroundColor = "#FFEEAA";
+ }
+
+ if (nodeData.status === TaskStatus.PENDING) {
+ placeholderStyles.outlineColor = "none";
+ placeholderStyles.outlineStyle = "none";
+ }
+
+ return ;
+};
+
+const DynamicTasksCards = ({
+ nodeData,
+ isInconsistent,
+ displayDescription = false,
+}) => {
+ const [isHovering, setIsHovering] = useState(false);
+ const { onExpandDynamic } = useContext(FlowExecutionContext);
+ const { task } = nodeData;
+ const { type } = task;
+
+ const collapsedTasksCount = task.executionData.collapsedTasks.length;
+ const hoverMultiplier = 1.8;
+ const showEllipsisCard = collapsedTasksCount > 4;
+ const finalChildNumber = showEllipsisCard ? 4 : collapsedTasksCount;
+
+ const offsetDistance = 40 / finalChildNumber;
+ const cardHeight = 140 - (finalChildNumber - 1) * (40 / finalChildNumber);
+ const initialXOffset = -(((finalChildNumber - 1) * offsetDistance) / 2);
+
+ const completedTasks = nodeData?.collapsedTasksStatus
+ ? nodeData?.collapsedTasksStatus.filter((item) => item === "COMPLETED")
+ : [];
+ return (
+ setIsHovering(true)}
+ onMouseLeave={() => setIsHovering(false)}
+ >
+ {[...Array(finalChildNumber)].map((_, i) => {
+ let xTransform =
+ initialXOffset + (finalChildNumber - i - 1) * offsetDistance;
+ const yTransform = (finalChildNumber - i - 1) * offsetDistance;
+ if (isHovering) {
+ xTransform *= hoverMultiplier;
+ }
+
+ return (
+
+ );
+ })}
+
+ {/* Execution */}
+
+
+ {/* Definition */}
+
+
+
+
+ {displayDescription && nodeData.task.description != null ? (
+ <>{nodeData.task.description}>
+ ) : (
+ <>
+
+ {nodeData.task.name}
+
+
+ {nodeData.task.taskReferenceName}
+
+ >
+ )}
+
+
+
+
+ {completedTasks?.length} out of {collapsedTasksCount} task
+ {collapsedTasksCount > 1 ? "s" : ""} executed.
+
+
+
+
+
+ {/*
*/}
+
+
+ );
+};
+
+export default DynamicTasksCards;
diff --git a/ui-next/src/components/flow/components/shapes/StarShape.jsx b/ui-next/src/components/flow/components/shapes/StarShape.jsx
new file mode 100644
index 0000000000..b687c3f8cd
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/StarShape.jsx
@@ -0,0 +1,50 @@
+function StarShape() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default StarShape;
diff --git a/ui-next/src/components/flow/components/shapes/SubWorkflowTask.jsx b/ui-next/src/components/flow/components/shapes/SubWorkflowTask.jsx
new file mode 100644
index 0000000000..50ebbb8e82
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/SubWorkflowTask.jsx
@@ -0,0 +1,115 @@
+import { getCardVariant } from "./styles";
+import CardAttemptsBadge from "./TaskCard/CardAttemptsBadge";
+import CardIcon from "./TaskCard/CardIcon";
+import CardLabel from "./TaskCard/CardLabel";
+import CardStatusBadge from "./TaskCard/CardStatusBadge";
+import DeleteButton from "./TaskCard/DeleteButton";
+import { showIterationChip } from "./TaskCard/helpers";
+
+const SubWorkflowTask = ({
+ nodeData,
+ isInconsistent,
+ displayDescription = false,
+}) => {
+ const { task } = nodeData;
+ const { type } = task;
+
+ const subWorkflowName = task.name ? task.name : task.subWorkflowParam?.name;
+ const showIterationsNumber = showIterationChip(nodeData);
+
+ return (
+
+ {/* Execution */}
+
+ {showIterationsNumber ? (
+
+ ) : null}
+
+ {/* Definition */}
+
+
+ {displayDescription && nodeData.task.description != null ? (
+ <>{nodeData.task.description}>
+ ) : (
+
+
+
+
+ {subWorkflowName}
+
+
+
+
+ {task.taskReferenceName}
+
+
+
+ )}
+
+
+
+
+ );
+};
+
+export default SubWorkflowTask;
diff --git a/ui-next/src/components/flow/components/shapes/SwitchJoinPseudoTask.jsx b/ui-next/src/components/flow/components/shapes/SwitchJoinPseudoTask.jsx
new file mode 100644
index 0000000000..1f8cb7baf2
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/SwitchJoinPseudoTask.jsx
@@ -0,0 +1,50 @@
+import { taskToSize } from "components/flow/nodes/mapper/layout";
+import { gray13, lightShadesGray } from "theme/tokens/colors";
+
+const SwitchJoin = ({ nodeData }) => {
+ const { task } = nodeData;
+ const terminalClick = (event) => {
+ event.stopPropagation();
+ };
+
+ const { width, height } = taskToSize(task);
+ return (
+
+ {`// Marks end of switch`}
+
+ {task?.taskReferenceName}
+
+
+ );
+};
+
+export default SwitchJoin;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/AddPathButton.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/AddPathButton.tsx
new file mode 100644
index 0000000000..7512b350cc
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/AddPathButton.tsx
@@ -0,0 +1,38 @@
+import Button from "components/MuiButton";
+import { WorkflowEditContext } from "pages/definition/state";
+import {
+ TaskAndCrumbs,
+ usePerformOperationOnDefinition,
+} from "pages/definition/state/usePerformOperationOnDefintion";
+import { MouseEvent, ReactNode, useContext } from "react";
+import ForkIcon from "./icons/ForkIcon";
+
+interface AddPathButtonProps {
+ children: ReactNode;
+ nodeData: TaskAndCrumbs;
+}
+
+const AddPathButton = ({ children, nodeData }: AddPathButtonProps) => {
+ const { workflowDefinitionActor } = useContext(WorkflowEditContext);
+ const { handleAddSwitchPath: onAddSwitchPath } =
+ usePerformOperationOnDefinition(workflowDefinitionActor!);
+
+ const handleAddEdge = (e: MouseEvent) => {
+ e.stopPropagation();
+ onAddSwitchPath(nodeData);
+ };
+
+ return (
+ }
+ className="AddEdgeButton"
+ color="tertiary"
+ onClick={handleAddEdge}
+ >
+ {children}
+
+ );
+};
+
+export default AddPathButton;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/CardAttemptsBadge.jsx b/ui-next/src/components/flow/components/shapes/TaskCard/CardAttemptsBadge.jsx
new file mode 100644
index 0000000000..a2825efa0e
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/CardAttemptsBadge.jsx
@@ -0,0 +1,25 @@
+const CardAttemptsBadge = ({ attempts }) => {
+ return (
+
+ {attempts}
+
+ );
+};
+
+export default CardAttemptsBadge;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/CardIcon.jsx b/ui-next/src/components/flow/components/shapes/TaskCard/CardIcon.jsx
new file mode 100644
index 0000000000..dec009a049
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/CardIcon.jsx
@@ -0,0 +1,125 @@
+import {
+ Cards,
+ CloudArrowDown,
+ Function,
+ Hourglass,
+ Person as HumanTaskIcon,
+ Pause,
+ Repeat,
+ RocketLaunch,
+ X,
+ Diamond,
+ GitFork,
+ ShieldCheck,
+ Globe,
+ FileJsIcon,
+ HandshakeIcon,
+ ClockClockwiseIcon,
+ PersonSimpleRunIcon,
+ BroadcastIcon,
+ RowsIcon,
+ FilesIcon,
+ FileMagnifyingGlass,
+} from "@phosphor-icons/react";
+
+import { TaskType } from "types";
+import { ForkJoinIcon } from "./icons/ForkJoinIcon";
+import SendgridIcon from "./icons/Sendgrid";
+import HttpPollIcon from "./icons/HttpPoll";
+import JsonIcon from "./icons/Json";
+import WorkerSimpleIcon from "./icons/Worker";
+import SimpleWorkerIcon from "./icons/Simple";
+import LlmTextComplete from "./icons/LlmTextComplete";
+import LlmGenerateEmbeddings from "./icons/LlmGenerateEmbeddings";
+import LlmGetEmbeddings from "./icons/LlmGetEmbeddings";
+import LlmStoreEmbeddings from "./icons/LlmStoreEmbeddings";
+import LlmSearchIndex from "./icons/LlmSearchIndex";
+import LlmIndexDocument from "./icons/LlmIndexDocument";
+import GetDocument from "./icons/GetDocument";
+import LlmIndexText from "./icons/LlmIndexText";
+import QueryProcessor from "./icons/QueryProcessor";
+import OpsGenie from "./icons/OpsGenie";
+import UpdateTaskIcon from "./icons/UpdateTaskIcon";
+import UpdateSecretIcon from "./icons/UpdateSecret";
+import LlmChatComplete from "./icons/LlmChatComplete";
+import { IntegrationIcon } from "components/IntegrationIcon";
+import { useMemo } from "react";
+
+const CardIcon = ({ type, integrationType }) => {
+ const MCPIntegrationIcon = useMemo(() => {
+ return (
+
+
+
+ );
+ }, [integrationType]);
+ const iconMap = {
+ [TaskType.WAIT]: Hourglass,
+ [TaskType.HTTP]: Globe,
+ [TaskType.KAFKA_PUBLISH]: WorkerSimpleIcon,
+ [TaskType.HUMAN]: HumanTaskIcon,
+ [TaskType.BUSINESS_RULE]: HandshakeIcon,
+ [TaskType.SENDGRID]: SendgridIcon,
+ [TaskType.WAIT_FOR_WEBHOOK]: ClockClockwiseIcon,
+ [TaskType.HTTP_POLL]: HttpPollIcon,
+ [TaskType.DO_WHILE]: Repeat,
+ [TaskType.SIMPLE]: SimpleWorkerIcon,
+ [TaskType.YIELD]: Pause,
+ [TaskType.JDBC]: PersonSimpleRunIcon,
+ [TaskType.EVENT]: BroadcastIcon,
+ [TaskType.JOIN]: GitFork,
+ [TaskType.FORK_JOIN]: ForkJoinIcon,
+ [TaskType.FORK_JOIN_DYNAMIC]: ForkJoinIcon,
+ [TaskType.DYNAMIC]: Cards,
+ [TaskType.INLINE]: FileJsIcon,
+ [TaskType.SWITCH]: Diamond,
+ [TaskType.JSON_JQ_TRANSFORM]: JsonIcon,
+ [TaskType.TERMINATE]: X,
+ [TaskType.SET_VARIABLE]: Function,
+ [TaskType.TERMINATE_WORKFLOW]: X,
+ [TaskType.SUB_WORKFLOW]: ForkJoinIcon,
+ [TaskType.START_WORKFLOW]: RocketLaunch,
+ [TaskType.LLM_TEXT_COMPLETE]: LlmTextComplete,
+ [TaskType.LLM_GENERATE_EMBEDDINGS]: LlmGenerateEmbeddings,
+ [TaskType.LLM_GET_EMBEDDINGS]: LlmGetEmbeddings,
+ [TaskType.LLM_STORE_EMBEDDINGS]: LlmStoreEmbeddings,
+ [TaskType.LLM_INDEX_DOCUMENT]: LlmIndexDocument,
+ [TaskType.LLM_SEARCH_INDEX]: LlmSearchIndex,
+ [TaskType.LLM_INDEX_TEXT]: LlmIndexText,
+ [TaskType.UPDATE_SECRET]: UpdateSecretIcon,
+ [TaskType.GET_DOCUMENT]: GetDocument,
+ [TaskType.QUERY_PROCESSOR]: QueryProcessor,
+ [TaskType.OPS_GENIE]: OpsGenie,
+ [TaskType.GET_SIGNED_JWT]: ShieldCheck,
+ [TaskType.UPDATE_TASK]: UpdateTaskIcon,
+ [TaskType.GET_WORKFLOW]: CloudArrowDown,
+ [TaskType.LLM_CHAT_COMPLETE]: LlmChatComplete,
+ [TaskType.GRPC]: Globe,
+ [TaskType.CHUNK_TEXT]: RowsIcon,
+ [TaskType.LIST_FILES]: FilesIcon,
+ [TaskType.PARSE_DOCUMENT]: FileMagnifyingGlass,
+ };
+
+ const IconComponent = iconMap[type];
+ if (type === TaskType.MCP) {
+ return MCPIntegrationIcon;
+ }
+
+ return IconComponent ? (
+
+
+
+ ) : null;
+};
+
+export default CardIcon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/CardLabel.jsx b/ui-next/src/components/flow/components/shapes/TaskCard/CardLabel.jsx
new file mode 100644
index 0000000000..383ce3294b
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/CardLabel.jsx
@@ -0,0 +1,46 @@
+import { TaskType } from "types";
+import theme from "../../../theme";
+
+const shortenedTypeTag = {
+ FORK_JOIN_COLLAPSED: "DYN. CHILDREN",
+ [TaskType.JSON_JQ_TRANSFORM]: "JSON JQ",
+ [TaskType.EXCLUSIVE_JOIN]: "EX. JOIN",
+ [TaskType.FORK_JOIN]: "FORK JOIN",
+ [TaskType.FORK_JOIN_DYNAMIC]: "DYN. FORK",
+ [TaskType.INLINE]: "INLINE",
+ [TaskType.KAFKA_PUBLISH]: "KAFKA",
+ [TaskType.SIMPLE]: "SIMPLE",
+};
+
+const CardLabel = ({
+ type,
+ displayDescription = false,
+ integrationIconName,
+}) => (
+
+
+ {type !== TaskType.MCP
+ ? shortenedTypeTag[type] || type
+ : integrationIconName?.toUpperCase() || "MCP"}
+
+
+);
+export default CardLabel;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/CardStatusBadge.jsx b/ui-next/src/components/flow/components/shapes/TaskCard/CardStatusBadge.jsx
new file mode 100644
index 0000000000..756d508a8b
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/CardStatusBadge.jsx
@@ -0,0 +1,90 @@
+import { CircularProgress } from "@mui/material";
+import {
+ Check as CompletedIcon,
+ Prohibit as FailedIcon,
+ ArrowArcRight as SkippedTaskIcon,
+} from "@phosphor-icons/react";
+import { colors } from "theme/tokens/variables";
+
+import { TaskStatus } from "types/TaskStatus";
+
+const getBackgroundByStatus = (status) => {
+ switch (status) {
+ case TaskStatus.COMPLETED:
+ return colors.primaryGreen;
+ case TaskStatus.COMPLETED_WITH_ERRORS:
+ return "#EEAA00";
+ case TaskStatus.CANCELED:
+ return "#fba404";
+ case TaskStatus.FAILED:
+ case TaskStatus.FAILED_WITH_TERMINAL_ERROR:
+ case TaskStatus.TIMED_OUT:
+ return "#DD2222";
+ case TaskStatus.IN_PROGRESS:
+ case TaskStatus.SCHEDULED:
+ return "white";
+ case TaskStatus.SKIPPED:
+ return "#F5BF42";
+ default:
+ return null;
+ }
+};
+
+const CardStatusBadge = ({ status }) => {
+ return [
+ TaskStatus.IN_PROGRESS,
+ TaskStatus.SCHEDULED,
+ TaskStatus.COMPLETED,
+ TaskStatus.COMPLETED_WITH_ERRORS,
+ TaskStatus.FAILED,
+ TaskStatus.FAILED_WITH_TERMINAL_ERROR,
+ TaskStatus.CANCELED,
+ TaskStatus.SKIPPED,
+ TaskStatus.TIMED_OUT,
+ ].includes(status) ? (
+
+ {[TaskStatus.IN_PROGRESS, TaskStatus.SCHEDULED].includes(status) ? (
+ // disableShrink for lower CPU load
+ // see: https://mui.com/components/progress/
+
+ ) : null}
+ {status === TaskStatus.COMPLETED ? (
+
+ ) : null}
+ {status === TaskStatus.COMPLETED_WITH_ERRORS ||
+ status === TaskStatus.SKIPPED ? (
+
+ ) : null}
+ {[
+ TaskStatus.CANCELED,
+ TaskStatus.FAILED,
+ TaskStatus.FAILED_WITH_TERMINAL_ERROR,
+ TaskStatus.TIMED_OUT,
+ ].includes(status) ? (
+
+ ) : null}
+
+ ) : null;
+};
+
+export default CardStatusBadge;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/DeleteButton.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/DeleteButton.tsx
new file mode 100644
index 0000000000..7464baccaa
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/DeleteButton.tsx
@@ -0,0 +1,48 @@
+import { NodeTaskData } from "components/flow/nodes/mapper";
+import { getFlowTheme } from "components/flow/theme";
+import { useContext } from "react";
+import { ColorModeContext } from "theme/material/ColorModeContext";
+import { shouldHide } from "./helpers";
+import DeleteIcon from "./icons/DeleteIcon";
+
+const DeleteButton = (
+ { maybeHideData }: { maybeHideData: Partial } = {
+ maybeHideData: { status: undefined, withinExpandedSubWorkflow: false },
+ },
+) => {
+ const { mode } = useContext(ColorModeContext);
+ const theme = getFlowTheme(mode);
+
+ return shouldHide(maybeHideData) ? (
+
+ ) : null;
+};
+
+export default DeleteButton;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/DynamicTask.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/DynamicTask.tsx
new file mode 100644
index 0000000000..8d37c6bcbc
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/DynamicTask.tsx
@@ -0,0 +1,36 @@
+import { NodeTaskData } from "components/flow/nodes/mapper";
+import { Link as LinkIcon } from "@phosphor-icons/react";
+import { Box, Link } from "@mui/material";
+import { cyan } from "theme/tokens/colors";
+import { DynamicTaskDef } from "types/TaskType";
+
+export const DynamicTask = ({
+ nodeData,
+}: {
+ nodeData: NodeTaskData;
+}) => {
+ const isDynamicSubWorkflow =
+ nodeData.task.inputParameters.taskToExecute === "SUB_WORKFLOW";
+ const subWorkflowId = nodeData.outputData?.subWorkflowId as string;
+
+ return isDynamicSubWorkflow && subWorkflowId ? (
+
+
+
+ {subWorkflowId}
+
+
+ ) : null;
+};
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/EventTask.jsx b/ui-next/src/components/flow/components/shapes/TaskCard/EventTask.jsx
new file mode 100644
index 0000000000..9d95234dbe
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/EventTask.jsx
@@ -0,0 +1,49 @@
+import { useContext } from "react";
+import { ColorModeContext } from "theme/material/ColorModeContext";
+import { colors } from "theme/tokens/variables";
+
+const EventTask = ({ nodeData }) => {
+ const { mode } = useContext(ColorModeContext);
+ const darkMode = mode === "dark";
+
+ const { task } = nodeData;
+ const { sink } = task;
+
+ const prefix = sink?.split(":")[0];
+ const value = sink?.split(":")[1];
+
+ return (
+
+
+ {prefix ? (
+
+ {prefix}
+
+ ) : null}
+
+ {value ? value : "No Value"}
+
+
+
+ );
+};
+
+export default EventTask;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/ForkJoinDynamicTask.jsx b/ui-next/src/components/flow/components/shapes/TaskCard/ForkJoinDynamicTask.jsx
new file mode 100644
index 0000000000..5b222888d6
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/ForkJoinDynamicTask.jsx
@@ -0,0 +1,61 @@
+import { useSelector } from "@xstate/react";
+import { usePanAndZoomActor } from "components/flow/components/graphs/PanAndZoomWrapper";
+import { FlowActorContext } from "components/flow/state/FlowActorContext";
+import Button from "components/MuiButton";
+import {
+ ExecutionActionTypes,
+ FlowExecutionContext,
+} from "pages/execution/state";
+import { useContext } from "react";
+
+const ForkJoinDynamicTask = ({ nodeData }) => {
+ const { onCollapseDynamic } = useContext(FlowExecutionContext);
+ const { flowActor } = useContext(FlowActorContext);
+ const panAndZoomActor = useSelector(
+ flowActor,
+ (state) => state.children?.panAndZoomMachine,
+ );
+ const [, { handleSetEventType }] = usePanAndZoomActor(panAndZoomActor);
+ const { collapsed, task } = nodeData;
+
+ return (
+
+
+
+ {collapsed === false && task.executionData?.executed ? (
+
+ ) : null}
+
+
+
+ );
+};
+
+export default ForkJoinDynamicTask;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/HTTPPollTask.jsx b/ui-next/src/components/flow/components/shapes/TaskCard/HTTPPollTask.jsx
new file mode 100644
index 0000000000..3f6ad95093
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/HTTPPollTask.jsx
@@ -0,0 +1,57 @@
+import { Link } from "@mui/material";
+import { Link as LinkIcon } from "@phosphor-icons/react";
+import { useContext } from "react";
+import { ColorModeContext } from "theme/material/ColorModeContext";
+import { colors } from "theme/tokens/variables";
+import { isValidUri } from "./helpers";
+
+const HTTPPollTask = ({ nodeData }) => {
+ const { mode } = useContext(ColorModeContext);
+ const darkMode = mode === "dark";
+
+ const { task } = nodeData;
+ const {
+ inputParameters: { http_request: request },
+ } = task;
+ const isClickableUri = request?.method === "GET" && isValidUri(request?.uri);
+
+ return (
+
+
+
+
+ {request?.method}
+
+
+ {isClickableUri ? (
+
+ {request?.uri}
+
+ ) : (
+ request?.uri
+ )}
+
+
+
+ );
+};
+
+export default HTTPPollTask;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/HTTPTask.jsx b/ui-next/src/components/flow/components/shapes/TaskCard/HTTPTask.jsx
new file mode 100644
index 0000000000..d2079ea1b3
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/HTTPTask.jsx
@@ -0,0 +1,64 @@
+import { Link } from "@mui/material";
+import { Link as LinkIcon } from "@phosphor-icons/react";
+import { useContext } from "react";
+import { ColorModeContext } from "theme/material/ColorModeContext";
+import { colors } from "theme/tokens/variables";
+import { isValidUri } from "./helpers";
+
+const HTTPTask = ({ nodeData }) => {
+ const { mode } = useContext(ColorModeContext);
+ const darkMode = mode === "dark";
+
+ const { task } = nodeData;
+ const {
+ inputParameters: { http_request: request },
+ } = task;
+
+ const method = request?.method
+ ? request?.method
+ : task?.inputParameters?.method;
+
+ const uri = request?.uri ? request?.uri : task?.inputParameters?.uri;
+
+ const isClickableUri = method === "GET" && isValidUri(uri);
+
+ return (
+
+
+
+
+ {method}
+
+
+ {isClickableUri ? (
+
+ {uri}
+
+ ) : (
+ uri
+ )}
+
+
+
+ );
+};
+
+export default HTTPTask;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/INLINETask.jsx b/ui-next/src/components/flow/components/shapes/TaskCard/INLINETask.jsx
new file mode 100644
index 0000000000..c1cc8bd3e6
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/INLINETask.jsx
@@ -0,0 +1,42 @@
+import { useEffect } from "react";
+import Prism from "prismjs";
+import "prismjs/themes/prism-coy.css";
+
+const INLINETask = ({ nodeData }) => {
+ const { task } = nodeData;
+
+ useEffect(() => {
+ Prism.highlightAll();
+ }, []);
+
+ const {
+ inputParameters: { expression },
+ } = task;
+
+ return (
+ code[class*="language-"]` (!)
+ display: "block",
+ margin: "10px 0 0 0",
+ }}
+ // language-js makes JQ look pretty good!
+ className="language-js"
+ >
+ {expression}
+
+ );
+};
+
+export default INLINETask;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/JDBCTask.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/JDBCTask.tsx
new file mode 100644
index 0000000000..c2af2dbf27
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/JDBCTask.tsx
@@ -0,0 +1,29 @@
+import { Chip, Box } from "@mui/material";
+import DomainIcon from "./icons/Buildings";
+import _isNil from "lodash/isNil";
+
+const statusToColor = (status?: string) => {
+ switch (status) {
+ case "COMPLETED":
+ return "secondary";
+ case "FAILED":
+ return "error";
+ default:
+ return undefined;
+ }
+};
+
+export const JDBCTask = ({ nodeData }: { nodeData: Element | any }) => {
+ const { task } = nodeData;
+
+ return _isNil(task?.executionData?.domain) ? null : (
+
+ }
+ />
+
+ );
+};
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/JSONJQTransformTask.jsx b/ui-next/src/components/flow/components/shapes/TaskCard/JSONJQTransformTask.jsx
new file mode 100644
index 0000000000..0b05fd30b6
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/JSONJQTransformTask.jsx
@@ -0,0 +1,43 @@
+import { useEffect } from "react";
+import Prism from "prismjs";
+import "prismjs/themes/prism-coy.css";
+
+const JSONJQTransformTask = ({ nodeData }) => {
+ const { task } = nodeData;
+
+ useEffect(() => {
+ Prism.highlightAll();
+ }, []);
+
+ const {
+ inputParameters: { queryExpression },
+ } = task;
+
+ return (
+ code[class*="language-"]` (!)
+ display: "block",
+ margin: "10px 0 0 0",
+ }}
+ // TODO: Support other languages according to Evaluator type.
+ className="language-js"
+ >
+ {typeof queryExpression === "string" ? queryExpression : ""}
+
+ );
+};
+
+export default JSONJQTransformTask;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/KAFKATask.jsx b/ui-next/src/components/flow/components/shapes/TaskCard/KAFKATask.jsx
new file mode 100644
index 0000000000..a23c3cb011
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/KAFKATask.jsx
@@ -0,0 +1,69 @@
+import { Link as LinkIcon, Key as KeyIcon } from "@phosphor-icons/react";
+
+const KAFKATask = ({ nodeData }) => {
+ const { task } = nodeData;
+ const request = task.inputParameters?.kafka_request;
+ const requestKey = request?.key || {};
+
+ return (
+
+
+
+
+
+ {request?.bootStrapServers}
+
+
+ {Object.entries(requestKey)?.map(([key, value], index) =>
+ index === 0 ? (
+
+
+
+ {`${key}: ${value}`}
+
+
+ ) : null,
+ )}
+
+
+ );
+};
+
+export default KAFKATask;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/SimpleTask.jsx b/ui-next/src/components/flow/components/shapes/TaskCard/SimpleTask.jsx
new file mode 100644
index 0000000000..345e1078b0
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/SimpleTask.jsx
@@ -0,0 +1,29 @@
+import { Chip, Box } from "@mui/material";
+import DomainIcon from "./icons/Buildings";
+import _isNil from "lodash/isNil";
+
+const statusToColor = (status) => {
+ switch (status) {
+ case "COMPLETED":
+ return "secondary";
+ case "FAILED":
+ return "error";
+ default:
+ return undefined;
+ }
+};
+
+export const SimpleTask = ({ nodeData }) => {
+ const { task } = nodeData;
+
+ return _isNil(task?.executionData?.domain) ? null : (
+
+ }
+ />
+
+ );
+};
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/StartWorkflowTask.jsx b/ui-next/src/components/flow/components/shapes/TaskCard/StartWorkflowTask.jsx
new file mode 100644
index 0000000000..bb65e0afb0
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/StartWorkflowTask.jsx
@@ -0,0 +1,56 @@
+import { Link } from "@mui/material";
+import { TreeStructure as WorkflowIcon } from "@phosphor-icons/react";
+import { useContext } from "react";
+import { ColorModeContext } from "theme/material/ColorModeContext";
+import { colors } from "theme/tokens/variables";
+
+const StartWorkflowTask = ({ nodeData }) => {
+ const { mode } = useContext(ColorModeContext);
+ const darkMode = mode === "dark";
+
+ const { task } = nodeData;
+ const {
+ inputParameters: { startWorkflow },
+ } = task;
+
+ return (
+
+
+
+
+ Workflow
+
+
+
+ {startWorkflow?.name}
+
+
+
+
+ );
+};
+
+export default StartWorkflowTask;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/SwitchAdd.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/SwitchAdd.tsx
new file mode 100644
index 0000000000..9497505002
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/SwitchAdd.tsx
@@ -0,0 +1,92 @@
+import { NodeTaskData } from "components/flow/nodes/mapper";
+import { getFlowTheme } from "components/flow/theme";
+import { WorkflowEditContext } from "pages/definition/state";
+import {
+ TaskAndCrumbs,
+ usePerformOperationOnDefinition,
+} from "pages/definition/state/usePerformOperationOnDefintion";
+import { MouseEvent, useContext } from "react";
+import { ColorModeContext } from "theme/material/ColorModeContext";
+import { SwitchTaskDef } from "types/TaskType";
+import { shouldHide } from "./helpers";
+import PlusIcon from "./icons/PlusIcon";
+
+const getPosition = (taskcount: number) => {
+ switch (taskcount) {
+ case 1:
+ return {
+ bottom: "-12px",
+ right: "110px",
+ };
+ case 2:
+ return {
+ bottom: "-12px",
+ right: "7px",
+ };
+ case 3:
+ return {
+ bottom: "-12px",
+ right: "7px",
+ };
+ default:
+ return {
+ bottom: "15px",
+ right: "-10px",
+ };
+ }
+};
+
+const SwitchAdd = (
+ { nodeData }: { nodeData: Partial> } = {
+ nodeData: { status: undefined, withinExpandedSubWorkflow: false },
+ },
+) => {
+ const { workflowDefinitionActor } = useContext(WorkflowEditContext);
+ const { handleAddSwitchPath: onAddSwitchPath } =
+ usePerformOperationOnDefinition(workflowDefinitionActor!);
+
+ const handleAddEdge = (e: MouseEvent) => {
+ e.stopPropagation();
+ onAddSwitchPath(nodeData as TaskAndCrumbs);
+ };
+ const { mode } = useContext(ColorModeContext);
+ const theme = getFlowTheme(mode);
+
+ return shouldHide(nodeData) ? (
+
+ ) : null;
+};
+
+export default SwitchAdd;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/TaskCard.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/TaskCard.tsx
new file mode 100644
index 0000000000..ae8c975faa
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/TaskCard.tsx
@@ -0,0 +1,198 @@
+import HTTPPollTask from "components/flow/components/shapes/TaskCard/HTTPPollTask";
+import { JDBCTask } from "components/flow/components/shapes/TaskCard/JDBCTask";
+import StartWorkflowTask from "components/flow/components/shapes/TaskCard/StartWorkflowTask";
+import { NodeTaskData } from "components/flow/nodes/mapper";
+import { TaskAndCrumbs } from "pages/definition/state/usePerformOperationOnDefintion";
+import { useContext } from "react";
+import { ColorModeContext } from "theme/material/ColorModeContext";
+import { colors } from "theme/tokens/variables";
+import { DynamicTaskDef, TaskStatus, TaskType, WaitTaskDef } from "types";
+import { MCPTaskDef } from "types/TaskType";
+import { getCardVariant } from "../styles";
+import AddPathButton from "./AddPathButton";
+import CardAttemptsBadge from "./CardAttemptsBadge";
+import CardIcon from "./CardIcon";
+import CardLabel from "./CardLabel";
+import CardStatusBadge from "./CardStatusBadge";
+import DeleteButton from "./DeleteButton";
+import { DynamicTask } from "./DynamicTask";
+import EventTask from "./EventTask";
+import ForkJoinDynamicTask from "./ForkJoinDynamicTask";
+import { showIterationChip } from "./helpers";
+import HTTPTask from "./HTTPTask";
+import INLINETask from "./INLINETask";
+import JSONJQTransformTask from "./JSONJQTransformTask";
+import KAFKATask from "./KAFKATask";
+import { SimpleTask } from "./SimpleTask";
+import { WaitTaskInfo } from "./WaitTaskInfo";
+import { TaskDescription } from "../TaskDescription";
+
+const getTaskCardContent = (type: TaskType, nodeData: NodeTaskData) => {
+ switch (type) {
+ case TaskType.HTTP:
+ return ;
+ case TaskType.HTTP_POLL:
+ return ;
+ case TaskType.JSON_JQ_TRANSFORM:
+ return ;
+ case TaskType.INLINE:
+ return ;
+ case TaskType.KAFKA_PUBLISH:
+ return ;
+ case TaskType.FORK_JOIN_DYNAMIC:
+ return ;
+ case TaskType.EVENT:
+ return ;
+ case TaskType.SIMPLE:
+ return ;
+ case TaskType.JDBC:
+ return ;
+ case TaskType.START_WORKFLOW:
+ return ;
+ case TaskType.DYNAMIC:
+ return (
+ } />
+ );
+ default:
+ return null;
+ }
+};
+
+const TaskCard = ({
+ nodeData,
+ onClick = () => null,
+ isInconsistent,
+ displayDescription,
+}: {
+ nodeData: NodeTaskData;
+ onClick: () => void;
+ isInconsistent: boolean;
+ displayDescription?: boolean;
+}) => {
+ const { mode } = useContext(ColorModeContext);
+ const darkMode = mode === "dark";
+
+ const { task, status } = nodeData;
+ const { name, type, taskReferenceName } = task;
+
+ const showIterationsNumber = showIterationChip(nodeData);
+ return (
+
+
+ {/* Execution */}
+
+ {showIterationsNumber ? (
+
+ ) : null}
+
+ {/* Definition */}
+
+
+
+
+
+
+
+ {name}
+
+
+ {taskReferenceName}
+
+
+ {!status && type === TaskType.FORK_JOIN ? (
+
+ Add fork
+
+ ) : null}
+ {type === TaskType.WAIT &&
+ ((task as WaitTaskDef)?.inputParameters?.duration ||
+ (task as WaitTaskDef)?.inputParameters?.until) ? (
+
+ ) : null}
+
+
+
+
+
+
{getTaskCardContent(type, nodeData)}
+
+ {displayDescription && task.description != null && (
+
+ )}
+
+
+ );
+};
+
+export default TaskCard;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/WaitTaskInfo.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/WaitTaskInfo.tsx
new file mode 100644
index 0000000000..d9035d732e
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/WaitTaskInfo.tsx
@@ -0,0 +1,66 @@
+import { Typography } from "@mui/material";
+import { Box } from "@mui/system";
+import { ClockIcon } from "@phosphor-icons/react";
+import { WaitTaskDef } from "types";
+
+interface WaitTaskInfoProps {
+ task: WaitTaskDef;
+}
+
+export const WaitTaskInfo = ({ task }: WaitTaskInfoProps) => {
+ const duration = task?.inputParameters?.duration;
+ const until = task?.inputParameters?.until;
+
+ if (!duration && !until) {
+ return null;
+ }
+
+ // Determine label and display value
+ const isUntil = !!until;
+ const label = isUntil ? "Until" : "Duration";
+
+ const durationDisplay = duration ? `${duration}` : until ? `${until}` : "";
+ const durationDisplayLineHeight =
+ durationDisplay.length > 30 ? "14px" : "auto";
+
+ return (
+
+ {/* Duration/Until Section */}
+
+
+
+
+
+ {`${label}: ${durationDisplay}`}
+
+
+
+ );
+};
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/helpers.test.ts b/ui-next/src/components/flow/components/shapes/TaskCard/helpers.test.ts
new file mode 100644
index 0000000000..789675decc
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/helpers.test.ts
@@ -0,0 +1,168 @@
+import { dowhileHasAllIterationsInOutput, showIterationChip } from "./helpers";
+
+// this test is meant to check if the outputData of dowhile is not summarized.(no data loss)
+describe("dowhileHasAllIterationsInOutput", () => {
+ const outputData = {
+ "1": {},
+ "2": {},
+ iteration: 2,
+ };
+ const outputDataWhileWorkflowInProgress = {
+ "1": {},
+ "2": {},
+ iteration: 3,
+ };
+ const summarizedOutputData = {
+ "119": {},
+ "120": {},
+ "121": {},
+ iteration: 121,
+ };
+
+ it("Should return true, as the output data is not summarized as it has all the output from 1 to iteration number", () => {
+ const result = dowhileHasAllIterationsInOutput(outputData);
+ expect(result).toBe(true);
+ });
+ it("Should return false, as the output data is summarized as it doesn't have all the output from 1 to iteration number", () => {
+ const result = dowhileHasAllIterationsInOutput(summarizedOutputData);
+ expect(result).toBe(false);
+ });
+ // since the backend sends n-1 iterations in outputData while the workflow is running, we are doing the below test.
+ it("Should return true, as the output data is not summarized as it doesn't have all the output from 1 to (iteration number - 1) when Workflow in progress", () => {
+ const result = dowhileHasAllIterationsInOutput(
+ outputDataWhileWorkflowInProgress,
+ );
+ expect(result).toBe(true);
+ });
+});
+
+describe("showIterationChip", () => {
+ const nodeDataWithKeepLastN = {
+ attempts: 20,
+ parentLoop: {
+ inputData: {
+ keepLastN: 10,
+ },
+ outputData: {
+ "11": {},
+ "12": {},
+ "13": {},
+ "14": {},
+ "15": {},
+ "16": {},
+ "17": {},
+ "18": {},
+ "19": {},
+ "20": {},
+ iteration: 20,
+ },
+ },
+ };
+ const nodeDataWithoutKeepLastNAndSummarized = {
+ attempts: 20,
+ parentLoop: {
+ inputData: {},
+ outputData: {
+ "11": {},
+ "12": {},
+ "13": {},
+ "14": {},
+ "15": {},
+ "16": {},
+ "17": {},
+ "18": {},
+ "19": {},
+ "20": {},
+ iteration: 20,
+ },
+ },
+ };
+
+ const nodeDataWithoutKeepLastNAndNotSummarized = {
+ attempts: 10,
+ parentLoop: {
+ inputData: {},
+ outputData: {
+ "1": {},
+ "2": {},
+ "3": {},
+ "4": {},
+ "5": {},
+ "6": {},
+ "7": {},
+ "8": {},
+ "9": {},
+ "10": {},
+ iteration: 10,
+ },
+ },
+ };
+ const nodeDataWithoutKeepLastNAndNotSummarized2 = {
+ attempts: 10,
+ parentLoop: {
+ inputData: {},
+ outputData: {
+ "1": {},
+ "2": {},
+ "3": {},
+ "4": {},
+ "5": {},
+ "6": {},
+ "7": {},
+ "8": {},
+ "9": {},
+ iteration: 10,
+ },
+ },
+ };
+ const nodeDataWithKeepLastNAndNotSummarized = {
+ attempts: 10,
+ parentLoop: {
+ inputData: {
+ keepLastN: 10,
+ },
+ outputData: {
+ "1": {},
+ "2": {},
+ "3": {},
+ "4": {},
+ "5": {},
+ "6": {},
+ "7": {},
+ "8": {},
+ "9": {},
+ iteration: 10,
+ },
+ },
+ };
+
+ it("Should return false, as the keepLastN is available - dont show iteration chip", () => {
+ const result = showIterationChip(nodeDataWithKeepLastN as any);
+ expect(result).toBe(false);
+ });
+ it("Should return false, as eventhough the keepLastN is not available, but the output is summarized - dont show iteration chip", () => {
+ const result = showIterationChip(
+ nodeDataWithoutKeepLastNAndSummarized as any,
+ );
+ expect(result).toBe(false);
+ });
+ it("Should return true, as eventhough it doesn't have keepLastN, but the output is not summarized - show iteration chip", () => {
+ const result = showIterationChip(
+ nodeDataWithoutKeepLastNAndNotSummarized as any,
+ );
+ expect(result).toBe(true);
+ });
+ // since the backend sends n-1 iterations in outputData while the workflow is running, we are doing the below test.
+ it("Should return true, as eventhough it doesn't have keepLastN, and having n-1 iterations data in output.and output is not summarized - show iteration chip", () => {
+ const result = showIterationChip(
+ nodeDataWithoutKeepLastNAndNotSummarized2 as any,
+ );
+ expect(result).toBe(true);
+ });
+ it("Should return false, as eventhough output is not summarized it has keepLastN. - dont show iteration chip", () => {
+ const result = showIterationChip(
+ nodeDataWithKeepLastNAndNotSummarized as any,
+ );
+ expect(result).toBe(false);
+ });
+});
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/helpers.ts b/ui-next/src/components/flow/components/shapes/TaskCard/helpers.ts
new file mode 100644
index 0000000000..2f6e3a3142
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/helpers.ts
@@ -0,0 +1,43 @@
+import { NodeTaskData } from "components/flow/nodes/mapper";
+
+export const shouldHide = (
+ {
+ status = undefined,
+ withinExpandedSubWorkflow = false,
+ }: Partial = {
+ status: undefined,
+ withinExpandedSubWorkflow: false,
+ },
+) => !status && !withinExpandedSubWorkflow;
+
+export function dowhileHasAllIterationsInOutput(
+ outputData: Record,
+): boolean {
+ const max = outputData?.iteration as number;
+ for (let i = 1; i < max; i++) {
+ if (!Object.prototype.hasOwnProperty.call(outputData, String(i))) {
+ return false;
+ }
+ }
+ return true;
+}
+
+export function showIterationChip(nodeData: NodeTaskData): boolean {
+ const keepLastN = nodeData?.parentLoop?.inputData?.keepLastN;
+ return (
+ !keepLastN &&
+ dowhileHasAllIterationsInOutput(nodeData?.parentLoop?.outputData ?? {}) &&
+ typeof nodeData?.attempts === "number" &&
+ nodeData.attempts > 1
+ );
+}
+
+// Helper function to check if a string is a valid URI
+export const isValidUri = (uriString: string) => {
+ try {
+ new URL(uriString);
+ return true;
+ } catch {
+ return false;
+ }
+};
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/Buildings.jsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Buildings.jsx
new file mode 100644
index 0000000000..2a15077ca8
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Buildings.jsx
@@ -0,0 +1,72 @@
+import React from "react";
+
+function Icon({ size, color }) {
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/BusinessRule.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/BusinessRule.tsx
new file mode 100644
index 0000000000..83b79667c3
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/BusinessRule.tsx
@@ -0,0 +1,64 @@
+import type { CustomIconType } from "./types";
+function Icon({ size, color = "#000000" }: CustomIconType) {
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/CheckIcon.jsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/CheckIcon.jsx
new file mode 100644
index 0000000000..7046bd6889
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/CheckIcon.jsx
@@ -0,0 +1,22 @@
+function Icon({ size, color }) {
+ return (
+
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/DeleteIcon.jsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/DeleteIcon.jsx
new file mode 100644
index 0000000000..383e0193d2
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/DeleteIcon.jsx
@@ -0,0 +1,33 @@
+// From phosphoricons
+// rendering the svg directly for performance
+
+function DeleteIcon({ size = 24, color = "#000" }) {
+ return (
+
+
+
+
+
+ );
+}
+
+export default DeleteIcon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/DynamicFanout.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/DynamicFanout.tsx
new file mode 100644
index 0000000000..5e68b173bf
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/DynamicFanout.tsx
@@ -0,0 +1,21 @@
+import type { CustomIconType } from "./types";
+function DynamicFanoutIcon({ size, color = "#000000" }: CustomIconType) {
+ return (
+
+
+
+ );
+}
+
+export default DynamicFanoutIcon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/DynamicFork.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/DynamicFork.tsx
new file mode 100644
index 0000000000..ec5933446b
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/DynamicFork.tsx
@@ -0,0 +1,19 @@
+import type { CustomIconType } from "./types";
+function Icon({ size, color = "#000000" }: CustomIconType) {
+ return (
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/Event.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Event.tsx
new file mode 100644
index 0000000000..60f3d38c92
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Event.tsx
@@ -0,0 +1,33 @@
+import type { CustomIconType } from "./types";
+
+function Icon({ size, color = "#000000" }: CustomIconType) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/ExclamationCircleIcon.jsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/ExclamationCircleIcon.jsx
new file mode 100644
index 0000000000..ac620843f8
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/ExclamationCircleIcon.jsx
@@ -0,0 +1,34 @@
+// From phosphoricons
+// rendering the svg directly for performance
+
+function ExclamationCircleIcon({ size, color }) {
+ return (
+
+
+
+
+
+ );
+}
+
+export default ExclamationCircleIcon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/ForkIcon.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/ForkIcon.tsx
new file mode 100644
index 0000000000..6f7086a4de
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/ForkIcon.tsx
@@ -0,0 +1,25 @@
+import type { CustomIconType } from "./types";
+function ForkIcon({
+ size = "24",
+ color = "#000",
+ flip = false,
+}: CustomIconType) {
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default ForkIcon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/ForkJoinIcon.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/ForkJoinIcon.tsx
new file mode 100644
index 0000000000..fad799fa23
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/ForkJoinIcon.tsx
@@ -0,0 +1,16 @@
+import React from "react";
+import { GitFork } from "@phosphor-icons/react";
+
+export const ForkJoinIcon = () =>
+ React.createElement(
+ "div",
+ {
+ style: {
+ transform: "rotate(180deg)",
+ display: "inline-flex",
+ alignItems: "center",
+ justifyContent: "center",
+ },
+ },
+ React.createElement(GitFork, { size: 24 }),
+ );
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/GetDocument.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/GetDocument.tsx
new file mode 100644
index 0000000000..f3e098066c
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/GetDocument.tsx
@@ -0,0 +1,31 @@
+function Icon({ size = "24", color = "currentColor" }) {
+ return (
+
+
+
+
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/GetWorkflow.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/GetWorkflow.tsx
new file mode 100644
index 0000000000..ddb3e0fe15
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/GetWorkflow.tsx
@@ -0,0 +1,20 @@
+import type { CustomIconType } from "./types";
+
+function Icon({ size = "24", color = "#212121" }: CustomIconType) {
+ return (
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/Http.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Http.tsx
new file mode 100644
index 0000000000..8f2c2e8c9e
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Http.tsx
@@ -0,0 +1,58 @@
+import type { CustomIconType } from "./types";
+
+function Icon({ size = "24", color = "" }: CustomIconType) {
+ return (
+
+
+
+
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/HttpPoll.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/HttpPoll.tsx
new file mode 100644
index 0000000000..21f34b641a
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/HttpPoll.tsx
@@ -0,0 +1,28 @@
+import type { CustomIconType } from "./types";
+
+function Icon({ size = "24", color = "currentColor" }: CustomIconType) {
+ return (
+
+
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/Inline.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Inline.tsx
new file mode 100644
index 0000000000..9eafba0614
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Inline.tsx
@@ -0,0 +1,48 @@
+import type { CustomIconType } from "./types";
+function Icon({ size = "24", color = "#000000" }: CustomIconType) {
+ return (
+
+
+
+
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/Json.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Json.tsx
new file mode 100644
index 0000000000..bc0e5f4076
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Json.tsx
@@ -0,0 +1,50 @@
+import type { CustomIconType } from "./types";
+function Icon({ size, color = "currentColor" }: CustomIconType) {
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/Kafka.jsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Kafka.jsx
new file mode 100644
index 0000000000..24aa8e3b35
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Kafka.jsx
@@ -0,0 +1,15 @@
+function Icon({ size = "24" }) {
+ return (
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/LlmChatComplete.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/LlmChatComplete.tsx
new file mode 100644
index 0000000000..6867e7c0a6
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/LlmChatComplete.tsx
@@ -0,0 +1,18 @@
+function Icon({ size = "24", color = "currentColor" }) {
+ return (
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/LlmGenerateEmbeddings.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/LlmGenerateEmbeddings.tsx
new file mode 100644
index 0000000000..0f7030cbde
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/LlmGenerateEmbeddings.tsx
@@ -0,0 +1,30 @@
+function Icon({ size = "24", color = "currentColor" }) {
+ return (
+
+
+
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/LlmGetEmbeddings.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/LlmGetEmbeddings.tsx
new file mode 100644
index 0000000000..3b731e14fb
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/LlmGetEmbeddings.tsx
@@ -0,0 +1,30 @@
+function Icon({ size = "24", color = "currentColor" }) {
+ return (
+
+
+
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/LlmIndexDocument.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/LlmIndexDocument.tsx
new file mode 100644
index 0000000000..f7a1cddae7
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/LlmIndexDocument.tsx
@@ -0,0 +1,30 @@
+function Icon({ size = "24", color = "currentColor" }) {
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/LlmIndexText.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/LlmIndexText.tsx
new file mode 100644
index 0000000000..d3ed5c72e7
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/LlmIndexText.tsx
@@ -0,0 +1,45 @@
+function Icon({ size = "24", color = "currentColor" }) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/LlmSearchIndex.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/LlmSearchIndex.tsx
new file mode 100644
index 0000000000..6b5e15f0a4
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/LlmSearchIndex.tsx
@@ -0,0 +1,30 @@
+function Icon({ size = "24", color = "currentColor" }) {
+ return (
+
+
+
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/LlmStoreEmbeddings.jsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/LlmStoreEmbeddings.jsx
new file mode 100644
index 0000000000..634386d796
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/LlmStoreEmbeddings.jsx
@@ -0,0 +1,18 @@
+function Icon({ size = "24", color = "currentColor" }) {
+ return (
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/LlmTextComplete.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/LlmTextComplete.tsx
new file mode 100644
index 0000000000..a81fa4d099
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/LlmTextComplete.tsx
@@ -0,0 +1,50 @@
+function Icon({ size = "24", color = "currentColor" }) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/LoopIcon.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/LoopIcon.tsx
new file mode 100644
index 0000000000..584b41a868
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/LoopIcon.tsx
@@ -0,0 +1,50 @@
+import type { CustomIconType } from "./types";
+// From phosphoricons
+// rendering the svg directly for performance
+
+function LoopIcon({ color = "#000000", size = "24" }: CustomIconType) {
+ return (
+
+
+
+
+
+
+
+ );
+}
+
+export default LoopIcon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/MCPIcon.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/MCPIcon.tsx
new file mode 100644
index 0000000000..4628ee68f2
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/MCPIcon.tsx
@@ -0,0 +1,20 @@
+import React from "react";
+
+function MCPIcon({ size = "24" }) {
+ return (
+
+ ModelContextProtocol
+
+
+
+ );
+}
+
+export default MCPIcon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/MergeIcon.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/MergeIcon.tsx
new file mode 100644
index 0000000000..b9fb2dc1ca
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/MergeIcon.tsx
@@ -0,0 +1,48 @@
+function MergeIcon({ size = "24", color = "#212121" }) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+export default MergeIcon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/MinusIcon.jsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/MinusIcon.jsx
new file mode 100644
index 0000000000..031e80da27
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/MinusIcon.jsx
@@ -0,0 +1,22 @@
+function MinusIcon({ size = 24, color = "#000" }) {
+ return (
+
+
+
+
+ );
+}
+
+export default MinusIcon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/OpsGenie.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/OpsGenie.tsx
new file mode 100644
index 0000000000..2adef86cd7
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/OpsGenie.tsx
@@ -0,0 +1,26 @@
+function OpsGenie({ size = "24", color = "currentColor" }) {
+ return (
+
+
+
+
+
+ );
+}
+
+export default OpsGenie;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/PlusIcon.jsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/PlusIcon.jsx
new file mode 100644
index 0000000000..a0e9265b28
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/PlusIcon.jsx
@@ -0,0 +1,30 @@
+function PlusIcon({ size = 24, color = "#000" }) {
+ return (
+
+
+
+
+
+ );
+}
+
+export default PlusIcon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/QueryProcessor.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/QueryProcessor.tsx
new file mode 100644
index 0000000000..2a66361092
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/QueryProcessor.tsx
@@ -0,0 +1,18 @@
+function QueryProcessor({ size = "24", color = "currentColor" }) {
+ return (
+
+
+
+ );
+}
+
+export default QueryProcessor;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/Sendgrid.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Sendgrid.tsx
new file mode 100644
index 0000000000..9abc4a02fc
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Sendgrid.tsx
@@ -0,0 +1,29 @@
+function Icon() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/Simple.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Simple.tsx
new file mode 100644
index 0000000000..bb451d5937
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Simple.tsx
@@ -0,0 +1,16 @@
+import type { CustomIconType } from "./types";
+function Icon({ size, color = "currentColor" }: CustomIconType) {
+ return (
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/StackIcon.jsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/StackIcon.jsx
new file mode 100644
index 0000000000..1e0260cd63
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/StackIcon.jsx
@@ -0,0 +1,41 @@
+// From phosphoricons,
+// rendering the svg directly for performance
+
+function StackIcon({ color = "#000000", size = 24 }) {
+ return (
+
+
+
+
+
+
+ );
+}
+
+export default StackIcon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/SubWorkflow.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/SubWorkflow.tsx
new file mode 100644
index 0000000000..c7970b20f9
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/SubWorkflow.tsx
@@ -0,0 +1,22 @@
+import type { CustomIconType } from "./types";
+function SubWorkflowIcon({ size, color = "#000000" }: CustomIconType) {
+ return (
+
+
+
+
+ );
+}
+
+export default SubWorkflowIcon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/Switch.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Switch.tsx
new file mode 100644
index 0000000000..8781714b0b
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Switch.tsx
@@ -0,0 +1,38 @@
+import type { CustomIconType } from "./types";
+function Icon({ size, color = "#000000" }: CustomIconType) {
+ return (
+
+
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/Terminate.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Terminate.tsx
new file mode 100644
index 0000000000..e20d0d6cdc
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Terminate.tsx
@@ -0,0 +1,17 @@
+import type { CustomIconType } from "./types";
+function TerminateIcon({ size, color = "#000000" }: CustomIconType) {
+ return (
+
+
+
+ );
+}
+
+export default TerminateIcon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/TerminateWorkFlow.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/TerminateWorkFlow.tsx
new file mode 100644
index 0000000000..c90dec64ad
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/TerminateWorkFlow.tsx
@@ -0,0 +1,76 @@
+import type { CustomIconType } from "./types";
+function Icon({ size, color = "#000000" }: CustomIconType) {
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/UpdateSecret.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/UpdateSecret.tsx
new file mode 100644
index 0000000000..9d5b0bed36
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/UpdateSecret.tsx
@@ -0,0 +1,27 @@
+import type { CustomIconType } from "./types";
+function Icon({ size, color = "currentColor" }: CustomIconType) {
+ return (
+
+
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/UpdateTaskIcon.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/UpdateTaskIcon.tsx
new file mode 100644
index 0000000000..22b3bda3c9
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/UpdateTaskIcon.tsx
@@ -0,0 +1,32 @@
+import type { CustomIconType } from "./types";
+function Icon({ size, color = "currentColor" }: CustomIconType) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/Variable.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Variable.tsx
new file mode 100644
index 0000000000..2aa5f63e99
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Variable.tsx
@@ -0,0 +1,21 @@
+import type { CustomIconType } from "./types";
+function Icon({ size, color = "#000000" }: CustomIconType) {
+ return (
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/Wait.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Wait.tsx
new file mode 100644
index 0000000000..77520c7046
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Wait.tsx
@@ -0,0 +1,55 @@
+import type { CustomIconType } from "./types";
+
+function Icon({ size, color = "#000000" }: CustomIconType) {
+ return (
+
+
+
+
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/WaitForWebhook.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/WaitForWebhook.tsx
new file mode 100644
index 0000000000..a90cafdc3b
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/WaitForWebhook.tsx
@@ -0,0 +1,54 @@
+import type { CustomIconType } from "./types";
+function Icon({ size, color = "#000000" }: CustomIconType) {
+ return (
+
+
+
+
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/WarningIcon.jsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/WarningIcon.jsx
new file mode 100644
index 0000000000..571530c114
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/WarningIcon.jsx
@@ -0,0 +1,31 @@
+function Icon({ size, color }) {
+ return (
+
+
+
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/WorkFlow.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/WorkFlow.tsx
new file mode 100644
index 0000000000..eeaed96a9b
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/WorkFlow.tsx
@@ -0,0 +1,71 @@
+import type { CustomIconType } from "./types";
+function Icon({ size, color = "#000000" }: CustomIconType) {
+ return (
+
+
+
+
+
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/Worker.tsx b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Worker.tsx
new file mode 100644
index 0000000000..c0ac9c00c1
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/Worker.tsx
@@ -0,0 +1,50 @@
+import type { CustomIconType } from "./types";
+function Icon({ size, color = "#000000" }: CustomIconType) {
+ return (
+
+
+
+
+
+
+
+ );
+}
+
+export default Icon;
diff --git a/ui-next/src/components/flow/components/shapes/TaskCard/icons/types.ts b/ui-next/src/components/flow/components/shapes/TaskCard/icons/types.ts
new file mode 100644
index 0000000000..adeabc8c30
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskCard/icons/types.ts
@@ -0,0 +1,9 @@
+import { CSSProperties } from "react";
+
+export type CustomIconType = {
+ size?: string | number;
+ color?: string;
+ className?: string;
+ style?: CSSProperties;
+ flip?: boolean;
+};
diff --git a/ui-next/src/components/flow/components/shapes/TaskDescription.tsx b/ui-next/src/components/flow/components/shapes/TaskDescription.tsx
new file mode 100644
index 0000000000..bc424c8973
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskDescription.tsx
@@ -0,0 +1,73 @@
+import { useRef } from "react";
+import { TaskType } from "types";
+import { Fade } from "@mui/material";
+
+const OPERATOR_TASK_TYPES = [
+ TaskType.FORK_JOIN_DYNAMIC,
+ TaskType.JOIN,
+ TaskType.FORK_JOIN,
+ TaskType.FORK_JOIN_DYNAMIC,
+ TaskType.TERMINATE,
+ TaskType.SUB_WORKFLOW,
+ TaskType.DYNAMIC,
+ TaskType.TERMINATE_WORKFLOW,
+ TaskType.SET_VARIABLE,
+ TaskType.WAIT,
+ TaskType.START_WORKFLOW,
+];
+
+export const TaskDescription = ({
+ description,
+ taskType,
+}: {
+ description: string;
+ taskType: TaskType;
+}) => {
+ const divRef = useRef(null);
+
+ let borderColor = "rgba(0, 0, 0, 0.1)";
+ let borderTopColor = "#cccccc";
+ let color = "#555555";
+ let textShadow = "none";
+ let background = "rgba(255, 255, 255, 0.35)";
+ if (OPERATOR_TASK_TYPES.includes(taskType)) {
+ borderColor = "rgba(255, 255, 255, 0.2)";
+ color = "white";
+ textShadow = "0 0 2px rgba(0, 0, 0, 1)";
+ borderTopColor = "rgba(255, 255, 255, 0.5)";
+ background = "rgba(255, 255, 255, 0.3)";
+ }
+
+ return (
+
+
+ {description}
+
+
+ );
+};
diff --git a/ui-next/src/components/flow/components/shapes/TaskShape/Shape.tsx b/ui-next/src/components/flow/components/shapes/TaskShape/Shape.tsx
new file mode 100644
index 0000000000..5bb5e0c4f0
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskShape/Shape.tsx
@@ -0,0 +1,116 @@
+import { DraggableSyntheticListeners } from "@dnd-kit/core";
+import { Handle } from "components/flow/dragDrop/Handle";
+import { BOTTOM_PORT_MARGIN, NodeTaskData } from "components/flow/nodes/mapper";
+import { CSSProperties, forwardRef, ReactNode, useMemo } from "react";
+import { CommonTaskDef, SwitchTaskDef, TaskStatus, TaskType } from "types";
+import DecisionOperator from "../DecisionOperator";
+import DoWhileTask from "../DoWhileTask";
+import DynamicTasksCards from "../DynamicTasksCards";
+import SubWorkflowTask from "../SubWorkflowTask";
+import SwitchJoin from "../SwitchJoinPseudoTask";
+import TaskCard from "../TaskCard/TaskCard";
+import TaskSummary from "../TaskSummary";
+import TerminalTask from "../TerminalTask";
+
+interface ShapeProps {
+ displayDescription?: boolean;
+ type: ShapeComponentForTypeParams;
+ nodeData: NodeTaskData;
+ onToggleTaskMenu: (event: any) => void;
+ portsVisible?: boolean;
+ nodeWidth?: number;
+ nodeHeight?: number;
+ isInconsistent: boolean;
+ listeners?: DraggableSyntheticListeners;
+ style?: CSSProperties;
+ handle?: boolean;
+ nodeId?: string;
+}
+export type ShapeComponentForTypeParams = TaskType & "FORK_JOIN_COLLAPSED";
+
+type ShapePropsToShape = (
+ props: ShapeProps,
+) => ReactNode;
+
+const DecisionOperatorShape: ShapePropsToShape = (
+ props: ShapeProps,
+) => (
+
+);
+
+const SHAPES_FOR_TYPE = {
+ FORK_JOIN_COLLAPSED: (props: ShapeProps) => ,
+ [TaskType.DO_WHILE]: (props: ShapeProps) => ,
+ [TaskType.TERMINAL]: (props: ShapeProps) => (
+
+ ),
+ [TaskType.SWITCH]: DecisionOperatorShape,
+ [TaskType.DECISION]: DecisionOperatorShape,
+ [TaskType.TASK_SUMMARY]: (props: ShapeProps) => ,
+ [TaskType.SUB_WORKFLOW]: (props: ShapeProps) => (
+
+ ),
+ [TaskType.SWITCH_JOIN]: (props: ShapeProps) => ,
+} satisfies Record;
+
+export const Shape = forwardRef((props, ref) => {
+ const {
+ type,
+ nodeData,
+ portsVisible,
+ nodeWidth,
+ nodeHeight,
+ listeners,
+ style = {},
+ handle = true,
+ } = props;
+ const dimTask = [TaskStatus.PENDING, TaskStatus.SKIPPED].includes(
+ nodeData.status!,
+ );
+ const containerStyles = useMemo(() => {
+ const extraHeight = type === "FORK_JOIN_DYNAMIC" ? 10 : 0;
+ const bottomMargin = portsVisible ? BOTTOM_PORT_MARGIN : 0;
+
+ return {
+ display: "flex",
+ top: 0,
+ left: "200px",
+ justifyContent: "center",
+ opacity: !dimTask ? 1 : 0.75,
+ filter: !dimTask ? "" : "grayscale(.75)",
+ padding: "0",
+ width: nodeWidth || 0,
+ height: (nodeHeight || 0) - bottomMargin + extraHeight,
+ ...style,
+ };
+ }, [dimTask, nodeWidth, nodeHeight, type, portsVisible, style]);
+
+ const ShapeComponent: ShapePropsToShape = useMemo(
+ () => SHAPES_FOR_TYPE[type] ?? TaskCard,
+ [type],
+ );
+
+ const handleStyles = useMemo(() => {
+ // The Switch Task relies on having extra 100 pixels to space the ports. this positions the handle for that task.
+ return [TaskType.DECISION, TaskType.SWITCH].includes(type)
+ ? { left: "50px" }
+ : {};
+ }, [type]);
+
+ return (
+
+ {handle ? : null}
+
+
+ );
+});
diff --git a/ui-next/src/components/flow/components/shapes/TaskShape/TaskShape.tsx b/ui-next/src/components/flow/components/shapes/TaskShape/TaskShape.tsx
new file mode 100644
index 0000000000..5764cb3579
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskShape/TaskShape.tsx
@@ -0,0 +1,57 @@
+import { FunctionComponent, ReactNode } from "react";
+import { NodeTaskData } from "components/flow/nodes/mapper";
+import { Shape, ShapeComponentForTypeParams } from "./Shape";
+import { useDraggableNode } from "components/flow/dragDrop";
+
+interface TaskShapeProps {
+ onToggleTaskMenu: (event: any) => void;
+ nodeData: NodeTaskData & { selected?: boolean };
+ isInconsistent: boolean;
+ width?: number;
+ height?: number;
+ portsVisible?: boolean;
+ children?: ReactNode;
+ nodeId: string;
+ displayDescription?: boolean;
+}
+
+export const TaskShape: FunctionComponent = ({
+ onToggleTaskMenu,
+ nodeData,
+ width = undefined,
+ height = undefined,
+ portsVisible = false,
+ isInconsistent,
+ nodeId,
+ displayDescription,
+}) => {
+ const { task } = nodeData;
+ const { type } = task;
+
+ const {
+ draggableResult: { listeners, setNodeRef },
+ dragIsDisabled,
+ } = useDraggableNode({
+ nodeData,
+ width,
+ height,
+ nodeId,
+ });
+
+ return (
+
+ );
+};
diff --git a/ui-next/src/components/flow/components/shapes/TaskShape/index.ts b/ui-next/src/components/flow/components/shapes/TaskShape/index.ts
new file mode 100644
index 0000000000..98cfe42d02
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskShape/index.ts
@@ -0,0 +1,2 @@
+export * from "./TaskShape";
+export * from "./Shape";
diff --git a/ui-next/src/components/flow/components/shapes/TaskSummary.jsx b/ui-next/src/components/flow/components/shapes/TaskSummary.jsx
new file mode 100644
index 0000000000..bf6b4db6ec
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TaskSummary.jsx
@@ -0,0 +1,114 @@
+import StatusBadge from "components/StatusBadge";
+import { taskStatusCompareFn } from "utils";
+import CardLabel from "./TaskCard/CardLabel";
+import CardStatusBadge from "./TaskCard/CardStatusBadge";
+import { getCardVariant } from "./styles";
+
+const TaskSummary = (props) => {
+ const { nodeData, nodeHeight } = props;
+ const { task } = nodeData;
+ const { type } = task;
+
+ return (
+
+
+ {/* Execution */}
+
+
+ {/* Definition */}
+
+
+
+
+ {nodeData.task.name}
+
+
+ {nodeData.task.taskReferenceName}
+
+
+
+
+ {Object.entries(nodeData?.summary?.taskCountByStatus)
+ .sort(([key1], [key2]) => taskStatusCompareFn(key1, key2))
+ .map(([key, value]) => (
+
+
+
+ {value}
+
+
+ ))}
+
+
+
+
+
+
+
+ );
+};
+
+export default TaskSummary;
diff --git a/ui-next/src/components/flow/components/shapes/TerminalTask.jsx b/ui-next/src/components/flow/components/shapes/TerminalTask.jsx
new file mode 100644
index 0000000000..1cf83a5072
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/TerminalTask.jsx
@@ -0,0 +1,50 @@
+import {
+ BOTTOM_PORT_MARGIN,
+ taskToSize,
+} from "components/flow/nodes/mapper/layout";
+import { getFlowTheme } from "components/flow/theme";
+import { useContext } from "react";
+import { ColorModeContext } from "theme/material/ColorModeContext";
+
+const TerminalTask = ({ nodeData, portsVisible }) => {
+ const { mode } = useContext(ColorModeContext);
+ const theme = getFlowTheme(mode);
+
+ const { task } = nodeData;
+ const terminalClick = (event) => {
+ event.stopPropagation();
+ };
+
+ const { width, height } = taskToSize(task);
+ return (
+
+
+ {task.name === "start" ? "Start" : "End"}
+
+
+ );
+};
+
+export default TerminalTask;
diff --git a/ui-next/src/components/flow/components/shapes/styles.ts b/ui-next/src/components/flow/components/shapes/styles.ts
new file mode 100644
index 0000000000..7aa1ddb66f
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/styles.ts
@@ -0,0 +1,91 @@
+import theme from "components/flow/theme";
+import { TaskStatus, TaskType } from "types";
+
+export const getCardVariant = (
+ type: TaskType,
+ status?: TaskStatus,
+ selected?: boolean,
+) => {
+ const outlineColor = selected
+ ? theme.taskCard.selected.outlineColor
+ : theme.taskStatusOutline[status ?? TaskStatus.NULL];
+
+ const isOperator = [
+ TaskType.FORK_JOIN_DYNAMIC,
+ TaskType.JOIN,
+ TaskType.FORK_JOIN,
+ TaskType.FORK_JOIN_DYNAMIC,
+ TaskType.TERMINATE,
+ TaskType.SUB_WORKFLOW,
+ TaskType.DYNAMIC,
+ TaskType.SET_VARIABLE,
+ TaskType.START_WORKFLOW,
+ ].includes(type);
+
+ let cardStyles = {};
+
+ const operatorStyles = {
+ backgroundColor: theme.taskCard.operators.background,
+ border: outlineColor
+ ? `3px solid ${outlineColor}`
+ : `3px solid transparent`,
+ color: theme.taskCard.operators.text,
+ borderRadius: "10px",
+ };
+
+ const tasksStyles = {
+ backgroundColor: theme.taskCard.systemTasks.background,
+ color: theme.taskCard.systemTasks.color,
+ border: outlineColor
+ ? `3px solid ${outlineColor}`
+ : `3px solid transparent`,
+ borderRadius: "10px",
+ };
+
+ cardStyles = isOperator ? operatorStyles : tasksStyles;
+
+ const errorStripesColor = () => {
+ if (isOperator) {
+ if (status === TaskStatus.CANCELED) {
+ return "rgba(251, 164, 4, .25)";
+ }
+ return "rgba(90, 0, 0, .25)";
+ } else {
+ if (status === TaskStatus.CANCELED) {
+ return "rgba(251, 164, 4, .15)";
+ }
+ return "rgba(220, 110, 110, .15)";
+ }
+ };
+
+ switch (status) {
+ case TaskStatus.FAILED:
+ case TaskStatus.SKIPPED:
+ case TaskStatus.CANCELED:
+ case TaskStatus.TIMED_OUT:
+ cardStyles = {
+ ...cardStyles,
+ backgroundImage: `linear-gradient( 135deg, rgba(0,0,0,0) 25%, ${errorStripesColor()} 25%, ${errorStripesColor()} 50%, rgba(0,0,0,0) 50%, rgba(0,0,0,0) 75%, ${errorStripesColor()} 75%, ${errorStripesColor()} 100% )`,
+ // These are not magic numbers!, see: https://css-tricks.com/no-jank-css-stripes/
+ backgroundSize: "56.57px 56.57px",
+ };
+ break;
+
+ default:
+ break;
+ }
+
+ const boxShadows = [TaskType.SWITCH, TaskType.DECISION].includes(type)
+ ? []
+ : ["0 2px 20px rgba(0,0,0,.4)"];
+ if (selected) {
+ boxShadows.push(theme.taskCard.selected.boxShadow);
+ }
+
+ cardStyles = {
+ ...cardStyles,
+ boxShadow: boxShadows.join(", "),
+ };
+
+ return cardStyles;
+};
diff --git a/ui-next/src/components/flow/components/shapes/testDiagrams.js b/ui-next/src/components/flow/components/shapes/testDiagrams.js
new file mode 100644
index 0000000000..1148f89cc3
--- /dev/null
+++ b/ui-next/src/components/flow/components/shapes/testDiagrams.js
@@ -0,0 +1,708 @@
+export const simpleDiagram = {
+ updateTime: 1646331692036,
+ name: "image_convert_resize_jim",
+ description: "Image Processing Workflow",
+ version: 1,
+ tasks: [
+ {
+ name: "image_convert_resize_jim",
+ taskReferenceName: "image_convert_resize_ref",
+ inputParameters: {
+ fileLocation: "${workflow.input.fileLocation}",
+ outputFormat: "${workflow.input.recipeParameters.outputFormat}",
+ outputWidth: "${workflow.input.recipeParameters.outputSize.width}",
+ outputHeight: "${workflow.input.recipeParameters.outputSize.height}",
+ },
+ type: "SIMPLE",
+ decisionCases: {},
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ {
+ name: "upload_toS3_jim",
+ taskReferenceName: "upload_toS3_ref",
+ inputParameters: {
+ fileLocation: "${image_convert_resize_ref.output.fileLocation}",
+ },
+ type: "SIMPLE",
+ decisionCases: {},
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ ],
+ inputParameters: [],
+ outputParameters: {
+ fileLocation: "${upload_toS3_ref.output.fileLocation}",
+ },
+ schemaVersion: 2,
+ restartable: true,
+ workflowStatusListenerEnabled: true,
+ ownerEmail: "devrel@orkes.io",
+ timeoutPolicy: "ALERT_ONLY",
+ timeoutSeconds: 0,
+ failureWorkflow: "",
+ variables: {},
+ inputTemplate: {},
+};
+
+export const populationMinMax = {
+ updateTime: 1645990260050,
+ name: "PopulationMinMax",
+ description: "Min Max Population",
+ version: 1,
+ tasks: [
+ {
+ name: "get_population_data",
+ taskReferenceName: "get_population_data_ref",
+ inputParameters: {
+ http_request: {
+ uri: "https://datausa.io/api/data?drilldowns=State&measures=Population&year=latest",
+ method: "GET",
+ },
+ },
+ type: "HTTP",
+ decisionCases: {},
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ {
+ name: "fork_join",
+ taskReferenceName: "fork_ref",
+ inputParameters: {},
+ type: "FORK_JOIN",
+ decisionCases: {},
+ defaultCase: [],
+ forkTasks: [
+ [
+ {
+ name: "process_population_max",
+ taskReferenceName: "process_population_max_ref",
+ inputParameters: {
+ body: "${get_population_data_ref.output.response.body}",
+ queryExpression: "[.body.data[]] | max_by(.Population)",
+ },
+ type: "JSON_JQ_TRANSFORM",
+ decisionCases: {},
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ ],
+ [
+ {
+ name: "process_population_min",
+ taskReferenceName: "process_population_min_ref",
+ inputParameters: {
+ body: "${get_population_data_ref.output.response.body}",
+ queryExpression: "[.body.data[]] | min_by(.Population)",
+ },
+ type: "JSON_JQ_TRANSFORM",
+ decisionCases: {},
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ ],
+ ],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ {
+ name: "join",
+ taskReferenceName: "join_ref",
+ inputParameters: {},
+ type: "JOIN",
+ decisionCases: {},
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: ["process_population_max_ref", "process_population_min_ref"],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ ],
+ inputParameters: [],
+ outputParameters: {
+ maxPopulation: "${process_population_max_ref.output.result}",
+ minPopulation: "${process_population_min_ref.output.result}",
+ },
+ schemaVersion: 2,
+ restartable: true,
+ workflowStatusListenerEnabled: false,
+ ownerEmail: "developers@orkes.io",
+ timeoutPolicy: "ALERT_ONLY",
+ timeoutSeconds: 0,
+ failureWorkflow: "",
+ variables: {},
+ inputTemplate: {},
+};
+
+export const decisionSample = {
+ updateTime: 1636597950018,
+ name: "exclusive_join",
+ description: "Exclusive Join Example",
+ version: 1,
+ tasks: [
+ {
+ type: "TERMINAL",
+ name: "start",
+ taskReferenceName: "__start",
+ },
+ {
+ name: "api_decision",
+ taskReferenceName: "api_decision_ref",
+ inputParameters: {
+ case_value_param: "${workflow.input.type}",
+ },
+ type: "DECISION",
+ caseValueParam: "case_value_param",
+ decisionCases: {
+ POST: [
+ {
+ name: "get_posts",
+ taskReferenceName: "get_posts_ref",
+ inputParameters: {
+ http_request: {
+ uri: "https://jsonplaceholder.typicode.com/posts/1",
+ method: "GET",
+ },
+ },
+ type: "HTTP",
+ decisionCases: {},
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ ],
+ COMMENT: [
+ {
+ name: "get_post_comments",
+ taskReferenceName: "get_post_comments_ref",
+ inputParameters: {
+ http_request: {
+ uri: "https://jsonplaceholder.typicode.com/comments?postId=1",
+ method: "GET",
+ },
+ },
+ type: "HTTP",
+ decisionCases: {},
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ ],
+ USER: [
+ {
+ name: "get_user_posts",
+ taskReferenceName: "get_user_posts_ref",
+ inputParameters: {
+ http_request: {
+ uri: "https://jsonplaceholder.typicode.com/posts?userId=1",
+ method: "GET",
+ },
+ },
+ type: "HTTP",
+ decisionCases: {},
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ ],
+ },
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ {
+ name: "notification_join",
+ taskReferenceName: "notification_join_ref",
+ inputParameters: {},
+ type: "EXCLUSIVE_JOIN",
+ decisionCases: {},
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: ["get_posts_ref", "get_post_comments_ref"],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ {
+ type: "TERMINAL",
+ name: "final",
+ taskReferenceName: "__final",
+ },
+ ],
+ inputParameters: [],
+ outputParameters: {},
+ schemaVersion: 2,
+ restartable: true,
+ workflowStatusListenerEnabled: true,
+ ownerEmail: "encode_admin@test.com",
+ timeoutPolicy: "ALERT_ONLY",
+ timeoutSeconds: 0,
+ failureWorkflow: "",
+ variables: {},
+ inputTemplate: {},
+};
+
+export const complexDiagram = {
+ createTime: 1639691367677,
+ updateTime: 1641859692443,
+ name: "port_in_wf",
+ description: "Port In Workflow",
+ version: 1,
+ tasks: [
+ {
+ type: "TERMINAL",
+ name: "start",
+ taskReferenceName: "__start",
+ },
+ {
+ name: "Submit To ITG with Retry",
+ taskReferenceName: "submit_to_itg_with_retry",
+ inputParameters: {
+ value: "${workflow.input.iterations}",
+ terminate: "${workflow.variables.terminate_loop}",
+ },
+ type: "DO_WHILE",
+ decisionCases: {},
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopCondition:
+ "if ( ($.submit_to_itg_with_retry['iteration'] < $.value) && !$.terminate) { true; } else { false; }",
+ loopOver: [
+ {
+ name: "Submit to ITG",
+ taskReferenceName: "submit_to_itg",
+ inputParameters: {
+ http_request: {
+ uri: "https://jsonplaceholder.typicode.com/todos/${$.workflow.input.iterations}",
+ method: "GET",
+ },
+ },
+ type: "HTTP",
+ decisionCases: {},
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: true,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ {
+ name: "Check Status",
+ taskReferenceName: "check_status",
+ inputParameters: {
+ prev_task_result: "${submit_to_itg.output}",
+ switchCaseValue: "${submit_to_itg.status}",
+ },
+ type: "DECISION",
+ caseValueParam: "switchCaseValue",
+ decisionCases: {
+ COMPLETED: [
+ {
+ name: "Complete Request Loop",
+ taskReferenceName: "complete_loop_success",
+ inputParameters: {
+ terminate_loop: true,
+ success: true,
+ },
+ type: "SET_VARIABLE",
+ decisionCases: {},
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ ],
+ COMPLETED_WITH_ERRORS: [
+ {
+ name: "Retry HTTP Request",
+ taskReferenceName: "retry_http_request",
+ inputParameters: {
+ terminate_loop: false,
+ success: false,
+ },
+ type: "SET_VARIABLE",
+ decisionCases: {},
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ {
+ name: "Update Records",
+ taskReferenceName: "update_records_on_retry",
+ inputParameters: {
+ update_records_on_retry: 1,
+ },
+ type: "SET_VARIABLE",
+ decisionCases: {},
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ ],
+ },
+ defaultCase: [
+ {
+ name: "Permanent Failure",
+ taskReferenceName: "terminate_loop",
+ inputParameters: {
+ terminate_loop: true,
+ success: false,
+ },
+ type: "SET_VARIABLE",
+ decisionCases: {},
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ {
+ name: "Update Records Terminate",
+ taskReferenceName: "update_records_on_failure",
+ inputParameters: {
+ update_records_on_retry: 1,
+ },
+ type: "SET_VARIABLE",
+ decisionCases: {},
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ {
+ name: "Terminate Workflow",
+ taskReferenceName: "terminate_on_perm_failure",
+ inputParameters: {
+ terminationStatus: "FAILED",
+ workflowOutput:
+ "Failing workflow as retries exhausted and failures are marked as permenant",
+ },
+ type: "TERMINATE",
+ decisionCases: {},
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ ],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ ],
+ },
+ {
+ name: "Check If Success",
+ taskReferenceName: "check_success",
+ inputParameters: {
+ switchCaseValue: "${workflow.variables.success}",
+ },
+ type: "DECISION",
+ caseValueParam: "switchCaseValue",
+ decisionCases: {
+ false: [
+ {
+ name: "Update Records on Failure",
+ taskReferenceName: "update_records_on_failure",
+ inputParameters: {
+ update_records_on_retry: 2,
+ },
+ type: "SET_VARIABLE",
+ decisionCases: {},
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ {
+ name: "Terminate Workflow",
+ taskReferenceName: "terminate_on_perm_failure2",
+ inputParameters: {
+ terminationStatus: "FAILED",
+ workflowOutput:
+ "Failing workflow as retries exhausted and failures are marked as permenant",
+ },
+ type: "TERMINATE",
+ decisionCases: {},
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ ],
+ },
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ {
+ name: "Wait for the async message response",
+ taskReferenceName: "wait_for_response",
+ inputParameters: {},
+ type: "WAIT",
+ decisionCases: {},
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ {
+ name: "Check Response",
+ taskReferenceName: "check_response_succeeded",
+ inputParameters: {
+ switchCaseValue: "${wait_for_response.output.success}",
+ },
+ type: "DECISION",
+ caseValueParam: "switchCaseValue",
+ decisionCases: {
+ false: [
+ {
+ name: "Update Records on ITGH Failure",
+ taskReferenceName: "update_records_on_itg_failure",
+ inputParameters: {
+ response: "${wait_for_response.output}",
+ },
+ type: "SET_VARIABLE",
+ decisionCases: {},
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ {
+ name: "Terminate Workflow",
+ taskReferenceName: "terminate_on_response_failure",
+ inputParameters: {
+ terminationStatus: "FAILED",
+ workflowOutput:
+ "Failing workflow as retries exhausted and failures are marked as permenant",
+ },
+ type: "TERMINATE",
+ decisionCases: {},
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ ],
+ },
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ {
+ type: "TERMINAL",
+ name: "final",
+ taskReferenceName: "__final",
+ },
+ ],
+ inputParameters: [],
+ outputParameters: {},
+ schemaVersion: 2,
+ restartable: true,
+ workflowStatusListenerEnabled: false,
+ ownerEmail: "example@email.com",
+ timeoutPolicy: "ALERT_ONLY",
+ timeoutSeconds: 0,
+ failureWorkflow: "",
+ variables: {
+ success: false,
+ },
+ inputTemplate: {},
+};
+
+export const allTaskTypes = {
+ updateTime: 1646331692036,
+ name: "all_task_types",
+ description: "All Task Types",
+ version: 1,
+ tasks: [
+ {
+ name: "JSON JQ Transform Example",
+ taskReferenceName: "json_jq_transform_example_ref",
+ inputParameters: {
+ body: "${get_population_data_ref.output.response.body}",
+ queryExpression: "[.body.data[]] | max_by(.Population)",
+ },
+ type: "JSON_JQ_TRANSFORM",
+ decisionCases: {},
+ defaultCase: [],
+ forkTasks: [],
+ startDelay: 0,
+ joinOn: [],
+ optional: false,
+ defaultExclusiveJoinTask: [],
+ asyncComplete: false,
+ loopOver: [],
+ },
+ {
+ name: "inline_task_example",
+ taskReferenceName: "inline_task_example",
+ type: "INLINE",
+ inputParameters: {
+ value: "${workflow.input.value}",
+ evaluatorType: "graaljs",
+ expression:
+ 'function e() { if ($.value == 1){return {"result": true}} else { return {"result": false}}} e();',
+ },
+ },
+ {
+ name: "Kafka Task Example",
+ taskReferenceName: "call_kafka",
+ inputParameters: {
+ kafka_request: {
+ topic: "userTopic",
+ value: "Message to publish",
+ bootStrapServers: "localhost:9092",
+ headers: {
+ "x-Auth": "Auth-key",
+ },
+ key: {
+ Key_1: "value 1",
+ },
+ keySerializer:
+ "org.apache.kafka.common.serialization.IntegerSerializer",
+ },
+ },
+ type: "KAFKA_PUBLISH",
+ },
+ ],
+ inputParameters: [],
+ outputParameters: {
+ fileLocation: "${upload_toS3_ref.output.fileLocation}",
+ },
+ schemaVersion: 2,
+ restartable: true,
+ workflowStatusListenerEnabled: true,
+ ownerEmail: "devrel@orkes.io",
+ timeoutPolicy: "ALERT_ONLY",
+ timeoutSeconds: 0,
+ failureWorkflow: "",
+ variables: {},
+ inputTemplate: {},
+};
diff --git a/ui-next/src/components/flow/dragDrop/DraggableOverlay.tsx b/ui-next/src/components/flow/dragDrop/DraggableOverlay.tsx
new file mode 100644
index 0000000000..875ba2eaaf
--- /dev/null
+++ b/ui-next/src/components/flow/dragDrop/DraggableOverlay.tsx
@@ -0,0 +1,73 @@
+import { DragOverlay, useDndContext } from "@dnd-kit/core";
+import { useSelector } from "@xstate/react";
+import { PanAndZoomMachineContext } from "components/flow/components/graphs/PanAndZoomWrapper/state";
+import { FlowContext, FlowEvents } from "components/flow/state";
+import { FunctionComponent, useMemo } from "react";
+import { ActorRef, State } from "xstate";
+import {
+ Shape,
+ ShapeComponentForTypeParams,
+} from "../components/shapes/TaskShape/Shape";
+
+export interface DragOverlayProps {
+ flowActor: ActorRef;
+}
+
+export const DraggableOverlay: FunctionComponent = ({
+ flowActor,
+}) => {
+ const { active } = useDndContext();
+ const draggedElement = useSelector(
+ flowActor,
+ (state: State) => state.context.draggedNodeData,
+ );
+ // @ts-ignore
+ const panAndZoomActor = flowActor.children?.get("panAndZoomMachine");
+
+ return panAndZoomActor ? (
+ }
+ active={!!active}
+ draggedElement={draggedElement}
+ />
+ ) : null;
+};
+
+interface DraggableOverlayWithPanZoomProps {
+ panAndZoomActor: ActorRef;
+ active: boolean;
+ draggedElement: any;
+}
+
+const DraggableOverlayWithPanZoom: FunctionComponent<
+ DraggableOverlayWithPanZoomProps
+> = ({ panAndZoomActor, active, draggedElement }) => {
+ const scaleFactor = useSelector(
+ panAndZoomActor,
+ (state: State) => state.context.zoom,
+ );
+ const shapeScaleStyles = useMemo(
+ () => ({
+ transformOrigin: "top left",
+ transform: `scale(${scaleFactor})`,
+ opacity: 0.5,
+ }),
+ [scaleFactor],
+ );
+
+ return (
+
+ {active && draggedElement != null ? (
+ {}}
+ style={shapeScaleStyles}
+ />
+ ) : null}
+
+ );
+};
diff --git a/ui-next/src/components/flow/dragDrop/Handle.tsx b/ui-next/src/components/flow/dragDrop/Handle.tsx
new file mode 100644
index 0000000000..886a7d9742
--- /dev/null
+++ b/ui-next/src/components/flow/dragDrop/Handle.tsx
@@ -0,0 +1,104 @@
+import React, { forwardRef, CSSProperties } from "react";
+import { styled } from "@mui/system";
+
+export interface ActionProps extends React.HTMLAttributes {
+ active?: {
+ fill: string;
+ background: string;
+ };
+ cursor?: CSSProperties["cursor"];
+}
+
+const HandleButton = styled("button")`
+ position: absolute;
+ left: 0;
+ z-index: 3;
+ display: flex;
+ width: 12px;
+ padding: 15px;
+ align-items: center;
+ border: none;
+ justify-content: center;
+ flex: 0 0 auto;
+ touch-action: none;
+ cursor: var(--cursor, pointer);
+ border-radius: 5px;
+ outline: none;
+ appearance: none;
+ background-color: transparent;
+ -webkit-tap-highlight-color: transparent;
+
+ @media (hover: hover) {
+ &:hover {
+ background-color: var(--action-background, rgba(0, 0, 0, 0.05));
+
+ svg {
+ fill: #6f7b88;
+ }
+ }
+ }
+
+ svg {
+ flex: 0 0 auto;
+ margin: auto;
+ height: 100%;
+ overflow: visible;
+ fill: #919eab;
+ }
+
+ &:active {
+ background-color: var(--background, rgba(0, 0, 0, 0.05));
+
+ svg {
+ fill: var(--fill, #788491);
+ }
+ }
+
+ &:focus-visible {
+ outline: none;
+ box-shadow:
+ 0 0 0 2px rgba(255, 255, 255, 0),
+ 0 0px 0px 2px #4c9ffe;
+ }
+`;
+
+export const Action = forwardRef(
+ ({ active, className, cursor, style, ...props }, ref) => {
+ return (
+
+ );
+ },
+);
+
+export const Handle = forwardRef(
+ (props, ref) => {
+ return (
+
+
+
+
+
+ );
+ },
+);
diff --git a/ui-next/src/components/flow/dragDrop/boxCollision.ts b/ui-next/src/components/flow/dragDrop/boxCollision.ts
new file mode 100644
index 0000000000..2242e207e6
--- /dev/null
+++ b/ui-next/src/components/flow/dragDrop/boxCollision.ts
@@ -0,0 +1,101 @@
+import {
+ Active,
+ CollisionDetection,
+ ClientRect,
+ CollisionDescriptor,
+} from "@dnd-kit/core";
+import { ActorRef } from "xstate";
+import { useSelector } from "@xstate/react";
+import { PanAndZoomEvents } from "../components/graphs/PanAndZoomWrapper/state/types";
+
+export function sortCollisionsDesc(
+ { data: { value: a } }: CollisionDescriptor,
+ { data: { value: b } }: CollisionDescriptor,
+) {
+ return b - a;
+}
+
+/**
+ * Returns the intersecting rectangle area between two rectangles
+ */
+function getIntersectionRatio(entry: ClientRect, active: Active): number {
+ const {
+ top: currentTop = 0,
+ left: currentLeft = 0,
+ width: currentWidth = 0,
+ height: currentHeight = 0,
+ } = active.rect.current.translated ?? {};
+
+ const top = Math.max(currentTop, entry.top);
+ const left = Math.max(currentLeft, entry.left);
+ const right = Math.min(currentLeft + currentWidth, entry.left + entry.width);
+ const bottom = Math.min(currentTop + currentHeight, entry.top + entry.height);
+ const width = right - left;
+ const height = bottom - top;
+
+ if (left < right && top < bottom) {
+ const targetArea = currentWidth * currentHeight;
+ const entryArea = entry.width * entry.height;
+ const intersectionArea = width * height;
+ const intersectionRatio =
+ intersectionArea / (targetArea + entryArea - intersectionArea);
+
+ return Number(intersectionRatio.toFixed(4));
+ }
+
+ // Rectangles do not overlap, or overlap has an area of zero (edge/corner overlap)
+ return 0;
+}
+
+/**
+ * Returns the rectangle that has the greatest intersection area with a given
+ * rectangle in an array of rectangles.
+ */
+const performantRectIntersection = (useDom = false) => {
+ const activeRectIntersection: CollisionDetection = ({
+ active,
+ droppableContainers,
+ }) => {
+ let maxIntersectionRatio = 0;
+ const collisions: CollisionDescriptor[] = [];
+ for (const droppableContainer of droppableContainers) {
+ const { id } = droppableContainer;
+ const {
+ rect: { current: rect },
+ } = droppableContainer;
+
+ if (rect) {
+ // Workaround to account for the movement of the position.
+ const actualRect = useDom
+ ? droppableContainer.node.current?.getBoundingClientRect() || rect
+ : rect;
+ const intersectionRatio = getIntersectionRatio(actualRect, active);
+
+ if (intersectionRatio > maxIntersectionRatio) {
+ maxIntersectionRatio = intersectionRatio;
+ collisions.push({
+ id,
+ data: { droppableContainer, value: intersectionRatio },
+ });
+ }
+ }
+ }
+
+ return collisions.sort(sortCollisionsDesc);
+ };
+ return activeRectIntersection;
+};
+
+export const useNodeCollisionDetection = (
+ panAndZoomActor: ActorRef,
+) => {
+ /**
+ * This is a workaround to account for the movement of the position.
+ * we don't want to hit the dom if the user has not dragged passed his position. Else we hit the dom.
+ */
+ const useDom = useSelector(
+ panAndZoomActor!,
+ (state) => state.context.draggingUpdatedPosition,
+ );
+ return performantRectIntersection(useDom);
+};
diff --git a/ui-next/src/components/flow/dragDrop/hooks.ts b/ui-next/src/components/flow/dragDrop/hooks.ts
new file mode 100644
index 0000000000..b5ecf268cb
--- /dev/null
+++ b/ui-next/src/components/flow/dragDrop/hooks.ts
@@ -0,0 +1,181 @@
+import { useDraggable, useDroppable } from "@dnd-kit/core";
+import { useSelector } from "@xstate/react";
+import {
+ PanAndZoomContext,
+ PanAndZoomMachineContext,
+ PanAndZoomStates,
+} from "components/flow/components/graphs/PanAndZoomWrapper/state";
+import {
+ NodeTaskData,
+ isSubWorkflowChild,
+ isTaskNext,
+ isTaskReferenceNestedInTaskReference,
+ previousTaskCrumb,
+} from "components/flow/nodes/mapper";
+import {
+ DropPosition,
+ FlowContext,
+ FlowMachineStates,
+} from "components/flow/state";
+import fastDeepEqual from "fast-deep-equal";
+import { useContext, useMemo } from "react";
+import { CommonTaskDef, TaskType } from "types";
+import type { State } from "xstate";
+import { FlowActorContext } from "../state/FlowActorContext";
+
+interface DragDropNodeProps {
+ nodeData: NodeTaskData & { selected?: boolean };
+ width?: number;
+ height?: number;
+ nodeId: string;
+}
+
+const useIsPanEnabled = () => {
+ const { panAndZoomActor } = useContext(PanAndZoomContext);
+ const panIsEnabled = useSelector(
+ panAndZoomActor!,
+ (state: State) =>
+ state.matches([
+ PanAndZoomStates.IDLE,
+ PanAndZoomStates.PAN,
+ PanAndZoomStates.PAN_ENABLED,
+ ]),
+ );
+ return panIsEnabled;
+};
+
+const useFlowContext = () => {
+ // Make this two seperate hooks
+ const { flowActor } = useContext(FlowActorContext);
+ const draggedNodeData = useSelector(
+ flowActor!,
+ (state: State) => state.context.draggedNodeData,
+ );
+ const canDrag = useSelector(flowActor!, (state: State) =>
+ state.matches([
+ [
+ FlowMachineStates.INIT,
+ FlowMachineStates.DIAGRAM_RENDERER,
+ FlowMachineStates.DIAGRAM_RENDERER_INIT,
+ FlowMachineStates.DIAGRAM_RENDERER_MENU_CLOSED,
+ ],
+ ]),
+ );
+ return { draggedNodeData, canDrag };
+};
+
+const DRAG_RESTRICTED_TASKS = [TaskType.SWITCH_JOIN, TaskType.TERMINAL];
+
+const isNodeDataAJoinAfterAFork = (nodeData?: NodeTaskData): boolean => {
+ if (nodeData?.task.type === TaskType.JOIN) {
+ const previousCrumb = previousTaskCrumb(
+ nodeData.crumbs,
+ nodeData.task.taskReferenceName,
+ );
+ return (
+ previousCrumb !== undefined &&
+ [TaskType.FORK_JOIN, TaskType.FORK_JOIN_DYNAMIC].includes(
+ previousCrumb.type,
+ )
+ );
+ }
+ return false;
+};
+
+export const useDraggableNode = ({
+ nodeData,
+ width,
+ height,
+ nodeId,
+}: DragDropNodeProps): {
+ draggableResult: ReturnType