From 7caa1bb48253468407e912d171402291ceca6ed1 Mon Sep 17 00:00:00 2001 From: pratapalakshmi <137189067+pratapalakshmi@users.noreply.github.com> Date: Tue, 9 Dec 2025 20:57:15 +0530 Subject: [PATCH 001/266] [PAI-963] feat: enhance CustomSelect component with context for dropdown management (#8202) * feat: enhance CustomSelect component with context for dropdown management * refactor: streamline CustomSelect component structure and improve dropdown options rendering --- packages/ui/src/dropdowns/custom-select.tsx | 174 +++++++++++--------- 1 file changed, 95 insertions(+), 79 deletions(-) diff --git a/packages/ui/src/dropdowns/custom-select.tsx b/packages/ui/src/dropdowns/custom-select.tsx index 3876ee9fd56..4423bd49c6c 100644 --- a/packages/ui/src/dropdowns/custom-select.tsx +++ b/packages/ui/src/dropdowns/custom-select.tsx @@ -1,6 +1,6 @@ import { Combobox } from "@headlessui/react"; import { Check } from "lucide-react"; -import React, { useRef, useState } from "react"; +import React, { createContext, useCallback, useContext, useRef, useState } from "react"; import { createPortal } from "react-dom"; import { usePopper } from "react-popper"; import { useOutsideClickDetector } from "@plane/hooks"; @@ -13,6 +13,9 @@ import { cn } from "../utils"; // types import type { ICustomSelectItemProps, ICustomSelectProps } from "./helper"; +// Context to share the close handler with option components +const DropdownContext = createContext<() => void>(() => {}); + function CustomSelect(props: ICustomSelectProps) { const { customButtonClassName = "", @@ -42,99 +45,112 @@ function CustomSelect(props: ICustomSelectProps) { placement: placement ?? "bottom-start", }); - const openDropdown = () => { + const openDropdown = useCallback(() => { setIsOpen(true); if (referenceElement) referenceElement.focus(); - }; - const closeDropdown = () => setIsOpen(false); + }, [referenceElement]); + + const closeDropdown = useCallback(() => setIsOpen(false), []); const handleKeyDown = useDropdownKeyDown(openDropdown, closeDropdown, isOpen); useOutsideClickDetector(dropdownRef, closeDropdown); - const toggleDropdown = () => { + const toggleDropdown = useCallback(() => { if (isOpen) closeDropdown(); else openDropdown(); - }; + }, [closeDropdown, isOpen, openDropdown]); return ( - - <> - {customButton ? ( - - - - ) : ( - - - - )} - - {isOpen && - createPortal( - -
+ + { + onChange?.(val); + closeDropdown(); + }} + className={cn("relative flex-shrink-0 text-left", className)} + onKeyDown={handleKeyDown} + disabled={disabled} + > + <> + {customButton ? ( + + + + ) : ( + + + + )} + + {isOpen && + createPortal( +
- {children} +
+ {children} +
-
-
, - document.body - )} -
+ , + document.body + )} + + ); } function Option(props: ICustomSelectItemProps) { const { children, value, className } = props; + const closeDropdown = useContext(DropdownContext); + + const handleMouseDown = useCallback(() => { + // Close dropdown for both new and already-selected options. + requestAnimationFrame(() => closeDropdown()); + }, [closeDropdown]); + return ( {({ selected }) => ( - <> +
{children} {selected && } - +
)}
); From f70384bff764ea47cccaa5dbb0ea2df9c135838b Mon Sep 17 00:00:00 2001 From: b-saikrishnakanth <130811169+b-saikrishnakanth@users.noreply.github.com> Date: Tue, 9 Dec 2025 21:04:33 +0530 Subject: [PATCH 002/266] [WEB-5603] feat: enhance workspace settings layout and members page (#8266) * feat: enhance workspace settings layout and members page with new components * refactor: update workspace settings layout and members page to use default exports * refactor: settings layout import changes * refactor: simplify workspaceSlug usage in settings layout --- .../settings/(workspace)/layout.tsx | 23 +++++++++++------- .../settings/(workspace)/members/page.tsx | 24 ++++++++++++------- .../ce/components/workspace/members/index.ts | 2 ++ .../members/members-activity-button.tsx | 6 +++++ .../workspace/right-sidebar/index.ts | 1 + .../workspace/right-sidebar/root.tsx | 10 ++++++++ 6 files changed, 49 insertions(+), 17 deletions(-) create mode 100644 apps/web/ce/components/workspace/members/index.ts create mode 100644 apps/web/ce/components/workspace/members/members-activity-button.tsx create mode 100644 apps/web/ce/components/workspace/right-sidebar/index.ts create mode 100644 apps/web/ce/components/workspace/right-sidebar/root.tsx diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/layout.tsx index 4412962cc02..783f7a0dd06 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/layout.tsx @@ -1,26 +1,32 @@ import { observer } from "mobx-react"; import { usePathname } from "next/navigation"; import { Outlet } from "react-router"; -// constants -import { WORKSPACE_SETTINGS_ACCESS } from "@plane/constants"; -import type { EUserWorkspaceRoles } from "@plane/types"; // components import { NotAuthorizedView } from "@/components/auth-screens/not-authorized-view"; import { getWorkspaceActivePath, pathnameToAccessKey } from "@/components/settings/helper"; import { SettingsMobileNav } from "@/components/settings/mobile"; +// plane imports +import { WORKSPACE_SETTINGS_ACCESS } from "@plane/constants"; +import type { EUserWorkspaceRoles } from "@plane/types"; +// plane web components +import { WorkspaceSettingsRightSidebar } from "@/plane-web/components/workspace/right-sidebar"; // hooks import { useUserPermissions } from "@/hooks/store/user"; // local components import { WorkspaceSettingsSidebar } from "./sidebar"; -function WorkspaceSettingLayout() { +import type { Route } from "./+types/layout"; + +const WorkspaceSettingLayout = observer(function WorkspaceSettingLayout({ params }: Route.ComponentProps) { + // router + const { workspaceSlug } = params; // store hooks const { workspaceUserInfo, getWorkspaceRoleByWorkspaceSlug } = useUserPermissions(); // next hooks const pathname = usePathname(); // derived values - const { workspaceSlug, accessKey } = pathnameToAccessKey(pathname); - const userWorkspaceRole = getWorkspaceRoleByWorkspaceSlug(workspaceSlug.toString()); + const { accessKey } = pathnameToAccessKey(pathname); + const userWorkspaceRole = getWorkspaceRoleByWorkspaceSlug(workspaceSlug); let isAuthorized: boolean | string = false; if (pathname && workspaceSlug && userWorkspaceRole) { @@ -42,11 +48,12 @@ function WorkspaceSettingLayout() {
+ )} ); -} +}); -export default observer(WorkspaceSettingLayout); +export default WorkspaceSettingLayout; diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/members/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/members/page.tsx index 609c13c90e2..0d1104f83c8 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/members/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/members/page.tsx @@ -28,10 +28,10 @@ import { useWorkspace } from "@/hooks/store/use-workspace"; import { useUserPermissions } from "@/hooks/store/user"; // plane web components import { BillingActionsButton } from "@/plane-web/components/workspace/billing/billing-actions-button"; -import { SendWorkspaceInvitationModal } from "@/plane-web/components/workspace/members/invite-modal"; +import { SendWorkspaceInvitationModal, MembersActivityButton } from "@/plane-web/components/workspace/members"; import type { Route } from "./+types/page"; -function WorkspaceMembersSettingsPage({ params }: Route.ComponentProps) { +const WorkspaceMembersSettingsPage = observer(function WorkspaceMembersSettingsPage({ params }: Route.ComponentProps) { // states const [inviteModal, setInviteModal] = useState(false); const [searchQuery, setSearchQuery] = useState(""); @@ -70,23 +70,27 @@ function WorkspaceMembersSettingsPage({ params }: Route.ComponentProps) { title: "Success!", message: t("workspace_settings.settings.members.invitations_sent_successfully"), }); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } catch (err: any) { + } catch (error: unknown) { + let message = undefined; + if (error instanceof Error) { + const err = error as Error & { error?: string }; + message = err.error; + } captureError({ eventName: MEMBER_TRACKER_EVENTS.invite, payload: { emails: data.emails.map((email) => email.email), }, - error: err, + error: error as Error, }); setToast({ type: TOAST_TYPE.ERROR, title: "Error!", - message: `${err.error ?? t("something_went_wrong_please_try_again")}`, + message: `${message ?? t("something_went_wrong_please_try_again")}`, }); - throw err; + throw error; } }; @@ -137,6 +141,7 @@ function WorkspaceMembersSettingsPage({ params }: Route.ComponentProps) { className="w-full max-w-[234px] border-none bg-transparent text-sm outline-none placeholder:text-custom-text-400" placeholder={`${t("search")}...`} value={searchQuery} + // eslint-disable-next-line jsx-a11y/no-autofocus autoFocus onChange={(e) => setSearchQuery(e.target.value)} /> @@ -146,6 +151,7 @@ function WorkspaceMembersSettingsPage({ params }: Route.ComponentProps) { handleUpdate={handleRoleFilterUpdate} memberType="workspace" /> + {canPerformWorkspaceAdminActions && ( - - diff --git a/apps/web/ce/components/navigations/top-navigation-root.tsx b/apps/web/ce/components/navigations/top-navigation-root.tsx index 5e772b28ac7..97de65f6c10 100644 --- a/apps/web/ce/components/navigations/top-navigation-root.tsx +++ b/apps/web/ce/components/navigations/top-navigation-root.tsx @@ -12,10 +12,12 @@ import { AppSidebarItem } from "@/components/sidebar/sidebar-item"; import { InboxIcon } from "@plane/propel/icons"; import useSWR from "swr"; import { useWorkspaceNotifications } from "@/hooks/store/notifications"; +// local imports +import { StarUsOnGitHubLink } from "@/app/(all)/[workspaceSlug]/(projects)/star-us-link"; export const TopNavigationRoot = observer(function TopNavigationRoot() { // router - const { workspaceSlug, projectId, workItem } = useParams(); + const { workspaceSlug } = useParams(); const pathname = usePathname(); // store hooks @@ -70,6 +72,7 @@ export const TopNavigationRoot = observer(function TopNavigationRoot() { /> +
From ff544c98b73f504d1be6190142c4001be4e61dbd Mon Sep 17 00:00:00 2001 From: Aaron Date: Wed, 10 Dec 2025 18:35:14 +0700 Subject: [PATCH 014/266] chore: optimize turborepo (#8286) --- .../workflows/pull-request-build-lint-api.yml | 6 +- .../pull-request-build-lint-web-apps.yml | 137 ++++++++++++++++-- eslint.config.mjs | 2 + package.json | 1 + packages/shared-state/package.json | 16 +- packages/shared-state/tsdown.config.ts | 8 + pnpm-lock.yaml | 31 +++- turbo.json | 98 +++++++------ 8 files changed, 233 insertions(+), 66 deletions(-) create mode 100644 packages/shared-state/tsdown.config.ts diff --git a/.github/workflows/pull-request-build-lint-api.yml b/.github/workflows/pull-request-build-lint-api.yml index 11612207b1a..28a623f8e2b 100644 --- a/.github/workflows/pull-request-build-lint-api.yml +++ b/.github/workflows/pull-request-build-lint-api.yml @@ -27,11 +27,13 @@ jobs: github.event.pull_request.draft == false && github.event.pull_request.requested_reviewers != null steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: "3.12.x" + cache: 'pip' + cache-dependency-path: 'apps/api/requirements.txt' - name: Install Pylint run: python -m pip install ruff - name: Install API Dependencies diff --git a/.github/workflows/pull-request-build-lint-web-apps.yml b/.github/workflows/pull-request-build-lint-web-apps.yml index 7ddaceb7965..2a463852c00 100644 --- a/.github/workflows/pull-request-build-lint-web-apps.yml +++ b/.github/workflows/pull-request-build-lint-web-apps.yml @@ -17,10 +17,11 @@ concurrency: cancel-in-progress: true jobs: - build-and-lint: - name: Build and lint web apps + # Format check has no build dependencies - run immediately in parallel + check-format: + name: check:format runs-on: ubuntu-latest - timeout-minutes: 25 + timeout-minutes: 10 if: | github.event.pull_request.draft == false && github.event.pull_request.requested_reviewers != null @@ -29,28 +30,140 @@ jobs: TURBO_SCM_HEAD: ${{ github.sha }} steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 50 filter: blob:none - name: Set up Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 - name: Enable Corepack and pnpm run: corepack enable pnpm + - name: Get pnpm store directory + shell: bash + run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV + + - name: Cache pnpm store + uses: actions/cache@v4 + with: + path: ${{ env.STORE_PATH }} + key: pnpm-store-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + pnpm-store-${{ runner.os }}- + - name: Install dependencies run: pnpm install --frozen-lockfile - - name: Build Affected + - name: Check formatting + run: pnpm turbo run check:format --affected + + # Build packages - required for lint and type checks + build: + name: Build packages + runs-on: ubuntu-latest + timeout-minutes: 15 + if: | + github.event.pull_request.draft == false && + github.event.pull_request.requested_reviewers != null + env: + TURBO_SCM_BASE: ${{ github.event.pull_request.base.sha }} + TURBO_SCM_HEAD: ${{ github.sha }} + NODE_OPTIONS: "--max-old-space-size=4096" + steps: + - name: Checkout code + uses: actions/checkout@v6 + with: + fetch-depth: 50 + filter: blob:none + + - name: Set up Node.js + uses: actions/setup-node@v6 + + - name: Enable Corepack and pnpm + run: corepack enable pnpm + + - name: Get pnpm store directory + shell: bash + run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV + + - name: Cache pnpm store + uses: actions/cache@v4 + with: + path: ${{ env.STORE_PATH }} + key: pnpm-store-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + pnpm-store-${{ runner.os }}- + + - name: Restore Turbo cache + uses: actions/cache/restore@v4 + with: + path: .turbo + key: turbo-${{ runner.os }}-${{ github.event.pull_request.base.sha }}-${{ github.sha }} + restore-keys: | + turbo-${{ runner.os }}-${{ github.event.pull_request.base.sha }}- + turbo-${{ runner.os }}- + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build packages run: pnpm turbo run build --affected - - name: Lint Affected - run: pnpm turbo run check:lint --affected + - name: Save Turbo cache + uses: actions/cache/save@v4 + with: + path: .turbo + key: turbo-${{ runner.os }}-${{ github.event.pull_request.base.sha }}-${{ github.sha }} - - name: Check Affected format - run: pnpm turbo run check:format --affected + # Lint and type checks depend on build artifacts + check: + name: ${{ matrix.task }} + runs-on: ubuntu-latest + needs: build + timeout-minutes: 15 + strategy: + fail-fast: false + matrix: + task: [check:lint, check:types] + env: + TURBO_SCM_BASE: ${{ github.event.pull_request.base.sha }} + TURBO_SCM_HEAD: ${{ github.sha }} + NODE_OPTIONS: "--max-old-space-size=4096" + steps: + - name: Checkout code + uses: actions/checkout@v6 + with: + fetch-depth: 50 + filter: blob:none + + - name: Set up Node.js + uses: actions/setup-node@v6 + + - name: Enable Corepack and pnpm + run: corepack enable pnpm + + - name: Get pnpm store directory + shell: bash + run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV + + - name: Cache pnpm store + uses: actions/cache@v4 + with: + path: ${{ env.STORE_PATH }} + key: pnpm-store-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + pnpm-store-${{ runner.os }}- + + - name: Restore Turbo cache + uses: actions/cache/restore@v4 + with: + path: .turbo + key: turbo-${{ runner.os }}-${{ github.event.pull_request.base.sha }}-${{ github.sha }} + + - name: Install dependencies + run: pnpm install --frozen-lockfile - - name: Check Affected types - run: pnpm turbo run check:types --affected + - name: Run ${{ matrix.task }} + run: pnpm turbo run ${{ matrix.task }} --affected diff --git a/eslint.config.mjs b/eslint.config.mjs index 17d859f7aba..e45b2f05957 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -10,6 +10,7 @@ import promisePlugin from "eslint-plugin-promise"; import reactPlugin from "eslint-plugin-react"; import reactHooksPlugin from "eslint-plugin-react-hooks"; import reactRefreshPlugin from "eslint-plugin-react-refresh"; +import turboPlugin from "eslint-plugin-turbo"; import vitestPlugin from "@vitest/eslint-plugin"; // import storybookPlugin from "eslint-plugin-storybook"; @@ -42,6 +43,7 @@ export default defineConfig([ jsxA11yPlugin.flatConfigs.recommended, reactRefreshPlugin.configs.recommended, reactRefreshPlugin.configs.vite, + turboPlugin.configs["flat/recommended"], tseslint.configs.recommendedTypeChecked, vitestPlugin.configs.recommended, // TODO: enable storybook linting once issues are resolved diff --git a/package.json b/package.json index b73f0acc856..3a3edb4865d 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "eslint-plugin-react-hooks": "7.0.1", "eslint-plugin-react-refresh": "0.4.24", "eslint-plugin-storybook": "10.1.4", + "eslint-plugin-turbo": "2.6.3", "globals": "16.5.0", "husky": "9.1.7", "lint-staged": "16.2.7", diff --git a/packages/shared-state/package.json b/packages/shared-state/package.json index b3f7c250608..6f933798812 100644 --- a/packages/shared-state/package.json +++ b/packages/shared-state/package.json @@ -4,9 +4,20 @@ "license": "AGPL-3.0", "description": "Shared state shared across multiple apps internally", "private": true, - "main": "./src/index.ts", - "types": "./src/index.ts", + "type": "module", + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + }, + "./package.json": "./package.json" + }, "scripts": { + "build": "tsdown", + "dev": "tsdown --watch", "check:lint": "eslint . --max-warnings=191", "check:types": "tsc --noEmit", "check:format": "prettier --check .", @@ -28,6 +39,7 @@ "@plane/typescript-config": "workspace:*", "@types/lodash-es": "catalog:", "@types/node": "catalog:", + "tsdown": "catalog:", "typescript": "catalog:" } } diff --git a/packages/shared-state/tsdown.config.ts b/packages/shared-state/tsdown.config.ts new file mode 100644 index 00000000000..78c3dcba86b --- /dev/null +++ b/packages/shared-state/tsdown.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["src/index.ts"], + format: ["esm"], + dts: true, + platform: "neutral", +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ba3dd461132..9e1bfe96a03 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -166,6 +166,9 @@ importers: eslint-plugin-storybook: specifier: 10.1.4 version: 10.1.4(eslint@9.39.1(jiti@2.6.1))(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))(typescript@5.8.3) + eslint-plugin-turbo: + specifier: 2.6.3 + version: 2.6.3(eslint@9.39.1(jiti@2.6.1))(turbo@2.6.3) globals: specifier: 16.5.0 version: 16.5.0 @@ -1231,6 +1234,9 @@ importers: '@types/node': specifier: 'catalog:' version: 22.12.0 + tsdown: + specifier: 'catalog:' + version: 0.16.0(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -4865,9 +4871,6 @@ packages: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} - caniuse-lite@1.0.30001756: - resolution: {integrity: sha512-4HnCNKbMLkLdhJz3TToeVWHSnfJvPaq6vu/eRP0Ahub/07n484XHhBF5AJoSGHdVrS8tKFauUQz8Bp9P7LVx7A==} - caniuse-lite@1.0.30001759: resolution: {integrity: sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==} @@ -5431,6 +5434,10 @@ packages: dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dotenv@16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} + dotenv@16.6.1: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} @@ -5718,6 +5725,12 @@ packages: eslint: '>=8' storybook: ^10.1.4 + eslint-plugin-turbo@2.6.3: + resolution: {integrity: sha512-91WZ+suhT/pk+qNS0/rqT43xLUlUblsa3a8jKmAStGhkJCmR2uX0oWo/e0Edb+It8MdnteXuYpCkvsK4Vw8FtA==} + peerDependencies: + eslint: '>6.6.0' + turbo: '>2.0.0' + eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} @@ -13120,8 +13133,6 @@ snapshots: camelcase@7.0.1: {} - caniuse-lite@1.0.30001756: {} - caniuse-lite@1.0.30001759: {} capital-case@1.0.4: @@ -13659,6 +13670,8 @@ snapshots: no-case: 3.0.4 tslib: 2.8.1 + dotenv@16.0.3: {} + dotenv@16.6.1: {} dotenv@17.2.3: {} @@ -14059,6 +14072,12 @@ snapshots: - supports-color - typescript + eslint-plugin-turbo@2.6.3(eslint@9.39.1(jiti@2.6.1))(turbo@2.6.3): + dependencies: + dotenv: 16.0.3 + eslint: 9.39.1(jiti@2.6.1) + turbo: 2.6.3 + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 @@ -15908,7 +15927,7 @@ snapshots: dependencies: '@next/env': 16.0.7 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001756 + caniuse-lite: 1.0.30001759 postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) diff --git a/turbo.json b/turbo.json index 9c96eae758c..84b16c8483b 100644 --- a/turbo.json +++ b/turbo.json @@ -1,85 +1,95 @@ { - "$schema": "https://turbo.build/schema.json", + "$schema": "https://turborepo.com/schema.json", + "globalDependencies": [".npmrc"], "globalEnv": [ + "APP_VERSION", + "DEV", + "LOG_LEVEL", "NODE_ENV", - "VITE_API_BASE_URL", - "VITE_ADMIN_BASE_URL", + "SENTRY_DSN", + "SENTRY_ENVIRONMENT", + "SENTRY_TRACES_SAMPLE_RATE", "VITE_ADMIN_BASE_PATH", - "VITE_SPACE_BASE_URL", - "VITE_SPACE_BASE_PATH", - "VITE_WEB_BASE_URL", - "VITE_LIVE_BASE_URL", - "VITE_LIVE_BASE_PATH", + "VITE_ADMIN_BASE_URL", + "VITE_API_BASE_PATH", + "VITE_API_BASE_URL", + "VITE_APP_VERSION", "VITE_ENABLE_SESSION_RECORDER", - "VITE_SESSION_RECORDER_KEY", - "VITE_POSTHOG_KEY", - "VITE_POSTHOG_HOST", + "VITE_LIVE_BASE_PATH", + "VITE_LIVE_BASE_URL", "VITE_POSTHOG_DEBUG", - "VITE_SUPPORT_EMAIL", - "ENABLE_EXPERIMENTAL_COREPACK", + "VITE_POSTHOG_HOST", + "VITE_POSTHOG_KEY", "VITE_SENTRY_DSN", "VITE_SENTRY_ENVIRONMENT", - "VITE_SENTRY_SEND_DEFAULT_PII", - "VITE_SENTRY_TRACES_SAMPLE_RATE", "VITE_SENTRY_PROFILES_SAMPLE_RATE", - "VITE_SENTRY_REPLAYS_SESSION_SAMPLE_RATE", "VITE_SENTRY_REPLAYS_ON_ERROR_SAMPLE_RATE", - "VITE_APP_VERSION" + "VITE_SENTRY_REPLAYS_SESSION_SAMPLE_RATE", + "VITE_SENTRY_SEND_DEFAULT_PII", + "VITE_SENTRY_TRACES_SAMPLE_RATE", + "VITE_SESSION_RECORDER_KEY", + "VITE_SPACE_BASE_PATH", + "VITE_SPACE_BASE_URL", + "VITE_SUPPORT_EMAIL", + "VITE_WEB_BASE_PATH", + "VITE_WEB_BASE_URL", + "VITE_WEBSITE_URL" ], - "globalDependencies": ["pnpm-lock.yaml", "pnpm-workspace.yaml", ".npmrc"], + "remoteCache": { + "enabled": false + }, "tasks": { "build": { "dependsOn": ["^build"], - "outputs": ["dist/**", "build/**"] + "inputs": ["$TURBO_DEFAULT$", ".env*"], + "outputs": ["dist/**", "build/**", ".react-router/**"] }, "build-storybook": { "dependsOn": ["^build"], "outputs": ["storybook-static/**"] }, - "dev": { + "check": { + "dependsOn": ["check:format", "check:lint", "check:types"] + }, + "check:format": { + "inputs": ["$TURBO_DEFAULT$"], + "outputs": [] + }, + "check:lint": { "dependsOn": ["^build"], - "cache": false, - "persistent": true + "inputs": ["$TURBO_DEFAULT$", "!**/*.md"], + "outputs": [] }, "check:types": { "dependsOn": ["^build"], + "inputs": ["$TURBO_DEFAULT$", "!**/*.md"], + "outputs": [] + }, + "clean": { "cache": false }, - "lint": { + "dev": { "cache": false, - "inputs": ["**/*.{js,ts,tsx,mjs,jsx}", "!**/node_modules/**", "!**/build/**", "!**/dist/**"] + "dependsOn": ["^build"], + "persistent": true }, - "check:lint": { - "dependsOn": ["lint"], + "fix": { "cache": false, - "inputs": ["**/*.{js,ts,tsx,mjs,jsx}", "!**/build/**", "!**/dist/**"] - }, - "check:format": { - "cache": false + "dependsOn": ["fix:format", "fix:lint"] }, - "check": { - "dependsOn": ["check:format", "check:lint", "check:types"], + "fix:format": { "cache": false }, "fix:lint": { "cache": false }, - "fix:format": { - "cache": false - }, - "fix": { - "dependsOn": ["fix:format", "fix:lint"], - "cache": false + "start": { + "cache": false, + "persistent": true }, "test": { "dependsOn": ["^build"], "outputs": [] - }, - "start": { - "cache": false - }, - "clean": { - "cache": false } } } From e20f686398d20c7e741871ebe7a510cc96cd88bb Mon Sep 17 00:00:00 2001 From: "M. Palanikannan" <73993394+Palanikannan1437@users.noreply.github.com> Date: Wed, 10 Dec 2025 19:02:52 +0530 Subject: [PATCH 015/266] [WIKI-844] fix: realtime sync post vite migration with title editor sync and indexed db access (#8294) * fix: robust way to handle socket connection and read from indexeddb cache when reqd * fix: realtime sync working with failure handling * fix: title editor added * merge preview into fix/realtime-sync * check * page renderer props * lint errors * lint errors * lint errors * sanitize html * sanitize html * format fix * fix lint --- apps/live/src/extensions/database.ts | 17 +- apps/live/src/extensions/title-sync.ts | 175 + .../src/extensions/title-update/debounce.ts | 277 ++ .../title-update/title-update-manager.ts | 90 + .../extensions/title-update/title-utils.ts | 11 + .../[projectId]/pages/(detail)/header.tsx | 2 + .../pages/editor/content-limit-banner.tsx | 35 + .../components/pages/editor/editor-body.tsx | 77 +- .../components/pages/editor/page-root.tsx | 53 +- .../components/pages/header/syncing-badge.tsx | 72 + apps/web/core/hooks/use-page-fallback.ts | 45 +- apps/web/core/store/pages/base-page.ts | 10 + packages/editor/package.json | 3 + .../editors/document/collaborative-editor.tsx | 112 +- .../editors/document/page-renderer.tsx | 81 +- .../components/editors/editor-container.tsx | 86 +- .../components/editors/editor-content.tsx | 13 +- .../core/contexts/collaboration-context.tsx | 32 + packages/editor/src/core/contexts/index.ts | 1 + .../src/core/extensions/title-extension.ts | 14 + packages/editor/src/core/helpers/yjs-utils.ts | 49 +- .../core/hooks/use-collaborative-editor.ts | 224 +- .../src/core/hooks/use-editor-navigation.ts | 169 + .../editor/src/core/hooks/use-title-editor.ts | 91 + .../editor/src/core/hooks/use-yjs-setup.ts | 369 ++ packages/editor/src/core/plugins/highlight.ts | 92 + .../editor/src/core/types/collaboration.ts | 37 +- packages/editor/src/core/types/editor.ts | 17 +- packages/editor/src/core/types/hook.ts | 5 +- packages/editor/src/styles/index.css | 1 + packages/editor/src/styles/title-editor.css | 49 + pnpm-lock.yaml | 3727 +++++++++-------- 32 files changed, 4054 insertions(+), 1982 deletions(-) create mode 100644 apps/live/src/extensions/title-sync.ts create mode 100644 apps/live/src/extensions/title-update/debounce.ts create mode 100644 apps/live/src/extensions/title-update/title-update-manager.ts create mode 100644 apps/live/src/extensions/title-update/title-utils.ts create mode 100644 apps/web/core/components/pages/editor/content-limit-banner.tsx create mode 100644 apps/web/core/components/pages/header/syncing-badge.tsx create mode 100644 packages/editor/src/core/contexts/collaboration-context.tsx create mode 100644 packages/editor/src/core/contexts/index.ts create mode 100644 packages/editor/src/core/extensions/title-extension.ts create mode 100644 packages/editor/src/core/hooks/use-editor-navigation.ts create mode 100644 packages/editor/src/core/hooks/use-title-editor.ts create mode 100644 packages/editor/src/core/hooks/use-yjs-setup.ts create mode 100644 packages/editor/src/core/plugins/highlight.ts create mode 100644 packages/editor/src/styles/title-editor.css diff --git a/apps/live/src/extensions/database.ts b/apps/live/src/extensions/database.ts index be7a3139c6f..4262ba1f0c3 100644 --- a/apps/live/src/extensions/database.ts +++ b/apps/live/src/extensions/database.ts @@ -27,6 +27,17 @@ const fetchDocument = async ({ context, documentName: pageId, instance }: FetchP const pageDetails = await service.fetchDetails(pageId); const convertedBinaryData = getBinaryDataFromDocumentEditorHTMLString(pageDetails.description_html ?? "

"); if (convertedBinaryData) { + // save the converted binary data back to the database + const { contentBinaryEncoded, contentHTML, contentJSON } = getAllDocumentFormatsFromDocumentEditorBinaryData( + convertedBinaryData, + true + ); + const payload = { + description_binary: contentBinaryEncoded, + description_html: contentHTML, + description: contentJSON, + }; + await service.updateDescriptionBinary(pageId, payload); return convertedBinaryData; } } @@ -52,8 +63,10 @@ const storeDocument = async ({ try { const service = getPageService(context.documentType, context); // convert binary data to all formats - const { contentBinaryEncoded, contentHTML, contentJSON } = - getAllDocumentFormatsFromDocumentEditorBinaryData(pageBinaryData); + const { contentBinaryEncoded, contentHTML, contentJSON } = getAllDocumentFormatsFromDocumentEditorBinaryData( + pageBinaryData, + true + ); // create payload const payload = { description_binary: contentBinaryEncoded, diff --git a/apps/live/src/extensions/title-sync.ts b/apps/live/src/extensions/title-sync.ts new file mode 100644 index 00000000000..6e760b5f97c --- /dev/null +++ b/apps/live/src/extensions/title-sync.ts @@ -0,0 +1,175 @@ +// hocuspocus +import type { Extension, Hocuspocus, Document } from "@hocuspocus/server"; +import { TiptapTransformer } from "@hocuspocus/transformer"; +import type * as Y from "yjs"; +// editor extensions +import { TITLE_EDITOR_EXTENSIONS, createRealtimeEvent } from "@plane/editor"; +import { logger } from "@plane/logger"; +import { AppError } from "@/lib/errors"; +// helpers +import { getPageService } from "@/services/page/handler"; +import type { HocusPocusServerContext, OnLoadDocumentPayloadWithContext } from "@/types"; +import { generateTitleProsemirrorJson } from "@/utils"; +import { broadcastMessageToPage } from "@/utils/broadcast-message"; +import { TitleUpdateManager } from "./title-update/title-update-manager"; +import { extractTextFromHTML } from "./title-update/title-utils"; + +/** + * Hocuspocus extension for synchronizing document titles + */ +export class TitleSyncExtension implements Extension { + // Maps document names to their observers and update managers + private titleObservers: Map[]) => void> = new Map(); + private titleUpdateManagers: Map = new Map(); + // Store minimal data needed for each document's title observer (prevents closure memory leaks) + private titleObserverData: Map< + string, + { + parentId?: string | null; + userId: string; + workspaceSlug: string | null; + instance: Hocuspocus; + } + > = new Map(); + + /** + * Handle document loading - migrate old titles if needed + */ + async onLoadDocument({ context, document, documentName }: OnLoadDocumentPayloadWithContext) { + try { + // initially for on demand migration of old titles to a new title field + // in the yjs binary + if (document.isEmpty("title")) { + const service = getPageService(context.documentType, context); + // const title = await service.fe + const title = (await service.fetchDetails?.(documentName)).name; + if (title == null) return; + const titleField = TiptapTransformer.toYdoc( + generateTitleProsemirrorJson(title), + "title", + // editor + TITLE_EDITOR_EXTENSIONS as any + ); + document.merge(titleField); + } + } catch (error) { + const appError = new AppError(error, { + context: { operation: "onLoadDocument", documentName }, + }); + logger.error("Error loading document title", appError); + } + } + /** + * Set up title synchronization for a document after it's loaded + */ + async afterLoadDocument({ + document, + documentName, + context, + instance, + }: { + document: Document; + documentName: string; + context: HocusPocusServerContext; + instance: Hocuspocus; + }) { + // Create a title update manager for this document + const updateManager = new TitleUpdateManager(documentName, context); + + // Store the manager + this.titleUpdateManagers.set(documentName, updateManager); + + // Store minimal data needed for the observer (prevents closure memory leak) + this.titleObserverData.set(documentName, { + userId: context.userId, + workspaceSlug: context.workspaceSlug, + instance: instance, + }); + + // Create observer using bound method to avoid closure capturing heavy objects + const titleObserver = this.handleTitleChange.bind(this, documentName); + + // Observe the title field + document.getXmlFragment("title").observeDeep(titleObserver); + this.titleObservers.set(documentName, titleObserver); + } + + /** + * Handle title changes for a document + * This is a separate method to avoid closure memory leaks + */ + private handleTitleChange(documentName: string, events: Y.YEvent[]) { + let title = ""; + events.forEach((event) => { + title = extractTextFromHTML(event.currentTarget.toJSON() as string); + }); + + // Get the manager for this document + const manager = this.titleUpdateManagers.get(documentName); + + // Get the stored data for this document + const data = this.titleObserverData.get(documentName); + + // Broadcast to parent page if it exists + if (data?.parentId && data.workspaceSlug && data.instance) { + const event = createRealtimeEvent({ + user_id: data.userId, + workspace_slug: data.workspaceSlug, + action: "property_updated", + page_id: documentName, + data: { name: title }, + descendants_ids: [], + }); + + // Use the instance from stored data (guaranteed to be set) + broadcastMessageToPage(data.instance, data.parentId, event); + } + + // Schedule the title update + if (manager) { + manager.scheduleUpdate(title); + } + } + + /** + * Force save title before unloading the document + */ + async beforeUnloadDocument({ documentName }: { documentName: string }) { + const updateManager = this.titleUpdateManagers.get(documentName); + if (updateManager) { + // Force immediate save and wait for it to complete + await updateManager.forceSave(); + // Clean up the manager + this.titleUpdateManagers.delete(documentName); + } + } + + /** + * Remove observers after document unload + */ + async afterUnloadDocument({ documentName, document }: { documentName: string; document?: Document }) { + // Clean up observer when document is unloaded + const observer = this.titleObservers.get(documentName); + if (observer) { + // unregister observer from Y.js document to prevent memory leak + if (document) { + try { + document.getXmlFragment("title").unobserveDeep(observer); + } catch (error) { + logger.error("Failed to unobserve title field", new AppError(error, { context: { documentName } })); + } + } + this.titleObservers.delete(documentName); + } + + // Clean up the observer data map to prevent memory leak + this.titleObserverData.delete(documentName); + + // Ensure manager is cleaned up if beforeUnloadDocument somehow didn't run + if (this.titleUpdateManagers.has(documentName)) { + const manager = this.titleUpdateManagers.get(documentName)!; + manager.cancel(); + this.titleUpdateManagers.delete(documentName); + } + } +} diff --git a/apps/live/src/extensions/title-update/debounce.ts b/apps/live/src/extensions/title-update/debounce.ts new file mode 100644 index 00000000000..e9adeb4a4c4 --- /dev/null +++ b/apps/live/src/extensions/title-update/debounce.ts @@ -0,0 +1,277 @@ +import { logger } from "@plane/logger"; + +/** + * DebounceState - Tracks the state of a debounced function + */ +export interface DebounceState { + lastArgs: any[] | null; + timerId: ReturnType | null; + lastCallTime: number | undefined; + lastExecutionTime: number; + inProgress: boolean; + abortController: AbortController | null; +} + +/** + * Creates a new DebounceState object + */ +export const createDebounceState = (): DebounceState => ({ + lastArgs: null, + timerId: null, + lastCallTime: undefined, + lastExecutionTime: 0, + inProgress: false, + abortController: null, +}); + +/** + * DebounceOptions - Configuration options for debounce + */ +export interface DebounceOptions { + /** The wait time in milliseconds */ + wait: number; + + /** Optional logging prefix for debug messages */ + logPrefix?: string; +} + +/** + * Enhanced debounce manager with abort support + * Manages the state and timing of debounced function calls + */ +export class DebounceManager { + private state: DebounceState; + private wait: number; + private logPrefix: string; + + /** + * Creates a new DebounceManager + * @param options Debounce configuration options + */ + constructor(options: DebounceOptions) { + this.state = createDebounceState(); + this.wait = options.wait; + this.logPrefix = options.logPrefix || ""; + } + + /** + * Schedule a debounced function call + * @param func The function to call + * @param args The arguments to pass to the function + */ + schedule(func: (...args: any[]) => Promise, ...args: any[]): void { + // Always update the last arguments + this.state.lastArgs = args; + + const time = Date.now(); + this.state.lastCallTime = time; + + // If an operation is in progress, just store the new args and start the timer + if (this.state.inProgress) { + // Always restart the timer for the new call, even if an operation is in progress + if (this.state.timerId) { + clearTimeout(this.state.timerId); + } + + this.state.timerId = setTimeout(() => { + this.timerExpired(func); + }, this.wait); + return; + } + + // If already scheduled, update the args and restart the timer + if (this.state.timerId) { + clearTimeout(this.state.timerId); + this.state.timerId = setTimeout(() => { + this.timerExpired(func); + }, this.wait); + return; + } + + // Start the timer for the trailing edge execution + this.state.timerId = setTimeout(() => { + this.timerExpired(func); + }, this.wait); + } + + /** + * Called when the timer expires + */ + private timerExpired(func: (...args: any[]) => Promise): void { + const time = Date.now(); + + // Check if this timer expiration represents the end of the debounce period + if (this.shouldInvoke(time)) { + // Execute the function + this.executeFunction(func, time); + return; + } + + // Otherwise restart the timer + this.state.timerId = setTimeout(() => { + this.timerExpired(func); + }, this.remainingWait(time)); + } + + /** + * Execute the debounced function + */ + private executeFunction(func: (...args: any[]) => Promise, time: number): void { + this.state.timerId = null; + this.state.lastExecutionTime = time; + + // Execute the function asynchronously + this.performFunction(func).catch((error) => { + logger.error(`${this.logPrefix}: Error in execution:`, error); + }); + } + + /** + * Perform the actual function call, handling any in-progress operations + */ + private async performFunction(func: (...args: any[]) => Promise): Promise { + const args = this.state.lastArgs; + if (!args) return; + + // Store the args we're about to use + const currentArgs = [...args]; + + // If another operation is in progress, abort it + await this.abortOngoingOperation(); + + // Mark that we're starting a new operation + this.state.inProgress = true; + this.state.abortController = new AbortController(); + + try { + // Add the abort signal to the arguments if the function can use it + const execArgs = [...currentArgs]; + execArgs.push(this.state.abortController.signal); + + await func(...execArgs); + + // Only clear lastArgs if they haven't been changed during this operation + if (this.state.lastArgs && this.arraysEqual(this.state.lastArgs, currentArgs)) { + this.state.lastArgs = null; + + // Clear any timer as we've successfully processed the latest args + if (this.state.timerId) { + clearTimeout(this.state.timerId); + this.state.timerId = null; + } + } else if (this.state.lastArgs) { + // If lastArgs have changed during this operation, the timer should already be running + // but let's make sure it is + if (!this.state.timerId) { + this.state.timerId = setTimeout(() => { + this.timerExpired(func); + }, this.wait); + } + } + } catch (error) { + if (error instanceof Error && error.name === "AbortError") { + // Nothing to do here, the new operation will be triggered by the timer expiration + } else { + logger.error(`${this.logPrefix}: Error during operation:`, error); + + // On error (not abort), make sure we have a timer running to retry + if (!this.state.timerId && this.state.lastArgs) { + this.state.timerId = setTimeout(() => { + this.timerExpired(func); + }, this.wait); + } + } + } finally { + this.state.inProgress = false; + this.state.abortController = null; + } + } + + /** + * Abort any ongoing operation + */ + private async abortOngoingOperation(): Promise { + if (this.state.inProgress && this.state.abortController) { + this.state.abortController.abort(); + + // Small delay to ensure the abort has had time to propagate + await new Promise((resolve) => setTimeout(resolve, 20)); + + // Double-check that state has been reset, force it if not + if (this.state.inProgress || this.state.abortController) { + this.state.inProgress = false; + this.state.abortController = null; + } + } + } + + /** + * Determine if we should invoke the function now + */ + private shouldInvoke(time: number): boolean { + // Either this is the first call, or we've waited long enough since the last call + return this.state.lastCallTime === undefined || time - this.state.lastCallTime >= this.wait; + } + + /** + * Calculate how much longer we should wait + */ + private remainingWait(time: number): number { + const timeSinceLastCall = time - (this.state.lastCallTime || 0); + return Math.max(0, this.wait - timeSinceLastCall); + } + + /** + * Force immediate execution + */ + async flush(func: (...args: any[]) => Promise): Promise { + // Clear any pending timeout + if (this.state.timerId) { + clearTimeout(this.state.timerId); + this.state.timerId = null; + } + + // Reset timing state + this.state.lastCallTime = undefined; + + // Perform the function immediately + if (this.state.lastArgs) { + await this.performFunction(func); + } + } + + /** + * Cancel any pending operations without executing + */ + cancel(): void { + // Clear any pending timeout + if (this.state.timerId) { + clearTimeout(this.state.timerId); + this.state.timerId = null; + } + + // Reset timing state + this.state.lastCallTime = undefined; + + // Abort any in-progress operation + if (this.state.inProgress && this.state.abortController) { + this.state.abortController.abort(); + this.state.inProgress = false; + this.state.abortController = null; + } + + // Clear args + this.state.lastArgs = null; + } + + /** + * Compare two arrays for equality + */ + private arraysEqual(a: any[], b: any[]): boolean { + if (a.length !== b.length) return false; + for (let i = 0; i < a.length; i++) { + if (a[i] !== b[i]) return false; + } + return true; + } +} diff --git a/apps/live/src/extensions/title-update/title-update-manager.ts b/apps/live/src/extensions/title-update/title-update-manager.ts new file mode 100644 index 00000000000..8469ad4eb0f --- /dev/null +++ b/apps/live/src/extensions/title-update/title-update-manager.ts @@ -0,0 +1,90 @@ +import { logger } from "@plane/logger"; +import { AppError } from "@/lib/errors"; +import { getPageService } from "@/services/page/handler"; +import type { HocusPocusServerContext } from "@/types"; +import { DebounceManager } from "./debounce"; + +/** + * Manages title update operations for a single document + * Handles debouncing, aborting, and force saving title updates + */ +export class TitleUpdateManager { + private documentName: string; + private context: HocusPocusServerContext; + private debounceManager: DebounceManager; + private lastTitle: string | null = null; + + /** + * Create a new TitleUpdateManager instance + */ + constructor(documentName: string, context: HocusPocusServerContext, wait: number = 5000) { + this.documentName = documentName; + this.context = context; + + // Set up debounce manager with logging + this.debounceManager = new DebounceManager({ + wait, + logPrefix: `TitleManager[${documentName.substring(0, 8)}]`, + }); + } + + /** + * Schedule a debounced title update + */ + scheduleUpdate(title: string): void { + // Store the latest title + this.lastTitle = title; + + // Schedule the update with the debounce manager + this.debounceManager.schedule(this.updateTitle.bind(this), title); + } + + /** + * Update the title - will be called by the debounce manager + */ + private async updateTitle(title: string, signal?: AbortSignal): Promise { + const service = getPageService(this.context.documentType, this.context); + if (!service.updatePageProperties) { + logger.warn(`No updateTitle method found for document ${this.documentName}`); + return; + } + + try { + await service.updatePageProperties(this.documentName, { + data: { name: title }, + abortSignal: signal, + }); + + // Clear last title only if it matches what we just updated + if (this.lastTitle === title) { + this.lastTitle = null; + } + } catch (error) { + const appError = new AppError(error, { + context: { operation: "updateTitle", documentName: this.documentName }, + }); + logger.error("Error updating title", appError); + } + } + + /** + * Force save the current title immediately + */ + async forceSave(): Promise { + // Ensure we have the current title + if (!this.lastTitle) { + return; + } + + // Use the debounce manager to flush the operation + await this.debounceManager.flush(this.updateTitle.bind(this)); + } + + /** + * Cancel any pending updates + */ + cancel(): void { + this.debounceManager.cancel(); + this.lastTitle = null; + } +} diff --git a/apps/live/src/extensions/title-update/title-utils.ts b/apps/live/src/extensions/title-update/title-utils.ts new file mode 100644 index 00000000000..4113afb33f2 --- /dev/null +++ b/apps/live/src/extensions/title-update/title-utils.ts @@ -0,0 +1,11 @@ +import { sanitizeHTML } from "@plane/utils"; + +/** + * Utility function to extract text from HTML content + */ +export const extractTextFromHTML = (html: string): string => { + // Use sanitizeHTML to safely extract text and remove all HTML tags + // This is more secure than regex as it handles edge cases and prevents injection + // Note: sanitizeHTML trims whitespace, which is acceptable for title extraction + return sanitizeHTML(html) || ""; +}; diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/pages/(detail)/header.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/pages/(detail)/header.tsx index 3cc1746384f..43d32ee259b 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/pages/(detail)/header.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/pages/(detail)/header.tsx @@ -10,6 +10,7 @@ import { BreadcrumbLink } from "@/components/common/breadcrumb-link"; import { PageAccessIcon } from "@/components/common/page-access-icon"; import { SwitcherIcon, SwitcherLabel } from "@/components/common/switcher-label"; import { PageHeaderActions } from "@/components/pages/header/actions"; +import { PageSyncingBadge } from "@/components/pages/header/syncing-badge"; // hooks import { useProject } from "@/hooks/store/use-project"; import { useAppRouter } from "@/hooks/use-app-router"; @@ -95,6 +96,7 @@ export const PageDetailsHeader = observer(function PageDetailsHeader() { + diff --git a/apps/web/core/components/pages/editor/content-limit-banner.tsx b/apps/web/core/components/pages/editor/content-limit-banner.tsx new file mode 100644 index 00000000000..cd16641159c --- /dev/null +++ b/apps/web/core/components/pages/editor/content-limit-banner.tsx @@ -0,0 +1,35 @@ +import { TriangleAlert } from "lucide-react"; +import { cn } from "@plane/utils"; + +type Props = { + className?: string; + onDismiss?: () => void; +}; + +export const ContentLimitBanner: React.FC = ({ className, onDismiss }) => ( +
+
+ + + + + Content limit reached and live sync is off. Create a new page or use nested pages to continue syncing. + +
+ {onDismiss && ( + + )} +
+); diff --git a/apps/web/core/components/pages/editor/editor-body.tsx b/apps/web/core/components/pages/editor/editor-body.tsx index cd3ce6535cb..e7f6309dabd 100644 --- a/apps/web/core/components/pages/editor/editor-body.tsx +++ b/apps/web/core/components/pages/editor/editor-body.tsx @@ -1,11 +1,12 @@ -import type { Dispatch, SetStateAction } from "react"; -import { useCallback, useMemo } from "react"; +import { useCallback, useEffect, useMemo, useRef } from "react"; import { observer } from "mobx-react"; // plane imports import { LIVE_BASE_PATH, LIVE_BASE_URL } from "@plane/constants"; import { CollaborativeDocumentEditorWithRef } from "@plane/editor"; import type { + CollaborationState, EditorRefApi, + EditorTitleRefApi, TAIMenuProps, TDisplayConfig, TFileHandler, @@ -26,6 +27,8 @@ import { useUser } from "@/hooks/store/user"; import { usePageFilters } from "@/hooks/use-page-filters"; import { useParseEditorContent } from "@/hooks/use-parse-editor-content"; // plane web imports +import type { TCustomEventHandlers } from "@/hooks/use-realtime-page-events"; +import { useRealtimePageEvents } from "@/hooks/use-realtime-page-events"; import { EditorAIMenu } from "@/plane-web/components/pages"; import type { TExtendedEditorExtensionsConfig } from "@/plane-web/hooks/pages"; import type { EPageStoreType } from "@/plane-web/hooks/store"; @@ -51,7 +54,6 @@ type Props = { config: TEditorBodyConfig; editorReady: boolean; editorForwardRef: React.RefObject; - handleConnectionStatus: Dispatch>; handleEditorReady: (status: boolean) => void; handleOpenNavigationPane: () => void; handlers: TEditorBodyHandlers; @@ -61,14 +63,16 @@ type Props = { projectId?: string; workspaceSlug: string; storeType: EPageStoreType; + customRealtimeEventHandlers?: TCustomEventHandlers; extendedEditorProps: TExtendedEditorExtensionsConfig; + isFetchingFallbackBinary?: boolean; + onCollaborationStateChange?: (state: CollaborationState) => void; }; export const PageEditorBody = observer(function PageEditorBody(props: Props) { const { config, editorForwardRef, - handleConnectionStatus, handleEditorReady, handleOpenNavigationPane, handlers, @@ -79,7 +83,11 @@ export const PageEditorBody = observer(function PageEditorBody(props: Props) { projectId, workspaceSlug, extendedEditorProps, + isFetchingFallbackBinary, + onCollaborationStateChange, } = props; + // refs + const titleEditorRef = useRef(null); // store hooks const { data: currentUser } = useUser(); const { getWorkspaceBySlug } = useWorkspace(); @@ -87,10 +95,9 @@ export const PageEditorBody = observer(function PageEditorBody(props: Props) { // derived values const { id: pageId, - name: pageTitle, isContentEditable, - updateTitle, editor: { editorRef, updateAssetsList }, + setSyncingStatus, } = page; const workspaceId = getWorkspaceBySlug(workspaceSlug)?.id ?? ""; // use editor mention @@ -123,6 +130,24 @@ export const PageEditorBody = observer(function PageEditorBody(props: Props) { [fontSize, fontStyle, isFullWidth] ); + // Use the new hook to handle page events + const { updatePageProperties } = useRealtimePageEvents({ + storeType, + page, + getUserDetails, + handlers, + }); + + // Set syncing status when page changes and reset collaboration state + useEffect(() => { + setSyncingStatus("syncing"); + onCollaborationStateChange?.({ + stage: { kind: "connecting" }, + isServerSynced: false, + isServerDisconnected: false, + }); + }, [pageId, setSyncingStatus, onCollaborationStateChange]); + const getAIMenu = useCallback( ({ isOpen, onClose }: TAIMenuProps) => ( { - handleConnectionStatus(false); - }, [handleConnectionStatus]); - - const handleServerError = useCallback(() => { - handleConnectionStatus(true); - }, [handleConnectionStatus]); - const serverHandler: TServerHandler = useMemo( () => ({ - onConnect: handleServerConnect, - onServerError: handleServerError, + onStateChange: (state) => { + // Pass full state to parent + onCollaborationStateChange?.(state); + + // Map collaboration stage to UI syncing status + // Stage → UI mapping: disconnected → error | synced → synced | all others → syncing + if (state.stage.kind === "disconnected") { + setSyncingStatus("error"); + } else if (state.stage.kind === "synced") { + setSyncingStatus("synced"); + } else { + // initial, connecting, awaiting-sync, reconnecting → show as syncing + setSyncingStatus("syncing"); + } + }, }), - [handleServerConnect, handleServerError] + [setSyncingStatus, onCollaborationStateChange] ); const realtimeConfig: TRealtimeConfig | undefined = useMemo(() => { @@ -194,7 +224,9 @@ export const PageEditorBody = observer(function PageEditorBody(props: Props) { } ); - if (pageId === undefined || !realtimeConfig) return ; + const isPageLoading = pageId === undefined || !realtimeConfig; + + if (isPageLoading) return ; return (
-
, getMentionedEntityDetails: (id: string) => ({ display_name: getUserDetails(id)?.display_name ?? "" }), }} + updatePageProperties={updatePageProperties} realtimeConfig={realtimeConfig} serverHandler={serverHandler} user={userConfig} @@ -261,6 +289,7 @@ export const PageEditorBody = observer(function PageEditorBody(props: Props) { }} onAssetChange={updateAssetsList} extendedEditorProps={extendedEditorProps} + isFetchingFallbackBinary={isFetchingFallbackBinary} />
diff --git a/apps/web/core/components/pages/editor/page-root.tsx b/apps/web/core/components/pages/editor/page-root.tsx index aa4c9a73dd7..d81273f2c1c 100644 --- a/apps/web/core/components/pages/editor/page-root.tsx +++ b/apps/web/core/components/pages/editor/page-root.tsx @@ -1,12 +1,12 @@ import { useCallback, useEffect, useRef, useState } from "react"; import { observer } from "mobx-react"; // plane imports -import type { EditorRefApi } from "@plane/editor"; +import type { CollaborationState, EditorRefApi } from "@plane/editor"; import type { TDocumentPayload, TPage, TPageVersion, TWebhookConnectionQueryParams } from "@plane/types"; // hooks -import { useAppRouter } from "@/hooks/use-app-router"; import { usePageFallback } from "@/hooks/use-page-fallback"; // plane web import +import type { PageUpdateHandler, TCustomEventHandlers } from "@/hooks/use-realtime-page-events"; import { PageModals } from "@/plane-web/components/pages"; import { usePagesPaneExtensions, useExtendedEditorProps } from "@/plane-web/hooks/pages"; import type { EPageStoreType } from "@/plane-web/hooks/store"; @@ -16,6 +16,7 @@ import type { TPageInstance } from "@/store/pages/base-page"; import { PageNavigationPaneRoot } from "../navigation-pane"; import { PageVersionsOverlay } from "../version"; import { PagesVersionEditor } from "../version/editor"; +import { ContentLimitBanner } from "./content-limit-banner"; import { PageEditorBody } from "./editor-body"; import type { TEditorBodyConfig, TEditorBodyHandlers } from "./editor-body"; import { PageEditorToolbarRoot } from "./toolbar"; @@ -23,7 +24,7 @@ import { PageEditorToolbarRoot } from "./toolbar"; export type TPageRootHandlers = { create: (payload: Partial) => Promise | undefined>; fetchAllVersions: (pageId: string) => Promise; - fetchDescriptionBinary: () => Promise; + fetchDescriptionBinary: () => Promise; fetchVersionDetails: (pageId: string, versionId: string) => Promise; restoreVersion: (pageId: string, versionId: string) => Promise; updateDescription: (document: TDocumentPayload) => Promise; @@ -39,27 +40,36 @@ type TPageRootProps = { webhookConnectionParams: TWebhookConnectionQueryParams; projectId?: string; workspaceSlug: string; + customRealtimeEventHandlers?: TCustomEventHandlers; }; -export const PageRoot = observer(function PageRoot(props: TPageRootProps) { - const { config, handlers, page, projectId, storeType, webhookConnectionParams, workspaceSlug } = props; +export const PageRoot = observer((props: TPageRootProps) => { + const { + config, + handlers, + page, + projectId, + storeType, + webhookConnectionParams, + workspaceSlug, + customRealtimeEventHandlers, + } = props; // states const [editorReady, setEditorReady] = useState(false); - const [hasConnectionFailed, setHasConnectionFailed] = useState(false); + const [collaborationState, setCollaborationState] = useState(null); + const [showContentTooLargeBanner, setShowContentTooLargeBanner] = useState(false); // refs const editorRef = useRef(null); - // router - const router = useAppRouter(); // derived values const { isContentEditable, editor: { setEditorRef }, } = page; // page fallback - usePageFallback({ + const { isFetchingFallbackBinary } = usePageFallback({ editorRef, fetchPageDescription: handlers.fetchDescriptionBinary, - hasConnectionFailed, + collaborationState, updatePageDescription: handlers.updateDescription, }); @@ -91,6 +101,24 @@ export const PageRoot = observer(function PageRoot(props: TPageRootProps) { editorRef, }); + // Type-safe error handler for content too large errors + const errorHandler: PageUpdateHandler<"error"> = (params) => { + const { data } = params; + + // Check if it's content too large error + if (data.error_code === "content_too_large") { + setShowContentTooLargeBanner(true); + } + + // Call original error handler if exists + customRealtimeEventHandlers?.error?.(params); + }; + + const mergedCustomEventHandlers: TCustomEventHandlers = { + ...customRealtimeEventHandlers, + error: errorHandler, + }; + // Get extended editor extensions configuration const extendedEditorProps = useExtendedEditorProps({ workspaceSlug, @@ -134,11 +162,12 @@ export const PageRoot = observer(function PageRoot(props: TPageRootProps) { isNavigationPaneOpen={isNavigationPaneOpen} page={page} /> + {showContentTooLargeBanner && } { + const [prevSyncStatus, setPrevSyncStatus] = useState<"syncing" | "synced" | "error" | null>(null); + const [isVisible, setIsVisible] = useState(syncStatus !== "synced"); + + useEffect(() => { + // Only handle transitions when there's a change + if (prevSyncStatus !== syncStatus) { + if (syncStatus === "synced") { + // Delay hiding to allow exit animation to complete + setTimeout(() => { + setIsVisible(false); + }, 300); // match animation duration + } else { + setIsVisible(true); + } + setPrevSyncStatus(syncStatus); + } + }, [syncStatus, prevSyncStatus]); + + if (!isVisible || syncStatus === "synced") return null; + + const badgeContent = { + syncing: { + label: "Syncing...", + tooltipHeading: "Syncing...", + tooltipContent: "Your changes are being synced with the server. You can continue making changes.", + bgColor: "bg-custom-primary-100/20", + textColor: "text-custom-primary-100", + pulseColor: "bg-custom-primary-100", + pulseBgColor: "bg-custom-primary-100/30", + icon: null, + }, + error: { + label: "Connection lost", + tooltipHeading: "Connection lost", + tooltipContent: + "We're having trouble connecting to the websocket server. Your changes will be synced and saved every 10 seconds.", + bgColor: "bg-red-500/20", + textColor: "text-red-500", + icon: , + }, + }; + + // This way we guarantee badgeContent is defined + const content = badgeContent[syncStatus]; + + return ( + +
+ {syncStatus === "syncing" ? ( +
+
+
+
+ ) : ( + content.icon + )} + {content.label} +
+ + ); +}; diff --git a/apps/web/core/hooks/use-page-fallback.ts b/apps/web/core/hooks/use-page-fallback.ts index 4551031d1d0..01475293f00 100644 --- a/apps/web/core/hooks/use-page-fallback.ts +++ b/apps/web/core/hooks/use-page-fallback.ts @@ -1,7 +1,9 @@ -import { useCallback, useEffect } from "react"; +import { useCallback, useEffect, useRef, useState } from "react"; +import type { EditorRefApi, CollaborationState } from "@plane/editor"; // plane editor import { convertBinaryDataToBase64String, getBinaryDataFromDocumentEditorHTMLString } from "@plane/editor"; -import type { EditorRefApi } from "@plane/editor"; +// plane propel +import { setToast, TOAST_TYPE } from "@plane/propel/toast"; // plane types import type { TDocumentPayload } from "@plane/types"; // hooks @@ -10,19 +12,38 @@ import useAutoSave from "@/hooks/use-auto-save"; type TArgs = { editorRef: React.RefObject; fetchPageDescription: () => Promise; - hasConnectionFailed: boolean; + collaborationState: CollaborationState | null; updatePageDescription: (data: TDocumentPayload) => Promise; }; export const usePageFallback = (args: TArgs) => { - const { editorRef, fetchPageDescription, hasConnectionFailed, updatePageDescription } = args; + const { editorRef, fetchPageDescription, collaborationState, updatePageDescription } = args; + const hasShownFallbackToast = useRef(false); + + const [isFetchingFallbackBinary, setIsFetchingFallbackBinary] = useState(false); + + // Derive connection failure from collaboration state + const hasConnectionFailed = collaborationState?.stage.kind === "disconnected"; const handleUpdateDescription = useCallback(async () => { if (!hasConnectionFailed) return; const editor = editorRef.current; if (!editor) return; + // Show toast notification when fallback mechanism kicks in (only once) + if (!hasShownFallbackToast.current) { + // setToast({ + // type: TOAST_TYPE.WARNING, + // title: "Connection lost", + // message: "Your changes are being saved using backup mechanism. ", + // }); + console.log("Connection lost"); + hasShownFallbackToast.current = true; + } + try { + setIsFetchingFallbackBinary(true); + const latestEncodedDescription = await fetchPageDescription(); let latestDecodedDescription: Uint8Array; if (latestEncodedDescription && latestEncodedDescription.byteLength > 0) { @@ -41,16 +62,28 @@ export const usePageFallback = (args: TArgs) => { description_html: html, description: json, }); - } catch (error) { - console.error("Error in updating description using fallback logic:", error); + } catch (error: any) { + console.error(error); + // setToast({ + // type: TOAST_TYPE.ERROR, + // title: "Error", + // message: `Failed to update description using backup mechanism, ${error?.message}`, + // }); + } finally { + setIsFetchingFallbackBinary(false); } }, [editorRef, fetchPageDescription, hasConnectionFailed, updatePageDescription]); useEffect(() => { if (hasConnectionFailed) { handleUpdateDescription(); + } else { + // Reset toast flag when connection is restored + hasShownFallbackToast.current = false; } }, [handleUpdateDescription, hasConnectionFailed]); useAutoSave(handleUpdateDescription); + + return { isFetchingFallbackBinary }; }; diff --git a/apps/web/core/store/pages/base-page.ts b/apps/web/core/store/pages/base-page.ts index b9381f248f8..bf8d53671d1 100644 --- a/apps/web/core/store/pages/base-page.ts +++ b/apps/web/core/store/pages/base-page.ts @@ -13,6 +13,7 @@ import { PageEditorInstance } from "./page-editor-info"; export type TBasePage = TPage & { // observables isSubmitting: TNameDescriptionLoader; + isSyncingWithServer: "syncing" | "synced" | "error"; // computed asJSON: TPage | undefined; isCurrentUserOwner: boolean; @@ -35,6 +36,7 @@ export type TBasePage = TPage & { removePageFromFavorites: () => Promise; duplicate: () => Promise; mutateProperties: (data: Partial, shouldUpdateName?: boolean) => void; + setSyncingStatus: (status: "syncing" | "synced" | "error") => void; // sub-store editor: PageEditorInstance; }; @@ -73,6 +75,7 @@ export type TPageInstance = TBasePage & export class BasePage extends ExtendedBasePage implements TBasePage { // loaders isSubmitting: TNameDescriptionLoader = "saved"; + isSyncingWithServer: "syncing" | "synced" | "error" = "syncing"; // page properties id: string | undefined; name: string | undefined; @@ -155,6 +158,7 @@ export class BasePage extends ExtendedBasePage implements TBasePage { created_at: observable.ref, updated_at: observable.ref, deleted_at: observable.ref, + isSyncingWithServer: observable.ref, // helpers oldName: observable.ref, setIsSubmitting: action, @@ -535,4 +539,10 @@ export class BasePage extends ExtendedBasePage implements TBasePage { set(this, key, value); }); }; + + setSyncingStatus = (status: "syncing" | "synced" | "error") => { + runInAction(() => { + this.isSyncingWithServer = status; + }); + }; } diff --git a/packages/editor/package.json b/packages/editor/package.json index 26faa7c78e6..f1e79781cbe 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -44,13 +44,16 @@ "@tiptap/extension-blockquote": "^2.22.3", "@tiptap/extension-character-count": "^2.22.3", "@tiptap/extension-collaboration": "^2.22.3", + "@tiptap/extension-document": "^2.22.3", "@tiptap/extension-emoji": "^2.22.3", + "@tiptap/extension-heading": "^2.22.3", "@tiptap/extension-image": "^2.22.3", "@tiptap/extension-list-item": "^2.22.3", "@tiptap/extension-mention": "^2.22.3", "@tiptap/extension-placeholder": "^2.22.3", "@tiptap/extension-task-item": "^2.22.3", "@tiptap/extension-task-list": "^2.22.3", + "@tiptap/extension-text": "^2.22.3", "@tiptap/extension-text-align": "^2.22.3", "@tiptap/extension-text-style": "^2.22.3", "@tiptap/extension-underline": "^2.22.3", diff --git a/packages/editor/src/core/components/editors/document/collaborative-editor.tsx b/packages/editor/src/core/components/editors/document/collaborative-editor.tsx index 6c0833bee55..bee6e610ac9 100644 --- a/packages/editor/src/core/components/editors/document/collaborative-editor.tsx +++ b/packages/editor/src/core/components/editors/document/collaborative-editor.tsx @@ -1,20 +1,21 @@ -import React from "react"; +import React, { useMemo } from "react"; // plane imports import { cn } from "@plane/utils"; // components import { PageRenderer } from "@/components/editors"; // constants import { DEFAULT_DISPLAY_CONFIG } from "@/constants/config"; +// contexts +import { CollaborationProvider, useCollaboration } from "@/contexts/collaboration-context"; // helpers import { getEditorClassNames } from "@/helpers/common"; // hooks import { useCollaborativeEditor } from "@/hooks/use-collaborative-editor"; -// constants -import { DocumentEditorSideEffects } from "@/plane-editor/components/document-editor-side-effects"; // types import type { EditorRefApi, ICollaborativeDocumentEditorProps } from "@/types"; -function CollaborativeDocumentEditor(props: ICollaborativeDocumentEditorProps) { +// Inner component that has access to collaboration context +const CollaborativeDocumentEditorInner: React.FC = (props) => { const { aiHandler, bubbleMenuEnabled = true, @@ -41,15 +42,20 @@ function CollaborativeDocumentEditor(props: ICollaborativeDocumentEditorProps) { onEditorFocus, onTransaction, placeholder, - realtimeConfig, - serverHandler, tabIndex, user, extendedDocumentEditorProps, + titleRef, + updatePageProperties, + isFetchingFallbackBinary, } = props; - // use document editor - const { editor, hasServerConnectionFailed, hasServerSynced } = useCollaborativeEditor({ + // Get non-null provider from context + const { provider, state, actions } = useCollaboration(); + + // Editor initialization with guaranteed non-null provider + const { editor, titleEditor } = useCollaborativeEditor({ + provider, disabledExtensions, editable, editorClassName, @@ -70,11 +76,11 @@ function CollaborativeDocumentEditor(props: ICollaborativeDocumentEditorProps) { onEditorFocus, onTransaction, placeholder, - realtimeConfig, - serverHandler, tabIndex, + titleRef, + updatePageProperties, user, - extendedDocumentEditorProps, + actions, }); const editorContainerClassNames = getEditorClassNames({ @@ -83,37 +89,71 @@ function CollaborativeDocumentEditor(props: ICollaborativeDocumentEditorProps) { containerClassName, }); - if (!editor) return null; + // Show loader ONLY when cache is known empty and server hasn't synced yet + const shouldShowSyncLoader = state.isCacheReady && !state.hasCachedContent && !state.isServerSynced; + const shouldWaitForFallbackBinary = isFetchingFallbackBinary && !state.hasCachedContent && state.isServerDisconnected; + const isLoading = shouldShowSyncLoader || shouldWaitForFallbackBinary; + + // Gate content rendering on isDocReady to prevent empty editor flash + const showContentSkeleton = !state.isDocReady; + + if (!editor || !titleEditor) return null; return ( <> - - +
+ +
); -} +}; + +// Outer component that provides collaboration context +const CollaborativeDocumentEditor: React.FC = (props) => { + const { id, realtimeConfig, serverHandler, user } = props; + + const token = useMemo(() => JSON.stringify(user), [user]); + + return ( + + + + ); +}; -const CollaborativeDocumentEditorWithRef = React.forwardRef(function CollaborativeDocumentEditorWithRef( - props: ICollaborativeDocumentEditorProps, - ref: React.ForwardedRef -) { - return } />; -}); +const CollaborativeDocumentEditorWithRef = React.forwardRef( + (props, ref) => ( + } /> + ) +); CollaborativeDocumentEditorWithRef.displayName = "CollaborativeDocumentEditorWithRef"; diff --git a/packages/editor/src/core/components/editors/document/page-renderer.tsx b/packages/editor/src/core/components/editors/document/page-renderer.tsx index 26a69e45744..af45e54b2a6 100644 --- a/packages/editor/src/core/components/editors/document/page-renderer.tsx +++ b/packages/editor/src/core/components/editors/document/page-renderer.tsx @@ -1,10 +1,12 @@ +import type { HocuspocusProvider } from "@hocuspocus/provider"; import type { Editor } from "@tiptap/react"; // plane imports import { cn } from "@plane/utils"; // components import { DocumentContentLoader, EditorContainer, EditorContentWrapper } from "@/components/editors"; -import { AIFeaturesMenu, BlockMenu, EditorBubbleMenu } from "@/components/menus"; +import { BlockMenu, EditorBubbleMenu } from "@/components/menus"; // types +import type { TCollabValue } from "@/contexts"; import type { ICollaborativeDocumentEditorPropsExtended, IEditorProps, @@ -20,6 +22,7 @@ type Props = { displayConfig: TDisplayConfig; documentLoaderClassName?: string; editor: Editor; + titleEditor?: Editor; editorContainerClassName: string; extendedDocumentEditorProps?: ICollaborativeDocumentEditorPropsExtended; extendedEditorProps: IEditorPropsExtended; @@ -28,11 +31,12 @@ type Props = { isLoading?: boolean; isTouchDevice: boolean; tabIndex?: number; + provider?: HocuspocusProvider; + state?: TCollabValue["state"]; }; export function PageRenderer(props: Props) { const { - aiHandler, bubbleMenuEnabled, disabledExtensions, displayConfig, @@ -45,8 +49,10 @@ export function PageRenderer(props: Props) { isLoading, isTouchDevice, tabIndex, + titleEditor, + provider, + state, } = props; - return (
) : ( - - - {editor.isEditable && !isTouchDevice && ( -
- {bubbleMenuEnabled && ( - + {titleEditor && ( +
+ + - )} - - +
)} - + + + {editor.isEditable && !isTouchDevice && ( +
+ {bubbleMenuEnabled && ( + + )} + +
+ )} +
+ )}
); diff --git a/packages/editor/src/core/components/editors/editor-container.tsx b/packages/editor/src/core/components/editors/editor-container.tsx index e634e492f0f..8fb03e893e3 100644 --- a/packages/editor/src/core/components/editors/editor-container.tsx +++ b/packages/editor/src/core/components/editors/editor-container.tsx @@ -1,13 +1,17 @@ +import type { HocuspocusProvider } from "@hocuspocus/provider"; import type { Editor } from "@tiptap/react"; import type { FC, ReactNode } from "react"; -import { useRef } from "react"; +import { useCallback, useEffect, useRef } from "react"; // plane utils import { cn } from "@plane/utils"; // constants import { DEFAULT_DISPLAY_CONFIG } from "@/constants/config"; import { CORE_EXTENSIONS } from "@/constants/extension"; // components +import type { TCollabValue } from "@/contexts"; import { LinkContainer } from "@/plane-editor/components/link-container"; +// plugins +import { nodeHighlightPluginKey } from "@/plugins/highlight"; // types import type { TDisplayConfig } from "@/types"; @@ -18,12 +22,85 @@ type Props = { editorContainerClassName: string; id: string; isTouchDevice: boolean; + provider?: HocuspocusProvider | undefined; + state?: TCollabValue["state"]; }; -export function EditorContainer(props: Props) { - const { children, displayConfig, editor, editorContainerClassName, id, isTouchDevice } = props; +export const EditorContainer: FC = (props) => { + const { children, displayConfig, editor, editorContainerClassName, id, isTouchDevice, provider, state } = props; // refs const containerRef = useRef(null); + const hasScrolledOnce = useRef(false); + const scrollToNode = useCallback( + (nodeId: string) => { + if (!editor) return false; + + const doc = editor.state.doc; + let pos: number | null = null; + + doc.descendants((node, position) => { + if (node.attrs && node.attrs.id === nodeId) { + pos = position; + return false; + } + }); + + if (pos === null) { + return false; + } + + const nodePosition = pos; + const tr = editor.state.tr.setMeta(nodeHighlightPluginKey, { nodeId }); + editor.view.dispatch(tr); + + requestAnimationFrame(() => { + const domNode = editor.view.nodeDOM(nodePosition); + if (domNode instanceof HTMLElement) { + domNode.scrollIntoView({ behavior: "instant", block: "center" }); + } + }); + + editor.once("focus", () => { + const clearTr = editor.state.tr.setMeta(nodeHighlightPluginKey, { nodeId: null }); + editor.view.dispatch(clearTr); + }); + + hasScrolledOnce.current = true; + return true; + }, + + [editor] + ); + + useEffect(() => { + const nodeId = window.location.href.split("#")[1]; + + const handleSynced = () => scrollToNode(nodeId); + + if (nodeId && !hasScrolledOnce.current) { + if (provider && state) { + const { hasCachedContent } = state; + // If the provider is synced or the cached content is available and the server is disconnected, scroll to the node + if (hasCachedContent) { + const hasScrolled = handleSynced(); + if (!hasScrolled) { + provider.on("synced", handleSynced); + } + } else if (provider.isSynced) { + handleSynced(); + } else { + provider.on("synced", handleSynced); + } + } else { + handleSynced(); + } + return () => { + if (provider) { + provider.off("synced", handleSynced); + } + }; + } + }, [scrollToNode, provider, state]); const handleContainerClick = (event: React.MouseEvent) => { if (event.target !== event.currentTarget) return; @@ -88,7 +165,6 @@ export function EditorContainer(props: Props) { `editor-container cursor-text relative line-spacing-${displayConfig.lineSpacing ?? DEFAULT_DISPLAY_CONFIG.lineSpacing}`, { "active-editor": editor?.isFocused && editor?.isEditable, - "wide-layout": displayConfig.wideLayout, }, displayConfig.fontSize ?? DEFAULT_DISPLAY_CONFIG.fontSize, displayConfig.fontStyle ?? DEFAULT_DISPLAY_CONFIG.fontStyle, @@ -100,4 +176,4 @@ export function EditorContainer(props: Props) {
); -} +}; diff --git a/packages/editor/src/core/components/editors/editor-content.tsx b/packages/editor/src/core/components/editors/editor-content.tsx index aef688fc72d..23efd5ec67e 100644 --- a/packages/editor/src/core/components/editors/editor-content.tsx +++ b/packages/editor/src/core/components/editors/editor-content.tsx @@ -3,19 +3,24 @@ import type { Editor } from "@tiptap/react"; import type { FC, ReactNode } from "react"; type Props = { + className?: string; children?: ReactNode; editor: Editor | null; id: string; tabIndex?: number; }; -export function EditorContentWrapper(props: Props) { - const { editor, children, tabIndex, id } = props; +export const EditorContentWrapper: FC = (props) => { + const { editor, className, children, tabIndex, id } = props; return ( -
editor?.chain().focus(undefined, { scrollIntoView: false }).run()}> +
editor?.chain().focus(undefined, { scrollIntoView: false }).run()} + className={className} + > {children}
); -} +}; diff --git a/packages/editor/src/core/contexts/collaboration-context.tsx b/packages/editor/src/core/contexts/collaboration-context.tsx new file mode 100644 index 00000000000..272f029df42 --- /dev/null +++ b/packages/editor/src/core/contexts/collaboration-context.tsx @@ -0,0 +1,32 @@ +import React, { createContext, useContext } from "react"; +// hooks +import { useYjsSetup } from "@/hooks/use-yjs-setup"; + +export type TCollabValue = NonNullable>; + +const CollabContext = createContext(null); + +type CollabProviderProps = Parameters[0] & { + fallback?: React.ReactNode; + children: React.ReactNode; +}; + +export function CollaborationProvider({ fallback = null, children, ...args }: CollabProviderProps) { + const setup = useYjsSetup(args); + + // Only wait for provider setup, not content ready + // Consumers can check state.isDocReady to gate content rendering + if (!setup) { + return <>{fallback}; + } + + return {children}; +} + +export function useCollaboration(): TCollabValue { + const ctx = useContext(CollabContext); + if (!ctx) { + throw new Error("useCollaboration must be used inside "); + } + return ctx; // guaranteed non-null +} diff --git a/packages/editor/src/core/contexts/index.ts b/packages/editor/src/core/contexts/index.ts new file mode 100644 index 00000000000..f536f2b2128 --- /dev/null +++ b/packages/editor/src/core/contexts/index.ts @@ -0,0 +1 @@ +export * from "./collaboration-context"; diff --git a/packages/editor/src/core/extensions/title-extension.ts b/packages/editor/src/core/extensions/title-extension.ts new file mode 100644 index 00000000000..cf4f52f975d --- /dev/null +++ b/packages/editor/src/core/extensions/title-extension.ts @@ -0,0 +1,14 @@ +import type { AnyExtension, Extensions } from "@tiptap/core"; +import Document from "@tiptap/extension-document"; +import Heading from "@tiptap/extension-heading"; +import Text from "@tiptap/extension-text"; + +export const TitleExtensions: Extensions = [ + Document.extend({ + content: "heading", + }), + Heading.configure({ + levels: [1], + }) as AnyExtension, + Text, +]; diff --git a/packages/editor/src/core/helpers/yjs-utils.ts b/packages/editor/src/core/helpers/yjs-utils.ts index ab2ca92d83b..76237db040a 100644 --- a/packages/editor/src/core/helpers/yjs-utils.ts +++ b/packages/editor/src/core/helpers/yjs-utils.ts @@ -1,4 +1,5 @@ import { Buffer } from "buffer"; +import type { Extensions } from "@tiptap/core"; import { getSchema } from "@tiptap/core"; import { generateHTML, generateJSON } from "@tiptap/html"; import { prosemirrorJSONToYDoc, yXmlFragmentToProseMirrorRootNode } from "y-prosemirror"; @@ -9,10 +10,13 @@ import { CoreEditorExtensionsWithoutProps, DocumentEditorExtensionsWithoutProps, } from "@/extensions/core-without-props"; +import { TitleExtensions } from "@/extensions/title-extension"; +import { sanitizeHTML } from "@plane/utils"; // editor extension configs const RICH_TEXT_EDITOR_EXTENSIONS = CoreEditorExtensionsWithoutProps; const DOCUMENT_EDITOR_EXTENSIONS = [...CoreEditorExtensionsWithoutProps, ...DocumentEditorExtensionsWithoutProps]; +export const TITLE_EDITOR_EXTENSIONS: Extensions = TitleExtensions; // editor schemas const richTextEditorSchema = getSchema(RICH_TEXT_EDITOR_EXTENSIONS); const documentEditorSchema = getSchema(DOCUMENT_EDITOR_EXTENSIONS); @@ -45,9 +49,10 @@ export const convertBinaryDataToBase64String = (document: Uint8Array): string => /** * @description this function decodes base64 string to binary data * @param {string} document - * @returns {ArrayBuffer} + * @returns {Buffer} */ -export const convertBase64StringToBinaryData = (document: string): ArrayBuffer => Buffer.from(document, "base64"); +export const convertBase64StringToBinaryData = (document: string): Buffer => + Buffer.from(document, "base64"); /** * @description this function generates the binary equivalent of html content for the rich text editor @@ -114,11 +119,13 @@ export const getAllDocumentFormatsFromRichTextEditorBinaryData = ( * @returns */ export const getAllDocumentFormatsFromDocumentEditorBinaryData = ( - description: Uint8Array + description: Uint8Array, + updateTitle: boolean ): { contentBinaryEncoded: string; contentJSON: object; contentHTML: string; + titleHTML?: string; } => { // encode binary description data const base64Data = convertBinaryDataToBase64String(description); @@ -130,11 +137,24 @@ export const getAllDocumentFormatsFromDocumentEditorBinaryData = ( // convert to HTML const contentHTML = generateHTML(contentJSON, DOCUMENT_EDITOR_EXTENSIONS); - return { - contentBinaryEncoded: base64Data, - contentJSON, - contentHTML, - }; + if (updateTitle) { + const title = yDoc.getXmlFragment("title"); + const titleJSON = yXmlFragmentToProseMirrorRootNode(title, documentEditorSchema).toJSON(); + const titleHTML = extractTextFromHTML(generateHTML(titleJSON, DOCUMENT_EDITOR_EXTENSIONS)); + + return { + contentBinaryEncoded: base64Data, + contentJSON, + contentHTML, + titleHTML, + }; + } else { + return { + contentBinaryEncoded: base64Data, + contentJSON, + contentHTML, + }; + } }; type TConvertHTMLDocumentToAllFormatsArgs = { @@ -170,8 +190,10 @@ export const convertHTMLDocumentToAllFormats = (args: TConvertHTMLDocumentToAllF // Convert HTML to binary format for document editor const contentBinary = getBinaryDataFromDocumentEditorHTMLString(document_html); // Generate all document formats from the binary data - const { contentBinaryEncoded, contentHTML, contentJSON } = - getAllDocumentFormatsFromDocumentEditorBinaryData(contentBinary); + const { contentBinaryEncoded, contentHTML, contentJSON } = getAllDocumentFormatsFromDocumentEditorBinaryData( + contentBinary, + false + ); allFormats = { description: contentJSON, description_html: contentHTML, @@ -183,3 +205,10 @@ export const convertHTMLDocumentToAllFormats = (args: TConvertHTMLDocumentToAllF return allFormats; }; + +export const extractTextFromHTML = (html: string): string => { + // Use sanitizeHTML to safely extract text and remove all HTML tags + // This is more secure than regex as it handles edge cases and prevents injection + // Note: sanitizeHTML trims whitespace, which is acceptable for title extraction + return sanitizeHTML(html) || ""; +}; diff --git a/packages/editor/src/core/hooks/use-collaborative-editor.ts b/packages/editor/src/core/hooks/use-collaborative-editor.ts index 80a9d760c3e..23077f7244a 100644 --- a/packages/editor/src/core/hooks/use-collaborative-editor.ts +++ b/packages/editor/src/core/hooks/use-collaborative-editor.ts @@ -1,7 +1,9 @@ -import { HocuspocusProvider } from "@hocuspocus/provider"; +import type { HocuspocusProvider } from "@hocuspocus/provider"; +import type { Extensions } from "@tiptap/core"; import Collaboration from "@tiptap/extension-collaboration"; -import { useEffect, useMemo, useState } from "react"; -import { IndexeddbPersistence } from "y-indexeddb"; +// react +import type React from "react"; +import { useEffect, useMemo } from "react"; // extensions import { HeadingListExtension, SideMenuExtension } from "@/extensions"; // hooks @@ -9,10 +11,29 @@ import { useEditor } from "@/hooks/use-editor"; // plane editor extensions import { DocumentEditorAdditionalExtensions } from "@/plane-editor/extensions"; // types -import type { TCollaborativeEditorHookProps } from "@/types"; +import type { + TCollaborativeEditorHookProps, + ICollaborativeDocumentEditorProps, + IEditorPropsExtended, + IEditorProps, + TEditorHookProps, + EditorTitleRefApi, +} from "@/types"; +// local imports +import { useEditorNavigation } from "./use-editor-navigation"; +import { useTitleEditor } from "./use-title-editor"; -export const useCollaborativeEditor = (props: TCollaborativeEditorHookProps) => { +type UseCollaborativeEditorArgs = Omit & { + provider: HocuspocusProvider; + user: TCollaborativeEditorHookProps["user"]; + actions: { + signalForcedClose: (value: boolean) => void; + }; +}; + +export const useCollaborativeEditor = (props: UseCollaborativeEditorArgs) => { const { + provider, onAssetChange, onChange, onTransaction, @@ -24,71 +45,28 @@ export const useCollaborativeEditor = (props: TCollaborativeEditorHookProps) => extensions = [], fileHandler, flaggedExtensions, - getEditorMetaData, forwardedRef, + getEditorMetaData, handleEditorReady, id, + mentionHandler, dragDropEnabled = true, isTouchDevice, - mentionHandler, onEditorFocus, placeholder, showPlaceholderOnEmpty, - realtimeConfig, - serverHandler, tabIndex, + titleRef, + updatePageProperties, user, + actions, } = props; - // states - const [hasServerConnectionFailed, setHasServerConnectionFailed] = useState(false); - const [hasServerSynced, setHasServerSynced] = useState(false); - // initialize Hocuspocus provider - const provider = useMemo( - () => - new HocuspocusProvider({ - name: id, - // using user id as a token to verify the user on the server - token: JSON.stringify(user), - url: realtimeConfig.url, - onAuthenticationFailed: () => { - serverHandler?.onServerError?.(); - setHasServerConnectionFailed(true); - }, - onConnect: () => serverHandler?.onConnect?.(), - onClose: (data) => { - if (data.event.code === 1006) { - serverHandler?.onServerError?.(); - setHasServerConnectionFailed(true); - } - }, - onSynced: () => setHasServerSynced(true), - }), - [id, realtimeConfig, serverHandler, user] - ); - const localProvider = useMemo( - () => (id ? new IndexeddbPersistence(id, provider.document) : undefined), - [id, provider] - ); + const { mainNavigationExtension, titleNavigationExtension, setMainEditor, setTitleEditor } = useEditorNavigation(); - // destroy and disconnect all providers connection on unmount - useEffect( - () => () => { - provider?.destroy(); - localProvider?.destroy(); - }, - [provider, localProvider] - ); - - const editor = useEditor({ - disabledExtensions, - extendedEditorProps, - id, - editable, - editorProps, - editorClassName, - enableHistory: false, - extensions: [ + // Memoize extensions to avoid unnecessary editor recreations + const editorExtensions = useMemo( + () => [ SideMenuExtension({ aiEnabled: !disabledExtensions?.includes("ai"), dragDropEnabled, @@ -96,6 +74,7 @@ export const useCollaborativeEditor = (props: TCollaborativeEditorHookProps) => HeadingListExtension, Collaboration.configure({ document: provider.document, + field: "default", }), ...extensions, ...DocumentEditorAdditionalExtensions({ @@ -107,27 +86,122 @@ export const useCollaborativeEditor = (props: TCollaborativeEditorHookProps) => provider, userDetails: user, }), + mainNavigationExtension, ], - fileHandler, - flaggedExtensions, - forwardedRef, - getEditorMetaData, - handleEditorReady, - isTouchDevice, - mentionHandler, - onAssetChange, - onChange, - onEditorFocus, - onTransaction, - placeholder, - showPlaceholderOnEmpty, - provider, - tabIndex, - }); + [ + provider, + disabledExtensions, + dragDropEnabled, + extensions, + extendedEditorProps, + fileHandler, + flaggedExtensions, + editable, + user, + mainNavigationExtension, + ] + ); + + // Editor configuration + const editorConfig = useMemo( + () => ({ + disabledExtensions, + extendedEditorProps, + id, + editable, + editorProps, + editorClassName, + enableHistory: false, + extensions: editorExtensions, + fileHandler, + flaggedExtensions, + forwardedRef, + getEditorMetaData, + handleEditorReady, + isTouchDevice, + mentionHandler, + onAssetChange, + onChange, + onEditorFocus, + onTransaction, + placeholder, + showPlaceholderOnEmpty, + provider, + tabIndex, + }), + [ + provider, + disabledExtensions, + extendedEditorProps, + id, + editable, + editorProps, + editorClassName, + editorExtensions, + fileHandler, + flaggedExtensions, + forwardedRef, + getEditorMetaData, + handleEditorReady, + isTouchDevice, + mentionHandler, + onAssetChange, + onChange, + onEditorFocus, + onTransaction, + placeholder, + showPlaceholderOnEmpty, + tabIndex, + ] + ); + + const editor = useEditor(editorConfig); + + const titleExtensions = useMemo( + () => [ + Collaboration.configure({ + document: provider.document, + field: "title", + }), + titleNavigationExtension, + ], + [provider, titleNavigationExtension] + ); + + const titleEditorConfig = useMemo<{ + id: string; + editable: boolean; + provider: HocuspocusProvider; + titleRef?: React.MutableRefObject; + updatePageProperties?: ICollaborativeDocumentEditorProps["updatePageProperties"]; + extensions: Extensions; + extendedEditorProps?: IEditorPropsExtended; + getEditorMetaData?: IEditorProps["getEditorMetaData"]; + }>( + () => ({ + id, + editable, + provider, + titleRef, + updatePageProperties, + extensions: titleExtensions, + extendedEditorProps, + getEditorMetaData, + }), + [provider, id, editable, titleRef, updatePageProperties, titleExtensions, extendedEditorProps, getEditorMetaData] + ); + + const titleEditor = useTitleEditor(titleEditorConfig as Parameters[0]); + + useEffect(() => { + if (editor && titleEditor) { + setMainEditor(editor); + setTitleEditor(titleEditor); + } + }, [editor, titleEditor, setMainEditor, setTitleEditor]); return { editor, - hasServerConnectionFailed, - hasServerSynced, + titleEditor, }; }; diff --git a/packages/editor/src/core/hooks/use-editor-navigation.ts b/packages/editor/src/core/hooks/use-editor-navigation.ts new file mode 100644 index 00000000000..d5bdb1d27f1 --- /dev/null +++ b/packages/editor/src/core/hooks/use-editor-navigation.ts @@ -0,0 +1,169 @@ +import type { Editor } from "@tiptap/core"; +import { Extension } from "@tiptap/core"; +import { useCallback, useRef } from "react"; + +/** + * Creates a title editor extension that enables keyboard navigation to the main editor + * + * @param getMainEditor Function to get the main editor instance + * @returns A Tiptap extension with keyboard shortcuts + */ +export const createTitleNavigationExtension = (getMainEditor: () => Editor | null) => + Extension.create({ + name: "titleEditorNavigation", + priority: 10, + + addKeyboardShortcuts() { + return { + // Arrow down at end of title - Move to main editor + ArrowDown: () => { + const mainEditor = getMainEditor(); + if (!mainEditor) return false; + + // If cursor is at the end of the title + mainEditor.commands.focus("start"); + return true; + }, + + // Right arrow at end of title - Move to main editor + ArrowRight: ({ editor: titleEditor }) => { + const mainEditor = getMainEditor(); + if (!mainEditor) return false; + + const { from, to } = titleEditor.state.selection; + const documentLength = titleEditor.state.doc.content.size; + + // If cursor is at the end of the title + if (from === to && to === documentLength - 1) { + mainEditor.commands.focus("start"); + return true; + } + return false; + }, + + // Enter - Create new line in main editor and focus + Enter: () => { + const mainEditor = getMainEditor(); + if (!mainEditor) return false; + + // Focus at the start of the main editor + mainEditor.chain().focus().insertContentAt(0, { type: "paragraph" }).run(); + return true; + }, + }; + }, + }); + +/** + * Creates a main editor extension that enables keyboard navigation to the title editor + * + * @param getTitleEditor Function to get the title editor instance + * @returns A Tiptap extension with keyboard shortcuts + */ +export const createMainNavigationExtension = (getTitleEditor: () => Editor | null) => + Extension.create({ + name: "mainEditorNavigation", + priority: 10, + + addKeyboardShortcuts() { + return { + // Arrow up at start of main editor - Move to title editor + ArrowUp: ({ editor: mainEditor }) => { + const titleEditor = getTitleEditor(); + if (!titleEditor) return false; + + const { from, to } = mainEditor.state.selection; + + // If cursor is at the start of the main editor + if (from === 1 && to === 1) { + titleEditor.commands.focus("end"); + return true; + } + return false; + }, + + // Left arrow at start of main editor - Move to title editor + ArrowLeft: ({ editor: mainEditor }) => { + const titleEditor = getTitleEditor(); + if (!titleEditor) return false; + + const { from, to } = mainEditor.state.selection; + + // If cursor is at the absolute start of the main editor + if (from === 1 && to === 1) { + titleEditor.commands.focus("end"); + return true; + } + return false; + }, + + // Backspace - Special handling for first paragraph + Backspace: ({ editor }) => { + const titleEditor = getTitleEditor(); + if (!titleEditor) return false; + + const { from, to, empty } = editor.state.selection; + + // Only handle when cursor is at position 1 with empty selection + if (from === 1 && to === 1 && empty) { + const firstNode = editor.state.doc.firstChild; + + // If first node is a paragraph + if (firstNode && firstNode.type.name === "paragraph") { + // If paragraph is already empty, delete it and focus title editor + if (firstNode.content.size === 0) { + editor.commands.deleteNode("paragraph"); + // Use setTimeout to ensure the node is deleted before changing focus + setTimeout(() => titleEditor.commands.focus("end"), 0); + return true; + } + // If paragraph is not empty, just move focus to title editor + else { + titleEditor.commands.focus("end"); + return true; + } + } + } + return false; + }, + }; + }, + }); + +/** + * Hook to manage navigation between title and main editors + * + * Creates extension factories for keyboard navigation between editors + * and maintains references to both editors + * + * @returns Object with editor setters and extensions + */ +export const useEditorNavigation = () => { + // Create refs to store editor instances + const titleEditorRef = useRef(null); + const mainEditorRef = useRef(null); + + // Create stable getter functions + const getTitleEditor = useCallback(() => titleEditorRef.current, []); + const getMainEditor = useCallback(() => mainEditorRef.current, []); + + // Create stable setter functions + const setTitleEditor = useCallback((editor: Editor | null) => { + titleEditorRef.current = editor; + }, []); + + const setMainEditor = useCallback((editor: Editor | null) => { + mainEditorRef.current = editor; + }, []); + + // Create extension factories that access editor refs + const titleNavigationExtension = createTitleNavigationExtension(getMainEditor); + const mainNavigationExtension = createMainNavigationExtension(getTitleEditor); + + return { + setTitleEditor, + setMainEditor, + titleNavigationExtension, + mainNavigationExtension, + }; +}; diff --git a/packages/editor/src/core/hooks/use-title-editor.ts b/packages/editor/src/core/hooks/use-title-editor.ts new file mode 100644 index 00000000000..de850bf82f6 --- /dev/null +++ b/packages/editor/src/core/hooks/use-title-editor.ts @@ -0,0 +1,91 @@ +import type { HocuspocusProvider } from "@hocuspocus/provider"; +import type { Extensions } from "@tiptap/core"; +import { Placeholder } from "@tiptap/extension-placeholder"; +import { useEditor } from "@tiptap/react"; +import { useImperativeHandle } from "react"; +// constants +import { CORE_EDITOR_META } from "@/constants/meta"; +// extensions +import { TitleExtensions } from "@/extensions/title-extension"; +// helpers +import { getEditorRefHelpers } from "@/helpers/editor-ref"; +// types +import type { IEditorPropsExtended, IEditorProps } from "@/types"; +import type { EditorTitleRefApi, ICollaborativeDocumentEditorProps } from "@/types/editor"; + +type Props = { + editable?: boolean; + provider: HocuspocusProvider; + titleRef?: React.MutableRefObject; + extensions?: Extensions; + initialValue?: string; + field?: string; + placeholder?: string; + updatePageProperties?: ICollaborativeDocumentEditorProps["updatePageProperties"]; + id: string; + extendedEditorProps?: IEditorPropsExtended; + getEditorMetaData?: IEditorProps["getEditorMetaData"]; +}; + +/** + * A hook that creates a title editor with collaboration features + * Uses the same Y.Doc as the main editor but a different field + */ +export const useTitleEditor = (props: Props) => { + const { + editable = true, + id, + initialValue = "", + extensions, + provider, + updatePageProperties, + titleRef, + getEditorMetaData, + } = props; + + // Force editor recreation when Y.Doc changes (provider.document.guid) + const docKey = provider?.document?.guid ?? id; + + const editor = useEditor( + { + onUpdate: ({ editor }) => { + updatePageProperties?.(id, "property_updated", { name: editor?.getText() }); + }, + editable, + immediatelyRender: false, + shouldRerenderOnTransaction: false, + extensions: [ + ...TitleExtensions, + ...(extensions ?? []), + Placeholder.configure({ + placeholder: () => "Untitled", + includeChildren: true, + showOnlyWhenEditable: false, + }), + ], + content: typeof initialValue === "string" && initialValue.trim() !== "" ? initialValue : "

", + }, + [editable, initialValue, docKey] + ); + + useImperativeHandle(titleRef, () => ({ + ...getEditorRefHelpers({ + editor, + provider, + getEditorMetaData: getEditorMetaData ?? (() => ({ file_assets: [], user_mentions: [] })), + }), + clearEditor: (emitUpdate = false) => { + editor + ?.chain() + .setMeta(CORE_EDITOR_META.SKIP_FILE_DELETION, true) + .setMeta(CORE_EDITOR_META.INTENTIONAL_DELETION, true) + .clearContent(emitUpdate) + .run(); + }, + setEditorValue: (content: string) => { + editor?.commands.setContent(content, false); + }, + })); + + return editor; +}; diff --git a/packages/editor/src/core/hooks/use-yjs-setup.ts b/packages/editor/src/core/hooks/use-yjs-setup.ts new file mode 100644 index 00000000000..42aecca5188 --- /dev/null +++ b/packages/editor/src/core/hooks/use-yjs-setup.ts @@ -0,0 +1,369 @@ +import { HocuspocusProvider } from "@hocuspocus/provider"; +// react +import { useCallback, useEffect, useRef, useState } from "react"; +// indexeddb +import { IndexeddbPersistence } from "y-indexeddb"; +// yjs +import type * as Y from "yjs"; +// types +import type { CollaborationState, CollabStage, CollaborationError } from "@/types/collaboration"; + +// Helper to check if a close code indicates a forced close +const isForcedCloseCode = (code: number | undefined): boolean => { + if (!code) return false; + // All custom close codes (4000-4003) are treated as forced closes + return code >= 4000 && code <= 4003; +}; + +type UseYjsSetupArgs = { + docId: string; + serverUrl: string; + authToken: string; + onStateChange?: (state: CollaborationState) => void; + options?: { + maxConnectionAttempts?: number; + }; +}; + +const DEFAULT_MAX_RETRIES = 3; + +export const useYjsSetup = ({ docId, serverUrl, authToken, onStateChange }: UseYjsSetupArgs) => { + // Current collaboration stage + const [stage, setStage] = useState({ kind: "initial" }); + + // Cache readiness state + const [hasCachedContent, setHasCachedContent] = useState(false); + const [isCacheReady, setIsCacheReady] = useState(false); + + // Provider and Y.Doc in state (nullable until effect runs) + const [yjsSession, setYjsSession] = useState<{ provider: HocuspocusProvider; ydoc: Y.Doc } | null>(null); + + // Use refs for values that need to be mutated from callbacks + const retryCountRef = useRef(0); + const forcedCloseSignalRef = useRef(false); + const isDisposedRef = useRef(false); + const stageRef = useRef({ kind: "initial" }); + const lastReconnectTimeRef = useRef(0); + + // Create/destroy provider in effect (not during render) + useEffect(() => { + // Reset refs when creating new provider (e.g., document switch) + retryCountRef.current = 0; + isDisposedRef.current = false; + forcedCloseSignalRef.current = false; + stageRef.current = { kind: "initial" }; + + const provider = new HocuspocusProvider({ + name: docId, + token: authToken, + url: serverUrl, + onAuthenticationFailed: () => { + if (isDisposedRef.current) return; + const error: CollaborationError = { type: "auth-failed", message: "Authentication failed" }; + const newStage = { kind: "disconnected" as const, error }; + stageRef.current = newStage; + setStage(newStage); + }, + onConnect: () => { + if (isDisposedRef.current) { + provider?.disconnect(); + return; + } + retryCountRef.current = 0; + // After successful connection, transition to awaiting-sync (onSynced will move to synced) + const newStage = { kind: "awaiting-sync" as const }; + stageRef.current = newStage; + setStage(newStage); + }, + onStatus: ({ status: providerStatus }) => { + if (isDisposedRef.current) return; + if (providerStatus === "connecting") { + // Derive whether this is initial connect or reconnection from retry count + const isReconnecting = retryCountRef.current > 0; + setStage(isReconnecting ? { kind: "reconnecting", attempt: retryCountRef.current } : { kind: "connecting" }); + } else if (providerStatus === "disconnected") { + // Do not transition here; let handleClose decide the final stage + } else if (providerStatus === "connected") { + // Connection succeeded, move to awaiting-sync + const newStage = { kind: "awaiting-sync" as const }; + stageRef.current = newStage; + setStage(newStage); + } + }, + onSynced: () => { + if (isDisposedRef.current) return; + retryCountRef.current = 0; + // Document sync complete + const newStage = { kind: "synced" as const }; + stageRef.current = newStage; + setStage(newStage); + }, + }); + + const pauseProvider = () => { + const wsProvider = provider.configuration.websocketProvider; + if (wsProvider) { + try { + wsProvider.shouldConnect = false; + wsProvider.disconnect(); + } catch (error) { + console.error(`Error pausing websocketProvider:`, error); + } + } + }; + + const permanentlyStopProvider = () => { + isDisposedRef.current = true; + + const wsProvider = provider.configuration.websocketProvider; + if (wsProvider) { + try { + wsProvider.shouldConnect = false; + wsProvider.disconnect(); + wsProvider.destroy(); + } catch (error) { + console.error(`Error tearing down websocketProvider:`, error); + } + } + try { + provider.destroy(); + } catch (error) { + console.error(`Error destroying provider:`, error); + } + }; + + const handleClose = (closeEvent: { event?: { code?: number; reason?: string } }) => { + if (isDisposedRef.current) return; + + const closeCode = closeEvent.event?.code; + const wsProvider = provider.configuration.websocketProvider; + const shouldConnect = wsProvider.shouldConnect; + const isForcedClose = isForcedCloseCode(closeCode) || forcedCloseSignalRef.current || shouldConnect === false; + + if (isForcedClose) { + // Determine if this is a manual disconnect or a permanent error + const isManualDisconnect = shouldConnect === false; + + const error: CollaborationError = { + type: "forced-close", + code: closeCode || 0, + message: isManualDisconnect ? "Manually disconnected" : "Server forced connection close", + }; + const newStage = { kind: "disconnected" as const, error }; + stageRef.current = newStage; + setStage(newStage); + + retryCountRef.current = 0; + forcedCloseSignalRef.current = false; + + // Only pause if it's a real forced close (not manual disconnect) + // Manual disconnect leaves it as is (shouldConnect=false already set if manual) + if (!isManualDisconnect) { + pauseProvider(); + } + } else { + // Transient connection loss: attempt reconnection + retryCountRef.current++; + + if (retryCountRef.current >= DEFAULT_MAX_RETRIES) { + // Exceeded max retry attempts + const error: CollaborationError = { + type: "max-retries", + message: `Failed to connect after ${DEFAULT_MAX_RETRIES} attempts`, + }; + const newStage = { kind: "disconnected" as const, error }; + stageRef.current = newStage; + setStage(newStage); + + pauseProvider(); + } else { + // Still have retries left, move to reconnecting + const newStage = { kind: "reconnecting" as const, attempt: retryCountRef.current }; + stageRef.current = newStage; + setStage(newStage); + } + } + }; + + provider.on("close", handleClose); + + setYjsSession({ provider, ydoc: provider.document as Y.Doc }); + + // Handle page visibility changes (sleep/wake, tab switching) + const handleVisibilityChange = (event?: Event) => { + if (isDisposedRef.current) return; + + const isVisible = document.visibilityState === "visible"; + const isFocus = event?.type === "focus"; + + if (isVisible || isFocus) { + // Throttle reconnection attempts to avoid double-firing (visibility + focus) + const now = Date.now(); + if (now - lastReconnectTimeRef.current < 1000) { + return; + } + + const wsProvider = provider.configuration.websocketProvider; + if (!wsProvider) return; + + const ws = wsProvider.webSocket; + const isStale = ws?.readyState === WebSocket.CLOSED || ws?.readyState === WebSocket.CLOSING; + + // If disconnected or stale, re-enable reconnection and force reconnect + if (isStale || stageRef.current.kind === "disconnected") { + lastReconnectTimeRef.current = now; + + // Re-enable connection on tab focus (even if manually disconnected before sleep) + wsProvider.shouldConnect = true; + + // Reset retry count for fresh reconnection attempt + retryCountRef.current = 0; + + // Move to connecting state + const newStage = { kind: "connecting" as const }; + stageRef.current = newStage; + setStage(newStage); + + wsProvider.disconnect(); + wsProvider.connect(); + } + } + }; + + // Handle online/offline events + const handleOnline = () => { + if (isDisposedRef.current) return; + + const wsProvider = provider.configuration.websocketProvider; + if (wsProvider) { + wsProvider.shouldConnect = true; + wsProvider.disconnect(); + wsProvider.connect(); + } + }; + + document.addEventListener("visibilitychange", handleVisibilityChange); + window.addEventListener("focus", handleVisibilityChange); + window.addEventListener("online", handleOnline); + + return () => { + try { + provider.off("close", handleClose); + } catch (error) { + console.error(`Error unregistering close handler:`, error); + } + + document.removeEventListener("visibilitychange", handleVisibilityChange); + window.removeEventListener("focus", handleVisibilityChange); + window.removeEventListener("online", handleOnline); + + permanentlyStopProvider(); + }; + }, [docId, serverUrl, authToken]); + + // IndexedDB persistence lifecycle + useEffect(() => { + if (!yjsSession) return; + + const idbPersistence = new IndexeddbPersistence(docId, yjsSession.provider.document); + + const onIdbSynced = () => { + const yFragment = idbPersistence.doc.getXmlFragment("default"); + const docLength = yFragment?.length ?? 0; + setIsCacheReady(true); + setHasCachedContent(docLength > 0); + }; + + idbPersistence.on("synced", onIdbSynced); + + return () => { + idbPersistence.off("synced", onIdbSynced); + try { + idbPersistence.destroy(); + } catch (error) { + console.error(`Error destroying local provider:`, error); + } + }; + }, [docId, yjsSession]); + + // Observe Y.Doc content changes to update hasCachedContent (catches fallback scenario) + useEffect(() => { + if (!yjsSession || !isCacheReady) return; + + const fragment = yjsSession.ydoc.getXmlFragment("default"); + let lastHasContent = false; + + const updateCachedContentFlag = () => { + const len = fragment?.length ?? 0; + const hasContent = len > 0; + + // Only update state if the boolean value actually changed + if (hasContent !== lastHasContent) { + lastHasContent = hasContent; + setHasCachedContent(hasContent); + } + }; + // Initial check (handles fallback content loaded before this effect runs) + updateCachedContentFlag(); + + // Use observeDeep to catch nested changes (keystrokes modify Y.XmlText inside Y.XmlElement) + fragment.observeDeep(updateCachedContentFlag); + + return () => { + try { + fragment.unobserveDeep(updateCachedContentFlag); + } catch (error) { + console.error("Error unobserving fragment:", error); + } + }; + }, [yjsSession, isCacheReady]); + + // Notify state changes callback (use ref to avoid dependency on handler) + const stateChangeCallbackRef = useRef(onStateChange); + stateChangeCallbackRef.current = onStateChange; + + useEffect(() => { + if (!stateChangeCallbackRef.current) return; + + const isServerSynced = stage.kind === "synced"; + const isServerDisconnected = stage.kind === "disconnected"; + + const state: CollaborationState = { + stage, + isServerSynced, + isServerDisconnected, + }; + + stateChangeCallbackRef.current(state); + }, [stage]); + + // Derived values for convenience + const isServerSynced = stage.kind === "synced"; + const isServerDisconnected = stage.kind === "disconnected"; + const isDocReady = isServerSynced || isServerDisconnected || (isCacheReady && hasCachedContent); + + const signalForcedClose = useCallback((value: boolean) => { + forcedCloseSignalRef.current = value; + }, []); + + // Don't return anything until provider is ready - guarantees non-null provider + if (!yjsSession) { + return null; + } + + return { + provider: yjsSession.provider, + ydoc: yjsSession.ydoc, + state: { + stage, + hasCachedContent, + isCacheReady, + isServerSynced, + isServerDisconnected, + isDocReady, + }, + actions: { + signalForcedClose, + }, + }; +}; diff --git a/packages/editor/src/core/plugins/highlight.ts b/packages/editor/src/core/plugins/highlight.ts new file mode 100644 index 00000000000..2ea623c6c46 --- /dev/null +++ b/packages/editor/src/core/plugins/highlight.ts @@ -0,0 +1,92 @@ +import { Plugin, PluginKey } from "@tiptap/pm/state"; +import { Decoration, DecorationSet } from "@tiptap/pm/view"; + +type NodeHighlightState = { + highlightedNodeId: string | null; + decorations: DecorationSet; +}; + +type NodeHighlightMeta = { + nodeId?: string | null; +}; + +export const nodeHighlightPluginKey = new PluginKey("nodeHighlight"); + +const buildDecorations = (doc: Parameters[0], highlightedNodeId: string | null) => { + if (!highlightedNodeId) { + return DecorationSet.empty; + } + + const decorations: Decoration[] = []; + const highlightClassNames = ["bg-custom-primary-100/20", "transition-all", "duration-300", "rounded"]; + + doc.descendants((node, pos) => { + // Check if this node has the id we're looking for + if (node.attrs && node.attrs.id === highlightedNodeId) { + const decorationAttrs: Record = { + "data-node-highlighted": "true", + class: highlightClassNames.join(" "), + }; + + // For text nodes, highlight the inline content + if (node.isText) { + decorations.push( + Decoration.inline(pos, pos + node.nodeSize, decorationAttrs, { + inclusiveStart: true, + inclusiveEnd: true, + }) + ); + } else { + // For block nodes, add a node decoration + decorations.push(Decoration.node(pos, pos + node.nodeSize, decorationAttrs)); + } + + return false; // Stop searching once we found the node + } + + return true; + }); + + return DecorationSet.create(doc, decorations); +}; + +export const NodeHighlightPlugin = () => + new Plugin({ + key: nodeHighlightPluginKey, + state: { + init: () => ({ + highlightedNodeId: null, + decorations: DecorationSet.empty, + }), + apply: (tr, value, _oldState, newState) => { + let highlightedNodeId = value.highlightedNodeId; + let decorations = value.decorations; + + const meta = tr.getMeta(nodeHighlightPluginKey) as NodeHighlightMeta | undefined; + let shouldRecalculate = tr.docChanged; + + if (meta) { + if (meta.nodeId !== undefined) { + highlightedNodeId = typeof meta.nodeId === "string" && meta.nodeId.length > 0 ? meta.nodeId : null; + shouldRecalculate = true; + } + } + + if (shouldRecalculate) { + decorations = buildDecorations(newState.doc, highlightedNodeId); + } else if (tr.docChanged) { + decorations = decorations.map(tr.mapping, newState.doc); + } + + return { + highlightedNodeId, + decorations, + }; + }, + }, + props: { + decorations(state) { + return nodeHighlightPluginKey.getState(state)?.decorations ?? DecorationSet.empty; + }, + }, + }); diff --git a/packages/editor/src/core/types/collaboration.ts b/packages/editor/src/core/types/collaboration.ts index 8921e8f052d..b0ef4ca2b9a 100644 --- a/packages/editor/src/core/types/collaboration.ts +++ b/packages/editor/src/core/types/collaboration.ts @@ -1,4 +1,37 @@ +export type CollaborationError = + | { type: "auth-failed"; message: string } + | { type: "network-error"; message: string } + | { type: "forced-close"; code: number; message: string } + | { type: "max-retries"; message: string }; + +/** + * Single-stage state machine for collaboration lifecycle. + * Stages represent the sequential progression: initial → connecting → awaiting-sync → synced + * + * Invariants: + * - "awaiting-sync" only occurs when connection is successful and sync is pending + * - "synced" occurs only after connection success and onSynced callback + * - "reconnecting" with attempt > 0 when retrying after a connection drop + * - "disconnected" is terminal (connection failed or forced close) + */ +export type CollabStage = + | { kind: "initial" } + | { kind: "connecting" } + | { kind: "awaiting-sync" } + | { kind: "synced" } + | { kind: "reconnecting"; attempt: number } + | { kind: "disconnected"; error: CollaborationError }; + +/** + * Public collaboration state exposed to consumers. + * Contains the current stage and derived booleans for convenience. + */ +export type CollaborationState = { + stage: CollabStage; + isServerSynced: boolean; + isServerDisconnected: boolean; +}; + export type TServerHandler = { - onConnect?: () => void; - onServerError?: () => void; + onStateChange: (state: CollaborationState) => void; }; diff --git a/packages/editor/src/core/types/editor.ts b/packages/editor/src/core/types/editor.ts index 44b6388f255..a4f1cbe5bc3 100644 --- a/packages/editor/src/core/types/editor.ts +++ b/packages/editor/src/core/types/editor.ts @@ -27,6 +27,8 @@ import type { TRealtimeConfig, TServerHandler, TUserDetails, + TExtendedEditorRefApi, + EventToPayloadMap, } from "@/types"; export type TEditorCommands = @@ -97,7 +99,7 @@ export type TDocumentInfo = { words: number; }; -export type EditorRefApi = { +export type CoreEditorRefApi = { blur: () => void; clearEditor: (emitUpdate?: boolean) => void; createSelectionAtCursorPosition: () => void; @@ -139,6 +141,10 @@ export type EditorRefApi = { undo: () => void; }; +export type EditorRefApi = CoreEditorRefApi & TExtendedEditorRefApi; + +export type EditorTitleRefApi = EditorRefApi; + // editor props export type IEditorProps = { autofocus?: boolean; @@ -187,6 +193,15 @@ export type ICollaborativeDocumentEditorProps = Omit( + pageIds: string | string[], + actionType: T, + data: EventToPayloadMap[T], + performAction?: boolean + ) => void; + pageRestorationInProgress?: boolean; + titleRef?: React.MutableRefObject; + isFetchingFallbackBinary?: boolean; }; export type IDocumentEditorProps = Omit & { diff --git a/packages/editor/src/core/types/hook.ts b/packages/editor/src/core/types/hook.ts index 6036be6b879..02c6538854a 100644 --- a/packages/editor/src/core/types/hook.ts +++ b/packages/editor/src/core/types/hook.ts @@ -57,4 +57,7 @@ export type TCollaborativeEditorHookProps = TCoreHookProps & Pick< ICollaborativeDocumentEditorProps, "dragDropEnabled" | "extendedDocumentEditorProps" | "realtimeConfig" | "serverHandler" | "user" - >; + > & { + titleRef?: ICollaborativeDocumentEditorProps["titleRef"]; + updatePageProperties?: ICollaborativeDocumentEditorProps["updatePageProperties"]; + }; diff --git a/packages/editor/src/styles/index.css b/packages/editor/src/styles/index.css index e38c01c2831..3ec743191c0 100644 --- a/packages/editor/src/styles/index.css +++ b/packages/editor/src/styles/index.css @@ -3,3 +3,4 @@ @import "./table.css"; @import "./github-dark.css"; @import "./drag-drop.css"; +@import "./title-editor.css"; diff --git a/packages/editor/src/styles/title-editor.css b/packages/editor/src/styles/title-editor.css new file mode 100644 index 00000000000..b51d952e47b --- /dev/null +++ b/packages/editor/src/styles/title-editor.css @@ -0,0 +1,49 @@ +/* Title editor styles */ +.page-title-editor { + width: 100%; + outline: none; + resize: none; + border-radius: 0; +} + +.page-title-editor .ProseMirror { + background-color: transparent; + font-weight: bold; + letter-spacing: -2%; + padding: 0; + margin-bottom: 0; +} + +/* Handle font sizes */ +.page-title-editor.small-font .ProseMirror h1 { + font-size: 1.6rem; + line-height: 1.9rem; +} + +.page-title-editor.large-font .ProseMirror h1 { + font-size: 2rem; + line-height: 2.375rem; +} + +/* Focus state */ +.page-title-editor.active-editor .ProseMirror { + box-shadow: none; + outline: none; +} + +/* Placeholder */ +.page-title-editor .ProseMirror h1.is-editor-empty:first-child::before { + content: attr(data-placeholder); + float: left; + color: var(--color-placeholder); + pointer-events: none; + height: 0; +} + +.page-title-editor .ProseMirror h1.is-empty::before { + content: attr(data-placeholder); + float: left; + color: var(--color-placeholder); + pointer-events: none; + height: 0; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9e1bfe96a03..d39fd124ad1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,10 +41,10 @@ catalogs: version: 10.27.0 '@tiptap/core': specifier: ^2.22.3 - version: 2.27.1 + version: 2.26.3 '@tiptap/html': specifier: ^2.22.3 - version: 2.27.1 + version: 2.26.2 '@types/lodash-es': specifier: 4.17.12 version: 4.17.12 @@ -129,46 +129,46 @@ importers: version: 0.1.3 '@vitest/eslint-plugin': specifier: 1.5.1 - version: 1.5.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3)(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) + version: 1.5.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3)(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) eslint: specifier: 9.39.1 - version: 9.39.1(jiti@2.6.1) + version: 9.39.1(jiti@2.5.1) eslint-config-prettier: specifier: 10.1.8 - version: 10.1.8(eslint@9.39.1(jiti@2.6.1)) + version: 10.1.8(eslint@9.39.1(jiti@2.5.1)) eslint-import-resolver-node: specifier: 0.3.9 version: 0.3.9 eslint-import-resolver-typescript: specifier: 4.4.4 - version: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)) + version: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.5.1)) eslint-plugin-import: specifier: 2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.1(jiti@2.6.1)) + version: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.1(jiti@2.5.1)) eslint-plugin-jsx-a11y: specifier: 6.10.2 - version: 6.10.2(eslint@9.39.1(jiti@2.6.1)) + version: 6.10.2(eslint@9.39.1(jiti@2.5.1)) eslint-plugin-n: specifier: 17.23.1 - version: 17.23.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3) + version: 17.23.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3) eslint-plugin-promise: specifier: 7.2.1 - version: 7.2.1(eslint@9.39.1(jiti@2.6.1)) + version: 7.2.1(eslint@9.39.1(jiti@2.5.1)) eslint-plugin-react: specifier: 7.37.5 - version: 7.37.5(eslint@9.39.1(jiti@2.6.1)) + version: 7.37.5(eslint@9.39.1(jiti@2.5.1)) eslint-plugin-react-hooks: specifier: 7.0.1 - version: 7.0.1(eslint@9.39.1(jiti@2.6.1)) + version: 7.0.1(eslint@9.39.1(jiti@2.5.1)) eslint-plugin-react-refresh: specifier: 0.4.24 - version: 0.4.24(eslint@9.39.1(jiti@2.6.1)) + version: 0.4.24(eslint@9.39.1(jiti@2.5.1)) eslint-plugin-storybook: specifier: 10.1.4 - version: 10.1.4(eslint@9.39.1(jiti@2.6.1))(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))(typescript@5.8.3) + version: 10.1.4(eslint@9.39.1(jiti@2.5.1))(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.8.3) eslint-plugin-turbo: specifier: 2.6.3 - version: 2.6.3(eslint@9.39.1(jiti@2.6.1))(turbo@2.6.3) + version: 2.6.3(eslint@9.39.1(jiti@2.5.1))(turbo@2.6.3) globals: specifier: 16.5.0 version: 16.5.0 @@ -186,7 +186,7 @@ importers: version: 2.6.3 typescript-eslint: specifier: 8.48.1 - version: 8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3) + version: 8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3) apps/admin: dependencies: @@ -234,7 +234,7 @@ importers: version: 1.12.0 isbot: specifier: ^5.1.31 - version: 5.1.32 + version: 5.1.31 lodash-es: specifier: 'catalog:' version: 4.17.21 @@ -249,7 +249,7 @@ importers: version: 9.1.1(mobx@6.12.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-themes: specifier: ^0.2.1 - version: 0.2.1(next@16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 0.2.1(next@14.2.32(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: 'catalog:' version: 18.3.1 @@ -286,7 +286,7 @@ importers: version: link:../../packages/typescript-config '@react-router/dev': specifier: 'catalog:' - version: 7.9.5(@react-router/serve@7.9.5(react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(jiti@2.6.1)(react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.44.1)(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))(yaml@2.8.2) + version: 7.9.5(@react-router/serve@7.9.5(react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))(yaml@2.8.1) '@types/lodash-es': specifier: 'catalog:' version: 4.17.12 @@ -304,10 +304,10 @@ importers: version: 5.8.3 vite: specifier: 7.1.11 - version: 7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2) + version: 7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) + version: 5.1.4(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) apps/live: dependencies: @@ -328,7 +328,7 @@ importers: version: 2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) '@hocuspocus/transformer': specifier: 2.15.2 - version: 2.15.2(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)(y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27) + version: 2.15.2(@tiptap/core@2.26.3(@tiptap/pm@3.6.6))(@tiptap/pm@3.6.6)(y-prosemirror@1.3.7(prosemirror-model@1.25.3)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27) '@plane/decorators': specifier: workspace:* version: link:../../packages/decorators @@ -349,10 +349,10 @@ importers: version: 10.27.0 '@tiptap/core': specifier: 'catalog:' - version: 2.27.1(@tiptap/pm@2.27.1) + version: 2.26.3(@tiptap/pm@3.6.6) '@tiptap/html': specifier: 'catalog:' - version: 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) + version: 2.26.2(@tiptap/core@2.26.3(@tiptap/pm@3.6.6))(@tiptap/pm@3.6.6) axios: specifier: 'catalog:' version: 1.12.0 @@ -382,7 +382,7 @@ importers: version: 8.18.3 y-prosemirror: specifier: ^1.3.7 - version: 1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + version: 1.3.7(prosemirror-model@1.25.3)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) y-protocols: specifier: ^1.0.6 version: 1.0.6(yjs@13.6.27) @@ -407,7 +407,7 @@ importers: version: 4.17.23 '@types/express-ws': specifier: ^3.0.5 - version: 3.0.6 + version: 3.0.5 '@types/node': specifier: 'catalog:' version: 22.12.0 @@ -476,7 +476,7 @@ importers: version: 4.1.0 isbot: specifier: ^5.1.31 - version: 5.1.32 + version: 5.1.31 lodash-es: specifier: 'catalog:' version: 4.17.21 @@ -494,7 +494,7 @@ importers: version: 6.0.8(mobx@6.12.0) next-themes: specifier: ^0.2.1 - version: 0.2.1(next@16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 0.2.1(next@14.2.32(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: 'catalog:' version: 18.3.1 @@ -534,7 +534,7 @@ importers: version: link:../../packages/typescript-config '@react-router/dev': specifier: 'catalog:' - version: 7.9.5(@react-router/serve@7.9.5(react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(jiti@2.6.1)(react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.44.1)(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))(yaml@2.8.2) + version: 7.9.5(@react-router/serve@7.9.5(react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))(yaml@2.8.1) '@types/lodash-es': specifier: 'catalog:' version: 4.17.12 @@ -552,10 +552,10 @@ importers: version: 5.8.3 vite: specifier: 7.1.11 - version: 7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2) + version: 7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) + version: 5.1.4(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) apps/web: dependencies: @@ -612,7 +612,7 @@ importers: version: 2.11.8 '@posthog/react': specifier: ^1.4.0 - version: 1.5.2(@types/react@18.3.11)(posthog-js@1.302.2)(react@18.3.1) + version: 1.4.0(@types/react@18.3.11)(posthog-js@1.255.1)(react@18.3.1) '@react-pdf/renderer': specifier: ^3.4.5 version: 3.4.5(react@18.3.1) @@ -642,13 +642,13 @@ importers: version: 4.1.0 emoji-picker-react: specifier: ^4.5.16 - version: 4.16.1(react@18.3.1) + version: 4.12.2(react@18.3.1) export-to-csv: specifier: ^1.4.0 version: 1.4.0 isbot: specifier: ^5.1.31 - version: 5.1.32 + version: 5.1.31 lodash-es: specifier: 'catalog:' version: 4.17.21 @@ -666,10 +666,10 @@ importers: version: 6.0.8(mobx@6.12.0) next-themes: specifier: ^0.2.1 - version: 0.2.1(next@16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 0.2.1(next@14.2.32(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) posthog-js: specifier: ^1.255.1 - version: 1.302.2 + version: 1.255.1 react: specifier: 'catalog:' version: 18.3.1 @@ -699,7 +699,7 @@ importers: version: 6.3.0(react@18.3.1) react-pdf-html: specifier: ^2.1.2 - version: 2.1.4(@react-pdf/renderer@3.4.5(react@18.3.1))(react@18.3.1) + version: 2.1.3(@react-pdf/renderer@3.4.5(react@18.3.1))(react@18.3.1) react-popper: specifier: ^2.3.0 version: 2.3.0(@popperjs/core@2.11.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -742,7 +742,7 @@ importers: version: link:../../packages/typescript-config '@react-router/dev': specifier: 'catalog:' - version: 7.9.5(@react-router/serve@7.9.5(react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(jiti@2.6.1)(react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.44.1)(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))(yaml@2.8.2) + version: 7.9.5(@react-router/serve@7.9.5(react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))(yaml@2.8.1) '@types/lodash-es': specifier: 'catalog:' version: 4.17.12 @@ -763,10 +763,10 @@ importers: version: 5.8.3 vite: specifier: 7.1.11 - version: 7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2) + version: 7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) + version: 5.1.4(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) packages/codemods: devDependencies: @@ -784,7 +784,7 @@ importers: version: 17.3.0 vitest: specifier: ^4.0.8 - version: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2) + version: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) packages/constants: dependencies: @@ -866,67 +866,76 @@ importers: version: link:../utils '@tiptap/core': specifier: 'catalog:' - version: 2.27.1(@tiptap/pm@2.27.1) + version: 2.26.3(@tiptap/pm@2.26.1) '@tiptap/extension-blockquote': specifier: ^2.22.3 - version: 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + version: 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) '@tiptap/extension-character-count': specifier: ^2.22.3 - version: 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) + version: 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1) '@tiptap/extension-collaboration': specifier: ^2.22.3 - version: 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)(y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)) + version: 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)(y-prosemirror@1.3.7(prosemirror-model@1.25.3)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)) + '@tiptap/extension-document': + specifier: ^2.22.3 + version: 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) '@tiptap/extension-emoji': specifier: ^2.22.3 - version: 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)(@tiptap/suggestion@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1))(emojibase@17.0.0) + version: 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)(@tiptap/suggestion@2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1))(emojibase@16.0.0) + '@tiptap/extension-heading': + specifier: ^2.22.3 + version: 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) '@tiptap/extension-image': specifier: ^2.22.3 - version: 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + version: 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) '@tiptap/extension-list-item': specifier: ^2.22.3 - version: 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + version: 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) '@tiptap/extension-mention': specifier: ^2.22.3 - version: 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)(@tiptap/suggestion@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)) + version: 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)(@tiptap/suggestion@2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)) '@tiptap/extension-placeholder': specifier: ^2.22.3 - version: 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) + version: 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1) '@tiptap/extension-task-item': specifier: ^2.22.3 - version: 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) + version: 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1) '@tiptap/extension-task-list': specifier: ^2.22.3 - version: 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + version: 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) + '@tiptap/extension-text': + specifier: ^2.22.3 + version: 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) '@tiptap/extension-text-align': specifier: ^2.22.3 - version: 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + version: 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) '@tiptap/extension-text-style': specifier: ^2.22.3 - version: 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + version: 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) '@tiptap/extension-underline': specifier: ^2.22.3 - version: 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + version: 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) '@tiptap/html': specifier: 'catalog:' - version: 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) + version: 2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1) '@tiptap/pm': specifier: ^2.22.3 - version: 2.27.1 + version: 2.26.1 '@tiptap/react': specifier: ^2.22.3 - version: 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tiptap/starter-kit': specifier: ^2.22.3 - version: 2.27.1 + version: 2.26.1 '@tiptap/suggestion': specifier: ^2.22.3 - version: 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) + version: 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1) buffer: specifier: ^6.0.3 version: 6.0.3 emoji-regex: specifier: ^10.3.0 - version: 10.6.0 + version: 10.5.0 highlight.js: specifier: ^11.8.0 version: 11.11.1 @@ -947,7 +956,7 @@ importers: version: 0.469.0(react@18.3.1) prosemirror-codemark: specifier: ^0.4.2 - version: 0.4.2(prosemirror-inputrules@1.5.1)(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.40.0) + version: 0.4.2(prosemirror-inputrules@1.5.0)(prosemirror-model@1.25.3)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0) react: specifier: 'catalog:' version: 18.3.1 @@ -959,7 +968,7 @@ importers: version: 6.3.7 tiptap-markdown: specifier: ^0.8.10 - version: 0.8.10(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + version: 0.8.10(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) uuid: specifier: 'catalog:' version: 13.0.0 @@ -968,7 +977,7 @@ importers: version: 9.0.12(yjs@13.6.27) y-prosemirror: specifier: ^1.2.15 - version: 1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + version: 1.3.7(prosemirror-model@1.25.3)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) y-protocols: specifier: ^1.0.6 version: 1.0.6(yjs@13.6.27) @@ -1030,7 +1039,7 @@ importers: version: link:../utils intl-messageformat: specifier: ^10.7.11 - version: 10.7.18 + version: 10.7.16 lodash-es: specifier: 'catalog:' version: 4.17.21 @@ -1067,10 +1076,10 @@ importers: dependencies: express-winston: specifier: ^4.2.0 - version: 4.2.0(winston@3.19.0) + version: 4.2.0(winston@3.17.0) winston: specifier: ^3.17.0 - version: 3.19.0 + version: 3.17.0 devDependencies: '@plane/typescript-config': specifier: workspace:* @@ -1116,7 +1125,7 @@ importers: version: 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) framer-motion: specifier: ^12.23.0 - version: 12.23.25(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) frimousse: specifier: ^0.3.0 version: 0.3.0(react@18.3.1)(typescript@5.8.3) @@ -1137,7 +1146,7 @@ importers: version: 2.15.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) tailwind-merge: specifier: ^3.3.1 - version: 3.4.0 + version: 3.3.1 use-font-face-observer: specifier: ^1.3.0 version: 1.3.0(react@18.3.1) @@ -1150,13 +1159,13 @@ importers: version: link:../typescript-config '@storybook/addon-designs': specifier: 10.0.2 - version: 10.0.2(@storybook/addon-docs@9.1.10(@types/react@18.3.11)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))) + version: 10.0.2(@storybook/addon-docs@9.1.10(@types/react@18.3.11)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))) '@storybook/addon-docs': specifier: 9.1.10 - version: 9.1.10(@types/react@18.3.11)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))) + version: 9.1.10(@types/react@18.3.11)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))) '@storybook/react-vite': specifier: 9.1.10 - version: 9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.53.3)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) + version: 9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.52.4)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) '@types/react': specifier: 'catalog:' version: 18.3.11 @@ -1165,7 +1174,7 @@ importers: version: 18.3.1 storybook: specifier: 9.1.10 - version: 9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) + version: 9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) tsdown: specifier: 'catalog:' version: 0.16.0(typescript@5.8.3) @@ -1186,7 +1195,7 @@ importers: version: 1.12.0 file-type: specifier: ^21.0.0 - version: 21.1.1 + version: 21.0.0 devDependencies: '@plane/typescript-config': specifier: workspace:* @@ -1245,22 +1254,22 @@ importers: devDependencies: '@tailwindcss/container-queries': specifier: ^0.1.1 - version: 0.1.1(tailwindcss@3.4.18(yaml@2.8.2)) + version: 0.1.1(tailwindcss@3.4.17) '@tailwindcss/typography': specifier: ^0.5.9 - version: 0.5.19(tailwindcss@3.4.18(yaml@2.8.2)) + version: 0.5.16(tailwindcss@3.4.17) autoprefixer: specifier: ^10.4.14 - version: 10.4.22(postcss@8.5.6) + version: 10.4.21(postcss@8.5.6) postcss: specifier: ^8.4.38 version: 8.5.6 tailwindcss: specifier: ^3.4.17 - version: 3.4.18(yaml@2.8.2) + version: 3.4.17 tailwindcss-animate: specifier: ^1.0.6 - version: 1.0.7(tailwindcss@3.4.18(yaml@2.8.2)) + version: 1.0.7(tailwindcss@3.4.17) packages/types: dependencies: @@ -1384,10 +1393,10 @@ importers: version: 8.6.14(storybook@8.6.14(prettier@3.7.4)) '@storybook/addon-styling-webpack': specifier: ^1.0.0 - version: 1.0.1(storybook@8.6.14(prettier@3.7.4))(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)) + version: 1.0.1(storybook@8.6.14(prettier@3.7.4))(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)) '@storybook/addon-webpack5-compiler-swc': specifier: ^1.0.2 - version: 1.0.6(@swc/helpers@0.5.17)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)) + version: 1.0.6(@swc/helpers@0.5.17)(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)) '@storybook/blocks': specifier: ^8.1.1 version: 8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(prettier@3.7.4)) @@ -1396,7 +1405,7 @@ importers: version: 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.7.4)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(prettier@3.7.4))(typescript@5.8.3) '@storybook/react-webpack5': specifier: ^8.1.1 - version: 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.7.4)))(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(prettier@3.7.4))(typescript@5.8.3) + version: 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.7.4)))(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(prettier@3.7.4))(typescript@5.8.3) '@storybook/test': specifier: ^8.1.1 version: 8.6.14(storybook@8.6.14(prettier@3.7.4)) @@ -1417,10 +1426,10 @@ importers: version: 18.3.1 autoprefixer: specifier: ^10.4.19 - version: 10.4.22(postcss@8.5.6) + version: 10.4.21(postcss@8.5.6) postcss-cli: specifier: ^11.0.0 - version: 11.0.1(jiti@2.6.1)(postcss@8.5.6) + version: 11.0.1(jiti@2.5.1)(postcss@8.5.6) postcss-nested: specifier: ^6.0.1 version: 6.2.0(postcss@8.5.6) @@ -1525,6 +1534,10 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + '@apm-js-collab/code-transformer@0.8.2': resolution: {integrity: sha512-YRjJjNq5KFSjDUoqu5pFUWrrsvGOxl6c3bu+uMFc9HNNptZ2rNU/TI2nLw4jnhQNtka972Ee2m3uqbvDQtPeCA==} @@ -1544,12 +1557,20 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.28.5': - resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} + '@babel/compat-data@7.28.4': + resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.3': + resolution: {integrity: sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.4': + resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} engines: {node: '>=6.9.0'} - '@babel/core@7.28.5': - resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} engines: {node: '>=6.9.0'} '@babel/generator@7.28.5': @@ -1564,8 +1585,8 @@ packages: resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.28.5': - resolution: {integrity: sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==} + '@babel/helper-create-class-features-plugin@7.28.3': + resolution: {integrity: sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1574,8 +1595,8 @@ packages: resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.28.5': - resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.27.1': @@ -1610,6 +1631,10 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} @@ -1622,6 +1647,16 @@ packages: resolution: {integrity: sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==} engines: {node: '>=6.9.0'} + '@babel/parser@7.28.3': + resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/parser@7.28.5': resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} engines: {node: '>=6.0.0'} @@ -1681,8 +1716,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.28.5': - resolution: {integrity: sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==} + '@babel/plugin-transform-typescript@7.28.0': + resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1693,8 +1728,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-typescript@7.28.5': - resolution: {integrity: sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==} + '@babel/preset-typescript@7.27.1': + resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1713,8 +1748,20 @@ packages: resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.5': - resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + '@babel/traverse@7.28.3': + resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.4': + resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.2': + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} engines: {node: '>=6.9.0'} '@babel/types@7.28.5': @@ -1783,8 +1830,8 @@ packages: resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} engines: {node: '>=0.1.90'} - '@dabh/diagnostics@2.0.8': - resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==} + '@dabh/diagnostics@2.0.3': + resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} '@date-fns/tz@1.4.1': resolution: {integrity: sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA==} @@ -1793,21 +1840,33 @@ packages: resolution: {integrity: sha512-fqcQxcxC4LOaUlW8IkyWw8x0yirlLUkbxohz9OnWvVWjf73J5yyw7jxWnkOJaUKXZotcGEScDox9MU6rSkcDgg==} hasBin: true - '@ecies/ciphers@0.2.5': - resolution: {integrity: sha512-GalEZH4JgOMHYYcYmVqnFirFsjZHeoGMDt9IxEnM9F7GRUUyUksJ7Ou53L83WHJq3RWKD3AcBpo0iQh0oMpf8A==} + '@ecies/ciphers@0.2.4': + resolution: {integrity: sha512-t+iX+Wf5nRKyNzk8dviW3Ikb/280+aEJAnw9YXvCp2tYGPSkMki+NRY+8aNLmVFv3eNtMdvViPNOPxS8SZNP+w==} engines: {bun: '>=1', deno: '>=2', node: '>=16'} peerDependencies: '@noble/ciphers': ^1.0.0 + '@emnapi/core@1.5.0': + resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} + '@emnapi/core@1.7.1': resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + '@emnapi/runtime@1.7.1': resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@emotion/is-prop-valid@1.3.1': + resolution: {integrity: sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + '@esbuild/aix-ppc64@0.25.0': resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} engines: {node: '>=18'} @@ -1964,8 +2023,8 @@ packages: 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==} + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/config-array@0.21.1': @@ -1980,8 +2039,8 @@ packages: resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.3': - resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/js@9.39.1': @@ -2025,20 +2084,20 @@ packages: '@floating-ui/utils@0.2.10': resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} - '@formatjs/ecma402-abstract@2.3.6': - resolution: {integrity: sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw==} + '@formatjs/ecma402-abstract@2.3.4': + resolution: {integrity: sha512-qrycXDeaORzIqNhBOx0btnhpD1c+/qFIHAN9znofuMJX6QBwtbrmlpWfD4oiUUD2vJUOIYFA/gYtg2KAMGG7sA==} '@formatjs/fast-memoize@2.2.7': resolution: {integrity: sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==} - '@formatjs/icu-messageformat-parser@2.11.4': - resolution: {integrity: sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw==} + '@formatjs/icu-messageformat-parser@2.11.2': + resolution: {integrity: sha512-AfiMi5NOSo2TQImsYAg8UYddsNJ/vUEv/HaNqiFjnI3ZFfWihUtD5QtuX6kHl8+H+d3qvnE/3HZrfzgdWpsLNA==} - '@formatjs/icu-skeleton-parser@1.8.16': - resolution: {integrity: sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ==} + '@formatjs/icu-skeleton-parser@1.8.14': + resolution: {integrity: sha512-i4q4V4qslThK4Ig8SxyD76cp3+QJ3sAqr7f6q9VVfeGtxG9OhiAk3y9XF6Q41OymsKzsGQ6OQQoJNY4/lI8TcQ==} - '@formatjs/intl-localematcher@0.6.2': - resolution: {integrity: sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==} + '@formatjs/intl-localematcher@0.6.1': + resolution: {integrity: sha512-ePEgLgVCqi2BBFnTMWPfIghu6FkbZnnBVhO2sSxvLfrdFw7wCHAHiDoM2h4NRgjbaY7+B7HgOLZGkK187pZTZg==} '@headlessui/react@1.7.19': resolution: {integrity: sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==} @@ -2115,137 +2174,11 @@ packages: peerDependencies: react: '*' - '@img/colour@1.0.0': - resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} - engines: {node: '>=18'} - - '@img/sharp-darwin-arm64@0.34.4': - resolution: {integrity: sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [darwin] - - '@img/sharp-darwin-x64@0.34.4': - resolution: {integrity: sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [darwin] - - '@img/sharp-libvips-darwin-arm64@1.2.3': - resolution: {integrity: sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==} - cpu: [arm64] - os: [darwin] - - '@img/sharp-libvips-darwin-x64@1.2.3': - resolution: {integrity: sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==} - cpu: [x64] - os: [darwin] - - '@img/sharp-libvips-linux-arm64@1.2.3': - resolution: {integrity: sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==} - cpu: [arm64] - os: [linux] - - '@img/sharp-libvips-linux-arm@1.2.3': - resolution: {integrity: sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==} - cpu: [arm] - os: [linux] - - '@img/sharp-libvips-linux-ppc64@1.2.3': - resolution: {integrity: sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==} - cpu: [ppc64] - os: [linux] - - '@img/sharp-libvips-linux-s390x@1.2.3': - resolution: {integrity: sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==} - cpu: [s390x] - os: [linux] - - '@img/sharp-libvips-linux-x64@1.2.3': - resolution: {integrity: sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==} - cpu: [x64] - os: [linux] - - '@img/sharp-libvips-linuxmusl-arm64@1.2.3': - resolution: {integrity: sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==} - cpu: [arm64] - os: [linux] - - '@img/sharp-libvips-linuxmusl-x64@1.2.3': - resolution: {integrity: sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==} - cpu: [x64] - os: [linux] - - '@img/sharp-linux-arm64@0.34.4': - resolution: {integrity: sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - - '@img/sharp-linux-arm@0.34.4': - resolution: {integrity: sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm] - os: [linux] - - '@img/sharp-linux-ppc64@0.34.4': - resolution: {integrity: sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [ppc64] - os: [linux] - - '@img/sharp-linux-s390x@0.34.4': - resolution: {integrity: sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [s390x] - os: [linux] - - '@img/sharp-linux-x64@0.34.4': - resolution: {integrity: sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - - '@img/sharp-linuxmusl-arm64@0.34.4': - resolution: {integrity: sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - - '@img/sharp-linuxmusl-x64@0.34.4': - resolution: {integrity: sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - - '@img/sharp-wasm32@0.34.4': - resolution: {integrity: sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [wasm32] - - '@img/sharp-win32-arm64@0.34.4': - resolution: {integrity: sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [win32] - - '@img/sharp-win32-ia32@0.34.4': - resolution: {integrity: sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [ia32] - os: [win32] - - '@img/sharp-win32-x64@0.34.4': - resolution: {integrity: sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [win32] - '@intercom/messenger-js-sdk@0.0.12': resolution: {integrity: sha512-xoUGlKLD8nIcZaH7AesR/LfwXH4QQUdPZMV4sApK/zvVFBgAY/A9IWp1ey/jUcp+776ejtZeEqreJZxG4LdEuw==} - '@ioredis/commands@1.5.0': - resolution: {integrity: sha512-eUgLqrMf8nJkZxT24JvVRrQya1vZkQh8BBeYNwGDqa5I0VUi8ACx7uFvAaLxintokpTenkK6DASvo/bvNbBGow==} + '@ioredis/commands@1.3.0': + resolution: {integrity: sha512-M/T6Zewn7sDaBQEqIZ8Rb+i9y8qfGmq+5SDFSf9sA2lUZTmdDLVdOiQaeDp+Q4wElZ9HG1GAX5KhDaidp6LQsQ==} '@isaacs/balanced-match@4.0.1': resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} @@ -2284,6 +2217,9 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.30': + resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} @@ -2302,8 +2238,8 @@ packages: '@lit/reactive-element@1.6.3': resolution: {integrity: sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==} - '@mdx-js/react@3.1.1': - resolution: {integrity: sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==} + '@mdx-js/react@3.1.0': + resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==} peerDependencies: '@types/react': '>=16' react: '>=16' @@ -2317,53 +2253,59 @@ packages: '@napi-rs/wasm-runtime@1.1.0': resolution: {integrity: sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==} - '@next/env@16.0.7': - resolution: {integrity: sha512-gpaNgUh5nftFKRkRQGnVi5dpcYSKGcZZkQffZ172OrG/XkrnS7UBTQ648YY+8ME92cC4IojpI2LqTC8sTDhAaw==} + '@next/env@14.2.32': + resolution: {integrity: sha512-n9mQdigI6iZ/DF6pCTwMKeWgF2e8lg7qgt5M7HXMLtyhZYMnf/u905M18sSpPmHL9MKp9JHo56C6jrD2EvWxng==} - '@next/swc-darwin-arm64@16.0.7': - resolution: {integrity: sha512-LlDtCYOEj/rfSnEn/Idi+j1QKHxY9BJFmxx7108A6D8K0SB+bNgfYQATPk/4LqOl4C0Wo3LACg2ie6s7xqMpJg==} + '@next/swc-darwin-arm64@14.2.32': + resolution: {integrity: sha512-osHXveM70zC+ilfuFa/2W6a1XQxJTvEhzEycnjUaVE8kpUS09lDpiDDX2YLdyFCzoUbvbo5r0X1Kp4MllIOShw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@16.0.7': - resolution: {integrity: sha512-rtZ7BhnVvO1ICf3QzfW9H3aPz7GhBrnSIMZyr4Qy6boXF0b5E3QLs+cvJmg3PsTCG2M1PBoC+DANUi4wCOKXpA==} + '@next/swc-darwin-x64@14.2.32': + resolution: {integrity: sha512-P9NpCAJuOiaHHpqtrCNncjqtSBi1f6QUdHK/+dNabBIXB2RUFWL19TY1Hkhu74OvyNQEYEzzMJCMQk5agjw1Qg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@16.0.7': - resolution: {integrity: sha512-mloD5WcPIeIeeZqAIP5c2kdaTa6StwP4/2EGy1mUw8HiexSHGK/jcM7lFuS3u3i2zn+xH9+wXJs6njO7VrAqww==} + '@next/swc-linux-arm64-gnu@14.2.32': + resolution: {integrity: sha512-v7JaO0oXXt6d+cFjrrKqYnR2ubrD+JYP7nQVRZgeo5uNE5hkCpWnHmXm9vy3g6foMO8SPwL0P3MPw1c+BjbAzA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@16.0.7': - resolution: {integrity: sha512-+ksWNrZrthisXuo9gd1XnjHRowCbMtl/YgMpbRvFeDEqEBd523YHPWpBuDjomod88U8Xliw5DHhekBC3EOOd9g==} + '@next/swc-linux-arm64-musl@14.2.32': + resolution: {integrity: sha512-tA6sIKShXtSJBTH88i0DRd6I9n3ZTirmwpwAqH5zdJoQF7/wlJXR8DkPmKwYl5mFWhEKr5IIa3LfpMW9RRwKmQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@16.0.7': - resolution: {integrity: sha512-4WtJU5cRDxpEE44Ana2Xro1284hnyVpBb62lIpU5k85D8xXxatT+rXxBgPkc7C1XwkZMWpK5rXLXTh9PFipWsA==} + '@next/swc-linux-x64-gnu@14.2.32': + resolution: {integrity: sha512-7S1GY4TdnlGVIdeXXKQdDkfDysoIVFMD0lJuVVMeb3eoVjrknQ0JNN7wFlhCvea0hEk0Sd4D1hedVChDKfV2jw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@16.0.7': - resolution: {integrity: sha512-HYlhqIP6kBPXalW2dbMTSuB4+8fe+j9juyxwfMwCe9kQPPeiyFn7NMjNfoFOfJ2eXkeQsoUGXg+O2SE3m4Qg2w==} + '@next/swc-linux-x64-musl@14.2.32': + resolution: {integrity: sha512-OHHC81P4tirVa6Awk6eCQ6RBfWl8HpFsZtfEkMpJ5GjPsJ3nhPe6wKAJUZ/piC8sszUkAgv3fLflgzPStIwfWg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@16.0.7': - resolution: {integrity: sha512-EviG+43iOoBRZg9deGauXExjRphhuYmIOJ12b9sAPy0eQ6iwcPxfED2asb/s2/yiLYOdm37kPaiZu8uXSYPs0Q==} + '@next/swc-win32-arm64-msvc@14.2.32': + resolution: {integrity: sha512-rORQjXsAFeX6TLYJrCG5yoIDj+NKq31Rqwn8Wpn/bkPNy5rTHvOXkW8mLFonItS7QC6M+1JIIcLe+vOCTOYpvg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@16.0.7': - resolution: {integrity: sha512-gniPjy55zp5Eg0896qSrf3yB1dw4F/3s8VK1ephdsZZ129j2n6e1WqCbE2YgcKhW9hPB9TVZENugquWJD5x0ug==} + '@next/swc-win32-ia32-msvc@14.2.32': + resolution: {integrity: sha512-jHUeDPVHrgFltqoAqDB6g6OStNnFxnc7Aks3p0KE0FbwAvRg6qWKYF5mSTdCTxA3axoSAUwxYdILzXJfUwlHhA==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@next/swc-win32-x64-msvc@14.2.32': + resolution: {integrity: sha512-2N0lSoU4GjfLSO50wvKpMQgKd4HdI2UHEhQPPPnlgfBJlOgJxkjpkYBqzk08f1gItBB6xF/n+ykso2hgxuydsA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2578,8 +2520,8 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/semantic-conventions@1.38.0': - resolution: {integrity: sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==} + '@opentelemetry/semantic-conventions@1.37.0': + resolution: {integrity: sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA==} engines: {node: '>=14'} '@opentelemetry/sql-common@0.41.2': @@ -2686,11 +2628,8 @@ packages: '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - '@posthog/core@1.7.1': - resolution: {integrity: sha512-kjK0eFMIpKo9GXIbts8VtAknsoZ18oZorANdtuTj1CbgS28t4ZVq//HAWhnxEuXRTrtkd+SUJ6Ux3j2Af8NCuA==} - - '@posthog/react@1.5.2': - resolution: {integrity: sha512-KHdXbV1yba7Y2l8BVmwXlySWxqKVLNQ5ZiVvWOf7r3Eo7GIFxCM4CaNK/z83kKWn8KTskmKy7AGF6Hl6INWK3g==} + '@posthog/react@1.4.0': + resolution: {integrity: sha512-xzPeZ753fQ0deZzdgY/0YavZvNpmdaxUzLYJYu5XjONNcZ8PwJnNLEK+7D/Cj8UM4Q8nWI7QC5mjum0uLWa4FA==} peerDependencies: '@types/react': '>=16.8.0' posthog-js: '>=1.257.2' @@ -2708,8 +2647,8 @@ packages: peerDependencies: '@opentelemetry/api': ^1.8 - '@quansync/fs@1.0.0': - resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} + '@quansync/fs@0.1.5': + resolution: {integrity: sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA==} '@radix-ui/number@1.1.1': resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} @@ -2840,19 +2779,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-primitive@2.1.4': - resolution: {integrity: sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-scroll-area@1.2.10': resolution: {integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==} peerDependencies: @@ -2875,15 +2801,6 @@ packages: '@types/react': optional: true - '@radix-ui/react-slot@1.2.4': - resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@radix-ui/react-use-callback-ref@1.1.1': resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} peerDependencies: @@ -2938,8 +2855,8 @@ packages: '@react-pdf/font@2.5.2': resolution: {integrity: sha512-Ud0EfZ2FwrbvwAWx8nz+KKLmiqACCH9a/N/xNDOja0e/YgSnqTpuyHegFBgIMKjuBtO5dNvkb4dXkxAhGe/ayw==} - '@react-pdf/font@4.0.3': - resolution: {integrity: sha512-N1qQDZr6phXYQOp033Hvm2nkUkx2LkszjGPbmRavs9VOYzi4sp31MaccMKptL24ii6UhBh/z9yPUhnuNe/qHwA==} + '@react-pdf/font@4.0.2': + resolution: {integrity: sha512-/dAWu7Y2RD1RxarDZ9SkYPHgBYOhmcDnet4W/qN/m8k+A2Hr3ja54GymSR7GGxWBtxjKtNauVKrTa9LS1n8WUw==} '@react-pdf/image@2.3.6': resolution: {integrity: sha512-7iZDYZrZlJqNzS6huNl2XdMcLFUo68e6mOdzQeJ63d5eApdthhSHBnkGzHfLhH5t8DCpZNtClmklzuLL63ADfw==} @@ -2950,8 +2867,8 @@ packages: '@react-pdf/pdfkit@3.2.0': resolution: {integrity: sha512-OBfCcnTC6RpD9uv9L2woF60Zj1uQxhLFzTBXTdcYE9URzPE/zqXIyzpXEA4Vf3TFbvBCgFE2RzJ2ZUS0asq7yA==} - '@react-pdf/pdfkit@4.0.4': - resolution: {integrity: sha512-/nITLggsPlB66bVLnm0X7MNdKQxXelLGZG6zB5acF5cCgkFwmXHnLNyxYOUD4GMOMg1HOPShXDKWrwk2ZeHsvw==} + '@react-pdf/pdfkit@4.0.3': + resolution: {integrity: sha512-k+Lsuq8vTwWsCqTp+CCB4+2N+sOTFrzwGA7aw3H9ix/PDWR9QksbmNg0YkzGbLAPI6CeawmiLHcf4trZ5ecLPQ==} '@react-pdf/png-js@2.3.1': resolution: {integrity: sha512-pEZ18I4t1vAUS4lmhvXPmXYP4PHeblpWP/pAlMMRkEyP7tdAeHUN7taQl9sf9OPq7YITMY3lWpYpJU6t4CZgZg==} @@ -2976,14 +2893,14 @@ packages: '@react-pdf/stylesheet@4.3.0': resolution: {integrity: sha512-x7IVZOqRrUum9quuDeFXBveXwBht+z/6B0M+z4a4XjfSg1vZVvzoTl07Oa1yvQ/4yIC5yIkG2TSMWeKnDB+hrw==} - '@react-pdf/stylesheet@6.1.1': - resolution: {integrity: sha512-Iyw0A3wRIeQLN4EkaKf8yF9MvdMxiZ8JjoyzLzDHSxnKYoOA4UGu84veCb8dT9N8MxY5x7a0BUv/avTe586Plg==} + '@react-pdf/stylesheet@6.1.0': + resolution: {integrity: sha512-BGZ2sYNUp38VJUegjva/jsri3iiRGnVNjWI+G9dTwAvLNOmwFvSJzqaCsEnqQ/DW5mrTBk/577FhDY7pv6AidA==} '@react-pdf/textkit@4.4.1': resolution: {integrity: sha512-Jl9wdTqIvJ5pX+vAGz0EOhP7ut5Two9H6CzTKo/YYPeD79cM2yTXF3JzTERBC28y7LR0Waq9D2LHQjI+b/EYUQ==} - '@react-pdf/types@2.9.1': - resolution: {integrity: sha512-5GoCgG0G5NMgpPuHbKG2xcVRQt7+E5pg3IyzVIIozKG3nLcnsXW4zy25vG1ZBQA0jmo39q34au/sOnL/0d1A4w==} + '@react-pdf/types@2.9.0': + resolution: {integrity: sha512-ckj80vZLlvl9oYrQ4tovEaqKWP3O06Eb1D48/jQWbdwz1Yh7Y9v1cEmwlP8ET+a1Whp8xfdM0xduMexkuPANCQ==} '@react-router/dev@7.9.5': resolution: {integrity: sha512-MkWI4zN7VbQ0tteuJtX5hmDINNS26IW236a8lM8+o1344xdnT/ZsBvcUh8AkzDdCRYEz1blgzgirpj0Wc1gmXg==} @@ -3126,8 +3043,8 @@ packages: '@rolldown/pluginutils@1.0.0-beta.46': resolution: {integrity: sha512-xMNwJo/pHkEP/mhNVnW+zUiJDle6/hxrwO0mfSJuEVRbBfgrJFuUSRoZx/nYUw5pCjrysl9OkNXCkAdih8GCnA==} - '@rollup/pluginutils@5.3.0': - resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + '@rollup/pluginutils@5.2.0': + resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -3135,113 +3052,113 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.53.3': - resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} + '@rollup/rollup-android-arm-eabi@4.52.4': + resolution: {integrity: sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.53.3': - resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} + '@rollup/rollup-android-arm64@4.52.4': + resolution: {integrity: sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.53.3': - resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} + '@rollup/rollup-darwin-arm64@4.52.4': + resolution: {integrity: sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.53.3': - resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} + '@rollup/rollup-darwin-x64@4.52.4': + resolution: {integrity: sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.53.3': - resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} + '@rollup/rollup-freebsd-arm64@4.52.4': + resolution: {integrity: sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.53.3': - resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} + '@rollup/rollup-freebsd-x64@4.52.4': + resolution: {integrity: sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.53.3': - resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': + resolution: {integrity: sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.53.3': - resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} + '@rollup/rollup-linux-arm-musleabihf@4.52.4': + resolution: {integrity: sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.53.3': - resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} + '@rollup/rollup-linux-arm64-gnu@4.52.4': + resolution: {integrity: sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.53.3': - resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} + '@rollup/rollup-linux-arm64-musl@4.52.4': + resolution: {integrity: sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.53.3': - resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} + '@rollup/rollup-linux-loong64-gnu@4.52.4': + resolution: {integrity: sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.53.3': - resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} + '@rollup/rollup-linux-ppc64-gnu@4.52.4': + resolution: {integrity: sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.53.3': - resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} + '@rollup/rollup-linux-riscv64-gnu@4.52.4': + resolution: {integrity: sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.53.3': - resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} + '@rollup/rollup-linux-riscv64-musl@4.52.4': + resolution: {integrity: sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.53.3': - resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} + '@rollup/rollup-linux-s390x-gnu@4.52.4': + resolution: {integrity: sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.53.3': - resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} + '@rollup/rollup-linux-x64-gnu@4.52.4': + resolution: {integrity: sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.53.3': - resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} + '@rollup/rollup-linux-x64-musl@4.52.4': + resolution: {integrity: sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.53.3': - resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} + '@rollup/rollup-openharmony-arm64@4.52.4': + resolution: {integrity: sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.53.3': - resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} + '@rollup/rollup-win32-arm64-msvc@4.52.4': + resolution: {integrity: sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.53.3': - resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} + '@rollup/rollup-win32-ia32-msvc@4.52.4': + resolution: {integrity: sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.53.3': - resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} + '@rollup/rollup-win32-x64-gnu@4.52.4': + resolution: {integrity: sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.53.3': - resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} + '@rollup/rollup-win32-x64-msvc@4.52.4': + resolution: {integrity: sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==} cpu: [x64] os: [win32] @@ -3268,16 +3185,16 @@ packages: resolution: {integrity: sha512-tKSzHq1hNzB619Ssrqo25cqdQJ84R3xSSLsUWEnkGO/wcXJvpZy94gwdoS+KmH18BB1iRRRGtnMxZcUkiPSesw==} engines: {node: '>=18'} - '@sentry/babel-plugin-component-annotate@4.6.1': - resolution: {integrity: sha512-aSIk0vgBqv7PhX6/Eov+vlI4puCE0bRXzUG5HdCsHBpAfeMkI8Hva6kSOusnzKqs8bf04hU7s3Sf0XxGTj/1AA==} + '@sentry/babel-plugin-component-annotate@4.6.0': + resolution: {integrity: sha512-3soTX50JPQQ51FSbb4qvNBf4z/yP7jTdn43vMTp9E4IxvJ9HKJR7OEuKkCMszrZmWsVABXl02msqO7QisePdiQ==} engines: {node: '>= 14'} '@sentry/browser@10.27.0': resolution: {integrity: sha512-G8q362DdKp9y1b5qkQEmhTFzyWTOVB0ps1rflok0N6bVA75IEmSDX1pqJsNuY3qy14VsVHYVwQBJQsNltQLS0g==} engines: {node: '>=18'} - '@sentry/bundler-plugin-core@4.6.1': - resolution: {integrity: sha512-WPeRbnMXm927m4Kr69NTArPfI+p5/34FHftdCRI3LFPMyhZDzz6J3wLy4hzaVUgmMf10eLzmq2HGEMvpQmdynA==} + '@sentry/bundler-plugin-core@4.6.0': + resolution: {integrity: sha512-Fub2XQqrS258jjS8qAxLLU1k1h5UCNJ76i8m4qZJJdogWWaF8t00KnnTyp9TEDJzrVD64tRXS8+HHENxmeUo3g==} engines: {node: '>= 14'} '@sentry/cli-darwin@2.58.2': @@ -3381,13 +3298,10 @@ packages: peerDependencies: react: ^16.14.0 || 17.x || 18.x || 19.x - '@sentry/vite-plugin@4.6.1': - resolution: {integrity: sha512-Qvys1y3o8/bfL3ikrHnJS9zxdjt0z3POshdBl3967UcflrTqBmnGNkcVk53SlmtJWIfh85fgmrLvGYwZ2YiqNg==} + '@sentry/vite-plugin@4.6.0': + resolution: {integrity: sha512-fMR2d+EHwbzBa0S1fp45SNUTProxmyFBp+DeBWWQOSP9IU6AH6ea2rqrpMAnp/skkcdW4z4LSRrOEpMZ5rWXLw==} engines: {node: '>= 14'} - '@so-ric/colorspace@1.1.6': - resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} - '@standard-schema/spec@1.0.0': resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} @@ -3547,8 +3461,8 @@ packages: '@storybook/global@5.0.0': resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} - '@storybook/icons@1.6.0': - resolution: {integrity: sha512-hcFZIjW8yQz8O8//2WTIXylm5Xsgc+lW9ISLgUk1xGmptIJQRdlhVIXCpSyLrQaaRiyhQRaVg7l3BD9S216BHw==} + '@storybook/icons@1.4.0': + resolution: {integrity: sha512-Td73IeJxOyalzvjQL+JXx72jlIYHgs+REaHiREOqfpo3A2AYYG71AUbcv+lg7mEDIweKVCxsMQ0UKo634c8XeA==} engines: {node: '>=14.0.0'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta @@ -3664,68 +3578,68 @@ packages: peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - '@swc/core-darwin-arm64@1.15.3': - resolution: {integrity: sha512-AXfeQn0CvcQ4cndlIshETx6jrAM45oeUrK8YeEY6oUZU/qzz0Id0CyvlEywxkWVC81Ajpd8TQQ1fW5yx6zQWkQ==} + '@swc/core-darwin-arm64@1.13.5': + resolution: {integrity: sha512-lKNv7SujeXvKn16gvQqUQI5DdyY8v7xcoO3k06/FJbHJS90zEwZdQiMNRiqpYw/orU543tPaWgz7cIYWhbopiQ==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.15.3': - resolution: {integrity: sha512-p68OeCz1ui+MZYG4wmfJGvcsAcFYb6Sl25H9TxWl+GkBgmNimIiRdnypK9nBGlqMZAcxngNPtnG3kEMNnvoJ2A==} + '@swc/core-darwin-x64@1.13.5': + resolution: {integrity: sha512-ILd38Fg/w23vHb0yVjlWvQBoE37ZJTdlLHa8LRCFDdX4WKfnVBiblsCU9ar4QTMNdeTBEX9iUF4IrbNWhaF1Ng==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.15.3': - resolution: {integrity: sha512-Nuj5iF4JteFgwrai97mUX+xUOl+rQRHqTvnvHMATL/l9xE6/TJfPBpd3hk/PVpClMXG3Uvk1MxUFOEzM1JrMYg==} + '@swc/core-linux-arm-gnueabihf@1.13.5': + resolution: {integrity: sha512-Q6eS3Pt8GLkXxqz9TAw+AUk9HpVJt8Uzm54MvPsqp2yuGmY0/sNaPPNVqctCX9fu/Nu8eaWUen0si6iEiCsazQ==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.15.3': - resolution: {integrity: sha512-2Nc/s8jE6mW2EjXWxO/lyQuLKShcmTrym2LRf5Ayp3ICEMX6HwFqB1EzDhwoMa2DcUgmnZIalesq2lG3krrUNw==} + '@swc/core-linux-arm64-gnu@1.13.5': + resolution: {integrity: sha512-aNDfeN+9af+y+M2MYfxCzCy/VDq7Z5YIbMqRI739o8Ganz6ST+27kjQFd8Y/57JN/hcnUEa9xqdS3XY7WaVtSw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.15.3': - resolution: {integrity: sha512-j4SJniZ/qaZ5g8op+p1G9K1z22s/EYGg1UXIb3+Cg4nsxEpF5uSIGEE4mHUfA70L0BR9wKT2QF/zv3vkhfpX4g==} + '@swc/core-linux-arm64-musl@1.13.5': + resolution: {integrity: sha512-9+ZxFN5GJag4CnYnq6apKTnnezpfJhCumyz0504/JbHLo+Ue+ZtJnf3RhyA9W9TINtLE0bC4hKpWi8ZKoETyOQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.15.3': - resolution: {integrity: sha512-aKttAZnz8YB1VJwPQZtyU8Uk0BfMP63iDMkvjhJzRZVgySmqt/apWSdnoIcZlUoGheBrcqbMC17GGUmur7OT5A==} + '@swc/core-linux-x64-gnu@1.13.5': + resolution: {integrity: sha512-WD530qvHrki8Ywt/PloKUjaRKgstQqNGvmZl54g06kA+hqtSE2FTG9gngXr3UJxYu/cNAjJYiBifm7+w4nbHbA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.15.3': - resolution: {integrity: sha512-oe8FctPu1gnUsdtGJRO2rvOUIkkIIaHqsO9xxN0bTR7dFTlPTGi2Fhk1tnvXeyAvCPxLIcwD8phzKg6wLv9yug==} + '@swc/core-linux-x64-musl@1.13.5': + resolution: {integrity: sha512-Luj8y4OFYx4DHNQTWjdIuKTq2f5k6uSXICqx+FSabnXptaOBAbJHNbHT/06JZh6NRUouaf0mYXN0mcsqvkhd7Q==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.15.3': - resolution: {integrity: sha512-L9AjzP2ZQ/Xh58e0lTRMLvEDrcJpR7GwZqAtIeNLcTK7JVE+QineSyHp0kLkO1rttCHyCy0U74kDTj0dRz6raA==} + '@swc/core-win32-arm64-msvc@1.13.5': + resolution: {integrity: sha512-cZ6UpumhF9SDJvv4DA2fo9WIzlNFuKSkZpZmPG1c+4PFSEMy5DFOjBSllCvnqihCabzXzpn6ykCwBmHpy31vQw==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.15.3': - resolution: {integrity: sha512-B8UtogMzErUPDWUoKONSVBdsgKYd58rRyv2sHJWKOIMCHfZ22FVXICR4O/VwIYtlnZ7ahERcjayBHDlBZpR0aw==} + '@swc/core-win32-ia32-msvc@1.13.5': + resolution: {integrity: sha512-C5Yi/xIikrFUzZcyGj9L3RpKljFvKiDMtyDzPKzlsDrKIw2EYY+bF88gB6oGY5RGmv4DAX8dbnpRAqgFD0FMEw==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.15.3': - resolution: {integrity: sha512-SpZKMR9QBTecHeqpzJdYEfgw30Oo8b/Xl6rjSzBt1g0ZsXyy60KLXrp6IagQyfTYqNYE/caDvwtF2FPn7pomog==} + '@swc/core-win32-x64-msvc@1.13.5': + resolution: {integrity: sha512-YrKdMVxbYmlfybCSbRtrilc6UA8GF5aPmGKBdPvjrarvsmf4i7ZHGCEnLtfOMd3Lwbs2WUZq3WdMbozYeLU93Q==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.15.3': - resolution: {integrity: sha512-Qd8eBPkUFL4eAONgGjycZXj1jFCBW8Fd+xF0PzdTlBCWQIV1xnUT7B93wUANtW3KGjl3TRcOyxwSx/u/jyKw/Q==} + '@swc/core@1.13.5': + resolution: {integrity: sha512-WezcBo8a0Dg2rnR82zhwoR6aRNxeTGfK5QCD6TQ+kg3xx/zNT02s/0o+81h/3zhvFSB24NtqEr8FTw88O5W/JQ==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -3736,22 +3650,22 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.15': - resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@swc/helpers@0.5.17': resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - '@swc/types@0.1.25': - resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} + '@swc/helpers@0.5.5': + resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + + '@swc/types@0.1.24': + resolution: {integrity: sha512-tjTMh3V4vAORHtdTprLlfoMptu1WfTZG9Rsca6yOKyNYsRr+MUXutKmliB17orgSZk5DpnDxs8GUdd/qwYxOng==} '@tailwindcss/container-queries@0.1.1': resolution: {integrity: sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==} peerDependencies: tailwindcss: '>=3.2.0' - '@tailwindcss/typography@0.5.19': - resolution: {integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==} + '@tailwindcss/typography@0.5.16': + resolution: {integrity: sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==} peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' @@ -3799,210 +3713,213 @@ packages: peerDependencies: '@testing-library/dom': '>=7.21.4' - '@tiptap/core@2.27.1': - resolution: {integrity: sha512-nkerkl8syHj44ZzAB7oA2GPmmZINKBKCa79FuNvmGJrJ4qyZwlkDzszud23YteFZEytbc87kVd/fP76ROS6sLg==} + '@tiptap/core@2.26.3': + resolution: {integrity: sha512-TaOJzu2v5ufsOx+yu94NqXE504zmupVdFCxH1g3hk5fzZ3gT57Lh9R/27OjwM4e6o+Z3DXDl8yfFMHIcR3zUkg==} peerDependencies: '@tiptap/pm': ^2.7.0 - '@tiptap/extension-blockquote@2.27.1': - resolution: {integrity: sha512-QrUX3muElDrNjKM3nqCSAtm3H3pT33c6ON8kwRiQboOAjT/9D57Cs7XEVY7r6rMaJPeKztrRUrNVF9w/w/6B0A==} + '@tiptap/extension-blockquote@2.26.1': + resolution: {integrity: sha512-viQ6AHRhjCYYipKK6ZepBzwZpkuMvO9yhRHeUZDvlSOAh8rvsUTSre0y74nu8QRYUt4a44lJJ6BpphJK7bEgYA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-bold@2.27.1': - resolution: {integrity: sha512-g4l4p892x/r7mhea8syp3fNYODxsDrimgouQ+q4DKXIgQmm5+uNhyuEPexP3I8TFNXqQ4DlMNFoM9yCqk97etQ==} + '@tiptap/extension-bold@2.26.2': + resolution: {integrity: sha512-kNjbHZhLyDu2ZBZmJINzXg3MAW7+05KqGkcwxudC1X/DQM5V5FpW7u6TOlC+nf1I9wABgayxURyU8FsIaXDxqA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-bubble-menu@2.27.1': - resolution: {integrity: sha512-ki1R27VsSvY2tT9Q2DIlcATwLOoEjf5DsN+5sExarQ8S/ZxT/tvIjRxB8Dx7lb2a818W5f/NER26YchGtmHfpg==} + '@tiptap/extension-bubble-menu@2.26.3': + resolution: {integrity: sha512-vliC5bv/md4qkguqqL8w7LW8jnXBD1FLdSMDavHRVwdRaRnEfLRAIY7Oxtc1Voy3+762tfn912TuwDlCOPsNSQ==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-bullet-list@2.27.1': - resolution: {integrity: sha512-5FmnfXkJ76wN4EbJNzBhAlmQxho8yEMIJLchTGmXdsD/n/tsyVVtewnQYaIOj/Z7naaGySTGDmjVtLgTuQ+Sxw==} + '@tiptap/extension-bullet-list@2.26.2': + resolution: {integrity: sha512-L0qxUa5vzUciLEVtr1nY6HG8gH8432GtuX807MM/5wKiYYdbSii3I22456ZnboiozoqXrjjvYUHeB++HhOSPgQ==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-character-count@2.27.1': - resolution: {integrity: sha512-PCkPW7lOiIirM7QlzgumRaTQWbkVV+3NZ6e2k+8QnDNDAhT+kIsrXpzka7Uq3mfpJyHbbj1+oNvPhS/VIavQbA==} + '@tiptap/extension-character-count@2.26.1': + resolution: {integrity: sha512-F7LP1a9GF28thbApowWT2I41baqX74HMUTrV9LGrNXaOkW2gxZz+CDOzfHsbHyfuwfIxIjv07Qf/HKA6Cc1qbA==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-code-block@2.27.1': - resolution: {integrity: sha512-wCI5VIOfSAdkenCWFvh4m8FFCJ51EOK+CUmOC/PWUjyo2Dgn8QC8HMi015q8XF7886T0KvYVVoqxmxJSUDAYNg==} + '@tiptap/extension-code-block@2.26.2': + resolution: {integrity: sha512-MJZ4QtziIWJ1zuSW2ogAHv+UHGk3DvGbVi+Dfmo0ybonXX7vRVHE+3qT7OcdTRBF+pC2oCnsjzqwFcGBP3BbZw==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-code@2.27.1': - resolution: {integrity: sha512-i65wUGJevzBTIIUBHBc1ggVa27bgemvGl/tY1/89fEuS/0Xmre+OQjw8rCtSLevoHSiYYLgLRlvjtUSUhE4kgg==} + '@tiptap/extension-code@2.26.2': + resolution: {integrity: sha512-xnKJvzlAp75dheyaK5tLKAksHf9PtSr8a7OuPjf2IXS5K+QMtnwxx7KAHHijmecfWjLR0wyu9AvT/FWFfKi5LQ==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-collaboration@2.27.1': - resolution: {integrity: sha512-fR35dIYDHM9870zl2sHaA2ytSVcjASv8Nfnb1Mgslt/F3Lqsu9TOv/oJWi9nYBvjjrfK0RNaoGFVH7p2z7FR3w==} + '@tiptap/extension-collaboration@2.26.1': + resolution: {integrity: sha512-ozCrGW5IAzi/18Ngdi0v/Q175D7J3ZGoTffDDyPxnTK/oksfROajoe+ZIEgoDGXPeI/I7TTlTONuqQ6LZT5r7Q==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 y-prosemirror: ^1.2.11 - '@tiptap/extension-document@2.27.1': - resolution: {integrity: sha512-NtJzJY7Q/6XWjpOm5OXKrnEaofrcc1XOTYlo/SaTwl8k2bZo918Vl0IDBWhPVDsUN7kx767uHwbtuQZ+9I82hA==} + '@tiptap/extension-document@2.26.1': + resolution: {integrity: sha512-2P2IZp1NRAE+21mRuFBiP3X2WKfZ6kUC23NJKpn8bcOamY3obYqCt0ltGPhE4eR8n8QAl2fI/3jIgjR07dC8ow==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-dropcursor@2.27.1': - resolution: {integrity: sha512-3MBQRGHHZ0by3OT0CWbLKS7J3PH9PpobrXjmIR7kr0nde7+bHqxXiVNuuIf501oKU9rnEUSedipSHkLYGkmfsA==} + '@tiptap/extension-dropcursor@2.26.2': + resolution: {integrity: sha512-o5j4Gkurb/WBu1wP2tihYnZ8dENzmlxFWWMx++g6abEpn9xdud7VxHT5Ny7mBSBptI8uMwKT53weYC0on38n3g==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-emoji@2.27.1': - resolution: {integrity: sha512-mb46b5eoxDlKVqqhSRRj9D8/szaL6af5w7b5gO6qZZ4DPBDtZPo83zCqxz9nUeZBmGZPAuu/5dnOrswW5x4KHg==} + '@tiptap/extension-emoji@2.26.1': + resolution: {integrity: sha512-CtK10GF80Qr4lgJ7P6W6tVThOjpq1lh8oyoBospZ+CjD4GYcY73bdl+FP0uxhZdJsMHzaqzMP5wWQ54zHsIaIg==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 '@tiptap/suggestion': ^2.7.0 - '@tiptap/extension-floating-menu@2.27.1': - resolution: {integrity: sha512-nUk/8DbiXO69l6FDwkWso94BTf52IBoWALo+YGWT6o+FO6cI9LbUGghEX2CdmQYXCvSvwvISF2jXeLQWNZvPZQ==} + '@tiptap/extension-floating-menu@2.26.3': + resolution: {integrity: sha512-i2dsIMa0L6vjCPnTiXjPZXZqUu3sIIIAI+E1T4p0FsGYjjPTmN+AgkJqeO3bbe5XHmWcWKtgQevNCMF0kmU5rQ==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-gapcursor@2.27.1': - resolution: {integrity: sha512-A9e1jr+jGhDWzNSXtIO6PYVYhf5j/udjbZwMja+wCE/3KvZU9V3IrnGKz1xNW+2Q2BDOe1QO7j5uVL9ElR6nTA==} + '@tiptap/extension-gapcursor@2.26.2': + resolution: {integrity: sha512-a68mi8V0mh058UrBIk23f50K5JGVeRZnF6ViptIleAD/Ny1K6VLjGCz6k190de+Tb9tnQLPEwwwDcy+ZnvCmYQ==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-hard-break@2.27.1': - resolution: {integrity: sha512-W4hHa4Io6QCTwpyTlN6UAvqMIQ7t56kIUByZhyY9EWrg/+JpbfpxE1kXFLPB4ZGgwBknFOw+e4bJ1j3oAbTJFw==} + '@tiptap/extension-hard-break@2.26.2': + resolution: {integrity: sha512-OLpeTey7p3ChyEsABLPvNv7rD/8E4k1JTt+H+MUjyL0dnrZuIWluckUJCJKnV8PhR9Mifngk1MTFUilpooiv1g==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-heading@2.27.1': - resolution: {integrity: sha512-6xoC7igZlW1EmnQ5WVH9IL7P1nCQb3bBUaIDLvk7LbweEogcTUECI4Xg1vxMOVmj9tlDe1I4BsgfcKpB5KEsZw==} + '@tiptap/extension-heading@2.26.1': + resolution: {integrity: sha512-KSzL8WZV3pjJG9ke4RaU70+B5UlYR2S6olNt5UCAawM+fi11mobVztiBoC19xtpSVqIXC1AmXOqUgnuSvmE4ZA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-history@2.27.1': - resolution: {integrity: sha512-K8PHC9gegSAt0wzSlsd4aUpoEyIJYOmVVeyniHr1P1mIblW1KYEDbRGbDlrLALTyUEfMcBhdIm8zrB9X2Nihvg==} + '@tiptap/extension-history@2.26.1': + resolution: {integrity: sha512-m6YR1gkkauIDo3PRl0gP+7Oc4n5OqDzcjVh6LvWREmZP8nmi94hfseYbqOXUb6RPHIc0JKF02eiRifT4MSd2nw==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-horizontal-rule@2.27.1': - resolution: {integrity: sha512-WxXWGEEsqDmGIF2o9av+3r9Qje4CKrqrpeQY6aRO5bxvWX9AabQCfasepayBok6uwtvNzh3Xpsn9zbbSk09dNA==} + '@tiptap/extension-horizontal-rule@2.26.2': + resolution: {integrity: sha512-whlUskFUwmi7nXn4OT55xHXSAqwEAEQfZWswmae1Y5wTMDxavZ0FF4xvCVgsQ7gYG782tIgLCzriTN4AjBphIQ==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-image@2.27.1': - resolution: {integrity: sha512-wu3vMKDYWJwKS6Hrw5PPCKBO2RxyHNeFLiA/uDErEV7axzNpievK/U9DyaDXmtK3K/h1XzJAJz19X+2d/pY68w==} + '@tiptap/extension-image@2.26.1': + resolution: {integrity: sha512-96+MaYBJebQlR/ik5W72GLUfXdEoxFs+6jsoERxbM5qEdhb7TEnodBFtWZOwgDO27kFd6rSNZuW9r5KJNtljEg==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-italic@2.27.1': - resolution: {integrity: sha512-rcm0GyniWW0UhcNI9+1eIK64GqWQLyIIrWGINslvqSUoBc+WkfocLvv4CMpRkzKlfsAxwVIBuH2eLxHKDtAREA==} + '@tiptap/extension-italic@2.26.2': + resolution: {integrity: sha512-/4AiE2JWtjY9yW+MifMP8EOOwOSDKDUxCyqtGT6e4xqqFUNLZJA0o4P/MYjcKVwsa1/IsDRsOaFRlAiMmAXVXw==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-list-item@2.27.1': - resolution: {integrity: sha512-dtsxvtzxfwOJP6dKGf0vb2MJAoDF2NxoiWzpq0XTvo7NGGYUHfuHjX07Zp0dYqb4seaDXjwsi5BIQUOp3+WMFQ==} + '@tiptap/extension-list-item@2.26.1': + resolution: {integrity: sha512-quOXckC73Luc3x+Dcm88YAEBW+Crh3x5uvtQOQtn2GEG91AshrvbnhGRiYnfvEN7UhWIS+FYI5liHFcRKSUKrQ==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-mention@2.27.1': - resolution: {integrity: sha512-8qwPIum0rMK/7BaHEN0+M/VkUn00LqhqyRO8JdC/EBVrUBgxKTQsUhIhSstgVAYzD1w7cCUfTFX4bYu9lcFMEQ==} + '@tiptap/extension-mention@2.26.1': + resolution: {integrity: sha512-sBrlJ9nWjFx7oWCtt0hV192FgCBXva1zwImWbgXTCGPAjv0d5EoPymIfRgoeanAmuQjOHoKzzZnJ6bELTZhkGw==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 '@tiptap/suggestion': ^2.7.0 - '@tiptap/extension-ordered-list@2.27.1': - resolution: {integrity: sha512-U1/sWxc2TciozQsZjH35temyidYUjvroHj3PUPzPyh19w2fwKh1NSbFybWuoYs6jS3XnMSwnM2vF52tOwvfEmA==} + '@tiptap/extension-ordered-list@2.26.2': + resolution: {integrity: sha512-UVGYyWKB5wWWvrvdN/WrPXPHJoP/UD1TNyeoE75M6nq4oD4l+Nc9Y5MIPsngrv/TimbomLNilR4ZRHibEriG9w==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-paragraph@2.27.1': - resolution: {integrity: sha512-R3QdrHcUdFAsdsn2UAIvhY0yWyHjqGyP/Rv8RRdN0OyFiTKtwTPqreKMHKJOflgX4sMJl/OpHTpNG1Kaf7Lo2A==} + '@tiptap/extension-paragraph@2.26.2': + resolution: {integrity: sha512-dccyffm95nNT9arjxGOyv4/cOPF4XS5Osylccp9KYLrmiSTXEuzVIYtMXhXbc0UUdABGvbFQWi88tRxgeDTkgA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-placeholder@2.27.1': - resolution: {integrity: sha512-UbXaibHHFE+lOTlw/vs3jPzBoj1sAfbXuTAhXChjgYIcTTY5Cr6yxwcymLcimbQ79gf04Xkua2FCN3YsJxIFmw==} + '@tiptap/extension-placeholder@2.26.1': + resolution: {integrity: sha512-MBlqbkd+63btY7Qu+SqrXvWjPwooGZDsLTtl7jp52BczBl61cq9yygglt9XpM11TFMBdySgdLHBrLtQ0B7fBlw==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-strike@2.27.1': - resolution: {integrity: sha512-S9I//K8KPgfFTC5I5lorClzXk0g4lrAv9y5qHzHO5EOWt7AFl0YTg2oN8NKSIBK4bHRnPIrjJJKv+dDFnUp5jQ==} + '@tiptap/extension-strike@2.26.2': + resolution: {integrity: sha512-gY8/P8ycvICiZsa9OeTpOnSL0o+PAYH1QpBomaBhdZZ2tcsziMYN9BZto6uQARi9tdxeOYRePyZ+Junk4xsyFg==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-task-item@2.27.1': - resolution: {integrity: sha512-vaEtdos+9jApD6yRfD6F/xShikiZFHi7I0nswAmGKT/kE1wmHCUxme8OFMe7642e2OK0lqgHsUaOLxP/0nZJ5A==} + '@tiptap/extension-task-item@2.26.1': + resolution: {integrity: sha512-b7JNeOsBqEd1p2oQ5N6Msz9fr2o73WR1WsYDC0WhECg07Goud2gQEkwWkQaLsvfcwuS746eMJK/nrT2pVEngYA==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-task-list@2.27.1': - resolution: {integrity: sha512-KRlYOZ6kdURvAspUrLVsC7mLkVW2DYhpj+7QxH7gVDZuAuoPUEmpJVcBVPq7GhPF9PccaRLru+n1Ege5VqvZ+Q==} + '@tiptap/extension-task-list@2.26.1': + resolution: {integrity: sha512-xR4LMpMPZ6bpkZNmFvIojmNGtdGKNlKFbpvyIOgs4qhlWskbFQQVevglHjV1R8xJLic5c+byJQaAmQdQudqGng==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-text-align@2.27.1': - resolution: {integrity: sha512-D7dLPk7y5mDn9ZNANQ4K2gCq4vy+Emm5AdeWOGzNeqJsYrBotiQYXd9rb1QYjdup2kzAoKduMTUXV92ujo5cEg==} + '@tiptap/extension-text-align@2.26.1': + resolution: {integrity: sha512-x6mpNGELy2QtSPBoQqNgiXO9PjZoB+O2EAfXA9YRiBDSIRNOrw+7vOVpi+IgzswFmhMNgIYUVfQRud4FHUCNew==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-text-style@2.27.1': - resolution: {integrity: sha512-NagQ9qLk0Ril83gfrk+C65SvTqPjL3WVnLF2arsEVnCrxcx3uDOvdJW67f/K5HEwEHsoqJ4Zq9Irco/koXrOXA==} + '@tiptap/extension-text-style@2.26.1': + resolution: {integrity: sha512-t9Nc/UkrbCfnSHEUi1gvUQ2ZPzvfdYFT5TExoV2DTiUCkhG6+mecT5bTVFGW3QkPmbToL+nFhGn4ZRMDD0SP3Q==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-text@2.27.1': - resolution: {integrity: sha512-a4GCT+GZ9tUwl82F4CEum9/+WsuW0/De9Be/NqrMmi7eNfAwbUTbLCTFU0gEvv25WMHCoUzaeNk/qGmzeVPJ1Q==} + '@tiptap/extension-text@2.26.1': + resolution: {integrity: sha512-p2n8WVMd/2vckdJlol24acaTDIZAhI7qle5cM75bn01sOEZoFlSw6SwINOULrUCzNJsYb43qrLEibZb4j2LeQw==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-underline@2.27.1': - resolution: {integrity: sha512-fPTmfJFAQWg1O/os1pYSPVdtvly6eW/w5sDofG7pre+bdQUN+8s1cZYelSuj/ltNVioRaB2Ws7tvNgnHL0aAJQ==} + '@tiptap/extension-underline@2.26.1': + resolution: {integrity: sha512-/fufv41WDMdf0a4xmFAxONoAz08TonJXX6NEoSJmuGKO59M/Y0Pz8DTK1g32Wk44kn7dyScDiPlvvndl+UOv0A==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/html@2.27.1': - resolution: {integrity: sha512-5iPo36g4nbBVoEVBQb6my4KNpNzu38gtCFXIIlAJdAZQvPs+XC8TkrnGK/G4UGpwBXCuQjSQm0iyn4znmQPDsw==} + '@tiptap/html@2.26.2': + resolution: {integrity: sha512-I1h+aVpP94j9elO3aO49BMSISl4jrLZPhUijshFGgsSr94xRqLd/s4iBceRxeoBfhCgtHxsKaWXrdBbvL+N0pQ==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/pm@2.27.1': - resolution: {integrity: sha512-ijKo3+kIjALthYsnBmkRXAuw2Tswd9gd7BUR5OMfIcjGp8v576vKxOxrRfuYiUM78GPt//P0sVc1WV82H5N0PQ==} + '@tiptap/pm@2.26.1': + resolution: {integrity: sha512-8aF+mY/vSHbGFqyG663ds84b+vca5Lge3tHdTMTKazxCnhXR9dn2oQJMnZ78YZvdRbkPkMJJHti9h3K7u2UQvw==} + + '@tiptap/pm@3.6.6': + resolution: {integrity: sha512-E/rtpPEqPiQJrchdOUDcMPR69x96a+JeMWLL12fos4KfF7YVzQ5oUIij21RffV+qeHxug7HMUpQKBtCuJfek/Q==} - '@tiptap/react@2.27.1': - resolution: {integrity: sha512-leJximSjYJuhLJQv9azOP9R7w6zuxVgKOHYT4w83Gte7GhWMpNL6xRWzld280vyq/YW/cSYjPb/8ESEOgKNBdQ==} + '@tiptap/react@2.26.1': + resolution: {integrity: sha512-Zxlwzi1iML7aELa+PyysFD2ncVo2mEcjTkhoDok9iTbMGpm1oU8hgR1i6iHrcSNQLfaRiW6M7HNhZZQPKIC9yw==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tiptap/starter-kit@2.27.1': - resolution: {integrity: sha512-uQQlP0Nmn9eq19qm8YoOeloEfmcGbPpB1cujq54Q6nPgxaBozR7rE7tXbFTinxRW2+Hr7XyNWhpjB7DMNkdU2Q==} + '@tiptap/starter-kit@2.26.1': + resolution: {integrity: sha512-oziMGCds8SVQ3s5dRpBxVdEKZAmO/O//BjZ69mhA3q4vJdR0rnfLb5fTxSeQvHiqB878HBNn76kNaJrHrV35GA==} - '@tiptap/suggestion@2.27.1': - resolution: {integrity: sha512-yTy75ZMYgVWM18cl7YxLqMJ7TorQTGysSd1aKmBA9qd8uzYlvLMmHKE9qBDxM9HXODBz1DA/BLLm9esv2enmFw==} + '@tiptap/suggestion@2.26.1': + resolution: {integrity: sha512-iNWJdQN7h01keNoVwyCsdI7ZX11YkrexZjCnutWK17Dd72s3NYVTmQXu7saftwddT4nDdlczNxAFosrt0zMhcg==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tokenizer/inflate@0.4.1': - resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} + '@tokenizer/inflate@0.2.7': + resolution: {integrity: sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==} engines: {node: '>=18'} '@tokenizer/token@0.3.0': @@ -4029,8 +3946,8 @@ packages: '@types/body-parser@1.19.6': resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} - '@types/chai@5.2.3': - resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} '@types/compression@1.8.1': resolution: {integrity: sha512-kCFuWS0ebDbmxs0AXYn6e2r2nrGAb5KwQhknjSPSPgJcGd8+HVSILlUyFhGqML2gk39HcG7D1ydW9/qpYkN00Q==} @@ -4041,8 +3958,8 @@ packages: '@types/cors@2.8.19': resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} - '@types/d3-array@3.2.2': - resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} + '@types/d3-array@3.2.1': + resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} '@types/d3-color@3.1.3': resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} @@ -4089,14 +4006,14 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/express-serve-static-core@4.19.7': - resolution: {integrity: sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==} + '@types/express-serve-static-core@4.19.6': + resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} - '@types/express-serve-static-core@5.1.0': - resolution: {integrity: sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==} + '@types/express-serve-static-core@5.0.7': + resolution: {integrity: sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==} - '@types/express-ws@3.0.6': - resolution: {integrity: sha512-6ZDt+tMEQgM4RC1sMX1fIO7kHQkfUDlWfxoPddXUeeDjmc+Yt/fCzqXfp8rFahNr5eIxdomrWphLEWDkB2q3UQ==} + '@types/express-ws@3.0.5': + resolution: {integrity: sha512-lbWMjoHrm/v85j81UCmb/GNZFO3genxRYBW1Ob7rjRI+zxUBR+4tcFuOpKKsYQ1LYTYiy3356epLeYi/5zxUwA==} '@types/express@4.17.23': resolution: {integrity: sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==} @@ -4131,8 +4048,8 @@ packages: '@types/lodash-es@4.17.12': resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} - '@types/lodash@4.17.21': - resolution: {integrity: sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==} + '@types/lodash@4.17.20': + resolution: {integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==} '@types/markdown-it@13.0.9': resolution: {integrity: sha512-1XPwR0+MgXLWfTn9gCsZ55AHOKW1WN+P9vr0PaQh5aerR9LLQXUbjfEAFhjmEmyoYFWAyuN2Mqkn40MZ4ukjBw==} @@ -4155,6 +4072,9 @@ packages: '@types/mdx@2.0.13': resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -4204,11 +4124,11 @@ packages: '@types/semver@7.7.1': resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} - '@types/send@1.2.1': - resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} + '@types/send@0.17.5': + resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} - '@types/serve-static@2.2.0': - resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} + '@types/serve-static@1.15.8': + resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} '@types/tedious@4.0.14': resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} @@ -4249,22 +4169,60 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: 5.8.3 + '@typescript-eslint/project-service@8.44.0': + resolution: {integrity: sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: 5.8.3 + '@typescript-eslint/project-service@8.48.1': resolution: {integrity: sha512-HQWSicah4s9z2/HifRPQ6b6R7G+SBx64JlFQpgSSHWPKdvCZX57XCbszg/bapbRsOEv42q5tayTYcEFpACcX1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: 5.8.3 + '@typescript-eslint/project-service@8.49.0': + resolution: {integrity: sha512-/wJN0/DKkmRUMXjZUXYZpD1NEQzQAAn9QWfGwo+Ai8gnzqH7tvqS7oNVdTjKqOcPyVIdZdyCMoqN66Ia789e7g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: 5.8.3 + + '@typescript-eslint/scope-manager@8.44.0': + resolution: {integrity: sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.48.1': resolution: {integrity: sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.49.0': + resolution: {integrity: sha512-npgS3zi+/30KSOkXNs0LQXtsg9ekZ8OISAOLGWA/ZOEn0ZH74Ginfl7foziV8DT+D98WfQ5Kopwqb/PZOaIJGg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.44.0': + resolution: {integrity: sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: 5.8.3 + + '@typescript-eslint/tsconfig-utils@8.45.0': + resolution: {integrity: sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: 5.8.3 + '@typescript-eslint/tsconfig-utils@8.48.1': resolution: {integrity: sha512-k0Jhs4CpEffIBm6wPaCXBAD7jxBtrHjrSgtfCjUvPp9AZ78lXKdTR8fxyZO5y4vWNlOvYXRtngSZNSn+H53Jkw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: 5.8.3 + '@typescript-eslint/tsconfig-utils@8.49.0': + resolution: {integrity: sha512-8prixNi1/6nawsRYxet4YOhnbW+W9FK/bQPxsGB1D3ZrDzbJ5FXw5XmzxZv82X3B+ZccuSxo/X8q9nQ+mFecWA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: 5.8.3 + '@typescript-eslint/type-utils@8.48.1': resolution: {integrity: sha512-1jEop81a3LrJQLTf/1VfPQdhIY4PlGDBc/i67EVWObrtvcziysbLN3oReexHOM6N3jyXgCrkBsZpqwH0hiDOQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4272,16 +4230,47 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: 5.8.3 + '@typescript-eslint/types@8.44.0': + resolution: {integrity: sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/types@8.45.0': + resolution: {integrity: sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.48.1': resolution: {integrity: sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.49.0': + resolution: {integrity: sha512-e9k/fneezorUo6WShlQpMxXh8/8wfyc+biu6tnAqA81oWrEic0k21RHzP9uqqpyBBeBKu4T+Bsjy9/b8u7obXQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.44.0': + resolution: {integrity: sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: 5.8.3 + '@typescript-eslint/typescript-estree@8.48.1': resolution: {integrity: sha512-/9wQ4PqaefTK6POVTjJaYS0bynCgzh6ClJHGSBj06XEHjkfylzB+A3qvyaXnErEZSaxhIo4YdyBgq6j4RysxDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: 5.8.3 + '@typescript-eslint/typescript-estree@8.49.0': + resolution: {integrity: sha512-jrLdRuAbPfPIdYNppHJ/D0wN+wwNfJ32YTAm10eJVsFmrVpXQnDWBn8niCSMlWjvml8jsce5E/O+86IQtTbJWA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: 5.8.3 + + '@typescript-eslint/utils@8.44.0': + resolution: {integrity: sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: 5.8.3 + '@typescript-eslint/utils@8.48.1': resolution: {integrity: sha512-fAnhLrDjiVfey5wwFRwrweyRlCmdz5ZxXz2G/4cLn0YDLjTapmN4gcCsTBR1N2rWnZSDeWpYtgLDsJt+FpmcwA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4289,10 +4278,25 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: 5.8.3 + '@typescript-eslint/utils@8.49.0': + resolution: {integrity: sha512-N3W7rJw7Rw+z1tRsHZbK395TWSYvufBXumYtEGzypgMUthlg0/hmCImeA8hgO2d2G4pd7ftpxxul2J8OdtdaFA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: 5.8.3 + + '@typescript-eslint/visitor-keys@8.44.0': + resolution: {integrity: sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.48.1': resolution: {integrity: sha512-BmxxndzEWhE4TIEEMBs8lP3MBWN3jFPs/p6gPm/wkv02o41hI6cq9AuSmGAaTTHPtA1FTi2jBre4A9rm5ZmX+Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.49.0': + resolution: {integrity: sha512-LlKaciDe3GmZFphXIc79THF/YYBugZ7FS1pO581E/edlVVNbZKDy93evqmrfQ9/Y4uN0vVhX4iuchq26mK/iiA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -4590,8 +4594,8 @@ packages: ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - ansi-escapes@7.2.0: - resolution: {integrity: sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==} + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} engines: {node: '>=18'} ansi-html-community@0.0.8: @@ -4619,6 +4623,10 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + ansi-styles@6.2.3: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} @@ -4725,8 +4733,8 @@ packages: resolution: {integrity: sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==} engines: {node: '>=4'} - autoprefixer@10.4.22: - resolution: {integrity: sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==} + autoprefixer@10.4.21: + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: @@ -4736,8 +4744,8 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axe-core@4.11.0: - resolution: {integrity: sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==} + axe-core@4.10.3: + resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} engines: {node: '>=4'} axios@1.12.0: @@ -4750,6 +4758,10 @@ packages: babel-dead-code-elimination@1.0.10: resolution: {integrity: sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==} + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -4763,8 +4775,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.9.2: - resolution: {integrity: sha512-PxSsosKQjI38iXkmb3d0Y32efqyA0uW4s41u4IVBsLlWLhCiYNpH/AfNOVWRqCQBlD8TFJTz6OUWNd4DFJCnmw==} + baseline-browser-mapping@2.8.4: + resolution: {integrity: sha512-L+YvJwGAgwJBV1p6ffpSTa2KRc69EeeYGYjRVWKs0GKrK+LON0GC0gV+rKSNtALEDvMDqkvCFq9r1r94/Gjwxw==} hasBin: true basic-auth@2.0.1: @@ -4788,14 +4800,14 @@ packages: bind-event-listener@3.0.0: resolution: {integrity: sha512-PJvH288AWQhKs2v9zyfYdPzlPqf5bXbGMmhmUIY9x4dAUGIWgomO771oBQNwJnMQSnUIXhKu6sgzpBRXTlvb8Q==} - birpc@2.8.0: - resolution: {integrity: sha512-Bz2a4qD/5GRhiHSwj30c/8kC8QGj12nNDwz3D4ErQ4Xhy35dsSDvF+RA/tWpjyU0pdGtSDiEk6B5fBGE1qNVhw==} + birpc@2.9.0: + resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - body-parser@1.20.4: - resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} boolbase@1.0.0: @@ -4821,8 +4833,8 @@ packages: browserify-zlib@0.2.0: resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + browserslist@4.26.2: + resolution: {integrity: sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -4832,6 +4844,10 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + bytes@3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} @@ -4871,8 +4887,8 @@ packages: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} - caniuse-lite@1.0.30001759: - resolution: {integrity: sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==} + caniuse-lite@1.0.30001743: + resolution: {integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==} capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} @@ -5013,34 +5029,24 @@ packages: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-convert@3.1.3: - resolution: {integrity: sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==} - engines: {node: '>=14.6'} - color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-name@2.1.0: - resolution: {integrity: sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==} - engines: {node: '>=12.20'} - color-string@1.9.1: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - color-string@2.1.4: - resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==} - engines: {node: '>=18'} - - color@5.0.3: - resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==} - engines: {node: '>=18'} + color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + colorspace@1.1.4: + resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -5105,19 +5111,19 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie-signature@1.0.7: - resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} engines: {node: '>= 0.6'} - cookie@1.1.1: - resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} engines: {node: '>=18'} - core-js@3.47.0: - resolution: {integrity: sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==} + core-js@3.45.1: + resolution: {integrity: sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==} cors@2.8.5: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} @@ -5177,8 +5183,8 @@ packages: engines: {node: '>=4'} hasBin: true - csstype@3.2.3: - resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} d3-array@3.2.4: resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} @@ -5282,8 +5288,8 @@ packages: dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - dedent@1.7.0: - resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==} + dedent@1.6.0: + resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -5355,8 +5361,8 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} detect-node-es@1.1.0: @@ -5442,8 +5448,8 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} - dotenv@17.2.3: - resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} + dotenv@17.2.1: + resolution: {integrity: sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ==} engines: {node: '>=12'} dts-resolver@2.1.3: @@ -5462,27 +5468,27 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - eciesjs@0.4.16: - resolution: {integrity: sha512-dS5cbA9rA2VR4Ybuvhg6jvdmp46ubLn3E+px8cG/35aEDNclrqoCjg6mt0HYZ/M+OoESS3jSkCrqk1kWAEhWAw==} + eciesjs@0.4.15: + resolution: {integrity: sha512-r6kEJXDKecVOCj2nLMuXK/FCPeurW33+3JRpfXVbjLja3XUYFfD9I/JBreH6sUyzcm3G/YQboBjMla6poKeSdA==} engines: {bun: '>=1', deno: '>=2', node: '>=16'} ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.266: - resolution: {integrity: sha512-kgWEglXvkEfMH7rxP5OSZZwnaDWT7J9EoZCujhnpLbfi0bbNtRkgdX2E3gt0Uer11c61qCYktB3hwkAS325sJg==} + electron-to-chromium@1.5.218: + resolution: {integrity: sha512-uwwdN0TUHs8u6iRgN8vKeWZMRll4gBkz+QMqdS7DDe49uiK68/UX92lFb61oiFPrpYZNeZIqa4bA7O6Aiasnzg==} element-resize-detector@1.2.4: resolution: {integrity: sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==} - emoji-picker-react@4.16.1: - resolution: {integrity: sha512-MrPX0tOCfRL3uYI4of/2GRZ7S6qS7YlacKiF78uFH84/C62vcuHE2DZyv5b4ZJMk0e06es1jjB4e31Bb+YSM8w==} + emoji-picker-react@4.12.2: + resolution: {integrity: sha512-6PDYZGlhidt+Kc0ay890IU4HLNfIR7/OxPvcNxw+nJ4HQhMKd8pnGnPn4n2vqC/arRFCNWQhgJP8rpsYKsz0GQ==} engines: {node: '>=10'} peerDependencies: react: '>=16' - emoji-regex@10.6.0: - resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + emoji-regex@10.5.0: + resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -5495,8 +5501,8 @@ packages: peerDependencies: emojibase: '*' - emojibase@17.0.0: - resolution: {integrity: sha512-bXdpf4HPY3p41zK5swVKZdC/VynsMZ4LoLxdYDE+GucqkFwzcM1GVc4ODfYAlwoKaf2U2oNNUoOO78N96ovpBA==} + emojibase@16.0.0: + resolution: {integrity: sha512-Nw2m7JLIO4Ou2X/yZPRNscHQXVbbr6SErjkJ7EooG7MbR3yDZszCv9KTizsXFc7yZl0n3WF+qUKIC/Lw6H9xaQ==} engines: {node: '>=18.12.0'} empathic@2.0.0: @@ -5817,8 +5823,8 @@ packages: resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} engines: {node: '>=6'} - expect-type@1.2.2: - resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} export-to-csv@1.4.0: @@ -5847,8 +5853,8 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-equals@5.3.3: - resolution: {integrity: sha512-/boTcHZeIAQ2r/tL11voclBHDeP9WPxLt+tyAbVSyyXuUFyh0Tne7gJZTqGbxnvj79TjLdCXLOY7UIPhyG5MTw==} + fast-equals@5.2.2: + resolution: {integrity: sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==} engines: {node: '>=6.0.0'} fast-glob@3.3.3: @@ -5864,8 +5870,8 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-uri@3.1.0: - resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -5885,6 +5891,9 @@ packages: fflate@0.4.8: resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==} + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -5893,8 +5902,8 @@ packages: resolution: {integrity: sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==} engines: {node: '>= 12'} - file-type@21.1.1: - resolution: {integrity: sha512-ifJXo8zUqbQ/bLbl9sFoqHNTNWbnPY1COImFfM6CCy7z+E+jC1eY9YfOKkx0fckIg+VljAy2/87T61fp0+eEkg==} + file-type@21.0.0: + resolution: {integrity: sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg==} engines: {node: '>=20'} filesize@10.1.6: @@ -5905,8 +5914,8 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - finalhandler@1.3.2: - resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} find-cache-dir@2.1.0: @@ -5987,8 +5996,8 @@ packages: typescript: 5.8.3 webpack: ^5.11.0 - form-data@4.0.5: - resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} forwarded-parse@2.1.2: @@ -5998,11 +6007,11 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - fraction.js@5.3.4: - resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - framer-motion@12.23.25: - resolution: {integrity: sha512-gUHGl2e4VG66jOcH0JHhuJQr6ZNwrET9g31ZG0xdXzT0CznP7fHX4P8Bcvuc4MiUB90ysNnWX2ukHRIggkl6hQ==} + framer-motion@12.23.12: + resolution: {integrity: sha512-6e78rdVtnBvlEVgu6eFEAgG9v3wLnYEboM8I5O5EXvfKC8gxGQB8wXJdhkMy10iVcn05jl6CNw7/HTsTCfwcWg==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -6032,8 +6041,8 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} - fs-extra@11.3.2: - resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} + fs-extra@11.3.1: + resolution: {integrity: sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==} engines: {node: '>=14.14'} fs-monkey@1.1.0: @@ -6054,10 +6063,6 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - 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'} @@ -6097,6 +6102,9 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + get-tsconfig@4.13.0: resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} @@ -6276,8 +6284,8 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - html-webpack-plugin@5.6.5: - resolution: {integrity: sha512-4xynFbKNNk+WlzXeQQ+6YYsH2g7mpfPszQZUi3ovKlj+pDmngQ7vRXjrrmGROabmKwyQkcgcX5hqfOwHbFmK5g==} + html-webpack-plugin@5.6.4: + resolution: {integrity: sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw==} engines: {node: '>=10.13.0'} peerDependencies: '@rspack/core': 0.x || 1.x @@ -6295,10 +6303,6 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} - http-errors@2.0.1: - resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} - engines: {node: '>= 0.8'} - https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -6371,8 +6375,8 @@ packages: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} - intl-messageformat@10.7.18: - resolution: {integrity: sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g==} + intl-messageformat@10.7.16: + resolution: {integrity: sha512-UmdmHUmp5CIKKjSoE10la5yfU+AYJAaiYLsodbjL4lji83JNvgOQUjGaGhGrpFCb0Uh7sl7qfP1IyILa8Z40ug==} ioredis@4.30.1: resolution: {integrity: sha512-17Ed70njJ7wT7JZsdTVLb0j/cmwHwfQCFu+AP6jY7nFKd+CA7MBW7nX121mM64eT8S9ekAVtYYt8nGQPmm3euA==} @@ -6463,8 +6467,8 @@ packages: resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} engines: {node: '>=18'} - is-generator-function@1.1.2: - resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} is-glob@4.0.3: @@ -6549,8 +6553,8 @@ packages: isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isbot@5.1.32: - resolution: {integrity: sha512-VNfjM73zz2IBZmdShMfAUg10prm6t7HFUQmNAEOAVS4YH92ZrZcvkMcGX6cIgBJAzWDzPent/EeAtYEHNPNPBQ==} + isbot@5.1.31: + resolution: {integrity: sha512-DPgQshehErHAqSCKDb3rNW03pa2wS/v5evvUqtxt6TTnHRqAG8FdzcSSJs9656pK6Y+NT7K9R4acEYXLHYfpUQ==} engines: {node: '>=18'} isexe@2.0.0: @@ -6586,8 +6590,8 @@ packages: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true - jiti@2.6.1: - resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + jiti@2.5.1: + resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} hasBin: true js-tokens@4.0.0: @@ -6616,6 +6620,11 @@ packages: engines: {node: '>=6'} hasBin: 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==} @@ -6718,8 +6727,8 @@ packages: lit@2.8.0: resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} - loader-runner@4.3.1: - resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} locate-path@3.0.0: @@ -6741,6 +6750,9 @@ packages: lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} @@ -6753,6 +6765,9 @@ packages: lodash.isarguments@3.1.0: resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} @@ -6783,8 +6798,8 @@ packages: lowlight@3.3.0: resolution: {integrity: sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==} - lru-cache@11.2.4: - resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} + lru-cache@11.2.1: + resolution: {integrity: sha512-r8LA6i4LP4EeWOhqBaZZjDWwehd1xUJPCJd9Sv300H0ZmcUER4+JPh7bqqZeqs1o5pgtgvXm+d9UGrB5zZGDiQ==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -6803,6 +6818,9 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true + magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -7127,8 +7145,8 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - mobx-react-lite@4.1.1: - resolution: {integrity: sha512-iUxiMpsvNraCKXU+yPotsOncNNmyeS2B5DKL+TL6Tar/xm+wwNJAubJmtRSeAoYawdZqwv8Z/+5nPRHeQxTiXg==} + mobx-react-lite@4.1.0: + resolution: {integrity: sha512-QEP10dpHHBeQNv1pks3WnHRCem2Zp636lq54M2nKO2Sarr13pL4u6diQXf65yzXUn0mkk18SyIDCm9UOJYTi1w==} peerDependencies: mobx: ^6.9.0 react: ^16.8.0 || ^17 || ^18 || ^19 @@ -7168,8 +7186,8 @@ packages: resolution: {integrity: sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==} engines: {node: '>= 0.8.0'} - motion-dom@12.23.23: - resolution: {integrity: sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==} + motion-dom@12.23.12: + resolution: {integrity: sha512-RcR4fvMCTESQBD/uKQe49D5RUeDOokkGRmz4ceaJKDBgHYtZtntC/s2vLvY38gqGaytinij/yi3hMcWVcEF5Kw==} motion-utils@12.23.6: resolution: {integrity: sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==} @@ -7196,8 +7214,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - napi-postinstall@0.3.4: - resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} + napi-postinstall@0.3.3: + resolution: {integrity: sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} hasBin: true @@ -7222,32 +7240,29 @@ packages: react: '*' react-dom: '*' - next@16.0.7: - resolution: {integrity: sha512-3mBRJyPxT4LOxAJI6IsXeFtKfiJUbjCLgvXO02fV8Wy/lIhPvP94Fe7dGhUgHXcQy4sSuYwQNcOLhIfOm0rL0A==} - engines: {node: '>=20.9.0'} + next@14.2.32: + resolution: {integrity: sha512-fg5g0GZ7/nFc09X8wLe6pNSU8cLWbLRG3TZzPJ1BJvi2s9m7eF991se67wliM9kR5yLHRkyGKU49MMx58s3LJg==} + engines: {node: '>=18.17.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 + '@playwright/test': ^1.41.2 + react: ^18.2.0 + react-dom: ^18.2.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-abi@3.85.0: - resolution: {integrity: sha512-zsFhmbkAzwhTft6nd3VxcG0cvJsT70rL+BIGHWVq5fi6MwGrHwzqKaxXE+Hl2GmnGItnDKPPkO5/LQqjVkIdFg==} + node-abi@3.75.0: + resolution: {integrity: sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==} engines: {node: '>=10'} node-abort-controller@3.1.1: @@ -7265,8 +7280,8 @@ packages: node-html-parser@6.1.13: resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==} - node-releases@2.0.27: - resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + node-releases@2.0.21: + resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} normalize-package-data@5.0.0: resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} @@ -7436,8 +7451,8 @@ packages: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} - p-map@7.0.4: - resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} + p-map@7.0.3: + resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} engines: {node: '>=18'} p-try@2.2.0: @@ -7505,8 +7520,8 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@2.0.1: - resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} engines: {node: 20 || >=22} path-to-regexp@0.1.12: @@ -7601,35 +7616,31 @@ packages: peerDependencies: postcss: ^8.0.0 - postcss-js@4.1.0: - resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 - postcss-load-config@5.1.0: - resolution: {integrity: sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==} - engines: {node: '>= 18'} + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} peerDependencies: - jiti: '>=1.21.0' postcss: '>=8.0.9' - tsx: ^4.8.1 + ts-node: '>=9.0.0' peerDependenciesMeta: - jiti: - optional: true postcss: optional: true - tsx: + ts-node: optional: true - postcss-load-config@6.0.1: - resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + postcss-load-config@5.1.0: + resolution: {integrity: sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==} engines: {node: '>= 18'} peerDependencies: jiti: '>=1.21.0' postcss: '>=8.0.9' tsx: ^4.8.1 - yaml: ^2.4.2 peerDependenciesMeta: jiti: optional: true @@ -7637,8 +7648,6 @@ packages: optional: true tsx: optional: true - yaml: - optional: true postcss-modules-extract-imports@3.1.0: resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} @@ -7684,8 +7693,8 @@ packages: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} - postcss-selector-parser@7.1.1: - resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} engines: {node: '>=4'} postcss-value-parser@4.2.0: @@ -7715,11 +7724,19 @@ packages: resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} engines: {node: '>=0.10.0'} - posthog-js@1.302.2: - resolution: {integrity: sha512-4voih22zQe7yHA7DynlQ3B7kgzJOaKIjzV7K3jJ2Qf+UDXd1ZgO7xYmLWYVtuKEvD1OXHbKk/fPhUTZeHEWpBw==} + posthog-js@1.255.1: + resolution: {integrity: sha512-KMh0o9MhORhEZVjXpktXB5rJ8PfDk+poqBoTSoLzWgNjhJf6D8jcyB9jUMA6vVPfn4YeepVX5NuclDRqOwr5Mw==} + peerDependencies: + '@rrweb/types': 2.0.0-alpha.17 + rrweb-snapshot: 2.0.0-alpha.17 + peerDependenciesMeta: + '@rrweb/types': + optional: true + rrweb-snapshot: + optional: true - preact@10.28.0: - resolution: {integrity: sha512-rytDAoiXr3+t6OIP3WGlDd0ouCUG1iCWzkcY3++Nreuoi17y6T5i/zRhe6uYfoVcxq6YU+sBtJouuRDsq8vvqA==} + preact@10.27.1: + resolution: {integrity: sha512-V79raXEWch/rbqoNc7nT9E4ep7lu+mI3+sBmfRD4i1M73R3WLYcCtdI0ibxGVf4eQL8ZIz2nFacqEC+rmnOORQ==} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -7794,14 +7811,14 @@ packages: prosemirror-dropcursor@1.8.2: resolution: {integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==} - prosemirror-gapcursor@1.4.0: - resolution: {integrity: sha512-z00qvurSdCEWUIulij/isHaqu4uLS8r/Fi61IbjdIPJEonQgggbJsLnstW7Lgdk4zQ68/yr6B6bf7sJXowIgdQ==} + prosemirror-gapcursor@1.3.2: + resolution: {integrity: sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==} - prosemirror-history@1.5.0: - resolution: {integrity: sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==} + prosemirror-history@1.4.1: + resolution: {integrity: sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==} - prosemirror-inputrules@1.5.1: - resolution: {integrity: sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==} + prosemirror-inputrules@1.5.0: + resolution: {integrity: sha512-K0xJRCmt+uSw7xesnHmcn72yBGTbY45vm8gXI4LZXbx2Z0jwh5aF9xrGQgrVPu0WbyFVFF3E/o9VhJYz6SQWnA==} prosemirror-keymap@1.2.3: resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} @@ -7812,8 +7829,8 @@ packages: prosemirror-menu@1.2.5: resolution: {integrity: sha512-qwXzynnpBIeg1D7BAtjOusR+81xCp53j7iWu/IargiRZqRjGIlQuu1f3jFi+ehrHhWMLoyOQTSRx/IWZJqOYtQ==} - prosemirror-model@1.25.4: - resolution: {integrity: sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==} + prosemirror-model@1.25.3: + resolution: {integrity: sha512-dY2HdaNXlARknJbrManZ1WyUtos+AP97AmvqdOQtWtrrC5g4mohVX5DTi9rXNFSk09eczLq9GuNTtq3EfMeMGA==} prosemirror-schema-basic@1.2.4: resolution: {integrity: sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==} @@ -7821,11 +7838,11 @@ packages: prosemirror-schema-list@1.5.1: resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} - prosemirror-state@1.4.4: - resolution: {integrity: sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==} + prosemirror-state@1.4.3: + resolution: {integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==} - prosemirror-tables@1.8.3: - resolution: {integrity: sha512-wbqCR/RlRPRe41a4LFtmhKElzBEfBTdtAYWNIGHM6X2e24NN/MTNUKyXjjphfAfdQce37Kh/5yf765mLPYDe7Q==} + prosemirror-tables@1.7.1: + resolution: {integrity: sha512-eRQ97Bf+i9Eby99QbyAiyov43iOKgWa7QCGly+lrDt7efZ1v8NWolhXiB43hSDGIXT1UXgbs4KJN3a06FGpr1Q==} prosemirror-trailing-node@3.0.0: resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==} @@ -7834,8 +7851,8 @@ packages: prosemirror-state: ^1.4.2 prosemirror-view: 1.40.0 - prosemirror-transform@1.10.5: - resolution: {integrity: sha512-RPDQCxIDhIBb1o36xxwsaeAvivO8VLJcgBtzmOwQ64bMtsVFh5SSuJ6dWSxO1UsHTiTXPCgQm3PDJt7p6IOLbw==} + prosemirror-transform@1.10.4: + resolution: {integrity: sha512-pwDy22nAnGqNR1feOQKHxoFkkUtepoFAd3r2hbEDsnf4wp57kKA36hXsB3njA9FtONBEwSDnDeCiJe+ItD+ykw==} prosemirror-view@1.40.0: resolution: {integrity: sha512-2G3svX0Cr1sJjkD/DYWSe3cfV5VPVTBOxI9XQEGWJDFEpsZb/gh4MV29ctv+OJx2RFX4BLt09i+6zaGM/ldkCw==} @@ -7858,12 +7875,16 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + qs@6.14.0: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} - quansync@1.0.0: - resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -7885,8 +7906,8 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - raw-body@2.5.3: - resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} rc@1.2.8: @@ -7919,8 +7940,8 @@ packages: resolution: {integrity: sha512-hlSJDQ2synMPKFZOsKo9Hi8WWZTC7POR8EmWvTSjow+VDgKzkmjQvFm2fk0tmRw+f0vTOIYKlarR0iL4996pdg==} engines: {node: '>=16.14.0'} - react-docgen@8.0.2: - resolution: {integrity: sha512-+NRMYs2DyTP4/tqWz371Oo50JqmWltR1h2gcdgUMAWZJIAvrd0/SqlCfx7tpzpl/s36rzw6qH2MjoNrxtRNYhA==} + react-docgen@8.0.1: + resolution: {integrity: sha512-kQKsqPLplY3Hx4jGnM3jpQcG3FQDt7ySz32uTHt3C9HAe45kNXG+3o16Eqn3Fw1GtMfHoN3b4J/z2e6cZJCmqQ==} engines: {node: ^20.9.0 || >=22} react-dom@18.3.1: @@ -7963,8 +7984,8 @@ packages: peerDependencies: react: ^0.14.0 || ^15.0.0-0 || ^16.0.0-0 || ^17.0.0 - react-pdf-html@2.1.4: - resolution: {integrity: sha512-1hIQLTQUR80zNgm3DhEX7hc0+WSholyXH6/K1VG2DQ0l/qxS+3D4hocJy11zzKyesBvpQQyT2xKeW44x323G6w==} + react-pdf-html@2.1.3: + resolution: {integrity: sha512-KTTbLUFnpus2Ed6zPGM+LD/evnDcQVz+uG7/kBW4d5qKI9/O6/Hwirh8ZvcbQT/0TeA5vzaqjUnuOs2MhhZjCw==} engines: {node: '>=16.0.0'} peerDependencies: '@react-pdf/renderer': '>=3.4.4' @@ -7996,8 +8017,8 @@ packages: '@types/react': optional: true - react-remove-scroll@2.7.2: - resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + react-remove-scroll@2.7.1: + resolution: {integrity: sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==} engines: {node: '>=10'} peerDependencies: '@types/react': '*' @@ -8169,8 +8190,8 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.11: - resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} hasBin: true @@ -8225,8 +8246,8 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rollup@4.53.3: - resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} + rollup@4.52.4: + resolution: {integrity: sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -8275,8 +8296,8 @@ packages: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} - schema-utils@4.3.3: - resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} + schema-utils@4.3.2: + resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} engines: {node: '>= 10.13.0'} scroll-into-view-if-needed@3.1.0: @@ -8290,6 +8311,11 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + semver@7.7.3: resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} @@ -8299,10 +8325,6 @@ packages: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} - send@0.19.1: - resolution: {integrity: sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg==} - engines: {node: '>= 0.8.0'} - sentence-case@3.0.4: resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} @@ -8321,8 +8343,8 @@ packages: engines: {node: '>= 14'} hasBin: true - set-cookie-parser@2.7.2: - resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} @@ -8343,10 +8365,6 @@ packages: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} - sharp@0.34.4: - resolution: {integrity: sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==} - 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'} @@ -8441,10 +8459,6 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - statuses@2.0.2: - resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} - engines: {node: '>= 0.8'} - std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} @@ -8470,6 +8484,10 @@ packages: prettier: optional: true + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -8523,6 +8541,10 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + strip-ansi@7.1.2: resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} @@ -8539,8 +8561,8 @@ packages: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} - strip-indent@4.1.1: - resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} + strip-indent@4.1.0: + resolution: {integrity: sha512-OA95x+JPmL7kc7zCu+e+TeYxEiaIyndRx0OrBcK2QPPH09oAndr2ALvymxWA+Lx1PYYvFUm4O63pRkdJAaW96w==} engines: {node: '>=12'} strip-json-comments@2.0.1: @@ -8564,21 +8586,21 @@ packages: style-to-object@0.4.4: resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} - styled-jsx@5.1.6: - resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + styled-jsx@5.1.1: + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} 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' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' peerDependenciesMeta: '@babel/core': optional: true babel-plugin-macros: optional: true - sucrase@3.35.1: - resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true @@ -8612,22 +8634,22 @@ packages: peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 - tabbable@6.3.0: - resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} tailwind-merge@2.6.0: resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} - tailwind-merge@3.4.0: - resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} + tailwind-merge@3.3.1: + resolution: {integrity: sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==} tailwindcss-animate@1.0.7: resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} peerDependencies: tailwindcss: '>=3.0.0 || insiders' - tailwindcss@3.4.18: - resolution: {integrity: sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==} + tailwindcss@3.4.17: + resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} engines: {node: '>=14.0.0'} hasBin: true @@ -8635,8 +8657,8 @@ packages: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} - terser-webpack-plugin@5.3.15: - resolution: {integrity: sha512-PGkOdpRFK+rb1TzVz+msVhw4YMRT9txLF4kRqvJhGhCM324xuR3REBSHALN+l+sAhKUmz0aotnjp5D+P83mLhQ==} + terser-webpack-plugin@5.3.14: + resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -8651,8 +8673,8 @@ packages: uglify-js: optional: true - terser@5.44.1: - resolution: {integrity: sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==} + terser@5.43.1: + resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} engines: {node: '>=10'} hasBin: true @@ -8681,6 +8703,9 @@ packages: tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + tinyexec@1.0.2: resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} engines: {node: '>=18'} @@ -8705,8 +8730,8 @@ packages: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} - tinyspy@4.0.4: - resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + tinyspy@4.0.3: + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} engines: {node: '>=14.0.0'} tippy.js@6.3.7: @@ -8913,11 +8938,8 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - unconfig-core@7.4.2: - resolution: {integrity: sha512-VgPCvLWugINbXvMQDf8Jh0mlbvNjNC6eSUziHsBCMpxR05OPrNrvDnyatdMjRgcHaaNsCqz+wjNXxNw1kRLHUg==} - - unconfig@7.4.2: - resolution: {integrity: sha512-nrMlWRQ1xdTjSnSUqvYqJzbTBFugoqHobQj58B2bc8qxHKBBHMNNsWQFP3Cd3/JZK907voM2geYPWqD4VK3MPQ==} + unconfig@7.3.3: + resolution: {integrity: sha512-QCkQoOnJF8L107gxfHL0uavn7WD9b3dpBcFX6HtfQYmjw2YzWxGuFQ0N0J6tE9oguCBJn9KOvfqYDCMPHIZrBA==} undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} @@ -8944,8 +8966,8 @@ packages: unist-util-is@5.2.1: resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} - unist-util-is@6.0.1: - resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} unist-util-position@5.0.0: resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} @@ -8959,8 +8981,8 @@ packages: unist-util-visit-parents@5.1.3: resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} - unist-util-visit-parents@6.0.2: - resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} unist-util-visit@4.1.2: resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} @@ -8986,8 +9008,8 @@ packages: unrs-resolver@1.11.1: resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} - update-browserslist-db@1.2.2: - resolution: {integrity: sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==} + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -9033,8 +9055,8 @@ packages: '@types/react': optional: true - use-sync-external-store@1.6.0: - resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + use-sync-external-store@1.5.0: + resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -9237,8 +9259,8 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - webpack@5.103.0: - resolution: {integrity: sha512-HU1JOuV1OavsZ+mfigY0j8d1TgQgbZ6M+J75zDkpEAwYeXjWSqrGJtgnPblJjd/mAyTNQ7ygw0MiKOn6etz8yw==} + webpack@5.101.3: + resolution: {integrity: sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -9294,8 +9316,8 @@ packages: resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} engines: {node: '>= 12.0.0'} - winston@3.19.0: - resolution: {integrity: sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==} + winston@3.17.0: + resolution: {integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==} engines: {node: '>= 12.0.0'} word-wrap@1.2.5: @@ -9310,8 +9332,8 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} - wrap-ansi@9.0.2: - resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} engines: {node: '>=18'} write-file-atomic@5.0.1: @@ -9379,8 +9401,8 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yaml@2.8.2: - resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} engines: {node: '>= 14.6'} hasBin: true @@ -9400,8 +9422,8 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.2.2: - resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + yocto-queue@1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} engines: {node: '>=12.20'} yoga-layout@2.0.1: @@ -9429,6 +9451,11 @@ snapshots: '@alloc/quick-lru@5.2.0': {} + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + '@apm-js-collab/code-transformer@0.8.2': {} '@apm-js-collab/tracing-hooks@0.3.1': @@ -9457,23 +9484,43 @@ snapshots: '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-validator-identifier': 7.27.1 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.28.5': {} + '@babel/compat-data@7.28.4': {} - '@babel/core@7.28.5': + '@babel/core@7.28.3': dependencies: + '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 + '@babel/generator': 7.28.3 '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) '@babel/helpers': 7.26.10 - '@babel/parser': 7.28.5 + '@babel/parser': 7.28.3 '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/core@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helpers': 7.26.10 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 @@ -9483,88 +9530,107 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/generator@7.28.3': + dependencies: + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + jsesc: 3.1.0 + '@babel/generator@7.28.5': dependencies: '@babel/parser': 7.28.5 '@babel/types': 7.28.5 '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.0.2 + '@jridgewell/trace-mapping': 0.3.30 + jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.28.4 '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.28.5 + '@babel/compat-data': 7.28.4 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 + browserslist: 4.26.2 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.28.5)': + '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.28.3 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.3) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.28.3 semver: 6.3.1 transitivePeerDependencies: - supports-color '@babel/helper-globals@7.28.0': {} - '@babel/helper-member-expression-to-functions@7.28.5': + '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.28.3 '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.5 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.28.4 '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.5)': + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/core': 7.28.3 + '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.28.3 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-identifier@7.28.5': {} '@babel/helper-validator-option@7.27.1': {} @@ -9572,102 +9638,110 @@ snapshots: '@babel/helpers@7.26.10': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/types': 7.28.4 + + '@babel/parser@7.28.3': + dependencies: + '@babel/types': 7.28.2 + + '@babel/parser@7.28.4': + dependencies: + '@babel/types': 7.28.4 '@babel/parser@7.28.5': dependencies: '@babel/types': 7.28.5 - '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/core': 7.28.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.3) - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/core': 7.28.3 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.28.5)': + '@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/core': 7.28.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-typescript@7.28.5(@babel/core@7.28.5)': + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.28.3 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3) transitivePeerDependencies: - supports-color - '@babel/preset-flow@7.27.1(@babel/core@7.28.5)': + '@babel/preset-flow@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.3) - '@babel/preset-typescript@7.28.5(@babel/core@7.28.5)': + '@babel/preset-typescript@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.3) transitivePeerDependencies: - supports-color - '@babel/register@7.28.3(@babel/core@7.28.5)': + '@babel/register@7.28.3(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.28.3 clone-deep: 4.0.1 find-cache-dir: 2.1.0 make-dir: 2.1.0 @@ -9681,21 +9755,43 @@ snapshots: '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 - '@babel/traverse@7.28.5': + '@babel/traverse@7.28.3': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 + '@babel/generator': 7.28.3 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.5 + '@babel/parser': 7.28.3 '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/types': 7.28.2 debug: 4.4.3 transitivePeerDependencies: - supports-color + '@babel/traverse@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.2': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/types@7.28.5': dependencies: '@babel/helper-string-parser': 7.27.1 @@ -9710,8 +9806,8 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) reselect: 5.1.1 - tabbable: 6.3.0 - use-sync-external-store: 1.6.0(react@18.3.1) + tabbable: 6.2.0 + use-sync-external-store: 1.5.0(react@18.3.1) optionalDependencies: '@types/react': 18.3.11 @@ -9722,7 +9818,7 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) reselect: 5.1.1 - use-sync-external-store: 1.6.0(react@18.3.1) + use-sync-external-store: 1.5.0(react@18.3.1) optionalDependencies: '@types/react': 18.3.11 @@ -9786,9 +9882,9 @@ snapshots: '@colors/colors@1.6.0': {} - '@dabh/diagnostics@2.0.8': + '@dabh/diagnostics@2.0.3': dependencies: - '@so-ric/colorspace': 1.1.6 + colorspace: 1.1.4 enabled: 2.0.0 kuler: 2.0.0 @@ -9797,8 +9893,8 @@ snapshots: '@dotenvx/dotenvx@1.51.1': dependencies: commander: 11.1.0 - dotenv: 17.2.3 - eciesjs: 0.4.16 + dotenv: 17.2.1 + eciesjs: 0.4.15 execa: 5.1.1 fdir: 6.5.0(picomatch@4.0.3) ignore: 5.3.2 @@ -9806,16 +9902,27 @@ snapshots: picomatch: 4.0.3 which: 4.0.0 - '@ecies/ciphers@0.2.5(@noble/ciphers@1.3.0)': + '@ecies/ciphers@0.2.4(@noble/ciphers@1.3.0)': dependencies: '@noble/ciphers': 1.3.0 + '@emnapi/core@1.5.0': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + '@emnapi/core@1.7.1': dependencies: '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 optional: true + '@emnapi/runtime@1.5.0': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.7.1': dependencies: tslib: 2.8.1 @@ -9826,6 +9933,14 @@ snapshots: tslib: 2.8.1 optional: true + '@emotion/is-prop-valid@1.3.1': + dependencies: + '@emotion/memoize': 0.9.0 + optional: true + + '@emotion/memoize@0.9.0': + optional: true + '@esbuild/aix-ppc64@0.25.0': optional: true @@ -9901,12 +10016,12 @@ snapshots: '@esbuild/win32-x64@0.25.0': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1(jiti@2.5.1))': dependencies: - eslint: 9.39.1(jiti@2.6.1) + eslint: 9.39.1(jiti@2.5.1) eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.2': {} + '@eslint-community/regexpp@4.12.1': {} '@eslint/config-array@0.21.1': dependencies: @@ -9924,7 +10039,7 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.3': + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 debug: 4.4.3 @@ -9978,14 +10093,14 @@ snapshots: '@floating-ui/utils': 0.2.10 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - tabbable: 6.3.0 + tabbable: 6.2.0 '@floating-ui/utils@0.2.10': {} - '@formatjs/ecma402-abstract@2.3.6': + '@formatjs/ecma402-abstract@2.3.4': dependencies: '@formatjs/fast-memoize': 2.2.7 - '@formatjs/intl-localematcher': 0.6.2 + '@formatjs/intl-localematcher': 0.6.1 decimal.js: 10.6.0 tslib: 2.8.1 @@ -9993,18 +10108,18 @@ snapshots: dependencies: tslib: 2.8.1 - '@formatjs/icu-messageformat-parser@2.11.4': + '@formatjs/icu-messageformat-parser@2.11.2': dependencies: - '@formatjs/ecma402-abstract': 2.3.6 - '@formatjs/icu-skeleton-parser': 1.8.16 + '@formatjs/ecma402-abstract': 2.3.4 + '@formatjs/icu-skeleton-parser': 1.8.14 tslib: 2.8.1 - '@formatjs/icu-skeleton-parser@1.8.16': + '@formatjs/icu-skeleton-parser@1.8.14': dependencies: - '@formatjs/ecma402-abstract': 2.3.6 + '@formatjs/ecma402-abstract': 2.3.4 tslib: 2.8.1 - '@formatjs/intl-localematcher@0.6.2': + '@formatjs/intl-localematcher@0.6.1': dependencies: tslib: 2.8.1 @@ -10078,12 +10193,12 @@ snapshots: - bufferutil - utf-8-validate - '@hocuspocus/transformer@2.15.2(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)(y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/transformer@2.15.2(@tiptap/core@2.26.3(@tiptap/pm@3.6.6))(@tiptap/pm@3.6.6)(y-prosemirror@1.3.7(prosemirror-model@1.25.3)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 - '@tiptap/starter-kit': 2.27.1 - y-prosemirror: 1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + '@tiptap/core': 2.26.3(@tiptap/pm@3.6.6) + '@tiptap/pm': 3.6.6 + '@tiptap/starter-kit': 2.26.1 + y-prosemirror: 1.3.7(prosemirror-model@1.25.3)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) yjs: 13.6.27 '@humanfs/core@0.19.1': {} @@ -10115,98 +10230,9 @@ snapshots: dependencies: react: 18.3.1 - '@img/colour@1.0.0': - optional: true - - '@img/sharp-darwin-arm64@0.34.4': - optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.3 - optional: true - - '@img/sharp-darwin-x64@0.34.4': - optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.3 - optional: true - - '@img/sharp-libvips-darwin-arm64@1.2.3': - optional: true - - '@img/sharp-libvips-darwin-x64@1.2.3': - optional: true - - '@img/sharp-libvips-linux-arm64@1.2.3': - optional: true - - '@img/sharp-libvips-linux-arm@1.2.3': - optional: true - - '@img/sharp-libvips-linux-ppc64@1.2.3': - optional: true - - '@img/sharp-libvips-linux-s390x@1.2.3': - optional: true - - '@img/sharp-libvips-linux-x64@1.2.3': - optional: true - - '@img/sharp-libvips-linuxmusl-arm64@1.2.3': - optional: true - - '@img/sharp-libvips-linuxmusl-x64@1.2.3': - optional: true - - '@img/sharp-linux-arm64@0.34.4': - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.3 - optional: true - - '@img/sharp-linux-arm@0.34.4': - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.3 - optional: true - - '@img/sharp-linux-ppc64@0.34.4': - optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.2.3 - optional: true - - '@img/sharp-linux-s390x@0.34.4': - optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.2.3 - optional: true - - '@img/sharp-linux-x64@0.34.4': - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.3 - optional: true - - '@img/sharp-linuxmusl-arm64@0.34.4': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 - optional: true - - '@img/sharp-linuxmusl-x64@0.34.4': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.3 - optional: true - - '@img/sharp-wasm32@0.34.4': - dependencies: - '@emnapi/runtime': 1.7.1 - optional: true - - '@img/sharp-win32-arm64@0.34.4': - optional: true - - '@img/sharp-win32-ia32@0.34.4': - optional: true - - '@img/sharp-win32-x64@0.34.4': - optional: true - '@intercom/messenger-js-sdk@0.0.12': {} - '@ioredis/commands@1.5.0': {} + '@ioredis/commands@1.3.0': {} '@isaacs/balanced-match@4.0.1': {} @@ -10218,17 +10244,17 @@ snapshots: dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.2 + strip-ansi: 7.1.0 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: glob: 11.1.0 - magic-string: 0.30.21 + magic-string: 0.30.19 react-docgen-typescript: 2.4.0(typescript@5.8.3) - vite: 7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2) + vite: 7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) optionalDependencies: typescript: 5.8.3 @@ -10247,10 +10273,15 @@ snapshots: '@jridgewell/source-map@0.3.11': dependencies: '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/trace-mapping': 0.3.30 '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.30': + dependencies: + '@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 @@ -10268,7 +10299,7 @@ snapshots: dependencies: '@lit-labs/ssr-dom-shim': 1.4.0 - '@mdx-js/react@3.1.1(@types/react@18.3.11)(react@18.3.1)': + '@mdx-js/react@3.1.0(@types/react@18.3.11)(react@18.3.1)': dependencies: '@types/mdx': 2.0.13 '@types/react': 18.3.11 @@ -10278,8 +10309,8 @@ snapshots: '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.7.1 - '@emnapi/runtime': 1.7.1 + '@emnapi/core': 1.5.0 + '@emnapi/runtime': 1.5.0 '@tybys/wasm-util': 0.10.1 optional: true @@ -10290,30 +10321,33 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@next/env@16.0.7': {} + '@next/env@14.2.32': {} - '@next/swc-darwin-arm64@16.0.7': + '@next/swc-darwin-arm64@14.2.32': optional: true - '@next/swc-darwin-x64@16.0.7': + '@next/swc-darwin-x64@14.2.32': optional: true - '@next/swc-linux-arm64-gnu@16.0.7': + '@next/swc-linux-arm64-gnu@14.2.32': optional: true - '@next/swc-linux-arm64-musl@16.0.7': + '@next/swc-linux-arm64-musl@14.2.32': optional: true - '@next/swc-linux-x64-gnu@16.0.7': + '@next/swc-linux-x64-gnu@14.2.32': optional: true - '@next/swc-linux-x64-musl@16.0.7': + '@next/swc-linux-x64-musl@14.2.32': optional: true - '@next/swc-win32-arm64-msvc@16.0.7': + '@next/swc-win32-arm64-msvc@14.2.32': optional: true - '@next/swc-win32-x64-msvc@16.0.7': + '@next/swc-win32-ia32-msvc@14.2.32': + optional: true + + '@next/swc-win32-x64-msvc@14.2.32': optional: true '@noble/ciphers@1.3.0': {} @@ -10344,7 +10378,7 @@ snapshots: proc-log: 3.0.0 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.7.3 + semver: 7.7.2 which: 3.0.1 transitivePeerDependencies: - bluebird @@ -10357,7 +10391,7 @@ snapshots: json-parse-even-better-errors: 3.0.2 normalize-package-data: 5.0.0 proc-log: 3.0.0 - semver: 7.7.3 + semver: 7.7.2 transitivePeerDependencies: - bluebird @@ -10378,7 +10412,7 @@ snapshots: '@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.37.0 '@opentelemetry/instrumentation-amqplib@0.55.0(@opentelemetry/api@1.9.0)': dependencies: @@ -10393,7 +10427,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.37.0 '@types/connect': 3.4.38 transitivePeerDependencies: - supports-color @@ -10410,7 +10444,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.37.0 transitivePeerDependencies: - supports-color @@ -10441,7 +10475,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.37.0 transitivePeerDependencies: - supports-color @@ -10450,7 +10484,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.37.0 forwarded-parse: 2.1.2 transitivePeerDependencies: - supports-color @@ -10467,7 +10501,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.37.0 transitivePeerDependencies: - supports-color @@ -10475,7 +10509,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.37.0 transitivePeerDependencies: - supports-color @@ -10484,7 +10518,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.37.0 transitivePeerDependencies: - supports-color @@ -10514,7 +10548,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.37.0 '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color @@ -10532,7 +10566,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.37.0 '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) '@types/pg': 8.15.6 '@types/pg-pool': 2.0.6 @@ -10544,7 +10578,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) '@opentelemetry/redis-common': 0.38.2 - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.37.0 transitivePeerDependencies: - supports-color @@ -10561,7 +10595,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.37.0 transitivePeerDependencies: - supports-color @@ -10580,16 +10614,16 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.37.0 '@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.2.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.37.0 - '@opentelemetry/semantic-conventions@1.38.0': {} + '@opentelemetry/semantic-conventions@1.37.0': {} '@opentelemetry/sql-common@0.41.2(@opentelemetry/api@1.9.0)': dependencies: @@ -10649,13 +10683,9 @@ snapshots: '@popperjs/core@2.11.8': {} - '@posthog/core@1.7.1': - dependencies: - cross-spawn: 7.0.6 - - '@posthog/react@1.5.2(@types/react@18.3.11)(posthog-js@1.302.2)(react@18.3.1)': + '@posthog/react@1.4.0(@types/react@18.3.11)(posthog-js@1.255.1)(react@18.3.1)': dependencies: - posthog-js: 1.302.2 + posthog-js: 1.255.1 react: 18.3.1 optionalDependencies: '@types/react': 18.3.11 @@ -10671,9 +10701,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@quansync/fs@1.0.0': + '@quansync/fs@0.1.5': dependencies: - quansync: 1.0.0 + quansync: 0.2.11 '@radix-ui/number@1.1.1': {} @@ -10708,7 +10738,7 @@ snapshots: aria-hidden: 1.2.6 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.7.2(@types/react@18.3.11)(react@18.3.1) + react-remove-scroll: 2.7.1(@types/react@18.3.11)(react@18.3.1) optionalDependencies: '@types/react': 18.3.11 '@types/react-dom': 18.3.1 @@ -10785,15 +10815,6 @@ snapshots: '@types/react': 18.3.11 '@types/react-dom': 18.3.1 - '@radix-ui/react-primitive@2.1.4(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-slot': 1.2.4(@types/react@18.3.11)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.11 - '@types/react-dom': 18.3.1 - '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/number': 1.1.1 @@ -10818,13 +10839,6 @@ snapshots: optionalDependencies: '@types/react': 18.3.11 - '@radix-ui/react-slot@1.2.4(@types/react@18.3.11)(react@18.3.1)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.11)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.11 - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@18.3.11)(react@18.3.1)': dependencies: react: 18.3.1 @@ -10868,17 +10882,17 @@ snapshots: '@react-pdf/font@2.5.2': dependencies: '@babel/runtime': 7.26.10 - '@react-pdf/types': 2.9.1 + '@react-pdf/types': 2.9.0 cross-fetch: 3.2.0 fontkit: 2.0.4 is-url: 1.2.4 transitivePeerDependencies: - encoding - '@react-pdf/font@4.0.3': + '@react-pdf/font@4.0.2': dependencies: - '@react-pdf/pdfkit': 4.0.4 - '@react-pdf/types': 2.9.1 + '@react-pdf/pdfkit': 4.0.3 + '@react-pdf/types': 2.9.0 fontkit: 2.0.4 is-url: 1.2.4 @@ -10900,9 +10914,9 @@ snapshots: '@react-pdf/primitives': 3.1.1 '@react-pdf/stylesheet': 4.3.0 '@react-pdf/textkit': 4.4.1 - '@react-pdf/types': 2.9.1 + '@react-pdf/types': 2.9.0 cross-fetch: 3.2.0 - emoji-regex: 10.6.0 + emoji-regex: 10.5.0 queue: 6.0.2 yoga-layout: 2.0.1 transitivePeerDependencies: @@ -10918,7 +10932,7 @@ snapshots: jay-peg: 1.1.1 vite-compatible-readable-stream: 3.6.1 - '@react-pdf/pdfkit@4.0.4': + '@react-pdf/pdfkit@4.0.3': dependencies: '@babel/runtime': 7.26.10 '@react-pdf/png-js': 3.0.0 @@ -10947,7 +10961,7 @@ snapshots: '@react-pdf/fns': 2.2.1 '@react-pdf/primitives': 3.1.1 '@react-pdf/textkit': 4.4.1 - '@react-pdf/types': 2.9.1 + '@react-pdf/types': 2.9.0 abs-svg-path: 0.1.1 color-string: 1.9.1 normalize-svg-path: 1.1.0 @@ -10962,7 +10976,7 @@ snapshots: '@react-pdf/pdfkit': 3.2.0 '@react-pdf/primitives': 3.1.1 '@react-pdf/render': 3.5.0 - '@react-pdf/types': 2.9.1 + '@react-pdf/types': 2.9.0 events: 3.3.0 object-assign: 4.1.1 prop-types: 15.8.1 @@ -10976,16 +10990,16 @@ snapshots: dependencies: '@babel/runtime': 7.26.10 '@react-pdf/fns': 2.2.1 - '@react-pdf/types': 2.9.1 + '@react-pdf/types': 2.9.0 color-string: 1.9.1 hsl-to-hex: 1.0.0 media-engine: 1.0.3 postcss-value-parser: 4.2.0 - '@react-pdf/stylesheet@6.1.1': + '@react-pdf/stylesheet@6.1.0': dependencies: '@react-pdf/fns': 3.1.2 - '@react-pdf/types': 2.9.1 + '@react-pdf/types': 2.9.0 color-string: 1.9.1 hsl-to-hex: 1.0.0 media-engine: 1.0.3 @@ -10999,44 +11013,44 @@ snapshots: hyphen: 1.10.6 unicode-properties: 1.4.1 - '@react-pdf/types@2.9.1': + '@react-pdf/types@2.9.0': dependencies: - '@react-pdf/font': 4.0.3 + '@react-pdf/font': 4.0.2 '@react-pdf/primitives': 4.1.1 - '@react-pdf/stylesheet': 6.1.1 + '@react-pdf/stylesheet': 6.1.0 - '@react-router/dev@7.9.5(@react-router/serve@7.9.5(react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(jiti@2.6.1)(react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.44.1)(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))(yaml@2.8.2)': + '@react-router/dev@7.9.5(@react-router/serve@7.9.5(react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))(yaml@2.8.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/generator': 7.28.5 - '@babel/parser': 7.28.5 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) - '@babel/preset-typescript': 7.28.5(@babel/core@7.28.5) - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/core': 7.28.3 + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.3 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.3) + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 '@npmcli/package-json': 4.0.1 '@react-router/node': 7.9.5(react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) '@remix-run/node-fetch-server': 0.9.0 arg: 5.0.2 babel-dead-code-elimination: 1.0.10 chokidar: 3.6.0 - dedent: 1.7.0 + dedent: 1.6.0(babel-plugin-macros@3.1.0) es-module-lexer: 1.7.0 exit-hook: 2.2.1 - isbot: 5.1.32 + isbot: 5.1.31 jsesc: 3.0.2 lodash: 4.17.21 - p-map: 7.0.4 + p-map: 7.0.3 pathe: 1.1.2 picocolors: 1.1.1 prettier: 3.7.4 react-refresh: 0.14.2 react-router: 7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - semver: 7.7.3 + semver: 7.7.2 tinyglobby: 0.2.15 valibot: 1.2.0(typescript@5.8.3) - vite: 7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2) - vite-node: 3.2.4(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2) + vite: 7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) optionalDependencies: '@react-router/serve': 7.9.5(react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) typescript: 5.8.3 @@ -11136,78 +11150,78 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.46': {} - '@rollup/pluginutils@5.3.0(rollup@4.53.3)': + '@rollup/pluginutils@5.2.0(rollup@4.52.4)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.53.3 + rollup: 4.52.4 - '@rollup/rollup-android-arm-eabi@4.53.3': + '@rollup/rollup-android-arm-eabi@4.52.4': optional: true - '@rollup/rollup-android-arm64@4.53.3': + '@rollup/rollup-android-arm64@4.52.4': optional: true - '@rollup/rollup-darwin-arm64@4.53.3': + '@rollup/rollup-darwin-arm64@4.52.4': optional: true - '@rollup/rollup-darwin-x64@4.53.3': + '@rollup/rollup-darwin-x64@4.52.4': optional: true - '@rollup/rollup-freebsd-arm64@4.53.3': + '@rollup/rollup-freebsd-arm64@4.52.4': optional: true - '@rollup/rollup-freebsd-x64@4.53.3': + '@rollup/rollup-freebsd-x64@4.52.4': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.53.3': + '@rollup/rollup-linux-arm-musleabihf@4.52.4': optional: true - '@rollup/rollup-linux-arm64-gnu@4.53.3': + '@rollup/rollup-linux-arm64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-arm64-musl@4.53.3': + '@rollup/rollup-linux-arm64-musl@4.52.4': optional: true - '@rollup/rollup-linux-loong64-gnu@4.53.3': + '@rollup/rollup-linux-loong64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.53.3': + '@rollup/rollup-linux-ppc64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.53.3': + '@rollup/rollup-linux-riscv64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-riscv64-musl@4.53.3': + '@rollup/rollup-linux-riscv64-musl@4.52.4': optional: true - '@rollup/rollup-linux-s390x-gnu@4.53.3': + '@rollup/rollup-linux-s390x-gnu@4.52.4': optional: true - '@rollup/rollup-linux-x64-gnu@4.53.3': + '@rollup/rollup-linux-x64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-x64-musl@4.53.3': + '@rollup/rollup-linux-x64-musl@4.52.4': optional: true - '@rollup/rollup-openharmony-arm64@4.53.3': + '@rollup/rollup-openharmony-arm64@4.52.4': optional: true - '@rollup/rollup-win32-arm64-msvc@4.53.3': + '@rollup/rollup-win32-arm64-msvc@4.52.4': optional: true - '@rollup/rollup-win32-ia32-msvc@4.53.3': + '@rollup/rollup-win32-ia32-msvc@4.52.4': optional: true - '@rollup/rollup-win32-x64-gnu@4.53.3': + '@rollup/rollup-win32-x64-gnu@4.52.4': optional: true - '@rollup/rollup-win32-x64-msvc@4.53.3': + '@rollup/rollup-win32-x64-msvc@4.52.4': optional: true '@rtsao/scc@1.1.0': {} @@ -11222,8 +11236,8 @@ snapshots: '@sentry-internal/node-cpu-profiler@2.2.0': dependencies: - detect-libc: 2.1.2 - node-abi: 3.85.0 + detect-libc: 2.0.4 + node-abi: 3.75.0 '@sentry-internal/replay-canvas@10.27.0': dependencies: @@ -11235,7 +11249,7 @@ snapshots: '@sentry-internal/browser-utils': 10.27.0 '@sentry/core': 10.27.0 - '@sentry/babel-plugin-component-annotate@4.6.1': {} + '@sentry/babel-plugin-component-annotate@4.6.0': {} '@sentry/browser@10.27.0': dependencies: @@ -11245,10 +11259,10 @@ snapshots: '@sentry-internal/replay-canvas': 10.27.0 '@sentry/core': 10.27.0 - '@sentry/bundler-plugin-core@4.6.1': + '@sentry/bundler-plugin-core@4.6.0': dependencies: - '@babel/core': 7.28.5 - '@sentry/babel-plugin-component-annotate': 4.6.1 + '@babel/core': 7.28.3 + '@sentry/babel-plugin-component-annotate': 4.6.0 '@sentry/cli': 2.58.2 dotenv: 16.6.1 find-up: 5.0.0 @@ -11305,7 +11319,7 @@ snapshots: '@sentry/core@10.27.0': {} - '@sentry/node-core@10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)': + '@sentry/node-core@10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)': dependencies: '@apm-js-collab/tracing-hooks': 0.3.1 '@opentelemetry/api': 1.9.0 @@ -11314,9 +11328,9 @@ snapshots: '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.2.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.2.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.37.0 '@sentry/core': 10.27.0 - '@sentry/opentelemetry': 10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) + '@sentry/opentelemetry': 10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) import-in-the-middle: 2.0.0 transitivePeerDependencies: - supports-color @@ -11351,23 +11365,23 @@ snapshots: '@opentelemetry/instrumentation-undici': 0.19.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.2.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.2.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.37.0 '@prisma/instrumentation': 6.19.0(@opentelemetry/api@1.9.0) '@sentry/core': 10.27.0 - '@sentry/node-core': 10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) - '@sentry/opentelemetry': 10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) + '@sentry/node-core': 10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) + '@sentry/opentelemetry': 10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) import-in-the-middle: 2.0.0 minimatch: 9.0.5 transitivePeerDependencies: - supports-color - '@sentry/opentelemetry@10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)': + '@sentry/opentelemetry@10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/context-async-hooks': 2.2.0(@opentelemetry/api@1.9.0) '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.2.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.37.0 '@sentry/core': 10.27.0 '@sentry/profiling-node@10.27.0': @@ -11383,14 +11397,14 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/semantic-conventions': 1.37.0 '@react-router/node': 7.9.5(react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) '@sentry/browser': 10.27.0 '@sentry/cli': 2.58.2 '@sentry/core': 10.27.0 '@sentry/node': 10.27.0 '@sentry/react': 10.27.0(react@18.3.1) - '@sentry/vite-plugin': 4.6.1 + '@sentry/vite-plugin': 4.6.0 glob: 11.1.0 react: 18.3.1 react-router: 7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -11405,19 +11419,14 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 18.3.1 - '@sentry/vite-plugin@4.6.1': + '@sentry/vite-plugin@4.6.0': dependencies: - '@sentry/bundler-plugin-core': 4.6.1 + '@sentry/bundler-plugin-core': 4.6.0 unplugin: 1.0.1 transitivePeerDependencies: - encoding - supports-color - '@so-ric/colorspace@1.1.6': - dependencies: - color: 5.0.3 - text-hex: 1.0.0 - '@standard-schema/spec@1.0.0': {} '@storybook/addon-actions@8.6.14(storybook@8.6.14(prettier@3.7.4))': @@ -11443,18 +11452,18 @@ snapshots: storybook: 8.6.14(prettier@3.7.4) ts-dedent: 2.2.0 - '@storybook/addon-designs@10.0.2(@storybook/addon-docs@9.1.10(@types/react@18.3.11)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))': + '@storybook/addon-designs@10.0.2(@storybook/addon-docs@9.1.10(@types/react@18.3.11)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)))': dependencies: '@figspec/react': 1.0.4(react@18.3.1) - storybook: 9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) + storybook: 9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) optionalDependencies: - '@storybook/addon-docs': 9.1.10(@types/react@18.3.11)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))) + '@storybook/addon-docs': 9.1.10(@types/react@18.3.11)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) '@storybook/addon-docs@8.6.14(@types/react@18.3.11)(storybook@8.6.14(prettier@3.7.4))': dependencies: - '@mdx-js/react': 3.1.1(@types/react@18.3.11)(react@18.3.1) + '@mdx-js/react': 3.1.0(@types/react@18.3.11)(react@18.3.1) '@storybook/blocks': 8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(prettier@3.7.4)) '@storybook/csf-plugin': 8.6.14(storybook@8.6.14(prettier@3.7.4)) '@storybook/react-dom-shim': 8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(prettier@3.7.4)) @@ -11465,15 +11474,15 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@storybook/addon-docs@9.1.10(@types/react@18.3.11)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))': + '@storybook/addon-docs@9.1.10(@types/react@18.3.11)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)))': dependencies: - '@mdx-js/react': 3.1.1(@types/react@18.3.11)(react@18.3.1) - '@storybook/csf-plugin': 9.1.10(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))) - '@storybook/icons': 1.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/react-dom-shim': 9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))) + '@mdx-js/react': 3.1.0(@types/react@18.3.11)(react@18.3.1) + '@storybook/csf-plugin': 9.1.10(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))) + '@storybook/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/react-dom-shim': 9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) + storybook: 9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' @@ -11532,10 +11541,10 @@ snapshots: storybook: 8.6.14(prettier@3.7.4) ts-dedent: 2.2.0 - '@storybook/addon-styling-webpack@1.0.1(storybook@8.6.14(prettier@3.7.4))(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0))': + '@storybook/addon-styling-webpack@1.0.1(storybook@8.6.14(prettier@3.7.4))(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0))': dependencies: '@storybook/node-logger': 8.6.14(storybook@8.6.14(prettier@3.7.4)) - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0) + webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0) transitivePeerDependencies: - storybook @@ -11548,31 +11557,31 @@ snapshots: memoizerific: 1.11.3 storybook: 8.6.14(prettier@3.7.4) - '@storybook/addon-webpack5-compiler-swc@1.0.6(@swc/helpers@0.5.17)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0))': + '@storybook/addon-webpack5-compiler-swc@1.0.6(@swc/helpers@0.5.17)(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0))': dependencies: - '@swc/core': 1.15.3(@swc/helpers@0.5.17) - swc-loader: 0.2.6(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)) + '@swc/core': 1.13.5(@swc/helpers@0.5.17) + swc-loader: 0.2.6(@swc/core@1.13.5(@swc/helpers@0.5.17))(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)) transitivePeerDependencies: - '@swc/helpers' - webpack '@storybook/blocks@8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(prettier@3.7.4))': dependencies: - '@storybook/icons': 1.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) storybook: 8.6.14(prettier@3.7.4) ts-dedent: 2.2.0 optionalDependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@storybook/builder-vite@9.1.10(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))': + '@storybook/builder-vite@9.1.10(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)))(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: - '@storybook/csf-plugin': 9.1.10(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))) - storybook: 9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) + '@storybook/csf-plugin': 9.1.10(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))) + storybook: 9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) ts-dedent: 2.2.0 - vite: 7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2) + vite: 7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) - '@storybook/builder-webpack5@8.6.14(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)(storybook@8.6.14(prettier@3.7.4))(typescript@5.8.3)': + '@storybook/builder-webpack5@8.6.14(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)(storybook@8.6.14(prettier@3.7.4))(typescript@5.8.3)': dependencies: '@storybook/core-webpack': 8.6.14(storybook@8.6.14(prettier@3.7.4)) '@types/semver': 7.7.1 @@ -11580,23 +11589,23 @@ snapshots: case-sensitive-paths-webpack-plugin: 2.4.0 cjs-module-lexer: 1.4.3 constants-browserify: 1.0.0 - css-loader: 6.11.0(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)) + css-loader: 6.11.0(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)) es-module-lexer: 1.7.0 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)) - html-webpack-plugin: 5.6.5(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)) - magic-string: 0.30.21 + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)) + html-webpack-plugin: 5.6.4(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)) + magic-string: 0.30.19 path-browserify: 1.0.1 process: 0.11.10 - semver: 7.7.3 + semver: 7.7.2 storybook: 8.6.14(prettier@3.7.4) - style-loader: 3.3.4(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)) - terser-webpack-plugin: 5.3.15(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)) + style-loader: 3.3.4(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)) + terser-webpack-plugin: 5.3.14(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0) - webpack-dev-middleware: 6.1.3(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)) + webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0) + webpack-dev-middleware: 6.1.3(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.6.2 optionalDependencies: @@ -11627,7 +11636,7 @@ snapshots: jsdoc-type-pratt-parser: 4.8.0 process: 0.11.10 recast: 0.23.11 - semver: 7.7.3 + semver: 7.7.2 util: 0.12.5 ws: 8.18.3 optionalDependencies: @@ -11643,14 +11652,14 @@ snapshots: storybook: 8.6.14(prettier@3.7.4) unplugin: 1.16.1 - '@storybook/csf-plugin@9.1.10(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))': + '@storybook/csf-plugin@9.1.10(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)))': dependencies: - storybook: 9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) + storybook: 9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) unplugin: 1.16.1 '@storybook/global@5.0.0': {} - '@storybook/icons@1.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@storybook/icons@1.4.0(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) @@ -11669,22 +11678,22 @@ snapshots: dependencies: storybook: 8.6.14(prettier@3.7.4) - '@storybook/preset-react-webpack@8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.7.4)))(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(prettier@3.7.4))(typescript@5.8.3)': + '@storybook/preset-react-webpack@8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.7.4)))(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(prettier@3.7.4))(typescript@5.8.3)': dependencies: '@storybook/core-webpack': 8.6.14(storybook@8.6.14(prettier@3.7.4)) '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.7.4)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(prettier@3.7.4))(typescript@5.8.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)) '@types/semver': 7.7.1 find-up: 5.0.0 - magic-string: 0.30.21 + magic-string: 0.30.19 react: 18.3.1 react-docgen: 7.1.1 react-dom: 18.3.1(react@18.3.1) - resolve: 1.22.11 - semver: 7.7.3 + resolve: 1.22.10 + semver: 7.7.2 storybook: 8.6.14(prettier@3.7.4) tsconfig-paths: 4.2.0 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0) + webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -11699,7 +11708,7 @@ snapshots: dependencies: storybook: 8.6.14(prettier@3.7.4) - '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0))': + '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0))': dependencies: debug: 4.4.3 endent: 2.1.0 @@ -11709,7 +11718,7 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0) + webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0) transitivePeerDependencies: - supports-color @@ -11719,36 +11728,36 @@ snapshots: react-dom: 18.3.1(react@18.3.1) storybook: 8.6.14(prettier@3.7.4) - '@storybook/react-dom-shim@9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))': + '@storybook/react-dom-shim@9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)))': dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) + storybook: 9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) - '@storybook/react-vite@9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.53.3)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))': + '@storybook/react-vite@9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.52.4)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) - '@rollup/pluginutils': 5.3.0(rollup@4.53.3) - '@storybook/builder-vite': 9.1.10(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) - '@storybook/react': 9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))(typescript@5.8.3) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) + '@rollup/pluginutils': 5.2.0(rollup@4.52.4) + '@storybook/builder-vite': 9.1.10(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)))(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) + '@storybook/react': 9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.8.3) find-up: 7.0.0 - magic-string: 0.30.21 + magic-string: 0.30.19 react: 18.3.1 - react-docgen: 8.0.2 + react-docgen: 8.0.1 react-dom: 18.3.1(react@18.3.1) - resolve: 1.22.11 - storybook: 9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) + resolve: 1.22.10 + storybook: 9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) tsconfig-paths: 4.2.0 - vite: 7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2) + vite: 7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - rollup - supports-color - typescript - '@storybook/react-webpack5@8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.7.4)))(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(prettier@3.7.4))(typescript@5.8.3)': + '@storybook/react-webpack5@8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.7.4)))(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(prettier@3.7.4))(typescript@5.8.3)': dependencies: - '@storybook/builder-webpack5': 8.6.14(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)(storybook@8.6.14(prettier@3.7.4))(typescript@5.8.3) - '@storybook/preset-react-webpack': 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.7.4)))(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(prettier@3.7.4))(typescript@5.8.3) + '@storybook/builder-webpack5': 8.6.14(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)(storybook@8.6.14(prettier@3.7.4))(typescript@5.8.3) + '@storybook/preset-react-webpack': 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.7.4)))(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(prettier@3.7.4))(typescript@5.8.3) '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.7.4)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(prettier@3.7.4))(typescript@5.8.3) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -11779,13 +11788,13 @@ snapshots: '@storybook/test': 8.6.14(storybook@8.6.14(prettier@3.7.4)) typescript: 5.8.3 - '@storybook/react@9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))(typescript@5.8.3)': + '@storybook/react@9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.8.3)': dependencies: '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))) + '@storybook/react-dom-shim': 9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) + storybook: 9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) optionalDependencies: typescript: 5.8.3 @@ -11804,75 +11813,79 @@ snapshots: dependencies: storybook: 8.6.14(prettier@3.7.4) - '@swc/core-darwin-arm64@1.15.3': + '@swc/core-darwin-arm64@1.13.5': optional: true - '@swc/core-darwin-x64@1.15.3': + '@swc/core-darwin-x64@1.13.5': optional: true - '@swc/core-linux-arm-gnueabihf@1.15.3': + '@swc/core-linux-arm-gnueabihf@1.13.5': optional: true - '@swc/core-linux-arm64-gnu@1.15.3': + '@swc/core-linux-arm64-gnu@1.13.5': optional: true - '@swc/core-linux-arm64-musl@1.15.3': + '@swc/core-linux-arm64-musl@1.13.5': optional: true - '@swc/core-linux-x64-gnu@1.15.3': + '@swc/core-linux-x64-gnu@1.13.5': optional: true - '@swc/core-linux-x64-musl@1.15.3': + '@swc/core-linux-x64-musl@1.13.5': optional: true - '@swc/core-win32-arm64-msvc@1.15.3': + '@swc/core-win32-arm64-msvc@1.13.5': optional: true - '@swc/core-win32-ia32-msvc@1.15.3': + '@swc/core-win32-ia32-msvc@1.13.5': optional: true - '@swc/core-win32-x64-msvc@1.15.3': + '@swc/core-win32-x64-msvc@1.13.5': optional: true - '@swc/core@1.15.3(@swc/helpers@0.5.17)': + '@swc/core@1.13.5(@swc/helpers@0.5.17)': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.25 + '@swc/types': 0.1.24 optionalDependencies: - '@swc/core-darwin-arm64': 1.15.3 - '@swc/core-darwin-x64': 1.15.3 - '@swc/core-linux-arm-gnueabihf': 1.15.3 - '@swc/core-linux-arm64-gnu': 1.15.3 - '@swc/core-linux-arm64-musl': 1.15.3 - '@swc/core-linux-x64-gnu': 1.15.3 - '@swc/core-linux-x64-musl': 1.15.3 - '@swc/core-win32-arm64-msvc': 1.15.3 - '@swc/core-win32-ia32-msvc': 1.15.3 - '@swc/core-win32-x64-msvc': 1.15.3 + '@swc/core-darwin-arm64': 1.13.5 + '@swc/core-darwin-x64': 1.13.5 + '@swc/core-linux-arm-gnueabihf': 1.13.5 + '@swc/core-linux-arm64-gnu': 1.13.5 + '@swc/core-linux-arm64-musl': 1.13.5 + '@swc/core-linux-x64-gnu': 1.13.5 + '@swc/core-linux-x64-musl': 1.13.5 + '@swc/core-win32-arm64-msvc': 1.13.5 + '@swc/core-win32-ia32-msvc': 1.13.5 + '@swc/core-win32-x64-msvc': 1.13.5 '@swc/helpers': 0.5.17 '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.15': + '@swc/helpers@0.5.17': dependencies: tslib: 2.8.1 - '@swc/helpers@0.5.17': + '@swc/helpers@0.5.5': dependencies: + '@swc/counter': 0.1.3 tslib: 2.8.1 - '@swc/types@0.1.25': + '@swc/types@0.1.24': dependencies: '@swc/counter': 0.1.3 - '@tailwindcss/container-queries@0.1.1(tailwindcss@3.4.18(yaml@2.8.2))': + '@tailwindcss/container-queries@0.1.1(tailwindcss@3.4.17)': dependencies: - tailwindcss: 3.4.18(yaml@2.8.2) + tailwindcss: 3.4.17 - '@tailwindcss/typography@0.5.19(tailwindcss@3.4.18(yaml@2.8.2))': + '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17)': dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.18(yaml@2.8.2) + tailwindcss: 3.4.17 '@tanstack/react-table@8.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -11928,228 +11941,260 @@ snapshots: dependencies: '@testing-library/dom': 10.4.0 - '@tiptap/core@2.27.1(@tiptap/pm@2.27.1)': + '@tiptap/core@2.26.3(@tiptap/pm@2.26.1)': + dependencies: + '@tiptap/pm': 2.26.1 + + '@tiptap/core@2.26.3(@tiptap/pm@3.6.6)': dependencies: - '@tiptap/pm': 2.27.1 + '@tiptap/pm': 3.6.6 - '@tiptap/extension-blockquote@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + '@tiptap/extension-blockquote@2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) - '@tiptap/extension-bold@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + '@tiptap/extension-bold@2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) - '@tiptap/extension-bubble-menu@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': + '@tiptap/extension-bubble-menu@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) + '@tiptap/pm': 2.26.1 tippy.js: 6.3.7 - '@tiptap/extension-bullet-list@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + '@tiptap/extension-bullet-list@2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) - '@tiptap/extension-character-count@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': + '@tiptap/extension-character-count@2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) + '@tiptap/pm': 2.26.1 - '@tiptap/extension-code-block@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': + '@tiptap/extension-code-block@2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) + '@tiptap/pm': 2.26.1 - '@tiptap/extension-code@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + '@tiptap/extension-code@2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) - '@tiptap/extension-collaboration@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)(y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))': + '@tiptap/extension-collaboration@2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)(y-prosemirror@1.3.7(prosemirror-model@1.25.3)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 - y-prosemirror: 1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) + '@tiptap/pm': 2.26.1 + y-prosemirror: 1.3.7(prosemirror-model@1.25.3)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) - '@tiptap/extension-document@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + '@tiptap/extension-document@2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) - '@tiptap/extension-dropcursor@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': + '@tiptap/extension-dropcursor@2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) + '@tiptap/pm': 2.26.1 - '@tiptap/extension-emoji@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)(@tiptap/suggestion@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1))(emojibase@17.0.0)': + '@tiptap/extension-emoji@2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)(@tiptap/suggestion@2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1))(emojibase@16.0.0)': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 - '@tiptap/suggestion': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) - emoji-regex: 10.6.0 - emojibase-data: 15.3.2(emojibase@17.0.0) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) + '@tiptap/pm': 2.26.1 + '@tiptap/suggestion': 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1) + emoji-regex: 10.5.0 + emojibase-data: 15.3.2(emojibase@16.0.0) is-emoji-supported: 0.0.5 transitivePeerDependencies: - emojibase - '@tiptap/extension-floating-menu@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': + '@tiptap/extension-floating-menu@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) + '@tiptap/pm': 2.26.1 tippy.js: 6.3.7 - '@tiptap/extension-gapcursor@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': + '@tiptap/extension-gapcursor@2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) + '@tiptap/pm': 2.26.1 - '@tiptap/extension-hard-break@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + '@tiptap/extension-hard-break@2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) - '@tiptap/extension-heading@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + '@tiptap/extension-heading@2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) - '@tiptap/extension-history@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': + '@tiptap/extension-history@2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) + '@tiptap/pm': 2.26.1 - '@tiptap/extension-horizontal-rule@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': + '@tiptap/extension-horizontal-rule@2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) + '@tiptap/pm': 2.26.1 - '@tiptap/extension-image@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + '@tiptap/extension-image@2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) - '@tiptap/extension-italic@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + '@tiptap/extension-italic@2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) - '@tiptap/extension-list-item@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + '@tiptap/extension-list-item@2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) - '@tiptap/extension-mention@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)(@tiptap/suggestion@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1))': + '@tiptap/extension-mention@2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)(@tiptap/suggestion@2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1))': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 - '@tiptap/suggestion': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) + '@tiptap/pm': 2.26.1 + '@tiptap/suggestion': 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1) - '@tiptap/extension-ordered-list@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + '@tiptap/extension-ordered-list@2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) - '@tiptap/extension-paragraph@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + '@tiptap/extension-paragraph@2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) - '@tiptap/extension-placeholder@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': + '@tiptap/extension-placeholder@2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) + '@tiptap/pm': 2.26.1 - '@tiptap/extension-strike@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + '@tiptap/extension-strike@2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) - '@tiptap/extension-task-item@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': + '@tiptap/extension-task-item@2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) + '@tiptap/pm': 2.26.1 - '@tiptap/extension-task-list@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + '@tiptap/extension-task-list@2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) - '@tiptap/extension-text-align@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + '@tiptap/extension-text-align@2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) - '@tiptap/extension-text-style@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + '@tiptap/extension-text-style@2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) - '@tiptap/extension-text@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + '@tiptap/extension-text@2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) - '@tiptap/extension-underline@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + '@tiptap/extension-underline@2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) + + '@tiptap/html@2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)': + dependencies: + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) + '@tiptap/pm': 2.26.1 + zeed-dom: 0.15.1 - '@tiptap/html@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': + '@tiptap/html@2.26.2(@tiptap/core@2.26.3(@tiptap/pm@3.6.6))(@tiptap/pm@3.6.6)': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 + '@tiptap/core': 2.26.3(@tiptap/pm@3.6.6) + '@tiptap/pm': 3.6.6 zeed-dom: 0.15.1 - '@tiptap/pm@2.27.1': + '@tiptap/pm@2.26.1': dependencies: prosemirror-changeset: 2.3.1 prosemirror-collab: 1.3.1 prosemirror-commands: 1.7.1 prosemirror-dropcursor: 1.8.2 - prosemirror-gapcursor: 1.4.0 - prosemirror-history: 1.5.0 - prosemirror-inputrules: 1.5.1 + prosemirror-gapcursor: 1.3.2 + prosemirror-history: 1.4.1 + prosemirror-inputrules: 1.5.0 prosemirror-keymap: 1.2.3 prosemirror-markdown: 1.13.2 prosemirror-menu: 1.2.5 - prosemirror-model: 1.25.4 + prosemirror-model: 1.25.3 prosemirror-schema-basic: 1.2.4 prosemirror-schema-list: 1.5.1 - prosemirror-state: 1.4.4 - prosemirror-tables: 1.8.3 - prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.40.0) - prosemirror-transform: 1.10.5 + prosemirror-state: 1.4.3 + prosemirror-tables: 1.7.1 + prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.3)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0) + prosemirror-transform: 1.10.4 prosemirror-view: 1.40.0 - '@tiptap/react@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tiptap/pm@3.6.6': dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/extension-bubble-menu': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) - '@tiptap/extension-floating-menu': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 + prosemirror-changeset: 2.3.1 + prosemirror-collab: 1.3.1 + prosemirror-commands: 1.7.1 + prosemirror-dropcursor: 1.8.2 + prosemirror-gapcursor: 1.3.2 + prosemirror-history: 1.4.1 + prosemirror-inputrules: 1.5.0 + prosemirror-keymap: 1.2.3 + prosemirror-markdown: 1.13.2 + prosemirror-menu: 1.2.5 + prosemirror-model: 1.25.3 + prosemirror-schema-basic: 1.2.4 + prosemirror-schema-list: 1.5.1 + prosemirror-state: 1.4.3 + prosemirror-tables: 1.7.1 + prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.3)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0) + prosemirror-transform: 1.10.4 + prosemirror-view: 1.40.0 + + '@tiptap/react@2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) + '@tiptap/extension-bubble-menu': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1) + '@tiptap/extension-floating-menu': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1) + '@tiptap/pm': 2.26.1 '@types/use-sync-external-store': 0.0.6 fast-deep-equal: 3.1.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - use-sync-external-store: 1.6.0(react@18.3.1) - - '@tiptap/starter-kit@2.27.1': - dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/extension-blockquote': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-bold': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-bullet-list': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-code': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-code-block': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) - '@tiptap/extension-document': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-dropcursor': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) - '@tiptap/extension-gapcursor': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) - '@tiptap/extension-hard-break': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-heading': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-history': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) - '@tiptap/extension-horizontal-rule': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) - '@tiptap/extension-italic': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-list-item': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-ordered-list': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-paragraph': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-strike': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-text': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/extension-text-style': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) - '@tiptap/pm': 2.27.1 - - '@tiptap/suggestion@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': - dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) - '@tiptap/pm': 2.27.1 - - '@tokenizer/inflate@0.4.1': + use-sync-external-store: 1.5.0(react@18.3.1) + + '@tiptap/starter-kit@2.26.1': + dependencies: + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) + '@tiptap/extension-blockquote': 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) + '@tiptap/extension-bold': 2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) + '@tiptap/extension-bullet-list': 2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) + '@tiptap/extension-code': 2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) + '@tiptap/extension-code-block': 2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1) + '@tiptap/extension-document': 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) + '@tiptap/extension-dropcursor': 2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1) + '@tiptap/extension-gapcursor': 2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1) + '@tiptap/extension-hard-break': 2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) + '@tiptap/extension-heading': 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) + '@tiptap/extension-history': 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1) + '@tiptap/extension-horizontal-rule': 2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1) + '@tiptap/extension-italic': 2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) + '@tiptap/extension-list-item': 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) + '@tiptap/extension-ordered-list': 2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) + '@tiptap/extension-paragraph': 2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) + '@tiptap/extension-strike': 2.26.2(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) + '@tiptap/extension-text': 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) + '@tiptap/extension-text-style': 2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) + '@tiptap/pm': 2.26.1 + + '@tiptap/suggestion@2.26.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)': + dependencies: + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) + '@tiptap/pm': 2.26.1 + + '@tokenizer/inflate@0.2.7': dependencies: debug: 4.4.3 + fflate: 0.8.2 token-types: 6.1.1 transitivePeerDependencies: - supports-color @@ -12165,34 +12210,33 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 '@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.28.5 + '@babel/types': 7.28.4 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.28.4 '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 '@types/node': 22.12.0 - '@types/chai@5.2.3': + '@types/chai@5.2.2': dependencies: '@types/deep-eql': 4.0.2 - assertion-error: 2.0.1 '@types/compression@1.8.1': dependencies: @@ -12207,7 +12251,7 @@ snapshots: dependencies: '@types/node': 22.12.0 - '@types/d3-array@3.2.2': {} + '@types/d3-array@3.2.1': {} '@types/d3-color@3.1.3': {} @@ -12253,32 +12297,32 @@ snapshots: '@types/estree@1.0.8': {} - '@types/express-serve-static-core@4.19.7': + '@types/express-serve-static-core@4.19.6': dependencies: '@types/node': 22.12.0 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 - '@types/send': 1.2.1 + '@types/send': 0.17.5 - '@types/express-serve-static-core@5.1.0': + '@types/express-serve-static-core@5.0.7': dependencies: '@types/node': 22.12.0 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 - '@types/send': 1.2.1 + '@types/send': 0.17.5 - '@types/express-ws@3.0.6': + '@types/express-ws@3.0.5': dependencies: '@types/express': 4.17.23 - '@types/express-serve-static-core': 5.1.0 + '@types/express-serve-static-core': 5.0.7 '@types/ws': 8.18.1 '@types/express@4.17.23': dependencies: '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 4.19.7 + '@types/express-serve-static-core': 4.19.6 '@types/qs': 6.14.0 - '@types/serve-static': 2.2.0 + '@types/serve-static': 1.15.8 '@types/hast@2.3.10': dependencies: @@ -12307,9 +12351,9 @@ snapshots: '@types/lodash-es@4.17.12': dependencies: - '@types/lodash': 4.17.21 + '@types/lodash': 4.17.20 - '@types/lodash@4.17.21': {} + '@types/lodash@4.17.20': {} '@types/markdown-it@13.0.9': dependencies: @@ -12335,6 +12379,8 @@ snapshots: '@types/mdx@2.0.13': {} + '@types/mime@1.3.5': {} + '@types/ms@2.1.0': {} '@types/mysql@2.15.27': @@ -12375,7 +12421,7 @@ snapshots: '@types/react@18.3.11': dependencies: '@types/prop-types': 15.7.15 - csstype: 3.2.3 + csstype: 3.1.3 '@types/reactcss@1.2.13(@types/react@18.3.11)': dependencies: @@ -12385,14 +12431,16 @@ snapshots: '@types/semver@7.7.1': {} - '@types/send@1.2.1': + '@types/send@0.17.5': dependencies: + '@types/mime': 1.3.5 '@types/node': 22.12.0 - '@types/serve-static@2.2.0': + '@types/serve-static@1.15.8': dependencies: '@types/http-errors': 2.0.5 '@types/node': 22.12.0 + '@types/send': 0.17.5 '@types/tedious@4.0.14': dependencies: @@ -12414,15 +12462,15 @@ snapshots: dependencies: '@types/node': 22.12.0 - '@typescript-eslint/eslint-plugin@8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3))(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3)': dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3) + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3) '@typescript-eslint/scope-manager': 8.48.1 - '@typescript-eslint/type-utils': 8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.48.1 - eslint: 9.39.1(jiti@2.6.1) + eslint: 9.39.1(jiti@2.5.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -12431,14 +12479,23 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3)': + '@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 8.48.1 '@typescript-eslint/types': 8.48.1 '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.48.1 debug: 4.4.3 - eslint: 9.39.1(jiti@2.6.1) + eslint: 9.39.1(jiti@2.5.1) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.44.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.45.0(typescript@5.8.3) + '@typescript-eslint/types': 8.45.0 + debug: 4.4.3 typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -12452,29 +12509,82 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/project-service@8.49.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.8.3) + '@typescript-eslint/types': 8.49.0 + debug: 4.4.3 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.44.0': + dependencies: + '@typescript-eslint/types': 8.44.0 + '@typescript-eslint/visitor-keys': 8.44.0 + '@typescript-eslint/scope-manager@8.48.1': dependencies: '@typescript-eslint/types': 8.48.1 '@typescript-eslint/visitor-keys': 8.48.1 + '@typescript-eslint/scope-manager@8.49.0': + dependencies: + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/visitor-keys': 8.49.0 + + '@typescript-eslint/tsconfig-utils@8.44.0(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + + '@typescript-eslint/tsconfig-utils@8.45.0(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + '@typescript-eslint/tsconfig-utils@8.48.1(typescript@5.8.3)': dependencies: typescript: 5.8.3 - '@typescript-eslint/type-utils@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.49.0(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + + '@typescript-eslint/type-utils@8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 8.48.1 '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3) debug: 4.4.3 - eslint: 9.39.1(jiti@2.6.1) + eslint: 9.39.1(jiti@2.5.1) ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color + '@typescript-eslint/types@8.44.0': {} + + '@typescript-eslint/types@8.45.0': {} + '@typescript-eslint/types@8.48.1': {} + '@typescript-eslint/types@8.49.0': {} + + '@typescript-eslint/typescript-estree@8.44.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/project-service': 8.44.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.44.0(typescript@5.8.3) + '@typescript-eslint/types': 8.44.0 + '@typescript-eslint/visitor-keys': 8.44.0 + debug: 4.4.3 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/typescript-estree@8.48.1(typescript@5.8.3)': dependencies: '@typescript-eslint/project-service': 8.48.1(typescript@5.8.3) @@ -12483,29 +12593,76 @@ snapshots: '@typescript-eslint/visitor-keys': 8.48.1 debug: 4.4.3 minimatch: 9.0.5 - semver: 7.7.3 + semver: 7.7.2 tinyglobby: 0.2.15 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.49.0(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) + '@typescript-eslint/project-service': 8.49.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.8.3) + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/visitor-keys': 8.49.0 + debug: 4.4.3 + minimatch: 9.0.5 + semver: 7.7.2 + tinyglobby: 0.2.15 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.44.0(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.5.1)) + '@typescript-eslint/scope-manager': 8.44.0 + '@typescript-eslint/types': 8.44.0 + '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.8.3) + eslint: 9.39.1(jiti@2.5.1) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.5.1)) '@typescript-eslint/scope-manager': 8.48.1 '@typescript-eslint/types': 8.48.1 '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.8.3) - eslint: 9.39.1(jiti@2.6.1) + eslint: 9.39.1(jiti@2.5.1) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.49.0(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.5.1)) + '@typescript-eslint/scope-manager': 8.49.0 + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.8.3) + eslint: 9.39.1(jiti@2.5.1) typescript: 5.8.3 transitivePeerDependencies: - supports-color + '@typescript-eslint/visitor-keys@8.44.0': + dependencies: + '@typescript-eslint/types': 8.44.0 + eslint-visitor-keys: 4.2.1 + '@typescript-eslint/visitor-keys@8.48.1': dependencies: '@typescript-eslint/types': 8.48.1 eslint-visitor-keys: 4.2.1 + '@typescript-eslint/visitor-keys@8.49.0': + dependencies: + '@typescript-eslint/types': 8.49.0 + eslint-visitor-keys: 4.2.1 + '@ungap/structured-clone@1.3.0': {} '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -12567,14 +12724,14 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitest/eslint-plugin@1.5.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3)(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))': + '@vitest/eslint-plugin@1.5.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3)(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: - '@typescript-eslint/scope-manager': 8.48.1 - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3) - eslint: 9.39.1(jiti@2.6.1) + '@typescript-eslint/scope-manager': 8.49.0 + '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3) + eslint: 9.39.1(jiti@2.5.1) optionalDependencies: typescript: 5.8.3 - vitest: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2) + vitest: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -12587,7 +12744,7 @@ snapshots: '@vitest/expect@3.2.4': dependencies: - '@types/chai': 5.2.3 + '@types/chai': 5.2.2 '@vitest/spy': 3.2.4 '@vitest/utils': 3.2.4 chai: 5.3.3 @@ -12596,27 +12753,27 @@ snapshots: '@vitest/expect@4.0.15': dependencies: '@standard-schema/spec': 1.0.0 - '@types/chai': 5.2.3 + '@types/chai': 5.2.2 '@vitest/spy': 4.0.15 '@vitest/utils': 4.0.15 chai: 6.2.1 tinyrainbow: 3.0.3 - '@vitest/mocker@3.2.4(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))': + '@vitest/mocker@3.2.4(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 - magic-string: 0.30.21 + magic-string: 0.30.19 optionalDependencies: - vite: 7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2) + vite: 7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) - '@vitest/mocker@4.0.15(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))': + '@vitest/mocker@4.0.15(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: '@vitest/spy': 4.0.15 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2) + vite: 7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) '@vitest/pretty-format@2.0.5': dependencies: @@ -12651,7 +12808,7 @@ snapshots: '@vitest/spy@3.2.4': dependencies: - tinyspy: 4.0.4 + tinyspy: 4.0.3 '@vitest/spy@4.0.15': {} @@ -12818,7 +12975,7 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 + fast-uri: 3.0.6 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -12826,7 +12983,7 @@ snapshots: dependencies: string-width: 4.2.3 - ansi-escapes@7.2.0: + ansi-escapes@7.0.0: dependencies: environment: 1.1.0 @@ -12846,6 +13003,8 @@ snapshots: ansi-styles@5.2.0: {} + ansi-styles@6.2.1: {} + ansi-styles@6.2.3: {} ansis@4.2.0: {} @@ -12969,11 +13128,11 @@ snapshots: attr-accept@2.2.5: {} - autoprefixer@10.4.22(postcss@8.5.6): + autoprefixer@10.4.21(postcss@8.5.6): dependencies: - browserslist: 4.28.1 - caniuse-lite: 1.0.30001759 - fraction.js: 5.3.4 + browserslist: 4.26.2 + caniuse-lite: 1.0.30001743 + fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 postcss: 8.5.6 @@ -12983,12 +13142,12 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - axe-core@4.11.0: {} + axe-core@4.10.3: {} axios@1.12.0: dependencies: follow-redirects: 1.15.11 - form-data: 4.0.5 + form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug @@ -12997,13 +13156,20 @@ snapshots: babel-dead-code-elimination@1.0.10: dependencies: - '@babel/core': 7.28.5 - '@babel/parser': 7.28.5 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/core': 7.28.3 + '@babel/parser': 7.28.3 + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 transitivePeerDependencies: - supports-color + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.26.10 + cosmiconfig: 7.1.0 + resolve: 1.22.10 + optional: true + bail@2.0.2: {} balanced-match@1.0.2: {} @@ -13012,7 +13178,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.9.2: {} + baseline-browser-mapping@2.8.4: {} basic-auth@2.0.1: dependencies: @@ -13032,22 +13198,22 @@ snapshots: bind-event-listener@3.0.0: {} - birpc@2.8.0: {} + birpc@2.9.0: {} bluebird@3.7.2: {} - body-parser@1.20.4: + body-parser@1.20.3: dependencies: bytes: 3.1.2 content-type: 1.0.5 debug: 2.6.9 depd: 2.0.0 destroy: 1.2.0 - http-errors: 2.0.1 + http-errors: 2.0.0 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.14.0 - raw-body: 2.5.3 + qs: 6.13.0 + raw-body: 2.5.2 type-is: 1.6.18 unpipe: 1.0.0 transitivePeerDependencies: @@ -13084,13 +13250,13 @@ snapshots: dependencies: pako: 1.0.11 - browserslist@4.28.1: + browserslist@4.26.2: dependencies: - baseline-browser-mapping: 2.9.2 - caniuse-lite: 1.0.30001759 - electron-to-chromium: 1.5.266 - node-releases: 2.0.27 - update-browserslist-db: 1.2.2(browserslist@4.28.1) + baseline-browser-mapping: 2.8.4 + caniuse-lite: 1.0.30001743 + electron-to-chromium: 1.5.218 + node-releases: 2.0.21 + update-browserslist-db: 1.1.3(browserslist@4.26.2) buffer-from@1.1.2: {} @@ -13099,6 +13265,10 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + bytes@3.0.0: {} bytes@3.1.2: {} @@ -13133,7 +13303,7 @@ snapshots: camelcase@7.0.1: {} - caniuse-lite@1.0.30001759: {} + caniuse-lite@1.0.30001743: {} capital-case@1.0.4: dependencies: @@ -13270,7 +13440,7 @@ snapshots: '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-dialog': 1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-id': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -13285,32 +13455,27 @@ snapshots: dependencies: color-name: 1.1.4 - color-convert@3.1.3: - dependencies: - color-name: 2.1.0 - color-name@1.1.3: {} color-name@1.1.4: {} - color-name@2.1.0: {} - color-string@1.9.1: dependencies: color-name: 1.1.4 simple-swizzle: 0.2.4 - color-string@2.1.4: - dependencies: - color-name: 2.1.0 - - color@5.0.3: + color@3.2.1: dependencies: - color-convert: 3.1.3 - color-string: 2.1.4 + color-convert: 1.9.3 + color-string: 1.9.1 colorette@2.0.20: {} + colorspace@1.1.4: + dependencies: + color: 3.2.1 + text-hex: 1.0.0 + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -13367,13 +13532,13 @@ snapshots: convert-source-map@2.0.0: {} - cookie-signature@1.0.7: {} + cookie-signature@1.0.6: {} - cookie@0.7.2: {} + cookie@0.7.1: {} - cookie@1.1.1: {} + cookie@1.0.2: {} - core-js@3.47.0: {} + core-js@3.45.1: {} cors@2.8.5: dependencies: @@ -13409,7 +13574,7 @@ snapshots: crypto-js@4.2.0: {} - css-loader@6.11.0(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)): + css-loader@6.11.0(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -13418,9 +13583,9 @@ snapshots: postcss-modules-scope: 3.2.1(postcss@8.5.6) postcss-modules-values: 4.0.0(postcss@8.5.6) postcss-value-parser: 4.2.0 - semver: 7.7.3 + semver: 7.7.2 optionalDependencies: - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0) + webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0) css-select@4.3.0: dependencies: @@ -13449,7 +13614,7 @@ snapshots: cssesc@3.0.0: {} - csstype@3.2.3: {} + csstype@3.1.3: {} d3-array@3.2.4: dependencies: @@ -13535,7 +13700,9 @@ snapshots: dedent@0.7.0: {} - dedent@1.7.0: {} + dedent@1.6.0(babel-plugin-macros@3.1.0): + optionalDependencies: + babel-plugin-macros: 3.1.0 deep-eql@5.0.2: {} @@ -13586,7 +13753,7 @@ snapshots: destroy@1.2.0: {} - detect-libc@2.1.2: {} + detect-libc@2.0.4: {} detect-node-es@1.1.0: {} @@ -13623,7 +13790,7 @@ snapshots: dom-helpers@5.2.1: dependencies: '@babel/runtime': 7.26.10 - csstype: 3.2.3 + csstype: 3.1.3 dom-serializer@1.4.1: dependencies: @@ -13674,7 +13841,7 @@ snapshots: dotenv@16.6.1: {} - dotenv@17.2.3: {} + dotenv@17.2.1: {} dts-resolver@2.1.3: {} @@ -13686,37 +13853,37 @@ snapshots: eastasianwidth@0.2.0: {} - eciesjs@0.4.16: + eciesjs@0.4.15: dependencies: - '@ecies/ciphers': 0.2.5(@noble/ciphers@1.3.0) + '@ecies/ciphers': 0.2.4(@noble/ciphers@1.3.0) '@noble/ciphers': 1.3.0 '@noble/curves': 1.9.7 '@noble/hashes': 1.8.0 ee-first@1.1.1: {} - electron-to-chromium@1.5.266: {} + electron-to-chromium@1.5.218: {} element-resize-detector@1.2.4: dependencies: batch-processor: 1.0.0 - emoji-picker-react@4.16.1(react@18.3.1): + emoji-picker-react@4.12.2(react@18.3.1): dependencies: flairup: 1.0.0 react: 18.3.1 - emoji-regex@10.6.0: {} + emoji-regex@10.5.0: {} emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} - emojibase-data@15.3.2(emojibase@17.0.0): + emojibase-data@15.3.2(emojibase@16.0.0): dependencies: - emojibase: 17.0.0 + emojibase: 16.0.0 - emojibase@17.0.0: {} + emojibase@16.0.0: {} empathic@2.0.0: {} @@ -13901,18 +14068,18 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.39.1(jiti@2.6.1)): + eslint-compat-utils@0.5.1(eslint@9.39.1(jiti@2.5.1)): dependencies: - eslint: 9.39.1(jiti@2.6.1) - semver: 7.7.3 + eslint: 9.39.1(jiti@2.5.1) + semver: 7.7.2 - eslint-config-prettier@10.1.8(eslint@9.39.1(jiti@2.6.1)): + eslint-config-prettier@10.1.8(eslint@9.39.1(jiti@2.5.1)): dependencies: - eslint: 9.39.1(jiti@2.6.1) + eslint: 9.39.1(jiti@2.5.1) eslint-import-context@0.1.9(unrs-resolver@1.11.1): dependencies: - get-tsconfig: 4.13.0 + get-tsconfig: 4.10.1 stable-hash-x: 0.2.0 optionalDependencies: unrs-resolver: 1.11.1 @@ -13921,44 +14088,44 @@ snapshots: dependencies: debug: 3.2.7 is-core-module: 2.16.1 - resolve: 1.22.11 + resolve: 1.22.10 transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)): + eslint-import-resolver-typescript@4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.5.1)): dependencies: debug: 4.4.3 - eslint: 9.39.1(jiti@2.6.1) + eslint: 9.39.1(jiti@2.5.1) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) - get-tsconfig: 4.13.0 + get-tsconfig: 4.10.1 is-bun-module: 2.0.0 stable-hash-x: 0.2.0 tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.1(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.1(jiti@2.5.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.1(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.1(jiti@2.5.1)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3) - eslint: 9.39.1(jiti@2.6.1) + '@typescript-eslint/parser': 8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3) + eslint: 9.39.1(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)) + eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.5.1)) transitivePeerDependencies: - supports-color - eslint-plugin-es-x@7.8.0(eslint@9.39.1(jiti@2.6.1)): + eslint-plugin-es-x@7.8.0(eslint@9.39.1(jiti@2.5.1)): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) - '@eslint-community/regexpp': 4.12.2 - eslint: 9.39.1(jiti@2.6.1) - eslint-compat-utils: 0.5.1(eslint@9.39.1(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.5.1)) + '@eslint-community/regexpp': 4.12.1 + eslint: 9.39.1(jiti@2.5.1) + eslint-compat-utils: 0.5.1(eslint@9.39.1(jiti@2.5.1)) - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.1(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.1(jiti@2.5.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -13967,9 +14134,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.39.1(jiti@2.6.1) + eslint: 9.39.1(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.1(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.1(jiti@2.5.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -13981,23 +14148,23 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/parser': 8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.1(jiti@2.6.1)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.1(jiti@2.5.1)): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 - axe-core: 4.11.0 + axe-core: 4.10.3 axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.39.1(jiti@2.6.1) + eslint: 9.39.1(jiti@2.5.1) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -14006,42 +14173,42 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-n@17.23.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3): + eslint-plugin-n@17.23.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.5.1)) enhanced-resolve: 5.18.3 - eslint: 9.39.1(jiti@2.6.1) - eslint-plugin-es-x: 7.8.0(eslint@9.39.1(jiti@2.6.1)) - get-tsconfig: 4.13.0 + eslint: 9.39.1(jiti@2.5.1) + eslint-plugin-es-x: 7.8.0(eslint@9.39.1(jiti@2.5.1)) + get-tsconfig: 4.10.1 globals: 15.15.0 globrex: 0.1.2 ignore: 5.3.2 - semver: 7.7.3 + semver: 7.7.2 ts-declaration-location: 1.0.7(typescript@5.8.3) transitivePeerDependencies: - typescript - eslint-plugin-promise@7.2.1(eslint@9.39.1(jiti@2.6.1)): + eslint-plugin-promise@7.2.1(eslint@9.39.1(jiti@2.5.1)): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) - eslint: 9.39.1(jiti@2.6.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.5.1)) + eslint: 9.39.1(jiti@2.5.1) - eslint-plugin-react-hooks@7.0.1(eslint@9.39.1(jiti@2.6.1)): + eslint-plugin-react-hooks@7.0.1(eslint@9.39.1(jiti@2.5.1)): dependencies: - '@babel/core': 7.28.5 - '@babel/parser': 7.28.5 - eslint: 9.39.1(jiti@2.6.1) + '@babel/core': 7.28.3 + '@babel/parser': 7.28.3 + eslint: 9.39.1(jiti@2.5.1) hermes-parser: 0.25.1 zod: 3.25.76 zod-validation-error: 4.0.2(zod@3.25.76) transitivePeerDependencies: - supports-color - eslint-plugin-react-refresh@0.4.24(eslint@9.39.1(jiti@2.6.1)): + eslint-plugin-react-refresh@0.4.24(eslint@9.39.1(jiti@2.5.1)): dependencies: - eslint: 9.39.1(jiti@2.6.1) + eslint: 9.39.1(jiti@2.5.1) - eslint-plugin-react@7.37.5(eslint@9.39.1(jiti@2.6.1)): + eslint-plugin-react@7.37.5(eslint@9.39.1(jiti@2.5.1)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -14049,7 +14216,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.39.1(jiti@2.6.1) + eslint: 9.39.1(jiti@2.5.1) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -14063,19 +14230,19 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-storybook@10.1.4(eslint@9.39.1(jiti@2.6.1))(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))(typescript@5.8.3): + eslint-plugin-storybook@10.1.4(eslint@9.39.1(jiti@2.5.1))(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.8.3): dependencies: - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3) - eslint: 9.39.1(jiti@2.6.1) - storybook: 9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) + '@typescript-eslint/utils': 8.44.0(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3) + eslint: 9.39.1(jiti@2.5.1) + storybook: 9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-turbo@2.6.3(eslint@9.39.1(jiti@2.6.1))(turbo@2.6.3): + eslint-plugin-turbo@2.6.3(eslint@9.39.1(jiti@2.5.1))(turbo@2.6.3): dependencies: dotenv: 16.0.3 - eslint: 9.39.1(jiti@2.6.1) + eslint: 9.39.1(jiti@2.5.1) turbo: 2.6.3 eslint-scope@5.1.1: @@ -14092,14 +14259,14 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.39.1(jiti@2.6.1): + eslint@9.39.1(jiti@2.5.1): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) - '@eslint-community/regexpp': 4.12.2 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.5.1)) + '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.1 '@eslint/config-helpers': 0.4.2 '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.3 + '@eslint/eslintrc': 3.3.1 '@eslint/js': 9.39.1 '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.7 @@ -14129,7 +14296,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.6.1 + jiti: 2.5.1 transitivePeerDependencies: - supports-color @@ -14185,15 +14352,15 @@ snapshots: exit-hook@2.2.1: {} - expect-type@1.2.2: {} + expect-type@1.3.0: {} export-to-csv@1.4.0: {} - express-winston@4.2.0(winston@3.19.0): + express-winston@4.2.0(winston@3.17.0): dependencies: chalk: 2.4.2 lodash: 4.17.21 - winston: 3.19.0 + winston: 3.17.0 express-ws@5.0.2(express@4.22.0): dependencies: @@ -14207,19 +14374,19 @@ snapshots: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.4 + body-parser: 1.20.3 content-disposition: 0.5.4 content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.0.7 + cookie: 0.7.1 + cookie-signature: 1.0.6 debug: 2.6.9 depd: 2.0.0 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.3.2 + finalhandler: 1.3.1 fresh: 0.5.2 - http-errors: 2.0.1 + http-errors: 2.0.0 merge-descriptors: 1.0.3 methods: 1.1.2 on-finished: 2.4.1 @@ -14229,10 +14396,10 @@ snapshots: qs: 6.14.0 range-parser: 1.2.1 safe-buffer: 5.2.1 - send: 0.19.1 + send: 0.19.0 serve-static: 1.16.2 setprototypeof: 1.2.0 - statuses: 2.0.2 + statuses: 2.0.1 type-is: 1.6.18 utils-merge: 1.0.1 vary: 1.1.2 @@ -14243,7 +14410,7 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-equals@5.3.3: {} + fast-equals@5.2.2: {} fast-glob@3.3.3: dependencies: @@ -14259,7 +14426,7 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-uri@3.1.0: {} + fast-uri@3.0.6: {} fastq@1.19.1: dependencies: @@ -14273,6 +14440,8 @@ snapshots: fflate@0.4.8: {} + fflate@0.8.2: {} + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -14281,9 +14450,9 @@ snapshots: dependencies: tslib: 2.8.1 - file-type@21.1.1: + file-type@21.0.0: dependencies: - '@tokenizer/inflate': 0.4.1 + '@tokenizer/inflate': 0.2.7 strtok3: 10.3.4 token-types: 6.1.1 uint8array-extras: 1.5.0 @@ -14296,14 +14465,14 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@1.3.2: + finalhandler@1.3.1: dependencies: debug: 2.6.9 encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 - statuses: 2.0.2 + statuses: 2.0.1 unpipe: 1.0.0 transitivePeerDependencies: - supports-color @@ -14388,7 +14557,7 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)): dependencies: '@babel/code-frame': 7.27.1 chalk: 4.1.2 @@ -14400,12 +14569,12 @@ snapshots: minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.7.3 + semver: 7.7.2 tapable: 2.3.0 typescript: 5.8.3 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0) + webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0) - form-data@4.0.5: + form-data@4.0.4: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -14417,14 +14586,15 @@ snapshots: forwarded@0.2.0: {} - fraction.js@5.3.4: {} + fraction.js@4.3.7: {} - framer-motion@12.23.25(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + framer-motion@12.23.12(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - motion-dom: 12.23.23 + motion-dom: 12.23.12 motion-utils: 12.23.6 tslib: 2.8.1 optionalDependencies: + '@emotion/is-prop-valid': 1.3.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -14442,7 +14612,7 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 - fs-extra@11.3.2: + fs-extra@11.3.1: dependencies: graceful-fs: 4.2.11 jsonfile: 6.2.0 @@ -14466,8 +14636,6 @@ snapshots: functions-have-names@1.2.3: {} - generator-function@2.0.1: {} - gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} @@ -14506,6 +14674,10 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 + get-tsconfig@4.10.1: + dependencies: + resolve-pkg-maps: 1.0.0 + get-tsconfig@4.13.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -14527,7 +14699,7 @@ snapshots: minimatch: 10.1.1 minipass: 7.1.2 package-json-from-dist: 1.0.1 - path-scurry: 2.0.1 + path-scurry: 2.0.0 globals@14.0.0: {} @@ -14617,7 +14789,7 @@ snapshots: hast-util-embedded: 3.0.0 hast-util-is-element: 3.0.0 hast-util-whitespace: 3.0.0 - unist-util-is: 6.0.1 + unist-util-is: 6.0.0 hast-util-parse-selector@4.0.0: dependencies: @@ -14728,11 +14900,11 @@ snapshots: he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.44.1 + terser: 5.43.1 html-void-elements@3.0.0: {} - html-webpack-plugin@5.6.5(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)): + html-webpack-plugin@5.6.4(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -14740,7 +14912,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.3.0 optionalDependencies: - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0) + webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0) htmlparser2@6.1.0: dependencies: @@ -14757,14 +14929,6 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 - http-errors@2.0.1: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.2 - toidentifier: 1.0.1 - https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 @@ -14826,16 +14990,16 @@ snapshots: internmap@2.0.3: {} - intl-messageformat@10.7.18: + intl-messageformat@10.7.16: dependencies: - '@formatjs/ecma402-abstract': 2.3.6 + '@formatjs/ecma402-abstract': 2.3.4 '@formatjs/fast-memoize': 2.2.7 - '@formatjs/icu-messageformat-parser': 2.11.4 + '@formatjs/icu-messageformat-parser': 2.11.2 tslib: 2.8.1 ioredis@4.30.1: dependencies: - '@ioredis/commands': 1.5.0 + '@ioredis/commands': 1.3.0 cluster-key-slot: 1.1.2 debug: 4.4.3 denque: 1.5.1 @@ -14851,7 +15015,7 @@ snapshots: ioredis@5.7.0: dependencies: - '@ioredis/commands': 1.5.0 + '@ioredis/commands': 1.3.0 cluster-key-slot: 1.1.2 debug: 4.4.3 denque: 2.1.0 @@ -14905,7 +15069,7 @@ snapshots: is-bun-module@2.0.0: dependencies: - semver: 7.7.3 + semver: 7.7.2 is-callable@1.2.7: {} @@ -14940,10 +15104,9 @@ snapshots: dependencies: get-east-asian-width: 1.4.0 - is-generator-function@1.1.2: + is-generator-function@1.1.0: 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 @@ -15020,7 +15183,7 @@ snapshots: isarray@2.0.5: {} - isbot@5.1.32: {} + isbot@5.1.31: {} isexe@2.0.0: {} @@ -15055,7 +15218,7 @@ snapshots: jiti@1.21.7: {} - jiti@2.6.1: {} + jiti@2.5.1: {} js-tokens@4.0.0: {} @@ -15065,16 +15228,16 @@ snapshots: jscodeshift@17.3.0: dependencies: - '@babel/core': 7.28.5 - '@babel/parser': 7.28.5 - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.5) - '@babel/preset-flow': 7.27.1(@babel/core@7.28.5) - '@babel/preset-typescript': 7.28.5(@babel/core@7.28.5) - '@babel/register': 7.28.3(@babel/core@7.28.5) + '@babel/core': 7.28.3 + '@babel/parser': 7.28.3 + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.3) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.3) + '@babel/preset-flow': 7.27.1(@babel/core@7.28.3) + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.3) + '@babel/register': 7.28.3(@babel/core@7.28.3) flow-parser: 0.293.0 graceful-fs: 4.2.11 micromatch: 4.0.8 @@ -15090,6 +15253,8 @@ snapshots: jsesc@3.0.2: {} + jsesc@3.1.0: {} + json-buffer@3.0.1: {} json-parse-even-better-errors@2.3.1: {} @@ -15123,7 +15288,7 @@ snapshots: jsx-dom-cjs@8.1.6: dependencies: - csstype: 3.2.3 + csstype: 3.1.3 keyv@4.5.4: dependencies: @@ -15173,7 +15338,7 @@ snapshots: nano-spawn: 2.0.0 pidtree: 0.6.0 string-argv: 0.3.2 - yaml: 2.8.2 + yaml: 2.8.1 listr2@9.0.5: dependencies: @@ -15182,7 +15347,7 @@ snapshots: eventemitter3: 5.0.1 log-update: 6.1.0 rfdc: 1.4.1 - wrap-ansi: 9.0.2 + wrap-ansi: 9.0.0 lit-element@3.3.3: dependencies: @@ -15200,7 +15365,7 @@ snapshots: lit-element: 3.3.3 lit-html: 2.8.0 - loader-runner@4.3.1: {} + loader-runner@4.3.0: {} locate-path@3.0.0: dependencies: @@ -15221,6 +15386,8 @@ snapshots: lodash-es@4.17.21: {} + lodash.castarray@4.4.0: {} + lodash.debounce@4.0.8: {} lodash.defaults@4.2.0: {} @@ -15229,17 +15396,19 @@ snapshots: lodash.isarguments@3.1.0: {} + lodash.isplainobject@4.0.6: {} + lodash.merge@4.6.2: {} lodash@4.17.21: {} log-update@6.1.0: dependencies: - ansi-escapes: 7.2.0 + ansi-escapes: 7.0.0 cli-cursor: 5.0.0 slice-ansi: 7.1.2 - strip-ansi: 7.1.2 - wrap-ansi: 9.0.2 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 logform@2.7.0: dependencies: @@ -15268,7 +15437,7 @@ snapshots: devlop: 1.1.0 highlight.js: 11.11.1 - lru-cache@11.2.4: {} + lru-cache@11.2.1: {} lru-cache@5.1.1: dependencies: @@ -15282,6 +15451,10 @@ snapshots: lz-string@1.5.0: {} + magic-string@0.30.19: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -15327,8 +15500,8 @@ snapshots: 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 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 mdast-util-from-markdown@1.3.1: dependencies: @@ -15424,7 +15597,7 @@ snapshots: mdast-util-phrasing@4.1.0: dependencies: '@types/mdast': 4.0.4 - unist-util-is: 6.0.1 + unist-util-is: 6.0.0 mdast-util-to-hast@13.2.1: dependencies: @@ -15851,18 +16024,18 @@ snapshots: minipass@7.1.2: {} - mobx-react-lite@4.1.1(mobx@6.12.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + mobx-react-lite@4.1.0(mobx@6.12.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: mobx: 6.12.0 react: 18.3.1 - use-sync-external-store: 1.6.0(react@18.3.1) + use-sync-external-store: 1.5.0(react@18.3.1) optionalDependencies: react-dom: 18.3.1(react@18.3.1) mobx-react@9.1.1(mobx@6.12.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: mobx: 6.12.0 - mobx-react-lite: 4.1.1(mobx@6.12.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + mobx-react-lite: 4.1.0(mobx@6.12.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 optionalDependencies: react-dom: 18.3.1(react@18.3.1) @@ -15885,7 +16058,7 @@ snapshots: transitivePeerDependencies: - supports-color - motion-dom@12.23.23: + motion-dom@12.23.12: dependencies: motion-utils: 12.23.6 @@ -15907,7 +16080,7 @@ snapshots: nanoid@3.3.8: {} - napi-postinstall@0.3.4: {} + napi-postinstall@0.3.3: {} natural-compare@1.4.0: {} @@ -15917,32 +16090,66 @@ snapshots: neo-async@2.6.2: {} - next-themes@0.2.1(next@16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next-themes@0.2.1(next@14.2.32(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + next: 14.2.32(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + next-themes@0.2.1(next@14.2.32(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - next: 16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.32(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - next@16.0.7(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.32(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@next/env': 16.0.7 - '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001759 + '@next/env': 14.2.32 + '@swc/helpers': 0.5.5 + busboy: 1.6.0 + caniuse-lite: 1.0.30001743 + graceful-fs: 4.2.11 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.28.5)(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.28.3)(babel-plugin-macros@3.1.0)(react@18.3.1) optionalDependencies: - '@next/swc-darwin-arm64': 16.0.7 - '@next/swc-darwin-x64': 16.0.7 - '@next/swc-linux-arm64-gnu': 16.0.7 - '@next/swc-linux-arm64-musl': 16.0.7 - '@next/swc-linux-x64-gnu': 16.0.7 - '@next/swc-linux-x64-musl': 16.0.7 - '@next/swc-win32-arm64-msvc': 16.0.7 - '@next/swc-win32-x64-msvc': 16.0.7 + '@next/swc-darwin-arm64': 14.2.32 + '@next/swc-darwin-x64': 14.2.32 + '@next/swc-linux-arm64-gnu': 14.2.32 + '@next/swc-linux-arm64-musl': 14.2.32 + '@next/swc-linux-x64-gnu': 14.2.32 + '@next/swc-linux-x64-musl': 14.2.32 + '@next/swc-win32-arm64-msvc': 14.2.32 + '@next/swc-win32-ia32-msvc': 14.2.32 + '@next/swc-win32-x64-msvc': 14.2.32 + '@opentelemetry/api': 1.9.0 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + next@14.2.32(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@next/env': 14.2.32 + '@swc/helpers': 0.5.5 + busboy: 1.6.0 + caniuse-lite: 1.0.30001743 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 14.2.32 + '@next/swc-darwin-x64': 14.2.32 + '@next/swc-linux-arm64-gnu': 14.2.32 + '@next/swc-linux-arm64-musl': 14.2.32 + '@next/swc-linux-x64-gnu': 14.2.32 + '@next/swc-linux-x64-musl': 14.2.32 + '@next/swc-win32-arm64-msvc': 14.2.32 + '@next/swc-win32-ia32-msvc': 14.2.32 + '@next/swc-win32-x64-msvc': 14.2.32 '@opentelemetry/api': 1.9.0 - sharp: 0.34.4 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -15952,9 +16159,9 @@ snapshots: lower-case: 2.0.2 tslib: 2.8.1 - node-abi@3.85.0: + node-abi@3.75.0: dependencies: - semver: 7.7.3 + semver: 7.7.2 node-abort-controller@3.1.1: {} @@ -15967,13 +16174,13 @@ snapshots: css-select: 5.2.2 he: 1.2.0 - node-releases@2.0.27: {} + node-releases@2.0.21: {} normalize-package-data@5.0.0: dependencies: hosted-git-info: 6.1.3 is-core-module: 2.16.1 - semver: 7.7.3 + semver: 7.7.2 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} @@ -15988,7 +16195,7 @@ snapshots: npm-install-checks@6.3.0: dependencies: - semver: 7.7.3 + semver: 7.7.2 npm-normalize-package-bin@3.0.1: {} @@ -15996,7 +16203,7 @@ snapshots: dependencies: hosted-git-info: 6.1.3 proc-log: 3.0.0 - semver: 7.7.3 + semver: 7.7.2 validate-npm-package-name: 5.0.1 npm-pick-manifest@8.0.2: @@ -16004,7 +16211,7 @@ snapshots: npm-install-checks: 6.3.0 npm-normalize-package-bin: 3.0.1 npm-package-arg: 10.1.0 - semver: 7.7.3 + semver: 7.7.2 npm-run-path@4.0.1: dependencies: @@ -16150,7 +16357,7 @@ snapshots: p-limit@4.0.0: dependencies: - yocto-queue: 1.2.2 + yocto-queue: 1.2.1 p-locate@3.0.0: dependencies: @@ -16170,7 +16377,7 @@ snapshots: p-map@2.1.0: {} - p-map@7.0.4: {} + p-map@7.0.3: {} p-try@2.2.0: {} @@ -16228,9 +16435,9 @@ snapshots: path-parse@1.0.7: {} - path-scurry@2.0.1: + path-scurry@2.0.0: dependencies: - lru-cache: 11.2.4 + lru-cache: 11.2.1 minipass: 7.1.2 path-to-regexp@0.1.12: {} @@ -16287,14 +16494,14 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-cli@11.0.1(jiti@2.6.1)(postcss@8.5.6): + postcss-cli@11.0.1(jiti@2.5.1)(postcss@8.5.6): dependencies: chokidar: 3.6.0 dependency-graph: 1.0.0 - fs-extra: 11.3.2 + fs-extra: 11.3.1 picocolors: 1.1.1 postcss: 8.5.6 - postcss-load-config: 5.1.0(jiti@2.6.1)(postcss@8.5.6) + postcss-load-config: 5.1.0(jiti@2.5.1)(postcss@8.5.6) postcss-reporter: 7.1.0(postcss@8.5.6) pretty-hrtime: 1.0.3 read-cache: 1.0.0 @@ -16310,28 +16517,27 @@ snapshots: postcss: 8.5.6 postcss-value-parser: 4.2.0 read-cache: 1.0.0 - resolve: 1.22.11 + resolve: 1.22.10 - postcss-js@4.1.0(postcss@8.5.6): + postcss-js@4.0.1(postcss@8.5.6): dependencies: camelcase-css: 2.0.1 postcss: 8.5.6 - postcss-load-config@5.1.0(jiti@2.6.1)(postcss@8.5.6): + postcss-load-config@4.0.2(postcss@8.5.6): dependencies: lilconfig: 3.1.3 - yaml: 2.8.2 + yaml: 2.8.1 optionalDependencies: - jiti: 2.6.1 postcss: 8.5.6 - postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.8.2): + postcss-load-config@5.1.0(jiti@2.5.1)(postcss@8.5.6): dependencies: lilconfig: 3.1.3 + yaml: 2.8.1 optionalDependencies: - jiti: 1.21.7 + jiti: 2.5.1 postcss: 8.5.6 - yaml: 2.8.2 postcss-modules-extract-imports@3.1.0(postcss@8.5.6): dependencies: @@ -16341,13 +16547,13 @@ snapshots: dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 - postcss-selector-parser: 7.1.1 + postcss-selector-parser: 7.1.0 postcss-value-parser: 4.2.0 postcss-modules-scope@3.2.1(postcss@8.5.6): dependencies: postcss: 8.5.6 - postcss-selector-parser: 7.1.1 + postcss-selector-parser: 7.1.0 postcss-modules-values@4.0.0(postcss@8.5.6): dependencies: @@ -16375,7 +16581,7 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-selector-parser@7.1.1: + postcss-selector-parser@7.1.0: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 @@ -16404,15 +16610,14 @@ snapshots: dependencies: xtend: 4.0.2 - posthog-js@1.302.2: + posthog-js@1.255.1: dependencies: - '@posthog/core': 1.7.1 - core-js: 3.47.0 + core-js: 3.45.1 fflate: 0.4.8 - preact: 10.28.0 + preact: 10.27.1 web-vitals: 4.2.4 - preact@10.28.0: {} + preact@10.27.1: {} prelude-ls@1.2.1: {} @@ -16456,113 +16661,113 @@ snapshots: prosemirror-changeset@2.3.1: dependencies: - prosemirror-transform: 1.10.5 + prosemirror-transform: 1.10.4 - prosemirror-codemark@0.4.2(prosemirror-inputrules@1.5.1)(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.40.0): + prosemirror-codemark@0.4.2(prosemirror-inputrules@1.5.0)(prosemirror-model@1.25.3)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0): dependencies: - prosemirror-inputrules: 1.5.1 - prosemirror-model: 1.25.4 - prosemirror-state: 1.4.4 + prosemirror-inputrules: 1.5.0 + prosemirror-model: 1.25.3 + prosemirror-state: 1.4.3 prosemirror-view: 1.40.0 prosemirror-collab@1.3.1: dependencies: - prosemirror-state: 1.4.4 + prosemirror-state: 1.4.3 prosemirror-commands@1.7.1: dependencies: - prosemirror-model: 1.25.4 - prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 + prosemirror-model: 1.25.3 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.4 prosemirror-dropcursor@1.8.2: dependencies: - prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.4 prosemirror-view: 1.40.0 - prosemirror-gapcursor@1.4.0: + prosemirror-gapcursor@1.3.2: dependencies: prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.4 - prosemirror-state: 1.4.4 + prosemirror-model: 1.25.3 + prosemirror-state: 1.4.3 prosemirror-view: 1.40.0 - prosemirror-history@1.5.0: + prosemirror-history@1.4.1: dependencies: - prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.4 prosemirror-view: 1.40.0 rope-sequence: 1.3.4 - prosemirror-inputrules@1.5.1: + prosemirror-inputrules@1.5.0: dependencies: - prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.4 prosemirror-keymap@1.2.3: dependencies: - prosemirror-state: 1.4.4 + prosemirror-state: 1.4.3 w3c-keyname: 2.2.8 prosemirror-markdown@1.13.2: dependencies: '@types/markdown-it': 14.1.2 markdown-it: 14.1.0 - prosemirror-model: 1.25.4 + prosemirror-model: 1.25.3 prosemirror-menu@1.2.5: dependencies: crelt: 1.0.6 prosemirror-commands: 1.7.1 - prosemirror-history: 1.5.0 - prosemirror-state: 1.4.4 + prosemirror-history: 1.4.1 + prosemirror-state: 1.4.3 - prosemirror-model@1.25.4: + prosemirror-model@1.25.3: dependencies: orderedmap: 2.1.1 prosemirror-schema-basic@1.2.4: dependencies: - prosemirror-model: 1.25.4 + prosemirror-model: 1.25.3 prosemirror-schema-list@1.5.1: dependencies: - prosemirror-model: 1.25.4 - prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 + prosemirror-model: 1.25.3 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.4 - prosemirror-state@1.4.4: + prosemirror-state@1.4.3: dependencies: - prosemirror-model: 1.25.4 - prosemirror-transform: 1.10.5 + prosemirror-model: 1.25.3 + prosemirror-transform: 1.10.4 prosemirror-view: 1.40.0 - prosemirror-tables@1.8.3: + prosemirror-tables@1.7.1: dependencies: prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.4 - prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 + prosemirror-model: 1.25.3 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.4 prosemirror-view: 1.40.0 - prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.40.0): + prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.3)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0): dependencies: '@remirror/core-constants': 3.0.0 escape-string-regexp: 4.0.0 - prosemirror-model: 1.25.4 - prosemirror-state: 1.4.4 + prosemirror-model: 1.25.3 + prosemirror-state: 1.4.3 prosemirror-view: 1.40.0 - prosemirror-transform@1.10.5: + prosemirror-transform@1.10.4: dependencies: - prosemirror-model: 1.25.4 + prosemirror-model: 1.25.3 prosemirror-view@1.40.0: dependencies: - prosemirror-model: 1.25.4 - prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 + prosemirror-model: 1.25.3 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.4 proxy-addr@2.0.7: dependencies: @@ -16577,11 +16782,15 @@ snapshots: punycode@2.3.1: {} + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + qs@6.14.0: dependencies: side-channel: 1.1.0 - quansync@1.0.0: {} + quansync@0.2.11: {} queue-microtask@1.2.3: {} @@ -16599,10 +16808,10 @@ snapshots: range-parser@1.2.1: {} - raw-body@2.5.3: + raw-body@2.5.2: dependencies: bytes: 3.1.2 - http-errors: 2.0.1 + http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 @@ -16642,31 +16851,31 @@ snapshots: react-docgen@7.1.1: dependencies: - '@babel/core': 7.28.5 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/core': 7.28.4 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 '@types/doctrine': 0.0.9 '@types/resolve': 1.20.6 doctrine: 3.0.0 - resolve: 1.22.11 - strip-indent: 4.1.1 + resolve: 1.22.10 + strip-indent: 4.1.0 transitivePeerDependencies: - supports-color - react-docgen@8.0.2: + react-docgen@8.0.1: dependencies: - '@babel/core': 7.28.5 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/core': 7.28.4 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 '@types/doctrine': 0.0.9 '@types/resolve': 1.20.6 doctrine: 3.0.0 - resolve: 1.22.11 - strip-indent: 4.1.1 + resolve: 1.22.10 + strip-indent: 4.1.0 transitivePeerDependencies: - supports-color @@ -16727,7 +16936,7 @@ snapshots: prop-types: 15.8.1 react: 18.3.1 - react-pdf-html@2.1.4(@react-pdf/renderer@3.4.5(react@18.3.1))(react@18.3.1): + react-pdf-html@2.1.3(@react-pdf/renderer@3.4.5(react@18.3.1))(react@18.3.1): dependencies: '@react-pdf/renderer': 3.4.5(react@18.3.1) css-tree: 1.1.3 @@ -16763,7 +16972,7 @@ snapshots: optionalDependencies: '@types/react': 18.3.11 - react-remove-scroll@2.7.2(@types/react@18.3.11)(react@18.3.1): + react-remove-scroll@2.7.1(@types/react@18.3.11)(react@18.3.1): dependencies: react: 18.3.1 react-remove-scroll-bar: 2.3.8(@types/react@18.3.11)(react@18.3.1) @@ -16782,15 +16991,15 @@ snapshots: react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - cookie: 1.1.1 + cookie: 1.0.2 react: 18.3.1 - set-cookie-parser: 2.7.2 + set-cookie-parser: 2.7.1 optionalDependencies: react-dom: 18.3.1(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.3.3 + fast-equals: 5.2.2 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -16996,7 +17205,7 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve@1.22.11: + resolve@1.22.10: dependencies: is-core-module: 2.16.1 path-parse: 1.0.7 @@ -17031,7 +17240,7 @@ snapshots: '@babel/parser': 7.28.5 '@babel/types': 7.28.5 ast-kit: 2.2.0 - birpc: 2.8.0 + birpc: 2.9.0 dts-resolver: 2.1.3 get-tsconfig: 4.13.0 magic-string: 0.30.21 @@ -17062,32 +17271,32 @@ snapshots: '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.46 '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.46 - rollup@4.53.3: + rollup@4.52.4: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.53.3 - '@rollup/rollup-android-arm64': 4.53.3 - '@rollup/rollup-darwin-arm64': 4.53.3 - '@rollup/rollup-darwin-x64': 4.53.3 - '@rollup/rollup-freebsd-arm64': 4.53.3 - '@rollup/rollup-freebsd-x64': 4.53.3 - '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 - '@rollup/rollup-linux-arm-musleabihf': 4.53.3 - '@rollup/rollup-linux-arm64-gnu': 4.53.3 - '@rollup/rollup-linux-arm64-musl': 4.53.3 - '@rollup/rollup-linux-loong64-gnu': 4.53.3 - '@rollup/rollup-linux-ppc64-gnu': 4.53.3 - '@rollup/rollup-linux-riscv64-gnu': 4.53.3 - '@rollup/rollup-linux-riscv64-musl': 4.53.3 - '@rollup/rollup-linux-s390x-gnu': 4.53.3 - '@rollup/rollup-linux-x64-gnu': 4.53.3 - '@rollup/rollup-linux-x64-musl': 4.53.3 - '@rollup/rollup-openharmony-arm64': 4.53.3 - '@rollup/rollup-win32-arm64-msvc': 4.53.3 - '@rollup/rollup-win32-ia32-msvc': 4.53.3 - '@rollup/rollup-win32-x64-gnu': 4.53.3 - '@rollup/rollup-win32-x64-msvc': 4.53.3 + '@rollup/rollup-android-arm-eabi': 4.52.4 + '@rollup/rollup-android-arm64': 4.52.4 + '@rollup/rollup-darwin-arm64': 4.52.4 + '@rollup/rollup-darwin-x64': 4.52.4 + '@rollup/rollup-freebsd-arm64': 4.52.4 + '@rollup/rollup-freebsd-x64': 4.52.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.4 + '@rollup/rollup-linux-arm-musleabihf': 4.52.4 + '@rollup/rollup-linux-arm64-gnu': 4.52.4 + '@rollup/rollup-linux-arm64-musl': 4.52.4 + '@rollup/rollup-linux-loong64-gnu': 4.52.4 + '@rollup/rollup-linux-ppc64-gnu': 4.52.4 + '@rollup/rollup-linux-riscv64-gnu': 4.52.4 + '@rollup/rollup-linux-riscv64-musl': 4.52.4 + '@rollup/rollup-linux-s390x-gnu': 4.52.4 + '@rollup/rollup-linux-x64-gnu': 4.52.4 + '@rollup/rollup-linux-x64-musl': 4.52.4 + '@rollup/rollup-openharmony-arm64': 4.52.4 + '@rollup/rollup-win32-arm64-msvc': 4.52.4 + '@rollup/rollup-win32-ia32-msvc': 4.52.4 + '@rollup/rollup-win32-x64-gnu': 4.52.4 + '@rollup/rollup-win32-x64-msvc': 4.52.4 fsevents: 2.3.3 rope-sequence@1.3.4: {} @@ -17142,7 +17351,7 @@ snapshots: ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - schema-utils@4.3.3: + schema-utils@4.3.2: dependencies: '@types/json-schema': 7.0.15 ajv: 8.17.1 @@ -17157,6 +17366,8 @@ snapshots: semver@6.3.1: {} + semver@7.7.2: {} + semver@7.7.3: {} send@0.19.0: @@ -17177,24 +17388,6 @@ snapshots: transitivePeerDependencies: - supports-color - send@0.19.1: - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - sentence-case@3.0.4: dependencies: no-case: 3.0.4 @@ -17240,7 +17433,7 @@ snapshots: transitivePeerDependencies: - supports-color - set-cookie-parser@2.7.2: {} + set-cookie-parser@2.7.1: {} set-function-length@1.2.2: dependencies: @@ -17270,36 +17463,6 @@ snapshots: dependencies: kind-of: 6.0.3 - sharp@0.34.4: - dependencies: - '@img/colour': 1.0.0 - detect-libc: 2.1.2 - semver: 7.7.3 - optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.4 - '@img/sharp-darwin-x64': 0.34.4 - '@img/sharp-libvips-darwin-arm64': 1.2.3 - '@img/sharp-libvips-darwin-x64': 1.2.3 - '@img/sharp-libvips-linux-arm': 1.2.3 - '@img/sharp-libvips-linux-arm64': 1.2.3 - '@img/sharp-libvips-linux-ppc64': 1.2.3 - '@img/sharp-libvips-linux-s390x': 1.2.3 - '@img/sharp-libvips-linux-x64': 1.2.3 - '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 - '@img/sharp-libvips-linuxmusl-x64': 1.2.3 - '@img/sharp-linux-arm': 0.34.4 - '@img/sharp-linux-arm64': 0.34.4 - '@img/sharp-linux-ppc64': 0.34.4 - '@img/sharp-linux-s390x': 0.34.4 - '@img/sharp-linux-x64': 0.34.4 - '@img/sharp-linuxmusl-arm64': 0.34.4 - '@img/sharp-linuxmusl-x64': 0.34.4 - '@img/sharp-wasm32': 0.34.4 - '@img/sharp-win32-arm64': 0.34.4 - '@img/sharp-win32-ia32': 0.34.4 - '@img/sharp-win32-x64': 0.34.4 - optional: true - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -17348,7 +17511,7 @@ snapshots: slice-ansi@7.1.2: dependencies: - ansi-styles: 6.2.3 + ansi-styles: 6.2.1 is-fullwidth-code-point: 5.1.0 smooth-scroll-into-view-if-needed@2.0.2: @@ -17395,8 +17558,6 @@ snapshots: statuses@2.0.1: {} - statuses@2.0.2: {} - std-env@3.10.0: {} stop-iteration-iterator@1.1.0: @@ -17414,19 +17575,19 @@ snapshots: - supports-color - utf-8-validate - storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)): + storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)): dependencies: '@storybook/global': 5.0.0 '@testing-library/jest-dom': 6.9.1 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) + '@vitest/mocker': 3.2.4(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) '@vitest/spy': 3.2.4 better-opn: 3.0.2 esbuild: 0.25.0 esbuild-register: 3.6.0(esbuild@0.25.0) recast: 0.23.11 - semver: 7.7.3 + semver: 7.7.2 ws: 8.18.3 optionalDependencies: prettier: 3.7.4 @@ -17438,6 +17599,8 @@ snapshots: - utf-8-validate - vite + streamsearch@1.1.0: {} + string-argv@0.3.2: {} string-width@4.2.3: @@ -17454,14 +17617,14 @@ snapshots: string-width@7.2.0: dependencies: - emoji-regex: 10.6.0 + emoji-regex: 10.5.0 get-east-asian-width: 1.4.0 - strip-ansi: 7.1.2 + strip-ansi: 7.1.0 string-width@8.1.0: dependencies: get-east-asian-width: 1.4.0 - strip-ansi: 7.1.2 + strip-ansi: 7.1.0 string.prototype.includes@2.0.1: dependencies: @@ -17526,6 +17689,10 @@ snapshots: dependencies: ansi-regex: 5.0.1 + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.2.2 + strip-ansi@7.1.2: dependencies: ansi-regex: 6.2.2 @@ -17538,7 +17705,7 @@ snapshots: dependencies: min-indent: 1.0.1 - strip-indent@4.1.1: {} + strip-indent@4.1.0: {} strip-json-comments@2.0.1: {} @@ -17548,29 +17715,38 @@ snapshots: dependencies: '@tokenizer/token': 0.3.0 - style-loader@3.3.4(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)): + style-loader@3.3.4(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)): dependencies: - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0) + webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0) style-to-object@0.4.4: dependencies: inline-style-parser: 0.1.1 - styled-jsx@5.1.6(@babel/core@7.28.5)(react@18.3.1): + styled-jsx@5.1.1(@babel/core@7.28.3)(babel-plugin-macros@3.1.0)(react@18.3.1): dependencies: client-only: 0.0.1 react: 18.3.1 optionalDependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.28.3 + babel-plugin-macros: 3.1.0 - sucrase@3.35.1: + styled-jsx@5.1.1(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react@18.3.1): + dependencies: + client-only: 0.0.1 + react: 18.3.1 + optionalDependencies: + '@babel/core': 7.28.4 + babel-plugin-macros: 3.1.0 + + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.13 commander: 4.1.1 + glob: 11.1.0 lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.7 - tinyglobby: 0.2.15 ts-interface-checker: 0.1.13 supports-color@5.5.0: @@ -17589,29 +17765,29 @@ snapshots: svg-arc-to-cubic-bezier@3.2.0: {} - swc-loader@0.2.6(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)): + swc-loader@0.2.6(@swc/core@1.13.5(@swc/helpers@0.5.17))(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)): dependencies: - '@swc/core': 1.15.3(@swc/helpers@0.5.17) + '@swc/core': 1.13.5(@swc/helpers@0.5.17) '@swc/counter': 0.1.3 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0) + webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0) swr@2.2.4(react@18.3.1): dependencies: client-only: 0.0.1 react: 18.3.1 - use-sync-external-store: 1.6.0(react@18.3.1) + use-sync-external-store: 1.5.0(react@18.3.1) - tabbable@6.3.0: {} + tabbable@6.2.0: {} tailwind-merge@2.6.0: {} - tailwind-merge@3.4.0: {} + tailwind-merge@3.3.1: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.18(yaml@2.8.2)): + tailwindcss-animate@1.0.7(tailwindcss@3.4.17): dependencies: - tailwindcss: 3.4.18(yaml@2.8.2) + tailwindcss: 3.4.17 - tailwindcss@3.4.18(yaml@2.8.2): + tailwindcss@3.4.17: dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -17629,31 +17805,30 @@ snapshots: picocolors: 1.1.1 postcss: 8.5.6 postcss-import: 15.1.0(postcss@8.5.6) - postcss-js: 4.1.0(postcss@8.5.6) - postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.8.2) + postcss-js: 4.0.1(postcss@8.5.6) + postcss-load-config: 4.0.2(postcss@8.5.6) postcss-nested: 6.2.0(postcss@8.5.6) postcss-selector-parser: 6.1.2 - resolve: 1.22.11 - sucrase: 3.35.1 + resolve: 1.22.10 + sucrase: 3.35.0 transitivePeerDependencies: - - tsx - - yaml + - ts-node tapable@2.3.0: {} - terser-webpack-plugin@5.3.15(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)): + terser-webpack-plugin@5.3.14(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 - schema-utils: 4.3.3 + schema-utils: 4.3.2 serialize-javascript: 6.0.2 - terser: 5.44.1 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0) + terser: 5.43.1 + webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0) optionalDependencies: - '@swc/core': 1.15.3(@swc/helpers@0.5.17) + '@swc/core': 1.13.5(@swc/helpers@0.5.17) esbuild: 0.25.0 - terser@5.44.1: + terser@5.43.1: dependencies: '@jridgewell/source-map': 0.3.11 acorn: 8.15.0 @@ -17680,6 +17855,8 @@ snapshots: tinycolor2@1.6.0: {} + tinyexec@1.0.1: {} + tinyexec@1.0.2: {} tinyglobby@0.2.15: @@ -17695,15 +17872,15 @@ snapshots: tinyspy@3.0.2: {} - tinyspy@4.0.4: {} + tinyspy@4.0.3: {} tippy.js@6.3.7: dependencies: '@popperjs/core': 2.11.8 - tiptap-markdown@0.8.10(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)): + tiptap-markdown@0.8.10(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)): dependencies: - '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.1) '@types/markdown-it': 13.0.9 markdown-it: 14.1.0 markdown-it-task-lists: 2.1.1 @@ -17777,10 +17954,10 @@ snapshots: rolldown: 1.0.0-beta.46 rolldown-plugin-dts: 0.17.8(rolldown@1.0.0-beta.46)(typescript@5.8.3) semver: 7.7.3 - tinyexec: 1.0.2 + tinyexec: 1.0.1 tinyglobby: 0.2.15 tree-kill: 1.2.2 - unconfig: 7.4.2 + unconfig: 7.3.3 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -17869,13 +18046,13 @@ snapshots: typed-styles@0.0.7: {} - typescript-eslint@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3): + typescript-eslint@8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/parser': 8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3))(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/parser': 8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3) '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.8.3) - eslint: 9.39.1(jiti@2.6.1) + '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3) + eslint: 9.39.1(jiti@2.5.1) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -17893,18 +18070,12 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - unconfig-core@7.4.2: - dependencies: - '@quansync/fs': 1.0.0 - quansync: 1.0.0 - - unconfig@7.4.2: + unconfig@7.3.3: dependencies: - '@quansync/fs': 1.0.0 + '@quansync/fs': 0.1.5 defu: 6.1.4 - jiti: 2.6.1 - quansync: 1.0.0 - unconfig-core: 7.4.2 + jiti: 2.5.1 + quansync: 0.2.11 undici-types@6.20.0: {} @@ -17943,13 +18114,13 @@ snapshots: unist-util-find-after@5.0.0: dependencies: '@types/unist': 3.0.3 - unist-util-is: 6.0.1 + unist-util-is: 6.0.0 unist-util-is@5.2.1: dependencies: '@types/unist': 2.0.11 - unist-util-is@6.0.1: + unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.3 @@ -17970,10 +18141,10 @@ snapshots: '@types/unist': 2.0.11 unist-util-is: 5.2.1 - unist-util-visit-parents@6.0.2: + unist-util-visit-parents@6.0.1: dependencies: '@types/unist': 3.0.3 - unist-util-is: 6.0.1 + unist-util-is: 6.0.0 unist-util-visit@4.1.2: dependencies: @@ -17984,8 +18155,8 @@ snapshots: unist-util-visit@5.0.0: dependencies: '@types/unist': 3.0.3 - unist-util-is: 6.0.1 - unist-util-visit-parents: 6.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 universalify@2.0.1: {} @@ -18005,7 +18176,7 @@ snapshots: unrs-resolver@1.11.1: dependencies: - napi-postinstall: 0.3.4 + napi-postinstall: 0.3.3 optionalDependencies: '@unrs/resolver-binding-android-arm-eabi': 1.11.1 '@unrs/resolver-binding-android-arm64': 1.11.1 @@ -18027,9 +18198,9 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 - update-browserslist-db@1.2.2(browserslist@4.28.1): + update-browserslist-db@1.1.3(browserslist@4.26.2): dependencies: - browserslist: 4.28.1 + browserslist: 4.26.2 escalade: 3.2.0 picocolors: 1.1.1 @@ -18075,7 +18246,7 @@ snapshots: optionalDependencies: '@types/react': 18.3.11 - use-sync-external-store@1.6.0(react@18.3.1): + use-sync-external-store@1.5.0(react@18.3.1): dependencies: react: 18.3.1 @@ -18085,7 +18256,7 @@ snapshots: dependencies: inherits: 2.0.4 is-arguments: 1.2.0 - is-generator-function: 1.1.2 + is-generator-function: 1.1.0 is-typed-array: 1.1.15 which-typed-array: 1.1.19 @@ -18148,7 +18319,7 @@ snapshots: victory-vendor@36.9.2: dependencies: - '@types/d3-array': 3.2.2 + '@types/d3-array': 3.2.1 '@types/d3-ease': 3.0.2 '@types/d3-interpolate': 3.0.4 '@types/d3-scale': 4.0.9 @@ -18169,13 +18340,13 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 - vite-node@3.2.4(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2): + vite-node@3.2.4(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2) + vite: 7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -18190,43 +18361,43 @@ snapshots: - tsx - yaml - vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)): + vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.8.3) optionalDependencies: - vite: 7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2) + vite: 7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2): + vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1): dependencies: esbuild: 0.25.0 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.53.3 + rollup: 4.52.4 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 22.12.0 fsevents: 2.3.3 - jiti: 2.6.1 - terser: 5.44.1 - yaml: 2.8.2 + jiti: 2.5.1 + terser: 5.43.1 + yaml: 2.8.1 - vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2): + vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1): dependencies: '@vitest/expect': 4.0.15 - '@vitest/mocker': 4.0.15(vite@7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) + '@vitest/mocker': 4.0.15(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) '@vitest/pretty-format': 4.0.15 '@vitest/runner': 4.0.15 '@vitest/snapshot': 4.0.15 '@vitest/spy': 4.0.15 '@vitest/utils': 4.0.15 es-module-lexer: 1.7.0 - expect-type: 1.2.2 + expect-type: 1.3.0 magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 @@ -18236,7 +18407,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.1.11(@types/node@22.12.0)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2) + vite: 7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 @@ -18271,15 +18442,15 @@ snapshots: webidl-conversions@3.0.1: {} - webpack-dev-middleware@6.1.3(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)): + webpack-dev-middleware@6.1.3(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)): dependencies: colorette: 2.0.20 memfs: 3.5.3 mime-types: 2.1.35 range-parser: 1.2.1 - schema-utils: 4.3.3 + schema-utils: 4.3.2 optionalDependencies: - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0) + webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0) webpack-hot-middleware@2.26.1: dependencies: @@ -18293,7 +18464,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0): + webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -18303,7 +18474,7 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.28.1 + browserslist: 4.26.2 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.3 es-module-lexer: 1.7.0 @@ -18312,12 +18483,12 @@ snapshots: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.1 + loader-runner: 4.3.0 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 4.3.3 + schema-utils: 4.3.2 tapable: 2.3.0 - terser-webpack-plugin: 5.3.15(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.0)) + terser-webpack-plugin: 5.3.14(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)) watchpack: 2.4.4 webpack-sources: 3.3.3 transitivePeerDependencies: @@ -18346,7 +18517,7 @@ snapshots: is-async-function: 2.1.1 is-date-object: 1.1.0 is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.2 + is-generator-function: 1.1.0 is-regex: 1.2.1 is-weakref: 1.1.1 isarray: 2.0.5 @@ -18398,10 +18569,10 @@ snapshots: readable-stream: 3.6.2 triple-beam: 1.4.1 - winston@3.19.0: + winston@3.17.0: dependencies: '@colors/colors': 1.6.0 - '@dabh/diagnostics': 2.0.8 + '@dabh/diagnostics': 2.0.3 async: 3.2.6 is-stream: 2.0.1 logform: 2.7.0 @@ -18426,11 +18597,11 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.2 - wrap-ansi@9.0.2: + wrap-ansi@9.0.0: dependencies: - ansi-styles: 6.2.3 + ansi-styles: 6.2.1 string-width: 7.2.0 - strip-ansi: 7.1.2 + strip-ansi: 7.1.0 write-file-atomic@5.0.1: dependencies: @@ -18448,11 +18619,11 @@ snapshots: lib0: 0.2.114 yjs: 13.6.27 - y-prosemirror@1.3.7(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27): + y-prosemirror@1.3.7(prosemirror-model@1.25.3)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27): dependencies: lib0: 0.2.114 - prosemirror-model: 1.25.4 - prosemirror-state: 1.4.4 + prosemirror-model: 1.25.3 + prosemirror-state: 1.4.3 prosemirror-view: 1.40.0 y-protocols: 1.0.6(yjs@13.6.27) yjs: 13.6.27 @@ -18468,7 +18639,7 @@ snapshots: yaml@1.10.2: {} - yaml@2.8.2: {} + yaml@2.8.1: {} yargs-parser@21.1.1: {} @@ -18488,7 +18659,7 @@ snapshots: yocto-queue@0.1.0: {} - yocto-queue@1.2.2: {} + yocto-queue@1.2.1: {} yoga-layout@2.0.1: {} From 647813a6ab5d777f7357335159e3cfdcbecd6347 Mon Sep 17 00:00:00 2001 From: Dheeraj Kumar Ketireddy Date: Wed, 10 Dec 2025 23:20:41 +0530 Subject: [PATCH 016/266] [WEB-4440] fix: duplicate sequence when creating multiple workitems in rapid succession (#8298) - Replace advisory lock with transaction-level lock in Issue model save method - Updated the save method in the Issue model to use a transaction-level advisory lock for better concurrency control. - Simplified the locking mechanism by removing the explicit unlock step, as the lock is automatically released at the end of the transaction. - Maintained existing functionality for sequence and sort order management while improving code clarity. --- apps/api/plane/db/models/issue.py | 54 ++++++++++++++----------------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/apps/api/plane/db/models/issue.py b/apps/api/plane/db/models/issue.py index 05bb2fe5b91..07ebdf0a41e 100644 --- a/apps/api/plane/db/models/issue.py +++ b/apps/api/plane/db/models/issue.py @@ -207,39 +207,35 @@ def save(self, *args, **kwargs): if self._state.adding: with transaction.atomic(): - # Create a lock for this specific project using an advisory lock + # Create a lock for this specific project using a transaction-level advisory lock # This ensures only one transaction per project can execute this code at a time + # The lock is automatically released when the transaction ends lock_key = convert_uuid_to_integer(self.project.id) with connection.cursor() as cursor: - # Get an exclusive lock using the project ID as the lock key - cursor.execute("SELECT pg_advisory_lock(%s)", [lock_key]) - - try: - # Get the last sequence for the project - last_sequence = IssueSequence.objects.filter(project=self.project).aggregate( - largest=models.Max("sequence") - )["largest"] - self.sequence_id = last_sequence + 1 if last_sequence else 1 - # Strip the html tags using html parser - self.description_stripped = ( - None - if (self.description_html == "" or self.description_html is None) - else strip_tags(self.description_html) - ) - largest_sort_order = Issue.objects.filter(project=self.project, state=self.state).aggregate( - largest=models.Max("sort_order") - )["largest"] - if largest_sort_order is not None: - self.sort_order = largest_sort_order + 10000 - - super(Issue, self).save(*args, **kwargs) - - IssueSequence.objects.create(issue=self, sequence=self.sequence_id, project=self.project) - finally: - # Release the lock - with connection.cursor() as cursor: - cursor.execute("SELECT pg_advisory_unlock(%s)", [lock_key]) + # Get an exclusive transaction-level lock using the project ID as the lock key + cursor.execute("SELECT pg_advisory_xact_lock(%s)", [lock_key]) + + # Get the last sequence for the project + last_sequence = IssueSequence.objects.filter(project=self.project).aggregate( + largest=models.Max("sequence") + )["largest"] + self.sequence_id = last_sequence + 1 if last_sequence else 1 + # Strip the html tags using html parser + self.description_stripped = ( + None + if (self.description_html == "" or self.description_html is None) + else strip_tags(self.description_html) + ) + largest_sort_order = Issue.objects.filter(project=self.project, state=self.state).aggregate( + largest=models.Max("sort_order") + )["largest"] + if largest_sort_order is not None: + self.sort_order = largest_sort_order + 10000 + + super(Issue, self).save(*args, **kwargs) + + IssueSequence.objects.create(issue=self, sequence=self.sequence_id, project=self.project) else: # Strip the html tags using html parser self.description_stripped = ( From 97e21ba21c34ed2c85a02de027090afea583e708 Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Wed, 10 Dec 2025 23:50:01 +0530 Subject: [PATCH 017/266] chore: format files in API server (#8292) --- apps/api/plane/api/serializers/__init__.py | 2 +- apps/api/plane/api/serializers/project.py | 2 +- apps/api/plane/api/urls/invite.py | 2 +- apps/api/plane/api/views/cycle.py | 97 ++++--------- apps/api/plane/api/views/member.py | 1 - apps/api/plane/app/urls/exporter.py | 2 +- apps/api/plane/app/views/asset/v2.py | 99 ++++--------- apps/api/plane/app/views/cycle/base.py | 130 +++++------------- apps/api/plane/app/views/issue/label.py | 4 +- apps/api/plane/app/views/page/base.py | 28 ++-- apps/api/plane/authentication/adapter/base.py | 6 +- .../authentication/provider/oauth/gitea.py | 6 +- .../plane/authentication/views/app/gitea.py | 12 +- .../plane/bgtasks/page_transaction_task.py | 6 +- apps/api/plane/bgtasks/workspace_seed_task.py | 100 +++++++------- apps/api/plane/license/api/views/admin.py | 6 +- .../tests/unit/serializers/test_label.py | 12 +- apps/api/plane/utils/content_validator.py | 4 +- apps/api/plane/utils/cycle_transfer_issues.py | 24 +--- apps/api/plane/utils/openapi/decorators.py | 3 +- 20 files changed, 173 insertions(+), 373 deletions(-) diff --git a/apps/api/plane/api/serializers/__init__.py b/apps/api/plane/api/serializers/__init__.py index 6525ddce633..550d8e87f49 100644 --- a/apps/api/plane/api/serializers/__init__.py +++ b/apps/api/plane/api/serializers/__init__.py @@ -55,4 +55,4 @@ ) from .invite import WorkspaceInviteSerializer from .member import ProjectMemberSerializer -from .sticky import StickySerializer \ No newline at end of file +from .sticky import StickySerializer diff --git a/apps/api/plane/api/serializers/project.py b/apps/api/plane/api/serializers/project.py index 770957e08c8..b22438ad513 100644 --- a/apps/api/plane/api/serializers/project.py +++ b/apps/api/plane/api/serializers/project.py @@ -17,7 +17,7 @@ from .base import BaseSerializer -class ProjectCreateSerializer(BaseSerializer): +class ProjectCreateSerializer(BaseSerializer): """ Serializer for creating projects with workspace validation. diff --git a/apps/api/plane/api/urls/invite.py b/apps/api/plane/api/urls/invite.py index 9d73cb6ef80..e4fddd5c507 100644 --- a/apps/api/plane/api/urls/invite.py +++ b/apps/api/plane/api/urls/invite.py @@ -15,4 +15,4 @@ # Wrap the router URLs with the workspace slug path urlpatterns = [ path("workspaces//", include(router.urls)), -] \ No newline at end of file +] diff --git a/apps/api/plane/api/views/cycle.py b/apps/api/plane/api/views/cycle.py index c92b27f5912..170c644f33b 100644 --- a/apps/api/plane/api/views/cycle.py +++ b/apps/api/plane/api/views/cycle.py @@ -195,9 +195,7 @@ def get(self, request, slug, project_id): # Current Cycle if cycle_view == "current": - queryset = queryset.filter( - start_date__lte=timezone.now(), end_date__gte=timezone.now() - ) + queryset = queryset.filter(start_date__lte=timezone.now(), end_date__gte=timezone.now()) data = CycleSerializer( queryset, many=True, @@ -254,9 +252,7 @@ def get(self, request, slug, project_id): # Incomplete Cycles if cycle_view == "incomplete": - queryset = queryset.filter( - Q(end_date__gte=timezone.now()) | Q(end_date__isnull=True) - ) + queryset = queryset.filter(Q(end_date__gte=timezone.now()) | Q(end_date__isnull=True)) return self.paginate( request=request, queryset=(queryset), @@ -302,17 +298,10 @@ def post(self, request, slug, project_id): Create a new development cycle with specified name, description, and date range. Supports external ID tracking for integration purposes. """ - if ( - request.data.get("start_date", None) is None - and request.data.get("end_date", None) is None - ) or ( - request.data.get("start_date", None) is not None - and request.data.get("end_date", None) is not None + if (request.data.get("start_date", None) is None and request.data.get("end_date", None) is None) or ( + request.data.get("start_date", None) is not None and request.data.get("end_date", None) is not None ): - - serializer = CycleCreateSerializer( - data=request.data, context={"request": request} - ) + serializer = CycleCreateSerializer(data=request.data, context={"request": request}) if serializer.is_valid(): if ( request.data.get("external_id") @@ -355,9 +344,7 @@ def post(self, request, slug, project_id): return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) else: return Response( - { - "error": "Both start date and end date are either required or are to be null" - }, + {"error": "Both start date and end date are either required or are to be null"}, status=status.HTTP_400_BAD_REQUEST, ) @@ -505,9 +492,7 @@ def patch(self, request, slug, project_id, pk): """ cycle = Cycle.objects.get(workspace__slug=slug, project_id=project_id, pk=pk) - current_instance = json.dumps( - CycleSerializer(cycle).data, cls=DjangoJSONEncoder - ) + current_instance = json.dumps(CycleSerializer(cycle).data, cls=DjangoJSONEncoder) if cycle.archived_at: return Response( @@ -520,20 +505,14 @@ def patch(self, request, slug, project_id, pk): if cycle.end_date is not None and cycle.end_date < timezone.now(): if "sort_order" in request_data: # Can only change sort order - request_data = { - "sort_order": request_data.get("sort_order", cycle.sort_order) - } + request_data = {"sort_order": request_data.get("sort_order", cycle.sort_order)} else: return Response( - { - "error": "The Cycle has already been completed so it cannot be edited" - }, + {"error": "The Cycle has already been completed so it cannot be edited"}, status=status.HTTP_400_BAD_REQUEST, ) - serializer = CycleUpdateSerializer( - cycle, data=request.data, partial=True, context={"request": request} - ) + serializer = CycleUpdateSerializer(cycle, data=request.data, partial=True, context={"request": request}) if serializer.is_valid(): if ( request.data.get("external_id") @@ -541,9 +520,7 @@ def patch(self, request, slug, project_id, pk): and Cycle.objects.filter( project_id=project_id, workspace__slug=slug, - external_source=request.data.get( - "external_source", cycle.external_source - ), + external_source=request.data.get("external_source", cycle.external_source), external_id=request.data.get("external_id"), ).exists() ): @@ -600,11 +577,7 @@ def delete(self, request, slug, project_id, pk): status=status.HTTP_403_FORBIDDEN, ) - cycle_issues = list( - CycleIssue.objects.filter(cycle_id=self.kwargs.get("pk")).values_list( - "issue", flat=True - ) - ) + cycle_issues = list(CycleIssue.objects.filter(cycle_id=self.kwargs.get("pk")).values_list("issue", flat=True)) issue_activity.delay( type="cycle.activity.deleted", @@ -624,9 +597,7 @@ def delete(self, request, slug, project_id, pk): # Delete the cycle cycle.delete() # Delete the user favorite cycle - UserFavorite.objects.filter( - entity_type="cycle", entity_identifier=pk, project_id=project_id - ).delete() + UserFavorite.objects.filter(entity_type="cycle", entity_identifier=pk, project_id=project_id).delete() return Response(status=status.HTTP_204_NO_CONTENT) @@ -764,9 +735,7 @@ def get(self, request, slug, project_id): return self.paginate( request=request, queryset=(self.get_queryset()), - on_results=lambda cycles: CycleSerializer( - cycles, many=True, fields=self.fields, expand=self.expand - ).data, + on_results=lambda cycles: CycleSerializer(cycles, many=True, fields=self.fields, expand=self.expand).data, ) @cycle_docs( @@ -785,9 +754,7 @@ def post(self, request, slug, project_id, cycle_id): Move a completed cycle to archived status for historical tracking. Only cycles that have ended can be archived. """ - cycle = Cycle.objects.get( - pk=cycle_id, project_id=project_id, workspace__slug=slug - ) + cycle = Cycle.objects.get(pk=cycle_id, project_id=project_id, workspace__slug=slug) if cycle.end_date >= timezone.now(): return Response( {"error": "Only completed cycles can be archived"}, @@ -818,9 +785,7 @@ def delete(self, request, slug, project_id, cycle_id): Restore an archived cycle to active status, making it available for regular use. The cycle will reappear in active cycle lists. """ - cycle = Cycle.objects.get( - pk=cycle_id, project_id=project_id, workspace__slug=slug - ) + cycle = Cycle.objects.get(pk=cycle_id, project_id=project_id, workspace__slug=slug) cycle.archived_at = None cycle.save() return Response(status=status.HTTP_204_NO_CONTENT) @@ -883,9 +848,7 @@ def get(self, request, slug, project_id, cycle_id): # List order_by = request.GET.get("order_by", "created_at") issues = ( - Issue.issue_objects.filter( - issue_cycle__cycle_id=cycle_id, issue_cycle__deleted_at__isnull=True - ) + Issue.issue_objects.filter(issue_cycle__cycle_id=cycle_id, issue_cycle__deleted_at__isnull=True) .annotate( sub_issues_count=Issue.issue_objects.filter(parent=OuterRef("id")) .order_by() @@ -922,9 +885,7 @@ def get(self, request, slug, project_id, cycle_id): return self.paginate( request=request, queryset=(issues), - on_results=lambda issues: IssueSerializer( - issues, many=True, fields=self.fields, expand=self.expand - ).data, + on_results=lambda issues: IssueSerializer(issues, many=True, fields=self.fields, expand=self.expand).data, ) @cycle_docs( @@ -958,9 +919,7 @@ def post(self, request, slug, project_id, cycle_id): status=status.HTTP_400_BAD_REQUEST, ) - cycle = Cycle.objects.get( - workspace__slug=slug, project_id=project_id, pk=cycle_id - ) + cycle = Cycle.objects.get(workspace__slug=slug, project_id=project_id, pk=cycle_id) if cycle.end_date is not None and cycle.end_date < timezone.now(): return Response( @@ -972,13 +931,9 @@ def post(self, request, slug, project_id, cycle_id): ) # Get all CycleWorkItems already created - cycle_issues = list( - CycleIssue.objects.filter(~Q(cycle_id=cycle_id), issue_id__in=issues) - ) + cycle_issues = list(CycleIssue.objects.filter(~Q(cycle_id=cycle_id), issue_id__in=issues)) existing_issues = [ - str(cycle_issue.issue_id) - for cycle_issue in cycle_issues - if str(cycle_issue.issue_id) in issues + str(cycle_issue.issue_id) for cycle_issue in cycle_issues if str(cycle_issue.issue_id) in issues ] new_issues = list(set(issues) - set(existing_issues)) @@ -1029,9 +984,7 @@ def post(self, request, slug, project_id, cycle_id): current_instance=json.dumps( { "updated_cycle_issues": update_cycle_issue_activity, - "created_cycle_issues": serializers.serialize( - "json", created_records - ), + "created_cycle_issues": serializers.serialize("json", created_records), } ), epoch=int(timezone.now().timestamp()), @@ -1107,9 +1060,7 @@ def get(self, request, slug, project_id, cycle_id, issue_id): cycle_id=cycle_id, issue_id=issue_id, ) - serializer = CycleIssueSerializer( - cycle_issue, fields=self.fields, expand=self.expand - ) + serializer = CycleIssueSerializer(cycle_issue, fields=self.fields, expand=self.expand) return Response(serializer.data, status=status.HTTP_200_OK) @cycle_docs( @@ -1214,7 +1165,7 @@ def post(self, request, slug, project_id, cycle_id): {"error": "New Cycle Id is required"}, status=status.HTTP_400_BAD_REQUEST, ) - + old_cycle = Cycle.objects.get( workspace__slug=slug, project_id=project_id, diff --git a/apps/api/plane/api/views/member.py b/apps/api/plane/api/views/member.py index 854bc7ae67e..a569a597699 100644 --- a/apps/api/plane/api/views/member.py +++ b/apps/api/plane/api/views/member.py @@ -154,7 +154,6 @@ def post(self, request, slug, project_id): # API endpoint to get and update a project member class ProjectMemberDetailAPIEndpoint(ProjectMemberListCreateAPIEndpoint): - @extend_schema( operation_id="get_project_member", summary="Get project member", diff --git a/apps/api/plane/app/urls/exporter.py b/apps/api/plane/app/urls/exporter.py index 0bcb4621b24..56c6bfb51a6 100644 --- a/apps/api/plane/app/urls/exporter.py +++ b/apps/api/plane/app/urls/exporter.py @@ -9,4 +9,4 @@ ExportIssuesEndpoint.as_view(), name="export-issues", ), -] \ No newline at end of file +] diff --git a/apps/api/plane/app/views/asset/v2.py b/apps/api/plane/app/views/asset/v2.py index b8b27eeae0a..4313fe3fff9 100644 --- a/apps/api/plane/app/views/asset/v2.py +++ b/apps/api/plane/app/views/asset/v2.py @@ -45,9 +45,7 @@ def entity_asset_save(self, asset_id, entity_type, asset, request): # Save the new avatar user.avatar_asset_id = asset_id user.save() - invalidate_cache_directly( - path="/api/users/me/", url_params=False, user=True, request=request - ) + invalidate_cache_directly(path="/api/users/me/", url_params=False, user=True, request=request) invalidate_cache_directly( path="/api/users/me/settings/", url_params=False, @@ -65,9 +63,7 @@ def entity_asset_save(self, asset_id, entity_type, asset, request): # Save the new cover image user.cover_image_asset_id = asset_id user.save() - invalidate_cache_directly( - path="/api/users/me/", url_params=False, user=True, request=request - ) + invalidate_cache_directly(path="/api/users/me/", url_params=False, user=True, request=request) invalidate_cache_directly( path="/api/users/me/settings/", url_params=False, @@ -83,9 +79,7 @@ def entity_asset_delete(self, entity_type, asset, request): user = User.objects.get(id=asset.user_id) user.avatar_asset_id = None user.save() - invalidate_cache_directly( - path="/api/users/me/", url_params=False, user=True, request=request - ) + invalidate_cache_directly(path="/api/users/me/", url_params=False, user=True, request=request) invalidate_cache_directly( path="/api/users/me/settings/", url_params=False, @@ -98,9 +92,7 @@ def entity_asset_delete(self, entity_type, asset, request): user = User.objects.get(id=asset.user_id) user.cover_image_asset_id = None user.save() - invalidate_cache_directly( - path="/api/users/me/", url_params=False, user=True, request=request - ) + invalidate_cache_directly(path="/api/users/me/", url_params=False, user=True, request=request) invalidate_cache_directly( path="/api/users/me/settings/", url_params=False, @@ -160,9 +152,7 @@ def post(self, request): # Get the presigned URL storage = S3Storage(request=request) # Generate a presigned URL to share an S3 object - presigned_url = storage.generate_presigned_post( - object_name=asset_key, file_type=type, file_size=size_limit - ) + presigned_url = storage.generate_presigned_post(object_name=asset_key, file_type=type, file_size=size_limit) # Return the presigned URL return Response( { @@ -199,9 +189,7 @@ def delete(self, request, asset_id): asset.is_deleted = True asset.deleted_at = timezone.now() # get the entity and save the asset id for the request field - self.entity_asset_delete( - entity_type=asset.entity_type, asset=asset, request=request - ) + self.entity_asset_delete(entity_type=asset.entity_type, asset=asset, request=request) asset.save(update_fields=["is_deleted", "deleted_at"]) return Response(status=status.HTTP_204_NO_CONTENT) @@ -265,18 +253,14 @@ def entity_asset_save(self, asset_id, entity_type, asset, request): workspace.logo = "" workspace.logo_asset_id = asset_id workspace.save() - invalidate_cache_directly( - path="/api/workspaces/", url_params=False, user=False, request=request - ) + invalidate_cache_directly(path="/api/workspaces/", url_params=False, user=False, request=request) invalidate_cache_directly( path="/api/users/me/workspaces/", url_params=False, user=True, request=request, ) - invalidate_cache_directly( - path="/api/instances/", url_params=False, user=False, request=request - ) + invalidate_cache_directly(path="/api/instances/", url_params=False, user=False, request=request) return # Project Cover @@ -303,18 +287,14 @@ def entity_asset_delete(self, entity_type, asset, request): return workspace.logo_asset_id = None workspace.save() - invalidate_cache_directly( - path="/api/workspaces/", url_params=False, user=False, request=request - ) + invalidate_cache_directly(path="/api/workspaces/", url_params=False, user=False, request=request) invalidate_cache_directly( path="/api/users/me/workspaces/", url_params=False, user=True, request=request, ) - invalidate_cache_directly( - path="/api/instances/", url_params=False, user=False, request=request - ) + invalidate_cache_directly(path="/api/instances/", url_params=False, user=False, request=request) return # Project Cover elif entity_type == FileAsset.EntityTypeContext.PROJECT_COVER: @@ -375,17 +355,13 @@ def post(self, request, slug): workspace=workspace, created_by=request.user, entity_type=entity_type, - **self.get_entity_id_field( - entity_type=entity_type, entity_id=entity_identifier - ), + **self.get_entity_id_field(entity_type=entity_type, entity_id=entity_identifier), ) # Get the presigned URL storage = S3Storage(request=request) # Generate a presigned URL to share an S3 object - presigned_url = storage.generate_presigned_post( - object_name=asset_key, file_type=type, file_size=size_limit - ) + presigned_url = storage.generate_presigned_post(object_name=asset_key, file_type=type, file_size=size_limit) # Return the presigned URL return Response( { @@ -422,9 +398,7 @@ def delete(self, request, slug, asset_id): asset.is_deleted = True asset.deleted_at = timezone.now() # get the entity and save the asset id for the request field - self.entity_asset_delete( - entity_type=asset.entity_type, asset=asset, request=request - ) + self.entity_asset_delete(entity_type=asset.entity_type, asset=asset, request=request) asset.save(update_fields=["is_deleted", "deleted_at"]) return Response(status=status.HTTP_204_NO_CONTENT) @@ -587,9 +561,7 @@ def post(self, request, slug, project_id): # Get the presigned URL storage = S3Storage(request=request) # Generate a presigned URL to share an S3 object - presigned_url = storage.generate_presigned_post( - object_name=asset_key, file_type=type, file_size=size_limit - ) + presigned_url = storage.generate_presigned_post(object_name=asset_key, file_type=type, file_size=size_limit) # Return the presigned URL return Response( { @@ -619,9 +591,7 @@ def patch(self, request, slug, project_id, pk): @allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST]) def delete(self, request, slug, project_id, pk): # Get the asset - asset = FileAsset.objects.get( - id=pk, workspace__slug=slug, project_id=project_id - ) + asset = FileAsset.objects.get(id=pk, workspace__slug=slug, project_id=project_id) # Check deleted assets asset.is_deleted = True asset.deleted_at = timezone.now() @@ -632,9 +602,7 @@ def delete(self, request, slug, project_id, pk): @allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST]) def get(self, request, slug, project_id, pk): # get the asset id - asset = FileAsset.objects.get( - workspace__slug=slug, project_id=project_id, pk=pk - ) + asset = FileAsset.objects.get(workspace__slug=slug, project_id=project_id, pk=pk) # Check if the asset is uploaded if not asset.is_uploaded: @@ -667,9 +635,7 @@ def post(self, request, slug, project_id, entity_id): # Check if the asset ids are provided if not asset_ids: - return Response( - {"error": "No asset ids provided."}, status=status.HTTP_400_BAD_REQUEST - ) + return Response({"error": "No asset ids provided."}, status=status.HTTP_400_BAD_REQUEST) # get the asset id assets = FileAsset.objects.filter(id__in=asset_ids, workspace__slug=slug) @@ -723,14 +689,11 @@ class AssetCheckEndpoint(BaseAPIView): @allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST], level="WORKSPACE") def get(self, request, slug, asset_id): - asset = FileAsset.all_objects.filter( - id=asset_id, workspace__slug=slug, deleted_at__isnull=True - ).exists() + asset = FileAsset.all_objects.filter(id=asset_id, workspace__slug=slug, deleted_at__isnull=True).exists() return Response({"exists": asset}, status=status.HTTP_200_OK) class DuplicateAssetEndpoint(BaseAPIView): - throttle_classes = [AssetRateThrottle] def get_entity_id_field(self, entity_type, entity_id): @@ -772,11 +735,7 @@ def post(self, request, slug, asset_id): entity_id = request.data.get("entity_id", None) entity_type = request.data.get("entity_type", None) - - if ( - not entity_type - or entity_type not in FileAsset.EntityTypeContext.values - ): + if not entity_type or entity_type not in FileAsset.EntityTypeContext.values: return Response( {"error": "Invalid entity type or entity id"}, status=status.HTTP_400_BAD_REQUEST, @@ -786,23 +745,15 @@ def post(self, request, slug, asset_id): if project_id: # check if project exists in the workspace if not Project.objects.filter(id=project_id, workspace=workspace).exists(): - return Response( - {"error": "Project not found"}, status=status.HTTP_404_NOT_FOUND - ) + return Response({"error": "Project not found"}, status=status.HTTP_404_NOT_FOUND) storage = S3Storage(request=request) - original_asset = FileAsset.objects.filter( - id=asset_id, is_uploaded=True - ).first() + original_asset = FileAsset.objects.filter(id=asset_id, is_uploaded=True).first() if not original_asset: - return Response( - {"error": "Asset not found"}, status=status.HTTP_404_NOT_FOUND - ) + return Response({"error": "Asset not found"}, status=status.HTTP_404_NOT_FOUND) - destination_key = ( - f"{workspace.id}/{uuid.uuid4().hex}-{original_asset.attributes.get('name')}" - ) + destination_key = f"{workspace.id}/{uuid.uuid4().hex}-{original_asset.attributes.get('name')}" duplicated_asset = FileAsset.objects.create( attributes={ "name": original_asset.attributes.get("name"), @@ -822,9 +773,7 @@ def post(self, request, slug, asset_id): # Update the is_uploaded field for all newly created assets FileAsset.objects.filter(id=duplicated_asset.id).update(is_uploaded=True) - return Response( - {"asset_id": str(duplicated_asset.id)}, status=status.HTTP_200_OK - ) + return Response({"asset_id": str(duplicated_asset.id)}, status=status.HTTP_200_OK) class WorkspaceAssetDownloadEndpoint(BaseAPIView): diff --git a/apps/api/plane/app/views/cycle/base.py b/apps/api/plane/app/views/cycle/base.py index 712d71754e5..d61f1587b3f 100644 --- a/apps/api/plane/app/views/cycle/base.py +++ b/apps/api/plane/app/views/cycle/base.py @@ -97,9 +97,7 @@ def get_queryset(self): .prefetch_related( Prefetch( "issue_cycle__issue__assignees", - queryset=User.objects.only( - "avatar_asset", "first_name", "id" - ).distinct(), + queryset=User.objects.only("avatar_asset", "first_name", "id").distinct(), ) ) .prefetch_related( @@ -150,8 +148,7 @@ def get_queryset(self): .annotate( status=Case( When( - Q(start_date__lte=current_time_in_utc) - & Q(end_date__gte=current_time_in_utc), + Q(start_date__lte=current_time_in_utc) & Q(end_date__gte=current_time_in_utc), then=Value("CURRENT"), ), When(start_date__gt=current_time_in_utc, then=Value("UPCOMING")), @@ -170,11 +167,7 @@ def get_queryset(self): "issue_cycle__issue__assignees__id", distinct=True, filter=~Q(issue_cycle__issue__assignees__id__isnull=True) - & ( - Q( - issue_cycle__issue__issue_assignee__deleted_at__isnull=True - ) - ), + & (Q(issue_cycle__issue__issue_assignee__deleted_at__isnull=True)), ), Value([], output_field=ArrayField(UUIDField())), ) @@ -205,9 +198,7 @@ def list(self, request, slug, project_id): # Current Cycle if cycle_view == "current": - queryset = queryset.filter( - start_date__lte=current_time_in_utc, end_date__gte=current_time_in_utc - ) + queryset = queryset.filter(start_date__lte=current_time_in_utc, end_date__gte=current_time_in_utc) data = queryset.values( # necessary fields @@ -274,16 +265,10 @@ def list(self, request, slug, project_id): @allow_permission([ROLE.ADMIN, ROLE.MEMBER]) def create(self, request, slug, project_id): - if ( - request.data.get("start_date", None) is None - and request.data.get("end_date", None) is None - ) or ( - request.data.get("start_date", None) is not None - and request.data.get("end_date", None) is not None + if (request.data.get("start_date", None) is None and request.data.get("end_date", None) is None) or ( + request.data.get("start_date", None) is not None and request.data.get("end_date", None) is not None ): - serializer = CycleWriteSerializer( - data=request.data, context={"project_id": project_id} - ) + serializer = CycleWriteSerializer(data=request.data, context={"project_id": project_id}) if serializer.is_valid(): serializer.save(project_id=project_id, owned_by=request.user) cycle = ( @@ -323,9 +308,7 @@ def create(self, request, slug, project_id): project_timezone = project.timezone datetime_fields = ["start_date", "end_date"] - cycle = user_timezone_converter( - cycle, datetime_fields, project_timezone - ) + cycle = user_timezone_converter(cycle, datetime_fields, project_timezone) # Send the model activity model_activity.delay( @@ -341,17 +324,13 @@ def create(self, request, slug, project_id): return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) else: return Response( - { - "error": "Both start date and end date are either required or are to be null" - }, + {"error": "Both start date and end date are either required or are to be null"}, status=status.HTTP_400_BAD_REQUEST, ) @allow_permission([ROLE.ADMIN, ROLE.MEMBER]) def partial_update(self, request, slug, project_id, pk): - queryset = self.get_queryset().filter( - workspace__slug=slug, project_id=project_id, pk=pk - ) + queryset = self.get_queryset().filter(workspace__slug=slug, project_id=project_id, pk=pk) cycle = queryset.first() if cycle.archived_at: return Response( @@ -359,29 +338,21 @@ def partial_update(self, request, slug, project_id, pk): status=status.HTTP_400_BAD_REQUEST, ) - current_instance = json.dumps( - CycleSerializer(cycle).data, cls=DjangoJSONEncoder - ) + current_instance = json.dumps(CycleSerializer(cycle).data, cls=DjangoJSONEncoder) request_data = request.data if cycle.end_date is not None and cycle.end_date < timezone.now(): if "sort_order" in request_data: # Can only change sort order for a completed cycle`` - request_data = { - "sort_order": request_data.get("sort_order", cycle.sort_order) - } + request_data = {"sort_order": request_data.get("sort_order", cycle.sort_order)} else: return Response( - { - "error": "The Cycle has already been completed so it cannot be edited" - }, + {"error": "The Cycle has already been completed so it cannot be edited"}, status=status.HTTP_400_BAD_REQUEST, ) - serializer = CycleWriteSerializer( - cycle, data=request.data, partial=True, context={"project_id": project_id} - ) + serializer = CycleWriteSerializer(cycle, data=request.data, partial=True, context={"project_id": project_id}) if serializer.is_valid(): serializer.save() cycle = queryset.values( @@ -481,9 +452,7 @@ def retrieve(self, request, slug, project_id, pk): ) if data is None: - return Response( - {"error": "Cycle not found"}, status=status.HTTP_404_NOT_FOUND - ) + return Response({"error": "Cycle not found"}, status=status.HTTP_404_NOT_FOUND) queryset = queryset.first() # Fetch the project timezone @@ -505,11 +474,7 @@ def retrieve(self, request, slug, project_id, pk): def destroy(self, request, slug, project_id, pk): cycle = Cycle.objects.get(workspace__slug=slug, project_id=project_id, pk=pk) - cycle_issues = list( - CycleIssue.objects.filter(cycle_id=self.kwargs.get("pk")).values_list( - "issue", flat=True - ) - ) + cycle_issues = list(CycleIssue.objects.filter(cycle_id=self.kwargs.get("pk")).values_list("issue", flat=True)) issue_activity.delay( type="cycle.activity.deleted", @@ -560,9 +525,7 @@ def post(self, request, slug, project_id): status=status.HTTP_400_BAD_REQUEST, ) - start_date = convert_to_utc( - date=str(start_date), project_id=project_id, is_start_date=True - ) + start_date = convert_to_utc(date=str(start_date), project_id=project_id, is_start_date=True) end_date = convert_to_utc( date=str(end_date), project_id=project_id, @@ -666,12 +629,8 @@ def patch(self, request, slug, project_id, cycle_id): ) cycle_properties.filters = request.data.get("filters", cycle_properties.filters) - cycle_properties.rich_filters = request.data.get( - "rich_filters", cycle_properties.rich_filters - ) - cycle_properties.display_filters = request.data.get( - "display_filters", cycle_properties.display_filters - ) + cycle_properties.rich_filters = request.data.get("rich_filters", cycle_properties.rich_filters) + cycle_properties.display_filters = request.data.get("display_filters", cycle_properties.display_filters) cycle_properties.display_properties = request.data.get( "display_properties", cycle_properties.display_properties ) @@ -695,13 +654,9 @@ def get(self, request, slug, project_id, cycle_id): class CycleProgressEndpoint(BaseAPIView): @allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST]) def get(self, request, slug, project_id, cycle_id): - cycle = Cycle.objects.filter( - workspace__slug=slug, project_id=project_id, id=cycle_id - ).first() + cycle = Cycle.objects.filter(workspace__slug=slug, project_id=project_id, id=cycle_id).first() if not cycle: - return Response( - {"error": "Cycle not found"}, status=status.HTTP_404_NOT_FOUND - ) + return Response({"error": "Cycle not found"}, status=status.HTTP_404_NOT_FOUND) aggregate_estimates = ( Issue.issue_objects.filter( estimate_point__estimate__type="points", @@ -747,9 +702,7 @@ def get(self, request, slug, project_id, cycle_id): output_field=FloatField(), ) ), - total_estimate_points=Sum( - "value_as_float", default=Value(0), output_field=FloatField() - ), + total_estimate_points=Sum("value_as_float", default=Value(0), output_field=FloatField()), ) ) if cycle.progress_snapshot: @@ -809,22 +762,11 @@ def get(self, request, slug, project_id, cycle_id): return Response( { - "backlog_estimate_points": aggregate_estimates["backlog_estimate_point"] - or 0, - "unstarted_estimate_points": aggregate_estimates[ - "unstarted_estimate_point" - ] - or 0, - "started_estimate_points": aggregate_estimates["started_estimate_point"] - or 0, - "cancelled_estimate_points": aggregate_estimates[ - "cancelled_estimate_point" - ] - or 0, - "completed_estimate_points": aggregate_estimates[ - "completed_estimate_points" - ] - or 0, + "backlog_estimate_points": aggregate_estimates["backlog_estimate_point"] or 0, + "unstarted_estimate_points": aggregate_estimates["unstarted_estimate_point"] or 0, + "started_estimate_points": aggregate_estimates["started_estimate_point"] or 0, + "cancelled_estimate_points": aggregate_estimates["cancelled_estimate_point"] or 0, + "completed_estimate_points": aggregate_estimates["completed_estimate_points"] or 0, "total_estimate_points": aggregate_estimates["total_estimate_points"], "backlog_issues": backlog_issues, "total_issues": total_issues, @@ -842,9 +784,7 @@ class CycleAnalyticsEndpoint(BaseAPIView): def get(self, request, slug, project_id, cycle_id): analytic_type = request.GET.get("type", "issues") cycle = ( - Cycle.objects.filter( - workspace__slug=slug, project_id=project_id, id=cycle_id - ) + Cycle.objects.filter(workspace__slug=slug, project_id=project_id, id=cycle_id) .annotate( total_issues=Count( "issue_cycle__issue__id", @@ -927,9 +867,7 @@ def get(self, request, slug, project_id, cycle_id): ) ) .values("display_name", "assignee_id", "avatar_url") - .annotate( - total_estimates=Sum(Cast("estimate_point__value", FloatField())) - ) + .annotate(total_estimates=Sum(Cast("estimate_point__value", FloatField()))) .annotate( completed_estimates=Sum( Cast("estimate_point__value", FloatField()), @@ -964,9 +902,7 @@ def get(self, request, slug, project_id, cycle_id): .annotate(color=F("labels__color")) .annotate(label_id=F("labels__id")) .values("label_name", "color", "label_id") - .annotate( - total_estimates=Sum(Cast("estimate_point__value", FloatField())) - ) + .annotate(total_estimates=Sum(Cast("estimate_point__value", FloatField()))) .annotate( completed_estimates=Sum( Cast("estimate_point__value", FloatField()), @@ -1068,11 +1004,7 @@ def get(self, request, slug, project_id, cycle_id): .annotate(color=F("labels__color")) .annotate(label_id=F("labels__id")) .values("label_name", "color", "label_id") - .annotate( - total_issues=Count( - "label_id", filter=Q(archived_at__isnull=True, is_draft=False) - ) - ) + .annotate(total_issues=Count("label_id", filter=Q(archived_at__isnull=True, is_draft=False))) .annotate( completed_issues=Count( "label_id", diff --git a/apps/api/plane/app/views/issue/label.py b/apps/api/plane/app/views/issue/label.py index ad0a290801b..6e46b5abb0d 100644 --- a/apps/api/plane/app/views/issue/label.py +++ b/apps/api/plane/app/views/issue/label.py @@ -39,9 +39,7 @@ def get_queryset(self): @allow_permission([ROLE.ADMIN]) def create(self, request, slug, project_id): try: - serializer = LabelSerializer( - data=request.data, context={"project_id": project_id} - ) + serializer = LabelSerializer(data=request.data, context={"project_id": project_id}) if serializer.is_valid(): serializer.save(project_id=project_id) return Response(serializer.data, status=status.HTTP_201_CREATED) diff --git a/apps/api/plane/app/views/page/base.py b/apps/api/plane/app/views/page/base.py index 50daf440adc..d3ad49b5fda 100644 --- a/apps/api/plane/app/views/page/base.py +++ b/apps/api/plane/app/views/page/base.py @@ -495,14 +495,12 @@ class PagesDescriptionViewSet(BaseViewSet): permission_classes = [ProjectPagePermission] def retrieve(self, request, slug, project_id, page_id): - page = ( - Page.objects.get( - Q(owned_by=self.request.user) | Q(access=0), - pk=page_id, - workspace__slug=slug, - projects__id=project_id, - project_pages__deleted_at__isnull=True, - ) + page = Page.objects.get( + Q(owned_by=self.request.user) | Q(access=0), + pk=page_id, + workspace__slug=slug, + projects__id=project_id, + project_pages__deleted_at__isnull=True, ) binary_data = page.description_binary @@ -517,14 +515,12 @@ def stream_data(): return response def partial_update(self, request, slug, project_id, page_id): - page = ( - Page.objects.get( - Q(owned_by=self.request.user) | Q(access=0), - pk=page_id, - workspace__slug=slug, - projects__id=project_id, - project_pages__deleted_at__isnull=True, - ) + page = Page.objects.get( + Q(owned_by=self.request.user) | Q(access=0), + pk=page_id, + workspace__slug=slug, + projects__id=project_id, + project_pages__deleted_at__isnull=True, ) if page.is_locked: diff --git a/apps/api/plane/authentication/adapter/base.py b/apps/api/plane/authentication/adapter/base.py index b80555fe16e..d01f3f10b2b 100644 --- a/apps/api/plane/authentication/adapter/base.py +++ b/apps/api/plane/authentication/adapter/base.py @@ -90,9 +90,9 @@ def __check_signup(self, email): """Check if sign up is enabled or not and raise exception if not enabled""" # Get configuration value - (ENABLE_SIGNUP,) = get_configuration_value([ - {"key": "ENABLE_SIGNUP", "default": os.environ.get("ENABLE_SIGNUP", "1")} - ]) + (ENABLE_SIGNUP,) = get_configuration_value( + [{"key": "ENABLE_SIGNUP", "default": os.environ.get("ENABLE_SIGNUP", "1")}] + ) # Check if sign up is disabled and invite is present or not if ENABLE_SIGNUP == "0" and not WorkspaceMemberInvite.objects.filter(email=email).exists(): diff --git a/apps/api/plane/authentication/provider/oauth/gitea.py b/apps/api/plane/authentication/provider/oauth/gitea.py index ba7d3d16ba3..4d8de8e1af3 100644 --- a/apps/api/plane/authentication/provider/oauth/gitea.py +++ b/apps/api/plane/authentication/provider/oauth/gitea.py @@ -101,9 +101,7 @@ def set_token_data(self): else None ), "refresh_token_expired_at": ( - datetime.fromtimestamp( - token_response.get("refresh_token_expired_at"), tz=pytz.utc - ) + datetime.fromtimestamp(token_response.get("refresh_token_expired_at"), tz=pytz.utc) if token_response.get("refresh_token_expired_at") else None ), @@ -168,4 +166,4 @@ def set_user_data(self): "is_password_autoset": True, }, } - ) \ No newline at end of file + ) diff --git a/apps/api/plane/authentication/views/app/gitea.py b/apps/api/plane/authentication/views/app/gitea.py index fd12f8b3363..e43a35c3c89 100644 --- a/apps/api/plane/authentication/views/app/gitea.py +++ b/apps/api/plane/authentication/views/app/gitea.py @@ -37,9 +37,7 @@ def get(self, request): params = exc.get_error_dict() if next_path: params["next_path"] = str(validate_next_path(next_path)) - url = urljoin( - base_host(request=request, is_app=True), "?" + urlencode(params) - ) + url = urljoin(base_host(request=request, is_app=True), "?" + urlencode(params)) return HttpResponseRedirect(url) try: state = uuid.uuid4().hex @@ -51,9 +49,7 @@ def get(self, request): params = e.get_error_dict() if next_path: params["next_path"] = str(validate_next_path(next_path)) - url = urljoin( - base_host(request=request, is_app=True), "?" + urlencode(params) - ) + url = urljoin(base_host(request=request, is_app=True), "?" + urlencode(params)) return HttpResponseRedirect(url) @@ -87,9 +83,7 @@ def get(self, request): return HttpResponseRedirect(url) try: - provider = GiteaOAuthProvider( - request=request, code=code, callback=post_user_auth_workflow - ) + provider = GiteaOAuthProvider(request=request, code=code, callback=post_user_auth_workflow) user = provider.authenticate() # Login the user and record his device info user_login(request=request, user=user, is_app=True) diff --git a/apps/api/plane/bgtasks/page_transaction_task.py b/apps/api/plane/bgtasks/page_transaction_task.py index 402d0a3ee02..9c0caccf068 100644 --- a/apps/api/plane/bgtasks/page_transaction_task.py +++ b/apps/api/plane/bgtasks/page_transaction_task.py @@ -88,7 +88,6 @@ def page_transaction(new_description_html, old_description_html, page_id): has_existing_logs = PageLog.objects.filter(page_id=page_id).exists() - # Extract all components in a single pass (optimized) old_components = extract_all_components(old_description_html) new_components = extract_all_components(new_description_html) @@ -125,12 +124,9 @@ def page_transaction(new_description_html, old_description_html, page_id): ) ) - # Bulk insert and cleanup if new_transactions: - PageLog.objects.bulk_create( - new_transactions, batch_size=50, ignore_conflicts=True - ) + PageLog.objects.bulk_create(new_transactions, batch_size=50, ignore_conflicts=True) if deleted_transaction_ids: PageLog.objects.filter(transaction__in=deleted_transaction_ids).delete() diff --git a/apps/api/plane/bgtasks/workspace_seed_task.py b/apps/api/plane/bgtasks/workspace_seed_task.py index 57ac02ec127..6df6b49663b 100644 --- a/apps/api/plane/bgtasks/workspace_seed_task.py +++ b/apps/api/plane/bgtasks/workspace_seed_task.py @@ -107,56 +107,60 @@ def create_project_and_member(workspace: Workspace, bot_user: User) -> Dict[int, ) # Create project members - ProjectMember.objects.bulk_create([ - ProjectMember( - project=project, - member_id=workspace_member["member_id"], - role=workspace_member["role"], - workspace_id=workspace.id, - created_by_id=bot_user.id, - ) - for workspace_member in workspace_members - ]) + ProjectMember.objects.bulk_create( + [ + ProjectMember( + project=project, + member_id=workspace_member["member_id"], + role=workspace_member["role"], + workspace_id=workspace.id, + created_by_id=bot_user.id, + ) + for workspace_member in workspace_members + ] + ) # Create issue user properties - IssueUserProperty.objects.bulk_create([ - IssueUserProperty( - project=project, - user_id=workspace_member["member_id"], - workspace_id=workspace.id, - display_filters={ - "layout": "list", - "calendar": {"layout": "month", "show_weekends": False}, - "group_by": "state", - "order_by": "sort_order", - "sub_issue": True, - "sub_group_by": None, - "show_empty_groups": True, - }, - display_properties={ - "key": True, - "link": True, - "cycle": False, - "state": True, - "labels": False, - "modules": False, - "assignee": True, - "due_date": False, - "estimate": True, - "priority": True, - "created_on": True, - "issue_type": True, - "start_date": False, - "updated_on": True, - "customer_count": True, - "sub_issue_count": False, - "attachment_count": False, - "customer_request_count": True, - }, - created_by_id=bot_user.id, - ) - for workspace_member in workspace_members - ]) + IssueUserProperty.objects.bulk_create( + [ + IssueUserProperty( + project=project, + user_id=workspace_member["member_id"], + workspace_id=workspace.id, + display_filters={ + "layout": "list", + "calendar": {"layout": "month", "show_weekends": False}, + "group_by": "state", + "order_by": "sort_order", + "sub_issue": True, + "sub_group_by": None, + "show_empty_groups": True, + }, + display_properties={ + "key": True, + "link": True, + "cycle": False, + "state": True, + "labels": False, + "modules": False, + "assignee": True, + "due_date": False, + "estimate": True, + "priority": True, + "created_on": True, + "issue_type": True, + "start_date": False, + "updated_on": True, + "customer_count": True, + "sub_issue_count": False, + "attachment_count": False, + "customer_request_count": True, + }, + created_by_id=bot_user.id, + ) + for workspace_member in workspace_members + ] + ) # update map projects_map[project_id] = project.id logger.info(f"Task: workspace_seed_task -> Project {project_id} created") diff --git a/apps/api/plane/license/api/views/admin.py b/apps/api/plane/license/api/views/admin.py index 5b70beab9d1..0d37f4fdc0e 100644 --- a/apps/api/plane/license/api/views/admin.py +++ b/apps/api/plane/license/api/views/admin.py @@ -134,8 +134,10 @@ def post(self, request): }, ) url = urljoin( - base_host(request=request, is_admin=True, ), - + base_host( + request=request, + is_admin=True, + ), "?" + urlencode(exc.get_error_dict()), ) return HttpResponseRedirect(url) diff --git a/apps/api/plane/tests/unit/serializers/test_label.py b/apps/api/plane/tests/unit/serializers/test_label.py index 91cde1c4ad8..4775ef49ad1 100644 --- a/apps/api/plane/tests/unit/serializers/test_label.py +++ b/apps/api/plane/tests/unit/serializers/test_label.py @@ -10,9 +10,7 @@ class TestLabelSerializer: @pytest.mark.django_db def test_label_serializer_create_valid_data(self, db, workspace): """Test creating a label with valid data""" - project = Project.objects.create( - name="Test Project", identifier="TEST", workspace=workspace - ) + project = Project.objects.create(name="Test Project", identifier="TEST", workspace=workspace) serializer = LabelSerializer( data={"name": "Test Label"}, @@ -30,14 +28,10 @@ def test_label_serializer_create_valid_data(self, db, workspace): @pytest.mark.django_db def test_label_serializer_create_duplicate_name(self, db, workspace): """Test creating a label with a duplicate name""" - project = Project.objects.create( - name="Test Project", identifier="TEST", workspace=workspace - ) + project = Project.objects.create(name="Test Project", identifier="TEST", workspace=workspace) Label.objects.create(name="Test Label", project=project) - serializer = LabelSerializer( - data={"name": "Test Label"}, context={"project_id": project.id} - ) + serializer = LabelSerializer(data={"name": "Test Label"}, context={"project_id": project.id}) assert not serializer.is_valid() assert serializer.errors == {"name": ["LABEL_NAME_ALREADY_EXISTS"]} diff --git a/apps/api/plane/utils/content_validator.py b/apps/api/plane/utils/content_validator.py index 10e83b85dab..00e6c0c6605 100644 --- a/apps/api/plane/utils/content_validator.py +++ b/apps/api/plane/utils/content_validator.py @@ -56,9 +56,7 @@ def validate_binary_data(data): # Check for suspicious text patterns (HTML/JS) try: decoded_text = binary_data.decode("utf-8", errors="ignore")[:200] - if any( - pattern in decoded_text.lower() for pattern in SUSPICIOUS_BINARY_PATTERNS - ): + if any(pattern in decoded_text.lower() for pattern in SUSPICIOUS_BINARY_PATTERNS): return False, "Binary data contains suspicious content patterns" except Exception: pass # Binary data might not be decodable as text, which is fine diff --git a/apps/api/plane/utils/cycle_transfer_issues.py b/apps/api/plane/utils/cycle_transfer_issues.py index ec934e8892d..fda9f39b95c 100644 --- a/apps/api/plane/utils/cycle_transfer_issues.py +++ b/apps/api/plane/utils/cycle_transfer_issues.py @@ -51,9 +51,7 @@ def transfer_cycle_issues( dict: Response data with success or error message """ # Get the new cycle - new_cycle = Cycle.objects.filter( - workspace__slug=slug, project_id=project_id, pk=new_cycle_id - ).first() + new_cycle = Cycle.objects.filter(workspace__slug=slug, project_id=project_id, pk=new_cycle_id).first() # Check if new cycle is already completed if new_cycle.end_date is not None and new_cycle.end_date < timezone.now(): @@ -216,9 +214,7 @@ def transfer_cycle_issues( assignee_estimate_distribution = [ { "display_name": item["display_name"], - "assignee_id": ( - str(item["assignee_id"]) if item["assignee_id"] else None - ), + "assignee_id": (str(item["assignee_id"]) if item["assignee_id"] else None), "avatar_url": item.get("avatar_url"), "total_estimates": item["total_estimates"], "completed_estimates": item["completed_estimates"], @@ -310,9 +306,7 @@ def transfer_cycle_issues( ) ) .values("display_name", "assignee_id", "avatar_url") - .annotate( - total_issues=Count("id", filter=Q(archived_at__isnull=True, is_draft=False)) - ) + .annotate(total_issues=Count("id", filter=Q(archived_at__isnull=True, is_draft=False))) .annotate( completed_issues=Count( "id", @@ -360,9 +354,7 @@ def transfer_cycle_issues( .annotate(color=F("labels__color")) .annotate(label_id=F("labels__id")) .values("label_name", "color", "label_id") - .annotate( - total_issues=Count("id", filter=Q(archived_at__isnull=True, is_draft=False)) - ) + .annotate(total_issues=Count("id", filter=Q(archived_at__isnull=True, is_draft=False))) .annotate( completed_issues=Count( "id", @@ -409,9 +401,7 @@ def transfer_cycle_issues( ) # Get the current cycle and save progress snapshot - current_cycle = Cycle.objects.filter( - workspace__slug=slug, project_id=project_id, pk=cycle_id - ).first() + current_cycle = Cycle.objects.filter(workspace__slug=slug, project_id=project_id, pk=cycle_id).first() current_cycle.progress_snapshot = { "total_issues": old_cycle.total_issues, @@ -461,9 +451,7 @@ def transfer_cycle_issues( ) # Bulk update cycle issues - cycle_issues = CycleIssue.objects.bulk_update( - updated_cycles, ["cycle_id"], batch_size=100 - ) + cycle_issues = CycleIssue.objects.bulk_update(updated_cycles, ["cycle_id"], batch_size=100) # Capture Issue Activity issue_activity.delay( diff --git a/apps/api/plane/utils/openapi/decorators.py b/apps/api/plane/utils/openapi/decorators.py index c1ba9612e5c..b11926889c2 100644 --- a/apps/api/plane/utils/openapi/decorators.py +++ b/apps/api/plane/utils/openapi/decorators.py @@ -263,6 +263,7 @@ def state_docs(**kwargs): return extend_schema(**_merge_schema_options(defaults, kwargs)) + def sticky_docs(**kwargs): """Decorator for sticky management endpoints""" defaults = { @@ -276,4 +277,4 @@ def sticky_docs(**kwargs): }, } - return extend_schema(**_merge_schema_options(defaults, kwargs)) \ No newline at end of file + return extend_schema(**_merge_schema_options(defaults, kwargs)) From f1761c65b5b8a91ae73bcb0812ff7034f0794a01 Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Thu, 11 Dec 2025 01:18:09 +0530 Subject: [PATCH 018/266] chore: fix ruff checks (#8305) --- apps/api/plane/app/views/project/base.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/apps/api/plane/app/views/project/base.py b/apps/api/plane/app/views/project/base.py index 3dd1e3db42b..34e13d472d8 100644 --- a/apps/api/plane/app/views/project/base.py +++ b/apps/api/plane/app/views/project/base.py @@ -1,17 +1,14 @@ # Python imports import json -import boto3 # Django imports -from django.conf import settings from django.core.serializers.json import DjangoJSONEncoder from django.db.models import Exists, F, OuterRef, Prefetch, Q, Subquery from django.utils import timezone # Third Party imports from rest_framework import status -from rest_framework.permissions import AllowAny from rest_framework.response import Response # Module imports @@ -38,8 +35,6 @@ Workspace, WorkspaceMember, ) -from plane.utils.cache import cache_response -from plane.utils.exception_logger import log_exception from plane.utils.host import base_host From 5e621cf6209d26a7f70675402b62c354a1ec6c6c Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Thu, 11 Dec 2025 13:01:25 +0530 Subject: [PATCH 019/266] fix: editor sync changes (#8306) * chore: upate function declarations * chore: formatted files --- .../pages/editor/content-limit-banner.tsx | 54 +++++++------- .../components/pages/editor/editor-body.tsx | 72 ++++++++++--------- .../components/pages/editor/page-root.tsx | 2 +- .../components/pages/header/syncing-badge.tsx | 4 +- .../editors/document/collaborative-editor.tsx | 19 ++--- .../components/editors/editor-container.tsx | 4 +- .../components/editors/editor-content.tsx | 6 +- .../editor/src/core/hooks/use-title-editor.ts | 4 +- 8 files changed, 86 insertions(+), 79 deletions(-) diff --git a/apps/web/core/components/pages/editor/content-limit-banner.tsx b/apps/web/core/components/pages/editor/content-limit-banner.tsx index cd16641159c..1195fa4e1e1 100644 --- a/apps/web/core/components/pages/editor/content-limit-banner.tsx +++ b/apps/web/core/components/pages/editor/content-limit-banner.tsx @@ -6,30 +6,32 @@ type Props = { onDismiss?: () => void; }; -export const ContentLimitBanner: React.FC = ({ className, onDismiss }) => ( -
-
- - - - - Content limit reached and live sync is off. Create a new page or use nested pages to continue syncing. - +export function ContentLimitBanner({ className, onDismiss }: Props) { + return ( +
+
+ + + + + Content limit reached and live sync is off. Create a new page or use nested pages to continue syncing. + +
+ {onDismiss && ( + + )}
- {onDismiss && ( - - )} -
-); + ); +} diff --git a/apps/web/core/components/pages/editor/editor-body.tsx b/apps/web/core/components/pages/editor/editor-body.tsx index e7f6309dabd..dd7403e06df 100644 --- a/apps/web/core/components/pages/editor/editor-body.tsx +++ b/apps/web/core/components/pages/editor/editor-body.tsx @@ -254,43 +254,45 @@ export const PageEditorBody = observer(function PageEditorBody(props: Props) {
)} -
-
- +
+
+
+ +
+ { + const res = await fetchMentions(query); + if (!res) throw new Error("Failed in fetching mentions"); + return res; + }, + renderComponent: (props) => , + getMentionedEntityDetails: (id: string) => ({ display_name: getUserDetails(id)?.display_name ?? "" }), + }} + updatePageProperties={updatePageProperties} + realtimeConfig={realtimeConfig} + serverHandler={serverHandler} + user={userConfig} + disabledExtensions={documentEditorExtensions.disabled} + flaggedExtensions={documentEditorExtensions.flagged} + aiHandler={{ + menu: getAIMenu, + }} + onAssetChange={updateAssetsList} + extendedEditorProps={extendedEditorProps} + isFetchingFallbackBinary={isFetchingFallbackBinary} + />
- { - const res = await fetchMentions(query); - if (!res) throw new Error("Failed in fetching mentions"); - return res; - }, - renderComponent: (props) => , - getMentionedEntityDetails: (id: string) => ({ display_name: getUserDetails(id)?.display_name ?? "" }), - }} - updatePageProperties={updatePageProperties} - realtimeConfig={realtimeConfig} - serverHandler={serverHandler} - user={userConfig} - disabledExtensions={documentEditorExtensions.disabled} - flaggedExtensions={documentEditorExtensions.flagged} - aiHandler={{ - menu: getAIMenu, - }} - onAssetChange={updateAssetsList} - extendedEditorProps={extendedEditorProps} - isFetchingFallbackBinary={isFetchingFallbackBinary} - />
); diff --git a/apps/web/core/components/pages/editor/page-root.tsx b/apps/web/core/components/pages/editor/page-root.tsx index d81273f2c1c..54fb29416c0 100644 --- a/apps/web/core/components/pages/editor/page-root.tsx +++ b/apps/web/core/components/pages/editor/page-root.tsx @@ -43,7 +43,7 @@ type TPageRootProps = { customRealtimeEventHandlers?: TCustomEventHandlers; }; -export const PageRoot = observer((props: TPageRootProps) => { +export const PageRoot = observer(function PageRoot(props: TPageRootProps) { const { config, handlers, diff --git a/apps/web/core/components/pages/header/syncing-badge.tsx b/apps/web/core/components/pages/header/syncing-badge.tsx index 34511179774..056a014152a 100644 --- a/apps/web/core/components/pages/header/syncing-badge.tsx +++ b/apps/web/core/components/pages/header/syncing-badge.tsx @@ -6,7 +6,7 @@ type Props = { syncStatus: "syncing" | "synced" | "error"; }; -export const PageSyncingBadge = ({ syncStatus }: Props) => { +export function PageSyncingBadge({ syncStatus }: Props) { const [prevSyncStatus, setPrevSyncStatus] = useState<"syncing" | "synced" | "error" | null>(null); const [isVisible, setIsVisible] = useState(syncStatus !== "synced"); @@ -69,4 +69,4 @@ export const PageSyncingBadge = ({ syncStatus }: Props) => {
); -}; +} diff --git a/packages/editor/src/core/components/editors/document/collaborative-editor.tsx b/packages/editor/src/core/components/editors/document/collaborative-editor.tsx index bee6e610ac9..7ea5b23b4ae 100644 --- a/packages/editor/src/core/components/editors/document/collaborative-editor.tsx +++ b/packages/editor/src/core/components/editors/document/collaborative-editor.tsx @@ -15,7 +15,7 @@ import { useCollaborativeEditor } from "@/hooks/use-collaborative-editor"; import type { EditorRefApi, ICollaborativeDocumentEditorProps } from "@/types"; // Inner component that has access to collaboration context -const CollaborativeDocumentEditorInner: React.FC = (props) => { +function CollaborativeDocumentEditorInner(props: ICollaborativeDocumentEditorProps) { const { aiHandler, bubbleMenuEnabled = true, @@ -129,10 +129,10 @@ const CollaborativeDocumentEditorInner: React.FC ); -}; +} // Outer component that provides collaboration context -const CollaborativeDocumentEditor: React.FC = (props) => { +function CollaborativeDocumentEditor(props: ICollaborativeDocumentEditorProps) { const { id, realtimeConfig, serverHandler, user } = props; const token = useMemo(() => JSON.stringify(user), [user]); @@ -147,13 +147,16 @@ const CollaborativeDocumentEditor: React.FC = ); -}; +} -const CollaborativeDocumentEditorWithRef = React.forwardRef( - (props, ref) => ( +const CollaborativeDocumentEditorWithRef = React.forwardRef(function CollaborativeDocumentEditorWithRef( + props: ICollaborativeDocumentEditorProps, + ref: React.ForwardedRef +) { + return ( } /> - ) -); + ); +}); CollaborativeDocumentEditorWithRef.displayName = "CollaborativeDocumentEditorWithRef"; diff --git a/packages/editor/src/core/components/editors/editor-container.tsx b/packages/editor/src/core/components/editors/editor-container.tsx index 8fb03e893e3..c6ba43ad893 100644 --- a/packages/editor/src/core/components/editors/editor-container.tsx +++ b/packages/editor/src/core/components/editors/editor-container.tsx @@ -26,7 +26,7 @@ type Props = { state?: TCollabValue["state"]; }; -export const EditorContainer: FC = (props) => { +export function EditorContainer(props: Props) { const { children, displayConfig, editor, editorContainerClassName, id, isTouchDevice, provider, state } = props; // refs const containerRef = useRef(null); @@ -176,4 +176,4 @@ export const EditorContainer: FC = (props) => {
); -}; +} diff --git a/packages/editor/src/core/components/editors/editor-content.tsx b/packages/editor/src/core/components/editors/editor-content.tsx index 23efd5ec67e..20ee7d42956 100644 --- a/packages/editor/src/core/components/editors/editor-content.tsx +++ b/packages/editor/src/core/components/editors/editor-content.tsx @@ -1,6 +1,6 @@ import { EditorContent } from "@tiptap/react"; import type { Editor } from "@tiptap/react"; -import type { FC, ReactNode } from "react"; +import type { ReactNode } from "react"; type Props = { className?: string; @@ -10,7 +10,7 @@ type Props = { tabIndex?: number; }; -export const EditorContentWrapper: FC = (props) => { +export function EditorContentWrapper(props: Props) { const { editor, className, children, tabIndex, id } = props; return ( @@ -23,4 +23,4 @@ export const EditorContentWrapper: FC = (props) => { {children}
); -}; +} diff --git a/packages/editor/src/core/hooks/use-title-editor.ts b/packages/editor/src/core/hooks/use-title-editor.ts index de850bf82f6..0272bdb2276 100644 --- a/packages/editor/src/core/hooks/use-title-editor.ts +++ b/packages/editor/src/core/hooks/use-title-editor.ts @@ -13,7 +13,7 @@ import { getEditorRefHelpers } from "@/helpers/editor-ref"; import type { IEditorPropsExtended, IEditorProps } from "@/types"; import type { EditorTitleRefApi, ICollaborativeDocumentEditorProps } from "@/types/editor"; -type Props = { +type TUseTitleEditorProps = { editable?: boolean; provider: HocuspocusProvider; titleRef?: React.MutableRefObject; @@ -31,7 +31,7 @@ type Props = { * A hook that creates a title editor with collaboration features * Uses the same Y.Doc as the main editor but a different field */ -export const useTitleEditor = (props: Props) => { +export const useTitleEditor = (props: TUseTitleEditorProps) => { const { editable = true, id, From 0370a1bfdd0e658f988b4def950394280366e8fb Mon Sep 17 00:00:00 2001 From: Aaron Date: Thu, 11 Dec 2025 14:33:37 +0700 Subject: [PATCH 020/266] chore: fix/check tooling improvements with turbo (#8304) --- apps/admin/package.json | 8 +- apps/live/package.json | 8 +- apps/space/package.json | 8 +- apps/web/package.json | 8 +- eslint.config.mjs | 7 +- packages/constants/package.json | 8 +- packages/decorators/package.json | 8 +- packages/editor/package.json | 8 +- .../editor/src/core/hooks/use-yjs-setup.ts | 2 +- packages/hooks/package.json | 8 +- packages/i18n/package.json | 8 +- packages/logger/package.json | 8 +- packages/propel/package.json | 8 +- packages/services/package.json | 8 +- packages/shared-state/package.json | 8 +- packages/types/package.json | 8 +- packages/ui/package.json | 8 +- packages/utils/package.json | 8 +- pnpm-lock.yaml | 688 ++++-------------- turbo.json | 13 +- 20 files changed, 217 insertions(+), 621 deletions(-) diff --git a/apps/admin/package.json b/apps/admin/package.json index e81a3e073d0..cafd3318505 100644 --- a/apps/admin/package.json +++ b/apps/admin/package.json @@ -11,11 +11,11 @@ "preview": "react-router build && serve -s build/client -l 3001", "start": "serve -s build/client -l 3001", "clean": "rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist && rm -rf build", - "check:lint": "eslint . --max-warnings=485", + "check:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --max-warnings=485", "check:types": "react-router typegen && tsc --noEmit", - "check:format": "prettier --check .", - "fix:lint": "eslint . --fix --max-warnings=485", - "fix:format": "prettier --write ." + "check:format": "prettier . --cache --check", + "fix:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --fix --max-warnings=485", + "fix:format": "prettier . --cache --write" }, "dependencies": { "@bprogress/core": "catalog:", diff --git a/apps/live/package.json b/apps/live/package.json index b773efb4444..88ee28b14cb 100644 --- a/apps/live/package.json +++ b/apps/live/package.json @@ -15,11 +15,11 @@ "build": "tsc --noEmit && tsdown", "dev": "tsdown --watch --onSuccess \"node --env-file=.env .\"", "start": "node --env-file=.env .", - "check:lint": "eslint . --max-warnings=160", + "check:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --max-warnings=160", "check:types": "tsc --noEmit", - "check:format": "prettier --check .", - "fix:lint": "eslint . --fix --max-warnings=160", - "fix:format": "prettier --write .", + "check:format": "prettier . --cache --check", + "fix:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --fix --max-warnings=160", + "fix:format": "prettier . --cache --write", "clean": "rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist" }, "author": "Plane Software Inc.", diff --git a/apps/space/package.json b/apps/space/package.json index 73101a7f686..c1e5fc4ff71 100644 --- a/apps/space/package.json +++ b/apps/space/package.json @@ -10,11 +10,11 @@ "preview": "react-router build && PORT=3002 react-router-serve ./build/server/index.js", "start": "PORT=3002 react-router-serve ./build/server/index.js", "clean": "rm -rf .turbo && rm -rf .next && rm -rf .react-router && rm -rf node_modules && rm -rf dist && rm -rf build", - "check:lint": "eslint . --max-warnings=932", + "check:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --max-warnings=932", "check:types": "react-router typegen && tsc --noEmit", - "check:format": "prettier --check .", - "fix:lint": "eslint . --fix --max-warnings=932", - "fix:format": "prettier --write ." + "check:format": "prettier . --cache --check", + "fix:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --fix --max-warnings=932", + "fix:format": "prettier . --cache --write" }, "dependencies": { "@bprogress/core": "catalog:", diff --git a/apps/web/package.json b/apps/web/package.json index ed9730543e2..41cef92a64d 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -10,11 +10,11 @@ "preview": "react-router build && serve -s build/client -l 3000", "start": "serve -s build/client -l 3000", "clean": "rm -rf .turbo && rm -rf .next && rm -rf .react-router && rm -rf node_modules && rm -rf dist && rm -rf build", - "check:lint": "eslint . --max-warnings=14367", + "check:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --max-warnings=14367", "check:types": "react-router typegen && tsc --noEmit", - "check:format": "prettier --check .", - "fix:lint": "eslint . --fix --max-warnings=14367", - "fix:format": "prettier --write ." + "check:format": "prettier . --cache --check", + "fix:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --fix --max-warnings=14367", + "fix:format": "prettier . --cache --write" }, "dependencies": { "@atlaskit/pragmatic-drag-and-drop": "catalog:", diff --git a/eslint.config.mjs b/eslint.config.mjs index e45b2f05957..7f8f36e2e79 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -100,7 +100,6 @@ export default defineConfig([ "@typescript-eslint/restrict-plus-operands": "warn", "@typescript-eslint/restrict-template-expressions": "warn", "@typescript-eslint/unbound-method": "warn", - "import/consistent-type-specifier-style": ["error", "prefer-top-level"], "jsdoc/require-jsdoc": "off", "jsx-a11y/alt-text": "warn", "jsx-a11y/anchor-is-valid": "warn", @@ -136,7 +135,10 @@ export default defineConfig([ "react-hooks/rules-of-hooks": "warn", "react-hooks/set-state-in-effect": "warn", "react-hooks/static-components": "warn", - "react-refresh/only-export-components": "warn", + "react-refresh/only-export-components": [ + "warn", + { allowExportNames: ["meta", "links", "headers", "loader", "action"] }, + ], "react/display-name": "warn", "react/jsx-no-target-blank": "warn", "react/no-unknown-property": "warn", @@ -158,6 +160,7 @@ export default defineConfig([ "import/internal-regex": "^@plane/", }, rules: { + "import/consistent-type-specifier-style": ["error", "prefer-top-level"], "import/no-unresolved": ["error", { ignore: ["next/link", "next/navigation", "next/script"] }], }, }, diff --git a/packages/constants/package.json b/packages/constants/package.json index 9e1a2ca699f..abce9b95772 100644 --- a/packages/constants/package.json +++ b/packages/constants/package.json @@ -7,11 +7,11 @@ "scripts": { "dev": "tsdown --watch", "build": "tsdown", - "check:lint": "eslint . --max-warnings=30", + "check:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --max-warnings=30", "check:types": "tsc --noEmit", - "check:format": "prettier --check .", - "fix:lint": "eslint . --fix --max-warnings=30", - "fix:format": "prettier --write .", + "check:format": "prettier . --cache --check", + "fix:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --fix --max-warnings=30", + "fix:format": "prettier . --cache --write", "clean": "rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist" }, "dependencies": { diff --git a/packages/decorators/package.json b/packages/decorators/package.json index 0418b5a7734..a64ae40cae7 100644 --- a/packages/decorators/package.json +++ b/packages/decorators/package.json @@ -12,11 +12,11 @@ "scripts": { "build": "tsdown", "dev": "tsdown --watch", - "check:lint": "eslint . --max-warnings=29", + "check:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --max-warnings=29", "check:types": "tsc --noEmit", - "check:format": "prettier --check .", - "fix:lint": "eslint . --fix --max-warnings=29", - "fix:format": "prettier --write .", + "check:format": "prettier . --cache --check", + "fix:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --fix --max-warnings=29", + "fix:format": "prettier . --cache --write", "clean": "rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist" }, "devDependencies": { diff --git a/packages/editor/package.json b/packages/editor/package.json index f1e79781cbe..0f3b13f50fc 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -18,11 +18,11 @@ "scripts": { "build": "tsc && tsdown", "dev": "tsdown --watch", - "check:lint": "eslint . --max-warnings=1435", + "check:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --max-warnings=1435", "check:types": "tsc --noEmit", - "check:format": "prettier --check .", - "fix:lint": "eslint . --fix --max-warnings=1435", - "fix:format": "prettier --write .", + "check:format": "prettier . --cache --check", + "fix:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --fix --max-warnings=1435", + "fix:format": "prettier . --cache --write", "clean": "rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist" }, "peerDependencies": { diff --git a/packages/editor/src/core/hooks/use-yjs-setup.ts b/packages/editor/src/core/hooks/use-yjs-setup.ts index 42aecca5188..126c22a06aa 100644 --- a/packages/editor/src/core/hooks/use-yjs-setup.ts +++ b/packages/editor/src/core/hooks/use-yjs-setup.ts @@ -187,7 +187,7 @@ export const useYjsSetup = ({ docId, serverUrl, authToken, onStateChange }: UseY provider.on("close", handleClose); - setYjsSession({ provider, ydoc: provider.document as Y.Doc }); + setYjsSession({ provider, ydoc: provider.document }); // Handle page visibility changes (sleep/wake, tab switching) const handleVisibilityChange = (event?: Event) => { diff --git a/packages/hooks/package.json b/packages/hooks/package.json index c78d17b3cc2..70426b8a75f 100644 --- a/packages/hooks/package.json +++ b/packages/hooks/package.json @@ -15,11 +15,11 @@ "scripts": { "build": "tsdown", "dev": "tsdown --watch", - "check:lint": "eslint . --max-warnings=60", + "check:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --max-warnings=60", "check:types": "tsc --noEmit", - "check:format": "prettier --check .", - "fix:lint": "eslint . --fix --max-warnings=60", - "fix:format": "prettier --write .", + "check:format": "prettier . --cache --check", + "fix:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --fix --max-warnings=60", + "fix:format": "prettier . --cache --write", "clean": "rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist" }, "dependencies": { diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 21fac2cbde3..79838073f87 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -15,11 +15,11 @@ "scripts": { "dev": "tsdown --watch", "build": "tsdown", - "check:lint": "eslint . --max-warnings=51", + "check:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --max-warnings=51", "check:types": "tsc --noEmit", - "check:format": "prettier --check .", - "fix:lint": "eslint . --fix --max-warnings=51", - "fix:format": "prettier --write .", + "check:format": "prettier . --cache --check", + "fix:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --fix --max-warnings=51", + "fix:format": "prettier . --cache --write", "clean": "rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist" }, "dependencies": { diff --git a/packages/logger/package.json b/packages/logger/package.json index 339a4c2f1c2..8511deba6bb 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -12,11 +12,11 @@ "scripts": { "build": "tsdown", "dev": "tsdown --watch", - "check:lint": "eslint . --max-warnings=0", + "check:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --max-warnings=0", "check:types": "tsc --noEmit", - "check:format": "prettier --check .", - "fix:lint": "eslint . --fix --max-warnings=0", - "fix:format": "prettier --write .", + "check:format": "prettier . --cache --check", + "fix:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --fix --max-warnings=0", + "fix:format": "prettier . --cache --write", "clean": "rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist" }, "dependencies": { diff --git a/packages/propel/package.json b/packages/propel/package.json index 74ca9036d62..d552c6319b9 100644 --- a/packages/propel/package.json +++ b/packages/propel/package.json @@ -7,11 +7,11 @@ "scripts": { "dev": "tsdown --watch", "build": "tsdown", - "check:lint": "eslint . --max-warnings=1306", + "check:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --max-warnings=1306", "check:types": "tsc --noEmit", - "check:format": "prettier --check .", - "fix:lint": "eslint . --fix --max-warnings=1306", - "fix:format": "prettier --write .", + "check:format": "prettier . --cache --check", + "fix:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --fix --max-warnings=1306", + "fix:format": "prettier . --cache --write", "clean": "rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build" diff --git a/packages/services/package.json b/packages/services/package.json index 4972157479e..e2fed6d8789 100644 --- a/packages/services/package.json +++ b/packages/services/package.json @@ -14,11 +14,11 @@ "scripts": { "build": "tsdown", "dev": "tsdown --watch", - "check:lint": "eslint . --max-warnings=1131", + "check:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --max-warnings=1131", "check:types": "tsc --noEmit", - "check:format": "prettier --check .", - "fix:lint": "eslint . --fix --max-warnings=1131", - "fix:format": "prettier --write .", + "check:format": "prettier . --cache --check", + "fix:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --fix --max-warnings=1131", + "fix:format": "prettier . --cache --write", "clean": "rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist" }, "dependencies": { diff --git a/packages/shared-state/package.json b/packages/shared-state/package.json index 6f933798812..c3eac209951 100644 --- a/packages/shared-state/package.json +++ b/packages/shared-state/package.json @@ -18,11 +18,11 @@ "scripts": { "build": "tsdown", "dev": "tsdown --watch", - "check:lint": "eslint . --max-warnings=191", + "check:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --max-warnings=191", "check:types": "tsc --noEmit", - "check:format": "prettier --check .", - "fix:lint": "eslint . --fix --max-warnings=191", - "fix:format": "prettier --write .", + "check:format": "prettier . --cache --check", + "fix:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --fix --max-warnings=191", + "fix:format": "prettier . --cache --write", "clean": "rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist" }, "dependencies": { diff --git a/packages/types/package.json b/packages/types/package.json index 020b98bbe47..56840345fd6 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -11,11 +11,11 @@ "scripts": { "dev": "tsdown --watch", "build": "tsdown", - "check:lint": "eslint . --max-warnings=151", + "check:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --max-warnings=151", "check:types": "tsc --noEmit", - "check:format": "prettier --check .", - "fix:lint": "eslint . --fix --max-warnings=151", - "fix:format": "prettier --write .", + "check:format": "prettier . --cache --check", + "fix:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --fix --max-warnings=151", + "fix:format": "prettier . --cache --write", "clean": "rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist" }, "peerDependencies": { diff --git a/packages/ui/package.json b/packages/ui/package.json index 51fb33f6cfd..e675e3d0143 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -22,11 +22,11 @@ "storybook": "storybook dev -p 6006", "build-storybook": "storybook build", "postcss": "postcss styles/globals.css -o styles/output.css --watch", - "check:lint": "eslint . --max-warnings=643", + "check:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --max-warnings=643", "check:types": "tsc --noEmit", - "check:format": "prettier --check .", - "fix:lint": "eslint . --fix --max-warnings=643", - "fix:format": "prettier --write .", + "check:format": "prettier . --cache --check", + "fix:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --fix --max-warnings=643", + "fix:format": "prettier . --cache --write", "clean": "rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist" }, "peerDependencies": { diff --git a/packages/utils/package.json b/packages/utils/package.json index 1adaf323be5..2e0d462b72f 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -15,11 +15,11 @@ "scripts": { "build": "tsdown", "dev": "tsdown --watch", - "check:lint": "eslint . --max-warnings=1062", + "check:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --max-warnings=1062", "check:types": "tsc --noEmit", - "check:format": "prettier --check .", - "fix:lint": "eslint . --fix --max-warnings=1062", - "fix:format": "prettier --write .", + "check:format": "prettier . --cache --check", + "fix:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --fix --max-warnings=1062", + "fix:format": "prettier . --cache --write", "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist" }, "dependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d39fd124ad1..be35d2fd848 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -249,7 +249,7 @@ importers: version: 9.1.1(mobx@6.12.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-themes: specifier: ^0.2.1 - version: 0.2.1(next@14.2.32(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 0.2.1(next@14.2.32(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: 'catalog:' version: 18.3.1 @@ -1534,10 +1534,6 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - '@apm-js-collab/code-transformer@0.8.2': resolution: {integrity: sha512-YRjJjNq5KFSjDUoqu5pFUWrrsvGOxl6c3bu+uMFc9HNNptZ2rNU/TI2nLw4jnhQNtka972Ee2m3uqbvDQtPeCA==} @@ -1561,18 +1557,10 @@ packages: resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==} engines: {node: '>=6.9.0'} - '@babel/core@7.28.3': - resolution: {integrity: sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==} - engines: {node: '>=6.9.0'} - '@babel/core@7.28.4': resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.28.3': - resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} - engines: {node: '>=6.9.0'} - '@babel/generator@7.28.5': resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} engines: {node: '>=6.9.0'} @@ -1631,10 +1619,6 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} @@ -1647,16 +1631,6 @@ packages: resolution: {integrity: sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.3': - resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/parser@7.28.4': - resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/parser@7.28.5': resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} engines: {node: '>=6.0.0'} @@ -1748,22 +1722,10 @@ packages: resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.3': - resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==} - engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.4': resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.2': - resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.28.4': - resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} - engines: {node: '>=6.9.0'} - '@babel/types@7.28.5': resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} @@ -1846,15 +1808,9 @@ packages: peerDependencies: '@noble/ciphers': ^1.0.0 - '@emnapi/core@1.5.0': - resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} - '@emnapi/core@1.7.1': resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} - '@emnapi/runtime@1.5.0': - resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} - '@emnapi/runtime@1.7.1': resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} @@ -2217,9 +2173,6 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.30': - resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} - '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} @@ -4169,60 +4122,22 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: 5.8.3 - '@typescript-eslint/project-service@8.44.0': - resolution: {integrity: sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: 5.8.3 - '@typescript-eslint/project-service@8.48.1': resolution: {integrity: sha512-HQWSicah4s9z2/HifRPQ6b6R7G+SBx64JlFQpgSSHWPKdvCZX57XCbszg/bapbRsOEv42q5tayTYcEFpACcX1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: 5.8.3 - '@typescript-eslint/project-service@8.49.0': - resolution: {integrity: sha512-/wJN0/DKkmRUMXjZUXYZpD1NEQzQAAn9QWfGwo+Ai8gnzqH7tvqS7oNVdTjKqOcPyVIdZdyCMoqN66Ia789e7g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: 5.8.3 - - '@typescript-eslint/scope-manager@8.44.0': - resolution: {integrity: sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.48.1': resolution: {integrity: sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.49.0': - resolution: {integrity: sha512-npgS3zi+/30KSOkXNs0LQXtsg9ekZ8OISAOLGWA/ZOEn0ZH74Ginfl7foziV8DT+D98WfQ5Kopwqb/PZOaIJGg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.44.0': - resolution: {integrity: sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: 5.8.3 - - '@typescript-eslint/tsconfig-utils@8.45.0': - resolution: {integrity: sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: 5.8.3 - '@typescript-eslint/tsconfig-utils@8.48.1': resolution: {integrity: sha512-k0Jhs4CpEffIBm6wPaCXBAD7jxBtrHjrSgtfCjUvPp9AZ78lXKdTR8fxyZO5y4vWNlOvYXRtngSZNSn+H53Jkw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: 5.8.3 - '@typescript-eslint/tsconfig-utils@8.49.0': - resolution: {integrity: sha512-8prixNi1/6nawsRYxet4YOhnbW+W9FK/bQPxsGB1D3ZrDzbJ5FXw5XmzxZv82X3B+ZccuSxo/X8q9nQ+mFecWA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: 5.8.3 - '@typescript-eslint/type-utils@8.48.1': resolution: {integrity: sha512-1jEop81a3LrJQLTf/1VfPQdhIY4PlGDBc/i67EVWObrtvcziysbLN3oReexHOM6N3jyXgCrkBsZpqwH0hiDOQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4230,47 +4145,16 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: 5.8.3 - '@typescript-eslint/types@8.44.0': - resolution: {integrity: sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/types@8.45.0': - resolution: {integrity: sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.48.1': resolution: {integrity: sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.49.0': - resolution: {integrity: sha512-e9k/fneezorUo6WShlQpMxXh8/8wfyc+biu6tnAqA81oWrEic0k21RHzP9uqqpyBBeBKu4T+Bsjy9/b8u7obXQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.44.0': - resolution: {integrity: sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: 5.8.3 - '@typescript-eslint/typescript-estree@8.48.1': resolution: {integrity: sha512-/9wQ4PqaefTK6POVTjJaYS0bynCgzh6ClJHGSBj06XEHjkfylzB+A3qvyaXnErEZSaxhIo4YdyBgq6j4RysxDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: 5.8.3 - '@typescript-eslint/typescript-estree@8.49.0': - resolution: {integrity: sha512-jrLdRuAbPfPIdYNppHJ/D0wN+wwNfJ32YTAm10eJVsFmrVpXQnDWBn8niCSMlWjvml8jsce5E/O+86IQtTbJWA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: 5.8.3 - - '@typescript-eslint/utils@8.44.0': - resolution: {integrity: sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: 5.8.3 - '@typescript-eslint/utils@8.48.1': resolution: {integrity: sha512-fAnhLrDjiVfey5wwFRwrweyRlCmdz5ZxXz2G/4cLn0YDLjTapmN4gcCsTBR1N2rWnZSDeWpYtgLDsJt+FpmcwA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4278,25 +4162,10 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: 5.8.3 - '@typescript-eslint/utils@8.49.0': - resolution: {integrity: sha512-N3W7rJw7Rw+z1tRsHZbK395TWSYvufBXumYtEGzypgMUthlg0/hmCImeA8hgO2d2G4pd7ftpxxul2J8OdtdaFA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: 5.8.3 - - '@typescript-eslint/visitor-keys@8.44.0': - resolution: {integrity: sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.48.1': resolution: {integrity: sha512-BmxxndzEWhE4TIEEMBs8lP3MBWN3jFPs/p6gPm/wkv02o41hI6cq9AuSmGAaTTHPtA1FTi2jBre4A9rm5ZmX+Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.49.0': - resolution: {integrity: sha512-LlKaciDe3GmZFphXIc79THF/YYBugZ7FS1pO581E/edlVVNbZKDy93evqmrfQ9/Y4uN0vVhX4iuchq26mK/iiA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -4623,10 +4492,6 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - ansi-styles@6.2.3: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} @@ -5823,8 +5688,8 @@ packages: resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} engines: {node: '>=6'} - expect-type@1.3.0: - resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} engines: {node: '>=12.0.0'} export-to-csv@1.4.0: @@ -6102,9 +5967,6 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.10.1: - resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} - get-tsconfig@4.13.0: resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} @@ -6818,9 +6680,6 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true - magic-string@0.30.19: - resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -8311,11 +8170,6 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} - engines: {node: '>=10'} - hasBin: true - semver@7.7.3: resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} @@ -8541,10 +8395,6 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - strip-ansi@7.1.2: resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} @@ -8703,9 +8553,6 @@ packages: tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - tinyexec@1.0.1: - resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} - tinyexec@1.0.2: resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} engines: {node: '>=18'} @@ -9451,11 +9298,6 @@ snapshots: '@alloc/quick-lru@5.2.0': {} - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 - '@apm-js-collab/code-transformer@0.8.2': {} '@apm-js-collab/tracing-hooks@0.3.1': @@ -9484,43 +9326,23 @@ snapshots: '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 '@babel/compat-data@7.28.4': {} - '@babel/core@7.28.3': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) - '@babel/helpers': 7.26.10 - '@babel/parser': 7.28.3 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.3 - '@babel/types': 7.28.2 - convert-source-map: 2.0.0 - debug: 4.4.3 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/core@7.28.4': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 + '@babel/generator': 7.28.5 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) '@babel/helpers': 7.26.10 - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.5 '@babel/template': 7.27.2 '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 @@ -9530,25 +9352,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.28.3': - dependencies: - '@babel/parser': 7.28.3 - '@babel/types': 7.28.2 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 - jsesc: 3.1.0 - '@babel/generator@7.28.5': dependencies: '@babel/parser': 7.28.5 '@babel/types': 7.28.5 '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 '@babel/helper-compilation-targets@7.27.2': dependencies: @@ -9558,15 +9372,15 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.3)': + '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.4 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.3) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.3 + '@babel/traverse': 7.28.4 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -9574,25 +9388,16 @@ snapshots: '@babel/helper-globals@7.28.0': {} '@babel/helper-member-expression-to-functions@7.27.1': - dependencies: - '@babel/traverse': 7.28.3 - '@babel/types': 7.28.4 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-imports@7.27.1': dependencies: '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.3)': + '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/core': 7.28.3 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 '@babel/traverse': 7.28.4 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color @@ -9600,37 +9405,35 @@ snapshots: dependencies: '@babel/core': 7.28.4 '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.3)': + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.4 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.3 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.28.3 - '@babel/types': 7.28.4 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.27.1': {} - '@babel/helper-validator-identifier@7.28.5': {} '@babel/helper-validator-option@7.27.1': {} @@ -9638,110 +9441,102 @@ snapshots: '@babel/helpers@7.26.10': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.4 - - '@babel/parser@7.28.3': - dependencies: - '@babel/types': 7.28.2 - - '@babel/parser@7.28.4': - dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 '@babel/parser@7.28.5': dependencies: '@babel/types': 7.28.5 - '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.3)': + '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.3)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.3)': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.3)': + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.3 - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/core': 7.28.4 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.28.3)': + '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.3)': + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.3 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/core': 7.28.4 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.3)': + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.28.3)': + '@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.3)': + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.3 - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/core': 7.28.4 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.3)': + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.4 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) transitivePeerDependencies: - supports-color - '@babel/preset-flow@7.27.1(@babel/core@7.28.3)': + '@babel/preset-flow@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.4) - '@babel/preset-typescript@7.27.1(@babel/core@7.28.3)': + '@babel/preset-typescript@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.3) - '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.4) transitivePeerDependencies: - supports-color - '@babel/register@7.28.3(@babel/core@7.28.3)': + '@babel/register@7.28.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.4 clone-deep: 4.0.1 find-cache-dir: 2.1.0 make-dir: 2.1.0 @@ -9755,43 +9550,21 @@ snapshots: '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 - - '@babel/traverse@7.28.3': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.3 - '@babel/template': 7.27.2 - '@babel/types': 7.28.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 '@babel/traverse@7.28.4': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 + '@babel/generator': 7.28.5 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.5 '@babel/template': 7.27.2 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 debug: 4.4.3 transitivePeerDependencies: - supports-color - '@babel/types@7.28.2': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - - '@babel/types@7.28.4': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/types@7.28.5': dependencies: '@babel/helper-string-parser': 7.27.1 @@ -9906,23 +9679,12 @@ snapshots: dependencies: '@noble/ciphers': 1.3.0 - '@emnapi/core@1.5.0': - dependencies: - '@emnapi/wasi-threads': 1.1.0 - tslib: 2.8.1 - optional: true - '@emnapi/core@1.7.1': dependencies: '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.5.0': - dependencies: - tslib: 2.8.1 - optional: true - '@emnapi/runtime@1.7.1': dependencies: tslib: 2.8.1 @@ -10244,7 +10006,7 @@ snapshots: dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 @@ -10252,7 +10014,7 @@ snapshots: '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: glob: 11.1.0 - magic-string: 0.30.19 + magic-string: 0.30.21 react-docgen-typescript: 2.4.0(typescript@5.8.3) vite: 7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) optionalDependencies: @@ -10273,15 +10035,10 @@ snapshots: '@jridgewell/source-map@0.3.11': dependencies: '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.30': - dependencies: - '@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 @@ -10309,8 +10066,8 @@ snapshots: '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.5.0 - '@emnapi/runtime': 1.5.0 + '@emnapi/core': 1.7.1 + '@emnapi/runtime': 1.7.1 '@tybys/wasm-util': 0.10.1 optional: true @@ -10378,7 +10135,7 @@ snapshots: proc-log: 3.0.0 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.7.2 + semver: 7.7.3 which: 3.0.1 transitivePeerDependencies: - bluebird @@ -10391,7 +10148,7 @@ snapshots: json-parse-even-better-errors: 3.0.2 normalize-package-data: 5.0.0 proc-log: 3.0.0 - semver: 7.7.2 + semver: 7.7.3 transitivePeerDependencies: - bluebird @@ -11021,13 +10778,13 @@ snapshots: '@react-router/dev@7.9.5(@react-router/serve@7.9.5(react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))(yaml@2.8.1)': dependencies: - '@babel/core': 7.28.3 - '@babel/generator': 7.28.3 - '@babel/parser': 7.28.3 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) - '@babel/preset-typescript': 7.27.1(@babel/core@7.28.3) - '@babel/traverse': 7.28.3 - '@babel/types': 7.28.2 + '@babel/core': 7.28.4 + '@babel/generator': 7.28.5 + '@babel/parser': 7.28.5 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.4) + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.5 '@npmcli/package-json': 4.0.1 '@react-router/node': 7.9.5(react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) '@remix-run/node-fetch-server': 0.9.0 @@ -11046,7 +10803,7 @@ snapshots: prettier: 3.7.4 react-refresh: 0.14.2 react-router: 7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - semver: 7.7.2 + semver: 7.7.3 tinyglobby: 0.2.15 valibot: 1.2.0(typescript@5.8.3) vite: 7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) @@ -11261,7 +11018,7 @@ snapshots: '@sentry/bundler-plugin-core@4.6.0': dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.4 '@sentry/babel-plugin-component-annotate': 4.6.0 '@sentry/cli': 2.58.2 dotenv: 16.6.1 @@ -11593,10 +11350,10 @@ snapshots: es-module-lexer: 1.7.0 fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)) html-webpack-plugin: 5.6.4(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)) - magic-string: 0.30.19 + magic-string: 0.30.21 path-browserify: 1.0.1 process: 0.11.10 - semver: 7.7.2 + semver: 7.7.3 storybook: 8.6.14(prettier@3.7.4) style-loader: 3.3.4(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)) terser-webpack-plugin: 5.3.14(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)) @@ -11636,7 +11393,7 @@ snapshots: jsdoc-type-pratt-parser: 4.8.0 process: 0.11.10 recast: 0.23.11 - semver: 7.7.2 + semver: 7.7.3 util: 0.12.5 ws: 8.18.3 optionalDependencies: @@ -11685,12 +11442,12 @@ snapshots: '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)) '@types/semver': 7.7.1 find-up: 5.0.0 - magic-string: 0.30.19 + magic-string: 0.30.21 react: 18.3.1 react-docgen: 7.1.1 react-dom: 18.3.1(react@18.3.1) resolve: 1.22.10 - semver: 7.7.2 + semver: 7.7.3 storybook: 8.6.14(prettier@3.7.4) tsconfig-paths: 4.2.0 webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0) @@ -11741,7 +11498,7 @@ snapshots: '@storybook/builder-vite': 9.1.10(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)))(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) '@storybook/react': 9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.8.3) find-up: 7.0.0 - magic-string: 0.30.19 + magic-string: 0.30.21 react: 18.3.1 react-docgen: 8.0.1 react-dom: 18.3.1(react@18.3.1) @@ -12210,24 +11967,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 '@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.28.4 + '@babel/types': 7.28.5 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 '@types/body-parser@1.19.6': dependencies: @@ -12491,15 +12248,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.44.0(typescript@5.8.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.45.0(typescript@5.8.3) - '@typescript-eslint/types': 8.45.0 - debug: 4.4.3 - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/project-service@8.48.1(typescript@5.8.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.48.1(typescript@5.8.3) @@ -12509,46 +12257,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.49.0(typescript@5.8.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.8.3) - '@typescript-eslint/types': 8.49.0 - debug: 4.4.3 - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@8.44.0': - dependencies: - '@typescript-eslint/types': 8.44.0 - '@typescript-eslint/visitor-keys': 8.44.0 - '@typescript-eslint/scope-manager@8.48.1': dependencies: '@typescript-eslint/types': 8.48.1 '@typescript-eslint/visitor-keys': 8.48.1 - '@typescript-eslint/scope-manager@8.49.0': - dependencies: - '@typescript-eslint/types': 8.49.0 - '@typescript-eslint/visitor-keys': 8.49.0 - - '@typescript-eslint/tsconfig-utils@8.44.0(typescript@5.8.3)': - dependencies: - typescript: 5.8.3 - - '@typescript-eslint/tsconfig-utils@8.45.0(typescript@5.8.3)': - dependencies: - typescript: 5.8.3 - '@typescript-eslint/tsconfig-utils@8.48.1(typescript@5.8.3)': dependencies: typescript: 5.8.3 - '@typescript-eslint/tsconfig-utils@8.49.0(typescript@5.8.3)': - dependencies: - typescript: 5.8.3 - '@typescript-eslint/type-utils@8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 8.48.1 @@ -12561,30 +12278,8 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.44.0': {} - - '@typescript-eslint/types@8.45.0': {} - '@typescript-eslint/types@8.48.1': {} - '@typescript-eslint/types@8.49.0': {} - - '@typescript-eslint/typescript-estree@8.44.0(typescript@5.8.3)': - dependencies: - '@typescript-eslint/project-service': 8.44.0(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.44.0(typescript@5.8.3) - '@typescript-eslint/types': 8.44.0 - '@typescript-eslint/visitor-keys': 8.44.0 - debug: 4.4.3 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/typescript-estree@8.48.1(typescript@5.8.3)': dependencies: '@typescript-eslint/project-service': 8.48.1(typescript@5.8.3) @@ -12593,39 +12288,13 @@ snapshots: '@typescript-eslint/visitor-keys': 8.48.1 debug: 4.4.3 minimatch: 9.0.5 - semver: 7.7.2 - tinyglobby: 0.2.15 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@8.49.0(typescript@5.8.3)': - dependencies: - '@typescript-eslint/project-service': 8.49.0(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.8.3) - '@typescript-eslint/types': 8.49.0 - '@typescript-eslint/visitor-keys': 8.49.0 - debug: 4.4.3 - minimatch: 9.0.5 - semver: 7.7.2 + semver: 7.7.3 tinyglobby: 0.2.15 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.44.0(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.5.1)) - '@typescript-eslint/scope-manager': 8.44.0 - '@typescript-eslint/types': 8.44.0 - '@typescript-eslint/typescript-estree': 8.44.0(typescript@5.8.3) - eslint: 9.39.1(jiti@2.5.1) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/utils@8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.5.1)) @@ -12637,32 +12306,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.49.0(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.5.1)) - '@typescript-eslint/scope-manager': 8.49.0 - '@typescript-eslint/types': 8.49.0 - '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.8.3) - eslint: 9.39.1(jiti@2.5.1) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/visitor-keys@8.44.0': - dependencies: - '@typescript-eslint/types': 8.44.0 - eslint-visitor-keys: 4.2.1 - '@typescript-eslint/visitor-keys@8.48.1': dependencies: '@typescript-eslint/types': 8.48.1 eslint-visitor-keys: 4.2.1 - '@typescript-eslint/visitor-keys@8.49.0': - dependencies: - '@typescript-eslint/types': 8.49.0 - eslint-visitor-keys: 4.2.1 - '@ungap/structured-clone@1.3.0': {} '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -12726,8 +12374,8 @@ snapshots: '@vitest/eslint-plugin@1.5.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3)(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: - '@typescript-eslint/scope-manager': 8.49.0 - '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.48.1 + '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3) eslint: 9.39.1(jiti@2.5.1) optionalDependencies: typescript: 5.8.3 @@ -12763,7 +12411,7 @@ snapshots: dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 - magic-string: 0.30.19 + magic-string: 0.30.21 optionalDependencies: vite: 7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) @@ -13003,8 +12651,6 @@ snapshots: ansi-styles@5.2.0: {} - ansi-styles@6.2.1: {} - ansi-styles@6.2.3: {} ansis@4.2.0: {} @@ -13156,10 +12802,10 @@ snapshots: babel-dead-code-elimination@1.0.10: dependencies: - '@babel/core': 7.28.3 - '@babel/parser': 7.28.3 - '@babel/traverse': 7.28.3 - '@babel/types': 7.28.2 + '@babel/core': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color @@ -13583,7 +13229,7 @@ snapshots: postcss-modules-scope: 3.2.1(postcss@8.5.6) postcss-modules-values: 4.0.0(postcss@8.5.6) postcss-value-parser: 4.2.0 - semver: 7.7.2 + semver: 7.7.3 optionalDependencies: webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0) @@ -14071,7 +13717,7 @@ snapshots: eslint-compat-utils@0.5.1(eslint@9.39.1(jiti@2.5.1)): dependencies: eslint: 9.39.1(jiti@2.5.1) - semver: 7.7.2 + semver: 7.7.3 eslint-config-prettier@10.1.8(eslint@9.39.1(jiti@2.5.1)): dependencies: @@ -14079,7 +13725,7 @@ snapshots: eslint-import-context@0.1.9(unrs-resolver@1.11.1): dependencies: - get-tsconfig: 4.10.1 + get-tsconfig: 4.13.0 stable-hash-x: 0.2.0 optionalDependencies: unrs-resolver: 1.11.1 @@ -14097,7 +13743,7 @@ snapshots: debug: 4.4.3 eslint: 9.39.1(jiti@2.5.1) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) - get-tsconfig: 4.10.1 + get-tsconfig: 4.13.0 is-bun-module: 2.0.0 stable-hash-x: 0.2.0 tinyglobby: 0.2.15 @@ -14179,11 +13825,11 @@ snapshots: enhanced-resolve: 5.18.3 eslint: 9.39.1(jiti@2.5.1) eslint-plugin-es-x: 7.8.0(eslint@9.39.1(jiti@2.5.1)) - get-tsconfig: 4.10.1 + get-tsconfig: 4.13.0 globals: 15.15.0 globrex: 0.1.2 ignore: 5.3.2 - semver: 7.7.2 + semver: 7.7.3 ts-declaration-location: 1.0.7(typescript@5.8.3) transitivePeerDependencies: - typescript @@ -14195,8 +13841,8 @@ snapshots: eslint-plugin-react-hooks@7.0.1(eslint@9.39.1(jiti@2.5.1)): dependencies: - '@babel/core': 7.28.3 - '@babel/parser': 7.28.3 + '@babel/core': 7.28.4 + '@babel/parser': 7.28.5 eslint: 9.39.1(jiti@2.5.1) hermes-parser: 0.25.1 zod: 3.25.76 @@ -14232,7 +13878,7 @@ snapshots: eslint-plugin-storybook@10.1.4(eslint@9.39.1(jiti@2.5.1))(storybook@9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.8.3): dependencies: - '@typescript-eslint/utils': 8.44.0(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3) eslint: 9.39.1(jiti@2.5.1) storybook: 9.1.10(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) transitivePeerDependencies: @@ -14352,7 +13998,7 @@ snapshots: exit-hook@2.2.1: {} - expect-type@1.3.0: {} + expect-type@1.2.2: {} export-to-csv@1.4.0: {} @@ -14569,7 +14215,7 @@ snapshots: minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.7.2 + semver: 7.7.3 tapable: 2.3.0 typescript: 5.8.3 webpack: 5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0) @@ -14674,10 +14320,6 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.10.1: - dependencies: - resolve-pkg-maps: 1.0.0 - get-tsconfig@4.13.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -15069,7 +14711,7 @@ snapshots: is-bun-module@2.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 is-callable@1.2.7: {} @@ -15228,16 +14870,16 @@ snapshots: jscodeshift@17.3.0: dependencies: - '@babel/core': 7.28.3 - '@babel/parser': 7.28.3 - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.3) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.3) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.3) - '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.3) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.3) - '@babel/preset-flow': 7.27.1(@babel/core@7.28.3) - '@babel/preset-typescript': 7.27.1(@babel/core@7.28.3) - '@babel/register': 7.28.3(@babel/core@7.28.3) + '@babel/core': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.4) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.4) + '@babel/preset-flow': 7.27.1(@babel/core@7.28.4) + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.4) + '@babel/register': 7.28.3(@babel/core@7.28.4) flow-parser: 0.293.0 graceful-fs: 4.2.11 micromatch: 4.0.8 @@ -15407,7 +15049,7 @@ snapshots: ansi-escapes: 7.0.0 cli-cursor: 5.0.0 slice-ansi: 7.1.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 wrap-ansi: 9.0.0 logform@2.7.0: @@ -15451,10 +15093,6 @@ snapshots: lz-string@1.5.0: {} - magic-string@0.30.19: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -16090,44 +15728,12 @@ snapshots: neo-async@2.6.2: {} - next-themes@0.2.1(next@14.2.32(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - next: 14.2.32(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - next-themes@0.2.1(next@14.2.32(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: next: 14.2.32(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - next@14.2.32(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@next/env': 14.2.32 - '@swc/helpers': 0.5.5 - busboy: 1.6.0 - caniuse-lite: 1.0.30001743 - graceful-fs: 4.2.11 - postcss: 8.4.31 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(@babel/core@7.28.3)(babel-plugin-macros@3.1.0)(react@18.3.1) - optionalDependencies: - '@next/swc-darwin-arm64': 14.2.32 - '@next/swc-darwin-x64': 14.2.32 - '@next/swc-linux-arm64-gnu': 14.2.32 - '@next/swc-linux-arm64-musl': 14.2.32 - '@next/swc-linux-x64-gnu': 14.2.32 - '@next/swc-linux-x64-musl': 14.2.32 - '@next/swc-win32-arm64-msvc': 14.2.32 - '@next/swc-win32-ia32-msvc': 14.2.32 - '@next/swc-win32-x64-msvc': 14.2.32 - '@opentelemetry/api': 1.9.0 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - next@14.2.32(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.32 @@ -16161,7 +15767,7 @@ snapshots: node-abi@3.75.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 node-abort-controller@3.1.1: {} @@ -16180,7 +15786,7 @@ snapshots: dependencies: hosted-git-info: 6.1.3 is-core-module: 2.16.1 - semver: 7.7.2 + semver: 7.7.3 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} @@ -16195,7 +15801,7 @@ snapshots: npm-install-checks@6.3.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 npm-normalize-package-bin@3.0.1: {} @@ -16203,7 +15809,7 @@ snapshots: dependencies: hosted-git-info: 6.1.3 proc-log: 3.0.0 - semver: 7.7.2 + semver: 7.7.3 validate-npm-package-name: 5.0.1 npm-pick-manifest@8.0.2: @@ -16211,7 +15817,7 @@ snapshots: npm-install-checks: 6.3.0 npm-normalize-package-bin: 3.0.1 npm-package-arg: 10.1.0 - semver: 7.7.2 + semver: 7.7.3 npm-run-path@4.0.1: dependencies: @@ -16853,7 +16459,7 @@ snapshots: dependencies: '@babel/core': 7.28.4 '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 '@types/doctrine': 0.0.9 @@ -16868,7 +16474,7 @@ snapshots: dependencies: '@babel/core': 7.28.4 '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 '@types/doctrine': 0.0.9 @@ -17366,8 +16972,6 @@ snapshots: semver@6.3.1: {} - semver@7.7.2: {} - semver@7.7.3: {} send@0.19.0: @@ -17511,7 +17115,7 @@ snapshots: slice-ansi@7.1.2: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 smooth-scroll-into-view-if-needed@2.0.2: @@ -17587,7 +17191,7 @@ snapshots: esbuild: 0.25.0 esbuild-register: 3.6.0(esbuild@0.25.0) recast: 0.23.11 - semver: 7.7.2 + semver: 7.7.3 ws: 8.18.3 optionalDependencies: prettier: 3.7.4 @@ -17619,12 +17223,12 @@ snapshots: dependencies: emoji-regex: 10.5.0 get-east-asian-width: 1.4.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 string-width@8.1.0: dependencies: get-east-asian-width: 1.4.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 string.prototype.includes@2.0.1: dependencies: @@ -17689,10 +17293,6 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.2.2 - strip-ansi@7.1.2: dependencies: ansi-regex: 6.2.2 @@ -17723,14 +17323,6 @@ snapshots: dependencies: inline-style-parser: 0.1.1 - styled-jsx@5.1.1(@babel/core@7.28.3)(babel-plugin-macros@3.1.0)(react@18.3.1): - dependencies: - client-only: 0.0.1 - react: 18.3.1 - optionalDependencies: - '@babel/core': 7.28.3 - babel-plugin-macros: 3.1.0 - styled-jsx@5.1.1(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react@18.3.1): dependencies: client-only: 0.0.1 @@ -17855,8 +17447,6 @@ snapshots: tinycolor2@1.6.0: {} - tinyexec@1.0.1: {} - tinyexec@1.0.2: {} tinyglobby@0.2.15: @@ -17954,7 +17544,7 @@ snapshots: rolldown: 1.0.0-beta.46 rolldown-plugin-dts: 0.17.8(rolldown@1.0.0-beta.46)(typescript@5.8.3) semver: 7.7.3 - tinyexec: 1.0.1 + tinyexec: 1.0.2 tinyglobby: 0.2.15 tree-kill: 1.2.2 unconfig: 7.3.3 @@ -18397,7 +17987,7 @@ snapshots: '@vitest/spy': 4.0.15 '@vitest/utils': 4.0.15 es-module-lexer: 1.7.0 - expect-type: 1.3.0 + expect-type: 1.2.2 magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 @@ -18599,9 +18189,9 @@ snapshots: wrap-ansi@9.0.0: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 7.2.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 write-file-atomic@5.0.1: dependencies: diff --git a/turbo.json b/turbo.json index 84b16c8483b..443c8fc7039 100644 --- a/turbo.json +++ b/turbo.json @@ -1,6 +1,6 @@ { "$schema": "https://turborepo.com/schema.json", - "globalDependencies": [".npmrc"], + "globalDependencies": [".npmrc", ".prettierrc", "eslint.config.mjs"], "globalEnv": [ "APP_VERSION", "DEV", @@ -53,12 +53,12 @@ }, "check:format": { "inputs": ["$TURBO_DEFAULT$"], - "outputs": [] + "outputs": ["node_modules/.cache/prettier/**"] }, "check:lint": { "dependsOn": ["^build"], "inputs": ["$TURBO_DEFAULT$", "!**/*.md"], - "outputs": [] + "outputs": ["node_modules/.cache/eslint/**"] }, "check:types": { "dependsOn": ["^build"], @@ -78,10 +78,13 @@ "dependsOn": ["fix:format", "fix:lint"] }, "fix:format": { - "cache": false + "inputs": ["$TURBO_DEFAULT$"], + "outputs": ["node_modules/.cache/prettier/**"] }, "fix:lint": { - "cache": false + "dependsOn": ["^build"], + "inputs": ["$TURBO_DEFAULT$", "!**/*.md"], + "outputs": ["node_modules/.cache/eslint/**"] }, "start": { "cache": false, From f8f764622ad8662c3d288cab3a474b55dbe222a0 Mon Sep 17 00:00:00 2001 From: sriramveeraghanta Date: Thu, 11 Dec 2025 14:14:07 +0530 Subject: [PATCH 021/266] fix: broken lock file --- pnpm-lock.yaml | 496 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 329 insertions(+), 167 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1d9f918ce0d..29cc63b8aa0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -129,7 +129,7 @@ importers: version: 0.1.3 '@vitest/eslint-plugin': specifier: 1.5.1 - version: 1.5.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3)(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) + version: 1.5.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3)(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.12.0)(jiti@2.5.1)(jsdom@26.1.0)(terser@5.43.1)(yaml@2.8.1)) eslint: specifier: 9.39.1 version: 9.39.1(jiti@2.5.1) @@ -249,7 +249,7 @@ importers: version: 9.1.1(mobx@6.12.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-themes: specifier: ^0.2.1 - version: 0.2.1(next@14.2.32(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 0.2.1(next@14.2.32(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: 'catalog:' version: 18.3.1 @@ -784,7 +784,7 @@ importers: version: 17.3.0 vitest: specifier: ^4.0.8 - version: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) + version: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.12.0)(jiti@2.5.1)(jsdom@26.1.0)(terser@5.43.1)(yaml@2.8.1) packages/constants: dependencies: @@ -1567,10 +1567,18 @@ packages: resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==} engines: {node: '>=6.9.0'} + '@babel/core@7.28.3': + resolution: {integrity: sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==} + engines: {node: '>=6.9.0'} + '@babel/core@7.28.4': resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} engines: {node: '>=6.9.0'} + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} + engines: {node: '>=6.9.0'} + '@babel/generator@7.28.5': resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} engines: {node: '>=6.9.0'} @@ -1650,11 +1658,6 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.28.4': - resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/parser@7.28.5': resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} engines: {node: '>=6.0.0'} @@ -1746,10 +1749,18 @@ packages: resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.28.3': + resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.28.4': resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} engines: {node: '>=6.9.0'} + '@babel/types@7.28.2': + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} + engines: {node: '>=6.9.0'} + '@babel/types@7.28.5': resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} @@ -1816,6 +1827,34 @@ packages: resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} engines: {node: '>=0.1.90'} + '@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'} + '@dabh/diagnostics@2.0.3': resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} @@ -1832,15 +1871,9 @@ packages: peerDependencies: '@noble/ciphers': ^1.0.0 - '@emnapi/core@1.5.0': - resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} - '@emnapi/core@1.7.1': resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} - '@emnapi/runtime@1.5.0': - resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} - '@emnapi/runtime@1.7.1': resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} @@ -4833,8 +4866,8 @@ packages: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} - caniuse-lite@1.0.30001743: - resolution: {integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==} + caniuse-lite@1.0.30001759: + resolution: {integrity: sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==} capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} @@ -5129,6 +5162,10 @@ packages: engines: {node: '>=4'} hasBin: true + cssstyle@4.6.0: + resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} + engines: {node: '>=18'} + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -6257,6 +6294,10 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -6584,11 +6625,11 @@ packages: resolution: {integrity: sha512-iZ8Bdb84lWRuGHamRXFyML07r21pcwBrLkHEuHgEY5UbCouBwv7ECknDRKzsQIXMiqpPymqtIf8TC/shYKB5rw==} engines: {node: '>=12.0.0'} - jsdom@25.0.1: - resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==} + jsdom@26.1.0: + resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} engines: {node: '>=18'} peerDependencies: - canvas: ^2.11.2 + canvas: ^3.0.0 peerDependenciesMeta: canvas: optional: true @@ -6776,6 +6817,9 @@ packages: lowlight@3.3.0: resolution: {integrity: sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.2.1: resolution: {integrity: sha512-r8LA6i4LP4EeWOhqBaZZjDWwehd1xUJPCJd9Sv300H0ZmcUER4+JPh7bqqZeqs1o5pgtgvXm+d9UGrB5zZGDiQ==} engines: {node: 20 || >=22} @@ -8238,9 +8282,6 @@ packages: rope-sequence@1.3.4: resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} - rrweb-cssom@0.7.1: - resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} - rrweb-cssom@0.8.0: resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} @@ -8631,6 +8672,9 @@ packages: peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} @@ -8700,9 +8744,6 @@ packages: tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - tinyexec@1.0.1: - resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} - tinyexec@1.0.2: resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} engines: {node: '>=18'} @@ -9493,7 +9534,7 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@apm-js-collab/code-transformer@0.8.2': {} @@ -9508,7 +9549,7 @@ snapshots: '@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.0.10(@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 @@ -9532,20 +9573,40 @@ snapshots: '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 '@babel/compat-data@7.28.4': {} + '@babel/core@7.28.3': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helpers': 7.26.10 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/core@7.28.4': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 + '@babel/generator': 7.28.5 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) '@babel/helpers': 7.26.10 - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.5 '@babel/template': 7.27.2 '@babel/traverse': 7.28.4 '@babel/types': 7.28.5 @@ -9560,8 +9621,8 @@ snapshots: '@babel/generator@7.28.3': dependencies: - '@babel/parser': 7.28.3 - '@babel/types': 7.28.2 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.30 jsesc: 3.1.0 @@ -9576,7 +9637,7 @@ snapshots: '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 '@babel/helper-compilation-targets@7.27.2': dependencies: @@ -9586,15 +9647,15 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.4)': + '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.3 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.3) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/traverse': 7.28.3 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -9603,7 +9664,7 @@ snapshots: '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - '@babel/traverse': 7.28.4 + '@babel/traverse': 7.28.3 '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color @@ -9615,6 +9676,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 @@ -9626,22 +9696,22 @@ snapshots: '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.4)': + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.3 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/traverse': 7.28.3 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.28.4 + '@babel/traverse': 7.28.3 '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color @@ -9657,110 +9727,106 @@ snapshots: '@babel/helpers@7.26.10': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 '@babel/parser@7.28.3': dependencies: - '@babel/types': 7.28.2 - - '@babel/parser@7.28.4': - dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 '@babel/parser@7.28.5': dependencies: '@babel/types': 7.28.5 - '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) + '@babel/core': 7.28.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.3) - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/core': 7.28.3 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.28.4)': + '@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) + '@babel/core': 7.28.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.4)': + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.3 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3) transitivePeerDependencies: - supports-color - '@babel/preset-flow@7.27.1(@babel/core@7.28.4)': + '@babel/preset-flow@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.3) - '@babel/preset-typescript@7.27.1(@babel/core@7.28.4)': + '@babel/preset-typescript@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.4) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.3) transitivePeerDependencies: - supports-color - '@babel/register@7.28.3(@babel/core@7.28.4)': + '@babel/register@7.28.3(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.3 clone-deep: 4.0.1 find-cache-dir: 2.1.0 make-dir: 2.1.0 @@ -9774,17 +9840,17 @@ snapshots: '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 - '@babel/traverse@7.28.4': + '@babel/traverse@7.28.3': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 + '@babel/generator': 7.28.5 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.3 + '@babel/parser': 7.28.5 '@babel/template': 7.27.2 - '@babel/types': 7.28.2 + '@babel/types': 7.28.5 debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -9792,11 +9858,11 @@ snapshots: '@babel/traverse@7.28.4': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 + '@babel/generator': 7.28.5 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.5 '@babel/template': 7.27.2 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -9806,11 +9872,6 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/types@7.28.4': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/types@7.28.5': dependencies: '@babel/helper-string-parser': 7.27.1 @@ -9901,6 +9962,31 @@ snapshots: '@colors/colors@1.6.0': {} + '@csstools/color-helpers@5.1.0': + optional: true + + '@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 + optional: true + + '@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 + optional: true + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + optional: true + + '@csstools/css-tokenizer@3.0.4': + optional: true + '@dabh/diagnostics@2.0.3': dependencies: colorspace: 1.1.4 @@ -9925,23 +10011,12 @@ snapshots: dependencies: '@noble/ciphers': 1.3.0 - '@emnapi/core@1.5.0': - dependencies: - '@emnapi/wasi-threads': 1.1.0 - tslib: 2.8.1 - optional: true - '@emnapi/core@1.7.1': dependencies: '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.5.0': - dependencies: - tslib: 2.8.1 - optional: true - '@emnapi/runtime@1.7.1': dependencies: tslib: 2.8.1 @@ -10271,7 +10346,7 @@ snapshots: '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: glob: 11.1.0 - magic-string: 0.30.19 + magic-string: 0.30.21 react-docgen-typescript: 2.4.0(typescript@5.8.3) vite: 7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) optionalDependencies: @@ -10292,7 +10367,7 @@ snapshots: '@jridgewell/source-map@0.3.11': dependencies: '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/sourcemap-codec@1.5.5': {} @@ -10328,8 +10403,8 @@ snapshots: '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.5.0 - '@emnapi/runtime': 1.5.0 + '@emnapi/core': 1.7.1 + '@emnapi/runtime': 1.7.1 '@tybys/wasm-util': 0.10.1 optional: true @@ -10410,7 +10485,7 @@ snapshots: json-parse-even-better-errors: 3.0.2 normalize-package-data: 5.0.0 proc-log: 3.0.0 - semver: 7.7.2 + semver: 7.7.3 transitivePeerDependencies: - bluebird @@ -11040,13 +11115,13 @@ snapshots: '@react-router/dev@7.9.5(@react-router/serve@7.9.5(react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))(yaml@2.8.1)': dependencies: - '@babel/core': 7.28.4 - '@babel/generator': 7.28.5 - '@babel/parser': 7.28.5 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) - '@babel/preset-typescript': 7.27.1(@babel/core@7.28.4) - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.5 + '@babel/core': 7.28.3 + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.3 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.3) + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 '@npmcli/package-json': 4.0.1 '@react-router/node': 7.9.5(react-router@7.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) '@remix-run/node-fetch-server': 0.9.0 @@ -11280,7 +11355,7 @@ snapshots: '@sentry/bundler-plugin-core@4.6.0': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.3 '@sentry/babel-plugin-component-annotate': 4.6.0 '@sentry/cli': 2.58.2 dotenv: 16.6.1 @@ -11704,7 +11779,7 @@ snapshots: '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)) '@types/semver': 7.7.1 find-up: 5.0.0 - magic-string: 0.30.19 + magic-string: 0.30.21 react: 18.3.1 react-docgen: 7.1.1 react-dom: 18.3.1(react@18.3.1) @@ -12229,24 +12304,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 '@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.28.4 + '@babel/types': 7.28.5 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 '@types/body-parser@1.19.6': dependencies: @@ -12546,6 +12621,10 @@ snapshots: dependencies: typescript: 5.8.3 + '@typescript-eslint/tsconfig-utils@8.49.0(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + '@typescript-eslint/type-utils@8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 8.48.1 @@ -12577,6 +12656,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.49.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/project-service': 8.49.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.8.3) + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/visitor-keys': 8.49.0 + debug: 4.4.3 + minimatch: 9.0.5 + semver: 7.7.3 + tinyglobby: 0.2.15 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.5.1)) @@ -12588,6 +12682,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.49.0(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.5.1)) + '@typescript-eslint/scope-manager': 8.49.0 + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.8.3) + eslint: 9.39.1(jiti@2.5.1) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@8.48.1': dependencies: '@typescript-eslint/types': 8.48.1 @@ -12659,14 +12764,14 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitest/eslint-plugin@1.5.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3)(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))': + '@vitest/eslint-plugin@1.5.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3)(vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.12.0)(jiti@2.5.1)(jsdom@26.1.0)(terser@5.43.1)(yaml@2.8.1))': dependencies: - '@typescript-eslint/scope-manager': 8.48.1 - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.49.0 + '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@2.5.1))(typescript@5.8.3) eslint: 9.39.1(jiti@2.5.1) optionalDependencies: typescript: 5.8.3 - vitest: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) + vitest: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.12.0)(jiti@2.5.1)(jsdom@26.1.0)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -12698,7 +12803,7 @@ snapshots: dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 - magic-string: 0.30.19 + magic-string: 0.30.21 optionalDependencies: vite: 7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) @@ -13069,7 +13174,7 @@ snapshots: autoprefixer@10.4.21(postcss@8.5.6): dependencies: browserslist: 4.26.2 - caniuse-lite: 1.0.30001743 + caniuse-lite: 1.0.30001759 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -13094,9 +13199,9 @@ snapshots: babel-dead-code-elimination@1.0.10: dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.3 '@babel/parser': 7.28.5 - '@babel/traverse': 7.28.4 + '@babel/traverse': 7.28.3 '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color @@ -13191,7 +13296,7 @@ snapshots: browserslist@4.26.2: dependencies: baseline-browser-mapping: 2.8.4 - caniuse-lite: 1.0.30001743 + caniuse-lite: 1.0.30001759 electron-to-chromium: 1.5.218 node-releases: 2.0.21 update-browserslist-db: 1.1.3(browserslist@4.26.2) @@ -13241,7 +13346,7 @@ snapshots: camelcase@7.0.1: {} - caniuse-lite@1.0.30001743: {} + caniuse-lite@1.0.30001759: {} capital-case@1.0.4: dependencies: @@ -13552,6 +13657,12 @@ snapshots: cssesc@3.0.0: {} + cssstyle@4.6.0: + dependencies: + '@asamuzakjp/css-color': 3.2.0 + rrweb-cssom: 0.8.0 + optional: true + csstype@3.1.3: {} d3-array@3.2.4: @@ -14019,7 +14130,7 @@ snapshots: eslint-import-context@0.1.9(unrs-resolver@1.11.1): dependencies: - get-tsconfig: 4.10.1 + get-tsconfig: 4.13.0 stable-hash-x: 0.2.0 optionalDependencies: unrs-resolver: 1.11.1 @@ -14119,7 +14230,7 @@ snapshots: enhanced-resolve: 5.18.3 eslint: 9.39.1(jiti@2.5.1) eslint-plugin-es-x: 7.8.0(eslint@9.39.1(jiti@2.5.1)) - get-tsconfig: 4.13.0 + get-tsconfig: 4.10.1 globals: 15.15.0 globrex: 0.1.2 ignore: 5.3.2 @@ -14135,8 +14246,8 @@ snapshots: eslint-plugin-react-hooks@7.0.1(eslint@9.39.1(jiti@2.5.1)): dependencies: - '@babel/core': 7.28.4 - '@babel/parser': 7.28.5 + '@babel/core': 7.28.3 + '@babel/parser': 7.28.3 eslint: 9.39.1(jiti@2.5.1) hermes-parser: 0.25.1 zod: 3.25.76 @@ -14881,6 +14992,14 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + optional: true + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 @@ -15198,16 +15317,16 @@ snapshots: jscodeshift@17.3.0: dependencies: - '@babel/core': 7.28.4 - '@babel/parser': 7.28.5 - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.4) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.4) - '@babel/preset-flow': 7.27.1(@babel/core@7.28.4) - '@babel/preset-typescript': 7.27.1(@babel/core@7.28.4) - '@babel/register': 7.28.3(@babel/core@7.28.4) + '@babel/core': 7.28.3 + '@babel/parser': 7.28.3 + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.3) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.3) + '@babel/preset-flow': 7.27.1(@babel/core@7.28.3) + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.3) + '@babel/register': 7.28.3(@babel/core@7.28.3) flow-parser: 0.293.0 graceful-fs: 4.2.11 micromatch: 4.0.8 @@ -15221,19 +15340,18 @@ snapshots: jsdoc-type-pratt-parser@4.8.0: {} - jsdom@25.0.1: + jsdom@26.1.0: dependencies: cssstyle: 4.6.0 data-urls: 5.0.0 decimal.js: 10.6.0 - form-data: 4.0.4 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.21 parse5: 7.3.0 - rrweb-cssom: 0.7.1 + rrweb-cssom: 0.8.0 saxes: 6.0.0 symbol-tree: 3.2.4 tough-cookie: 5.1.2 @@ -15406,7 +15524,7 @@ snapshots: ansi-escapes: 7.0.0 cli-cursor: 5.0.0 slice-ansi: 7.1.2 - strip-ansi: 7.1.2 + strip-ansi: 7.1.0 wrap-ansi: 9.0.0 logform@2.7.0: @@ -15436,6 +15554,9 @@ snapshots: devlop: 1.1.0 highlight.js: 11.11.1 + lru-cache@10.4.3: + optional: true + lru-cache@11.2.1: {} lru-cache@5.1.1: @@ -16089,18 +16210,50 @@ snapshots: neo-async@2.6.2: {} + next-themes@0.2.1(next@14.2.32(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + next: 14.2.32(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + next-themes@0.2.1(next@14.2.32(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: next: 14.2.32(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + next@14.2.32(@babel/core@7.28.3)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@next/env': 14.2.32 + '@swc/helpers': 0.5.5 + busboy: 1.6.0 + caniuse-lite: 1.0.30001759 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.28.3)(babel-plugin-macros@3.1.0)(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 14.2.32 + '@next/swc-darwin-x64': 14.2.32 + '@next/swc-linux-arm64-gnu': 14.2.32 + '@next/swc-linux-arm64-musl': 14.2.32 + '@next/swc-linux-x64-gnu': 14.2.32 + '@next/swc-linux-x64-musl': 14.2.32 + '@next/swc-win32-arm64-msvc': 14.2.32 + '@next/swc-win32-ia32-msvc': 14.2.32 + '@next/swc-win32-x64-msvc': 14.2.32 + '@opentelemetry/api': 1.9.0 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + next@14.2.32(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.32 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001743 + caniuse-lite: 1.0.30001759 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -17273,9 +17426,6 @@ snapshots: rope-sequence@1.3.4: {} - rrweb-cssom@0.7.1: - optional: true - rrweb-cssom@0.8.0: optional: true @@ -17715,6 +17865,14 @@ snapshots: dependencies: inline-style-parser: 0.1.1 + styled-jsx@5.1.1(@babel/core@7.28.3)(babel-plugin-macros@3.1.0)(react@18.3.1): + dependencies: + client-only: 0.0.1 + react: 18.3.1 + optionalDependencies: + '@babel/core': 7.28.3 + babel-plugin-macros: 3.1.0 + styled-jsx@5.1.1(@babel/core@7.28.4)(babel-plugin-macros@3.1.0)(react@18.3.1): dependencies: client-only: 0.0.1 @@ -17761,6 +17919,9 @@ snapshots: react: 18.3.1 use-sync-external-store: 1.5.0(react@18.3.1) + symbol-tree@3.2.4: + optional: true + tabbable@6.2.0: {} tailwind-merge@2.6.0: {} @@ -17839,8 +18000,6 @@ snapshots: tinycolor2@1.6.0: {} - tinyexec@1.0.1: {} - tinyexec@1.0.2: {} tinyglobby@0.2.15: @@ -17956,7 +18115,7 @@ snapshots: rolldown: 1.0.0-beta.46 rolldown-plugin-dts: 0.17.8(rolldown@1.0.0-beta.46)(typescript@5.8.3) semver: 7.7.3 - tinyexec: 1.0.1 + tinyexec: 1.0.2 tinyglobby: 0.2.15 tree-kill: 1.2.2 unconfig: 7.3.3 @@ -18389,7 +18548,7 @@ snapshots: terser: 5.43.1 yaml: 2.8.1 - vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1): + vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.12.0)(jiti@2.5.1)(jsdom@26.1.0)(terser@5.43.1)(yaml@2.8.1): dependencies: '@vitest/expect': 4.0.15 '@vitest/mocker': 4.0.15(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) @@ -18414,7 +18573,7 @@ snapshots: optionalDependencies: '@opentelemetry/api': 1.9.0 '@types/node': 22.12.0 - jsdom: 25.0.1 + jsdom: 26.1.0 transitivePeerDependencies: - jiti - less @@ -18450,6 +18609,9 @@ snapshots: webidl-conversions@3.0.1: {} + webidl-conversions@7.0.0: + optional: true + webpack-dev-middleware@6.1.3(webpack@5.101.3(@swc/core@1.13.5(@swc/helpers@0.5.17))(esbuild@0.25.0)): dependencies: colorette: 2.0.20 From 8e518966c2a0c9c0ecf10e829721f8c4772d6353 Mon Sep 17 00:00:00 2001 From: pushya22 <130810100+pushya22@users.noreply.github.com> Date: Thu, 11 Dec 2025 14:40:24 +0530 Subject: [PATCH 022/266] chore: add Plane sync label to github templates #8303 Co-authored-by: Pushya Mitra Thiruvooru --- .github/ISSUE_TEMPLATE/--bug-report.yaml | 2 +- .github/ISSUE_TEMPLATE/--feature-request.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/--bug-report.yaml b/.github/ISSUE_TEMPLATE/--bug-report.yaml index ec03769295d..277a3bdfa89 100644 --- a/.github/ISSUE_TEMPLATE/--bug-report.yaml +++ b/.github/ISSUE_TEMPLATE/--bug-report.yaml @@ -1,7 +1,7 @@ name: Bug report description: Create a bug report to help us improve Plane title: "[bug]: " -labels: [🐛bug] +labels: [🐛bug, plane] assignees: [vihar, pushya22] body: - type: markdown diff --git a/.github/ISSUE_TEMPLATE/--feature-request.yaml b/.github/ISSUE_TEMPLATE/--feature-request.yaml index 390c95aaac6..c2bd609c047 100644 --- a/.github/ISSUE_TEMPLATE/--feature-request.yaml +++ b/.github/ISSUE_TEMPLATE/--feature-request.yaml @@ -1,7 +1,7 @@ name: Feature request description: Suggest a feature to improve Plane title: "[feature]: " -labels: [✨feature] +labels: [✨feature, plane] assignees: [vihar, pushya22] body: - type: markdown From 906c1b51bb7e4fd1f38ed8e8ba2e0aa9196abefb Mon Sep 17 00:00:00 2001 From: b-saikrishnakanth <130811169+b-saikrishnakanth@users.noreply.github.com> Date: Thu, 11 Dec 2025 17:02:20 +0530 Subject: [PATCH 023/266] [WEB-5624] chore: added webhook translations #8312 --- .../core/components/exporter/export-form.tsx | 121 +++++++++--------- packages/i18n/src/locales/cs/empty-state.ts | 5 + packages/i18n/src/locales/de/empty-state.ts | 5 + packages/i18n/src/locales/en/empty-state.ts | 5 + packages/i18n/src/locales/es/empty-state.ts | 5 + packages/i18n/src/locales/fr/empty-state.ts | 6 + packages/i18n/src/locales/id/empty-state.ts | 5 + packages/i18n/src/locales/it/empty-state.ts | 5 + packages/i18n/src/locales/ja/empty-state.ts | 5 + packages/i18n/src/locales/ko/empty-state.ts | 5 + packages/i18n/src/locales/pl/empty-state.ts | 5 + .../i18n/src/locales/pt-BR/empty-state.ts | 5 + packages/i18n/src/locales/ro/empty-state.ts | 5 + packages/i18n/src/locales/ru/empty-state.ts | 5 + packages/i18n/src/locales/sk/empty-state.ts | 5 + .../i18n/src/locales/tr-TR/empty-state.ts | 5 + packages/i18n/src/locales/ua/empty-state.ts | 5 + .../i18n/src/locales/vi-VN/empty-state.ts | 5 + .../i18n/src/locales/zh-CN/empty-state.ts | 5 + .../i18n/src/locales/zh-TW/empty-state.ts | 5 + 20 files changed, 159 insertions(+), 58 deletions(-) diff --git a/apps/web/core/components/exporter/export-form.tsx b/apps/web/core/components/exporter/export-form.tsx index fe6fa7afc9f..941d7b46643 100644 --- a/apps/web/core/components/exporter/export-form.tsx +++ b/apps/web/core/components/exporter/export-form.tsx @@ -2,24 +2,24 @@ import { useState } from "react"; import { intersection } from "lodash-es"; import { observer } from "mobx-react"; import { Controller, useForm } from "react-hook-form"; -import { Info } from "lucide-react"; +// import { Info } from "lucide-react"; import { EUserPermissions, EUserPermissionsLevel, EXPORTERS_LIST, - ISSUE_DISPLAY_FILTERS_BY_PAGE, + // ISSUE_DISPLAY_FILTERS_BY_PAGE, WORKSPACE_SETTINGS_TRACKER_EVENTS, WORKSPACE_SETTINGS_TRACKER_ELEMENTS, } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { Button } from "@plane/propel/button"; import { TOAST_TYPE, setToast } from "@plane/propel/toast"; -import { Tooltip } from "@plane/propel/tooltip"; -import { EIssuesStoreType } from "@plane/types"; +// import { Tooltip } from "@plane/propel/tooltip"; +// import { EIssuesStoreType } from "@plane/types"; import type { TWorkItemFilterExpression } from "@plane/types"; import { CustomSearchSelect, CustomSelect } from "@plane/ui"; -import { WorkspaceLevelWorkItemFiltersHOC } from "@/components/work-item-filters/filters-hoc/workspace-level"; -import { WorkItemFiltersRow } from "@/components/work-item-filters/filters-row"; +// import { WorkspaceLevelWorkItemFiltersHOC } from "@/components/work-item-filters/filters-hoc/workspace-level"; +// import { WorkItemFiltersRow } from "@/components/work-item-filters/filters-row"; import { captureError, captureSuccess } from "@/helpers/event-tracker.helper"; import { useProject } from "@/hooks/store/use-project"; import { useUser, useUserPermissions } from "@/hooks/store/user"; @@ -37,15 +37,15 @@ type FormData = { filters: TWorkItemFilterExpression; }; -const initialWorkItemFilters = { - richFilters: {}, - displayFilters: {}, - displayProperties: {}, - kanbanFilters: { - group_by: [], - sub_group_by: [], - }, -}; +// const initialWorkItemFilters = { +// richFilters: {}, +// displayFilters: {}, +// displayProperties: {}, +// kanbanFilters: { +// group_by: [], +// sub_group_by: [], +// }, +// }; const projectExportService = new ProjectExportService(); @@ -101,52 +101,57 @@ export const ExportForm = observer(function ExportForm(props: Props) { multiple: formData.project.length > 1, rich_filters: formData.filters, }; - await projectExportService - .csvExport(workspaceSlug, payload) - .then(() => { - mutateServices(); - setExportLoading(false); - captureSuccess({ - eventName: WORKSPACE_SETTINGS_TRACKER_EVENTS.csv_exported, - payload: { - provider: formData.provider.provider, - }, - }); - setToast({ - type: TOAST_TYPE.SUCCESS, - title: t("workspace_settings.settings.exports.modal.toasts.success.title"), - message: t("workspace_settings.settings.exports.modal.toasts.success.message", { - entity: - formData.provider.provider === "csv" - ? "CSV" - : formData.provider.provider === "xlsx" - ? "Excel" - : formData.provider.provider === "json" - ? "JSON" - : "", - }), - }); - }) - .catch((error) => { - setExportLoading(false); - captureError({ - eventName: WORKSPACE_SETTINGS_TRACKER_EVENTS.csv_exported, - payload: { - provider: formData.provider.provider, - }, - error: error as Error, - }); - setToast({ - type: TOAST_TYPE.ERROR, - title: t("error"), - message: t("workspace_settings.settings.exports.modal.toasts.error.message"), - }); + try { + await projectExportService.csvExport(workspaceSlug, payload); + mutateServices(); + setExportLoading(false); + captureSuccess({ + eventName: WORKSPACE_SETTINGS_TRACKER_EVENTS.csv_exported, + payload: { + provider: formData.provider.provider, + }, + }); + setToast({ + type: TOAST_TYPE.SUCCESS, + title: t("workspace_settings.settings.exports.modal.toasts.success.title"), + message: t("workspace_settings.settings.exports.modal.toasts.success.message", { + entity: + formData.provider.provider === "csv" + ? "CSV" + : formData.provider.provider === "xlsx" + ? "Excel" + : formData.provider.provider === "json" + ? "JSON" + : "", + }), + }); + } catch (error) { + setExportLoading(false); + captureError({ + eventName: WORKSPACE_SETTINGS_TRACKER_EVENTS.csv_exported, + payload: { + provider: formData.provider.provider, + }, + error: error as Error, }); + setToast({ + type: TOAST_TYPE.ERROR, + title: t("error"), + message: t("workspace_settings.settings.exports.modal.toasts.error.message"), + }); + } + } else { + setExportLoading(false); } } return ( - + { + void handleSubmit(ExportCSVToMail)(e); + }} + className="flex flex-col gap-4 mt-4" + >
{/* Project Selector */}
@@ -210,7 +215,7 @@ export const ExportForm = observer(function ExportForm(props: Props) {
{/* Rich Filters */} -
+ {/*
{t("common.filters")}
)} /> -
+
*/}
-
+
If you have a preferred AI models vendor, please get in{" "} diff --git a/apps/admin/app/(all)/(dashboard)/ai/page.tsx b/apps/admin/app/(all)/(dashboard)/ai/page.tsx index ebdf40528b1..04a440fcf49 100644 --- a/apps/admin/app/(all)/(dashboard)/ai/page.tsx +++ b/apps/admin/app/(all)/(dashboard)/ai/page.tsx @@ -16,9 +16,9 @@ const InstanceAIPage = observer(function InstanceAIPage(_props: Route.ComponentP return ( <>
-
-
AI features for all your workspaces
-
+
+
AI features for all your workspaces
+
Configure your AI API credentials so Plane AI features are turned on for all your workspaces.
diff --git a/apps/admin/app/(all)/(dashboard)/authentication/gitea/form.tsx b/apps/admin/app/(all)/(dashboard)/authentication/gitea/form.tsx index 15b97b5880e..250c4512505 100644 --- a/apps/admin/app/(all)/(dashboard)/authentication/gitea/form.tsx +++ b/apps/admin/app/(all)/(dashboard)/authentication/gitea/form.tsx @@ -4,10 +4,9 @@ import Link from "next/link"; import { useForm } from "react-hook-form"; // plane internal packages import { API_BASE_URL } from "@plane/constants"; +import { Button, getButtonStyling } from "@plane/propel/button"; import { TOAST_TYPE, setToast } from "@plane/propel/toast"; import type { IFormattedInstanceConfiguration, TInstanceGiteaAuthenticationConfigurationKeys } from "@plane/types"; -import { Button, getButtonStyling } from "@plane/ui"; -import { cn } from "@plane/utils"; // components import { CodeBlock } from "@/components/common/code-block"; import { ConfirmDiscardModal } from "@/components/common/confirm-discard-modal"; @@ -69,7 +68,7 @@ export function InstanceGiteaConfigForm(props: Props) { tabIndex={-1} href="https://gitea.com/user/settings/applications" target="_blank" - className="text-custom-primary-100 hover:underline" + className="text-accent-primary hover:underline" rel="noreferrer" > Gitea OAuth application settings. @@ -91,7 +90,7 @@ export function InstanceGiteaConfigForm(props: Props) { tabIndex={-1} href="https://gitea.com/user/settings/applications" target="_blank" - className="text-custom-primary-100 hover:underline" + className="text-accent-primary hover:underline" rel="noreferrer" > Gitea OAuth application settings. @@ -117,7 +116,7 @@ export function InstanceGiteaConfigForm(props: Props) { tabIndex={-1} href={`${control._formValues.GITEA_HOST || "https://gitea.com"}/user/settings/applications`} target="_blank" - className="text-custom-primary-100 hover:underline" + className="text-accent-primary hover:underline" rel="noreferrer" > here. @@ -163,7 +162,7 @@ export function InstanceGiteaConfigForm(props: Props) {
-
Gitea-provided details for Plane
+
Gitea-provided details for Plane
{GITEA_FORM_FIELDS.map((field) => (
- - + Go back
-
-
Plane-provided details for Gitea
+
+
Plane-provided details for Gitea
{GITEA_SERVICE_FIELD.map((field) => ( ))} diff --git a/apps/admin/app/(all)/(dashboard)/authentication/gitea/page.tsx b/apps/admin/app/(all)/(dashboard)/authentication/gitea/page.tsx index 1838cd5b82c..6dd90a2d188 100644 --- a/apps/admin/app/(all)/(dashboard)/authentication/gitea/page.tsx +++ b/apps/admin/app/(all)/(dashboard)/authentication/gitea/page.tsx @@ -58,7 +58,7 @@ const InstanceGiteaAuthenticationPage = observer(function InstanceGiteaAuthentic return ( <>
-
+
GitHub OAuth application settings. @@ -82,7 +82,7 @@ export function InstanceGithubConfigForm(props: Props) { tabIndex={-1} href="https://github.com/settings/applications/new" target="_blank" - className="text-custom-primary-100 hover:underline" + className="text-accent-primary hover:underline" rel="noreferrer" > GitHub OAuth application settings. @@ -116,7 +116,7 @@ export function InstanceGithubConfigForm(props: Props) { tabIndex={-1} href="https://github.com/settings/applications/new" target="_blank" - className="text-custom-primary-100 hover:underline" + className="text-accent-primary hover:underline" rel="noreferrer" > here. @@ -139,7 +139,7 @@ export function InstanceGithubConfigForm(props: Props) { tabIndex={-1} href="https://github.com/settings/applications/new" target="_blank" - className="text-custom-primary-100 hover:underline" + className="text-accent-primary hover:underline" rel="noreferrer" > here. @@ -185,7 +185,7 @@ export function InstanceGithubConfigForm(props: Props) {
-
GitHub-provided details for Plane
+
GitHub-provided details for Plane
{GITHUB_FORM_FIELDS.map((field) => (
- - + Go back
-
Plane-provided details for GitHub
+
Plane-provided details for GitHub
{/* common service details */} -
+
{GITHUB_COMMON_SERVICE_DETAILS.map((field) => ( ))} @@ -227,11 +229,11 @@ export function InstanceGithubConfigForm(props: Props) { {/* web service details */}
-
+
Web
-
+
{GITHUB_SERVICE_DETAILS.map((field) => ( ))} diff --git a/apps/admin/app/(all)/(dashboard)/authentication/github/page.tsx b/apps/admin/app/(all)/(dashboard)/authentication/github/page.tsx index 4fe3c461124..438bfc9f94b 100644 --- a/apps/admin/app/(all)/(dashboard)/authentication/github/page.tsx +++ b/apps/admin/app/(all)/(dashboard)/authentication/github/page.tsx @@ -67,7 +67,7 @@ const InstanceGithubAuthenticationPage = observer(function InstanceGithubAuthent return ( <>
-
+
GitLab OAuth application settings @@ -94,7 +94,7 @@ export function InstanceGitlabConfigForm(props: Props) { tabIndex={-1} href="https://docs.gitlab.com/ee/integration/oauth_provider.html" target="_blank" - className="text-custom-primary-100 hover:underline" + className="text-accent-primary hover:underline" rel="noreferrer" > GitLab OAuth application settings @@ -120,7 +120,7 @@ export function InstanceGitlabConfigForm(props: Props) { tabIndex={-1} href="https://docs.gitlab.com/ee/integration/oauth_provider.html" target="_blank" - className="text-custom-primary-100 hover:underline" + className="text-accent-primary hover:underline" rel="noreferrer" > GitLab OAuth application @@ -167,7 +167,7 @@ export function InstanceGitlabConfigForm(props: Props) {
-
GitLab-provided details for Plane
+
GitLab-provided details for Plane
{GITLAB_FORM_FIELDS.map((field) => (
- - + Go back
-
-
Plane-provided details for GitLab
+
+
Plane-provided details for GitLab
{GITLAB_SERVICE_FIELD.map((field) => ( ))} diff --git a/apps/admin/app/(all)/(dashboard)/authentication/gitlab/page.tsx b/apps/admin/app/(all)/(dashboard)/authentication/gitlab/page.tsx index ba421e04c48..4a09927346e 100644 --- a/apps/admin/app/(all)/(dashboard)/authentication/gitlab/page.tsx +++ b/apps/admin/app/(all)/(dashboard)/authentication/gitlab/page.tsx @@ -58,7 +58,7 @@ const InstanceGitlabAuthenticationPage = observer(function InstanceGitlabAuthent return ( <>
-
+
Learn more @@ -80,7 +80,7 @@ export function InstanceGoogleConfigForm(props: Props) { tabIndex={-1} href="https://developers.google.com/identity/oauth2/web/guides/get-google-api-clientid" target="_blank" - className="text-custom-primary-100 hover:underline" + className="text-accent-primary hover:underline" rel="noreferrer" > Learn more @@ -105,7 +105,7 @@ export function InstanceGoogleConfigForm(props: Props) { here. @@ -127,7 +127,7 @@ export function InstanceGoogleConfigForm(props: Props) { here. @@ -172,7 +172,7 @@ export function InstanceGoogleConfigForm(props: Props) {
-
Google-provided details for Plane
+
Google-provided details for Plane
{GOOGLE_FORM_FIELDS.map((field) => (
- - + Go back
-
Plane-provided details for Google
+
Plane-provided details for Google
{/* common service details */} -
+
{GOOGLE_COMMON_SERVICE_DETAILS.map((field) => ( ))} @@ -214,11 +216,11 @@ export function InstanceGoogleConfigForm(props: Props) { {/* web service details */}
-
+
Web
-
+
{GOOGLE_SERVICE_DETAILS.map((field) => ( ))} diff --git a/apps/admin/app/(all)/(dashboard)/authentication/google/page.tsx b/apps/admin/app/(all)/(dashboard)/authentication/google/page.tsx index c99c5978772..8089fcd6409 100644 --- a/apps/admin/app/(all)/(dashboard)/authentication/google/page.tsx +++ b/apps/admin/app/(all)/(dashboard)/authentication/google/page.tsx @@ -58,7 +58,7 @@ const InstanceGoogleAuthenticationPage = observer(function InstanceGoogleAuthent return ( <>
-
+
-
-
Manage authentication modes for your instance
-
+
+
Manage authentication modes for your instance
+
Configure authentication modes for your team and restrict sign-ups to be invite only.
{formattedConfig ? (
-
+
-
Allow anyone to sign up even without an invite
-
+
Allow anyone to sign up even without an invite
+
Toggling this off will only let users sign up when they are invited.
@@ -92,7 +92,7 @@ const InstanceAuthenticationPage = observer(function InstanceAuthenticationPage(
-
Available authentication modes
+
Available authentication modes
) : ( diff --git a/apps/admin/app/(all)/(dashboard)/email/email-config-form.tsx b/apps/admin/app/(all)/(dashboard)/email/email-config-form.tsx index 014be381099..e8ae5ed8d64 100644 --- a/apps/admin/app/(all)/(dashboard)/email/email-config-form.tsx +++ b/apps/admin/app/(all)/(dashboard)/email/email-config-form.tsx @@ -157,12 +157,12 @@ export function InstanceEmailForm(props: IInstanceEmailForm) { /> ))}
-

Email security

+

Email security

{Object.entries(EMAIL_SECURITY_OPTIONS).map(([key, value]) => ( @@ -173,12 +173,12 @@ export function InstanceEmailForm(props: IInstanceEmailForm) {
-
+
-
Authentication
-
+
Authentication
+
This is optional, but we recommend setting up a username and a password for your SMTP server.
@@ -204,6 +204,7 @@ export function InstanceEmailForm(props: IInstanceEmailForm) {
{sendEmailStep === ESendEmailSteps.SEND_EMAIL && ( - )} diff --git a/apps/admin/app/(all)/(dashboard)/general/form.tsx b/apps/admin/app/(all)/(dashboard)/general/form.tsx index db663f77725..0b5619ea00d 100644 --- a/apps/admin/app/(all)/(dashboard)/general/form.tsx +++ b/apps/admin/app/(all)/(dashboard)/general/form.tsx @@ -63,8 +63,8 @@ export const GeneralConfigurationForm = observer(function GeneralConfigurationFo return (
-
-
Instance details
+
+
Instance details
-

Email

+

Email

-

Instance ID

+

Instance ID

-
-
Chat + telemetry
+
+
Chat + telemetry
-
+
-
- +
+
-
- Let Plane collect anonymous usage data -
-
+
Let Plane collect anonymous usage data
+
No PII is collected.This anonymized data is used to understand how you use Plane and build new features in line with{" "} our Telemetry Policy. @@ -146,7 +144,7 @@ export const GeneralConfigurationForm = observer(function GeneralConfigurationFo
-
diff --git a/apps/admin/app/(all)/(dashboard)/general/intercom.tsx b/apps/admin/app/(all)/(dashboard)/general/intercom.tsx index a7659f42546..d5ec8d352e4 100644 --- a/apps/admin/app/(all)/(dashboard)/general/intercom.tsx +++ b/apps/admin/app/(all)/(dashboard)/general/intercom.tsx @@ -49,17 +49,17 @@ export const IntercomConfig = observer(function IntercomConfig(props: TIntercomC return ( <> -
+
-
- +
+
-
Chat with us
-
+
Chat with us
+
Let your users chat with us via Intercom or another service. Toggling Telemetry off turns this off automatically.
diff --git a/apps/admin/app/(all)/(dashboard)/general/page.tsx b/apps/admin/app/(all)/(dashboard)/general/page.tsx index 5a70e30aa6e..fd7efd30998 100644 --- a/apps/admin/app/(all)/(dashboard)/general/page.tsx +++ b/apps/admin/app/(all)/(dashboard)/general/page.tsx @@ -11,9 +11,9 @@ function GeneralPage() { return ( <>
-
-
General settings
-
+
+
General settings
+
Change the name of your instance and instance admin e-mail addresses. Enable or disable telemetry in your instance.
diff --git a/apps/admin/app/(all)/(dashboard)/header.tsx b/apps/admin/app/(all)/(dashboard)/header.tsx index c2ccc6358e8..e769d38602e 100644 --- a/apps/admin/app/(all)/(dashboard)/header.tsx +++ b/apps/admin/app/(all)/(dashboard)/header.tsx @@ -12,10 +12,10 @@ export const HamburgerToggle = observer(function HamburgerToggle() { const { isSidebarCollapsed, toggleSidebar } = useTheme(); return (
toggleSidebar(!isSidebarCollapsed)} > - +
); }); @@ -71,7 +71,7 @@ export const AdminHeader = observer(function AdminHeader() { const breadcrumbItems = generateBreadcrumbItems(pathName); return ( -
+
{breadcrumbItems.length >= 0 && ( @@ -82,7 +82,7 @@ export const AdminHeader = observer(function AdminHeader() { } + icon={} /> } /> diff --git a/apps/admin/app/(all)/(dashboard)/image/form.tsx b/apps/admin/app/(all)/(dashboard)/image/form.tsx index 9227a5ba9bf..7d12ee59f7a 100644 --- a/apps/admin/app/(all)/(dashboard)/image/form.tsx +++ b/apps/admin/app/(all)/(dashboard)/image/form.tsx @@ -56,7 +56,7 @@ export function InstanceImageConfigForm(props: IInstanceImageConfigForm) { Learn more. @@ -70,7 +70,7 @@ export function InstanceImageConfigForm(props: IInstanceImageConfigForm) {
-
diff --git a/apps/admin/app/(all)/(dashboard)/image/page.tsx b/apps/admin/app/(all)/(dashboard)/image/page.tsx index 57dd3a0fd67..5bd2914d54f 100644 --- a/apps/admin/app/(all)/(dashboard)/image/page.tsx +++ b/apps/admin/app/(all)/(dashboard)/image/page.tsx @@ -16,9 +16,9 @@ const InstanceImagePage = observer(function InstanceImagePage(_props: Route.Comp return ( <>
-
-
Third-party image libraries
-
+
+
Third-party image libraries
+
Let your users search and choose images from third-party libraries
diff --git a/apps/admin/app/(all)/(dashboard)/layout.tsx b/apps/admin/app/(all)/(dashboard)/layout.tsx index b0a766d2fc5..2798c8f043b 100644 --- a/apps/admin/app/(all)/(dashboard)/layout.tsx +++ b/apps/admin/app/(all)/(dashboard)/layout.tsx @@ -34,9 +34,9 @@ function AdminLayout(_props: Route.ComponentProps) { return (
-
+
-
+
diff --git a/apps/admin/app/(all)/(dashboard)/sidebar-dropdown.tsx b/apps/admin/app/(all)/(dashboard)/sidebar-dropdown.tsx index f2458f869b3..5babcbbd404 100644 --- a/apps/admin/app/(all)/(dashboard)/sidebar-dropdown.tsx +++ b/apps/admin/app/(all)/(dashboard)/sidebar-dropdown.tsx @@ -33,20 +33,20 @@ export const AdminSidebarDropdown = observer(function AdminSidebarDropdown() { const getSidebarMenuItems = () => (
- {currentUser?.email} + {currentUser?.email}
@@ -59,7 +59,7 @@ export const AdminSidebarDropdown = observer(function AdminSidebarDropdown() { Sign out @@ -75,10 +75,10 @@ export const AdminSidebarDropdown = observer(function AdminSidebarDropdown() { }, [csrfToken]); return ( -
+
@@ -88,8 +88,8 @@ export const AdminSidebarDropdown = observer(function AdminSidebarDropdown() { "cursor-default": !isSidebarCollapsed, })} > -
- +
+
{isSidebarCollapsed && ( @@ -109,7 +109,7 @@ export const AdminSidebarDropdown = observer(function AdminSidebarDropdown() { {!isSidebarCollapsed && (
-

Instance admin

+

Instance admin

)}
@@ -123,7 +123,7 @@ export const AdminSidebarDropdown = observer(function AdminSidebarDropdown() { src={getFileURL(currentUser.avatar_url)} size={24} shape="square" - className="!text-base" + className="!text-14" /> diff --git a/apps/admin/app/(all)/(dashboard)/sidebar-help-section.tsx b/apps/admin/app/(all)/(dashboard)/sidebar-help-section.tsx index da09ef348e4..8d0b87ac983 100644 --- a/apps/admin/app/(all)/(dashboard)/sidebar-help-section.tsx +++ b/apps/admin/app/(all)/(dashboard)/sidebar-help-section.tsx @@ -45,7 +45,7 @@ export const AdminSidebarHelpSection = observer(function AdminSidebarHelpSection return ( -
Version: v{packageJson.version}
+
Version: v{packageJson.version}
diff --git a/apps/admin/app/(all)/(dashboard)/sidebar-menu.tsx b/apps/admin/app/(all)/(dashboard)/sidebar-menu.tsx index 4fe17e0bf2b..e7371fc69e1 100644 --- a/apps/admin/app/(all)/(dashboard)/sidebar-menu.tsx +++ b/apps/admin/app/(all)/(dashboard)/sidebar-menu.tsx @@ -72,8 +72,8 @@ export const AdminSidebarMenu = observer(function AdminSidebarMenu() { className={cn( `group flex w-full items-center gap-3 rounded-md px-3 py-2 outline-none transition-colors`, isActive - ? "bg-custom-primary-100/10 text-custom-primary-100" - : "text-custom-sidebar-text-200 hover:bg-custom-sidebar-background-80 focus:bg-custom-sidebar-background-80", + ? "bg-accent-primary/10 text-accent-primary" + : "text-secondary hover:bg-layer-1-hover focus:bg-layer-1-hover", isSidebarCollapsed ? "justify-center" : "w-[260px]" )} > @@ -82,16 +82,16 @@ export const AdminSidebarMenu = observer(function AdminSidebarMenu() {
{item.name}
{item.description} diff --git a/apps/admin/app/(all)/(dashboard)/sidebar.tsx b/apps/admin/app/(all)/(dashboard)/sidebar.tsx index 7950879c176..ec340247f5e 100644 --- a/apps/admin/app/(all)/(dashboard)/sidebar.tsx +++ b/apps/admin/app/(all)/(dashboard)/sidebar.tsx @@ -38,7 +38,7 @@ export const AdminSidebar = observer(function AdminSidebar() { return (
-

Name your workspace

+

Name your workspace

)} /> - {errors?.name?.message} + {errors?.name?.message}
-

Set your workspace's URL

-
- {workspaceBaseURL} +

Set your workspace's URL

+
+ {workspaceBaseURL} )} />
- {slugError &&

This URL is taken. Try something else.

} + {slugError &&

This URL is taken. Try something else.

} {invalidSlug && ( -

{`URLs can contain only ( - ), ( _ ) and alphanumeric characters.`}

+

{`URLs can contain only ( - ), ( _ ) and alphanumeric characters.`}

)} - {errors.slug && {errors.slug.message}} + {errors.slug && {errors.slug.message}}
-

How many people will use this workspace?

+

How many people will use this workspace?

c === value) ?? ( - Select a range + Select a range ) } - buttonClassName="!border-[0.5px] !border-custom-border-200 !shadow-none" + buttonClassName="!border-[0.5px] !border-subtle !shadow-none" input > {ORGANIZATION_SIZE.map((item) => ( @@ -187,7 +187,7 @@ export function WorkspaceCreateForm() { )} /> {errors.organization_size && ( - {errors.organization_size.message} + {errors.organization_size.message} )}
@@ -195,14 +195,14 @@ export function WorkspaceCreateForm() {
- + Go back
diff --git a/apps/admin/app/(all)/(dashboard)/workspace/create/page.tsx b/apps/admin/app/(all)/(dashboard)/workspace/create/page.tsx index fe3fc033a2f..3fd441c2686 100644 --- a/apps/admin/app/(all)/(dashboard)/workspace/create/page.tsx +++ b/apps/admin/app/(all)/(dashboard)/workspace/create/page.tsx @@ -6,9 +6,9 @@ import { WorkspaceCreateForm } from "./form"; const WorkspaceCreatePage = observer(function WorkspaceCreatePage(_props: Route.ComponentProps) { return (
-
-
Create a new workspace on this instance.
-
+
+
Create a new workspace on this instance.
+
You will need to invite users from Workspace Settings after you create this workspace.
diff --git a/apps/admin/app/(all)/(dashboard)/workspace/page.tsx b/apps/admin/app/(all)/(dashboard)/workspace/page.tsx index f5d8a678c2b..c3222f1fb90 100644 --- a/apps/admin/app/(all)/(dashboard)/workspace/page.tsx +++ b/apps/admin/app/(all)/(dashboard)/workspace/page.tsx @@ -69,22 +69,20 @@ const WorkspaceManagementPage = observer(function WorkspaceManagementPage(_props return (
-
+
-
Workspaces on this instance
-
- See all workspaces and control who can create them. -
+
Workspaces on this instance
+
See all workspaces and control who can create them.
{formattedConfig ? ( -
+
-
Prevent anyone else from creating a workspace.
-
+
Prevent anyone else from creating a workspace.
+
Toggling this on will let only you create workspaces. You will have to invite users to new workspaces.
@@ -116,20 +114,19 @@ const WorkspaceManagementPage = observer(function WorkspaceManagementPage(_props <>
-
- All workspaces on this instance{" "} - • {workspaceIds.length} +
+ All workspaces on this instance • {workspaceIds.length} {workspaceLoader && ["mutation", "pagination"].includes(workspaceLoader) && ( )}
-
+
You can't yet delete workspaces and you can only go to the workspace if you are an Admin or a Member.
- + Create workspace
@@ -142,7 +139,8 @@ const WorkspaceManagementPage = observer(function WorkspaceManagementPage(_props {hasNextPage && (
-
diff --git a/apps/admin/app/components/404.tsx b/apps/admin/app/components/404.tsx index 3851daa3272..a4954ebaaf6 100644 --- a/apps/admin/app/components/404.tsx +++ b/apps/admin/app/components/404.tsx @@ -7,22 +7,22 @@ import Image404 from "@/app/assets/images/404.svg?url"; function PageNotFound() { return ( -
+
404 - Page not found
-

Oops! Something went wrong.

-

+

Oops! Something went wrong.

+

Sorry, the page you are looking for cannot be found. It may have been removed, had its name changed, or is temporarily unavailable.

- diff --git a/apps/admin/app/root.tsx b/apps/admin/app/root.tsx index 89415106d96..cbae3753984 100644 --- a/apps/admin/app/root.tsx +++ b/apps/admin/app/root.tsx @@ -56,7 +56,11 @@ export const meta: Route.MetaFunction = () => [ ]; export default function Root() { - return ; + return ( +
+ +
+ ); } export function HydrateFallback() { diff --git a/apps/admin/ce/components/authentication/authentication-modes.tsx b/apps/admin/ce/components/authentication/authentication-modes.tsx index 7b0f658d8a0..9c2348c81d2 100644 --- a/apps/admin/ce/components/authentication/authentication-modes.tsx +++ b/apps/admin/ce/components/authentication/authentication-modes.tsx @@ -43,14 +43,14 @@ export const getAuthenticationModes: (props: TGetBaseAuthenticationModeProps) => name: "Unique codes", description: "Log in or sign up for Plane using codes sent via email. You need to have set up SMTP to use this method.", - icon: , + icon: , config: , }, { key: "passwords-login", name: "Passwords", description: "Allow members to create accounts with passwords and use it with their email addresses to sign in.", - icon: , + icon: , config: , }, { @@ -112,7 +112,7 @@ export const AuthenticationModes = observer(function AuthenticationModes(props: const { resolvedTheme } = useTheme(); return ( - <> +
{getAuthenticationModes({ disabled, updateConfig, resolvedTheme }).map((method) => ( ))} - +
); }); diff --git a/apps/admin/ce/components/common/upgrade-button.tsx b/apps/admin/ce/components/common/upgrade-button.tsx index 51b6eb6c4d8..cf656bbd5e7 100644 --- a/apps/admin/ce/components/common/upgrade-button.tsx +++ b/apps/admin/ce/components/common/upgrade-button.tsx @@ -10,7 +10,7 @@ export function UpgradeButton() { Upgrade diff --git a/apps/admin/core/components/authentication/authentication-method-card.tsx b/apps/admin/core/components/authentication/authentication-method-card.tsx index c512e24d14f..df330aa71ca 100644 --- a/apps/admin/core/components/authentication/authentication-method-card.tsx +++ b/apps/admin/core/components/authentication/authentication-method-card.tsx @@ -16,8 +16,8 @@ export function AuthenticationMethodCard(props: Props) { return (
-
{icon}
+
{icon}
{name}
{description} diff --git a/apps/admin/core/components/authentication/gitea-config.tsx b/apps/admin/core/components/authentication/gitea-config.tsx index 22019979e39..7fadf1e1a3a 100644 --- a/apps/admin/core/components/authentication/gitea-config.tsx +++ b/apps/admin/core/components/authentication/gitea-config.tsx @@ -1,11 +1,11 @@ -import React from "react"; import { observer } from "mobx-react"; import Link from "next/link"; // icons import { Settings2 } from "lucide-react"; // plane internal packages +import { getButtonStyling } from "@plane/propel/button"; import type { TInstanceAuthenticationMethodKeys } from "@plane/types"; -import { ToggleSwitch, getButtonStyling } from "@plane/ui"; +import { ToggleSwitch } from "@plane/ui"; import { cn } from "@plane/utils"; // hooks import { useInstance } from "@/hooks/store"; @@ -28,7 +28,7 @@ export const GiteaConfiguration = observer(function GiteaConfiguration(props: Pr <> {GiteaConfigured ? (
- + Edit
) : ( - - + + Configure )} diff --git a/apps/admin/core/components/authentication/github-config.tsx b/apps/admin/core/components/authentication/github-config.tsx index b2db3e08625..46a1a708c9f 100644 --- a/apps/admin/core/components/authentication/github-config.tsx +++ b/apps/admin/core/components/authentication/github-config.tsx @@ -28,7 +28,7 @@ export const GithubConfiguration = observer(function GithubConfiguration(props: <> {isGithubConfigured ? (
- + Edit
) : ( - - + + Configure )} diff --git a/apps/admin/core/components/authentication/gitlab-config.tsx b/apps/admin/core/components/authentication/gitlab-config.tsx index 7e6ee1ddbaa..b3069e6cc06 100644 --- a/apps/admin/core/components/authentication/gitlab-config.tsx +++ b/apps/admin/core/components/authentication/gitlab-config.tsx @@ -27,7 +27,7 @@ export const GitlabConfiguration = observer(function GitlabConfiguration(props: <> {isGitlabConfigured ? (
- + Edit
) : ( - - + + Configure )} diff --git a/apps/admin/core/components/authentication/google-config.tsx b/apps/admin/core/components/authentication/google-config.tsx index d31b38dda9a..61d89e33255 100644 --- a/apps/admin/core/components/authentication/google-config.tsx +++ b/apps/admin/core/components/authentication/google-config.tsx @@ -27,7 +27,7 @@ export const GoogleConfiguration = observer(function GoogleConfiguration(props: <> {isGoogleConfigured ? (
- + Edit
) : ( - - + + Configure )} diff --git a/apps/admin/core/components/common/banner.tsx b/apps/admin/core/components/common/banner.tsx index df0818b34fa..861e8f63411 100644 --- a/apps/admin/core/components/common/banner.tsx +++ b/apps/admin/core/components/common/banner.tsx @@ -23,7 +23,7 @@ export function Banner(props: TBanner) { )}
-

{message}

+

{message}

diff --git a/apps/admin/core/components/common/breadcrumb-link.tsx b/apps/admin/core/components/common/breadcrumb-link.tsx index aa647e22055..0bed7e6064f 100644 --- a/apps/admin/core/components/common/breadcrumb-link.tsx +++ b/apps/admin/core/components/common/breadcrumb-link.tsx @@ -14,17 +14,12 @@ export function BreadcrumbLink(props: Props) {
  • {href ? ( - - {icon && ( -
    {icon}
    - )} + + {icon &&
    {icon}
    }
    {label}
    ) : ( -
    +
    {icon &&
    {icon}
    }
    {label}
    diff --git a/apps/admin/core/components/common/code-block.tsx b/apps/admin/core/components/common/code-block.tsx index ab46459495e..334d8d54cea 100644 --- a/apps/admin/core/components/common/code-block.tsx +++ b/apps/admin/core/components/common/code-block.tsx @@ -10,9 +10,9 @@ export function CodeBlock({ children, className, darkerShade }: TProps) { return ( -
    +
    @@ -39,15 +39,15 @@ export function ConfirmDiscardModal(props: Props) { leaveFrom="opacity-100 translate-y-0 sm:scale-100" leaveTo="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95" > - +
    - + You have unsaved changes
    -

    +

    Changes you made will be lost if you go back. Do you wish to go back?

    @@ -55,10 +55,10 @@ export function ConfirmDiscardModal(props: Props) {
    - - + Go back
    diff --git a/apps/admin/core/components/common/controller-input.tsx b/apps/admin/core/components/common/controller-input.tsx index 4d3534859d2..9dc38d851af 100644 --- a/apps/admin/core/components/common/controller-input.tsx +++ b/apps/admin/core/components/common/controller-input.tsx @@ -35,7 +35,7 @@ export function ControllerInput(props: Props) { return (
    -

    {label}

    +

    {label}

    setShowPassword(false)} > @@ -69,14 +69,14 @@ export function ControllerInput(props: Props) { ) : ( ))}
    - {description &&

    {description}

    } + {description &&

    {description}

    }
    ); } diff --git a/apps/admin/core/components/common/copy-field.tsx b/apps/admin/core/components/common/copy-field.tsx index 484cf745401..10a2c3729d5 100644 --- a/apps/admin/core/components/common/copy-field.tsx +++ b/apps/admin/core/components/common/copy-field.tsx @@ -22,9 +22,10 @@ export function CopyField(props: Props) { return (
    -

    {label}

    +

    {label}

    -
    {description}
    +
    {description}
    ); } diff --git a/apps/admin/core/components/common/empty-state.tsx b/apps/admin/core/components/common/empty-state.tsx index f69b0417937..861ff85882d 100644 --- a/apps/admin/core/components/common/empty-state.tsx +++ b/apps/admin/core/components/common/empty-state.tsx @@ -19,8 +19,8 @@ export function EmptyState({ title, description, image, primaryButton, secondary
    {image && {primaryButton?.text} -
    {title}
    - {description &&

    {description}

    } +
    {title}
    + {description &&

    {description}

    }
    {primaryButton && ( diff --git a/apps/admin/core/components/instance/failure.tsx b/apps/admin/core/components/instance/failure.tsx index e31633dc9fe..30d9f09dfb7 100644 --- a/apps/admin/core/components/instance/failure.tsx +++ b/apps/admin/core/components/instance/failure.tsx @@ -22,13 +22,13 @@ export const InstanceFailureView = observer(function InstanceFailureView() {
    Instance failure illustration -

    Unable to fetch instance details.

    -

    +

    Unable to fetch instance details.

    +

    We were unable to fetch the details of the instance. Fret not, it might just be a connectivity issue.

    -
    diff --git a/apps/admin/core/components/instance/form-header.tsx b/apps/admin/core/components/instance/form-header.tsx index ead66b96314..75062c30f50 100644 --- a/apps/admin/core/components/instance/form-header.tsx +++ b/apps/admin/core/components/instance/form-header.tsx @@ -1,8 +1,8 @@ export function FormHeader({ heading, subHeading }: { heading: string; subHeading: string }) { return (
    - {heading} - {subHeading} + {heading} + {subHeading}
    ); } diff --git a/apps/admin/core/components/instance/instance-not-ready.tsx b/apps/admin/core/components/instance/instance-not-ready.tsx index 0473effcdae..7092ae048c9 100644 --- a/apps/admin/core/components/instance/instance-not-ready.tsx +++ b/apps/admin/core/components/instance/instance-not-ready.tsx @@ -8,16 +8,14 @@ export function InstanceNotReady() {
    -

    Welcome aboard Plane!

    +

    Welcome aboard Plane!

    Plane Logo -

    - Get started by setting up your instance and workspace -

    +

    Get started by setting up your instance and workspace

    - diff --git a/apps/admin/core/components/instance/setup-form.tsx b/apps/admin/core/components/instance/setup-form.tsx index ab25b1a3e46..4e4e199504d 100644 --- a/apps/admin/core/components/instance/setup-form.tsx +++ b/apps/admin/core/components/instance/setup-form.tsx @@ -156,11 +156,11 @@ export function InstanceSetupForm() {
    -
    -
    +
    -
    Create workspace
    -
    +
    Create workspace
    +
    Instance setup done! Welcome to Plane instance portal. Start your journey with by creating your first workspace.
    - + Create workspace -
    diff --git a/apps/admin/core/components/workspace/list-item.tsx b/apps/admin/core/components/workspace/list-item.tsx index 01855eec84c..2f55ba2a1b5 100644 --- a/apps/admin/core/components/workspace/list-item.tsx +++ b/apps/admin/core/components/workspace/list-item.tsx @@ -23,19 +23,19 @@ export const WorkspaceListItem = observer(function WorkspaceListItem({ workspace key={workspaceId} href={`${WEB_BASE_URL}/${encodeURIComponent(workspace.slug)}`} target="_blank" - className="group flex items-center justify-between p-4 gap-2.5 truncate border border-custom-border-200/70 hover:border-custom-border-200 hover:bg-custom-background-90 rounded-md" + className="group flex items-center justify-between p-4 gap-2.5 truncate border border-subtle/70 hover:border-subtle bg-layer-1 hover:bg-layer-1-hover rounded-md" rel="noreferrer" >
    {workspace?.logo_url && workspace.logo_url !== "" ? ( Workspace Logo ) : ( @@ -44,30 +44,30 @@ export const WorkspaceListItem = observer(function WorkspaceListItem({ workspace
    -

    {workspace.name}

    / +

    {workspace.name}

    / -

    [{workspace.slug}]

    +

    [{workspace.slug}]

    {workspace.owner.email && ( -
    -

    Owned by:

    -

    {workspace.owner.email}

    +
    +

    Owned by:

    +

    {workspace.owner.email}

    )} -
    +
    {workspace.total_projects !== null && ( -

    Total projects:

    -

    {workspace.total_projects}

    +

    Total projects:

    +

    {workspace.total_projects}

    )} {workspace.total_members !== null && ( <> • -

    Total members:

    -

    {workspace.total_members}

    +

    Total members:

    +

    {workspace.total_members}

    )} @@ -75,7 +75,7 @@ export const WorkspaceListItem = observer(function WorkspaceListItem({ workspace
    - +
    ); diff --git a/apps/admin/postcss.config.cjs b/apps/admin/postcss.config.cjs deleted file mode 100644 index 8a677108f55..00000000000 --- a/apps/admin/postcss.config.cjs +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@plane/tailwind-config/postcss.config.js"); diff --git a/apps/admin/postcss.config.js b/apps/admin/postcss.config.js new file mode 100644 index 00000000000..3ad28f15f35 --- /dev/null +++ b/apps/admin/postcss.config.js @@ -0,0 +1,3 @@ +import postcssConfig from "@plane/tailwind-config/postcss.config.js"; + +export default postcssConfig; diff --git a/apps/admin/styles/globals.css b/apps/admin/styles/globals.css index 1b88a170e61..12417088e6b 100644 --- a/apps/admin/styles/globals.css +++ b/apps/admin/styles/globals.css @@ -1,373 +1,4 @@ -@import "@plane/propel/styles/fonts.css"; - -@tailwind base; -@tailwind components; -@tailwind utilities; - -@layer components { - .text-1\.5xl { - font-size: 1.375rem; - line-height: 1.875rem; - } - - .text-2\.5xl { - font-size: 1.75rem; - line-height: 2.25rem; - } -} - -@layer base { - html { - font-family: "Inter", sans-serif; - } - - :root { - color-scheme: light !important; - - --color-primary-10: 229, 243, 250; - --color-primary-20: 216, 237, 248; - --color-primary-30: 199, 229, 244; - --color-primary-40: 169, 214, 239; - --color-primary-50: 144, 202, 234; - --color-primary-60: 109, 186, 227; - --color-primary-70: 75, 170, 221; - --color-primary-80: 41, 154, 214; - --color-primary-90: 34, 129, 180; - --color-primary-100: 0, 99, 153; - --color-primary-200: 0, 92, 143; - --color-primary-300: 0, 86, 133; - --color-primary-400: 0, 77, 117; - --color-primary-500: 0, 66, 102; - --color-primary-600: 0, 53, 82; - --color-primary-700: 0, 43, 66; - --color-primary-800: 0, 33, 51; - --color-primary-900: 0, 23, 36; - - --color-background-100: 255, 255, 255; /* primary bg */ - --color-background-90: 247, 247, 247; /* secondary bg */ - --color-background-80: 232, 232, 232; /* tertiary bg */ - - --color-text-100: 23, 23, 23; /* primary text */ - --color-text-200: 58, 58, 58; /* secondary text */ - --color-text-300: 82, 82, 82; /* tertiary text */ - --color-text-400: 163, 163, 163; /* placeholder text */ - - --color-scrollbar: 163, 163, 163; /* scrollbar thumb */ - - --color-border-100: 245, 245, 245; /* subtle border= 1 */ - --color-border-200: 229, 229, 229; /* subtle border- 2 */ - --color-border-300: 212, 212, 212; /* strong border- 1 */ - --color-border-400: 185, 185, 185; /* strong border- 2 */ - - --color-shadow-2xs: - 0px 0px 1px 0px rgba(23, 23, 23, 0.06), 0px 1px 2px 0px rgba(23, 23, 23, 0.06), - 0px 1px 2px 0px rgba(23, 23, 23, 0.14); - --color-shadow-xs: - 0px 1px 2px 0px rgba(0, 0, 0, 0.16), 0px 2px 4px 0px rgba(16, 24, 40, 0.12), - 0px 1px 8px -1px rgba(16, 24, 40, 0.1); - --color-shadow-sm: - 0px 1px 4px 0px rgba(0, 0, 0, 0.01), 0px 4px 8px 0px rgba(0, 0, 0, 0.02), 0px 1px 12px 0px rgba(0, 0, 0, 0.12); - --color-shadow-rg: - 0px 3px 6px 0px rgba(0, 0, 0, 0.1), 0px 4px 4px 0px rgba(16, 24, 40, 0.08), - 0px 1px 12px 0px rgba(16, 24, 40, 0.04); - --color-shadow-md: - 0px 4px 8px 0px rgba(0, 0, 0, 0.12), 0px 6px 12px 0px rgba(16, 24, 40, 0.12), - 0px 1px 16px 0px rgba(16, 24, 40, 0.12); - --color-shadow-lg: - 0px 6px 12px 0px rgba(0, 0, 0, 0.12), 0px 8px 16px 0px rgba(0, 0, 0, 0.12), - 0px 1px 24px 0px rgba(16, 24, 40, 0.12); - --color-shadow-xl: - 0px 0px 18px 0px rgba(0, 0, 0, 0.16), 0px 0px 24px 0px rgba(16, 24, 40, 0.16), - 0px 0px 52px 0px rgba(16, 24, 40, 0.16); - --color-shadow-2xl: - 0px 8px 16px 0px rgba(0, 0, 0, 0.12), 0px 12px 24px 0px rgba(16, 24, 40, 0.12), - 0px 1px 32px 0px rgba(16, 24, 40, 0.12); - --color-shadow-3xl: - 0px 12px 24px 0px rgba(0, 0, 0, 0.12), 0px 16px 32px 0px rgba(0, 0, 0, 0.12), - 0px 1px 48px 0px rgba(16, 24, 40, 0.12); - --color-shadow-4xl: 0px 8px 40px 0px rgba(0, 0, 61, 0.05), 0px 12px 32px -16px rgba(0, 0, 0, 0.05); - - --color-sidebar-background-100: var(--color-background-100); /* primary sidebar bg */ - --color-sidebar-background-90: var(--color-background-90); /* secondary sidebar bg */ - --color-sidebar-background-80: var(--color-background-80); /* tertiary sidebar bg */ - - --color-sidebar-text-100: var(--color-text-100); /* primary sidebar text */ - --color-sidebar-text-200: var(--color-text-200); /* secondary sidebar text */ - --color-sidebar-text-300: var(--color-text-300); /* tertiary sidebar text */ - --color-sidebar-text-400: var(--color-text-400); /* sidebar placeholder text */ - - --color-sidebar-border-100: var(--color-border-100); /* subtle sidebar border= 1 */ - --color-sidebar-border-200: var(--color-border-100); /* subtle sidebar border- 2 */ - --color-sidebar-border-300: var(--color-border-100); /* strong sidebar border- 1 */ - --color-sidebar-border-400: var(--color-border-100); /* strong sidebar border- 2 */ - - --color-sidebar-shadow-2xs: var(--color-shadow-2xs); - --color-sidebar-shadow-xs: var(--color-shadow-xs); - --color-sidebar-shadow-sm: var(--color-shadow-sm); - --color-sidebar-shadow-rg: var(--color-shadow-rg); - --color-sidebar-shadow-md: var(--color-shadow-md); - --color-sidebar-shadow-lg: var(--color-shadow-lg); - --color-sidebar-shadow-xl: var(--color-shadow-xl); - --color-sidebar-shadow-2xl: var(--color-shadow-2xl); - --color-sidebar-shadow-3xl: var(--color-shadow-3xl); - --color-sidebar-shadow-4xl: var(--color-shadow-4xl); - - /* toast theme */ - --color-toast-success-text: 178, 221, 181; - --color-toast-error-text: 206, 44, 49; - --color-toast-warning-text: 255, 186, 24; - --color-toast-info-text: 141, 164, 239; - --color-toast-loading-text: 255, 255, 255; - --color-toast-secondary-text: 185, 187, 198; - --color-toast-tertiary-text: 139, 141, 152; - - --color-toast-success-background: 46, 46, 46; - --color-toast-error-background: 46, 46, 46; - --color-toast-warning-background: 46, 46, 46; - --color-toast-info-background: 46, 46, 46; - --color-toast-loading-background: 46, 46, 46; - - --color-toast-success-border: 42, 126, 59; - --color-toast-error-border: 100, 23, 35; - --color-toast-warning-border: 79, 52, 34; - --color-toast-info-border: 58, 91, 199; - --color-toast-loading-border: 96, 100, 108; - } - - [data-theme="light"], - [data-theme="light-contrast"] { - color-scheme: light !important; - - --color-background-100: 255, 255, 255; /* primary bg */ - --color-background-90: 247, 247, 247; /* secondary bg */ - --color-background-80: 232, 232, 232; /* tertiary bg */ - } - - [data-theme="light"] { - --color-text-100: 23, 23, 23; /* primary text */ - --color-text-200: 58, 58, 58; /* secondary text */ - --color-text-300: 82, 82, 82; /* tertiary text */ - --color-text-400: 163, 163, 163; /* placeholder text */ - - --color-scrollbar: 163, 163, 163; /* scrollbar thumb */ - - --color-border-100: 245, 245, 245; /* subtle border= 1 */ - --color-border-200: 229, 229, 229; /* subtle border- 2 */ - --color-border-300: 212, 212, 212; /* strong border- 1 */ - --color-border-400: 185, 185, 185; /* strong border- 2 */ - - /* toast theme */ - --color-toast-success-text: 62, 155, 79; - --color-toast-error-text: 220, 62, 66; - --color-toast-warning-text: 255, 186, 24; - --color-toast-info-text: 51, 88, 212; - --color-toast-loading-text: 28, 32, 36; - --color-toast-secondary-text: 128, 131, 141; - --color-toast-tertiary-text: 96, 100, 108; - - --color-toast-success-background: 253, 253, 254; - --color-toast-error-background: 255, 252, 252; - --color-toast-warning-background: 254, 253, 251; - --color-toast-info-background: 253, 253, 254; - --color-toast-loading-background: 253, 253, 254; - - --color-toast-success-border: 218, 241, 219; - --color-toast-error-border: 255, 219, 220; - --color-toast-warning-border: 255, 247, 194; - --color-toast-info-border: 210, 222, 255; - --color-toast-loading-border: 224, 225, 230; - } - - [data-theme="light-contrast"] { - --color-text-100: 11, 11, 11; /* primary text */ - --color-text-200: 38, 38, 38; /* secondary text */ - --color-text-300: 58, 58, 58; /* tertiary text */ - --color-text-400: 115, 115, 115; /* placeholder text */ - - --color-scrollbar: 115, 115, 115; /* scrollbar thumb */ - - --color-border-100: 34, 34, 34; /* subtle border= 1 */ - --color-border-200: 38, 38, 38; /* subtle border- 2 */ - --color-border-300: 46, 46, 46; /* strong border- 1 */ - --color-border-400: 58, 58, 58; /* strong border- 2 */ - } - - [data-theme="dark"], - [data-theme="dark-contrast"] { - color-scheme: dark !important; - - --color-primary-10: 8, 31, 43; - --color-primary-20: 10, 37, 51; - --color-primary-30: 13, 49, 69; - --color-primary-40: 16, 58, 81; - --color-primary-50: 18, 68, 94; - --color-primary-60: 23, 86, 120; - --color-primary-70: 28, 104, 146; - --color-primary-80: 31, 116, 163; - --color-primary-90: 34, 129, 180; - --color-primary-100: 40, 146, 204; - --color-primary-200: 41, 154, 214; - --color-primary-300: 75, 170, 221; - --color-primary-400: 109, 186, 227; - --color-primary-500: 144, 202, 234; - --color-primary-600: 169, 214, 239; - --color-primary-700: 199, 229, 244; - --color-primary-800: 216, 237, 248; - --color-primary-900: 229, 243, 250; - - --color-background-100: 25, 25, 25; /* primary bg */ - --color-background-90: 32, 32, 32; /* secondary bg */ - --color-background-80: 44, 44, 44; /* tertiary bg */ - - --color-shadow-2xs: 0px 0px 1px 0px rgba(0, 0, 0, 0.15), 0px 1px 3px 0px rgba(0, 0, 0, 0.5); - --color-shadow-xs: 0px 0px 2px 0px rgba(0, 0, 0, 0.2), 0px 2px 4px 0px rgba(0, 0, 0, 0.5); - --color-shadow-sm: 0px 0px 4px 0px rgba(0, 0, 0, 0.2), 0px 2px 6px 0px rgba(0, 0, 0, 0.5); - --color-shadow-rg: 0px 0px 6px 0px rgba(0, 0, 0, 0.2), 0px 4px 6px 0px rgba(0, 0, 0, 0.5); - --color-shadow-md: 0px 2px 8px 0px rgba(0, 0, 0, 0.2), 0px 4px 8px 0px rgba(0, 0, 0, 0.5); - --color-shadow-lg: 0px 4px 12px 0px rgba(0, 0, 0, 0.25), 0px 4px 10px 0px rgba(0, 0, 0, 0.55); - --color-shadow-xl: 0px 0px 14px 0px rgba(0, 0, 0, 0.25), 0px 6px 10px 0px rgba(0, 0, 0, 0.55); - --color-shadow-2xl: 0px 0px 18px 0px rgba(0, 0, 0, 0.25), 0px 8px 12px 0px rgba(0, 0, 0, 0.6); - --color-shadow-3xl: 0px 4px 24px 0px rgba(0, 0, 0, 0.3), 0px 12px 40px 0px rgba(0, 0, 0, 0.65); - } - - [data-theme="dark"] { - --color-text-100: 229, 229, 229; /* primary text */ - --color-text-200: 163, 163, 163; /* secondary text */ - --color-text-300: 115, 115, 115; /* tertiary text */ - --color-text-400: 82, 82, 82; /* placeholder text */ - - --color-scrollbar: 82, 82, 82; /* scrollbar thumb */ - - --color-border-100: 34, 34, 34; /* subtle border= 1 */ - --color-border-200: 38, 38, 38; /* subtle border- 2 */ - --color-border-300: 46, 46, 46; /* strong border- 1 */ - --color-border-400: 58, 58, 58; /* strong border- 2 */ - } - - [data-theme="dark-contrast"] { - --color-text-100: 250, 250, 250; /* primary text */ - --color-text-200: 241, 241, 241; /* secondary text */ - --color-text-300: 212, 212, 212; /* tertiary text */ - --color-text-400: 115, 115, 115; /* placeholder text */ - - --color-scrollbar: 115, 115, 115; /* scrollbar thumb */ - - --color-border-100: 245, 245, 245; /* subtle border= 1 */ - --color-border-200: 229, 229, 229; /* subtle border- 2 */ - --color-border-300: 212, 212, 212; /* strong border- 1 */ - --color-border-400: 185, 185, 185; /* strong border- 2 */ - } - - [data-theme="light"], - [data-theme="dark"], - [data-theme="light-contrast"], - [data-theme="dark-contrast"] { - --color-sidebar-background-100: var(--color-background-100); /* primary sidebar bg */ - --color-sidebar-background-90: var(--color-background-90); /* secondary sidebar bg */ - --color-sidebar-background-80: var(--color-background-80); /* tertiary sidebar bg */ - - --color-sidebar-text-100: var(--color-text-100); /* primary sidebar text */ - --color-sidebar-text-200: var(--color-text-200); /* secondary sidebar text */ - --color-sidebar-text-300: var(--color-text-300); /* tertiary sidebar text */ - --color-sidebar-text-400: var(--color-text-400); /* sidebar placeholder text */ - - --color-sidebar-border-100: var(--color-border-100); /* subtle sidebar border= 1 */ - --color-sidebar-border-200: var(--color-border-200); /* subtle sidebar border- 2 */ - --color-sidebar-border-300: var(--color-border-300); /* strong sidebar border- 1 */ - --color-sidebar-border-400: var(--color-border-400); /* strong sidebar border- 2 */ - } -} - -* { - margin: 0; - padding: 0; - box-sizing: border-box; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; - font-variant-ligatures: none; - -webkit-font-variant-ligatures: none; - text-rendering: optimizeLegibility; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; -} - -body { - color: rgba(var(--color-text-100)); -} - -/* scrollbar style */ -::-webkit-scrollbar { - display: none; -} - -@-moz-document url-prefix() { - * { - scrollbar-width: none; - } - .vertical-scrollbar, - .horizontal-scrollbar { - scrollbar-width: initial; - scrollbar-color: rgba(96, 100, 108, 0.1) transparent; - } - .vertical-scrollbar:hover, - .horizontal-scrollbar:hover { - scrollbar-color: rgba(96, 100, 108, 0.25) transparent; - } - .vertical-scrollbar:active, - .horizontal-scrollbar:active { - scrollbar-color: rgba(96, 100, 108, 0.7) transparent; - } -} - -.vertical-scrollbar { - overflow-y: auto; -} -.horizontal-scrollbar { - overflow-x: auto; -} -.vertical-scrollbar::-webkit-scrollbar, -.horizontal-scrollbar::-webkit-scrollbar { - display: block; -} -.vertical-scrollbar::-webkit-scrollbar-track, -.horizontal-scrollbar::-webkit-scrollbar-track { - background-color: transparent; - border-radius: 9999px; -} -.vertical-scrollbar::-webkit-scrollbar-thumb, -.horizontal-scrollbar::-webkit-scrollbar-thumb { - background-clip: padding-box; - background-color: rgba(96, 100, 108, 0.1); - border-radius: 9999px; -} -.vertical-scrollbar:hover::-webkit-scrollbar-thumb, -.horizontal-scrollbar:hover::-webkit-scrollbar-thumb { - background-color: rgba(96, 100, 108, 0.25); -} -.vertical-scrollbar::-webkit-scrollbar-thumb:hover, -.horizontal-scrollbar::-webkit-scrollbar-thumb:hover { - background-color: rgba(96, 100, 108, 0.5); -} -.vertical-scrollbar::-webkit-scrollbar-thumb:active, -.horizontal-scrollbar::-webkit-scrollbar-thumb:active { - background-color: rgba(96, 100, 108, 0.7); -} -.vertical-scrollbar::-webkit-scrollbar-corner, -.horizontal-scrollbar::-webkit-scrollbar-corner { - background-color: transparent; -} -.vertical-scrollbar-margin-top-md::-webkit-scrollbar-track { - margin-top: 44px; -} - -/* scrollbar xs size */ -.scrollbar-xs::-webkit-scrollbar { - height: 10px; - width: 10px; -} -.scrollbar-xs::-webkit-scrollbar-thumb { - border: 3px solid rgba(0, 0, 0, 0); -} +@import "@plane/tailwind-config/index.css"; .shadow-custom { box-shadow: 2px 2px 8px 2px rgba(234, 231, 250, 0.3); /* Convert #EAE7FA4D to rgba */ @@ -377,45 +8,12 @@ body { @apply backdrop-filter blur-[9px]; } -/* scrollbar sm size */ -.scrollbar-sm::-webkit-scrollbar { - height: 12px; - width: 12px; -} -.scrollbar-sm::-webkit-scrollbar-thumb { - border: 3px solid rgba(0, 0, 0, 0); -} -/* scrollbar md size */ -.scrollbar-md::-webkit-scrollbar { - height: 14px; - width: 14px; -} -.scrollbar-md::-webkit-scrollbar-thumb { - border: 3px solid rgba(0, 0, 0, 0); -} -/* scrollbar lg size */ - -.scrollbar-lg::-webkit-scrollbar { - height: 16px; - width: 16px; -} -.scrollbar-lg::-webkit-scrollbar-thumb { - border: 4px solid rgba(0, 0, 0, 0); -} -/* end scrollbar style */ - /* progress bar */ .progress-bar { fill: currentColor; color: rgba(var(--color-sidebar-background-100)); } -::-webkit-input-placeholder, -::placeholder, -:-ms-input-placeholder { - color: rgb(var(--color-text-400)); -} - /* Progress Bar Styles */ :root { --bprogress-color: rgb(var(--color-primary-100)) !important; diff --git a/apps/admin/tailwind.config.cjs b/apps/admin/tailwind.config.cjs deleted file mode 100644 index 9bc917eb428..00000000000 --- a/apps/admin/tailwind.config.cjs +++ /dev/null @@ -1,5 +0,0 @@ -const sharedConfig = require("@plane/tailwind-config/tailwind.config.js"); - -module.exports = { - presets: [sharedConfig], -}; diff --git a/apps/api/plane/seeds/data/issues.json b/apps/api/plane/seeds/data/issues.json index badd0e61154..be966e723aa 100644 --- a/apps/api/plane/seeds/data/issues.json +++ b/apps/api/plane/seeds/data/issues.json @@ -3,7 +3,7 @@ "id": 1, "name": "Welcome to Plane 👋", "sequence_id": 1, - "description_html": "

    Hey there! This demo project is your playground to get hands-on with Plane. We've set this up so you can click around and see how everything works without worrying about breaking anything.

    Each work item is designed to make you familiar with the basics of using Plane. Just follow along card by card at your own pace.

    First thing to try

    1. Look in the Properties section below where it says State: Todo.

    2. Click on it and change it to Done from the dropdown. Alternatively, you can drag and drop the card to the Done column.

    ", + "description_html": "

    Hey there! This demo project is your playground to get hands-on with Plane. We've set this up so you can click around and see how everything works without worrying about breaking anything.

    Each work item is designed to make you familiar with the basics of using Plane. Just follow along card by card at your own pace.

    First thing to try

    1. Look in the Properties section below where it says State: Todo.

    2. Click on it and change it to Done from the dropdown. Alternatively, you can drag and drop the card to the Done column.

    ", "description_stripped": "Hey there! This demo project is your playground to get hands-on with Plane. We've set this up so you can click around and see how everything works without worrying about breaking anything.Each work item is designed to make you familiar with the basics of using Plane. Just follow along card by card at your own pace.First thing to tryLook in the Properties section below where it says State: Todo.Click on it and change it to Done from the dropdown. Alternatively, you can drag and drop the card to the Done column.", "sort_order": 1000, "state_id": 4, @@ -17,7 +17,7 @@ "id": 2, "name": "1. Create Projects 🎯", "sequence_id": 2, - "description_html": "


    A Project in Plane is where all your work comes together. Think of it as a base that organizes your work items and everything else your team needs to get things done.

    Note: This tutorial is already set up as a Project, and these cards you're reading are work items within it!

    We're showing you how to create a new project just so you'll know exactly what to do when you're ready to start your own real one.

    1. Look over at the left sidebar and find where it says Projects.

    2. Hover your mouse there and you'll see a little + icon pop up - go ahead and click it!

    3. A modal opens where you can give your project a name and other details.

    4. Notice the Access type options? Public means anyone (except Guest users) can see and join it, while Private keeps it just for those you invite.

      Tip: You can also quickly create a new project by using the keyboard shortcut P from anywhere in Plane!

    ", + "description_html": "


    A Project in Plane is where all your work comes together. Think of it as a base that organizes your work items and everything else your team needs to get things done.

    Note: This tutorial is already set up as a Project, and these cards you're reading are work items within it!

    We're showing you how to create a new project just so you'll know exactly what to do when you're ready to start your own real one.

    1. Look over at the left sidebar and find where it says Projects.

    2. Hover your mouse there and you'll see a little + icon pop up - go ahead and click it!

    3. A modal opens where you can give your project a name and other details.

    4. Notice the Access type options? Public means anyone (except Guest users) can see and join it, while Private keeps it just for those you invite.

      Tip: You can also quickly create a new project by using the keyboard shortcut P from anywhere in Plane!

    ", "sort_order": 2000, "state_id": 2, "labels": [2], @@ -30,7 +30,7 @@ "id": 3, "name": "2. Invite your team 🤜🤛", "sequence_id": 3, - "description_html": "

    Let's get your teammates on board!

    First, you'll need to invite them to your workspace before they can join specific projects:

    1. Click on your workspace name in the top-left corner, then select Settings from the dropdown.

    2. Head over to the Members tab - this is your user management hub. Click Add member on the top right.

    3. Enter your teammate's email address. Select a role for them (Admin, Member or Guest) that determines what they can do in the workspace.

    4. Your team member will get an email invite. Once they've joined your workspace, you can add them to specific projects.

    5. To do this, go to your project's Settings page.

    6. Find the Members section, select your teammate, and assign them a project role - this controls what they can do within just this project.


    That's it!

    To learn more about user management, see Manage users and roles.

    ", + "description_html": "

    Let's get your teammates on board!

    First, you'll need to invite them to your workspace before they can join specific projects:

    1. Click on your workspace name in the top-left corner, then select Settings from the dropdown.

    2. Head over to the Members tab - this is your user management hub. Click Add member on the top right.

    3. Enter your teammate's email address. Select a role for them (Admin, Member or Guest) that determines what they can do in the workspace.

    4. Your team member will get an email invite. Once they've joined your workspace, you can add them to specific projects.

    5. To do this, go to your project's Settings page.

    6. Find the Members section, select your teammate, and assign them a project role - this controls what they can do within just this project.


    That's it!

    To learn more about user management, see Manage users and roles.

    ", "description_stripped": "Let's get your teammates on board!First, you'll need to invite them to your workspace before they can join specific projects:Click on your workspace name in the top-left corner, then select Settings from the dropdown.Head over to the Members tab - this is your user management hub. Click Add member on the top right.Enter your teammate's email address. Select a role for them (Admin, Member or Guest) that determines what they can do in the workspace.Your team member will get an email invite. Once they've joined your workspace, you can add them to specific projects.To do this, go to your project's Settings page.Find the Members section, select your teammate, and assign them a project role - this controls what they can do within just this project.That's it!To learn more about user management, see Manage users and roles.", "sort_order": 3000, "state_id": 1, @@ -44,7 +44,7 @@ "id": 4, "name": "3. Create and assign Work Items ✏️", "sequence_id": 4, - "description_html": "

    A work item is the fundamental building block of your project. Think of these as the actionable tasks that move your project forward.

    Ready to add something to your project's to-do list? Here's how:

    1. Click the Add work item button in the top-right corner of the Work Items page.

    2. Give your task a clear title and add any details in the description.

    3. Set up the essentials:

      • Assign it to a team member (or yourself!)

      • Choose a priority level

      • Add start and due dates if there's a timeline

    Tip: Save time by using the keyboard shortcut C from anywhere in your project to quickly create a new work item!

    Want to dive deeper into all the things you can do with work items? Check out our documentation.

    ", + "description_html": "

    A work item is the fundamental building block of your project. Think of these as the actionable tasks that move your project forward.

    Ready to add something to your project's to-do list? Here's how:

    1. Click the Add work item button in the top-right corner of the Work Items page.

    2. Give your task a clear title and add any details in the description.

    3. Set up the essentials:

      • Assign it to a team member (or yourself!)

      • Choose a priority level

      • Add start and due dates if there's a timeline

    Tip: Save time by using the keyboard shortcut C from anywhere in your project to quickly create a new work item!

    Want to dive deeper into all the things you can do with work items? Check out our documentation.

    ", "description_stripped": "A work item is the fundamental building block of your project. Think of these as the actionable tasks that move your project forward.Ready to add something to your project's to-do list? Here's how:Click the Add work item button in the top-right corner of the Work Items page.Give your task a clear title and add any details in the description.Set up the essentials:Assign it to a team member (or yourself!)Choose a priority levelAdd start and due dates if there's a timelineTip: Save time by using the keyboard shortcut C from anywhere in your project to quickly create a new work item!Want to dive deeper into all the things you can do with work items? Check out our documentation.", "sort_order": 4000, "state_id": 3, @@ -58,7 +58,7 @@ "id": 5, "name": "4. Visualize your work 🔮", "sequence_id": 5, - "description_html": "

    Plane offers multiple ways to look at your work items depending on what you need to see. Let's explore how to change views and customize them!

    Switch between layouts

    1. Look at the top toolbar in your project. You'll see several layout icons.

    2. Click any of these icons to instantly switch between layouts.

    Tip: Different layouts work best for different needs. Try Board view for tracking progress, Calendar for deadline management, and Gantt for timeline planning! See Layouts for more info.

    Filter and display options

    Need to focus on specific work?

    1. Click the Filters dropdown in the toolbar. Select criteria and choose which items to show.

    2. Click the Display dropdown to tailor how the information appears in your layout

    3. Created the perfect setup? Save it for later by clicking the the Save View button.

    4. Access saved views anytime from the Views section in your sidebar.

    ", + "description_html": "

    Plane offers multiple ways to look at your work items depending on what you need to see. Let's explore how to change views and customize them!

    Switch between layouts

    1. Look at the top toolbar in your project. You'll see several layout icons.

    2. Click any of these icons to instantly switch between layouts.

    Tip: Different layouts work best for different needs. Try Board view for tracking progress, Calendar for deadline management, and Gantt for timeline planning! See Layouts for more info.

    Filter and display options

    Need to focus on specific work?

    1. Click the Filters dropdown in the toolbar. Select criteria and choose which items to show.

    2. Click the Display dropdown to tailor how the information appears in your layout

    3. Created the perfect setup? Save it for later by clicking the the Save View button.

    4. Access saved views anytime from the Views section in your sidebar.

    ", "description_stripped": "Plane offers multiple ways to look at your work items depending on what you need to see. Let's explore how to change views and customize them!Switch between layoutsLook at the top toolbar in your project. You'll see several layout icons.Click any of these icons to instantly switch between layouts.Tip: Different layouts work best for different needs. Try Board view for tracking progress, Calendar for deadline management, and Gantt for timeline planning! See Layouts for more info.Filter and display optionsNeed to focus on specific work?Click the Filters dropdown in the toolbar. Select criteria and choose which items to show.Click the Display dropdown to tailor how the information appears in your layoutCreated the perfect setup? Save it for later by clicking the the Save View button.Access saved views anytime from the Views section in your sidebar.", "sort_order": 5000, "state_id": 3, @@ -72,7 +72,7 @@ "id": 6, "name": "5. Use Cycles to time box tasks 🗓️", "sequence_id": 6, - "description_html": "

    A Cycle in Plane is like a sprint - a dedicated timeframe where your team focuses on completing specific work items. It helps you break down your project into manageable chunks with clear start and end dates so everyone knows what to work on and when it needs to be done.

    Setup Cycles

    1. Go to the Cycles section in your project (you can find it in the left sidebar)

    2. Click the Add cycle button in the top-right corner

    3. Enter details and set the start and end dates for your cycle.

    4. Click Create cycle and you're ready to go!

    5. Add existing work items to the Cycle or create new ones.

    Tip: To create a new Cycle quickly, just press Q from anywhere in your project!

    Want to learn more?

    • Starting and stopping cycles

    • Transferring work items between cycles

    • Tracking progress with charts

    Check out our detailed documentation for everything you need to know!

    ", + "description_html": "

    A Cycle in Plane is like a sprint - a dedicated timeframe where your team focuses on completing specific work items. It helps you break down your project into manageable chunks with clear start and end dates so everyone knows what to work on and when it needs to be done.

    Setup Cycles

    1. Go to the Cycles section in your project (you can find it in the left sidebar)

    2. Click the Add cycle button in the top-right corner

    3. Enter details and set the start and end dates for your cycle.

    4. Click Create cycle and you're ready to go!

    5. Add existing work items to the Cycle or create new ones.

    Tip: To create a new Cycle quickly, just press Q from anywhere in your project!

    Want to learn more?

    • Starting and stopping cycles

    • Transferring work items between cycles

    • Tracking progress with charts

    Check out our detailed documentation for everything you need to know!

    ", "description_stripped": "A Cycle in Plane is like a sprint - a dedicated timeframe where your team focuses on completing specific work items. It helps you break down your project into manageable chunks with clear start and end dates so everyone knows what to work on and when it needs to be done.Setup CyclesGo to the Cycles section in your project (you can find it in the left sidebar)Click the Add cycle button in the top-right cornerEnter details and set the start and end dates for your cycle.Click Create cycle and you're ready to go!Add existing work items to the Cycle or create new ones.Tip: To create a new Cycle quickly, just press Q from anywhere in your project!Want to learn more?Starting and stopping cyclesTransferring work items between cyclesTracking progress with chartsCheck out our detailed documentation for everything you need to know!", "sort_order": 6000, "state_id": 1, @@ -86,7 +86,7 @@ "id": 7, "name": "6. Customize your settings ⚙️", "sequence_id": 7, - "description_html": "

    Now that you're getting familiar with Plane, let's explore how you can customize settings to make it work just right for you and your team!

    Workspace settings

    Remember those workspace settings we mentioned when inviting team members? There's a lot more you can do there:

    • Invite and manage workspace members

    • Upgrade plans and manage billing

    • Import data from other tools

    • Export your data

    • Manage integrations

    Project Settings

    Each project has its own settings where you can:

    • Change project details and visibility

    • Invite specific members to just this project

    • Customize your workflow States (like adding a \"Testing\" state)

    • Create and organize Labels

    • Enable or disable features you need (or don't need)

    Your Profile Settings

    You can also customize your own personal experience! Click on your profile icon in the top-right corner to find:

    • Profile settings (update your name, photo, etc.)

    • Choose your timezone and preferred language for the interface

    • Email notification preferences (what you want to be alerted about)

    • Appearance settings (light/dark mode)

    Taking a few minutes to set things up just the way you like will make your everyday Plane experience much smoother!

    Note: Some settings are only available to workspace or project admins. If you don't see certain options, you might need admin access.

    ", + "description_html": "

    Now that you're getting familiar with Plane, let's explore how you can customize settings to make it work just right for you and your team!

    Workspace settings

    Remember those workspace settings we mentioned when inviting team members? There's a lot more you can do there:

    • Invite and manage workspace members

    • Upgrade plans and manage billing

    • Import data from other tools

    • Export your data

    • Manage integrations

    Project Settings

    Each project has its own settings where you can:

    • Change project details and visibility

    • Invite specific members to just this project

    • Customize your workflow States (like adding a \"Testing\" state)

    • Create and organize Labels

    • Enable or disable features you need (or don't need)

    Your Profile Settings

    You can also customize your own personal experience! Click on your profile icon in the top-right corner to find:

    • Profile settings (update your name, photo, etc.)

    • Choose your timezone and preferred language for the interface

    • Email notification preferences (what you want to be alerted about)

    • Appearance settings (light/dark mode)

    Taking a few minutes to set things up just the way you like will make your everyday Plane experience much smoother!

    Note: Some settings are only available to workspace or project admins. If you don't see certain options, you might need admin access.

    ", "description_stripped": "Now that you're getting familiar with Plane, let's explore how you can customize settings to make it work just right for you and your team!Workspace settingsRemember those workspace settings we mentioned when inviting team members? There's a lot more you can do there:Invite and manage workspace membersUpgrade plans and manage billingImport data from other toolsExport your dataManage integrationsProject SettingsEach project has its own settings where you can:Change project details and visibilityInvite specific members to just this projectCustomize your workflow States (like adding a \"Testing\" state)Create and organize LabelsEnable or disable features you need (or don't need)Your Profile SettingsYou can also customize your own personal experience! Click on your profile icon in the top-right corner to find:Profile settings (update your name, photo, etc.)Choose your timezone and preferred language for the interfaceEmail notification preferences (what you want to be alerted about)Appearance settings (light/dark mode)Taking a few minutes to set things up just the way you like will make your everyday Plane experience much smoother!Note: Some settings are only available to workspace or project admins. If you don't see certain options, you might need admin access.", "sort_order": 7000, "state_id": 1, diff --git a/apps/api/plane/seeds/data/pages.json b/apps/api/plane/seeds/data/pages.json index d719220bfef..00c5c91ef0a 100644 --- a/apps/api/plane/seeds/data/pages.json +++ b/apps/api/plane/seeds/data/pages.json @@ -1,30 +1,30 @@ [ - { - "id": 1, - "name": "Project Design Spec", - "project_id": 1, - "description_html": "

    Welcome to your Project Pages — the documentation hub for this specific project.
    Each project in Plane can have its own Wiki space where you track plans, specs, updates, and learnings — all connected to your issues and modules.

    🧭 Project Summary

    Field

    Details

    Project Name

    Add your project name

    Owner

    Add project owner(s)

    Status

    🟢 Active / 🟡 In Progress / 🔴 Blocked

    Start Date

    Target Release

    Linked Modules

    Engineering, Security

    Cycle(s)

    Cycle 1, Cycle 2

    🧩 Use tables to summarize key project metadata or links.

    🎯 Goals & Objectives

    🎯 Primary Goals

    • Deliver MVP with all core features

    • Validate feature adoption with early users

    • Prepare launch plan for v1 release

    Success Metrics

    Metric

    Target

    Owner

    User adoption

    100 active users

    Growth

    Performance

    < 200ms latency

    Backend

    Design feedback

    ≥ 8/10 average rating

    Design

    📈 Define measurable outcomes and track progress alongside issues.

    🧩 Scope & Deliverables

    Deliverable

    Owner

    Status

    Authentication flow

    Backend

    Done

    Issue board UI

    Frontend

    🏗 In Progress

    API integration

    Backend

    Pending

    Documentation

    PM

    📝 Drafting

    🧩 Use tables or checklists to track scope and ownership.

    🧱 Architecture or System Design

    Use this section for technical deep dives or diagrams.

    Frontend → GraphQL → Backend → PostgreSQL\nRedis for caching | RabbitMQ for background jobs

    ", - "description": "{\"type\": \"doc\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Welcome to your \", \"type\": \"text\"}, {\"text\": \"Project Pages\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}, {\"text\": \" — the documentation hub for this specific project.\", \"type\": \"text\"}, {\"type\": \"hardBreak\"}, {\"text\": \"Each project in Plane can have its own Wiki space where you track \", \"type\": \"text\"}, {\"text\": \"plans, specs, updates, and learnings\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}, {\"text\": \" — all connected to your issues and modules.\", \"type\": \"text\"}]}, {\"type\": \"horizontalRule\"}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"compass\"}}, {\"text\": \" Project Summary\", \"type\": \"text\"}]}, {\"type\": \"table\", \"content\": [{\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Field\", \"type\": \"text\"}]}]}, {\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Details\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Project Name\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"pencil\"}}, {\"text\": \" Add your project name\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Owner\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Add project owner(s)\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Status\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"green_circle\"}}, {\"text\": \" Active / \", \"type\": \"text\"}, {\"type\": \"emoji\", \"attrs\": {\"name\": \"yellow_circle\"}}, {\"text\": \" In Progress / \", \"type\": \"text\"}, {\"type\": \"emoji\", \"attrs\": {\"name\": \"red_circle\"}}, {\"text\": \" Blocked\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Start Date\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"—\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Target Release\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"—\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Linked Modules\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Engineering, Security\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Cycle(s)\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Cycle 1, Cycle 2\", \"type\": \"text\"}]}]}]}]}, {\"type\": \"blockquote\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"jigsaw\"}}, {\"text\": \" Use tables to summarize key project metadata or links.\", \"type\": \"text\"}]}]}, {\"type\": \"horizontalRule\"}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"bullseye\"}}, {\"text\": \" Goals & Objectives\", \"type\": \"text\"}]}, {\"type\": \"heading\", \"attrs\": {\"level\": 3, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"bullseye\"}}, {\"text\": \" Primary Goals\", \"type\": \"text\"}]}, {\"type\": \"bulletList\", \"content\": [{\"type\": \"listItem\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Deliver MVP with all core features\", \"type\": \"text\"}]}]}, {\"type\": \"listItem\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Validate feature adoption with early users\", \"type\": \"text\"}]}]}, {\"type\": \"listItem\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Prepare launch plan for v1 release\", \"type\": \"text\"}]}]}]}, {\"type\": \"heading\", \"attrs\": {\"level\": 3, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"gear\"}}, {\"text\": \" Success Metrics\", \"type\": \"text\"}]}, {\"type\": \"table\", \"content\": [{\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Metric\", \"type\": \"text\"}]}]}, {\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Target\", \"type\": \"text\"}]}]}, {\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Owner\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"User adoption\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"100 active users\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Growth\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Performance\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"< 200ms latency\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Backend\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Design feedback\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"≥ 8/10 average rating\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Design\", \"type\": \"text\"}]}]}]}]}, {\"type\": \"blockquote\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"chart_increasing\"}}, {\"text\": \" Define measurable outcomes and track progress alongside issues.\", \"type\": \"text\"}]}]}, {\"type\": \"horizontalRule\"}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"jigsaw\"}}, {\"text\": \" Scope & Deliverables\", \"type\": \"text\"}]}, {\"type\": \"table\", \"content\": [{\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Deliverable\", \"type\": \"text\"}]}]}, {\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Owner\", \"type\": \"text\"}]}]}, {\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Status\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Authentication flow\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Backend\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"check_mark_button\"}}, {\"text\": \" Done\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Issue board UI\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Frontend\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"building_construction\"}}, {\"text\": \" In Progress\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"API integration\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Backend\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"hourglass_flowing_sand\"}}, {\"text\": \" Pending\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Documentation\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"PM\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"memo\"}}, {\"text\": \" Drafting\", \"type\": \"text\"}]}]}]}]}, {\"type\": \"blockquote\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"jigsaw\"}}, {\"text\": \" Use tables or checklists to track scope and ownership.\", \"type\": \"text\"}]}]}, {\"type\": \"horizontalRule\"}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"bricks\"}}, {\"text\": \" Architecture or System Design\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Use this section for \", \"type\": \"text\"}, {\"text\": \"technical deep dives\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}, {\"text\": \" or diagrams.\", \"type\": \"text\"}]}, {\"type\": \"codeBlock\", \"attrs\": {\"language\": \"bash\"}, \"content\": [{\"text\": \"Frontend → GraphQL → Backend → PostgreSQL\\nRedis for caching | RabbitMQ for background jobs\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}}]}", - "description_stripped": "Welcome to your Project Pages — the documentation hub for this specific project.Each project in Plane can have its own Wiki space where you track plans, specs, updates, and learnings — all connected to your issues and modules.🧭 Project SummaryFieldDetailsProject Name✏ Add your project nameOwnerAdd project owner(s)Status🟢 Active / 🟡 In Progress / 🔴 BlockedStart Date—Target Release—Linked ModulesEngineering, SecurityCycle(s)Cycle 1, Cycle 2🧩 Use tables to summarize key project metadata or links.🎯 Goals & Objectives🎯 Primary GoalsDeliver MVP with all core featuresValidate feature adoption with early usersPrepare launch plan for v1 release⚙ Success MetricsMetricTargetOwnerUser adoption100 active usersGrowthPerformance< 200ms latencyBackendDesign feedback≥ 8/10 average ratingDesign📈 Define measurable outcomes and track progress alongside issues.🧩 Scope & DeliverablesDeliverableOwnerStatusAuthentication flowBackend✅ DoneIssue board UIFrontend🏗 In ProgressAPI integrationBackend⏳ PendingDocumentationPM📝 Drafting🧩 Use tables or checklists to track scope and ownership.🧱 Architecture or System DesignUse this section for technical deep dives or diagrams.Frontend → GraphQL → Backend → PostgreSQL\nRedis for caching | RabbitMQ for background jobs", - "type": "PROJECT", - "access": 0, - "logo_props": { - "emoji": { - "url": "https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/1f680.png", - "value": "128640" - }, - "in_use": "emoji" - } - }, - { - "id": 2, - "name": "Project Draft proposal", - "project_id": 1, - "description": "{\"type\": \"doc\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"This is your \", \"type\": \"text\"}, {\"text\": \"Project Draft area\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}, {\"text\": \" — a private space inside the project where you can experiment, outline ideas, or prepare content before sharing it on the public Project Page.\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"It’s visible only to you (and collaborators you explicitly share with).\", \"type\": \"text\"}]}, {\"type\": \"horizontalRule\"}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"writing_hand\"}}, {\"text\": \" Current Work in Progress\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}}, {\"type\": \"blockquote\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"speech_balloon\"}}, {\"text\": \" Use this section to jot down raw ideas, rough notes, or specs that aren’t ready yet.\", \"type\": \"text\"}]}]}, {\"type\": \"taskList\", \"content\": [{\"type\": \"taskItem\", \"attrs\": {\"checked\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \" Outline project summary and goals\", \"type\": \"text\"}]}]}, {\"type\": \"taskItem\", \"attrs\": {\"checked\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \" Draft new feature spec\", \"type\": \"text\"}]}]}, {\"type\": \"taskItem\", \"attrs\": {\"checked\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \" Review dependency list\", \"type\": \"text\"}]}]}, {\"type\": \"taskItem\", \"attrs\": {\"checked\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \" Collect team feedback for next iteration\", \"type\": \"text\"}]}]}]}, {\"type\": \"blockquote\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"check_mark_button\"}}, {\"text\": \" Tip: Turn these items into actionable issues when finalized.\", \"type\": \"text\"}]}]}, {\"type\": \"horizontalRule\"}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"bricks\"}}, {\"text\": \" Prototype Commands (if technical)\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"You can also use \", \"type\": \"text\"}, {\"text\": \"code blocks\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}, {\"text\": \" to store snippets, scripts, or notes:\", \"type\": \"text\"}]}, {\"type\": \"codeBlock\", \"attrs\": {\"language\": \"bash\"}, \"content\": [{\"text\": \"# Rebuild Docker containers\\ndocker compose build backend frontend\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}}]}", - "description_html": "

    This is your Project Draft area — a private space inside the project where you can experiment, outline ideas, or prepare content before sharing it on the public Project Page.

    It’s visible only to you (and collaborators you explicitly share with).

    Current Work in Progress

    💬 Use this section to jot down raw ideas, rough notes, or specs that aren’t ready yet.

    • Outline project summary and goals

    • Draft new feature spec

    • Review dependency list

    • Collect team feedback for next iteration

    Tip: Turn these items into actionable issues when finalized.

    🧱 Prototype Commands (if technical)

    You can also use code blocks to store snippets, scripts, or notes:

    # Rebuild Docker containers\ndocker compose build backend frontend

    ", - "description_stripped": "This is your Project Draft area — a private space inside the project where you can experiment, outline ideas, or prepare content before sharing it on the public Project Page.It’s visible only to you (and collaborators you explicitly share with).✍ Current Work in Progress💬 Use this section to jot down raw ideas, rough notes, or specs that aren’t ready yet. Outline project summary and goals Draft new feature spec Review dependency list Collect team feedback for next iteration✅ Tip: Turn these items into actionable issues when finalized.🧱 Prototype Commands (if technical)You can also use code blocks to store snippets, scripts, or notes:# Rebuild Docker containers\ndocker compose build backend frontend", - "type": "PROJECT", - "access": 1, - "logo_props": "{\"emoji\": {\"url\": \"https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/1f9f1.png\", \"value\": \"129521\"}, \"in_use\": \"emoji\"}" + { + "id": 1, + "name": "Project Design Spec", + "project_id": 1, + "description_html": "

    Welcome to your Project Pages — the documentation hub for this specific project.
    Each project in Plane can have its own Wiki space where you track plans, specs, updates, and learnings — all connected to your issues and modules.

    🧭 Project Summary

    Field

    Details

    Project Name

    Add your project name

    Owner

    Add project owner(s)

    Status

    🟢 Active / 🟡 In Progress / 🔴 Blocked

    Start Date

    Target Release

    Linked Modules

    Engineering, Security

    Cycle(s)

    Cycle 1, Cycle 2

    🧩 Use tables to summarize key project metadata or links.

    🎯 Goals & Objectives

    🎯 Primary Goals

    • Deliver MVP with all core features

    • Validate feature adoption with early users

    • Prepare launch plan for v1 release

    Success Metrics

    Metric

    Target

    Owner

    User adoption

    100 active users

    Growth

    Performance

    < 200ms latency

    Backend

    Design feedback

    ≥ 8/10 average rating

    Design

    📈 Define measurable outcomes and track progress alongside issues.

    🧩 Scope & Deliverables

    Deliverable

    Owner

    Status

    Authentication flow

    Backend

    Done

    Issue board UI

    Frontend

    🏗 In Progress

    API integration

    Backend

    Pending

    Documentation

    PM

    📝 Drafting

    🧩 Use tables or checklists to track scope and ownership.

    🧱 Architecture or System Design

    Use this section for technical deep dives or diagrams.

    Frontend → GraphQL → Backend → PostgreSQL\nRedis for caching | RabbitMQ for background jobs

    ", + "description": "{\"type\": \"doc\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Welcome to your \", \"type\": \"text\"}, {\"text\": \"Project Pages\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}, {\"text\": \" — the documentation hub for this specific project.\", \"type\": \"text\"}, {\"type\": \"hardBreak\"}, {\"text\": \"Each project in Plane can have its own Wiki space where you track \", \"type\": \"text\"}, {\"text\": \"plans, specs, updates, and learnings\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}, {\"text\": \" — all connected to your issues and modules.\", \"type\": \"text\"}]}, {\"type\": \"horizontalRule\"}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"compass\"}}, {\"text\": \" Project Summary\", \"type\": \"text\"}]}, {\"type\": \"table\", \"content\": [{\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Field\", \"type\": \"text\"}]}]}, {\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Details\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Project Name\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"pencil\"}}, {\"text\": \" Add your project name\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Owner\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Add project owner(s)\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Status\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"green_circle\"}}, {\"text\": \" Active / \", \"type\": \"text\"}, {\"type\": \"emoji\", \"attrs\": {\"name\": \"yellow_circle\"}}, {\"text\": \" In Progress / \", \"type\": \"text\"}, {\"type\": \"emoji\", \"attrs\": {\"name\": \"red_circle\"}}, {\"text\": \" Blocked\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Start Date\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"—\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Target Release\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"—\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Linked Modules\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Engineering, Security\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Cycle(s)\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [666], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Cycle 1, Cycle 2\", \"type\": \"text\"}]}]}]}]}, {\"type\": \"blockquote\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"jigsaw\"}}, {\"text\": \" Use tables to summarize key project metadata or links.\", \"type\": \"text\"}]}]}, {\"type\": \"horizontalRule\"}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"bullseye\"}}, {\"text\": \" Goals & Objectives\", \"type\": \"text\"}]}, {\"type\": \"heading\", \"attrs\": {\"level\": 3, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"bullseye\"}}, {\"text\": \" Primary Goals\", \"type\": \"text\"}]}, {\"type\": \"bulletList\", \"content\": [{\"type\": \"listItem\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Deliver MVP with all core features\", \"type\": \"text\"}]}]}, {\"type\": \"listItem\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Validate feature adoption with early users\", \"type\": \"text\"}]}]}, {\"type\": \"listItem\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Prepare launch plan for v1 release\", \"type\": \"text\"}]}]}]}, {\"type\": \"heading\", \"attrs\": {\"level\": 3, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"gear\"}}, {\"text\": \" Success Metrics\", \"type\": \"text\"}]}, {\"type\": \"table\", \"content\": [{\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Metric\", \"type\": \"text\"}]}]}, {\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Target\", \"type\": \"text\"}]}]}, {\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Owner\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"User adoption\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"100 active users\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Growth\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Performance\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"< 200ms latency\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Backend\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Design feedback\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"≥ 8/10 average rating\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Design\", \"type\": \"text\"}]}]}]}]}, {\"type\": \"blockquote\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"chart_increasing\"}}, {\"text\": \" Define measurable outcomes and track progress alongside issues.\", \"type\": \"text\"}]}]}, {\"type\": \"horizontalRule\"}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"jigsaw\"}}, {\"text\": \" Scope & Deliverables\", \"type\": \"text\"}]}, {\"type\": \"table\", \"content\": [{\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Deliverable\", \"type\": \"text\"}]}]}, {\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Owner\", \"type\": \"text\"}]}]}, {\"type\": \"tableHeader\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"background\": \"none\", \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Status\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Authentication flow\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Backend\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"check_mark_button\"}}, {\"text\": \" Done\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Issue board UI\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Frontend\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"building_construction\"}}, {\"text\": \" In Progress\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"API integration\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Backend\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"hourglass_flowing_sand\"}}, {\"text\": \" Pending\", \"type\": \"text\"}]}]}]}, {\"type\": \"tableRow\", \"attrs\": {\"textColor\": null, \"background\": null}, \"content\": [{\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Documentation\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"PM\", \"type\": \"text\"}]}]}, {\"type\": \"tableCell\", \"attrs\": {\"colspan\": 1, \"rowspan\": 1, \"colwidth\": [150], \"textColor\": null, \"background\": null, \"hideContent\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"memo\"}}, {\"text\": \" Drafting\", \"type\": \"text\"}]}]}]}]}, {\"type\": \"blockquote\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"jigsaw\"}}, {\"text\": \" Use tables or checklists to track scope and ownership.\", \"type\": \"text\"}]}]}, {\"type\": \"horizontalRule\"}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"bricks\"}}, {\"text\": \" Architecture or System Design\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"Use this section for \", \"type\": \"text\"}, {\"text\": \"technical deep dives\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}, {\"text\": \" or diagrams.\", \"type\": \"text\"}]}, {\"type\": \"codeBlock\", \"attrs\": {\"language\": \"bash\"}, \"content\": [{\"text\": \"Frontend → GraphQL → Backend → PostgreSQL\\nRedis for caching | RabbitMQ for background jobs\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}}]}", + "description_stripped": "Welcome to your Project Pages — the documentation hub for this specific project.Each project in Plane can have its own Wiki space where you track plans, specs, updates, and learnings — all connected to your issues and modules.🧭 Project SummaryFieldDetailsProject Name✏ Add your project nameOwnerAdd project owner(s)Status🟢 Active / 🟡 In Progress / 🔴 BlockedStart Date—Target Release—Linked ModulesEngineering, SecurityCycle(s)Cycle 1, Cycle 2🧩 Use tables to summarize key project metadata or links.🎯 Goals & Objectives🎯 Primary GoalsDeliver MVP with all core featuresValidate feature adoption with early usersPrepare launch plan for v1 release⚙ Success MetricsMetricTargetOwnerUser adoption100 active usersGrowthPerformance< 200ms latencyBackendDesign feedback≥ 8/10 average ratingDesign📈 Define measurable outcomes and track progress alongside issues.🧩 Scope & DeliverablesDeliverableOwnerStatusAuthentication flowBackend✅ DoneIssue board UIFrontend🏗 In ProgressAPI integrationBackend⏳ PendingDocumentationPM📝 Drafting🧩 Use tables or checklists to track scope and ownership.🧱 Architecture or System DesignUse this section for technical deep dives or diagrams.Frontend → GraphQL → Backend → PostgreSQL\nRedis for caching | RabbitMQ for background jobs", + "type": "PROJECT", + "access": 0, + "logo_props": { + "emoji": { + "url": "https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/1f680.png", + "value": "128640" + }, + "in_use": "emoji" } -] \ No newline at end of file + }, + { + "id": 2, + "name": "Project Draft proposal", + "project_id": 1, + "description": "{\"type\": \"doc\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"This is your \", \"type\": \"text\"}, {\"text\": \"Project Draft area\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}, {\"text\": \" — a private space inside the project where you can experiment, outline ideas, or prepare content before sharing it on the public Project Page.\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"It’s visible only to you (and collaborators you explicitly share with).\", \"type\": \"text\"}]}, {\"type\": \"horizontalRule\"}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"writing_hand\"}}, {\"text\": \" Current Work in Progress\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}}, {\"type\": \"blockquote\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"speech_balloon\"}}, {\"text\": \" Use this section to jot down raw ideas, rough notes, or specs that aren’t ready yet.\", \"type\": \"text\"}]}]}, {\"type\": \"taskList\", \"content\": [{\"type\": \"taskItem\", \"attrs\": {\"checked\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \" Outline project summary and goals\", \"type\": \"text\"}]}]}, {\"type\": \"taskItem\", \"attrs\": {\"checked\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \" Draft new feature spec\", \"type\": \"text\"}]}]}, {\"type\": \"taskItem\", \"attrs\": {\"checked\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \" Review dependency list\", \"type\": \"text\"}]}]}, {\"type\": \"taskItem\", \"attrs\": {\"checked\": false}, \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \" Collect team feedback for next iteration\", \"type\": \"text\"}]}]}]}, {\"type\": \"blockquote\", \"content\": [{\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"check_mark_button\"}}, {\"text\": \" Tip: Turn these items into actionable issues when finalized.\", \"type\": \"text\"}]}]}, {\"type\": \"horizontalRule\"}, {\"type\": \"heading\", \"attrs\": {\"level\": 2, \"textAlign\": null}, \"content\": [{\"type\": \"emoji\", \"attrs\": {\"name\": \"bricks\"}}, {\"text\": \" Prototype Commands (if technical)\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}, \"content\": [{\"text\": \"You can also use \", \"type\": \"text\"}, {\"text\": \"code blocks\", \"type\": \"text\", \"marks\": [{\"type\": \"bold\"}]}, {\"text\": \" to store snippets, scripts, or notes:\", \"type\": \"text\"}]}, {\"type\": \"codeBlock\", \"attrs\": {\"language\": \"bash\"}, \"content\": [{\"text\": \"# Rebuild Docker containers\\ndocker compose build backend frontend\", \"type\": \"text\"}]}, {\"type\": \"paragraph\", \"attrs\": {\"textAlign\": null}}]}", + "description_html": "

    This is your Project Draft area — a private space inside the project where you can experiment, outline ideas, or prepare content before sharing it on the public Project Page.

    It’s visible only to you (and collaborators you explicitly share with).

    Current Work in Progress

    💬 Use this section to jot down raw ideas, rough notes, or specs that aren’t ready yet.

    • Outline project summary and goals

    • Draft new feature spec

    • Review dependency list

    • Collect team feedback for next iteration

    Tip: Turn these items into actionable issues when finalized.

    🧱 Prototype Commands (if technical)

    You can also use code blocks to store snippets, scripts, or notes:

    # Rebuild Docker containers\ndocker compose build backend frontend

    ", + "description_stripped": "This is your Project Draft area — a private space inside the project where you can experiment, outline ideas, or prepare content before sharing it on the public Project Page.It’s visible only to you (and collaborators you explicitly share with).✍ Current Work in Progress💬 Use this section to jot down raw ideas, rough notes, or specs that aren’t ready yet. Outline project summary and goals Draft new feature spec Review dependency list Collect team feedback for next iteration✅ Tip: Turn these items into actionable issues when finalized.🧱 Prototype Commands (if technical)You can also use code blocks to store snippets, scripts, or notes:# Rebuild Docker containers\ndocker compose build backend frontend", + "type": "PROJECT", + "access": 1, + "logo_props": "{\"emoji\": {\"url\": \"https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/1f9f1.png\", \"value\": \"129521\"}, \"in_use\": \"emoji\"}" + } +] diff --git a/apps/space/app/error.tsx b/apps/space/app/error.tsx index 2330b903383..5f3ecace49a 100644 --- a/apps/space/app/error.tsx +++ b/apps/space/app/error.tsx @@ -10,8 +10,8 @@ function ErrorPage() {
    -

    Yikes! That doesn{"'"}t look good.

    -

    +

    Yikes! That doesn{"'"}t look good.

    +

    That crashed Plane, pun intended. No worries, though. Our engineers have been notified. If you have more details, please write to{" "} @@ -30,10 +30,10 @@ function ErrorPage() {

    - - {/* */}
    diff --git a/apps/space/app/issues/[anchor]/layout.tsx b/apps/space/app/issues/[anchor]/layout.tsx index 60a171bcf5a..e32b008a242 100644 --- a/apps/space/app/issues/[anchor]/layout.tsx +++ b/apps/space/app/issues/[anchor]/layout.tsx @@ -127,10 +127,10 @@ function IssuesLayout(props: Route.ComponentProps) { return ( <>
    -
    +
    -
    +
    diff --git a/apps/space/app/not-found.tsx b/apps/space/app/not-found.tsx index 9fcfd8a74b3..411859ac04e 100644 --- a/apps/space/app/not-found.tsx +++ b/apps/space/app/not-found.tsx @@ -5,13 +5,13 @@ function NotFound() { return (
    -
    +
    Something went wrong
    -

    That didn{"'"}t work

    -

    +

    That didn{"'"}t work

    +

    Check the URL you are entering in the browser{"'"}s address bar and try again.

    diff --git a/apps/space/core/components/account/auth-forms/auth-banner.tsx b/apps/space/core/components/account/auth-forms/auth-banner.tsx index 3ad6e775c6a..689fde5e942 100644 --- a/apps/space/core/components/account/auth-forms/auth-banner.tsx +++ b/apps/space/core/components/account/auth-forms/auth-banner.tsx @@ -13,13 +13,13 @@ export function AuthBanner(props: TAuthBanner) { if (!bannerData) return <>; return ( -
    +
    - +
    -
    {bannerData?.message}
    +
    {bannerData?.message}
    handleBannerData && handleBannerData(undefined)} > diff --git a/apps/space/core/components/account/auth-forms/auth-header.tsx b/apps/space/core/components/account/auth-forms/auth-header.tsx index 9b0c95c3ea8..cac429ffdfc 100644 --- a/apps/space/core/components/account/auth-forms/auth-header.tsx +++ b/apps/space/core/components/account/auth-forms/auth-header.tsx @@ -44,8 +44,8 @@ export function AuthHeader(props: TAuthHeader) { return ( <>
    - {header} - {subHeader} + {header} + {subHeader}
    ); diff --git a/apps/space/core/components/account/auth-forms/email.tsx b/apps/space/core/components/account/auth-forms/email.tsx index 9ed44db83a7..f407219b0f0 100644 --- a/apps/space/core/components/account/auth-forms/email.tsx +++ b/apps/space/core/components/account/auth-forms/email.tsx @@ -46,13 +46,13 @@ export const AuthEmailForm = observer(function AuthEmailForm(props: TAuthEmailFo return (
    -
    - diff --git a/apps/space/core/components/account/auth-forms/password.tsx b/apps/space/core/components/account/auth-forms/password.tsx index 5b99cda2e61..cf622f92f7d 100644 --- a/apps/space/core/components/account/auth-forms/password.tsx +++ b/apps/space/core/components/account/auth-forms/password.tsx @@ -116,12 +116,10 @@ export const AuthPasswordForm = observer(function AuthPasswordForm(props: Props)
    -
    +
    handleFormChange("email", e.target.value)} placeholder="name@company.com" - className={`disable-autofill-style h-10 w-full placeholder:text-custom-text-400 border-0`} + className={`disable-autofill-style h-10 w-full placeholder:text-placeholder border-0`} disabled /> {passwordFormData.email.length > 0 && ( @@ -142,17 +140,17 @@ export const AuthPasswordForm = observer(function AuthPasswordForm(props: Props)
    -
    +
    handleFormChange("password", e.target.value)} placeholder="Enter password" - className="disable-autofill-style h-10 w-full border border-custom-border-100 !bg-custom-background-100 pr-12 placeholder:text-custom-text-400" + className="disable-autofill-style h-10 w-full border border-subtle !bg-surface-1 pr-12 placeholder:text-placeholder" onFocus={() => setIsPasswordInputFocused(true)} onBlur={() => setIsPasswordInputFocused(false)} autoComplete="on" @@ -175,17 +173,17 @@ export const AuthPasswordForm = observer(function AuthPasswordForm(props: Props) {mode === EAuthModes.SIGN_UP && (
    -
    {mode === EAuthModes.SIGN_IN ? ( <> - )} ) : ( - )} diff --git a/apps/space/core/components/account/auth-forms/unique-code.tsx b/apps/space/core/components/account/auth-forms/unique-code.tsx index fff03383719..fd347bfd94a 100644 --- a/apps/space/core/components/account/auth-forms/unique-code.tsx +++ b/apps/space/core/components/account/auth-forms/unique-code.tsx @@ -80,12 +80,10 @@ export function AuthUniqueCodeForm(props: TAuthUniqueCodeForm) {
    -
    +
    handleFormChange("email", e.target.value)} placeholder="name@company.com" - className={`disable-autofill-style h-10 w-full placeholder:text-custom-text-400 border-0`} + className={`disable-autofill-style h-10 w-full placeholder:text-placeholder border-0`} disabled /> {uniqueCodeFormData.email.length > 0 && ( @@ -106,7 +104,7 @@ export function AuthUniqueCodeForm(props: TAuthUniqueCodeForm) {
    -
    +

    Paste the code sent to your email @@ -127,8 +125,8 @@ export function AuthUniqueCodeForm(props: TAuthUniqueCodeForm) { onClick={() => generateNewCode(uniqueCodeFormData.email)} className={`${ isRequestNewCodeDisabled - ? "text-custom-text-400" - : "font-medium text-custom-primary-300 hover:text-custom-primary-200" + ? "text-placeholder" + : "font-medium text-accent-secondary hover:text-accent-secondary" }`} disabled={isRequestNewCodeDisabled} > @@ -142,7 +140,7 @@ export function AuthUniqueCodeForm(props: TAuthUniqueCodeForm) {

    -
    diff --git a/apps/space/core/components/account/terms-and-conditions.tsx b/apps/space/core/components/account/terms-and-conditions.tsx index 14e51ac63b8..2b3e8daa973 100644 --- a/apps/space/core/components/account/terms-and-conditions.tsx +++ b/apps/space/core/components/account/terms-and-conditions.tsx @@ -8,14 +8,14 @@ export function TermsAndConditions(props: Props) { const { isSignUp = false } = props; return ( -

    +

    {isSignUp ? "By creating an account" : "By signing in"}, you agree to our{" \n"} - Terms of Service + Terms of Service {" "} and{" "} - Privacy Policy + Privacy Policy {"."}

    diff --git a/apps/space/core/components/account/user-logged-in.tsx b/apps/space/core/components/account/user-logged-in.tsx index 0e47d6e17d5..fb719cd7230 100644 --- a/apps/space/core/components/account/user-logged-in.tsx +++ b/apps/space/core/components/account/user-logged-in.tsx @@ -16,20 +16,20 @@ export const UserLoggedIn = observer(function UserLoggedIn() { return (
    -
    - +
    +
    -
    +
    User already logged in
    -

    Nice! Just one more step.

    -

    +

    Nice! Just one more step.

    +

    Enter the public-share URL or link of the view or Page you are trying to see in the browser{"'"}s address bar.

    diff --git a/apps/space/core/components/common/powered-by.tsx b/apps/space/core/components/common/powered-by.tsx index 116c4c40fe8..e43c27ca686 100644 --- a/apps/space/core/components/common/powered-by.tsx +++ b/apps/space/core/components/common/powered-by.tsx @@ -15,12 +15,12 @@ export function PoweredBy(props: TPoweredBy) { return ( - -
    + +
    Powered by Plane Publish
    diff --git a/apps/space/core/components/common/project-logo.tsx b/apps/space/core/components/common/project-logo.tsx index 5f7869afe23..7319826c83e 100644 --- a/apps/space/core/components/common/project-logo.tsx +++ b/apps/space/core/components/common/project-logo.tsx @@ -17,7 +17,7 @@ export function ProjectLogo(props: Props) { style={{ color: logo.icon.color, }} - className={cn("material-symbols-rounded text-base", className)} + className={cn("material-symbols-rounded text-14", className)} > {logo.icon.name} @@ -25,7 +25,7 @@ export function ProjectLogo(props: Props) { if (logo.in_use === "emoji" && logo.emoji) return ( - + {logo.emoji.value?.split("-").map((emoji) => String.fromCodePoint(parseInt(emoji, 10)))} ); diff --git a/apps/space/core/components/editor/embeds/mentions/user.tsx b/apps/space/core/components/editor/embeds/mentions/user.tsx index bb3cc375627..33265537b2b 100644 --- a/apps/space/core/components/editor/embeds/mentions/user.tsx +++ b/apps/space/core/components/editor/embeds/mentions/user.tsx @@ -19,7 +19,7 @@ export const EditorUserMention = observer(function EditorUserMention(props: Prop if (!userDetails) { return ( -
    +
    @deactivated user
    ); @@ -27,12 +27,9 @@ export const EditorUserMention = observer(function EditorUserMention(props: Prop return (
    @{userDetails?.member__display_name}
    diff --git a/apps/space/core/components/editor/lite-text-editor.tsx b/apps/space/core/components/editor/lite-text-editor.tsx index d6d487dd7ca..dc17219caf4 100644 --- a/apps/space/core/components/editor/lite-text-editor.tsx +++ b/apps/space/core/components/editor/lite-text-editor.tsx @@ -59,7 +59,7 @@ export const LiteTextEditor = React.forwardRef(function LiteTextEditor( }); return ( -
    +
    -
    +
    +
    {Object.keys(toolbarItems).map((key, index) => (
    @@ -65,9 +65,9 @@ export function IssueCommentToolbar(props: Props) { +

    {item.name} - {item.shortcut && {item.shortcut.join(" + ")}} + {item.shortcut && {item.shortcut.join(" + ")}}

    } > @@ -75,15 +75,15 @@ export function IssueCommentToolbar(props: Props) { type="button" onClick={() => executeCommand(item)} className={cn( - "grid place-items-center aspect-square rounded-sm p-0.5 text-custom-text-400 hover:bg-custom-background-80", + "grid place-items-center aspect-square rounded-xs p-0.5 text-placeholder hover:bg-layer-transparent-hover", { - "bg-custom-background-80 text-custom-text-100": isItemActive, + "bg-layer-transparent-hover text-primary": isItemActive, } )} > @@ -99,7 +99,6 @@ export function IssueCommentToolbar(props: Props) {
    diff --git a/apps/space/core/components/issues/filters/applied-filters/filters-list.tsx b/apps/space/core/components/issues/filters/applied-filters/filters-list.tsx index 6fd9352ef26..73be2c10599 100644 --- a/apps/space/core/components/issues/filters/applied-filters/filters-list.tsx +++ b/apps/space/core/components/issues/filters/applied-filters/filters-list.tsx @@ -30,9 +30,9 @@ export const AppliedFiltersList = observer(function AppliedFiltersList(props: Pr return (
    - {replaceUnderscoreIfSnakeCase(filterKey)} + {replaceUnderscoreIfSnakeCase(filterKey)}
    {filterKey === "priority" && ( handleRemoveFilter(filterKey, null)} > @@ -62,7 +62,7 @@ export const AppliedFiltersList = observer(function AppliedFiltersList(props: Pr -
    - ))} + {values?.map((priority) => ( +
    + + {priority} + +
    + ))} ); } diff --git a/apps/space/core/components/issues/filters/applied-filters/root.tsx b/apps/space/core/components/issues/filters/applied-filters/root.tsx index 2571edadaeb..965ea473c9c 100644 --- a/apps/space/core/components/issues/filters/applied-filters/root.tsx +++ b/apps/space/core/components/issues/filters/applied-filters/root.tsx @@ -89,7 +89,7 @@ export const IssueAppliedFilters = observer(function IssueAppliedFilters(props: if (Object.keys(appliedFilters).length === 0) return null; return ( -
    +
    +
    {stateDetails.name} @@ -46,7 +46,7 @@ export function FiltersDropdown(props: Props) { >
    -
    {title}
    +
    +
    {title}
    ); diff --git a/apps/space/core/components/issues/filters/labels.tsx b/apps/space/core/components/issues/filters/labels.tsx index fde7df951aa..3db53f0253e 100644 --- a/apps/space/core/components/issues/filters/labels.tsx +++ b/apps/space/core/components/issues/filters/labels.tsx @@ -59,7 +59,7 @@ export function FilterLabels(props: Props) { {filteredOptions.length > 5 && (
    )} diff --git a/apps/space/core/components/issues/filters/root.tsx b/apps/space/core/components/issues/filters/root.tsx index 8274702dbe7..d7d5de6aa22 100644 --- a/apps/space/core/components/issues/filters/root.tsx +++ b/apps/space/core/components/issues/filters/root.tsx @@ -56,7 +56,7 @@ export const IssueFiltersDropdown = observer(function IssueFiltersDropdown(props ); return ( -
    +
    -
    -
    - +
    +
    + setFiltersSearchQuery(e.target.value)} @@ -36,12 +36,12 @@ export const FilterSelection = observer(function FilterSelection(props: Props) { /> {filtersSearchQuery !== "" && ( )}
    -
    +
    {/* priority */} {isFilterEnabled("priority") && (
    diff --git a/apps/space/core/components/issues/filters/state.tsx b/apps/space/core/components/issues/filters/state.tsx index 5cad5180406..6ea374eb531 100644 --- a/apps/space/core/components/issues/filters/state.tsx +++ b/apps/space/core/components/issues/filters/state.tsx @@ -59,7 +59,7 @@ export const FilterState = observer(function FilterState(props: Props) { {filteredOptions.length > 5 && ( diff --git a/apps/space/core/components/issues/navbar/root.tsx b/apps/space/core/components/issues/navbar/root.tsx index 195065b4b73..5ae4da36815 100644 --- a/apps/space/core/components/issues/navbar/root.tsx +++ b/apps/space/core/components/issues/navbar/root.tsx @@ -19,22 +19,21 @@ export const IssuesNavbarRoot = observer(function IssuesNavbarRoot(props: Props) return (
    {/* project detail */} -
    +
    {project_details ? ( - - + + ) : ( - - + + )} -
    +
    {project_details?.name || `...`}
    - -
    +
    diff --git a/apps/space/core/components/issues/navbar/theme.tsx b/apps/space/core/components/issues/navbar/theme.tsx index 734e2914292..15aa95f5345 100644 --- a/apps/space/core/components/issues/navbar/theme.tsx +++ b/apps/space/core/components/issues/navbar/theme.tsx @@ -1,13 +1,11 @@ -// next theme import { useEffect, useState } from "react"; import { observer } from "mobx-react"; import { useTheme } from "next-themes"; -// mobx react lite - export const NavbarTheme = observer(function NavbarTheme() { + // states const [appTheme, setAppTheme] = useState("light"); - + // theme const { setTheme, theme } = useTheme(); const handleTheme = () => { @@ -23,9 +21,9 @@ export const NavbarTheme = observer(function NavbarTheme() { ); }); diff --git a/apps/space/core/components/issues/navbar/user-avatar.tsx b/apps/space/core/components/issues/navbar/user-avatar.tsx index c8566a9810c..c2b827695ba 100644 --- a/apps/space/core/components/issues/navbar/user-avatar.tsx +++ b/apps/space/core/components/issues/navbar/user-avatar.tsx @@ -60,10 +60,7 @@ export const UserAvatar = observer(function UserAvatar() {
    - @@ -116,7 +113,7 @@ export const UserAvatar = observer(function UserAvatar() { ) : (
    - +
    )} diff --git a/apps/space/core/components/issues/peek-overview/comment/comment-detail-card.tsx b/apps/space/core/components/issues/peek-overview/comment/comment-detail-card.tsx index bee899347c2..b6849e2dfb8 100644 --- a/apps/space/core/components/issues/peek-overview/comment/comment-detail-card.tsx +++ b/apps/space/core/components/issues/peek-overview/comment/comment-detail-card.tsx @@ -70,26 +70,28 @@ export const CommentCard = observer(function CommentCard(props: Props) { } height={30} width={30} - className="grid h-7 w-7 place-items-center rounded-full border-2 border-custom-border-200" + className="grid size-7 place-items-center rounded-full border-2 border-strong-1" /> ) : ( -
    +
    {comment.actor_detail.is_bot ? comment?.actor_detail?.first_name?.charAt(0) : comment?.actor_detail?.display_name?.charAt(0)}
    )} - -
    -
    +
    {comment.actor_detail.is_bot ? comment.actor_detail.first_name + " Bot" : comment.actor_detail.display_name}
    -

    +

    <>commented {timeAgo(comment.created_at)}

    @@ -130,16 +132,16 @@ export const CommentCard = observer(function CommentCard(props: Props) {
    @@ -164,9 +166,9 @@ export const CommentCard = observer(function CommentCard(props: Props) { {}} - className="relative grid cursor-pointer place-items-center rounded p-1 text-custom-text-200 outline-none hover:bg-custom-background-80 hover:text-custom-text-100" + className="relative grid cursor-pointer place-items-center rounded-sm p-1 text-tertiary outline-none hover:bg-layer-transparent-hover" > - + - + {({ active }) => (
    @@ -187,8 +189,8 @@ export const CommentCard = observer(function CommentCard(props: Props) { onClick={() => { setIsEditing(true); }} - className={`w-full select-none truncate rounded px-1 py-1.5 text-left text-custom-text-200 hover:bg-custom-background-80 ${ - active ? "bg-custom-background-80" : "" + className={`w-full select-none truncate rounded-sm px-1 py-1.5 text-left text-secondary hover:bg-layer-transparent-hover ${ + active ? "bg-layer-transparent-hover" : "" }`} > Edit @@ -202,8 +204,8 @@ export const CommentCard = observer(function CommentCard(props: Props) { )} @@ -69,12 +69,12 @@ export const PeekOverviewHeader = observer(function PeekOverviewHeader(props: Pr as="div" value={peekMode} onChange={(val) => setPeekMode(val)} - className="relative flex-shrink-0 text-left" + className="relative shrink-0 text-left" > - + - +
    {PEEK_MODES.map((mode) => ( - `cursor-pointer select-none truncate rounded px-1 py-1.5 ${ - active ? "bg-custom-background-80" : "" - } ${selected ? "text-custom-text-100" : "text-custom-text-200"}` + `cursor-pointer select-none truncate rounded-sm px-1 py-1.5 ${ + active ? "bg-layer-transparent-hover" : "" + } ${selected ? "text-primary" : "text-secondary"}` } >
    @@ -110,16 +110,14 @@ export const PeekOverviewHeader = observer(function PeekOverviewHeader(props: Pr
    {isClipboardWriteAllowed && (peekMode === "side" || peekMode === "modal") && ( -
    - -
    + )}
    diff --git a/apps/space/core/components/issues/peek-overview/issue-activity.tsx b/apps/space/core/components/issues/peek-overview/issue-activity.tsx index cc4ba4dca28..e965edbbff9 100644 --- a/apps/space/core/components/issues/peek-overview/issue-activity.tsx +++ b/apps/space/core/components/issues/peek-overview/issue-activity.tsx @@ -52,9 +52,9 @@ export const PeekOverviewIssueActivity = observer(function PeekOverviewIssueActi )} ) : ( -
    -

    - +

    +

    + Sign in to add your comment

    diff --git a/apps/space/core/components/issues/peek-overview/issue-details.tsx b/apps/space/core/components/issues/peek-overview/issue-details.tsx index 2457766b3d0..94d7a125b2f 100644 --- a/apps/space/core/components/issues/peek-overview/issue-details.tsx +++ b/apps/space/core/components/issues/peek-overview/issue-details.tsx @@ -21,10 +21,10 @@ export const PeekOverviewIssueDetails = observer(function PeekOverviewIssueDetai return (
    -
    +
    {project_details?.identifier}-{issueDetails?.sequence_id}
    -

    {issueDetails.name}

    +

    {issueDetails.name}

    {description && description !== "" && description !== "

    " && ( +
    {mode === "full" && (
    @@ -65,33 +65,33 @@ export const PeekOverviewIssueProperties = observer(function PeekOverviewIssuePr )}
    -
    +
    State
    -
    +
    {addSpaceIfCamelCase(state?.name ?? "")}
    -
    +
    Priority
    {priority && ( @@ -105,14 +105,14 @@ export const PeekOverviewIssueProperties = observer(function PeekOverviewIssuePr
    -
    +
    Due date
    {issueDetails.target_date ? (
    @@ -120,7 +120,7 @@ export const PeekOverviewIssueProperties = observer(function PeekOverviewIssuePr {renderFormattedDate(issueDetails.target_date)}
    ) : ( - Empty + Empty )}
    diff --git a/apps/space/core/components/issues/peek-overview/layout.tsx b/apps/space/core/components/issues/peek-overview/layout.tsx index d8ebec8d034..d8b5a29ce13 100644 --- a/apps/space/core/components/issues/peek-overview/layout.tsx +++ b/apps/space/core/components/issues/peek-overview/layout.tsx @@ -68,7 +68,7 @@ export const IssuePeekOverview = observer(function IssuePeekOverview(props: TIss leaveFrom="translate-x-0" leaveTo="translate-x-full" > - + @@ -85,7 +85,7 @@ export const IssuePeekOverview = observer(function IssuePeekOverview(props: TIss leaveFrom="opacity-100" leaveTo="opacity-0" > -
    +
    {peekMode === "modal" && ( diff --git a/apps/space/core/components/issues/peek-overview/side-peek-view.tsx b/apps/space/core/components/issues/peek-overview/side-peek-view.tsx index d091d42c91f..c965b7056c8 100644 --- a/apps/space/core/components/issues/peek-overview/side-peek-view.tsx +++ b/apps/space/core/components/issues/peek-overview/side-peek-view.tsx @@ -23,12 +23,12 @@ export const SidePeekView = observer(function SidePeekView(props: Props) { const { canComment } = usePublish(anchor); return ( -
    +
    {issueDetails ? ( -
    +
    {/* issue title and description */}
    @@ -38,7 +38,7 @@ export const SidePeekView = observer(function SidePeekView(props: Props) {
    {/* divider */} -
    +
    {/* issue activity/comments */} {canComment && (
    diff --git a/apps/space/core/components/issues/reactions/issue-vote-reactions.tsx b/apps/space/core/components/issues/reactions/issue-vote-reactions.tsx index 43d2f8cbee6..c4eddb9278a 100644 --- a/apps/space/core/components/issues/reactions/issue-vote-reactions.tsx +++ b/apps/space/core/components/issues/reactions/issue-vote-reactions.tsx @@ -99,17 +99,17 @@ export const IssueVotes = observer(function IssueVotes(props: TIssueVotes) { else router.push(`/?next_path=${pathName}?${queryParam}`); }} className={cn( - "flex items-center justify-center gap-x-1 overflow-hidden rounded border focus:outline-none bg-custom-background-100", + "flex items-center justify-center gap-x-1 overflow-hidden rounded-sm border focus:outline-none hover:bg-layer-transparent-hover", votingDimensions, { - "border-custom-primary-200 text-custom-primary-200": isUpVotedByUser, - "border-custom-border-300": !isUpVotedByUser, + "border-accent-strong-200 text-accent-secondary": isUpVotedByUser, + "border-strong": !isUpVotedByUser, "cursor-default": isInIframe, } )} > - arrow_upward_alt - {allUpVotes.length} + arrow_upward_alt + {allUpVotes.length} @@ -140,17 +140,17 @@ export const IssueVotes = observer(function IssueVotes(props: TIssueVotes) { else router.push(`/?next_path=${pathName}?${queryParam}`); }} className={cn( - "flex items-center justify-center gap-x-1 overflow-hidden rounded border focus:outline-none bg-custom-background-100", + "flex items-center justify-center gap-x-1 overflow-hidden rounded-sm border focus:outline-none hover:bg-layer-transparent-hover", votingDimensions, { "border-red-600 text-red-600": isDownVotedByUser, - "border-custom-border-300": !isDownVotedByUser, + "border-strong": !isDownVotedByUser, "cursor-default": isInIframe, } )} > - arrow_downward_alt - {allDownVotes.length} + arrow_downward_alt + {allDownVotes.length}
    diff --git a/apps/space/core/components/ui/icon.tsx b/apps/space/core/components/ui/icon.tsx index 39d10b2b185..418be108c9c 100644 --- a/apps/space/core/components/ui/icon.tsx +++ b/apps/space/core/components/ui/icon.tsx @@ -6,5 +6,5 @@ type Props = { }; export function Icon({ iconName, className = "" }: Props) { - return {iconName}; + return {iconName}; } diff --git a/apps/space/core/components/ui/not-found.tsx b/apps/space/core/components/ui/not-found.tsx index 37e0dc3b26b..5ec0874cb3d 100644 --- a/apps/space/core/components/ui/not-found.tsx +++ b/apps/space/core/components/ui/not-found.tsx @@ -3,15 +3,15 @@ import Image404 from "@/app/assets/404.svg?url"; export function PageNotFound() { return ( -
    +
    404- Page not found
    -

    Oops! Something went wrong.

    -

    +

    Oops! Something went wrong.

    +

    Sorry, the page you are looking for cannot be found. It may have been removed, had its name changed, or is temporarily unavailable.

    diff --git a/apps/space/core/components/views/header.tsx b/apps/space/core/components/views/header.tsx index 9acbd5868b2..30284882d68 100644 --- a/apps/space/core/components/views/header.tsx +++ b/apps/space/core/components/views/header.tsx @@ -6,7 +6,7 @@ export function AuthHeader() { return (
    - +
    ); diff --git a/apps/space/core/lib/instance-provider.tsx b/apps/space/core/lib/instance-provider.tsx index 4d422df7226..89ee49dfcf4 100644 --- a/apps/space/core/lib/instance-provider.tsx +++ b/apps/space/core/lib/instance-provider.tsx @@ -47,7 +47,7 @@ export const InstanceProvider = observer(function InstanceProvider({ children }:
    - +
    diff --git a/apps/space/helpers/emoji.helper.tsx b/apps/space/helpers/emoji.helper.tsx index 1619d6c0d1b..8190a6552f8 100644 --- a/apps/space/helpers/emoji.helper.tsx +++ b/apps/space/helpers/emoji.helper.tsx @@ -10,7 +10,7 @@ export const renderEmoji = ( if (typeof emoji === "object") return ( - + {emoji.name} ); diff --git a/apps/space/package.json b/apps/space/package.json index d88b30514dc..774b08b4b7b 100644 --- a/apps/space/package.json +++ b/apps/space/package.json @@ -56,6 +56,7 @@ "@plane/tailwind-config": "workspace:*", "@plane/typescript-config": "workspace:*", "@react-router/dev": "catalog:", + "@tailwindcss/typography": "0.5.19", "@types/lodash-es": "catalog:", "@types/node": "catalog:", "@types/react": "catalog:", diff --git a/apps/space/postcss.config.cjs b/apps/space/postcss.config.cjs deleted file mode 100644 index 8a677108f55..00000000000 --- a/apps/space/postcss.config.cjs +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@plane/tailwind-config/postcss.config.js"); diff --git a/apps/space/postcss.config.js b/apps/space/postcss.config.js new file mode 100644 index 00000000000..3ad28f15f35 --- /dev/null +++ b/apps/space/postcss.config.js @@ -0,0 +1,3 @@ +import postcssConfig from "@plane/tailwind-config/postcss.config.js"; + +export default postcssConfig; diff --git a/apps/space/styles/globals.css b/apps/space/styles/globals.css index 46fca340278..d179aec6b90 100644 --- a/apps/space/styles/globals.css +++ b/apps/space/styles/globals.css @@ -1,500 +1,54 @@ -@import "@plane/propel/styles/fonts"; +@import "@plane/tailwind-config/index.css"; @import "@plane/editor/styles"; +@import "@plane/propel/styles/react-day-picker.css"; +@plugin "@tailwindcss/typography"; -@tailwind base; -@tailwind components; -@tailwind utilities; - -@layer base { - html { - font-family: "Inter", sans-serif; - } - - :root { - color-scheme: light !important; - - --color-primary-10: 229, 243, 250; - --color-primary-20: 216, 237, 248; - --color-primary-30: 199, 229, 244; - --color-primary-40: 169, 214, 239; - --color-primary-50: 144, 202, 234; - --color-primary-60: 109, 186, 227; - --color-primary-70: 75, 170, 221; - --color-primary-80: 41, 154, 214; - --color-primary-90: 34, 129, 180; - --color-primary-100: 0, 99, 153; - --color-primary-200: 0, 92, 143; - --color-primary-300: 0, 86, 133; - --color-primary-400: 0, 77, 117; - --color-primary-500: 0, 66, 102; - --color-primary-600: 0, 53, 82; - --color-primary-700: 0, 43, 66; - --color-primary-800: 0, 33, 51; - --color-primary-900: 0, 23, 36; - - --color-background-100: 255, 255, 255; /* primary bg */ - --color-background-90: 247, 247, 247; /* secondary bg */ - --color-background-80: 232, 232, 232; /* tertiary bg */ - - --color-text-100: 23, 23, 23; /* primary text */ - --color-text-200: 58, 58, 58; /* secondary text */ - --color-text-300: 82, 82, 82; /* tertiary text */ - --color-text-400: 163, 163, 163; /* placeholder text */ - - --color-scrollbar: 163, 163, 163; /* scrollbar thumb */ - - --color-border-100: 245, 245, 245; /* subtle border= 1 */ - --color-border-200: 229, 229, 229; /* subtle border- 2 */ - --color-border-300: 212, 212, 212; /* strong border- 1 */ - --color-border-400: 185, 185, 185; /* strong border- 2 */ - - --color-shadow-2xs: - 0px 0px 1px 0px rgba(23, 23, 23, 0.06), 0px 1px 2px 0px rgba(23, 23, 23, 0.06), - 0px 1px 2px 0px rgba(23, 23, 23, 0.14); - --color-shadow-xs: - 0px 1px 2px 0px rgba(0, 0, 0, 0.16), 0px 2px 4px 0px rgba(16, 24, 40, 0.12), - 0px 1px 8px -1px rgba(16, 24, 40, 0.1); - --color-shadow-sm: - 0px 1px 4px 0px rgba(0, 0, 0, 0.01), 0px 4px 8px 0px rgba(0, 0, 0, 0.02), 0px 1px 12px 0px rgba(0, 0, 0, 0.12); - --color-shadow-rg: - 0px 3px 6px 0px rgba(0, 0, 0, 0.1), 0px 4px 4px 0px rgba(16, 24, 40, 0.08), - 0px 1px 12px 0px rgba(16, 24, 40, 0.04); - --color-shadow-md: - 0px 4px 8px 0px rgba(0, 0, 0, 0.12), 0px 6px 12px 0px rgba(16, 24, 40, 0.12), - 0px 1px 16px 0px rgba(16, 24, 40, 0.12); - --color-shadow-lg: - 0px 6px 12px 0px rgba(0, 0, 0, 0.12), 0px 8px 16px 0px rgba(0, 0, 0, 0.12), - 0px 1px 24px 0px rgba(16, 24, 40, 0.12); - --color-shadow-xl: - 0px 0px 18px 0px rgba(0, 0, 0, 0.16), 0px 0px 24px 0px rgba(16, 24, 40, 0.16), - 0px 0px 52px 0px rgba(16, 24, 40, 0.16); - --color-shadow-2xl: - 0px 8px 16px 0px rgba(0, 0, 0, 0.12), 0px 12px 24px 0px rgba(16, 24, 40, 0.12), - 0px 1px 32px 0px rgba(16, 24, 40, 0.12); - --color-shadow-3xl: - 0px 12px 24px 0px rgba(0, 0, 0, 0.12), 0px 16px 32px 0px rgba(0, 0, 0, 0.12), - 0px 1px 48px 0px rgba(16, 24, 40, 0.12); - --color-shadow-4xl: 0px 8px 40px 0px rgba(0, 0, 61, 0.05), 0px 12px 32px -16px rgba(0, 0, 0, 0.05); - - --color-sidebar-background-100: var(--color-background-100); /* primary sidebar bg */ - --color-sidebar-background-90: var(--color-background-90); /* secondary sidebar bg */ - --color-sidebar-background-80: var(--color-background-80); /* tertiary sidebar bg */ - - --color-sidebar-text-100: var(--color-text-100); /* primary sidebar text */ - --color-sidebar-text-200: var(--color-text-200); /* secondary sidebar text */ - --color-sidebar-text-300: var(--color-text-300); /* tertiary sidebar text */ - --color-sidebar-text-400: var(--color-text-400); /* sidebar placeholder text */ - - --color-sidebar-border-100: var(--color-border-100); /* subtle sidebar border= 1 */ - --color-sidebar-border-200: var(--color-border-100); /* subtle sidebar border- 2 */ - --color-sidebar-border-300: var(--color-border-100); /* strong sidebar border- 1 */ - --color-sidebar-border-400: var(--color-border-100); /* strong sidebar border- 2 */ - - --color-sidebar-shadow-2xs: var(--color-shadow-2xs); - --color-sidebar-shadow-xs: var(--color-shadow-xs); - --color-sidebar-shadow-sm: var(--color-shadow-sm); - --color-sidebar-shadow-rg: var(--color-shadow-rg); - --color-sidebar-shadow-md: var(--color-shadow-md); - --color-sidebar-shadow-lg: var(--color-shadow-lg); - --color-sidebar-shadow-xl: var(--color-shadow-xl); - --color-sidebar-shadow-2xl: var(--color-shadow-2xl); - --color-sidebar-shadow-3xl: var(--color-shadow-3xl); - --color-sidebar-shadow-4xl: var(--color-shadow-4xl); - - /* toast theme */ - --color-toast-success-text: 178, 221, 181; - --color-toast-error-text: 206, 44, 49; - --color-toast-warning-text: 255, 186, 24; - --color-toast-info-text: 141, 164, 239; - --color-toast-loading-text: 255, 255, 255; - --color-toast-secondary-text: 185, 187, 198; - --color-toast-tertiary-text: 139, 141, 152; - - --color-toast-success-background: 46, 46, 46; - --color-toast-error-background: 46, 46, 46; - --color-toast-warning-background: 46, 46, 46; - --color-toast-info-background: 46, 46, 46; - --color-toast-loading-background: 46, 46, 46; - - --color-toast-success-border: 42, 126, 59; - --color-toast-error-border: 100, 23, 35; - --color-toast-warning-border: 79, 52, 34; - --color-toast-info-border: 58, 91, 199; - --color-toast-loading-border: 96, 100, 108; - } - - [data-theme="light"], - [data-theme="light-contrast"] { - color-scheme: light !important; - - --color-background-100: 255, 255, 255; /* primary bg */ - --color-background-90: 247, 247, 247; /* secondary bg */ - --color-background-80: 232, 232, 232; /* tertiary bg */ - } - - [data-theme="light"] { - --color-text-100: 23, 23, 23; /* primary text */ - --color-text-200: 58, 58, 58; /* secondary text */ - --color-text-300: 82, 82, 82; /* tertiary text */ - --color-text-400: 163, 163, 163; /* placeholder text */ - - --color-scrollbar: 163, 163, 163; /* scrollbar thumb */ - - --color-border-100: 245, 245, 245; /* subtle border= 1 */ - --color-border-200: 229, 229, 229; /* subtle border- 2 */ - --color-border-300: 212, 212, 212; /* strong border- 1 */ - --color-border-400: 185, 185, 185; /* strong border- 2 */ - - /* onboarding colors */ - --gradient-onboarding-100: linear-gradient(106deg, #f2f6ff 29.8%, #e1eaff 99.34%); - --gradient-onboarding-200: linear-gradient(129deg, rgba(255, 255, 255, 0) -22.23%, rgba(255, 255, 255, 0.8) 62.98%); - --gradient-onboarding-300: linear-gradient(164deg, #fff 4.25%, rgba(255, 255, 255, 0.06) 93.5%); - --gradient-onboarding-400: linear-gradient(129deg, rgba(255, 255, 255, 0) -22.23%, rgba(255, 255, 255, 0.8) 62.98%); - - --color-onboarding-text-100: 23, 23, 23; - --color-onboarding-text-200: 58, 58, 58; - --color-onboarding-text-300: 82, 82, 82; - --color-onboarding-text-400: 163, 163, 163; - - --color-onboarding-background-100: 236, 241, 255; - --color-onboarding-background-200: 255, 255, 255; - --color-onboarding-background-300: 236, 241, 255; - --color-onboarding-background-400: 177, 206, 250; - - --color-onboarding-border-100: 229, 229, 229; - --color-onboarding-border-200: 217, 228, 255; - --color-onboarding-border-300: 229, 229, 229, 0.5; - - --color-onboarding-shadow-sm: 0px 4px 20px 0px rgba(126, 139, 171, 0.1); - - /* toast theme */ - --color-toast-success-text: 62, 155, 79; - --color-toast-error-text: 220, 62, 66; - --color-toast-warning-text: 255, 186, 24; - --color-toast-info-text: 51, 88, 212; - --color-toast-loading-text: 28, 32, 36; - --color-toast-secondary-text: 128, 131, 141; - --color-toast-tertiary-text: 96, 100, 108; - - --color-toast-success-background: 253, 253, 254; - --color-toast-error-background: 255, 252, 252; - --color-toast-warning-background: 254, 253, 251; - --color-toast-info-background: 253, 253, 254; - --color-toast-loading-background: 253, 253, 254; - - --color-toast-success-border: 218, 241, 219; - --color-toast-error-border: 255, 219, 220; - --color-toast-warning-border: 255, 247, 194; - --color-toast-info-border: 210, 222, 255; - --color-toast-loading-border: 224, 225, 230; - } - - [data-theme="light-contrast"] { - --color-text-100: 11, 11, 11; /* primary text */ - --color-text-200: 38, 38, 38; /* secondary text */ - --color-text-300: 58, 58, 58; /* tertiary text */ - --color-text-400: 115, 115, 115; /* placeholder text */ - - --color-scrollbar: 115, 115, 115; /* scrollbar thumb */ - - --color-border-100: 34, 34, 34; /* subtle border= 1 */ - --color-border-200: 38, 38, 38; /* subtle border- 2 */ - --color-border-300: 46, 46, 46; /* strong border- 1 */ - --color-border-400: 58, 58, 58; /* strong border- 2 */ - } - - [data-theme="dark"], - [data-theme="dark-contrast"] { - color-scheme: dark !important; - - --color-primary-10: 8, 31, 43; - --color-primary-20: 10, 37, 51; - --color-primary-30: 13, 49, 69; - --color-primary-40: 16, 58, 81; - --color-primary-50: 18, 68, 94; - --color-primary-60: 23, 86, 120; - --color-primary-70: 28, 104, 146; - --color-primary-80: 31, 116, 163; - --color-primary-90: 34, 129, 180; - --color-primary-100: 40, 146, 204; - --color-primary-200: 41, 154, 214; - --color-primary-300: 75, 170, 221; - --color-primary-400: 109, 186, 227; - --color-primary-500: 144, 202, 234; - --color-primary-600: 169, 214, 239; - --color-primary-700: 199, 229, 244; - --color-primary-800: 216, 237, 248; - --color-primary-900: 229, 243, 250; - - --color-background-100: 25, 25, 25; /* primary bg */ - --color-background-90: 32, 32, 32; /* secondary bg */ - --color-background-80: 44, 44, 44; /* tertiary bg */ - - --color-shadow-2xs: 0px 0px 1px 0px rgba(0, 0, 0, 0.15), 0px 1px 3px 0px rgba(0, 0, 0, 0.5); - --color-shadow-xs: 0px 0px 2px 0px rgba(0, 0, 0, 0.2), 0px 2px 4px 0px rgba(0, 0, 0, 0.5); - --color-shadow-sm: 0px 0px 4px 0px rgba(0, 0, 0, 0.2), 0px 2px 6px 0px rgba(0, 0, 0, 0.5); - --color-shadow-rg: 0px 0px 6px 0px rgba(0, 0, 0, 0.2), 0px 4px 6px 0px rgba(0, 0, 0, 0.5); - --color-shadow-md: 0px 2px 8px 0px rgba(0, 0, 0, 0.2), 0px 4px 8px 0px rgba(0, 0, 0, 0.5); - --color-shadow-lg: 0px 4px 12px 0px rgba(0, 0, 0, 0.25), 0px 4px 10px 0px rgba(0, 0, 0, 0.55); - --color-shadow-xl: 0px 0px 14px 0px rgba(0, 0, 0, 0.25), 0px 6px 10px 0px rgba(0, 0, 0, 0.55); - --color-shadow-2xl: 0px 0px 18px 0px rgba(0, 0, 0, 0.25), 0px 8px 12px 0px rgba(0, 0, 0, 0.6); - --color-shadow-3xl: 0px 4px 24px 0px rgba(0, 0, 0, 0.3), 0px 12px 40px 0px rgba(0, 0, 0, 0.65); - } - - [data-theme="dark"] { - --color-text-100: 229, 229, 229; /* primary text */ - --color-text-200: 163, 163, 163; /* secondary text */ - --color-text-300: 115, 115, 115; /* tertiary text */ - --color-text-400: 82, 82, 82; /* placeholder text */ - - --color-scrollbar: 82, 82, 82; /* scrollbar thumb */ - - --color-border-100: 34, 34, 34; /* subtle border= 1 */ - --color-border-200: 38, 38, 38; /* subtle border- 2 */ - --color-border-300: 46, 46, 46; /* strong border- 1 */ - --color-border-400: 58, 58, 58; /* strong border- 2 */ - - /* onboarding colors */ - --gradient-onboarding-100: linear-gradient(106deg, #18191b 25.17%, #18191b 99.34%); - --gradient-onboarding-200: linear-gradient(129deg, rgba(47, 49, 53, 0.8) -22.23%, rgba(33, 34, 37, 0.8) 62.98%); - --gradient-onboarding-300: linear-gradient(167deg, rgba(47, 49, 53, 0.45) 19.22%, #212225 98.48%); - - --color-onboarding-text-100: 237, 238, 240; - --color-onboarding-text-200: 176, 180, 187; - --color-onboarding-text-300: 118, 123, 132; - --color-onboarding-text-400: 105, 110, 119; - - --color-onboarding-background-100: 54, 58, 64; - --color-onboarding-background-200: 40, 42, 45; - --color-onboarding-background-300: 40, 42, 45; - --color-onboarding-background-400: 67, 72, 79; - - --color-onboarding-border-100: 54, 58, 64; - --color-onboarding-border-200: 54, 58, 64; - --color-onboarding-border-300: 34, 35, 38, 0.5; - - --color-onboarding-shadow-sm: 0px 4px 20px 0px rgba(39, 44, 56, 0.1); - } - - [data-theme="dark-contrast"] { - --color-text-100: 250, 250, 250; /* primary text */ - --color-text-200: 241, 241, 241; /* secondary text */ - --color-text-300: 212, 212, 212; /* tertiary text */ - --color-text-400: 115, 115, 115; /* placeholder text */ - - --color-scrollbar: 115, 115, 115; /* scrollbar thumb */ - - --color-border-100: 245, 245, 245; /* subtle border= 1 */ - --color-border-200: 229, 229, 229; /* subtle border- 2 */ - --color-border-300: 212, 212, 212; /* strong border- 1 */ - --color-border-400: 185, 185, 185; /* strong border- 2 */ - } - - [data-theme="light"], - [data-theme="dark"], - [data-theme="light-contrast"], - [data-theme="dark-contrast"] { - --color-sidebar-background-100: var(--color-background-100); /* primary sidebar bg */ - --color-sidebar-background-90: var(--color-background-90); /* secondary sidebar bg */ - --color-sidebar-background-80: var(--color-background-80); /* tertiary sidebar bg */ - - --color-sidebar-text-100: var(--color-text-100); /* primary sidebar text */ - --color-sidebar-text-200: var(--color-text-200); /* secondary sidebar text */ - --color-sidebar-text-300: var(--color-text-300); /* tertiary sidebar text */ - --color-sidebar-text-400: var(--color-text-400); /* sidebar placeholder text */ - - --color-sidebar-border-100: var(--color-border-100); /* subtle sidebar border= 1 */ - --color-sidebar-border-200: var(--color-border-200); /* subtle sidebar border- 2 */ - --color-sidebar-border-300: var(--color-border-300); /* strong sidebar border- 1 */ - --color-sidebar-border-400: var(--color-border-400); /* strong sidebar border- 2 */ - } - - /* stickies and editor colors */ - :root { - /* text colors */ - --editor-colors-gray-text: #5c5e63; - --editor-colors-peach-text: #ff5b59; - --editor-colors-pink-text: #f65385; - --editor-colors-orange-text: #fd9038; - --editor-colors-green-text: #0fc27b; - --editor-colors-light-blue-text: #17bee9; - --editor-colors-dark-blue-text: #266df0; - --editor-colors-purple-text: #9162f9; - /* end text colors */ +/* stickies and editor colors */ +:root { + /* text colors */ + --editor-colors-gray-text: #5c5e63; + --editor-colors-peach-text: #ff5b59; + --editor-colors-pink-text: #f65385; + --editor-colors-orange-text: #fd9038; + --editor-colors-green-text: #0fc27b; + --editor-colors-light-blue-text: #17bee9; + --editor-colors-dark-blue-text: #266df0; + --editor-colors-purple-text: #9162f9; + /* end text colors */ - /* background colors */ - --editor-colors-gray-background: #d6d6d8; - --editor-colors-peach-background: #ffd5d7; - --editor-colors-pink-background: #fdd4e3; - --editor-colors-orange-background: #ffe3cd; - --editor-colors-green-background: #c3f0de; - --editor-colors-light-blue-background: #c5eff9; - --editor-colors-dark-blue-background: #c9dafb; - --editor-colors-purple-background: #e3d8fd; - /* end background colors */ - } /* background colors */ - [data-theme*="light"] { - --editor-colors-gray-background: #d6d6d8; - --editor-colors-peach-background: #ffd5d7; - --editor-colors-pink-background: #fdd4e3; - --editor-colors-orange-background: #ffe3cd; - --editor-colors-green-background: #c3f0de; - --editor-colors-light-blue-background: #c5eff9; - --editor-colors-dark-blue-background: #c9dafb; - --editor-colors-purple-background: #e3d8fd; - } - [data-theme*="dark"] { - --editor-colors-gray-background: #404144; - --editor-colors-peach-background: #593032; - --editor-colors-pink-background: #562e3d; - --editor-colors-orange-background: #583e2a; - --editor-colors-green-background: #1d4a3b; - --editor-colors-light-blue-background: #1f495c; - --editor-colors-dark-blue-background: #223558; - --editor-colors-purple-background: #3d325a; - } + --editor-colors-gray-background: #d6d6d8; + --editor-colors-peach-background: #ffd5d7; + --editor-colors-pink-background: #fdd4e3; + --editor-colors-orange-background: #ffe3cd; + --editor-colors-green-background: #c3f0de; + --editor-colors-light-blue-background: #c5eff9; + --editor-colors-dark-blue-background: #c9dafb; + --editor-colors-purple-background: #e3d8fd; /* end background colors */ } - -* { - margin: 0; - padding: 0; - box-sizing: border-box; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; - font-variant-ligatures: none; - -webkit-font-variant-ligatures: none; - text-rendering: optimizeLegibility; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; -} - -body { - color: rgba(var(--color-text-100)); -} - -::-webkit-scrollbar { - width: 5px; - height: 5px; - border-radius: 5px; -} - -::-webkit-scrollbar-track { - background-color: rgba(var(--color-background-100)); -} - -::-webkit-scrollbar-thumb { - border-radius: 5px; - background-color: rgba(var(--color-background-80)); -} - -.hide-vertical-scrollbar::-webkit-scrollbar { - width: 0 !important; -} - -.hide-horizontal-scrollbar::-webkit-scrollbar { - height: 0 !important; -} - -.hide-both-scrollbars::-webkit-scrollbar { - height: 0 !important; - width: 0 !important; -} - -/* By applying below class, the autofilled text in form fields will not have the default autofill background color and styles applied by WebKit browsers */ -.disable-autofill-style:-webkit-autofill, -.disable-autofill-style:-webkit-autofill:hover, -.disable-autofill-style:-webkit-autofill:focus, -.disable-autofill-style:-webkit-autofill:active { - -webkit-background-clip: text; -} - -@-moz-document url-prefix() { - * { - scrollbar-width: none; - } - .vertical-scrollbar, - .horizontal-scrollbar { - scrollbar-width: initial; - scrollbar-color: rgba(96, 100, 108, 0.1) transparent; - } - .vertical-scrollbar:hover, - .horizontal-scrollbar:hover { - scrollbar-color: rgba(96, 100, 108, 0.25) transparent; - } - .vertical-scrollbar:active, - .horizontal-scrollbar:active { - scrollbar-color: rgba(96, 100, 108, 0.7) transparent; - } -} - -.vertical-scrollbar { - overflow-y: auto; -} -.horizontal-scrollbar { - overflow-x: auto; -} -.vertical-scrollbar::-webkit-scrollbar, -.horizontal-scrollbar::-webkit-scrollbar { - display: block; -} -.vertical-scrollbar::-webkit-scrollbar-track, -.horizontal-scrollbar::-webkit-scrollbar-track { - background-color: transparent; - border-radius: 9999px; -} -.vertical-scrollbar::-webkit-scrollbar-thumb, -.horizontal-scrollbar::-webkit-scrollbar-thumb { - background-clip: padding-box; - background-color: rgba(96, 100, 108, 0.1); - border-radius: 9999px; -} -.vertical-scrollbar:hover::-webkit-scrollbar-thumb, -.horizontal-scrollbar:hover::-webkit-scrollbar-thumb { - background-color: rgba(96, 100, 108, 0.25); -} -.vertical-scrollbar::-webkit-scrollbar-thumb:hover, -.horizontal-scrollbar::-webkit-scrollbar-thumb:hover { - background-color: rgba(96, 100, 108, 0.5); -} -.vertical-scrollbar::-webkit-scrollbar-thumb:active, -.horizontal-scrollbar::-webkit-scrollbar-thumb:active { - background-color: rgba(96, 100, 108, 0.7); -} -.vertical-scrollbar::-webkit-scrollbar-corner, -.horizontal-scrollbar::-webkit-scrollbar-corner { - background-color: transparent; -} -.vertical-scrollbar-margin-top-md::-webkit-scrollbar-track { - margin-top: 44px; -} - -/* scrollbar sm size */ -.scrollbar-sm::-webkit-scrollbar { - height: 12px; - width: 12px; -} -.scrollbar-sm::-webkit-scrollbar-thumb { - border: 3px solid rgba(0, 0, 0, 0); -} -/* scrollbar md size */ -.scrollbar-md::-webkit-scrollbar { - height: 14px; - width: 14px; -} -.scrollbar-md::-webkit-scrollbar-thumb { - border: 3px solid rgba(0, 0, 0, 0); -} -/* scrollbar lg size */ - -.scrollbar-lg::-webkit-scrollbar { - height: 16px; - width: 16px; -} -.scrollbar-lg::-webkit-scrollbar-thumb { - border: 4px solid rgba(0, 0, 0, 0); -} +/* background colors */ +[data-theme*="light"] { + --editor-colors-gray-background: #d6d6d8; + --editor-colors-peach-background: #ffd5d7; + --editor-colors-pink-background: #fdd4e3; + --editor-colors-orange-background: #ffe3cd; + --editor-colors-green-background: #c3f0de; + --editor-colors-light-blue-background: #c5eff9; + --editor-colors-dark-blue-background: #c9dafb; + --editor-colors-purple-background: #e3d8fd; +} +[data-theme*="dark"] { + --editor-colors-gray-background: #404144; + --editor-colors-peach-background: #593032; + --editor-colors-pink-background: #562e3d; + --editor-colors-orange-background: #583e2a; + --editor-colors-green-background: #1d4a3b; + --editor-colors-light-blue-background: #1f495c; + --editor-colors-dark-blue-background: #223558; + --editor-colors-purple-background: #3d325a; +} +/* end background colors */ /* Progress Bar Styles */ :root { diff --git a/apps/space/tailwind.config.cjs b/apps/space/tailwind.config.cjs deleted file mode 100644 index 7511bd651d0..00000000000 --- a/apps/space/tailwind.config.cjs +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@plane/tailwind-config/tailwind.config.js"); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/active-cycles/header.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/active-cycles/header.tsx index edb12b00439..6eed5ff95c9 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/active-cycles/header.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/active-cycles/header.tsx @@ -18,7 +18,7 @@ export const WorkspaceActiveCycleHeader = observer(function WorkspaceActiveCycle component={ } + icon={} /> } /> diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/analytics/[tabId]/header.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/analytics/[tabId]/header.tsx index 95fd9186fcc..85798e17e14 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/analytics/[tabId]/header.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/analytics/[tabId]/header.tsx @@ -16,7 +16,7 @@ export const WorkspaceAnalyticsHeader = observer(function WorkspaceAnalyticsHead component={ } + icon={} /> } /> diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/analytics/[tabId]/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/analytics/[tabId]/page.tsx index c8e4e1aeb42..c6b225de8fd 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/analytics/[tabId]/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/analytics/[tabId]/page.tsx @@ -67,12 +67,12 @@ function AnalyticsPage({ params }: Route.ComponentProps) { {workspaceProjectIds && ( <> {workspaceProjectIds.length > 0 || loader === "init-loader" ? ( -
    +
    diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/browse/[workItem]/header.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/browse/[workItem]/header.tsx index 7d99ed0e225..cf5176a2beb 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/browse/[workItem]/header.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/browse/[workItem]/header.tsx @@ -32,8 +32,8 @@ export const ProjectWorkItemDetailsHeader = observer(function ProjectWorkItemDet <> {projectPreferences.navigationMode === "horizontal" && (
    - -
    + +
    {sidebarCollapsed && (
    diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/browse/[workItem]/work-item-header.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/browse/[workItem]/work-item-header.tsx index a1d983b81fe..e4aa6e1fbac 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/browse/[workItem]/work-item-header.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/browse/[workItem]/work-item-header.tsx @@ -40,7 +40,7 @@ export const WorkItemDetailsHeader = observer(function WorkItemDetailsHeader() { } + icon={} /> } /> diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/drafts/header.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/drafts/header.tsx index c18051384af..c34457db1d9 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/drafts/header.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/drafts/header.tsx @@ -46,7 +46,7 @@ export const WorkspaceDraftHeader = observer(function WorkspaceDraftHeader() { } /> + } /> } /> @@ -62,7 +62,7 @@ export const WorkspaceDraftHeader = observer(function WorkspaceDraftHeader() { {joinedProjectIds && joinedProjectIds.length > 0 && (
    -
    - +
    + } - /> + } /> } /> @@ -35,13 +32,13 @@ export const WorkspaceDashboardHeader = observer(function WorkspaceDashboardHead diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/layout.tsx index b93891fece2..f64640536b7 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/layout.tsx @@ -9,12 +9,12 @@ function WorkspaceLayout() { return ( <> -
    +
    -
    +
    diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/activity/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/activity/page.tsx index 95e7231842f..6d1f212a145 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/activity/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/activity/page.tsx @@ -51,14 +51,14 @@ function ProfileActivityPage() {
    -

    {t("profile.stats.recent_activity.title")}

    +

    {t("profile.stats.recent_activity.title")}

    {canDownloadActivity && }
    {activityPages} {pageCount < totalPages && resultsCount !== 0 && ( -
    -
    diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/header.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/header.tsx index a2dfcdc3cc5..5bfdc10c1cb 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/header.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/header.tsx @@ -15,6 +15,7 @@ import { ProfileIssuesFilter } from "@/components/profile/profile-issues-filter" // hooks import { useAppTheme } from "@/hooks/store/use-app-theme"; import { useUser, useUserPermissions } from "@/hooks/store/user"; +import { Button } from "@plane/propel/button"; type TUserProfileHeader = { userProjectsData: IUserProfileProjectSegregation | undefined; @@ -57,7 +58,7 @@ export const UserProfileHeader = observer(function UserProfileHeader(props: TUse } + icon={} /> } /> @@ -68,15 +69,15 @@ export const UserProfileHeader = observer(function UserProfileHeader(props: TUse
    - {type} - +
    + {type} +
    } - customButtonClassName="flex flex-grow justify-center text-custom-text-200 text-sm" + customButtonClassName="flex flex-grow justify-center text-secondary text-13" closeOnSelect > <> @@ -86,23 +87,22 @@ export const UserProfileHeader = observer(function UserProfileHeader(props: TUse key={tab.route} onClick={() => router.push(`/${workspaceSlug}/profile/${userId}/${tab.route}`)} > - {t(tab.i18n_label)} + {t(tab.i18n_label)} ))}
    - +
    + +
    diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/layout.tsx index 4e100b0c353..b77c6493f18 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/layout.tsx @@ -74,7 +74,7 @@ function UseProfileLayout({ params }: Route.ComponentProps) {
    ) : ( -
    +
    {t("you_do_not_have_the_permission_to_access_this_page")}
    )} diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/mobile-header.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/mobile-header.tsx index 989741f3b94..df9247d5397 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/mobile-header.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/mobile-header.tsx @@ -78,18 +78,18 @@ export const ProfileIssuesMobileHeader = observer(function ProfileIssuesMobileHe ); return ( -
    +
    +
    {t("common.layout")} - +
    } - customButtonClassName="flex flex-center text-custom-text-200 text-sm" + customButtonClassName="flex flex-center text-secondary text-13" closeOnSelect > {ISSUE_LAYOUTS.map((layout, index) => { @@ -103,19 +103,19 @@ export const ProfileIssuesMobileHeader = observer(function ProfileIssuesMobileHe className="flex items-center gap-2" > -
    {t(layout.i18n_title)}
    +
    {t(layout.i18n_title)}
    ); })}
    -
    +
    +
    {t("common.display")} - +
    } > diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/navbar.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/navbar.tsx index 3e135687e33..82dd85c0b3f 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/navbar.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/navbar.tsx @@ -1,13 +1,10 @@ -import React from "react"; - import Link from "next/link"; import { useParams, usePathname } from "next/navigation"; +// plane imports import { PROFILE_VIEWER_TAB, PROFILE_ADMINS_TAB } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; - -// components -// constants import { Header, EHeaderVariant } from "@plane/ui"; +import { cn } from "@plane/utils"; type Props = { isAuthorized: boolean; @@ -27,11 +24,13 @@ export function ProfileNavbar(props: Props) { {tabsList.map((tab) => ( {t(tab.i18n_label)} diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/archives/header.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/archives/header.tsx index 18d8dab9bfc..ce8f2d82f1c 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/archives/header.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/archives/header.tsx @@ -72,7 +72,7 @@ export const ProjectArchivesHeader = observer(function ProjectArchivesHeader(pro } + icon={} /> } /> @@ -81,7 +81,7 @@ export const ProjectArchivesHeader = observer(function ProjectArchivesHeader(pro component={ } + icon={} /> } /> @@ -93,7 +93,7 @@ export const ProjectArchivesHeader = observer(function ProjectArchivesHeader(pro tooltipContent={`There are ${issueCount} ${issueCount > 1 ? "work items" : "work item"} in project's archived`} position="bottom" > - + {issueCount} diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/archives/issues/(detail)/[archivedIssueId]/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/archives/issues/(detail)/[archivedIssueId]/page.tsx index 6b7123a2b10..97c1bc8ef68 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/archives/issues/(detail)/[archivedIssueId]/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/archives/issues/(detail)/[archivedIssueId]/page.tsx @@ -67,17 +67,16 @@ function ArchivedIssueDetailsPage({ params }: Route.ComponentProps) { icon={} action={ } - className="border-b border-custom-border-200" + className="border-b border-subtle" />
    -
    +
    } + icon={} /> } /> @@ -50,7 +50,7 @@ export const ProjectArchivedIssueDetailsHeader = observer(function ProjectArchiv } + icon={} /> } /> diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/[cycleId]/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/[cycleId]/page.tsx index 361912ca9b9..3d38155b362 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/[cycleId]/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/[cycleId]/page.tsx @@ -66,12 +66,8 @@ function CycleDetailPage({ params }: Route.ComponentProps) { {!isSidebarCollapsed && (
    } + icon={} /> } /> @@ -152,7 +152,7 @@ export const CycleIssuesHeader = observer(function CycleIssuesHeader() { title={cycleDetails?.name} icon={ - + } isLast @@ -169,7 +169,7 @@ export const CycleIssuesHeader = observer(function CycleIssuesHeader() { } in this cycle`} position="bottom" > - + {workItemsCount} @@ -226,39 +226,36 @@ export const CycleIssuesHeader = observer(function CycleIssuesHeader() { {canUserCreateIssue && ( <> -
    + {!isCompletedCycle && ( )} )} - +
    diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/mobile-header.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/mobile-header.tsx index 5b0610622db..26ac9b48018 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/mobile-header.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/mobile-header.tsx @@ -90,15 +90,15 @@ export const CycleIssuesMobileHeader = observer(function CycleIssuesMobileHeader onClose={() => setAnalyticsModal(false)} cycleDetails={cycleDetails ?? undefined} /> -
    +
    {t("common.layout")} + {t("common.layout")} } - customButtonClassName="flex flex-grow justify-center text-custom-text-200 text-sm" + customButtonClassName="flex flex-grow justify-center text-secondary text-13" closeOnSelect > {SUPPORTED_LAYOUTS.map((layout, index) => ( @@ -110,18 +110,18 @@ export const CycleIssuesMobileHeader = observer(function CycleIssuesMobileHeader className="flex items-center gap-2" > -
    {t(layout.titleTranslationKey)}
    +
    {t(layout.titleTranslationKey)}
    ))}
    -
    +
    + {t("common.display")} - + } > @@ -142,7 +142,7 @@ export const CycleIssuesMobileHeader = observer(function CycleIssuesMobileHeader setAnalyticsModal(true)} - className="flex flex-grow justify-center text-custom-text-200 text-sm border-l border-custom-border-200" + className="flex flex-grow justify-center text-secondary text-13 border-l border-subtle" > {t("common.analytics")} diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(list)/header.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(list)/header.tsx index deabebfdc4b..5ee1f4e44b1 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(list)/header.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(list)/header.tsx @@ -43,7 +43,7 @@ export const CyclesListHeader = observer(function CyclesListHeader() { } + icon={} isLast /> } @@ -56,7 +56,7 @@ export const CyclesListHeader = observer(function CyclesListHeader() { diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/layout.tsx index 2decac79e21..c3a27ec6ec5 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/layout.tsx @@ -25,8 +25,8 @@ function ProjectLayout({ params }: Route.ComponentProps) { <> {projectPreferences.navigationMode === "horizontal" && (
    - -
    + +
    {sidebarCollapsed && (
    diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(detail)/[moduleId]/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(detail)/[moduleId]/page.tsx index 61015482475..9c5db9a9860 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(detail)/[moduleId]/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(detail)/[moduleId]/page.tsx @@ -62,12 +62,8 @@ function ModuleIssuesPage({ params }: Route.ComponentProps) { {!isSidebarCollapsed && (
    diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(detail)/header.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(detail)/header.tsx index ee254214eb9..179e249d168 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(detail)/header.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(detail)/header.tsx @@ -134,7 +134,7 @@ export const ModuleIssuesHeader = observer(function ModuleIssuesHeader() { } + icon={} isLast /> } @@ -149,7 +149,7 @@ export const ModuleIssuesHeader = observer(function ModuleIssuesHeader() { router.push(`/${workspaceSlug}/projects/${projectId}/modules/${value}`); }} title={moduleDetails?.name} - icon={} + icon={} isLast /> } @@ -163,7 +163,7 @@ export const ModuleIssuesHeader = observer(function ModuleIssuesHeader() { } in this module`} position="bottom" > - + {workItemsCount} @@ -221,24 +221,20 @@ export const ModuleIssuesHeader = observer(function ModuleIssuesHeader() { {canUserCreateIssue ? ( <> -
    + @@ -246,20 +242,16 @@ export const ModuleIssuesHeader = observer(function ModuleIssuesHeader() { ) : ( <> )} - + {moduleId && ( )} diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(detail)/mobile-header.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(detail)/mobile-header.tsx index 881733489c8..bce3d923226 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(detail)/mobile-header.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(detail)/mobile-header.tsx @@ -72,13 +72,13 @@ export const ModuleIssuesMobileHeader = observer(function ModuleIssuesMobileHead moduleDetails={moduleDetails ?? undefined} projectDetails={currentProjectDetails} /> -
    +
    Layout} - customButtonClassName="flex flex-grow justify-center text-custom-text-200 text-sm" + customButton={Layout} + customButtonClassName="flex flex-grow justify-center text-secondary text-13" closeOnSelect > {SUPPORTED_LAYOUTS.map((layout, index) => ( @@ -90,18 +90,18 @@ export const ModuleIssuesMobileHeader = observer(function ModuleIssuesMobileHead className="flex items-center gap-2" > -
    {t(layout.i18n_title)}
    +
    {t(layout.i18n_title)}
    ))}
    -
    +
    + Display - + } > @@ -122,7 +122,7 @@ export const ModuleIssuesMobileHeader = observer(function ModuleIssuesMobileHead diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(list)/header.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(list)/header.tsx index cad6652921a..f08452982f7 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(list)/header.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(list)/header.tsx @@ -47,7 +47,7 @@ export const ModulesListHeader = observer(function ModulesListHeader() { } + icon={} isLast /> } @@ -61,11 +61,11 @@ export const ModulesListHeader = observer(function ModulesListHeader() { {canUserCreateModule ? ( - ) : ( - <> )}
    } + icon={} isLast /> } @@ -45,7 +45,7 @@ export const ProjectViewsHeader = observer(function ProjectViewsHeader() {
    diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/account/security/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/account/security/page.tsx index 4ad032f0ece..cf8ff8c07fa 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/account/security/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/account/security/page.tsx @@ -127,7 +127,7 @@ function SecurityPage() {
    {oldPasswordRequired && (
    -

    {t("auth.common.password.current_password.label")}

    +

    {t("auth.common.password.current_password.label")}

    )}
    - {errors.old_password && {errors.old_password.message}} + {errors.old_password && {errors.old_password.message}}
    )}
    -

    {t("auth.common.password.new_password.label")}

    +

    {t("auth.common.password.new_password.label")}

    {passwordSupport} {isNewPasswordSameAsOldPassword && !isPasswordInputFocused && ( - {t("new_password_must_be_different_from_old_password")} + {t("new_password_must_be_different_from_old_password")} )}
    -

    {t("auth.common.password.confirm_password.label")}

    +

    {t("auth.common.password.confirm_password.label")}

    {!!confirmPassword && password !== confirmPassword && renderPasswordMatchError && ( - {t("auth.common.password.errors.match")} + {t("auth.common.password.errors.match")} )}
    diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/account/sidebar.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/account/sidebar.tsx index 64234dc11ca..86930f734f4 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/account/sidebar.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/account/sidebar.tsx @@ -50,7 +50,7 @@ export const ProfileSidebar = observer(function ProfileSidebar(props: TProfileSi
    {!currentUser?.avatar_url || currentUser?.avatar_url === "" ? (
    - +
    ) : (
    @@ -63,8 +63,8 @@ export const ProfileSidebar = observer(function ProfileSidebar(props: TProfileSi )}
    -
    {currentUser?.display_name}
    -
    {currentUser?.email}
    +
    {currentUser?.display_name}
    +
    {currentUser?.email}
    } diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/page.tsx index 7bd35687733..522e2ff5fbf 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/page.tsx @@ -20,17 +20,16 @@ function ProjectSettingsPage() { return (
    No projects yet -
    No projects yet
    -
    +
    No projects yet
    +
    Projects act as the foundation for goal-driven work. They let you manage your teams, tasks, and everything you need to get things done.
    - + Learn more about projects - + {t("workspace_creation.errors.creation_disabled.request_button")}
    ) : (
    -

    {t("workspace_creation.heading")}

    +

    {t("workspace_creation.heading")}

    -
    +
    - + -
    +
    {currentUser?.email}
    @@ -143,8 +143,8 @@ function UserInvitationsPage() { invitations.length > 0 ? (
    -
    {t("we_see_that_someone_has_invited_you_to_join_a_workspace")}
    -

    {t("join_a_workspace")}

    +
    {t("we_see_that_someone_has_invited_you_to_join_a_workspace")}
    +

    {t("join_a_workspace")}

    {invitations.map((invitation) => { const isSelected = invitationsRespond.includes(invitation.id); @@ -152,10 +152,8 @@ function UserInvitationsPage() { return (
    handleInvitation(invitation, isSelected ? "withdraw" : "accepted")} > @@ -167,12 +165,10 @@ function UserInvitationsPage() { />
    -
    {truncateText(invitation.workspace.name, 30)}
    -

    {ROLE[invitation.role]}

    +
    {truncateText(invitation.workspace.name, 30)}
    +

    {ROLE[invitation.role]}

    - +
    @@ -183,7 +179,7 @@ function UserInvitationsPage() { diff --git a/apps/web/app/(all)/layout.tsx b/apps/web/app/(all)/layout.tsx index e87557cb7d6..986e93e4a56 100644 --- a/apps/web/app/(all)/layout.tsx +++ b/apps/web/app/(all)/layout.tsx @@ -1,12 +1,6 @@ import { Outlet } from "react-router"; import type { Route } from "./+types/layout"; import { PreloadResources } from "./layout.preload"; -// types - -// styles -import "@/styles/power-k.css"; -import "@/styles/emoji.css"; -import "@plane/propel/styles/react-day-picker.css"; export const meta: Route.MetaFunction = () => [ { name: "robots", content: "noindex, nofollow" }, diff --git a/apps/web/app/(all)/onboarding/page.tsx b/apps/web/app/(all)/onboarding/page.tsx index 0fdb91abc7a..9dc169495cc 100644 --- a/apps/web/app/(all)/onboarding/page.tsx +++ b/apps/web/app/(all)/onboarding/page.tsx @@ -40,9 +40,9 @@ function OnboardingPage() { return ( -
    +
    -
    +
    {user && !invitationsLoader ? ( ) : ( diff --git a/apps/web/app/(all)/profile/activity/page.tsx b/apps/web/app/(all)/profile/activity/page.tsx index 0ddd56f95eb..e3956258ff0 100644 --- a/apps/web/app/(all)/profile/activity/page.tsx +++ b/apps/web/app/(all)/profile/activity/page.tsx @@ -69,8 +69,8 @@ function ProfileActivityPage() { {activityPages} {isLoadMoreVisible && ( -
    -
    diff --git a/apps/web/app/(all)/profile/appearance/page.tsx b/apps/web/app/(all)/profile/appearance/page.tsx index 648681f073f..68ba9779e67 100644 --- a/apps/web/app/(all)/profile/appearance/page.tsx +++ b/apps/web/app/(all)/profile/appearance/page.tsx @@ -68,8 +68,8 @@ function ProfileAppearancePage() {
    -

    {t("theme")}

    -

    {t("select_or_customize_your_interface_color_scheme")}

    +

    {t("theme")}

    +

    {t("select_or_customize_your_interface_color_scheme")}

    diff --git a/apps/web/app/(all)/profile/layout.tsx b/apps/web/app/(all)/profile/layout.tsx index f426859396e..f5aebbfbbbc 100644 --- a/apps/web/app/(all)/profile/layout.tsx +++ b/apps/web/app/(all)/profile/layout.tsx @@ -11,9 +11,9 @@ export default function ProfileSettingsLayout() { <> -
    +
    -
    +
    diff --git a/apps/web/app/(all)/profile/security/page.tsx b/apps/web/app/(all)/profile/security/page.tsx index 3e92f4747dd..f1218800719 100644 --- a/apps/web/app/(all)/profile/security/page.tsx +++ b/apps/web/app/(all)/profile/security/page.tsx @@ -125,7 +125,7 @@ function SecurityPage() {
    {oldPasswordRequired && (
    -

    {t("auth.common.password.current_password.label")}

    +

    {t("auth.common.password.current_password.label")}

    )}
    - {errors.old_password && {errors.old_password.message}} + {errors.old_password && {errors.old_password.message}}
    )}
    -

    {t("auth.common.password.new_password.label")}

    +

    {t("auth.common.password.new_password.label")}

    {passwordSupport} {isNewPasswordSameAsOldPassword && !isPasswordInputFocused && ( - {t("new_password_must_be_different_from_old_password")} + {t("new_password_must_be_different_from_old_password")} )}
    -

    {t("auth.common.password.confirm_password.label")}

    +

    {t("auth.common.password.confirm_password.label")}

    {!!confirmPassword && password !== confirmPassword && renderPasswordMatchError && ( - {t("auth.common.password.errors.match")} + {t("auth.common.password.errors.match")} )}
    diff --git a/apps/web/app/(all)/profile/sidebar.tsx b/apps/web/app/(all)/profile/sidebar.tsx index 13ab54bdba9..daaad3d2ee0 100644 --- a/apps/web/app/(all)/profile/sidebar.tsx +++ b/apps/web/app/(all)/profile/sidebar.tsx @@ -116,7 +116,7 @@ export const ProfileLayoutSidebar = observer(function ProfileLayoutSidebar() { return (
    {!sidebarCollapsed && ( -

    {t("profile_settings")}

    +

    {t("profile_settings")}

    )}
    {!sidebarCollapsed && ( -
    {t("your_account")}
    +
    {t("your_account")}
    )}
    {PROFILE_ACTION_LINKS.map((link) => { @@ -162,7 +162,7 @@ export const ProfileLayoutSidebar = observer(function ProfileLayoutSidebar() {
    - {!sidebarCollapsed &&

    {t(link.i18n_label)}

    } + {!sidebarCollapsed &&

    {t(link.i18n_label)}

    }
    @@ -173,7 +173,7 @@ export const ProfileLayoutSidebar = observer(function ProfileLayoutSidebar() {
    {!sidebarCollapsed && ( -
    {t("workspaces")}
    +
    {t("workspaces")}
    )} {workspacesList && workspacesList.length > 0 && (
    {workspace?.logo_url && workspace.logo_url !== "" ? ( Workspace Logo ) : ( (workspace?.name?.charAt(0) ?? "...") )} - {!sidebarCollapsed && ( -

    {workspace.name}

    - )} + {!sidebarCollapsed &&

    {workspace.name}

    }
    ))} @@ -230,7 +228,7 @@ export const ProfileLayoutSidebar = observer(function ProfileLayoutSidebar() { isMobile={isMobile} >
    @@ -251,7 +249,7 @@ export const ProfileLayoutSidebar = observer(function ProfileLayoutSidebar() { {onReload && ( - )} @@ -34,7 +34,7 @@ interface DevErrorComponentProps { export function DevErrorComponent({ error, onGoHome, onReload }: DevErrorComponentProps) { if (isRouteErrorResponse(error)) { return ( -
    +
    -

    +

    {error.status} {error.statusText}

    -
    +
    -

    Error Data

    -
    -

    {error.data}

    +

    Error Data

    +
    +

    {error.data}

    @@ -69,7 +69,7 @@ export function DevErrorComponent({ error, onGoHome, onReload }: DevErrorCompone if (error instanceof Error) { return ( -
    +
    -

    Error

    -
    +

    Error

    +
    -

    Message

    -
    -

    {error.message}

    +

    Message

    +
    +

    {error.message}

    {error.stack && (
    -

    Stack Trace

    -
    -
    +                  

    Stack Trace

    +
    +
                           {error.stack}
                         
    @@ -106,12 +106,12 @@ export function DevErrorComponent({ error, onGoHome, onReload }: DevErrorCompone
    - +
    - +
    -

    Development Mode

    -

    +

    Development Mode

    +

    This detailed error view is only visible in development. In production, users will see a friendly error page.

    @@ -124,7 +124,7 @@ export function DevErrorComponent({ error, onGoHome, onReload }: DevErrorCompone } return ( -
    +
    -

    Unknown Error

    -
    +

    Unknown Error

    +
    -
    -

    +

    +

    An unknown error occurred. Please try refreshing the page or contact support if the problem persists.

    diff --git a/apps/web/app/error/prod.tsx b/apps/web/app/error/prod.tsx index 574294e548a..75148e78388 100644 --- a/apps/web/app/error/prod.tsx +++ b/apps/web/app/error/prod.tsx @@ -39,7 +39,7 @@ export function ProdErrorComponent({ onGoHome }: ProdErrorComponentProps) { return ( -
    +
    -

    - 🚧 Looks like something went wrong! -

    - +

    🚧 Looks like something went wrong!

    + We track these errors automatically and working on getting things back up and running. If the problem persists feel free to contact us. In the meantime, try refreshing. @@ -67,7 +65,7 @@ export function ProdErrorComponent({ onGoHome }: ProdErrorComponentProps) { href={link.value} target="_blank" rel="noopener noreferrer" - className="text-custom-primary-100 hover:underline text-sm" + className="text-accent-primary hover:underline text-13" > {link.label} @@ -76,7 +74,7 @@ export function ProdErrorComponent({ onGoHome }: ProdErrorComponentProps) {
    -
    diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index 824b19b91e5..3638de072cd 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -2,6 +2,8 @@ import Script from "next/script"; // styles import "@/styles/globals.css"; +import "@/styles/power-k.css"; +import "@/styles/emoji.css"; import { SITE_DESCRIPTION, SITE_NAME } from "@plane/constants"; @@ -76,12 +78,7 @@ export default function RootLayout({ children }: { children: React.ReactNode })
    -
    +
    {children}
    diff --git a/apps/web/app/not-found.tsx b/apps/web/app/not-found.tsx index 0ee635460c1..44290d63cde 100644 --- a/apps/web/app/not-found.tsx +++ b/apps/web/app/not-found.tsx @@ -13,22 +13,22 @@ export const meta: Route.MetaFunction = () => [ function PageNotFound() { return ( -
    +
    404- Page not found
    -

    Oops! Something went wrong.

    -

    +

    Oops! Something went wrong.

    +

    Sorry, the page you are looking for cannot be found. It may have been removed, had its name changed, or is temporarily unavailable.

    - diff --git a/apps/web/app/root.tsx b/apps/web/app/root.tsx index fe1c36765dd..a0d8c207647 100644 --- a/apps/web/app/root.tsx +++ b/apps/web/app/root.tsx @@ -58,12 +58,7 @@ export function Layout({ children }: { children: ReactNode }) {
    -
    +
    {children}
    diff --git a/apps/web/ce/components/active-cycles/workspace-active-cycles-upgrade.tsx b/apps/web/ce/components/active-cycles/workspace-active-cycles-upgrade.tsx index 316245fd3c0..03c9a05f325 100644 --- a/apps/web/ce/components/active-cycles/workspace-active-cycles-upgrade.tsx +++ b/apps/web/ce/components/active-cycles/workspace-active-cycles-upgrade.tsx @@ -80,17 +80,17 @@ export const WorkspaceActiveCyclesUpgrade = observer(function WorkspaceActiveCyc >
    -

    {t("on_demand_snapshots_of_all_your_cycles")}

    -

    {t("active_cycles_description")}

    +

    {t("on_demand_snapshots_of_all_your_cycles")}

    +

    {t("active_cycles_description")}

    @@ -113,12 +113,12 @@ export const WorkspaceActiveCyclesUpgrade = observer(function WorkspaceActiveCyc
    {WORKSPACE_ACTIVE_CYCLES_DETAILS.map((item) => ( -
    +

    {t(item.key)}

    - {t(`${item.key}_description`)} + {t(`${item.key}_description`)}
    ))}
    diff --git a/apps/web/ce/components/command-palette/helpers.tsx b/apps/web/ce/components/command-palette/helpers.tsx index fee3166e8d8..714f9a7e59b 100644 --- a/apps/web/ce/components/command-palette/helpers.tsx +++ b/apps/web/ce/components/command-palette/helpers.tsx @@ -26,7 +26,7 @@ export const commandGroups: TCommandGroups = { icon: , itemName: (cycle: IWorkspaceDefaultSearchResult) => (
    - {cycle.project__identifier} {cycle.name} + {cycle.project__identifier} {cycle.name}
    ), path: (cycle: IWorkspaceDefaultSearchResult) => @@ -42,7 +42,7 @@ export const commandGroups: TCommandGroups = { issueTypeId={issue.type_id} projectIdentifier={issue.project__identifier} issueSequenceId={issue.sequence_id} - textContainerClassName="text-xs" + size="xs" />{" "} {issue.name}
    @@ -61,7 +61,7 @@ export const commandGroups: TCommandGroups = { icon: , itemName: (view: IWorkspaceDefaultSearchResult) => (
    - {view.project__identifier} {view.name} + {view.project__identifier} {view.name}
    ), path: (view: IWorkspaceDefaultSearchResult) => @@ -72,7 +72,7 @@ export const commandGroups: TCommandGroups = { icon: , itemName: (module: IWorkspaceDefaultSearchResult) => (
    - {module.project__identifier} {module.name} + {module.project__identifier} {module.name}
    ), path: (module: IWorkspaceDefaultSearchResult) => @@ -83,7 +83,7 @@ export const commandGroups: TCommandGroups = { icon: , itemName: (page: IWorkspacePageSearchResult) => (
    - {page.project__identifiers?.[0]} {page.name} + {page.project__identifiers?.[0]} {page.name}
    ), path: (page: IWorkspacePageSearchResult, projectId: string | undefined) => { diff --git a/apps/web/ce/components/command-palette/power-k/search/no-results-command.tsx b/apps/web/ce/components/command-palette/power-k/search/no-results-command.tsx index 789facdfe80..c4badccd4f5 100644 --- a/apps/web/ce/components/command-palette/power-k/search/no-results-command.tsx +++ b/apps/web/ce/components/command-palette/power-k/search/no-results-command.tsx @@ -26,7 +26,7 @@ export function PowerKModalNoSearchResultsCommand(props: TPowerKModalNoSearchRes label={

    {t("power_k.search_menu.no_results")}{" "} - {t("power_k.search_menu.clear_search")} + {t("power_k.search_menu.clear_search")}

    } onSelect={() => updateSearchTerm("")} diff --git a/apps/web/ce/components/comments/comment-block.tsx b/apps/web/ce/components/comments/comment-block.tsx index becc8acb459..bfbb8302187 100644 --- a/apps/web/ce/components/comments/comment-block.tsx +++ b/apps/web/ce/components/comments/comment-block.tsx @@ -41,7 +41,7 @@ export const CommentBlock = observer(function CommentBlock(props: TCommentBlock) ref={commentBlockRef} >
    - {displayName} + {displayName}
    -
    +
    commented{" "} - + {calculateTimeAgo(comment.created_at)} {comment.edited_at && ` (${t("edited")})`} @@ -72,7 +72,7 @@ export const CommentBlock = observer(function CommentBlock(props: TCommentBlock)
    {quickActions}
    -
    {children}
    +
    {children}
    ); diff --git a/apps/web/ce/components/cycles/active-cycle/root.tsx b/apps/web/ce/components/cycles/active-cycle/root.tsx index 12e395fba7a..529dd0ffdc4 100644 --- a/apps/web/ce/components/cycles/active-cycle/root.tsx +++ b/apps/web/ce/components/cycles/active-cycle/root.tsx @@ -59,7 +59,7 @@ const ActiveCyclesComponent = observer(function ActiveCyclesComponent({ } return ( -
    +
    - -
    + +
    {({ open }) => ( <> - + diff --git a/apps/web/ce/components/estimates/estimate-list-item-buttons.tsx b/apps/web/ce/components/estimates/estimate-list-item-buttons.tsx index a3e88778ced..be1f209ad93 100644 --- a/apps/web/ce/components/estimates/estimate-list-item-buttons.tsx +++ b/apps/web/ce/components/estimates/estimate-list-item-buttons.tsx @@ -18,7 +18,7 @@ export const EstimateListItemButtons = observer(function EstimateListItemButtons return (
    - ) : ( - <> )} diff --git a/apps/web/ce/components/issues/issue-details/issue-creator.tsx b/apps/web/ce/components/issues/issue-details/issue-creator.tsx index 19c1fd20a50..f56de6be97d 100644 --- a/apps/web/ce/components/issues/issue-details/issue-creator.tsx +++ b/apps/web/ce/components/issues/issue-details/issue-creator.tsx @@ -22,11 +22,11 @@ export function IssueCreatorDisplay(props: TIssueUser) { return ( <> {customUserName ? ( - {customUserName || "Plane"} + {customUserName || "Plane"} ) : ( {activity.actor_detail?.display_name} diff --git a/apps/web/ce/components/issues/issue-details/issue-identifier.tsx b/apps/web/ce/components/issues/issue-details/issue-identifier.tsx index f6843015b00..e4eaba42c2b 100644 --- a/apps/web/ce/components/issues/issue-details/issue-identifier.tsx +++ b/apps/web/ce/components/issues/issue-details/issue-identifier.tsx @@ -1,85 +1,13 @@ -import type { FC } from "react"; import { observer } from "mobx-react"; -// types -import { TOAST_TYPE, setToast } from "@plane/propel/toast"; -import { Tooltip } from "@plane/propel/tooltip"; -import type { IIssueDisplayProperties } from "@plane/types"; -// ui -// helpers -import { cn } from "@plane/utils"; +// plane imports +import type { TIssueIdentifierProps, TIssueTypeIdentifier } from "@plane/types"; // hooks import { useIssueDetail } from "@/hooks/store/use-issue-detail"; import { useProject } from "@/hooks/store/use-project"; - -type TIssueIdentifierBaseProps = { - projectId: string; - size?: "xs" | "sm" | "md" | "lg"; - textContainerClassName?: string; - displayProperties?: IIssueDisplayProperties | undefined; - enableClickToCopyIdentifier?: boolean; -}; - -type TIssueIdentifierFromStore = TIssueIdentifierBaseProps & { - issueId: string; -}; - -type TIssueIdentifierWithDetails = TIssueIdentifierBaseProps & { - issueTypeId?: string | null; - projectIdentifier: string; - issueSequenceId: string | number; -}; - -export type TIssueIdentifierProps = TIssueIdentifierFromStore | TIssueIdentifierWithDetails; - -type TIssueTypeIdentifier = { - issueTypeId: string; - size?: "xs" | "sm" | "md" | "lg"; -}; - -export const IssueTypeIdentifier = observer(function IssueTypeIdentifier(_props: TIssueTypeIdentifier) { - return <>; -}); - -type TIdentifierTextProps = { - identifier: string; - enableClickToCopyIdentifier?: boolean; - textContainerClassName?: string; -}; - -export function IdentifierText(props: TIdentifierTextProps) { - const { identifier, enableClickToCopyIdentifier = false, textContainerClassName } = props; - // handlers - const handleCopyIssueIdentifier = () => { - if (enableClickToCopyIdentifier) { - navigator.clipboard.writeText(identifier).then(() => { - setToast({ - type: TOAST_TYPE.SUCCESS, - title: "Work item ID copied to clipboard", - }); - }); - } - }; - - return ( - - - {identifier} - - - ); -} +import { IdentifierText } from "@/components/issues/issue-detail/identifier-text"; export const IssueIdentifier = observer(function IssueIdentifier(props: TIssueIdentifierProps) { - const { projectId, textContainerClassName, displayProperties, enableClickToCopyIdentifier = false } = props; + const { projectId, variant, size, displayProperties, enableClickToCopyIdentifier = false } = props; // store hooks const { getProjectIdentifierById } = useProject(); const { @@ -100,8 +28,13 @@ export const IssueIdentifier = observer(function IssueIdentifier(props: TIssueId
    ); }); + +export const IssueTypeIdentifier = observer(function IssueTypeIdentifier(_props: TIssueTypeIdentifier) { + return <>; +}); diff --git a/apps/web/ce/components/issues/issue-details/sidebar.tsx/date-alert.tsx b/apps/web/ce/components/issues/issue-details/sidebar/date-alert.tsx similarity index 100% rename from apps/web/ce/components/issues/issue-details/sidebar.tsx/date-alert.tsx rename to apps/web/ce/components/issues/issue-details/sidebar/date-alert.tsx diff --git a/apps/web/ce/components/license/modal/upgrade-modal.tsx b/apps/web/ce/components/license/modal/upgrade-modal.tsx index 0f5e651e176..2fc439d690b 100644 --- a/apps/web/ce/components/license/modal/upgrade-modal.tsx +++ b/apps/web/ce/components/license/modal/upgrade-modal.tsx @@ -1,4 +1,3 @@ -import type { FC } from "react"; import { observer } from "mobx-react"; // plane imports import { @@ -19,7 +18,7 @@ import type { TCheckoutParams } from "@/components/license/modal/card/checkout-b // Constants const COMMON_CARD_CLASSNAME = "flex flex-col w-full h-full justify-end col-span-12 sm:col-span-6 xl:col-span-3"; -const COMMON_EXTRA_FEATURES_CLASSNAME = "pt-2 text-center text-xs text-custom-primary-200 font-medium hover:underline"; +const COMMON_EXTRA_FEATURES_CLASSNAME = "pt-2 text-center text-caption-md-medium text-accent-primary hover:underline"; export type PaidPlanUpgradeModalProps = { isOpen: boolean; @@ -48,9 +47,9 @@ export const PaidPlanUpgradeModal = observer(function PaidPlanUpgradeModal(props
    {/* Free Plan Section */}
    -
    Upgrade to a paid plan and unlock missing features.
    +
    Upgrade to a paid plan and unlock missing features.
    -

    +

    Dashboards, Workflows, Approvals, Time Management, and other superpowers are just a click away. Upgrade today to unlock features your teams need yesterday.

    diff --git a/apps/web/ce/components/navigations/top-navigation-root.tsx b/apps/web/ce/components/navigations/top-navigation-root.tsx index 97de65f6c10..f8a3f5268ba 100644 --- a/apps/web/ce/components/navigations/top-navigation-root.tsx +++ b/apps/web/ce/components/navigations/top-navigation-root.tsx @@ -40,7 +40,7 @@ export const TopNavigationRoot = observer(function TopNavigationRoot() { return (
    @@ -73,7 +73,7 @@ export const TopNavigationRoot = observer(function TopNavigationRoot() { -
    +
    diff --git a/apps/web/ce/components/onboarding/tour/root.tsx b/apps/web/ce/components/onboarding/tour/root.tsx index f44cd5a9114..08ab90be6b0 100644 --- a/apps/web/ce/components/onboarding/tour/root.tsx +++ b/apps/web/ce/components/onboarding/tour/root.tsx @@ -89,16 +89,16 @@ export const TourRoot = observer(function TourRoot(props: TOnboardingTourProps) return ( <> {step === "welcome" ? ( -
    +
    -
    - +
    +
    -

    +

    Welcome to Plane, {currentUser?.first_name} {currentUser?.last_name}

    -

    +

    We{"'"}re glad that you decided to try out Plane. You can now manage your projects with ease. Get started by creating a project.

    @@ -117,7 +117,7 @@ export const TourRoot = observer(function TourRoot(props: TOnboardingTourProps)
    ) : ( -
    +
    {currentStep?.title}
    -

    {currentStep?.title}

    -

    {currentStep?.description}

    +

    {currentStep?.title}

    +

    {currentStep?.description}

    {currentStep?.prevStep && ( - )} diff --git a/apps/web/ce/components/onboarding/tour/sidebar.tsx b/apps/web/ce/components/onboarding/tour/sidebar.tsx index 1c7abe20f94..2a41cd503b7 100644 --- a/apps/web/ce/components/onboarding/tour/sidebar.tsx +++ b/apps/web/ce/components/onboarding/tour/sidebar.tsx @@ -43,8 +43,8 @@ type Props = { export function TourSidebar({ step, setStep }: Props) { return ( -
    -

    +
    +

    Let{"'"}s get started!
    Get more out of Plane. @@ -53,10 +53,8 @@ export function TourSidebar({ step, setStep }: Props) { {sidebarOptions.map((option) => (

    setStep(option.key)} role="button" diff --git a/apps/web/ce/components/pages/editor/ai/ask-pi-menu.tsx b/apps/web/ce/components/pages/editor/ai/ask-pi-menu.tsx index 7e2e70a31d4..21fe0185b82 100644 --- a/apps/web/ce/components/pages/editor/ai/ask-pi-menu.tsx +++ b/apps/web/ce/components/pages/editor/ai/ask-pi-menu.tsx @@ -33,7 +33,7 @@ export function AskPiMenu(props: Props) { "items-start": response, })} > - + {response ? ( @@ -53,7 +53,7 @@ export function AskPiMenu(props: Props) {
    ) : ( -

    Pi is answering...

    +

    AI is answering...

    )}

    -
    +
    - + setQuery(e.target.value)} - placeholder="Tell Pi what to do..." + placeholder="Tell AI what to do..." /> - +
    diff --git a/apps/web/ce/components/pages/editor/ai/menu.tsx b/apps/web/ce/components/pages/editor/ai/menu.tsx index ac8d74b7a63..513b566b268 100644 --- a/apps/web/ce/components/pages/editor/ai/menu.tsx +++ b/apps/web/ce/components/pages/editor/ai/menu.tsx @@ -138,7 +138,7 @@ export function EditorAIMenu(props: Props) { return (
    @@ -158,9 +158,9 @@ export function EditorAIMenu(props: Props) { key={item.key} type="button" className={cn( - "w-full flex items-center justify-between gap-2 truncate rounded px-1 py-1.5 text-xs text-custom-text-200 hover:bg-custom-background-80 transition-colors", + "w-full flex items-center justify-between gap-2 truncate rounded-sm px-1 py-1.5 text-11 text-secondary hover:bg-layer-1 transition-colors", { - "bg-custom-background-80": isActiveTask, + "bg-layer-1": isActiveTask, } )} onClick={(e) => { @@ -203,7 +203,7 @@ export function EditorAIMenu(props: Props) { "items-start": response, })} > - + {response ? ( @@ -223,7 +223,7 @@ export function EditorAIMenu(props: Props) {
    ) : ( -

    +

    {activeTask ? LOADING_TEXTS[activeTask] : "Pi is writing"}...

    )}
    -
    +
    {TONES_LIST.map((tone) => (
    {activeTask && ( -
    +
    -

    +

    By using this feature, you consent to sharing the message with a 3rd party service.

    diff --git a/apps/web/ce/components/pages/editor/embed/issue-embed-upgrade-card.tsx b/apps/web/ce/components/pages/editor/embed/issue-embed-upgrade-card.tsx index 8f7b6f8b666..b7805b08cbc 100644 --- a/apps/web/ce/components/pages/editor/embed/issue-embed-upgrade-card.tsx +++ b/apps/web/ce/components/pages/editor/embed/issue-embed-upgrade-card.tsx @@ -8,7 +8,7 @@ export function IssueEmbedUpgradeCard(props: any) { return (
    -

    +

    Embed and access issues in pages seamlessly, upgrade to Plane Pro now.

    @@ -24,7 +24,7 @@ export function IssueEmbedUpgradeCard(props: any) { href="https://plane.so/pro" target="_blank" rel="noopener noreferrer" - className={cn(getButtonStyling("primary", "md"), "no-underline")} + className={cn(getButtonStyling("primary", "base"), "no-underline")} > Upgrade diff --git a/apps/web/ce/components/pages/header/lock-control.tsx b/apps/web/ce/components/pages/header/lock-control.tsx index c2ee72f6d57..dddc7e6bf35 100644 --- a/apps/web/ce/components/pages/header/lock-control.tsx +++ b/apps/web/ce/components/pages/header/lock-control.tsx @@ -80,7 +80,7 @@ export const PageLockControl = observer(function PageLockControl({ page }: Props type="button" onClick={toggleLock} data-ph-element={PROJECT_PAGE_TRACKER_ELEMENTS.LOCK_BUTTON} - className="flex-shrink-0 size-6 grid place-items-center rounded text-custom-text-200 hover:text-custom-text-100 hover:bg-custom-background-80 transition-colors" + className="flex-shrink-0 size-6 grid place-items-center rounded-sm text-secondary hover:text-primary hover:bg-layer-1 transition-colors" aria-label="Lock" > @@ -93,11 +93,11 @@ export const PageLockControl = observer(function PageLockControl({ page }: Props type="button" onClick={toggleLock} data-ph-element={PROJECT_PAGE_TRACKER_ELEMENTS.LOCK_BUTTON} - className="h-6 flex items-center gap-1 px-2 rounded text-custom-primary-100 bg-custom-primary-100/20 hover:bg-custom-primary-100/30 transition-colors" + className="h-6 flex items-center gap-1 px-2 rounded-sm text-accent-primary bg-accent-primary/20 hover:bg-accent-primary/30 transition-colors" aria-label="Locked" > - + Locked @@ -105,11 +105,11 @@ export const PageLockControl = observer(function PageLockControl({ page }: Props {displayState === "unlocked" && (
    - + Unlocked
    diff --git a/apps/web/ce/components/pages/navigation-pane/tab-panels/empty-states/assets.tsx b/apps/web/ce/components/pages/navigation-pane/tab-panels/empty-states/assets.tsx index 9754f1463f4..35c07730405 100644 --- a/apps/web/ce/components/pages/navigation-pane/tab-panels/empty-states/assets.tsx +++ b/apps/web/ce/components/pages/navigation-pane/tab-panels/empty-states/assets.tsx @@ -16,14 +16,10 @@ export function PageNavigationPaneAssetsTabEmptyState() { return (
    - An image depicting the assets of a page + depicts the assets of a page
    -

    {t("page_navigation_pane.tabs.assets.empty_state.title")}

    -

    +

    {t("page_navigation_pane.tabs.assets.empty_state.title")}

    +

    {t("page_navigation_pane.tabs.assets.empty_state.description")}

    diff --git a/apps/web/ce/components/pages/navigation-pane/tab-panels/empty-states/outline.tsx b/apps/web/ce/components/pages/navigation-pane/tab-panels/empty-states/outline.tsx index 43299c7e01b..f9b9e612ecf 100644 --- a/apps/web/ce/components/pages/navigation-pane/tab-panels/empty-states/outline.tsx +++ b/apps/web/ce/components/pages/navigation-pane/tab-panels/empty-states/outline.tsx @@ -16,14 +16,10 @@ export function PageNavigationPaneOutlineTabEmptyState() { return (
    - An image depicting the outline of a page + depicts the outline of a page
    -

    {t("page_navigation_pane.tabs.outline.empty_state.title")}

    -

    +

    {t("page_navigation_pane.tabs.outline.empty_state.title")}

    +

    {t("page_navigation_pane.tabs.outline.empty_state.description")}

    diff --git a/apps/web/ce/components/projects/create/attributes.tsx b/apps/web/ce/components/projects/create/attributes.tsx index ae7dc073008..d86a381098a 100644 --- a/apps/web/ce/components/projects/create/attributes.tsx +++ b/apps/web/ce/components/projects/create/attributes.tsx @@ -40,7 +40,7 @@ function ProjectAttributes(props: Props) { {t(currentNetwork.i18n_label)} ) : ( - {t("select_network")} + {t("select_network")} )}
    } @@ -56,7 +56,7 @@ function ProjectAttributes(props: Props) {

    {t(network.i18n_label)}

    -

    {t(network.description)}

    +

    {t(network.description)}

    diff --git a/apps/web/ce/components/projects/mobile-header.tsx b/apps/web/ce/components/projects/mobile-header.tsx index ca7e9f7c38a..8eff30aaf07 100644 --- a/apps/web/ce/components/projects/mobile-header.tsx +++ b/apps/web/ce/components/projects/mobile-header.tsx @@ -52,7 +52,7 @@ export const ProjectsListMobileHeader = observer(function ProjectsListMobileHead const isFiltersApplied = calculateTotalFilters(filters ?? {}) !== 0; return ( -
    +
    { @@ -63,13 +63,13 @@ export const ProjectsListMobileHeader = observer(function ProjectsListMobileHead }} isMobile /> -
    +
    } title={t("common.filters")} placement="bottom-end" menuButton={ -
    +
    {t("common.filters")} diff --git a/apps/web/ce/components/projects/settings/intake/header.tsx b/apps/web/ce/components/projects/settings/intake/header.tsx index 34dd99ccd00..aba1264d77a 100644 --- a/apps/web/ce/components/projects/settings/intake/header.tsx +++ b/apps/web/ce/components/projects/settings/intake/header.tsx @@ -47,7 +47,7 @@ export const ProjectInboxHeader = observer(function ProjectInboxHeader() { } + icon={} isLast /> } @@ -56,9 +56,9 @@ export const ProjectInboxHeader = observer(function ProjectInboxHeader() { {loader === "pagination-loading" && ( -
    +
    -

    {t("syncing")}...

    +

    {t("syncing")}...

    )}
    @@ -72,8 +72,7 @@ export const ProjectInboxHeader = observer(function ProjectInboxHeader() { modalState={createIssueModal} handleModalClose={() => setCreateIssueModal(false)} /> - -
    diff --git a/apps/web/ce/components/projects/settings/useProjectColumns.tsx b/apps/web/ce/components/projects/settings/useProjectColumns.tsx index a128095c656..378629e2cca 100644 --- a/apps/web/ce/components/projects/settings/useProjectColumns.tsx +++ b/apps/web/ce/components/projects/settings/useProjectColumns.tsx @@ -94,7 +94,7 @@ export const useProjectColumns = (props: TUseProjectColumnsProps) => { handleDisplayFilterUpdate={handleDisplayFilterUpdate} /> ), - tdRender: (rowData: RowData) =>
    {rowData.member.email}
    , + tdRender: (rowData: RowData) =>
    {rowData.member.email}
    , }, { key: "Account Type", diff --git a/apps/web/ce/components/relations/index.tsx b/apps/web/ce/components/relations/index.tsx index f9d72944c23..9e833feb5d0 100644 --- a/apps/web/ce/components/relations/index.tsx +++ b/apps/web/ce/components/relations/index.tsx @@ -9,29 +9,29 @@ export const ISSUE_RELATION_OPTIONS: Record , + className: "bg-layer-1 text-secondary", + icon: (size) => , placeholder: "Add related work items", }, duplicate: { key: "duplicate", i18n_label: "issue.relation.duplicate", - className: "bg-custom-background-80 text-custom-text-200", - icon: (size) => , + className: "bg-layer-1 text-secondary", + icon: (size) => , placeholder: "None", }, blocked_by: { key: "blocked_by", i18n_label: "issue.relation.blocked_by", className: "bg-red-500/20 text-red-700", - icon: (size) => , + icon: (size) => , placeholder: "None", }, blocking: { key: "blocking", i18n_label: "issue.relation.blocking", className: "bg-yellow-500/20 text-yellow-700", - icon: (size) => , + icon: (size) => , placeholder: "None", }, }; diff --git a/apps/web/ce/components/rich-filters/filter-value-input/root.tsx b/apps/web/ce/components/rich-filters/filter-value-input/root.tsx index ae731084630..5119266ddaf 100644 --- a/apps/web/ce/components/rich-filters/filter-value-input/root.tsx +++ b/apps/web/ce/components/rich-filters/filter-value-input/root.tsx @@ -11,7 +11,7 @@ export const AdditionalFilterValueInput = observer(function AdditionalFilterValu >(_props: TFilterValueInputProps) { return ( // Fallback -
    +
    Filter type not supported
    ); diff --git a/apps/web/ce/components/workflow/state-option.tsx b/apps/web/ce/components/workflow/state-option.tsx index 9516e00d5eb..1c31e030f20 100644 --- a/apps/web/ce/components/workflow/state-option.tsx +++ b/apps/web/ce/components/workflow/state-option.tsx @@ -1,6 +1,7 @@ import { observer } from "mobx-react"; import { Check } from "lucide-react"; import { Combobox } from "@headlessui/react"; +import { cn } from "@plane/utils"; export type TStateOptionProps = { projectId: string | null | undefined; @@ -24,7 +25,7 @@ export const StateOption = observer(function StateOption(props: TStateOptionProp key={option.value} value={option.value} className={({ active, selected }) => - `${className} ${active ? "bg-custom-background-80" : ""} ${selected ? "text-custom-text-100" : "text-custom-text-200"}` + cn(`${className} ${active ? "bg-layer-transparent-hover" : ""} ${selected ? "text-primary" : "text-secondary"}`) } > {({ selected }) => ( diff --git a/apps/web/ce/components/workspace-notifications/notification-card/root.tsx b/apps/web/ce/components/workspace-notifications/notification-card/root.tsx index 9b28684deca..aed7327667d 100644 --- a/apps/web/ce/components/workspace-notifications/notification-card/root.tsx +++ b/apps/web/ce/components/workspace-notifications/notification-card/root.tsx @@ -39,12 +39,12 @@ export const NotificationCardListRoot = observer(function NotificationCardListRo {paginationInfo && paginationInfo?.next_page_results && ( <> {loader === ENotificationLoader.PAGINATION_LOADER ? ( -
    -
    {t("loading")}...
    +
    +
    {t("loading")}...
    ) : ( -
    -
    +
    +
    {t("load_more")}
    diff --git a/apps/web/ce/components/workspace/billing/comparison/frequency-toggle.tsx b/apps/web/ce/components/workspace/billing/comparison/frequency-toggle.tsx index 36362161286..50c5333982c 100644 --- a/apps/web/ce/components/workspace/billing/comparison/frequency-toggle.tsx +++ b/apps/web/ce/components/workspace/billing/comparison/frequency-toggle.tsx @@ -1,8 +1,6 @@ -import type { FC } from "react"; // plane imports import { observer } from "mobx-react"; import type { EProductSubscriptionEnum, TBillingFrequency } from "@plane/types"; -import { getSubscriptionBackgroundColor, getDiscountPillStyle } from "@plane/ui"; import { calculateYearlyDiscount, cn } from "@plane/utils"; type TPlanFrequencyToggleProps = { @@ -14,47 +12,42 @@ type TPlanFrequencyToggleProps = { }; export const PlanFrequencyToggle = observer(function PlanFrequencyToggle(props: TPlanFrequencyToggleProps) { - const { subscriptionType, monthlyPrice, yearlyPrice, selectedFrequency, setSelectedFrequency } = props; + const { monthlyPrice, yearlyPrice, selectedFrequency, setSelectedFrequency } = props; // derived values const yearlyDiscount = calculateYearlyDiscount(monthlyPrice, yearlyPrice); return ( -
    -
    -
    +
    +
    -
    +
    +
    ); diff --git a/apps/web/ce/components/workspace/billing/comparison/plan-detail.tsx b/apps/web/ce/components/workspace/billing/comparison/plan-detail.tsx index 96e6d4c91a4..cdc170c4468 100644 --- a/apps/web/ce/components/workspace/billing/comparison/plan-detail.tsx +++ b/apps/web/ce/components/workspace/billing/comparison/plan-detail.tsx @@ -1,4 +1,3 @@ -import type { FC } from "react"; import { observer } from "mobx-react"; // plane imports import { @@ -9,11 +8,10 @@ import { WORKSPACE_SETTINGS_TRACKER_EVENTS, } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; -import { getButtonStyling } from "@plane/propel/button"; +import { Button } from "@plane/propel/button"; import type { TBillingFrequency } from "@plane/types"; import { EProductSubscriptionEnum } from "@plane/types"; -import { getUpgradeButtonStyle } from "@plane/ui"; -import { cn, getSubscriptionName } from "@plane/utils"; +import { getSubscriptionName } from "@plane/utils"; // components import { DiscountInfo } from "@/components/license/modal/card/discount-info"; import type { TPlanDetail } from "@/constants/plans"; @@ -28,9 +26,6 @@ type TPlanDetailProps = { setBillingFrequency: (frequency: TBillingFrequency) => void; }; -const COMMON_BUTTON_STYLE = - "relative inline-flex items-center justify-center w-full px-4 py-1.5 text-xs font-medium rounded-lg focus:outline-none transition-all duration-300 animate-slide-up"; - export const PlanDetail = observer(function PlanDetail(props: TPlanDetailProps) { const { subscriptionType, planDetail, billingFrequency, setBillingFrequency } = props; // plane hooks @@ -45,8 +40,6 @@ export const PlanDetail = observer(function PlanDetail(props: TPlanDetailProps) billingFrequency === "month" ? planDetail.monthlyPriceSecondaryDescription : planDetail.yearlyPriceSecondaryDescription; - // helper styles - const upgradeButtonStyle = getUpgradeButtonStyle(subscriptionType, false) ?? getButtonStyling("primary", "lg"); const handleRedirection = () => { const frequency = billingFrequency ?? "year"; @@ -66,15 +59,17 @@ export const PlanDetail = observer(function PlanDetail(props: TPlanDetailProps)
    {/* Plan name and pricing section */}
    -
    - {subscriptionName} +
    + {subscriptionName} {subscriptionType === EProductSubscriptionEnum.PRO && ( - Popular + + Popular + )}
    -
    +
    {isSubscriptionActive && displayPrice !== undefined && ( -
    +
    )}
    - {pricingDescription &&
    {pricingDescription}
    } + {pricingDescription &&
    {pricingDescription}
    } {pricingSecondaryDescription && ( -
    - {pricingSecondaryDescription} -
    +
    {pricingSecondaryDescription}
    )}
    @@ -109,10 +102,12 @@ export const PlanDetail = observer(function PlanDetail(props: TPlanDetailProps) )} {/* Subscription button */} -
    - +
    ); diff --git a/apps/web/ce/components/workspace/billing/root.tsx b/apps/web/ce/components/workspace/billing/root.tsx index 085513cc7aa..2753887d179 100644 --- a/apps/web/ce/components/workspace/billing/root.tsx +++ b/apps/web/ce/components/workspace/billing/root.tsx @@ -5,8 +5,6 @@ import { DEFAULT_PRODUCT_BILLING_FREQUENCY, SUBSCRIPTION_WITH_BILLING_FREQUENCY import { useTranslation } from "@plane/i18n"; import type { TBillingFrequency, TProductBillingFrequency } from "@plane/types"; import { EProductSubscriptionEnum } from "@plane/types"; -import { getSubscriptionTextColor } from "@plane/ui"; -import { cn } from "@plane/utils"; // components import { SettingsHeading } from "@/components/settings/heading"; // local imports @@ -44,24 +42,20 @@ export const BillingRoot = observer(function BillingRoot() { title={t("workspace_settings.settings.billing_and_plans.heading")} description={t("workspace_settings.settings.billing_and_plans.description")} /> -
    +
    -
    -
    +
    +
    -

    - Community -

    -
    +

    Community

    +
    Unlimited projects, issues, cycles, modules, pages, and storage
    -
    All plans
    +
    All plans
    +
    {/* Conditionally render AppRailRoot based on context */} @@ -25,7 +25,7 @@ export const WorkspaceContentWrapper = observer(function WorkspaceContentWrapper className={cn( "relative size-full pl-2 pb-2 pr-2 flex-grow transition-all ease-in-out duration-300 overflow-hidden", { - "pl-0": shouldRenderAppRail, + "pl-0!": shouldRenderAppRail, } )} > diff --git a/apps/web/ce/components/workspace/delete-workspace-section.tsx b/apps/web/ce/components/workspace/delete-workspace-section.tsx index d25025c28b2..8fb5999291d 100644 --- a/apps/web/ce/components/workspace/delete-workspace-section.tsx +++ b/apps/web/ce/components/workspace/delete-workspace-section.tsx @@ -1,4 +1,3 @@ -import type { FC } from "react"; import { useState } from "react"; import { observer } from "mobx-react"; // types @@ -30,7 +29,7 @@ export const DeleteWorkspaceSection = observer(function DeleteWorkspaceSection(p isOpen={deleteWorkspaceModal} onClose={() => setDeleteWorkspaceModal(false)} /> -
    +
    - + {t("workspace_settings.settings.general.delete_workspace")} {isOpen ? : } @@ -47,12 +46,13 @@ export const DeleteWorkspaceSection = observer(function DeleteWorkspaceSection(p } >
    - + {t("workspace_settings.settings.general.delete_workspace_description")}
    diff --git a/apps/web/core/components/account/auth-forms/forgot-password-popover.tsx b/apps/web/core/components/account/auth-forms/forgot-password-popover.tsx index bfbe82073ee..5b6c50d5124 100644 --- a/apps/web/core/components/account/auth-forms/forgot-password-popover.tsx +++ b/apps/web/core/components/account/auth-forms/forgot-password-popover.tsx @@ -30,7 +30,7 @@ export function ForgotPasswordPopover() { @@ -38,20 +38,20 @@ export function ForgotPasswordPopover() { {({ close }) => (
    🤥 -

    {t("auth.forgot_password.errors.smtp_not_enabled")}

    +

    {t("auth.forgot_password.errors.smtp_not_enabled")}

    )} diff --git a/apps/web/core/components/account/auth-forms/forgot-password.tsx b/apps/web/core/components/account/auth-forms/forgot-password.tsx index 4ef067d9c54..49b1ec43d51 100644 --- a/apps/web/core/components/account/auth-forms/forgot-password.tsx +++ b/apps/web/core/components/account/auth-forms/forgot-password.tsx @@ -92,7 +92,7 @@ export const ForgotPasswordForm = observer(function ForgotPasswordForm() {
    -
    ) : (
    -
    -
    +
    +
    -
    +

    -

    {comicBox?.title}

    -

    {comicBox?.description}

    +

    {comicBox?.title}

    +

    {comicBox?.description}

    diff --git a/apps/web/core/components/common/page-access-icon.tsx b/apps/web/core/components/common/page-access-icon.tsx index 8569013221b..264938d8de5 100644 --- a/apps/web/core/components/common/page-access-icon.tsx +++ b/apps/web/core/components/common/page-access-icon.tsx @@ -6,11 +6,11 @@ export function PageAccessIcon(page: TPage) { return (
    {page.archived_at ? ( - + ) : page.access === EPageAccess.PUBLIC ? ( - + ) : ( - + )}
    ); diff --git a/apps/web/core/components/common/switcher-label.tsx b/apps/web/core/components/common/switcher-label.tsx index 149fc18e9b3..291cb3a8cd8 100644 --- a/apps/web/core/components/common/switcher-label.tsx +++ b/apps/web/core/components/common/switcher-label.tsx @@ -22,7 +22,7 @@ export function SwitcherIcon({ logo_props, logo_url, LabelIcon, size = 12, type logo ); @@ -41,7 +41,7 @@ type TSwitcherLabelProps = { export function SwitcherLabel(props: TSwitcherLabelProps) { const { logo_props, name, LabelIcon, logo_url, type = "lucide" } = props; return ( -
    +
    {truncateText(name ?? "", 40)}
    diff --git a/apps/web/core/components/core/activity.tsx b/apps/web/core/components/core/activity.tsx index 92407ca4de0..e898578d970 100644 --- a/apps/web/core/components/core/activity.tsx +++ b/apps/web/core/components/core/activity.tsx @@ -59,13 +59,13 @@ export function IssueLink({ activity }: { activity: IIssueActivity }) { href={workItemLink} target={activity.issue === null ? "_self" : "_blank"} rel={activity.issue === null ? "" : "noopener noreferrer"} - className="inline items-center gap-1 font-medium text-custom-text-100 hover:underline" + className="inline items-center gap-1 font-medium text-primary hover:underline" > {`${activity.project_detail.identifier}-${activity.issue_detail.sequence_id}`}{" "} - {activity.issue_detail?.name} + {activity.issue_detail?.name}
    ) : ( - + {" a work item"}{" "} )} @@ -84,7 +84,7 @@ function UserLink({ activity }: { activity: IIssueActivity }) { }`} target="_blank" rel="noopener noreferrer" - className="inline-flex items-center font-medium text-custom-text-100 hover:underline" + className="inline-flex items-center font-medium text-primary hover:underline" > {activity.new_value && activity.new_value !== "" ? activity.new_value : activity.old_value}
    @@ -177,7 +177,7 @@ const activityDetails: { ); }, - icon:
    ))} @@ -305,13 +305,13 @@ export const ImagePickerPopover = observer(function ImagePickerPopover(props: Pr {...getRootProps()} className={`relative grid h-full w-full cursor-pointer place-items-center rounded-lg p-12 text-center focus:outline-none focus:ring-2 focus:ring-custom-primary focus:ring-offset-2 ${ (image === null && isDragActive) || !value - ? "border-2 border-dashed border-custom-border-200 hover:bg-custom-background-90" + ? "border-2 border-dashed border-subtle hover:bg-surface-2" : "" }`} > @@ -325,7 +325,7 @@ export const ImagePickerPopover = observer(function ImagePickerPopover(props: Pr ) : (
    - + {isDragActive ? "Drop image here to upload" : "Drag & drop image here"}
    @@ -335,18 +335,18 @@ export const ImagePickerPopover = observer(function ImagePickerPopover(props: Pr
    {fileRejections.length > 0 && ( -

    +

    {fileRejections[0].errors[0].code === "file-too-large" ? "The image size cannot exceed 5 MB." : "Please upload a file in a valid format."}

    )} -

    File formats supported- .jpeg, .jpg, .png, .webp

    +

    File formats supported- .jpeg, .jpg, .png, .webp

    diff --git a/apps/web/core/components/core/modals/bulk-delete-issues-modal.tsx b/apps/web/core/components/core/modals/bulk-delete-issues-modal.tsx index 77d4236ef9c..086ca12be1e 100644 --- a/apps/web/core/components/core/modals/bulk-delete-issues-modal.tsx +++ b/apps/web/core/components/core/modals/bulk-delete-issues-modal.tsx @@ -127,9 +127,9 @@ export const BulkDeleteIssuesModal = observer(function BulkDeleteIssuesModal(pro issues.length > 0 ? (
  • {query === "" && ( -

    Select work items to delete

    +

    Select work items to delete

    )} -
      +
        {issues.map((issue) => ( setQuery("")} appear> -
        +
        -
        +
        { @@ -178,21 +178,18 @@ export const BulkDeleteIssuesModal = observer(function BulkDeleteIssuesModal(pro >
        - + {isSearching ? ( @@ -208,10 +205,15 @@ export const BulkDeleteIssuesModal = observer(function BulkDeleteIssuesModal(pro {issues.length > 0 && (
        - -
        diff --git a/apps/web/core/components/core/modals/change-email-modal.tsx b/apps/web/core/components/core/modals/change-email-modal.tsx index 3c963921e56..51bd6b36553 100644 --- a/apps/web/core/components/core/modals/change-email-modal.tsx +++ b/apps/web/core/components/core/modals/change-email-modal.tsx @@ -138,7 +138,7 @@ export const ChangeEmailModal = observer(function ChangeEmailModal(props: Props) leaveFrom="opacity-100" leaveTo="opacity-0" > -
        +
        @@ -152,17 +152,17 @@ export const ChangeEmailModal = observer(function ChangeEmailModal(props: Props) leaveFrom="opacity-100 translate-y-0 sm:scale-100" leaveTo="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95" > - +
        - + {changeEmailT("title")} -

        {changeEmailT("description")}

        +

        {changeEmailT("description")}

        {secondStep && ( -

        {changeEmailT("form.email.label")}

        +

        {changeEmailT("form.email.label")}

        )} )} /> - {errors?.email && {errors?.email?.message}} + {errors?.email && {errors?.email?.message}}
        {secondStep && (
        -

        {changeEmailT("form.code.label")}

        +

        {changeEmailT("form.code.label")}

        {errors?.code ? ( - {errors?.code?.message} + {errors?.code?.message} ) : ( - {changeEmailT("form.code.helper_text")} + {changeEmailT("form.code.helper_text")} )}
        )} -
        - -
        ))}
        ) : ( -
        +
        {t("issue.select.empty")}
        )} {workspaceLevelToggle && (
        {/* TODO: Translate here */} {searchTerm !== "" && ( -
        +
        Search results for{" "} - + {'"'} {searchTerm} {'"'} @@ -266,7 +267,7 @@ export function ExistingIssuesListModal(props: Props) { searchTerm={searchTerm} /> ) : ( -
          0 ? "p-2" : ""}`}> +
            0 ? "p-2" : ""}`}> {filteredIssues.map((issue) => { const selected = selectedIssues.some((i) => i.id === issue.id); @@ -277,9 +278,9 @@ export function ExistingIssuesListModal(props: Props) { htmlFor={`issue-${issue.id}`} value={issue} className={({ active }) => - `group flex w-full cursor-pointer select-none items-center justify-between gap-2 rounded-md px-3 py-2 my-0.5 text-custom-text-200 ${ - active ? "bg-custom-background-80 text-custom-text-100" : "" - } ${selected ? "text-custom-text-100" : ""}` + `group flex w-full cursor-pointer select-none items-center justify-between gap-2 rounded-md px-3 py-2 my-0.5 text-secondary ${ + active ? "bg-layer-1 text-primary" : "" + } ${selected ? "text-primary" : ""}` } >
            @@ -296,7 +297,8 @@ export function ExistingIssuesListModal(props: Props) { issueTypeId={issue.type_id} projectIdentifier={issue.project__identifier} issueSequenceId={issue.sequence_id} - textContainerClassName="text-xs text-custom-text-200" + size="xs" + variant="secondary" /> {issue.name} @@ -310,7 +312,7 @@ export function ExistingIssuesListModal(props: Props) { sequenceId: issue?.sequence_id, })} target="_blank" - className="z-1 relative hidden flex-shrink-0 text-custom-text-200 hover:text-custom-text-100 group-hover:block" + className="z-1 relative hidden flex-shrink-0 text-secondary hover:text-primary group-hover:block" rel="noopener noreferrer" onClick={(e) => e.stopPropagation()} > @@ -327,8 +329,7 @@ export function ExistingIssuesListModal(props: Props) {
            -
            diff --git a/apps/web/core/components/core/modals/user-image-upload-modal.tsx b/apps/web/core/components/core/modals/user-image-upload-modal.tsx index e70f8f73702..94cdcd38fcd 100644 --- a/apps/web/core/components/core/modals/user-image-upload-modal.tsx +++ b/apps/web/core/components/core/modals/user-image-upload-modal.tsx @@ -99,7 +99,7 @@ export const UserImageUploadModal = observer(function UserImageUploadModal(props leaveFrom="opacity-100" leaveTo="opacity-0" > -
            +
            @@ -113,9 +113,9 @@ export const UserImageUploadModal = observer(function UserImageUploadModal(props leaveFrom="opacity-100 translate-y-0 sm:scale-100" leaveTo="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95" > - +
            - + Upload Image
            @@ -124,7 +124,7 @@ export const UserImageUploadModal = observer(function UserImageUploadModal(props {...getRootProps()} className={`relative grid h-80 w-80 cursor-pointer place-items-center rounded-lg p-12 text-center focus:outline-none focus:ring-2 focus:ring-custom-primary focus:ring-offset-2 ${ (image === null && isDragActive) || !value - ? "border-2 border-dashed border-custom-border-200 hover:bg-custom-background-90" + ? "border-2 border-dashed border-subtle hover:bg-surface-2" : "" }`} > @@ -132,7 +132,7 @@ export const UserImageUploadModal = observer(function UserImageUploadModal(props <> @@ -144,8 +144,8 @@ export const UserImageUploadModal = observer(function UserImageUploadModal(props ) : (
            - - + + {isDragActive ? "Drop image here to upload" : "Drag & drop image here"}
            @@ -155,7 +155,7 @@ export const UserImageUploadModal = observer(function UserImageUploadModal(props
            {fileRejections.length > 0 && ( -

            +

            {fileRejections[0].errors[0].code === "file-too-large" ? "The image size cannot exceed 5 MB." : "Please upload a file in a valid format."} @@ -163,18 +163,18 @@ export const UserImageUploadModal = observer(function UserImageUploadModal(props )}

            -

            File formats supported- .jpeg, .jpg, .png, .webp

            +

            File formats supported- .jpeg, .jpg, .png, .webp

            -
            - @@ -157,8 +157,8 @@ export const WorkspaceImageUploadModal = observer(function WorkspaceImageUploadM ) : (
            - - + + {isDragActive ? "Drop image here to upload" : "Drag & drop image here"}
            @@ -168,7 +168,7 @@ export const WorkspaceImageUploadModal = observer(function WorkspaceImageUploadM
            {fileRejections.length > 0 && ( -

            +

            {fileRejections[0].errors[0].code === "file-too-large" ? "The image size cannot exceed 5 MB." : "Please upload a file in a valid format."} @@ -176,18 +176,24 @@ export const WorkspaceImageUploadModal = observer(function WorkspaceImageUploadM )}

            -

            File formats supported- .jpeg, .jpg, .png, .webp

            +

            File formats supported- .jpeg, .jpg, .png, .webp

            -
            - ); }); diff --git a/apps/web/core/components/core/sidebar/single-progress-stats.tsx b/apps/web/core/components/core/sidebar/single-progress-stats.tsx index f5eacec1b03..ecb453b9b53 100644 --- a/apps/web/core/components/core/sidebar/single-progress-stats.tsx +++ b/apps/web/core/components/core/sidebar/single-progress-stats.tsx @@ -11,9 +11,9 @@ type TSingleProgressStatsProps = { export function SingleProgressStats({ title, completed, total, onClick, selected = false }: TSingleProgressStatsProps) { return (
            {title}
            diff --git a/apps/web/core/components/core/theme/color-picker-input.tsx b/apps/web/core/components/core/theme/color-picker-input.tsx index ddbac128b66..c7a4d02b892 100644 --- a/apps/web/core/components/core/theme/color-picker-input.tsx +++ b/apps/web/core/components/core/theme/color-picker-input.tsx @@ -88,19 +88,17 @@ export function ColorPickerInput(props: Props) { <> {watch(name) && watch(name) !== "" ? ( ) : ( - + )} diff --git a/apps/web/core/components/core/theme/custom-theme-selector.tsx b/apps/web/core/components/core/theme/custom-theme-selector.tsx index 3273b74de62..e3e5083b684 100644 --- a/apps/web/core/components/core/theme/custom-theme-selector.tsx +++ b/apps/web/core/components/core/theme/custom-theme-selector.tsx @@ -127,11 +127,11 @@ export const CustomThemeSelector = observer(function CustomThemeSelector(props: return (
            -

            {t("customize_your_theme")}

            +

            {t("customize_your_theme")}

            -

            {t("background_color")}

            +

            {t("background_color")}

            handleValueChange(val, onChange)} placeholder="#0d101b" - className="w-full placeholder:text-custom-text-400/60" + className="w-full placeholder:text-placeholder/60" style={{ backgroundColor: watch("background"), color: watch("text"), @@ -152,12 +152,12 @@ export const CustomThemeSelector = observer(function CustomThemeSelector(props: /> )} /> - {errors.background &&

            {errors.background.message}

            } + {errors.background &&

            {errors.background.message}

            }
            -

            {t("text_color")}

            +

            {t("text_color")}

            handleValueChange(val, onChange)} placeholder="#c5c5c5" - className="w-full placeholder:text-custom-text-400/60" + className="w-full placeholder:text-placeholder/60" style={{ backgroundColor: watch("text"), color: watch("background"), @@ -178,12 +178,12 @@ export const CustomThemeSelector = observer(function CustomThemeSelector(props: /> )} /> - {errors.text &&

            {errors.text.message}

            } + {errors.text &&

            {errors.text.message}

            }
            -

            {t("primary_color")}

            +

            {t("primary_color")}

            handleValueChange(val, onChange)} placeholder="#3f76ff" - className="w-full placeholder:text-custom-text-400/60" + className="w-full placeholder:text-placeholder/60" style={{ backgroundColor: watch("primary"), color: watch("text"), @@ -204,12 +204,12 @@ export const CustomThemeSelector = observer(function CustomThemeSelector(props: /> )} /> - {errors.primary &&

            {errors.primary.message}

            } + {errors.primary &&

            {errors.primary.message}

            }
            -

            {t("sidebar_background_color")}

            +

            {t("sidebar_background_color")}

            handleValueChange(val, onChange)} placeholder="#0d101b" - className="w-full placeholder:text-custom-text-400/60" + className="w-full placeholder:text-placeholder/60" style={{ backgroundColor: watch("sidebarBackground"), color: watch("sidebarText"), @@ -231,13 +231,13 @@ export const CustomThemeSelector = observer(function CustomThemeSelector(props: )} /> {errors.sidebarBackground && ( -

            {errors.sidebarBackground.message}

            +

            {errors.sidebarBackground.message}

            )}
            -

            {t("sidebar_text_color")}

            +

            {t("sidebar_text_color")}

            handleValueChange(val, onChange)} placeholder="#c5c5c5" - className="w-full placeholder:text-custom-text-400/60" + className="w-full placeholder:text-placeholder/60" style={{ backgroundColor: watch("sidebarText"), color: watch("sidebarBackground"), @@ -258,7 +258,7 @@ export const CustomThemeSelector = observer(function CustomThemeSelector(props: /> )} /> - {errors.sidebarText &&

            {errors.sidebarText.message}

            } + {errors.sidebarText &&

            {errors.sidebarText.message}

            }
            diff --git a/apps/web/core/components/core/theme/theme-switch.tsx b/apps/web/core/components/core/theme/theme-switch.tsx index 597ee3394ff..a7d9cc8262c 100644 --- a/apps/web/core/components/core/theme/theme-switch.tsx +++ b/apps/web/core/components/core/theme/theme-switch.tsx @@ -22,7 +22,7 @@ export function ThemeSwitch(props: Props) { value ? (
            +
            cn( - "relative z-[1] font-semibold text-xs rounded-[3px] py-1.5 text-custom-text-400 focus:outline-none transition duration-500", + "relative z-[1] font-semibold text-11 rounded-[3px] py-1.5 text-placeholder focus:outline-none transition duration-500", { - "text-custom-text-300 bg-custom-background-100": selected, - "hover:text-custom-text-300": !selected, + "text-tertiary bg-surface-1": selected, + "hover:text-tertiary": !selected, } ) } @@ -141,10 +141,10 @@ export const ActiveCycleStats = observer(function ActiveCycleStats(props: Active cn( - "relative z-[1] font-semibold text-xs rounded-[3px] py-1.5 text-custom-text-400 focus:outline-none transition duration-500", + "relative z-[1] font-semibold text-11 rounded-[3px] py-1.5 text-placeholder focus:outline-none transition duration-500", { - "text-custom-text-300 bg-custom-background-100": selected, - "hover:text-custom-text-300": !selected, + "text-tertiary bg-surface-1": selected, + "hover:text-tertiary": !selected, } ) } @@ -154,10 +154,10 @@ export const ActiveCycleStats = observer(function ActiveCycleStats(props: Active cn( - "relative z-[1] font-semibold text-xs rounded-[3px] py-1.5 text-custom-text-400 focus:outline-none transition duration-500", + "relative z-[1] font-semibold text-11 rounded-[3px] py-1.5 text-placeholder focus:outline-none transition duration-500", { - "text-custom-text-300 bg-custom-background-100": selected, - "hover:text-custom-text-300": !selected, + "text-tertiary bg-surface-1": selected, + "hover:text-tertiary": !selected, } ) } @@ -169,7 +169,7 @@ export const ActiveCycleStats = observer(function ActiveCycleStats(props: Active
            { if (issue.id) { setPeekIssue({ @@ -202,13 +202,9 @@ export const ActiveCycleStats = observer(function ActiveCycleStats(props: Active }} >
            - + - {issue.name} + {issue.name}
            @@ -227,9 +223,9 @@ export const ActiveCycleStats = observer(function ActiveCycleStats(props: Active tooltipHeading="Target Date" tooltipContent={renderFormattedDate(issue.target_date)} > -
            +
            - + {renderFormattedDateWithoutYear(issue.target_date)}
            @@ -243,7 +239,7 @@ export const ActiveCycleStats = observer(function ActiveCycleStats(props: Active
            )} @@ -264,7 +260,7 @@ export const ActiveCycleStats = observer(function ActiveCycleStats(props: Active {cycle && !isEmpty(cycle.distribution) ? ( cycle?.distribution?.assignees && cycle.distribution.assignees.length > 0 ? ( @@ -300,7 +296,7 @@ export const ActiveCycleStats = observer(function ActiveCycleStats(props: Active key={`unassigned-${index}`} title={
            -
            +
            User
            {t("no_assignee")} @@ -326,7 +322,7 @@ export const ActiveCycleStats = observer(function ActiveCycleStats(props: Active {cycle && !isEmpty(cycle.distribution) ? ( cycle?.distribution?.labels && cycle.distribution.labels.length > 0 ? ( @@ -341,7 +337,7 @@ export const ActiveCycleStats = observer(function ActiveCycleStats(props: Active backgroundColor: label.color ?? "#000000", }} /> - {label.label_name ?? "No labels"} + {label.label_name ?? "No labels"}
            } completed={label.completed_issues} @@ -370,7 +366,7 @@ export const ActiveCycleStats = observer(function ActiveCycleStats(props: Active
            ) : ( - + ); diff --git a/apps/web/core/components/cycles/active-cycle/productivity.tsx b/apps/web/core/components/cycles/active-cycle/productivity.tsx index af552d06dd6..f34153b64c8 100644 --- a/apps/web/core/components/cycles/active-cycle/productivity.tsx +++ b/apps/web/core/components/cycles/active-cycle/productivity.tsx @@ -45,12 +45,10 @@ export const ActiveCycleProductivity = observer(function ActiveCycleProductivity const completionChartDistributionData = chartDistributionData?.completion_chart || undefined; return cycle && completionChartDistributionData ? ( -
            +
            -

            - {t("project_cycles.active_cycle.issue_burndown")} -

            +

            {t("project_cycles.active_cycle.issue_burndown")}

            @@ -59,7 +57,7 @@ export const ActiveCycleProductivity = observer(function ActiveCycleProductivity {cycle.total_issues > 0 ? ( <>
            -
            +
            {estimateType === "points" ? ( {`Pending points - ${cycle.backlog_estimate_points + cycle.unstarted_estimate_points + cycle.started_estimate_points}`} ) : ( @@ -98,7 +96,7 @@ export const ActiveCycleProductivity = observer(function ActiveCycleProductivity
            ) : ( - + ); diff --git a/apps/web/core/components/cycles/active-cycle/progress.tsx b/apps/web/core/components/cycles/active-cycle/progress.tsx index 226a4b2ab28..b0d5ac74e8f 100644 --- a/apps/web/core/components/cycles/active-cycle/progress.tsx +++ b/apps/web/core/components/cycles/active-cycle/progress.tsx @@ -44,12 +44,12 @@ export const ActiveCycleProgress = observer(function ActiveCycleProgress(props: const resolvedPath = resolvedTheme === "light" ? lightProgressAsset : darkProgressAsset; return cycle && cycle.hasOwnProperty("started_issues") ? ( -
            +
            -

            {t("project_cycles.active_cycle.progress")}

            +

            {t("project_cycles.active_cycle.progress")}

            {cycle.total_issues > 0 && ( - + {`${cycle.completed_issues + cycle.cancelled_issues}/${cycle.total_issues - cycle.cancelled_issues} ${ cycle.completed_issues + cycle.cancelled_issues > 1 ? "Work items" : "Work item" } closed`} @@ -66,7 +66,7 @@ export const ActiveCycleProgress = observer(function ActiveCycleProgress(props: {groupedIssues[group] > 0 && (
            { handleFiltersUpdate([{ property: "state_group", operator: "in", value: [group] }]); }} @@ -78,9 +78,9 @@ export const ActiveCycleProgress = observer(function ActiveCycleProgress(props: backgroundColor: PROGRESS_STATE_GROUPS_DETAILS[index].color, }} /> - {group} + {group}
            - {`${groupedIssues[group]} ${ + {`${groupedIssues[group]} ${ groupedIssues[group] > 1 ? "Work items" : "Work item" }`}
            @@ -89,7 +89,7 @@ export const ActiveCycleProgress = observer(function ActiveCycleProgress(props: ))} {cycle.cancelled_issues > 0 && ( - + {`${cycle.cancelled_issues} cancelled ${ cycle.cancelled_issues > 1 ? "work items are" : "work item is" @@ -105,7 +105,7 @@ export const ActiveCycleProgress = observer(function ActiveCycleProgress(props: )}
            ) : ( - + ); diff --git a/apps/web/core/components/cycles/analytics-sidebar/issue-progress.tsx b/apps/web/core/components/cycles/analytics-sidebar/issue-progress.tsx index 119979e031d..711bfc66a2c 100644 --- a/apps/web/core/components/cycles/analytics-sidebar/issue-progress.tsx +++ b/apps/web/core/components/cycles/analytics-sidebar/issue-progress.tsx @@ -98,7 +98,7 @@ export const CycleAnalyticsProgress = observer(function CycleAnalyticsProgress(p if (!cycleDetails) return <>; return ( -
            +
            {({ open }) => (
            @@ -106,9 +106,7 @@ export const CycleAnalyticsProgress = observer(function CycleAnalyticsProgress(p {isCycleDateValid ? (
            -
            - {t("project_cycles.active_cycle.progress")} -
            +
            {t("project_cycles.active_cycle.progress")}
            {open ? ( @@ -120,13 +118,11 @@ export const CycleAnalyticsProgress = observer(function CycleAnalyticsProgress(p
            ) : (
            -
            - {t("project_cycles.active_cycle.progress")} -
            +
            {t("project_cycles.active_cycle.progress")}
            )} - + {cycleStartDate && cycleEndDate ? ( <> {isCycleDateValid && ( @@ -160,7 +156,7 @@ export const CycleAnalyticsProgress = observer(function CycleAnalyticsProgress(p )} ) : ( -
            +
            {t("no_data_yet")}
            )} diff --git a/apps/web/core/components/cycles/analytics-sidebar/progress-stats.tsx b/apps/web/core/components/cycles/analytics-sidebar/progress-stats.tsx index 722d30e2c6e..109285c1d27 100644 --- a/apps/web/core/components/cycles/analytics-sidebar/progress-stats.tsx +++ b/apps/web/core/components/cycles/analytics-sidebar/progress-stats.tsx @@ -122,18 +122,16 @@ export const CycleProgressStats = observer(function CycleProgressStats(props: TC className={cn( `flex w-full items-center justify-between gap-2 rounded-md p-1`, roundedTab ? `rounded-3xl` : `rounded-md`, - noBackground ? `` : `bg-custom-background-90`, - size === "xs" ? `text-xs` : `text-sm` + noBackground ? `` : `bg-surface-2`, + size === "xs" ? `text-11` : `text-13` )} > {PROGRESS_STATS.map((stat) => ( setCycleTab(stat.key)} @@ -142,7 +140,7 @@ export const CycleProgressStats = observer(function CycleProgressStats(props: TC ))} - + {cycleDetails?.description && (