From d0f26f87347615f70a9d1bf6f7f3a9b9fc296756 Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Fri, 22 Aug 2025 12:54:46 +0530 Subject: [PATCH 001/138] [WEB-4726] fix: intake work item redirection (#7619) * chore: added is intake for email notifications * fix: intake work item redirection * chore: code refactor * chore: code refactor --------- Co-authored-by: NarayanBavisetti --- apps/api/plane/app/serializers/issue.py | 7 ++++++- apps/api/plane/app/views/issue/base.py | 13 ++++++++++++- .../(projects)/browse/[workItem]/page.tsx | 6 ++++++ .../components/inbox/content/inbox-issue-header.tsx | 3 +-- packages/types/src/issues/issue.ts | 1 + 5 files changed, 26 insertions(+), 4 deletions(-) diff --git a/apps/api/plane/app/serializers/issue.py b/apps/api/plane/app/serializers/issue.py index d002de3390..691140eba0 100644 --- a/apps/api/plane/app/serializers/issue.py +++ b/apps/api/plane/app/serializers/issue.py @@ -908,9 +908,14 @@ class IssueLiteSerializer(DynamicBaseSerializer): class IssueDetailSerializer(IssueSerializer): description_html = serializers.CharField() is_subscribed = serializers.BooleanField(read_only=True) + is_intake = serializers.BooleanField(read_only=True) class Meta(IssueSerializer.Meta): - fields = IssueSerializer.Meta.fields + ["description_html", "is_subscribed"] + fields = IssueSerializer.Meta.fields + [ + "description_html", + "is_subscribed", + "is_intake", + ] read_only_fields = fields diff --git a/apps/api/plane/app/views/issue/base.py b/apps/api/plane/app/views/issue/base.py index 21e5eaf709..4d0d4457ea 100644 --- a/apps/api/plane/app/views/issue/base.py +++ b/apps/api/plane/app/views/issue/base.py @@ -51,6 +51,7 @@ from plane.db.models import ( IssueRelation, IssueAssignee, IssueLabel, + IntakeIssue, ) from plane.utils.grouper import ( issue_group_values, @@ -1223,7 +1224,7 @@ class IssueDetailIdentifierEndpoint(BaseAPIView): # Fetch the issue issue = ( - Issue.issue_objects.filter(project_id=project.id) + Issue.objects.filter(project_id=project.id) .filter(workspace__slug=slug) .select_related("workspace", "project", "state", "parent") .prefetch_related("assignees", "labels", "issue_module__module") @@ -1315,6 +1316,16 @@ class IssueDetailIdentifierEndpoint(BaseAPIView): ) ) ) + .annotate( + is_intake=Exists( + IntakeIssue.objects.filter( + issue=OuterRef("id"), + status__in=[-2, 0], + workspace__slug=slug, + project_id=project.id, + ) + ) + ) ).first() # Check if the issue exists diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/browse/[workItem]/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/browse/[workItem]/page.tsx index 1d24faa46c..dabb43eb7c 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/browse/[workItem]/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/browse/[workItem]/page.tsx @@ -78,6 +78,12 @@ const IssueDetailsPage = observer(() => { return () => window.removeEventListener("resize", handleToggleIssueDetailSidebar); }, [issueDetailSidebarCollapsed, toggleIssueDetailSidebar]); + useEffect(() => { + if (data?.is_intake) { + router.push(`/${workspaceSlug}/projects/${data.project_id}/intake/?currentTab=open&inboxIssueId=${data?.id}`); + } + }, [workspaceSlug, data]); + return ( <> diff --git a/apps/web/core/components/inbox/content/inbox-issue-header.tsx b/apps/web/core/components/inbox/content/inbox-issue-header.tsx index e379c869c2..c42e6a747e 100644 --- a/apps/web/core/components/inbox/content/inbox-issue-header.tsx +++ b/apps/web/core/components/inbox/content/inbox-issue-header.tsx @@ -104,7 +104,6 @@ export const InboxIssueActionsHeader: FC = observer((p const currentInboxIssueId = inboxIssue?.issue?.id; - const intakeIssueLink = `${workspaceSlug}/projects/${issue?.project_id}/intake/?currentTab=${currentTab}&inboxIssueId=${currentInboxIssueId}`; const redirectIssue = (): string | undefined => { let nextOrPreviousIssueId: string | undefined = undefined; @@ -413,7 +412,7 @@ export const InboxIssueActionsHeader: FC = observer((p )} - handleCopyIssueLink(intakeIssueLink)}> + handleCopyIssueLink(workItemLink)}>
{t("inbox_issue.actions.copy")} diff --git a/packages/types/src/issues/issue.ts b/packages/types/src/issues/issue.ts index 33470b4829..f2adb48110 100644 --- a/packages/types/src/issues/issue.ts +++ b/packages/types/src/issues/issue.ts @@ -70,6 +70,7 @@ export type TBaseIssue = { is_draft: boolean; is_epic?: boolean; + is_intake?: boolean; }; export type IssueRelation = { From d3b26996ddca16e5fbcda2342b3999a81d72f6b8 Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Fri, 22 Aug 2025 14:13:08 +0530 Subject: [PATCH 002/138] fix: replace .npmrc node version with engines in package.json (#7623) --- .npmrc | 3 --- package.json | 5 ++++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.npmrc b/.npmrc index 85ec104c95..7c04f27e78 100644 --- a/.npmrc +++ b/.npmrc @@ -18,9 +18,6 @@ public-hoist-pattern[]=eslint public-hoist-pattern[]=prettier public-hoist-pattern[]=typescript -# Enforce Node version for consistent installs -use-node-version=22.18.0 - # Reproducible installs across CI and dev prefer-frozen-lockfile=true diff --git a/package.json b/package.json index d50182b6e4..93daef72ef 100644 --- a/package.json +++ b/package.json @@ -39,5 +39,8 @@ "sharp": "0.33.5" } }, - "packageManager": "pnpm@10.12.1" + "packageManager": "pnpm@10.12.1", + "engines": { + "node": ">=22.18.0" + } } From cf8eeee03a1bc0069443d1c052d81780ebcc7a39 Mon Sep 17 00:00:00 2001 From: Jayash Tripathy <76092296+JayashTripathy@users.noreply.github.com> Date: Sat, 23 Aug 2025 00:27:31 +0530 Subject: [PATCH 003/138] [WEB-4687] feat: propel switch (#7629) * feat: added switch * fix: lint * fix: lock file * fix: improve accessibility and refactor switch component styles * feat: add switch component to propel package * fix: update imports in command component for consistency * refactor: styles --- .../modals/existing-issues-list-modal.tsx | 2 +- packages/propel/package.json | 3 +- packages/propel/src/combobox/combobox.tsx | 2 +- packages/propel/src/command/command.tsx | 2 +- packages/propel/src/switch/index.ts | 1 + packages/propel/src/switch/root.tsx | 57 ++++++ pnpm-lock.yaml | 173 +++++++++++++----- 7 files changed, 189 insertions(+), 51 deletions(-) create mode 100644 packages/propel/src/switch/index.ts create mode 100644 packages/propel/src/switch/root.tsx diff --git a/apps/web/core/components/core/modals/existing-issues-list-modal.tsx b/apps/web/core/components/core/modals/existing-issues-list-modal.tsx index f5ecf81bb6..cb1ac8867a 100644 --- a/apps/web/core/components/core/modals/existing-issues-list-modal.tsx +++ b/apps/web/core/components/core/modals/existing-issues-list-modal.tsx @@ -1,6 +1,7 @@ "use client"; import React, { useEffect, useState } from "react"; +import { filter } from "lodash"; import { Rocket, Search, X } from "lucide-react"; import { Combobox, Dialog, Transition } from "@headlessui/react"; // i18n @@ -20,7 +21,6 @@ import { IssueIdentifier } from "@/plane-web/components/issues/issue-details/iss import { ProjectService } from "@/services/project"; // components import { IssueSearchModalEmptyState } from "./issue-search-modal-empty-state"; -import { filter } from "lodash"; type Props = { workspaceSlug: string | undefined; diff --git a/packages/propel/package.json b/packages/propel/package.json index 11e6921eb6..b18bd730c6 100644 --- a/packages/propel/package.json +++ b/packages/propel/package.json @@ -22,7 +22,8 @@ "./command": "./src/command/index.ts", "./combobox": "./src/combobox/index.ts", "./tooltip": "./src/tooltip/index.ts", - "./styles/fonts": "./src/styles/fonts/index.css" + "./styles/fonts": "./src/styles/fonts/index.css", + "./switch": "./src/switch/index.ts" }, "dependencies": { "@base-ui-components/react": "^1.0.0-beta.2", diff --git a/packages/propel/src/combobox/combobox.tsx b/packages/propel/src/combobox/combobox.tsx index 91e5637263..b5b571f5bc 100644 --- a/packages/propel/src/combobox/combobox.tsx +++ b/packages/propel/src/combobox/combobox.tsx @@ -1,7 +1,7 @@ import * as React from "react"; +import { cn } from "@plane/utils"; import { Command } from "../command/command"; import { Popover } from "../popover/root"; -import { cn } from "@plane/utils"; export interface ComboboxOption { value: unknown; diff --git a/packages/propel/src/command/command.tsx b/packages/propel/src/command/command.tsx index 25969aada8..8657714235 100644 --- a/packages/propel/src/command/command.tsx +++ b/packages/propel/src/command/command.tsx @@ -1,7 +1,7 @@ import { Command as CommandPrimitive } from "cmdk"; import { SearchIcon } from "lucide-react"; import * as React from "react"; -import { cn } from "@plane/ui"; +import { cn } from "@plane/utils"; function CommandComponent({ className, ...props }: React.ComponentProps) { return ; diff --git a/packages/propel/src/switch/index.ts b/packages/propel/src/switch/index.ts new file mode 100644 index 0000000000..1efe34c51e --- /dev/null +++ b/packages/propel/src/switch/index.ts @@ -0,0 +1 @@ +export * from "./root"; diff --git a/packages/propel/src/switch/root.tsx b/packages/propel/src/switch/root.tsx new file mode 100644 index 0000000000..19a37b8960 --- /dev/null +++ b/packages/propel/src/switch/root.tsx @@ -0,0 +1,57 @@ +import * as React from "react"; +import { Switch as BaseSwitch } from "@base-ui-components/react/switch"; +import { cn } from "@plane/utils"; + +interface IToggleSwitchProps { + value: boolean; + onChange: (value: boolean) => void; + label?: string; + size?: "sm" | "md" | "lg"; + disabled?: boolean; + className?: string; +} + +const Switch: React.FC = ({ value, onChange, label, size = "sm", disabled, className }) => ( + + {label && {label}} + +); + +Switch.displayName = "plane-ui-switch"; + +export { Switch }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index abe64c2dfc..b4d469b214 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -98,7 +98,7 @@ importers: version: 0.33.5 swr: specifier: ^2.2.4 - version: 2.3.6(react@18.3.1) + version: 2.3.3(react@18.3.1) uuid: specifier: ^9.0.1 version: 9.0.1 @@ -235,7 +235,7 @@ importers: version: 9.0.8 concurrently: specifier: ^9.0.1 - version: 9.2.0 + version: 9.1.2 nodemon: specifier: ^3.1.7 version: 3.1.10 @@ -361,7 +361,7 @@ importers: version: 0.33.5 swr: specifier: ^2.2.2 - version: 2.3.6(react@18.3.1) + version: 2.3.3(react@18.3.1) tailwind-merge: specifier: ^2.0.0 version: 2.6.0 @@ -398,7 +398,7 @@ importers: version: 9.0.8 '@typescript-eslint/eslint-plugin': specifier: ^8.36.0 - version: 8.40.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + version: 8.38.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -509,7 +509,7 @@ importers: version: 0.2.1(next@14.2.30(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.131.3 - version: 1.260.1 + version: 1.258.5 react: specifier: ^18.3.1 version: 18.3.1 @@ -551,7 +551,7 @@ importers: version: 2.0.2 swr: specifier: ^2.1.3 - version: 2.3.6(react@18.3.1) + version: 2.3.3(react@18.3.1) tailwind-merge: specifier: ^2.0.0 version: 2.6.0 @@ -659,7 +659,7 @@ importers: dependencies: '@floating-ui/dom': specifier: ^1.7.1 - version: 1.7.3 + version: 1.7.2 '@floating-ui/react': specifier: ^0.26.4 version: 0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -825,7 +825,7 @@ importers: devDependencies: '@typescript-eslint/eslint-plugin': specifier: ^8.6.0 - version: 8.40.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + version: 8.38.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^8.6.0 version: 8.40.0(eslint@8.57.1)(typescript@5.8.3) @@ -843,7 +843,7 @@ importers: version: 1.13.4(eslint@8.57.1) eslint-plugin-import: specifier: ^2.29.1 - version: 2.32.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + version: 2.31.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) eslint-plugin-react: specifier: ^7.33.2 version: 7.37.5(eslint@8.57.1) @@ -1749,6 +1749,9 @@ packages: '@floating-ui/core@1.7.3': resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + '@floating-ui/dom@1.7.2': + resolution: {integrity: sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==} + '@floating-ui/dom@1.7.3': resolution: {integrity: sha512-uZA413QEpNuhtb3/iIKoYMSK07keHPYeXF02Zhd6e213j+d1NamLix/mCLxBUDW/Gx52sPH2m+chlUsyaBs/Ag==} @@ -3313,11 +3316,11 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@typescript-eslint/eslint-plugin@8.40.0': - resolution: {integrity: sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw==} + '@typescript-eslint/eslint-plugin@8.38.0': + resolution: {integrity: sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.40.0 + '@typescript-eslint/parser': ^8.38.0 eslint: ^8.57.0 || ^9.0.0 typescript: 5.8.3 @@ -3328,46 +3331,76 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: 5.8.3 + '@typescript-eslint/project-service@8.38.0': + resolution: {integrity: sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: 5.8.3 + '@typescript-eslint/project-service@8.40.0': resolution: {integrity: sha512-/A89vz7Wf5DEXsGVvcGdYKbVM9F7DyFXj52lNYUDS1L9yJfqjW/fIp5PgMuEJL/KeqVTe2QSbXAGUZljDUpArw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: 5.8.3 + '@typescript-eslint/scope-manager@8.38.0': + resolution: {integrity: sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.40.0': resolution: {integrity: sha512-y9ObStCcdCiZKzwqsE8CcpyuVMwRouJbbSrNuThDpv16dFAj429IkM6LNb1dZ2m7hK5fHyzNcErZf7CEeKXR4w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/tsconfig-utils@8.38.0': + resolution: {integrity: sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: 5.8.3 + '@typescript-eslint/tsconfig-utils@8.40.0': resolution: {integrity: sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: 5.8.3 - '@typescript-eslint/type-utils@8.40.0': - resolution: {integrity: sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==} + '@typescript-eslint/type-utils@8.38.0': + resolution: {integrity: sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==} 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/types@8.38.0': + resolution: {integrity: sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.40.0': resolution: {integrity: sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.38.0': + resolution: {integrity: sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: 5.8.3 + '@typescript-eslint/typescript-estree@8.40.0': resolution: {integrity: sha512-k1z9+GJReVVOkc1WfVKs1vBrR5MIKKbdAjDTPvIK3L8De6KbFfPFt6BKpdkdk7rZS2GtC/m6yI5MYX+UsuvVYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: 5.8.3 - '@typescript-eslint/utils@8.40.0': - resolution: {integrity: sha512-Cgzi2MXSZyAUOY+BFwGs17s7ad/7L+gKt6Y8rAVVWS+7o6wrjeFN4nVfTpbE25MNcxyJ+iYUXflbs2xR9h4UBg==} + '@typescript-eslint/utils@8.38.0': + resolution: {integrity: sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==} 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.38.0': + resolution: {integrity: sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.40.0': resolution: {integrity: sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4016,8 +4049,8 @@ packages: compute-scroll-into-view@3.1.1: resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} - concurrently@9.2.0: - resolution: {integrity: sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==} + concurrently@9.1.2: + resolution: {integrity: sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==} engines: {node: '>=18'} hasBin: true @@ -4569,8 +4602,8 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-import@2.32.0: - resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} + eslint-plugin-import@2.31.0: + resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -6198,8 +6231,8 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - posthog-js@1.260.1: - resolution: {integrity: sha512-DD8ZSRpdScacMqtqUIvMFme8lmOWkOvExG8VvjONE7Cm3xpRH5xXpfrwMJE4bayTGWKMx4ij6SfphK6dm/o2ug==} + posthog-js@1.258.5: + resolution: {integrity: sha512-Tx6CzS8MsGAQGPrQth5TbkGxGQgAY01SktNW773/KDmVOWiRVZq/WQF/MRJRiuFxJ7qjethZQi3aBWfWKdr1RA==} peerDependencies: '@rrweb/types': 2.0.0-alpha.17 rrweb-snapshot: 2.0.0-alpha.17 @@ -7028,8 +7061,8 @@ packages: '@swc/core': ^1.2.147 webpack: '>=2' - swr@2.3.6: - resolution: {integrity: sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==} + swr@2.3.3: + resolution: {integrity: sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==} peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -8153,6 +8186,11 @@ snapshots: dependencies: '@floating-ui/utils': 0.2.10 + '@floating-ui/dom@1.7.2': + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + '@floating-ui/dom@1.7.3': dependencies: '@floating-ui/core': 1.7.3 @@ -9861,14 +9899,14 @@ snapshots: dependencies: '@types/node': 20.19.11 - '@typescript-eslint/eslint-plugin@8.40.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 '@typescript-eslint/parser': 8.40.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.40.0 - '@typescript-eslint/type-utils': 8.40.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/utils': 8.40.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.40.0 + '@typescript-eslint/scope-manager': 8.38.0 + '@typescript-eslint/type-utils': 8.38.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/utils': 8.38.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.38.0 eslint: 8.57.1 graphemer: 1.4.0 ignore: 7.0.5 @@ -9890,6 +9928,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/project-service@8.38.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@5.8.3) + '@typescript-eslint/types': 8.40.0 + debug: 4.4.1(supports-color@5.5.0) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/project-service@8.40.0(typescript@5.8.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@5.8.3) @@ -9899,20 +9946,29 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/scope-manager@8.38.0': + dependencies: + '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/visitor-keys': 8.38.0 + '@typescript-eslint/scope-manager@8.40.0': dependencies: '@typescript-eslint/types': 8.40.0 '@typescript-eslint/visitor-keys': 8.40.0 + '@typescript-eslint/tsconfig-utils@8.38.0(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + '@typescript-eslint/tsconfig-utils@8.40.0(typescript@5.8.3)': dependencies: typescript: 5.8.3 - '@typescript-eslint/type-utils@8.40.0(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.38.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.40.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.38.0(eslint@8.57.1)(typescript@5.8.3) debug: 4.4.1(supports-color@5.5.0) eslint: 8.57.1 ts-api-utils: 2.1.0(typescript@5.8.3) @@ -9920,8 +9976,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/types@8.38.0': {} + '@typescript-eslint/types@8.40.0': {} + '@typescript-eslint/typescript-estree@8.38.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/project-service': 8.38.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3) + '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/visitor-keys': 8.38.0 + debug: 4.4.1(supports-color@5.5.0) + 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.40.0(typescript@5.8.3)': dependencies: '@typescript-eslint/project-service': 8.40.0(typescript@5.8.3) @@ -9938,17 +10012,22 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.40.0(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/utils@8.38.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.40.0 - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.38.0 + '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) eslint: 8.57.1 typescript: 5.8.3 transitivePeerDependencies: - supports-color + '@typescript-eslint/visitor-keys@8.38.0': + dependencies: + '@typescript-eslint/types': 8.38.0 + eslint-visitor-keys: 4.2.1 + '@typescript-eslint/visitor-keys@8.40.0': dependencies: '@typescript-eslint/types': 8.40.0 @@ -10636,7 +10715,7 @@ snapshots: compute-scroll-into-view@3.1.1: {} - concurrently@9.2.0: + concurrently@9.1.2: dependencies: chalk: 4.1.2 lodash: 4.17.21 @@ -11195,12 +11274,12 @@ snapshots: dependencies: '@next/eslint-plugin-next': 14.2.31 '@rushstack/eslint-patch': 1.12.0 - '@typescript-eslint/eslint-plugin': 8.40.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 8.38.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/parser': 8.40.0(eslint@8.57.1)(typescript@5.8.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.37.5(eslint@8.57.1) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.1) @@ -11228,7 +11307,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.1(supports-color@5.5.0) @@ -11239,7 +11318,7 @@ snapshots: tinyglobby: 0.2.14 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -11250,11 +11329,11 @@ snapshots: '@typescript-eslint/parser': 8.40.0(eslint@8.57.1)(typescript@5.8.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -13096,7 +13175,7 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - posthog-js@1.260.1: + posthog-js@1.258.5: dependencies: core-js: 3.45.0 fflate: 0.4.8 @@ -14063,7 +14142,7 @@ snapshots: '@swc/counter': 0.1.3 webpack: 5.101.3(@swc/core@1.13.3(@swc/helpers@0.5.17))(esbuild@0.25.0) - swr@2.3.6(react@18.3.1): + swr@2.3.3(react@18.3.1): dependencies: dequal: 2.0.3 react: 18.3.1 From 6e5549c4399168202e95c558143ab5a7ff87433c Mon Sep 17 00:00:00 2001 From: Sangeetha Date: Sat, 23 Aug 2025 00:28:08 +0530 Subject: [PATCH 004/138] [WEB-4187] fix: related search issues #7628 --- apps/api/plane/app/views/search/issue.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/api/plane/app/views/search/issue.py b/apps/api/plane/app/views/search/issue.py index ed826782a7..b3bce1eda0 100644 --- a/apps/api/plane/app/views/search/issue.py +++ b/apps/api/plane/app/views/search/issue.py @@ -59,9 +59,10 @@ class IssueSearchEndpoint(BaseAPIView): ) related_issue_ids = [item for sublist in related_issue_ids for item in sublist] + related_issue_ids.append(issue_id) if issue: - issues = issues.filter(~Q(pk=issue_id), ~Q(pk__in=related_issue_ids)) + issues = issues.exclude(pk__in=related_issue_ids) return issues From a0f7acae429210384ee3b0c1d690032cc81c08f8 Mon Sep 17 00:00:00 2001 From: Sriram Veeraghanta Date: Sat, 23 Aug 2025 00:33:38 +0530 Subject: [PATCH 005/138] chore: format files --- apps/web/core/components/inbox/content/inbox-issue-header.tsx | 1 - package.json | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/core/components/inbox/content/inbox-issue-header.tsx b/apps/web/core/components/inbox/content/inbox-issue-header.tsx index c42e6a747e..bb68cdba6a 100644 --- a/apps/web/core/components/inbox/content/inbox-issue-header.tsx +++ b/apps/web/core/components/inbox/content/inbox-issue-header.tsx @@ -104,7 +104,6 @@ export const InboxIssueActionsHeader: FC = observer((p const currentInboxIssueId = inboxIssue?.issue?.id; - const redirectIssue = (): string | undefined => { let nextOrPreviousIssueId: string | undefined = undefined; const currentIssueIndex = filteredInboxIssueIds.findIndex((id) => id === currentInboxIssueId); diff --git a/package.json b/package.json index 93daef72ef..6cac20f032 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "start": "turbo run start", "clean": "turbo run clean && rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist", "fix": "turbo run fix", + "fix:format": "turbo run fix:format", "check": "turbo run check", "check:lint": "turbo run check:lint", "check:format": "turbo run check:format" From 706085395e54826ffcb73332d07260f060565260 Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Sat, 23 Aug 2025 00:42:44 +0530 Subject: [PATCH 006/138] [WEB-4748] chore: placement helper fn added and code refactor #7627 Co-authored-by: Sriram Veeraghanta --- packages/propel/src/popover/root.tsx | 55 ++------------------------ packages/propel/src/tooltip/root.tsx | 54 ++----------------------- packages/propel/src/utils/placement.ts | 47 ++++++++++++++++++++++ 3 files changed, 55 insertions(+), 101 deletions(-) create mode 100644 packages/propel/src/utils/placement.ts diff --git a/packages/propel/src/popover/root.tsx b/packages/propel/src/popover/root.tsx index 4509b1c40f..bef1b72981 100644 --- a/packages/propel/src/popover/root.tsx +++ b/packages/propel/src/popover/root.tsx @@ -1,62 +1,15 @@ import * as React from "react"; import { Popover as BasePopover } from "@base-ui-components/react/popover"; - -// types -export type Placement = - | "auto" - | "auto-start" - | "auto-end" - | "top-start" - | "top-end" - | "bottom-start" - | "bottom-end" - | "right-start" - | "right-end" - | "left-start" - | "left-end" - | "top" - | "bottom" - | "right" - | "left"; - -type Side = "top" | "bottom" | "left" | "right"; -type Align = "start" | "center" | "end"; +import { TPlacement, TSide, TAlign, convertPlacementToSideAndAlign } from "../utils/placement"; export interface PopoverContentProps extends React.ComponentProps { - placement?: Placement; - align?: Align; + placement?: TPlacement; + align?: TAlign; sideOffset?: BasePopover.Positioner.Props["sideOffset"]; - side?: Side; + side?: TSide; containerRef?: React.RefObject; } -// placement conversion map -const PLACEMENT_MAP = new Map([ - ["auto", { side: "bottom", align: "center" }], - ["auto-start", { side: "bottom", align: "start" }], - ["auto-end", { side: "bottom", align: "end" }], - ["top", { side: "top", align: "center" }], - ["bottom", { side: "bottom", align: "center" }], - ["left", { side: "left", align: "center" }], - ["right", { side: "right", align: "center" }], - ["top-start", { side: "top", align: "start" }], - ["top-end", { side: "top", align: "end" }], - ["bottom-start", { side: "bottom", align: "start" }], - ["bottom-end", { side: "bottom", align: "end" }], - ["left-start", { side: "left", align: "start" }], - ["left-end", { side: "left", align: "end" }], - ["right-start", { side: "right", align: "start" }], - ["right-end", { side: "right", align: "end" }], -]); - -// conversion function -export function convertPlacementToSideAndAlign(placement: Placement): { - side: Side; - align: Align; -} { - return PLACEMENT_MAP.get(placement) || { side: "bottom", align: "center" }; -} - // PopoverContent component const PopoverContent = React.memo(function PopoverContent({ children, diff --git a/packages/propel/src/tooltip/root.tsx b/packages/propel/src/tooltip/root.tsx index f3ab8d3e33..3f71950f03 100644 --- a/packages/propel/src/tooltip/root.tsx +++ b/packages/propel/src/tooltip/root.tsx @@ -1,50 +1,12 @@ import * as React from "react"; import { Tooltip as BaseTooltip } from "@base-ui-components/react/tooltip"; import { cn } from "@plane/utils"; - -export type TPosition = - | "top" - | "right" - | "bottom" - | "left" - | "auto" - | "auto-end" - | "auto-start" - | "bottom-start" - | "bottom-end" - | "left-start" - | "left-end" - | "right-start" - | "right-end" - | "top-start" - | "top-end"; - -type Side = "top" | "bottom" | "left" | "right"; -type Align = "start" | "center" | "end"; - -// placement conversion map -const PLACEMENT_MAP = new Map([ - ["auto", { side: "bottom", align: "center" }], - ["auto-start", { side: "bottom", align: "start" }], - ["auto-end", { side: "bottom", align: "end" }], - ["top", { side: "top", align: "center" }], - ["bottom", { side: "bottom", align: "center" }], - ["left", { side: "left", align: "center" }], - ["right", { side: "right", align: "center" }], - ["top-start", { side: "top", align: "start" }], - ["top-end", { side: "top", align: "end" }], - ["bottom-start", { side: "bottom", align: "start" }], - ["bottom-end", { side: "bottom", align: "end" }], - ["left-start", { side: "left", align: "start" }], - ["left-end", { side: "left", align: "end" }], - ["right-start", { side: "right", align: "start" }], - ["right-end", { side: "right", align: "end" }], -]); +import { TPlacement, TSide, TAlign, convertPlacementToSideAndAlign } from "../utils/placement"; type ITooltipProps = { tooltipHeading?: string; tooltipContent: string | React.ReactNode; - position?: TPosition; + position?: TPlacement; children: React.ReactElement; disabled?: boolean; className?: string; @@ -52,19 +14,11 @@ type ITooltipProps = { closeDelay?: number; isMobile?: boolean; renderByDefault?: boolean; - side?: Side; - align?: Align; + side?: TSide; + align?: TAlign; sideOffset?: number; }; -// conversion function -export function convertPlacementToSideAndAlign(placement: TPosition): { - side: Side; - align: Align; -} { - return PLACEMENT_MAP.get(placement) || { side: "bottom", align: "center" }; -} - export function Tooltip(props: ITooltipProps) { const { tooltipHeading, diff --git a/packages/propel/src/utils/placement.ts b/packages/propel/src/utils/placement.ts new file mode 100644 index 0000000000..b150127373 --- /dev/null +++ b/packages/propel/src/utils/placement.ts @@ -0,0 +1,47 @@ +// types +export type TPlacement = + | "auto" + | "auto-start" + | "auto-end" + | "top-start" + | "top-end" + | "bottom-start" + | "bottom-end" + | "right-start" + | "right-end" + | "left-start" + | "left-end" + | "top" + | "bottom" + | "right" + | "left"; + +export type TSide = "top" | "bottom" | "left" | "right"; +export type TAlign = "start" | "center" | "end"; + +// placement conversion map +const PLACEMENT_MAP = new Map([ + ["auto", { side: "bottom", align: "center" }], + ["auto-start", { side: "bottom", align: "start" }], + ["auto-end", { side: "bottom", align: "end" }], + ["top", { side: "top", align: "center" }], + ["bottom", { side: "bottom", align: "center" }], + ["left", { side: "left", align: "center" }], + ["right", { side: "right", align: "center" }], + ["top-start", { side: "top", align: "start" }], + ["top-end", { side: "top", align: "end" }], + ["bottom-start", { side: "bottom", align: "start" }], + ["bottom-end", { side: "bottom", align: "end" }], + ["left-start", { side: "left", align: "start" }], + ["left-end", { side: "left", align: "end" }], + ["right-start", { side: "right", align: "start" }], + ["right-end", { side: "right", align: "end" }], +]); + +// conversion function +export function convertPlacementToSideAndAlign(placement: TPlacement): { + side: TSide; + align: TAlign; +} { + return PLACEMENT_MAP.get(placement) || { side: "bottom", align: "center" }; +} From 4ad88c969c66d6a6481fddcbae06663b0a3428cc Mon Sep 17 00:00:00 2001 From: Vamsi Krishna <46787868+vamsikrishnamathala@users.noreply.github.com> Date: Sat, 23 Aug 2025 00:46:06 +0530 Subject: [PATCH 007/138] [WEB-4747]chore: rendering cycle progress from snapshot (#7626) * chore: rendering progress from snaposhot * chore: removed unncessary memoization --------- Co-authored-by: Sriram Veeraghanta --- .../cycles/list/cycles-list-item.tsx | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/apps/web/core/components/cycles/list/cycles-list-item.tsx b/apps/web/core/components/cycles/list/cycles-list-item.tsx index 019ebbdc66..18e6d90bbb 100644 --- a/apps/web/core/components/cycles/list/cycles-list-item.tsx +++ b/apps/web/core/components/cycles/list/cycles-list-item.tsx @@ -1,6 +1,6 @@ "use client"; - import { FC, MouseEvent, useRef } from "react"; +import isEmpty from "lodash/isEmpty"; import { observer } from "mobx-react"; import { usePathname, useSearchParams } from "next/navigation"; import { Check } from "lucide-react"; @@ -53,11 +53,6 @@ export const CyclesListItem: FC = observer((props) => { const isCompleted = cycleStatus === "completed"; const isActive = cycleStatus === "current"; - const completionPercentage = - ((cycleDetails.completed_issues + cycleDetails.cancelled_issues) / cycleDetails.total_issues) * 100; - - const progress = isNaN(completionPercentage) ? 0 : Math.floor(completionPercentage); - // handlers const openCycleOverview = (e: MouseEvent) => { e.preventDefault(); @@ -78,6 +73,21 @@ export const CyclesListItem: FC = observer((props) => { const handleItemClick = cycleDetails.archived_at ? handleArchivedCycleClick : undefined; + const getCycleProgress = () => { + let completionPercentage = + ((cycleDetails.completed_issues + cycleDetails.cancelled_issues) / cycleDetails.total_issues) * 100; + + if (isCompleted && !isEmpty(cycleDetails.progress_snapshot)) { + completionPercentage = + ((cycleDetails.progress_snapshot.completed_issues + cycleDetails.progress_snapshot.cancelled_issues) / + cycleDetails.progress_snapshot.total_issues) * + 100; + } + return isNaN(completionPercentage) ? 0 : Math.floor(completionPercentage); + }; + + const progress = getCycleProgress(); + return ( Date: Sat, 23 Aug 2025 00:54:03 +0530 Subject: [PATCH 008/138] [WIKI-498] [WIKI-567] feat: ability to rearrange columns and rows in table (#7624) * feat: ability to rearrange columns and rows * chore: update delete icon * refactor: table utilities and plugins * chore: handle edge cases * chore: safe pseudo element inserts --------- Co-authored-by: Sriram Veeraghanta --- packages/editor/src/core/constants/meta.ts | 2 + .../table/plugins/drag-handles/actions.ts | 211 ++++++++++++++++++ .../plugins/drag-handles/color-selector.tsx | 117 ++++++++++ .../drag-handles/column/drag-handle.tsx | 204 +++++++++++++++++ .../plugins/drag-handles/column/dropdown.tsx | 100 +++++++++ .../plugins/drag-handles/column/plugin.ts | 74 ++++++ .../plugins/drag-handles/column/utils.ts | 150 +++++++++++++ .../plugins/drag-handles/marker-utils.ts | 106 +++++++++ .../plugins/drag-handles/row/drag-handle.tsx | 203 +++++++++++++++++ .../plugins/drag-handles/row/dropdown.tsx | 100 +++++++++ .../table/plugins/drag-handles/row/plugin.ts | 72 ++++++ .../table/plugins/drag-handles/row/utils.ts | 149 +++++++++++++ .../table/plugins/drag-handles/utils.ts | 60 +++++ .../table/plugins/insert-handlers/plugin.ts | 42 +++- .../table/plugins/insert-handlers/utils.ts | 7 +- .../src/core/extensions/table/table-cell.ts | 6 +- .../src/core/extensions/table/table-header.ts | 8 +- .../extensions/table/table/table-controls.ts | 128 ----------- .../src/core/extensions/table/table/table.ts | 18 +- .../table/table/utilities/helpers.ts | 186 ++++++++++++++- .../editor/src/core/plugins/drag-handle.ts | 11 +- packages/editor/src/styles/table.css | 54 ++++- 22 files changed, 1858 insertions(+), 150 deletions(-) create mode 100644 packages/editor/src/core/extensions/table/plugins/drag-handles/actions.ts create mode 100644 packages/editor/src/core/extensions/table/plugins/drag-handles/color-selector.tsx create mode 100644 packages/editor/src/core/extensions/table/plugins/drag-handles/column/drag-handle.tsx create mode 100644 packages/editor/src/core/extensions/table/plugins/drag-handles/column/dropdown.tsx create mode 100644 packages/editor/src/core/extensions/table/plugins/drag-handles/column/plugin.ts create mode 100644 packages/editor/src/core/extensions/table/plugins/drag-handles/column/utils.ts create mode 100644 packages/editor/src/core/extensions/table/plugins/drag-handles/marker-utils.ts create mode 100644 packages/editor/src/core/extensions/table/plugins/drag-handles/row/drag-handle.tsx create mode 100644 packages/editor/src/core/extensions/table/plugins/drag-handles/row/dropdown.tsx create mode 100644 packages/editor/src/core/extensions/table/plugins/drag-handles/row/plugin.ts create mode 100644 packages/editor/src/core/extensions/table/plugins/drag-handles/row/utils.ts create mode 100644 packages/editor/src/core/extensions/table/plugins/drag-handles/utils.ts delete mode 100644 packages/editor/src/core/extensions/table/table/table-controls.ts diff --git a/packages/editor/src/core/constants/meta.ts b/packages/editor/src/core/constants/meta.ts index 66769bb82c..1a01ecaa50 100644 --- a/packages/editor/src/core/constants/meta.ts +++ b/packages/editor/src/core/constants/meta.ts @@ -1,3 +1,5 @@ export enum CORE_EDITOR_META { SKIP_FILE_DELETION = "skipFileDeletion", + INTENTIONAL_DELETION = "intentionalDeletion", + ADD_TO_HISTORY = "addToHistory", } diff --git a/packages/editor/src/core/extensions/table/plugins/drag-handles/actions.ts b/packages/editor/src/core/extensions/table/plugins/drag-handles/actions.ts new file mode 100644 index 0000000000..a2ebc26bb7 --- /dev/null +++ b/packages/editor/src/core/extensions/table/plugins/drag-handles/actions.ts @@ -0,0 +1,211 @@ +import type { Editor } from "@tiptap/core"; +import { Fragment, type Node, type Node as ProseMirrorNode } from "@tiptap/pm/model"; +import type { Transaction } from "@tiptap/pm/state"; +import { type CellSelection, TableMap } from "@tiptap/pm/tables"; +// extensions +import { TableNodeLocation } from "@/extensions/table/table/utilities/helpers"; + +type TableRow = (ProseMirrorNode | null)[]; +type TableRows = TableRow[]; + +/** + * Move the selected columns to the specified index. + * @param {Editor} editor - The editor instance. + * @param {TableNodeLocation} table - The table node location. + * @param {CellSelection} selection - The cell selection. + * @param {number} to - The index to move the columns to. + * @param {Transaction} tr - The transaction. + * @returns {Transaction} The updated transaction. + */ +export const moveSelectedColumns = ( + editor: Editor, + table: TableNodeLocation, + selection: CellSelection, + to: number, + tr: Transaction +): Transaction => { + const tableMap = TableMap.get(table.node); + + let columnStart = -1; + let columnEnd = -1; + + selection.forEachCell((_node, pos) => { + const cell = tableMap.findCell(pos - table.pos - 1); + for (let i = cell.left; i < cell.right; i++) { + columnStart = columnStart >= 0 ? Math.min(cell.left, columnStart) : cell.left; + columnEnd = columnEnd >= 0 ? Math.max(cell.right, columnEnd) : cell.right; + } + }); + + if (columnStart === -1 || columnEnd === -1) { + console.warn("Invalid column selection"); + return tr; + } + + if (to < 0 || to > tableMap.width || (to >= columnStart && to < columnEnd)) return tr; + + const rows = tableToCells(table); + for (const row of rows) { + const range = row.splice(columnStart, columnEnd - columnStart); + const offset = to > columnStart ? to - (columnEnd - columnStart - 1) : to; + row.splice(offset, 0, ...range); + } + + tableFromCells(editor, table, rows, tr); + return tr; +}; + +/** + * Move the selected rows to the specified index. + * @param {Editor} editor - The editor instance. + * @param {TableNodeLocation} table - The table node location. + * @param {CellSelection} selection - The cell selection. + * @param {number} to - The index to move the rows to. + * @param {Transaction} tr - The transaction. + * @returns {Transaction} The updated transaction. + */ +export const moveSelectedRows = ( + editor: Editor, + table: TableNodeLocation, + selection: CellSelection, + to: number, + tr: Transaction +): Transaction => { + const tableMap = TableMap.get(table.node); + + let rowStart = -1; + let rowEnd = -1; + + selection.forEachCell((_node, pos) => { + const cell = tableMap.findCell(pos - table.pos - 1); + for (let i = cell.top; i < cell.bottom; i++) { + rowStart = rowStart >= 0 ? Math.min(cell.top, rowStart) : cell.top; + rowEnd = rowEnd >= 0 ? Math.max(cell.bottom, rowEnd) : cell.bottom; + } + }); + + if (rowStart === -1 || rowEnd === -1) { + console.warn("Invalid row selection"); + return tr; + } + + if (to < 0 || to > tableMap.height || (to >= rowStart && to < rowEnd)) return tr; + + const rows = tableToCells(table); + const range = rows.splice(rowStart, rowEnd - rowStart); + const offset = to > rowStart ? to - (rowEnd - rowStart - 1) : to; + rows.splice(offset, 0, ...range); + + tableFromCells(editor, table, rows, tr); + return tr; +}; + +/** + * @description Duplicate the selected rows. + * @param {TableNodeLocation} table - The table node location. + * @param {number[]} rowIndices - The indices of the rows to duplicate. + * @param {Transaction} tr - The transaction. + * @returns {Transaction} The updated transaction. + */ +export const duplicateRows = (table: TableNodeLocation, rowIndices: number[], tr: Transaction): Transaction => { + const rows = tableToCells(table); + + const { map, width } = TableMap.get(table.node); + + // Validate row indices + const maxRow = rows.length - 1; + if (rowIndices.some((idx) => idx < 0 || idx > maxRow)) { + console.warn("Invalid row indices for duplication"); + return tr; + } + + const mapStart = tr.mapping.maps.length; + + const lastRowPos = map[rowIndices[rowIndices.length - 1] * width + width - 1]; + const nextRowStart = lastRowPos + (table.node.nodeAt(lastRowPos)?.nodeSize ?? 0) + 1; + const insertPos = tr.mapping.slice(mapStart).map(table.start + nextRowStart); + + for (let i = rowIndices.length - 1; i >= 0; i--) { + tr.insert( + insertPos, + rows[rowIndices[i]].filter((r) => r !== null) + ); + } + + return tr; +}; + +/** + * @description Duplicate the selected columns. + * @param {TableNodeLocation} table - The table node location. + * @param {number[]} columnIndices - The indices of the columns to duplicate. + * @param {Transaction} tr - The transaction. + * @returns {Transaction} The updated transaction. + */ +export const duplicateColumns = (table: TableNodeLocation, columnIndices: number[], tr: Transaction): Transaction => { + const rows = tableToCells(table); + + const { map, width, height } = TableMap.get(table.node); + + // Validate column indices + if (columnIndices.some((idx) => idx < 0 || idx >= width)) { + console.warn("Invalid column indices for duplication"); + return tr; + } + + const mapStart = tr.mapping.maps.length; + + for (let row = 0; row < height; row++) { + const lastColumnPos = map[row * width + columnIndices[columnIndices.length - 1]]; + const nextColumnStart = lastColumnPos + (table.node.nodeAt(lastColumnPos)?.nodeSize ?? 0); + const insertPos = tr.mapping.slice(mapStart).map(table.start + nextColumnStart); + + for (let i = columnIndices.length - 1; i >= 0; i--) { + const copiedNode = rows[row][columnIndices[i]]; + if (copiedNode !== null) { + tr.insert(insertPos, copiedNode); + } + } + } + + return tr; +}; + +/** + * @description Convert the table to cells. + * @param {TableNodeLocation} table - The table node location. + * @returns {TableRows} The table rows. + */ +const tableToCells = (table: TableNodeLocation): TableRows => { + const { map, width, height } = TableMap.get(table.node); + + const visitedCells = new Set(); + const rows: TableRows = []; + for (let row = 0; row < height; row++) { + const cells: (ProseMirrorNode | null)[] = []; + for (let col = 0; col < width; col++) { + const pos = map[row * width + col]; + cells.push(!visitedCells.has(pos) ? table.node.nodeAt(pos) : null); + visitedCells.add(pos); + } + rows.push(cells); + } + + return rows; +}; + +/** + * @description Convert the cells to a table. + * @param {Editor} editor - The editor instance. + * @param {TableNodeLocation} table - The table node location. + * @param {TableRows} rows - The table rows. + * @param {Transaction} tr - The transaction. + */ +const tableFromCells = (editor: Editor, table: TableNodeLocation, rows: TableRows, tr: Transaction): void => { + const schema = editor.schema.nodes; + const newRowNodes = rows.map((row) => + schema.tableRow.create(null, row.filter((cell) => cell !== null) as readonly Node[]) + ); + const newTableNode = table.node.copy(Fragment.from(newRowNodes)); + tr.replaceWith(table.pos, table.pos + table.node.nodeSize, newTableNode); +}; diff --git a/packages/editor/src/core/extensions/table/plugins/drag-handles/color-selector.tsx b/packages/editor/src/core/extensions/table/plugins/drag-handles/color-selector.tsx new file mode 100644 index 0000000000..e6036c3b5e --- /dev/null +++ b/packages/editor/src/core/extensions/table/plugins/drag-handles/color-selector.tsx @@ -0,0 +1,117 @@ +import { Disclosure } from "@headlessui/react"; +import type { Editor } from "@tiptap/core"; +import { Ban, ChevronRight, Palette } from "lucide-react"; +// plane imports +import { cn } from "@plane/utils"; +// constants +import { COLORS_LIST } from "@/constants/common"; +import { CORE_EXTENSIONS } from "@/constants/extension"; + +// TODO: implement text color selector + +type Props = { + editor: Editor; + onSelect: (color: string | null) => void; +}; + +const handleBackgroundColorChange = (editor: Editor, color: string | null) => { + editor + .chain() + .focus() + .updateAttributes(CORE_EXTENSIONS.TABLE_CELL, { + background: color, + }) + .run(); +}; + +// const handleTextColorChange = (editor: Editor, color: string | null) => { +// editor +// .chain() +// .focus() +// .updateAttributes(CORE_EXTENSIONS.TABLE_CELL, { +// textColor: color, +// }) +// .run(); +// }; + +export const TableDragHandleDropdownColorSelector: React.FC = (props) => { + const { editor, onSelect } = props; + + return ( + + + {({ open }) => ( + <> + + + Color + + + + )} + + + {/*
+

Text colors

+
+ {COLORS_LIST.map((color) => ( + +
+
*/} +
+

Background colors

+
+ {COLORS_LIST.map((color) => ( + +
+
+
+
+ ); +}; diff --git a/packages/editor/src/core/extensions/table/plugins/drag-handles/column/drag-handle.tsx b/packages/editor/src/core/extensions/table/plugins/drag-handles/column/drag-handle.tsx new file mode 100644 index 0000000000..425bc7572f --- /dev/null +++ b/packages/editor/src/core/extensions/table/plugins/drag-handles/column/drag-handle.tsx @@ -0,0 +1,204 @@ +import { + shift, + flip, + useDismiss, + useFloating, + useInteractions, + autoUpdate, + useClick, + useRole, + FloatingOverlay, + FloatingPortal, +} from "@floating-ui/react"; +import type { Editor } from "@tiptap/core"; +import { Ellipsis } from "lucide-react"; +import { useCallback, useState } from "react"; +// plane imports +import { cn } from "@plane/utils"; +// extensions +import { + findTable, + getTableHeightPx, + getTableWidthPx, + isCellSelection, + selectColumn, +} from "@/extensions/table/table/utilities/helpers"; +// local imports +import { moveSelectedColumns } from "../actions"; +import { + DROP_MARKER_THICKNESS, + getColDragMarker, + getDropMarker, + hideDragMarker, + hideDropMarker, + updateColDragMarker, + updateColDropMarker, +} from "../marker-utils"; +import { updateCellContentVisibility } from "../utils"; +import { ColumnOptionsDropdown } from "./dropdown"; +import { calculateColumnDropIndex, constructColumnDragPreview, getTableColumnNodesInfo } from "./utils"; + +export type ColumnDragHandleProps = { + col: number; + editor: Editor; +}; + +export const ColumnDragHandle: React.FC = (props) => { + const { col, editor } = props; + // states + const [isDropdownOpen, setIsDropdownOpen] = useState(false); + // floating ui + const { refs, floatingStyles, context } = useFloating({ + placement: "bottom-start", + middleware: [ + flip({ + fallbackPlacements: ["top-start", "bottom-start", "top-end", "bottom-end"], + }), + shift({ + padding: 8, + }), + ], + open: isDropdownOpen, + onOpenChange: setIsDropdownOpen, + whileElementsMounted: autoUpdate, + }); + const click = useClick(context); + const dismiss = useDismiss(context); + const role = useRole(context); + const { getReferenceProps, getFloatingProps } = useInteractions([dismiss, click, role]); + + const handleMouseDown = useCallback( + (e: React.MouseEvent) => { + e.stopPropagation(); + e.preventDefault(); + + const table = findTable(editor.state.selection); + if (!table) return; + + editor.view.dispatch(selectColumn(table, col, editor.state.tr)); + + // drag column + const tableWidthPx = getTableWidthPx(table, editor); + const columns = getTableColumnNodesInfo(table, editor); + + let dropIndex = col; + const startLeft = columns[col].left ?? 0; + const startX = e.clientX; + const tableElement = editor.view.nodeDOM(table.pos); + + const dropMarker = tableElement instanceof HTMLElement ? getDropMarker(tableElement) : null; + const dragMarker = tableElement instanceof HTMLElement ? getColDragMarker(tableElement) : null; + + const handleFinish = () => { + if (!dropMarker || !dragMarker) return; + hideDropMarker(dropMarker); + hideDragMarker(dragMarker); + + if (isCellSelection(editor.state.selection)) { + updateCellContentVisibility(editor, false); + } + + if (col !== dropIndex) { + let tr = editor.state.tr; + const selection = editor.state.selection; + if (isCellSelection(selection)) { + const table = findTable(selection); + if (table) { + tr = moveSelectedColumns(editor, table, selection, dropIndex, tr); + } + } + editor.view.dispatch(tr); + } + window.removeEventListener("mouseup", handleFinish); + window.removeEventListener("mousemove", handleMove); + }; + + let pseudoColumn: HTMLElement | undefined; + + const handleMove = (moveEvent: MouseEvent) => { + if (!dropMarker || !dragMarker) return; + const currentLeft = startLeft + moveEvent.clientX - startX; + dropIndex = calculateColumnDropIndex(col, columns, currentLeft); + + if (!pseudoColumn) { + pseudoColumn = constructColumnDragPreview(editor, editor.state.selection, table); + const tableHeightPx = getTableHeightPx(table, editor); + if (pseudoColumn) { + pseudoColumn.style.height = `${tableHeightPx}px`; + } + } + + const dragMarkerWidthPx = columns[col].width; + const dragMarkerLeftPx = Math.max(0, Math.min(currentLeft, tableWidthPx - dragMarkerWidthPx)); + const dropMarkerLeftPx = + dropIndex <= col ? columns[dropIndex].left : columns[dropIndex].left + columns[dropIndex].width; + + updateColDropMarker({ + element: dropMarker, + left: dropMarkerLeftPx - Math.floor(DROP_MARKER_THICKNESS / 2) - 1, + width: DROP_MARKER_THICKNESS, + }); + updateColDragMarker({ + element: dragMarker, + left: dragMarkerLeftPx, + width: dragMarkerWidthPx, + pseudoColumn, + }); + }; + + try { + window.addEventListener("mouseup", handleFinish); + window.addEventListener("mousemove", handleMove); + } catch (error) { + console.error("Error in ColumnDragHandle:", error); + handleFinish(); + } + }, + [col, editor] + ); + + return ( + <> +
+ +
+ {isDropdownOpen && ( + + {/* Backdrop */} + + +
+ setIsDropdownOpen(false)} /> +
+
+ )} + + ); +}; diff --git a/packages/editor/src/core/extensions/table/plugins/drag-handles/column/dropdown.tsx b/packages/editor/src/core/extensions/table/plugins/drag-handles/column/dropdown.tsx new file mode 100644 index 0000000000..562f918cd5 --- /dev/null +++ b/packages/editor/src/core/extensions/table/plugins/drag-handles/column/dropdown.tsx @@ -0,0 +1,100 @@ +import type { Editor } from "@tiptap/core"; +import { TableMap } from "@tiptap/pm/tables"; +import { ArrowLeft, ArrowRight, Copy, ToggleRight, Trash2, X, type LucideIcon } from "lucide-react"; +// extensions +import { findTable, getSelectedColumns } from "@/extensions/table/table/utilities/helpers"; +// local imports +import { duplicateColumns } from "../actions"; +import { TableDragHandleDropdownColorSelector } from "../color-selector"; + +const DROPDOWN_ITEMS: { + key: string; + label: string; + icon: LucideIcon; + action: (editor: Editor) => void; +}[] = [ + { + key: "insert-left", + label: "Insert left", + icon: ArrowLeft, + action: (editor) => editor.chain().focus().addColumnBefore().run(), + }, + { + key: "insert-right", + label: "Insert right", + icon: ArrowRight, + action: (editor) => editor.chain().focus().addColumnAfter().run(), + }, + { + key: "duplicate", + label: "Duplicate", + icon: Copy, + action: (editor) => { + const table = findTable(editor.state.selection); + if (!table) return; + + const tableMap = TableMap.get(table.node); + let tr = editor.state.tr; + const selectedColumns = getSelectedColumns(editor.state.selection, tableMap); + tr = duplicateColumns(table, selectedColumns, tr); + editor.view.dispatch(tr); + }, + }, + { + key: "clear-contents", + label: "Clear contents", + icon: X, + action: (editor) => editor.chain().focus().clearSelectedCells().run(), + }, + { + key: "delete", + label: "Delete", + icon: Trash2, + action: (editor) => editor.chain().focus().deleteColumn().run(), + }, +]; + +type Props = { + editor: Editor; + onClose: () => void; +}; + +export const ColumnOptionsDropdown: React.FC = (props) => { + const { editor, onClose } = props; + + return ( + <> + +
+ + {DROPDOWN_ITEMS.map((item) => ( + + ))} + + ); +}; diff --git a/packages/editor/src/core/extensions/table/plugins/drag-handles/column/plugin.ts b/packages/editor/src/core/extensions/table/plugins/drag-handles/column/plugin.ts new file mode 100644 index 0000000000..6cefa24b6f --- /dev/null +++ b/packages/editor/src/core/extensions/table/plugins/drag-handles/column/plugin.ts @@ -0,0 +1,74 @@ +import type { Editor } from "@tiptap/core"; +import { Plugin, PluginKey } from "@tiptap/pm/state"; +import { TableMap } from "@tiptap/pm/tables"; +import { Decoration, DecorationSet } from "@tiptap/pm/view"; +import { ReactRenderer } from "@tiptap/react"; +// extensions +import { + findTable, + getTableCellWidgetDecorationPos, + haveTableRelatedChanges, +} from "@/extensions/table/table/utilities/helpers"; +// local imports +import { ColumnDragHandle, ColumnDragHandleProps } from "./drag-handle"; + +type TableColumnDragHandlePluginState = { + decorations?: DecorationSet; +}; + +const TABLE_COLUMN_DRAG_HANDLE_PLUGIN_KEY = new PluginKey("tableColumnHandlerDecorationPlugin"); + +export const TableColumnDragHandlePlugin = (editor: Editor): Plugin => + new Plugin({ + key: TABLE_COLUMN_DRAG_HANDLE_PLUGIN_KEY, + state: { + init: () => ({}), + apply(tr, prev, oldState, newState) { + const table = findTable(newState.selection); + if (!haveTableRelatedChanges(editor, table, oldState, newState, tr)) { + return table !== undefined ? prev : {}; + } + + const tableMap = TableMap.get(table.node); + + let isStale = false; + const mapped = prev.decorations?.map(tr.mapping, tr.doc); + for (let col = 0; col < tableMap.width; col++) { + const pos = getTableCellWidgetDecorationPos(table, tableMap, col); + if (mapped?.find(pos, pos + 1)?.length !== 1) { + isStale = true; + break; + } + } + + if (!isStale) { + return { decorations: mapped }; + } + + const decorations: Decoration[] = []; + + for (let col = 0; col < tableMap.width; col++) { + const pos = getTableCellWidgetDecorationPos(table, tableMap, col); + + const dragHandleComponent = new ReactRenderer(ColumnDragHandle, { + props: { + col, + editor, + } satisfies ColumnDragHandleProps, + editor, + }); + + decorations.push(Decoration.widget(pos, () => dragHandleComponent.element)); + } + + return { + decorations: DecorationSet.create(newState.doc, decorations), + }; + }, + }, + props: { + decorations(state) { + return TABLE_COLUMN_DRAG_HANDLE_PLUGIN_KEY.getState(state).decorations; + }, + }, + }); diff --git a/packages/editor/src/core/extensions/table/plugins/drag-handles/column/utils.ts b/packages/editor/src/core/extensions/table/plugins/drag-handles/column/utils.ts new file mode 100644 index 0000000000..f88f90fdcd --- /dev/null +++ b/packages/editor/src/core/extensions/table/plugins/drag-handles/column/utils.ts @@ -0,0 +1,150 @@ +import type { Editor } from "@tiptap/core"; +import type { Selection } from "@tiptap/pm/state"; +import { TableMap } from "@tiptap/pm/tables"; +// extensions +import { getSelectedRect, isCellSelection, type TableNodeLocation } from "@/extensions/table/table/utilities/helpers"; +// local imports +import { cloneTableCell, constructDragPreviewTable, updateCellContentVisibility } from "../utils"; + +type TableColumn = { + left: number; + width: number; +}; + +/** + * @description Calculate the index where the dragged column should be dropped. + * @param {number} col - The column index. + * @param {TableColumn[]} columns - The columns. + * @param {number} left - The left position of the dragged column. + * @returns {number} The index where the dragged column should be dropped. + */ +export const calculateColumnDropIndex = (col: number, columns: TableColumn[], left: number): number => { + const currentColumnLeft = columns[col].left; + const currentColumnRight = currentColumnLeft + columns[col].width; + + const draggedColumnLeft = left; + const draggedColumnRight = draggedColumnLeft + columns[col].width; + + const isDraggingToLeft = draggedColumnLeft < currentColumnLeft; + const isDraggingToRight = draggedColumnRight > currentColumnRight; + + const isFirstColumn = col === 0; + const isLastColumn = col === columns.length - 1; + + if ((isFirstColumn && isDraggingToLeft) || (isLastColumn && isDraggingToRight)) { + return col; + } + + const firstColumn = columns[0]; + if (isDraggingToLeft && draggedColumnLeft <= firstColumn.left) { + return 0; + } + + const lastColumn = columns[columns.length - 1]; + if (isDraggingToRight && draggedColumnRight >= lastColumn.left + lastColumn.width) { + return columns.length - 1; + } + + let dropColumnIndex = col; + if (isDraggingToRight) { + const findHoveredColumn = columns.find((p, index) => { + if (index === col) return false; + const currentColumnCenter = p.left + p.width / 2; + const currentColumnEdge = p.left + p.width; + const nextColumn = columns[index + 1] as TableColumn | undefined; + const nextColumnCenter = nextColumn ? nextColumn.width / 2 : 0; + + return draggedColumnRight >= currentColumnCenter && draggedColumnRight < currentColumnEdge + nextColumnCenter; + }); + if (findHoveredColumn) { + dropColumnIndex = columns.indexOf(findHoveredColumn); + } + } + + if (isDraggingToLeft) { + const findHoveredColumn = columns.find((p, index) => { + if (index === col) return false; + const currentColumnCenter = p.left + p.width / 2; + const prevColumn = columns[index - 1] as TableColumn | undefined; + const prevColumnLeft = prevColumn ? prevColumn.left : 0; + const prevColumnCenter = prevColumn ? prevColumn.width / 2 : 0; + + return draggedColumnLeft <= currentColumnCenter && draggedColumnLeft > prevColumnLeft + prevColumnCenter; + }); + if (findHoveredColumn) { + dropColumnIndex = columns.indexOf(findHoveredColumn); + } + } + + return dropColumnIndex; +}; + +/** + * @description Get the node information of the columns in the table- their offset left and width. + * @param {TableNodeLocation} table - The table node location. + * @param {Editor} editor - The editor instance. + * @returns {TableColumn[]} The information of the columns in the table. + */ +export const getTableColumnNodesInfo = (table: TableNodeLocation, editor: Editor): TableColumn[] => { + const result: TableColumn[] = []; + let leftPx = 0; + + const tableMap = TableMap.get(table.node); + if (!tableMap || tableMap.height === 0 || tableMap.width === 0) { + return result; + } + + for (let col = 0; col < tableMap.width; col++) { + const cellPos = tableMap.map[col]; + if (cellPos === undefined) continue; + + const dom = editor.view.domAtPos(table.start + cellPos + 1); + if (dom.node instanceof HTMLElement) { + if (col === 0) { + leftPx = dom.node.offsetLeft; + } + result.push({ + left: dom.node.offsetLeft - leftPx, + width: dom.node.offsetWidth, + }); + } + } + return result; +}; + +/** + * @description Construct a pseudo column from the selected cells for drag preview. + * @param {Editor} editor - The editor instance. + * @param {Selection} selection - The selection. + * @param {TableNodeLocation} table - The table node location. + * @returns {HTMLElement | undefined} The pseudo column. + */ +export const constructColumnDragPreview = ( + editor: Editor, + selection: Selection, + table: TableNodeLocation +): HTMLElement | undefined => { + if (!isCellSelection(selection)) return; + + const tableMap = TableMap.get(table.node); + const selectedColRect = getSelectedRect(selection, tableMap); + const activeColCells = tableMap.cellsInRect(selectedColRect); + + const { tableElement, tableBodyElement } = constructDragPreviewTable(); + + activeColCells.forEach((cellPos) => { + const resolvedCellPos = table.start + cellPos + 1; + const cellElement = editor.view.domAtPos(resolvedCellPos).node; + if (cellElement instanceof HTMLElement) { + const { clonedCellElement } = cloneTableCell(cellElement); + clonedCellElement.style.height = cellElement.getBoundingClientRect().height + "px"; + const tableRowElement = document.createElement("tr"); + tableRowElement.appendChild(clonedCellElement); + tableBodyElement.appendChild(tableRowElement); + } + }); + + updateCellContentVisibility(editor, true); + + return tableElement; +}; diff --git a/packages/editor/src/core/extensions/table/plugins/drag-handles/marker-utils.ts b/packages/editor/src/core/extensions/table/plugins/drag-handles/marker-utils.ts new file mode 100644 index 0000000000..db2095e112 --- /dev/null +++ b/packages/editor/src/core/extensions/table/plugins/drag-handles/marker-utils.ts @@ -0,0 +1,106 @@ +export const DROP_MARKER_CLASS = "table-drop-marker"; +export const COL_DRAG_MARKER_CLASS = "table-col-drag-marker"; +export const ROW_DRAG_MARKER_CLASS = "table-row-drag-marker"; + +export const DROP_MARKER_THICKNESS = 2; + +export const getDropMarker = (tableElement: HTMLElement): HTMLElement | null => + tableElement.querySelector(`.${DROP_MARKER_CLASS}`); + +export const hideDropMarker = (element: HTMLElement): void => { + if (!element.classList.contains("hidden")) { + element.classList.add("hidden"); + } +}; + +export const updateColDropMarker = ({ + element, + left, + width, +}: { + element: HTMLElement; + left: number; + width: number; +}) => { + element.style.height = "100%"; + element.style.width = `${width}px`; + element.style.top = "0"; + element.style.left = `${left}px`; + element.classList.remove("hidden"); +}; + +export const updateRowDropMarker = ({ + element, + top, + height, +}: { + element: HTMLElement; + top: number; + height: number; +}) => { + element.style.width = "100%"; + element.style.height = `${height}px`; + element.style.left = "0"; + element.style.top = `${top}px`; + element.classList.remove("hidden"); +}; + +export const getColDragMarker = (tableElement: HTMLElement): HTMLElement | null => + tableElement.querySelector(`.${COL_DRAG_MARKER_CLASS}`); + +export const getRowDragMarker = (tableElement: HTMLElement): HTMLElement | null => + tableElement.querySelector(`.${ROW_DRAG_MARKER_CLASS}`); + +export const hideDragMarker = (element: HTMLElement): void => { + if (!element.classList.contains("hidden")) { + element.classList.add("hidden"); + } +}; + +export const updateColDragMarker = ({ + element, + left, + width, + pseudoColumn, +}: { + element: HTMLElement; + left: number; + width: number; + pseudoColumn: HTMLElement | undefined; +}) => { + element.style.left = `${left}px`; + element.style.width = `${width}px`; + element.classList.remove("hidden"); + if (pseudoColumn) { + /// clear existing content + while (element.firstChild) { + element.removeChild(element.firstChild); + } + // clone and append the pseudo column + element.appendChild(pseudoColumn.cloneNode(true)); + } +}; + +export const updateRowDragMarker = ({ + element, + top, + height, + pseudoRow, +}: { + element: HTMLElement; + top: number; + height: number; + pseudoRow: HTMLElement | undefined; +}) => { + element.style.top = `${top}px`; + element.style.height = `${height}px`; + element.classList.remove("hidden"); + if (pseudoRow) { + /// clear existing content + while (element.firstChild) { + element.removeChild(element.firstChild); + } + // clone and append the pseudo row + element.appendChild(pseudoRow.cloneNode(true)); + } +}; diff --git a/packages/editor/src/core/extensions/table/plugins/drag-handles/row/drag-handle.tsx b/packages/editor/src/core/extensions/table/plugins/drag-handles/row/drag-handle.tsx new file mode 100644 index 0000000000..7c0f1449a1 --- /dev/null +++ b/packages/editor/src/core/extensions/table/plugins/drag-handles/row/drag-handle.tsx @@ -0,0 +1,203 @@ +import { + autoUpdate, + flip, + FloatingOverlay, + FloatingPortal, + shift, + useClick, + useDismiss, + useFloating, + useInteractions, + useRole, +} from "@floating-ui/react"; +import type { Editor } from "@tiptap/core"; +import { Ellipsis } from "lucide-react"; +import { useCallback, useState } from "react"; +// plane imports +import { cn } from "@plane/utils"; +// extensions +import { + findTable, + getTableHeightPx, + getTableWidthPx, + isCellSelection, + selectRow, +} from "@/extensions/table/table/utilities/helpers"; +// local imports +import { moveSelectedRows } from "../actions"; +import { + DROP_MARKER_THICKNESS, + getDropMarker, + getRowDragMarker, + hideDragMarker, + hideDropMarker, + updateRowDragMarker, + updateRowDropMarker, +} from "../marker-utils"; +import { updateCellContentVisibility } from "../utils"; +import { RowOptionsDropdown } from "./dropdown"; +import { calculateRowDropIndex, constructRowDragPreview, getTableRowNodesInfo } from "./utils"; + +export type RowDragHandleProps = { + editor: Editor; + row: number; +}; + +export const RowDragHandle: React.FC = (props) => { + const { editor, row } = props; + // states + const [isDropdownOpen, setIsDropdownOpen] = useState(false); + // floating ui + const { refs, floatingStyles, context } = useFloating({ + placement: "bottom-start", + middleware: [ + flip({ + fallbackPlacements: ["top-start", "bottom-start", "top-end", "bottom-end"], + }), + shift({ + padding: 8, + }), + ], + open: isDropdownOpen, + onOpenChange: setIsDropdownOpen, + whileElementsMounted: autoUpdate, + }); + const click = useClick(context); + const dismiss = useDismiss(context); + const role = useRole(context); + const { getReferenceProps, getFloatingProps } = useInteractions([dismiss, click, role]); + + const handleMouseDown = useCallback( + (e: React.MouseEvent) => { + e.stopPropagation(); + e.preventDefault(); + + const table = findTable(editor.state.selection); + if (!table) return; + + editor.view.dispatch(selectRow(table, row, editor.state.tr)); + + // drag row + const tableHeightPx = getTableHeightPx(table, editor); + const rows = getTableRowNodesInfo(table, editor); + + let dropIndex = row; + const startTop = rows[row].top ?? 0; + const startY = e.clientY; + const tableElement = editor.view.nodeDOM(table.pos); + + const dropMarker = tableElement instanceof HTMLElement ? getDropMarker(tableElement) : null; + const dragMarker = tableElement instanceof HTMLElement ? getRowDragMarker(tableElement) : null; + + const handleFinish = (): void => { + if (!dropMarker || !dragMarker) return; + hideDropMarker(dropMarker); + hideDragMarker(dragMarker); + + if (isCellSelection(editor.state.selection)) { + updateCellContentVisibility(editor, false); + } + + if (row !== dropIndex) { + let tr = editor.state.tr; + const selection = editor.state.selection; + if (isCellSelection(selection)) { + const table = findTable(selection); + if (table) { + tr = moveSelectedRows(editor, table, selection, dropIndex, tr); + } + } + editor.view.dispatch(tr); + } + window.removeEventListener("mouseup", handleFinish); + window.removeEventListener("mousemove", handleMove); + }; + + let pseudoRow: HTMLElement | undefined; + + const handleMove = (moveEvent: MouseEvent): void => { + if (!dropMarker || !dragMarker) return; + const cursorTop = startTop + moveEvent.clientY - startY; + dropIndex = calculateRowDropIndex(row, rows, cursorTop); + + if (!pseudoRow) { + pseudoRow = constructRowDragPreview(editor, editor.state.selection, table); + const tableWidthPx = getTableWidthPx(table, editor); + if (pseudoRow) { + pseudoRow.style.width = `${tableWidthPx}px`; + } + } + + const dragMarkerHeightPx = rows[row].height; + const dragMarkerTopPx = Math.max(0, Math.min(cursorTop, tableHeightPx - dragMarkerHeightPx)); + const dropMarkerTopPx = dropIndex <= row ? rows[dropIndex].top : rows[dropIndex].top + rows[dropIndex].height; + + updateRowDropMarker({ + element: dropMarker, + top: dropMarkerTopPx - DROP_MARKER_THICKNESS / 2, + height: DROP_MARKER_THICKNESS, + }); + updateRowDragMarker({ + element: dragMarker, + top: dragMarkerTopPx, + height: dragMarkerHeightPx, + pseudoRow, + }); + }; + + try { + window.addEventListener("mouseup", handleFinish); + window.addEventListener("mousemove", handleMove); + } catch (error) { + console.error("Error in RowDragHandle:", error); + handleFinish(); + } + }, + [editor, row] + ); + + return ( + <> +
+ +
+ {isDropdownOpen && ( + + {/* Backdrop */} + + +
+ setIsDropdownOpen(false)} /> +
+
+ )} + + ); +}; diff --git a/packages/editor/src/core/extensions/table/plugins/drag-handles/row/dropdown.tsx b/packages/editor/src/core/extensions/table/plugins/drag-handles/row/dropdown.tsx new file mode 100644 index 0000000000..09be7415b7 --- /dev/null +++ b/packages/editor/src/core/extensions/table/plugins/drag-handles/row/dropdown.tsx @@ -0,0 +1,100 @@ +import type { Editor } from "@tiptap/core"; +import { TableMap } from "@tiptap/pm/tables"; +import { ArrowDown, ArrowUp, Copy, ToggleRight, Trash2, X, type LucideIcon } from "lucide-react"; +// extensions +import { findTable, getSelectedRows } from "@/extensions/table/table/utilities/helpers"; +// local imports +import { duplicateRows } from "../actions"; +import { TableDragHandleDropdownColorSelector } from "../color-selector"; + +const DROPDOWN_ITEMS: { + key: string; + label: string; + icon: LucideIcon; + action: (editor: Editor) => void; +}[] = [ + { + key: "insert-above", + label: "Insert above", + icon: ArrowUp, + action: (editor) => editor.chain().focus().addRowBefore().run(), + }, + { + key: "insert-below", + label: "Insert below", + icon: ArrowDown, + action: (editor) => editor.chain().focus().addRowAfter().run(), + }, + { + key: "duplicate", + label: "Duplicate", + icon: Copy, + action: (editor) => { + const table = findTable(editor.state.selection); + if (!table) return; + + const tableMap = TableMap.get(table.node); + let tr = editor.state.tr; + const selectedRows = getSelectedRows(editor.state.selection, tableMap); + tr = duplicateRows(table, selectedRows, tr); + editor.view.dispatch(tr); + }, + }, + { + key: "clear-contents", + label: "Clear contents", + icon: X, + action: (editor) => editor.chain().focus().clearSelectedCells().run(), + }, + { + key: "delete", + label: "Delete", + icon: Trash2, + action: (editor) => editor.chain().focus().deleteRow().run(), + }, +]; + +type Props = { + editor: Editor; + onClose: () => void; +}; + +export const RowOptionsDropdown: React.FC = (props) => { + const { editor, onClose } = props; + + return ( + <> + +
+ + {DROPDOWN_ITEMS.map((item) => ( + + ))} + + ); +}; diff --git a/packages/editor/src/core/extensions/table/plugins/drag-handles/row/plugin.ts b/packages/editor/src/core/extensions/table/plugins/drag-handles/row/plugin.ts new file mode 100644 index 0000000000..d84f942ba4 --- /dev/null +++ b/packages/editor/src/core/extensions/table/plugins/drag-handles/row/plugin.ts @@ -0,0 +1,72 @@ +import { type Editor } from "@tiptap/core"; +import { Plugin, PluginKey } from "@tiptap/pm/state"; +import { TableMap } from "@tiptap/pm/tables"; +import { Decoration, DecorationSet } from "@tiptap/pm/view"; +import { ReactRenderer } from "@tiptap/react"; +// extensions +import { + findTable, + getTableCellWidgetDecorationPos, + haveTableRelatedChanges, +} from "@/extensions/table/table/utilities/helpers"; +// local imports +import { RowDragHandle, RowDragHandleProps } from "./drag-handle"; + +type TableRowDragHandlePluginState = { + decorations?: DecorationSet; +}; + +const TABLE_ROW_DRAG_HANDLE_PLUGIN_KEY = new PluginKey("tableRowDragHandlePlugin"); + +export const TableRowDragHandlePlugin = (editor: Editor): Plugin => + new Plugin({ + key: TABLE_ROW_DRAG_HANDLE_PLUGIN_KEY, + state: { + init: () => ({}), + apply(tr, prev, oldState, newState) { + const table = findTable(newState.selection); + if (!haveTableRelatedChanges(editor, table, oldState, newState, tr)) { + return table !== undefined ? prev : {}; + } + + const tableMap = TableMap.get(table.node); + + let isStale = false; + const mapped = prev.decorations?.map(tr.mapping, tr.doc); + for (let row = 0; row < tableMap.height; row++) { + const pos = getTableCellWidgetDecorationPos(table, tableMap, row * tableMap.width); + if (mapped?.find(pos, pos + 1)?.length !== 1) { + isStale = true; + break; + } + } + + if (!isStale) { + return { decorations: mapped }; + } + + const decorations: Decoration[] = []; + + for (let row = 0; row < tableMap.height; row++) { + const pos = getTableCellWidgetDecorationPos(table, tableMap, row * tableMap.width); + + const dragHandleComponent = new ReactRenderer(RowDragHandle, { + props: { + editor, + row, + } satisfies RowDragHandleProps, + editor, + }); + + decorations.push(Decoration.widget(pos, () => dragHandleComponent.element)); + } + + return { decorations: DecorationSet.create(newState.doc, decorations) }; + }, + }, + props: { + decorations(state) { + return TABLE_ROW_DRAG_HANDLE_PLUGIN_KEY.getState(state).decorations; + }, + }, + }); diff --git a/packages/editor/src/core/extensions/table/plugins/drag-handles/row/utils.ts b/packages/editor/src/core/extensions/table/plugins/drag-handles/row/utils.ts new file mode 100644 index 0000000000..d43d9ae73e --- /dev/null +++ b/packages/editor/src/core/extensions/table/plugins/drag-handles/row/utils.ts @@ -0,0 +1,149 @@ +import type { Editor } from "@tiptap/core"; +import type { Selection } from "@tiptap/pm/state"; +import { TableMap } from "@tiptap/pm/tables"; +// extensions +import { getSelectedRect, isCellSelection, type TableNodeLocation } from "@/extensions/table/table/utilities/helpers"; +// local imports +import { cloneTableCell, constructDragPreviewTable, updateCellContentVisibility } from "../utils"; + +type TableRow = { + top: number; + height: number; +}; + +/** + * @description Calculate the index where the dragged row should be dropped. + * @param {number} row - The row index. + * @param {TableRow[]} rows - The rows. + * @param {number} top - The top position of the dragged row. + * @returns {number} The index where the dragged row should be dropped. + */ +export const calculateRowDropIndex = (row: number, rows: TableRow[], top: number): number => { + const currentRowTop = rows[row].top; + const currentRowBottom = currentRowTop + rows[row].height; + + const draggedRowTop = top; + const draggedRowBottom = draggedRowTop + rows[row].height; + + const isDraggingUp = draggedRowTop < currentRowTop; + const isDraggingDown = draggedRowBottom > currentRowBottom; + + const isFirstRow = row === 0; + const isLastRow = row === rows.length - 1; + + if ((isFirstRow && isDraggingUp) || (isLastRow && isDraggingDown)) { + return row; + } + + const firstRow = rows[0]; + if (isDraggingUp && draggedRowTop <= firstRow.top) { + return 0; + } + + const lastRow = rows[rows.length - 1]; + if (isDraggingDown && draggedRowBottom >= lastRow.top + lastRow.height) { + return rows.length - 1; + } + + let dropRowIndex = row; + if (isDraggingDown) { + const findHoveredRow = rows.find((p, index) => { + if (index === row) return false; + const currentRowCenter = p.top + p.height / 2; + const currentRowEdge = p.top + p.height; + const nextRow = rows[index + 1] as TableRow | undefined; + const nextRowCenter = nextRow ? nextRow.height / 2 : 0; + + return draggedRowBottom >= currentRowCenter && draggedRowBottom < currentRowEdge + nextRowCenter; + }); + if (findHoveredRow) { + dropRowIndex = rows.indexOf(findHoveredRow); + } + } + + if (isDraggingUp) { + const findHoveredRow = rows.find((p, index) => { + if (index === row) return false; + const currentRowCenter = p.top + p.height / 2; + const prevRow = rows[index - 1] as TableRow | undefined; + const prevRowTop = prevRow ? prevRow.top : 0; + const prevRowCenter = prevRow ? prevRow.height / 2 : 0; + + return draggedRowTop <= currentRowCenter && draggedRowTop > prevRowTop + prevRowCenter; + }); + if (findHoveredRow) { + dropRowIndex = rows.indexOf(findHoveredRow); + } + } + + return dropRowIndex; +}; + +/** + * @description Get the node information of the rows in the table- their offset top and height. + * @param {TableNodeLocation} table - The table node location. + * @param {Editor} editor - The editor instance. + * @returns {TableRow[]} The information of the rows in the table. + */ +export const getTableRowNodesInfo = (table: TableNodeLocation, editor: Editor): TableRow[] => { + const result: TableRow[] = []; + let topPx = 0; + + const tableMap = TableMap.get(table.node); + if (!tableMap || tableMap.height === 0 || tableMap.width === 0) { + return result; + } + + for (let row = 0; row < tableMap.height; row++) { + const cellPos = tableMap.map[row * tableMap.width]; + if (cellPos === undefined) continue; + const dom = editor.view.domAtPos(table.start + cellPos); + if (dom.node instanceof HTMLElement) { + const heightPx = dom.node.offsetHeight; + result.push({ + top: topPx, + height: heightPx, + }); + topPx += heightPx; + } + } + return result; +}; + +/** + * @description Construct a pseudo column from the selected cells for drag preview. + * @param {Editor} editor - The editor instance. + * @param {Selection} selection - The selection. + * @param {TableNodeLocation} table - The table node location. + * @returns {HTMLElement | undefined} The pseudo column. + */ +export const constructRowDragPreview = ( + editor: Editor, + selection: Selection, + table: TableNodeLocation +): HTMLElement | undefined => { + if (!isCellSelection(selection)) return; + + const tableMap = TableMap.get(table.node); + const selectedRowRect = getSelectedRect(selection, tableMap); + const activeRowCells = tableMap.cellsInRect(selectedRowRect); + + const { tableElement, tableBodyElement } = constructDragPreviewTable(); + + const tableRowElement = document.createElement("tr"); + tableBodyElement.appendChild(tableRowElement); + + activeRowCells.forEach((cellPos) => { + const resolvedCellPos = table.start + cellPos + 1; + const cellElement = editor.view.domAtPos(resolvedCellPos).node; + if (cellElement instanceof HTMLElement) { + const { clonedCellElement } = cloneTableCell(cellElement); + clonedCellElement.style.width = cellElement.getBoundingClientRect().width + "px"; + tableRowElement.appendChild(clonedCellElement); + } + }); + + updateCellContentVisibility(editor, true); + + return tableElement; +}; diff --git a/packages/editor/src/core/extensions/table/plugins/drag-handles/utils.ts b/packages/editor/src/core/extensions/table/plugins/drag-handles/utils.ts new file mode 100644 index 0000000000..591d435760 --- /dev/null +++ b/packages/editor/src/core/extensions/table/plugins/drag-handles/utils.ts @@ -0,0 +1,60 @@ +import type { Editor } from "@tiptap/core"; +// constants +import { CORE_EXTENSIONS } from "@/constants/extension"; +import { CORE_EDITOR_META } from "@/constants/meta"; + +/** + * @description Construct a pseudo table element which will act as a parent for column and row drag previews. + * @returns {HTMLTableElement} The pseudo table. + */ +export const constructDragPreviewTable = (): { + tableElement: HTMLTableElement; + tableBodyElement: HTMLTableSectionElement; +} => { + const tableElement = document.createElement("table"); + tableElement.classList.add("table-drag-preview"); + tableElement.classList.add("bg-custom-background-100"); + tableElement.style.opacity = "0.9"; + const tableBodyElement = document.createElement("tbody"); + tableElement.appendChild(tableBodyElement); + + return { tableElement, tableBodyElement }; +}; + +/** + * @description Clone a table cell element. + * @param {HTMLElement} cellElement - The cell element to clone. + * @returns {HTMLElement} The cloned cell element. + */ +export const cloneTableCell = ( + cellElement: HTMLElement +): { + clonedCellElement: HTMLElement; +} => { + const clonedCellElement = cellElement.cloneNode(true) as HTMLElement; + clonedCellElement.style.setProperty("visibility", "visible", "important"); + + const widgetElement = clonedCellElement.querySelectorAll(".ProseMirror-widget"); + widgetElement.forEach((widget) => widget.remove()); + + return { clonedCellElement }; +}; + +/** + * @description This function updates the `hideContent` attribute of the table cells and headers. + * @param {Editor} editor - The editor instance. + * @param {boolean} hideContent - Whether to hide the content. + * @returns {boolean} Whether the content visibility was updated. + */ +export const updateCellContentVisibility = (editor: Editor, hideContent: boolean): boolean => + editor + .chain() + .focus() + .setMeta(CORE_EDITOR_META.ADD_TO_HISTORY, false) + .updateAttributes(CORE_EXTENSIONS.TABLE_CELL, { + hideContent, + }) + .updateAttributes(CORE_EXTENSIONS.TABLE_HEADER, { + hideContent, + }) + .run(); diff --git a/packages/editor/src/core/extensions/table/plugins/insert-handlers/plugin.ts b/packages/editor/src/core/extensions/table/plugins/insert-handlers/plugin.ts index 97cd2d09f7..75f3964166 100644 --- a/packages/editor/src/core/extensions/table/plugins/insert-handlers/plugin.ts +++ b/packages/editor/src/core/extensions/table/plugins/insert-handlers/plugin.ts @@ -1,6 +1,7 @@ -import { type Editor } from "@tiptap/core"; +import type { Editor } from "@tiptap/core"; import { Plugin, PluginKey } from "@tiptap/pm/state"; // local imports +import { COL_DRAG_MARKER_CLASS, DROP_MARKER_CLASS, ROW_DRAG_MARKER_CLASS } from "../drag-handles/marker-utils"; import { createColumnInsertButton, createRowInsertButton, findAllTables, TableInfo } from "./utils"; const TABLE_INSERT_PLUGIN_KEY = new PluginKey("table-insert"); @@ -25,6 +26,13 @@ export const TableInsertPlugin = (editor: Editor): Plugin => { tableInfo.rowButtonElement = rowButton; } + // Create and add drag marker if it doesn't exist + if (!tableInfo.dragMarkerContainerElement) { + const dragMarker = createMarkerContainer(); + tableElement.appendChild(dragMarker); + tableInfo.dragMarkerContainerElement = dragMarker; + } + tableMap.set(tableElement, tableInfo); }; @@ -32,6 +40,7 @@ export const TableInsertPlugin = (editor: Editor): Plugin => { const tableInfo = tableMap.get(tableElement); tableInfo?.columnButtonElement?.remove(); tableInfo?.rowButtonElement?.remove(); + tableInfo?.dragMarkerContainerElement?.remove(); tableMap.delete(tableElement); }; @@ -64,6 +73,7 @@ export const TableInsertPlugin = (editor: Editor): Plugin => { return new Plugin({ key: TABLE_INSERT_PLUGIN_KEY, + view() { setTimeout(updateAllTables, 0); @@ -85,3 +95,33 @@ export const TableInsertPlugin = (editor: Editor): Plugin => { }, }); }; + +const createMarkerContainer = (): HTMLElement => { + const el = document.createElement("div"); + el.className = "table-drag-marker-container"; + el.contentEditable = "false"; + el.appendChild(createDropMarker()); + el.appendChild(createColDragMarker()); + el.appendChild(createRowDragMarker()); + return el; +}; + +const createDropMarker = (): HTMLElement => { + const el = document.createElement("div"); + el.className = DROP_MARKER_CLASS; + return el; +}; + +const createColDragMarker = (): HTMLElement => { + const el = document.createElement("div"); + el.className = `${COL_DRAG_MARKER_CLASS} hidden`; + + return el; +}; + +const createRowDragMarker = (): HTMLElement => { + const el = document.createElement("div"); + el.className = `${ROW_DRAG_MARKER_CLASS} hidden`; + + return el; +}; diff --git a/packages/editor/src/core/extensions/table/plugins/insert-handlers/utils.ts b/packages/editor/src/core/extensions/table/plugins/insert-handlers/utils.ts index c8dc5f4794..8e6526c4e1 100644 --- a/packages/editor/src/core/extensions/table/plugins/insert-handlers/utils.ts +++ b/packages/editor/src/core/extensions/table/plugins/insert-handlers/utils.ts @@ -1,6 +1,6 @@ import type { Editor } from "@tiptap/core"; import type { Node as ProseMirrorNode } from "@tiptap/pm/model"; -import { addColumn, removeColumn, addRow, removeRow, TableMap } from "@tiptap/pm/tables"; +import { addColumn, removeColumn, addRow, removeRow, TableMap, type TableRect } from "@tiptap/pm/tables"; // local imports import { isCellEmpty } from "../../table/utilities/helpers"; @@ -17,6 +17,7 @@ export type TableInfo = { tablePos: number; columnButtonElement?: HTMLElement; rowButtonElement?: HTMLElement; + dragMarkerContainerElement?: HTMLElement; }; export const createColumnInsertButton = (editor: Editor, tableInfo: TableInfo): HTMLElement => { @@ -274,7 +275,7 @@ const insertColumnAfterLast = (editor: Editor, tableInfo: TableInfo) => { const lastColumnIndex = tableMapData.width; const tr = editor.state.tr; - const rect = { + const rect: TableRect = { map: tableMapData, tableStart: tablePos, table: tableNode, @@ -346,7 +347,7 @@ const insertRowAfterLast = (editor: Editor, tableInfo: TableInfo) => { const lastRowIndex = tableMapData.height; const tr = editor.state.tr; - const rect = { + const rect: TableRect = { map: tableMapData, tableStart: tablePos, table: tableNode, diff --git a/packages/editor/src/core/extensions/table/table-cell.ts b/packages/editor/src/core/extensions/table/table-cell.ts index fd6cc6bb04..9aa284cd17 100644 --- a/packages/editor/src/core/extensions/table/table-cell.ts +++ b/packages/editor/src/core/extensions/table/table-cell.ts @@ -47,6 +47,9 @@ export const TableCell = Node.create({ textColor: { default: null, }, + hideContent: { + default: false, + }, }; }, @@ -107,7 +110,8 @@ export const TableCell = Node.create({ return [ "td", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, { - style: `background-color: ${node.attrs.background}; color: ${node.attrs.textColor}`, + class: node.attrs.hideContent ? "content-hidden" : "", + style: `background-color: ${node.attrs.background}; color: ${node.attrs.textColor};`, }), 0, ]; diff --git a/packages/editor/src/core/extensions/table/table-header.ts b/packages/editor/src/core/extensions/table/table-header.ts index 9f7f90d02d..635fb7ee7a 100644 --- a/packages/editor/src/core/extensions/table/table-header.ts +++ b/packages/editor/src/core/extensions/table/table-header.ts @@ -17,7 +17,7 @@ export const TableHeader = Node.create({ }; }, - content: "paragraph+", + content: "block+", addAttributes() { return { @@ -39,6 +39,9 @@ export const TableHeader = Node.create({ background: { default: "none", }, + hideContent: { + default: false, + }, }; }, @@ -54,7 +57,8 @@ export const TableHeader = Node.create({ return [ "th", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, { - style: `background-color: ${node.attrs.background}`, + class: node.attrs.hideContent ? "content-hidden" : "", + style: `background-color: ${node.attrs.background};`, }), 0, ]; diff --git a/packages/editor/src/core/extensions/table/table/table-controls.ts b/packages/editor/src/core/extensions/table/table/table-controls.ts deleted file mode 100644 index 5cd3506d31..0000000000 --- a/packages/editor/src/core/extensions/table/table/table-controls.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { findParentNode } from "@tiptap/core"; -import { Plugin, PluginKey, TextSelection, Transaction } from "@tiptap/pm/state"; -import { DecorationSet, Decoration } from "@tiptap/pm/view"; -// constants -import { CORE_EXTENSIONS } from "@/constants/extension"; - -const key = new PluginKey("tableControls"); - -export function tableControls() { - return new Plugin({ - key, - state: { - init() { - return new TableControlsState(); - }, - apply(tr, prev) { - return prev.apply(tr); - }, - }, - props: { - handleTripleClickOn(view, pos, node, nodePos, event) { - if (node.type.name === CORE_EXTENSIONS.TABLE_CELL) { - event.preventDefault(); - const $pos = view.state.doc.resolve(pos); - const line = $pos.parent; - const linePos = $pos.start(); - const start = linePos; - const end = linePos + line.nodeSize - 1; - const tr = view.state.tr.setSelection(TextSelection.create(view.state.doc, start, end)); - view.dispatch(tr); - return true; - } - return false; - }, - handleDOMEvents: { - mousemove: (view, event) => { - const pluginState = key.getState(view.state); - - if (!(event.target as HTMLElement).closest(".table-wrapper") && pluginState.values.hoveredTable) { - return view.dispatch( - view.state.tr.setMeta(key, { - setHoveredTable: null, - setHoveredCell: null, - }) - ); - } - - const pos = view.posAtCoords({ - left: event.clientX, - top: event.clientY, - }); - - if (!pos || pos.pos < 0 || pos.pos > view.state.doc.content.size) return; - - const table = findParentNode((node) => node.type.name === CORE_EXTENSIONS.TABLE)( - TextSelection.create(view.state.doc, pos.pos) - ); - const cell = findParentNode((node) => - [CORE_EXTENSIONS.TABLE_CELL, CORE_EXTENSIONS.TABLE_HEADER].includes(node.type.name as CORE_EXTENSIONS) - )(TextSelection.create(view.state.doc, pos.pos)); - - if (!table || !cell) return; - - if (pluginState.values.hoveredCell?.pos !== cell.pos) { - return view.dispatch( - view.state.tr.setMeta(key, { - setHoveredTable: table, - setHoveredCell: cell, - }) - ); - } - }, - }, - decorations: (state) => { - const pluginState = key.getState(state); - if (!pluginState) { - return null; - } - - const { hoveredTable, hoveredCell } = pluginState.values; - const docSize = state.doc.content.size; - if (hoveredTable && hoveredCell && hoveredTable.pos < docSize && hoveredCell.pos < docSize) { - const decorations = [ - Decoration.node( - hoveredTable.pos, - hoveredTable.pos + hoveredTable.node.nodeSize, - {}, - { - hoveredTable, - hoveredCell, - } - ), - ]; - - return DecorationSet.create(state.doc, decorations); - } - - return null; - }, - }, - }); -} - -class TableControlsState { - values; - - constructor(props = {}) { - this.values = { - hoveredTable: null, - hoveredCell: null, - ...props, - }; - } - - apply(tr: Transaction) { - const actions = tr.getMeta(key); - - if (actions?.setHoveredTable !== undefined) { - this.values.hoveredTable = actions.setHoveredTable; - } - - if (actions?.setHoveredCell !== undefined) { - this.values.hoveredCell = actions.setHoveredCell; - } - - return this; - } -} diff --git a/packages/editor/src/core/extensions/table/table/table.ts b/packages/editor/src/core/extensions/table/table/table.ts index bab16f7e72..2462fa817d 100644 --- a/packages/editor/src/core/extensions/table/table/table.ts +++ b/packages/editor/src/core/extensions/table/table/table.ts @@ -7,6 +7,7 @@ import { addRowBefore, CellSelection, columnResizing, + deleteCellSelection, deleteTable, fixTables, goToNextCell, @@ -17,12 +18,13 @@ import { toggleHeader, toggleHeaderCell, } from "@tiptap/pm/tables"; -import { Decoration } from "@tiptap/pm/view"; +import type { Decoration } from "@tiptap/pm/view"; // constants import { CORE_EXTENSIONS } from "@/constants/extension"; // local imports +import { TableColumnDragHandlePlugin } from "../plugins/drag-handles/column/plugin"; +import { TableRowDragHandlePlugin } from "../plugins/drag-handles/row/plugin"; import { TableInsertPlugin } from "../plugins/insert-handlers/plugin"; -import { tableControls } from "./table-controls"; import { TableView } from "./table-view"; import { createTable } from "./utilities/create-table"; import { deleteColumnOrTable } from "./utilities/delete-column"; @@ -57,6 +59,7 @@ declare module "@tiptap/core" { toggleHeaderColumn: () => ReturnType; toggleHeaderRow: () => ReturnType; toggleHeaderCell: () => ReturnType; + clearSelectedCells: () => ReturnType; mergeOrSplit: () => ReturnType; setCellAttribute: (name: string, value: any) => ReturnType; goToNextCell: () => ReturnType; @@ -174,6 +177,10 @@ export const Table = Node.create({ () => ({ state, dispatch }) => toggleHeaderCell(state, dispatch), + clearSelectedCells: + () => + ({ state, dispatch }) => + deleteCellSelection(state, dispatch), mergeOrSplit: () => ({ state, dispatch }) => { @@ -254,10 +261,10 @@ export const Table = Node.create({ }, addNodeView() { - return ({ editor, getPos, node, decorations }) => { + return ({ editor, node, decorations, getPos }) => { const { cellMinWidth } = this.options; - return new TableView(node, cellMinWidth, decorations as Decoration[], editor, getPos as () => number); + return new TableView(node, cellMinWidth, decorations as Decoration[], editor, getPos); }; }, @@ -268,8 +275,9 @@ export const Table = Node.create({ tableEditing({ allowTableNodeSelection: this.options.allowTableNodeSelection, }), - tableControls(), TableInsertPlugin(this.editor), + TableColumnDragHandlePlugin(this.editor), + TableRowDragHandlePlugin(this.editor), ]; if (isResizable) { diff --git a/packages/editor/src/core/extensions/table/table/utilities/helpers.ts b/packages/editor/src/core/extensions/table/table/utilities/helpers.ts index f90f1a294c..211dc2c42a 100644 --- a/packages/editor/src/core/extensions/table/table/utilities/helpers.ts +++ b/packages/editor/src/core/extensions/table/table/utilities/helpers.ts @@ -1,6 +1,7 @@ +import { type Editor, findParentNode } from "@tiptap/core"; import type { Node as ProseMirrorNode } from "@tiptap/pm/model"; -import type { Selection } from "@tiptap/pm/state"; -import { CellSelection } from "@tiptap/pm/tables"; +import type { EditorState, Selection, Transaction } from "@tiptap/pm/state"; +import { CellSelection, type Rect, TableMap } from "@tiptap/pm/tables"; // constants import { CORE_EXTENSIONS } from "@/constants/extension"; @@ -35,3 +36,184 @@ export const isCellEmpty = (cell: ProseMirrorNode | null): boolean => { return !hasContent; }; + +export type TableNodeLocation = { + pos: number; + start: number; + node: ProseMirrorNode; +}; + +/** + * @description Find the table node location from the selection. + * @param {Selection} selection - The selection. + * @returns {TableNodeLocation | undefined} The table node location. + */ +export const findTable = (selection: Selection): TableNodeLocation | undefined => + findParentNode((node) => node.type.spec.tableRole === "table")(selection); + +/** + * @description Check if the selection has table related changes. + * @param {Editor} editor - The editor instance. + * @param {TableNodeLocation | undefined} table - The table node location. + * @param {EditorState} oldState - The old editor state. + * @param {EditorState} newState - The new editor state. + * @param {Transaction} tr - The transaction. + * @returns {boolean} True if the selection has table related changes, false otherwise. + */ +export const haveTableRelatedChanges = ( + editor: Editor, + table: TableNodeLocation | undefined, + oldState: EditorState, + newState: EditorState, + tr: Transaction +): table is TableNodeLocation => + editor.isEditable && table !== undefined && (tr.docChanged || !newState.selection.eq(oldState.selection)); + +/** + * @description Get the selected rect from the cell selection. + * @param {CellSelection} selection - The cell selection. + * @param {TableMap} map - The table map. + * @returns {Rect} The selected rect. + */ +export const getSelectedRect = (selection: CellSelection, map: TableMap): Rect => { + const start = selection.$anchorCell.start(-1); + return map.rectBetween(selection.$anchorCell.pos - start, selection.$headCell.pos - start); +}; + +/** + * @description Get the selected columns from the cell selection. + * @param {Selection} selection - The selection. + * @param {TableMap} map - The table map. + * @returns {number[]} The selected columns. + */ +export const getSelectedColumns = (selection: Selection, map: TableMap): number[] => { + if (isCellSelection(selection) && selection.isColSelection()) { + const selectedRect = getSelectedRect(selection, map); + return [...Array(selectedRect.right - selectedRect.left).keys()].map((idx) => idx + selectedRect.left); + } + + return []; +}; + +/** + * @description Get the selected rows from the cell selection. + * @param {Selection} selection - The selection. + * @param {TableMap} map - The table map. + * @returns {number[]} The selected rows. + */ +export const getSelectedRows = (selection: Selection, map: TableMap): number[] => { + if (isCellSelection(selection) && selection.isRowSelection()) { + const selectedRect = getSelectedRect(selection, map); + return [...Array(selectedRect.bottom - selectedRect.top).keys()].map((idx) => idx + selectedRect.top); + } + + return []; +}; + +/** + * @description Check if the rect is selected. + * @param {Rect} rect - The rect. + * @param {CellSelection} selection - The cell selection. + * @returns {boolean} True if the rect is selected, false otherwise. + */ +export const isRectSelected = (rect: Rect, selection: CellSelection): boolean => { + const map = TableMap.get(selection.$anchorCell.node(-1)); + const cells = map.cellsInRect(rect); + const selectedCells = map.cellsInRect(getSelectedRect(selection, map)); + + return cells.every((cell) => selectedCells.includes(cell)); +}; + +/** + * @description Check if the column is selected. + * @param {number} columnIndex - The column index. + * @param {Selection} selection - The selection. + * @returns {boolean} True if the column is selected, false otherwise. + */ +export const isColumnSelected = (columnIndex: number, selection: Selection): boolean => { + if (!isCellSelection(selection)) return false; + + const { height } = TableMap.get(selection.$anchorCell.node(-1)); + const rect = { left: columnIndex, right: columnIndex + 1, top: 0, bottom: height }; + return isRectSelected(rect, selection); +}; + +/** + * @description Check if the row is selected. + * @param {number} rowIndex - The row index. + * @param {Selection} selection - The selection. + * @returns {boolean} True if the row is selected, false otherwise. + */ +export const isRowSelected = (rowIndex: number, selection: Selection): boolean => { + if (isCellSelection(selection)) { + const { width } = TableMap.get(selection.$anchorCell.node(-1)); + const rect = { left: 0, right: width, top: rowIndex, bottom: rowIndex + 1 }; + return isRectSelected(rect, selection); + } + + return false; +}; + +/** + * @description Select the column. + * @param {TableNodeLocation} table - The table node location. + * @param {number} index - The column index. + * @param {Transaction} tr - The transaction. + * @returns {Transaction} The updated transaction. + */ +export const selectColumn = (table: TableNodeLocation, index: number, tr: Transaction): Transaction => { + const { map } = TableMap.get(table.node); + + const anchorCell = table.start + map[index]; + const $anchor = tr.doc.resolve(anchorCell); + + return tr.setSelection(CellSelection.colSelection($anchor)); +}; + +/** + * @description Select the row. + * @param {TableNodeLocation} table - The table node location. + * @param {number} index - The row index. + * @param {Transaction} tr - The transaction. + * @returns {Transaction} The updated transaction. + */ +export const selectRow = (table: TableNodeLocation, index: number, tr: Transaction): Transaction => { + const { map, width } = TableMap.get(table.node); + + const anchorCell = table.start + map[index * width]; + const $anchor = tr.doc.resolve(anchorCell); + + return tr.setSelection(CellSelection.rowSelection($anchor)); +}; + +/** + * @description Get the position of the cell widget decoration. + * @param {TableNodeLocation} table - The table node location. + * @param {TableMap} map - The table map. + * @param {number} index - The index. + * @returns {number} The position of the cell widget decoration. + */ +export const getTableCellWidgetDecorationPos = (table: TableNodeLocation, map: TableMap, index: number): number => + table.start + map.map[index] + 1; + +/** + * @description Get the height of the table in pixels. + * @param {TableNodeLocation} table - The table node location. + * @param {Editor} editor - The editor instance. + * @returns {number} The height of the table in pixels. + */ +export const getTableHeightPx = (table: TableNodeLocation, editor: Editor): number => { + const dom = editor.view.domAtPos(table.start); + return dom.node.parentElement?.offsetHeight ?? 0; +}; + +/** + * @description Get the width of the table in pixels. + * @param {TableNodeLocation} table - The table node location. + * @param {Editor} editor - The editor instance. + * @returns {number} The width of the table in pixels. + */ +export const getTableWidthPx = (table: TableNodeLocation, editor: Editor): number => { + const dom = editor.view.domAtPos(table.start); + return dom.node.parentElement?.offsetWidth ?? 0; +}; diff --git a/packages/editor/src/core/plugins/drag-handle.ts b/packages/editor/src/core/plugins/drag-handle.ts index 607837e4e5..5d05f80fc8 100644 --- a/packages/editor/src/core/plugins/drag-handle.ts +++ b/packages/editor/src/core/plugins/drag-handle.ts @@ -16,7 +16,7 @@ const generalSelectors = [ "blockquote", "h1.editor-heading-block, h2.editor-heading-block, h3.editor-heading-block, h4.editor-heading-block, h5.editor-heading-block, h6.editor-heading-block", "[data-type=horizontalRule]", - "table", + "table:not(.table-drag-preview)", ".issue-embed", ".image-component", ".image-upload-component", @@ -65,9 +65,7 @@ const isScrollable = (node: HTMLElement | SVGElement) => { }); }; -const getScrollParent = (node: HTMLElement | SVGElement | null): Element | null => { - if (!node) return null; - +export const getScrollParent = (node: HTMLElement | SVGElement) => { if (scrollParentCache.has(node)) { return scrollParentCache.get(node); } @@ -92,7 +90,7 @@ export const nodeDOMAtCoords = (coords: { x: number; y: number }) => { for (const elem of elements) { // Check for table wrapper first - if (elem.matches("table")) { + if (elem.matches("table:not(.table-drag-preview)")) { return elem; } @@ -173,7 +171,7 @@ export const DragHandlePlugin = (options: SideMenuPluginProps): SideMenuHandleOp scrollableParent.scrollBy({ top: currentScrollSpeed }); } - scrollAnimationFrame = requestAnimationFrame(scroll); + scrollAnimationFrame = requestAnimationFrame(scroll) as unknown as null; } const handleClick = (event: MouseEvent, view: EditorView) => { @@ -381,7 +379,6 @@ const handleNodeSelection = ( let draggedNodePos = nodePosAtDOM(node, view, options); if (draggedNodePos == null || draggedNodePos < 0) return; - // Handle blockquote separately if (node.matches("blockquote")) { draggedNodePos = nodePosAtDOMForBlockQuotes(node, view); if (draggedNodePos === null || draggedNodePos === undefined) return; diff --git a/packages/editor/src/styles/table.css b/packages/editor/src/styles/table.css index ba5834abb9..c2c013d77b 100644 --- a/packages/editor/src/styles/table.css +++ b/packages/editor/src/styles/table.css @@ -25,7 +25,7 @@ } /* Selected cell outline */ - &.selectedCell { + &.selectedCell:not(.content-hidden) { user-select: none; &::after { @@ -54,6 +54,30 @@ } } /* End selected cell outline */ + + .table-col-handle-container, + .table-row-handle-container { + & > button { + opacity: 0; + } + } + + &:hover { + .table-col-handle-container, + .table-row-handle-container { + & > button { + opacity: 1; + } + } + } + + .ProseMirror-widget + * { + padding-top: 0 !important; + } + + &.content-hidden > * { + visibility: hidden; + } } th { @@ -67,6 +91,34 @@ background-color: rgba(var(--color-background-90)); } } + + .table-drop-marker { + background-color: rgba(var(--color-primary-100)); + position: absolute; + z-index: 10; + + &.hidden { + display: none; + } + } + + .table-col-drag-marker, + .table-row-drag-marker { + position: absolute; + z-index: 10; + + &.hidden { + display: none; + } + } + + .table-col-drag-marker { + top: -9px; + } + + .table-row-drag-marker { + left: 0; + } } /* Selected status */ From 841388e437f78040d64b6ffaa45999e122ce4205 Mon Sep 17 00:00:00 2001 From: Jayash Tripathy <76092296+JayashTripathy@users.noreply.github.com> Date: Sat, 23 Aug 2025 01:07:35 +0530 Subject: [PATCH 009/138] [WEB-4751] refactor: added tld validation for urls (#7622) * refactor: added tld validation for urls * refactor: improve TLD validation and update parameter naming in URL utility functions * refactor: enhance URL component extraction and validation logic * fix: lint * chore: remove unused lodash filter import in existing issues list modal --------- Co-authored-by: Sriram Veeraghanta --- packages/propel/src/command/command.tsx | 2 +- packages/utils/package.json | 1 + packages/utils/src/url.ts | 181 ++++++++++++++++++++---- pnpm-lock.yaml | 9 ++ 4 files changed, 167 insertions(+), 26 deletions(-) diff --git a/packages/propel/src/command/command.tsx b/packages/propel/src/command/command.tsx index 8657714235..e691e3d76f 100644 --- a/packages/propel/src/command/command.tsx +++ b/packages/propel/src/command/command.tsx @@ -1,6 +1,6 @@ +import * as React from "react"; import { Command as CommandPrimitive } from "cmdk"; import { SearchIcon } from "lucide-react"; -import * as React from "react"; import { cn } from "@plane/utils"; function CommandComponent({ className, ...props }: React.ComponentProps) { diff --git a/packages/utils/package.json b/packages/utils/package.json index fce54bb233..e4f72157c3 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -30,6 +30,7 @@ "lucide-react": "^0.469.0", "react": "^18.3.1", "tailwind-merge": "^2.5.5", + "tlds": "1.259.0", "uuid": "^10.0.0" }, "devDependencies": { diff --git a/packages/utils/src/url.ts b/packages/utils/src/url.ts index 5c6351f736..f24818a6f6 100644 --- a/packages/utils/src/url.ts +++ b/packages/utils/src/url.ts @@ -1,7 +1,9 @@ +import tlds from "tlds"; + /** * Interface representing the components of a URL. * @interface IURLComponents - * @property {string} protocol - The URL protocol (e.g., 'http', 'https') + * @property {string} protocol - The URL protocol (e.g., 'http', 'https'), empty if protocol is not present * @property {string} subdomain - The subdomain part of the URL (e.g., 'blog' in 'blog.example.com') * @property {string} rootDomain - The root domain name (e.g., 'example' in 'blog.example.com') * @property {string} tld - The top-level domain (e.g., 'com', 'org') @@ -18,36 +20,65 @@ export interface IURLComponents { } /** - * Extracts components from a URL object. + * Extracts components from a URL object or string. * - * @param {URL} url - The URL object to extract components from + * @param {URL | string} url - The URL object or string to extract components from * @returns {IURLComponents | undefined} URL components or undefined if invalid * * @example + * // With URL object * const url = new URL('https://blog.example.com/posts'); * extractURLComponents(url); + * + * // With string + * extractURLComponents('blog.example.com/posts'); + * + * // Example output: * // { - * // protocol: 'https', + * // protocol: 'https', // empty string if protocol is not present * // subdomain: 'blog', * // rootDomain: 'example', * // tld: 'com', * // path: 'posts', - * // full: URL {} // The original URL object + * // full: URL {} // The parsed URL object * // } */ -export function extractURLComponents(url: URL): IURLComponents | undefined { +export function extractURLComponents(url: URL | string): IURLComponents | undefined { + if (!url) return undefined; + + let cleanedUrl: URL; + let wasProtocolAdded = false; + try { - const protocol = url.protocol.slice(0, -1); - const pathname = url.pathname.replace(/^\/+/, "").replace(/\/{2,}/g, "/"); - const path = pathname + url.search + url.hash; - const hostnameParts = url.hostname.split("."); + if (typeof url === "string") { + if (url.trim() === "") return undefined; + + // Check for valid protocol pattern: some characters followed by :// + if (/^[a-zA-Z]+:\/\//.test(url)) { + cleanedUrl = new URL(url); + } else if (hasValidTLD(url) || url.includes("localhost")) { + wasProtocolAdded = true; + cleanedUrl = new URL(`http://${url}`); + } else { + return undefined; + } + } else { + cleanedUrl = url; + } + + const protocol = cleanedUrl.protocol.slice(0, -1); + const pathname = cleanedUrl.pathname.replace(/^\/+/, "").replace(/\/{2,}/g, "/"); + const path = pathname + cleanedUrl.search + cleanedUrl.hash; + const hostnameParts = cleanedUrl.hostname.split("."); let subdomain = ""; let rootDomain = ""; let tld = ""; - if (hostnameParts.length >= 2) { + if (hostnameParts.length === 1) { + rootDomain = hostnameParts[0]; // For cases like 'localhost' + } else if (hostnameParts.length >= 2) { tld = hostnameParts[hostnameParts.length - 1]; rootDomain = hostnameParts[hostnameParts.length - 2]; @@ -57,19 +88,90 @@ export function extractURLComponents(url: URL): IURLComponents | undefined { } return { - protocol, + protocol: wasProtocolAdded ? "" : protocol, subdomain, rootDomain, tld, path, - full: url, + full: cleanedUrl, }; } catch (error) { - console.error(`Error extracting URL components: ${url.href}`, error); + console.error(`Error extracting URL components: ${url?.toString() || url}`, error); return undefined; } } +/** + * Checks if a string contains a valid TLD (Top Level Domain) by cleaning the URL and validating against known TLDs. + * + * @param {string} urlString - The string to check for valid TLD + * @returns {boolean} True if the string contains a valid TLD, false otherwise + * + * @description + * The function performs the following steps: + * 1. Basic validation (rejects empty strings, strings starting/ending with dots) + * 2. URL component cleaning: + * - Removes path component (everything after '/') + * - Removes query parameters (everything after '?') + * - Removes hash fragments (everything after '#') + * - Removes port numbers (everything after ':') + * 3. Validates the TLD against a list of known TLDs + * + * @example + * // Valid cases + * hasValidTLD('example.com') // returns true + * hasValidTLD('sub.example.com') // returns true + * hasValidTLD('example.com/path') // returns true (path is stripped) + * hasValidTLD('example.com:8080') // returns true (port is stripped) + * hasValidTLD('example.com?query=1') // returns true (query is stripped) + * hasValidTLD('example.com#hash') // returns true (hash is stripped) + * + * // Invalid cases + * hasValidTLD('') // returns false (empty string) + * hasValidTLD('.example.com') // returns false (starts with dot) + * hasValidTLD('example.com.') // returns false (ends with dot) + * hasValidTLD('example.invalid') // returns false (invalid TLD) + * hasValidTLD('localhost') // returns false (no TLD) + */ + +function hasValidTLD(urlString: string): boolean { + if (!urlString || urlString.startsWith(".") || urlString.endsWith(".")) { + return false; + } + + let hostname = urlString; + + // Remove path, query, and hash if present + const pathIndex = hostname.indexOf("/"); + if (pathIndex !== -1) { + hostname = hostname.substring(0, pathIndex); + } + + const queryIndex = hostname.indexOf("?"); + if (queryIndex !== -1) { + hostname = hostname.substring(0, queryIndex); + } + + const hashIndex = hostname.indexOf("#"); + if (hashIndex !== -1) { + hostname = hostname.substring(0, hashIndex); + } + + // Remove port if present + const portIndex = hostname.indexOf(":"); + if (portIndex !== -1) { + hostname = hostname.substring(0, portIndex); + } + + const hostnameParts = hostname.split("."); + if (hostnameParts.length >= 2) { + const potentialTLD = hostnameParts[hostnameParts.length - 1].toLowerCase(); + return tlds.includes(potentialTLD); + } + + return false; +} + /** * Checks if a string is a valid URL. * @@ -78,19 +180,48 @@ export function extractURLComponents(url: URL): IURLComponents | undefined { * * @example * // Valid URLs - * getValidURL('https://example.com') // returns URL object - * getValidURL('http://example.com') // returns URL object - * getValidURL('https://sub.example.com') // returns URL object + * isUrlValid('https://example.com') // returns true + * isUrlValid('http://example.com') // returns true + * isUrlValid('https://sub.example.com') // returns true * * // Invalid URLs - * getValidURL('not-a-url') // returns undefined - * getValidURL('example.com') // returns undefined (no protocol) - * getValidURL('https://invalid.') // returns undefined + * isUrlValid('not-a-url') // returns false + * isUrlValid('https://invalid.') // returns false + * isUrlValid('example.invalid') // returns false (invalid TLD) + * + * // Test cases: + * // isUrlValid('google.com') // ✅ returns true + * // isUrlValid('github.io') // ✅ returns true + * // isUrlValid('invalid.tld') // ❌ returns false (invalid TLD) */ -export function getValidURL(urlString: string): URL | undefined { - try { - return new URL(urlString); - } catch { - return undefined; + +export function isUrlValid(urlString: string): boolean { + // Basic input validation + if (!urlString || urlString.trim() === "") return false; + + // Handle localhost separately + if (urlString.startsWith("localhost")) { + try { + new URL(`http://${urlString}`); + return true; + } catch { + return false; + } } + + // Check for valid protocol format if protocol is present + if (urlString.includes("://")) { + // Reject invalid protocol formats (e.g. "://example.com") + if (!/^[a-zA-Z]+:\/\//.test(urlString)) return false; + try { + const url = new URL(urlString); + return !!url.hostname && url.hostname !== ".com"; + } catch { + return false; + } + } + + if (hasValidTLD(urlString)) return true; + + return false; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b4d469b214..1526fccf0c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1280,6 +1280,9 @@ importers: tailwind-merge: specifier: ^2.5.5 version: 2.6.0 + tlds: + specifier: 1.259.0 + version: 1.259.0 uuid: specifier: ^10.0.0 version: 10.0.0 @@ -7161,6 +7164,10 @@ packages: peerDependencies: '@tiptap/core': ^2.0.3 + tlds@1.259.0: + resolution: {integrity: sha512-AldGGlDP0PNgwppe2quAvuBl18UcjuNtOnDuUkqhd6ipPqrYYBt3aTxK1QTsBVknk97lS2JcafWMghjGWFtunw==} + hasBin: true + tldts-core@6.1.86: resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} @@ -14253,6 +14260,8 @@ snapshots: markdown-it-task-lists: 2.1.1 prosemirror-markdown: 1.13.2 + tlds@1.259.0: {} + tldts-core@6.1.86: {} tldts@6.1.86: From 935e4b5c33cbadf6df11821d0cd6ee259bb7ac09 Mon Sep 17 00:00:00 2001 From: Nikhil <118773738+pablohashescobar@users.noreply.github.com> Date: Sun, 24 Aug 2025 15:13:49 +0530 Subject: [PATCH 010/138] [WEB-4720] chore: refactor and extend cleanup tasks for logs and versions (#7604) * Refactor and extend cleanup tasks for logs and versions - Consolidate API log deletion into cleanup_task.py - Add tasks to delete old email logs, page versions, and issue description versions - Update Celery schedule and imports for new tasks * chore: update cleanup task with mongo changes * fix: update log deletion task name for clarity * fix: enhance MongoDB archival error handling in cleanup task - Added a parameter to check MongoDB availability in the flush_to_mongo_and_delete function. - Implemented error logging for MongoDB archival failures. - Updated calls to flush_to_mongo_and_delete to include the new parameter. * fix: correct parameter name in cleanup task function call - Updated the parameter name from 'mode' to 'model' in the process_cleanup_task function to ensure consistency and clarity in the code. * fix: improve MongoDB connection parameter handling in MongoConnection class - Replaced direct access to settings with getattr for MONGO_DB_URL and MONGO_DB_DATABASE to enhance robustness. - Added warning logging for missing MongoDB connection parameters. --- apps/api/plane/bgtasks/api_logs_task.py | 15 - apps/api/plane/bgtasks/cleanup_task.py | 423 ++++++++++++++++++++++++ apps/api/plane/celery.py | 14 +- apps/api/plane/settings/common.py | 2 +- apps/api/plane/settings/local.py | 5 + apps/api/plane/settings/mongo.py | 121 +++++++ apps/api/plane/settings/production.py | 5 + apps/api/requirements/base.txt | 4 +- 8 files changed, 571 insertions(+), 18 deletions(-) delete mode 100644 apps/api/plane/bgtasks/api_logs_task.py create mode 100644 apps/api/plane/bgtasks/cleanup_task.py create mode 100644 apps/api/plane/settings/mongo.py diff --git a/apps/api/plane/bgtasks/api_logs_task.py b/apps/api/plane/bgtasks/api_logs_task.py deleted file mode 100644 index 038b939d54..0000000000 --- a/apps/api/plane/bgtasks/api_logs_task.py +++ /dev/null @@ -1,15 +0,0 @@ -from django.utils import timezone -from datetime import timedelta -from plane.db.models import APIActivityLog -from celery import shared_task - - -@shared_task -def delete_api_logs(): - # Get the logs older than 30 days to delete - logs_to_delete = APIActivityLog.objects.filter( - created_at__lte=timezone.now() - timedelta(days=30) - ) - - # Delete the logs - logs_to_delete._raw_delete(logs_to_delete.db) diff --git a/apps/api/plane/bgtasks/cleanup_task.py b/apps/api/plane/bgtasks/cleanup_task.py new file mode 100644 index 0000000000..4c86eaea5e --- /dev/null +++ b/apps/api/plane/bgtasks/cleanup_task.py @@ -0,0 +1,423 @@ +# Python imports +from datetime import timedelta +import logging +from typing import List, Dict, Any, Callable, Optional +import os + +# Django imports +from django.utils import timezone +from django.db.models import F, Window, Subquery +from django.db.models.functions import RowNumber + +# Third party imports +from celery import shared_task +from pymongo.errors import BulkWriteError +from pymongo.collection import Collection +from pymongo.operations import InsertOne + +# Module imports +from plane.db.models import ( + EmailNotificationLog, + PageVersion, + APIActivityLog, + IssueDescriptionVersion, +) +from plane.settings.mongo import MongoConnection +from plane.utils.exception_logger import log_exception + + +logger = logging.getLogger("plane.worker") +BATCH_SIZE = 1000 + + +def get_mongo_collection(collection_name: str) -> Optional[Collection]: + """Get MongoDB collection if available, otherwise return None.""" + if not MongoConnection.is_configured(): + logger.info("MongoDB not configured") + return None + + try: + mongo_collection = MongoConnection.get_collection(collection_name) + logger.info(f"MongoDB collection '{collection_name}' connected successfully") + return mongo_collection + except Exception as e: + logger.error(f"Failed to get MongoDB collection: {str(e)}") + log_exception(e) + return None + + +def flush_to_mongo_and_delete( + mongo_collection: Optional[Collection], + buffer: List[Dict[str, Any]], + ids_to_delete: List[int], + model, + mongo_available: bool, +) -> None: + """ + Inserts a batch of records into MongoDB and deletes the corresponding rows from PostgreSQL. + """ + if not buffer: + logger.debug("No records to flush - buffer is empty") + return + + logger.info( + f"Starting batch flush: {len(buffer)} records, {len(ids_to_delete)} IDs to delete" + ) + + mongo_archival_failed = False + + # Try to insert into MongoDB if available + if mongo_collection and mongo_available: + try: + mongo_collection.bulk_write([InsertOne(doc) for doc in buffer]) + except BulkWriteError as bwe: + logger.error(f"MongoDB bulk write error: {str(bwe)}") + log_exception(bwe) + mongo_archival_failed = True + + # If MongoDB is available and archival failed, log the error and return + if mongo_available and mongo_archival_failed: + logger.error(f"MongoDB archival failed for {len(buffer)} records") + return + + # Delete from PostgreSQL - delete() returns (count, {model: count}) + delete_result = model.all_objects.filter(id__in=ids_to_delete).delete() + deleted_count = ( + delete_result[0] if delete_result and isinstance(delete_result, tuple) else 0 + ) + logger.info(f"Batch flush completed: {deleted_count} records deleted") + + +def process_cleanup_task( + queryset_func: Callable, + transform_func: Callable[[Dict], Dict], + model, + task_name: str, + collection_name: str, +): + """ + Generic function to process cleanup tasks. + + Args: + queryset_func: Function that returns the queryset to process + transform_func: Function to transform each record for MongoDB + model: Django model class + task_name: Name of the task for logging + collection_name: MongoDB collection name + """ + logger.info(f"Starting {task_name} cleanup task") + + # Get MongoDB collection + mongo_collection = get_mongo_collection(collection_name) + mongo_available = mongo_collection is not None + + # Get queryset + queryset = queryset_func() + + # Process records in batches + buffer: List[Dict[str, Any]] = [] + ids_to_delete: List[int] = [] + total_processed = 0 + total_batches = 0 + + for record in queryset: + # Transform record for MongoDB + buffer.append(transform_func(record)) + ids_to_delete.append(record["id"]) + + # Flush batch when it reaches BATCH_SIZE + if len(buffer) >= BATCH_SIZE: + total_batches += 1 + flush_to_mongo_and_delete( + mongo_collection=mongo_collection, + buffer=buffer, + ids_to_delete=ids_to_delete, + model=model, + mongo_available=mongo_available, + ) + total_processed += len(buffer) + buffer.clear() + ids_to_delete.clear() + + # Process final batch if any records remain + if buffer: + total_batches += 1 + flush_to_mongo_and_delete( + mongo_collection=mongo_collection, + buffer=buffer, + ids_to_delete=ids_to_delete, + model=model, + mongo_available=mongo_available, + ) + total_processed += len(buffer) + + logger.info( + f"{task_name} cleanup task completed", + extra={ + "total_records_processed": total_processed, + "total_batches": total_batches, + "mongo_available": mongo_available, + "collection_name": collection_name, + }, + ) + + +# Transform functions for each model +def transform_api_log(record: Dict) -> Dict: + """Transform API activity log record.""" + return { + "id": record["id"], + "created_at": str(record["created_at"]) if record.get("created_at") else None, + "token_identifier": record["token_identifier"], + "path": record["path"], + "method": record["method"], + "query_params": record.get("query_params"), + "headers": record.get("headers"), + "body": record.get("body"), + "response_code": record["response_code"], + "response_body": record["response_body"], + "ip_address": record["ip_address"], + "user_agent": record["user_agent"], + "created_by_id": record["created_by_id"], + } + + +def transform_email_log(record: Dict) -> Dict: + """Transform email notification log record.""" + return { + "id": record["id"], + "created_at": str(record["created_at"]) if record.get("created_at") else None, + "receiver_id": record["receiver_id"], + "triggered_by_id": record["triggered_by_id"], + "entity_identifier": record["entity_identifier"], + "entity_name": record["entity_name"], + "data": record["data"], + "processed_at": ( + str(record["processed_at"]) if record.get("processed_at") else None + ), + "sent_at": str(record["sent_at"]) if record.get("sent_at") else None, + "entity": record["entity"], + "old_value": record["old_value"], + "new_value": record["new_value"], + "created_by_id": record["created_by_id"], + } + + +def transform_page_version(record: Dict) -> Dict: + """Transform page version record.""" + return { + "id": record["id"], + "created_at": str(record["created_at"]) if record.get("created_at") else None, + "page_id": record["page_id"], + "workspace_id": record["workspace_id"], + "owned_by_id": record["owned_by_id"], + "description_html": record["description_html"], + "description_binary": record["description_binary"], + "description_stripped": record["description_stripped"], + "description_json": record["description_json"], + "sub_pages_data": record["sub_pages_data"], + "created_by_id": record["created_by_id"], + "updated_by_id": record["updated_by_id"], + "deleted_at": str(record["deleted_at"]) if record.get("deleted_at") else None, + "last_saved_at": ( + str(record["last_saved_at"]) if record.get("last_saved_at") else None + ), + } + + +def transform_issue_description_version(record: Dict) -> Dict: + """Transform issue description version record.""" + return { + "id": record["id"], + "created_at": str(record["created_at"]) if record.get("created_at") else None, + "issue_id": record["issue_id"], + "workspace_id": record["workspace_id"], + "project_id": record["project_id"], + "created_by_id": record["created_by_id"], + "updated_by_id": record["updated_by_id"], + "owned_by_id": record["owned_by_id"], + "last_saved_at": ( + str(record["last_saved_at"]) if record.get("last_saved_at") else None + ), + "description_binary": record["description_binary"], + "description_html": record["description_html"], + "description_stripped": record["description_stripped"], + "description_json": record["description_json"], + "deleted_at": str(record["deleted_at"]) if record.get("deleted_at") else None, + } + + +# Queryset functions for each cleanup task +def get_api_logs_queryset(): + """Get API logs older than cutoff days.""" + cutoff_days = int(os.environ.get("HARD_DELETE_AFTER_DAYS", 30)) + cutoff_time = timezone.now() - timedelta(days=cutoff_days) + logger.info(f"API logs cutoff time: {cutoff_time}") + + return ( + APIActivityLog.all_objects.filter(created_at__lte=cutoff_time) + .values( + "id", + "created_at", + "token_identifier", + "path", + "method", + "query_params", + "headers", + "body", + "response_code", + "response_body", + "ip_address", + "user_agent", + "created_by_id", + ) + .iterator(chunk_size=BATCH_SIZE) + ) + + +def get_email_logs_queryset(): + """Get email logs older than cutoff days.""" + cutoff_days = int(os.environ.get("HARD_DELETE_AFTER_DAYS", 30)) + cutoff_time = timezone.now() - timedelta(days=cutoff_days) + logger.info(f"Email logs cutoff time: {cutoff_time}") + + return ( + EmailNotificationLog.all_objects.filter(sent_at__lte=cutoff_time) + .values( + "id", + "created_at", + "receiver_id", + "triggered_by_id", + "entity_identifier", + "entity_name", + "data", + "processed_at", + "sent_at", + "entity", + "old_value", + "new_value", + "created_by_id", + ) + .iterator(chunk_size=BATCH_SIZE) + ) + + +def get_page_versions_queryset(): + """Get page versions beyond the maximum allowed (20 per page).""" + subq = ( + PageVersion.all_objects.annotate( + row_num=Window( + expression=RowNumber(), + partition_by=[F("page_id")], + order_by=F("created_at").desc(), + ) + ) + .filter(row_num__gt=20) + .values("id") + ) + + return ( + PageVersion.all_objects.filter(id__in=Subquery(subq)) + .values( + "id", + "created_at", + "page_id", + "workspace_id", + "owned_by_id", + "description_html", + "description_binary", + "description_stripped", + "description_json", + "sub_pages_data", + "created_by_id", + "updated_by_id", + "deleted_at", + "last_saved_at", + ) + .iterator(chunk_size=BATCH_SIZE) + ) + + +def get_issue_description_versions_queryset(): + """Get issue description versions beyond the maximum allowed (20 per issue).""" + subq = ( + IssueDescriptionVersion.all_objects.annotate( + row_num=Window( + expression=RowNumber(), + partition_by=[F("issue_id")], + order_by=F("created_at").desc(), + ) + ) + .filter(row_num__gt=20) + .values("id") + ) + + return ( + IssueDescriptionVersion.all_objects.filter(id__in=Subquery(subq)) + .values( + "id", + "created_at", + "issue_id", + "workspace_id", + "project_id", + "created_by_id", + "updated_by_id", + "owned_by_id", + "last_saved_at", + "description_binary", + "description_html", + "description_stripped", + "description_json", + "deleted_at", + ) + .iterator(chunk_size=BATCH_SIZE) + ) + + +# Celery tasks - now much simpler! +@shared_task +def delete_api_logs(): + """Delete old API activity logs.""" + process_cleanup_task( + queryset_func=get_api_logs_queryset, + transform_func=transform_api_log, + model=APIActivityLog, + task_name="API Activity Log", + collection_name="api_activity_logs", + ) + + +@shared_task +def delete_email_notification_logs(): + """Delete old email notification logs.""" + process_cleanup_task( + queryset_func=get_email_logs_queryset, + transform_func=transform_email_log, + model=EmailNotificationLog, + task_name="Email Notification Log", + collection_name="email_notification_logs", + ) + + +@shared_task +def delete_page_versions(): + """Delete excess page versions.""" + process_cleanup_task( + queryset_func=get_page_versions_queryset, + transform_func=transform_page_version, + model=PageVersion, + task_name="Page Version", + collection_name="page_versions", + ) + + +@shared_task +def delete_issue_description_versions(): + """Delete excess issue description versions.""" + process_cleanup_task( + queryset_func=get_issue_description_versions_queryset, + transform_func=transform_issue_description_version, + model=IssueDescriptionVersion, + task_name="Issue Description Version", + collection_name="issue_description_versions", + ) diff --git a/apps/api/plane/celery.py b/apps/api/plane/celery.py index 0ffa4689b9..2eeac358c6 100644 --- a/apps/api/plane/celery.py +++ b/apps/api/plane/celery.py @@ -50,9 +50,21 @@ app.conf.beat_schedule = { "schedule": crontab(hour=2, minute=0), # UTC 02:00 }, "check-every-day-to-delete-api-logs": { - "task": "plane.bgtasks.api_logs_task.delete_api_logs", + "task": "plane.bgtasks.cleanup_task.delete_api_logs", "schedule": crontab(hour=2, minute=30), # UTC 02:30 }, + "check-every-day-to-delete-email-notification-logs": { + "task": "plane.bgtasks.cleanup_task.delete_email_notification_logs", + "schedule": crontab(hour=3, minute=0), # UTC 03:00 + }, + "check-every-day-to-delete-page-versions": { + "task": "plane.bgtasks.cleanup_task.delete_page_versions", + "schedule": crontab(hour=3, minute=30), # UTC 03:30 + }, + "check-every-day-to-delete-issue-description-versions": { + "task": "plane.bgtasks.cleanup_task.delete_issue_description_versions", + "schedule": crontab(hour=4, minute=0), # UTC 04:00 + }, } diff --git a/apps/api/plane/settings/common.py b/apps/api/plane/settings/common.py index cad1249018..8f776d1ce0 100644 --- a/apps/api/plane/settings/common.py +++ b/apps/api/plane/settings/common.py @@ -284,7 +284,7 @@ CELERY_IMPORTS = ( "plane.bgtasks.exporter_expired_task", "plane.bgtasks.file_asset_task", "plane.bgtasks.email_notification_task", - "plane.bgtasks.api_logs_task", + "plane.bgtasks.cleanup_task", "plane.license.bgtasks.tracer", # management tasks "plane.bgtasks.dummy_data_task", diff --git a/apps/api/plane/settings/local.py b/apps/api/plane/settings/local.py index db60501f79..15af36a2da 100644 --- a/apps/api/plane/settings/local.py +++ b/apps/api/plane/settings/local.py @@ -73,5 +73,10 @@ LOGGING = { "handlers": ["console"], "propagate": False, }, + "plane.mongo": { + "level": "INFO", + "handlers": ["console"], + "propagate": False, + }, }, } diff --git a/apps/api/plane/settings/mongo.py b/apps/api/plane/settings/mongo.py new file mode 100644 index 0000000000..e64cc7ff40 --- /dev/null +++ b/apps/api/plane/settings/mongo.py @@ -0,0 +1,121 @@ +# Django imports +from django.conf import settings +import logging + +# Third party imports +from pymongo import MongoClient +from pymongo.database import Database +from pymongo.collection import Collection +from typing import Optional, TypeVar, Type + + +T = TypeVar("T", bound="MongoConnection") + +# Set up logger +logger = logging.getLogger("plane.mongo") + + +class MongoConnection: + """ + A singleton class that manages MongoDB connections. + + This class ensures only one MongoDB connection is maintained throughout the application. + It provides methods to access the MongoDB client, database, and collections. + + Attributes: + _instance (Optional[MongoConnection]): The singleton instance of this class + _client (Optional[MongoClient]): The MongoDB client instance + _db (Optional[Database]): The MongoDB database instance + """ + + _instance: Optional["MongoConnection"] = None + _client: Optional[MongoClient] = None + _db: Optional[Database] = None + + def __new__(cls: Type[T]) -> T: + """ + Creates a new instance of MongoConnection if one doesn't exist. + + Returns: + MongoConnection: The singleton instance + """ + if cls._instance is None: + cls._instance = super(MongoConnection, cls).__new__(cls) + try: + mongo_url = getattr(settings, "MONGO_DB_URL", None) + mongo_db_database = getattr(settings, "MONGO_DB_DATABASE", None) + + if not mongo_url or not mongo_db_database: + logger.warning( + "MongoDB connection parameters not configured. MongoDB functionality will be disabled." + ) + return cls._instance + + cls._client = MongoClient(mongo_url) + cls._db = cls._client[mongo_db_database] + + # Test the connection + cls._client.server_info() + logger.info("MongoDB connection established successfully") + except Exception as e: + logger.warning( + f"Failed to initialize MongoDB connection: {str(e)}. MongoDB functionality will be disabled." + ) + return cls._instance + + @classmethod + def get_client(cls) -> Optional[MongoClient]: + """ + Returns the MongoDB client instance. + + Returns: + Optional[MongoClient]: The MongoDB client instance or None if not configured + """ + if cls._client is None: + cls._instance = cls() + return cls._client + + @classmethod + def get_db(cls) -> Optional[Database]: + """ + Returns the MongoDB database instance. + + Returns: + Optional[Database]: The MongoDB database instance or None if not configured + """ + if cls._db is None: + cls._instance = cls() + return cls._db + + @classmethod + def get_collection(cls, collection_name: str) -> Optional[Collection]: + """ + Returns a MongoDB collection by name. + + Args: + collection_name (str): The name of the collection to retrieve + + Returns: + Optional[Collection]: The MongoDB collection instance or None if not configured + """ + try: + db = cls.get_db() + if db is None: + logger.warning( + f"Cannot access collection '{collection_name}': MongoDB not configured" + ) + return None + return db[collection_name] + except Exception as e: + logger.warning(f"Failed to access collection '{collection_name}': {str(e)}") + return None + + @classmethod + def is_configured(cls) -> bool: + """ + Check if MongoDB is properly configured and connected. + + Returns: + bool: True if MongoDB is configured and connected, False otherwise + """ + return cls._client is not None and cls._db is not None diff --git a/apps/api/plane/settings/production.py b/apps/api/plane/settings/production.py index abd95d006b..4f4e99bdb2 100644 --- a/apps/api/plane/settings/production.py +++ b/apps/api/plane/settings/production.py @@ -83,5 +83,10 @@ LOGGING = { "handlers": ["console"], "propagate": False, }, + "plane.mongo": { + "level": "INFO", + "handlers": ["console"], + "propagate": False, + }, }, } diff --git a/apps/api/requirements/base.txt b/apps/api/requirements/base.txt index 78e9efed34..69f4ec8379 100644 --- a/apps/api/requirements/base.txt +++ b/apps/api/requirements/base.txt @@ -66,4 +66,6 @@ opentelemetry-sdk==1.28.1 opentelemetry-instrumentation-django==0.49b1 opentelemetry-exporter-otlp==1.28.1 # OpenAPI Specification -drf-spectacular==0.28.0 \ No newline at end of file +drf-spectacular==0.28.0 +# mongo +pymongo==4.6.3 \ No newline at end of file From 568a1bb2284e731b78a2bd0b04cc095414bc652b Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Sun, 24 Aug 2025 15:16:08 +0530 Subject: [PATCH 011/138] [WEB-4757] fix: remove project view from workspace level group by options (#7634) --- apps/web/core/components/issues/issue-layouts/utils.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/web/core/components/issues/issue-layouts/utils.tsx b/apps/web/core/components/issues/issue-layouts/utils.tsx index a4c90897c3..7afc931e4e 100644 --- a/apps/web/core/components/issues/issue-layouts/utils.tsx +++ b/apps/web/core/components/issues/issue-layouts/utils.tsx @@ -71,7 +71,8 @@ export const isWorkspaceLevel = (type: EIssuesStoreType) => EIssuesStoreType.GLOBAL, EIssuesStoreType.TEAM, EIssuesStoreType.TEAM_VIEW, - EIssuesStoreType.PROJECT_VIEW, + EIssuesStoreType.TEAM_PROJECT_WORK_ITEMS, + EIssuesStoreType.WORKSPACE_DRAFT, ].includes(type) ? true : false; From 599ff2eec436e3d35b009891e7783ca3cb690fb3 Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Mon, 25 Aug 2025 01:32:15 +0530 Subject: [PATCH 012/138] [WEB-4746] fix: position peek view relative to app layout (#7635) --- .../analytics/work-items/modal/index.tsx | 14 +++++++------- .../core/components/issues/peek-overview/view.tsx | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/apps/web/core/components/analytics/work-items/modal/index.tsx b/apps/web/core/components/analytics/work-items/modal/index.tsx index 4852a0bd55..2ff0809bc2 100644 --- a/apps/web/core/components/analytics/work-items/modal/index.tsx +++ b/apps/web/core/components/analytics/work-items/modal/index.tsx @@ -20,7 +20,7 @@ type Props = { export const WorkItemsModal: React.FC = observer((props) => { const { isOpen, onClose, projectDetails, moduleDetails, cycleDetails, isEpic } = props; - const { updateIsEpic } = useAnalytics(); + const { updateIsEpic, isPeekView } = useAnalytics(); const [fullScreen, setFullScreen] = useState(false); const handleClose = () => { @@ -29,18 +29,18 @@ export const WorkItemsModal: React.FC = observer((props) => { }; useEffect(() => { - updateIsEpic(isEpic ?? false); - }, [isEpic, updateIsEpic]); + updateIsEpic(isPeekView ? (isEpic ?? false) : false); + }, [isEpic, updateIsEpic, isPeekView]); const portalContainer = document.getElementById("full-screen-portal") as HTMLElement; if (!isOpen) return null; const content = ( -
+
= observer((props) => {
); - return fullScreen && portalContainer ? createPortal(content, portalContainer) : content; + return portalContainer ? createPortal(content, portalContainer) : content; }); diff --git a/apps/web/core/components/issues/peek-overview/view.tsx b/apps/web/core/components/issues/peek-overview/view.tsx index e06a483975..bbae72db33 100644 --- a/apps/web/core/components/issues/peek-overview/view.tsx +++ b/apps/web/core/components/issues/peek-overview/view.tsx @@ -110,16 +110,16 @@ export const IssueView: FC = observer((props) => { const peekOverviewIssueClassName = cn( !embedIssue - ? "fixed z-[25] flex flex-col overflow-hidden rounded border border-custom-border-200 bg-custom-background-100 transition-all duration-300" + ? "absolute z-[25] flex flex-col overflow-hidden rounded border border-custom-border-200 bg-custom-background-100 transition-all duration-300" : `w-full h-full`, !embedIssue && { - "top-2 bottom-2 right-2 w-full md:w-[50%] border-0 border-l": peekMode === "side-peek", + "top-0 bottom-0 right-0 w-full md:w-[50%] border-0 border-l": peekMode === "side-peek", "size-5/6 top-[8.33%] left-[8.33%]": peekMode === "modal", "inset-0 m-4 absolute": peekMode === "full-screen", } ); - const shouldUsePortal = !embedIssue && peekMode === "full-screen"; + const shouldUsePortal = !embedIssue; const portalContainer = document.getElementById("full-screen-portal") as HTMLElement; From c7763dd4312ca4e12acde0a9a4d7a79195792eb5 Mon Sep 17 00:00:00 2001 From: Aaryan Khandelwal <65252264+aaryan610@users.noreply.github.com> Date: Mon, 25 Aug 2025 02:13:20 +0530 Subject: [PATCH 013/138] refactor: remove few barrel exports (#7633) * refactor: remove few barrel exports * fix: pnpm lock file update * fix: build errors --------- Co-authored-by: sriram veeraghanta --- .../projects/(detail)/[projectId]/intake/layout.tsx | 2 +- .../settings/projects/[projectId]/members/page.tsx | 2 +- apps/web/ce/components/breadcrumbs/project-feature.tsx | 2 +- apps/web/ce/components/common/index.ts | 2 -- apps/web/ce/components/common/subscription/index.ts | 1 - apps/web/ce/components/de-dupe/index.ts | 4 ---- apps/web/ce/components/de-dupe/issue-block/index.ts | 1 - apps/web/ce/components/epics/index.ts | 1 - apps/web/ce/components/projects/navigation/index.ts | 1 - apps/web/ce/components/projects/settings/intake/index.ts | 1 - apps/web/ce/components/projects/teamspaces/index.ts | 1 - apps/web/core/components/core/app-header.tsx | 2 +- apps/web/core/components/inbox/content/issue-root.tsx | 2 +- .../components/inbox/modals/create-modal/create-root.tsx | 3 ++- .../issues/issue-detail-widgets/relations/content.tsx | 2 +- .../web/core/components/issues/issue-detail/main-content.tsx | 2 +- apps/web/core/components/issues/issue-modal/form.tsx | 3 ++- .../core/components/issues/peek-overview/issue-detail.tsx | 2 +- apps/web/core/components/settings/sidebar/header.tsx | 2 +- apps/web/core/components/workspace/sidebar/dropdown-item.tsx | 5 ++--- apps/web/ee/components/de-dupe/index.ts | 1 - apps/web/ee/components/epics/index.ts | 1 - apps/web/ee/components/projects/settings/intake/index.ts | 1 - 23 files changed, 15 insertions(+), 29 deletions(-) delete mode 100644 apps/web/ce/components/common/index.ts delete mode 100644 apps/web/ce/components/common/subscription/index.ts delete mode 100644 apps/web/ce/components/de-dupe/index.ts delete mode 100644 apps/web/ce/components/de-dupe/issue-block/index.ts delete mode 100644 apps/web/ce/components/epics/index.ts delete mode 100644 apps/web/ce/components/projects/navigation/index.ts delete mode 100644 apps/web/ce/components/projects/settings/intake/index.ts delete mode 100644 apps/web/ce/components/projects/teamspaces/index.ts delete mode 100644 apps/web/ee/components/de-dupe/index.ts delete mode 100644 apps/web/ee/components/epics/index.ts delete mode 100644 apps/web/ee/components/projects/settings/intake/index.ts diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/intake/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/intake/layout.tsx index 4f9c5af7e9..72573c4490 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/intake/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/intake/layout.tsx @@ -3,7 +3,7 @@ // components import { AppHeader } from "@/components/core/app-header"; import { ContentWrapper } from "@/components/core/content-wrapper"; -import { ProjectInboxHeader } from "@/plane-web/components/projects/settings/intake"; +import { ProjectInboxHeader } from "@/plane-web/components/projects/settings/intake/header"; export default function ProjectInboxIssuesLayout({ children }: { children: React.ReactNode }) { return ( diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/members/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/members/page.tsx index 4cd8a64af5..545903ea2e 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/members/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/members/page.tsx @@ -16,7 +16,7 @@ import { SettingsHeading } from "@/components/settings/heading"; import { useProject } from "@/hooks/store/use-project"; import { useUserPermissions } from "@/hooks/store/user"; // plane web imports -import { ProjectTeamspaceList } from "@/plane-web/components/projects/teamspaces"; +import { ProjectTeamspaceList } from "@/plane-web/components/projects/teamspaces/teamspace-list"; import { getProjectSettingsPageLabelI18nKey } from "@/plane-web/helpers/project-settings"; const MembersSettingsPage = observer(() => { diff --git a/apps/web/ce/components/breadcrumbs/project-feature.tsx b/apps/web/ce/components/breadcrumbs/project-feature.tsx index fefbe9d187..db51f3e85c 100644 --- a/apps/web/ce/components/breadcrumbs/project-feature.tsx +++ b/apps/web/ce/components/breadcrumbs/project-feature.tsx @@ -12,7 +12,7 @@ import type { TNavigationItem } from "@/components/workspace/sidebar/project-nav import { useProject } from "@/hooks/store/use-project"; import { useAppRouter } from "@/hooks/use-app-router"; // local imports -import { getProjectFeatureNavigation } from "../projects/navigation"; +import { getProjectFeatureNavigation } from "../projects/navigation/helper"; type TProjectFeatureBreadcrumbProps = { workspaceSlug: string; diff --git a/apps/web/ce/components/common/index.ts b/apps/web/ce/components/common/index.ts deleted file mode 100644 index 38406d4cc3..0000000000 --- a/apps/web/ce/components/common/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./subscription"; -export * from "./extended-app-header"; diff --git a/apps/web/ce/components/common/subscription/index.ts b/apps/web/ce/components/common/subscription/index.ts deleted file mode 100644 index cfd65903d4..0000000000 --- a/apps/web/ce/components/common/subscription/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./subscription-pill"; diff --git a/apps/web/ce/components/de-dupe/index.ts b/apps/web/ce/components/de-dupe/index.ts deleted file mode 100644 index 91856db18e..0000000000 --- a/apps/web/ce/components/de-dupe/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./de-dupe-button"; -export * from "./duplicate-modal"; -export * from "./duplicate-popover"; -export * from "./issue-block"; diff --git a/apps/web/ce/components/de-dupe/issue-block/index.ts b/apps/web/ce/components/de-dupe/issue-block/index.ts deleted file mode 100644 index f50893b65d..0000000000 --- a/apps/web/ce/components/de-dupe/issue-block/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./button-label"; diff --git a/apps/web/ce/components/epics/index.ts b/apps/web/ce/components/epics/index.ts deleted file mode 100644 index 29da0cc8ac..0000000000 --- a/apps/web/ce/components/epics/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./epic-modal"; diff --git a/apps/web/ce/components/projects/navigation/index.ts b/apps/web/ce/components/projects/navigation/index.ts deleted file mode 100644 index b9755e783e..0000000000 --- a/apps/web/ce/components/projects/navigation/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./helper"; diff --git a/apps/web/ce/components/projects/settings/intake/index.ts b/apps/web/ce/components/projects/settings/intake/index.ts deleted file mode 100644 index 49ac70fe21..0000000000 --- a/apps/web/ce/components/projects/settings/intake/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./header"; diff --git a/apps/web/ce/components/projects/teamspaces/index.ts b/apps/web/ce/components/projects/teamspaces/index.ts deleted file mode 100644 index 968205a9b1..0000000000 --- a/apps/web/ce/components/projects/teamspaces/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./teamspace-list"; diff --git a/apps/web/core/components/core/app-header.tsx b/apps/web/core/components/core/app-header.tsx index a63d5ab937..515165347c 100644 --- a/apps/web/core/components/core/app-header.tsx +++ b/apps/web/core/components/core/app-header.tsx @@ -5,7 +5,7 @@ import { observer } from "mobx-react"; // plane imports import { Row } from "@plane/ui"; // components -import { ExtendedAppHeader } from "@/plane-web/components/common"; +import { ExtendedAppHeader } from "@/plane-web/components/common/extended-app-header"; export interface AppHeaderProps { header: ReactNode; diff --git a/apps/web/core/components/inbox/content/issue-root.tsx b/apps/web/core/components/inbox/content/issue-root.tsx index 095d466b3c..390aed13a7 100644 --- a/apps/web/core/components/inbox/content/issue-root.tsx +++ b/apps/web/core/components/inbox/content/issue-root.tsx @@ -26,7 +26,7 @@ import { useProjectInbox } from "@/hooks/store/use-project-inbox"; import { useUser } from "@/hooks/store/user"; import useReloadConfirmations from "@/hooks/use-reload-confirmation"; // store types -import { DeDupeIssuePopoverRoot } from "@/plane-web/components/de-dupe"; +import { DeDupeIssuePopoverRoot } from "@/plane-web/components/de-dupe/duplicate-popover"; import { useDebouncedDuplicateIssues } from "@/plane-web/hooks/use-debounced-duplicate-issues"; // services import { IntakeWorkItemVersionService } from "@/services/inbox"; diff --git a/apps/web/core/components/inbox/modals/create-modal/create-root.tsx b/apps/web/core/components/inbox/modals/create-modal/create-root.tsx index d8d09247c9..66eb349ae4 100644 --- a/apps/web/core/components/inbox/modals/create-modal/create-root.tsx +++ b/apps/web/core/components/inbox/modals/create-modal/create-root.tsx @@ -19,7 +19,8 @@ import { useAppRouter } from "@/hooks/use-app-router"; import useKeypress from "@/hooks/use-keypress"; import { usePlatformOS } from "@/hooks/use-platform-os"; // plane web imports -import { DeDupeButtonRoot, DuplicateModalRoot } from "@/plane-web/components/de-dupe"; +import { DeDupeButtonRoot } from "@/plane-web/components/de-dupe/de-dupe-button"; +import { DuplicateModalRoot } from "@/plane-web/components/de-dupe/duplicate-modal"; import { useDebouncedDuplicateIssues } from "@/plane-web/hooks/use-debounced-duplicate-issues"; // services import { FileService } from "@/services/file.service"; diff --git a/apps/web/core/components/issues/issue-detail-widgets/relations/content.tsx b/apps/web/core/components/issues/issue-detail-widgets/relations/content.tsx index 7ace014ca2..f5862a7052 100644 --- a/apps/web/core/components/issues/issue-detail-widgets/relations/content.tsx +++ b/apps/web/core/components/issues/issue-detail-widgets/relations/content.tsx @@ -10,7 +10,7 @@ import { CreateUpdateIssueModal } from "@/components/issues/issue-modal/modal"; // hooks import { useIssueDetail } from "@/hooks/store/use-issue-detail"; // Plane-web -import { CreateUpdateEpicModal } from "@/plane-web/components/epics"; +import { CreateUpdateEpicModal } from "@/plane-web/components/epics/epic-modal"; import { useTimeLineRelationOptions } from "@/plane-web/components/relations"; import { TIssueRelationTypes } from "@/plane-web/types"; // helper diff --git a/apps/web/core/components/issues/issue-detail/main-content.tsx b/apps/web/core/components/issues/issue-detail/main-content.tsx index 5cd7438de0..8535cc4d8d 100644 --- a/apps/web/core/components/issues/issue-detail/main-content.tsx +++ b/apps/web/core/components/issues/issue-detail/main-content.tsx @@ -16,7 +16,7 @@ import { useUser } from "@/hooks/store/user"; import useReloadConfirmations from "@/hooks/use-reload-confirmation"; import useSize from "@/hooks/use-window-size"; // plane web components -import { DeDupeIssuePopoverRoot } from "@/plane-web/components/de-dupe"; +import { DeDupeIssuePopoverRoot } from "@/plane-web/components/de-dupe/duplicate-popover"; import { IssueTypeSwitcher } from "@/plane-web/components/issues/issue-details/issue-type-switcher"; import { useDebouncedDuplicateIssues } from "@/plane-web/hooks/use-debounced-duplicate-issues"; // services diff --git a/apps/web/core/components/issues/issue-modal/form.tsx b/apps/web/core/components/issues/issue-modal/form.tsx index 9196bb7c42..b84ce03a00 100644 --- a/apps/web/core/components/issues/issue-modal/form.tsx +++ b/apps/web/core/components/issues/issue-modal/form.tsx @@ -40,7 +40,8 @@ import { useWorkspaceDraftIssues } from "@/hooks/store/workspace-draft"; import { usePlatformOS } from "@/hooks/use-platform-os"; import { useProjectIssueProperties } from "@/hooks/use-project-issue-properties"; // plane web imports -import { DeDupeButtonRoot, DuplicateModalRoot } from "@/plane-web/components/de-dupe"; +import { DeDupeButtonRoot } from "@/plane-web/components/de-dupe/de-dupe-button"; +import { DuplicateModalRoot } from "@/plane-web/components/de-dupe/duplicate-modal"; import { IssueTypeSelect, WorkItemTemplateSelect } from "@/plane-web/components/issues/issue-modal"; import { WorkItemModalAdditionalProperties } from "@/plane-web/components/issues/issue-modal/modal-additional-properties"; import { useDebouncedDuplicateIssues } from "@/plane-web/hooks/use-debounced-duplicate-issues"; diff --git a/apps/web/core/components/issues/peek-overview/issue-detail.tsx b/apps/web/core/components/issues/peek-overview/issue-detail.tsx index fc3df13586..781aa623cf 100644 --- a/apps/web/core/components/issues/peek-overview/issue-detail.tsx +++ b/apps/web/core/components/issues/peek-overview/issue-detail.tsx @@ -14,7 +14,7 @@ import { useProject } from "@/hooks/store/use-project"; import { useUser } from "@/hooks/store/user"; import useReloadConfirmations from "@/hooks/use-reload-confirmation"; // plane web components -import { DeDupeIssuePopoverRoot } from "@/plane-web/components/de-dupe"; +import { DeDupeIssuePopoverRoot } from "@/plane-web/components/de-dupe/duplicate-popover"; import { IssueTypeSwitcher } from "@/plane-web/components/issues/issue-details/issue-type-switcher"; // plane web hooks import { useDebouncedDuplicateIssues } from "@/plane-web/hooks/use-debounced-duplicate-issues"; diff --git a/apps/web/core/components/settings/sidebar/header.tsx b/apps/web/core/components/settings/sidebar/header.tsx index 0e8a22935a..b52d7e046a 100644 --- a/apps/web/core/components/settings/sidebar/header.tsx +++ b/apps/web/core/components/settings/sidebar/header.tsx @@ -6,7 +6,7 @@ import { WorkspaceLogo } from "@/components/workspace/logo"; // hooks import { useWorkspace } from "@/hooks/store/use-workspace"; // plane web imports -import { SubscriptionPill } from "@/plane-web/components/common"; +import { SubscriptionPill } from "@/plane-web/components/common/subscription/subscription-pill"; export const SettingsSidebarHeader = observer((props: { customHeader?: React.ReactNode }) => { const { customHeader } = props; diff --git a/apps/web/core/components/workspace/sidebar/dropdown-item.tsx b/apps/web/core/components/workspace/sidebar/dropdown-item.tsx index f15c0b3e49..f9e0ea28f9 100644 --- a/apps/web/core/components/workspace/sidebar/dropdown-item.tsx +++ b/apps/web/core/components/workspace/sidebar/dropdown-item.tsx @@ -3,15 +3,14 @@ import { observer } from "mobx-react"; import Link from "next/link"; import { useParams } from "next/navigation"; import { Check, Settings, UserPlus } from "lucide-react"; -// plane imports import { Menu } from "@headlessui/react"; +// plane imports import { EUserPermissions } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; import { IWorkspace } from "@plane/types"; import { cn, getFileURL, getUserRole } from "@plane/utils"; -// helpers // plane web imports -import { SubscriptionPill } from "@/plane-web/components/common/subscription"; +import { SubscriptionPill } from "@/plane-web/components/common/subscription/subscription-pill"; type TProps = { workspace: IWorkspace; diff --git a/apps/web/ee/components/de-dupe/index.ts b/apps/web/ee/components/de-dupe/index.ts deleted file mode 100644 index 1c66dae21d..0000000000 --- a/apps/web/ee/components/de-dupe/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "ce/components/de-dupe"; diff --git a/apps/web/ee/components/epics/index.ts b/apps/web/ee/components/epics/index.ts deleted file mode 100644 index 6cef4035fc..0000000000 --- a/apps/web/ee/components/epics/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "ce/components/epics"; diff --git a/apps/web/ee/components/projects/settings/intake/index.ts b/apps/web/ee/components/projects/settings/intake/index.ts deleted file mode 100644 index 4ffe826389..0000000000 --- a/apps/web/ee/components/projects/settings/intake/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "ce/components/projects/settings/intake"; From a2d9e70a83062902346d7e143dd1e6ed3df81ae7 Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Mon, 25 Aug 2025 02:40:06 +0530 Subject: [PATCH 014/138] fix: requirments.txt --- apps/api/requirements/base.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/api/requirements/base.txt b/apps/api/requirements/base.txt index 69f4ec8379..3913163222 100644 --- a/apps/api/requirements/base.txt +++ b/apps/api/requirements/base.txt @@ -9,6 +9,8 @@ psycopg==3.1.18 psycopg-binary==3.1.18 psycopg-c==3.1.18 dj-database-url==2.1.0 +# mongo +pymongo==4.6.3 # redis redis==5.0.4 django-redis==5.4.0 @@ -67,5 +69,3 @@ opentelemetry-instrumentation-django==0.49b1 opentelemetry-exporter-otlp==1.28.1 # OpenAPI Specification drf-spectacular==0.28.0 -# mongo -pymongo==4.6.3 \ No newline at end of file From 9a77e383cd75cdc224f4fef4943b9982b0f7e5d3 Mon Sep 17 00:00:00 2001 From: Jayash Tripathy <76092296+JayashTripathy@users.noreply.github.com> Date: Mon, 25 Aug 2025 13:38:09 +0530 Subject: [PATCH 015/138] [WEB-4751] chore: enhance URL utility functions with IP address validation and cleaned up url extraction (#7636) * feat: enhance URL utility functions with IP address validation and cleaned up the extraction utilities * fix: remove unnecessary type assertion in isLocalhost function --- packages/utils/src/url.ts | 382 +++++++++++++++++++++----------------- 1 file changed, 207 insertions(+), 175 deletions(-) diff --git a/packages/utils/src/url.ts b/packages/utils/src/url.ts index f24818a6f6..638839bb06 100644 --- a/packages/utils/src/url.ts +++ b/packages/utils/src/url.ts @@ -1,13 +1,160 @@ import tlds from "tlds"; +const PROTOCOL_REGEX = /^[a-zA-Z]+:\/\//; +const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; +const LOCALHOST_ADDRESSES = ["localhost", "127.0.0.1", "0.0.0.0"]; +const HTTP_PROTOCOL = "http://"; +const MAILTO_PROTOCOL = "mailto:"; +const DEFAULT_PROTOCOL = HTTP_PROTOCOL; +// IPv4 regex - matches 0.0.0.0 to 255.255.255.255 +const IPV4_REGEX = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/; +// IPv6 regex - comprehensive pattern for all IPv6 formats +const IPV6_REGEX = + /^(?:(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,7}:|(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,5}(?::[0-9a-fA-F]{1,4}){1,2}|(?:[0-9a-fA-F]{1,4}:){1,4}(?::[0-9a-fA-F]{1,4}){1,3}|(?:[0-9a-fA-F]{1,4}:){1,3}(?::[0-9a-fA-F]{1,4}){1,4}|(?:[0-9a-fA-F]{1,4}:){1,2}(?::[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:(?::[0-9a-fA-F]{1,4}){1,6}|:(?::[0-9a-fA-F]{1,4}){1,7}|::|fe80:(?::[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(?:ffff(?::0{1,4}){0,1}:){0,1}(?:(?:25[0-5]|(?:2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(?:25[0-5]|(?:2[0-4]|1{0,1}[0-9]){0,1}[0-9])|(?:[0-9a-fA-F]{1,4}:){1,4}:(?:(?:25[0-5]|(?:2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(?:25[0-5]|(?:2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/; + /** - * Interface representing the components of a URL. + * Checks if a string is a valid IPv4 address + * @param ip - String to validate as IPv4 + * @returns True if valid IPv4 address + */ +export function isValidIPv4(ip: string): boolean { + if (!ip || typeof ip !== "string") return false; + return IPV4_REGEX.test(ip); +} + +/** + * Checks if a string is a valid IPv6 address + * @param ip - String to validate as IPv6 + * @returns True if valid IPv6 address + */ +export function isValidIPv6(ip: string): boolean { + if (!ip || typeof ip !== "string") return false; + + // Remove brackets if present (for URL format like [::1]) + const cleanIP = ip.replace(/^\[|\]$/g, ""); + + return IPV6_REGEX.test(cleanIP); +} + +/** + * Checks if a string is a valid IP address (IPv4 or IPv6) + * @param ip - String to validate as IP address + * @returns Object with validation results + */ +export function validateIPAddress(ip: string): { + isValid: boolean; + type: "ipv4" | "ipv6" | "invalid"; + formatted?: string; +} { + if (!ip || typeof ip !== "string") { + return { isValid: false, type: "invalid" }; + } + + if (isValidIPv4(ip)) { + return { isValid: true, type: "ipv4", formatted: ip }; + } + + if (isValidIPv6(ip)) { + const formatted = ip.replace(/^\[|\]$/g, ""); // Remove brackets + return { isValid: true, type: "ipv6", formatted }; + } + + return { isValid: false, type: "invalid" }; +} + +/** + * Checks if a URL string points to a localhost address. + * @param url - The URL string to check + * @returns True if the URL points to localhost, false otherwise + */ +export function isLocalhost(url: string): boolean { + const hostname = extractHostname(url); + return LOCALHOST_ADDRESSES.includes(hostname); +} + +/** + * Extracts hostname from a URL string by removing protocol, path, query, hash, and port. + * @param url - The URL string to extract hostname from + * @returns The cleaned hostname + */ +export function extractHostname(url: string): string { + let hostname = url; + + // Remove protocol if present + if (hostname.includes("://")) { + hostname = hostname.split("://")[1]; + } + + // Remove auth credentials if present + const atIndex = hostname.indexOf("@"); + if (atIndex !== -1) { + hostname = hostname.substring(atIndex + 1); + } + + // Remove path, query, hash, and port in one pass + hostname = hostname.split("/")[0].split("?")[0].split("#")[0].split(":")[0]; + + return hostname; +} + +/** + * Extracts and validates the TLD (Top Level Domain) from a URL string. + * + * @param {string} urlString - The string to extract TLD from + * @returns {string} The valid TLD if found, empty string otherwise + * + * @description + * The function performs the following steps: + * 1. Basic validation (rejects empty strings, strings starting/ending with dots) + * 2. URL component cleaning: + * - Removes protocol (if present) + * - Removes auth credentials (if present) + * - Removes path component (everything after '/') + * - Removes query parameters (everything after '?') + * - Removes hash fragments (everything after '#') + * - Removes port numbers (everything after ':') + * 3. Validates the TLD against a list of known TLDs + * + * @example + * // Valid cases (returns the TLD) + * extractTLD('example.com') // returns 'com' + * extractTLD('sub.example.com') // returns 'com' + * extractTLD('example.com/path') // returns 'com' + * extractTLD('example.com:8080') // returns 'com' + * extractTLD('example.com?query=1') // returns 'com' + * extractTLD('example.com#hash') // returns 'com' + * + * // Invalid cases (returns empty string) + * extractTLD('') // returns '' + * extractTLD('.example.com') // returns '' + * extractTLD('example.com.') // returns '' + * extractTLD('example.invalid') // returns '' + * extractTLD('localhost') // returns '' + */ + +export function extractTLD(urlString: string): string { + if (!urlString || urlString.startsWith(".") || urlString.endsWith(".")) { + return ""; + } + + const hostname = extractHostname(urlString); + const hostnameParts = hostname.split("."); + + if (hostnameParts.length >= 2) { + const potentialTLD = hostnameParts[hostnameParts.length - 1].toLowerCase(); + return tlds.includes(potentialTLD) ? potentialTLD : ""; + } + return ""; +} + +/** + * Interface representing the cleaned components of a URL. * @interface IURLComponents - * @property {string} protocol - The URL protocol (e.g., 'http', 'https'), empty if protocol is not present + * @property {string} protocol - The URL protocol (e.g., 'http', 'https'), if protocol is not present, Always contains the actual protocol used. * @property {string} subdomain - The subdomain part of the URL (e.g., 'blog' in 'blog.example.com') * @property {string} rootDomain - The root domain name (e.g., 'example' in 'blog.example.com') * @property {string} tld - The top-level domain (e.g., 'com', 'org') - * @property {string} path - The URL path including search params and hash + * @property {string} pathname - The URL path excluding search params and hash, empty if pathname is '/' * @property {URL} full - The original URL object with all native URL properties */ export interface IURLComponents { @@ -15,10 +162,42 @@ export interface IURLComponents { subdomain: string; rootDomain: string; tld: string; - path: string; + pathname: string; full: URL; } +/** + * Process a URL object to extract its components + */ +export function processURL(url: URL): IURLComponents { + const protocol = url.protocol.slice(0, -1); + const hostnameParts = url.hostname.split("."); + + let subdomain = ""; + let rootDomain = ""; + let tld = ""; + + if (hostnameParts.length === 1) { + rootDomain = hostnameParts[0]; // For cases like 'localhost' + } else if (hostnameParts.length >= 2) { + tld = hostnameParts[hostnameParts.length - 1]; + rootDomain = hostnameParts[hostnameParts.length - 2]; + + if (hostnameParts.length > 2) { + subdomain = hostnameParts.slice(0, -2).join("."); + } + } + + return { + protocol, + subdomain, + rootDomain, + tld, + pathname: url.pathname === "/" ? "" : url.pathname, + full: url, + }; +} + /** * Extracts components from a URL object or string. * @@ -39,189 +218,42 @@ export interface IURLComponents { * // subdomain: 'blog', * // rootDomain: 'example', * // tld: 'com', - * // path: 'posts', + * // pathname: 'posts', * // full: URL {} // The parsed URL object * // } */ - export function extractURLComponents(url: URL | string): IURLComponents | undefined { - if (!url) return undefined; + // If URL object is passed directly + if (typeof url !== "string") { + return processURL(url); + } - let cleanedUrl: URL; - let wasProtocolAdded = false; + // Handle empty strings + if (!url || url.trim() === "") return undefined; + + // Input length validation for security + if (url.length > 2048) return undefined; + + const urlLower = url.toLowerCase(); try { - if (typeof url === "string") { - if (url.trim() === "") return undefined; - - // Check for valid protocol pattern: some characters followed by :// - if (/^[a-zA-Z]+:\/\//.test(url)) { - cleanedUrl = new URL(url); - } else if (hasValidTLD(url) || url.includes("localhost")) { - wasProtocolAdded = true; - cleanedUrl = new URL(`http://${url}`); - } else { - return undefined; - } - } else { - cleanedUrl = url; + // 1. Handle web URLs with protocols (including mailto, http, https, ftp, etc.) + if (PROTOCOL_REGEX.test(urlLower) || urlLower.startsWith(MAILTO_PROTOCOL)) { + return processURL(new URL(url)); } - const protocol = cleanedUrl.protocol.slice(0, -1); - const pathname = cleanedUrl.pathname.replace(/^\/+/, "").replace(/\/{2,}/g, "/"); - const path = pathname + cleanedUrl.search + cleanedUrl.hash; - const hostnameParts = cleanedUrl.hostname.split("."); - - let subdomain = ""; - let rootDomain = ""; - let tld = ""; - - if (hostnameParts.length === 1) { - rootDomain = hostnameParts[0]; // For cases like 'localhost' - } else if (hostnameParts.length >= 2) { - tld = hostnameParts[hostnameParts.length - 1]; - rootDomain = hostnameParts[hostnameParts.length - 2]; - - if (hostnameParts.length > 2) { - subdomain = hostnameParts.slice(0, -2).join("."); - } + // 2. Check if it's an email address + if (EMAIL_REGEX.test(urlLower)) { + return processURL(new URL(`${MAILTO_PROTOCOL}${url}`)); } - return { - protocol: wasProtocolAdded ? "" : protocol, - subdomain, - rootDomain, - tld, - path, - full: cleanedUrl, - }; + // 3. URL without protocol but valid domain or IP address or TLD + if (isLocalhost(urlLower) || isValidIPv4(urlLower) || isValidIPv6(urlLower) || extractTLD(urlLower)) { + return processURL(new URL(`${DEFAULT_PROTOCOL}${urlLower}`)); + } + + return undefined; } catch (error) { - console.error(`Error extracting URL components: ${url?.toString() || url}`, error); return undefined; } } - -/** - * Checks if a string contains a valid TLD (Top Level Domain) by cleaning the URL and validating against known TLDs. - * - * @param {string} urlString - The string to check for valid TLD - * @returns {boolean} True if the string contains a valid TLD, false otherwise - * - * @description - * The function performs the following steps: - * 1. Basic validation (rejects empty strings, strings starting/ending with dots) - * 2. URL component cleaning: - * - Removes path component (everything after '/') - * - Removes query parameters (everything after '?') - * - Removes hash fragments (everything after '#') - * - Removes port numbers (everything after ':') - * 3. Validates the TLD against a list of known TLDs - * - * @example - * // Valid cases - * hasValidTLD('example.com') // returns true - * hasValidTLD('sub.example.com') // returns true - * hasValidTLD('example.com/path') // returns true (path is stripped) - * hasValidTLD('example.com:8080') // returns true (port is stripped) - * hasValidTLD('example.com?query=1') // returns true (query is stripped) - * hasValidTLD('example.com#hash') // returns true (hash is stripped) - * - * // Invalid cases - * hasValidTLD('') // returns false (empty string) - * hasValidTLD('.example.com') // returns false (starts with dot) - * hasValidTLD('example.com.') // returns false (ends with dot) - * hasValidTLD('example.invalid') // returns false (invalid TLD) - * hasValidTLD('localhost') // returns false (no TLD) - */ - -function hasValidTLD(urlString: string): boolean { - if (!urlString || urlString.startsWith(".") || urlString.endsWith(".")) { - return false; - } - - let hostname = urlString; - - // Remove path, query, and hash if present - const pathIndex = hostname.indexOf("/"); - if (pathIndex !== -1) { - hostname = hostname.substring(0, pathIndex); - } - - const queryIndex = hostname.indexOf("?"); - if (queryIndex !== -1) { - hostname = hostname.substring(0, queryIndex); - } - - const hashIndex = hostname.indexOf("#"); - if (hashIndex !== -1) { - hostname = hostname.substring(0, hashIndex); - } - - // Remove port if present - const portIndex = hostname.indexOf(":"); - if (portIndex !== -1) { - hostname = hostname.substring(0, portIndex); - } - - const hostnameParts = hostname.split("."); - if (hostnameParts.length >= 2) { - const potentialTLD = hostnameParts[hostnameParts.length - 1].toLowerCase(); - return tlds.includes(potentialTLD); - } - - return false; -} - -/** - * Checks if a string is a valid URL. - * - * @param {string} urlString - The string to validate as URL - * @returns {URL | undefined} URL object if valid, undefined if invalid - * - * @example - * // Valid URLs - * isUrlValid('https://example.com') // returns true - * isUrlValid('http://example.com') // returns true - * isUrlValid('https://sub.example.com') // returns true - * - * // Invalid URLs - * isUrlValid('not-a-url') // returns false - * isUrlValid('https://invalid.') // returns false - * isUrlValid('example.invalid') // returns false (invalid TLD) - * - * // Test cases: - * // isUrlValid('google.com') // ✅ returns true - * // isUrlValid('github.io') // ✅ returns true - * // isUrlValid('invalid.tld') // ❌ returns false (invalid TLD) - */ - -export function isUrlValid(urlString: string): boolean { - // Basic input validation - if (!urlString || urlString.trim() === "") return false; - - // Handle localhost separately - if (urlString.startsWith("localhost")) { - try { - new URL(`http://${urlString}`); - return true; - } catch { - return false; - } - } - - // Check for valid protocol format if protocol is present - if (urlString.includes("://")) { - // Reject invalid protocol formats (e.g. "://example.com") - if (!/^[a-zA-Z]+:\/\//.test(urlString)) return false; - try { - const url = new URL(urlString); - return !!url.hostname && url.hostname !== ".com"; - } catch { - return false; - } - } - - if (hasValidTLD(urlString)) return true; - - return false; -} From bbc465a3b2a8fdaf4f2cf6f847873979ab9a7c57 Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Mon, 25 Aug 2025 15:28:58 +0530 Subject: [PATCH 016/138] [WEB-4761] fix: old url redirection method #7638 --- .../(detail)/[projectId]/issues/(detail)/[issueId]/page.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/issues/(detail)/[issueId]/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/issues/(detail)/[issueId]/page.tsx index 22728d5e36..e63f7282ab 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/issues/(detail)/[issueId]/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/issues/(detail)/[issueId]/page.tsx @@ -2,7 +2,7 @@ import { useEffect } from "react"; import { observer } from "mobx-react"; -import { redirect, useParams } from "next/navigation"; +import { useParams } from "next/navigation"; import { useTheme } from "next-themes"; import useSWR from "swr"; import { useTranslation } from "@plane/i18n"; @@ -34,7 +34,7 @@ const IssueDetailsPage = observer(() => { useEffect(() => { if (data) { - redirect(`/${workspaceSlug}/browse/${data.project_identifier}-${data.sequence_id}`); + router.push(`/${workspaceSlug}/browse/${data.project_identifier}-${data.sequence_id}`); } }, [workspaceSlug, data]); From b6cf3a5a8ba3328185481f468ab9b0dac291643c Mon Sep 17 00:00:00 2001 From: Jayash Tripathy <76092296+JayashTripathy@users.noreply.github.com> Date: Mon, 25 Aug 2025 19:25:42 +0530 Subject: [PATCH 017/138] [WEB-4438] fix: epics label in y axis of epics(analytics-modal) #7644 --- .../components/analytics/select/analytics-params.tsx | 8 ++++++-- .../analytics/work-items/customized-insights.tsx | 11 ++++------- .../components/analytics/work-items/modal/content.tsx | 5 +++-- .../components/analytics/work-items/modal/index.tsx | 1 + packages/constants/src/analytics/common.ts | 4 ++++ packages/types/src/analytics.ts | 1 + 6 files changed, 19 insertions(+), 11 deletions(-) diff --git a/apps/web/core/components/analytics/select/analytics-params.tsx b/apps/web/core/components/analytics/select/analytics-params.tsx index f3af96a595..edcebf78b2 100644 --- a/apps/web/core/components/analytics/select/analytics-params.tsx +++ b/apps/web/core/components/analytics/select/analytics-params.tsx @@ -16,10 +16,11 @@ type Props = { params: IAnalyticsParams; workspaceSlug: string; classNames?: string; + isEpic?: boolean; }; export const AnalyticsSelectParams: React.FC = observer((props) => { - const { control, params, classNames } = props; + const { control, params, classNames, isEpic } = props; const xAxisOptions = useMemo( () => ANALYTICS_X_AXIS_VALUES.filter((option) => option.value !== params.group_by), [params.group_by] @@ -42,7 +43,10 @@ export const AnalyticsSelectParams: React.FC = observer((props) => { onChange(val); }} options={ANALYTICS_Y_AXIS_VALUES} - hiddenOptions={[ChartYAxisMetric.ESTIMATE_POINT_COUNT]} + hiddenOptions={[ + ChartYAxisMetric.ESTIMATE_POINT_COUNT, + isEpic ? ChartYAxisMetric.WORK_ITEM_COUNT : ChartYAxisMetric.EPIC_WORK_ITEM_COUNT, + ]} /> )} /> diff --git a/apps/web/core/components/analytics/work-items/customized-insights.tsx b/apps/web/core/components/analytics/work-items/customized-insights.tsx index bafd0d8ef4..42fa6e84ca 100644 --- a/apps/web/core/components/analytics/work-items/customized-insights.tsx +++ b/apps/web/core/components/analytics/work-items/customized-insights.tsx @@ -10,17 +10,13 @@ import AnalyticsSectionWrapper from "../analytics-section-wrapper"; import { AnalyticsSelectParams } from "../select/analytics-params"; import PriorityChart from "./priority-chart"; -const defaultValues: IAnalyticsParams = { - x_axis: ChartXAxisProperty.PRIORITY, - y_axis: ChartYAxisMetric.WORK_ITEM_COUNT, -}; - -const CustomizedInsights = observer(({ peekView }: { peekView?: boolean }) => { +const CustomizedInsights = observer(({ peekView, isEpic }: { peekView?: boolean; isEpic?: boolean }) => { const { t } = useTranslation(); const { workspaceSlug } = useParams(); const { control, watch, setValue } = useForm({ defaultValues: { - ...defaultValues, + x_axis: ChartXAxisProperty.PRIORITY, + y_axis: isEpic ? ChartYAxisMetric.EPIC_WORK_ITEM_COUNT : ChartYAxisMetric.WORK_ITEM_COUNT, }, }); @@ -41,6 +37,7 @@ const CustomizedInsights = observer(({ peekView }: { peekView?: boolean }) => { setValue={setValue} params={params} workspaceSlug={workspaceSlug.toString()} + isEpic={isEpic} /> } > diff --git a/apps/web/core/components/analytics/work-items/modal/content.tsx b/apps/web/core/components/analytics/work-items/modal/content.tsx index 84188bbed6..3f590b1123 100644 --- a/apps/web/core/components/analytics/work-items/modal/content.tsx +++ b/apps/web/core/components/analytics/work-items/modal/content.tsx @@ -17,10 +17,11 @@ type Props = { projectDetails: IProject | undefined; cycleDetails: ICycle | undefined; moduleDetails: IModule | undefined; + isEpic?: boolean; }; export const WorkItemsModalMainContent: React.FC = observer((props) => { - const { projectDetails, cycleDetails, moduleDetails, fullScreen } = props; + const { projectDetails, cycleDetails, moduleDetails, fullScreen, isEpic } = props; const { updateSelectedProjects, updateSelectedCycle, updateSelectedModule, updateIsPeekView } = useAnalytics(); const [isModalConfigured, setIsModalConfigured] = useState(false); @@ -72,7 +73,7 @@ export const WorkItemsModalMainContent: React.FC = observer((props) => {
- +
diff --git a/apps/web/core/components/analytics/work-items/modal/index.tsx b/apps/web/core/components/analytics/work-items/modal/index.tsx index 2ff0809bc2..895e23eed2 100644 --- a/apps/web/core/components/analytics/work-items/modal/index.tsx +++ b/apps/web/core/components/analytics/work-items/modal/index.tsx @@ -61,6 +61,7 @@ export const WorkItemsModal: React.FC = observer((props) => { projectDetails={projectDetails} cycleDetails={cycleDetails} moduleDetails={moduleDetails} + isEpic={isEpic} />
diff --git a/packages/constants/src/analytics/common.ts b/packages/constants/src/analytics/common.ts index 001391314d..2590036c28 100644 --- a/packages/constants/src/analytics/common.ts +++ b/packages/constants/src/analytics/common.ts @@ -174,6 +174,10 @@ export const ANALYTICS_Y_AXIS_VALUES: { value: ChartYAxisMetric; label: string } value: ChartYAxisMetric.ESTIMATE_POINT_COUNT, label: "Estimate", }, + { + value: ChartYAxisMetric.EPIC_WORK_ITEM_COUNT, + label: "Epic", + }, ]; export const ANALYTICS_V2_DATE_KEYS = ["completed_at", "target_date", "start_date", "created_at"]; diff --git a/packages/types/src/analytics.ts b/packages/types/src/analytics.ts index e66794f7c3..ace60f7c32 100644 --- a/packages/types/src/analytics.ts +++ b/packages/types/src/analytics.ts @@ -28,6 +28,7 @@ export enum ChartYAxisMetric { WORK_ITEM_DUE_THIS_WEEK_COUNT = "WORK_ITEM_DUE_THIS_WEEK_COUNT", WORK_ITEM_DUE_TODAY_COUNT = "WORK_ITEM_DUE_TODAY_COUNT", BLOCKED_WORK_ITEM_COUNT = "BLOCKED_WORK_ITEM_COUNT", + EPIC_WORK_ITEM_COUNT = "EPIC_WORK_ITEM_COUNT", } export type TAnalyticsTabsBase = "overview" | "work-items"; From eb5ac2fc2d5608d0cf7580ef09fe7975d694ead4 Mon Sep 17 00:00:00 2001 From: Lakhan Baheti <94619783+1akhanBaheti@users.noreply.github.com> Date: Tue, 26 Aug 2025 02:12:04 +0530 Subject: [PATCH 018/138] [WIKI-602] chore: disable image alignment tooltip for touch devices (#7642) * chore: disable image alignment tooltip for touch devices * chore: added touch-select-none style --- .../custom-image/components/toolbar/alignment.tsx | 7 ++++--- .../extensions/custom-image/components/toolbar/root.tsx | 1 + packages/editor/src/styles/editor.css | 6 ++++++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/editor/src/core/extensions/custom-image/components/toolbar/alignment.tsx b/packages/editor/src/core/extensions/custom-image/components/toolbar/alignment.tsx index 3790fa5471..dbbc42e4cf 100644 --- a/packages/editor/src/core/extensions/custom-image/components/toolbar/alignment.tsx +++ b/packages/editor/src/core/extensions/custom-image/components/toolbar/alignment.tsx @@ -10,11 +10,12 @@ import { IMAGE_ALIGNMENT_OPTIONS } from "../../utils"; type Props = { activeAlignment: TCustomImageAlignment; handleChange: (alignment: TCustomImageAlignment) => void; + isTouchDevice: boolean; toggleToolbarViewStatus: (val: boolean) => void; }; export const ImageAlignmentAction: React.FC = (props) => { - const { activeAlignment, handleChange, toggleToolbarViewStatus } = props; + const { activeAlignment, handleChange, isTouchDevice, toggleToolbarViewStatus } = props; // states const [isDropdownOpen, setIsDropdownOpen] = useState(false); // refs @@ -30,7 +31,7 @@ export const ImageAlignmentAction: React.FC = (props) => { return (
- +
- - - - + +
+ {ActiveExtension ? ( + + ) : showNavigationTabs ? ( + + + + + ) : null} +
); }); diff --git a/apps/web/core/components/pages/navigation-pane/types/extensions.ts b/apps/web/core/components/pages/navigation-pane/types/extensions.ts new file mode 100644 index 0000000000..7460483b9c --- /dev/null +++ b/apps/web/core/components/pages/navigation-pane/types/extensions.ts @@ -0,0 +1,21 @@ +import { ReactNode } from "react"; +import { EPageStoreType } from "@/plane-web/hooks/store"; +import { TPageInstance } from "@/store/pages/base-page"; + +export interface INavigationPaneExtensionProps { + page: TPageInstance; + extensionData?: T; + storeType: EPageStoreType; +} + +export interface INavigationPaneExtensionComponent { + (props: INavigationPaneExtensionProps): ReactNode; +} + +export interface INavigationPaneExtension { + id: string; + triggerParam: string; + component: INavigationPaneExtensionComponent; + data?: T; + width?: number; +} diff --git a/apps/web/core/components/pages/navigation-pane/types/index.ts b/apps/web/core/components/pages/navigation-pane/types/index.ts new file mode 100644 index 0000000000..fd10e53821 --- /dev/null +++ b/apps/web/core/components/pages/navigation-pane/types/index.ts @@ -0,0 +1,6 @@ +// Export generic extension system interfaces +export type { + INavigationPaneExtensionProps, + INavigationPaneExtensionComponent, + INavigationPaneExtension, +} from "./extensions"; diff --git a/apps/web/core/components/pages/version/editor.tsx b/apps/web/core/components/pages/version/editor.tsx index f09f3724ea..412b80c0c0 100644 --- a/apps/web/core/components/pages/version/editor.tsx +++ b/apps/web/core/components/pages/version/editor.tsx @@ -9,10 +9,13 @@ import { DocumentEditor } from "@/components/editor/document/editor"; // hooks import { useWorkspace } from "@/hooks/store/use-workspace"; import { usePageFilters } from "@/hooks/use-page-filters"; +// plane web hooks +import { EPageStoreType } from "@/plane-web/hooks/store"; export type TVersionEditorProps = { activeVersion: string | null; versionDetails: TPageVersion | undefined; + storeType: EPageStoreType; }; export const PagesVersionEditor: React.FC = observer((props) => { diff --git a/apps/web/core/components/pages/version/main-content.tsx b/apps/web/core/components/pages/version/main-content.tsx index 40c861b698..100fa9b0a9 100644 --- a/apps/web/core/components/pages/version/main-content.tsx +++ b/apps/web/core/components/pages/version/main-content.tsx @@ -6,6 +6,8 @@ import { EyeIcon, TriangleAlert } from "lucide-react"; import { TPageVersion } from "@plane/types"; import { Button, setToast, TOAST_TYPE } from "@plane/ui"; import { renderFormattedDate, renderFormattedTime } from "@plane/utils"; +// helpers +import { EPageStoreType } from "@/plane-web/hooks/store"; // local imports import { TVersionEditorProps } from "./editor"; @@ -17,11 +19,20 @@ type Props = { handleRestore: (descriptionHTML: string) => Promise; pageId: string; restoreEnabled: boolean; + storeType: EPageStoreType; }; export const PageVersionsMainContent: React.FC = observer((props) => { - const { activeVersion, editorComponent, fetchVersionDetails, handleClose, handleRestore, pageId, restoreEnabled } = - props; + const { + activeVersion, + editorComponent, + fetchVersionDetails, + handleClose, + handleRestore, + pageId, + restoreEnabled, + storeType, + } = props; // states const [isRestoring, setIsRestoring] = useState(false); const [isRetrying, setIsRetrying] = useState(false); @@ -107,7 +118,7 @@ export const PageVersionsMainContent: React.FC = observer((props) => { )}
- +
)} diff --git a/apps/web/core/components/pages/version/root.tsx b/apps/web/core/components/pages/version/root.tsx index df2f39942d..4ad00f3cc7 100644 --- a/apps/web/core/components/pages/version/root.tsx +++ b/apps/web/core/components/pages/version/root.tsx @@ -6,6 +6,8 @@ import { TPageVersion } from "@plane/types"; import { cn } from "@plane/utils"; // hooks import { useQueryParams } from "@/hooks/use-query-params"; +// plane web imports +import { EPageStoreType } from "@/plane-web/hooks/store"; // local imports import { PAGE_NAVIGATION_PANE_VERSION_QUERY_PARAM, PAGE_NAVIGATION_PANE_WIDTH } from "../navigation-pane"; import { TVersionEditorProps } from "./editor"; @@ -17,10 +19,11 @@ type Props = { handleRestore: (descriptionHTML: string) => Promise; pageId: string; restoreEnabled: boolean; + storeType: EPageStoreType; }; export const PageVersionsOverlay: React.FC = observer((props) => { - const { editorComponent, fetchVersionDetails, handleRestore, pageId, restoreEnabled } = props; + const { editorComponent, fetchVersionDetails, handleRestore, pageId, restoreEnabled, storeType } = props; // navigation const router = useRouter(); const searchParams = useSearchParams(); @@ -57,6 +60,7 @@ export const PageVersionsOverlay: React.FC = observer((props) => { handleRestore={handleRestore} pageId={pageId} restoreEnabled={restoreEnabled} + storeType={storeType} />
); diff --git a/apps/web/core/services/page/project-page-version.service.ts b/apps/web/core/services/page/project-page-version.service.ts index 2f973f0fa1..1491cf37f9 100644 --- a/apps/web/core/services/page/project-page-version.service.ts +++ b/apps/web/core/services/page/project-page-version.service.ts @@ -30,4 +30,14 @@ export class ProjectPageVersionService extends APIService { throw error?.response?.data; }); } + + async restoreVersion(workspaceSlug: string, projectId: string, pageId: string, versionId: string): Promise { + return this.post( + `/api/workspaces/${workspaceSlug}/projects/${projectId}/pages/${pageId}/versions/${versionId}/restore/` + ) + .then((response) => response?.data) + .catch((error) => { + throw error?.response?.data; + }); + } } diff --git a/apps/web/core/store/pages/base-page.ts b/apps/web/core/store/pages/base-page.ts index f80856bac4..2835da3a4d 100644 --- a/apps/web/core/store/pages/base-page.ts +++ b/apps/web/core/store/pages/base-page.ts @@ -93,6 +93,7 @@ export class BasePage extends ExtendedBasePage implements TBasePage { updated_by: string | undefined; created_at: Date | undefined; updated_at: Date | undefined; + deleted_at: Date | undefined; // helpers oldName: string = ""; // services @@ -130,6 +131,7 @@ export class BasePage extends ExtendedBasePage implements TBasePage { this.created_at = page?.created_at || undefined; this.updated_at = page?.updated_at || undefined; this.oldName = page?.name || ""; + this.deleted_at = page?.deleted_at || undefined; makeObservable(this, { // loaders @@ -153,6 +155,7 @@ export class BasePage extends ExtendedBasePage implements TBasePage { updated_by: observable.ref, created_at: observable.ref, updated_at: observable.ref, + deleted_at: observable.ref, // helpers oldName: observable.ref, setIsSubmitting: action, @@ -227,6 +230,7 @@ export class BasePage extends ExtendedBasePage implements TBasePage { updated_by: this.updated_by, created_at: this.created_at, updated_at: this.updated_at, + deleted_at: this.deleted_at, ...this.asJSONExtended, }; } diff --git a/packages/editor/src/ce/components/document-editor-side-effects.ts b/packages/editor/src/ce/components/document-editor-side-effects.ts new file mode 100644 index 0000000000..36a180a12e --- /dev/null +++ b/packages/editor/src/ce/components/document-editor-side-effects.ts @@ -0,0 +1,12 @@ +import { type Editor } from "@tiptap/core"; +import type { ReactElement } from "react"; +import type { IEditorPropsExtended } from "@/types"; + +export type DocumentEditorSideEffectsProps = { + editor: Editor; + id: string; + updatePageProperties?: unknown; + extendedEditorProps?: IEditorPropsExtended; +}; + +export const DocumentEditorSideEffects = (_props: DocumentEditorSideEffectsProps): ReactElement | null => null; diff --git a/packages/editor/src/ce/types/editor-extended.ts b/packages/editor/src/ce/types/editor-extended.ts new file mode 100644 index 0000000000..98f9c7ece8 --- /dev/null +++ b/packages/editor/src/ce/types/editor-extended.ts @@ -0,0 +1,9 @@ +export type IEditorExtensionOptions = unknown; + +export type IEditorPropsExtended = unknown; + +export type TExtendedEditorCommands = never; + +export type TExtendedCommandExtraProps = unknown; + +export type TExtendedEditorRefApi = unknown; diff --git a/packages/editor/src/ce/types/index.ts b/packages/editor/src/ce/types/index.ts index f30596cb00..7efa23c054 100644 --- a/packages/editor/src/ce/types/index.ts +++ b/packages/editor/src/ce/types/index.ts @@ -1 +1,2 @@ export * from "./issue-embed"; +export * from "./editor-extended"; 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 535f1b6ba1..038184204e 100644 --- a/packages/editor/src/core/components/editors/document/collaborative-editor.tsx +++ b/packages/editor/src/core/components/editors/document/collaborative-editor.tsx @@ -12,6 +12,8 @@ import { WorkItemEmbedExtension } from "@/extensions"; 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"; @@ -27,6 +29,7 @@ const CollaborativeDocumentEditor: React.FC = editable, editorClassName = "", editorProps, + extendedEditorProps, embedHandler, fileHandler, flaggedExtensions, @@ -97,20 +100,23 @@ const CollaborativeDocumentEditor: React.FC = if (!editor) return null; return ( - + <> + + + ); }; diff --git a/packages/editor/src/core/types/editor.ts b/packages/editor/src/core/types/editor.ts index ed26bbbdac..33fb71f6c3 100644 --- a/packages/editor/src/core/types/editor.ts +++ b/packages/editor/src/core/types/editor.ts @@ -5,6 +5,8 @@ import type { EditorProps, EditorView } from "@tiptap/pm/view"; import type { NodeViewProps as TNodeViewProps } from "@tiptap/react"; // extension types import type { TTextAlign } from "@/extensions"; +// plane editor imports +import type { IEditorPropsExtended, TExtendedEditorCommands } from "@/plane-editor/types/editor-extended"; // types import type { IMarking, @@ -50,7 +52,8 @@ export type TEditorCommands = | "callout" | "attachment" | "emoji" - | "external-embed"; + | "external-embed" + | TExtendedEditorCommands; export type TCommandExtraProps = { image: { @@ -157,6 +160,7 @@ export type IEditorProps = { placeholder?: string | ((isFocused: boolean, value: string) => string); tabIndex?: number; value?: string | null; + extendedEditorProps: IEditorPropsExtended; }; export type ILiteTextEditorProps = IEditorProps; diff --git a/packages/editor/src/core/types/index.ts b/packages/editor/src/core/types/index.ts index cfa67ba973..d3a12bfb5c 100644 --- a/packages/editor/src/core/types/index.ts +++ b/packages/editor/src/core/types/index.ts @@ -8,5 +8,6 @@ export * from "./extensions"; export * from "./hook"; export * from "./mention"; export * from "./slash-commands-suggestion"; -export * from "@/plane-editor/types"; export * from "./document-collaborative-events"; + +export * from "@/plane-editor/types"; diff --git a/packages/types/src/editor/editor-content.ts b/packages/types/src/editor/editor-content.ts new file mode 100644 index 0000000000..bb720c2e97 --- /dev/null +++ b/packages/types/src/editor/editor-content.ts @@ -0,0 +1,20 @@ +/** + * Editor content types - locally defined to avoid external dependencies + */ + +export type JSONContent = { + type?: string; + attrs?: Record; + content?: JSONContent[]; + marks?: { + type: string; + attrs?: Record; + [key: string]: unknown; + }[]; + text?: string; + [key: string]: unknown; +}; + +export type HTMLContent = string; + +export type Content = HTMLContent | JSONContent | JSONContent[] | null; diff --git a/packages/types/src/editor/index.ts b/packages/types/src/editor/index.ts new file mode 100644 index 0000000000..841ec3255e --- /dev/null +++ b/packages/types/src/editor/index.ts @@ -0,0 +1 @@ +export type { JSONContent, HTMLContent, Content } from "./editor-content"; diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index ae35062e58..2a63141b14 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -28,6 +28,7 @@ export * from "./waitlist"; export * from "./webhook"; export * from "./workspace-views"; export * from "./common"; +export * from "./editor"; export * from "./pragmatic"; export * from "./publish"; export * from "./search"; diff --git a/packages/types/src/issues/activity/issue_comment.ts b/packages/types/src/issues/activity/issue_comment.ts index 9507a49349..f5db3679e2 100644 --- a/packages/types/src/issues/activity/issue_comment.ts +++ b/packages/types/src/issues/activity/issue_comment.ts @@ -1,3 +1,4 @@ +import { JSONContent } from "../../editor"; import { EIssueCommentAccessSpecifier } from "../../enums"; import { TFileSignedURLResponse } from "../../file"; import { IUserLite } from "../../users"; @@ -34,7 +35,7 @@ export type TIssueComment = { comment_reactions: any[]; comment_stripped: string; comment_html: string; - comment_json: object; + comment_json: JSONContent; external_id: string | undefined; external_source: string | undefined; access: EIssueCommentAccessSpecifier; diff --git a/packages/types/src/page/core.ts b/packages/types/src/page/core.ts index 6e399c7687..9351d7d272 100644 --- a/packages/types/src/page/core.ts +++ b/packages/types/src/page/core.ts @@ -21,6 +21,7 @@ export type TPage = { updated_by: string | undefined; workspace: string | undefined; logo_props: TLogoProps | undefined; + deleted_at: Date | undefined; } & TPageExtended; // page filters diff --git a/packages/utils/src/string.ts b/packages/utils/src/string.ts index dc7c44b02a..fdd0a73496 100644 --- a/packages/utils/src/string.ts +++ b/packages/utils/src/string.ts @@ -1,3 +1,4 @@ +import type { Content, JSONContent } from "@plane/types"; import DOMPurify from "isomorphic-dompurify"; /** @@ -161,14 +162,86 @@ export const isEmptyHtmlString = (htmlString: string, allowedHTMLTags: string[] }; /** - * @description this function returns whether a comment is empty or not by checking for the following conditions- - * 1. If comment is undefined - * 2. If comment is an empty string - * 3. If comment is "

" - * @param {string | undefined} comment + * @description + * Check if a JSONContent object is empty + * @param {JSONContent} content * @returns {boolean} */ -export const isCommentEmpty = (comment: string | undefined): boolean => { +const isJSONContentEmpty = (content: JSONContent): boolean => { + // If it has text, check if text is meaningful + if (content.text !== undefined) { + return !content.text || content.text.trim() === ""; + } + + // If it has no content array, consider it empty + if (!content.content || content.content.length === 0) { + // Special case: empty paragraph nodes should be considered empty + if (content.type === "paragraph" || content.type === "doc") { + return true; + } + // For other node types without content (like hard breaks), check if they're meaningful + return ( + content.type !== "hardBreak" && + content.type !== "image" && + content.type !== "mention-component" && + content.type !== "image-component" + ); + } + + // Check if all nested content is empty + return content.content.every(isJSONContentEmpty); +}; + +/** + * @description + * This function will check if the comment is empty or not. + * It returns true if comment is empty. + * Now supports TipTap Content types (HTMLContent, JSONContent, JSONContent[], null) + * + * For HTML content: + * 1. If comment is undefined/null + * 2. If comment is an empty string + * 3. If comment is "

" + * 4. If comment contains only empty HTML tags + * + * For JSON content: + * 1. If content is null/undefined + * 2. If content has no meaningful text or nested content + * 3. If all nested content is empty + * + * @param {Content} comment - TipTap Content type + * @returns {boolean} + */ +export const isCommentEmpty = (comment: Content | undefined): boolean => { + // Handle null/undefined + if (!comment) return true; + + // Handle HTMLContent (string) + if (typeof comment === "string") { + return ( + comment.trim() === "" || + comment === "

" || + isEmptyHtmlString(comment, ["img", "mention-component", "image-component"]) + ); + } + + // Handle JSONContent[] (array) + if (Array.isArray(comment)) { + return comment.length === 0 || comment.every(isJSONContentEmpty); + } + + // Handle JSONContent (object) + return isJSONContentEmpty(comment); +}; + +/** + * @description + * Legacy function for backward compatibility with string comments + * @param {string | undefined} comment + * @returns {boolean} + * @deprecated Use isCommentEmpty with Content type instead + */ +export const isStringCommentEmpty = (comment: string | undefined): boolean => { // return true if comment is undefined if (!comment) return true; return ( From d960d7ce88e8f000b1d4a993996525f9349e07cf Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Tue, 2 Sep 2025 12:29:00 +0530 Subject: [PATCH 060/138] [WEB-4828] refactor: remove legacy project-level draft work items components (#7694) --- .../[projectId]/draft-issues/header.tsx | 178 ----------- .../[projectId]/draft-issues/layout.tsx | 15 - .../[projectId]/draft-issues/page.tsx | 43 --- .../command-palette/modals/issue-level.tsx | 5 +- .../empty-states/draft-issues.tsx | 6 - .../issue-layouts/empty-states/index.tsx | 3 - .../applied-filters/roots/draft-issue.tsx | 77 ----- .../issue-layouts/kanban/base-kanban-root.tsx | 1 - .../kanban/headers/group-by-card.tsx | 6 +- .../kanban/roots/draft-issue-root.tsx | 6 - .../issue-layouts/list/base-list-root.tsx | 1 - .../list/headers/group-by-card.tsx | 5 +- .../list/roots/draft-issue-root.tsx | 14 - .../quick-action-dropdowns/all-issue.tsx | 1 - .../quick-action-dropdowns/cycle-issue.tsx | 1 - .../quick-action-dropdowns/draft-issue.tsx | 163 ---------- .../quick-action-dropdowns/helper.tsx | 7 - .../quick-action-dropdowns/index.ts | 1 - .../quick-action-dropdowns/issue-detail.tsx | 5 - .../quick-action-dropdowns/module-issue.tsx | 1 - .../quick-action-dropdowns/project-issue.tsx | 8 +- .../roots/draft-issue-layout-root.tsx | 70 ----- .../components/issues/issue-modal/base.tsx | 7 +- .../components/issues/peek-overview/root.tsx | 2 +- .../workspace/sidebar/quick-actions.tsx | 1 + apps/web/core/hooks/store/use-issues.ts | 10 - apps/web/core/hooks/use-group-dragndrop.ts | 1 - apps/web/core/hooks/use-issues-actions.tsx | 73 ----- apps/web/core/services/issue/index.ts | 1 - .../services/issue/issue_draft.service.ts | 58 ---- .../core/store/issue/draft/filter.store.ts | 279 ------------------ apps/web/core/store/issue/draft/index.ts | 2 - .../web/core/store/issue/draft/issue.store.ts | 186 ------------ .../store/issue/helpers/base-issues.store.ts | 54 +--- .../store/issue/issue-details/issue.store.ts | 19 +- .../store/issue/issue-details/root.store.ts | 8 +- apps/web/core/store/issue/root.store.ts | 10 - packages/types/src/issues/issue.ts | 1 - 38 files changed, 16 insertions(+), 1313 deletions(-) delete mode 100644 apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/draft-issues/header.tsx delete mode 100644 apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/draft-issues/layout.tsx delete mode 100644 apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/draft-issues/page.tsx delete mode 100644 apps/web/core/components/issues/issue-layouts/empty-states/draft-issues.tsx delete mode 100644 apps/web/core/components/issues/issue-layouts/filters/applied-filters/roots/draft-issue.tsx delete mode 100644 apps/web/core/components/issues/issue-layouts/kanban/roots/draft-issue-root.tsx delete mode 100644 apps/web/core/components/issues/issue-layouts/list/roots/draft-issue-root.tsx delete mode 100644 apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/draft-issue.tsx delete mode 100644 apps/web/core/components/issues/issue-layouts/roots/draft-issue-layout-root.tsx delete mode 100644 apps/web/core/services/issue/issue_draft.service.ts delete mode 100644 apps/web/core/store/issue/draft/filter.store.ts delete mode 100644 apps/web/core/store/issue/draft/index.ts delete mode 100644 apps/web/core/store/issue/draft/issue.store.ts diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/draft-issues/header.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/draft-issues/header.tsx deleted file mode 100644 index 1430fc0928..0000000000 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/draft-issues/header.tsx +++ /dev/null @@ -1,178 +0,0 @@ -"use client"; - -import { FC, useCallback } from "react"; -import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; -// plane constants -import { EIssueFilterType, ISSUE_DISPLAY_FILTERS_BY_PAGE } from "@plane/constants"; -// i18n -import { useTranslation } from "@plane/i18n"; -// types -import { - EIssuesStoreType, - IIssueDisplayFilterOptions, - IIssueDisplayProperties, - IIssueFilterOptions, - EIssueLayoutTypes, -} from "@plane/types"; -// ui -import { Breadcrumbs, LayersIcon, Tooltip } from "@plane/ui"; -// components -import { isIssueFilterActive } from "@plane/utils"; -import { BreadcrumbLink } from "@/components/common/breadcrumb-link"; -import { - DisplayFiltersSelection, - FiltersDropdown, - FilterSelection, - LayoutSelection, -} from "@/components/issues/issue-layouts/filters"; -// helpers -// hooks -import { useIssues } from "@/hooks/store/use-issues"; -import { useLabel } from "@/hooks/store/use-label"; -import { useMember } from "@/hooks/store/use-member"; -import { useProject } from "@/hooks/store/use-project"; -import { useProjectState } from "@/hooks/store/use-project-state"; -import { usePlatformOS } from "@/hooks/use-platform-os"; -// plane web -import { ProjectBreadcrumb } from "@/plane-web/components/breadcrumbs/project"; - -// FIXME: Deprecated. Remove it -export const ProjectDraftIssueHeader: FC = observer(() => { - // i18n - const { t } = useTranslation(); - // router - const { workspaceSlug, projectId } = useParams() as { workspaceSlug: string; projectId: string }; - // store hooks - const { - issuesFilter: { issueFilters, updateFilters }, - } = useIssues(EIssuesStoreType.DRAFT); - const { currentProjectDetails, loader } = useProject(); - const { projectStates } = useProjectState(); - const { projectLabels } = useLabel(); - const { - project: { projectMemberIds }, - } = useMember(); - const { isMobile } = usePlatformOS(); - const activeLayout = issueFilters?.displayFilters?.layout; - - const handleFiltersUpdate = useCallback( - (key: keyof IIssueFilterOptions, value: string | string[]) => { - if (!workspaceSlug || !projectId) return; - const newValues = issueFilters?.filters?.[key] ?? []; - - if (Array.isArray(value)) { - // this validation is majorly for the filter start_date, target_date custom - value.forEach((val) => { - if (!newValues.includes(val)) newValues.push(val); - else newValues.splice(newValues.indexOf(val), 1); - }); - } else { - if (issueFilters?.filters?.[key]?.includes(value)) newValues.splice(newValues.indexOf(value), 1); - else newValues.push(value); - } - - updateFilters(workspaceSlug, projectId, EIssueFilterType.FILTERS, { [key]: newValues }); - }, - [workspaceSlug, projectId, issueFilters, updateFilters] - ); - - const handleLayoutChange = useCallback( - (layout: EIssueLayoutTypes) => { - if (!workspaceSlug || !projectId) return; - updateFilters(workspaceSlug, projectId, EIssueFilterType.DISPLAY_FILTERS, { layout: layout }); - }, - [workspaceSlug, projectId, updateFilters] - ); - - const handleDisplayFilters = useCallback( - (updatedDisplayFilter: Partial) => { - if (!workspaceSlug || !projectId) return; - updateFilters(workspaceSlug, projectId, EIssueFilterType.DISPLAY_FILTERS, updatedDisplayFilter); - }, - [workspaceSlug, projectId, updateFilters] - ); - - const handleDisplayProperties = useCallback( - (property: Partial) => { - if (!workspaceSlug || !projectId) return; - updateFilters(workspaceSlug, projectId, EIssueFilterType.DISPLAY_PROPERTIES, property); - }, - [workspaceSlug, projectId, updateFilters] - ); - - const issueCount = undefined; - - return ( -
-
-
- - - - } - /> - } - /> - - {issueCount && issueCount > 0 ? ( - 1 ? "work items" : "work item"} in project's draft`} - position="bottom" - > - - {issueCount} - - - ) : null} -
- -
- handleLayoutChange(layout)} - selectedLayout={activeLayout} - /> - - - - - - -
-
-
- ); -}); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/draft-issues/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/draft-issues/layout.tsx deleted file mode 100644 index ec6cdc1dd7..0000000000 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/draft-issues/layout.tsx +++ /dev/null @@ -1,15 +0,0 @@ -"use client"; - -// components -import { AppHeader } from "@/components/core/app-header"; -import { ContentWrapper } from "@/components/core/content-wrapper"; -import { ProjectDraftIssueHeader } from "./header"; - -export default function ProjectDraftIssuesLayou({ children }: { children: React.ReactNode }) { - return ( - <> - } /> - {children} - - ); -} diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/draft-issues/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/draft-issues/page.tsx deleted file mode 100644 index ce91afb616..0000000000 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/draft-issues/page.tsx +++ /dev/null @@ -1,43 +0,0 @@ -"use client"; - -import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; -import { X, PenSquare } from "lucide-react"; -// components -import { PageHead } from "@/components/core/page-title"; -import { DraftIssueLayoutRoot } from "@/components/issues/issue-layouts/roots/draft-issue-layout-root"; -// hooks -import { useProject } from "@/hooks/store/use-project"; -import { useAppRouter } from "@/hooks/use-app-router"; - -const ProjectDraftIssuesPage = observer(() => { - const router = useAppRouter(); - const { workspaceSlug, projectId } = useParams(); - // store - const { getProjectById } = useProject(); - // derived values - const project = projectId ? getProjectById(projectId.toString()) : undefined; - const pageTitle = project?.name ? `${project?.name} - Draft work items` : undefined; - - return ( - <> - -
-
- -
- -
- - ); -}); - -export default ProjectDraftIssuesPage; diff --git a/apps/web/ce/components/command-palette/modals/issue-level.tsx b/apps/web/ce/components/command-palette/modals/issue-level.tsx index 843e39cfb7..b30d5ec30e 100644 --- a/apps/web/ce/components/command-palette/modals/issue-level.tsx +++ b/apps/web/ce/components/command-palette/modals/issue-level.tsx @@ -1,6 +1,6 @@ import { FC } from "react"; import { observer } from "mobx-react"; -import { useParams, usePathname } from "next/navigation"; +import { useParams } from "next/navigation"; // plane imports import { EIssueServiceType, EIssuesStoreType, TIssue } from "@plane/types"; // components @@ -22,7 +22,6 @@ export type TIssueLevelModalsProps = { export const IssueLevelModals: FC = observer((props) => { const { projectId, issueId } = props; // router - const pathname = usePathname(); const { workspaceSlug, cycleId, moduleId } = useParams(); const router = useAppRouter(); // store hooks @@ -45,7 +44,6 @@ export const IssueLevelModals: FC = observer((props) => } = useCommandPalette(); // derived values const issueDetails = issueId ? getIssueById(issueId) : undefined; - const isDraftIssue = pathname?.includes("draft-issues") || false; const { fetchSubIssues: fetchSubWorkItems } = useIssueDetail(); const { fetchSubIssues: fetchEpicSubWorkItems } = useIssueDetail(EIssueServiceType.EPICS); @@ -81,7 +79,6 @@ export const IssueLevelModals: FC = observer((props) => isOpen={isCreateIssueModalOpen} onClose={() => toggleCreateIssueModal(false)} data={getCreateIssueModalData()} - isDraft={isDraftIssue} onSubmit={handleCreateIssueSubmit} allowedProjectIds={createWorkItemAllowedProjectIds} /> diff --git a/apps/web/core/components/issues/issue-layouts/empty-states/draft-issues.tsx b/apps/web/core/components/issues/issue-layouts/empty-states/draft-issues.tsx deleted file mode 100644 index bb10176ae9..0000000000 --- a/apps/web/core/components/issues/issue-layouts/empty-states/draft-issues.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import { observer } from "mobx-react"; - -// FIXME: Project drafts is deprecated. Remove this component and all the related code. -export const ProjectDraftEmptyState: React.FC = observer(() => ( -
-)); diff --git a/apps/web/core/components/issues/issue-layouts/empty-states/index.tsx b/apps/web/core/components/issues/issue-layouts/empty-states/index.tsx index 1db3a3d8d1..ae23acb574 100644 --- a/apps/web/core/components/issues/issue-layouts/empty-states/index.tsx +++ b/apps/web/core/components/issues/issue-layouts/empty-states/index.tsx @@ -5,7 +5,6 @@ import { TeamProjectWorkItemEmptyState } from "@/plane-web/components/issues/iss // components import { ProjectArchivedEmptyState } from "./archived-issues"; import { CycleEmptyState } from "./cycle"; -import { ProjectDraftEmptyState } from "./draft-issues"; import { GlobalViewEmptyState } from "./global-view"; import { ModuleEmptyState } from "./module"; import { ProfileViewEmptyState } from "./profile-view"; @@ -29,8 +28,6 @@ export const IssueLayoutEmptyState = (props: Props) => { return ; case EIssuesStoreType.MODULE: return ; - case EIssuesStoreType.DRAFT: - return ; case EIssuesStoreType.GLOBAL: return ; case EIssuesStoreType.PROFILE: diff --git a/apps/web/core/components/issues/issue-layouts/filters/applied-filters/roots/draft-issue.tsx b/apps/web/core/components/issues/issue-layouts/filters/applied-filters/roots/draft-issue.tsx deleted file mode 100644 index 3336327c37..0000000000 --- a/apps/web/core/components/issues/issue-layouts/filters/applied-filters/roots/draft-issue.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; -// plane imports -import { EIssueFilterType } from "@plane/constants"; -import { EIssuesStoreType, IIssueFilterOptions } from "@plane/types"; -// hooks -import { useIssues } from "@/hooks/store/use-issues"; -import { useLabel } from "@/hooks/store/use-label"; -import { useProjectState } from "@/hooks/store/use-project-state"; -// local imports -import { AppliedFiltersList } from "../filters-list"; - -export const DraftIssueAppliedFiltersRoot: React.FC = observer(() => { - // router - const { workspaceSlug, projectId } = useParams() as { workspaceSlug: string; projectId: string }; - // store hooks - const { - issuesFilter: { issueFilters, updateFilters }, - } = useIssues(EIssuesStoreType.DRAFT); - const { projectLabels } = useLabel(); - const { projectStates } = useProjectState(); - // derived values - const userFilters = issueFilters?.filters; - // filters whose value not null or empty array - const appliedFilters: IIssueFilterOptions = {}; - Object.entries(userFilters ?? {}).forEach(([key, value]) => { - if (!value) return; - if (Array.isArray(value) && value.length === 0) return; - appliedFilters[key as keyof IIssueFilterOptions] = value; - }); - - const handleRemoveFilter = (key: keyof IIssueFilterOptions, value: string | null) => { - if (!workspaceSlug || !projectId) return; - - // remove all values of the key if value is null - if (!value) { - updateFilters(workspaceSlug.toString(), projectId.toString(), EIssueFilterType.FILTERS, { - [key]: null, - }); - return; - } - - // remove the passed value from the key - let newValues = issueFilters?.filters?.[key] ?? []; - newValues = newValues.filter((val) => val !== value); - - updateFilters(workspaceSlug.toString(), projectId.toString(), EIssueFilterType.FILTERS, { - [key]: newValues, - }); - }; - - const handleClearAllFilters = () => { - if (!workspaceSlug || !projectId) return; - - const newFilters: IIssueFilterOptions = {}; - Object.keys(userFilters ?? {}).forEach((key) => { - newFilters[key as keyof IIssueFilterOptions] = []; - }); - - updateFilters(workspaceSlug.toString(), projectId.toString(), EIssueFilterType.FILTERS, { ...newFilters }); - }; - - // return if no filters are applied - if (Object.keys(appliedFilters).length === 0) return null; - - return ( -
- -
- ); -}); diff --git a/apps/web/core/components/issues/issue-layouts/kanban/base-kanban-root.tsx b/apps/web/core/components/issues/issue-layouts/kanban/base-kanban-root.tsx index 11dfb2d92c..f853f17df9 100644 --- a/apps/web/core/components/issues/issue-layouts/kanban/base-kanban-root.tsx +++ b/apps/web/core/components/issues/issue-layouts/kanban/base-kanban-root.tsx @@ -34,7 +34,6 @@ export type KanbanStoreType = | EIssuesStoreType.MODULE | EIssuesStoreType.CYCLE | EIssuesStoreType.PROJECT_VIEW - | EIssuesStoreType.DRAFT | EIssuesStoreType.PROFILE | EIssuesStoreType.TEAM | EIssuesStoreType.TEAM_VIEW diff --git a/apps/web/core/components/issues/issue-layouts/kanban/headers/group-by-card.tsx b/apps/web/core/components/issues/issue-layouts/kanban/headers/group-by-card.tsx index d9caaad1b4..dc389a7158 100644 --- a/apps/web/core/components/issues/issue-layouts/kanban/headers/group-by-card.tsx +++ b/apps/web/core/components/issues/issue-layouts/kanban/headers/group-by-card.tsx @@ -2,7 +2,7 @@ import React, { FC } from "react"; import { observer } from "mobx-react"; -import { useParams, usePathname } from "next/navigation"; +import { useParams } from "next/navigation"; // lucide icons import { Minimize2, Maximize2, Circle, Plus } from "lucide-react"; import { WORK_ITEM_TRACKER_EVENTS } from "@plane/constants"; @@ -58,9 +58,6 @@ export const HeaderGroupByCard: FC = observer((props) => { const storeType = useIssueStoreType(); // router const { workspaceSlug, projectId, moduleId, cycleId } = useParams(); - const pathname = usePathname(); - - const isDraftIssue = pathname.includes("draft-issue"); const renderExistingIssueModal = moduleId || cycleId; const ExistingIssuesListModalPayload = moduleId ? { module: moduleId.toString() } : { cycle: true }; @@ -97,7 +94,6 @@ export const HeaderGroupByCard: FC = observer((props) => { onClose={() => setIsOpen(false)} data={issuePayload} storeType={storeType} - isDraft={isDraftIssue} /> )} diff --git a/apps/web/core/components/issues/issue-layouts/kanban/roots/draft-issue-root.tsx b/apps/web/core/components/issues/issue-layouts/kanban/roots/draft-issue-root.tsx deleted file mode 100644 index 568dd315fe..0000000000 --- a/apps/web/core/components/issues/issue-layouts/kanban/roots/draft-issue-root.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import { observer } from "mobx-react"; -// local imports -import { DraftIssueQuickActions } from "../../quick-action-dropdowns"; -import { BaseKanBanRoot } from "../base-kanban-root"; - -export const DraftKanBanLayout: React.FC = observer(() => ); diff --git a/apps/web/core/components/issues/issue-layouts/list/base-list-root.tsx b/apps/web/core/components/issues/issue-layouts/list/base-list-root.tsx index 99740ecfab..aef8560536 100644 --- a/apps/web/core/components/issues/issue-layouts/list/base-list-root.tsx +++ b/apps/web/core/components/issues/issue-layouts/list/base-list-root.tsx @@ -30,7 +30,6 @@ type ListStoreType = | EIssuesStoreType.MODULE | EIssuesStoreType.CYCLE | EIssuesStoreType.PROJECT_VIEW - | EIssuesStoreType.DRAFT | EIssuesStoreType.PROFILE | EIssuesStoreType.ARCHIVED | EIssuesStoreType.WORKSPACE_DRAFT diff --git a/apps/web/core/components/issues/issue-layouts/list/headers/group-by-card.tsx b/apps/web/core/components/issues/issue-layouts/list/headers/group-by-card.tsx index 2e34570d36..a6bf2efe49 100644 --- a/apps/web/core/components/issues/issue-layouts/list/headers/group-by-card.tsx +++ b/apps/web/core/components/issues/issue-layouts/list/headers/group-by-card.tsx @@ -2,7 +2,7 @@ import { useState } from "react"; import { observer } from "mobx-react"; -import { useParams, usePathname } from "next/navigation"; +import { useParams } from "next/navigation"; import { CircleDashed, Plus } from "lucide-react"; // types import { WORK_ITEM_TRACKER_EVENTS } from "@plane/constants"; @@ -58,10 +58,8 @@ export const HeaderGroupByCard = observer((props: IHeaderGroupByCard) => { const [openExistingIssueListModal, setOpenExistingIssueListModal] = useState(false); // router const { workspaceSlug, projectId, moduleId, cycleId } = useParams(); - const pathname = usePathname(); const storeType = useIssueStoreType(); // derived values - const isDraftIssue = pathname.includes("draft-issue"); const renderExistingIssueModal = moduleId || cycleId; const existingIssuesListModalPayload = moduleId ? { module: moduleId.toString() } : { cycle: true }; const isGroupSelectionEmpty = selectionHelpers.isGroupSelected(groupID) === "empty"; @@ -167,7 +165,6 @@ export const HeaderGroupByCard = observer((props: IHeaderGroupByCard) => { onClose={() => setIsOpen(false)} data={issuePayload} storeType={storeType} - isDraft={isDraftIssue} /> )} diff --git a/apps/web/core/components/issues/issue-layouts/list/roots/draft-issue-root.tsx b/apps/web/core/components/issues/issue-layouts/list/roots/draft-issue-root.tsx deleted file mode 100644 index 4b3c8c5383..0000000000 --- a/apps/web/core/components/issues/issue-layouts/list/roots/draft-issue-root.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { FC } from "react"; -import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; -// local imports -import { DraftIssueQuickActions } from "../../quick-action-dropdowns"; -import { BaseListRoot } from "../base-list-root"; - -export const DraftIssueListLayout: FC = observer(() => { - const { workspaceSlug, projectId } = useParams(); - - if (!workspaceSlug || !projectId) return null; - - return ; -}); diff --git a/apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/all-issue.tsx b/apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/all-issue.tsx index f5ce7441d1..4d8116f3a4 100644 --- a/apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/all-issue.tsx +++ b/apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/all-issue.tsx @@ -118,7 +118,6 @@ export const AllIssueQuickActions: React.FC = observer((props if (issueToEdit && handleUpdate) await handleUpdate(data); }} storeType={EIssuesStoreType.GLOBAL} - isDraft={false} /> {issue.project_id && workspaceSlug && ( = observer((pro if (issueToEdit && handleUpdate) await handleUpdate(data); }} storeType={EIssuesStoreType.CYCLE} - isDraft={false} /> {issue.project_id && workspaceSlug && ( = observer((props) => { - const { - issue, - handleDelete, - handleUpdate, - customActionButton, - portalElement, - readOnly = false, - placements = "bottom-end", - parentRef, - } = props; - // router - const { workspaceSlug } = useParams(); - const pathname = usePathname(); - // states - const [createUpdateIssueModal, setCreateUpdateIssueModal] = useState(false); - const [issueToEdit, setIssueToEdit] = useState(undefined); - const [deleteIssueModal, setDeleteIssueModal] = useState(false); - // store hooks - const { allowPermissions } = useUserPermissions(); - // derived values - const activeLayout = "Draft Issues"; - // auth - const isEditingAllowed = - allowPermissions( - [EUserPermissions.ADMIN, EUserPermissions.MEMBER], - EUserPermissionsLevel.PROJECT, - workspaceSlug?.toString(), - issue.project_id ?? undefined - ) && !readOnly; - const isDeletingAllowed = isEditingAllowed; - - const isDraftIssue = pathname?.includes("draft-issues") || false; - - const duplicateIssuePayload = omit( - { - ...issue, - name: `${issue.name} (copy)`, - is_draft: isDraftIssue ? false : issue.is_draft, - sourceIssueId: issue.id, - }, - ["id"] - ); - - // Menu items and modals using helper - const menuItemProps: MenuItemFactoryProps = { - issue, - workspaceSlug: workspaceSlug?.toString(), - activeLayout, - isEditingAllowed, - isDeletingAllowed, - isDraftIssue, - setIssueToEdit, - setCreateUpdateIssueModal, - setDeleteIssueModal, - handleDelete, - handleUpdate, - storeType: EIssuesStoreType.DRAFT, - }; - - const MENU_ITEMS = useDraftIssueMenuItems(menuItemProps); - - const CONTEXT_MENU_ITEMS: TContextMenuItem[] = MENU_ITEMS.map((item) => ({ - ...item, - onClick: () => { - captureClick({ elementName: WORK_ITEM_TRACKER_ELEMENTS.QUICK_ACTIONS.DRAFT }); - item.action(); - }, - })); - - return ( - <> - {/* Modals */} - setDeleteIssueModal(false)} - onSubmit={handleDelete} - /> - { - setCreateUpdateIssueModal(false); - setIssueToEdit(undefined); - }} - data={issueToEdit ?? duplicateIssuePayload} - onSubmit={async (data) => { - if (issueToEdit && handleUpdate) await handleUpdate(data); - }} - storeType={EIssuesStoreType.DRAFT} - isDraft={isDraftIssue} - /> - - - - {MENU_ITEMS.map((item) => { - if (item.shouldRender === false) return null; - return ( - { - e.preventDefault(); - e.stopPropagation(); - captureClick({ elementName: WORK_ITEM_TRACKER_ELEMENTS.QUICK_ACTIONS.DRAFT }); - item.action(); - }} - className={cn( - "flex items-center gap-2", - { - "text-custom-text-400": item.disabled, - }, - item.className - )} - disabled={item.disabled} - > - {item.icon && } -
-
{item.title}
- {item.description && ( -

- {item.description} -

- )} -
-
- ); - })} -
- - ); -}); diff --git a/apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/helper.tsx b/apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/helper.tsx index 9d6862aaa2..80c4ae4f37 100644 --- a/apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/helper.tsx +++ b/apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/helper.tsx @@ -54,7 +54,6 @@ export interface MenuItemFactoryProps { isRestoringAllowed?: boolean; isInArchivableGroup?: boolean; issueTypeDetail?: { is_active?: boolean }; - isDraftIssue?: boolean; // Action handlers setIssueToEdit: (issue: TIssue | undefined) => void; setCreateUpdateIssueModal: (open: boolean) => void; @@ -369,9 +368,3 @@ export const useArchivedIssueMenuItems = (props: MenuItemFactoryProps): TContext [factory] ); }; - -export const useDraftIssueMenuItems = (props: MenuItemFactoryProps): TContextMenuItem[] => { - const factory = useMenuItemFactory(props); - - return useMemo(() => [factory.createEditMenuItem(), factory.createDeleteMenuItem()], [factory]); -}; diff --git a/apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/index.ts b/apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/index.ts index 0862c68a93..19147a0ad6 100644 --- a/apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/index.ts +++ b/apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/index.ts @@ -1,7 +1,6 @@ export * from "./all-issue"; export * from "./archived-issue"; export * from "./cycle-issue"; -export * from "./draft-issue"; export * from "./module-issue"; export * from "./project-issue"; export * from "./helper"; diff --git a/apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/issue-detail.tsx b/apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/issue-detail.tsx index f2cd9a5c50..1d83efc4e5 100644 --- a/apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/issue-detail.tsx +++ b/apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/issue-detail.tsx @@ -88,13 +88,10 @@ export const WorkItemDetailQuickActions: React.FC {issue.project_id && workspaceSlug && ( diff --git a/apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/module-issue.tsx b/apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/module-issue.tsx index 8b5db5b56c..de20b469a3 100644 --- a/apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/module-issue.tsx +++ b/apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/module-issue.tsx @@ -134,7 +134,6 @@ export const ModuleIssueQuickActions: React.FC = observer((pr if (issueToEdit && handleUpdate) await handleUpdate(data); }} storeType={EIssuesStoreType.MODULE} - isDraft={false} /> {issue.project_id && workspaceSlug && ( = observer((p } = props; // router const { workspaceSlug } = useParams(); - const pathname = usePathname(); // states const [createUpdateIssueModal, setCreateUpdateIssueModal] = useState(false); const [issueToEdit, setIssueToEdit] = useState(undefined); @@ -71,13 +70,10 @@ export const ProjectIssueQuickActions: React.FC = observer((p const isInArchivableGroup = !!stateDetails && ARCHIVABLE_STATE_GROUPS.includes(stateDetails?.group); const isDeletingAllowed = isEditingAllowed; - const isDraftIssue = pathname?.includes("draft-issues") || false; - const duplicateIssuePayload = omit( { ...issue, name: `${issue.name} (copy)`, - is_draft: isDraftIssue ? false : issue.is_draft, sourceIssueId: issue.id, }, ["id"] @@ -93,7 +89,6 @@ export const ProjectIssueQuickActions: React.FC = observer((p isArchivingAllowed, isDeletingAllowed, isInArchivableGroup, - isDraftIssue, setIssueToEdit, setCreateUpdateIssueModal, setDeleteIssueModal, @@ -141,7 +136,6 @@ export const ProjectIssueQuickActions: React.FC = observer((p if (issueToEdit && handleUpdate) await handleUpdate(data); }} storeType={EIssuesStoreType.PROJECT} - isDraft={isDraftIssue} /> {issue.project_id && workspaceSlug && ( { - switch (props.activeLayout) { - case EIssueLayoutTypes.LIST: - return ; - case EIssueLayoutTypes.KANBAN: - return ; - default: - return null; - } -}; -export const DraftIssueLayoutRoot: React.FC = observer(() => { - // router - const { workspaceSlug, projectId } = useParams(); - // hooks - const { issuesFilter } = useIssues(EIssuesStoreType.DRAFT); - - const { isLoading } = useSWR( - workspaceSlug && projectId ? `DRAFT_ISSUES_${workspaceSlug.toString()}_${projectId.toString()}` : null, - async () => { - if (workspaceSlug && projectId) { - await issuesFilter?.fetchFilters(workspaceSlug.toString(), projectId.toString()); - } - }, - { revalidateIfStale: false, revalidateOnFocus: false } - ); - - const issueFilters = issuesFilter?.getIssueFilters(projectId?.toString()); - const activeLayout = issueFilters?.displayFilters?.layout || undefined; - - if (!workspaceSlug || !projectId) return <>; - - if (isLoading && !issueFilters) - return ( -
- -
- ); - - return ( - -
- -
- - {/* issue peek overview */} - -
-
-
- ); -}); diff --git a/apps/web/core/components/issues/issue-modal/base.tsx b/apps/web/core/components/issues/issue-modal/base.tsx index ed1351669f..7a00bc1784 100644 --- a/apps/web/core/components/issues/issue-modal/base.tsx +++ b/apps/web/core/components/issues/issue-modal/base.tsx @@ -86,12 +86,7 @@ export const CreateUpdateIssueModalBase: React.FC = observer(( setDescription(data?.description_html || "

"); return; } - const response = await fetchIssue( - workspaceSlug.toString(), - projectId.toString(), - issueId, - isDraft ? "DRAFT" : "DEFAULT" - ); + const response = await fetchIssue(workspaceSlug.toString(), projectId.toString(), issueId); if (response) setDescription(response?.description_html || "

"); }; diff --git a/apps/web/core/components/issues/peek-overview/root.tsx b/apps/web/core/components/issues/peek-overview/root.tsx index a44bfa1c9d..926b5430c1 100644 --- a/apps/web/core/components/issues/peek-overview/root.tsx +++ b/apps/web/core/components/issues/peek-overview/root.tsx @@ -64,7 +64,7 @@ export const IssuePeekOverview: FC = observer((props) => fetch: async (workspaceSlug: string, projectId: string, issueId: string) => { try { setError(false); - await fetchIssue(workspaceSlug, projectId, issueId, is_draft ? "DRAFT" : "DEFAULT"); + await fetchIssue(workspaceSlug, projectId, issueId); } catch (error) { setError(true); console.error("Error fetching the parent issue", error); diff --git a/apps/web/core/components/workspace/sidebar/quick-actions.tsx b/apps/web/core/components/workspace/sidebar/quick-actions.tsx index 4eee72815a..4ed6b7bb22 100644 --- a/apps/web/core/components/workspace/sidebar/quick-actions.tsx +++ b/apps/web/core/components/workspace/sidebar/quick-actions.tsx @@ -70,6 +70,7 @@ export const SidebarQuickActions = observer(() => { onClose={() => setIsDraftIssueModalOpen(false)} data={workspaceDraftIssue ?? {}} onSubmit={() => removeWorkspaceDraftIssue()} + fetchIssueDetails={false} isDraft />
diff --git a/apps/web/core/hooks/store/use-issues.ts b/apps/web/core/hooks/store/use-issues.ts index 5ac116f9c2..a732b6580d 100644 --- a/apps/web/core/hooks/store/use-issues.ts +++ b/apps/web/core/hooks/store/use-issues.ts @@ -11,7 +11,6 @@ import type { ITeamViewIssues, ITeamViewIssuesFilter } from "@/plane-web/store/i import type { IWorkspaceIssues } from "@/plane-web/store/issue/workspace/issue.store"; import type { IArchivedIssues, IArchivedIssuesFilter } from "@/store/issue/archived"; import type { ICycleIssues, ICycleIssuesFilter } from "@/store/issue/cycle"; -import type { IDraftIssues, IDraftIssuesFilter } from "@/store/issue/draft"; import type { IModuleIssues, IModuleIssuesFilter } from "@/store/issue/module"; import type { IProfileIssues, IProfileIssuesFilter } from "@/store/issue/profile"; import type { IProjectIssues, IProjectIssuesFilter } from "@/store/issue/project"; @@ -65,10 +64,6 @@ export type TStoreIssues = { issues: IArchivedIssues; issuesFilter: IArchivedIssuesFilter; }; - [EIssuesStoreType.DRAFT]: defaultIssueStore & { - issues: IDraftIssues; - issuesFilter: IDraftIssuesFilter; - }; [EIssuesStoreType.DEFAULT]: defaultIssueStore & { issues: IProjectIssues; issuesFilter: IProjectIssuesFilter; @@ -142,11 +137,6 @@ export const useIssues = (storeType?: T): TStoreIssu issues: context.issue.archivedIssues, issuesFilter: context.issue.archivedIssuesFilter, }) as TStoreIssues[T]; - case EIssuesStoreType.DRAFT: - return merge(defaultStore, { - issues: context.issue.draftIssues, - issuesFilter: context.issue.draftIssuesFilter, - }) as TStoreIssues[T]; case EIssuesStoreType.EPIC: return merge(defaultStore, { issues: context.issue.projectEpics, diff --git a/apps/web/core/hooks/use-group-dragndrop.ts b/apps/web/core/hooks/use-group-dragndrop.ts index fedb079597..4193e5c237 100644 --- a/apps/web/core/hooks/use-group-dragndrop.ts +++ b/apps/web/core/hooks/use-group-dragndrop.ts @@ -14,7 +14,6 @@ type DNDStoreType = | EIssuesStoreType.MODULE | EIssuesStoreType.CYCLE | EIssuesStoreType.PROJECT_VIEW - | EIssuesStoreType.DRAFT | EIssuesStoreType.PROFILE | EIssuesStoreType.ARCHIVED | EIssuesStoreType.WORKSPACE_DRAFT diff --git a/apps/web/core/hooks/use-issues-actions.tsx b/apps/web/core/hooks/use-issues-actions.tsx index e8c9735252..cdfb5864f6 100644 --- a/apps/web/core/hooks/use-issues-actions.tsx +++ b/apps/web/core/hooks/use-issues-actions.tsx @@ -52,7 +52,6 @@ export const useIssuesActions = (storeType: EIssuesStoreType): IssueActions => { const projectViewIssueActions = useProjectViewIssueActions(); const globalIssueActions = useGlobalIssueActions(); const profileIssueActions = useProfileIssueActions(); - const draftIssueActions = useDraftIssueActions(); const archivedIssueActions = useArchivedIssueActions(); const workspaceDraftIssueActions = useWorkspaceDraftIssueActions(); const teamProjectWorkItemsActions = useTeamProjectWorkItemsActions(); @@ -68,8 +67,6 @@ export const useIssuesActions = (storeType: EIssuesStoreType): IssueActions => { return teamIssueActions; case EIssuesStoreType.ARCHIVED: return archivedIssueActions; - case EIssuesStoreType.DRAFT: - return draftIssueActions; case EIssuesStoreType.CYCLE: return cycleIssueActions; case EIssuesStoreType.MODULE: @@ -644,76 +641,6 @@ const useProjectViewIssueActions = () => { ); }; -const useDraftIssueActions = () => { - // router - const { workspaceSlug: routerWorkspaceSlug, projectId: routerProjectId } = useParams(); - const workspaceSlug = routerWorkspaceSlug?.toString(); - const projectId = routerProjectId?.toString(); - // store hooks - const { issues, issuesFilter } = useIssues(EIssuesStoreType.DRAFT); - - const fetchIssues = useCallback( - async (loadType: TLoader, options: IssuePaginationOptions) => { - if (!workspaceSlug || !projectId) return; - return issues.fetchIssues(workspaceSlug.toString(), projectId.toString(), loadType, options); - }, - [issues.fetchIssues, workspaceSlug, projectId] - ); - const fetchNextIssues = useCallback( - async (groupId?: string, subGroupId?: string) => { - if (!workspaceSlug || !projectId) return; - return issues.fetchNextIssues(workspaceSlug.toString(), projectId.toString(), groupId, subGroupId); - }, - [issues.fetchIssues, workspaceSlug, projectId] - ); - - const createIssue = useCallback( - async (projectId: string | undefined | null, data: Partial) => { - if (!workspaceSlug || !projectId) return; - return await issues.createIssue(workspaceSlug, projectId, data); - }, - [issues.createIssue, workspaceSlug] - ); - const updateIssue = useCallback( - async (projectId: string | undefined | null, issueId: string, data: Partial) => { - if (!workspaceSlug || !projectId) return; - return await issues.updateIssue(workspaceSlug, projectId, issueId, data); - }, - [issues.updateIssue, workspaceSlug] - ); - const removeIssue = useCallback( - async (projectId: string | undefined | null, issueId: string) => { - if (!workspaceSlug || !projectId) return; - return await issues.removeIssue(workspaceSlug, projectId, issueId); - }, - [issues.removeIssue, workspaceSlug] - ); - - const updateFilters = useCallback( - async ( - projectId: string, - filterType: EIssueFilterType, - filters: IIssueFilterOptions | IIssueDisplayFilterOptions | IIssueDisplayProperties | TIssueKanbanFilters - ) => { - if (!workspaceSlug) return; - return await issuesFilter.updateFilters(workspaceSlug, projectId, filterType, filters); - }, - [issuesFilter.updateFilters] - ); - - return useMemo( - () => ({ - fetchIssues, - fetchNextIssues, - createIssue, - updateIssue, - removeIssue, - updateFilters, - }), - [fetchIssues, createIssue, updateIssue, removeIssue, updateFilters] - ); -}; - const useArchivedIssueActions = () => { // router const { workspaceSlug: routerWorkspaceSlug, projectId: routerProjectId } = useParams(); diff --git a/apps/web/core/services/issue/index.ts b/apps/web/core/services/issue/index.ts index 77acc8625b..08983c0e13 100644 --- a/apps/web/core/services/issue/index.ts +++ b/apps/web/core/services/issue/index.ts @@ -1,6 +1,5 @@ export * from "./issue_archive.service"; export * from "./issue.service"; -export * from "./issue_draft.service"; export * from "./issue_reaction.service"; export * from "./issue_label.service"; export * from "./issue_attachment.service"; diff --git a/apps/web/core/services/issue/issue_draft.service.ts b/apps/web/core/services/issue/issue_draft.service.ts deleted file mode 100644 index ebac862051..0000000000 --- a/apps/web/core/services/issue/issue_draft.service.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { API_BASE_URL } from "@plane/constants"; -import { TIssue, TIssuesResponse } from "@plane/types"; -import { APIService } from "@/services/api.service"; -// helpers - -export class IssueDraftService extends APIService { - constructor() { - super(API_BASE_URL); - } - - async getDraftIssues(workspaceSlug: string, projectId: string, query?: any, config = {}): Promise { - return this.get( - `/api/workspaces/${workspaceSlug}/projects/${projectId}/issue-drafts/`, - { - params: { ...query }, - }, - config - ) - .then((response) => response?.data) - .catch((error) => { - throw error?.response?.data; - }); - } - - async createDraftIssue(workspaceSlug: string, projectId: string, data: any): Promise { - return this.post(`/api/workspaces/${workspaceSlug}/projects/${projectId}/issue-drafts/`, data) - .then((response) => response?.data) - .catch((error) => { - throw error?.response; - }); - } - - async updateDraftIssue(workspaceSlug: string, projectId: string, issueId: string, data: any): Promise { - return this.patch(`/api/workspaces/${workspaceSlug}/projects/${projectId}/issue-drafts/${issueId}/`, data) - .then((response) => response?.data) - .catch((error) => { - throw error?.response; - }); - } - - async deleteDraftIssue(workspaceSlug: string, projectId: string, issueId: string): Promise { - return this.delete(`/api/workspaces/${workspaceSlug}/projects/${projectId}/issue-drafts/${issueId}/`) - .then((response) => response?.data) - .catch((error) => { - throw error?.response; - }); - } - - async getDraftIssueById(workspaceSlug: string, projectId: string, issueId: string, queries?: any): Promise { - return this.get(`/api/workspaces/${workspaceSlug}/projects/${projectId}/issue-drafts/${issueId}/`, { - params: queries, - }) - .then((response) => response?.data) - .catch((error) => { - throw error?.response; - }); - } -} diff --git a/apps/web/core/store/issue/draft/filter.store.ts b/apps/web/core/store/issue/draft/filter.store.ts deleted file mode 100644 index bfde23bc05..0000000000 --- a/apps/web/core/store/issue/draft/filter.store.ts +++ /dev/null @@ -1,279 +0,0 @@ -import isArray from "lodash/isArray"; -import isEmpty from "lodash/isEmpty"; -import pickBy from "lodash/pickBy"; -import set from "lodash/set"; -import { action, computed, makeObservable, observable, runInAction } from "mobx"; -// base class -import { computedFn } from "mobx-utils"; -import { EIssueFilterType } from "@plane/constants"; -import { - EIssuesStoreType, - IIssueFilterOptions, - IIssueDisplayFilterOptions, - IIssueDisplayProperties, - TIssueKanbanFilters, - IIssueFilters, - TIssueParams, - IssuePaginationOptions, -} from "@plane/types"; -import { handleIssueQueryParamsByLayout } from "@plane/utils"; -import { IssueFiltersService } from "@/services/issue_filter.service"; -import { IBaseIssueFilterStore, IssueFilterHelperStore } from "../helpers/issue-filter-helper.store"; -// helpers -// types -import { IIssueRootStore } from "../root.store"; -// constants -// services - -export interface IDraftIssuesFilter extends IBaseIssueFilterStore { - //helper actions - getFilterParams: ( - options: IssuePaginationOptions, - projectId: string, - cursor: string | undefined, - groupId: string | undefined, - subGroupId: string | undefined - ) => Partial>; - getIssueFilters(projectId: string): IIssueFilters | undefined; - // action - fetchFilters: (workspaceSlug: string, projectId: string) => Promise; - updateFilters: ( - workspaceSlug: string, - projectId: string, - filterType: EIssueFilterType, - filters: IIssueFilterOptions | IIssueDisplayFilterOptions | IIssueDisplayProperties | TIssueKanbanFilters - ) => Promise; -} - -export class DraftIssuesFilter extends IssueFilterHelperStore implements IDraftIssuesFilter { - // observables - filters: { [projectId: string]: IIssueFilters } = {}; - // root store - rootIssueStore: IIssueRootStore; - // services - issueFilterService; - - constructor(_rootStore: IIssueRootStore) { - super(); - makeObservable(this, { - // observables - filters: observable, - // computed - issueFilters: computed, - appliedFilters: computed, - // actions - fetchFilters: action, - updateFilters: action, - }); - // root store - this.rootIssueStore = _rootStore; - // services - this.issueFilterService = new IssueFiltersService(); - } - - get issueFilters() { - const projectId = this.rootIssueStore.projectId; - if (!projectId) return undefined; - - return this.getIssueFilters(projectId); - } - - get appliedFilters() { - const projectId = this.rootIssueStore.projectId; - if (!projectId) return undefined; - - return this.getAppliedFilters(projectId); - } - - getIssueFilters(projectId: string) { - const displayFilters = this.filters[projectId] || undefined; - if (!projectId || isEmpty(displayFilters)) return undefined; - - const _filters: IIssueFilters = this.computedIssueFilters(displayFilters); - - return _filters; - } - - getAppliedFilters(projectId: string) { - const userFilters = this.getIssueFilters(projectId); - if (!userFilters) return undefined; - - const filteredParams = handleIssueQueryParamsByLayout(userFilters?.displayFilters?.layout, "issues"); - if (!filteredParams) return undefined; - - const filteredRouteParams: Partial> = this.computedFilteredParams( - userFilters?.filters as IIssueFilterOptions, - userFilters?.displayFilters as IIssueDisplayFilterOptions, - filteredParams - ); - - return filteredRouteParams; - } - - getFilterParams = computedFn( - ( - options: IssuePaginationOptions, - projectId: string, - cursor: string | undefined, - groupId: string | undefined, - subGroupId: string | undefined - ) => { - const filterParams = this.getAppliedFilters(projectId); - - const paginationParams = this.getPaginationParams(filterParams, options, cursor, groupId, subGroupId); - return paginationParams; - } - ); - - fetchFilters = async (workspaceSlug: string, projectId: string) => { - const _filters = this.handleIssuesLocalFilters.get(EIssuesStoreType.DRAFT, workspaceSlug, projectId, undefined); - - const filters: IIssueFilterOptions = this.computedFilters(_filters?.filters); - const displayFilters: IIssueDisplayFilterOptions = this.computedDisplayFilters(_filters?.display_filters); - const displayProperties: IIssueDisplayProperties = this.computedDisplayProperties(_filters?.display_properties); - const kanbanFilters = { - group_by: [], - sub_group_by: [], - }; - kanbanFilters.group_by = _filters?.kanban_filters?.group_by || []; - kanbanFilters.sub_group_by = _filters?.kanban_filters?.sub_group_by || []; - - runInAction(() => { - set(this.filters, [projectId, "filters"], filters); - set(this.filters, [projectId, "displayFilters"], displayFilters); - set(this.filters, [projectId, "displayProperties"], displayProperties); - set(this.filters, [projectId, "kanbanFilters"], kanbanFilters); - }); - }; - - updateFilters = async ( - workspaceSlug: string, - projectId: string, - type: EIssueFilterType, - filters: IIssueFilterOptions | IIssueDisplayFilterOptions | IIssueDisplayProperties | TIssueKanbanFilters - ) => { - try { - if (isEmpty(this.filters) || isEmpty(this.filters[projectId]) || isEmpty(filters)) return; - - const _filters = { - filters: this.filters[projectId].filters as IIssueFilterOptions, - displayFilters: this.filters[projectId].displayFilters as IIssueDisplayFilterOptions, - displayProperties: this.filters[projectId].displayProperties as IIssueDisplayProperties, - kanbanFilters: this.filters[projectId].kanbanFilters as TIssueKanbanFilters, - }; - - switch (type) { - case EIssueFilterType.FILTERS: { - const updatedFilters = filters as IIssueFilterOptions; - _filters.filters = { ..._filters.filters, ...updatedFilters }; - - runInAction(() => { - Object.keys(updatedFilters).forEach((_key) => { - set(this.filters, [projectId, "filters", _key], updatedFilters[_key as keyof IIssueFilterOptions]); - }); - }); - const appliedFilters = _filters.filters || {}; - const filteredFilters = pickBy(appliedFilters, (value) => value && isArray(value) && value.length > 0); - this.rootIssueStore.draftIssues.fetchIssuesWithExistingPagination( - workspaceSlug, - projectId, - isEmpty(filteredFilters) ? "init-loader" : "mutation" - ); - this.handleIssuesLocalFilters.set(EIssuesStoreType.DRAFT, type, workspaceSlug, projectId, undefined, { - filters: _filters.filters, - }); - break; - } - case EIssueFilterType.DISPLAY_FILTERS: { - const updatedDisplayFilters = filters as IIssueDisplayFilterOptions; - _filters.displayFilters = { ..._filters.displayFilters, ...updatedDisplayFilters }; - - // set sub_group_by to null if group_by is set to null - if (_filters.displayFilters.group_by === null) { - _filters.displayFilters.sub_group_by = null; - updatedDisplayFilters.sub_group_by = null; - } - // set sub_group_by to null if layout is switched to kanban group_by and sub_group_by are same - if ( - _filters.displayFilters.layout === "kanban" && - _filters.displayFilters.group_by === _filters.displayFilters.sub_group_by - ) { - _filters.displayFilters.sub_group_by = null; - updatedDisplayFilters.sub_group_by = null; - } - // set group_by to state if layout is switched to kanban and group_by is null - if (_filters.displayFilters.layout === "kanban" && _filters.displayFilters.group_by === null) { - _filters.displayFilters.group_by = "state"; - updatedDisplayFilters.group_by = "state"; - } - - runInAction(() => { - Object.keys(updatedDisplayFilters).forEach((_key) => { - set( - this.filters, - [projectId, "displayFilters", _key], - updatedDisplayFilters[_key as keyof IIssueDisplayFilterOptions] - ); - }); - }); - - if (this.getShouldReFetchIssues(updatedDisplayFilters)) { - this.rootIssueStore.draftIssues.fetchIssuesWithExistingPagination(workspaceSlug, projectId, "mutation"); - } - - this.handleIssuesLocalFilters.set(EIssuesStoreType.DRAFT, type, workspaceSlug, projectId, undefined, { - display_filters: _filters.displayFilters, - }); - - break; - } - case EIssueFilterType.DISPLAY_PROPERTIES: { - const updatedDisplayProperties = filters as IIssueDisplayProperties; - _filters.displayProperties = { ..._filters.displayProperties, ...updatedDisplayProperties }; - - runInAction(() => { - Object.keys(updatedDisplayProperties).forEach((_key) => { - set( - this.filters, - [projectId, "displayProperties", _key], - updatedDisplayProperties[_key as keyof IIssueDisplayProperties] - ); - }); - }); - - this.handleIssuesLocalFilters.set(EIssuesStoreType.DRAFT, type, workspaceSlug, projectId, undefined, { - display_properties: _filters.displayProperties, - }); - break; - } - case EIssueFilterType.KANBAN_FILTERS: { - const updatedKanbanFilters = filters as TIssueKanbanFilters; - _filters.kanbanFilters = { ..._filters.kanbanFilters, ...updatedKanbanFilters }; - - const currentUserId = this.rootIssueStore.currentUserId; - if (currentUserId) - this.handleIssuesLocalFilters.set(EIssuesStoreType.DRAFT, type, workspaceSlug, projectId, undefined, { - kanban_filters: _filters.kanbanFilters, - }); - - runInAction(() => { - Object.keys(updatedKanbanFilters).forEach((_key) => { - set( - this.filters, - [projectId, "kanbanFilters", _key], - updatedKanbanFilters[_key as keyof TIssueKanbanFilters] - ); - }); - }); - - break; - } - default: - break; - } - } catch (error) { - this.fetchFilters(workspaceSlug, projectId); - throw error; - } - }; -} diff --git a/apps/web/core/store/issue/draft/index.ts b/apps/web/core/store/issue/draft/index.ts deleted file mode 100644 index 0fe6c946b0..0000000000 --- a/apps/web/core/store/issue/draft/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./filter.store"; -export * from "./issue.store"; diff --git a/apps/web/core/store/issue/draft/issue.store.ts b/apps/web/core/store/issue/draft/issue.store.ts deleted file mode 100644 index c1ccc98a7b..0000000000 --- a/apps/web/core/store/issue/draft/issue.store.ts +++ /dev/null @@ -1,186 +0,0 @@ -import { action, makeObservable, runInAction } from "mobx"; -// base class -// services -// types -import { - TIssue, - TLoader, - ViewFlags, - IssuePaginationOptions, - TIssuesResponse, - TBulkOperationsPayload, -} from "@plane/types"; -import { BaseIssuesStore, IBaseIssuesStore } from "../helpers/base-issues.store"; -import { IIssueRootStore } from "../root.store"; -import { IDraftIssuesFilter } from "./filter.store"; - -export interface IDraftIssues extends IBaseIssuesStore { - // observable - - viewFlags: ViewFlags; - // actions - fetchIssues: ( - workspaceSlug: string, - projectId: string, - loadType: TLoader, - option: IssuePaginationOptions - ) => Promise; - fetchIssuesWithExistingPagination: ( - workspaceSlug: string, - projectId: string, - loadType: TLoader - ) => Promise; - - fetchNextIssues: ( - workspaceSlug: string, - projectId: string, - groupId?: string, - subGroupId?: string - ) => Promise; - createIssue: (workspaceSlug: string, projectId: string, data: Partial) => Promise; - updateIssue: (workspaceSlug: string, projectId: string, issueId: string, data: Partial) => Promise; - removeBulkIssues: (workspaceSlug: string, projectId: string, issueIds: string[]) => Promise; - bulkUpdateProperties: (workspaceSlug: string, projectId: string, data: TBulkOperationsPayload) => Promise; - - archiveBulkIssues: undefined; - quickAddIssue: undefined; - archiveIssue: undefined; -} - -export class DraftIssues extends BaseIssuesStore implements IDraftIssues { - viewFlags = { - enableQuickAdd: false, - enableIssueCreation: true, - enableInlineEditing: true, - }; - // filter store - issueFilterStore: IDraftIssuesFilter; - - constructor(_rootStore: IIssueRootStore, issueFilterStore: IDraftIssuesFilter) { - super(_rootStore, issueFilterStore); - makeObservable(this, { - // action - fetchIssues: action, - fetchNextIssues: action, - fetchIssuesWithExistingPagination: action, - }); - // filter store - this.issueFilterStore = issueFilterStore; - } - - /** - * Fetches the project details - * @param workspaceSlug - * @param projectId - */ - fetchParentStats = async (workspaceSlug: string, projectId?: string) => { - projectId && this.rootIssueStore.rootStore.projectRoot.project.fetchProjectDetails(workspaceSlug, projectId); - }; - - /** */ - updateParentStats = () => {}; - - /** - * This method is called to fetch the first issues of pagination - * @param workspaceSlug - * @param projectId - * @param loadType - * @param options - * @returns - */ - fetchIssues = async ( - workspaceSlug: string, - projectId: string, - loadType: TLoader = "init-loader", - options: IssuePaginationOptions, - isExistingPaginationOptions: boolean = false - ) => { - try { - // set loader and clear store - runInAction(() => { - this.setLoader(loadType); - }); - this.clear(!isExistingPaginationOptions); - - // get params from pagination options - const params = this.issueFilterStore?.getFilterParams(options, projectId, undefined, undefined, undefined); - // call the fetch issues API with the params - const response = await this.issueDraftService.getDraftIssues(workspaceSlug, projectId, params, { - signal: this.controller.signal, - }); - - // after fetching issues, call the base method to process the response further - this.onfetchIssues(response, options, workspaceSlug, projectId, undefined, !isExistingPaginationOptions); - return response; - } catch (error) { - // set loader to undefined if errored out - this.setLoader(undefined); - throw error; - } - }; - - /** - * This method is called subsequent pages of pagination - * if groupId/subgroupId is provided, only that specific group's next page is fetched - * else all the groups' next page is fetched - * @param workspaceSlug - * @param projectId - * @param groupId - * @param subGroupId - * @returns - */ - fetchNextIssues = async (workspaceSlug: string, projectId: string, groupId?: string, subGroupId?: string) => { - const cursorObject = this.getPaginationData(groupId, subGroupId); - // if there are no pagination options and the next page results do not exist the return - if (!this.paginationOptions || (cursorObject && !cursorObject?.nextPageResults)) return; - try { - // set Loader - this.setLoader("pagination", groupId, subGroupId); - - // get params from stored pagination options - const params = this.issueFilterStore?.getFilterParams( - this.paginationOptions, - projectId, - this.getNextCursor(groupId, subGroupId), - groupId, - subGroupId - ); - // call the fetch issues API with the params for next page in issues - const response = await this.issueDraftService.getDraftIssues(workspaceSlug, projectId, params); - - // after the next page of issues are fetched, call the base method to process the response - this.onfetchNexIssues(response, groupId, subGroupId); - return response; - } catch (error) { - // set Loader as undefined if errored out - this.setLoader(undefined, groupId, subGroupId); - throw error; - } - }; - - /** - * This Method exists to fetch the first page of the issues with the existing stored pagination - * This is useful for refetching when filters, groupBy, orderBy etc changes - * @param workspaceSlug - * @param projectId - * @param loadType - * @returns - */ - fetchIssuesWithExistingPagination = async ( - workspaceSlug: string, - projectId: string, - loadType: TLoader = "mutation" - ) => { - if (!this.paginationOptions) return; - return await this.fetchIssues(workspaceSlug, projectId, loadType, this.paginationOptions, true); - }; - - // Using aliased names as they cannot be overridden in other stores - createIssue = this.createDraftIssue; - updateIssue = this.updateDraftIssue; - - // Setting them as undefined as they can not performed on draft issues - archiveBulkIssues = undefined; - quickAddIssue = undefined; - archiveIssue = undefined; -} diff --git a/apps/web/core/store/issue/helpers/base-issues.store.ts b/apps/web/core/store/issue/helpers/base-issues.store.ts index 43e92642f3..c12bd9e9e5 100644 --- a/apps/web/core/store/issue/helpers/base-issues.store.ts +++ b/apps/web/core/store/issue/helpers/base-issues.store.ts @@ -41,7 +41,7 @@ import { updatePersistentLayer } from "@/local-db/utils/utils"; import { workItemSortWithOrderByExtended } from "@/plane-web/store/issue/helpers/base-issue.store"; // services import { CycleService } from "@/services/cycle.service"; -import { IssueArchiveService, IssueDraftService, IssueService } from "@/services/issue"; +import { IssueArchiveService, IssueService } from "@/services/issue"; import { ModuleService } from "@/services/module.service"; // import { IIssueRootStore } from "../root.store"; @@ -194,7 +194,6 @@ export abstract class BaseIssuesStore implements IBaseIssuesStore { // services issueService; issueArchiveService; - issueDraftService; moduleService; cycleService; // root store @@ -238,8 +237,6 @@ export abstract class BaseIssuesStore implements IBaseIssuesStore { createIssue: action, issueUpdate: action, - createDraftIssue: action, - updateDraftIssue: action, updateIssueDates: action, issueQuickAdd: action.bound, removeIssue: action.bound, @@ -264,7 +261,6 @@ export abstract class BaseIssuesStore implements IBaseIssuesStore { this.issueService = new IssueService(serviceType); this.issueArchiveService = new IssueArchiveService(); - this.issueDraftService = new IssueDraftService(); this.moduleService = new ModuleService(); this.cycleService = new CycleService(); @@ -613,54 +609,6 @@ export abstract class BaseIssuesStore implements IBaseIssuesStore { } } - /** - * Similar to Create Issue but for creating Draft issues - * @param workspaceSlug - * @param projectId - * @param data draft issue data - * @returns - */ - async createDraftIssue(workspaceSlug: string, projectId: string, data: Partial) { - // call API to create a Draft issue - const response = await this.issueDraftService.createDraftIssue(workspaceSlug, projectId, data); - // call Fetch parent stats - this.fetchParentStats(workspaceSlug, projectId); - // Add issue to store - this.addIssue(response); - return response; - } - - /** - * Similar to update issue but for draft issues. - * @param workspaceSlug - * @param projectId - * @param issueId - * @param data Partial Issue Data to be updated - */ - async updateDraftIssue(workspaceSlug: string, projectId: string, issueId: string, data: Partial) { - // Store Before state of the issue - const issueBeforeUpdate = clone(this.rootIssueStore.issues.getIssueById(issueId)); - try { - // Update the Respective Stores - this.rootIssueStore.issues.updateIssue(issueId, data); - this.updateIssueList({ ...issueBeforeUpdate, ...data } as TIssue, issueBeforeUpdate); - - // call API to update the issue - await this.issueDraftService.updateDraftIssue(workspaceSlug, projectId, issueId, data); - - // call Fetch parent stats - this.fetchParentStats(workspaceSlug, projectId); - - // If the issue is updated to not a draft issue anymore remove from the store list - if (!isNil(data.is_draft) && !data.is_draft) this.removeIssueFromList(issueId); - } catch (error) { - // If errored out update store again to revert the change - this.rootIssueStore.issues.updateIssue(issueId, issueBeforeUpdate ?? {}); - this.updateIssueList(issueBeforeUpdate, { ...issueBeforeUpdate, ...data } as TIssue); - throw error; - } - } - /** * This method is called to delete an issue * @param workspaceSlug diff --git a/apps/web/core/store/issue/issue-details/issue.store.ts b/apps/web/core/store/issue/issue-details/issue.store.ts index 21e879b307..229fbf42e4 100644 --- a/apps/web/core/store/issue/issue-details/issue.store.ts +++ b/apps/web/core/store/issue/issue-details/issue.store.ts @@ -5,18 +5,13 @@ import { EIssueServiceType, TIssue, TIssueServiceType } from "@plane/types"; // local import { persistence } from "@/local-db/storage.sqlite"; // services -import { IssueArchiveService, IssueDraftService, IssueService } from "@/services/issue"; +import { IssueArchiveService, WorkspaceDraftService, IssueService } from "@/services/issue"; // types import { IIssueDetail } from "./root.store"; export interface IIssueStoreActions { // actions - fetchIssue: ( - workspaceSlug: string, - projectId: string, - issueId: string, - issueStatus?: "DEFAULT" | "DRAFT" - ) => Promise; + fetchIssue: (workspaceSlug: string, projectId: string, issueId: string) => Promise; updateIssue: (workspaceSlug: string, projectId: string, issueId: string, data: Partial) => Promise; removeIssue: (workspaceSlug: string, projectId: string, issueId: string) => Promise; archiveIssue: (workspaceSlug: string, projectId: string, issueId: string) => Promise; @@ -52,7 +47,7 @@ export class IssueStore implements IIssueStore { issueService; epicService; issueArchiveService; - issueDraftService; + draftWorkItemService; constructor(rootStore: IIssueDetail, serviceType: TIssueServiceType) { makeObservable(this, { @@ -66,7 +61,7 @@ export class IssueStore implements IIssueStore { this.issueService = new IssueService(serviceType); this.epicService = new IssueService(EIssueServiceType.EPICS); this.issueArchiveService = new IssueArchiveService(serviceType); - this.issueDraftService = new IssueDraftService(); + this.draftWorkItemService = new WorkspaceDraftService(); } getIsFetchingIssueDetails = computedFn((issueId: string | undefined) => { @@ -93,7 +88,7 @@ export class IssueStore implements IIssueStore { }); // actions - fetchIssue = async (workspaceSlug: string, projectId: string, issueId: string, issueStatus = "DEFAULT") => { + fetchIssue = async (workspaceSlug: string, projectId: string, issueId: string) => { const query = { expand: "issue_reactions,issue_attachments,issue_link,parent", }; @@ -112,9 +107,7 @@ export class IssueStore implements IIssueStore { this.localDBIssueDescription = issueId; } - if (issueStatus === "DRAFT") - issue = await this.issueDraftService.getDraftIssueById(workspaceSlug, projectId, issueId, query); - else issue = await this.issueService.retrieve(workspaceSlug, projectId, issueId, query); + await this.issueService.retrieve(workspaceSlug, projectId, issueId, query); if (!issue) throw new Error("Work item not found"); diff --git a/apps/web/core/store/issue/issue-details/root.store.ts b/apps/web/core/store/issue/issue-details/root.store.ts index 1455dff91a..d8b9c80244 100644 --- a/apps/web/core/store/issue/issue-details/root.store.ts +++ b/apps/web/core/store/issue/issue-details/root.store.ts @@ -272,12 +272,8 @@ export abstract class IssueDetail implements IIssueDetail { setIssueLinkData = (issueLinkData: TIssueLink | null) => (this.issueLinkData = issueLinkData); // issue - fetchIssue = async ( - workspaceSlug: string, - projectId: string, - issueId: string, - issueStatus: "DEFAULT" | "DRAFT" = "DEFAULT" - ) => this.issue.fetchIssue(workspaceSlug, projectId, issueId, issueStatus); + fetchIssue = async (workspaceSlug: string, projectId: string, issueId: string) => + this.issue.fetchIssue(workspaceSlug, projectId, issueId); fetchIssueWithIdentifier = async (workspaceSlug: string, projectIdentifier: string, sequenceId: string) => this.issue.fetchIssueWithIdentifier(workspaceSlug, projectIdentifier, sequenceId); updateIssue = async (workspaceSlug: string, projectId: string, issueId: string, data: Partial) => diff --git a/apps/web/core/store/issue/root.store.ts b/apps/web/core/store/issue/root.store.ts index 3dc835f0fa..d8cc94bfeb 100644 --- a/apps/web/core/store/issue/root.store.ts +++ b/apps/web/core/store/issue/root.store.ts @@ -33,7 +33,6 @@ import { IWorkspaceMembership } from "@/store/member/workspace-member.store"; // issues data store import { IArchivedIssuesFilter, ArchivedIssuesFilter, IArchivedIssues, ArchivedIssues } from "./archived"; import { ICycleIssuesFilter, CycleIssuesFilter, ICycleIssues, CycleIssues } from "./cycle"; -import { IDraftIssuesFilter, DraftIssuesFilter, IDraftIssues, DraftIssues } from "./draft"; import { IIssueStore, IssueStore } from "./issue.store"; import { ICalendarStore, CalendarStore } from "./issue_calendar_view.store"; import { IIssueKanBanViewStore, IssueKanBanViewStore } from "./issue_kanban_view.store"; @@ -115,9 +114,6 @@ export interface IIssueRootStore { archivedIssuesFilter: IArchivedIssuesFilter; archivedIssues: IArchivedIssues; - draftIssuesFilter: IDraftIssuesFilter; - draftIssues: IDraftIssues; - issueKanBanView: IIssueKanBanViewStore; issueCalendarView: ICalendarStore; @@ -186,9 +182,6 @@ export class IssueRootStore implements IIssueRootStore { archivedIssuesFilter: IArchivedIssuesFilter; archivedIssues: IArchivedIssues; - draftIssuesFilter: IDraftIssuesFilter; - draftIssues: IDraftIssues; - issueKanBanView: IIssueKanBanViewStore; issueCalendarView: ICalendarStore; @@ -280,9 +273,6 @@ export class IssueRootStore implements IIssueRootStore { this.archivedIssuesFilter = new ArchivedIssuesFilter(this); this.archivedIssues = new ArchivedIssues(this, this.archivedIssuesFilter); - this.draftIssuesFilter = new DraftIssuesFilter(this); - this.draftIssues = new DraftIssues(this, this.draftIssuesFilter); - this.issueKanBanView = new IssueKanBanViewStore(this); this.issueCalendarView = new CalendarStore(); diff --git a/packages/types/src/issues/issue.ts b/packages/types/src/issues/issue.ts index f2adb48110..85069632eb 100644 --- a/packages/types/src/issues/issue.ts +++ b/packages/types/src/issues/issue.ts @@ -29,7 +29,6 @@ export enum EIssuesStoreType { TEAM_VIEW = "TEAM_VIEW", PROJECT_VIEW = "PROJECT_VIEW", ARCHIVED = "ARCHIVED", - DRAFT = "DRAFT", DEFAULT = "DEFAULT", WORKSPACE_DRAFT = "WORKSPACE_DRAFT", EPIC = "EPIC", From 50b4aca726a81c5eefeec1439199b3c806aa806d Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Tue, 2 Sep 2025 13:54:13 +0530 Subject: [PATCH 061/138] [WEB-4829] refactor: star us on GitHub link component (#7697) * [WEB-4829] refactor: star us on github link * fix: review comment --------- Co-authored-by: sriramveeraghanta --- .../[workspaceSlug]/(projects)/header.tsx | 44 +++---------------- .../(projects)/star-us-link.tsx | 44 +++++++++++++++++++ 2 files changed, 51 insertions(+), 37 deletions(-) create mode 100644 apps/web/app/(all)/[workspaceSlug]/(projects)/star-us-link.tsx diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/header.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/header.tsx index 938b458548..27ef0ad423 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/header.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/header.tsx @@ -1,28 +1,22 @@ "use client"; import { observer } from "mobx-react"; -import Image from "next/image"; -import { useTheme } from "next-themes"; import { Home, Shapes } from "lucide-react"; -// images -import githubBlackImage from "/public/logos/github-black.png"; -import githubWhiteImage from "/public/logos/github-white.png"; -// ui -import { GITHUB_REDIRECTED_TRACKER_EVENT, HEADER_GITHUB_ICON } from "@plane/constants"; +// plane imports import { useTranslation } from "@plane/i18n"; import { Breadcrumbs, Button, Header } from "@plane/ui"; // components import { BreadcrumbLink } from "@/components/common/breadcrumb-link"; -// constants // hooks -import { captureElementAndEvent } from "@/helpers/event-tracker.helper"; import { useHome } from "@/hooks/store/use-home"; +// local imports +import { StarUsOnGitHubLink } from "./star-us-link"; export const WorkspaceDashboardHeader = observer(() => { - // hooks - const { resolvedTheme } = useTheme(); - const { toggleWidgetSettings } = useHome(); + // plane hooks const { t } = useTranslation(); + // hooks + const { toggleWidgetSettings } = useHome(); return ( <> @@ -48,31 +42,7 @@ export const WorkspaceDashboardHeader = observer(() => {
{t("home.manage_widgets")}
- - captureElementAndEvent({ - element: { - elementName: HEADER_GITHUB_ICON, - }, - event: { - eventName: GITHUB_REDIRECTED_TRACKER_EVENT, - state: "SUCCESS", - }, - }) - } - className="flex flex-shrink-0 items-center gap-1.5 rounded bg-custom-background-80 px-3 py-1.5" - href="https://github.com/makeplane/plane" - target="_blank" - rel="noopener noreferrer" - > - GitHub Logo - {t("home.star_us_on_github")} - + diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/star-us-link.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/star-us-link.tsx new file mode 100644 index 0000000000..1573e75295 --- /dev/null +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/star-us-link.tsx @@ -0,0 +1,44 @@ +"use client"; + +import Image from "next/image"; +import { useTheme } from "next-themes"; +// plane imports +import { HEADER_GITHUB_ICON, GITHUB_REDIRECTED_TRACKER_EVENT } from "@plane/constants"; +import { useTranslation } from "@plane/i18n"; +// helpers +import { captureElementAndEvent } from "@/helpers/event-tracker.helper"; +// public imports +import githubBlackImage from "@/public/logos/github-black.png"; +import githubWhiteImage from "@/public/logos/github-white.png"; + +export const StarUsOnGitHubLink = () => { + // plane hooks + const { t } = useTranslation(); + // hooks + const { resolvedTheme } = useTheme(); + const imageSrc = resolvedTheme === "dark" ? githubWhiteImage : githubBlackImage; + + return ( + + captureElementAndEvent({ + element: { + elementName: HEADER_GITHUB_ICON, + }, + event: { + eventName: GITHUB_REDIRECTED_TRACKER_EVENT, + state: "SUCCESS", + }, + }) + } + className="flex flex-shrink-0 items-center gap-1.5 rounded bg-custom-background-80 px-3 py-1.5" + href="https://github.com/makeplane/plane" + target="_blank" + rel="noopener noreferrer" + > + + {t("home.star_us_on_github")} + + ); +}; From 2d31b562d809c0a2db218ddd1ac203e35ee36629 Mon Sep 17 00:00:00 2001 From: guru_sainath Date: Tue, 2 Sep 2025 14:18:13 +0530 Subject: [PATCH 062/138] [WEB-4823] chore: Add compound indexing for notification fields to improve query performance (#7691) * dev: handled indexing for the notification fields * dev: removing indexing related to workspaces * dev: handled indexing for file asset, user favorite, and page log * dev: indexing concurrently --- ...ileasset_asset_entity_type_idx_and_more.py | 75 +++++++++++++++++++ apps/api/plane/db/models/asset.py | 9 +++ apps/api/plane/db/models/favorite.py | 9 +++ apps/api/plane/db/models/notification.py | 8 ++ apps/api/plane/db/models/page.py | 15 +++- 5 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 apps/api/plane/db/migrations/0103_fileasset_asset_entity_type_idx_and_more.py diff --git a/apps/api/plane/db/migrations/0103_fileasset_asset_entity_type_idx_and_more.py b/apps/api/plane/db/migrations/0103_fileasset_asset_entity_type_idx_and_more.py new file mode 100644 index 0000000000..82deba4627 --- /dev/null +++ b/apps/api/plane/db/migrations/0103_fileasset_asset_entity_type_idx_and_more.py @@ -0,0 +1,75 @@ +# Generated by Django 4.2.22 on 2025-09-01 14:33 + +from django.db import migrations, models +from django.contrib.postgres.operations import AddIndexConcurrently + + +class Migration(migrations.Migration): + atomic = False + + dependencies = [ + ('db', '0102_page_sort_order_pagelog_entity_type_and_more'), + ] + + operations = [ + AddIndexConcurrently( + model_name='fileasset', + index=models.Index(fields=['entity_type'], name='asset_entity_type_idx'), + ), + AddIndexConcurrently( + model_name='fileasset', + index=models.Index(fields=['entity_identifier'], name='asset_entity_identifier_idx'), + ), + AddIndexConcurrently( + model_name='fileasset', + index=models.Index(fields=['entity_type', 'entity_identifier'], name='asset_entity_idx'), + ), + AddIndexConcurrently( + model_name='notification', + index=models.Index(fields=['entity_identifier'], name='notif_entity_identifier_idx'), + ), + AddIndexConcurrently( + model_name='notification', + index=models.Index(fields=['entity_name'], name='notif_entity_name_idx'), + ), + AddIndexConcurrently( + model_name='notification', + index=models.Index(fields=['read_at'], name='notif_read_at_idx'), + ), + AddIndexConcurrently( + model_name='notification', + index=models.Index(fields=['receiver', 'read_at'], name='notif_entity_idx'), + ), + AddIndexConcurrently( + model_name='pagelog', + index=models.Index(fields=['entity_type'], name='pagelog_entity_type_idx'), + ), + AddIndexConcurrently( + model_name='pagelog', + index=models.Index(fields=['entity_identifier'], name='pagelog_entity_id_idx'), + ), + AddIndexConcurrently( + model_name='pagelog', + index=models.Index(fields=['entity_name'], name='pagelog_entity_name_idx'), + ), + AddIndexConcurrently( + model_name='pagelog', + index=models.Index(fields=['entity_type', 'entity_identifier'], name='pagelog_type_id_idx'), + ), + AddIndexConcurrently( + model_name='pagelog', + index=models.Index(fields=['entity_name', 'entity_identifier'], name='pagelog_name_id_idx'), + ), + AddIndexConcurrently( + model_name='userfavorite', + index=models.Index(fields=['entity_type'], name='fav_entity_type_idx'), + ), + AddIndexConcurrently( + model_name='userfavorite', + index=models.Index(fields=['entity_identifier'], name='fav_entity_identifier_idx'), + ), + AddIndexConcurrently( + model_name='userfavorite', + index=models.Index(fields=['entity_type', 'entity_identifier'], name='fav_entity_idx'), + ), + ] diff --git a/apps/api/plane/db/models/asset.py b/apps/api/plane/db/models/asset.py index 9973d122f5..9652624822 100644 --- a/apps/api/plane/db/models/asset.py +++ b/apps/api/plane/db/models/asset.py @@ -76,6 +76,15 @@ class FileAsset(BaseModel): verbose_name_plural = "File Assets" db_table = "file_assets" ordering = ("-created_at",) + indexes = [ + models.Index(fields=["entity_type"], name="asset_entity_type_idx"), + models.Index( + fields=["entity_identifier"], name="asset_entity_identifier_idx" + ), + models.Index( + fields=["entity_type", "entity_identifier"], name="asset_entity_idx" + ), + ] def __str__(self): return str(self.asset) diff --git a/apps/api/plane/db/models/favorite.py b/apps/api/plane/db/models/favorite.py index 680bf7e376..1650720889 100644 --- a/apps/api/plane/db/models/favorite.py +++ b/apps/api/plane/db/models/favorite.py @@ -41,6 +41,15 @@ class UserFavorite(WorkspaceBaseModel): verbose_name_plural = "User Favorites" db_table = "user_favorites" ordering = ("-created_at",) + indexes = [ + models.Index(fields=["entity_type"], name="fav_entity_type_idx"), + models.Index( + fields=["entity_identifier"], name="fav_entity_identifier_idx" + ), + models.Index( + fields=["entity_type", "entity_identifier"], name="fav_entity_idx" + ), + ] def save(self, *args, **kwargs): if self._state.adding: diff --git a/apps/api/plane/db/models/notification.py b/apps/api/plane/db/models/notification.py index 2847c07cf0..a57e288abf 100644 --- a/apps/api/plane/db/models/notification.py +++ b/apps/api/plane/db/models/notification.py @@ -39,6 +39,14 @@ class Notification(BaseModel): verbose_name_plural = "Notifications" db_table = "notifications" ordering = ("-created_at",) + indexes = [ + models.Index( + fields=["entity_identifier"], name="notif_entity_identifier_idx" + ), + models.Index(fields=["entity_name"], name="notif_entity_name_idx"), + models.Index(fields=["read_at"], name="notif_read_at_idx"), + models.Index(fields=["receiver", "read_at"], name="notif_entity_idx"), + ] def __str__(self): """Return name of the notifications""" diff --git a/apps/api/plane/db/models/page.py b/apps/api/plane/db/models/page.py index 2918e79764..71fc49c457 100644 --- a/apps/api/plane/db/models/page.py +++ b/apps/api/plane/db/models/page.py @@ -101,7 +101,9 @@ class PageLog(BaseModel): page = models.ForeignKey(Page, related_name="page_log", on_delete=models.CASCADE) entity_identifier = models.UUIDField(null=True, blank=True) entity_name = models.CharField(max_length=30, verbose_name="Transaction Type") - entity_type = models.CharField(max_length=30, verbose_name="Entity Type", null=True, blank=True) + entity_type = models.CharField( + max_length=30, verbose_name="Entity Type", null=True, blank=True + ) workspace = models.ForeignKey( "db.Workspace", on_delete=models.CASCADE, related_name="workspace_page_log" ) @@ -112,6 +114,17 @@ class PageLog(BaseModel): verbose_name_plural = "Page Logs" db_table = "page_logs" ordering = ("-created_at",) + indexes = [ + models.Index(fields=["entity_type"], name="pagelog_entity_type_idx"), + models.Index(fields=["entity_identifier"], name="pagelog_entity_id_idx"), + models.Index(fields=["entity_name"], name="pagelog_entity_name_idx"), + models.Index( + fields=["entity_type", "entity_identifier"], name="pagelog_type_id_idx" + ), + models.Index( + fields=["entity_name", "entity_identifier"], name="pagelog_name_id_idx" + ), + ] def __str__(self): return f"{self.page.name} {self.entity_name}" From 779a96acb8bc819f65662cee5a2239b3aedf7a63 Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Tue, 2 Sep 2025 18:02:09 +0530 Subject: [PATCH 063/138] [WEB-4834] fix: range date picker weekStartsOn (#7699) * fix: range date picker weekStartsOn * chore: code refactor --- apps/web/core/components/dropdowns/date-range.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/web/core/components/dropdowns/date-range.tsx b/apps/web/core/components/dropdowns/date-range.tsx index d8c9bd4ba6..7f56b530a0 100644 --- a/apps/web/core/components/dropdowns/date-range.tsx +++ b/apps/web/core/components/dropdowns/date-range.tsx @@ -2,6 +2,7 @@ import React, { useEffect, useRef, useState } from "react"; import { Placement } from "@popperjs/core"; +import { observer } from "mobx-react"; import { DateRange, Matcher } from "react-day-picker"; import { usePopper } from "react-popper"; import { ArrowRight, CalendarCheck2, CalendarDays, X } from "lucide-react"; @@ -13,6 +14,7 @@ import { ComboDropDown, Calendar } from "@plane/ui"; import { cn, renderFormattedDate } from "@plane/utils"; // helpers // hooks +import { useUserProfile } from "@/hooks/store/user"; import { useDropdown } from "@/hooks/use-dropdown"; // components import { DropdownButton } from "./buttons"; @@ -59,7 +61,7 @@ type Props = { customTooltipHeading?: string; }; -export const DateRangeDropdown: React.FC = (props) => { +export const DateRangeDropdown: React.FC = observer((props) => { const { t } = useTranslation(); const { buttonClassName, @@ -95,6 +97,9 @@ export const DateRangeDropdown: React.FC = (props) => { // states const [isOpen, setIsOpen] = useState(false); const [dateRange, setDateRange] = useState(value); + // hooks + const { data } = useUserProfile(); + const startOfWeek = data?.start_of_the_week; // refs const dropdownRef = useRef(null); // popper-js refs @@ -274,6 +279,7 @@ export const DateRangeDropdown: React.FC = (props) => { disabled={disabledDays} showOutsideDays fixedWeeks + weekStartsOn={startOfWeek} initialFocus />
@@ -281,4 +287,4 @@ export const DateRangeDropdown: React.FC = (props) => { )} ); -}; +}); From 569b2fba83689b3a5cc267f8d0662b889fde5977 Mon Sep 17 00:00:00 2001 From: Vamsi Krishna <46787868+vamsikrishnamathala@users.noreply.github.com> Date: Tue, 2 Sep 2025 18:02:30 +0530 Subject: [PATCH 064/138] [WEB-4196]fix: toast message for sub work item quick actions (#7688) * fix: toast message for sub work item quick actions * chore: updated translation files --- .../issue-detail-widgets/sub-issues/helper.ts | 30 +++++++++++++++---- .../i18n/src/locales/cs/translations.json | 4 +++ .../i18n/src/locales/de/translations.json | 4 +++ .../i18n/src/locales/en/translations.json | 4 +++ .../i18n/src/locales/es/translations.json | 4 +++ .../i18n/src/locales/fr/translations.json | 4 +++ .../i18n/src/locales/id/translations.json | 4 +++ .../i18n/src/locales/it/translations.json | 4 +++ .../i18n/src/locales/ja/translations.json | 4 +++ .../i18n/src/locales/ko/translations.json | 4 +++ .../i18n/src/locales/pl/translations.json | 4 +++ .../i18n/src/locales/pt-BR/translations.json | 4 +++ .../i18n/src/locales/ro/translations.json | 4 +++ .../i18n/src/locales/ru/translations.json | 4 +++ .../i18n/src/locales/sk/translations.json | 4 +++ .../i18n/src/locales/tr-TR/translations.json | 4 +++ .../i18n/src/locales/ua/translations.json | 4 +++ .../i18n/src/locales/vi-VN/translations.json | 4 +++ .../i18n/src/locales/zh-CN/translations.json | 4 +++ .../i18n/src/locales/zh-TW/translations.json | 4 +++ 20 files changed, 100 insertions(+), 6 deletions(-) diff --git a/apps/web/core/components/issues/issue-detail-widgets/sub-issues/helper.ts b/apps/web/core/components/issues/issue-detail-widgets/sub-issues/helper.ts index fe3fc5dfd8..0f4f8fdd58 100644 --- a/apps/web/core/components/issues/issue-detail-widgets/sub-issues/helper.ts +++ b/apps/web/core/components/issues/issue-detail-widgets/sub-issues/helper.ts @@ -46,7 +46,10 @@ export const useSubIssueOperations = (issueServiceType: TIssueServiceType): TSub type: TOAST_TYPE.SUCCESS, title: t("common.link_copied"), message: t("entity.link_copied_to_clipboard", { - entity: t("epic.label", { count: 1 }), + entity: + issueServiceType === EIssueServiceType.ISSUES + ? t("common.sub_work_items", { count: 1 }) + : t("issue.label", { count: 1 }), }), }); }); @@ -77,7 +80,7 @@ export const useSubIssueOperations = (issueServiceType: TIssueServiceType): TSub entity: issueServiceType === EIssueServiceType.ISSUES ? t("common.sub_work_items") - : t("issue.label", { count: 2 }), + : t("issue.label", { count: issueIds.length }), }), }); } catch { @@ -88,7 +91,7 @@ export const useSubIssueOperations = (issueServiceType: TIssueServiceType): TSub entity: issueServiceType === EIssueServiceType.ISSUES ? t("common.sub_work_items") - : t("issue.label", { count: 2 }), + : t("issue.label", { count: issueIds.length }), }), }); } @@ -169,7 +172,12 @@ export const useSubIssueOperations = (issueServiceType: TIssueServiceType): TSub setToast({ type: TOAST_TYPE.SUCCESS, title: t("toast.success"), - message: t("sub_work_item.remove.success"), + message: t("entity.remove.success", { + entity: + issueServiceType === EIssueServiceType.ISSUES + ? t("common.sub_work_items") + : t("issue.label", { count: 1 }), + }), }); captureSuccess({ eventName: WORK_ITEM_TRACKER_EVENTS.sub_issue.remove, @@ -185,7 +193,12 @@ export const useSubIssueOperations = (issueServiceType: TIssueServiceType): TSub setToast({ type: TOAST_TYPE.ERROR, title: t("toast.error"), - message: t("sub_work_item.remove.error"), + message: t("entity.remove.failed", { + entity: + issueServiceType === EIssueServiceType.ISSUES + ? t("common.sub_work_items") + : t("issue.label", { count: 1 }), + }), }); } }, @@ -208,7 +221,12 @@ export const useSubIssueOperations = (issueServiceType: TIssueServiceType): TSub setToast({ type: TOAST_TYPE.ERROR, title: t("toast.error"), - message: t("issue.delete.error"), + message: t("entity.delete.failed", { + entity: + issueServiceType === EIssueServiceType.ISSUES + ? t("common.sub_work_items") + : t("issue.label", { count: 1 }), + }), }); } }, diff --git a/packages/i18n/src/locales/cs/translations.json b/packages/i18n/src/locales/cs/translations.json index 307289bb16..9881f5e6db 100644 --- a/packages/i18n/src/locales/cs/translations.json +++ b/packages/i18n/src/locales/cs/translations.json @@ -916,6 +916,10 @@ "add": { "success": "{entity} úspěšně přidána", "failed": "Chyba při přidávání {entity}" + }, + "remove": { + "success": "{entity} úspěšně odebrána", + "failed": "Chyba při odebírání {entity}" } }, "epic": { diff --git a/packages/i18n/src/locales/de/translations.json b/packages/i18n/src/locales/de/translations.json index 3c086c8cf6..bcce9268f7 100644 --- a/packages/i18n/src/locales/de/translations.json +++ b/packages/i18n/src/locales/de/translations.json @@ -916,6 +916,10 @@ "add": { "success": "{entity} erfolgreich hinzugefügt", "failed": "Fehler beim Hinzufügen von {entity}" + }, + "remove": { + "success": "{entity} erfolgreich entfernt", + "failed": "Fehler beim Entfernen von {entity}" } }, "epic": { diff --git a/packages/i18n/src/locales/en/translations.json b/packages/i18n/src/locales/en/translations.json index 6d77eb3410..026fc90c1b 100644 --- a/packages/i18n/src/locales/en/translations.json +++ b/packages/i18n/src/locales/en/translations.json @@ -759,6 +759,10 @@ "add": { "success": "{entity} added successfully", "failed": "Error adding {entity}" + }, + "remove": { + "success": "{entity} removed successfully", + "failed": "Error removing {entity}" } }, "epic": { diff --git a/packages/i18n/src/locales/es/translations.json b/packages/i18n/src/locales/es/translations.json index 0f17e8f8ae..823d427b47 100644 --- a/packages/i18n/src/locales/es/translations.json +++ b/packages/i18n/src/locales/es/translations.json @@ -919,6 +919,10 @@ "add": { "success": "{entity} agregado correctamente", "failed": "Error al agregar {entity}" + }, + "remove": { + "success": "{entity} eliminado correctamente", + "failed": "Error al eliminar {entity}" } }, "epic": { diff --git a/packages/i18n/src/locales/fr/translations.json b/packages/i18n/src/locales/fr/translations.json index a078526fec..5a24044cbe 100644 --- a/packages/i18n/src/locales/fr/translations.json +++ b/packages/i18n/src/locales/fr/translations.json @@ -917,6 +917,10 @@ "add": { "success": "{entity} ajouté avec succès", "failed": "Erreur lors de l'ajout de {entity}" + }, + "remove": { + "success": "{entity} supprimé avec succès", + "failed": "Erreur lors de la suppression de {entity}" } }, "epic": { diff --git a/packages/i18n/src/locales/id/translations.json b/packages/i18n/src/locales/id/translations.json index 01f6d14241..caa973bd08 100644 --- a/packages/i18n/src/locales/id/translations.json +++ b/packages/i18n/src/locales/id/translations.json @@ -916,6 +916,10 @@ "add": { "success": "{entity} berhasil ditambahkan", "failed": "Terjadi kesalahan saat menambahkan {entity}" + }, + "remove": { + "success": "{entity} berhasil dihapus", + "failed": "Terjadi kesalahan saat menghapus {entity}" } }, "epic": { diff --git a/packages/i18n/src/locales/it/translations.json b/packages/i18n/src/locales/it/translations.json index fc457eeb0d..11b5f93c93 100644 --- a/packages/i18n/src/locales/it/translations.json +++ b/packages/i18n/src/locales/it/translations.json @@ -915,6 +915,10 @@ "add": { "success": "{entity} aggiunto con successo", "failed": "Errore nell'aggiunta di {entity}" + }, + "remove": { + "success": "{entity} rimosso con successo", + "failed": "Errore nella rimozione di {entity}" } }, "epic": { diff --git a/packages/i18n/src/locales/ja/translations.json b/packages/i18n/src/locales/ja/translations.json index e92e0a182b..b7a43808aa 100644 --- a/packages/i18n/src/locales/ja/translations.json +++ b/packages/i18n/src/locales/ja/translations.json @@ -917,6 +917,10 @@ "add": { "success": "{entity}を追加しました", "failed": "{entity}の追加中にエラーが発生しました" + }, + "remove": { + "success": "{entity}を削除しました", + "failed": "{entity}の削除中にエラーが発生しました" } }, "epic": { diff --git a/packages/i18n/src/locales/ko/translations.json b/packages/i18n/src/locales/ko/translations.json index 3f253931b7..bc23bc6e10 100644 --- a/packages/i18n/src/locales/ko/translations.json +++ b/packages/i18n/src/locales/ko/translations.json @@ -918,6 +918,10 @@ "add": { "success": "{entity}가 성공적으로 추가되었습니다", "failed": "{entity} 추가 중 오류 발생" + }, + "remove": { + "success": "{entity}가 성공적으로 제거되었습니다", + "failed": "{entity} 제거 중 오류 발생" } }, "epic": { diff --git a/packages/i18n/src/locales/pl/translations.json b/packages/i18n/src/locales/pl/translations.json index fdb2d0958a..56dbf089b2 100644 --- a/packages/i18n/src/locales/pl/translations.json +++ b/packages/i18n/src/locales/pl/translations.json @@ -918,6 +918,10 @@ "add": { "success": "{entity} dodano pomyślnie", "failed": "Błąd podczas dodawania {entity}" + }, + "remove": { + "success": "{entity} usunięto pomyślnie", + "failed": "Błąd podczas usuwania {entity}" } }, "epic": { diff --git a/packages/i18n/src/locales/pt-BR/translations.json b/packages/i18n/src/locales/pt-BR/translations.json index d12918556e..831b3515e1 100644 --- a/packages/i18n/src/locales/pt-BR/translations.json +++ b/packages/i18n/src/locales/pt-BR/translations.json @@ -918,6 +918,10 @@ "add": { "success": "{entity} adicionado com sucesso", "failed": "Erro ao adicionar {entity}" + }, + "remove": { + "success": "{entity} removido com sucesso", + "failed": "Erro ao remover {entity}" } }, "epic": { diff --git a/packages/i18n/src/locales/ro/translations.json b/packages/i18n/src/locales/ro/translations.json index caa1178d11..82cf21bfc6 100644 --- a/packages/i18n/src/locales/ro/translations.json +++ b/packages/i18n/src/locales/ro/translations.json @@ -916,6 +916,10 @@ "add": { "success": "{entity} a fost adăugată cu succes", "failed": "Eroare la adăugarea {entity}" + }, + "remove": { + "success": "{entity} a fost eliminată cu succes", + "failed": "Eroare la eliminarea {entity}" } }, "epic": { diff --git a/packages/i18n/src/locales/ru/translations.json b/packages/i18n/src/locales/ru/translations.json index 8481b596cb..7d11338b72 100644 --- a/packages/i18n/src/locales/ru/translations.json +++ b/packages/i18n/src/locales/ru/translations.json @@ -918,6 +918,10 @@ "add": { "success": "{entity} успешно добавлен", "failed": "Ошибка добавления {entity}" + }, + "remove": { + "success": "{entity} успешно удален", + "failed": "Ошибка удаления {entity}" } }, "epic": { diff --git a/packages/i18n/src/locales/sk/translations.json b/packages/i18n/src/locales/sk/translations.json index 7c89fc1317..f04165391e 100644 --- a/packages/i18n/src/locales/sk/translations.json +++ b/packages/i18n/src/locales/sk/translations.json @@ -918,6 +918,10 @@ "add": { "success": "{entity} bola úspešne pridaná", "failed": "Chyba pri pridávaní {entity}" + }, + "remove": { + "success": "{entity} bola úspešne odstránená", + "failed": "Chyba pri odstrávaní {entity}" } }, "epic": { diff --git a/packages/i18n/src/locales/tr-TR/translations.json b/packages/i18n/src/locales/tr-TR/translations.json index 349e547ad6..8da90adc82 100644 --- a/packages/i18n/src/locales/tr-TR/translations.json +++ b/packages/i18n/src/locales/tr-TR/translations.json @@ -920,6 +920,10 @@ "add": { "success": "{entity} başarıyla eklendi", "failed": "{entity} eklenirken hata oluştu" + }, + "remove": { + "success": "{entity} başarıyla kaldırıldı", + "failed": "{entity} kaldırılırken hata oluştu" } }, "epic": { diff --git a/packages/i18n/src/locales/ua/translations.json b/packages/i18n/src/locales/ua/translations.json index 1a3ab64f9e..bd2158d96f 100644 --- a/packages/i18n/src/locales/ua/translations.json +++ b/packages/i18n/src/locales/ua/translations.json @@ -918,6 +918,10 @@ "add": { "success": "{entity} успішно додано", "failed": "Помилка під час додавання {entity}" + }, + "remove": { + "success": "{entity} успішно видалено", + "failed": "Помилка під час видалення {entity}" } }, "epic": { diff --git a/packages/i18n/src/locales/vi-VN/translations.json b/packages/i18n/src/locales/vi-VN/translations.json index 947f10b166..b8610c2e04 100644 --- a/packages/i18n/src/locales/vi-VN/translations.json +++ b/packages/i18n/src/locales/vi-VN/translations.json @@ -917,6 +917,10 @@ "add": { "success": "Đã thêm {entity} thành công", "failed": "Đã xảy ra lỗi khi thêm {entity}" + }, + "remove": { + "success": "Đã xóa {entity} thành công", + "failed": "Đã xảy ra lỗi khi xóa {entity}" } }, "epic": { diff --git a/packages/i18n/src/locales/zh-CN/translations.json b/packages/i18n/src/locales/zh-CN/translations.json index 444936c501..55ace9a666 100644 --- a/packages/i18n/src/locales/zh-CN/translations.json +++ b/packages/i18n/src/locales/zh-CN/translations.json @@ -917,6 +917,10 @@ "add": { "success": "{entity}添加成功", "failed": "添加{entity}时出错" + }, + "remove": { + "success": "{entity}删除成功", + "failed": "删除{entity}时出错" } }, "epic": { diff --git a/packages/i18n/src/locales/zh-TW/translations.json b/packages/i18n/src/locales/zh-TW/translations.json index 724c434db0..6c6a85f202 100644 --- a/packages/i18n/src/locales/zh-TW/translations.json +++ b/packages/i18n/src/locales/zh-TW/translations.json @@ -918,6 +918,10 @@ "add": { "success": "{entity} 新增成功", "failed": "新增 {entity} 時發生錯誤" + }, + "remove": { + "success": "{entity} 刪除成功", + "failed": "刪除 {entity} 時發生錯誤" } }, "epic": { From 26b48bfcf070a740791eaa19f2875f3cd7e9b9e4 Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Tue, 2 Sep 2025 18:19:56 +0530 Subject: [PATCH 065/138] [WEB-4724] feat: migrate tooltips from blueprintjs to base-ui (#7646) * feat: add card component to propel package and update tooltip imports * refactor: remove @plane/ui dependency and update tooltip imports to use local card component * fix: lint * refactor: update import from @plane/ui to @plane/utils in command component * chore: removed blueprintjs/core and blueprintjs/popover2 dependencies * chore: updated tooltip instances across platform and performed related code refactoring * chore: code refactor * chore: code refactor * fix: lint and build error * chore: code refactor * chore: code refactor * chore: code refactor * chore: code refactor * fix: format issue * fix: build fix --------- Co-authored-by: Jayash Tripathy <76092296+JayashTripathy@users.noreply.github.com> --- .../(dashboard)/sidebar-help-section.tsx | 3 +- .../app/(all)/(dashboard)/sidebar-menu.tsx | 3 +- .../components/common/breadcrumb-link.tsx | 2 +- .../core/components/workspace/list-item.tsx | 2 +- apps/space/core/components/editor/toolbar.tsx | 3 +- .../issues/issue-layouts/kanban/block.tsx | 2 +- .../issues/issue-layouts/list/block.tsx | 4 +- .../properties/all-properties.tsx | 2 +- .../issues/issue-layouts/properties/cycle.tsx | 3 +- .../issue-layouts/properties/due-date.tsx | 2 +- .../issue-layouts/properties/labels.tsx | 2 +- .../issue-layouts/properties/modules.tsx | 3 +- .../issue-layouts/properties/priority.tsx | 3 +- .../issues/issue-layouts/properties/state.tsx | 3 +- .../issues/navbar/layout-selection.tsx | 2 +- .../comment/comment-reactions.tsx | 2 +- .../reactions/issue-emoji-reactions.tsx | 2 +- .../issues/reactions/issue-vote-reactions.tsx | 2 +- apps/space/package.json | 2 - .../(projects)/extended-project-sidebar.tsx | 3 +- .../(detail)/[projectId]/archives/header.tsx | 3 +- .../[projectId]/cycles/(detail)/header.tsx | 3 +- .../[projectId]/modules/(detail)/header.tsx | 3 +- .../views/(detail)/[viewId]/header.tsx | 3 +- apps/web/app/(all)/profile/sidebar.tsx | 3 +- .../ce/components/comments/comment-block.tsx | 3 +- .../estimates/estimate-list-item-buttons.tsx | 2 +- apps/web/ce/components/issues/header.tsx | 3 +- .../issues/issue-details/issue-identifier.tsx | 3 +- .../pages/editor/ai/ask-pi-menu.tsx | 2 +- .../ce/components/pages/editor/ai/menu.tsx | 2 +- .../components/pages/header/lock-control.tsx | 2 +- .../ce/components/workspace/edition-badge.tsx | 3 +- .../sidebar/extended-sidebar-item.tsx | 5 +- .../modal/generated-token-details.tsx | 3 +- .../components/api-token/token-list-item.tsx | 2 +- .../components/comments/comment-reaction.tsx | 2 +- .../core/components/common/access-field.tsx | 2 +- .../common/activity/activity-block.tsx | 2 +- apps/web/core/components/core/activity.tsx | 3 +- .../core/description-versions/modal.tsx | 2 +- .../core/components/core/list/list-item.tsx | 3 +- .../modals/existing-issues-list-modal.tsx | 3 +- .../cycles/active-cycle/cycle-stats.tsx | 5 +- .../cycles/list/cycle-list-item-action.tsx | 3 +- .../web/core/components/dropdowns/buttons.tsx | 14 +- .../core/components/dropdowns/date-range.tsx | 16 +- .../dropdowns/module/button-content.tsx | 3 +- .../core/components/dropdowns/priority.tsx | 3 +- .../components/editor/lite-text/toolbar.tsx | 3 +- .../editor/sticky-editor/toolbar.tsx | 2 +- .../components/estimates/create/stage-one.tsx | 2 +- .../components/estimates/points/create.tsx | 3 +- .../components/estimates/points/update.tsx | 3 +- .../gantt-chart/helpers/add-block.tsx | 2 +- .../components/home/widgets/recents/issue.tsx | 3 +- .../components/icons/locked-component.tsx | 2 +- .../inbox/content/issue-properties.tsx | 3 +- .../inbox/sidebar/inbox-list-item.tsx | 3 +- .../integration/single-integration-card.tsx | 3 +- .../issues/attachment/attachment-detail.tsx | 2 +- .../attachment/attachment-list-item.tsx | 3 +- .../attachment-list-upload-item.tsx | 3 +- .../attachment/attachment-upload-details.tsx | 3 +- .../sub-issues/issues-list/list-item.tsx | 3 +- .../actions/helpers/activity-block.tsx | 2 +- .../activity/actions/helpers/issue-link.tsx | 2 +- .../activity/actions/label-activity-chip.tsx | 2 +- .../issue-detail-quick-actions.tsx | 3 +- .../issues/issue-detail/links/link-detail.tsx | 3 +- .../issues/issue-detail/links/link-item.tsx | 3 +- .../issues/issue-detail/parent-select.tsx | 2 +- .../issue-detail/reactions/issue-comment.tsx | 3 +- .../issues/issue-detail/reactions/issue.tsx | 3 +- .../issues/issue-detail/relation-select.tsx | 3 +- .../issue-layouts/calendar/issue-block.tsx | 3 +- .../filters/header/layout-selection.tsx | 2 +- .../issues/issue-layouts/gantt/blocks.tsx | 5 +- .../issues/issue-layouts/kanban/block.tsx | 3 +- .../issues/issue-layouts/list/block.tsx | 5 +- .../issue-layouts/list/list-view-types.d.ts | 6 +- .../properties/all-properties.tsx | 2 +- .../issue-layouts/properties/labels.tsx | 2 +- .../issue-layouts/spreadsheet/issue-row.tsx | 3 +- apps/web/core/components/issues/label.tsx | 2 +- .../components/issues/peek-overview/error.tsx | 2 +- .../issues/peek-overview/header.tsx | 11 +- .../issues/peek-overview/loader.tsx | 3 +- .../issues/relations/issue-list-item.tsx | 3 +- .../workspace-draft/draft-issue-block.tsx | 5 +- .../components/modules/gantt-chart/blocks.tsx | 5 +- .../components/modules/links/list-item.tsx | 3 +- .../components/modules/module-card-item.tsx | 2 +- .../modules/module-list-item-action.tsx | 3 +- .../components/modules/module-view-header.tsx | 2 +- .../web/core/components/onboarding/header.tsx | 5 +- .../components/pages/editor/toolbar/root.tsx | 2 +- .../pages/editor/toolbar/toolbar.tsx | 3 +- .../components/pages/header/offline-badge.tsx | 2 +- .../pages/list/block-item-action.tsx | 3 +- .../components/pages/navigation-pane/root.tsx | 2 +- apps/web/core/components/profile/sidebar.tsx | 3 +- .../project-states/options/delete.tsx | 3 +- .../project/applied-filters/root.tsx | 3 +- apps/web/core/components/project/card.tsx | 2 +- .../project/create/common-attributes.tsx | 5 +- apps/web/core/components/project/form.tsx | 4 +- .../project/settings/features-list.tsx | 3 +- .../core/components/stickies/action-bar.tsx | 3 +- apps/web/core/components/ui/labels-list.tsx | 2 +- .../views/view-list-item-action.tsx | 3 +- .../components/web-hooks/form/secret-key.tsx | 3 +- .../sidebar/filters/menu/root.tsx | 3 +- .../sidebar/header/options/root.tsx | 3 +- .../notification-card/options/button.tsx | 2 +- .../notification-card/options/snooze/root.tsx | 3 +- .../sidebar/favorites/favorite-folder.tsx | 5 +- .../common/favorite-item-drag-handle.tsx | 5 +- .../common/favorite-item-title.tsx | 2 +- .../sidebar/favorites/favorites-menu.tsx | 3 +- .../workspace/sidebar/help-menu.tsx | 3 +- .../workspace/sidebar/help-section.tsx | 3 +- .../workspace/sidebar/projects-list-item.tsx | 5 +- .../workspace/sidebar/projects-list.tsx | 3 +- .../layouts/auth-layout/workspace-wrapper.tsx | 3 +- packages/editor/package.json | 1 + .../extensions/code/code-block-node-view.tsx | 2 +- .../components/toolbar/alignment.tsx | 2 +- .../components/toolbar/download.tsx | 2 +- .../components/toolbar/full-screen/root.tsx | 2 +- packages/propel/package.json | 2 + packages/propel/src/accordion/accordion.tsx | 2 +- .../propel/src/charts/components/tooltip.tsx | 2 +- packages/propel/src/tooltip/root.tsx | 4 +- packages/propel/src/utils/index.ts | 1 + packages/ui/package.json | 1 + packages/ui/src/avatar/avatar-group.tsx | 2 +- packages/ui/src/avatar/avatar.tsx | 2 +- packages/ui/src/breadcrumbs/breadcrumbs.tsx | 2 +- .../src/breadcrumbs/navigation-dropdown.tsx | 2 +- .../navigation-search-dropdown.tsx | 2 +- .../ui/src/dropdowns/custom-search-select.tsx | 2 +- packages/ui/src/dropdowns/helper.tsx | 15 +- .../form-fields/password/password-input.tsx | 2 +- .../progress/linear-progress-indicator.tsx | 2 +- pnpm-lock.yaml | 308 ++++-------------- 146 files changed, 325 insertions(+), 426 deletions(-) diff --git a/apps/admin/app/(all)/(dashboard)/sidebar-help-section.tsx b/apps/admin/app/(all)/(dashboard)/sidebar-help-section.tsx index cedc735a91..d75b84be5b 100644 --- a/apps/admin/app/(all)/(dashboard)/sidebar-help-section.tsx +++ b/apps/admin/app/(all)/(dashboard)/sidebar-help-section.tsx @@ -7,7 +7,8 @@ import { ExternalLink, FileText, HelpCircle, MoveLeft } from "lucide-react"; import { Transition } from "@headlessui/react"; // plane internal packages import { WEB_BASE_URL } from "@plane/constants"; -import { DiscordIcon, GithubIcon, Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; +import { DiscordIcon, GithubIcon } from "@plane/ui"; import { cn } from "@plane/utils"; // hooks import { useTheme } from "@/hooks/store"; diff --git a/apps/admin/app/(all)/(dashboard)/sidebar-menu.tsx b/apps/admin/app/(all)/(dashboard)/sidebar-menu.tsx index e536a51454..ff5aabd3ca 100644 --- a/apps/admin/app/(all)/(dashboard)/sidebar-menu.tsx +++ b/apps/admin/app/(all)/(dashboard)/sidebar-menu.tsx @@ -5,7 +5,8 @@ import Link from "next/link"; import { usePathname } from "next/navigation"; import { Image, BrainCog, Cog, Lock, Mail } from "lucide-react"; // plane internal packages -import { Tooltip, WorkspaceIcon } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; +import { WorkspaceIcon } from "@plane/ui"; import { cn } from "@plane/utils"; // hooks import { useTheme } from "@/hooks/store"; diff --git a/apps/admin/core/components/common/breadcrumb-link.tsx b/apps/admin/core/components/common/breadcrumb-link.tsx index d5a00ccaa5..567b88d923 100644 --- a/apps/admin/core/components/common/breadcrumb-link.tsx +++ b/apps/admin/core/components/common/breadcrumb-link.tsx @@ -1,7 +1,7 @@ "use client"; import Link from "next/link"; -import { Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; type Props = { label?: string; diff --git a/apps/admin/core/components/workspace/list-item.tsx b/apps/admin/core/components/workspace/list-item.tsx index ae693eb728..85a2b3c61e 100644 --- a/apps/admin/core/components/workspace/list-item.tsx +++ b/apps/admin/core/components/workspace/list-item.tsx @@ -2,7 +2,7 @@ import { observer } from "mobx-react"; import { ExternalLink } from "lucide-react"; // plane internal packages import { WEB_BASE_URL } from "@plane/constants"; -import { Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; import { getFileURL } from "@plane/utils"; // hooks import { useWorkspace } from "@/hooks/store"; diff --git a/apps/space/core/components/editor/toolbar.tsx b/apps/space/core/components/editor/toolbar.tsx index ed9c855d8b..48fec23ea9 100644 --- a/apps/space/core/components/editor/toolbar.tsx +++ b/apps/space/core/components/editor/toolbar.tsx @@ -3,7 +3,8 @@ import React, { useEffect, useState, useCallback } from "react"; // plane imports import { TOOLBAR_ITEMS, type ToolbarMenuItem, type EditorRefApi } from "@plane/editor"; -import { Button, Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; +import { Button } from "@plane/ui"; import { cn } from "@plane/utils"; type Props = { diff --git a/apps/space/core/components/issues/issue-layouts/kanban/block.tsx b/apps/space/core/components/issues/issue-layouts/kanban/block.tsx index 806b16a52b..7511d9aaf9 100644 --- a/apps/space/core/components/issues/issue-layouts/kanban/block.tsx +++ b/apps/space/core/components/issues/issue-layouts/kanban/block.tsx @@ -5,9 +5,9 @@ import { observer } from "mobx-react"; import Link from "next/link"; import { useParams, useSearchParams } from "next/navigation"; // plane types +import { Tooltip } from "@plane/propel/tooltip"; import { IIssueDisplayProperties } from "@plane/types"; // plane ui -import { Tooltip } from "@plane/ui"; // plane utils import { cn } from "@plane/utils"; // components diff --git a/apps/space/core/components/issues/issue-layouts/list/block.tsx b/apps/space/core/components/issues/issue-layouts/list/block.tsx index f66e3da28b..a56c3d5b9d 100644 --- a/apps/space/core/components/issues/issue-layouts/list/block.tsx +++ b/apps/space/core/components/issues/issue-layouts/list/block.tsx @@ -5,9 +5,9 @@ import { observer } from "mobx-react"; import Link from "next/link"; import { useParams, useSearchParams } from "next/navigation"; // plane types +import { Tooltip } from "@plane/propel/tooltip"; import { IIssueDisplayProperties } from "@plane/types"; // plane ui -import { Tooltip } from "@plane/ui"; // plane utils import { cn } from "@plane/utils"; // helpers @@ -75,7 +75,7 @@ export const IssueBlock = observer((props: IssueBlockProps) => { onClick={handleIssuePeekOverview} className="w-full truncate cursor-pointer text-sm text-custom-text-100" > - +

{issue.name}

diff --git a/apps/space/core/components/issues/issue-layouts/properties/all-properties.tsx b/apps/space/core/components/issues/issue-layouts/properties/all-properties.tsx index 1072f34108..e8a8ead178 100644 --- a/apps/space/core/components/issues/issue-layouts/properties/all-properties.tsx +++ b/apps/space/core/components/issues/issue-layouts/properties/all-properties.tsx @@ -3,8 +3,8 @@ import { observer } from "mobx-react"; import { Layers, Link, Paperclip } from "lucide-react"; // plane imports +import { Tooltip } from "@plane/propel/tooltip"; import type { IIssueDisplayProperties } from "@plane/types"; -import { Tooltip } from "@plane/ui"; import { cn } from "@plane/utils"; // components import { WithDisplayPropertiesHOC } from "@/components/issues/issue-layouts/with-display-properties-HOC"; diff --git a/apps/space/core/components/issues/issue-layouts/properties/cycle.tsx b/apps/space/core/components/issues/issue-layouts/properties/cycle.tsx index 1774781cd3..d9bc971a9b 100644 --- a/apps/space/core/components/issues/issue-layouts/properties/cycle.tsx +++ b/apps/space/core/components/issues/issue-layouts/properties/cycle.tsx @@ -2,7 +2,8 @@ import { observer } from "mobx-react"; // plane ui -import { ContrastIcon, Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; +import { ContrastIcon } from "@plane/ui"; // plane utils import { cn } from "@plane/utils"; //hooks diff --git a/apps/space/core/components/issues/issue-layouts/properties/due-date.tsx b/apps/space/core/components/issues/issue-layouts/properties/due-date.tsx index a4285cb934..2f1669837e 100644 --- a/apps/space/core/components/issues/issue-layouts/properties/due-date.tsx +++ b/apps/space/core/components/issues/issue-layouts/properties/due-date.tsx @@ -2,7 +2,7 @@ import { observer } from "mobx-react"; import { CalendarCheck2 } from "lucide-react"; -import { Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; import { cn } from "@plane/utils"; // helpers import { renderFormattedDate } from "@/helpers/date-time.helper"; diff --git a/apps/space/core/components/issues/issue-layouts/properties/labels.tsx b/apps/space/core/components/issues/issue-layouts/properties/labels.tsx index d4040f2e20..12ed76d3a5 100644 --- a/apps/space/core/components/issues/issue-layouts/properties/labels.tsx +++ b/apps/space/core/components/issues/issue-layouts/properties/labels.tsx @@ -3,7 +3,7 @@ import { observer } from "mobx-react"; import { Tags } from "lucide-react"; // plane imports -import { Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; // hooks import { useLabel } from "@/hooks/store/use-label"; diff --git a/apps/space/core/components/issues/issue-layouts/properties/modules.tsx b/apps/space/core/components/issues/issue-layouts/properties/modules.tsx index 465f469c0b..834cdc4ae9 100644 --- a/apps/space/core/components/issues/issue-layouts/properties/modules.tsx +++ b/apps/space/core/components/issues/issue-layouts/properties/modules.tsx @@ -2,7 +2,8 @@ import { observer } from "mobx-react"; // plane ui -import { DiceIcon, Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; +import { DiceIcon } from "@plane/ui"; // plane utils import { cn } from "@plane/utils"; // hooks diff --git a/apps/space/core/components/issues/issue-layouts/properties/priority.tsx b/apps/space/core/components/issues/issue-layouts/properties/priority.tsx index d2c4c55292..36b132ea0c 100644 --- a/apps/space/core/components/issues/issue-layouts/properties/priority.tsx +++ b/apps/space/core/components/issues/issue-layouts/properties/priority.tsx @@ -3,8 +3,9 @@ import { SignalHigh } from "lucide-react"; import { useTranslation } from "@plane/i18n"; // types +import { Tooltip } from "@plane/propel/tooltip"; import { TIssuePriorities } from "@plane/types"; -import { PriorityIcon, Tooltip } from "@plane/ui"; +import { PriorityIcon } from "@plane/ui"; // constants import { cn, getIssuePriorityFilters } from "@plane/utils"; diff --git a/apps/space/core/components/issues/issue-layouts/properties/state.tsx b/apps/space/core/components/issues/issue-layouts/properties/state.tsx index 16bfcb4f75..76754be3de 100644 --- a/apps/space/core/components/issues/issue-layouts/properties/state.tsx +++ b/apps/space/core/components/issues/issue-layouts/properties/state.tsx @@ -2,7 +2,8 @@ import { observer } from "mobx-react"; // plane ui -import { StateGroupIcon, Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; +import { StateGroupIcon } from "@plane/ui"; // plane utils import { cn } from "@plane/utils"; //hooks diff --git a/apps/space/core/components/issues/navbar/layout-selection.tsx b/apps/space/core/components/issues/navbar/layout-selection.tsx index a56240b9e6..143d81d826 100644 --- a/apps/space/core/components/issues/navbar/layout-selection.tsx +++ b/apps/space/core/components/issues/navbar/layout-selection.tsx @@ -7,7 +7,7 @@ import { useRouter, useSearchParams } from "next/navigation"; import { SITES_ISSUE_LAYOUTS } from "@plane/constants"; // plane i18n import { useTranslation } from "@plane/i18n"; -import { Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; // helpers import { queryParamGenerator } from "@/helpers/query-param-generator"; // hooks diff --git a/apps/space/core/components/issues/peek-overview/comment/comment-reactions.tsx b/apps/space/core/components/issues/peek-overview/comment/comment-reactions.tsx index cbe7b31c00..165441108b 100644 --- a/apps/space/core/components/issues/peek-overview/comment/comment-reactions.tsx +++ b/apps/space/core/components/issues/peek-overview/comment/comment-reactions.tsx @@ -3,7 +3,7 @@ import React from "react"; import { observer } from "mobx-react"; import { usePathname, useRouter, useSearchParams } from "next/navigation"; -import { Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; // plane imports import { cn } from "@plane/utils"; // ui diff --git a/apps/space/core/components/issues/reactions/issue-emoji-reactions.tsx b/apps/space/core/components/issues/reactions/issue-emoji-reactions.tsx index ca0427f3ba..ecf01210ca 100644 --- a/apps/space/core/components/issues/reactions/issue-emoji-reactions.tsx +++ b/apps/space/core/components/issues/reactions/issue-emoji-reactions.tsx @@ -3,7 +3,7 @@ import { observer } from "mobx-react"; import { usePathname, useRouter, useSearchParams } from "next/navigation"; // lib -import { Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; import { ReactionSelector } from "@/components/ui"; // helpers import { groupReactions, renderEmoji } from "@/helpers/emoji.helper"; 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 153d0059e5..ce8642bb56 100644 --- a/apps/space/core/components/issues/reactions/issue-vote-reactions.tsx +++ b/apps/space/core/components/issues/reactions/issue-vote-reactions.tsx @@ -4,7 +4,7 @@ import { useState } from "react"; import { observer } from "mobx-react"; import { usePathname, useRouter, useSearchParams } from "next/navigation"; // plane imports -import { Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; import { cn } from "@plane/utils"; // helpers import { queryParamGenerator } from "@/helpers/query-param-generator"; diff --git a/apps/space/package.json b/apps/space/package.json index 6ddf6dec43..cb05226a54 100644 --- a/apps/space/package.json +++ b/apps/space/package.json @@ -15,8 +15,6 @@ "fix:format": "prettier --write \"**/*.{ts,tsx,md,json,css,scss}\"" }, "dependencies": { - "@blueprintjs/core": "^4.16.3", - "@blueprintjs/popover2": "^1.13.3", "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", "@headlessui/react": "^1.7.13", diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/extended-project-sidebar.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/extended-project-sidebar.tsx index fcb95316ae..de71b5e959 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/extended-project-sidebar.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/extended-project-sidebar.tsx @@ -7,7 +7,8 @@ import { useParams } from "next/navigation"; import { Plus, Search } from "lucide-react"; import { EUserPermissions, EUserPermissionsLevel, PROJECT_TRACKER_ELEMENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; -import { setToast, TOAST_TYPE, Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; +import { setToast, TOAST_TYPE } from "@plane/ui"; import { copyUrlToClipboard, orderJoinedProjects } from "@plane/utils"; // components import { CreateProjectModal } from "@/components/project/create-project-modal"; 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 5470686944..466eb0f71b 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 @@ -3,9 +3,10 @@ import { FC } from "react"; import { observer } from "mobx-react"; import { useParams } from "next/navigation"; +import { Tooltip } from "@plane/propel/tooltip"; import { EIssuesStoreType } from "@plane/types"; // ui -import { ArchiveIcon, Breadcrumbs, Tooltip, Header, ContrastIcon, DiceIcon, LayersIcon } from "@plane/ui"; +import { ArchiveIcon, Breadcrumbs, Header, ContrastIcon, DiceIcon, LayersIcon } from "@plane/ui"; // components import { BreadcrumbLink } from "@/components/common/breadcrumb-link"; // hooks diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/header.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/header.tsx index 09b41721f1..1d8964322c 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/header.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/header.tsx @@ -16,6 +16,7 @@ import { } from "@plane/constants"; import { usePlatformOS } from "@plane/hooks"; import { useTranslation } from "@plane/i18n"; +import { Tooltip } from "@plane/propel/tooltip"; import { EIssuesStoreType, ICustomSearchSelectOption, @@ -24,7 +25,7 @@ import { IIssueFilterOptions, EIssueLayoutTypes, } from "@plane/types"; -import { Breadcrumbs, Button, ContrastIcon, BreadcrumbNavigationSearchDropdown, Header, Tooltip } from "@plane/ui"; +import { Breadcrumbs, Button, ContrastIcon, BreadcrumbNavigationSearchDropdown, Header } from "@plane/ui"; import { cn, isIssueFilterActive } from "@plane/utils"; // components import { WorkItemsModal } from "@/components/analytics/work-items/modal"; 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 310f2a0bf0..fdeb774494 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 @@ -14,6 +14,7 @@ import { EProjectFeatureKey, WORK_ITEM_TRACKER_ELEMENTS, } from "@plane/constants"; +import { Tooltip } from "@plane/propel/tooltip"; import { EIssuesStoreType, ICustomSearchSelectOption, @@ -22,7 +23,7 @@ import { IIssueFilterOptions, EIssueLayoutTypes, } from "@plane/types"; -import { Breadcrumbs, Button, DiceIcon, Header, BreadcrumbNavigationSearchDropdown, Tooltip } from "@plane/ui"; +import { Breadcrumbs, Button, DiceIcon, Header, BreadcrumbNavigationSearchDropdown } from "@plane/ui"; import { cn, isIssueFilterActive } from "@plane/utils"; // components import { WorkItemsModal } from "@/components/analytics/work-items/modal"; diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/views/(detail)/[viewId]/header.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/views/(detail)/[viewId]/header.tsx index c143487cc8..70a530f391 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/views/(detail)/[viewId]/header.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/views/(detail)/[viewId]/header.tsx @@ -14,6 +14,7 @@ import { WORK_ITEM_TRACKER_ELEMENTS, } from "@plane/constants"; // types +import { Tooltip } from "@plane/propel/tooltip"; import { EIssuesStoreType, EViewAccess, @@ -24,7 +25,7 @@ import { EIssueLayoutTypes, } from "@plane/types"; // ui -import { Breadcrumbs, Button, Tooltip, Header, BreadcrumbNavigationSearchDropdown } from "@plane/ui"; +import { Breadcrumbs, Button, Header, BreadcrumbNavigationSearchDropdown } from "@plane/ui"; // components import { isIssueFilterActive } from "@plane/utils"; import { SwitcherIcon, SwitcherLabel } from "@/components/common/switcher-label"; diff --git a/apps/web/app/(all)/profile/sidebar.tsx b/apps/web/app/(all)/profile/sidebar.tsx index 50144d9335..6d4c8ce362 100644 --- a/apps/web/app/(all)/profile/sidebar.tsx +++ b/apps/web/app/(all)/profile/sidebar.tsx @@ -21,7 +21,8 @@ import { import { PROFILE_ACTION_LINKS } from "@plane/constants"; import { useOutsideClickDetector } from "@plane/hooks"; import { useTranslation } from "@plane/i18n"; -import { TOAST_TYPE, Tooltip, setToast } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; +import { TOAST_TYPE, setToast } from "@plane/ui"; import { cn, getFileURL } from "@plane/utils"; // components import { SidebarNavItem } from "@/components/sidebar/sidebar-navigation"; diff --git a/apps/web/ce/components/comments/comment-block.tsx b/apps/web/ce/components/comments/comment-block.tsx index 46d3f3b58e..42c9dbfd1b 100644 --- a/apps/web/ce/components/comments/comment-block.tsx +++ b/apps/web/ce/components/comments/comment-block.tsx @@ -2,8 +2,9 @@ import { FC, ReactNode, useRef } from "react"; import { observer } from "mobx-react"; // plane imports import { useTranslation } from "@plane/i18n"; +import { Tooltip } from "@plane/propel/tooltip"; import { TIssueComment } from "@plane/types"; -import { Avatar, Tooltip } from "@plane/ui"; +import { Avatar } from "@plane/ui"; import { calculateTimeAgo, cn, getFileURL, renderFormattedDate, renderFormattedTime } from "@plane/utils"; // hooks import { useMember } from "@/hooks/store/use-member"; 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 c6b94b8d89..7cde59b8a3 100644 --- a/apps/web/ce/components/estimates/estimate-list-item-buttons.tsx +++ b/apps/web/ce/components/estimates/estimate-list-item-buttons.tsx @@ -2,7 +2,7 @@ import { FC } from "react"; import { observer } from "mobx-react"; import { Pen, Trash } from "lucide-react"; import { PROJECT_SETTINGS_TRACKER_ELEMENTS } from "@plane/constants"; -import { Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; // components import { ProIcon } from "@/components/common/pro-icon"; diff --git a/apps/web/ce/components/issues/header.tsx b/apps/web/ce/components/issues/header.tsx index 5a88e139ff..8bdcc3292c 100644 --- a/apps/web/ce/components/issues/header.tsx +++ b/apps/web/ce/components/issues/header.tsx @@ -14,8 +14,9 @@ import { EProjectFeatureKey, } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; +import { Tooltip } from "@plane/propel/tooltip"; import { EIssuesStoreType } from "@plane/types"; -import { Breadcrumbs, Button, Tooltip, Header } from "@plane/ui"; +import { Breadcrumbs, Button, Header } from "@plane/ui"; // components import { CountChip } from "@/components/common/count-chip"; // constants 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 338f24fb06..c69704c9e3 100644 --- a/apps/web/ce/components/issues/issue-details/issue-identifier.tsx +++ b/apps/web/ce/components/issues/issue-details/issue-identifier.tsx @@ -1,9 +1,10 @@ import { FC } from "react"; import { observer } from "mobx-react"; // types +import { Tooltip } from "@plane/propel/tooltip"; import { IIssueDisplayProperties } from "@plane/types"; // ui -import { setToast, TOAST_TYPE, Tooltip } from "@plane/ui"; +import { setToast, TOAST_TYPE } from "@plane/ui"; // helpers import { cn } from "@plane/utils"; // hooks 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 26aeb8e452..adeab2da94 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 @@ -1,7 +1,7 @@ import { useState } from "react"; import { CircleArrowUp, CornerDownRight, RefreshCcw, Sparkles } from "lucide-react"; // ui -import { Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; // components import { cn } from "@plane/utils"; import { RichTextEditor } from "@/components/editor/rich-text"; diff --git a/apps/web/ce/components/pages/editor/ai/menu.tsx b/apps/web/ce/components/pages/editor/ai/menu.tsx index d09024369d..6d79584abb 100644 --- a/apps/web/ce/components/pages/editor/ai/menu.tsx +++ b/apps/web/ce/components/pages/editor/ai/menu.tsx @@ -5,7 +5,7 @@ import { ChevronRight, CornerDownRight, LucideIcon, RefreshCcw, Sparkles, Triang // plane editor import type { EditorRefApi } from "@plane/editor"; // plane ui -import { Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; // components import { cn } from "@plane/utils"; import { RichTextEditor } from "@/components/editor/rich-text"; diff --git a/apps/web/ce/components/pages/header/lock-control.tsx b/apps/web/ce/components/pages/header/lock-control.tsx index daeb1109d1..2403b6889f 100644 --- a/apps/web/ce/components/pages/header/lock-control.tsx +++ b/apps/web/ce/components/pages/header/lock-control.tsx @@ -5,7 +5,7 @@ import { observer } from "mobx-react"; import { LockKeyhole, LockKeyholeOpen } from "lucide-react"; // plane imports import { PROJECT_PAGE_TRACKER_ELEMENTS } from "@plane/constants"; -import { Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; // helpers import { captureClick } from "@/helpers/event-tracker.helper"; // hooks diff --git a/apps/web/ce/components/workspace/edition-badge.tsx b/apps/web/ce/components/workspace/edition-badge.tsx index 82a8f7f978..7af2cf71eb 100644 --- a/apps/web/ce/components/workspace/edition-badge.tsx +++ b/apps/web/ce/components/workspace/edition-badge.tsx @@ -2,7 +2,8 @@ import { useState } from "react"; import { observer } from "mobx-react"; // ui import { useTranslation } from "@plane/i18n"; -import { Button, Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; +import { Button } from "@plane/ui"; // hooks import { usePlatformOS } from "@/hooks/use-platform-os"; import packageJson from "package.json"; diff --git a/apps/web/ce/components/workspace/sidebar/extended-sidebar-item.tsx b/apps/web/ce/components/workspace/sidebar/extended-sidebar-item.tsx index 344064d10a..ea16bc6b3f 100644 --- a/apps/web/ce/components/workspace/sidebar/extended-sidebar-item.tsx +++ b/apps/web/ce/components/workspace/sidebar/extended-sidebar-item.tsx @@ -9,7 +9,8 @@ import { Pin, PinOff } from "lucide-react"; // plane imports import { EUserPermissionsLevel, IWorkspaceSidebarNavigationItem } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; -import { DragHandle, DropIndicator, Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; +import { DragHandle, DropIndicator } from "@plane/ui"; import { cn } from "@plane/utils"; // components import { SidebarNavItem } from "@/components/sidebar/sidebar-navigation"; @@ -165,7 +166,7 @@ export const ExtendedSidebarItem: FC = observer((prop
diff --git a/apps/web/core/components/cycles/list/cycle-list-item-action.tsx b/apps/web/core/components/cycles/list/cycle-list-item-action.tsx index 526bf3bf41..4bb048a7d6 100644 --- a/apps/web/core/components/cycles/list/cycle-list-item-action.tsx +++ b/apps/web/core/components/cycles/list/cycle-list-item-action.tsx @@ -15,8 +15,9 @@ import { } from "@plane/constants"; import { useLocalStorage } from "@plane/hooks"; import { useTranslation } from "@plane/i18n"; +import { Tooltip } from "@plane/propel/tooltip"; import { ICycle, TCycleGroups } from "@plane/types"; -import { Avatar, AvatarGroup, FavoriteStar, LayersIcon, Tooltip, TransferIcon, setPromiseToast } from "@plane/ui"; +import { Avatar, AvatarGroup, FavoriteStar, LayersIcon, TransferIcon, setPromiseToast } from "@plane/ui"; import { getDate, getFileURL, generateQueryParams } from "@plane/utils"; // components import { DateRangeDropdown } from "@/components/dropdowns/date-range"; diff --git a/apps/web/core/components/dropdowns/buttons.tsx b/apps/web/core/components/dropdowns/buttons.tsx index de14c11b83..245fd7ccca 100644 --- a/apps/web/core/components/dropdowns/buttons.tsx +++ b/apps/web/core/components/dropdowns/buttons.tsx @@ -1,7 +1,7 @@ "use client"; - +import React from "react"; // helpers -import { Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; import { cn } from "@plane/utils"; // types import { usePlatformOS } from "@/hooks/use-platform-os"; @@ -12,7 +12,7 @@ export type DropdownButtonProps = { children: React.ReactNode; className?: string; isActive: boolean; - tooltipContent: string | React.ReactNode; + tooltipContent?: string | React.ReactNode | null; tooltipHeading: string; showTooltip: boolean; variant: TButtonVariants; @@ -23,7 +23,7 @@ type ButtonProps = { children: React.ReactNode; className?: string; isActive: boolean; - tooltipContent: string | React.ReactNode; + tooltipContent?: string | React.ReactNode | null; tooltipHeading: string; showTooltip: boolean; renderToolTipByDefault?: boolean; @@ -67,7 +67,7 @@ const BorderButton: React.FC = (props) => { return ( {tooltipContent}} disabled={!showTooltip} isMobile={isMobile} renderByDefault={renderToolTipByDefault} @@ -91,7 +91,7 @@ const BackgroundButton: React.FC = (props) => { return ( {tooltipContent}} disabled={!showTooltip} isMobile={isMobile} renderByDefault={renderToolTipByDefault} @@ -114,7 +114,7 @@ const TransparentButton: React.FC = (props) => { return ( {tooltipContent}} disabled={!showTooltip} isMobile={isMobile} renderByDefault={renderToolTipByDefault} diff --git a/apps/web/core/components/dropdowns/date-range.tsx b/apps/web/core/components/dropdowns/date-range.tsx index 7f56b530a0..09f0419cc0 100644 --- a/apps/web/core/components/dropdowns/date-range.tsx +++ b/apps/web/core/components/dropdowns/date-range.tsx @@ -165,13 +165,15 @@ export const DateRangeDropdown: React.FC = observer((props) => { isActive={isOpen} tooltipHeading={customTooltipHeading ?? t("project_cycles.date_range")} tooltipContent={ - customTooltipContent ?? ( - <> - {dateRange.from ? renderFormattedDate(dateRange.from) : ""} - {dateRange.from && dateRange.to ? " - " : ""} - {dateRange.to ? renderFormattedDate(dateRange.to) : ""} - - ) + <> + {customTooltipContent ?? ( + <> + {dateRange.from ? renderFormattedDate(dateRange.from) : ""} + {dateRange.from && dateRange.to ? " - " : ""} + {dateRange.to ? renderFormattedDate(dateRange.to) : ""} + + )} + } showTooltip={showTooltip} variant={buttonVariant} diff --git a/apps/web/core/components/dropdowns/module/button-content.tsx b/apps/web/core/components/dropdowns/module/button-content.tsx index a8d25aba63..7cf714be9f 100644 --- a/apps/web/core/components/dropdowns/module/button-content.tsx +++ b/apps/web/core/components/dropdowns/module/button-content.tsx @@ -2,7 +2,8 @@ import { ChevronDown, X } from "lucide-react"; // plane imports -import { DiceIcon, Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; +import { DiceIcon } from "@plane/ui"; import { cn } from "@plane/utils"; // hooks import { useModule } from "@/hooks/store/use-module"; diff --git a/apps/web/core/components/dropdowns/priority.tsx b/apps/web/core/components/dropdowns/priority.tsx index e3bc44e737..74e75d61c6 100644 --- a/apps/web/core/components/dropdowns/priority.tsx +++ b/apps/web/core/components/dropdowns/priority.tsx @@ -8,9 +8,10 @@ import { Combobox } from "@headlessui/react"; import { ISSUE_PRIORITIES } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; // types +import { Tooltip } from "@plane/propel/tooltip"; import { TIssuePriorities } from "@plane/types"; // ui -import { ComboDropDown, PriorityIcon, Tooltip } from "@plane/ui"; +import { ComboDropDown, PriorityIcon } from "@plane/ui"; // helpers import { cn } from "@plane/utils"; // hooks diff --git a/apps/web/core/components/editor/lite-text/toolbar.tsx b/apps/web/core/components/editor/lite-text/toolbar.tsx index 0c2759f252..9b230f01cf 100644 --- a/apps/web/core/components/editor/lite-text/toolbar.tsx +++ b/apps/web/core/components/editor/lite-text/toolbar.tsx @@ -8,7 +8,8 @@ import type { EditorRefApi } from "@plane/editor"; // i18n import { useTranslation } from "@plane/i18n"; // ui -import { Button, Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; +import { Button } from "@plane/ui"; // constants import { cn } from "@plane/utils"; import { TOOLBAR_ITEMS, ToolbarMenuItem } from "@/constants/editor"; diff --git a/apps/web/core/components/editor/sticky-editor/toolbar.tsx b/apps/web/core/components/editor/sticky-editor/toolbar.tsx index 6811e70039..9626fa46ed 100644 --- a/apps/web/core/components/editor/sticky-editor/toolbar.tsx +++ b/apps/web/core/components/editor/sticky-editor/toolbar.tsx @@ -6,8 +6,8 @@ import { Palette, Trash2 } from "lucide-react"; import type { EditorRefApi } from "@plane/editor"; // ui import { useOutsideClickDetector } from "@plane/hooks"; +import { Tooltip } from "@plane/propel/tooltip"; import { TSticky } from "@plane/types"; -import { Tooltip } from "@plane/ui"; // constants import { cn } from "@plane/utils"; import { TOOLBAR_ITEMS, ToolbarMenuItem } from "@/constants/editor"; diff --git a/apps/web/core/components/estimates/create/stage-one.tsx b/apps/web/core/components/estimates/create/stage-one.tsx index dc38ebeb57..78628996ac 100644 --- a/apps/web/core/components/estimates/create/stage-one.tsx +++ b/apps/web/core/components/estimates/create/stage-one.tsx @@ -5,8 +5,8 @@ import { Info } from "lucide-react"; // plane imports import { EEstimateSystem, ESTIMATE_SYSTEMS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; +import { Tooltip } from "@plane/propel/tooltip"; import { TEstimateSystemKeys } from "@plane/types"; -import { Tooltip } from "@plane/ui"; // components import { convertMinutesToHoursMinutesString } from "@plane/utils"; // plane web imports diff --git a/apps/web/core/components/estimates/points/create.tsx b/apps/web/core/components/estimates/points/create.tsx index 7f751ce9ca..695e1b09aa 100644 --- a/apps/web/core/components/estimates/points/create.tsx +++ b/apps/web/core/components/estimates/points/create.tsx @@ -5,8 +5,9 @@ import { observer } from "mobx-react"; import { Check, Info, X } from "lucide-react"; import { EEstimateSystem, MAX_ESTIMATE_POINT_INPUT_LENGTH } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; +import { Tooltip } from "@plane/propel/tooltip"; import { TEstimatePointsObject, TEstimateSystemKeys, TEstimateTypeErrorObject } from "@plane/types"; -import { Spinner, TOAST_TYPE, Tooltip, setToast } from "@plane/ui"; +import { Spinner, TOAST_TYPE, setToast } from "@plane/ui"; import { cn, isEstimatePointValuesRepeated } from "@plane/utils"; import { EstimateInputRoot } from "@/components/estimates/inputs/root"; // helpers diff --git a/apps/web/core/components/estimates/points/update.tsx b/apps/web/core/components/estimates/points/update.tsx index 6b3cd59766..d36a57e1f7 100644 --- a/apps/web/core/components/estimates/points/update.tsx +++ b/apps/web/core/components/estimates/points/update.tsx @@ -5,8 +5,9 @@ import { observer } from "mobx-react"; import { Check, Info, X } from "lucide-react"; import { EEstimateSystem, MAX_ESTIMATE_POINT_INPUT_LENGTH } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; +import { Tooltip } from "@plane/propel/tooltip"; import { TEstimatePointsObject, TEstimateSystemKeys, TEstimateTypeErrorObject } from "@plane/types"; -import { Spinner, TOAST_TYPE, Tooltip, setToast } from "@plane/ui"; +import { Spinner, TOAST_TYPE, setToast } from "@plane/ui"; import { cn, isEstimatePointValuesRepeated } from "@plane/utils"; import { EstimateInputRoot } from "@/components/estimates/inputs/root"; // helpers diff --git a/apps/web/core/components/gantt-chart/helpers/add-block.tsx b/apps/web/core/components/gantt-chart/helpers/add-block.tsx index 742591a26b..841a0ab6dc 100644 --- a/apps/web/core/components/gantt-chart/helpers/add-block.tsx +++ b/apps/web/core/components/gantt-chart/helpers/add-block.tsx @@ -5,8 +5,8 @@ import { addDays } from "date-fns"; import { observer } from "mobx-react"; import { Plus } from "lucide-react"; // ui +import { Tooltip } from "@plane/propel/tooltip"; import type { IBlockUpdateData, IGanttBlock } from "@plane/types"; -import { Tooltip } from "@plane/ui"; // helpers import { renderFormattedDate, renderFormattedPayloadDate } from "@plane/utils"; // hooks diff --git a/apps/web/core/components/home/widgets/recents/issue.tsx b/apps/web/core/components/home/widgets/recents/issue.tsx index ed90156769..ea1cadfeff 100644 --- a/apps/web/core/components/home/widgets/recents/issue.tsx +++ b/apps/web/core/components/home/widgets/recents/issue.tsx @@ -1,8 +1,9 @@ import { observer } from "mobx-react"; // plane types +import { Tooltip } from "@plane/propel/tooltip"; import { EIssueServiceType, TActivityEntityData, TIssueEntityData } from "@plane/types"; // plane ui -import { LayersIcon, PriorityIcon, StateGroupIcon, Tooltip } from "@plane/ui"; +import { LayersIcon, PriorityIcon, StateGroupIcon } from "@plane/ui"; import { calculateTimeAgo, generateWorkItemLink } from "@plane/utils"; // components import { ListItem } from "@/components/core/list"; diff --git a/apps/web/core/components/icons/locked-component.tsx b/apps/web/core/components/icons/locked-component.tsx index 36230a093c..1fcd486808 100644 --- a/apps/web/core/components/icons/locked-component.tsx +++ b/apps/web/core/components/icons/locked-component.tsx @@ -1,5 +1,5 @@ import { Lock } from "lucide-react"; -import { Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; export const LockedComponent = (props: { toolTipContent?: string }) => { const { toolTipContent } = props; diff --git a/apps/web/core/components/inbox/content/issue-properties.tsx b/apps/web/core/components/inbox/content/issue-properties.tsx index 4102ae5253..8aeac5e953 100644 --- a/apps/web/core/components/inbox/content/issue-properties.tsx +++ b/apps/web/core/components/inbox/content/issue-properties.tsx @@ -3,8 +3,9 @@ import React from "react"; import { observer } from "mobx-react"; import { CalendarCheck2, CopyPlus, Signal, Tag, Users } from "lucide-react"; +import { Tooltip } from "@plane/propel/tooltip"; import { TInboxDuplicateIssueDetails, TIssue } from "@plane/types"; -import { ControlLink, DoubleCircleIcon, Tooltip } from "@plane/ui"; +import { ControlLink, DoubleCircleIcon } from "@plane/ui"; import { getDate, renderFormattedPayloadDate, generateWorkItemLink } from "@plane/utils"; // components import { DateDropdown } from "@/components/dropdowns/date"; diff --git a/apps/web/core/components/inbox/sidebar/inbox-list-item.tsx b/apps/web/core/components/inbox/sidebar/inbox-list-item.tsx index 367334f553..5e6da4f46d 100644 --- a/apps/web/core/components/inbox/sidebar/inbox-list-item.tsx +++ b/apps/web/core/components/inbox/sidebar/inbox-list-item.tsx @@ -5,7 +5,8 @@ import { observer } from "mobx-react"; import Link from "next/link"; import { useSearchParams } from "next/navigation"; // plane imports -import { Tooltip, PriorityIcon, Row, Avatar } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; +import { PriorityIcon, Row, Avatar } from "@plane/ui"; import { cn, renderFormattedDate, getFileURL } from "@plane/utils"; // components import { ButtonAvatars } from "@/components/dropdowns/member/avatar"; diff --git a/apps/web/core/components/integration/single-integration-card.tsx b/apps/web/core/components/integration/single-integration-card.tsx index dc6cec94ab..b4ce693d82 100644 --- a/apps/web/core/components/integration/single-integration-card.tsx +++ b/apps/web/core/components/integration/single-integration-card.tsx @@ -7,9 +7,10 @@ import { useParams } from "next/navigation"; import useSWR, { mutate } from "swr"; import { CheckCircle } from "lucide-react"; import { EUserPermissions, EUserPermissionsLevel } from "@plane/constants"; +import { Tooltip } from "@plane/propel/tooltip"; import { IAppIntegration, IWorkspaceIntegration } from "@plane/types"; // ui -import { Button, Loader, Tooltip, TOAST_TYPE, setToast } from "@plane/ui"; +import { Button, Loader, TOAST_TYPE, setToast } from "@plane/ui"; // constants import { WORKSPACE_INTEGRATIONS } from "@/constants/fetch-keys"; // hooks diff --git a/apps/web/core/components/issues/attachment/attachment-detail.tsx b/apps/web/core/components/issues/attachment/attachment-detail.tsx index ae7ca9dbdd..eede3c1ff2 100644 --- a/apps/web/core/components/issues/attachment/attachment-detail.tsx +++ b/apps/web/core/components/issues/attachment/attachment-detail.tsx @@ -5,7 +5,7 @@ import { observer } from "mobx-react"; import Link from "next/link"; import { AlertCircle, X } from "lucide-react"; // ui -import { Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; import { convertBytesToSize, getFileExtension, diff --git a/apps/web/core/components/issues/attachment/attachment-list-item.tsx b/apps/web/core/components/issues/attachment/attachment-list-item.tsx index 918c502917..fc071750a6 100644 --- a/apps/web/core/components/issues/attachment/attachment-list-item.tsx +++ b/apps/web/core/components/issues/attachment/attachment-list-item.tsx @@ -4,9 +4,10 @@ import { FC } from "react"; import { observer } from "mobx-react"; import { Trash } from "lucide-react"; import { useTranslation } from "@plane/i18n"; +import { Tooltip } from "@plane/propel/tooltip"; import { EIssueServiceType, TIssueServiceType } from "@plane/types"; // ui -import { CustomMenu, Tooltip } from "@plane/ui"; +import { CustomMenu } from "@plane/ui"; import { convertBytesToSize, getFileExtension, getFileName, getFileURL, renderFormattedDate } from "@plane/utils"; // components // diff --git a/apps/web/core/components/issues/attachment/attachment-list-upload-item.tsx b/apps/web/core/components/issues/attachment/attachment-list-upload-item.tsx index 61924a25f0..7106896353 100644 --- a/apps/web/core/components/issues/attachment/attachment-list-upload-item.tsx +++ b/apps/web/core/components/issues/attachment/attachment-list-upload-item.tsx @@ -2,7 +2,8 @@ import { observer } from "mobx-react"; // ui -import { CircularProgressIndicator, Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; +import { CircularProgressIndicator } from "@plane/ui"; // components import { getFileExtension } from "@plane/utils"; import { getFileIcon } from "@/components/icons"; diff --git a/apps/web/core/components/issues/attachment/attachment-upload-details.tsx b/apps/web/core/components/issues/attachment/attachment-upload-details.tsx index 1bc36318bb..ea868c8d2c 100644 --- a/apps/web/core/components/issues/attachment/attachment-upload-details.tsx +++ b/apps/web/core/components/issues/attachment/attachment-upload-details.tsx @@ -1,7 +1,8 @@ "use client"; import { observer } from "mobx-react"; -import { CircularProgressIndicator, Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; +import { CircularProgressIndicator } from "@plane/ui"; import { getFileExtension, truncateText } from "@plane/utils"; // ui // icons diff --git a/apps/web/core/components/issues/issue-detail-widgets/sub-issues/issues-list/list-item.tsx b/apps/web/core/components/issues/issue-detail-widgets/sub-issues/issues-list/list-item.tsx index 1740d86be8..ad6cc65378 100644 --- a/apps/web/core/components/issues/issue-detail-widgets/sub-issues/issues-list/list-item.tsx +++ b/apps/web/core/components/issues/issue-detail-widgets/sub-issues/issues-list/list-item.tsx @@ -4,8 +4,9 @@ import { observer } from "mobx-react"; import { ChevronRight, X, Pencil, Trash, Link as LinkIcon, Loader } from "lucide-react"; // plane imports import { useTranslation } from "@plane/i18n"; +import { Tooltip } from "@plane/propel/tooltip"; import { EIssueServiceType, EIssuesStoreType, TIssue, TIssueServiceType, TSubIssueOperations } from "@plane/types"; -import { ControlLink, CustomMenu, Tooltip } from "@plane/ui"; +import { ControlLink, CustomMenu } from "@plane/ui"; import { cn, generateWorkItemLink } from "@plane/utils"; // helpers import { useSubIssueOperations } from "@/components/issues/issue-detail-widgets/sub-issues/helper"; diff --git a/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/helpers/activity-block.tsx b/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/helpers/activity-block.tsx index 8d84489e95..4543f81969 100644 --- a/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/helpers/activity-block.tsx +++ b/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/helpers/activity-block.tsx @@ -3,7 +3,7 @@ import { FC, ReactNode } from "react"; import { Network } from "lucide-react"; // plane imports -import { Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; import { renderFormattedTime, renderFormattedDate, calculateTimeAgo } from "@plane/utils"; import { useIssueDetail } from "@/hooks/store/use-issue-detail"; import { usePlatformOS } from "@/hooks/use-platform-os"; diff --git a/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/helpers/issue-link.tsx b/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/helpers/issue-link.tsx index 5535b1bfa5..4bbe31dfeb 100644 --- a/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/helpers/issue-link.tsx +++ b/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/helpers/issue-link.tsx @@ -2,7 +2,7 @@ import { FC } from "react"; // hooks -import { Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; import { generateWorkItemLink } from "@plane/utils"; import { useIssueDetail } from "@/hooks/store/use-issue-detail"; import { usePlatformOS } from "@/hooks/use-platform-os"; diff --git a/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/label-activity-chip.tsx b/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/label-activity-chip.tsx index e7cf63f83b..9d9a263638 100644 --- a/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/label-activity-chip.tsx +++ b/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/label-activity-chip.tsx @@ -1,5 +1,5 @@ import { FC } from "react"; -import { Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; type TIssueLabelPill = { name?: string; color?: string }; diff --git a/apps/web/core/components/issues/issue-detail/issue-detail-quick-actions.tsx b/apps/web/core/components/issues/issue-detail/issue-detail-quick-actions.tsx index eeac54fbc6..a4269bb7d5 100644 --- a/apps/web/core/components/issues/issue-detail/issue-detail-quick-actions.tsx +++ b/apps/web/core/components/issues/issue-detail/issue-detail-quick-actions.tsx @@ -6,8 +6,9 @@ import { LinkIcon } from "lucide-react"; // plane imports import { WORK_ITEM_TRACKER_EVENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; +import { Tooltip } from "@plane/propel/tooltip"; import { EIssuesStoreType } from "@plane/types"; -import { TOAST_TYPE, Tooltip, setToast } from "@plane/ui"; +import { TOAST_TYPE, setToast } from "@plane/ui"; import { generateWorkItemLink, copyTextToClipboard } from "@plane/utils"; // helpers import { captureError, captureSuccess } from "@/helpers/event-tracker.helper"; diff --git a/apps/web/core/components/issues/issue-detail/links/link-detail.tsx b/apps/web/core/components/issues/issue-detail/links/link-detail.tsx index b723f66a41..6dfc77201e 100644 --- a/apps/web/core/components/issues/issue-detail/links/link-detail.tsx +++ b/apps/web/core/components/issues/issue-detail/links/link-detail.tsx @@ -4,7 +4,8 @@ import { FC } from "react"; // hooks // ui import { Pencil, Trash2, ExternalLink } from "lucide-react"; -import { Tooltip, TOAST_TYPE, setToast } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; +import { TOAST_TYPE, setToast } from "@plane/ui"; import { getIconForLink, copyTextToClipboard, calculateTimeAgo } from "@plane/utils"; // icons // types diff --git a/apps/web/core/components/issues/issue-detail/links/link-item.tsx b/apps/web/core/components/issues/issue-detail/links/link-item.tsx index cf3ea8b773..977333baab 100644 --- a/apps/web/core/components/issues/issue-detail/links/link-item.tsx +++ b/apps/web/core/components/issues/issue-detail/links/link-item.tsx @@ -4,9 +4,10 @@ import { FC } from "react"; import { observer } from "mobx-react"; import { Pencil, Trash2, Copy, Link } from "lucide-react"; import { useTranslation } from "@plane/i18n"; +import { Tooltip } from "@plane/propel/tooltip"; import { EIssueServiceType, TIssueServiceType } from "@plane/types"; // ui -import { Tooltip, TOAST_TYPE, setToast, CustomMenu } from "@plane/ui"; +import { TOAST_TYPE, setToast, CustomMenu } from "@plane/ui"; import { calculateTimeAgo, copyTextToClipboard } from "@plane/utils"; // helpers // hooks diff --git a/apps/web/core/components/issues/issue-detail/parent-select.tsx b/apps/web/core/components/issues/issue-detail/parent-select.tsx index 31e0f001b0..8c1d156c88 100644 --- a/apps/web/core/components/issues/issue-detail/parent-select.tsx +++ b/apps/web/core/components/issues/issue-detail/parent-select.tsx @@ -6,7 +6,7 @@ import Link from "next/link"; import { Pencil, X } from "lucide-react"; // plane imports import { useTranslation } from "@plane/i18n"; -import { Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; import { cn } from "@plane/utils"; // hooks import { useIssueDetail } from "@/hooks/store/use-issue-detail"; diff --git a/apps/web/core/components/issues/issue-detail/reactions/issue-comment.tsx b/apps/web/core/components/issues/issue-detail/reactions/issue-comment.tsx index 832220fb02..4305ef6ede 100644 --- a/apps/web/core/components/issues/issue-detail/reactions/issue-comment.tsx +++ b/apps/web/core/components/issues/issue-detail/reactions/issue-comment.tsx @@ -2,9 +2,10 @@ import { FC, useMemo } from "react"; import { observer } from "mobx-react"; +import { Tooltip } from "@plane/propel/tooltip"; import { IUser } from "@plane/types"; // components -import { TOAST_TYPE, Tooltip, setToast } from "@plane/ui"; +import { TOAST_TYPE, setToast } from "@plane/ui"; import { cn, formatTextList } from "@plane/utils"; // helper import { renderEmoji } from "@/helpers/emoji.helper"; diff --git a/apps/web/core/components/issues/issue-detail/reactions/issue.tsx b/apps/web/core/components/issues/issue-detail/reactions/issue.tsx index f641cbb56f..243b26aef0 100644 --- a/apps/web/core/components/issues/issue-detail/reactions/issue.tsx +++ b/apps/web/core/components/issues/issue-detail/reactions/issue.tsx @@ -2,10 +2,11 @@ import { FC, useMemo } from "react"; import { observer } from "mobx-react"; +import { Tooltip } from "@plane/propel/tooltip"; import { IUser } from "@plane/types"; // hooks // ui -import { TOAST_TYPE, Tooltip, setToast } from "@plane/ui"; +import { TOAST_TYPE, setToast } from "@plane/ui"; import { cn, formatTextList } from "@plane/utils"; // helpers import { renderEmoji } from "@/helpers/emoji.helper"; diff --git a/apps/web/core/components/issues/issue-detail/relation-select.tsx b/apps/web/core/components/issues/issue-detail/relation-select.tsx index b79058274c..3bcc6221d1 100644 --- a/apps/web/core/components/issues/issue-detail/relation-select.tsx +++ b/apps/web/core/components/issues/issue-detail/relation-select.tsx @@ -5,8 +5,9 @@ import { observer } from "mobx-react"; import Link from "next/link"; import { Pencil, X } from "lucide-react"; // Plane +import { Tooltip } from "@plane/propel/tooltip"; import { ISearchIssueResponse } from "@plane/types"; -import { Tooltip, TOAST_TYPE, setToast } from "@plane/ui"; +import { TOAST_TYPE, setToast } from "@plane/ui"; import { cn, generateWorkItemLink } from "@plane/utils"; // components import { ExistingIssuesListModal } from "@/components/core/modals/existing-issues-list-modal"; diff --git a/apps/web/core/components/issues/issue-layouts/calendar/issue-block.tsx b/apps/web/core/components/issues/issue-layouts/calendar/issue-block.tsx index 93c18c9c30..e5ea1c0cf6 100644 --- a/apps/web/core/components/issues/issue-layouts/calendar/issue-block.tsx +++ b/apps/web/core/components/issues/issue-layouts/calendar/issue-block.tsx @@ -8,9 +8,10 @@ import { MoreHorizontal } from "lucide-react"; // plane helpers import { useOutsideClickDetector } from "@plane/hooks"; // types +import { Tooltip } from "@plane/propel/tooltip"; import { TIssue } from "@plane/types"; // ui -import { Tooltip, ControlLink } from "@plane/ui"; +import { ControlLink } from "@plane/ui"; import { cn, generateWorkItemLink } from "@plane/utils"; // helpers // hooks diff --git a/apps/web/core/components/issues/issue-layouts/filters/header/layout-selection.tsx b/apps/web/core/components/issues/issue-layouts/filters/header/layout-selection.tsx index baa43a8482..2bd88c2629 100644 --- a/apps/web/core/components/issues/issue-layouts/filters/header/layout-selection.tsx +++ b/apps/web/core/components/issues/issue-layouts/filters/header/layout-selection.tsx @@ -4,9 +4,9 @@ import React from "react"; // plane constants import { ISSUE_LAYOUTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; +import { Tooltip } from "@plane/propel/tooltip"; import { EIssueLayoutTypes } from "@plane/types"; // ui -import { Tooltip } from "@plane/ui"; // types import { IssueLayoutIcon } from "@/components/issues/issue-layouts/layout-icon"; import { usePlatformOS } from "@/hooks/use-platform-os"; diff --git a/apps/web/core/components/issues/issue-layouts/gantt/blocks.tsx b/apps/web/core/components/issues/issue-layouts/gantt/blocks.tsx index a4fa8f83e6..7f2991f895 100644 --- a/apps/web/core/components/issues/issue-layouts/gantt/blocks.tsx +++ b/apps/web/core/components/issues/issue-layouts/gantt/blocks.tsx @@ -3,7 +3,8 @@ import { observer } from "mobx-react"; import { useParams } from "next/navigation"; // ui -import { Tooltip, ControlLink } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; +import { ControlLink } from "@plane/ui"; import { findTotalDaysInRange, generateWorkItemLink } from "@plane/utils"; // components import { SIDEBAR_WIDTH } from "@/components/gantt-chart/constants"; @@ -62,7 +63,7 @@ export const IssueGanttBlock: React.FC = observer((props) => {
{message}
} - position="top-left" + position="top-start" disabled={!message} >
{ diff --git a/apps/web/core/components/issues/issue-layouts/list/list-view-types.d.ts b/apps/web/core/components/issues/issue-layouts/list/list-view-types.d.ts index 089623ed93..500ac1a893 100644 --- a/apps/web/core/components/issues/issue-layouts/list/list-view-types.d.ts +++ b/apps/web/core/components/issues/issue-layouts/list/list-view-types.d.ts @@ -1,4 +1,4 @@ -import { Placement } from "@popperjs/core"; +import { TPlacement } from "@plane/propel/utils/placement"; import { TIssue } from "@plane/types"; export interface IQuickActionProps { @@ -13,7 +13,7 @@ export interface IQuickActionProps { customActionButton?: React.ReactElement; portalElement?: HTMLDivElement | null; readOnly?: boolean; - placements?: Placement; + placements?: TPlacement; } export type TRenderQuickActions = ({ @@ -26,6 +26,6 @@ export type TRenderQuickActions = ({ issue: TIssue; parentRef: React.RefObject; customActionButton?: React.ReactElement; - placement?: Placement; + placement?: TPlacement; portalElement?: HTMLDivElement | null; }) => React.ReactNode; diff --git a/apps/web/core/components/issues/issue-layouts/properties/all-properties.tsx b/apps/web/core/components/issues/issue-layouts/properties/all-properties.tsx index 62fdec30af..a14a2ad958 100644 --- a/apps/web/core/components/issues/issue-layouts/properties/all-properties.tsx +++ b/apps/web/core/components/issues/issue-layouts/properties/all-properties.tsx @@ -10,9 +10,9 @@ import { CalendarCheck2, CalendarClock, Layers, Link, Paperclip } from "lucide-r import { WORK_ITEM_TRACKER_EVENTS } from "@plane/constants"; // i18n import { useTranslation } from "@plane/i18n"; +import { Tooltip } from "@plane/propel/tooltip"; import { TIssue, IIssueDisplayProperties, TIssuePriorities } from "@plane/types"; // ui -import { Tooltip } from "@plane/ui"; import { cn, getDate, diff --git a/apps/web/core/components/issues/issue-layouts/properties/labels.tsx b/apps/web/core/components/issues/issue-layouts/properties/labels.tsx index 473be0e965..efa9551458 100644 --- a/apps/web/core/components/issues/issue-layouts/properties/labels.tsx +++ b/apps/web/core/components/issues/issue-layouts/properties/labels.tsx @@ -9,9 +9,9 @@ import { useOutsideClickDetector } from "@plane/hooks"; // i18n import { useTranslation } from "@plane/i18n"; // types +import { Tooltip } from "@plane/propel/tooltip"; import { IIssueLabel } from "@plane/types"; // ui -import { Tooltip } from "@plane/ui"; // hooks import { cn } from "@plane/utils"; import { useLabel } from "@/hooks/store/use-label"; diff --git a/apps/web/core/components/issues/issue-layouts/spreadsheet/issue-row.tsx b/apps/web/core/components/issues/issue-layouts/spreadsheet/issue-row.tsx index 750dfb35a4..fabf4c0d4d 100644 --- a/apps/web/core/components/issues/issue-layouts/spreadsheet/issue-row.tsx +++ b/apps/web/core/components/issues/issue-layouts/spreadsheet/issue-row.tsx @@ -8,9 +8,10 @@ import { SPREADSHEET_SELECT_GROUP } from "@plane/constants"; // plane helpers import { useOutsideClickDetector } from "@plane/hooks"; // types +import { Tooltip } from "@plane/propel/tooltip"; import { EIssueServiceType, IIssueDisplayProperties, TIssue } from "@plane/types"; // ui -import { ControlLink, Row, Tooltip } from "@plane/ui"; +import { ControlLink, Row } from "@plane/ui"; import { cn, generateWorkItemLink } from "@plane/utils"; // components import { MultipleSelectEntityAction } from "@/components/core/multiple-select"; diff --git a/apps/web/core/components/issues/label.tsx b/apps/web/core/components/issues/label.tsx index 7e3cbae30f..c88c9a0b40 100644 --- a/apps/web/core/components/issues/label.tsx +++ b/apps/web/core/components/issues/label.tsx @@ -2,7 +2,7 @@ import React from "react"; // components -import { Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; import { usePlatformOS } from "@/hooks/use-platform-os"; type Props = { labelDetails: any[]; diff --git a/apps/web/core/components/issues/peek-overview/error.tsx b/apps/web/core/components/issues/peek-overview/error.tsx index 72d4dd319a..ec6f57d9c1 100644 --- a/apps/web/core/components/issues/peek-overview/error.tsx +++ b/apps/web/core/components/issues/peek-overview/error.tsx @@ -2,7 +2,7 @@ import { FC } from "react"; import { MoveRight } from "lucide-react"; -import { Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; // components import { EmptyState } from "@/components/common/empty-state"; // hooks diff --git a/apps/web/core/components/issues/peek-overview/header.tsx b/apps/web/core/components/issues/peek-overview/header.tsx index 8f69f5ac38..b6ced1a967 100644 --- a/apps/web/core/components/issues/peek-overview/header.tsx +++ b/apps/web/core/components/issues/peek-overview/header.tsx @@ -7,16 +7,9 @@ import { Link2, MoveDiagonal, MoveRight } from "lucide-react"; // plane imports import { WORK_ITEM_TRACKER_EVENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; +import { Tooltip } from "@plane/propel/tooltip"; import { EIssuesStoreType, TNameDescriptionLoader } from "@plane/types"; -import { - CenterPanelIcon, - CustomSelect, - FullScreenPanelIcon, - SidePanelIcon, - TOAST_TYPE, - Tooltip, - setToast, -} from "@plane/ui"; +import { CenterPanelIcon, CustomSelect, FullScreenPanelIcon, SidePanelIcon, TOAST_TYPE, setToast } from "@plane/ui"; import { copyUrlToClipboard, generateWorkItemLink } from "@plane/utils"; // helpers import { captureError, captureSuccess } from "@/helpers/event-tracker.helper"; diff --git a/apps/web/core/components/issues/peek-overview/loader.tsx b/apps/web/core/components/issues/peek-overview/loader.tsx index 0fe64ec4cd..73240f758c 100644 --- a/apps/web/core/components/issues/peek-overview/loader.tsx +++ b/apps/web/core/components/issues/peek-overview/loader.tsx @@ -2,7 +2,8 @@ import { FC } from "react"; import { MoveRight } from "lucide-react"; -import { Loader, Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; +import { Loader } from "@plane/ui"; // hooks import { usePlatformOS } from "@/hooks/use-platform-os"; diff --git a/apps/web/core/components/issues/relations/issue-list-item.tsx b/apps/web/core/components/issues/relations/issue-list-item.tsx index 7099683feb..52ce7f967f 100644 --- a/apps/web/core/components/issues/relations/issue-list-item.tsx +++ b/apps/web/core/components/issues/relations/issue-list-item.tsx @@ -5,8 +5,9 @@ import { observer } from "mobx-react"; import { X, Pencil, Trash, Link as LinkIcon } from "lucide-react"; // plane imports import { useTranslation } from "@plane/i18n"; +import { Tooltip } from "@plane/propel/tooltip"; import { EIssueServiceType, TIssue, TIssueServiceType } from "@plane/types"; -import { ControlLink, CustomMenu, Tooltip } from "@plane/ui"; +import { ControlLink, CustomMenu } from "@plane/ui"; import { generateWorkItemLink } from "@plane/utils"; // hooks import { useIssueDetail } from "@/hooks/store/use-issue-detail"; diff --git a/apps/web/core/components/issues/workspace-draft/draft-issue-block.tsx b/apps/web/core/components/issues/workspace-draft/draft-issue-block.tsx index ef31ad8fcc..2a984fa5cc 100644 --- a/apps/web/core/components/issues/workspace-draft/draft-issue-block.tsx +++ b/apps/web/core/components/issues/workspace-draft/draft-issue-block.tsx @@ -4,8 +4,9 @@ import { omit } from "lodash"; import { observer } from "mobx-react"; import { Copy, Pencil, SquareStackIcon, Trash2 } from "lucide-react"; // plane utils +import { Tooltip } from "@plane/propel/tooltip"; import { EIssuesStoreType, TWorkspaceDraftIssue } from "@plane/types"; -import { Row, TContextMenuItem, Tooltip } from "@plane/ui"; +import { Row, TContextMenuItem } from "@plane/ui"; import { cn } from "@plane/utils"; // hooks import { useAppTheme } from "@/hooks/store/use-app-theme"; @@ -152,7 +153,7 @@ export const DraftIssueBlock: FC = observer((props) => {
- +

{issue.name}

diff --git a/apps/web/core/components/modules/gantt-chart/blocks.tsx b/apps/web/core/components/modules/gantt-chart/blocks.tsx index 937aa3f3bb..dfaeb067e5 100644 --- a/apps/web/core/components/modules/gantt-chart/blocks.tsx +++ b/apps/web/core/components/modules/gantt-chart/blocks.tsx @@ -5,7 +5,8 @@ import Link from "next/link"; import { useParams } from "next/navigation"; // ui import { MODULE_STATUS } from "@plane/constants"; -import { Tooltip, ModuleStatusIcon } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; +import { ModuleStatusIcon } from "@plane/ui"; // components import { SIDEBAR_WIDTH } from "@/components/gantt-chart/constants"; import { getBlockViewDetails } from "@/components/issues/issue-layouts/utils"; @@ -45,7 +46,7 @@ export const ModuleGanttBlock: React.FC = observer((props) => {
{message}
} - position="top-left" + position="top-start" >
= observer((props) => { return (
- +
= (props) => { isMobile={isMobile} tooltipContent={t("project_id_tooltip_content")} className="text-sm" - position="right-top" + position="right-start" > diff --git a/apps/web/core/components/project/form.tsx b/apps/web/core/components/project/form.tsx index f4eabe9283..466c6548c3 100644 --- a/apps/web/core/components/project/form.tsx +++ b/apps/web/core/components/project/form.tsx @@ -6,6 +6,7 @@ import { Info, Lock } from "lucide-react"; import { NETWORK_CHOICES, PROJECT_TRACKER_ELEMENTS, PROJECT_TRACKER_EVENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; // plane imports +import { Tooltip } from "@plane/propel/tooltip"; import { IProject, IWorkspace } from "@plane/types"; import { Button, @@ -16,7 +17,6 @@ import { setToast, CustomEmojiIconPicker, EmojiIconPickerTypes, - Tooltip, } from "@plane/ui"; import { renderFormattedDate, convertHexEmojiToDecimal, getFileURL } from "@plane/utils"; // components @@ -352,7 +352,7 @@ export const ProjectDetailsForm: FC = (props) => { isMobile={isMobile} tooltipContent="Helps you identify work items in the project uniquely. Max 5 characters." className="text-sm" - position="right-top" + position="right-start" > diff --git a/apps/web/core/components/project/settings/features-list.tsx b/apps/web/core/components/project/settings/features-list.tsx index 7fe00b702d..b0f5bf2917 100644 --- a/apps/web/core/components/project/settings/features-list.tsx +++ b/apps/web/core/components/project/settings/features-list.tsx @@ -5,8 +5,9 @@ import { observer } from "mobx-react"; // plane imports import { PROJECT_TRACKER_ELEMENTS, PROJECT_TRACKER_EVENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; +import { Tooltip } from "@plane/propel/tooltip"; import { IProject } from "@plane/types"; -import { ToggleSwitch, Tooltip, setPromiseToast } from "@plane/ui"; +import { ToggleSwitch, setPromiseToast } from "@plane/ui"; // components import { SettingsHeading } from "@/components/settings/heading"; // helpers diff --git a/apps/web/core/components/stickies/action-bar.tsx b/apps/web/core/components/stickies/action-bar.tsx index 91dc50962d..9b6e1ed926 100644 --- a/apps/web/core/components/stickies/action-bar.tsx +++ b/apps/web/core/components/stickies/action-bar.tsx @@ -6,7 +6,8 @@ import { Plus, StickyNote as StickyIcon, X } from "lucide-react"; // plane hooks import { useOutsideClickDetector } from "@plane/hooks"; // plane ui -import { RecentStickyIcon, StickyNoteIcon, Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; +import { RecentStickyIcon, StickyNoteIcon } from "@plane/ui"; // plane utils import { cn } from "@plane/utils"; // hooks diff --git a/apps/web/core/components/ui/labels-list.tsx b/apps/web/core/components/ui/labels-list.tsx index ec81de0d6c..bf9626b2ff 100644 --- a/apps/web/core/components/ui/labels-list.tsx +++ b/apps/web/core/components/ui/labels-list.tsx @@ -2,8 +2,8 @@ import { FC } from "react"; // ui +import { Tooltip } from "@plane/propel/tooltip"; import { IIssueLabel } from "@plane/types"; -import { Tooltip } from "@plane/ui"; // types import { usePlatformOS } from "@/hooks/use-platform-os"; // hooks diff --git a/apps/web/core/components/views/view-list-item-action.tsx b/apps/web/core/components/views/view-list-item-action.tsx index bf08cf0456..d423998bb9 100644 --- a/apps/web/core/components/views/view-list-item-action.tsx +++ b/apps/web/core/components/views/view-list-item-action.tsx @@ -5,8 +5,9 @@ import { Earth, Lock } from "lucide-react"; // plane imports import { EUserPermissions, EUserPermissionsLevel, IS_FAVORITE_MENU_OPEN } from "@plane/constants"; import { useLocalStorage } from "@plane/hooks"; +import { Tooltip } from "@plane/propel/tooltip"; import { EViewAccess, IProjectView } from "@plane/types"; -import { Tooltip, FavoriteStar } from "@plane/ui"; +import { FavoriteStar } from "@plane/ui"; import { calculateTotalFilters, getPublishViewLink } from "@plane/utils"; // hooks import { useMember } from "@/hooks/store/use-member"; diff --git a/apps/web/core/components/web-hooks/form/secret-key.tsx b/apps/web/core/components/web-hooks/form/secret-key.tsx index bea3fe7664..b1e1f33d79 100644 --- a/apps/web/core/components/web-hooks/form/secret-key.tsx +++ b/apps/web/core/components/web-hooks/form/secret-key.tsx @@ -7,9 +7,10 @@ import { useParams } from "next/navigation"; // icons import { Copy, Eye, EyeOff, RefreshCw } from "lucide-react"; import { useTranslation } from "@plane/i18n"; +import { Tooltip } from "@plane/propel/tooltip"; import { IWebhook } from "@plane/types"; // ui -import { Button, Tooltip, TOAST_TYPE, setToast } from "@plane/ui"; +import { Button, TOAST_TYPE, setToast } from "@plane/ui"; import { csvDownload, copyTextToClipboard } from "@plane/utils"; // helpers // hooks diff --git a/apps/web/core/components/workspace-notifications/sidebar/filters/menu/root.tsx b/apps/web/core/components/workspace-notifications/sidebar/filters/menu/root.tsx index 405eac7d92..dfbf82d3cb 100644 --- a/apps/web/core/components/workspace-notifications/sidebar/filters/menu/root.tsx +++ b/apps/web/core/components/workspace-notifications/sidebar/filters/menu/root.tsx @@ -6,7 +6,8 @@ import { ListFilter } from "lucide-react"; // plane imports import { ENotificationFilterType, FILTER_TYPE_OPTIONS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; -import { PopoverMenu, Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; +import { PopoverMenu } from "@plane/ui"; // hooks import { usePlatformOS } from "@/hooks/use-platform-os"; // local imports diff --git a/apps/web/core/components/workspace-notifications/sidebar/header/options/root.tsx b/apps/web/core/components/workspace-notifications/sidebar/header/options/root.tsx index 397252fe59..91a2652858 100644 --- a/apps/web/core/components/workspace-notifications/sidebar/header/options/root.tsx +++ b/apps/web/core/components/workspace-notifications/sidebar/header/options/root.tsx @@ -9,7 +9,8 @@ import { NOTIFICATION_TRACKER_EVENTS, } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; -import { Spinner, Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; +import { Spinner } from "@plane/ui"; // helpers import { captureSuccess } from "@/helpers/event-tracker.helper"; // hooks diff --git a/apps/web/core/components/workspace-notifications/sidebar/notification-card/options/button.tsx b/apps/web/core/components/workspace-notifications/sidebar/notification-card/options/button.tsx index e1b5d79179..3aa2a33ff0 100644 --- a/apps/web/core/components/workspace-notifications/sidebar/notification-card/options/button.tsx +++ b/apps/web/core/components/workspace-notifications/sidebar/notification-card/options/button.tsx @@ -1,7 +1,7 @@ "use client"; import { FC, ReactNode } from "react"; -import { Tooltip } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; // helpers import { cn } from "@plane/utils"; // hooks diff --git a/apps/web/core/components/workspace-notifications/sidebar/notification-card/options/snooze/root.tsx b/apps/web/core/components/workspace-notifications/sidebar/notification-card/options/snooze/root.tsx index 32eced44d1..fc67e2609a 100644 --- a/apps/web/core/components/workspace-notifications/sidebar/notification-card/options/snooze/root.tsx +++ b/apps/web/core/components/workspace-notifications/sidebar/notification-card/options/snooze/root.tsx @@ -7,7 +7,8 @@ import { Popover, Transition } from "@headlessui/react"; // plane imports import { NOTIFICATION_SNOOZE_OPTIONS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; -import { Tooltip, setToast, TOAST_TYPE } from "@plane/ui"; +import { Tooltip } from "@plane/propel/tooltip"; +import { setToast, TOAST_TYPE } from "@plane/ui"; import { cn } from "@plane/utils"; // hooks import { useWorkspaceNotifications } from "@/hooks/store/notifications"; diff --git a/apps/web/core/components/workspace/sidebar/favorites/favorite-folder.tsx b/apps/web/core/components/workspace/sidebar/favorites/favorite-folder.tsx index bc9f1e9d93..14a9e9e52a 100644 --- a/apps/web/core/components/workspace/sidebar/favorites/favorite-folder.tsx +++ b/apps/web/core/components/workspace/sidebar/favorites/favorite-folder.tsx @@ -20,8 +20,9 @@ import { Disclosure, Transition } from "@headlessui/react"; // plane imports import { useOutsideClickDetector } from "@plane/hooks"; import { useTranslation } from "@plane/i18n"; +import { Tooltip } from "@plane/propel/tooltip"; import { IFavorite, InstructionType } from "@plane/types"; -import { CustomMenu, Tooltip, DropIndicator, FavoriteFolderIcon, DragHandle } from "@plane/ui"; +import { CustomMenu, DropIndicator, FavoriteFolderIcon, DragHandle } from "@plane/ui"; // helpers import { cn } from "@plane/utils"; // hooks @@ -179,7 +180,7 @@ export const FavoriteFolder: React.FC = (props) => { tooltipContent={ favorite.sort_order === null ? "Join the project to rearrange" : "Drag to rearrange" } - position="top-right" + position="top-end" disabled={isDragging} > + ), + }} + /> + + + ); +}; diff --git a/packages/propel/src/emoji-icon-picker/emoji/index.ts b/packages/propel/src/emoji-icon-picker/emoji/index.ts new file mode 100644 index 0000000000..ebaf40c172 --- /dev/null +++ b/packages/propel/src/emoji-icon-picker/emoji/index.ts @@ -0,0 +1 @@ +export * from "./emoji"; diff --git a/packages/propel/src/emoji-icon-picker/helper.tsx b/packages/propel/src/emoji-icon-picker/helper.tsx new file mode 100644 index 0000000000..a613a1b083 --- /dev/null +++ b/packages/propel/src/emoji-icon-picker/helper.tsx @@ -0,0 +1,154 @@ +import { TPlacement, TSide, TAlign } from "../utils/placement"; + +export enum EmojiIconPickerTypes { + EMOJI = "emoji", + ICON = "icon", +} + +export type TChangeHandlerProps = + | { + type: EmojiIconPickerTypes.EMOJI; + value: string; + } + | { + type: EmojiIconPickerTypes.ICON; + value: { + name: string; + color: string; + }; + }; + +export type TCustomEmojiPicker = { + isOpen: boolean; + handleToggle: (value: boolean) => void; + buttonClassName?: string; + className?: string; + closeOnSelect?: boolean; + defaultIconColor?: string; + defaultOpen?: EmojiIconPickerTypes; + disabled?: boolean; + dropdownClassName?: string; + label: React.ReactNode; + onChange: (value: TChangeHandlerProps) => void; + placement?: TPlacement; + searchDisabled?: boolean; + searchPlaceholder?: string; + iconType?: "material" | "lucide"; + theme?: "light" | "dark"; + side?: TSide; + align?: TAlign; +}; + +export type TIconsListProps = { + defaultColor: string; + onChange: (val: { name: string; color: string }) => void; + searchDisabled?: boolean; +}; + +/** + * Adjusts the given hex color to ensure it has enough contrast. + * @param {string} hex - The hex color code input by the user. + * @returns {string} - The adjusted hex color code. + */ +export const adjustColorForContrast = (hex: string): string => { + // Ensure hex color is valid + if (!/^#([0-9A-F]{3}){1,2}$/i.test(hex)) { + throw new Error("Invalid hex color code"); + } + + // Convert hex to RGB + let r = 0, + g = 0, + b = 0; + if (hex.length === 4) { + r = parseInt(hex[1] + hex[1], 16); + g = parseInt(hex[2] + hex[2], 16); + b = parseInt(hex[3] + hex[3], 16); + } else if (hex.length === 7) { + r = parseInt(hex[1] + hex[2], 16); + g = parseInt(hex[3] + hex[4], 16); + b = parseInt(hex[5] + hex[6], 16); + } + + // Calculate luminance + const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255; + + // If the color is too light, darken it + if (luminance > 0.5) { + r = Math.max(0, r - 50); + g = Math.max(0, g - 50); + b = Math.max(0, b - 50); + } + + // Convert RGB back to hex + const toHex = (value: number): string => { + const hex = value.toString(16); + return hex.length === 1 ? "0" + hex : hex; + }; + + return `#${toHex(r)}${toHex(g)}${toHex(b)}`; +}; + +export const DEFAULT_COLORS = ["#95999f", "#6d7b8a", "#5e6ad2", "#02b5ed", "#02b55c", "#f2be02", "#e57a00", "#f38e82"]; + +/** + * Enhanced emoji to decimal conversion that preserves emoji sequences + * This function handles complex emoji sequences including skin tone modifiers + * @param emoji - The emoji string to convert + * @returns Array of decimal Unicode code points + */ +export function emojiToDecimalEnhanced(emoji: string): number[] { + const codePoints: number[] = []; + + // Use Array.from to properly handle multi-byte Unicode characters + const characters = Array.from(emoji); + + for (const char of characters) { + const codePoint = char.codePointAt(0); + if (codePoint !== undefined) { + codePoints.push(codePoint); + } + } + + return codePoints; +} + +/** + * Enhanced decimal to emoji conversion that handles emoji sequences + * @param decimals - Array of decimal Unicode code points + * @returns The reconstructed emoji string + */ +export function decimalToEmojiEnhanced(decimals: number[]): string { + return decimals.map((decimal) => String.fromCodePoint(decimal)).join(""); +} + +/** + * Converts emoji to a string representation for storage + * This creates a comma-separated string of decimal values + * @param emoji - The emoji string to convert + * @returns String representation of decimal values + */ +export function emojiToString(emoji: string): string { + const decimals = emojiToDecimalEnhanced(emoji); + return decimals.join("-"); +} + +/** + * Converts string representation back to emoji + * @param emojiString - Comma-separated string of decimal values + * @returns The reconstructed emoji string + */ +export function stringToEmoji(emojiString: string): string { + if (!emojiString) return ""; + const decimals = emojiString + .split("-") + .map((s) => Number(s.trim())) + .filter((n) => Number.isFinite(n) && n >= 0 && n <= 0x10ffff); + try { + return decimalToEmojiEnhanced(decimals); + } catch { + return ""; + } +} + +export const getEmojiSize = (size: number) => size * 0.9 * 0.0625; diff --git a/packages/propel/src/emoji-icon-picker/icon/icon-root.tsx b/packages/propel/src/emoji-icon-picker/icon/icon-root.tsx new file mode 100644 index 0000000000..640150dfbe --- /dev/null +++ b/packages/propel/src/emoji-icon-picker/icon/icon-root.tsx @@ -0,0 +1,128 @@ +import React, { useEffect, useState } from "react"; +import { InfoIcon, Search } from "lucide-react"; +import { cn } from "../../utils/classname"; +import { adjustColorForContrast, DEFAULT_COLORS } from "../helper"; +import { LucideIconsList } from "./lucide-root"; +import { MaterialIconList } from "./material-root"; + +type IconRootProps = { + onChange: (value: { name: string; color: string }) => void; + defaultColor: string; + searchDisabled?: boolean; + iconType: "material" | "lucide"; +}; + +export const IconRoot: React.FC = (props) => { + const { defaultColor, onChange, searchDisabled = false, iconType } = props; + // states + const [activeColor, setActiveColor] = useState(defaultColor); + const [showHexInput, setShowHexInput] = useState(false); + const [hexValue, setHexValue] = useState(""); + const [isInputFocused, setIsInputFocused] = useState(false); + const [query, setQuery] = useState(""); + + useEffect(() => { + if (DEFAULT_COLORS.includes(defaultColor.toLowerCase() ?? "")) setShowHexInput(false); + else { + setHexValue(defaultColor?.slice(1, 7) ?? ""); + setShowHexInput(true); + } + }, [defaultColor]); + + return ( + <> +
+ {!searchDisabled && ( +
+
setIsInputFocused(true)} + onBlur={() => setIsInputFocused(false)} + > + + + setQuery(e.target.value)} + className="block rounded-md bg-transparent placeholder-custom-text-400 focus:outline-none px-3 py-2 border-[0.5px] border-custom-border-200 text-[1rem] border-none p-0 h-full w-full" + /> +
+
+ )} +
+ {showHexInput ? ( +
+ + HEX + # + { + const value = e.target.value; + setHexValue(value); + if (/^[0-9A-Fa-f]{6}$/.test(value)) setActiveColor(adjustColorForContrast(`#${value}`)); + }} + className="block placeholder-custom-text-400 focus:outline-none px-3 py-2 border-[0.5px] border-custom-border-200 flex-grow pl-0 text-xs text-custom-text-200 rounded border-none bg-transparent ring-0" + autoFocus + /> +
+ ) : ( + DEFAULT_COLORS.map((curCol) => ( + + )) + )} + +
+
+ +

Colors will be adjusted to ensure sufficient contrast.

+
+
+
+ {iconType === "material" ? ( + + ) : ( + + )} +
+ + ); +}; diff --git a/packages/propel/src/emoji-icon-picker/icon/index.ts b/packages/propel/src/emoji-icon-picker/icon/index.ts new file mode 100644 index 0000000000..a5a2e51972 --- /dev/null +++ b/packages/propel/src/emoji-icon-picker/icon/index.ts @@ -0,0 +1 @@ +export * from "./icon-root"; diff --git a/packages/propel/src/emoji-icon-picker/icon/lucide-root.tsx b/packages/propel/src/emoji-icon-picker/icon/lucide-root.tsx new file mode 100644 index 0000000000..a67fa70fd0 --- /dev/null +++ b/packages/propel/src/emoji-icon-picker/icon/lucide-root.tsx @@ -0,0 +1,34 @@ +import React from "react"; +import { LUCIDE_ICONS_LIST } from "../lucide-icons"; + +type LucideIconsListProps = { + onChange: (value: { name: string; color: string }) => void; + activeColor: string; + query: string; +}; + +export const LucideIconsList: React.FC = (props) => { + const { query, onChange, activeColor } = props; + + const filteredArray = LUCIDE_ICONS_LIST.filter((icon) => icon.name.toLowerCase().includes(query.toLowerCase())); + + return ( + <> + {filteredArray.map((icon) => ( + + ))} + + ); +}; diff --git a/packages/propel/src/emoji-icon-picker/icon/material-root.tsx b/packages/propel/src/emoji-icon-picker/icon/material-root.tsx new file mode 100644 index 0000000000..676d4961f6 --- /dev/null +++ b/packages/propel/src/emoji-icon-picker/icon/material-root.tsx @@ -0,0 +1,55 @@ +"use client"; + +import React from "react"; +import useFontFaceObserver from "use-font-face-observer"; +import { MATERIAL_ICONS_LIST } from "../material-icons"; + +type MaterialIconListProps = { + onChange: (value: { name: string; color: string }) => void; + activeColor: string; + query: string; +}; + +export const MaterialIconList: React.FC = (props) => { + const { query, onChange, activeColor } = props; + + const filteredArray = MATERIAL_ICONS_LIST.filter((icon) => icon.name.toLowerCase().includes(query.toLowerCase())); + + const isMaterialSymbolsFontLoaded = useFontFaceObserver([ + { + family: `Material Symbols Rounded`, + style: `normal`, + weight: `normal`, + stretch: `condensed`, + }, + ]); + + return ( + <> + {filteredArray.map((icon) => ( + + ))} + + ); +}; diff --git a/packages/propel/src/emoji-icon-picker/index.ts b/packages/propel/src/emoji-icon-picker/index.ts new file mode 100644 index 0000000000..1ace9dfe82 --- /dev/null +++ b/packages/propel/src/emoji-icon-picker/index.ts @@ -0,0 +1,4 @@ +export * from "./emoji-picker"; +export * from "./helper"; +export * from "./lucide-icons"; +export * from "./material-icons"; diff --git a/packages/propel/src/emoji-icon-picker/lucide-icons.tsx b/packages/propel/src/emoji-icon-picker/lucide-icons.tsx new file mode 100644 index 0000000000..2aeffc77ca --- /dev/null +++ b/packages/propel/src/emoji-icon-picker/lucide-icons.tsx @@ -0,0 +1,315 @@ +import { + Activity, + Airplay, + AlertCircle, + AlertOctagon, + AlertTriangle, + AlignCenter, + AlignJustify, + AlignLeft, + AlignRight, + Anchor, + Aperture, + Archive, + ArrowDown, + ArrowLeft, + ArrowRight, + ArrowUp, + AtSign, + Award, + BarChart, + BarChart2, + Battery, + BatteryCharging, + Bell, + BellOff, + Book, + Bookmark, + BookOpen, + Box, + Briefcase, + Calendar, + Camera, + CameraOff, + Cast, + Check, + CheckCircle, + CheckSquare, + ChevronDown, + ChevronLeft, + ChevronRight, + ChevronUp, + Clipboard, + Clock, + Cloud, + CloudDrizzle, + CloudLightning, + CloudOff, + CloudRain, + CloudSnow, + Code, + Codepen, + Codesandbox, + Coffee, + Columns, + Command, + Compass, + Copy, + CornerDownLeft, + CornerDownRight, + CornerLeftDown, + CornerLeftUp, + CornerRightDown, + CornerRightUp, + CornerUpLeft, + CornerUpRight, + Cpu, + CreditCard, + Crop, + Crosshair, + Database, + Delete, + Disc, + Divide, + DivideCircle, + DivideSquare, + DollarSign, + Download, + DownloadCloud, + Dribbble, + Droplet, + Edit, + Edit2, + Edit3, + ExternalLink, + Eye, + EyeOff, + Facebook, + FastForward, + Feather, + Figma, + File, + FileMinus, + FilePlus, + FileText, + Film, + Filter, + Flag, + Folder, + FolderMinus, + FolderPlus, + Framer, + Frown, + Gift, + GitBranch, + GitCommit, + GitMerge, + GitPullRequest, + Github, + Gitlab, + Globe, + Grid, + HardDrive, + Hash, + Headphones, + Heart, + HelpCircle, + Hexagon, + Home, + Image, + Inbox, + Info, + Instagram, + Italic, + Key, + Layers, + Layout, + LifeBuoy, + Link, + Link2, + Linkedin, + List, + Loader, + Lock, + LogIn, + LogOut, + Mail, + Map as MapIcon, + MapPin, + Maximize, + Maximize2, + Meh, + Menu, + MessageCircle, + MessageSquare, + Mic, + MicOff, + Minimize, + Minimize2, + Minus, + MinusCircle, + MinusSquare, + CircleChevronDown, + UsersRound, + ToggleLeft, + Search, + User, +} from "lucide-react"; + +export const LUCIDE_ICONS_LIST = [ + { name: "Activity", element: Activity }, + { name: "Airplay", element: Airplay }, + { name: "AlertCircle", element: AlertCircle }, + { name: "AlertOctagon", element: AlertOctagon }, + { name: "AlertTriangle", element: AlertTriangle }, + { name: "AlignCenter", element: AlignCenter }, + { name: "AlignJustify", element: AlignJustify }, + { name: "AlignLeft", element: AlignLeft }, + { name: "AlignRight", element: AlignRight }, + { name: "Anchor", element: Anchor }, + { name: "Aperture", element: Aperture }, + { name: "Archive", element: Archive }, + { name: "ArrowDown", element: ArrowDown }, + { name: "ArrowLeft", element: ArrowLeft }, + { name: "ArrowRight", element: ArrowRight }, + { name: "ArrowUp", element: ArrowUp }, + { name: "AtSign", element: AtSign }, + { name: "Award", element: Award }, + { name: "BarChart", element: BarChart }, + { name: "BarChart2", element: BarChart2 }, + { name: "Battery", element: Battery }, + { name: "BatteryCharging", element: BatteryCharging }, + { name: "Bell", element: Bell }, + { name: "BellOff", element: BellOff }, + { name: "Book", element: Book }, + { name: "Bookmark", element: Bookmark }, + { name: "BookOpen", element: BookOpen }, + { name: "Box", element: Box }, + { name: "Briefcase", element: Briefcase }, + { name: "Calendar", element: Calendar }, + { name: "Camera", element: Camera }, + { name: "CameraOff", element: CameraOff }, + { name: "Cast", element: Cast }, + { name: "CircleChevronDown", element: CircleChevronDown }, + { name: "Check", element: Check }, + { name: "CheckCircle", element: CheckCircle }, + { name: "CheckSquare", element: CheckSquare }, + { name: "ChevronDown", element: ChevronDown }, + { name: "ChevronLeft", element: ChevronLeft }, + { name: "ChevronRight", element: ChevronRight }, + { name: "ChevronUp", element: ChevronUp }, + { name: "Clipboard", element: Clipboard }, + { name: "Clock", element: Clock }, + { name: "Cloud", element: Cloud }, + { name: "CloudDrizzle", element: CloudDrizzle }, + { name: "CloudLightning", element: CloudLightning }, + { name: "CloudOff", element: CloudOff }, + { name: "CloudRain", element: CloudRain }, + { name: "CloudSnow", element: CloudSnow }, + { name: "Code", element: Code }, + { name: "Codepen", element: Codepen }, + { name: "Codesandbox", element: Codesandbox }, + { name: "Coffee", element: Coffee }, + { name: "Columns", element: Columns }, + { name: "Command", element: Command }, + { name: "Compass", element: Compass }, + { name: "Copy", element: Copy }, + { name: "CornerDownLeft", element: CornerDownLeft }, + { name: "CornerDownRight", element: CornerDownRight }, + { name: "CornerLeftDown", element: CornerLeftDown }, + { name: "CornerLeftUp", element: CornerLeftUp }, + { name: "CornerRightDown", element: CornerRightDown }, + { name: "CornerRightUp", element: CornerRightUp }, + { name: "CornerUpLeft", element: CornerUpLeft }, + { name: "CornerUpRight", element: CornerUpRight }, + { name: "Cpu", element: Cpu }, + { name: "CreditCard", element: CreditCard }, + { name: "Crop", element: Crop }, + { name: "Crosshair", element: Crosshair }, + { name: "Database", element: Database }, + { name: "Delete", element: Delete }, + { name: "Disc", element: Disc }, + { name: "Divide", element: Divide }, + { name: "DivideCircle", element: DivideCircle }, + { name: "DivideSquare", element: DivideSquare }, + { name: "DollarSign", element: DollarSign }, + { name: "Download", element: Download }, + { name: "DownloadCloud", element: DownloadCloud }, + { name: "Dribbble", element: Dribbble }, + { name: "Droplet", element: Droplet }, + { name: "Edit", element: Edit }, + { name: "Edit2", element: Edit2 }, + { name: "Edit3", element: Edit3 }, + { name: "ExternalLink", element: ExternalLink }, + { name: "Eye", element: Eye }, + { name: "EyeOff", element: EyeOff }, + { name: "Facebook", element: Facebook }, + { name: "FastForward", element: FastForward }, + { name: "Feather", element: Feather }, + { name: "Figma", element: Figma }, + { name: "File", element: File }, + { name: "FileMinus", element: FileMinus }, + { name: "FilePlus", element: FilePlus }, + { name: "FileText", element: FileText }, + { name: "Film", element: Film }, + { name: "Filter", element: Filter }, + { name: "Flag", element: Flag }, + { name: "Folder", element: Folder }, + { name: "FolderMinus", element: FolderMinus }, + { name: "FolderPlus", element: FolderPlus }, + { name: "Framer", element: Framer }, + { name: "Frown", element: Frown }, + { name: "Gift", element: Gift }, + { name: "GitBranch", element: GitBranch }, + { name: "GitCommit", element: GitCommit }, + { name: "GitMerge", element: GitMerge }, + { name: "GitPullRequest", element: GitPullRequest }, + { name: "Github", element: Github }, + { name: "Gitlab", element: Gitlab }, + { name: "Globe", element: Globe }, + { name: "Grid", element: Grid }, + { name: "HardDrive", element: HardDrive }, + { name: "Hash", element: Hash }, + { name: "Headphones", element: Headphones }, + { name: "Heart", element: Heart }, + { name: "HelpCircle", element: HelpCircle }, + { name: "Hexagon", element: Hexagon }, + { name: "Home", element: Home }, + { name: "Image", element: Image }, + { name: "Inbox", element: Inbox }, + { name: "Info", element: Info }, + { name: "Instagram", element: Instagram }, + { name: "Italic", element: Italic }, + { name: "Key", element: Key }, + { name: "Layers", element: Layers }, + { name: "Layout", element: Layout }, + { name: "LifeBuoy", element: LifeBuoy }, + { name: "Link", element: Link }, + { name: "Link2", element: Link2 }, + { name: "Linkedin", element: Linkedin }, + { name: "List", element: List }, + { name: "Loader", element: Loader }, + { name: "Lock", element: Lock }, + { name: "LogIn", element: LogIn }, + { name: "LogOut", element: LogOut }, + { name: "Mail", element: Mail }, + { name: "Map", element: MapIcon }, + { name: "MapPin", element: MapPin }, + { name: "Maximize", element: Maximize }, + { name: "Maximize2", element: Maximize2 }, + { name: "Meh", element: Meh }, + { name: "Menu", element: Menu }, + { name: "MessageCircle", element: MessageCircle }, + { name: "MessageSquare", element: MessageSquare }, + { name: "Mic", element: Mic }, + { name: "MicOff", element: MicOff }, + { name: "Minimize", element: Minimize }, + { name: "Minimize2", element: Minimize2 }, + { name: "Minus", element: Minus }, + { name: "MinusCircle", element: MinusCircle }, + { name: "MinusSquare", element: MinusSquare }, + { name: "Search", element: Search }, + { name: "ToggleLeft", element: ToggleLeft }, + { name: "User", element: User }, + { name: "UsersRound", element: UsersRound }, +]; diff --git a/packages/propel/src/emoji-icon-picker/material-icons.tsx b/packages/propel/src/emoji-icon-picker/material-icons.tsx new file mode 100644 index 0000000000..d77c7444ea --- /dev/null +++ b/packages/propel/src/emoji-icon-picker/material-icons.tsx @@ -0,0 +1,602 @@ +export const MATERIAL_ICONS_LIST = [ + { + name: "search", + }, + { + name: "home", + }, + { + name: "menu", + }, + { + name: "close", + }, + { + name: "settings", + }, + { + name: "done", + }, + { + name: "check_circle", + }, + { + name: "favorite", + }, + { + name: "add", + }, + { + name: "delete", + }, + { + name: "arrow_back", + }, + { + name: "star", + }, + { + name: "logout", + }, + { + name: "add_circle", + }, + { + name: "cancel", + }, + { + name: "arrow_drop_down", + }, + { + name: "more_vert", + }, + { + name: "check", + }, + { + name: "check_box", + }, + { + name: "toggle_on", + }, + { + name: "open_in_new", + }, + { + name: "refresh", + }, + { + name: "login", + }, + { + name: "radio_button_unchecked", + }, + { + name: "more_horiz", + }, + { + name: "apps", + }, + { + name: "radio_button_checked", + }, + { + name: "download", + }, + { + name: "remove", + }, + { + name: "toggle_off", + }, + { + name: "bolt", + }, + { + name: "arrow_upward", + }, + { + name: "filter_list", + }, + { + name: "delete_forever", + }, + { + name: "autorenew", + }, + { + name: "key", + }, + { + name: "sort", + }, + { + name: "sync", + }, + { + name: "add_box", + }, + { + name: "block", + }, + { + name: "restart_alt", + }, + { + name: "menu_open", + }, + { + name: "shopping_cart_checkout", + }, + { + name: "expand_circle_down", + }, + { + name: "backspace", + }, + { + name: "undo", + }, + { + name: "done_all", + }, + { + name: "do_not_disturb_on", + }, + { + name: "open_in_full", + }, + { + name: "double_arrow", + }, + { + name: "sync_alt", + }, + { + name: "zoom_in", + }, + { + name: "done_outline", + }, + { + name: "drag_indicator", + }, + { + name: "fullscreen", + }, + { + name: "star_half", + }, + { + name: "settings_accessibility", + }, + { + name: "reply", + }, + { + name: "exit_to_app", + }, + { + name: "unfold_more", + }, + { + name: "library_add", + }, + { + name: "cached", + }, + { + name: "select_check_box", + }, + { + name: "terminal", + }, + { + name: "change_circle", + }, + { + name: "disabled_by_default", + }, + { + name: "swap_horiz", + }, + { + name: "swap_vert", + }, + { + name: "app_registration", + }, + { + name: "download_for_offline", + }, + { + name: "close_fullscreen", + }, + { + name: "file_open", + }, + { + name: "minimize", + }, + { + name: "open_with", + }, + { + name: "dataset", + }, + { + name: "add_task", + }, + { + name: "start", + }, + { + name: "keyboard_voice", + }, + { + name: "create_new_folder", + }, + { + name: "forward", + }, + { + name: "settings_applications", + }, + { + name: "compare_arrows", + }, + { + name: "redo", + }, + { + name: "zoom_out", + }, + { + name: "publish", + }, + { + name: "html", + }, + { + name: "token", + }, + { + name: "switch_access_shortcut", + }, + { + name: "fullscreen_exit", + }, + { + name: "sort_by_alpha", + }, + { + name: "delete_sweep", + }, + { + name: "indeterminate_check_box", + }, + { + name: "view_timeline", + }, + { + name: "settings_backup_restore", + }, + { + name: "arrow_drop_down_circle", + }, + { + name: "assistant_navigation", + }, + { + name: "sync_problem", + }, + { + name: "clear_all", + }, + { + name: "density_medium", + }, + { + name: "heart_plus", + }, + { + name: "filter_alt_off", + }, + { + name: "expand", + }, + { + name: "subdirectory_arrow_right", + }, + { + name: "download_done", + }, + { + name: "arrow_outward", + }, + { + name: "123", + }, + { + name: "swipe_left", + }, + { + name: "auto_mode", + }, + { + name: "saved_search", + }, + { + name: "place_item", + }, + { + name: "system_update_alt", + }, + { + name: "javascript", + }, + { + name: "search_off", + }, + { + name: "output", + }, + { + name: "select_all", + }, + { + name: "fit_screen", + }, + { + name: "swipe_up", + }, + { + name: "dynamic_form", + }, + { + name: "hide_source", + }, + { + name: "swipe_right", + }, + { + name: "switch_access_shortcut_add", + }, + { + name: "browse_gallery", + }, + { + name: "css", + }, + { + name: "density_small", + }, + { + name: "assistant_direction", + }, + { + name: "check_small", + }, + { + name: "youtube_searched_for", + }, + { + name: "move_up", + }, + { + name: "swap_horizontal_circle", + }, + { + name: "data_thresholding", + }, + { + name: "install_mobile", + }, + { + name: "move_down", + }, + { + name: "dataset_linked", + }, + { + name: "keyboard_command_key", + }, + { + name: "view_kanban", + }, + { + name: "swipe_down", + }, + { + name: "key_off", + }, + { + name: "transcribe", + }, + { + name: "send_time_extension", + }, + { + name: "swipe_down_alt", + }, + { + name: "swipe_left_alt", + }, + { + name: "swipe_right_alt", + }, + { + name: "swipe_up_alt", + }, + { + name: "keyboard_option_key", + }, + { + name: "cycle", + }, + { + name: "rebase", + }, + { + name: "rebase_edit", + }, + { + name: "empty_dashboard", + }, + { + name: "magic_exchange", + }, + { + name: "acute", + }, + { + name: "point_scan", + }, + { + name: "step_into", + }, + { + name: "cheer", + }, + { + name: "emoticon", + }, + { + name: "explosion", + }, + { + name: "water_bottle", + }, + { + name: "weather_hail", + }, + { + name: "syringe", + }, + { + name: "pill", + }, + { + name: "genetics", + }, + { + name: "allergy", + }, + { + name: "medical_mask", + }, + { + name: "body_fat", + }, + { + name: "barefoot", + }, + { + name: "infrared", + }, + { + name: "wrist", + }, + { + name: "metabolism", + }, + { + name: "conditions", + }, + { + name: "taunt", + }, + { + name: "altitude", + }, + { + name: "tibia", + }, + { + name: "footprint", + }, + { + name: "eyeglasses", + }, + { + name: "man_3", + }, + { + name: "woman_2", + }, + { + name: "rheumatology", + }, + { + name: "tornado", + }, + { + name: "landslide", + }, + { + name: "foggy", + }, + { + name: "severe_cold", + }, + { + name: "tsunami", + }, + { + name: "vape_free", + }, + { + name: "sign_language", + }, + { + name: "emoji_symbols", + }, + { + name: "clear_night", + }, + { + name: "emoji_food_beverage", + }, + { + name: "hive", + }, + { + name: "thunderstorm", + }, + { + name: "communication", + }, + { + name: "rocket", + }, + { + name: "pets", + }, + { + name: "public", + }, + { + name: "quiz", + }, + { + name: "mood", + }, + { + name: "gavel", + }, + { + name: "eco", + }, + { + name: "diamond", + }, + { + name: "forest", + }, + { + name: "rainy", + }, + { + name: "skull", + }, +]; diff --git a/packages/propel/src/popover/root.tsx b/packages/propel/src/popover/root.tsx index bef1b72981..c48b20b833 100644 --- a/packages/propel/src/popover/root.tsx +++ b/packages/propel/src/popover/root.tsx @@ -8,6 +8,7 @@ export interface PopoverContentProps extends React.ComponentProps; + positionerClassName?: string; } // PopoverContent component @@ -19,6 +20,7 @@ const PopoverContent = React.memo(function PopoverContent({ align = "center", sideOffset = 8, containerRef, + positionerClassName, ...props }) { // side and align calculations @@ -32,7 +34,7 @@ const PopoverContent = React.memo(function PopoverContent({ return ( - + {children} diff --git a/packages/ui/src/emoji/icons-list.tsx b/packages/ui/src/emoji/icons-list.tsx index c4d4cbec5e..8aff055628 100644 --- a/packages/ui/src/emoji/icons-list.tsx +++ b/packages/ui/src/emoji/icons-list.tsx @@ -1,3 +1,5 @@ +"use client"; + import { Search } from "lucide-react"; import React, { useEffect, useState } from "react"; // icons diff --git a/packages/ui/src/emoji/logo.tsx b/packages/ui/src/emoji/logo.tsx index fd2727df69..1d09991c10 100644 --- a/packages/ui/src/emoji/logo.tsx +++ b/packages/ui/src/emoji/logo.tsx @@ -1,3 +1,5 @@ +"use client"; + import { Emoji } from "emoji-picker-react"; import React, { FC } from "react"; import useFontFaceObserver from "use-font-face-observer"; @@ -29,6 +31,9 @@ export const Logo: FC = (props) => { // destructuring the logo object const { in_use, emoji, icon } = logo; + // if no in_use value, return empty fragment + if (!in_use) return <>; + // derived values const value = in_use === "emoji" ? emoji?.value : icon?.name; const color = icon?.color; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ce13a180b8..a6bade6e5d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,8 +7,8 @@ settings: catalogs: default: '@types/react': - specifier: 18.3.1 - version: 18.3.1 + specifier: 18.3.11 + version: 18.3.11 '@types/react-dom': specifier: 18.3.1 version: 18.3.1 @@ -116,7 +116,7 @@ importers: version: 0.33.5 swr: specifier: ^2.2.4 - version: 2.3.3(react@18.3.1) + version: 2.3.6(react@18.3.1) uuid: specifier: ^9.0.1 version: 9.0.1 @@ -138,7 +138,7 @@ importers: version: 18.16.1 '@types/react': specifier: 'catalog:' - version: 18.3.1 + version: 18.3.11 '@types/react-dom': specifier: 'catalog:' version: 18.3.1 @@ -153,16 +153,16 @@ importers: dependencies: '@hocuspocus/extension-database': specifier: ^2.15.0 - version: 2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + version: 2.15.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) '@hocuspocus/extension-logger': specifier: ^2.15.0 - version: 2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + version: 2.15.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) '@hocuspocus/extension-redis': specifier: ^2.15.0 - version: 2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + version: 2.15.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) '@hocuspocus/server': specifier: ^2.15.0 - version: 2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + version: 2.15.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) '@plane/editor': specifier: workspace:* version: link:../../packages/editor @@ -198,7 +198,7 @@ importers: version: 7.2.0 ioredis: specifier: ^5.4.1 - version: 5.6.1 + version: 5.7.0 lodash: specifier: ^4.17.21 version: 4.17.21 @@ -216,7 +216,7 @@ importers: version: 10.0.0 y-prosemirror: specifier: ^1.2.15 - version: 1.3.6(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) + 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) @@ -253,7 +253,7 @@ importers: version: 9.0.8 concurrently: specifier: ^9.0.1 - version: 9.1.2 + version: 9.2.0 nodemon: specifier: ^3.1.7 version: 3.1.10 @@ -274,16 +274,16 @@ importers: dependencies: '@emotion/react': specifier: ^11.11.1 - version: 11.14.0(@types/react@18.3.1)(react@18.3.1) + version: 11.14.0(@types/react@18.3.11)(react@18.3.1) '@emotion/styled': specifier: ^11.11.0 - version: 11.14.0(@emotion/react@11.14.0(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1) + version: 11.14.1(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1) '@headlessui/react': specifier: ^1.7.13 version: 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': specifier: ^5.14.1 - version: 5.17.1(@emotion/react@11.14.0(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 5.18.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@plane/constants': specifier: workspace:* version: link:../../packages/constants @@ -373,7 +373,7 @@ importers: version: 0.33.5 swr: specifier: ^2.2.2 - version: 2.3.3(react@18.3.1) + version: 2.3.6(react@18.3.1) tailwind-merge: specifier: ^2.0.0 version: 2.6.0 @@ -401,7 +401,7 @@ importers: version: 0.2.3 '@types/react': specifier: 'catalog:' - version: 18.3.1 + version: 18.3.11 '@types/react-dom': specifier: 'catalog:' version: 18.3.1 @@ -476,7 +476,7 @@ importers: version: 2.1.1 cmdk: specifier: ^1.0.0 - version: 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + 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) comlink: specifier: ^4.4.1 version: 4.4.2 @@ -488,13 +488,13 @@ importers: version: 16.6.1 emoji-picker-react: specifier: ^4.5.16 - version: 4.12.2(react@18.3.1) + version: 4.13.2(react@18.3.1) export-to-csv: specifier: ^1.4.0 version: 1.4.0 isomorphic-dompurify: specifier: ^2.12.0 - version: 2.25.0 + version: 2.26.0 lodash: specifier: ^4.17.21 version: 4.17.21 @@ -518,7 +518,7 @@ importers: version: 0.2.1(next@14.2.32(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.131.3 - version: 1.255.1 + version: 1.260.1 react: specifier: 'catalog:' version: 18.3.1 @@ -539,7 +539,7 @@ importers: version: 7.51.5(react@18.3.1) react-markdown: specifier: ^8.0.7 - version: 8.0.7(@types/react@18.3.1)(react@18.3.1) + version: 8.0.7(@types/react@18.3.11)(react@18.3.1) react-masonry-component: specifier: ^6.3.0 version: 6.3.0(react@18.3.1) @@ -560,7 +560,7 @@ importers: version: 2.0.2 swr: specifier: ^2.1.3 - version: 2.3.3(react@18.3.1) + version: 2.3.6(react@18.3.1) tailwind-merge: specifier: ^2.0.0 version: 2.6.0 @@ -588,10 +588,10 @@ importers: version: 18.16.1 '@types/react': specifier: 'catalog:' - version: 18.3.1 + version: 18.3.11 '@types/react-color': specifier: ^3.0.6 - version: 3.0.13(@types/react@18.3.1) + version: 3.0.13(@types/react@18.3.11) '@types/react-dom': specifier: 'catalog:' version: 18.3.1 @@ -622,7 +622,7 @@ importers: version: 22.17.2 '@types/react': specifier: 'catalog:' - version: 18.3.1 + version: 18.3.11 tsup: specifier: 'catalog:' version: 8.4.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(jiti@1.21.7)(postcss@8.5.6)(typescript@5.8.3)(yaml@2.8.1) @@ -661,7 +661,7 @@ importers: dependencies: '@floating-ui/dom': specifier: ^1.7.1 - version: 1.7.2 + version: 1.7.3 '@floating-ui/react': specifier: ^0.26.4 version: 0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -700,7 +700,7 @@ importers: version: 2.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1) '@tiptap/extension-collaboration': specifier: ^2.22.3 - version: 2.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)(y-prosemirror@1.3.6(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)) + version: 2.26.1(@tiptap/core@2.26.1(@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-emoji': specifier: ^2.22.3 version: 2.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)(@tiptap/suggestion@2.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1))(emojibase@16.0.0) @@ -790,7 +790,7 @@ importers: version: 9.0.12(yjs@13.6.27) y-prosemirror: specifier: ^1.2.15 - version: 1.3.6(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) + 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) @@ -812,7 +812,7 @@ importers: version: 18.15.3 '@types/react': specifier: 'catalog:' - version: 18.3.1 + version: 18.3.11 '@types/react-dom': specifier: 'catalog:' version: 18.3.1 @@ -830,7 +830,7 @@ importers: devDependencies: '@typescript-eslint/eslint-plugin': specifier: ^8.6.0 - version: 8.38.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + version: 8.40.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^8.6.0 version: 8.40.0(eslint@8.57.1)(typescript@5.8.3) @@ -839,7 +839,7 @@ importers: version: 8.57.1 eslint-config-next: specifier: ^14.1.0 - version: 14.2.31(eslint@8.57.1)(typescript@5.8.3) + version: 14.2.32(eslint@8.57.1)(typescript@5.8.3) eslint-config-prettier: specifier: ^9.1.0 version: 9.1.0(eslint@8.57.1) @@ -848,10 +848,10 @@ importers: version: 1.13.4(eslint@8.57.1) eslint-plugin-import: specifier: ^2.29.1 - version: 2.31.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + version: 2.32.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) eslint-plugin-react: specifier: ^7.33.2 - version: 7.37.3(eslint@8.57.1) + version: 7.37.5(eslint@8.57.1) eslint-plugin-react-hooks: specifier: ^5.2.0 version: 5.2.0(eslint@8.57.1) @@ -876,7 +876,7 @@ importers: version: 22.17.2 '@types/react': specifier: 'catalog:' - version: 18.3.1 + version: 18.3.11 tsup: specifier: 'catalog:' version: 8.4.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(jiti@1.21.7)(postcss@8.5.6)(typescript@5.8.3)(yaml@2.8.1) @@ -916,7 +916,7 @@ importers: version: 22.17.2 '@types/react': specifier: 'catalog:' - version: 18.3.1 + version: 18.3.11 typescript: specifier: 5.8.3 version: 5.8.3 @@ -953,7 +953,7 @@ importers: dependencies: '@base-ui-components/react': specifier: ^1.0.0-beta.2 - version: 1.0.0-beta.2(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.0.0-beta.2(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@plane/constants': specifier: workspace:* version: link:../constants @@ -974,7 +974,10 @@ importers: version: 2.1.1 cmdk: specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + 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) + frimousse: + specifier: ^0.3.0 + version: 0.3.0(react@18.3.1)(typescript@5.8.3) lucide-react: specifier: ^0.469.0 version: 0.469.0(react@18.3.1) @@ -990,6 +993,9 @@ importers: tailwind-merge: specifier: ^3.3.1 version: 3.3.1 + use-font-face-observer: + specifier: ^1.3.0 + version: 1.3.0(react@18.3.1) devDependencies: '@plane/eslint-config': specifier: workspace:* @@ -1005,7 +1011,7 @@ importers: version: 9.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.50.0)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.8.3)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)) '@types/react': specifier: 'catalog:' - version: 18.3.1 + version: 18.3.11 '@types/react-dom': specifier: 'catalog:' version: 18.3.1 @@ -1076,7 +1082,7 @@ importers: version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.17.2)(typescript@5.8.3))) autoprefixer: specifier: ^10.4.14 - version: 10.4.20(postcss@8.5.6) + version: 10.4.21(postcss@8.5.6) postcss: specifier: ^8.4.38 version: 8.5.6 @@ -1104,7 +1110,7 @@ importers: version: link:../typescript-config '@types/react': specifier: 'catalog:' - version: 18.3.1 + version: 18.3.11 '@types/react-dom': specifier: 'catalog:' version: 18.3.1 @@ -1127,10 +1133,10 @@ importers: version: 1.1.0 '@blueprintjs/core': specifier: ^4.16.3 - version: 4.20.2(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 4.20.2(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@blueprintjs/popover2': specifier: ^1.13.3 - version: 1.14.11(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.14.11(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@headlessui/react': specifier: ^1.7.3 version: 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1154,13 +1160,13 @@ importers: version: 2.11.8 '@radix-ui/react-scroll-area': specifier: ^1.2.3 - version: 1.2.10(@types/react-dom@18.3.1)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 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) clsx: specifier: ^2.0.0 version: 2.1.1 emoji-picker-react: specifier: ^4.5.16 - version: 4.12.2(react@18.3.1) + version: 4.13.2(react@18.3.1) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -1206,7 +1212,7 @@ importers: version: link:../typescript-config '@storybook/addon-essentials': specifier: ^8.1.1 - version: 8.6.14(@types/react@18.3.1)(storybook@8.6.14(prettier@3.6.2)) + version: 8.6.14(@types/react@18.3.11)(storybook@8.6.14(prettier@3.6.2)) '@storybook/addon-interactions': specifier: ^8.1.1 version: 8.6.14(storybook@8.6.14(prettier@3.6.2)) @@ -1242,16 +1248,16 @@ importers: version: 20.19.11 '@types/react': specifier: 'catalog:' - version: 18.3.1 + version: 18.3.11 '@types/react-color': specifier: ^3.0.9 - version: 3.0.13(@types/react@18.3.1) + version: 3.0.13(@types/react@18.3.11) '@types/react-dom': specifier: 'catalog:' version: 18.3.1 autoprefixer: specifier: ^10.4.19 - version: 10.4.20(postcss@8.5.6) + version: 10.4.21(postcss@8.5.6) postcss-cli: specifier: ^11.0.0 version: 11.0.1(jiti@1.21.7)(postcss@8.5.6) @@ -1284,7 +1290,7 @@ importers: version: 4.1.0 isomorphic-dompurify: specifier: ^2.16.0 - version: 2.25.0 + version: 2.26.0 lodash: specifier: ^4.17.21 version: 4.17.21 @@ -1318,7 +1324,7 @@ importers: version: 22.17.2 '@types/react': specifier: 'catalog:' - version: 18.3.1 + version: 18.3.11 '@types/uuid': specifier: ^9.0.8 version: 9.0.8 @@ -1574,8 +1580,8 @@ packages: '@emotion/sheet@1.4.0': resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} - '@emotion/styled@11.14.0': - resolution: {integrity: sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==} + '@emotion/styled@11.14.1': + resolution: {integrity: sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==} peerDependencies: '@emotion/react': ^11.0.0-rc.0 '@types/react': '*' @@ -1769,9 +1775,6 @@ packages: '@floating-ui/core@1.7.3': resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} - '@floating-ui/dom@1.7.2': - resolution: {integrity: sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==} - '@floating-ui/dom@1.7.3': resolution: {integrity: sha512-uZA413QEpNuhtb3/iIKoYMSK07keHPYeXF02Zhd6e213j+d1NamLix/mCLxBUDW/Gx52sPH2m+chlUsyaBs/Ag==} @@ -1815,16 +1818,16 @@ packages: '@hocuspocus/common@2.15.3': resolution: {integrity: sha512-Rzh1HF0a2o/tf90A3w2XNdXd9Ym3aQzMDfD3lAUONCX9B9QOdqdyiORrj6M25QEaJrEIbXFy8LtAFcL0wRdWzA==} - '@hocuspocus/extension-database@2.15.2': - resolution: {integrity: sha512-BkYDfKA99udx7AEkqWReBS61kvGMC9SqoPJs3v8xNgpaj2GGyMJQlUdQRMhPyZTn2osV+pqhk8Hn7xUJCW1RJg==} + '@hocuspocus/extension-database@2.15.3': + resolution: {integrity: sha512-+PVlPwfdVyOase68WEBb105ZwglhCLVeGpyNa3uwnmH+Ers7OKGLma2SDMKn3Vcb5oHzTzEGx7jNt+32KTEKXA==} peerDependencies: yjs: ^13.6.8 - '@hocuspocus/extension-logger@2.15.2': - resolution: {integrity: sha512-nqSnSFI+xO7dBTsgzSANKvx09ptq8J4Doz3AdLgxfaweYC85qFao7mAx1ZCtWoVHseVwBYua6S3dTwQq5IsWEg==} + '@hocuspocus/extension-logger@2.15.3': + resolution: {integrity: sha512-NufsjXldlVX1c2B98Hyg8Vq9GblPmnIvw9QGdsBK6SNEgWzDwfVrjljrigMAVGuQ4pbBVz8TaY5DcsmOCi5jqA==} - '@hocuspocus/extension-redis@2.15.2': - resolution: {integrity: sha512-2BNBLnDEQq2v3uQSidBSdUOIbHhH383SGxn+hmy6tDQfrt2hLE4MwilgDdcCO0FKOCYaJrV7HyKu6/WyzLbAOg==} + '@hocuspocus/extension-redis@2.15.3': + resolution: {integrity: sha512-gKeiiuQcAoRYb+QK9vyIczRrjNy8NW6ky+oyVv7raMcaizfFxeWP3TaAHPyC2pjGKfXsqN2m3YM0GbBGZfMiCg==} peerDependencies: y-protocols: ^1.0.6 yjs: ^13.6.8 @@ -1835,8 +1838,8 @@ packages: y-protocols: ^1.0.6 yjs: ^13.6.8 - '@hocuspocus/server@2.15.2': - resolution: {integrity: sha512-+fLRVswg+bkgfHqJ+wFgywivw3H08WMOtVvJF7dJzWT2ZR/Sc3nDMFh2KqMF6Ygh4z6mt23xr7SKIm3eP1zoLA==} + '@hocuspocus/server@2.15.3': + resolution: {integrity: sha512-Ju4ty4/7JtmvivcP7gKReOLf8KrFwN7Yx/5VhXYh4TRULy4kSo2fsDVUaluPp0neZa6PbVhizJuzlOim73IEbQ==} peerDependencies: y-protocols: ^1.0.6 yjs: ^13.6.8 @@ -2023,8 +2026,8 @@ packages: '@mui/core-downloads-tracker@5.18.0': resolution: {integrity: sha512-jbhwoQ1AY200PSSOrNXmrFCaSDSJWP7qk6urkTmIirvRXDROkqe+QwcLlUiw/PrREwsIF/vm3/dAXvjlMHF0RA==} - '@mui/material@5.17.1': - resolution: {integrity: sha512-2B33kQf+GmPnrvXXweWAx+crbiUEsxCdCN979QDYnlH9ox4pd+0/IBriWLV+l6ORoBF60w39cWjFnJYGFdzXcw==} + '@mui/material@5.18.0': + resolution: {integrity: sha512-bbH/HaJZpFtXGvWg3TsBWG4eyt3gah3E7nCNU8GLyRjVoWcA91Vm/T+sjHfUcwgJSw9iLtucfHBoq+qW/T30aA==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -2103,8 +2106,8 @@ packages: '@next/env@14.2.32': resolution: {integrity: sha512-n9mQdigI6iZ/DF6pCTwMKeWgF2e8lg7qgt5M7HXMLtyhZYMnf/u905M18sSpPmHL9MKp9JHo56C6jrD2EvWxng==} - '@next/eslint-plugin-next@14.2.31': - resolution: {integrity: sha512-ouaB+l8Cr/uzGxoGHUvd01OnfFTM8qM81Crw1AG0xoWDRN0DKLXyTWVe0FdAOHVBpGuXB87aufdRmrwzZDArIw==} + '@next/eslint-plugin-next@14.2.32': + resolution: {integrity: sha512-tyZMX8g4cWg/uPW4NxiJK13t62Pab47SKGJGVZJa6YtFwtfrXovH4j1n9tdpRdXW03PGQBugYEVGM7OhWfytdA==} '@next/swc-darwin-arm64@14.2.32': resolution: {integrity: sha512-osHXveM70zC+ilfuFa/2W6a1XQxJTvEhzEycnjUaVE8kpUS09lDpiDDX2YLdyFCzoUbvbo5r0X1Kp4MllIOShw==} @@ -3361,8 +3364,8 @@ packages: peerDependencies: '@types/react': '*' - '@types/react@18.3.1': - resolution: {integrity: sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==} + '@types/react@18.3.11': + resolution: {integrity: sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==} '@types/reactcss@1.2.13': resolution: {integrity: sha512-gi3S+aUi6kpkF5vdhUsnkwbiSEIU/BEJyD7kBy2SudWBUuKmJk8AQKE0OVcQQeEy40Azh0lV6uynxlikYIJuwg==} @@ -3405,11 +3408,11 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@typescript-eslint/eslint-plugin@8.38.0': - resolution: {integrity: sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==} + '@typescript-eslint/eslint-plugin@8.40.0': + resolution: {integrity: sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.38.0 + '@typescript-eslint/parser': ^8.40.0 eslint: ^8.57.0 || ^9.0.0 typescript: 5.8.3 @@ -3420,76 +3423,46 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: 5.8.3 - '@typescript-eslint/project-service@8.38.0': - resolution: {integrity: sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: 5.8.3 - '@typescript-eslint/project-service@8.40.0': resolution: {integrity: sha512-/A89vz7Wf5DEXsGVvcGdYKbVM9F7DyFXj52lNYUDS1L9yJfqjW/fIp5PgMuEJL/KeqVTe2QSbXAGUZljDUpArw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: 5.8.3 - '@typescript-eslint/scope-manager@8.38.0': - resolution: {integrity: sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.40.0': resolution: {integrity: sha512-y9ObStCcdCiZKzwqsE8CcpyuVMwRouJbbSrNuThDpv16dFAj429IkM6LNb1dZ2m7hK5fHyzNcErZf7CEeKXR4w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.38.0': - resolution: {integrity: sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: 5.8.3 - '@typescript-eslint/tsconfig-utils@8.40.0': resolution: {integrity: sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: 5.8.3 - '@typescript-eslint/type-utils@8.38.0': - resolution: {integrity: sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==} + '@typescript-eslint/type-utils@8.40.0': + resolution: {integrity: sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==} 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/types@8.38.0': - resolution: {integrity: sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.40.0': resolution: {integrity: sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.38.0': - resolution: {integrity: sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: 5.8.3 - '@typescript-eslint/typescript-estree@8.40.0': resolution: {integrity: sha512-k1z9+GJReVVOkc1WfVKs1vBrR5MIKKbdAjDTPvIK3L8De6KbFfPFt6BKpdkdk7rZS2GtC/m6yI5MYX+UsuvVYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: 5.8.3 - '@typescript-eslint/utils@8.38.0': - resolution: {integrity: sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==} + '@typescript-eslint/utils@8.40.0': + resolution: {integrity: sha512-Cgzi2MXSZyAUOY+BFwGs17s7ad/7L+gKt6Y8rAVVWS+7o6wrjeFN4nVfTpbE25MNcxyJ+iYUXflbs2xR9h4UBg==} 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.38.0': - resolution: {integrity: sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.40.0': resolution: {integrity: sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3873,8 +3846,8 @@ packages: peerDependencies: postcss: ^8.1.0 - autoprefixer@10.4.20: - resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + autoprefixer@10.4.21: + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: @@ -3959,8 +3932,8 @@ packages: browserify-zlib@0.2.0: resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} - browserslist@4.25.2: - resolution: {integrity: sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==} + browserslist@4.25.3: + resolution: {integrity: sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -4014,9 +3987,6 @@ packages: caniuse-lite@1.0.30001735: resolution: {integrity: sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w==} - caniuse-lite@1.0.30001739: - resolution: {integrity: sha512-y+j60d6ulelrNSwpPyrHdl+9mJnQzHBr08xm48Qno0nSk4h3Qojh+ziv2qE6rXf4k3tadF4o1J/1tAbVm1NtnA==} - capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} @@ -4172,8 +4142,8 @@ packages: compute-scroll-into-view@3.1.1: resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} - concurrently@9.1.2: - resolution: {integrity: sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==} + concurrently@9.2.0: + resolution: {integrity: sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==} engines: {node: '>=18'} hasBin: true @@ -4543,14 +4513,14 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.204: - resolution: {integrity: sha512-s9VbBXWxfDrl67PlO4avwh0/GU2vcwx8Fph3wlR8LJl7ySGYId59EFE17VWVcuC3sLWNPENm6Z/uGqKbkPCcXA==} + electron-to-chromium@1.5.207: + resolution: {integrity: sha512-mryFrrL/GXDTmAtIVMVf+eIXM09BBPlO5IQ7lUyKmK8d+A4VpRGG+M3ofoVef6qyF8s60rJei8ymlJxjUA8Faw==} element-resize-detector@1.2.4: resolution: {integrity: sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==} - emoji-picker-react@4.12.2: - resolution: {integrity: sha512-6PDYZGlhidt+Kc0ay890IU4HLNfIR7/OxPvcNxw+nJ4HQhMKd8pnGnPn4n2vqC/arRFCNWQhgJP8rpsYKsz0GQ==} + emoji-picker-react@4.13.2: + resolution: {integrity: sha512-azaJQLTshEOZVhksgU136izJWJyZ4Clx6xQ6Vctzk1gOdPPAUbTa/JYDwZJ8rh97QxnjpyeftXl99eRlYr3vNA==} engines: {node: '>=10'} peerDependencies: react: '>=16' @@ -4672,8 +4642,8 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-next@14.2.31: - resolution: {integrity: sha512-sT32j4678je7SWstBM6l0kE2L+LSgAARDAxw8iloNhI4/8xwkdDesbrGCPaGWzQv+dD6f6adhB+eRSThpGkBdg==} + eslint-config-next@14.2.32: + resolution: {integrity: sha512-mP/NmYtDBsKlKIOBnH+CW+pYeyR3wBhE+26DAqQ0/aRtEBeTEjgY2wAFUugUELkTLmrX6PpuMSSTpOhz7j9kdQ==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 typescript: 5.8.3 @@ -4729,8 +4699,8 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-import@2.31.0: - resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -4757,8 +4727,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react@7.37.3: - resolution: {integrity: sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA==} + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 @@ -5031,6 +5001,15 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + frimousse@0.3.0: + resolution: {integrity: sha512-kO6LMoKY/cLAYEhXXtqLRaLIE6L/DagpFPrUZaLv3LsUa1/8Iza3HhwZcgN8eZ+weXnhv69eoclNUPohcCa/IQ==} + peerDependencies: + react: ^18 || ^19 + typescript: 5.8.3 + peerDependenciesMeta: + typescript: + optional: true + fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -5310,8 +5289,8 @@ packages: resolution: {integrity: sha512-P9F4Eo6zicYsIJbEy/mPJmSxKY0rVcmiy5H8oXPxPDotQRCvCBjBuI5QWoQQanVE9jdeocnum5iqYAHl4pHdLA==} engines: {node: '>=6'} - ioredis@5.6.1: - resolution: {integrity: sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==} + ioredis@5.7.0: + resolution: {integrity: sha512-NUcA93i1lukyXU+riqEyPtSEkyFq8tX90uL659J+qpCZ3rEdViB/APC58oAhIh3+bJln2hzdlZbBZsGNrlsR8g==} engines: {node: '>=12.22.0'} ipaddr.js@1.9.1: @@ -5479,8 +5458,8 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isomorphic-dompurify@2.25.0: - resolution: {integrity: sha512-bcpJzu9DOjN21qaCVpcoCwUX1ytpvA6EFqCK5RNtPg5+F0Jz9PX50jl6jbEicBNeO87eDDfC7XtPs4zjDClZJg==} + isomorphic-dompurify@2.26.0: + resolution: {integrity: sha512-nZmoK4wKdzPs5USq4JHBiimjdKSVAOm2T1KyDoadtMPNXYHxiENd19ou4iU/V4juFM6LVgYQnpxCYmxqNP4Obw==} engines: {node: '>=18'} isomorphic.js@0.2.5: @@ -6388,8 +6367,8 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - posthog-js@1.255.1: - resolution: {integrity: sha512-KMh0o9MhORhEZVjXpktXB5rJ8PfDk+poqBoTSoLzWgNjhJf6D8jcyB9jUMA6vVPfn4YeepVX5NuclDRqOwr5Mw==} + posthog-js@1.260.1: + resolution: {integrity: sha512-DD8ZSRpdScacMqtqUIvMFme8lmOWkOvExG8VvjONE7Cm3xpRH5xXpfrwMJE4bayTGWKMx4ij6SfphK6dm/o2ug==} peerDependencies: '@rrweb/types': 2.0.0-alpha.17 rrweb-snapshot: 2.0.0-alpha.17 @@ -7230,8 +7209,8 @@ packages: '@swc/core': ^1.2.147 webpack: '>=2' - swr@2.3.3: - resolution: {integrity: sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==} + swr@2.3.6: + resolution: {integrity: sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==} peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -7877,8 +7856,8 @@ packages: peerDependencies: yjs: ^13.0.0 - y-prosemirror@1.3.6: - resolution: {integrity: sha512-vtS2rv8+ll/TBQRqwUiqflgSuN/DhfvUQX0r5O3o5i0pO6K4pSNgFtVkOKtNWPBVkS6l9BDQjbtnDNftZnxq7Q==} + y-prosemirror@1.3.7: + resolution: {integrity: sha512-NpM99WSdD4Fx4if5xOMDpPtU3oAmTSjlzh5U4353ABbRHl1HtAFUx6HlebLZfyFxXN9jzKMDkVbcRjqOZVkYQg==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} peerDependencies: prosemirror-model: ^1.7.1 @@ -8018,7 +7997,7 @@ snapshots: dependencies: '@babel/compat-data': 7.28.0 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.2 + browserslist: 4.25.3 lru-cache: 5.1.1 semver: 6.3.1 @@ -8082,10 +8061,10 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@base-ui-components/react@1.0.0-beta.2(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@base-ui-components/react@1.0.0-beta.2(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.10 - '@base-ui-components/utils': 0.1.0(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@base-ui-components/utils': 0.1.0(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@floating-ui/react-dom': 2.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@floating-ui/utils': 0.2.10 react: 18.3.1 @@ -8094,9 +8073,9 @@ snapshots: tabbable: 6.2.0 use-sync-external-store: 1.5.0(react@18.3.1) optionalDependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 - '@base-ui-components/utils@0.1.0(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@base-ui-components/utils@0.1.0(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.10 '@floating-ui/utils': 0.2.10 @@ -8105,13 +8084,13 @@ snapshots: reselect: 5.1.1 use-sync-external-store: 1.5.0(react@18.3.1) optionalDependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 '@blueprintjs/colors@4.2.1': dependencies: tslib: 2.5.3 - '@blueprintjs/core@4.20.2(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@blueprintjs/core@4.20.2(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@blueprintjs/colors': 4.2.1 '@blueprintjs/icons': 4.16.0 @@ -8127,7 +8106,7 @@ snapshots: react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) tslib: 2.5.3 optionalDependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 '@blueprintjs/icons@4.16.0': dependencies: @@ -8135,9 +8114,9 @@ snapshots: classnames: 2.5.1 tslib: 2.5.3 - '@blueprintjs/popover2@1.14.11(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@blueprintjs/popover2@1.14.11(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@blueprintjs/core': 4.20.2(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@blueprintjs/core': 4.20.2(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@juggle/resize-observer': 3.4.0 '@popperjs/core': 2.11.8 classnames: 2.5.1 @@ -8147,7 +8126,7 @@ snapshots: react-popper: 2.3.0(@popperjs/core@2.11.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) tslib: 2.5.3 optionalDependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 '@bprogress/core@1.3.4': {} @@ -8259,7 +8238,7 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.14.0(@types/react@18.3.1)(react@18.3.1)': + '@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1)': dependencies: '@babel/runtime': 7.26.10 '@emotion/babel-plugin': 11.13.5 @@ -8271,7 +8250,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 transitivePeerDependencies: - supports-color @@ -8285,18 +8264,18 @@ snapshots: '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1)': + '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1)': dependencies: '@babel/runtime': 7.26.10 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.3.1 - '@emotion/react': 11.14.0(@types/react@18.3.1)(react@18.3.1) + '@emotion/react': 11.14.0(@types/react@18.3.11)(react@18.3.1) '@emotion/serialize': 1.3.3 '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1) '@emotion/utils': 1.4.2 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 transitivePeerDependencies: - supports-color @@ -8412,11 +8391,6 @@ snapshots: dependencies: '@floating-ui/utils': 0.2.10 - '@floating-ui/dom@1.7.2': - dependencies: - '@floating-ui/core': 1.7.3 - '@floating-ui/utils': 0.2.10 - '@floating-ui/dom@1.7.3': dependencies: '@floating-ui/core': 1.7.3 @@ -8475,27 +8449,27 @@ snapshots: dependencies: lib0: 0.2.114 - '@hocuspocus/extension-database@2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/extension-database@2.15.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': dependencies: - '@hocuspocus/server': 2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + '@hocuspocus/server': 2.15.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) yjs: 13.6.27 transitivePeerDependencies: - bufferutil - utf-8-validate - y-protocols - '@hocuspocus/extension-logger@2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/extension-logger@2.15.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': dependencies: - '@hocuspocus/server': 2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + '@hocuspocus/server': 2.15.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) transitivePeerDependencies: - bufferutil - utf-8-validate - y-protocols - yjs - '@hocuspocus/extension-redis@2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/extension-redis@2.15.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': dependencies: - '@hocuspocus/server': 2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + '@hocuspocus/server': 2.15.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) ioredis: 4.30.0 kleur: 4.1.5 lodash.debounce: 4.0.8 @@ -8520,7 +8494,7 @@ snapshots: - bufferutil - utf-8-validate - '@hocuspocus/server@2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/server@2.15.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': dependencies: '@hocuspocus/common': 2.15.3 async-lock: 1.4.1 @@ -8682,23 +8656,23 @@ snapshots: '@lifeomic/attempt@3.1.0': {} - '@mdx-js/react@3.1.0(@types/react@18.3.1)(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.1 + '@types/react': 18.3.11 react: 18.3.1 '@mui/core-downloads-tracker@5.18.0': {} - '@mui/material@5.17.1(@emotion/react@11.14.0(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/material@5.18.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.10 '@mui/core-downloads-tracker': 5.18.0 - '@mui/system': 5.18.0(@emotion/react@11.14.0(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1) - '@mui/types': 7.2.24(@types/react@18.3.1) - '@mui/utils': 5.17.1(@types/react@18.3.1)(react@18.3.1) + '@mui/system': 5.18.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1) + '@mui/types': 7.2.24(@types/react@18.3.11) + '@mui/utils': 5.17.1(@types/react@18.3.11)(react@18.3.1) '@popperjs/core': 2.11.8 - '@types/react-transition-group': 4.4.12(@types/react@18.3.1) + '@types/react-transition-group': 4.4.12(@types/react@18.3.11) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 @@ -8707,20 +8681,20 @@ snapshots: react-is: 19.1.1 react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) optionalDependencies: - '@emotion/react': 11.14.0(@types/react@18.3.1)(react@18.3.1) - '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 + '@emotion/react': 11.14.0(@types/react@18.3.11)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1) + '@types/react': 18.3.11 - '@mui/private-theming@5.17.1(@types/react@18.3.1)(react@18.3.1)': + '@mui/private-theming@5.17.1(@types/react@18.3.11)(react@18.3.1)': dependencies: '@babel/runtime': 7.26.10 - '@mui/utils': 5.17.1(@types/react@18.3.1)(react@18.3.1) + '@mui/utils': 5.17.1(@types/react@18.3.11)(react@18.3.1) prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 - '@mui/styled-engine@5.18.0(@emotion/react@11.14.0(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(react@18.3.1)': + '@mui/styled-engine@5.18.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.10 '@emotion/cache': 11.14.0 @@ -8729,40 +8703,40 @@ snapshots: prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@18.3.1)(react@18.3.1) - '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1) + '@emotion/react': 11.14.0(@types/react@18.3.11)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1) - '@mui/system@5.18.0(@emotion/react@11.14.0(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1)': + '@mui/system@5.18.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1)': dependencies: '@babel/runtime': 7.26.10 - '@mui/private-theming': 5.17.1(@types/react@18.3.1)(react@18.3.1) - '@mui/styled-engine': 5.18.0(@emotion/react@11.14.0(@types/react@18.3.1)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1))(react@18.3.1) - '@mui/types': 7.2.24(@types/react@18.3.1) - '@mui/utils': 5.17.1(@types/react@18.3.1)(react@18.3.1) + '@mui/private-theming': 5.17.1(@types/react@18.3.11)(react@18.3.1) + '@mui/styled-engine': 5.18.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1))(react@18.3.1) + '@mui/types': 7.2.24(@types/react@18.3.11) + '@mui/utils': 5.17.1(@types/react@18.3.11)(react@18.3.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@emotion/react': 11.14.0(@types/react@18.3.1)(react@18.3.1) - '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.3.1)(react@18.3.1))(@types/react@18.3.1)(react@18.3.1) - '@types/react': 18.3.1 + '@emotion/react': 11.14.0(@types/react@18.3.11)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1) + '@types/react': 18.3.11 - '@mui/types@7.2.24(@types/react@18.3.1)': + '@mui/types@7.2.24(@types/react@18.3.11)': optionalDependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 - '@mui/utils@5.17.1(@types/react@18.3.1)(react@18.3.1)': + '@mui/utils@5.17.1(@types/react@18.3.11)(react@18.3.1)': dependencies: '@babel/runtime': 7.26.10 - '@mui/types': 7.2.24(@types/react@18.3.1) + '@mui/types': 7.2.24(@types/react@18.3.11) '@types/prop-types': 15.7.15 clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 react-is: 19.1.1 optionalDependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 '@napi-rs/wasm-runtime@0.2.12': dependencies: @@ -8773,7 +8747,7 @@ snapshots: '@next/env@14.2.32': {} - '@next/eslint-plugin-next@14.2.31': + '@next/eslint-plugin-next@14.2.32': dependencies: glob: 10.3.10 @@ -8827,169 +8801,169 @@ snapshots: '@radix-ui/primitive@1.1.3': {} - '@radix-ui/react-compose-refs@1.1.2(@types/react@18.3.1)(react@18.3.1)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@18.3.11)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 - '@radix-ui/react-context@1.1.2(@types/react@18.3.1)(react@18.3.1)': + '@radix-ui/react-context@1.1.2(@types/react@18.3.11)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 - '@radix-ui/react-dialog@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(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)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.1)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.1)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.1)(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.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.2.3(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.11(@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-focus-guards': 1.1.3(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.7(@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-portal': 1.1.9(@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-presence': 1.1.5(@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) + '@radix-ui/react-slot': 1.2.3(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.11)(react@18.3.1) aria-hidden: 1.2.6 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.7.1(@types/react@18.3.1)(react@18.3.1) + react-remove-scroll: 2.7.1(@types/react@18.3.11)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 '@types/react-dom': 18.3.1 - '@radix-ui/react-direction@1.1.1(@types/react@18.3.1)(react@18.3.1)': + '@radix-ui/react-direction@1.1.1(@types/react@18.3.11)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@18.3.1)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dismissable-layer@1.1.11(@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/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/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.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.11)(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) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.1(@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.1 + '@types/react': 18.3.11 '@types/react-dom': 18.3.1 - '@radix-ui/react-focus-guards@1.1.3(@types/react@18.3.1)(react@18.3.1)': + '@radix-ui/react-focus-guards@1.1.3(@types/react@18.3.11)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-focus-scope@1.1.7(@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-compose-refs': 1.1.2(@types/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.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.11)(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) + '@radix-ui/react-use-callback-ref': 1.1.1(@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.1 + '@types/react': 18.3.11 '@types/react-dom': 18.3.1 - '@radix-ui/react-id@1.1.1(@types/react@18.3.1)(react@18.3.1)': + '@radix-ui/react-id@1.1.1(@types/react@18.3.11)(react@18.3.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 - '@radix-ui/react-portal@1.1.9(@types/react-dom@18.3.1)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-portal@1.1.9(@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-primitive': 2.1.3(@types/react-dom@18.3.1)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/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) + '@radix-ui/react-use-layout-effect': 1.1.1(@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.1 + '@types/react': 18.3.11 '@types/react-dom': 18.3.1 - '@radix-ui/react-presence@1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-presence@1.1.5(@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-compose-refs': 1.1.2(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@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.1 + '@types/react': 18.3.11 '@types/react-dom': 18.3.1 - '@radix-ui/react-primitive@2.1.3(@types/react-dom@18.3.1)(@types/react@18.3.1)(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)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.2.3(@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.1 + '@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.1)(react-dom@18.3.1(react@18.3.1))(react@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 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-direction': 1.1.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.1)(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.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-presence': 1.1.5(@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) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@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.1 + '@types/react': 18.3.11 '@types/react-dom': 18.3.1 - '@radix-ui/react-slot@1.2.3(@types/react@18.3.1)(react@18.3.1)': + '@radix-ui/react-slot@1.2.3(@types/react@18.3.11)(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.1)(react@18.3.1) + '@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.1 + '@types/react': 18.3.11 - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@18.3.1)(react@18.3.1)': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@18.3.11)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@18.3.1)(react@18.3.1)': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@18.3.11)(react@18.3.1)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@18.3.1)(react@18.3.1)': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@18.3.11)(react@18.3.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@18.3.1)(react@18.3.1)': + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@18.3.11)(react@18.3.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@18.3.1)(react@18.3.1)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@18.3.11)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 '@react-pdf/fns@2.2.1': dependencies: @@ -9237,9 +9211,9 @@ snapshots: storybook: 8.6.14(prettier@3.6.2) ts-dedent: 2.2.0 - '@storybook/addon-docs@8.6.14(@types/react@18.3.1)(storybook@8.6.14(prettier@3.6.2))': + '@storybook/addon-docs@8.6.14(@types/react@18.3.11)(storybook@8.6.14(prettier@3.6.2))': dependencies: - '@mdx-js/react': 3.1.0(@types/react@18.3.1)(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.6.2)) '@storybook/csf-plugin': 8.6.14(storybook@8.6.14(prettier@3.6.2)) '@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.6.2)) @@ -9250,12 +9224,12 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@storybook/addon-essentials@8.6.14(@types/react@18.3.1)(storybook@8.6.14(prettier@3.6.2))': + '@storybook/addon-essentials@8.6.14(@types/react@18.3.11)(storybook@8.6.14(prettier@3.6.2))': dependencies: '@storybook/addon-actions': 8.6.14(storybook@8.6.14(prettier@3.6.2)) '@storybook/addon-backgrounds': 8.6.14(storybook@8.6.14(prettier@3.6.2)) '@storybook/addon-controls': 8.6.14(storybook@8.6.14(prettier@3.6.2)) - '@storybook/addon-docs': 8.6.14(@types/react@18.3.1)(storybook@8.6.14(prettier@3.6.2)) + '@storybook/addon-docs': 8.6.14(@types/react@18.3.11)(storybook@8.6.14(prettier@3.6.2)) '@storybook/addon-highlight': 8.6.14(storybook@8.6.14(prettier@3.6.2)) '@storybook/addon-measure': 8.6.14(storybook@8.6.14(prettier@3.6.2)) '@storybook/addon-outline': 8.6.14(storybook@8.6.14(prettier@3.6.2)) @@ -9741,11 +9715,11 @@ snapshots: dependencies: '@tiptap/core': 2.26.1(@tiptap/pm@2.26.1) - '@tiptap/extension-collaboration@2.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)(y-prosemirror@1.3.6(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-collaboration@2.26.1(@tiptap/core@2.26.1(@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.26.1(@tiptap/pm@2.26.1) '@tiptap/pm': 2.26.1 - y-prosemirror: 1.3.6(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-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.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))': dependencies: @@ -10144,27 +10118,27 @@ snapshots: '@types/range-parser@1.2.7': {} - '@types/react-color@3.0.13(@types/react@18.3.1)': + '@types/react-color@3.0.13(@types/react@18.3.11)': dependencies: - '@types/react': 18.3.1 - '@types/reactcss': 1.2.13(@types/react@18.3.1) + '@types/react': 18.3.11 + '@types/reactcss': 1.2.13(@types/react@18.3.11) '@types/react-dom@18.3.1': dependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 - '@types/react-transition-group@4.4.12(@types/react@18.3.1)': + '@types/react-transition-group@4.4.12(@types/react@18.3.11)': dependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 - '@types/react@18.3.1': + '@types/react@18.3.11': dependencies: '@types/prop-types': 15.7.15 csstype: 3.1.3 - '@types/reactcss@1.2.13(@types/react@18.3.1)': + '@types/reactcss@1.2.13(@types/react@18.3.11)': dependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 '@types/resolve@1.20.6': {} @@ -10200,14 +10174,14 @@ snapshots: dependencies: '@types/node': 20.19.11 - '@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.40.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 '@typescript-eslint/parser': 8.40.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.38.0 - '@typescript-eslint/type-utils': 8.38.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/utils': 8.38.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.38.0 + '@typescript-eslint/scope-manager': 8.40.0 + '@typescript-eslint/type-utils': 8.40.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/utils': 8.40.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.40.0 eslint: 8.57.1 graphemer: 1.4.0 ignore: 7.0.5 @@ -10229,15 +10203,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.38.0(typescript@5.8.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@5.8.3) - '@typescript-eslint/types': 8.40.0 - debug: 4.4.1(supports-color@5.5.0) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/project-service@8.40.0(typescript@5.8.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@5.8.3) @@ -10247,29 +10212,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.38.0': - dependencies: - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/visitor-keys': 8.38.0 - '@typescript-eslint/scope-manager@8.40.0': dependencies: '@typescript-eslint/types': 8.40.0 '@typescript-eslint/visitor-keys': 8.40.0 - '@typescript-eslint/tsconfig-utils@8.38.0(typescript@5.8.3)': - dependencies: - typescript: 5.8.3 - '@typescript-eslint/tsconfig-utils@8.40.0(typescript@5.8.3)': dependencies: typescript: 5.8.3 - '@typescript-eslint/type-utils@8.38.0(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.40.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.38.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/types': 8.40.0 + '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.40.0(eslint@8.57.1)(typescript@5.8.3) debug: 4.4.1(supports-color@5.5.0) eslint: 8.57.1 ts-api-utils: 2.1.0(typescript@5.8.3) @@ -10277,26 +10233,8 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.38.0': {} - '@typescript-eslint/types@8.40.0': {} - '@typescript-eslint/typescript-estree@8.38.0(typescript@5.8.3)': - dependencies: - '@typescript-eslint/project-service': 8.38.0(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3) - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/visitor-keys': 8.38.0 - debug: 4.4.1(supports-color@5.5.0) - 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.40.0(typescript@5.8.3)': dependencies: '@typescript-eslint/project-service': 8.40.0(typescript@5.8.3) @@ -10313,22 +10251,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.38.0(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/utils@8.40.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.38.0 - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.40.0 + '@typescript-eslint/types': 8.40.0 + '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.8.3) eslint: 8.57.1 typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.38.0': - dependencies: - '@typescript-eslint/types': 8.38.0 - eslint-visitor-keys: 4.2.1 - '@typescript-eslint/visitor-keys@8.40.0': dependencies: '@typescript-eslint/types': 8.40.0 @@ -10723,7 +10656,7 @@ snapshots: autoprefixer@10.4.14(postcss@8.5.6): dependencies: - browserslist: 4.25.2 + browserslist: 4.25.3 caniuse-lite: 1.0.30001735 fraction.js: 4.3.7 normalize-range: 0.1.2 @@ -10731,9 +10664,9 @@ snapshots: postcss: 8.5.6 postcss-value-parser: 4.2.0 - autoprefixer@10.4.20(postcss@8.5.6): + autoprefixer@10.4.21(postcss@8.5.6): dependencies: - browserslist: 4.25.2 + browserslist: 4.25.3 caniuse-lite: 1.0.30001735 fraction.js: 4.3.7 normalize-range: 0.1.2 @@ -10828,12 +10761,12 @@ snapshots: dependencies: pako: 1.0.11 - browserslist@4.25.2: + browserslist@4.25.3: dependencies: caniuse-lite: 1.0.30001735 - electron-to-chromium: 1.5.204 + electron-to-chromium: 1.5.207 node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.2) + update-browserslist-db: 1.1.3(browserslist@4.25.3) buffer-from@1.1.2: {} @@ -10877,18 +10810,16 @@ snapshots: camel-case@4.1.2: dependencies: pascal-case: 3.1.2 - tslib: 2.8.1 + tslib: 2.5.3 camelcase-css@2.0.1: {} caniuse-lite@1.0.30001735: {} - caniuse-lite@1.0.30001739: {} - capital-case@1.0.4: dependencies: no-case: 3.0.4 - tslib: 2.8.1 + tslib: 2.5.3 upper-case-first: 2.0.2 case-sensitive-paths-webpack-plugin@2.4.0: {} @@ -10930,7 +10861,7 @@ snapshots: path-case: 3.0.4 sentence-case: 3.0.4 snake-case: 3.0.4 - tslib: 2.8.1 + tslib: 2.5.3 character-entities@2.0.2: {} @@ -10978,12 +10909,12 @@ snapshots: cluster-key-slot@1.1.2: {} - cmdk@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + cmdk@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): dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.1)(react@18.3.1) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.1(@types/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.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@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.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: @@ -11058,7 +10989,7 @@ snapshots: compute-scroll-into-view@3.1.1: {} - concurrently@9.1.2: + concurrently@9.2.0: dependencies: chalk: 4.1.2 lodash: 4.17.21 @@ -11073,7 +11004,7 @@ snapshots: constant-case@3.0.4: dependencies: no-case: 3.0.4 - tslib: 2.8.1 + tslib: 2.5.3 upper-case: 2.0.2 constants-browserify@1.0.0: {} @@ -11397,7 +11328,7 @@ snapshots: dot-case@3.0.4: dependencies: no-case: 3.0.4 - tslib: 2.8.1 + tslib: 2.5.3 dotenv@16.0.3: {} @@ -11413,13 +11344,13 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.204: {} + electron-to-chromium@1.5.207: {} element-resize-detector@1.2.4: dependencies: batch-processor: 1.0.0 - emoji-picker-react@4.12.2(react@18.3.1): + emoji-picker-react@4.13.2(react@18.3.1): dependencies: flairup: 1.0.0 react: 18.3.1 @@ -11615,18 +11546,18 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@14.2.31(eslint@8.57.1)(typescript@5.8.3): + eslint-config-next@14.2.32(eslint@8.57.1)(typescript@5.8.3): dependencies: - '@next/eslint-plugin-next': 14.2.31 + '@next/eslint-plugin-next': 14.2.32 '@rushstack/eslint-patch': 1.12.0 - '@typescript-eslint/eslint-plugin': 8.38.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 8.40.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/parser': 8.40.0(eslint@8.57.1)(typescript@5.8.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) - eslint-plugin-react: 7.37.3(eslint@8.57.1) + eslint-plugin-react: 7.37.5(eslint@8.57.1) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.1) optionalDependencies: typescript: 5.8.3 @@ -11652,7 +11583,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.1): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.1(supports-color@5.5.0) @@ -11663,7 +11594,7 @@ snapshots: tinyglobby: 0.2.14 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -11674,11 +11605,11 @@ snapshots: '@typescript-eslint/parser': 8.40.0(eslint@8.57.1)(typescript@5.8.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -11734,7 +11665,7 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-plugin-react@7.37.3(eslint@8.57.1): + eslint-plugin-react@7.37.5(eslint@8.57.1): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -11758,7 +11689,7 @@ snapshots: eslint-plugin-storybook@9.1.2(eslint@8.57.1)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.8.3): dependencies: - '@typescript-eslint/utils': 8.38.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/utils': 8.40.0(eslint@8.57.1)(typescript@5.8.3) eslint: 8.57.1 storybook: 9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)) transitivePeerDependencies: @@ -12085,6 +12016,12 @@ snapshots: fresh@0.5.2: {} + frimousse@0.3.0(react@18.3.1)(typescript@5.8.3): + dependencies: + react: 18.3.1 + optionalDependencies: + typescript: 5.8.3 + fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 @@ -12237,7 +12174,7 @@ snapshots: header-case@2.0.4: dependencies: capital-case: 1.0.4 - tslib: 2.8.1 + tslib: 2.5.3 helmet@7.2.0: {} @@ -12387,7 +12324,7 @@ snapshots: transitivePeerDependencies: - supports-color - ioredis@5.6.1: + ioredis@5.7.0: dependencies: '@ioredis/commands': 1.3.0 cluster-key-slot: 1.1.2 @@ -12553,7 +12490,7 @@ snapshots: isexe@2.0.0: {} - isomorphic-dompurify@2.25.0: + isomorphic-dompurify@2.26.0: dependencies: dompurify: 3.2.6 jsdom: 26.1.0 @@ -12761,7 +12698,7 @@ snapshots: lower-case@2.0.2: dependencies: - tslib: 2.8.1 + tslib: 2.5.3 lowlight@2.9.0: dependencies: @@ -13110,7 +13047,7 @@ snapshots: '@next/env': 14.2.32 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001739 + caniuse-lite: 1.0.30001735 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -13133,7 +13070,7 @@ snapshots: no-case@3.0.4: dependencies: lower-case: 2.0.2 - tslib: 2.8.1 + tslib: 2.5.3 node-abort-controller@3.1.1: {} @@ -13316,7 +13253,7 @@ snapshots: param-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.8.1 + tslib: 2.5.3 parent-module@1.0.1: dependencies: @@ -13340,14 +13277,14 @@ snapshots: pascal-case@3.1.2: dependencies: no-case: 3.0.4 - tslib: 2.8.1 + tslib: 2.5.3 path-browserify@1.0.1: {} path-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.8.1 + tslib: 2.5.3 path-exists@4.0.0: {} @@ -13551,7 +13488,7 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - posthog-js@1.255.1: + posthog-js@1.260.1: dependencies: core-js: 3.45.0 fflate: 0.4.8 @@ -13838,11 +13775,11 @@ snapshots: react-is@19.1.1: {} - react-markdown@8.0.7(@types/react@18.3.1)(react@18.3.1): + react-markdown@8.0.7(@types/react@18.3.11)(react@18.3.1): dependencies: '@types/hast': 2.3.10 '@types/prop-types': 15.7.15 - '@types/react': 18.3.1 + '@types/react': 18.3.11 '@types/unist': 2.0.11 comma-separated-tokens: 2.0.3 hast-util-whitespace: 2.0.1 @@ -13896,24 +13833,24 @@ snapshots: react-fast-compare: 3.2.2 warning: 4.0.3 - react-remove-scroll-bar@2.3.8(@types/react@18.3.1)(react@18.3.1): + react-remove-scroll-bar@2.3.8(@types/react@18.3.11)(react@18.3.1): dependencies: react: 18.3.1 - react-style-singleton: 2.2.3(@types/react@18.3.1)(react@18.3.1) + react-style-singleton: 2.2.3(@types/react@18.3.11)(react@18.3.1) tslib: 2.8.1 optionalDependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 - react-remove-scroll@2.7.1(@types/react@18.3.1)(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.1)(react@18.3.1) - react-style-singleton: 2.2.3(@types/react@18.3.1)(react@18.3.1) + react-remove-scroll-bar: 2.3.8(@types/react@18.3.11)(react@18.3.1) + react-style-singleton: 2.2.3(@types/react@18.3.11)(react@18.3.1) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@18.3.1)(react@18.3.1) - use-sidecar: 1.1.3(@types/react@18.3.1)(react@18.3.1) + use-callback-ref: 1.3.3(@types/react@18.3.11)(react@18.3.1) + use-sidecar: 1.1.3(@types/react@18.3.11)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 react-smooth@4.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: @@ -13923,13 +13860,13 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-style-singleton@2.2.3(@types/react@18.3.1)(react@18.3.1): + react-style-singleton@2.2.3(@types/react@18.3.11)(react@18.3.1): dependencies: get-nonce: 1.0.1 react: 18.3.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: @@ -14221,7 +14158,7 @@ snapshots: sentence-case@3.0.4: dependencies: no-case: 3.0.4 - tslib: 2.8.1 + tslib: 2.5.3 upper-case-first: 2.0.2 serialize-javascript@6.0.2: @@ -14342,7 +14279,7 @@ snapshots: snake-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.8.1 + tslib: 2.5.3 sonic-boom@2.8.0: dependencies: @@ -14558,7 +14495,7 @@ snapshots: '@swc/counter': 0.1.3 webpack: 5.101.3(@swc/core@1.13.3(@swc/helpers@0.5.17))(esbuild@0.25.0) - swr@2.3.3(react@18.3.1): + swr@2.3.6(react@18.3.1): dependencies: dequal: 2.0.3 react: 18.3.1 @@ -14977,19 +14914,19 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 - update-browserslist-db@1.1.3(browserslist@4.25.2): + update-browserslist-db@1.1.3(browserslist@4.25.3): dependencies: - browserslist: 4.25.2 + browserslist: 4.25.3 escalade: 3.2.0 picocolors: 1.1.1 upper-case-first@2.0.2: dependencies: - tslib: 2.8.1 + tslib: 2.5.3 upper-case@2.0.2: dependencies: - tslib: 2.8.1 + tslib: 2.5.3 uri-js@4.4.1: dependencies: @@ -15000,25 +14937,25 @@ snapshots: punycode: 1.4.1 qs: 6.14.0 - use-callback-ref@1.3.3(@types/react@18.3.1)(react@18.3.1): + use-callback-ref@1.3.3(@types/react@18.3.11)(react@18.3.1): dependencies: react: 18.3.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 use-font-face-observer@1.3.0(react@18.3.1): dependencies: fontfaceobserver: 2.1.0 react: 18.3.1 - use-sidecar@1.1.3(@types/react@18.3.1)(react@18.3.1): + use-sidecar@1.1.3(@types/react@18.3.11)(react@18.3.1): dependencies: detect-node-es: 1.1.0 react: 18.3.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 18.3.1 + '@types/react': 18.3.11 use-sync-external-store@1.5.0(react@18.3.1): dependencies: @@ -15158,7 +15095,7 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.25.2 + browserslist: 4.25.3 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.3 es-module-lexer: 1.7.0 @@ -15296,7 +15233,7 @@ snapshots: lib0: 0.2.114 yjs: 13.6.27 - y-prosemirror@1.3.6(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-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.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d9f82af34f..e2a7e56247 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -7,7 +7,7 @@ packages: catalog: react: 18.3.1 react-dom: 18.3.1 - "@types/react": 18.3.1 + "@types/react": 18.3.11 "@types/react-dom": 18.3.1 typescript: 5.8.3 tsup: 8.4.0 From 28d368d50224830781b2b4457ec53a18db79c599 Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Tue, 2 Sep 2025 19:26:35 +0530 Subject: [PATCH 067/138] [WEB-4836] fix: work item retrieval in peek overview (#7705) --- apps/web/core/store/issue/issue-details/issue.store.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/core/store/issue/issue-details/issue.store.ts b/apps/web/core/store/issue/issue-details/issue.store.ts index 229fbf42e4..2b5213992b 100644 --- a/apps/web/core/store/issue/issue-details/issue.store.ts +++ b/apps/web/core/store/issue/issue-details/issue.store.ts @@ -107,7 +107,7 @@ export class IssueStore implements IIssueStore { this.localDBIssueDescription = issueId; } - await this.issueService.retrieve(workspaceSlug, projectId, issueId, query); + issue = await this.issueService.retrieve(workspaceSlug, projectId, issueId, query); if (!issue) throw new Error("Work item not found"); From 292264ba96d33c800f1b4f6091a8673c93a47770 Mon Sep 17 00:00:00 2001 From: Aaryan Khandelwal <65252264+aaryan610@users.noreply.github.com> Date: Tue, 2 Sep 2025 20:39:09 +0530 Subject: [PATCH 068/138] [WIKI-574] fix: disable copy comment link option for intake work item #7707 --- .../ce/components/de-dupe/duplicate-popover/root.tsx | 11 +---------- .../issue-activity/activity-comment-root.tsx | 4 +++- .../issues/issue-detail/issue-activity/root.tsx | 1 + 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/apps/web/ce/components/de-dupe/duplicate-popover/root.tsx b/apps/web/ce/components/de-dupe/duplicate-popover/root.tsx index 90193a69c9..e1b8e21688 100644 --- a/apps/web/ce/components/de-dupe/duplicate-popover/root.tsx +++ b/apps/web/ce/components/de-dupe/duplicate-popover/root.tsx @@ -18,15 +18,6 @@ type TDeDupeIssuePopoverRootProps = { }; export const DeDupeIssuePopoverRoot: FC = observer((props) => { - const { - workspaceSlug, - projectId, - rootIssueId, - issues, - issueOperations, - disabled = false, - renderDeDupeActionModals = true, - isIntakeIssue = false, - } = props; + const {} = props; return <>; }); diff --git a/apps/web/core/components/issues/issue-detail/issue-activity/activity-comment-root.tsx b/apps/web/core/components/issues/issue-detail/issue-activity/activity-comment-root.tsx index eec5db1a87..8dd4e681bd 100644 --- a/apps/web/core/components/issues/issue-detail/issue-activity/activity-comment-root.tsx +++ b/apps/web/core/components/issues/issue-detail/issue-activity/activity-comment-root.tsx @@ -17,6 +17,7 @@ import { IssueActivityLoader } from "./loader"; type TIssueActivityCommentRoot = { workspaceSlug: string; projectId: string; + isIntakeIssue: boolean; issueId: string; selectedFilters: TActivityFilters[]; activityOperations: TCommentsOperations; @@ -28,6 +29,7 @@ type TIssueActivityCommentRoot = { export const IssueActivityCommentRoot: FC = observer((props) => { const { workspaceSlug, + isIntakeIssue, issueId, selectedFilters, activityOperations, @@ -62,7 +64,7 @@ export const IssueActivityCommentRoot: FC = observer( activityOperations={activityOperations} ends={index === 0 ? "top" : index === filteredActivityAndComments.length - 1 ? "bottom" : undefined} showAccessSpecifier={!!showAccessSpecifier} - showCopyLinkOption + showCopyLinkOption={!isIntakeIssue} disabled={disabled} projectId={projectId} /> diff --git a/apps/web/core/components/issues/issue-detail/issue-activity/root.tsx b/apps/web/core/components/issues/issue-detail/issue-activity/root.tsx index a07a9dbadd..4f2cee9fd3 100644 --- a/apps/web/core/components/issues/issue-detail/issue-activity/root.tsx +++ b/apps/web/core/components/issues/issue-detail/issue-activity/root.tsx @@ -130,6 +130,7 @@ export const IssueActivity: FC = observer((props) => { Date: Tue, 2 Sep 2025 20:40:14 +0530 Subject: [PATCH 069/138] [WEB-4724] fix: editor tooltip (#7708) * fix: editor tooltip code refactoring * chore: code refactor --- packages/editor/package.json | 1 - .../editor/src/core/extensions/code/code-block-node-view.tsx | 2 +- .../extensions/custom-image/components/toolbar/alignment.tsx | 2 +- .../extensions/custom-image/components/toolbar/download.tsx | 2 +- .../custom-image/components/toolbar/full-screen/root.tsx | 2 +- pnpm-lock.yaml | 3 --- 6 files changed, 4 insertions(+), 8 deletions(-) diff --git a/packages/editor/package.json b/packages/editor/package.json index 53416d8a55..c552bcdc1c 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -45,7 +45,6 @@ "@plane/types": "workspace:*", "@plane/ui": "workspace:*", "@plane/utils": "workspace:*", - "@plane/propel": "workspace:*", "@tiptap/core": "^2.22.3", "@tiptap/extension-blockquote": "^2.22.3", "@tiptap/extension-character-count": "^2.22.3", diff --git a/packages/editor/src/core/extensions/code/code-block-node-view.tsx b/packages/editor/src/core/extensions/code/code-block-node-view.tsx index 815718712a..6e13924a1c 100644 --- a/packages/editor/src/core/extensions/code/code-block-node-view.tsx +++ b/packages/editor/src/core/extensions/code/code-block-node-view.tsx @@ -7,7 +7,7 @@ import { common, createLowlight } from "lowlight"; import { CopyIcon, CheckIcon } from "lucide-react"; import { useState } from "react"; // ui -import { Tooltip } from "@plane/propel/tooltip"; +import { Tooltip } from "@plane/ui"; // plane utils import { cn } from "@plane/utils"; diff --git a/packages/editor/src/core/extensions/custom-image/components/toolbar/alignment.tsx b/packages/editor/src/core/extensions/custom-image/components/toolbar/alignment.tsx index 106aefb61b..dbbc42e4cf 100644 --- a/packages/editor/src/core/extensions/custom-image/components/toolbar/alignment.tsx +++ b/packages/editor/src/core/extensions/custom-image/components/toolbar/alignment.tsx @@ -2,7 +2,7 @@ import { ChevronDown } from "lucide-react"; import { useEffect, useRef, useState } from "react"; // plane imports import { useOutsideClickDetector } from "@plane/hooks"; -import { Tooltip } from "@plane/propel/tooltip"; +import { Tooltip } from "@plane/ui"; // local imports import type { TCustomImageAlignment } from "../../types"; import { IMAGE_ALIGNMENT_OPTIONS } from "../../utils"; diff --git a/packages/editor/src/core/extensions/custom-image/components/toolbar/download.tsx b/packages/editor/src/core/extensions/custom-image/components/toolbar/download.tsx index 0d845c96dd..2f0a665ae5 100644 --- a/packages/editor/src/core/extensions/custom-image/components/toolbar/download.tsx +++ b/packages/editor/src/core/extensions/custom-image/components/toolbar/download.tsx @@ -1,6 +1,6 @@ import { Download } from "lucide-react"; // plane imports -import { Tooltip } from "@plane/propel/tooltip"; +import { Tooltip } from "@plane/ui"; type Props = { src: string; diff --git a/packages/editor/src/core/extensions/custom-image/components/toolbar/full-screen/root.tsx b/packages/editor/src/core/extensions/custom-image/components/toolbar/full-screen/root.tsx index 26f6f10840..2d8e736061 100644 --- a/packages/editor/src/core/extensions/custom-image/components/toolbar/full-screen/root.tsx +++ b/packages/editor/src/core/extensions/custom-image/components/toolbar/full-screen/root.tsx @@ -1,7 +1,7 @@ import { Maximize } from "lucide-react"; import { useEffect, useState } from "react"; // plane imports -import { Tooltip } from "@plane/propel/tooltip"; +import { Tooltip } from "@plane/ui"; // local imports import { ImageFullScreenModal } from "./modal"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a6bade6e5d..647a33826e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -677,9 +677,6 @@ importers: '@plane/hooks': specifier: workspace:* version: link:../hooks - '@plane/propel': - specifier: workspace:* - version: link:../propel '@plane/types': specifier: workspace:* version: link:../types From 4b74751e4e338b8ce753abb9a571fd154d2a473d Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Tue, 2 Sep 2025 21:03:03 +0530 Subject: [PATCH 070/138] [WEB-4837] feat: adding more packages to catalog (#7693) * feat: adding more packages to catalog * fix: lock file * fix: sharp pacakge catalog --- apps/admin/package.json | 20 +- apps/live/package.json | 6 +- apps/space/package.json | 22 +- apps/web/package.json | 22 +- package.json | 4 +- packages/editor/package.json | 4 +- packages/i18n/package.json | 8 +- packages/propel/package.json | 2 +- packages/services/package.json | 2 +- packages/shared-state/package.json | 2 +- packages/ui/package.json | 6 +- packages/utils/package.json | 8 +- pnpm-lock.yaml | 790 ++++++++++++++++++++--------- pnpm-workspace.yaml | 11 + 14 files changed, 609 insertions(+), 298 deletions(-) diff --git a/apps/admin/package.json b/apps/admin/package.json index 0ea2200aa4..18acfb50f3 100644 --- a/apps/admin/package.json +++ b/apps/admin/package.json @@ -26,26 +26,26 @@ "@plane/ui": "workspace:*", "@plane/utils": "workspace:*", "autoprefixer": "10.4.14", - "axios": "1.11.0", - "lodash": "^4.17.21", - "lucide-react": "^0.469.0", - "mobx": "^6.12.0", - "mobx-react": "^9.1.1", - "next": "14.2.32", + "axios": "catalog:", + "lodash": "catalog:", + "lucide-react": "catalog:", + "mobx": "catalog:", + "mobx-react": "catalog:", + "next": "catalog:", "next-themes": "^0.2.1", "postcss": "^8.4.49", "react": "catalog:", "react-dom": "catalog:", "react-hook-form": "7.51.5", - "sharp": "^0.33.5", - "swr": "^2.2.4", - "uuid": "^9.0.1" + "sharp": "catalog:", + "swr": "catalog:", + "uuid": "catalog:" }, "devDependencies": { "@plane/eslint-config": "workspace:*", "@plane/tailwind-config": "workspace:*", "@plane/typescript-config": "workspace:*", - "@types/lodash": "4.17.20", + "@types/lodash": "catalog:", "@types/node": "18.16.1", "@types/react": "catalog:", "@types/react-dom": "catalog:", diff --git a/apps/live/package.json b/apps/live/package.json index 2ac30471f3..5d3435e84f 100644 --- a/apps/live/package.json +++ b/apps/live/package.json @@ -28,7 +28,7 @@ "@plane/types": "workspace:*", "@tiptap/core": "^2.22.3", "@tiptap/html": "^2.22.3", - "axios": "1.11.0", + "axios": "catalog:", "compression": "1.8.1", "cors": "^2.8.5", "dotenv": "^16.4.5", @@ -36,11 +36,11 @@ "express-ws": "^5.0.2", "helmet": "^7.1.0", "ioredis": "^5.4.1", - "lodash": "^4.17.21", + "lodash": "catalog:", "morgan": "1.10.1", "pino-http": "^10.3.0", "pino-pretty": "^11.2.2", - "uuid": "^10.0.0", + "uuid": "catalog:", "y-prosemirror": "^1.2.15", "y-protocols": "^1.0.6", "yjs": "^13.6.20" diff --git a/apps/space/package.json b/apps/space/package.json index cb05226a54..58caf798d3 100644 --- a/apps/space/package.json +++ b/apps/space/package.json @@ -28,18 +28,18 @@ "@plane/ui": "workspace:*", "@plane/utils": "workspace:*", "@popperjs/core": "^2.11.8", - "axios": "1.11.0", + "axios": "catalog:", "clsx": "^2.0.0", "date-fns": "^4.1.0", "dompurify": "^3.0.11", "dotenv": "^16.3.1", - "lodash": "^4.17.21", + "lodash": "catalog:", "lowlight": "^2.9.0", - "lucide-react": "^0.469.0", - "mobx": "^6.10.0", - "mobx-react": "^9.1.1", - "mobx-utils": "^6.0.8", - "next": "14.2.32", + "lucide-react": "catalog:", + "mobx": "catalog:", + "mobx-react": "catalog:", + "mobx-utils": "catalog:", + "next": "catalog:", "next-themes": "^0.2.1", "nprogress": "^0.2.0", "react": "catalog:", @@ -47,16 +47,16 @@ "react-dropzone": "^14.2.3", "react-hook-form": "7.51.5", "react-popper": "^2.3.0", - "sharp": "^0.33.5", - "swr": "^2.2.2", + "sharp": "catalog:", + "swr": "catalog:", "tailwind-merge": "^2.0.0", - "uuid": "^9.0.0" + "uuid": "catalog:" }, "devDependencies": { "@plane/eslint-config": "workspace:*", "@plane/tailwind-config": "workspace:*", "@plane/typescript-config": "workspace:*", - "@types/lodash": "4.17.20", + "@types/lodash": "catalog:", "@types/node": "18.14.1", "@types/nprogress": "^0.2.0", "@types/react": "catalog:", diff --git a/apps/web/package.json b/apps/web/package.json index 740615807f..1c99545517 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -33,7 +33,7 @@ "@popperjs/core": "^2.11.8", "@react-pdf/renderer": "^3.4.5", "@tanstack/react-table": "^8.21.3", - "axios": "1.11.0", + "axios": "catalog:", "clsx": "^2.0.0", "cmdk": "^1.0.0", "comlink": "^4.4.1", @@ -42,12 +42,12 @@ "emoji-picker-react": "^4.5.16", "export-to-csv": "^1.4.0", "isomorphic-dompurify": "^2.12.0", - "lodash": "^4.17.21", - "lucide-react": "^0.469.0", - "mobx": "^6.10.0", - "mobx-react": "^9.1.1", - "mobx-utils": "^6.0.8", - "next": "14.2.32", + "lodash": "catalog:", + "lucide-react": "catalog:", + "mobx": "catalog:", + "mobx-react": "catalog:", + "mobx-utils": "catalog:", + "next": "catalog:", "next-themes": "^0.2.1", "posthog-js": "^1.131.3", "react": "catalog:", @@ -61,18 +61,18 @@ "react-pdf-html": "^2.1.2", "react-popper": "^2.3.0", "recharts": "^2.12.7", - "sharp": "^0.33.5", + "sharp": "catalog:", "smooth-scroll-into-view-if-needed": "^2.0.2", - "swr": "^2.1.3", + "swr": "catalog:", "tailwind-merge": "^2.0.0", "use-font-face-observer": "^1.2.2", - "uuid": "^9.0.0" + "uuid": "catalog:" }, "devDependencies": { "@plane/eslint-config": "workspace:*", "@plane/tailwind-config": "workspace:*", "@plane/typescript-config": "workspace:*", - "@types/lodash": "4.17.20", + "@types/lodash": "catalog:", "@types/node": "18.16.1", "@types/react": "catalog:", "@types/react-color": "^3.0.6", diff --git a/package.json b/package.json index b79c627918..332f0dfb4b 100644 --- a/package.json +++ b/package.json @@ -33,11 +33,11 @@ "prosemirror-view": "1.40.0", "@types/express": "4.17.23", "typescript": "catalog:", - "sharp": "0.33.5" + "sharp": "catalog:" } }, "packageManager": "pnpm@10.12.1", "engines": { "node": ">=22.18.0" } -} \ No newline at end of file +} diff --git a/packages/editor/package.json b/packages/editor/package.json index c552bcdc1c..6a67c2a4b3 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -70,11 +70,11 @@ "jsx-dom-cjs": "^8.0.3", "linkifyjs": "^4.3.2", "lowlight": "^3.0.0", - "lucide-react": "^0.469.0", + "lucide-react": "catalog:", "prosemirror-codemark": "^0.4.2", "tippy.js": "^6.3.7", "tiptap-markdown": "^0.8.10", - "uuid": "^10.0.0", + "uuid": "catalog:", "y-indexeddb": "^9.0.12", "y-prosemirror": "^1.2.15", "y-protocols": "^1.0.6", diff --git a/packages/i18n/package.json b/packages/i18n/package.json index f082616824..e3b875d2f2 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -17,15 +17,15 @@ "dependencies": { "@plane/utils": "workspace:*", "intl-messageformat": "^10.7.11", - "mobx": "^6.13.5", - "mobx-react": "^9.1.0", - "lodash": "^4.17.21" + "mobx": "catalog:", + "mobx-react": "catalog:", + "lodash": "catalog:" }, "devDependencies": { "@plane/eslint-config": "workspace:*", "@plane/typescript-config": "workspace:*", "@types/node": "^22.5.4", - "@types/lodash": "4.17.20", + "@types/lodash": "catalog:", "@types/react": "catalog:", "typescript": "catalog:" } diff --git a/packages/propel/package.json b/packages/propel/package.json index 901c3c4906..886ba17c84 100644 --- a/packages/propel/package.json +++ b/packages/propel/package.json @@ -41,7 +41,7 @@ "cmdk": "^1.1.1", "clsx": "^2.1.1", "frimousse": "^0.3.0", - "lucide-react": "^0.469.0", + "lucide-react": "catalog:", "react": "catalog:", "react-dom": "catalog:", "recharts": "^2.15.1", diff --git a/packages/services/package.json b/packages/services/package.json index d1d63ee105..a3c9a1a390 100644 --- a/packages/services/package.json +++ b/packages/services/package.json @@ -17,7 +17,7 @@ "dependencies": { "@plane/constants": "workspace:*", "@plane/types": "workspace:*", - "axios": "1.11.0" + "axios": "catalog:" }, "devDependencies": { "@plane/eslint-config": "workspace:*", diff --git a/packages/shared-state/package.json b/packages/shared-state/package.json index fa3a0fb59d..496f2272ac 100644 --- a/packages/shared-state/package.json +++ b/packages/shared-state/package.json @@ -15,7 +15,7 @@ "clean": "rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist" }, "dependencies": { - "mobx": "^6.13.5", + "mobx": "catalog:", "zod": "^3.22.2" }, "devDependencies": { diff --git a/packages/ui/package.json b/packages/ui/package.json index db3f4d3ec8..cb7e6e2d36 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -43,8 +43,8 @@ "@radix-ui/react-scroll-area": "^1.2.3", "clsx": "^2.0.0", "emoji-picker-react": "^4.5.16", - "lodash": "^4.17.21", - "lucide-react": "^0.469.0", + "lodash": "catalog:", + "lucide-react": "catalog:", "react-color": "^2.19.3", "react-day-picker": "9.5.0", "react-popper": "^2.3.0", @@ -67,7 +67,7 @@ "@storybook/react": "^8.1.1", "@storybook/react-webpack5": "^8.1.1", "@storybook/test": "^8.1.1", - "@types/lodash": "4.17.20", + "@types/lodash": "catalog:", "@types/node": "^20.5.2", "@types/react": "catalog:", "@types/react-color": "^3.0.9", diff --git a/packages/utils/package.json b/packages/utils/package.json index c650f53fe0..fbc669c687 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -26,17 +26,17 @@ "clsx": "^2.1.1", "date-fns": "^4.1.0", "isomorphic-dompurify": "^2.16.0", - "lodash": "^4.17.21", - "lucide-react": "^0.469.0", + "lodash": "catalog:", + "lucide-react": "catalog:", "react": "catalog:", "tailwind-merge": "^2.5.5", "tlds": "1.259.0", - "uuid": "^10.0.0" + "uuid": "catalog:" }, "devDependencies": { "@plane/eslint-config": "workspace:*", "@plane/typescript-config": "workspace:*", - "@types/lodash": "4.17.20", + "@types/lodash": "catalog:", "@types/node": "^22.5.4", "@types/react": "catalog:", "@types/uuid": "^9.0.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 647a33826e..d5725964da 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,21 +6,51 @@ settings: catalogs: default: + '@types/lodash': + specifier: 4.17.20 + version: 4.17.20 '@types/react': specifier: 18.3.11 version: 18.3.11 '@types/react-dom': specifier: 18.3.1 version: 18.3.1 + axios: + specifier: 1.11.0 + version: 1.11.0 + lodash: + specifier: 4.17.21 + version: 4.17.21 + lucide-react: + specifier: 0.469.0 + version: 0.469.0 + mobx: + specifier: 6.12.0 + version: 6.12.0 + mobx-react: + specifier: 9.1.1 + version: 9.1.1 + mobx-utils: + specifier: 6.0.8 + version: 6.0.8 + next: + specifier: 14.2.32 + version: 14.2.32 react: specifier: 18.3.1 version: 18.3.1 react-dom: specifier: 18.3.1 version: 18.3.1 + swr: + specifier: 2.2.4 + version: 2.2.4 tsup: specifier: 8.4.0 version: 8.4.0 + uuid: + specifier: 10.0.0 + version: 10.0.0 overrides: brace-expansion: 2.0.2 @@ -79,22 +109,22 @@ importers: specifier: 10.4.14 version: 10.4.14(postcss@8.5.6) axios: - specifier: 1.11.0 + specifier: 'catalog:' version: 1.11.0 lodash: - specifier: ^4.17.21 + specifier: 'catalog:' version: 4.17.21 lucide-react: - specifier: ^0.469.0 + specifier: 'catalog:' version: 0.469.0(react@18.3.1) mobx: - specifier: ^6.12.0 - version: 6.13.7 + specifier: 'catalog:' + version: 6.12.0 mobx-react: - specifier: ^9.1.1 - version: 9.2.0(mobx@6.13.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 'catalog:' + version: 9.1.1(mobx@6.12.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next: - specifier: 14.2.32 + specifier: 'catalog:' version: 14.2.32(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-themes: specifier: ^0.2.1 @@ -115,11 +145,11 @@ importers: specifier: 0.33.5 version: 0.33.5 swr: - specifier: ^2.2.4 - version: 2.3.6(react@18.3.1) + specifier: 'catalog:' + version: 2.2.4(react@18.3.1) uuid: - specifier: ^9.0.1 - version: 9.0.1 + specifier: 'catalog:' + version: 10.0.0 devDependencies: '@plane/eslint-config': specifier: workspace:* @@ -131,7 +161,7 @@ importers: specifier: workspace:* version: link:../../packages/typescript-config '@types/lodash': - specifier: 4.17.20 + specifier: 'catalog:' version: 4.17.20 '@types/node': specifier: 18.16.1 @@ -153,16 +183,16 @@ importers: dependencies: '@hocuspocus/extension-database': specifier: ^2.15.0 - version: 2.15.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + version: 2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) '@hocuspocus/extension-logger': specifier: ^2.15.0 - version: 2.15.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + version: 2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) '@hocuspocus/extension-redis': specifier: ^2.15.0 - version: 2.15.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + version: 2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) '@hocuspocus/server': specifier: ^2.15.0 - version: 2.15.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + version: 2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) '@plane/editor': specifier: workspace:* version: link:../../packages/editor @@ -176,7 +206,7 @@ importers: specifier: ^2.22.3 version: 2.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1) axios: - specifier: 1.11.0 + specifier: 'catalog:' version: 1.11.0 compression: specifier: 1.8.1 @@ -198,9 +228,9 @@ importers: version: 7.2.0 ioredis: specifier: ^5.4.1 - version: 5.7.0 + version: 5.6.1 lodash: - specifier: ^4.17.21 + specifier: 'catalog:' version: 4.17.21 morgan: specifier: 1.10.1 @@ -212,11 +242,11 @@ importers: specifier: ^11.2.2 version: 11.3.0 uuid: - specifier: ^10.0.0 + specifier: 'catalog:' version: 10.0.0 y-prosemirror: specifier: ^1.2.15 - 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) + version: 1.3.6(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) @@ -253,7 +283,7 @@ importers: version: 9.0.8 concurrently: specifier: ^9.0.1 - version: 9.2.0 + version: 9.1.2 nodemon: specifier: ^3.1.7 version: 3.1.10 @@ -277,13 +307,13 @@ importers: version: 11.14.0(@types/react@18.3.11)(react@18.3.1) '@emotion/styled': specifier: ^11.11.0 - version: 11.14.1(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1) + version: 11.14.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1) '@headlessui/react': specifier: ^1.7.13 version: 1.7.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': specifier: ^5.14.1 - version: 5.18.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 5.17.1(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@plane/constants': specifier: workspace:* version: link:../../packages/constants @@ -312,7 +342,7 @@ importers: specifier: ^2.11.8 version: 2.11.8 axios: - specifier: 1.11.0 + specifier: 'catalog:' version: 1.11.0 clsx: specifier: ^2.0.0 @@ -327,25 +357,25 @@ importers: specifier: ^16.3.1 version: 16.6.1 lodash: - specifier: ^4.17.21 + specifier: 'catalog:' version: 4.17.21 lowlight: specifier: ^2.9.0 version: 2.9.0 lucide-react: - specifier: ^0.469.0 + specifier: 'catalog:' version: 0.469.0(react@18.3.1) mobx: - specifier: ^6.10.0 - version: 6.13.7 + specifier: 'catalog:' + version: 6.12.0 mobx-react: - specifier: ^9.1.1 - version: 9.2.0(mobx@6.13.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 'catalog:' + version: 9.1.1(mobx@6.12.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) mobx-utils: - specifier: ^6.0.8 - version: 6.1.1(mobx@6.13.7) + specifier: 'catalog:' + version: 6.0.8(mobx@6.12.0) next: - specifier: 14.2.32 + specifier: 'catalog:' version: 14.2.32(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-themes: specifier: ^0.2.1 @@ -372,14 +402,14 @@ importers: specifier: 0.33.5 version: 0.33.5 swr: - specifier: ^2.2.2 - version: 2.3.6(react@18.3.1) + specifier: 'catalog:' + version: 2.2.4(react@18.3.1) tailwind-merge: specifier: ^2.0.0 version: 2.6.0 uuid: - specifier: ^9.0.0 - version: 9.0.1 + specifier: 'catalog:' + version: 10.0.0 devDependencies: '@plane/eslint-config': specifier: workspace:* @@ -391,7 +421,7 @@ importers: specifier: workspace:* version: link:../../packages/typescript-config '@types/lodash': - specifier: 4.17.20 + specifier: 'catalog:' version: 4.17.20 '@types/node': specifier: 18.14.1 @@ -469,7 +499,7 @@ importers: specifier: ^8.21.3 version: 8.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) axios: - specifier: 1.11.0 + specifier: 'catalog:' version: 1.11.0 clsx: specifier: ^2.0.0 @@ -488,37 +518,37 @@ importers: version: 16.6.1 emoji-picker-react: specifier: ^4.5.16 - version: 4.13.2(react@18.3.1) + version: 4.12.2(react@18.3.1) export-to-csv: specifier: ^1.4.0 version: 1.4.0 isomorphic-dompurify: specifier: ^2.12.0 - version: 2.26.0 + version: 2.25.0 lodash: - specifier: ^4.17.21 + specifier: 'catalog:' version: 4.17.21 lucide-react: - specifier: ^0.469.0 + specifier: 'catalog:' version: 0.469.0(react@18.3.1) mobx: - specifier: ^6.10.0 - version: 6.13.7 + specifier: 'catalog:' + version: 6.12.0 mobx-react: - specifier: ^9.1.1 - version: 9.2.0(mobx@6.13.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 'catalog:' + version: 9.1.1(mobx@6.12.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) mobx-utils: - specifier: ^6.0.8 - version: 6.1.1(mobx@6.13.7) + specifier: 'catalog:' + version: 6.0.8(mobx@6.12.0) next: - specifier: 14.2.32 + specifier: 'catalog:' version: 14.2.32(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(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.131.3 - version: 1.260.1 + version: 1.255.1 react: specifier: 'catalog:' version: 18.3.1 @@ -559,8 +589,8 @@ importers: specifier: ^2.0.2 version: 2.0.2 swr: - specifier: ^2.1.3 - version: 2.3.6(react@18.3.1) + specifier: 'catalog:' + version: 2.2.4(react@18.3.1) tailwind-merge: specifier: ^2.0.0 version: 2.6.0 @@ -568,8 +598,8 @@ importers: specifier: ^1.2.2 version: 1.3.0(react@18.3.1) uuid: - specifier: ^9.0.0 - version: 9.0.1 + specifier: 'catalog:' + version: 10.0.0 devDependencies: '@plane/eslint-config': specifier: workspace:* @@ -581,7 +611,7 @@ importers: specifier: workspace:* version: link:../../packages/typescript-config '@types/lodash': - specifier: 4.17.20 + specifier: 'catalog:' version: 4.17.20 '@types/node': specifier: 18.16.1 @@ -661,7 +691,7 @@ importers: dependencies: '@floating-ui/dom': specifier: ^1.7.1 - version: 1.7.3 + version: 1.7.2 '@floating-ui/react': specifier: ^0.26.4 version: 0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -697,7 +727,7 @@ importers: version: 2.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1) '@tiptap/extension-collaboration': specifier: ^2.22.3 - version: 2.26.1(@tiptap/core@2.26.1(@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)) + version: 2.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)(y-prosemirror@1.3.6(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-emoji': specifier: ^2.22.3 version: 2.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)(@tiptap/suggestion@2.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1))(emojibase@16.0.0) @@ -762,7 +792,7 @@ importers: specifier: ^3.0.0 version: 3.3.0 lucide-react: - specifier: ^0.469.0 + specifier: 'catalog:' version: 0.469.0(react@18.3.1) prosemirror-codemark: specifier: ^0.4.2 @@ -780,14 +810,14 @@ importers: specifier: ^0.8.10 version: 0.8.10(@tiptap/core@2.26.1(@tiptap/pm@2.26.1)) uuid: - specifier: ^10.0.0 + specifier: 'catalog:' version: 10.0.0 y-indexeddb: specifier: ^9.0.12 version: 9.0.12(yjs@13.6.27) y-prosemirror: specifier: ^1.2.15 - 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) + version: 1.3.6(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) @@ -827,7 +857,7 @@ importers: devDependencies: '@typescript-eslint/eslint-plugin': specifier: ^8.6.0 - version: 8.40.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + version: 8.38.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^8.6.0 version: 8.40.0(eslint@8.57.1)(typescript@5.8.3) @@ -836,7 +866,7 @@ importers: version: 8.57.1 eslint-config-next: specifier: ^14.1.0 - version: 14.2.32(eslint@8.57.1)(typescript@5.8.3) + version: 14.2.31(eslint@8.57.1)(typescript@5.8.3) eslint-config-prettier: specifier: ^9.1.0 version: 9.1.0(eslint@8.57.1) @@ -845,7 +875,7 @@ importers: version: 1.13.4(eslint@8.57.1) eslint-plugin-import: specifier: ^2.29.1 - version: 2.32.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + version: 2.31.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) eslint-plugin-react: specifier: ^7.33.2 version: 7.37.5(eslint@8.57.1) @@ -890,14 +920,14 @@ importers: specifier: ^10.7.11 version: 10.7.16 lodash: - specifier: ^4.17.21 + specifier: 'catalog:' version: 4.17.21 mobx: - specifier: ^6.13.5 - version: 6.13.7 + specifier: 'catalog:' + version: 6.12.0 mobx-react: - specifier: ^9.1.0 - version: 9.2.0(mobx@6.13.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 'catalog:' + version: 9.1.1(mobx@6.12.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) devDependencies: '@plane/eslint-config': specifier: workspace:* @@ -906,7 +936,7 @@ importers: specifier: workspace:* version: link:../typescript-config '@types/lodash': - specifier: 4.17.20 + specifier: 'catalog:' version: 4.17.20 '@types/node': specifier: ^22.5.4 @@ -976,7 +1006,7 @@ importers: specifier: ^0.3.0 version: 0.3.0(react@18.3.1)(typescript@5.8.3) lucide-react: - specifier: ^0.469.0 + specifier: 'catalog:' version: 0.469.0(react@18.3.1) react: specifier: 'catalog:' @@ -1031,7 +1061,7 @@ importers: specifier: workspace:* version: link:../types axios: - specifier: 1.11.0 + specifier: 'catalog:' version: 1.11.0 devDependencies: '@plane/eslint-config': @@ -1050,8 +1080,8 @@ importers: packages/shared-state: dependencies: mobx: - specifier: ^6.13.5 - version: 6.13.7 + specifier: 'catalog:' + version: 6.12.0 zod: specifier: ^3.22.2 version: 3.25.76 @@ -1163,12 +1193,12 @@ importers: version: 2.1.1 emoji-picker-react: specifier: ^4.5.16 - version: 4.13.2(react@18.3.1) + version: 4.12.2(react@18.3.1) lodash: - specifier: ^4.17.21 + specifier: 'catalog:' version: 4.17.21 lucide-react: - specifier: ^0.469.0 + specifier: 'catalog:' version: 0.469.0(react@18.3.1) react: specifier: 'catalog:' @@ -1238,7 +1268,7 @@ importers: specifier: ^8.1.1 version: 8.6.14(storybook@8.6.14(prettier@3.6.2)) '@types/lodash': - specifier: 4.17.20 + specifier: 'catalog:' version: 4.17.20 '@types/node': specifier: ^20.5.2 @@ -1287,12 +1317,12 @@ importers: version: 4.1.0 isomorphic-dompurify: specifier: ^2.16.0 - version: 2.26.0 + version: 2.25.0 lodash: - specifier: ^4.17.21 + specifier: 'catalog:' version: 4.17.21 lucide-react: - specifier: ^0.469.0 + specifier: 'catalog:' version: 0.469.0(react@18.3.1) react: specifier: 'catalog:' @@ -1304,7 +1334,7 @@ importers: specifier: 1.259.0 version: 1.259.0 uuid: - specifier: ^10.0.0 + specifier: 'catalog:' version: 10.0.0 devDependencies: '@plane/eslint-config': @@ -1314,7 +1344,7 @@ importers: specifier: workspace:* version: link:../typescript-config '@types/lodash': - specifier: 4.17.20 + specifier: 'catalog:' version: 4.17.20 '@types/node': specifier: ^22.5.4 @@ -1577,8 +1607,8 @@ packages: '@emotion/sheet@1.4.0': resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} - '@emotion/styled@11.14.1': - resolution: {integrity: sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==} + '@emotion/styled@11.14.0': + resolution: {integrity: sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==} peerDependencies: '@emotion/react': ^11.0.0-rc.0 '@types/react': '*' @@ -1772,6 +1802,9 @@ packages: '@floating-ui/core@1.7.3': resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + '@floating-ui/dom@1.7.2': + resolution: {integrity: sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==} + '@floating-ui/dom@1.7.3': resolution: {integrity: sha512-uZA413QEpNuhtb3/iIKoYMSK07keHPYeXF02Zhd6e213j+d1NamLix/mCLxBUDW/Gx52sPH2m+chlUsyaBs/Ag==} @@ -1815,16 +1848,16 @@ packages: '@hocuspocus/common@2.15.3': resolution: {integrity: sha512-Rzh1HF0a2o/tf90A3w2XNdXd9Ym3aQzMDfD3lAUONCX9B9QOdqdyiORrj6M25QEaJrEIbXFy8LtAFcL0wRdWzA==} - '@hocuspocus/extension-database@2.15.3': - resolution: {integrity: sha512-+PVlPwfdVyOase68WEBb105ZwglhCLVeGpyNa3uwnmH+Ers7OKGLma2SDMKn3Vcb5oHzTzEGx7jNt+32KTEKXA==} + '@hocuspocus/extension-database@2.15.2': + resolution: {integrity: sha512-BkYDfKA99udx7AEkqWReBS61kvGMC9SqoPJs3v8xNgpaj2GGyMJQlUdQRMhPyZTn2osV+pqhk8Hn7xUJCW1RJg==} peerDependencies: yjs: ^13.6.8 - '@hocuspocus/extension-logger@2.15.3': - resolution: {integrity: sha512-NufsjXldlVX1c2B98Hyg8Vq9GblPmnIvw9QGdsBK6SNEgWzDwfVrjljrigMAVGuQ4pbBVz8TaY5DcsmOCi5jqA==} + '@hocuspocus/extension-logger@2.15.2': + resolution: {integrity: sha512-nqSnSFI+xO7dBTsgzSANKvx09ptq8J4Doz3AdLgxfaweYC85qFao7mAx1ZCtWoVHseVwBYua6S3dTwQq5IsWEg==} - '@hocuspocus/extension-redis@2.15.3': - resolution: {integrity: sha512-gKeiiuQcAoRYb+QK9vyIczRrjNy8NW6ky+oyVv7raMcaizfFxeWP3TaAHPyC2pjGKfXsqN2m3YM0GbBGZfMiCg==} + '@hocuspocus/extension-redis@2.15.2': + resolution: {integrity: sha512-2BNBLnDEQq2v3uQSidBSdUOIbHhH383SGxn+hmy6tDQfrt2hLE4MwilgDdcCO0FKOCYaJrV7HyKu6/WyzLbAOg==} peerDependencies: y-protocols: ^1.0.6 yjs: ^13.6.8 @@ -1835,8 +1868,8 @@ packages: y-protocols: ^1.0.6 yjs: ^13.6.8 - '@hocuspocus/server@2.15.3': - resolution: {integrity: sha512-Ju4ty4/7JtmvivcP7gKReOLf8KrFwN7Yx/5VhXYh4TRULy4kSo2fsDVUaluPp0neZa6PbVhizJuzlOim73IEbQ==} + '@hocuspocus/server@2.15.2': + resolution: {integrity: sha512-+fLRVswg+bkgfHqJ+wFgywivw3H08WMOtVvJF7dJzWT2ZR/Sc3nDMFh2KqMF6Ygh4z6mt23xr7SKIm3eP1zoLA==} peerDependencies: y-protocols: ^1.0.6 yjs: ^13.6.8 @@ -1999,11 +2032,11 @@ packages: '@jridgewell/source-map@0.3.11': resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/sourcemap-codec@1.5.4': + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} - '@jridgewell/trace-mapping@0.3.30': - resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + '@jridgewell/trace-mapping@0.3.29': + resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -2023,8 +2056,8 @@ packages: '@mui/core-downloads-tracker@5.18.0': resolution: {integrity: sha512-jbhwoQ1AY200PSSOrNXmrFCaSDSJWP7qk6urkTmIirvRXDROkqe+QwcLlUiw/PrREwsIF/vm3/dAXvjlMHF0RA==} - '@mui/material@5.18.0': - resolution: {integrity: sha512-bbH/HaJZpFtXGvWg3TsBWG4eyt3gah3E7nCNU8GLyRjVoWcA91Vm/T+sjHfUcwgJSw9iLtucfHBoq+qW/T30aA==} + '@mui/material@5.17.1': + resolution: {integrity: sha512-2B33kQf+GmPnrvXXweWAx+crbiUEsxCdCN979QDYnlH9ox4pd+0/IBriWLV+l6ORoBF60w39cWjFnJYGFdzXcw==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 @@ -2103,8 +2136,8 @@ packages: '@next/env@14.2.32': resolution: {integrity: sha512-n9mQdigI6iZ/DF6pCTwMKeWgF2e8lg7qgt5M7HXMLtyhZYMnf/u905M18sSpPmHL9MKp9JHo56C6jrD2EvWxng==} - '@next/eslint-plugin-next@14.2.32': - resolution: {integrity: sha512-tyZMX8g4cWg/uPW4NxiJK13t62Pab47SKGJGVZJa6YtFwtfrXovH4j1n9tdpRdXW03PGQBugYEVGM7OhWfytdA==} + '@next/eslint-plugin-next@14.2.31': + resolution: {integrity: sha512-ouaB+l8Cr/uzGxoGHUvd01OnfFTM8qM81Crw1AG0xoWDRN0DKLXyTWVe0FdAOHVBpGuXB87aufdRmrwzZDArIw==} '@next/swc-darwin-arm64@14.2.32': resolution: {integrity: sha512-osHXveM70zC+ilfuFa/2W6a1XQxJTvEhzEycnjUaVE8kpUS09lDpiDDX2YLdyFCzoUbvbo5r0X1Kp4MllIOShw==} @@ -2447,86 +2480,171 @@ packages: rollup: optional: true + '@rollup/rollup-android-arm-eabi@4.45.1': + resolution: {integrity: sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm-eabi@4.50.0': resolution: {integrity: sha512-lVgpeQyy4fWN5QYebtW4buT/4kn4p4IJ+kDNB4uYNT5b8c8DLJDg6titg20NIg7E8RWwdWZORW6vUFfrLyG3KQ==} cpu: [arm] os: [android] + '@rollup/rollup-android-arm64@4.45.1': + resolution: {integrity: sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==} + cpu: [arm64] + os: [android] + '@rollup/rollup-android-arm64@4.50.0': resolution: {integrity: sha512-2O73dR4Dc9bp+wSYhviP6sDziurB5/HCym7xILKifWdE9UsOe2FtNcM+I4xZjKrfLJnq5UR8k9riB87gauiQtw==} cpu: [arm64] os: [android] + '@rollup/rollup-darwin-arm64@4.45.1': + resolution: {integrity: sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-arm64@4.50.0': resolution: {integrity: sha512-vwSXQN8T4sKf1RHr1F0s98Pf8UPz7pS6P3LG9NSmuw0TVh7EmaE+5Ny7hJOZ0M2yuTctEsHHRTMi2wuHkdS6Hg==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-x64@4.45.1': + resolution: {integrity: sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.50.0': resolution: {integrity: sha512-cQp/WG8HE7BCGyFVuzUg0FNmupxC+EPZEwWu2FCGGw5WDT1o2/YlENbm5e9SMvfDFR6FRhVCBePLqj0o8MN7Vw==} cpu: [x64] os: [darwin] + '@rollup/rollup-freebsd-arm64@4.45.1': + resolution: {integrity: sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==} + cpu: [arm64] + os: [freebsd] + '@rollup/rollup-freebsd-arm64@4.50.0': resolution: {integrity: sha512-UR1uTJFU/p801DvvBbtDD7z9mQL8J80xB0bR7DqW7UGQHRm/OaKzp4is7sQSdbt2pjjSS72eAtRh43hNduTnnQ==} cpu: [arm64] os: [freebsd] + '@rollup/rollup-freebsd-x64@4.45.1': + resolution: {integrity: sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-freebsd-x64@4.50.0': resolution: {integrity: sha512-G/DKyS6PK0dD0+VEzH/6n/hWDNPDZSMBmqsElWnCRGrYOb2jC0VSupp7UAHHQ4+QILwkxSMaYIbQ72dktp8pKA==} cpu: [x64] os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.45.1': + resolution: {integrity: sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.50.0': resolution: {integrity: sha512-u72Mzc6jyJwKjJbZZcIYmd9bumJu7KNmHYdue43vT1rXPm2rITwmPWF0mmPzLm9/vJWxIRbao/jrQmxTO0Sm9w==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.45.1': + resolution: {integrity: sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.50.0': resolution: {integrity: sha512-S4UefYdV0tnynDJV1mdkNawp0E5Qm2MtSs330IyHgaccOFrwqsvgigUD29uT+B/70PDY1eQ3t40+xf6wIvXJyg==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.45.1': + resolution: {integrity: sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.50.0': resolution: {integrity: sha512-1EhkSvUQXJsIhk4msxP5nNAUWoB4MFDHhtc4gAYvnqoHlaL9V3F37pNHabndawsfy/Tp7BPiy/aSa6XBYbaD1g==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.45.1': + resolution: {integrity: sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.50.0': resolution: {integrity: sha512-EtBDIZuDtVg75xIPIK1l5vCXNNCIRM0OBPUG+tbApDuJAy9mKago6QxX+tfMzbCI6tXEhMuZuN1+CU8iDW+0UQ==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-loongarch64-gnu@4.45.1': + resolution: {integrity: sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-loongarch64-gnu@4.50.0': resolution: {integrity: sha512-BGYSwJdMP0hT5CCmljuSNx7+k+0upweM2M4YGfFBjnFSZMHOLYR0gEEj/dxyYJ6Zc6AiSeaBY8dWOa11GF/ppQ==} cpu: [loong64] os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': + resolution: {integrity: sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-ppc64-gnu@4.50.0': resolution: {integrity: sha512-I1gSMzkVe1KzAxKAroCJL30hA4DqSi+wGc5gviD0y3IL/VkvcnAqwBf4RHXHyvH66YVHxpKO8ojrgc4SrWAnLg==} cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.45.1': + resolution: {integrity: sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.50.0': resolution: {integrity: sha512-bSbWlY3jZo7molh4tc5dKfeSxkqnf48UsLqYbUhnkdnfgZjgufLS/NTA8PcP/dnvct5CCdNkABJ56CbclMRYCA==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.45.1': + resolution: {integrity: sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.50.0': resolution: {integrity: sha512-LSXSGumSURzEQLT2e4sFqFOv3LWZsEF8FK7AAv9zHZNDdMnUPYH3t8ZlaeYYZyTXnsob3htwTKeWtBIkPV27iQ==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.45.1': + resolution: {integrity: sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.50.0': resolution: {integrity: sha512-CxRKyakfDrsLXiCyucVfVWVoaPA4oFSpPpDwlMcDFQvrv3XY6KEzMtMZrA+e/goC8xxp2WSOxHQubP8fPmmjOQ==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.45.1': + resolution: {integrity: sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.50.0': resolution: {integrity: sha512-8PrJJA7/VU8ToHVEPu14FzuSAqVKyo5gg/J8xUerMbyNkWkO9j2ExBho/68RnJsMGNJq4zH114iAttgm7BZVkA==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.45.1': + resolution: {integrity: sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.50.0': resolution: {integrity: sha512-SkE6YQp+CzpyOrbw7Oc4MgXFvTw2UIBElvAvLCo230pyxOLmYwRPwZ/L5lBe/VW/qT1ZgND9wJfOsdy0XptRvw==} cpu: [x64] @@ -2537,16 +2655,31 @@ packages: cpu: [arm64] os: [openharmony] + '@rollup/rollup-win32-arm64-msvc@4.45.1': + resolution: {integrity: sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.50.0': resolution: {integrity: sha512-q7cIIdFvWQoaCbLDUyUc8YfR3Jh2xx3unO8Dn6/TTogKjfwrax9SyfmGGK6cQhKtjePI7jRfd7iRYcxYs93esg==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.45.1': + resolution: {integrity: sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.50.0': resolution: {integrity: sha512-XzNOVg/YnDOmFdDKcxxK410PrcbcqZkBmz+0FicpW5jtjKQxcW1BZJEQOF0NJa6JO7CZhett8GEtRN/wYLYJuw==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.45.1': + resolution: {integrity: sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==} + cpu: [x64] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.50.0': resolution: {integrity: sha512-xMmiWRR8sp72Zqwjgtf3QbZfF1wdh8X2ABu3EaozvZcyHJeU0r+XAnXdKgs4cCAp6ORoYoCygipYP1mjmbjrsg==} cpu: [x64] @@ -3405,11 +3538,11 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@typescript-eslint/eslint-plugin@8.40.0': - resolution: {integrity: sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw==} + '@typescript-eslint/eslint-plugin@8.38.0': + resolution: {integrity: sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.40.0 + '@typescript-eslint/parser': ^8.38.0 eslint: ^8.57.0 || ^9.0.0 typescript: 5.8.3 @@ -3420,46 +3553,76 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: 5.8.3 + '@typescript-eslint/project-service@8.38.0': + resolution: {integrity: sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: 5.8.3 + '@typescript-eslint/project-service@8.40.0': resolution: {integrity: sha512-/A89vz7Wf5DEXsGVvcGdYKbVM9F7DyFXj52lNYUDS1L9yJfqjW/fIp5PgMuEJL/KeqVTe2QSbXAGUZljDUpArw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: 5.8.3 + '@typescript-eslint/scope-manager@8.38.0': + resolution: {integrity: sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.40.0': resolution: {integrity: sha512-y9ObStCcdCiZKzwqsE8CcpyuVMwRouJbbSrNuThDpv16dFAj429IkM6LNb1dZ2m7hK5fHyzNcErZf7CEeKXR4w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/tsconfig-utils@8.38.0': + resolution: {integrity: sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: 5.8.3 + '@typescript-eslint/tsconfig-utils@8.40.0': resolution: {integrity: sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: 5.8.3 - '@typescript-eslint/type-utils@8.40.0': - resolution: {integrity: sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==} + '@typescript-eslint/type-utils@8.38.0': + resolution: {integrity: sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==} 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/types@8.38.0': + resolution: {integrity: sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.40.0': resolution: {integrity: sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.38.0': + resolution: {integrity: sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: 5.8.3 + '@typescript-eslint/typescript-estree@8.40.0': resolution: {integrity: sha512-k1z9+GJReVVOkc1WfVKs1vBrR5MIKKbdAjDTPvIK3L8De6KbFfPFt6BKpdkdk7rZS2GtC/m6yI5MYX+UsuvVYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: 5.8.3 - '@typescript-eslint/utils@8.40.0': - resolution: {integrity: sha512-Cgzi2MXSZyAUOY+BFwGs17s7ad/7L+gKt6Y8rAVVWS+7o6wrjeFN4nVfTpbE25MNcxyJ+iYUXflbs2xR9h4UBg==} + '@typescript-eslint/utils@8.38.0': + resolution: {integrity: sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==} 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.38.0': + resolution: {integrity: sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.40.0': resolution: {integrity: sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3722,8 +3885,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.2.0: - resolution: {integrity: sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} ansi-styles@3.2.1: @@ -3929,8 +4092,8 @@ packages: browserify-zlib@0.2.0: resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} - browserslist@4.25.3: - resolution: {integrity: sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==} + browserslist@4.25.2: + resolution: {integrity: sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -4139,8 +4302,8 @@ packages: compute-scroll-into-view@3.1.1: resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} - concurrently@9.2.0: - resolution: {integrity: sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==} + concurrently@9.1.2: + resolution: {integrity: sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==} engines: {node: '>=18'} hasBin: true @@ -4510,14 +4673,14 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.207: - resolution: {integrity: sha512-mryFrrL/GXDTmAtIVMVf+eIXM09BBPlO5IQ7lUyKmK8d+A4VpRGG+M3ofoVef6qyF8s60rJei8ymlJxjUA8Faw==} + electron-to-chromium@1.5.204: + resolution: {integrity: sha512-s9VbBXWxfDrl67PlO4avwh0/GU2vcwx8Fph3wlR8LJl7ySGYId59EFE17VWVcuC3sLWNPENm6Z/uGqKbkPCcXA==} element-resize-detector@1.2.4: resolution: {integrity: sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==} - emoji-picker-react@4.13.2: - resolution: {integrity: sha512-azaJQLTshEOZVhksgU136izJWJyZ4Clx6xQ6Vctzk1gOdPPAUbTa/JYDwZJ8rh97QxnjpyeftXl99eRlYr3vNA==} + emoji-picker-react@4.12.2: + resolution: {integrity: sha512-6PDYZGlhidt+Kc0ay890IU4HLNfIR7/OxPvcNxw+nJ4HQhMKd8pnGnPn4n2vqC/arRFCNWQhgJP8rpsYKsz0GQ==} engines: {node: '>=10'} peerDependencies: react: '>=16' @@ -4639,8 +4802,8 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-next@14.2.32: - resolution: {integrity: sha512-mP/NmYtDBsKlKIOBnH+CW+pYeyR3wBhE+26DAqQ0/aRtEBeTEjgY2wAFUugUELkTLmrX6PpuMSSTpOhz7j9kdQ==} + eslint-config-next@14.2.31: + resolution: {integrity: sha512-sT32j4678je7SWstBM6l0kE2L+LSgAARDAxw8iloNhI4/8xwkdDesbrGCPaGWzQv+dD6f6adhB+eRSThpGkBdg==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 typescript: 5.8.3 @@ -4696,8 +4859,8 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-import@2.32.0: - resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} + eslint-plugin-import@2.31.0: + resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -4879,9 +5042,8 @@ packages: fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} - fdir@6.5.0: - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -5286,8 +5448,8 @@ packages: resolution: {integrity: sha512-P9F4Eo6zicYsIJbEy/mPJmSxKY0rVcmiy5H8oXPxPDotQRCvCBjBuI5QWoQQanVE9jdeocnum5iqYAHl4pHdLA==} engines: {node: '>=6'} - ioredis@5.7.0: - resolution: {integrity: sha512-NUcA93i1lukyXU+riqEyPtSEkyFq8tX90uL659J+qpCZ3rEdViB/APC58oAhIh3+bJln2hzdlZbBZsGNrlsR8g==} + ioredis@5.6.1: + resolution: {integrity: sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==} engines: {node: '>=12.22.0'} ipaddr.js@1.9.1: @@ -5455,8 +5617,8 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isomorphic-dompurify@2.26.0: - resolution: {integrity: sha512-nZmoK4wKdzPs5USq4JHBiimjdKSVAOm2T1KyDoadtMPNXYHxiENd19ou4iU/V4juFM6LVgYQnpxCYmxqNP4Obw==} + isomorphic-dompurify@2.25.0: + resolution: {integrity: sha512-bcpJzu9DOjN21qaCVpcoCwUX1ytpvA6EFqCK5RNtPg5+F0Jz9PX50jl6jbEicBNeO87eDDfC7XtPs4zjDClZJg==} engines: {node: '>=18'} isomorphic.js@0.2.5: @@ -5865,11 +6027,11 @@ packages: react-native: optional: true - mobx-react@9.2.0: - resolution: {integrity: sha512-dkGWCx+S0/1mfiuFfHRH8D9cplmwhxOV5CkXMp38u6rQGG2Pv3FWYztS0M7ncR6TyPRQKaTG/pnitInoYE9Vrw==} + mobx-react@9.1.1: + resolution: {integrity: sha512-gVV7AdSrAAxqXOJ2bAbGa5TkPqvITSzaPiiEkzpW4rRsMhSec7C2NBCJYILADHKp2tzOAIETGRsIY0UaCV5aEw==} peerDependencies: mobx: ^6.9.0 - react: ^16.8.0 || ^17 || ^18 || ^19 + react: ^16.8.0 || ^17 || ^18 react-dom: '*' react-native: '*' peerDependenciesMeta: @@ -5878,13 +6040,13 @@ packages: react-native: optional: true - mobx-utils@6.1.1: - resolution: {integrity: sha512-ZR4tOKucWAHOdMjqElRl2BEvrzK7duuDdKmsbEbt2kzgVpuLuoYLiDCjc3QwWQl8CmOlxPgaZQpZ7emwNqPkIg==} + mobx-utils@6.0.8: + resolution: {integrity: sha512-fPNt0vJnHwbQx9MojJFEnJLfM3EMGTtpy4/qOOW6xueh1mPofMajrbYAUvByMYAvCJnpy1A5L0t+ZVB5niKO4g==} peerDependencies: mobx: ^6.0.0 - mobx@6.13.7: - resolution: {integrity: sha512-aChaVU/DO5aRPmk1GX8L+whocagUUpBQqoPtJk+cm7UOXUk87J4PeWCh6nNmTTIfEhiR9DI/+FnA8dln/hTK7g==} + mobx@6.12.0: + resolution: {integrity: sha512-Mn6CN6meXEnMa0a5u6a5+RKrqRedHBhZGd15AWLk9O6uFY4KYHzImdt8JI8WODo1bjTSRnwXhJox+FCUZhCKCQ==} morgan@1.10.1: resolution: {integrity: sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==} @@ -6364,8 +6526,8 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - posthog-js@1.260.1: - resolution: {integrity: sha512-DD8ZSRpdScacMqtqUIvMFme8lmOWkOvExG8VvjONE7Cm3xpRH5xXpfrwMJE4bayTGWKMx4ij6SfphK6dm/o2ug==} + 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 @@ -6855,6 +7017,11 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + rollup@4.45.1: + resolution: {integrity: sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + rollup@4.50.0: resolution: {integrity: sha512-/Zl4D8zPifNmyGzJS+3kVoyXeDeT/GrsJM94sACNg9RtUE0hrHa1bNPtRSrfHTMH5HjRzce6K7rlTh3Khiw+pw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -7046,6 +7213,7 @@ packages: source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -7206,10 +7374,10 @@ packages: '@swc/core': ^1.2.147 webpack: '>=2' - swr@2.3.6: - resolution: {integrity: sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==} + swr@2.2.4: + resolution: {integrity: sha512-njiZ/4RiIhoOlAaLYDqwz5qH/KZXVilRLvomrx83HjzCWTfa+InyfAjv05PSFxnmLzZkNO9ZfvgoqzAaEI4sGQ==} peerDependencies: - react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^16.11.0 || ^17.0.0 || ^18.0.0 symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -7853,8 +8021,8 @@ packages: peerDependencies: yjs: ^13.0.0 - y-prosemirror@1.3.7: - resolution: {integrity: sha512-NpM99WSdD4Fx4if5xOMDpPtU3oAmTSjlzh5U4353ABbRHl1HtAFUx6HlebLZfyFxXN9jzKMDkVbcRjqOZVkYQg==} + y-prosemirror@1.3.6: + resolution: {integrity: sha512-vtS2rv8+ll/TBQRqwUiqflgSuN/DhfvUQX0r5O3o5i0pO6K4pSNgFtVkOKtNWPBVkS6l9BDQjbtnDNftZnxq7Q==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} peerDependencies: prosemirror-model: ^1.7.1 @@ -7928,7 +8096,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.29 '@asamuzakjp/css-color@3.2.0': dependencies: @@ -7987,14 +8155,14 @@ snapshots: '@babel/parser': 7.28.3 '@babel/types': 7.28.2 '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.29 jsesc: 3.1.0 '@babel/helper-compilation-targets@7.27.2': dependencies: '@babel/compat-data': 7.28.0 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.3 + browserslist: 4.25.2 lru-cache: 5.1.1 semver: 6.3.1 @@ -8261,7 +8429,7 @@ snapshots: '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1)': + '@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1)': dependencies: '@babel/runtime': 7.26.10 '@emotion/babel-plugin': 11.13.5 @@ -8388,6 +8556,11 @@ snapshots: dependencies: '@floating-ui/utils': 0.2.10 + '@floating-ui/dom@1.7.2': + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + '@floating-ui/dom@1.7.3': dependencies: '@floating-ui/core': 1.7.3 @@ -8446,27 +8619,27 @@ snapshots: dependencies: lib0: 0.2.114 - '@hocuspocus/extension-database@2.15.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/extension-database@2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': dependencies: - '@hocuspocus/server': 2.15.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + '@hocuspocus/server': 2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) yjs: 13.6.27 transitivePeerDependencies: - bufferutil - utf-8-validate - y-protocols - '@hocuspocus/extension-logger@2.15.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/extension-logger@2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': dependencies: - '@hocuspocus/server': 2.15.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + '@hocuspocus/server': 2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) transitivePeerDependencies: - bufferutil - utf-8-validate - y-protocols - yjs - '@hocuspocus/extension-redis@2.15.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/extension-redis@2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': dependencies: - '@hocuspocus/server': 2.15.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + '@hocuspocus/server': 2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) ioredis: 4.30.0 kleur: 4.1.5 lodash.debounce: 4.0.8 @@ -8491,7 +8664,7 @@ snapshots: - bufferutil - utf-8-validate - '@hocuspocus/server@2.15.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/server@2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': dependencies: '@hocuspocus/common': 2.15.3 async-lock: 1.4.1 @@ -8627,27 +8800,27 @@ snapshots: '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping': 0.3.29 '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/source-map@0.3.11': dependencies: '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.29 - '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/sourcemap-codec@1.5.4': {} - '@jridgewell/trace-mapping@0.3.30': + '@jridgewell/trace-mapping@0.3.29': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.5.4 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.5.4 '@juggle/resize-observer@3.4.0': {} @@ -8661,11 +8834,11 @@ snapshots: '@mui/core-downloads-tracker@5.18.0': {} - '@mui/material@5.18.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/material@5.17.1(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.10 '@mui/core-downloads-tracker': 5.18.0 - '@mui/system': 5.18.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1) + '@mui/system': 5.18.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1) '@mui/types': 7.2.24(@types/react@18.3.11) '@mui/utils': 5.17.1(@types/react@18.3.11)(react@18.3.1) '@popperjs/core': 2.11.8 @@ -8679,7 +8852,7 @@ snapshots: react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) optionalDependencies: '@emotion/react': 11.14.0(@types/react@18.3.11)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1) + '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1) '@types/react': 18.3.11 '@mui/private-theming@5.17.1(@types/react@18.3.11)(react@18.3.1)': @@ -8691,7 +8864,7 @@ snapshots: optionalDependencies: '@types/react': 18.3.11 - '@mui/styled-engine@5.18.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1))(react@18.3.1)': + '@mui/styled-engine@5.18.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.10 '@emotion/cache': 11.14.0 @@ -8701,13 +8874,13 @@ snapshots: react: 18.3.1 optionalDependencies: '@emotion/react': 11.14.0(@types/react@18.3.11)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1) + '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1) - '@mui/system@5.18.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1)': + '@mui/system@5.18.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1)': dependencies: '@babel/runtime': 7.26.10 '@mui/private-theming': 5.17.1(@types/react@18.3.11)(react@18.3.1) - '@mui/styled-engine': 5.18.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1))(react@18.3.1) + '@mui/styled-engine': 5.18.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1))(react@18.3.1) '@mui/types': 7.2.24(@types/react@18.3.11) '@mui/utils': 5.17.1(@types/react@18.3.11)(react@18.3.1) clsx: 2.1.1 @@ -8716,7 +8889,7 @@ snapshots: react: 18.3.1 optionalDependencies: '@emotion/react': 11.14.0(@types/react@18.3.11)(react@18.3.1) - '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1) + '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.3.11)(react@18.3.1))(@types/react@18.3.11)(react@18.3.1) '@types/react': 18.3.11 '@mui/types@7.2.24(@types/react@18.3.11)': @@ -8744,7 +8917,7 @@ snapshots: '@next/env@14.2.32': {} - '@next/eslint-plugin-next@14.2.32': + '@next/eslint-plugin-next@14.2.31': dependencies: glob: 10.3.10 @@ -9118,66 +9291,126 @@ snapshots: optionalDependencies: rollup: 4.50.0 + '@rollup/rollup-android-arm-eabi@4.45.1': + optional: true + '@rollup/rollup-android-arm-eabi@4.50.0': optional: true + '@rollup/rollup-android-arm64@4.45.1': + optional: true + '@rollup/rollup-android-arm64@4.50.0': optional: true + '@rollup/rollup-darwin-arm64@4.45.1': + optional: true + '@rollup/rollup-darwin-arm64@4.50.0': optional: true + '@rollup/rollup-darwin-x64@4.45.1': + optional: true + '@rollup/rollup-darwin-x64@4.50.0': optional: true + '@rollup/rollup-freebsd-arm64@4.45.1': + optional: true + '@rollup/rollup-freebsd-arm64@4.50.0': optional: true + '@rollup/rollup-freebsd-x64@4.45.1': + optional: true + '@rollup/rollup-freebsd-x64@4.50.0': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.45.1': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.50.0': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.45.1': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.50.0': optional: true + '@rollup/rollup-linux-arm64-gnu@4.45.1': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.50.0': optional: true + '@rollup/rollup-linux-arm64-musl@4.45.1': + optional: true + '@rollup/rollup-linux-arm64-musl@4.50.0': optional: true + '@rollup/rollup-linux-loongarch64-gnu@4.45.1': + optional: true + '@rollup/rollup-linux-loongarch64-gnu@4.50.0': optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': + optional: true + '@rollup/rollup-linux-ppc64-gnu@4.50.0': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.45.1': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.50.0': optional: true + '@rollup/rollup-linux-riscv64-musl@4.45.1': + optional: true + '@rollup/rollup-linux-riscv64-musl@4.50.0': optional: true + '@rollup/rollup-linux-s390x-gnu@4.45.1': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.50.0': optional: true + '@rollup/rollup-linux-x64-gnu@4.45.1': + optional: true + '@rollup/rollup-linux-x64-gnu@4.50.0': optional: true + '@rollup/rollup-linux-x64-musl@4.45.1': + optional: true + '@rollup/rollup-linux-x64-musl@4.50.0': optional: true '@rollup/rollup-openharmony-arm64@4.50.0': optional: true + '@rollup/rollup-win32-arm64-msvc@4.45.1': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.50.0': optional: true + '@rollup/rollup-win32-ia32-msvc@4.45.1': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.50.0': optional: true + '@rollup/rollup-win32-x64-msvc@4.45.1': + optional: true + '@rollup/rollup-win32-x64-msvc@4.50.0': optional: true @@ -9712,11 +9945,11 @@ snapshots: dependencies: '@tiptap/core': 2.26.1(@tiptap/pm@2.26.1) - '@tiptap/extension-collaboration@2.26.1(@tiptap/core@2.26.1(@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-collaboration@2.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)(y-prosemirror@1.3.6(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.26.1(@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) + y-prosemirror: 1.3.6(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.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))': dependencies: @@ -10171,14 +10404,14 @@ snapshots: dependencies: '@types/node': 20.19.11 - '@typescript-eslint/eslint-plugin@8.40.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 '@typescript-eslint/parser': 8.40.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.40.0 - '@typescript-eslint/type-utils': 8.40.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/utils': 8.40.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.40.0 + '@typescript-eslint/scope-manager': 8.38.0 + '@typescript-eslint/type-utils': 8.38.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/utils': 8.38.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.38.0 eslint: 8.57.1 graphemer: 1.4.0 ignore: 7.0.5 @@ -10200,6 +10433,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/project-service@8.38.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@5.8.3) + '@typescript-eslint/types': 8.40.0 + debug: 4.4.1(supports-color@5.5.0) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/project-service@8.40.0(typescript@5.8.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@5.8.3) @@ -10209,20 +10451,29 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/scope-manager@8.38.0': + dependencies: + '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/visitor-keys': 8.38.0 + '@typescript-eslint/scope-manager@8.40.0': dependencies: '@typescript-eslint/types': 8.40.0 '@typescript-eslint/visitor-keys': 8.40.0 + '@typescript-eslint/tsconfig-utils@8.38.0(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + '@typescript-eslint/tsconfig-utils@8.40.0(typescript@5.8.3)': dependencies: typescript: 5.8.3 - '@typescript-eslint/type-utils@8.40.0(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.38.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.40.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.38.0(eslint@8.57.1)(typescript@5.8.3) debug: 4.4.1(supports-color@5.5.0) eslint: 8.57.1 ts-api-utils: 2.1.0(typescript@5.8.3) @@ -10230,8 +10481,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/types@8.38.0': {} + '@typescript-eslint/types@8.40.0': {} + '@typescript-eslint/typescript-estree@8.38.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/project-service': 8.38.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3) + '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/visitor-keys': 8.38.0 + debug: 4.4.1(supports-color@5.5.0) + 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.40.0(typescript@5.8.3)': dependencies: '@typescript-eslint/project-service': 8.40.0(typescript@5.8.3) @@ -10248,17 +10517,22 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.40.0(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/utils@8.38.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.40.0 - '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.38.0 + '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) eslint: 8.57.1 typescript: 5.8.3 transitivePeerDependencies: - supports-color + '@typescript-eslint/visitor-keys@8.38.0': + dependencies: + '@typescript-eslint/types': 8.38.0 + eslint-visitor-keys: 4.2.1 + '@typescript-eslint/visitor-keys@8.40.0': dependencies: '@typescript-eslint/types': 8.40.0 @@ -10525,7 +10799,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.2.0: {} + ansi-regex@6.1.0: {} ansi-styles@3.2.1: dependencies: @@ -10653,7 +10927,7 @@ snapshots: autoprefixer@10.4.14(postcss@8.5.6): dependencies: - browserslist: 4.25.3 + browserslist: 4.25.2 caniuse-lite: 1.0.30001735 fraction.js: 4.3.7 normalize-range: 0.1.2 @@ -10663,7 +10937,7 @@ snapshots: autoprefixer@10.4.21(postcss@8.5.6): dependencies: - browserslist: 4.25.3 + browserslist: 4.25.2 caniuse-lite: 1.0.30001735 fraction.js: 4.3.7 normalize-range: 0.1.2 @@ -10758,12 +11032,12 @@ snapshots: dependencies: pako: 1.0.11 - browserslist@4.25.3: + browserslist@4.25.2: dependencies: caniuse-lite: 1.0.30001735 - electron-to-chromium: 1.5.207 + electron-to-chromium: 1.5.204 node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.3) + update-browserslist-db: 1.1.3(browserslist@4.25.2) buffer-from@1.1.2: {} @@ -10807,7 +11081,7 @@ snapshots: camel-case@4.1.2: dependencies: pascal-case: 3.1.2 - tslib: 2.5.3 + tslib: 2.8.1 camelcase-css@2.0.1: {} @@ -10816,7 +11090,7 @@ snapshots: capital-case@1.0.4: dependencies: no-case: 3.0.4 - tslib: 2.5.3 + tslib: 2.8.1 upper-case-first: 2.0.2 case-sensitive-paths-webpack-plugin@2.4.0: {} @@ -10858,7 +11132,7 @@ snapshots: path-case: 3.0.4 sentence-case: 3.0.4 snake-case: 3.0.4 - tslib: 2.5.3 + tslib: 2.8.1 character-entities@2.0.2: {} @@ -10986,7 +11260,7 @@ snapshots: compute-scroll-into-view@3.1.1: {} - concurrently@9.2.0: + concurrently@9.1.2: dependencies: chalk: 4.1.2 lodash: 4.17.21 @@ -11001,7 +11275,7 @@ snapshots: constant-case@3.0.4: dependencies: no-case: 3.0.4 - tslib: 2.5.3 + tslib: 2.8.1 upper-case: 2.0.2 constants-browserify@1.0.0: {} @@ -11325,7 +11599,7 @@ snapshots: dot-case@3.0.4: dependencies: no-case: 3.0.4 - tslib: 2.5.3 + tslib: 2.8.1 dotenv@16.0.3: {} @@ -11341,13 +11615,13 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.207: {} + electron-to-chromium@1.5.204: {} element-resize-detector@1.2.4: dependencies: batch-processor: 1.0.0 - emoji-picker-react@4.13.2(react@18.3.1): + emoji-picker-react@4.12.2(react@18.3.1): dependencies: flairup: 1.0.0 react: 18.3.1 @@ -11543,16 +11817,16 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@14.2.32(eslint@8.57.1)(typescript@5.8.3): + eslint-config-next@14.2.31(eslint@8.57.1)(typescript@5.8.3): dependencies: - '@next/eslint-plugin-next': 14.2.32 + '@next/eslint-plugin-next': 14.2.31 '@rushstack/eslint-patch': 1.12.0 - '@typescript-eslint/eslint-plugin': 8.40.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 8.38.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/parser': 8.40.0(eslint@8.57.1)(typescript@5.8.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.37.5(eslint@8.57.1) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.1) @@ -11580,7 +11854,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.1(supports-color@5.5.0) @@ -11591,7 +11865,7 @@ snapshots: tinyglobby: 0.2.14 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -11602,11 +11876,11 @@ snapshots: '@typescript-eslint/parser': 8.40.0(eslint@8.57.1)(typescript@5.8.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.40.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -11686,7 +11960,7 @@ snapshots: eslint-plugin-storybook@9.1.2(eslint@8.57.1)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.8.3): dependencies: - '@typescript-eslint/utils': 8.40.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/utils': 8.38.0(eslint@8.57.1)(typescript@5.8.3) eslint: 8.57.1 storybook: 9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)) transitivePeerDependencies: @@ -11881,7 +12155,7 @@ snapshots: dependencies: format: 0.2.2 - fdir@6.5.0(picomatch@4.0.3): + fdir@6.4.6(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -12171,7 +12445,7 @@ snapshots: header-case@2.0.4: dependencies: capital-case: 1.0.4 - tslib: 2.5.3 + tslib: 2.8.1 helmet@7.2.0: {} @@ -12321,7 +12595,7 @@ snapshots: transitivePeerDependencies: - supports-color - ioredis@5.7.0: + ioredis@5.6.1: dependencies: '@ioredis/commands': 1.3.0 cluster-key-slot: 1.1.2 @@ -12487,7 +12761,7 @@ snapshots: isexe@2.0.0: {} - isomorphic-dompurify@2.26.0: + isomorphic-dompurify@2.25.0: dependencies: dompurify: 3.2.6 jsdom: 26.1.0 @@ -12695,7 +12969,7 @@ snapshots: lower-case@2.0.2: dependencies: - tslib: 2.5.3 + tslib: 2.8.1 lowlight@2.9.0: dependencies: @@ -12723,7 +12997,7 @@ snapshots: magic-string@0.30.17: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.5.4 make-dir@3.1.0: dependencies: @@ -12977,27 +13251,27 @@ snapshots: minipass@7.1.2: {} - mobx-react-lite@4.1.0(mobx@6.13.7)(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.13.7 + mobx: 6.12.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.2.0(mobx@6.13.7)(react-dom@18.3.1(react@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.13.7 - mobx-react-lite: 4.1.0(mobx@6.13.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + mobx: 6.12.0 + 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) - mobx-utils@6.1.1(mobx@6.13.7): + mobx-utils@6.0.8(mobx@6.12.0): dependencies: - mobx: 6.13.7 + mobx: 6.12.0 - mobx@6.13.7: {} + mobx@6.12.0: {} morgan@1.10.1: dependencies: @@ -13067,7 +13341,7 @@ snapshots: no-case@3.0.4: dependencies: lower-case: 2.0.2 - tslib: 2.5.3 + tslib: 2.8.1 node-abort-controller@3.1.1: {} @@ -13250,7 +13524,7 @@ snapshots: param-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.5.3 + tslib: 2.8.1 parent-module@1.0.1: dependencies: @@ -13274,14 +13548,14 @@ snapshots: pascal-case@3.1.2: dependencies: no-case: 3.0.4 - tslib: 2.5.3 + tslib: 2.8.1 path-browserify@1.0.1: {} path-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.5.3 + tslib: 2.8.1 path-exists@4.0.0: {} @@ -13485,7 +13759,7 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - posthog-js@1.260.1: + posthog-js@1.255.1: dependencies: core-js: 3.45.0 fflate: 0.4.8 @@ -14028,6 +14302,32 @@ snapshots: dependencies: glob: 7.2.3 + rollup@4.45.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.45.1 + '@rollup/rollup-android-arm64': 4.45.1 + '@rollup/rollup-darwin-arm64': 4.45.1 + '@rollup/rollup-darwin-x64': 4.45.1 + '@rollup/rollup-freebsd-arm64': 4.45.1 + '@rollup/rollup-freebsd-x64': 4.45.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.45.1 + '@rollup/rollup-linux-arm-musleabihf': 4.45.1 + '@rollup/rollup-linux-arm64-gnu': 4.45.1 + '@rollup/rollup-linux-arm64-musl': 4.45.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.45.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.45.1 + '@rollup/rollup-linux-riscv64-gnu': 4.45.1 + '@rollup/rollup-linux-riscv64-musl': 4.45.1 + '@rollup/rollup-linux-s390x-gnu': 4.45.1 + '@rollup/rollup-linux-x64-gnu': 4.45.1 + '@rollup/rollup-linux-x64-musl': 4.45.1 + '@rollup/rollup-win32-arm64-msvc': 4.45.1 + '@rollup/rollup-win32-ia32-msvc': 4.45.1 + '@rollup/rollup-win32-x64-msvc': 4.45.1 + fsevents: 2.3.3 + rollup@4.50.0: dependencies: '@types/estree': 1.0.8 @@ -14155,7 +14455,7 @@ snapshots: sentence-case@3.0.4: dependencies: no-case: 3.0.4 - tslib: 2.5.3 + tslib: 2.8.1 upper-case-first: 2.0.2 serialize-javascript@6.0.2: @@ -14276,7 +14576,7 @@ snapshots: snake-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.5.3 + tslib: 2.8.1 sonic-boom@2.8.0: dependencies: @@ -14431,7 +14731,7 @@ snapshots: strip-ansi@7.1.0: dependencies: - ansi-regex: 6.2.0 + ansi-regex: 6.1.0 strip-bom@3.0.0: {} @@ -14492,9 +14792,9 @@ snapshots: '@swc/counter': 0.1.3 webpack: 5.101.3(@swc/core@1.13.3(@swc/helpers@0.5.17))(esbuild@0.25.0) - swr@2.3.6(react@18.3.1): + swr@2.2.4(react@18.3.1): dependencies: - dequal: 2.0.3 + client-only: 0.0.1 react: 18.3.1 use-sync-external-store: 1.5.0(react@18.3.1) @@ -14541,7 +14841,7 @@ snapshots: terser-webpack-plugin@5.3.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(esbuild@0.25.0)(webpack@5.101.3(@swc/core@1.13.3(@swc/helpers@0.5.17))(esbuild@0.25.0)): dependencies: - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.29 jest-worker: 27.5.1 schema-utils: 4.3.2 serialize-javascript: 6.0.2 @@ -14586,7 +14886,7 @@ snapshots: tinyglobby@0.2.14: dependencies: - fdir: 6.5.0(picomatch@4.0.3) + fdir: 6.4.6(picomatch@4.0.3) picomatch: 4.0.3 tinyrainbow@1.2.0: {} @@ -14725,7 +15025,7 @@ snapshots: picocolors: 1.1.1 postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.8.1) resolve-from: 5.0.0 - rollup: 4.50.0 + rollup: 4.45.1 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tinyexec: 0.3.2 @@ -14911,19 +15211,19 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 - update-browserslist-db@1.1.3(browserslist@4.25.3): + update-browserslist-db@1.1.3(browserslist@4.25.2): dependencies: - browserslist: 4.25.3 + browserslist: 4.25.2 escalade: 3.2.0 picocolors: 1.1.1 upper-case-first@2.0.2: dependencies: - tslib: 2.5.3 + tslib: 2.8.1 upper-case@2.0.2: dependencies: - tslib: 2.5.3 + tslib: 2.8.1 uri-js@4.4.1: dependencies: @@ -15027,7 +15327,7 @@ snapshots: vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1): dependencies: esbuild: 0.25.0 - fdir: 6.5.0(picomatch@4.0.3) + fdir: 6.4.6(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 rollup: 4.50.0 @@ -15092,7 +15392,7 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.25.3 + browserslist: 4.25.2 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.3 es-module-lexer: 1.7.0 @@ -15230,7 +15530,7 @@ snapshots: lib0: 0.2.114 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): + y-prosemirror@1.3.6(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.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index e2a7e56247..e01ec808d8 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -5,12 +5,23 @@ packages: - "!apps/proxy" catalog: + axios: 1.11.0 + mobx: 6.12.0 + mobx-react: 9.1.1 + mobx-utils: 6.0.8 + lodash: 4.17.21 + "@types/lodash": 4.17.20 + lucide-react: 0.469.0 + next: 14.2.32 + sharp: 0.33.5 + swr: 2.2.4 react: 18.3.1 react-dom: 18.3.1 "@types/react": 18.3.11 "@types/react-dom": 18.3.1 typescript: 5.8.3 tsup: 8.4.0 + uuid: 10.0.0 onlyBuiltDependencies: - turbo From 91f0228b5fe98b7bc82dae3025d0cda50a8e8b9a Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Tue, 2 Sep 2025 22:39:42 +0530 Subject: [PATCH 071/138] [WEB-4838] fix: github logo theme #7709 --- apps/space/core/components/account/auth-forms/auth-root.tsx | 2 +- apps/web/core/components/account/auth-forms/auth-root.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/space/core/components/account/auth-forms/auth-root.tsx b/apps/space/core/components/account/auth-forms/auth-root.tsx index c5ccaa3c8f..e71a3a08de 100644 --- a/apps/space/core/components/account/auth-forms/auth-root.tsx +++ b/apps/space/core/components/account/auth-forms/auth-root.tsx @@ -172,7 +172,7 @@ export const AuthRoot: FC = observer(() => { text: `${content} with GitHub`, icon: ( GitHub Logo = observer((props) => { text: `${OauthButtonContent} with GitHub`, icon: ( GitHub Logo Date: Wed, 3 Sep 2025 14:01:57 +0530 Subject: [PATCH 072/138] [WEB-4810] feat: migrate to tsdown from tsup (#7679) * feat: migrat to tsdown to tsup * fix: build scripts * fix: lock file fixes * fix: adding build process to i18n and propel packages * fix: lint warning * chore: update services module entry points * fix: lock file * fix: lock file * fix: remove tsc from build * fix: tsdown configs * fix: remove tsc step from build process --------- Co-authored-by: Aaryan Khandelwal Co-authored-by: Aaron Reisman --- apps/live/package.json | 6 +- apps/live/tsconfig.json | 2 +- apps/live/tsdown.config.ts | 7 + apps/live/tsup.config.ts | 15 - packages/constants/package.json | 6 +- packages/constants/tsdown.config.ts | 7 + packages/constants/tsup.config.ts | 13 - packages/decorators/package.json | 6 +- packages/decorators/tsdown.config.ts | 7 + packages/editor/package.json | 6 +- packages/editor/tsdown.config.ts | 7 + packages/editor/tsup.config.ts | 14 - packages/hooks/package.json | 6 +- .../tsup.config.ts => hooks/tsdown.config.ts} | 7 +- packages/hooks/tsup.config.ts | 13 - packages/i18n/package.json | 13 +- packages/i18n/src/index.ts | 2 + packages/i18n/src/locales/index.ts | 105 +++ packages/i18n/src/store/index.ts | 22 +- packages/i18n/tsdown.config.ts | 10 + packages/logger/package.json | 6 +- .../tsdown.config.ts} | 4 +- packages/logger/tsup.config.ts | 13 - packages/propel/package.json | 3 + packages/propel/tsdown.config.ts | 21 + packages/services/package.json | 13 +- packages/services/tsdown.config.ts | 7 + packages/services/tsup.config.ts | 13 - packages/types/package.json | 6 +- packages/types/tsdown.config.ts | 7 + packages/ui/package.json | 6 +- packages/ui/tsdown.config.ts | 7 + packages/ui/tsup.config.ts | 14 - packages/utils/package.json | 6 +- packages/utils/tsdown.config.ts | 7 + packages/utils/tsup.config.ts | 13 - pnpm-lock.yaml | 780 +++++++++--------- pnpm-workspace.yaml | 2 +- 38 files changed, 663 insertions(+), 539 deletions(-) create mode 100644 apps/live/tsdown.config.ts delete mode 100644 apps/live/tsup.config.ts create mode 100644 packages/constants/tsdown.config.ts delete mode 100644 packages/constants/tsup.config.ts create mode 100644 packages/decorators/tsdown.config.ts create mode 100644 packages/editor/tsdown.config.ts delete mode 100644 packages/editor/tsup.config.ts rename packages/{decorators/tsup.config.ts => hooks/tsdown.config.ts} (56%) delete mode 100644 packages/hooks/tsup.config.ts create mode 100644 packages/i18n/src/locales/index.ts create mode 100644 packages/i18n/tsdown.config.ts rename packages/{types/tsup.config.ts => logger/tsdown.config.ts} (69%) delete mode 100644 packages/logger/tsup.config.ts create mode 100644 packages/propel/tsdown.config.ts create mode 100644 packages/services/tsdown.config.ts delete mode 100644 packages/services/tsup.config.ts create mode 100644 packages/types/tsdown.config.ts create mode 100644 packages/ui/tsdown.config.ts delete mode 100644 packages/ui/tsup.config.ts create mode 100644 packages/utils/tsdown.config.ts delete mode 100644 packages/utils/tsup.config.ts diff --git a/apps/live/package.json b/apps/live/package.json index 5d3435e84f..97e5c50d7d 100644 --- a/apps/live/package.json +++ b/apps/live/package.json @@ -7,8 +7,8 @@ "private": true, "type": "module", "scripts": { - "dev": "tsup --watch --onSuccess 'node --env-file=.env dist/server.js'", - "build": "tsc --noEmit && tsup", + "build": "tsdown", + "dev": "tsdown --watch", "start": "node --env-file=.env dist/server.js", "check:lint": "eslint . --max-warnings 10", "check:types": "tsc --noEmit", @@ -58,7 +58,7 @@ "concurrently": "^9.0.1", "nodemon": "^3.1.7", "ts-node": "^10.9.2", - "tsup": "catalog:", + "tsdown": "catalog:", "typescript": "catalog:", "ws": "^8.18.3" } diff --git a/apps/live/tsconfig.json b/apps/live/tsconfig.json index 810a68a5cb..57d47a3d86 100644 --- a/apps/live/tsconfig.json +++ b/apps/live/tsconfig.json @@ -21,6 +21,6 @@ "emitDecoratorMetadata": true, "sourceRoot": "/" }, - "include": ["src/**/*.ts", "tsup.config.ts"], + "include": ["src/**/*.ts", "tsdown.config.ts"], "exclude": ["./dist", "./build", "./node_modules"] } diff --git a/apps/live/tsdown.config.ts b/apps/live/tsdown.config.ts new file mode 100644 index 0000000000..2b97503a6e --- /dev/null +++ b/apps/live/tsdown.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["src/server.ts"], + outDir: "dist", + format: ["esm", "cjs"], +}); diff --git a/apps/live/tsup.config.ts b/apps/live/tsup.config.ts deleted file mode 100644 index 05fbe7e86c..0000000000 --- a/apps/live/tsup.config.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { defineConfig } from "tsup"; - -export default defineConfig({ - entry: ["src/server.ts"], - format: ["esm", "cjs"], - dts: true, - splitting: false, - sourcemap: true, - minify: false, - target: "node18", - outDir: "dist", - env: { - NODE_ENV: process.env.NODE_ENV || "development", - }, -}); diff --git a/packages/constants/package.json b/packages/constants/package.json index 1ab2c608ef..eaf50475ee 100644 --- a/packages/constants/package.json +++ b/packages/constants/package.json @@ -17,8 +17,8 @@ } }, "scripts": { - "dev": "tsup --watch", - "build": "tsc --noEmit && tsup", + "dev": "tsdown --watch", + "build": "tsdown", "check:lint": "eslint . --max-warnings 0", "check:types": "tsc --noEmit", "check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"", @@ -34,7 +34,7 @@ "@plane/typescript-config": "workspace:*", "@types/node": "^22.5.4", "@types/react": "catalog:", - "tsup": "catalog:", + "tsdown": "catalog:", "typescript": "catalog:" } } diff --git a/packages/constants/tsdown.config.ts b/packages/constants/tsdown.config.ts new file mode 100644 index 0000000000..2d3ec61b6d --- /dev/null +++ b/packages/constants/tsdown.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["src/index.ts"], + outDir: "dist", + format: ["esm", "cjs"], +}); diff --git a/packages/constants/tsup.config.ts b/packages/constants/tsup.config.ts deleted file mode 100644 index 79fe86a0e4..0000000000 --- a/packages/constants/tsup.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { defineConfig } from "tsup"; - -export default defineConfig({ - entry: ["src/index.ts"], - outDir: "dist", - format: ["esm", "cjs"], - dts: true, - clean: true, - minify: true, - splitting: true, - treeshake: true, - external: ["@plane/types"], -}); diff --git a/packages/decorators/package.json b/packages/decorators/package.json index e74c37da90..434b6d64f6 100644 --- a/packages/decorators/package.json +++ b/packages/decorators/package.json @@ -11,8 +11,8 @@ "dist/**" ], "scripts": { - "build": "tsc --noEmit && tsup --minify", - "dev": "tsup --watch", + "build": "tsdown", + "dev": "tsdown --watch", "check:lint": "eslint . --max-warnings 1", "check:types": "tsc --noEmit", "check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"", @@ -27,7 +27,7 @@ "@types/node": "^20.14.9", "@types/ws": "^8.5.10", "reflect-metadata": "^0.2.2", - "tsup": "catalog:", + "tsdown": "catalog:", "typescript": "catalog:" } } diff --git a/packages/decorators/tsdown.config.ts b/packages/decorators/tsdown.config.ts new file mode 100644 index 0000000000..2d3ec61b6d --- /dev/null +++ b/packages/decorators/tsdown.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["src/index.ts"], + outDir: "dist", + format: ["esm", "cjs"], +}); diff --git a/packages/editor/package.json b/packages/editor/package.json index 6a67c2a4b3..1d838d73ab 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -22,8 +22,8 @@ } }, "scripts": { - "build": "tsc && tsup --minify", - "dev": "tsup --watch", + "build": "tsdown", + "dev": "tsdown --watch", "check:lint": "eslint . --max-warnings 30", "check:types": "tsc --noEmit", "check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"", @@ -88,7 +88,7 @@ "@types/react": "catalog:", "@types/react-dom": "catalog:", "postcss": "^8.4.38", - "tsup": "catalog:", + "tsdown": "catalog:", "typescript": "catalog:" }, "keywords": [ diff --git a/packages/editor/tsdown.config.ts b/packages/editor/tsdown.config.ts new file mode 100644 index 0000000000..ee7d0cdf88 --- /dev/null +++ b/packages/editor/tsdown.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["src/index.ts", "src/lib.ts"], + outDir: "dist", + format: ["esm", "cjs"], +}); diff --git a/packages/editor/tsup.config.ts b/packages/editor/tsup.config.ts deleted file mode 100644 index 1089c00b12..0000000000 --- a/packages/editor/tsup.config.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { defineConfig } from "tsup"; - -export default defineConfig({ - entry: ["src/index.ts", "src/lib.ts"], - outDir: "dist", - format: ["esm", "cjs"], - dts: true, - clean: true, - external: ["react", "react-dom"], - injectStyle: true, - splitting: true, - treeshake: true, - minify: true, -}); diff --git a/packages/hooks/package.json b/packages/hooks/package.json index 4040152ba5..0c3bb7b8f6 100644 --- a/packages/hooks/package.json +++ b/packages/hooks/package.json @@ -11,8 +11,8 @@ "dist/**" ], "scripts": { - "build": "tsup --minify", - "dev": "tsup --watch", + "build": "tsdown", + "dev": "tsdown --watch", "check:lint": "eslint . --max-warnings 6", "check:types": "tsc --noEmit", "check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"", @@ -28,7 +28,7 @@ "@plane/typescript-config": "workspace:*", "@types/node": "^22.5.4", "@types/react": "catalog:", - "tsup": "catalog:", + "tsdown": "catalog:", "typescript": "catalog:" } } diff --git a/packages/decorators/tsup.config.ts b/packages/hooks/tsdown.config.ts similarity index 56% rename from packages/decorators/tsup.config.ts rename to packages/hooks/tsdown.config.ts index 6ca0429534..1a894869b4 100644 --- a/packages/decorators/tsup.config.ts +++ b/packages/hooks/tsdown.config.ts @@ -1,12 +1,11 @@ -import { defineConfig } from "tsup"; +import { defineConfig } from "tsdown"; export default defineConfig({ entry: ["src/index.ts"], outDir: "dist", format: ["esm", "cjs"], + external: ["react", "react-dom"], dts: true, + sourcemap: true, clean: true, - minify: true, - external: ["express", "ws"], - treeshake: true, }); diff --git a/packages/hooks/tsup.config.ts b/packages/hooks/tsup.config.ts deleted file mode 100644 index 6566c82ef9..0000000000 --- a/packages/hooks/tsup.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { defineConfig } from "tsup"; - -export default defineConfig({ - entry: ["src/index.ts"], - outDir: "dist", - format: ["esm", "cjs"], - dts: true, - clean: true, - minify: true, - splitting: true, - treeshake: true, - external: ["react"], -}); diff --git a/packages/i18n/package.json b/packages/i18n/package.json index e3b875d2f2..ccb0d4880a 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -4,10 +4,13 @@ "license": "AGPL-3.0", "description": "I18n shared across multiple apps internally", "private": true, - "main": "./src/index.ts", - "types": "./src/index.ts", + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", "scripts": { - "check:lint": "eslint . --max-warnings 0", + "dev": "tsdown --watch", + "build": "tsdown", + "check:lint": "eslint . --max-warnings 2", "check:types": "tsc --noEmit", "check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"", "fix:lint": "eslint . --fix", @@ -19,7 +22,8 @@ "intl-messageformat": "^10.7.11", "mobx": "catalog:", "mobx-react": "catalog:", - "lodash": "catalog:" + "lodash": "catalog:", + "react": "catalog:" }, "devDependencies": { "@plane/eslint-config": "workspace:*", @@ -27,6 +31,7 @@ "@types/node": "^22.5.4", "@types/lodash": "catalog:", "@types/react": "catalog:", + "tsdown": "catalog:", "typescript": "catalog:" } } diff --git a/packages/i18n/src/index.ts b/packages/i18n/src/index.ts index a93747a899..b2049544e6 100644 --- a/packages/i18n/src/index.ts +++ b/packages/i18n/src/index.ts @@ -2,3 +2,5 @@ export * from "./constants"; export * from "./context"; export * from "./hooks"; export * from "./types"; +export * from "./store"; +export * from "./locales"; diff --git a/packages/i18n/src/locales/index.ts b/packages/i18n/src/locales/index.ts new file mode 100644 index 0000000000..86ecc6bd5f --- /dev/null +++ b/packages/i18n/src/locales/index.ts @@ -0,0 +1,105 @@ +// Export all locale files to make them accessible from the package root +export { default as enCore } from "./en/core.json"; +export { default as enTranslations } from "./en/translations.json"; +export { default as enAccessibility } from "./en/accessibility.json"; +export { default as enEditor } from "./en/editor.json"; + +// Export locale data for all supported languages +export const locales = { + en: { + core: () => import("./en/core.json"), + translations: () => import("./en/translations.json"), + accessibility: () => import("./en/accessibility.json"), + editor: () => import("./en/editor.json"), + }, + fr: { + translations: () => import("./fr/translations.json"), + accessibility: () => import("./fr/accessibility.json"), + editor: () => import("./fr/editor.json"), + }, + es: { + translations: () => import("./es/translations.json"), + accessibility: () => import("./es/accessibility.json"), + editor: () => import("./es/editor.json"), + }, + ja: { + translations: () => import("./ja/translations.json"), + accessibility: () => import("./ja/accessibility.json"), + editor: () => import("./ja/editor.json"), + }, + "zh-CN": { + translations: () => import("./zh-CN/translations.json"), + accessibility: () => import("./zh-CN/accessibility.json"), + editor: () => import("./zh-CN/editor.json"), + }, + "zh-TW": { + translations: () => import("./zh-TW/translations.json"), + accessibility: () => import("./zh-TW/accessibility.json"), + editor: () => import("./zh-TW/editor.json"), + }, + ru: { + translations: () => import("./ru/translations.json"), + accessibility: () => import("./ru/accessibility.json"), + editor: () => import("./ru/editor.json"), + }, + it: { + translations: () => import("./it/translations.json"), + accessibility: () => import("./it/accessibility.json"), + editor: () => import("./it/editor.json"), + }, + cs: { + translations: () => import("./cs/translations.json"), + accessibility: () => import("./cs/accessibility.json"), + editor: () => import("./cs/editor.json"), + }, + sk: { + translations: () => import("./sk/translations.json"), + accessibility: () => import("./sk/accessibility.json"), + editor: () => import("./sk/editor.json"), + }, + de: { + translations: () => import("./de/translations.json"), + accessibility: () => import("./de/accessibility.json"), + editor: () => import("./de/editor.json"), + }, + ua: { + translations: () => import("./ua/translations.json"), + accessibility: () => import("./ua/accessibility.json"), + editor: () => import("./ua/editor.json"), + }, + pl: { + translations: () => import("./pl/translations.json"), + accessibility: () => import("./pl/accessibility.json"), + editor: () => import("./pl/editor.json"), + }, + ko: { + translations: () => import("./ko/translations.json"), + accessibility: () => import("./ko/accessibility.json"), + editor: () => import("./ko/editor.json"), + }, + "pt-BR": { + translations: () => import("./pt-BR/translations.json"), + accessibility: () => import("./pt-BR/accessibility.json"), + editor: () => import("./pt-BR/editor.json"), + }, + id: { + translations: () => import("./id/translations.json"), + accessibility: () => import("./id/accessibility.json"), + editor: () => import("./id/editor.json"), + }, + ro: { + translations: () => import("./ro/translations.json"), + accessibility: () => import("./ro/accessibility.json"), + editor: () => import("./ro/editor.json"), + }, + "vi-VN": { + translations: () => import("./vi-VN/translations.json"), + accessibility: () => import("./vi-VN/accessibility.json"), + editor: () => import("./vi-VN/editor.json"), + }, + "tr-TR": { + translations: () => import("./tr-TR/translations.json"), + accessibility: () => import("./tr-TR/accessibility.json"), + editor: () => import("./tr-TR/editor.json"), + }, +}; diff --git a/packages/i18n/src/store/index.ts b/packages/i18n/src/store/index.ts index 2873c87d14..3816c2d997 100644 --- a/packages/i18n/src/store/index.ts +++ b/packages/i18n/src/store/index.ts @@ -5,7 +5,7 @@ import { makeAutoObservable, runInAction } from "mobx"; // constants import { FALLBACK_LANGUAGE, SUPPORTED_LANGUAGES, LANGUAGE_STORAGE_KEY, ETranslationFiles } from "../constants"; // core translations imports -import coreEn from "../locales/en/core.json"; +import { enCore, locales } from "../locales"; // types import { TLanguage, ILanguageOption, ITranslations } from "../types"; @@ -17,7 +17,7 @@ import { TLanguage, ILanguageOption, ITranslations } from "../types"; export class TranslationStore { // Core translations that are always loaded private coreTranslations: ITranslations = { - en: coreEn, + en: enCore, }; // List of translations for each language private translations: ITranslations = {}; @@ -138,10 +138,24 @@ export class TranslationStore { */ private async importAndMergeFiles(language: TLanguage, files: string[]) { try { - const importPromises = files.map((file) => import(`../locales/${language}/${file}.json`)); + const localeData = locales[language as keyof typeof locales]; + if (!localeData) { + throw new Error(`Locale data not found for language: ${language}`); + } + + // Filter out files that don't exist for this language + const availableFiles = files.filter((file) => { + const fileKey = file as keyof typeof localeData; + return fileKey in localeData; + }); + + const importPromises = availableFiles.map((file) => { + const fileKey = file as keyof typeof localeData; + return localeData[fileKey](); + }); const modules = await Promise.all(importPromises); - const merged = modules.reduce((acc, module) => merge(acc, module.default), {}); + const merged = modules.reduce((acc: any, module: any) => merge(acc, module.default), {}); return { default: merged }; } catch (error) { throw new Error(`Failed to import and merge files for ${language}: ${error}`); diff --git a/packages/i18n/tsdown.config.ts b/packages/i18n/tsdown.config.ts new file mode 100644 index 0000000000..e3281f2b10 --- /dev/null +++ b/packages/i18n/tsdown.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["src/index.ts"], + outDir: "dist", + format: ["esm", "cjs"], + dts: true, + external: ["react", "lodash", "mobx", "mobx-react", "intl-messageformat"], + sourcemap: true, +}); diff --git a/packages/logger/package.json b/packages/logger/package.json index 5fd87571a8..ba944ab94a 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -18,8 +18,8 @@ "dist/**" ], "scripts": { - "build": "tsup --minify", - "dev": "tsup --watch", + "build": "tsdown", + "dev": "tsdown --watch", "check:lint": "eslint . --max-warnings 0", "check:types": "tsc --noEmit", "check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"", @@ -36,7 +36,7 @@ "@plane/typescript-config": "workspace:*", "@types/express": "^4.17.21", "@types/node": "^20.14.9", - "tsup": "catalog:", + "tsdown": "catalog:", "typescript": "catalog:" } } diff --git a/packages/types/tsup.config.ts b/packages/logger/tsdown.config.ts similarity index 69% rename from packages/types/tsup.config.ts rename to packages/logger/tsdown.config.ts index 04ad414258..194593e86c 100644 --- a/packages/types/tsup.config.ts +++ b/packages/logger/tsdown.config.ts @@ -1,10 +1,10 @@ -import { defineConfig } from "tsup"; +import { defineConfig } from "tsdown"; export default defineConfig({ entry: ["src/index.ts"], outDir: "dist", format: ["esm", "cjs"], dts: true, + sourcemap: true, clean: true, - minify: true, }); diff --git a/packages/logger/tsup.config.ts b/packages/logger/tsup.config.ts deleted file mode 100644 index 01d63fe278..0000000000 --- a/packages/logger/tsup.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { defineConfig } from "tsup"; - -export default defineConfig({ - entry: ["src/index.ts"], - outDir: "dist", - format: ["esm", "cjs"], - dts: true, - clean: true, - minify: true, - splitting: true, - treeshake: true, - external: ["winston", "winston-daily-rotate-file"], -}); diff --git a/packages/propel/package.json b/packages/propel/package.json index 886ba17c84..3e7e979669 100644 --- a/packages/propel/package.json +++ b/packages/propel/package.json @@ -4,6 +4,8 @@ "private": true, "license": "AGPL-3.0", "scripts": { + "dev": "tsdown --watch", + "build": "tsdown", "check:lint": "eslint . --max-warnings 7", "check:types": "tsc --noEmit", "check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"", @@ -57,6 +59,7 @@ "@types/react-dom": "catalog:", "eslint-plugin-storybook": "^9.1.2", "storybook": "^9.1.2", + "tsdown": "catalog:", "typescript": "catalog:" } } diff --git a/packages/propel/tsdown.config.ts b/packages/propel/tsdown.config.ts new file mode 100644 index 0000000000..83abd28d74 --- /dev/null +++ b/packages/propel/tsdown.config.ts @@ -0,0 +1,21 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: [ + "src/avatar/index.ts", + "src/charts/index.ts", + "src/dialog/index.ts", + "src/menu/index.ts", + "src/table/index.ts", + "src/tabs/index.ts", + "src/popover/index.ts", + "src/command/index.ts", + "src/combobox/index.ts", + "src/tooltip/index.ts", + "src/card/index.ts", + "src/switch/index.ts", + ], + outDir: "dist", + format: ["esm", "cjs"], + dts: true, +}); diff --git a/packages/services/package.json b/packages/services/package.json index a3c9a1a390..3f63f489fc 100644 --- a/packages/services/package.json +++ b/packages/services/package.json @@ -3,10 +3,15 @@ "version": "1.0.0", "license": "AGPL-3.0", "private": true, - "main": "./src/index.ts", + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "files": [ + "dist/**" + ], "scripts": { - "build": "tsc --noEmit && tsup --minify", - "dev": "tsup --watch", + "build": "tsdown", + "dev": "tsdown --watch", "check:lint": "eslint . --max-warnings 62", "check:types": "tsc --noEmit", "check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"", @@ -22,7 +27,7 @@ "devDependencies": { "@plane/eslint-config": "workspace:*", "@plane/typescript-config": "workspace:*", - "tsup": "catalog:", + "tsdown": "catalog:", "typescript": "catalog:" } } diff --git a/packages/services/tsdown.config.ts b/packages/services/tsdown.config.ts new file mode 100644 index 0000000000..2d3ec61b6d --- /dev/null +++ b/packages/services/tsdown.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["src/index.ts"], + outDir: "dist", + format: ["esm", "cjs"], +}); diff --git a/packages/services/tsup.config.ts b/packages/services/tsup.config.ts deleted file mode 100644 index cb6ac8b2a0..0000000000 --- a/packages/services/tsup.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { defineConfig } from "tsup"; - -export default defineConfig({ - entry: ["src/index.ts"], - outDir: "dist", - format: ["esm", "cjs"], - dts: true, - clean: true, - minify: true, - splitting: true, - treeshake: true, - external: ["axios"], -}); diff --git a/packages/types/package.json b/packages/types/package.json index 394e55aee2..57a6dc7b33 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -17,8 +17,8 @@ } }, "scripts": { - "dev": "tsup --watch", - "build": "tsc --noEmit && tsup --minify", + "dev": "tsdown --watch", + "build": "tsdown", "check:lint": "eslint . --max-warnings 36", "check:types": "tsc --noEmit", "check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"", @@ -35,7 +35,7 @@ "@plane/typescript-config": "workspace:*", "@types/react": "catalog:", "@types/react-dom": "catalog:", - "tsup": "catalog:", + "tsdown": "catalog:", "typescript": "catalog:" } } diff --git a/packages/types/tsdown.config.ts b/packages/types/tsdown.config.ts new file mode 100644 index 0000000000..2d3ec61b6d --- /dev/null +++ b/packages/types/tsdown.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["src/index.ts"], + outDir: "dist", + format: ["esm", "cjs"], +}); diff --git a/packages/ui/package.json b/packages/ui/package.json index cb7e6e2d36..5e3b86652e 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -12,8 +12,8 @@ "module": "./dist/index.mjs", "types": "./dist/index.d.ts", "scripts": { - "build": "tsup --minify", - "dev": "tsup --watch", + "build": "tsdown", + "dev": "tsdown --watch", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build", "postcss": "postcss styles/globals.css -o styles/output.css --watch", @@ -76,7 +76,7 @@ "postcss-cli": "^11.0.0", "postcss-nested": "^6.0.1", "storybook": "^8.1.1", - "tsup": "catalog:", + "tsdown": "catalog:", "typescript": "catalog:" } } diff --git a/packages/ui/tsdown.config.ts b/packages/ui/tsdown.config.ts new file mode 100644 index 0000000000..2d3ec61b6d --- /dev/null +++ b/packages/ui/tsdown.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["src/index.ts"], + outDir: "dist", + format: ["esm", "cjs"], +}); diff --git a/packages/ui/tsup.config.ts b/packages/ui/tsup.config.ts deleted file mode 100644 index 923124855e..0000000000 --- a/packages/ui/tsup.config.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { defineConfig } from "tsup"; - -export default defineConfig({ - entry: ["src/index.ts"], - outDir: "dist", - format: ["esm", "cjs"], - dts: true, - clean: true, - minify: true, - splitting: true, - treeshake: true, - external: ["react", "@plane/types"], - injectStyle: true, -}); diff --git a/packages/utils/package.json b/packages/utils/package.json index fbc669c687..4089612691 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -11,8 +11,8 @@ "dist" ], "scripts": { - "build": "tsc --noEmit && tsup --minify", - "dev": "tsup --watch", + "build": "tsdown", + "dev": "tsdown --watch", "check:lint": "eslint . --max-warnings 20", "check:types": "tsc --noEmit", "check:format": "prettier --check \"**/*.{ts,tsx,md,json,css,scss}\"", @@ -40,7 +40,7 @@ "@types/node": "^22.5.4", "@types/react": "catalog:", "@types/uuid": "^9.0.8", - "tsup": "catalog:", + "tsdown": "catalog:", "typescript": "catalog:" } } diff --git a/packages/utils/tsdown.config.ts b/packages/utils/tsdown.config.ts new file mode 100644 index 0000000000..2d3ec61b6d --- /dev/null +++ b/packages/utils/tsdown.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["src/index.ts"], + outDir: "dist", + format: ["esm", "cjs"], +}); diff --git a/packages/utils/tsup.config.ts b/packages/utils/tsup.config.ts deleted file mode 100644 index 6566c82ef9..0000000000 --- a/packages/utils/tsup.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { defineConfig } from "tsup"; - -export default defineConfig({ - entry: ["src/index.ts"], - outDir: "dist", - format: ["esm", "cjs"], - dts: true, - clean: true, - minify: true, - splitting: true, - treeshake: true, - external: ["react"], -}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d5725964da..6ab42f3d97 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -45,9 +45,9 @@ catalogs: swr: specifier: 2.2.4 version: 2.2.4 - tsup: - specifier: 8.4.0 - version: 8.4.0 + tsdown: + specifier: 0.14.2 + version: 0.14.2 uuid: specifier: 10.0.0 version: 10.0.0 @@ -290,9 +290,9 @@ importers: ts-node: specifier: ^10.9.2 version: 10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@20.19.11)(typescript@5.8.3) - tsup: + tsdown: specifier: 'catalog:' - version: 8.4.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(jiti@1.21.7)(postcss@8.5.6)(typescript@5.8.3)(yaml@2.8.1) + version: 0.14.2(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -653,9 +653,9 @@ importers: '@types/react': specifier: 'catalog:' version: 18.3.11 - tsup: + tsdown: specifier: 'catalog:' - version: 8.4.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(jiti@1.21.7)(postcss@8.5.6)(typescript@5.8.3)(yaml@2.8.1) + version: 0.14.2(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -680,9 +680,9 @@ importers: reflect-metadata: specifier: ^0.2.2 version: 0.2.2 - tsup: + tsdown: specifier: 'catalog:' - version: 8.4.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(jiti@1.21.7)(postcss@8.5.6)(typescript@5.8.3)(yaml@2.8.1) + version: 0.14.2(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -846,9 +846,9 @@ importers: postcss: specifier: ^8.4.38 version: 8.5.6 - tsup: + tsdown: specifier: 'catalog:' - version: 8.4.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(jiti@1.21.7)(postcss@8.5.6)(typescript@5.8.3)(yaml@2.8.1) + version: 0.14.2(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -904,9 +904,9 @@ importers: '@types/react': specifier: 'catalog:' version: 18.3.11 - tsup: + tsdown: specifier: 'catalog:' - version: 8.4.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(jiti@1.21.7)(postcss@8.5.6)(typescript@5.8.3)(yaml@2.8.1) + version: 0.14.2(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -928,6 +928,9 @@ importers: mobx-react: specifier: 'catalog:' version: 9.1.1(mobx@6.12.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: + specifier: 'catalog:' + version: 18.3.1 devDependencies: '@plane/eslint-config': specifier: workspace:* @@ -944,6 +947,9 @@ importers: '@types/react': specifier: 'catalog:' version: 18.3.11 + tsdown: + specifier: 'catalog:' + version: 0.14.2(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -969,9 +975,9 @@ importers: '@types/node': specifier: ^20.14.9 version: 20.19.11 - tsup: + tsdown: specifier: 'catalog:' - version: 8.4.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(jiti@1.21.7)(postcss@8.5.6)(typescript@5.8.3)(yaml@2.8.1) + version: 0.14.2(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -1035,7 +1041,7 @@ importers: version: link:../typescript-config '@storybook/react-vite': specifier: ^9.1.2 - version: 9.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.50.0)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.8.3)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)) + version: 9.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.50.0)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.8.3)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) '@types/react': specifier: 'catalog:' version: 18.3.11 @@ -1044,10 +1050,13 @@ importers: version: 18.3.1 eslint-plugin-storybook: specifier: ^9.1.2 - version: 9.1.2(eslint@8.57.1)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.8.3) + version: 9.1.2(eslint@8.57.1)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.8.3) storybook: specifier: ^9.1.2 - version: 9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)) + version: 9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) + tsdown: + specifier: 'catalog:' + version: 0.14.2(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -1070,9 +1079,9 @@ importers: '@plane/typescript-config': specifier: workspace:* version: link:../typescript-config - tsup: + tsdown: specifier: 'catalog:' - version: 8.4.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(jiti@1.21.7)(postcss@8.5.6)(typescript@5.8.3)(yaml@2.8.1) + version: 0.14.2(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -1141,9 +1150,9 @@ importers: '@types/react-dom': specifier: 'catalog:' version: 18.3.1 - tsup: + tsdown: specifier: 'catalog:' - version: 8.4.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(jiti@1.21.7)(postcss@8.5.6)(typescript@5.8.3)(yaml@2.8.1) + version: 0.14.2(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -1287,16 +1296,16 @@ importers: version: 10.4.21(postcss@8.5.6) postcss-cli: specifier: ^11.0.0 - version: 11.0.1(jiti@1.21.7)(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) storybook: specifier: ^8.1.1 version: 8.6.14(prettier@3.6.2) - tsup: + tsdown: specifier: 'catalog:' - version: 8.4.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(jiti@1.21.7)(postcss@8.5.6)(typescript@5.8.3)(yaml@2.8.1) + version: 0.14.2(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -1355,9 +1364,9 @@ importers: '@types/uuid': specifier: ^9.0.8 version: 9.0.8 - tsup: + tsdown: specifier: 'catalog:' - version: 8.4.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(jiti@1.21.7)(postcss@8.5.6)(typescript@5.8.3)(yaml@2.8.1) + version: 0.14.2(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -2133,6 +2142,9 @@ packages: '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + '@napi-rs/wasm-runtime@1.0.3': + resolution: {integrity: sha512-rZxtMsLwjdXkMUGC3WwsPwLNVqVqnTJT6MNIB6e+5fhMcSCPP0AOsNWuMQ5mdCq6HNjs/ZeWAEchpqeprqBD2Q==} + '@next/env@14.2.32': resolution: {integrity: sha512-n9mQdigI6iZ/DF6pCTwMKeWgF2e8lg7qgt5M7HXMLtyhZYMnf/u905M18sSpPmHL9MKp9JHo56C6jrD2EvWxng==} @@ -2209,6 +2221,13 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} + '@oxc-project/runtime@0.82.3': + resolution: {integrity: sha512-LNh5GlJvYHAnMurO+EyA8jJwN1rki7l3PSHuosDh2I7h00T6/u9rCkUjg/SvPmT1CZzvhuW0y+gf7jcqUy/Usg==} + engines: {node: '>=6.9.0'} + + '@oxc-project/types@0.82.3': + resolution: {integrity: sha512-6nCUxBnGX0c6qfZW5MaF6/fmu5dHJDMiMPaioKHKs5mi5+8/FHQ7WGjgQIz1zxpmceMYfdIXkOaLYE+ejbuOtA==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -2216,6 +2235,9 @@ packages: '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + '@quansync/fs@0.1.5': + resolution: {integrity: sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA==} + '@radix-ui/number@1.1.1': resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} @@ -2471,6 +2493,79 @@ packages: '@remirror/core-constants@3.0.0': resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} + '@rolldown/binding-android-arm64@1.0.0-beta.34': + resolution: {integrity: sha512-jf5GNe5jP3Sr1Tih0WKvg2bzvh5T/1TA0fn1u32xSH7ca/p5t+/QRr4VRFCV/na5vjwKEhwWrChsL2AWlY+eoA==} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-beta.34': + resolution: {integrity: sha512-2F/TqH4QuJQ34tgWxqBjFL3XV1gMzeQgUO8YRtCPGBSP0GhxtoFzsp7KqmQEothsxztlv+KhhT9Dbg3HHwHViQ==} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.34': + resolution: {integrity: sha512-E1QuFslgLWbHQ8Qli/AqUKdfg0pockQPwRxVbhNQ74SciZEZpzLaujkdmOLSccMlSXDfFCF8RPnMoRAzQ9JV8Q==} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.34': + resolution: {integrity: sha512-VS8VInNCwnkpI9WeQaWu3kVBq9ty6g7KrHdLxYMzeqz24+w9hg712TcWdqzdY6sn+24lUoMD9jTZrZ/qfVpk0g==} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.34': + resolution: {integrity: sha512-4St4emjcnULnxJYb/5ZDrH/kK/j6PcUgc3eAqH5STmTrcF+I9m/X2xvSF2a2bWv1DOQhxBewThu0KkwGHdgu5w==} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.34': + resolution: {integrity: sha512-a737FTqhFUoWfnebS2SnQ2BS50p0JdukdkUBwy2J06j4hZ6Eej0zEB8vTfAqoCjn8BQKkXBy+3Sx0IRkgwz1gA==} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.34': + resolution: {integrity: sha512-NH+FeQWKyuw0k+PbXqpFWNfvD8RPvfJk766B/njdaWz4TmiEcSB0Nb6guNw1rBpM1FmltQYb3fFnTumtC6pRfA==} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.34': + resolution: {integrity: sha512-Q3RSCivp8pNadYK8ke3hLnQk08BkpZX9BmMjgwae2FWzdxhxxUiUzd9By7kneUL0vRQ4uRnhD9VkFQ+Haeqdvw==} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.34': + resolution: {integrity: sha512-wDd/HrNcVoBhWWBUW3evJHoo7GJE/RofssBy3Dsiip05YUBmokQVrYAyrboOY4dzs/lJ7HYeBtWQ9hj8wlyF0A==} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.34': + resolution: {integrity: sha512-dH3FTEV6KTNWpYSgjSXZzeX7vLty9oBYn6R3laEdhwZftQwq030LKL+5wyQdlbX5pnbh4h127hpv3Hl1+sj8dg==} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.34': + resolution: {integrity: sha512-y5BUf+QtO0JsIDKA51FcGwvhJmv89BYjUl8AmN7jqD6k/eU55mH6RJYnxwCsODq5m7KSSTigVb6O7/GqB8wbPw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.34': + resolution: {integrity: sha512-ga5hFhdTwpaNxEiuxZHWnD3ed0GBAzbgzS5tRHpe0ObptxM1a9Xrq6TVfNQirBLwb5Y7T/FJmJi3pmdLy95ljg==} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.34': + resolution: {integrity: sha512-4/MBp9T9eRnZskxWr8EXD/xHvLhdjWaeX/qY9LPRG1JdCGV3DphkLTy5AWwIQ5jhAy2ZNJR5z2fYRlpWU0sIyQ==} + cpu: [ia32] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.34': + resolution: {integrity: sha512-7O5iUBX6HSBKlQU4WykpUoEmb0wQmonb6ziKFr3dJTHud2kzDnWMqk344T0qm3uGv9Ddq6Re/94pInxo1G2d4w==} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-beta.34': + resolution: {integrity: sha512-LyAREkZHP5pMom7c24meKmJCdhf2hEyvam2q0unr3or9ydwDL+DJ8chTF6Av/RFPb3rH8UFBdMzO5MxTZW97oA==} + '@rollup/pluginutils@5.2.0': resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} engines: {node: '>=14.0.0'} @@ -2480,171 +2575,86 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.45.1': - resolution: {integrity: sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==} - cpu: [arm] - os: [android] - '@rollup/rollup-android-arm-eabi@4.50.0': resolution: {integrity: sha512-lVgpeQyy4fWN5QYebtW4buT/4kn4p4IJ+kDNB4uYNT5b8c8DLJDg6titg20NIg7E8RWwdWZORW6vUFfrLyG3KQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.45.1': - resolution: {integrity: sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==} - cpu: [arm64] - os: [android] - '@rollup/rollup-android-arm64@4.50.0': resolution: {integrity: sha512-2O73dR4Dc9bp+wSYhviP6sDziurB5/HCym7xILKifWdE9UsOe2FtNcM+I4xZjKrfLJnq5UR8k9riB87gauiQtw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.45.1': - resolution: {integrity: sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==} - cpu: [arm64] - os: [darwin] - '@rollup/rollup-darwin-arm64@4.50.0': resolution: {integrity: sha512-vwSXQN8T4sKf1RHr1F0s98Pf8UPz7pS6P3LG9NSmuw0TVh7EmaE+5Ny7hJOZ0M2yuTctEsHHRTMi2wuHkdS6Hg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.45.1': - resolution: {integrity: sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==} - cpu: [x64] - os: [darwin] - '@rollup/rollup-darwin-x64@4.50.0': resolution: {integrity: sha512-cQp/WG8HE7BCGyFVuzUg0FNmupxC+EPZEwWu2FCGGw5WDT1o2/YlENbm5e9SMvfDFR6FRhVCBePLqj0o8MN7Vw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.45.1': - resolution: {integrity: sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==} - cpu: [arm64] - os: [freebsd] - '@rollup/rollup-freebsd-arm64@4.50.0': resolution: {integrity: sha512-UR1uTJFU/p801DvvBbtDD7z9mQL8J80xB0bR7DqW7UGQHRm/OaKzp4is7sQSdbt2pjjSS72eAtRh43hNduTnnQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.45.1': - resolution: {integrity: sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==} - cpu: [x64] - os: [freebsd] - '@rollup/rollup-freebsd-x64@4.50.0': resolution: {integrity: sha512-G/DKyS6PK0dD0+VEzH/6n/hWDNPDZSMBmqsElWnCRGrYOb2jC0VSupp7UAHHQ4+QILwkxSMaYIbQ72dktp8pKA==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.45.1': - resolution: {integrity: sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm-gnueabihf@4.50.0': resolution: {integrity: sha512-u72Mzc6jyJwKjJbZZcIYmd9bumJu7KNmHYdue43vT1rXPm2rITwmPWF0mmPzLm9/vJWxIRbao/jrQmxTO0Sm9w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.45.1': - resolution: {integrity: sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.50.0': resolution: {integrity: sha512-S4UefYdV0tnynDJV1mdkNawp0E5Qm2MtSs330IyHgaccOFrwqsvgigUD29uT+B/70PDY1eQ3t40+xf6wIvXJyg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.45.1': - resolution: {integrity: sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.50.0': resolution: {integrity: sha512-1EhkSvUQXJsIhk4msxP5nNAUWoB4MFDHhtc4gAYvnqoHlaL9V3F37pNHabndawsfy/Tp7BPiy/aSa6XBYbaD1g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.45.1': - resolution: {integrity: sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-musl@4.50.0': resolution: {integrity: sha512-EtBDIZuDtVg75xIPIK1l5vCXNNCIRM0OBPUG+tbApDuJAy9mKago6QxX+tfMzbCI6tXEhMuZuN1+CU8iDW+0UQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.45.1': - resolution: {integrity: sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==} - cpu: [loong64] - os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.50.0': resolution: {integrity: sha512-BGYSwJdMP0hT5CCmljuSNx7+k+0upweM2M4YGfFBjnFSZMHOLYR0gEEj/dxyYJ6Zc6AiSeaBY8dWOa11GF/ppQ==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': - resolution: {integrity: sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==} - cpu: [ppc64] - os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.50.0': resolution: {integrity: sha512-I1gSMzkVe1KzAxKAroCJL30hA4DqSi+wGc5gviD0y3IL/VkvcnAqwBf4RHXHyvH66YVHxpKO8ojrgc4SrWAnLg==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.45.1': - resolution: {integrity: sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==} - cpu: [riscv64] - os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.50.0': resolution: {integrity: sha512-bSbWlY3jZo7molh4tc5dKfeSxkqnf48UsLqYbUhnkdnfgZjgufLS/NTA8PcP/dnvct5CCdNkABJ56CbclMRYCA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.45.1': - resolution: {integrity: sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==} - cpu: [riscv64] - os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.50.0': resolution: {integrity: sha512-LSXSGumSURzEQLT2e4sFqFOv3LWZsEF8FK7AAv9zHZNDdMnUPYH3t8ZlaeYYZyTXnsob3htwTKeWtBIkPV27iQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.45.1': - resolution: {integrity: sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==} - cpu: [s390x] - os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.50.0': resolution: {integrity: sha512-CxRKyakfDrsLXiCyucVfVWVoaPA4oFSpPpDwlMcDFQvrv3XY6KEzMtMZrA+e/goC8xxp2WSOxHQubP8fPmmjOQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.45.1': - resolution: {integrity: sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-gnu@4.50.0': resolution: {integrity: sha512-8PrJJA7/VU8ToHVEPu14FzuSAqVKyo5gg/J8xUerMbyNkWkO9j2ExBho/68RnJsMGNJq4zH114iAttgm7BZVkA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.45.1': - resolution: {integrity: sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-musl@4.50.0': resolution: {integrity: sha512-SkE6YQp+CzpyOrbw7Oc4MgXFvTw2UIBElvAvLCo230pyxOLmYwRPwZ/L5lBe/VW/qT1ZgND9wJfOsdy0XptRvw==} cpu: [x64] @@ -2655,31 +2665,16 @@ packages: cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.45.1': - resolution: {integrity: sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==} - cpu: [arm64] - os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.50.0': resolution: {integrity: sha512-q7cIIdFvWQoaCbLDUyUc8YfR3Jh2xx3unO8Dn6/TTogKjfwrax9SyfmGGK6cQhKtjePI7jRfd7iRYcxYs93esg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.45.1': - resolution: {integrity: sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==} - cpu: [ia32] - os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.50.0': resolution: {integrity: sha512-XzNOVg/YnDOmFdDKcxxK410PrcbcqZkBmz+0FicpW5jtjKQxcW1BZJEQOF0NJa6JO7CZhett8GEtRN/wYLYJuw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.45.1': - resolution: {integrity: sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==} - cpu: [x64] - os: [win32] - '@rollup/rollup-win32-x64-msvc@4.50.0': resolution: {integrity: sha512-xMmiWRR8sp72Zqwjgtf3QbZfF1wdh8X2ABu3EaozvZcyHJeU0r+XAnXdKgs4cCAp6ORoYoCygipYP1mjmbjrsg==} cpu: [x64] @@ -3905,6 +3900,10 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + ansis@4.1.0: + resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} + engines: {node: '>=14'} + any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -3971,6 +3970,10 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + ast-kit@2.1.2: + resolution: {integrity: sha512-cl76xfBQM6pztbrFWRnxbrDm9EOqDr1BF6+qQnnDZG2Co2LjyUktkN9GTJfBAfdae+DbT2nJf2nCGAdDDN7W2g==} + engines: {node: '>=20.18.0'} + ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} @@ -4066,6 +4069,9 @@ packages: bind-event-listener@3.0.0: resolution: {integrity: sha512-PJvH288AWQhKs2v9zyfYdPzlPqf5bXbGMmhmUIY9x4dAUGIWgomO771oBQNwJnMQSnUIXhKu6sgzpBRXTlvb8Q==} + birpc@2.5.0: + resolution: {integrity: sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==} + bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} @@ -4103,12 +4109,6 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - bundle-require@5.1.0: - resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - esbuild: 0.25.0 - busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} @@ -4307,10 +4307,6 @@ packages: engines: {node: '>=18'} hasBin: true - consola@3.4.2: - resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} - engines: {node: ^14.18.0 || >=16.10.0} - constant-case@3.0.4: resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} @@ -4545,6 +4541,9 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -4600,6 +4599,10 @@ packages: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} + diff@8.0.2: + resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} + engines: {node: '>=0.3.1'} + dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} @@ -4663,6 +4666,15 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} + dts-resolver@2.1.2: + resolution: {integrity: sha512-xeXHBQkn2ISSXxbJWD828PFjtyg+/UrMDo7W4Ffcs7+YWCquxU8YjV1KoxuiL+eJ5pg3ll+bC6flVv61L3LKZg==} + engines: {node: '>=20.18.0'} + peerDependencies: + oxc-resolver: '>=11.0.0' + peerDependenciesMeta: + oxc-resolver: + optional: true + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -4703,6 +4715,10 @@ packages: resolution: {integrity: sha512-Nw2m7JLIO4Ou2X/yZPRNscHQXVbbr6SErjkJ7EooG7MbR3yDZszCv9KTizsXFc7yZl0n3WF+qUKIC/Lw6H9xaQ==} engines: {node: '>=18.12.0'} + empathic@2.0.0: + resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} + engines: {node: '>=14'} + enabled@2.0.0: resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} @@ -5332,6 +5348,9 @@ packages: hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + hsl-to-hex@1.0.0: resolution: {integrity: sha512-K6GVpucS5wFf44X0h2bLVRDsycgJmf9FF2elg+CrqD8GcFU8c6vYhgXn8NjUkFCwj+xDFb70qgLbTUm6sxwPmA==} @@ -5646,6 +5665,10 @@ packages: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true + jiti@2.5.1: + resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} + hasBin: true + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} @@ -5751,10 +5774,6 @@ packages: linkifyjs@4.3.2: resolution: {integrity: sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==} - load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} @@ -5795,9 +5814,6 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -6347,6 +6363,9 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pathval@2.0.1: resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} engines: {node: '>= 14.16'} @@ -6449,24 +6468,6 @@ packages: tsx: optional: true - postcss-load-config@6.0.1: - resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} - engines: {node: '>= 18'} - peerDependencies: - jiti: '>=1.21.0' - postcss: '>=8.0.9' - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - jiti: - optional: true - postcss: - optional: true - tsx: - optional: true - yaml: - optional: true - postcss-modules-extract-imports@3.1.0: resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} engines: {node: ^10 || ^12 || >= 14} @@ -6732,6 +6733,9 @@ packages: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -6989,10 +6993,6 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} @@ -7017,9 +7017,24 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rollup@4.45.1: - resolution: {integrity: sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + rolldown-plugin-dts@0.15.10: + resolution: {integrity: sha512-8cPVAVQUo9tYAoEpc3jFV9RxSil13hrRRg8cHC9gLXxRMNtWPc1LNMSDXzjyD+5Vny49sDZH77JlXp/vlc4I3g==} + engines: {node: '>=20.18.0'} + peerDependencies: + '@typescript/native-preview': '>=7.0.0-dev.20250601.1' + rolldown: ^1.0.0-beta.9 + typescript: 5.8.3 + vue-tsc: ~3.0.3 + peerDependenciesMeta: + '@typescript/native-preview': + optional: true + typescript: + optional: true + vue-tsc: + optional: true + + rolldown@1.0.0-beta.34: + resolution: {integrity: sha512-Wwh7EwalMzzX3Yy3VN58VEajeR2Si8+HDNMf706jPLIqU7CxneRW+dQVfznf5O0TWTnJyu4npelwg2bzTXB1Nw==} hasBin: true rollup@4.50.0: @@ -7210,11 +7225,6 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} - deprecated: The work that was done in this beta branch won't be included in future versions - space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -7454,8 +7464,8 @@ packages: tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} tinyglobby@0.2.14: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} @@ -7515,9 +7525,6 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - tr46@5.1.1: resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} engines: {node: '>=18'} @@ -7570,31 +7577,34 @@ packages: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} + tsdown@0.14.2: + resolution: {integrity: sha512-6ThtxVZoTlR5YJov5rYvH8N1+/S/rD/pGfehdCLGznGgbxz+73EASV1tsIIZkLw2n+SXcERqHhcB/OkyxdKv3A==} + engines: {node: '>=20.19.0'} + hasBin: true + peerDependencies: + '@arethetypeswrong/core': ^0.18.1 + publint: ^0.3.0 + typescript: 5.8.3 + unplugin-lightningcss: ^0.4.0 + unplugin-unused: ^0.5.0 + peerDependenciesMeta: + '@arethetypeswrong/core': + optional: true + publint: + optional: true + typescript: + optional: true + unplugin-lightningcss: + optional: true + unplugin-unused: + optional: true + tslib@2.5.3: resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsup@8.4.0: - resolution: {integrity: sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - '@microsoft/api-extractor': ^7.36.0 - '@swc/core': ^1 - postcss: ^8.4.12 - typescript: 5.8.3 - peerDependenciesMeta: - '@microsoft/api-extractor': - optional: true - '@swc/core': - optional: true - postcss: - optional: true - typescript: - optional: true - turbo-darwin-64@2.5.6: resolution: {integrity: sha512-3C1xEdo4aFwMJAPvtlPqz1Sw/+cddWIOmsalHFMrsqqydcptwBfu26WW2cDm3u93bUzMbBJ8k3zNKFqxJ9ei2A==} cpu: [x64] @@ -7675,6 +7685,9 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} + unconfig@7.3.3: + resolution: {integrity: sha512-QCkQoOnJF8L107gxfHL0uavn7WD9b3dpBcFX6HtfQYmjw2YzWxGuFQ0N0J6tE9oguCBJn9KOvfqYDCMPHIZrBA==} + undefsafe@2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} @@ -7886,9 +7899,6 @@ packages: webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} @@ -7937,9 +7947,6 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -8789,12 +8796,12 @@ snapshots: 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.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.8.3)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: glob: 10.4.5 magic-string: 0.30.17 react-docgen-typescript: 2.4.0(typescript@5.8.3) - vite: 7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1) + vite: 7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) optionalDependencies: typescript: 5.8.3 @@ -8915,6 +8922,13 @@ snapshots: '@tybys/wasm-util': 0.10.0 optional: true + '@napi-rs/wasm-runtime@1.0.3': + dependencies: + '@emnapi/core': 1.4.5 + '@emnapi/runtime': 1.4.5 + '@tybys/wasm-util': 0.10.0 + optional: true + '@next/env@14.2.32': {} '@next/eslint-plugin-next@14.2.31': @@ -8962,11 +8976,19 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} + '@oxc-project/runtime@0.82.3': {} + + '@oxc-project/types@0.82.3': {} + '@pkgjs/parseargs@0.11.0': optional: true '@popperjs/core@2.11.8': {} + '@quansync/fs@0.1.5': + dependencies: + quansync: 0.2.11 + '@radix-ui/number@1.1.1': {} '@radix-ui/primitive@1.1.3': {} @@ -9283,6 +9305,52 @@ snapshots: '@remirror/core-constants@3.0.0': {} + '@rolldown/binding-android-arm64@1.0.0-beta.34': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-beta.34': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.34': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.34': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.34': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.34': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.34': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.34': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.34': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.34': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.34': + dependencies: + '@napi-rs/wasm-runtime': 1.0.3 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.34': + optional: true + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.34': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.34': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.34': {} + '@rollup/pluginutils@5.2.0(rollup@4.50.0)': dependencies: '@types/estree': 1.0.8 @@ -9291,126 +9359,66 @@ snapshots: optionalDependencies: rollup: 4.50.0 - '@rollup/rollup-android-arm-eabi@4.45.1': - optional: true - '@rollup/rollup-android-arm-eabi@4.50.0': optional: true - '@rollup/rollup-android-arm64@4.45.1': - optional: true - '@rollup/rollup-android-arm64@4.50.0': optional: true - '@rollup/rollup-darwin-arm64@4.45.1': - optional: true - '@rollup/rollup-darwin-arm64@4.50.0': optional: true - '@rollup/rollup-darwin-x64@4.45.1': - optional: true - '@rollup/rollup-darwin-x64@4.50.0': optional: true - '@rollup/rollup-freebsd-arm64@4.45.1': - optional: true - '@rollup/rollup-freebsd-arm64@4.50.0': optional: true - '@rollup/rollup-freebsd-x64@4.45.1': - optional: true - '@rollup/rollup-freebsd-x64@4.50.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.45.1': - optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.50.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.45.1': - optional: true - '@rollup/rollup-linux-arm-musleabihf@4.50.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.45.1': - optional: true - '@rollup/rollup-linux-arm64-gnu@4.50.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.45.1': - optional: true - '@rollup/rollup-linux-arm64-musl@4.50.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.45.1': - optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.50.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': - optional: true - '@rollup/rollup-linux-ppc64-gnu@4.50.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.45.1': - optional: true - '@rollup/rollup-linux-riscv64-gnu@4.50.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.45.1': - optional: true - '@rollup/rollup-linux-riscv64-musl@4.50.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.45.1': - optional: true - '@rollup/rollup-linux-s390x-gnu@4.50.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.45.1': - optional: true - '@rollup/rollup-linux-x64-gnu@4.50.0': optional: true - '@rollup/rollup-linux-x64-musl@4.45.1': - optional: true - '@rollup/rollup-linux-x64-musl@4.50.0': optional: true '@rollup/rollup-openharmony-arm64@4.50.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.45.1': - optional: true - '@rollup/rollup-win32-arm64-msvc@4.50.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.45.1': - optional: true - '@rollup/rollup-win32-ia32-msvc@4.50.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.45.1': - optional: true - '@rollup/rollup-win32-x64-msvc@4.50.0': optional: true @@ -9541,12 +9549,12 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@storybook/builder-vite@9.1.2(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)))(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1))': + '@storybook/builder-vite@9.1.2(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)))(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))': dependencies: - '@storybook/csf-plugin': 9.1.2(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1))) - storybook: 9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)) + '@storybook/csf-plugin': 9.1.2(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))) + storybook: 9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) ts-dedent: 2.2.0 - vite: 7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1) + vite: 7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) '@storybook/builder-webpack5@8.6.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(esbuild@0.25.0)(storybook@8.6.14(prettier@3.6.2))(typescript@5.8.3)': dependencies: @@ -9619,9 +9627,9 @@ snapshots: storybook: 8.6.14(prettier@3.6.2) unplugin: 1.16.1 - '@storybook/csf-plugin@9.1.2(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)))': + '@storybook/csf-plugin@9.1.2(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)))': dependencies: - storybook: 9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)) + storybook: 9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) unplugin: 1.16.1 '@storybook/global@5.0.0': {} @@ -9695,27 +9703,27 @@ snapshots: react-dom: 18.3.1(react@18.3.1) storybook: 8.6.14(prettier@3.6.2) - '@storybook/react-dom-shim@9.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)))': + '@storybook/react-dom-shim@9.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(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.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)) + storybook: 9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) - '@storybook/react-vite@9.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.50.0)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.8.3)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1))': + '@storybook/react-vite@9.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.50.0)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.8.3)(vite@7.0.0(@types/node@22.17.2)(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.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.8.3)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) '@rollup/pluginutils': 5.2.0(rollup@4.50.0) - '@storybook/builder-vite': 9.1.2(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)))(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)) - '@storybook/react': 9.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.8.3) + '@storybook/builder-vite': 9.1.2(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)))(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) + '@storybook/react': 9.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(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.17 react: 18.3.1 react-docgen: 8.0.0 react-dom: 18.3.1(react@18.3.1) resolve: 1.22.10 - storybook: 9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)) + storybook: 9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) tsconfig-paths: 4.2.0 - vite: 7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1) + vite: 7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) transitivePeerDependencies: - rollup - supports-color @@ -9755,13 +9763,13 @@ snapshots: '@storybook/test': 8.6.14(storybook@8.6.14(prettier@3.6.2)) typescript: 5.8.3 - '@storybook/react@9.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.8.3)': + '@storybook/react@9.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(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.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1))) + '@storybook/react-dom-shim': 9.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(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.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)) + storybook: 9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) optionalDependencies: typescript: 5.8.3 @@ -10614,13 +10622,13 @@ snapshots: chai: 5.3.1 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@7.0.0(@types/node@22.17.2)(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.17 optionalDependencies: - vite: 7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1) + vite: 7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) '@vitest/pretty-format@2.0.5': dependencies: @@ -10813,6 +10821,8 @@ snapshots: ansi-styles@6.2.1: {} + ansis@4.1.0: {} + any-promise@1.3.0: {} anymatch@3.1.3: @@ -10907,6 +10917,11 @@ snapshots: assertion-error@2.0.1: {} + ast-kit@2.1.2: + dependencies: + '@babel/parser': 7.28.3 + pathe: 2.0.3 + ast-types-flow@0.0.8: {} ast-types@0.16.1: @@ -10993,6 +11008,8 @@ snapshots: bind-event-listener@3.0.0: {} + birpc@2.5.0: {} + bluebird@3.7.2: {} body-parser@1.20.3: @@ -11046,11 +11063,6 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - bundle-require@5.1.0(esbuild@0.25.0): - dependencies: - esbuild: 0.25.0 - load-tsconfig: 0.2.5 - busboy@1.6.0: dependencies: streamsearch: 1.1.0 @@ -11270,8 +11282,6 @@ snapshots: tree-kill: 1.2.2 yargs: 17.7.2 - consola@3.4.2: {} - constant-case@3.0.4: dependencies: no-case: 3.0.4 @@ -11501,6 +11511,8 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + defu@6.1.4: {} + delayed-stream@1.0.0: {} denque@1.5.1: {} @@ -11533,6 +11545,8 @@ snapshots: diff@5.2.0: {} + diff@8.0.2: {} + dlv@1.1.3: {} doctrine@2.1.0: @@ -11605,6 +11619,8 @@ snapshots: dotenv@16.6.1: {} + dts-resolver@2.1.2: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -11638,6 +11654,8 @@ snapshots: emojibase@16.0.0: {} + empathic@2.0.0: {} + enabled@2.0.0: {} encodeurl@1.0.2: {} @@ -11958,11 +11976,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-storybook@9.1.2(eslint@8.57.1)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.8.3): + eslint-plugin-storybook@9.1.2(eslint@8.57.1)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.8.3): dependencies: '@typescript-eslint/utils': 8.38.0(eslint@8.57.1)(typescript@5.8.3) eslint: 8.57.1 - storybook: 9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)) + storybook: 9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) transitivePeerDependencies: - supports-color - typescript @@ -12459,6 +12477,8 @@ snapshots: dependencies: react-is: 16.13.1 + hookable@5.5.3: {} + hsl-to-hex@1.0.0: dependencies: hsl-to-rgb-for-reals: 1.1.1 @@ -12806,6 +12826,8 @@ snapshots: jiti@1.21.7: {} + jiti@2.5.1: {} + joycon@3.1.1: {} js-tokens@4.0.0: {} @@ -12916,8 +12938,6 @@ snapshots: linkifyjs@4.3.2: {} - load-tsconfig@0.2.5: {} - loader-runner@4.3.0: {} locate-path@5.0.0: @@ -12948,8 +12968,6 @@ snapshots: lodash.merge@4.6.2: {} - lodash.sortby@4.7.0: {} - lodash@4.17.21: {} logform@2.7.0: @@ -13576,6 +13594,8 @@ snapshots: path-type@4.0.0: {} + pathe@2.0.3: {} + pathval@2.0.1: {} picocolors@1.1.1: {} @@ -13644,14 +13664,14 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-cli@11.0.1(jiti@1.21.7)(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.1 picocolors: 1.1.1 postcss: 8.5.6 - postcss-load-config: 5.1.0(jiti@1.21.7)(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 @@ -13682,22 +13702,14 @@ snapshots: postcss: 8.5.6 ts-node: 10.9.2(@swc/core@1.13.3(@swc/helpers@0.5.17))(@types/node@22.17.2)(typescript@5.8.3) - postcss-load-config@5.1.0(jiti@1.21.7)(postcss@8.5.6): + 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 - postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.8.1): - dependencies: - lilconfig: 3.1.3 - optionalDependencies: - jiti: 1.21.7 - postcss: 8.5.6 - yaml: 2.8.1 - postcss-modules-extract-imports@3.1.0(postcss@8.5.6): dependencies: postcss: 8.5.6 @@ -13939,6 +13951,8 @@ snapshots: dependencies: side-channel: 1.1.0 + quansync@0.2.11: {} + queue-microtask@1.2.3: {} queue@6.0.2: @@ -14278,8 +14292,6 @@ snapshots: resolve-from@4.0.0: {} - resolve-from@5.0.0: {} - resolve-pkg-maps@1.0.0: {} resolve@1.22.10: @@ -14302,31 +14314,44 @@ snapshots: dependencies: glob: 7.2.3 - rollup@4.45.1: + rolldown-plugin-dts@0.15.10(rolldown@1.0.0-beta.34)(typescript@5.8.3): dependencies: - '@types/estree': 1.0.8 + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 + ast-kit: 2.1.2 + birpc: 2.5.0 + debug: 4.4.1(supports-color@5.5.0) + dts-resolver: 2.1.2 + get-tsconfig: 4.10.1 + rolldown: 1.0.0-beta.34 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.45.1 - '@rollup/rollup-android-arm64': 4.45.1 - '@rollup/rollup-darwin-arm64': 4.45.1 - '@rollup/rollup-darwin-x64': 4.45.1 - '@rollup/rollup-freebsd-arm64': 4.45.1 - '@rollup/rollup-freebsd-x64': 4.45.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.45.1 - '@rollup/rollup-linux-arm-musleabihf': 4.45.1 - '@rollup/rollup-linux-arm64-gnu': 4.45.1 - '@rollup/rollup-linux-arm64-musl': 4.45.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.45.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.45.1 - '@rollup/rollup-linux-riscv64-gnu': 4.45.1 - '@rollup/rollup-linux-riscv64-musl': 4.45.1 - '@rollup/rollup-linux-s390x-gnu': 4.45.1 - '@rollup/rollup-linux-x64-gnu': 4.45.1 - '@rollup/rollup-linux-x64-musl': 4.45.1 - '@rollup/rollup-win32-arm64-msvc': 4.45.1 - '@rollup/rollup-win32-ia32-msvc': 4.45.1 - '@rollup/rollup-win32-x64-msvc': 4.45.1 - fsevents: 2.3.3 + typescript: 5.8.3 + transitivePeerDependencies: + - oxc-resolver + - supports-color + + rolldown@1.0.0-beta.34: + dependencies: + '@oxc-project/runtime': 0.82.3 + '@oxc-project/types': 0.82.3 + '@rolldown/pluginutils': 1.0.0-beta.34 + ansis: 4.1.0 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.34 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.34 + '@rolldown/binding-darwin-x64': 1.0.0-beta.34 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.34 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.34 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.34 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.34 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.34 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.34 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.34 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.34 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.34 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.34 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.34 rollup@4.50.0: dependencies: @@ -14602,10 +14627,6 @@ snapshots: source-map@0.6.1: {} - source-map@0.8.0-beta.0: - dependencies: - whatwg-url: 7.1.0 - space-separated-tokens@2.0.2: {} split2@4.2.0: {} @@ -14633,13 +14654,13 @@ snapshots: - supports-color - utf-8-validate - storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)): + storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)): dependencies: '@storybook/global': 5.0.0 '@testing-library/jest-dom': 6.6.3 '@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.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.0.0(@types/node@22.17.2)(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 @@ -14882,7 +14903,7 @@ snapshots: tinycolor2@1.6.0: {} - tinyexec@0.3.2: {} + tinyexec@1.0.1: {} tinyglobby@0.2.14: dependencies: @@ -14931,10 +14952,6 @@ snapshots: tr46@0.0.3: {} - tr46@1.0.1: - dependencies: - punycode: 2.3.1 - tr46@5.1.1: dependencies: punycode: 2.3.1 @@ -15009,38 +15026,34 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 + tsdown@0.14.2(typescript@5.8.3): + dependencies: + ansis: 4.1.0 + cac: 6.7.14 + chokidar: 3.6.0 + debug: 4.4.1(supports-color@5.5.0) + diff: 8.0.2 + empathic: 2.0.0 + hookable: 5.5.3 + rolldown: 1.0.0-beta.34 + rolldown-plugin-dts: 0.15.10(rolldown@1.0.0-beta.34)(typescript@5.8.3) + semver: 7.7.2 + tinyexec: 1.0.1 + tinyglobby: 0.2.14 + tree-kill: 1.2.2 + unconfig: 7.3.3 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - '@typescript/native-preview' + - oxc-resolver + - supports-color + - vue-tsc + tslib@2.5.3: {} tslib@2.8.1: {} - tsup@8.4.0(@swc/core@1.13.3(@swc/helpers@0.5.17))(jiti@1.21.7)(postcss@8.5.6)(typescript@5.8.3)(yaml@2.8.1): - dependencies: - bundle-require: 5.1.0(esbuild@0.25.0) - cac: 6.7.14 - chokidar: 3.6.0 - consola: 3.4.2 - debug: 4.4.1(supports-color@5.5.0) - esbuild: 0.25.0 - joycon: 3.1.1 - picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.8.1) - resolve-from: 5.0.0 - rollup: 4.45.1 - source-map: 0.8.0-beta.0 - sucrase: 3.35.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.14 - tree-kill: 1.2.2 - optionalDependencies: - '@swc/core': 1.13.3(@swc/helpers@0.5.17) - postcss: 8.5.6 - typescript: 5.8.3 - transitivePeerDependencies: - - jiti - - supports-color - - tsx - - yaml - turbo-darwin-64@2.5.6: optional: true @@ -15127,6 +15140,13 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 + unconfig@7.3.3: + dependencies: + '@quansync/fs': 0.1.5 + defu: 6.1.4 + jiti: 2.5.1 + quansync: 0.2.11 + undefsafe@2.0.5: {} undici-types@6.21.0: {} @@ -15324,7 +15344,7 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 - vite@7.0.0(@types/node@22.17.2)(jiti@1.21.7)(terser@5.43.1)(yaml@2.8.1): + vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1): dependencies: esbuild: 0.25.0 fdir: 6.4.6(picomatch@4.0.3) @@ -15335,7 +15355,7 @@ snapshots: optionalDependencies: '@types/node': 22.17.2 fsevents: 2.3.3 - jiti: 1.21.7 + jiti: 2.5.1 terser: 5.43.1 yaml: 2.8.1 @@ -15358,8 +15378,6 @@ snapshots: webidl-conversions@3.0.1: {} - webidl-conversions@4.0.2: {} - webidl-conversions@7.0.0: {} webpack-dev-middleware@6.1.3(webpack@5.101.3(@swc/core@1.13.3(@swc/helpers@0.5.17))(esbuild@0.25.0)): @@ -15430,12 +15448,6 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - whatwg-url@7.1.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index e01ec808d8..9db8835088 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -20,7 +20,7 @@ catalog: "@types/react": 18.3.11 "@types/react-dom": 18.3.1 typescript: 5.8.3 - tsup: 8.4.0 + tsdown: 0.14.2 uuid: 10.0.0 onlyBuiltDependencies: From 59ace4f41161c81a02aca168495f7e3e4699c0cf Mon Sep 17 00:00:00 2001 From: Akshita Goyal <36129505+gakshita@users.noreply.github.com> Date: Wed, 3 Sep 2025 14:11:30 +0530 Subject: [PATCH 073/138] [WEB-4787] fix: changed issue to work item in cycles dropdown (#7706) --- .../core/components/cycles/dropdowns/estimate-type-dropdown.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/core/components/cycles/dropdowns/estimate-type-dropdown.tsx b/apps/web/core/components/cycles/dropdowns/estimate-type-dropdown.tsx index 277364081b..278d0fb128 100644 --- a/apps/web/core/components/cycles/dropdowns/estimate-type-dropdown.tsx +++ b/apps/web/core/components/cycles/dropdowns/estimate-type-dropdown.tsx @@ -38,6 +38,6 @@ export const EstimateTypeDropdown = observer((props: TProps) => {
) : showDefault ? ( - {value} + {cycleEstimateOptions.find((v) => v.value === value)?.label ?? value} ) : null; }); From 473535fcfabdf0062be20604cf5202bdde156a58 Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Wed, 3 Sep 2025 17:25:31 +0530 Subject: [PATCH 074/138] [WEB-4844] fix: export prople package dist (#7712) * fix: export prople package dist * fix: code refactor --- .../overview/priority-distribution.tsx | 2 +- apps/web/core/components/project/form.tsx | 16 +++------- apps/web/core/components/views/form.tsx | 3 +- packages/propel/package.json | 32 +++++++++---------- .../propel/src/emoji-icon-picker/helper.tsx | 16 ++++++---- packages/propel/tsdown.config.ts | 16 ++++++---- 6 files changed, 42 insertions(+), 43 deletions(-) diff --git a/apps/web/core/components/profile/overview/priority-distribution.tsx b/apps/web/core/components/profile/overview/priority-distribution.tsx index b61018ef35..bf75c91eb0 100644 --- a/apps/web/core/components/profile/overview/priority-distribution.tsx +++ b/apps/web/core/components/profile/overview/priority-distribution.tsx @@ -44,7 +44,7 @@ export const ProfilePriorityDistribution: React.FC = ({ userProfile }) => key: "count", label: "Count", stackId: "bar-one", - fill: (payload) => priorityColors[payload.key as keyof typeof priorityColors], + fill: (payload: any) => priorityColors[payload.key as keyof typeof priorityColors], // TODO: fix types textClassName: "", showPercentage: false, showTopBorderRadius: () => true, diff --git a/apps/web/core/components/project/form.tsx b/apps/web/core/components/project/form.tsx index e8cdd54c3e..1e35f65dd3 100644 --- a/apps/web/core/components/project/form.tsx +++ b/apps/web/core/components/project/form.tsx @@ -9,17 +9,8 @@ import { useTranslation } from "@plane/i18n"; import { EmojiPicker } from "@plane/propel/emoji-icon-picker"; import { Tooltip } from "@plane/propel/tooltip"; import { IProject, IWorkspace } from "@plane/types"; -import { - Button, - CustomSelect, - Input, - TextArea, - TOAST_TYPE, - setToast, - CustomEmojiIconPicker, - EmojiIconPickerTypes, -} from "@plane/ui"; -import { renderFormattedDate, convertHexEmojiToDecimal, getFileURL } from "@plane/utils"; +import { Button, CustomSelect, Input, TextArea, TOAST_TYPE, setToast, EmojiIconPickerTypes } from "@plane/ui"; +import { renderFormattedDate, getFileURL } from "@plane/utils"; // components import { Logo } from "@/components/common/logo"; import { ImagePickerPopover } from "@/components/core/image-picker-popover"; @@ -212,7 +203,8 @@ export const ProjectDetailsForm: FC = (props) => { className="flex items-center justify-center" buttonClassName="flex h-[52px] w-[52px] flex-shrink-0 items-center justify-center rounded-lg bg-white/10" label={} - onChange={(val) => { + // TODO: fix types + onChange={(val: any) => { let logoValue = {}; if (val?.type === "emoji") diff --git a/apps/web/core/components/views/form.tsx b/apps/web/core/components/views/form.tsx index a5070796e6..278181079e 100644 --- a/apps/web/core/components/views/form.tsx +++ b/apps/web/core/components/views/form.tsx @@ -176,7 +176,8 @@ export const ProjectViewForm: React.FC = observer((props) => { } - onChange={(val) => { + // TODO: fix types + onChange={(val: any) => { let logoValue = {}; if (val?.type === "emoji") diff --git a/packages/propel/package.json b/packages/propel/package.json index 3e7e979669..afd628b5e4 100644 --- a/packages/propel/package.json +++ b/packages/propel/package.json @@ -16,22 +16,22 @@ "build-storybook": "storybook build" }, "exports": { - "./avatar": "./src/avatar/index.ts", - "./charts/*": "./src/charts/*/index.ts", - "./dialog": "./src/dialog/index.ts", - "./menu": "./src/menu/index.ts", - "./table": "./src/table/index.ts", - "./tabs": "./src/tabs/index.ts", - "./popover": "./src/popover/index.ts", - "./command": "./src/command/index.ts", - "./combobox": "./src/combobox/index.ts", - "./tooltip": "./src/tooltip/index.ts", - "./styles/fonts": "./src/styles/fonts/index.css", - "./switch": "./src/switch/index.ts", - "./emoji-icon-picker": "./src/emoji-icon-picker/index.ts", - "./utils": "./src/utils/index.ts", - "./accordion": "./src/accordion/index.ts", - "./card": "./src/card/index.ts" + "./accordion": "./dist/accordion/index.ts", + "./avatar": "./dist/avatar/index.ts", + "./card": "./dist/card/index.ts", + "./charts/*": "./dist/charts/*/index.ts", + "./combobox": "./dist/combobox/index.ts", + "./command": "./dist/command/index.ts", + "./dialog": "./dist/dialog/index.ts", + "./emoji-icon-picker": "./dist/emoji-icon-picker/index.ts", + "./menu": "./dist/menu/index.ts", + "./popover": "./dist/popover/index.ts", + "./styles/fonts": "./dist/styles/fonts/index.css", + "./switch": "./dist/switch/index.ts", + "./table": "./dist/table/index.ts", + "./tabs": "./dist/tabs/index.ts", + "./tooltip": "./dist/tooltip/index.ts", + "./utils": "./dist/utils/index.ts" }, "dependencies": { "@base-ui-components/react": "^1.0.0-beta.2", diff --git a/packages/propel/src/emoji-icon-picker/helper.tsx b/packages/propel/src/emoji-icon-picker/helper.tsx index a613a1b083..dfe2da2ff9 100644 --- a/packages/propel/src/emoji-icon-picker/helper.tsx +++ b/packages/propel/src/emoji-icon-picker/helper.tsx @@ -1,23 +1,25 @@ import { TPlacement, TSide, TAlign } from "../utils/placement"; -export enum EmojiIconPickerTypes { - EMOJI = "emoji", - ICON = "icon", -} +export const EmojiIconPickerTypes = { + EMOJI: "emoji", + ICON: "icon", +} as const; export type TChangeHandlerProps = | { - type: EmojiIconPickerTypes.EMOJI; + type: typeof EmojiIconPickerTypes.EMOJI; value: string; } | { - type: EmojiIconPickerTypes.ICON; + type: typeof EmojiIconPickerTypes.ICON; value: { name: string; color: string; }; }; +export type TEmojiIconPickerTypes = typeof EmojiIconPickerTypes.EMOJI | typeof EmojiIconPickerTypes.ICON; + export type TCustomEmojiPicker = { isOpen: boolean; handleToggle: (value: boolean) => void; @@ -25,7 +27,7 @@ export type TCustomEmojiPicker = { className?: string; closeOnSelect?: boolean; defaultIconColor?: string; - defaultOpen?: EmojiIconPickerTypes; + defaultOpen?: TEmojiIconPickerTypes; disabled?: boolean; dropdownClassName?: string; label: React.ReactNode; diff --git a/packages/propel/tsdown.config.ts b/packages/propel/tsdown.config.ts index 83abd28d74..29ecdf81ae 100644 --- a/packages/propel/tsdown.config.ts +++ b/packages/propel/tsdown.config.ts @@ -2,20 +2,24 @@ import { defineConfig } from "tsdown"; export default defineConfig({ entry: [ + "src/accordion/index.ts", "src/avatar/index.ts", - "src/charts/index.ts", + "src/card/index.ts", + "src/charts/*/index.ts", + "src/combobox/index.ts", + "src/command/index.ts", "src/dialog/index.ts", + "src/emoji-icon-picker/index.ts", "src/menu/index.ts", + "src/popover/index.ts", + "src/switch/index.ts", "src/table/index.ts", "src/tabs/index.ts", - "src/popover/index.ts", - "src/command/index.ts", - "src/combobox/index.ts", "src/tooltip/index.ts", - "src/card/index.ts", - "src/switch/index.ts", + "src/utils/index.ts", ], outDir: "dist", format: ["esm", "cjs"], dts: true, + copy: ["src/styles"], }); From 54e4a0f6dd2b1bf31b236e70a215f8c4a3cebb9b Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Wed, 3 Sep 2025 18:11:31 +0530 Subject: [PATCH 075/138] fix: build error due to exports in propel package (#7715) * fix: build error due to exports in propel package * fix: editor css exports * fix: editor css build --------- Co-authored-by: Aaryan Khandelwal --- apps/space/styles/globals.css | 1 + apps/web/styles/globals.css | 1 + packages/editor/package.json | 3 ++- packages/editor/src/index.ts | 8 -------- packages/editor/src/styles/index.css | 5 +++++ packages/editor/tsdown.config.ts | 4 ++++ packages/propel/package.json | 30 ++++++++++++++-------------- 7 files changed, 28 insertions(+), 24 deletions(-) create mode 100644 packages/editor/src/styles/index.css diff --git a/apps/space/styles/globals.css b/apps/space/styles/globals.css index 9541e20f56..870f137e4f 100644 --- a/apps/space/styles/globals.css +++ b/apps/space/styles/globals.css @@ -1,4 +1,5 @@ @import "@plane/propel/styles/fonts"; +@import "@plane/editor/styles"; @tailwind base; @tailwind components; diff --git a/apps/web/styles/globals.css b/apps/web/styles/globals.css index 43e4bff189..6f7ceace2b 100644 --- a/apps/web/styles/globals.css +++ b/apps/web/styles/globals.css @@ -1,4 +1,5 @@ @import "@plane/propel/styles/fonts"; +@import "@plane/editor/styles"; @tailwind base; @tailwind components; diff --git a/packages/editor/package.json b/packages/editor/package.json index 1d838d73ab..c83c8eec57 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -19,7 +19,8 @@ "require": "./dist/lib.js", "types": "./dist/lib.d.mts", "import": "./dist/lib.mjs" - } + }, + "./styles": "./dist/styles/index.css" }, "scripts": { "build": "tsdown", diff --git a/packages/editor/src/index.ts b/packages/editor/src/index.ts index 10d7bb4113..1872f35c72 100644 --- a/packages/editor/src/index.ts +++ b/packages/editor/src/index.ts @@ -1,11 +1,3 @@ -// styles -// import "./styles/tailwind.css"; -import "./styles/variables.css"; -import "./styles/editor.css"; -import "./styles/table.css"; -import "./styles/github-dark.css"; -import "./styles/drag-drop.css"; - // editors export { CollaborativeDocumentEditorWithRef, diff --git a/packages/editor/src/styles/index.css b/packages/editor/src/styles/index.css new file mode 100644 index 0000000000..e38c01c283 --- /dev/null +++ b/packages/editor/src/styles/index.css @@ -0,0 +1,5 @@ +@import "./variables.css"; +@import "./editor.css"; +@import "./table.css"; +@import "./github-dark.css"; +@import "./drag-drop.css"; diff --git a/packages/editor/tsdown.config.ts b/packages/editor/tsdown.config.ts index ee7d0cdf88..348f1fd7a7 100644 --- a/packages/editor/tsdown.config.ts +++ b/packages/editor/tsdown.config.ts @@ -4,4 +4,8 @@ export default defineConfig({ entry: ["src/index.ts", "src/lib.ts"], outDir: "dist", format: ["esm", "cjs"], + dts: true, + clean: true, + sourcemap: true, + copy: ["src/styles"], }); diff --git a/packages/propel/package.json b/packages/propel/package.json index afd628b5e4..f5f5e39b4b 100644 --- a/packages/propel/package.json +++ b/packages/propel/package.json @@ -16,22 +16,22 @@ "build-storybook": "storybook build" }, "exports": { - "./accordion": "./dist/accordion/index.ts", - "./avatar": "./dist/avatar/index.ts", - "./card": "./dist/card/index.ts", - "./charts/*": "./dist/charts/*/index.ts", - "./combobox": "./dist/combobox/index.ts", - "./command": "./dist/command/index.ts", - "./dialog": "./dist/dialog/index.ts", - "./emoji-icon-picker": "./dist/emoji-icon-picker/index.ts", - "./menu": "./dist/menu/index.ts", - "./popover": "./dist/popover/index.ts", + "./accordion": "./dist/accordion/index.js", + "./avatar": "./dist/avatar/index.js", + "./card": "./dist/card/index.js", + "./charts/*": "./dist/charts/*/index.js", + "./combobox": "./dist/combobox/index.js", + "./command": "./dist/command/index.js", + "./dialog": "./dist/dialog/index.js", + "./emoji-icon-picker": "./dist/emoji-icon-picker/index.js", + "./menu": "./dist/menu/index.js", + "./popover": "./dist/popover/index.js", "./styles/fonts": "./dist/styles/fonts/index.css", - "./switch": "./dist/switch/index.ts", - "./table": "./dist/table/index.ts", - "./tabs": "./dist/tabs/index.ts", - "./tooltip": "./dist/tooltip/index.ts", - "./utils": "./dist/utils/index.ts" + "./switch": "./dist/switch/index.js", + "./table": "./dist/table/index.js", + "./tabs": "./dist/tabs/index.js", + "./tooltip": "./dist/tooltip/index.js", + "./utils": "./dist/utils/index.js" }, "dependencies": { "@base-ui-components/react": "^1.0.0-beta.2", From 49a40031a4824e397c36977de3f6c3134b309131 Mon Sep 17 00:00:00 2001 From: Nikhil <118773738+pablohashescobar@users.noreply.github.com> Date: Wed, 3 Sep 2025 18:28:11 +0530 Subject: [PATCH 076/138] [WEB-4795] chore: remove caching decorator from WorkspaceStatesEndpoint #7714 --- apps/api/plane/app/views/workspace/state.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/api/plane/app/views/workspace/state.py b/apps/api/plane/app/views/workspace/state.py index 3a7d767fa1..3bfc8d22de 100644 --- a/apps/api/plane/app/views/workspace/state.py +++ b/apps/api/plane/app/views/workspace/state.py @@ -7,7 +7,6 @@ from plane.app.serializers import StateSerializer from plane.app.views.base import BaseAPIView from plane.db.models import State from plane.app.permissions import WorkspaceEntityPermission -from plane.utils.cache import cache_response from collections import defaultdict @@ -15,7 +14,6 @@ class WorkspaceStatesEndpoint(BaseAPIView): permission_classes = [WorkspaceEntityPermission] use_read_replica = True - @cache_response(60 * 60 * 2) def get(self, request, slug): states = State.objects.filter( workspace__slug=slug, From 2e673026d4f9b7bcdb40b466a6ee8761228772d4 Mon Sep 17 00:00:00 2001 From: Sangeetha Date: Wed, 3 Sep 2025 18:36:04 +0530 Subject: [PATCH 077/138] [WEB-4129] fix: work item filter assignees missing fields #7698 --- apps/api/plane/utils/grouper.py | 66 ++++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 22 deletions(-) diff --git a/apps/api/plane/utils/grouper.py b/apps/api/plane/utils/grouper.py index 89e154a7f7..d69a1f5832 100644 --- a/apps/api/plane/utils/grouper.py +++ b/apps/api/plane/utils/grouper.py @@ -1,7 +1,7 @@ # Django imports from django.contrib.postgres.aggregates import ArrayAgg from django.contrib.postgres.fields import ArrayField -from django.db.models import Q, UUIDField, Value, QuerySet +from django.db.models import Q, UUIDField, Value, QuerySet, OuterRef, Subquery from django.db.models.functions import Coalesce # Module imports @@ -14,6 +14,9 @@ from plane.db.models import ( ProjectMember, State, WorkspaceMember, + IssueAssignee, + ModuleIssue, + IssueLabel, ) from typing import Optional, Dict, Tuple, Any, Union, List @@ -39,33 +42,52 @@ def issue_queryset_grouper( if group_key in GROUP_FILTER_MAPPER: queryset = queryset.filter(GROUP_FILTER_MAPPER[group_key]) + issue_assignee_subquery = Subquery( + IssueAssignee.objects.filter( + issue_id=OuterRef("pk"), + deleted_at__isnull=True, + ) + .values("issue_id") + .annotate(arr=ArrayAgg("assignee_id", distinct=True)) + .values("arr") + ) + + issue_module_subquery = Subquery( + ModuleIssue.objects.filter( + issue_id=OuterRef("pk"), + deleted_at__isnull=True, + module__archived_at__isnull=True, + ) + .values("issue_id") + .annotate(arr=ArrayAgg("module_id", distinct=True)) + .values("arr") + ) + + issue_label_subquery = Subquery( + IssueLabel.objects.filter(issue_id=OuterRef("pk"), deleted_at__isnull=True) + .values("issue_id") + .annotate(arr=ArrayAgg("label_id", distinct=True)) + .values("arr") + ) + annotations_map: Dict[str, Tuple[str, Q]] = { - "assignee_ids": ( - "assignees__id", - ~Q(assignees__id__isnull=True) & Q(issue_assignee__deleted_at__isnull=True), + "assignee_ids": Coalesce( + issue_assignee_subquery, Value([], output_field=ArrayField(UUIDField())) ), - "label_ids": ( - "labels__id", - ~Q(labels__id__isnull=True) & Q(label_issue__deleted_at__isnull=True), + "label_ids": Coalesce( + issue_label_subquery, Value([], output_field=ArrayField(UUIDField())) ), - "module_ids": ( - "issue_module__module_id", - ( - ~Q(issue_module__module_id__isnull=True) - & Q(issue_module__module__archived_at__isnull=True) - & Q(issue_module__deleted_at__isnull=True) - ), + "module_ids": Coalesce( + issue_module_subquery, Value([], output_field=ArrayField(UUIDField())) ), } - default_annotations: Dict[str, Any] = { - key: Coalesce( - ArrayAgg(field, distinct=True, filter=condition), - Value([], output_field=ArrayField(UUIDField())), - ) - for key, (field, condition) in annotations_map.items() - if FIELD_MAPPER.get(key) != group_by or FIELD_MAPPER.get(key) != sub_group_by - } + default_annotations: Dict[str, Any] = {} + + for key, expression in annotations_map.items(): + if FIELD_MAPPER.get(key) in {group_by, sub_group_by}: + continue + default_annotations[key] = expression return queryset.annotate(**default_annotations) From cb1e93f83dce7306a5958f46d25049e13fe7c64d Mon Sep 17 00:00:00 2001 From: Dheeraj Kumar Ketireddy Date: Wed, 3 Sep 2025 18:37:56 +0530 Subject: [PATCH 078/138] [WEB-4831] schema: add rich_filters field to multiple models for enhanced filtering capabilities (#7700) * chore: add rich_filters field to multiple models for enhanced filtering capabilities * Set the default value to empty dict --- ...cleuserproperties_rich_filters_and_more.py | 43 +++++++++++++++++++ apps/api/plane/db/models/cycle.py | 1 + apps/api/plane/db/models/exporter.py | 1 + apps/api/plane/db/models/issue.py | 1 + apps/api/plane/db/models/module.py | 1 + apps/api/plane/db/models/view.py | 1 + apps/api/plane/db/models/workspace.py | 1 + 7 files changed, 49 insertions(+) create mode 100644 apps/api/plane/db/migrations/0104_cycleuserproperties_rich_filters_and_more.py diff --git a/apps/api/plane/db/migrations/0104_cycleuserproperties_rich_filters_and_more.py b/apps/api/plane/db/migrations/0104_cycleuserproperties_rich_filters_and_more.py new file mode 100644 index 0000000000..6344e31651 --- /dev/null +++ b/apps/api/plane/db/migrations/0104_cycleuserproperties_rich_filters_and_more.py @@ -0,0 +1,43 @@ +# Generated by Django 4.2.22 on 2025-09-03 05:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('db', '0103_fileasset_asset_entity_type_idx_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='cycleuserproperties', + name='rich_filters', + field=models.JSONField(default=dict), + ), + migrations.AddField( + model_name='exporterhistory', + name='rich_filters', + field=models.JSONField(blank=True, default=dict, null=True), + ), + migrations.AddField( + model_name='issueuserproperty', + name='rich_filters', + field=models.JSONField(default=dict), + ), + migrations.AddField( + model_name='issueview', + name='rich_filters', + field=models.JSONField(default=dict), + ), + migrations.AddField( + model_name='moduleuserproperties', + name='rich_filters', + field=models.JSONField(default=dict), + ), + migrations.AddField( + model_name='workspaceuserproperties', + name='rich_filters', + field=models.JSONField(default=dict), + ), + ] diff --git a/apps/api/plane/db/models/cycle.py b/apps/api/plane/db/models/cycle.py index 26b152c6cf..9e45028c59 100644 --- a/apps/api/plane/db/models/cycle.py +++ b/apps/api/plane/db/models/cycle.py @@ -139,6 +139,7 @@ class CycleUserProperties(ProjectBaseModel): filters = models.JSONField(default=get_default_filters) display_filters = models.JSONField(default=get_default_display_filters) display_properties = models.JSONField(default=get_default_display_properties) + rich_filters = models.JSONField(default=dict) class Meta: unique_together = ["cycle", "user", "deleted_at"] diff --git a/apps/api/plane/db/models/exporter.py b/apps/api/plane/db/models/exporter.py index 48d40a1aaf..40c13576da 100644 --- a/apps/api/plane/db/models/exporter.py +++ b/apps/api/plane/db/models/exporter.py @@ -56,6 +56,7 @@ class ExporterHistory(BaseModel): related_name="workspace_exporters", ) filters = models.JSONField(blank=True, null=True) + rich_filters = models.JSONField(default=dict, blank=True, null=True) class Meta: verbose_name = "Exporter" diff --git a/apps/api/plane/db/models/issue.py b/apps/api/plane/db/models/issue.py index a3994d79e0..b8efd6ae73 100644 --- a/apps/api/plane/db/models/issue.py +++ b/apps/api/plane/db/models/issue.py @@ -509,6 +509,7 @@ class IssueUserProperty(ProjectBaseModel): filters = models.JSONField(default=get_default_filters) display_filters = models.JSONField(default=get_default_display_filters) display_properties = models.JSONField(default=get_default_display_properties) + rich_filters = models.JSONField(default=dict) class Meta: verbose_name = "Issue User Property" diff --git a/apps/api/plane/db/models/module.py b/apps/api/plane/db/models/module.py index 6015461d53..897cf26b19 100644 --- a/apps/api/plane/db/models/module.py +++ b/apps/api/plane/db/models/module.py @@ -207,6 +207,7 @@ class ModuleUserProperties(ProjectBaseModel): filters = models.JSONField(default=get_default_filters) display_filters = models.JSONField(default=get_default_display_filters) display_properties = models.JSONField(default=get_default_display_properties) + rich_filters = models.JSONField(default=dict) class Meta: unique_together = ["module", "user", "deleted_at"] diff --git a/apps/api/plane/db/models/view.py b/apps/api/plane/db/models/view.py index c9182acce3..87d22e44f7 100644 --- a/apps/api/plane/db/models/view.py +++ b/apps/api/plane/db/models/view.py @@ -58,6 +58,7 @@ class IssueView(WorkspaceBaseModel): filters = models.JSONField(default=dict) display_filters = models.JSONField(default=get_default_display_filters) display_properties = models.JSONField(default=get_default_display_properties) + rich_filters = models.JSONField(default=dict) access = models.PositiveSmallIntegerField( default=1, choices=((0, "Private"), (1, "Public")) ) diff --git a/apps/api/plane/db/models/workspace.py b/apps/api/plane/db/models/workspace.py index cb176086dd..75a45f72c0 100644 --- a/apps/api/plane/db/models/workspace.py +++ b/apps/api/plane/db/models/workspace.py @@ -332,6 +332,7 @@ class WorkspaceUserProperties(BaseModel): filters = models.JSONField(default=get_default_filters) display_filters = models.JSONField(default=get_default_display_filters) display_properties = models.JSONField(default=get_default_display_properties) + rich_filters = models.JSONField(default=dict) class Meta: unique_together = ["workspace", "user", "deleted_at"] From 9965fc75a6acfd93885ab827710b46debc8d369f Mon Sep 17 00:00:00 2001 From: Bavisetti Narayan <72156168+NarayanBavisetti@users.noreply.github.com> Date: Wed, 3 Sep 2025 19:56:20 +0530 Subject: [PATCH 079/138] [WEB-4806] chore: improved the html validation (#7676) * chore: improved the html validation * chore: removed the models changes * chore: removed extra filters * chore: changed the protocols --- apps/api/plane/utils/content_validator.py | 161 +++++++++++++++++++++- 1 file changed, 159 insertions(+), 2 deletions(-) diff --git a/apps/api/plane/utils/content_validator.py b/apps/api/plane/utils/content_validator.py index 47ee663ffc..5793542033 100644 --- a/apps/api/plane/utils/content_validator.py +++ b/apps/api/plane/utils/content_validator.py @@ -2,6 +2,9 @@ import base64 import nh3 from plane.utils.exception_logger import log_exception +from bs4 import BeautifulSoup +from collections import defaultdict + # Maximum allowed size for binary data (10MB) MAX_SIZE = 10 * 1024 * 1024 @@ -19,7 +22,8 @@ SUSPICIOUS_BINARY_PATTERNS = [ def validate_binary_data(data): """ - Validate that binary data appears to be valid document format and doesn't contain malicious content. + Validate that binary data appears to be a valid document format + and doesn't contain malicious content. Args: data (bytes or str): The binary data to validate, or base64-encoded string @@ -60,6 +64,141 @@ def validate_binary_data(data): return True, None +# Combine custom components and editor-specific nodes into a single set of tags +CUSTOM_TAGS = { + # editor node/tag names + "imageComponent", + "image", + "mention", + "link", + "customColor", + "emoji", + "tableHeader", + "tableCell", + "tableRow", + "codeBlock", + "code", + "horizontalRule", + "calloutComponent", + # component-style tag used by editor embeds + "image-component", +} +ALLOWED_TAGS = nh3.ALLOWED_TAGS | CUSTOM_TAGS + +# Merge nh3 defaults with all attributes used across our custom components +ATTRIBUTES = { + "*": { + "class", + "id", + "title", + "role", + "aria-label", + "aria-hidden", + "style", + # common editor data-* attributes seen in stored HTML + # (wildcards like data-* are NOT supported by nh3; we add known keys + # here and dynamically include all data-* seen in the input below) + "data-tight", + "data-node-type", + "data-type", + "data-checked", + "data-background", + "data-text-color", + "data-icon-name", + "data-icon-color", + "data-background-color", + "data-emoji-unicode", + "data-emoji-url", + "data-logo-in-use", + "data-block-type", + "data-name", + "data-entity-id", + "data-entity-group-id", + }, + "a": {"href", "target"}, + # editor node/tag attributes + "imageComponent": {"id", "width", "height", "aspectRatio", "src", "alignment"}, + "image": {"width", "height", "aspectRatio", "alignment", "src", "alt", "title"}, + "mention": {"id", "entity_identifier", "entity_name"}, + "link": {"href", "target"}, + "customColor": {"color", "backgroundColor"}, + "emoji": {"name"}, + "tableHeader": {"colspan", "rowspan", "colwidth", "background", "hideContent"}, + "tableCell": { + "colspan", + "rowspan", + "colwidth", + "background", + "textColor", + "hideContent", + }, + "tableRow": {"background", "textColor"}, + "codeBlock": {"language"}, + "calloutComponent": { + "data-icon-color", + "data-icon-name", + "data-emoji-unicode", + "data-emoji-url", + "data-logo-in-use", + "data-background", + "data-block-type", + }, + # image-component (from editor extension and seeds) + "image-component": {"src", "id", "width", "height", "aspectratio", "alignment"}, +} + +SAFE_PROTOCOLS = {"http", "https", "mailto", "tel"} + + +def _compute_html_sanitization_diff(before_html: str, after_html: str): + """ + Compute a coarse diff between original and sanitized HTML. + + Returns a dict with: + - removed_tags: mapping[tag] -> removed_count + - removed_attributes: mapping[tag] -> sorted list of attribute names removed + """ + try: + + def collect(soup): + tag_counts = defaultdict(int) + attrs_by_tag = defaultdict(set) + for el in soup.find_all(True): + tag_name = (el.name or "").lower() + if not tag_name: + continue + tag_counts[tag_name] += 1 + for attr_name in list(el.attrs.keys()): + if isinstance(attr_name, str) and attr_name: + attrs_by_tag[tag_name].add(attr_name.lower()) + return tag_counts, attrs_by_tag + + soup_before = BeautifulSoup(before_html or "", "html.parser") + soup_after = BeautifulSoup(after_html or "", "html.parser") + + counts_before, attrs_before = collect(soup_before) + counts_after, attrs_after = collect(soup_after) + + removed_tags = {} + for tag, cnt_before in counts_before.items(): + cnt_after = counts_after.get(tag, 0) + if cnt_after < cnt_before: + removed = cnt_before - cnt_after + removed_tags[tag] = removed + + removed_attributes = {} + for tag, before_set in attrs_before.items(): + after_set = attrs_after.get(tag, set()) + removed = before_set - after_set + if removed: + removed_attributes[tag] = sorted(list(removed)) + + return {"removed_tags": removed_tags, "removed_attributes": removed_attributes} + except Exception: + # Best-effort only; if diffing fails we don't block the request + return {"removed_tags": {}, "removed_attributes": {}} + + def validate_html_content(html_content: str): """ Sanitize HTML content using nh3. @@ -73,7 +212,25 @@ def validate_html_content(html_content: str): return False, "HTML content exceeds maximum size limit (10MB)", None try: - clean_html = nh3.clean(html_content) + clean_html = nh3.clean( + html_content, + tags=ALLOWED_TAGS, + attributes=ATTRIBUTES, + url_schemes=SAFE_PROTOCOLS, + ) + # Report removals to logger (Sentry) if anything was stripped + diff = _compute_html_sanitization_diff(html_content, clean_html) + if diff.get("removed_tags") or diff.get("removed_attributes"): + try: + import json + + summary = json.dumps(diff) + except Exception: + summary = str(diff) + log_exception( + f"HTML sanitization removals: {summary}", + warning=True, + ) return True, None, clean_html except Exception as e: log_exception(e) From cab5d202175619e15c06e2326b8b6dc1c7c30a5b Mon Sep 17 00:00:00 2001 From: Bavisetti Narayan <72156168+NarayanBavisetti@users.noreply.github.com> Date: Wed, 3 Sep 2025 19:56:20 +0530 Subject: [PATCH 080/138] [WEB-4806] chore: improved the html validation (#7676) * chore: improved the html validation * chore: removed the models changes * chore: removed extra filters * chore: changed the protocols --- apps/api/plane/utils/content_validator.py | 161 +++++++++++++++++++++- 1 file changed, 159 insertions(+), 2 deletions(-) diff --git a/apps/api/plane/utils/content_validator.py b/apps/api/plane/utils/content_validator.py index 47ee663ffc..5793542033 100644 --- a/apps/api/plane/utils/content_validator.py +++ b/apps/api/plane/utils/content_validator.py @@ -2,6 +2,9 @@ import base64 import nh3 from plane.utils.exception_logger import log_exception +from bs4 import BeautifulSoup +from collections import defaultdict + # Maximum allowed size for binary data (10MB) MAX_SIZE = 10 * 1024 * 1024 @@ -19,7 +22,8 @@ SUSPICIOUS_BINARY_PATTERNS = [ def validate_binary_data(data): """ - Validate that binary data appears to be valid document format and doesn't contain malicious content. + Validate that binary data appears to be a valid document format + and doesn't contain malicious content. Args: data (bytes or str): The binary data to validate, or base64-encoded string @@ -60,6 +64,141 @@ def validate_binary_data(data): return True, None +# Combine custom components and editor-specific nodes into a single set of tags +CUSTOM_TAGS = { + # editor node/tag names + "imageComponent", + "image", + "mention", + "link", + "customColor", + "emoji", + "tableHeader", + "tableCell", + "tableRow", + "codeBlock", + "code", + "horizontalRule", + "calloutComponent", + # component-style tag used by editor embeds + "image-component", +} +ALLOWED_TAGS = nh3.ALLOWED_TAGS | CUSTOM_TAGS + +# Merge nh3 defaults with all attributes used across our custom components +ATTRIBUTES = { + "*": { + "class", + "id", + "title", + "role", + "aria-label", + "aria-hidden", + "style", + # common editor data-* attributes seen in stored HTML + # (wildcards like data-* are NOT supported by nh3; we add known keys + # here and dynamically include all data-* seen in the input below) + "data-tight", + "data-node-type", + "data-type", + "data-checked", + "data-background", + "data-text-color", + "data-icon-name", + "data-icon-color", + "data-background-color", + "data-emoji-unicode", + "data-emoji-url", + "data-logo-in-use", + "data-block-type", + "data-name", + "data-entity-id", + "data-entity-group-id", + }, + "a": {"href", "target"}, + # editor node/tag attributes + "imageComponent": {"id", "width", "height", "aspectRatio", "src", "alignment"}, + "image": {"width", "height", "aspectRatio", "alignment", "src", "alt", "title"}, + "mention": {"id", "entity_identifier", "entity_name"}, + "link": {"href", "target"}, + "customColor": {"color", "backgroundColor"}, + "emoji": {"name"}, + "tableHeader": {"colspan", "rowspan", "colwidth", "background", "hideContent"}, + "tableCell": { + "colspan", + "rowspan", + "colwidth", + "background", + "textColor", + "hideContent", + }, + "tableRow": {"background", "textColor"}, + "codeBlock": {"language"}, + "calloutComponent": { + "data-icon-color", + "data-icon-name", + "data-emoji-unicode", + "data-emoji-url", + "data-logo-in-use", + "data-background", + "data-block-type", + }, + # image-component (from editor extension and seeds) + "image-component": {"src", "id", "width", "height", "aspectratio", "alignment"}, +} + +SAFE_PROTOCOLS = {"http", "https", "mailto", "tel"} + + +def _compute_html_sanitization_diff(before_html: str, after_html: str): + """ + Compute a coarse diff between original and sanitized HTML. + + Returns a dict with: + - removed_tags: mapping[tag] -> removed_count + - removed_attributes: mapping[tag] -> sorted list of attribute names removed + """ + try: + + def collect(soup): + tag_counts = defaultdict(int) + attrs_by_tag = defaultdict(set) + for el in soup.find_all(True): + tag_name = (el.name or "").lower() + if not tag_name: + continue + tag_counts[tag_name] += 1 + for attr_name in list(el.attrs.keys()): + if isinstance(attr_name, str) and attr_name: + attrs_by_tag[tag_name].add(attr_name.lower()) + return tag_counts, attrs_by_tag + + soup_before = BeautifulSoup(before_html or "", "html.parser") + soup_after = BeautifulSoup(after_html or "", "html.parser") + + counts_before, attrs_before = collect(soup_before) + counts_after, attrs_after = collect(soup_after) + + removed_tags = {} + for tag, cnt_before in counts_before.items(): + cnt_after = counts_after.get(tag, 0) + if cnt_after < cnt_before: + removed = cnt_before - cnt_after + removed_tags[tag] = removed + + removed_attributes = {} + for tag, before_set in attrs_before.items(): + after_set = attrs_after.get(tag, set()) + removed = before_set - after_set + if removed: + removed_attributes[tag] = sorted(list(removed)) + + return {"removed_tags": removed_tags, "removed_attributes": removed_attributes} + except Exception: + # Best-effort only; if diffing fails we don't block the request + return {"removed_tags": {}, "removed_attributes": {}} + + def validate_html_content(html_content: str): """ Sanitize HTML content using nh3. @@ -73,7 +212,25 @@ def validate_html_content(html_content: str): return False, "HTML content exceeds maximum size limit (10MB)", None try: - clean_html = nh3.clean(html_content) + clean_html = nh3.clean( + html_content, + tags=ALLOWED_TAGS, + attributes=ATTRIBUTES, + url_schemes=SAFE_PROTOCOLS, + ) + # Report removals to logger (Sentry) if anything was stripped + diff = _compute_html_sanitization_diff(html_content, clean_html) + if diff.get("removed_tags") or diff.get("removed_attributes"): + try: + import json + + summary = json.dumps(diff) + except Exception: + summary = str(diff) + log_exception( + f"HTML sanitization removals: {summary}", + warning=True, + ) return True, None, clean_html except Exception as e: log_exception(e) From 36c735bede87827ac0a387a3426af2794d9d6d50 Mon Sep 17 00:00:00 2001 From: Bavisetti Narayan <72156168+NarayanBavisetti@users.noreply.github.com> Date: Thu, 4 Sep 2025 13:52:43 +0530 Subject: [PATCH 081/138] [WEB-4806] chore: updated html attribute validation #7719 --- apps/api/plane/utils/content_validator.py | 84 ++++++++++++----------- 1 file changed, 44 insertions(+), 40 deletions(-) diff --git a/apps/api/plane/utils/content_validator.py b/apps/api/plane/utils/content_validator.py index 5793542033..2fcabd69f5 100644 --- a/apps/api/plane/utils/content_validator.py +++ b/apps/api/plane/utils/content_validator.py @@ -67,20 +67,9 @@ def validate_binary_data(data): # Combine custom components and editor-specific nodes into a single set of tags CUSTOM_TAGS = { # editor node/tag names - "imageComponent", - "image", - "mention", - "link", - "customColor", - "emoji", - "tableHeader", - "tableCell", - "tableRow", - "codeBlock", - "code", - "horizontalRule", - "calloutComponent", - # component-style tag used by editor embeds + "mention-component", + "label", + "input", "image-component", } ALLOWED_TAGS = nh3.ALLOWED_TAGS | CUSTOM_TAGS @@ -102,49 +91,64 @@ ATTRIBUTES = { "data-node-type", "data-type", "data-checked", - "data-background", + "data-background-color", "data-text-color", + "data-name", + # callout attributes "data-icon-name", "data-icon-color", - "data-background-color", + "data-background", "data-emoji-unicode", "data-emoji-url", "data-logo-in-use", "data-block-type", - "data-name", - "data-entity-id", - "data-entity-group-id", }, "a": {"href", "target"}, # editor node/tag attributes - "imageComponent": {"id", "width", "height", "aspectRatio", "src", "alignment"}, - "image": {"width", "height", "aspectRatio", "alignment", "src", "alt", "title"}, - "mention": {"id", "entity_identifier", "entity_name"}, - "link": {"href", "target"}, - "customColor": {"color", "backgroundColor"}, - "emoji": {"name"}, - "tableHeader": {"colspan", "rowspan", "colwidth", "background", "hideContent"}, - "tableCell": { + "image-component": { + "id", + "width", + "height", + "aspectRatio", + "aspectratio", + "src", + "alignment", + }, + "img": { + "width", + "height", + "aspectRatio", + "aspectratio", + "alignment", + "src", + "alt", + "title", + }, + "mention-component": {"id", "entity_identifier", "entity_name"}, + "th": { + "colspan", + "rowspan", + "colwidth", + "background", + "hideContent", + "hidecontent", + "style", + }, + "td": { "colspan", "rowspan", "colwidth", "background", "textColor", + "textcolor", "hideContent", + "hidecontent", + "style", }, - "tableRow": {"background", "textColor"}, - "codeBlock": {"language"}, - "calloutComponent": { - "data-icon-color", - "data-icon-name", - "data-emoji-unicode", - "data-emoji-url", - "data-logo-in-use", - "data-background", - "data-block-type", - }, - # image-component (from editor extension and seeds) - "image-component": {"src", "id", "width", "height", "aspectratio", "alignment"}, + "tr": {"background", "textColor", "textcolor", "style"}, + "pre": {"language"}, + "code": {"language", "spellcheck"}, + "input": {"type", "checked"}, } SAFE_PROTOCOLS = {"http", "https", "mailto", "tel"} From c40c7804e7711f6b1c605fa5fcdb5934ced8e834 Mon Sep 17 00:00:00 2001 From: Bavisetti Narayan <72156168+NarayanBavisetti@users.noreply.github.com> Date: Thu, 4 Sep 2025 13:52:43 +0530 Subject: [PATCH 082/138] [WEB-4806] chore: updated html attribute validation #7719 --- apps/api/plane/utils/content_validator.py | 84 ++++++++++++----------- 1 file changed, 44 insertions(+), 40 deletions(-) diff --git a/apps/api/plane/utils/content_validator.py b/apps/api/plane/utils/content_validator.py index 5793542033..2fcabd69f5 100644 --- a/apps/api/plane/utils/content_validator.py +++ b/apps/api/plane/utils/content_validator.py @@ -67,20 +67,9 @@ def validate_binary_data(data): # Combine custom components and editor-specific nodes into a single set of tags CUSTOM_TAGS = { # editor node/tag names - "imageComponent", - "image", - "mention", - "link", - "customColor", - "emoji", - "tableHeader", - "tableCell", - "tableRow", - "codeBlock", - "code", - "horizontalRule", - "calloutComponent", - # component-style tag used by editor embeds + "mention-component", + "label", + "input", "image-component", } ALLOWED_TAGS = nh3.ALLOWED_TAGS | CUSTOM_TAGS @@ -102,49 +91,64 @@ ATTRIBUTES = { "data-node-type", "data-type", "data-checked", - "data-background", + "data-background-color", "data-text-color", + "data-name", + # callout attributes "data-icon-name", "data-icon-color", - "data-background-color", + "data-background", "data-emoji-unicode", "data-emoji-url", "data-logo-in-use", "data-block-type", - "data-name", - "data-entity-id", - "data-entity-group-id", }, "a": {"href", "target"}, # editor node/tag attributes - "imageComponent": {"id", "width", "height", "aspectRatio", "src", "alignment"}, - "image": {"width", "height", "aspectRatio", "alignment", "src", "alt", "title"}, - "mention": {"id", "entity_identifier", "entity_name"}, - "link": {"href", "target"}, - "customColor": {"color", "backgroundColor"}, - "emoji": {"name"}, - "tableHeader": {"colspan", "rowspan", "colwidth", "background", "hideContent"}, - "tableCell": { + "image-component": { + "id", + "width", + "height", + "aspectRatio", + "aspectratio", + "src", + "alignment", + }, + "img": { + "width", + "height", + "aspectRatio", + "aspectratio", + "alignment", + "src", + "alt", + "title", + }, + "mention-component": {"id", "entity_identifier", "entity_name"}, + "th": { + "colspan", + "rowspan", + "colwidth", + "background", + "hideContent", + "hidecontent", + "style", + }, + "td": { "colspan", "rowspan", "colwidth", "background", "textColor", + "textcolor", "hideContent", + "hidecontent", + "style", }, - "tableRow": {"background", "textColor"}, - "codeBlock": {"language"}, - "calloutComponent": { - "data-icon-color", - "data-icon-name", - "data-emoji-unicode", - "data-emoji-url", - "data-logo-in-use", - "data-background", - "data-block-type", - }, - # image-component (from editor extension and seeds) - "image-component": {"src", "id", "width", "height", "aspectratio", "alignment"}, + "tr": {"background", "textColor", "textcolor", "style"}, + "pre": {"language"}, + "code": {"language", "spellcheck"}, + "input": {"type", "checked"}, } SAFE_PROTOCOLS = {"http", "https", "mailto", "tel"} From d258080ee748454ed784f7438c5f4e8970370a49 Mon Sep 17 00:00:00 2001 From: Akshat Jain Date: Thu, 4 Sep 2025 14:18:45 +0530 Subject: [PATCH 083/138] [INFRA-235] fix: docker compose file `restart_policy` changed to `any` (#7689) * chore: update docker-compose.yml to change restart policy condition from 'on-failure' to 'any' and remove SSL variable from variables.env * fix: update docker-compose.yml to change restart policy condition from 'any' to 'on-failure' --- deployments/cli/community/docker-compose.yml | 25 ++++++++++---------- deployments/cli/community/variables.env | 1 - 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/deployments/cli/community/docker-compose.yml b/deployments/cli/community/docker-compose.yml index 7afc8d2a14..6c415b35a6 100644 --- a/deployments/cli/community/docker-compose.yml +++ b/deployments/cli/community/docker-compose.yml @@ -24,7 +24,6 @@ x-aws-s3-env: &aws-s3-env AWS_S3_BUCKET_NAME: ${AWS_S3_BUCKET_NAME:-uploads} x-proxy-env: &proxy-env - SSL: ${SSL:-false} APP_DOMAIN: ${APP_DOMAIN:-localhost} FILE_SIZE_LIMIT: ${FILE_SIZE_LIMIT:-5242880} CERT_EMAIL: ${CERT_EMAIL} @@ -64,7 +63,7 @@ services: deploy: replicas: ${WEB_REPLICAS:-1} restart_policy: - condition: on-failure + condition: any depends_on: - api - worker @@ -74,7 +73,7 @@ services: deploy: replicas: ${SPACE_REPLICAS:-1} restart_policy: - condition: on-failure + condition: any depends_on: - api - worker @@ -85,7 +84,7 @@ services: deploy: replicas: ${ADMIN_REPLICAS:-1} restart_policy: - condition: on-failure + condition: any depends_on: - api - web @@ -97,7 +96,7 @@ services: deploy: replicas: ${LIVE_REPLICAS:-1} restart_policy: - condition: on-failure + condition: any depends_on: - api - web @@ -108,7 +107,7 @@ services: deploy: replicas: ${API_REPLICAS:-1} restart_policy: - condition: on-failure + condition: any volumes: - logs_api:/code/plane/logs environment: @@ -124,7 +123,7 @@ services: deploy: replicas: ${WORKER_REPLICAS:-1} restart_policy: - condition: on-failure + condition: any volumes: - logs_worker:/code/plane/logs environment: @@ -141,7 +140,7 @@ services: deploy: replicas: ${BEAT_WORKER_REPLICAS:-1} restart_policy: - condition: on-failure + condition: any volumes: - logs_beat-worker:/code/plane/logs environment: @@ -174,7 +173,7 @@ services: deploy: replicas: 1 restart_policy: - condition: on-failure + condition: any environment: <<: *db-env volumes: @@ -185,7 +184,7 @@ services: deploy: replicas: 1 restart_policy: - condition: on-failure + condition: any volumes: - redisdata:/data @@ -194,7 +193,7 @@ services: deploy: replicas: 1 restart_policy: - condition: on-failure + condition: any environment: <<: *mq-env volumes: @@ -207,7 +206,7 @@ services: deploy: replicas: 1 restart_policy: - condition: on-failure + condition: any environment: <<: *minio-env volumes: @@ -219,7 +218,7 @@ services: deploy: replicas: 1 restart_policy: - condition: on-failure + condition: any environment: <<: *proxy-env ports: diff --git a/deployments/cli/community/variables.env b/deployments/cli/community/variables.env index 66265f9a1e..9a8d52edcf 100644 --- a/deployments/cli/community/variables.env +++ b/deployments/cli/community/variables.env @@ -1,6 +1,5 @@ APP_DOMAIN=localhost APP_RELEASE=stable -SSL=false WEB_REPLICAS=1 SPACE_REPLICAS=1 From 7d7e37439d8356c17beceedf436858bf01c6348b Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Thu, 4 Sep 2025 14:44:53 +0530 Subject: [PATCH 084/138] [WEB-4840] chore: icon migration from @plane/ui to @plane/propel/icons (#7721) * chore: move icons from ui package to propel package * chore: package and tsdown config updated * chore: migrate all icon imports from @plane/ui to @plane/propel/icons * chore: remove icon components from @plane/ui package (migrated to @plane/propel/icons) * chore: code refactoring * chore: migrate remaining icon components from @Plane/ui to @Plane/propel/icons * fix: lint error * chore: code refactor --- .../app/(all)/(dashboard)/sidebar-help-section.tsx | 2 +- apps/admin/app/(all)/(dashboard)/sidebar-menu.tsx | 2 +- apps/admin/app/(all)/(home)/auth-header.tsx | 2 +- apps/space/core/components/account/user-logged-in.tsx | 2 +- apps/space/core/components/common/powered-by.tsx | 2 +- .../issues/filters/applied-filters/priority.tsx | 2 +- .../issues/filters/applied-filters/state.tsx | 2 +- .../space/core/components/issues/filters/priority.tsx | 2 +- apps/space/core/components/issues/filters/state.tsx | 3 ++- .../issues/issue-layouts/properties/cycle.tsx | 2 +- .../issues/issue-layouts/properties/modules.tsx | 2 +- .../issues/issue-layouts/properties/priority.tsx | 2 +- .../issues/issue-layouts/properties/state.tsx | 2 +- .../core/components/issues/issue-layouts/utils.tsx | 3 ++- .../core/components/issues/peek-overview/header.tsx | 3 ++- .../issues/peek-overview/issue-properties.tsx | 3 ++- apps/space/core/components/views/header.tsx | 2 +- .../(projects)/active-cycles/header.tsx | 3 ++- .../(projects)/profile/[userId]/header.tsx | 3 ++- .../projects/(detail)/[projectId]/archives/header.tsx | 3 ++- .../[projectId]/archives/issues/(detail)/header.tsx | 3 ++- .../(detail)/[projectId]/cycles/(detail)/header.tsx | 3 ++- .../(detail)/[projectId]/modules/(detail)/header.tsx | 3 ++- .../[workspaceSlug]/(projects)/stickies/header.tsx | 3 ++- apps/web/app/(all)/create-workspace/page.tsx | 3 ++- apps/web/app/(all)/invitations/page.tsx | 3 ++- .../web/ce/components/breadcrumbs/project-feature.tsx | 3 ++- .../actions/work-item-actions/change-state-list.tsx | 3 ++- apps/web/ce/components/command-palette/helpers.tsx | 2 +- .../ce/components/global/product-updates-header.tsx | 2 +- apps/web/ce/components/issues/issue-layouts/utils.tsx | 2 +- apps/web/ce/components/projects/navigation/helper.tsx | 2 +- apps/web/ce/components/relations/index.tsx | 2 +- apps/web/ce/components/workspace/sidebar/helper.tsx | 2 +- apps/web/ce/constants/project/settings/features.tsx | 2 +- apps/web/ce/constants/sidebar-favorites.ts | 2 +- apps/web/core/components/auth-screens/footer.tsx | 2 +- apps/web/core/components/auth-screens/header.tsx | 2 +- .../components/automation/auto-close-automation.tsx | 3 ++- .../command-palette/actions/help-actions.tsx | 2 +- .../actions/issue-actions/actions-list.tsx | 3 ++- .../actions/issue-actions/change-priority.tsx | 2 +- .../command-palette/actions/project-actions.tsx | 2 +- .../core/components/command-palette/command-modal.tsx | 3 ++- apps/web/core/components/common/activity/helper.tsx | 2 +- apps/web/core/components/common/switcher-label.tsx | 2 +- apps/web/core/components/core/activity.tsx | 2 +- .../components/core/filters/date-filter-select.tsx | 3 ++- .../components/cycles/active-cycle/cycle-stats.tsx | 3 ++- .../cycles/analytics-sidebar/progress-stats.tsx | 3 ++- .../cycles/list/cycle-list-group-header.tsx | 3 ++- .../components/cycles/list/cycle-list-item-action.tsx | 3 ++- apps/web/core/components/cycles/quick-actions.tsx | 3 ++- .../core/components/cycles/transfer-issues-modal.tsx | 3 ++- apps/web/core/components/cycles/transfer-issues.tsx | 3 ++- .../core/components/dropdowns/cycle/cycle-options.tsx | 2 +- apps/web/core/components/dropdowns/cycle/index.tsx | 3 ++- .../components/dropdowns/module/button-content.tsx | 2 +- .../components/dropdowns/module/module-options.tsx | 2 +- apps/web/core/components/dropdowns/priority.tsx | 3 ++- apps/web/core/components/dropdowns/state/base.tsx | 3 ++- .../core/components/global/product-updates/footer.tsx | 3 ++- .../components/home/widgets/empty-states/recents.tsx | 2 +- .../components/home/widgets/empty-states/stickies.tsx | 2 +- .../core/components/home/widgets/recents/index.tsx | 2 +- .../core/components/home/widgets/recents/issue.tsx | 2 +- .../components/inbox/content/issue-properties.tsx | 3 ++- .../inbox/inbox-filter/applied-filters/priority.tsx | 3 ++- .../inbox/inbox-filter/applied-filters/state.tsx | 3 ++- .../inbox/inbox-filter/filters/priority.tsx | 2 +- .../components/inbox/inbox-filter/filters/state.tsx | 3 ++- apps/web/core/components/inbox/root.tsx | 2 +- .../core/components/inbox/sidebar/inbox-list-item.tsx | 3 ++- .../issue-activity/activity/actions/archived-at.tsx | 2 +- .../issue-activity/activity/actions/cycle.tsx | 2 +- .../issue-activity/activity/actions/default.tsx | 2 +- .../issue-activity/activity/actions/inbox.tsx | 2 +- .../issue-activity/activity/actions/module.tsx | 2 +- .../issue-activity/activity/actions/state.tsx | 2 +- .../core/components/issues/issue-detail/sidebar.tsx | 2 +- .../issue-layouts/filters/applied-filters/cycle.tsx | 2 +- .../issue-layouts/filters/applied-filters/module.tsx | 2 +- .../filters/applied-filters/priority.tsx | 2 +- .../filters/applied-filters/state-group.tsx | 2 +- .../issue-layouts/filters/applied-filters/state.tsx | 2 +- .../issue-layouts/filters/header/filters/cycle.tsx | 3 ++- .../issue-layouts/filters/header/filters/module.tsx | 3 ++- .../issue-layouts/filters/header/filters/priority.tsx | 2 +- .../filters/header/filters/state-group.tsx | 2 +- .../issue-layouts/filters/header/filters/state.tsx | 3 ++- .../issue-layouts/quick-action-dropdowns/helper.tsx | 3 ++- .../core/components/issues/issue-layouts/utils.tsx | 3 ++- .../core/components/issues/peek-overview/header.tsx | 3 ++- .../components/issues/peek-overview/properties.tsx | 2 +- .../modules/analytics-sidebar/progress-stats.tsx | 3 ++- .../components/modules/analytics-sidebar/root.tsx | 3 ++- .../components/modules/applied-filters/status.tsx | 2 +- .../components/modules/dropdowns/filters/root.tsx | 2 +- .../components/modules/dropdowns/filters/status.tsx | 2 +- .../core/components/modules/gantt-chart/blocks.tsx | 2 +- apps/web/core/components/modules/module-card-item.tsx | 11 ++--------- .../components/modules/module-status-dropdown.tsx | 3 ++- apps/web/core/components/modules/quick-actions.tsx | 3 ++- apps/web/core/components/modules/select/status.tsx | 3 ++- .../modules/sidebar-select/select-status.tsx | 3 ++- apps/web/core/components/onboarding/header.tsx | 2 +- apps/web/core/components/onboarding/tour/root.tsx | 3 ++- apps/web/core/components/onboarding/tour/sidebar.tsx | 2 +- apps/web/core/components/pages/dropdowns/actions.tsx | 3 ++- .../core/components/pages/header/archived-badge.tsx | 2 +- apps/web/core/components/profile/overview/stats.tsx | 3 ++- .../web/core/components/project-states/group-item.tsx | 2 +- .../components/project-states/state-item-title.tsx | 2 +- apps/web/core/components/stickies/action-bar.tsx | 2 +- apps/web/core/components/stickies/modal/stickies.tsx | 2 +- .../sidebar/header/options/menu-option/root.tsx | 3 ++- .../sidebar/notification-card/options/archive.tsx | 3 ++- .../workspace/sidebar/favorites/favorite-folder.tsx | 3 ++- .../workspace/sidebar/favorites/new-fav-folder.tsx | 3 ++- .../workspace/sidebar/project-navigation.tsx | 2 +- .../workspace/sidebar/projects-list-item.tsx | 3 ++- .../core/components/workspace/sidebar/user-menu.tsx | 2 +- .../components/workspace/sidebar/workspace-menu.tsx | 2 +- apps/web/core/constants/editor.ts | 2 +- apps/web/core/constants/plans.tsx | 2 +- .../core/layouts/auth-layout/workspace-wrapper.tsx | 3 ++- packages/propel/package.json | 1 + packages/{ui => propel}/src/icons/activity-icon.tsx | 0 packages/{ui => propel}/src/icons/ai-icon.tsx | 0 packages/{ui => propel}/src/icons/archive-icon.tsx | 0 packages/{ui => propel}/src/icons/at-risk-icon.tsx | 0 packages/{ui => propel}/src/icons/bar-icon.tsx | 0 packages/{ui => propel}/src/icons/blocked-icon.tsx | 0 packages/{ui => propel}/src/icons/blocker-icon.tsx | 0 .../{ui => propel}/src/icons/brand/accenture-logo.tsx | 0 .../{ui => propel}/src/icons/brand/dolby-logo.tsx | 0 packages/{ui => propel}/src/icons/brand/index.ts | 0 .../{ui => propel}/src/icons/brand/plane-lockup.tsx | 0 .../{ui => propel}/src/icons/brand/plane-logo.tsx | 0 .../{ui => propel}/src/icons/brand/plane-wordmark.tsx | 0 packages/{ui => propel}/src/icons/brand/sony-logo.tsx | 0 .../{ui => propel}/src/icons/brand/zerodha-logo.tsx | 0 .../{ui => propel}/src/icons/calendar-after-icon.tsx | 0 .../{ui => propel}/src/icons/calendar-before-icon.tsx | 0 .../{ui => propel}/src/icons/center-panel-icon.tsx | 0 .../{ui => propel}/src/icons/comment-fill-icon.tsx | 0 packages/{ui => propel}/src/icons/create-icon.tsx | 0 .../src/icons/cycle/circle-dot-full-icon.tsx | 0 .../{ui => propel}/src/icons/cycle/contrast-icon.tsx | 0 .../src/icons/cycle/cycle-group-icon.tsx | 2 +- .../src/icons/cycle/double-circle-icon.tsx | 0 packages/{ui => propel}/src/icons/cycle/helper.tsx | 0 packages/{ui => propel}/src/icons/cycle/index.ts | 0 packages/{ui => propel}/src/icons/dice-icon.tsx | 0 packages/{ui => propel}/src/icons/discord-icon.tsx | 0 .../{ui => propel}/src/icons/display-properties.tsx | 0 packages/{ui => propel}/src/icons/done-icon.tsx | 2 +- packages/{ui => propel}/src/icons/dropdown-icon.tsx | 0 packages/{ui => propel}/src/icons/epic-icon.tsx | 0 .../{ui => propel}/src/icons/favorite-folder-icon.tsx | 0 .../src/icons/full-screen-panel-icon.tsx | 0 packages/{ui => propel}/src/icons/github-icon.tsx | 0 packages/{ui => propel}/src/icons/gitlab-icon.tsx | 0 .../{ui => propel}/src/icons/in-progress-icon.tsx | 0 packages/{ui => propel}/src/icons/index.ts | 0 packages/{ui => propel}/src/icons/info-fill-icon.tsx | 0 packages/{ui => propel}/src/icons/info-icon.tsx | 0 packages/{ui => propel}/src/icons/intake.tsx | 0 packages/{ui => propel}/src/icons/layer-stack.tsx | 0 packages/{ui => propel}/src/icons/layers-icon.tsx | 0 packages/{ui => propel}/src/icons/lead-icon.tsx | 0 packages/{ui => propel}/src/icons/module/backlog.tsx | 0 .../{ui => propel}/src/icons/module/cancelled.tsx | 0 .../{ui => propel}/src/icons/module/completed.tsx | 0 .../{ui => propel}/src/icons/module/in-progress.tsx | 0 packages/{ui => propel}/src/icons/module/index.ts | 0 .../src/icons/module/module-status-icon.tsx | 0 packages/{ui => propel}/src/icons/module/paused.tsx | 0 packages/{ui => propel}/src/icons/module/planned.tsx | 0 packages/{ui => propel}/src/icons/monospace-icon.tsx | 0 packages/{ui => propel}/src/icons/multiple-sticky.tsx | 0 packages/{ui => propel}/src/icons/off-track-icon.tsx | 0 packages/{ui => propel}/src/icons/on-track-icon.tsx | 0 packages/{ui => propel}/src/icons/overview-icon.tsx | 0 packages/{ui => propel}/src/icons/pending-icon.tsx | 0 .../{ui => propel}/src/icons/photo-filter-icon.tsx | 0 packages/{ui => propel}/src/icons/pi-chat.tsx | 0 packages/{ui => propel}/src/icons/plane-icon.tsx | 0 packages/{ui => propel}/src/icons/planned-icon.tsx | 2 +- packages/{ui => propel}/src/icons/priority-icon.tsx | 2 +- packages/{ui => propel}/src/icons/related-icon.tsx | 0 packages/{ui => propel}/src/icons/sans-serif-icon.tsx | 0 packages/{ui => propel}/src/icons/serif-icon.tsx | 0 packages/{ui => propel}/src/icons/side-panel-icon.tsx | 0 .../src/icons/state/backlog-group-icon.tsx | 0 .../src/icons/state/cancelled-group-icon.tsx | 0 .../src/icons/state/completed-group-icon.tsx | 0 .../{ui => propel}/src/icons/state/dashed-circle.tsx | 0 packages/{ui => propel}/src/icons/state/helper.tsx | 0 packages/{ui => propel}/src/icons/state/index.ts | 0 .../src/icons/state/progress-circle.tsx | 0 .../src/icons/state/started-group-icon.tsx | 0 .../src/icons/state/state-group-icon.tsx | 0 .../src/icons/state/unstarted-group-icon.tsx | 0 .../{ui => propel}/src/icons/sticky-note-icon.tsx | 0 packages/{ui => propel}/src/icons/teams.tsx | 0 packages/{ui => propel}/src/icons/transfer-icon.tsx | 0 packages/{ui => propel}/src/icons/tree-map-icon.tsx | 0 packages/{ui => propel}/src/icons/type.ts | 0 packages/{ui => propel}/src/icons/updates-icon.tsx | 4 ++-- .../{ui => propel}/src/icons/user-activity-icon.tsx | 0 packages/{ui => propel}/src/icons/wiki-icon.tsx | 0 packages/{ui => propel}/src/icons/workspace-icon.tsx | 0 packages/propel/tsdown.config.ts | 1 + packages/ui/src/breadcrumbs/breadcrumbs.stories.tsx | 2 +- packages/ui/src/collapsible/collapsible-button.tsx | 2 +- packages/ui/src/emoji/icons-list.tsx | 2 +- packages/ui/src/emoji/lucide-icons-list.tsx | 2 +- packages/ui/src/index.ts | 1 - packages/utils/src/string.ts | 2 +- 220 files changed, 196 insertions(+), 146 deletions(-) rename packages/{ui => propel}/src/icons/activity-icon.tsx (100%) rename packages/{ui => propel}/src/icons/ai-icon.tsx (100%) rename packages/{ui => propel}/src/icons/archive-icon.tsx (100%) rename packages/{ui => propel}/src/icons/at-risk-icon.tsx (100%) rename packages/{ui => propel}/src/icons/bar-icon.tsx (100%) rename packages/{ui => propel}/src/icons/blocked-icon.tsx (100%) rename packages/{ui => propel}/src/icons/blocker-icon.tsx (100%) rename packages/{ui => propel}/src/icons/brand/accenture-logo.tsx (100%) rename packages/{ui => propel}/src/icons/brand/dolby-logo.tsx (100%) rename packages/{ui => propel}/src/icons/brand/index.ts (100%) rename packages/{ui => propel}/src/icons/brand/plane-lockup.tsx (100%) rename packages/{ui => propel}/src/icons/brand/plane-logo.tsx (100%) rename packages/{ui => propel}/src/icons/brand/plane-wordmark.tsx (100%) rename packages/{ui => propel}/src/icons/brand/sony-logo.tsx (100%) rename packages/{ui => propel}/src/icons/brand/zerodha-logo.tsx (100%) rename packages/{ui => propel}/src/icons/calendar-after-icon.tsx (100%) rename packages/{ui => propel}/src/icons/calendar-before-icon.tsx (100%) rename packages/{ui => propel}/src/icons/center-panel-icon.tsx (100%) rename packages/{ui => propel}/src/icons/comment-fill-icon.tsx (100%) rename packages/{ui => propel}/src/icons/create-icon.tsx (100%) rename packages/{ui => propel}/src/icons/cycle/circle-dot-full-icon.tsx (100%) rename packages/{ui => propel}/src/icons/cycle/contrast-icon.tsx (100%) rename packages/{ui => propel}/src/icons/cycle/cycle-group-icon.tsx (100%) rename packages/{ui => propel}/src/icons/cycle/double-circle-icon.tsx (100%) rename packages/{ui => propel}/src/icons/cycle/helper.tsx (100%) rename packages/{ui => propel}/src/icons/cycle/index.ts (100%) rename packages/{ui => propel}/src/icons/dice-icon.tsx (100%) rename packages/{ui => propel}/src/icons/discord-icon.tsx (100%) rename packages/{ui => propel}/src/icons/display-properties.tsx (100%) rename packages/{ui => propel}/src/icons/done-icon.tsx (94%) rename packages/{ui => propel}/src/icons/dropdown-icon.tsx (100%) rename packages/{ui => propel}/src/icons/epic-icon.tsx (100%) rename packages/{ui => propel}/src/icons/favorite-folder-icon.tsx (100%) rename packages/{ui => propel}/src/icons/full-screen-panel-icon.tsx (100%) rename packages/{ui => propel}/src/icons/github-icon.tsx (100%) rename packages/{ui => propel}/src/icons/gitlab-icon.tsx (100%) rename packages/{ui => propel}/src/icons/in-progress-icon.tsx (100%) rename packages/{ui => propel}/src/icons/index.ts (100%) rename packages/{ui => propel}/src/icons/info-fill-icon.tsx (100%) rename packages/{ui => propel}/src/icons/info-icon.tsx (100%) rename packages/{ui => propel}/src/icons/intake.tsx (100%) rename packages/{ui => propel}/src/icons/layer-stack.tsx (100%) rename packages/{ui => propel}/src/icons/layers-icon.tsx (100%) rename packages/{ui => propel}/src/icons/lead-icon.tsx (100%) rename packages/{ui => propel}/src/icons/module/backlog.tsx (100%) rename packages/{ui => propel}/src/icons/module/cancelled.tsx (100%) rename packages/{ui => propel}/src/icons/module/completed.tsx (100%) rename packages/{ui => propel}/src/icons/module/in-progress.tsx (100%) rename packages/{ui => propel}/src/icons/module/index.ts (100%) rename packages/{ui => propel}/src/icons/module/module-status-icon.tsx (100%) rename packages/{ui => propel}/src/icons/module/paused.tsx (100%) rename packages/{ui => propel}/src/icons/module/planned.tsx (100%) rename packages/{ui => propel}/src/icons/monospace-icon.tsx (100%) rename packages/{ui => propel}/src/icons/multiple-sticky.tsx (100%) rename packages/{ui => propel}/src/icons/off-track-icon.tsx (100%) rename packages/{ui => propel}/src/icons/on-track-icon.tsx (100%) rename packages/{ui => propel}/src/icons/overview-icon.tsx (100%) rename packages/{ui => propel}/src/icons/pending-icon.tsx (100%) rename packages/{ui => propel}/src/icons/photo-filter-icon.tsx (100%) rename packages/{ui => propel}/src/icons/pi-chat.tsx (100%) rename packages/{ui => propel}/src/icons/plane-icon.tsx (100%) rename packages/{ui => propel}/src/icons/planned-icon.tsx (98%) rename packages/{ui => propel}/src/icons/priority-icon.tsx (100%) rename packages/{ui => propel}/src/icons/related-icon.tsx (100%) rename packages/{ui => propel}/src/icons/sans-serif-icon.tsx (100%) rename packages/{ui => propel}/src/icons/serif-icon.tsx (100%) rename packages/{ui => propel}/src/icons/side-panel-icon.tsx (100%) rename packages/{ui => propel}/src/icons/state/backlog-group-icon.tsx (100%) rename packages/{ui => propel}/src/icons/state/cancelled-group-icon.tsx (100%) rename packages/{ui => propel}/src/icons/state/completed-group-icon.tsx (100%) rename packages/{ui => propel}/src/icons/state/dashed-circle.tsx (100%) rename packages/{ui => propel}/src/icons/state/helper.tsx (100%) rename packages/{ui => propel}/src/icons/state/index.ts (100%) rename packages/{ui => propel}/src/icons/state/progress-circle.tsx (100%) rename packages/{ui => propel}/src/icons/state/started-group-icon.tsx (100%) rename packages/{ui => propel}/src/icons/state/state-group-icon.tsx (100%) rename packages/{ui => propel}/src/icons/state/unstarted-group-icon.tsx (100%) rename packages/{ui => propel}/src/icons/sticky-note-icon.tsx (100%) rename packages/{ui => propel}/src/icons/teams.tsx (100%) rename packages/{ui => propel}/src/icons/transfer-icon.tsx (100%) rename packages/{ui => propel}/src/icons/tree-map-icon.tsx (100%) rename packages/{ui => propel}/src/icons/type.ts (100%) rename packages/{ui => propel}/src/icons/updates-icon.tsx (97%) rename packages/{ui => propel}/src/icons/user-activity-icon.tsx (100%) rename packages/{ui => propel}/src/icons/wiki-icon.tsx (100%) rename packages/{ui => propel}/src/icons/workspace-icon.tsx (100%) diff --git a/apps/admin/app/(all)/(dashboard)/sidebar-help-section.tsx b/apps/admin/app/(all)/(dashboard)/sidebar-help-section.tsx index d75b84be5b..c4421ae5fd 100644 --- a/apps/admin/app/(all)/(dashboard)/sidebar-help-section.tsx +++ b/apps/admin/app/(all)/(dashboard)/sidebar-help-section.tsx @@ -7,8 +7,8 @@ import { ExternalLink, FileText, HelpCircle, MoveLeft } from "lucide-react"; import { Transition } from "@headlessui/react"; // plane internal packages import { WEB_BASE_URL } from "@plane/constants"; +import { DiscordIcon, GithubIcon } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; -import { DiscordIcon, GithubIcon } from "@plane/ui"; import { cn } from "@plane/utils"; // hooks import { useTheme } from "@/hooks/store"; diff --git a/apps/admin/app/(all)/(dashboard)/sidebar-menu.tsx b/apps/admin/app/(all)/(dashboard)/sidebar-menu.tsx index ff5aabd3ca..b33ccecffb 100644 --- a/apps/admin/app/(all)/(dashboard)/sidebar-menu.tsx +++ b/apps/admin/app/(all)/(dashboard)/sidebar-menu.tsx @@ -5,8 +5,8 @@ import Link from "next/link"; import { usePathname } from "next/navigation"; import { Image, BrainCog, Cog, Lock, Mail } from "lucide-react"; // plane internal packages +import { WorkspaceIcon } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; -import { WorkspaceIcon } from "@plane/ui"; import { cn } from "@plane/utils"; // hooks import { useTheme } from "@/hooks/store"; diff --git a/apps/admin/app/(all)/(home)/auth-header.tsx b/apps/admin/app/(all)/(home)/auth-header.tsx index 50fa066cd8..115c853814 100644 --- a/apps/admin/app/(all)/(home)/auth-header.tsx +++ b/apps/admin/app/(all)/(home)/auth-header.tsx @@ -1,7 +1,7 @@ "use client"; import Link from "next/link"; -import { PlaneLockup } from "@plane/ui"; +import { PlaneLockup } from "@plane/propel/icons"; export const AuthHeader = () => (
diff --git a/apps/space/core/components/account/user-logged-in.tsx b/apps/space/core/components/account/user-logged-in.tsx index 76ab06fcf2..51175c16ae 100644 --- a/apps/space/core/components/account/user-logged-in.tsx +++ b/apps/space/core/components/account/user-logged-in.tsx @@ -2,7 +2,7 @@ import { observer } from "mobx-react"; import Image from "next/image"; -import { PlaneLockup } from "@plane/ui"; +import { PlaneLockup } from "@plane/propel/icons"; // components import { PoweredBy } from "@/components/common/powered-by"; import { UserAvatar } from "@/components/issues/navbar/user-avatar"; diff --git a/apps/space/core/components/common/powered-by.tsx b/apps/space/core/components/common/powered-by.tsx index 073937e83e..be4e5bf736 100644 --- a/apps/space/core/components/common/powered-by.tsx +++ b/apps/space/core/components/common/powered-by.tsx @@ -3,7 +3,7 @@ import { FC } from "react"; import { WEBSITE_URL } from "@plane/constants"; // assets -import { PlaneLogo } from "@plane/ui"; +import { PlaneLogo } from "@plane/propel/icons"; type TPoweredBy = { disabled?: boolean; diff --git a/apps/space/core/components/issues/filters/applied-filters/priority.tsx b/apps/space/core/components/issues/filters/applied-filters/priority.tsx index 33af39e21c..7fdf900bb2 100644 --- a/apps/space/core/components/issues/filters/applied-filters/priority.tsx +++ b/apps/space/core/components/issues/filters/applied-filters/priority.tsx @@ -1,7 +1,7 @@ "use client"; import { X } from "lucide-react"; -import { PriorityIcon, type TIssuePriorities } from "@plane/ui"; +import { PriorityIcon, type TIssuePriorities } from "@plane/propel/icons"; type Props = { handleRemove: (val: string) => void; diff --git a/apps/space/core/components/issues/filters/applied-filters/state.tsx b/apps/space/core/components/issues/filters/applied-filters/state.tsx index 70ebd14dd2..c80c8688a5 100644 --- a/apps/space/core/components/issues/filters/applied-filters/state.tsx +++ b/apps/space/core/components/issues/filters/applied-filters/state.tsx @@ -4,7 +4,7 @@ import { observer } from "mobx-react"; import { X } from "lucide-react"; // plane imports import { EIconSize } from "@plane/constants"; -import { StateGroupIcon } from "@plane/ui"; +import { StateGroupIcon } from "@plane/propel/icons"; // hooks import { useStates } from "@/hooks/store/use-state"; diff --git a/apps/space/core/components/issues/filters/priority.tsx b/apps/space/core/components/issues/filters/priority.tsx index 76851ee0a3..674b052f5b 100644 --- a/apps/space/core/components/issues/filters/priority.tsx +++ b/apps/space/core/components/issues/filters/priority.tsx @@ -5,7 +5,7 @@ import { observer } from "mobx-react"; // plane imports import { ISSUE_PRIORITY_FILTERS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; -import { PriorityIcon } from "@plane/ui"; +import { PriorityIcon } from "@plane/propel/icons"; // local imports import { FilterHeader } from "./helpers/filter-header"; import { FilterOption } from "./helpers/filter-option"; diff --git a/apps/space/core/components/issues/filters/state.tsx b/apps/space/core/components/issues/filters/state.tsx index 865878c521..a794d532af 100644 --- a/apps/space/core/components/issues/filters/state.tsx +++ b/apps/space/core/components/issues/filters/state.tsx @@ -4,7 +4,8 @@ import React, { useState } from "react"; import { observer } from "mobx-react"; // ui import { EIconSize } from "@plane/constants"; -import { Loader, StateGroupIcon } from "@plane/ui"; +import { StateGroupIcon } from "@plane/propel/icons"; +import { Loader } from "@plane/ui"; // hooks import { useStates } from "@/hooks/store/use-state"; // local imports diff --git a/apps/space/core/components/issues/issue-layouts/properties/cycle.tsx b/apps/space/core/components/issues/issue-layouts/properties/cycle.tsx index d9bc971a9b..c58badcf92 100644 --- a/apps/space/core/components/issues/issue-layouts/properties/cycle.tsx +++ b/apps/space/core/components/issues/issue-layouts/properties/cycle.tsx @@ -2,8 +2,8 @@ import { observer } from "mobx-react"; // plane ui +import { ContrastIcon } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; -import { ContrastIcon } from "@plane/ui"; // plane utils import { cn } from "@plane/utils"; //hooks diff --git a/apps/space/core/components/issues/issue-layouts/properties/modules.tsx b/apps/space/core/components/issues/issue-layouts/properties/modules.tsx index 834cdc4ae9..c5e250f082 100644 --- a/apps/space/core/components/issues/issue-layouts/properties/modules.tsx +++ b/apps/space/core/components/issues/issue-layouts/properties/modules.tsx @@ -2,8 +2,8 @@ import { observer } from "mobx-react"; // plane ui +import { DiceIcon } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; -import { DiceIcon } from "@plane/ui"; // plane utils import { cn } from "@plane/utils"; // hooks diff --git a/apps/space/core/components/issues/issue-layouts/properties/priority.tsx b/apps/space/core/components/issues/issue-layouts/properties/priority.tsx index 36b132ea0c..8514c05958 100644 --- a/apps/space/core/components/issues/issue-layouts/properties/priority.tsx +++ b/apps/space/core/components/issues/issue-layouts/properties/priority.tsx @@ -3,9 +3,9 @@ import { SignalHigh } from "lucide-react"; import { useTranslation } from "@plane/i18n"; // types +import { PriorityIcon } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; import { TIssuePriorities } from "@plane/types"; -import { PriorityIcon } from "@plane/ui"; // constants import { cn, getIssuePriorityFilters } from "@plane/utils"; diff --git a/apps/space/core/components/issues/issue-layouts/properties/state.tsx b/apps/space/core/components/issues/issue-layouts/properties/state.tsx index 76754be3de..2613adc4d3 100644 --- a/apps/space/core/components/issues/issue-layouts/properties/state.tsx +++ b/apps/space/core/components/issues/issue-layouts/properties/state.tsx @@ -2,8 +2,8 @@ import { observer } from "mobx-react"; // plane ui +import { StateGroupIcon } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; -import { StateGroupIcon } from "@plane/ui"; // plane utils import { cn } from "@plane/utils"; //hooks diff --git a/apps/space/core/components/issues/issue-layouts/utils.tsx b/apps/space/core/components/issues/issue-layouts/utils.tsx index 335c8f2100..4733dc78a7 100644 --- a/apps/space/core/components/issues/issue-layouts/utils.tsx +++ b/apps/space/core/components/issues/issue-layouts/utils.tsx @@ -4,6 +4,7 @@ import isNil from "lodash/isNil"; import { ContrastIcon } from "lucide-react"; // types import { EIconSize, ISSUE_PRIORITIES } from "@plane/constants"; +import { CycleGroupIcon, DiceIcon, PriorityIcon, StateGroupIcon } from "@plane/propel/icons"; import { GroupByColumnTypes, IGroupByColumn, @@ -12,7 +13,7 @@ import { TGroupedIssues, } from "@plane/types"; // ui -import { Avatar, CycleGroupIcon, DiceIcon, PriorityIcon, StateGroupIcon } from "@plane/ui"; +import { Avatar } from "@plane/ui"; // components // constants // stores diff --git a/apps/space/core/components/issues/peek-overview/header.tsx b/apps/space/core/components/issues/peek-overview/header.tsx index 9795e530f0..4791f17490 100644 --- a/apps/space/core/components/issues/peek-overview/header.tsx +++ b/apps/space/core/components/issues/peek-overview/header.tsx @@ -5,7 +5,8 @@ import { observer } from "mobx-react"; import { Link2, MoveRight } from "lucide-react"; import { Listbox, Transition } from "@headlessui/react"; // ui -import { CenterPanelIcon, FullScreenPanelIcon, setToast, SidePanelIcon, TOAST_TYPE } from "@plane/ui"; +import { CenterPanelIcon, FullScreenPanelIcon, SidePanelIcon } from "@plane/propel/icons"; +import { setToast, TOAST_TYPE } from "@plane/ui"; // helpers import { copyTextToClipboard } from "@/helpers/string.helper"; // hooks diff --git a/apps/space/core/components/issues/peek-overview/issue-properties.tsx b/apps/space/core/components/issues/peek-overview/issue-properties.tsx index f0e7eb77cc..3bee765ca9 100644 --- a/apps/space/core/components/issues/peek-overview/issue-properties.tsx +++ b/apps/space/core/components/issues/peek-overview/issue-properties.tsx @@ -5,7 +5,8 @@ import { useParams } from "next/navigation"; import { CalendarCheck2, Signal } from "lucide-react"; // plane imports import { useTranslation } from "@plane/i18n"; -import { DoubleCircleIcon, StateGroupIcon, TOAST_TYPE, setToast } from "@plane/ui"; +import { DoubleCircleIcon, StateGroupIcon } from "@plane/propel/icons"; +import { TOAST_TYPE, setToast } from "@plane/ui"; import { cn, getIssuePriorityFilters } from "@plane/utils"; // components import { Icon } from "@/components/ui"; diff --git a/apps/space/core/components/views/header.tsx b/apps/space/core/components/views/header.tsx index 13f037e5b2..80ba76de91 100644 --- a/apps/space/core/components/views/header.tsx +++ b/apps/space/core/components/views/header.tsx @@ -2,7 +2,7 @@ import React from "react"; import Link from "next/link"; -import { PlaneLockup } from "@plane/ui"; +import { PlaneLockup } from "@plane/propel/icons"; export const AuthHeader = () => (
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 6215ec3284..d147d0ed12 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/active-cycles/header.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/active-cycles/header.tsx @@ -2,7 +2,8 @@ import { observer } from "mobx-react"; import { useTranslation } from "@plane/i18n"; // ui -import { Breadcrumbs, ContrastIcon, Header } from "@plane/ui"; +import { ContrastIcon } from "@plane/propel/icons"; +import { Breadcrumbs, Header } from "@plane/ui"; // components import { BreadcrumbLink } from "@/components/common/breadcrumb-link"; // plane web components 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 545ad9ed3e..8e839c0eeb 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/header.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/header.tsx @@ -8,8 +8,9 @@ import { useParams } from "next/navigation"; import { ChevronDown, PanelRight } from "lucide-react"; import { PROFILE_VIEWER_TAB, PROFILE_ADMINS_TAB, EUserPermissions, EUserPermissionsLevel } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; +import { UserActivityIcon } from "@plane/propel/icons"; import { IUserProfileProjectSegregation } from "@plane/types"; -import { Breadcrumbs, Header, CustomMenu, UserActivityIcon } from "@plane/ui"; +import { Breadcrumbs, Header, CustomMenu } from "@plane/ui"; import { cn } from "@plane/utils"; // components import { BreadcrumbLink } from "@/components/common/breadcrumb-link"; 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 466eb0f71b..0f6606ba3b 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 @@ -3,10 +3,11 @@ import { FC } from "react"; import { observer } from "mobx-react"; import { useParams } from "next/navigation"; +import { ArchiveIcon, ContrastIcon, DiceIcon, LayersIcon } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; import { EIssuesStoreType } from "@plane/types"; // ui -import { ArchiveIcon, Breadcrumbs, Header, ContrastIcon, DiceIcon, LayersIcon } from "@plane/ui"; +import { Breadcrumbs, Header } from "@plane/ui"; // components import { BreadcrumbLink } from "@/components/common/breadcrumb-link"; // hooks diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/archives/issues/(detail)/header.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/archives/issues/(detail)/header.tsx index c2e0e9c42a..fbfce0d00d 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/archives/issues/(detail)/header.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/archives/issues/(detail)/header.tsx @@ -4,7 +4,8 @@ import { observer } from "mobx-react"; import { useParams } from "next/navigation"; import useSWR from "swr"; // ui -import { ArchiveIcon, Breadcrumbs, LayersIcon, Header } from "@plane/ui"; +import { ArchiveIcon, LayersIcon } from "@plane/propel/icons"; +import { Breadcrumbs, Header } from "@plane/ui"; // components import { BreadcrumbLink } from "@/components/common/breadcrumb-link"; import { IssueDetailQuickActions } from "@/components/issues/issue-detail/issue-detail-quick-actions"; diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/header.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/header.tsx index 1d8964322c..7fe963c845 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/header.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(detail)/header.tsx @@ -16,6 +16,7 @@ import { } from "@plane/constants"; import { usePlatformOS } from "@plane/hooks"; import { useTranslation } from "@plane/i18n"; +import { ContrastIcon } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; import { EIssuesStoreType, @@ -25,7 +26,7 @@ import { IIssueFilterOptions, EIssueLayoutTypes, } from "@plane/types"; -import { Breadcrumbs, Button, ContrastIcon, BreadcrumbNavigationSearchDropdown, Header } from "@plane/ui"; +import { Breadcrumbs, Button, BreadcrumbNavigationSearchDropdown, Header } from "@plane/ui"; import { cn, isIssueFilterActive } from "@plane/utils"; // components import { WorkItemsModal } from "@/components/analytics/work-items/modal"; 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 fdeb774494..3a1b477b52 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 @@ -14,6 +14,7 @@ import { EProjectFeatureKey, WORK_ITEM_TRACKER_ELEMENTS, } from "@plane/constants"; +import { DiceIcon } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; import { EIssuesStoreType, @@ -23,7 +24,7 @@ import { IIssueFilterOptions, EIssueLayoutTypes, } from "@plane/types"; -import { Breadcrumbs, Button, DiceIcon, Header, BreadcrumbNavigationSearchDropdown } from "@plane/ui"; +import { Breadcrumbs, Button, Header, BreadcrumbNavigationSearchDropdown } from "@plane/ui"; import { cn, isIssueFilterActive } from "@plane/utils"; // components import { WorkItemsModal } from "@/components/analytics/work-items/modal"; diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/stickies/header.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/stickies/header.tsx index 1b4b1a2360..08a216ab19 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/stickies/header.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/stickies/header.tsx @@ -3,7 +3,8 @@ import { observer } from "mobx-react"; import { useParams } from "next/navigation"; // plane imports -import { Breadcrumbs, Button, Header, RecentStickyIcon } from "@plane/ui"; +import { RecentStickyIcon } from "@plane/propel/icons"; +import { Breadcrumbs, Button, Header } from "@plane/ui"; // components import { BreadcrumbLink } from "@/components/common/breadcrumb-link"; import { StickySearch } from "@/components/stickies/modal/search"; diff --git a/apps/web/app/(all)/create-workspace/page.tsx b/apps/web/app/(all)/create-workspace/page.tsx index e715f83795..92c2ba3e1a 100644 --- a/apps/web/app/(all)/create-workspace/page.tsx +++ b/apps/web/app/(all)/create-workspace/page.tsx @@ -6,8 +6,9 @@ import Image from "next/image"; import Link from "next/link"; // plane imports import { useTranslation } from "@plane/i18n"; +import { PlaneLogo } from "@plane/propel/icons"; import { IWorkspace } from "@plane/types"; -import { Button, getButtonStyling, PlaneLogo } from "@plane/ui"; +import { Button, getButtonStyling } from "@plane/ui"; // components import { CreateWorkspaceForm } from "@/components/workspace/create-workspace-form"; // hooks diff --git a/apps/web/app/(all)/invitations/page.tsx b/apps/web/app/(all)/invitations/page.tsx index 3ac1ce86e5..82201b0f25 100644 --- a/apps/web/app/(all)/invitations/page.tsx +++ b/apps/web/app/(all)/invitations/page.tsx @@ -10,9 +10,10 @@ import { CheckCircle2 } from "lucide-react"; import { ROLE, MEMBER_TRACKER_EVENTS, MEMBER_TRACKER_ELEMENTS, GROUP_WORKSPACE_TRACKER_EVENT } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; // types +import { PlaneLogo } from "@plane/propel/icons"; import type { IWorkspaceMemberInvitation } from "@plane/types"; // ui -import { Button, TOAST_TYPE, setToast, PlaneLogo } from "@plane/ui"; +import { Button, TOAST_TYPE, setToast } from "@plane/ui"; import { truncateText } from "@plane/utils"; // components import { EmptyState } from "@/components/common/empty-state"; diff --git a/apps/web/ce/components/breadcrumbs/project-feature.tsx b/apps/web/ce/components/breadcrumbs/project-feature.tsx index db51f3e85c..ba67aa9cbc 100644 --- a/apps/web/ce/components/breadcrumbs/project-feature.tsx +++ b/apps/web/ce/components/breadcrumbs/project-feature.tsx @@ -4,7 +4,8 @@ import { FC } from "react"; import { observer } from "mobx-react"; // plane imports import { EProjectFeatureKey } from "@plane/constants"; -import { BreadcrumbNavigationDropdown, Breadcrumbs, ISvgIcons } from "@plane/ui"; +import { ISvgIcons } from "@plane/propel/icons"; +import { BreadcrumbNavigationDropdown, Breadcrumbs } from "@plane/ui"; // components import { SwitcherLabel } from "@/components/common/switcher-label"; import type { TNavigationItem } from "@/components/workspace/sidebar/project-navigation"; diff --git a/apps/web/ce/components/command-palette/actions/work-item-actions/change-state-list.tsx b/apps/web/ce/components/command-palette/actions/work-item-actions/change-state-list.tsx index d5bc3aba15..fb3595d565 100644 --- a/apps/web/ce/components/command-palette/actions/work-item-actions/change-state-list.tsx +++ b/apps/web/ce/components/command-palette/actions/work-item-actions/change-state-list.tsx @@ -3,7 +3,8 @@ import { observer } from "mobx-react"; import { Check } from "lucide-react"; // plane imports import { EIconSize } from "@plane/constants"; -import { Spinner, StateGroupIcon } from "@plane/ui"; +import { StateGroupIcon } from "@plane/propel/icons"; +import { Spinner } from "@plane/ui"; // store hooks import { useProjectState } from "@/hooks/store/use-project-state"; diff --git a/apps/web/ce/components/command-palette/helpers.tsx b/apps/web/ce/components/command-palette/helpers.tsx index 7a5eb6802b..d098b1a480 100644 --- a/apps/web/ce/components/command-palette/helpers.tsx +++ b/apps/web/ce/components/command-palette/helpers.tsx @@ -2,6 +2,7 @@ // types import { Briefcase, FileText, Layers, LayoutGrid } from "lucide-react"; +import { ContrastIcon, DiceIcon } from "@plane/propel/icons"; import { IWorkspaceDefaultSearchResult, IWorkspaceIssueSearchResult, @@ -10,7 +11,6 @@ import { IWorkspaceSearchResult, } from "@plane/types"; // ui -import { ContrastIcon, DiceIcon } from "@plane/ui"; // helpers import { generateWorkItemLink } from "@plane/utils"; // plane web components diff --git a/apps/web/ce/components/global/product-updates-header.tsx b/apps/web/ce/components/global/product-updates-header.tsx index 418a940a7e..26d4ebbdef 100644 --- a/apps/web/ce/components/global/product-updates-header.tsx +++ b/apps/web/ce/components/global/product-updates-header.tsx @@ -1,6 +1,6 @@ import { observer } from "mobx-react"; import { useTranslation } from "@plane/i18n"; -import { PlaneLogo } from "@plane/ui"; +import { PlaneLogo } from "@plane/propel/icons"; // helpers import { cn } from "@plane/utils"; // package.json diff --git a/apps/web/ce/components/issues/issue-layouts/utils.tsx b/apps/web/ce/components/issues/issue-layouts/utils.tsx index c0b82ae955..fcf1cd91b9 100644 --- a/apps/web/ce/components/issues/issue-layouts/utils.tsx +++ b/apps/web/ce/components/issues/issue-layouts/utils.tsx @@ -13,8 +13,8 @@ import { Users, } from "lucide-react"; // types +import { DiceIcon, DoubleCircleIcon, ISvgIcons } from "@plane/propel/icons"; import { IGroupByColumn, IIssueDisplayProperties, TGetColumns, TSpreadsheetColumn } from "@plane/types"; -import { DiceIcon, DoubleCircleIcon, ISvgIcons } from "@plane/ui"; // components import { SpreadsheetAssigneeColumn, diff --git a/apps/web/ce/components/projects/navigation/helper.tsx b/apps/web/ce/components/projects/navigation/helper.tsx index ad3d4dd3b2..b486684153 100644 --- a/apps/web/ce/components/projects/navigation/helper.tsx +++ b/apps/web/ce/components/projects/navigation/helper.tsx @@ -1,7 +1,7 @@ import { FileText, Layers } from "lucide-react"; // plane imports import { EUserPermissions, EProjectFeatureKey } from "@plane/constants"; -import { ContrastIcon, DiceIcon, Intake, LayersIcon } from "@plane/ui"; +import { ContrastIcon, DiceIcon, LayersIcon, Intake } from "@plane/propel/icons"; // components import type { TNavigationItem } from "@/components/workspace/sidebar/project-navigation"; diff --git a/apps/web/ce/components/relations/index.tsx b/apps/web/ce/components/relations/index.tsx index b259a38d7a..2a7ebf0ebc 100644 --- a/apps/web/ce/components/relations/index.tsx +++ b/apps/web/ce/components/relations/index.tsx @@ -1,5 +1,5 @@ import { CircleDot, CopyPlus, XCircle } from "lucide-react"; -import { RelatedIcon } from "@plane/ui"; +import { RelatedIcon } from "@plane/propel/icons"; import type { TRelationObject } from "@/components/issues/issue-detail-widgets/relations"; import type { TIssueRelationTypes } from "../../types"; diff --git a/apps/web/ce/components/workspace/sidebar/helper.tsx b/apps/web/ce/components/workspace/sidebar/helper.tsx index d00b0c3615..0821a0ef4b 100644 --- a/apps/web/ce/components/workspace/sidebar/helper.tsx +++ b/apps/web/ce/components/workspace/sidebar/helper.tsx @@ -1,5 +1,5 @@ import { BarChart2, Briefcase, Home, Inbox, Layers, PenSquare } from "lucide-react"; -import { ArchiveIcon, ContrastIcon, UserActivityIcon } from "@plane/ui"; +import { ArchiveIcon, ContrastIcon, UserActivityIcon } from "@plane/propel/icons"; import { cn } from "@plane/utils"; export const getSidebarNavigationItemIcon = (key: string, className: string = "") => { diff --git a/apps/web/ce/constants/project/settings/features.tsx b/apps/web/ce/constants/project/settings/features.tsx index 1441c70e2d..3ad27ddbba 100644 --- a/apps/web/ce/constants/project/settings/features.tsx +++ b/apps/web/ce/constants/project/settings/features.tsx @@ -1,8 +1,8 @@ import { ReactNode } from "react"; import { FileText, Layers, Timer } from "lucide-react"; // plane imports +import { ContrastIcon, DiceIcon, Intake } from "@plane/propel/icons"; import { IProject } from "@plane/types"; -import { ContrastIcon, DiceIcon, Intake } from "@plane/ui"; export type TProperties = { key: string; diff --git a/apps/web/ce/constants/sidebar-favorites.ts b/apps/web/ce/constants/sidebar-favorites.ts index a6f49f8aaf..4ad0c0463a 100644 --- a/apps/web/ce/constants/sidebar-favorites.ts +++ b/apps/web/ce/constants/sidebar-favorites.ts @@ -1,7 +1,7 @@ import { Briefcase, FileText, Layers, LucideIcon } from "lucide-react"; // plane imports +import { ContrastIcon, DiceIcon, FavoriteFolderIcon, ISvgIcons } from "@plane/propel/icons"; import { IFavorite } from "@plane/types"; -import { ContrastIcon, DiceIcon, FavoriteFolderIcon, ISvgIcons } from "@plane/ui"; export const FAVORITE_ITEM_ICONS: Record | LucideIcon> = { page: FileText, diff --git a/apps/web/core/components/auth-screens/footer.tsx b/apps/web/core/components/auth-screens/footer.tsx index 30ff878b58..fac043b3b3 100644 --- a/apps/web/core/components/auth-screens/footer.tsx +++ b/apps/web/core/components/auth-screens/footer.tsx @@ -1,6 +1,6 @@ "use client"; import React from "react"; -import { AccentureLogo, DolbyLogo, SonyLogo, ZerodhaLogo } from "@plane/ui"; +import { AccentureLogo, DolbyLogo, SonyLogo, ZerodhaLogo } from "@plane/propel/icons"; const BRAND_LOGOS: { id: string; diff --git a/apps/web/core/components/auth-screens/header.tsx b/apps/web/core/components/auth-screens/header.tsx index 7abaa79b0c..c55265235d 100644 --- a/apps/web/core/components/auth-screens/header.tsx +++ b/apps/web/core/components/auth-screens/header.tsx @@ -5,7 +5,7 @@ import { observer } from "mobx-react"; import Link from "next/link"; import { AUTH_TRACKER_ELEMENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; -import { PlaneLockup } from "@plane/ui"; +import { PlaneLockup } from "@plane/propel/icons"; import { PageHead } from "@/components/core/page-title"; import { EAuthModes } from "@/helpers/authentication.helper"; import { useInstance } from "@/hooks/store/use-instance"; diff --git a/apps/web/core/components/automation/auto-close-automation.tsx b/apps/web/core/components/automation/auto-close-automation.tsx index 82473a7a9c..d223ddf3cd 100644 --- a/apps/web/core/components/automation/auto-close-automation.tsx +++ b/apps/web/core/components/automation/auto-close-automation.tsx @@ -15,9 +15,10 @@ import { PROJECT_SETTINGS_TRACKER_EVENTS, } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; +import { StateGroupIcon, DoubleCircleIcon } from "@plane/propel/icons"; import { IProject } from "@plane/types"; // ui -import { CustomSelect, CustomSearchSelect, ToggleSwitch, StateGroupIcon, DoubleCircleIcon, Loader } from "@plane/ui"; +import { CustomSelect, CustomSearchSelect, ToggleSwitch, Loader } from "@plane/ui"; // component import { SelectMonthModal } from "@/components/automation"; // constants diff --git a/apps/web/core/components/command-palette/actions/help-actions.tsx b/apps/web/core/components/command-palette/actions/help-actions.tsx index f68164f50a..26eb13e294 100644 --- a/apps/web/core/components/command-palette/actions/help-actions.tsx +++ b/apps/web/core/components/command-palette/actions/help-actions.tsx @@ -3,7 +3,7 @@ import { Command } from "cmdk"; import { observer } from "mobx-react"; import { FileText, GithubIcon, MessageSquare, Rocket } from "lucide-react"; // ui -import { DiscordIcon } from "@plane/ui"; +import { DiscordIcon } from "@plane/propel/icons"; // hooks import { useCommandPalette } from "@/hooks/store/use-command-palette"; import { useTransient } from "@/hooks/store/use-transient"; diff --git a/apps/web/core/components/command-palette/actions/issue-actions/actions-list.tsx b/apps/web/core/components/command-palette/actions/issue-actions/actions-list.tsx index 009f4fa8e8..7b75fc1bd2 100644 --- a/apps/web/core/components/command-palette/actions/issue-actions/actions-list.tsx +++ b/apps/web/core/components/command-palette/actions/issue-actions/actions-list.tsx @@ -4,9 +4,10 @@ import { Command } from "cmdk"; import { observer } from "mobx-react"; import { useParams } from "next/navigation"; import { LinkIcon, Signal, Trash2, UserMinus2, UserPlus2, Users } from "lucide-react"; +import { DoubleCircleIcon } from "@plane/propel/icons"; import { EIssueServiceType, TIssue } from "@plane/types"; // hooks -import { DoubleCircleIcon, TOAST_TYPE, setToast } from "@plane/ui"; +import { TOAST_TYPE, setToast } from "@plane/ui"; // helpers import { copyTextToClipboard } from "@plane/utils"; // hooks diff --git a/apps/web/core/components/command-palette/actions/issue-actions/change-priority.tsx b/apps/web/core/components/command-palette/actions/issue-actions/change-priority.tsx index 1eea7a3cea..ef89a07067 100644 --- a/apps/web/core/components/command-palette/actions/issue-actions/change-priority.tsx +++ b/apps/web/core/components/command-palette/actions/issue-actions/change-priority.tsx @@ -7,9 +7,9 @@ import { Check } from "lucide-react"; // plane constants import { ISSUE_PRIORITIES } from "@plane/constants"; // plane types +import { PriorityIcon } from "@plane/propel/icons"; import { EIssueServiceType, TIssue, TIssuePriorities } from "@plane/types"; // mobx store -import { PriorityIcon } from "@plane/ui"; import { useIssueDetail } from "@/hooks/store/use-issue-detail"; // ui // types diff --git a/apps/web/core/components/command-palette/actions/project-actions.tsx b/apps/web/core/components/command-palette/actions/project-actions.tsx index 59f77a3d64..9776db33d6 100644 --- a/apps/web/core/components/command-palette/actions/project-actions.tsx +++ b/apps/web/core/components/command-palette/actions/project-actions.tsx @@ -9,7 +9,7 @@ import { PROJECT_PAGE_TRACKER_ELEMENTS, PROJECT_VIEW_TRACKER_ELEMENTS, } from "@plane/constants"; -import { DiceIcon } from "@plane/ui"; +import { DiceIcon } from "@plane/propel/icons"; // hooks import { useCommandPalette } from "@/hooks/store/use-command-palette"; // ui diff --git a/apps/web/core/components/command-palette/command-modal.tsx b/apps/web/core/components/command-palette/command-modal.tsx index 5cf56620a6..e482438f67 100644 --- a/apps/web/core/components/command-palette/command-modal.tsx +++ b/apps/web/core/components/command-palette/command-modal.tsx @@ -16,8 +16,9 @@ import { WORKSPACE_DEFAULT_SEARCH_RESULT, } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; +import { LayersIcon } from "@plane/propel/icons"; import { IWorkspaceSearchResults } from "@plane/types"; -import { LayersIcon, Loader, ToggleSwitch } from "@plane/ui"; +import { Loader, ToggleSwitch } from "@plane/ui"; import { cn, getTabIndex } from "@plane/utils"; // components import { diff --git a/apps/web/core/components/common/activity/helper.tsx b/apps/web/core/components/common/activity/helper.tsx index b3d16e7d04..8ce3075974 100644 --- a/apps/web/core/components/common/activity/helper.tsx +++ b/apps/web/core/components/common/activity/helper.tsx @@ -25,7 +25,7 @@ import { } from "lucide-react"; // components -import { ArchiveIcon, DoubleCircleIcon, ContrastIcon, DiceIcon, Intake } from "@plane/ui"; +import { ArchiveIcon, DoubleCircleIcon, ContrastIcon, DiceIcon, Intake } from "@plane/propel/icons"; import { store } from "@/lib/store-context"; import { TProjectActivity } from "@/plane-web/types"; diff --git a/apps/web/core/components/common/switcher-label.tsx b/apps/web/core/components/common/switcher-label.tsx index 97f403f550..14ed1bb54c 100644 --- a/apps/web/core/components/common/switcher-label.tsx +++ b/apps/web/core/components/common/switcher-label.tsx @@ -1,6 +1,6 @@ import { FC } from "react"; +import { ISvgIcons } from "@plane/propel/icons"; import { TLogoProps } from "@plane/types"; -import { ISvgIcons } from "@plane/ui"; import { getFileURL, truncateText } from "@plane/utils"; import { Logo } from "@/components/common/logo"; diff --git a/apps/web/core/components/core/activity.tsx b/apps/web/core/components/core/activity.tsx index e0116958a9..3c773899e6 100644 --- a/apps/web/core/components/core/activity.tsx +++ b/apps/web/core/components/core/activity.tsx @@ -20,9 +20,9 @@ import { MessageSquareIcon, UsersIcon, } from "lucide-react"; +import { BlockedIcon, BlockerIcon, RelatedIcon, LayersIcon, DiceIcon, EpicIcon, Intake } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; import { IIssueActivity } from "@plane/types"; -import { BlockedIcon, BlockerIcon, RelatedIcon, LayersIcon, DiceIcon, Intake, EpicIcon } from "@plane/ui"; import { renderFormattedDate, generateWorkItemLink, capitalizeFirstLetter } from "@plane/utils"; // helpers import { useLabel } from "@/hooks/store/use-label"; diff --git a/apps/web/core/components/core/filters/date-filter-select.tsx b/apps/web/core/components/core/filters/date-filter-select.tsx index 45c38c1c30..b3955d4eaf 100644 --- a/apps/web/core/components/core/filters/date-filter-select.tsx +++ b/apps/web/core/components/core/filters/date-filter-select.tsx @@ -2,7 +2,8 @@ import React from "react"; import { CalendarDays } from "lucide-react"; // ui -import { CustomSelect, CalendarAfterIcon, CalendarBeforeIcon } from "@plane/ui"; +import { CalendarAfterIcon, CalendarBeforeIcon } from "@plane/propel/icons"; +import { CustomSelect } from "@plane/ui"; type Props = { title: string; diff --git a/apps/web/core/components/cycles/active-cycle/cycle-stats.tsx b/apps/web/core/components/cycles/active-cycle/cycle-stats.tsx index 2423abfbdb..e0f71dc3dc 100644 --- a/apps/web/core/components/cycles/active-cycle/cycle-stats.tsx +++ b/apps/web/core/components/cycles/active-cycle/cycle-stats.tsx @@ -8,10 +8,11 @@ import { CalendarCheck } from "lucide-react"; import { Tab } from "@headlessui/react"; // plane imports import { useTranslation } from "@plane/i18n"; +import { PriorityIcon } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; import { EIssuesStoreType, ICycle, IIssueFilterOptions } from "@plane/types"; // ui -import { Loader, PriorityIcon, Avatar } from "@plane/ui"; +import { Loader, Avatar } from "@plane/ui"; import { cn, renderFormattedDate, renderFormattedDateWithoutYear, getFileURL } from "@plane/utils"; // components import { SingleProgressStats } from "@/components/core/sidebar/single-progress-stats"; 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 b0de0ce240..65a1cd10f2 100644 --- a/apps/web/core/components/cycles/analytics-sidebar/progress-stats.tsx +++ b/apps/web/core/components/cycles/analytics-sidebar/progress-stats.tsx @@ -6,6 +6,7 @@ import Image from "next/image"; import { Tab } from "@headlessui/react"; // plane imports import { useTranslation } from "@plane/i18n"; +import { StateGroupIcon } from "@plane/propel/icons"; import { IIssueFilterOptions, IIssueFilters, @@ -14,7 +15,7 @@ import { TCyclePlotType, TStateGroups, } from "@plane/types"; -import { Avatar, StateGroupIcon } from "@plane/ui"; +import { Avatar } from "@plane/ui"; import { cn, getFileURL } from "@plane/utils"; // components import { SingleProgressStats } from "@/components/core/sidebar/single-progress-stats"; diff --git a/apps/web/core/components/cycles/list/cycle-list-group-header.tsx b/apps/web/core/components/cycles/list/cycle-list-group-header.tsx index 0d51a28ee1..11e2f3968f 100644 --- a/apps/web/core/components/cycles/list/cycle-list-group-header.tsx +++ b/apps/web/core/components/cycles/list/cycle-list-group-header.tsx @@ -3,9 +3,10 @@ import React, { FC } from "react"; import { ChevronDown } from "lucide-react"; // types +import { CycleGroupIcon } from "@plane/propel/icons"; import { TCycleGroups } from "@plane/types"; // icons -import { Row, CycleGroupIcon } from "@plane/ui"; +import { Row } from "@plane/ui"; // helpers import { cn } from "@plane/utils"; diff --git a/apps/web/core/components/cycles/list/cycle-list-item-action.tsx b/apps/web/core/components/cycles/list/cycle-list-item-action.tsx index 4bb048a7d6..457854a3be 100644 --- a/apps/web/core/components/cycles/list/cycle-list-item-action.tsx +++ b/apps/web/core/components/cycles/list/cycle-list-item-action.tsx @@ -15,9 +15,10 @@ import { } from "@plane/constants"; import { useLocalStorage } from "@plane/hooks"; import { useTranslation } from "@plane/i18n"; +import { LayersIcon, TransferIcon } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; import { ICycle, TCycleGroups } from "@plane/types"; -import { Avatar, AvatarGroup, FavoriteStar, LayersIcon, TransferIcon, setPromiseToast } from "@plane/ui"; +import { Avatar, AvatarGroup, FavoriteStar, setPromiseToast } from "@plane/ui"; import { getDate, getFileURL, generateQueryParams } from "@plane/utils"; // components import { DateRangeDropdown } from "@/components/dropdowns/date-range"; diff --git a/apps/web/core/components/cycles/quick-actions.tsx b/apps/web/core/components/cycles/quick-actions.tsx index e3d8e500bf..778e781154 100644 --- a/apps/web/core/components/cycles/quick-actions.tsx +++ b/apps/web/core/components/cycles/quick-actions.tsx @@ -13,7 +13,8 @@ import { CYCLE_TRACKER_ELEMENTS, } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; -import { ArchiveIcon, ContextMenu, CustomMenu, TContextMenuItem, TOAST_TYPE, setToast } from "@plane/ui"; +import { ArchiveIcon } from "@plane/propel/icons"; +import { ContextMenu, CustomMenu, TContextMenuItem, TOAST_TYPE, setToast } from "@plane/ui"; import { copyUrlToClipboard, cn } from "@plane/utils"; // helpers // hooks diff --git a/apps/web/core/components/cycles/transfer-issues-modal.tsx b/apps/web/core/components/cycles/transfer-issues-modal.tsx index 9a96d0efea..e3a322eec9 100644 --- a/apps/web/core/components/cycles/transfer-issues-modal.tsx +++ b/apps/web/core/components/cycles/transfer-issues-modal.tsx @@ -5,11 +5,12 @@ import { observer } from "mobx-react"; import { useParams } from "next/navigation"; import { AlertCircle, Search, X } from "lucide-react"; import { Dialog, Transition } from "@headlessui/react"; +import { ContrastIcon, TransferIcon } from "@plane/propel/icons"; import { EIssuesStoreType } from "@plane/types"; // hooks // ui //icons -import { ContrastIcon, TransferIcon, TOAST_TYPE, setToast } from "@plane/ui"; +import { TOAST_TYPE, setToast } from "@plane/ui"; import { useCycle } from "@/hooks/store/use-cycle"; import { useIssues } from "@/hooks/store/use-issues"; //icons diff --git a/apps/web/core/components/cycles/transfer-issues.tsx b/apps/web/core/components/cycles/transfer-issues.tsx index bf5be1e74b..467ec30822 100644 --- a/apps/web/core/components/cycles/transfer-issues.tsx +++ b/apps/web/core/components/cycles/transfer-issues.tsx @@ -2,7 +2,8 @@ import React from "react"; import { AlertCircle } from "lucide-react"; // ui -import { Button, TransferIcon } from "@plane/ui"; +import { TransferIcon } from "@plane/propel/icons"; +import { Button } from "@plane/ui"; type Props = { handleClick: () => void; diff --git a/apps/web/core/components/dropdowns/cycle/cycle-options.tsx b/apps/web/core/components/dropdowns/cycle/cycle-options.tsx index b6cf96d658..4c3a0effd8 100644 --- a/apps/web/core/components/dropdowns/cycle/cycle-options.tsx +++ b/apps/web/core/components/dropdowns/cycle/cycle-options.tsx @@ -11,9 +11,9 @@ import { Combobox } from "@headlessui/react"; // i18n import { useTranslation } from "@plane/i18n"; // icon +import { ContrastIcon, CycleGroupIcon } from "@plane/propel/icons"; import { TCycleGroups } from "@plane/types"; // ui -import { ContrastIcon, CycleGroupIcon } from "@plane/ui"; // store hooks import { useCycle } from "@/hooks/store/use-cycle"; import { usePlatformOS } from "@/hooks/use-platform-os"; diff --git a/apps/web/core/components/dropdowns/cycle/index.tsx b/apps/web/core/components/dropdowns/cycle/index.tsx index 7a30b583b9..4326064e6e 100644 --- a/apps/web/core/components/dropdowns/cycle/index.tsx +++ b/apps/web/core/components/dropdowns/cycle/index.tsx @@ -5,7 +5,8 @@ import { observer } from "mobx-react"; import { ChevronDown } from "lucide-react"; import { useTranslation } from "@plane/i18n"; // ui -import { ComboDropDown, ContrastIcon } from "@plane/ui"; +import { ContrastIcon } from "@plane/propel/icons"; +import { ComboDropDown } from "@plane/ui"; // helpers import { cn } from "@plane/utils"; // hooks diff --git a/apps/web/core/components/dropdowns/module/button-content.tsx b/apps/web/core/components/dropdowns/module/button-content.tsx index 7cf714be9f..6b8ecc1760 100644 --- a/apps/web/core/components/dropdowns/module/button-content.tsx +++ b/apps/web/core/components/dropdowns/module/button-content.tsx @@ -2,8 +2,8 @@ import { ChevronDown, X } from "lucide-react"; // plane imports +import { DiceIcon } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; -import { DiceIcon } from "@plane/ui"; import { cn } from "@plane/utils"; // hooks import { useModule } from "@/hooks/store/use-module"; diff --git a/apps/web/core/components/dropdowns/module/module-options.tsx b/apps/web/core/components/dropdowns/module/module-options.tsx index 28f16839b6..aab6568a29 100644 --- a/apps/web/core/components/dropdowns/module/module-options.tsx +++ b/apps/web/core/components/dropdowns/module/module-options.tsx @@ -8,8 +8,8 @@ import { Check, Search } from "lucide-react"; import { Combobox } from "@headlessui/react"; // plane imports import { useTranslation } from "@plane/i18n"; +import { DiceIcon } from "@plane/propel/icons"; import { IModule } from "@plane/types"; -import { DiceIcon } from "@plane/ui"; import { cn } from "@plane/utils"; // hooks import { usePlatformOS } from "@/hooks/use-platform-os"; diff --git a/apps/web/core/components/dropdowns/priority.tsx b/apps/web/core/components/dropdowns/priority.tsx index 74e75d61c6..d2485d1129 100644 --- a/apps/web/core/components/dropdowns/priority.tsx +++ b/apps/web/core/components/dropdowns/priority.tsx @@ -8,10 +8,11 @@ import { Combobox } from "@headlessui/react"; import { ISSUE_PRIORITIES } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; // types +import { PriorityIcon } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; import { TIssuePriorities } from "@plane/types"; // ui -import { ComboDropDown, PriorityIcon } from "@plane/ui"; +import { ComboDropDown } from "@plane/ui"; // helpers import { cn } from "@plane/utils"; // hooks diff --git a/apps/web/core/components/dropdowns/state/base.tsx b/apps/web/core/components/dropdowns/state/base.tsx index 3d17c0e27f..0fd654d91e 100644 --- a/apps/web/core/components/dropdowns/state/base.tsx +++ b/apps/web/core/components/dropdowns/state/base.tsx @@ -7,8 +7,9 @@ import { ChevronDown, Search } from "lucide-react"; import { Combobox } from "@headlessui/react"; // plane imports import { useTranslation } from "@plane/i18n"; +import { StateGroupIcon } from "@plane/propel/icons"; import { IState } from "@plane/types"; -import { ComboDropDown, Spinner, StateGroupIcon } from "@plane/ui"; +import { ComboDropDown, Spinner } from "@plane/ui"; import { cn } from "@plane/utils"; // components import { DropdownButton } from "@/components/dropdowns/buttons"; diff --git a/apps/web/core/components/global/product-updates/footer.tsx b/apps/web/core/components/global/product-updates/footer.tsx index 7e361b2515..ab679d56a6 100644 --- a/apps/web/core/components/global/product-updates/footer.tsx +++ b/apps/web/core/components/global/product-updates/footer.tsx @@ -1,7 +1,8 @@ import { USER_TRACKER_ELEMENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; // ui -import { getButtonStyling, PlaneLogo } from "@plane/ui"; +import { PlaneLogo } from "@plane/propel/icons"; +import { getButtonStyling } from "@plane/ui"; // helpers import { cn } from "@plane/utils"; diff --git a/apps/web/core/components/home/widgets/empty-states/recents.tsx b/apps/web/core/components/home/widgets/empty-states/recents.tsx index 5d48d29565..c939cae61b 100644 --- a/apps/web/core/components/home/widgets/empty-states/recents.tsx +++ b/apps/web/core/components/home/widgets/empty-states/recents.tsx @@ -1,6 +1,6 @@ import { Briefcase, FileText, History } from "lucide-react"; import { useTranslation } from "@plane/i18n"; -import { LayersIcon } from "@plane/ui"; +import { LayersIcon } from "@plane/propel/icons"; const getDisplayContent = (type: string) => { switch (type) { diff --git a/apps/web/core/components/home/widgets/empty-states/stickies.tsx b/apps/web/core/components/home/widgets/empty-states/stickies.tsx index 1210ea096c..5a639ceef4 100644 --- a/apps/web/core/components/home/widgets/empty-states/stickies.tsx +++ b/apps/web/core/components/home/widgets/empty-states/stickies.tsx @@ -1,6 +1,6 @@ // plane ui import { useTranslation } from "@plane/i18n"; -import { RecentStickyIcon } from "@plane/ui"; +import { RecentStickyIcon } from "@plane/propel/icons"; export const StickiesEmptyState = () => { const { t } = useTranslation(); diff --git a/apps/web/core/components/home/widgets/recents/index.tsx b/apps/web/core/components/home/widgets/recents/index.tsx index 5622a2541d..f02317aa82 100644 --- a/apps/web/core/components/home/widgets/recents/index.tsx +++ b/apps/web/core/components/home/widgets/recents/index.tsx @@ -6,9 +6,9 @@ import useSWR from "swr"; import { Briefcase, FileText } from "lucide-react"; import { useTranslation } from "@plane/i18n"; // plane types +import { LayersIcon } from "@plane/propel/icons"; import { TActivityEntityData, THomeWidgetProps, TRecentActivityFilterKeys } from "@plane/types"; // plane ui -import { LayersIcon } from "@plane/ui"; // components import { ContentOverflowWrapper } from "@/components/core/content-overflow-HOC"; // plane web services diff --git a/apps/web/core/components/home/widgets/recents/issue.tsx b/apps/web/core/components/home/widgets/recents/issue.tsx index ea1cadfeff..8cad587850 100644 --- a/apps/web/core/components/home/widgets/recents/issue.tsx +++ b/apps/web/core/components/home/widgets/recents/issue.tsx @@ -1,9 +1,9 @@ import { observer } from "mobx-react"; // plane types +import { LayersIcon, PriorityIcon, StateGroupIcon } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; import { EIssueServiceType, TActivityEntityData, TIssueEntityData } from "@plane/types"; // plane ui -import { LayersIcon, PriorityIcon, StateGroupIcon } from "@plane/ui"; import { calculateTimeAgo, generateWorkItemLink } from "@plane/utils"; // components import { ListItem } from "@/components/core/list"; diff --git a/apps/web/core/components/inbox/content/issue-properties.tsx b/apps/web/core/components/inbox/content/issue-properties.tsx index 8aeac5e953..47ea8f6ae0 100644 --- a/apps/web/core/components/inbox/content/issue-properties.tsx +++ b/apps/web/core/components/inbox/content/issue-properties.tsx @@ -3,9 +3,10 @@ import React from "react"; import { observer } from "mobx-react"; import { CalendarCheck2, CopyPlus, Signal, Tag, Users } from "lucide-react"; +import { DoubleCircleIcon } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; import { TInboxDuplicateIssueDetails, TIssue } from "@plane/types"; -import { ControlLink, DoubleCircleIcon } from "@plane/ui"; +import { ControlLink } from "@plane/ui"; import { getDate, renderFormattedPayloadDate, generateWorkItemLink } from "@plane/utils"; // components import { DateDropdown } from "@/components/dropdowns/date"; diff --git a/apps/web/core/components/inbox/inbox-filter/applied-filters/priority.tsx b/apps/web/core/components/inbox/inbox-filter/applied-filters/priority.tsx index a2eb5246b7..d6886eaf4e 100644 --- a/apps/web/core/components/inbox/inbox-filter/applied-filters/priority.tsx +++ b/apps/web/core/components/inbox/inbox-filter/applied-filters/priority.tsx @@ -5,8 +5,9 @@ import { observer } from "mobx-react"; import { X } from "lucide-react"; import { ISSUE_PRIORITIES } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; +import { PriorityIcon } from "@plane/propel/icons"; import { TIssuePriorities } from "@plane/types"; -import { PriorityIcon, Tag } from "@plane/ui"; +import { Tag } from "@plane/ui"; // hooks import { useProjectInbox } from "@/hooks/store/use-project-inbox"; diff --git a/apps/web/core/components/inbox/inbox-filter/applied-filters/state.tsx b/apps/web/core/components/inbox/inbox-filter/applied-filters/state.tsx index b5114ccd7f..0871a17da5 100644 --- a/apps/web/core/components/inbox/inbox-filter/applied-filters/state.tsx +++ b/apps/web/core/components/inbox/inbox-filter/applied-filters/state.tsx @@ -4,7 +4,8 @@ import { FC } from "react"; import { observer } from "mobx-react"; import { X } from "lucide-react"; import { EIconSize } from "@plane/constants"; -import { StateGroupIcon, Tag } from "@plane/ui"; +import { StateGroupIcon } from "@plane/propel/icons"; +import { Tag } from "@plane/ui"; // hooks import { useProjectInbox } from "@/hooks/store/use-project-inbox"; import { useProjectState } from "@/hooks/store/use-project-state"; diff --git a/apps/web/core/components/inbox/inbox-filter/filters/priority.tsx b/apps/web/core/components/inbox/inbox-filter/filters/priority.tsx index a3174f51c8..580fa39789 100644 --- a/apps/web/core/components/inbox/inbox-filter/filters/priority.tsx +++ b/apps/web/core/components/inbox/inbox-filter/filters/priority.tsx @@ -4,8 +4,8 @@ import { FC, useState } from "react"; import { observer } from "mobx-react"; import { ISSUE_PRIORITIES } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; +import { PriorityIcon } from "@plane/propel/icons"; import { TIssuePriorities } from "@plane/types"; -import { PriorityIcon } from "@plane/ui"; // plane constants // components import { FilterHeader, FilterOption } from "@/components/issues/issue-layouts/filters"; diff --git a/apps/web/core/components/inbox/inbox-filter/filters/state.tsx b/apps/web/core/components/inbox/inbox-filter/filters/state.tsx index 7c2778db2a..4180ec3638 100644 --- a/apps/web/core/components/inbox/inbox-filter/filters/state.tsx +++ b/apps/web/core/components/inbox/inbox-filter/filters/state.tsx @@ -3,8 +3,9 @@ import { FC, useState } from "react"; import { observer } from "mobx-react"; import { EIconSize } from "@plane/constants"; +import { StateGroupIcon } from "@plane/propel/icons"; import { IState } from "@plane/types"; -import { Loader, StateGroupIcon } from "@plane/ui"; +import { Loader } from "@plane/ui"; // components import { FilterHeader, FilterOption } from "@/components/issues/issue-layouts/filters"; // hooks diff --git a/apps/web/core/components/inbox/root.tsx b/apps/web/core/components/inbox/root.tsx index aefb688614..2b7dbe4436 100644 --- a/apps/web/core/components/inbox/root.tsx +++ b/apps/web/core/components/inbox/root.tsx @@ -3,8 +3,8 @@ import { observer } from "mobx-react"; import { PanelLeft } from "lucide-react"; // plane imports import { useTranslation } from "@plane/i18n"; +import { Intake } from "@plane/propel/icons"; import { EInboxIssueCurrentTab } from "@plane/types"; -import { Intake } from "@plane/ui"; import { cn } from "@plane/utils"; // components import { SimpleEmptyState } from "@/components/empty-state/simple-empty-state-root"; diff --git a/apps/web/core/components/inbox/sidebar/inbox-list-item.tsx b/apps/web/core/components/inbox/sidebar/inbox-list-item.tsx index 5e6da4f46d..a99e459e47 100644 --- a/apps/web/core/components/inbox/sidebar/inbox-list-item.tsx +++ b/apps/web/core/components/inbox/sidebar/inbox-list-item.tsx @@ -5,8 +5,9 @@ import { observer } from "mobx-react"; import Link from "next/link"; import { useSearchParams } from "next/navigation"; // plane imports +import { PriorityIcon } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; -import { PriorityIcon, Row, Avatar } from "@plane/ui"; +import { Row, Avatar } from "@plane/ui"; import { cn, renderFormattedDate, getFileURL } from "@plane/utils"; // components import { ButtonAvatars } from "@/components/dropdowns/member/avatar"; diff --git a/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/archived-at.tsx b/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/archived-at.tsx index 22e18556e1..2c0cc96fd9 100644 --- a/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/archived-at.tsx +++ b/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/archived-at.tsx @@ -4,7 +4,7 @@ import { FC } from "react"; import { observer } from "mobx-react"; import { RotateCcw } from "lucide-react"; // hooks -import { ArchiveIcon } from "@plane/ui"; +import { ArchiveIcon } from "@plane/propel/icons"; import { useIssueDetail } from "@/hooks/store/use-issue-detail"; // components import { IssueActivityBlockComponent } from "./"; diff --git a/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/cycle.tsx b/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/cycle.tsx index f24c9056b9..2297ccccd3 100644 --- a/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/cycle.tsx +++ b/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/cycle.tsx @@ -3,7 +3,7 @@ import { FC } from "react"; import { observer } from "mobx-react"; // hooks -import { ContrastIcon } from "@plane/ui"; +import { ContrastIcon } from "@plane/propel/icons"; import { useIssueDetail } from "@/hooks/store/use-issue-detail"; // components import { IssueActivityBlockComponent } from "./"; diff --git a/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/default.tsx b/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/default.tsx index 7ef63f96ef..39272c6cab 100644 --- a/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/default.tsx +++ b/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/default.tsx @@ -3,8 +3,8 @@ import { FC } from "react"; import { observer } from "mobx-react"; // plane imports +import { LayersIcon } from "@plane/propel/icons"; import { EInboxIssueSource } from "@plane/types"; -import { LayersIcon } from "@plane/ui"; // hooks import { capitalizeFirstLetter } from "@plane/utils"; import { useIssueDetail } from "@/hooks/store/use-issue-detail"; diff --git a/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/inbox.tsx b/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/inbox.tsx index 5f3012c0ef..86f54c00cb 100644 --- a/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/inbox.tsx +++ b/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/inbox.tsx @@ -1,7 +1,7 @@ import { FC } from "react"; import { observer } from "mobx-react"; // hooks -import { Intake } from "@plane/ui"; +import { Intake } from "@plane/propel/icons"; import { useIssueDetail } from "@/hooks/store/use-issue-detail"; // components import { IssueActivityBlockComponent } from "./"; diff --git a/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/module.tsx b/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/module.tsx index e59b52b09c..63d748b351 100644 --- a/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/module.tsx +++ b/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/module.tsx @@ -3,7 +3,7 @@ import { FC } from "react"; import { observer } from "mobx-react"; // hooks -import { DiceIcon } from "@plane/ui"; +import { DiceIcon } from "@plane/propel/icons"; import { useIssueDetail } from "@/hooks/store/use-issue-detail"; // components import { IssueActivityBlockComponent } from "./"; diff --git a/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/state.tsx b/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/state.tsx index b441304eef..5af66eede2 100644 --- a/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/state.tsx +++ b/apps/web/core/components/issues/issue-detail/issue-activity/activity/actions/state.tsx @@ -3,7 +3,7 @@ import { FC } from "react"; import { observer } from "mobx-react"; // hooks -import { DoubleCircleIcon } from "@plane/ui"; +import { DoubleCircleIcon } from "@plane/propel/icons"; import { useIssueDetail } from "@/hooks/store/use-issue-detail"; // components import { IssueActivityBlockComponent, IssueLink } from "./"; diff --git a/apps/web/core/components/issues/issue-detail/sidebar.tsx b/apps/web/core/components/issues/issue-detail/sidebar.tsx index 65c5803e11..141f3ed193 100644 --- a/apps/web/core/components/issues/issue-detail/sidebar.tsx +++ b/apps/web/core/components/issues/issue-detail/sidebar.tsx @@ -6,7 +6,7 @@ import { CalendarCheck2, CalendarClock, LayoutPanelTop, Signal, Tag, Triangle, U // i18n import { useTranslation } from "@plane/i18n"; // ui -import { ContrastIcon, DiceIcon, DoubleCircleIcon } from "@plane/ui"; +import { ContrastIcon, DiceIcon, DoubleCircleIcon } from "@plane/propel/icons"; import { cn, getDate, renderFormattedPayloadDate, shouldHighlightIssueDueDate } from "@plane/utils"; // components import { DateDropdown } from "@/components/dropdowns/date"; diff --git a/apps/web/core/components/issues/issue-layouts/filters/applied-filters/cycle.tsx b/apps/web/core/components/issues/issue-layouts/filters/applied-filters/cycle.tsx index 0a08aec5fa..3be676baf1 100644 --- a/apps/web/core/components/issues/issue-layouts/filters/applied-filters/cycle.tsx +++ b/apps/web/core/components/issues/issue-layouts/filters/applied-filters/cycle.tsx @@ -2,9 +2,9 @@ import { observer } from "mobx-react"; import { X } from "lucide-react"; +import { CycleGroupIcon } from "@plane/propel/icons"; import { TCycleGroups } from "@plane/types"; // hooks -import { CycleGroupIcon } from "@plane/ui"; import { useCycle } from "@/hooks/store/use-cycle"; // ui // types diff --git a/apps/web/core/components/issues/issue-layouts/filters/applied-filters/module.tsx b/apps/web/core/components/issues/issue-layouts/filters/applied-filters/module.tsx index 524938c473..84e92d6336 100644 --- a/apps/web/core/components/issues/issue-layouts/filters/applied-filters/module.tsx +++ b/apps/web/core/components/issues/issue-layouts/filters/applied-filters/module.tsx @@ -3,7 +3,7 @@ import { observer } from "mobx-react"; import { X } from "lucide-react"; // hooks -import { DiceIcon } from "@plane/ui"; +import { DiceIcon } from "@plane/propel/icons"; import { useModule } from "@/hooks/store/use-module"; // ui diff --git a/apps/web/core/components/issues/issue-layouts/filters/applied-filters/priority.tsx b/apps/web/core/components/issues/issue-layouts/filters/applied-filters/priority.tsx index 9735d24461..2dc81c2e98 100644 --- a/apps/web/core/components/issues/issue-layouts/filters/applied-filters/priority.tsx +++ b/apps/web/core/components/issues/issue-layouts/filters/applied-filters/priority.tsx @@ -4,8 +4,8 @@ import { observer } from "mobx-react"; // icons import { X } from "lucide-react"; +import { PriorityIcon } from "@plane/propel/icons"; import { TIssuePriorities } from "@plane/types"; -import { PriorityIcon } from "@plane/ui"; // types type Props = { diff --git a/apps/web/core/components/issues/issue-layouts/filters/applied-filters/state-group.tsx b/apps/web/core/components/issues/issue-layouts/filters/applied-filters/state-group.tsx index 807a5b2339..6072bc92bd 100644 --- a/apps/web/core/components/issues/issue-layouts/filters/applied-filters/state-group.tsx +++ b/apps/web/core/components/issues/issue-layouts/filters/applied-filters/state-group.tsx @@ -5,8 +5,8 @@ import { observer } from "mobx-react"; // icons import { X } from "lucide-react"; import { EIconSize } from "@plane/constants"; +import { StateGroupIcon } from "@plane/propel/icons"; import { TStateGroups } from "@plane/types"; -import { StateGroupIcon } from "@plane/ui"; type Props = { handleRemove: (val: string) => void; diff --git a/apps/web/core/components/issues/issue-layouts/filters/applied-filters/state.tsx b/apps/web/core/components/issues/issue-layouts/filters/applied-filters/state.tsx index d02fd6dad2..f55aca4347 100644 --- a/apps/web/core/components/issues/issue-layouts/filters/applied-filters/state.tsx +++ b/apps/web/core/components/issues/issue-layouts/filters/applied-filters/state.tsx @@ -5,8 +5,8 @@ import { observer } from "mobx-react"; // icons import { X } from "lucide-react"; import { EIconSize } from "@plane/constants"; +import { StateGroupIcon } from "@plane/propel/icons"; import { IState } from "@plane/types"; -import { StateGroupIcon } from "@plane/ui"; // types type Props = { diff --git a/apps/web/core/components/issues/issue-layouts/filters/header/filters/cycle.tsx b/apps/web/core/components/issues/issue-layouts/filters/header/filters/cycle.tsx index bfb5dfe043..0e4b17b451 100644 --- a/apps/web/core/components/issues/issue-layouts/filters/header/filters/cycle.tsx +++ b/apps/web/core/components/issues/issue-layouts/filters/header/filters/cycle.tsx @@ -4,9 +4,10 @@ import React, { useMemo, useState } from "react"; import sortBy from "lodash/sortBy"; import { observer } from "mobx-react"; import { useParams } from "next/navigation"; +import { CycleGroupIcon } from "@plane/propel/icons"; import { TCycleGroups } from "@plane/types"; // components -import { Loader, CycleGroupIcon } from "@plane/ui"; +import { Loader } from "@plane/ui"; import { FilterHeader, FilterOption } from "@/components/issues/issue-layouts/filters"; import { useCycle } from "@/hooks/store/use-cycle"; // ui diff --git a/apps/web/core/components/issues/issue-layouts/filters/header/filters/module.tsx b/apps/web/core/components/issues/issue-layouts/filters/header/filters/module.tsx index 7b02e9536a..ca4b4c63b2 100644 --- a/apps/web/core/components/issues/issue-layouts/filters/header/filters/module.tsx +++ b/apps/web/core/components/issues/issue-layouts/filters/header/filters/module.tsx @@ -5,7 +5,8 @@ import sortBy from "lodash/sortBy"; import { observer } from "mobx-react"; import { useParams } from "next/navigation"; // components -import { Loader, DiceIcon } from "@plane/ui"; +import { DiceIcon } from "@plane/propel/icons"; +import { Loader } from "@plane/ui"; import { FilterHeader, FilterOption } from "@/components/issues/issue-layouts/filters"; import { useModule } from "@/hooks/store/use-module"; // ui diff --git a/apps/web/core/components/issues/issue-layouts/filters/header/filters/priority.tsx b/apps/web/core/components/issues/issue-layouts/filters/header/filters/priority.tsx index d519f63843..36bb16991f 100644 --- a/apps/web/core/components/issues/issue-layouts/filters/header/filters/priority.tsx +++ b/apps/web/core/components/issues/issue-layouts/filters/header/filters/priority.tsx @@ -6,7 +6,7 @@ import { observer } from "mobx-react"; import { ISSUE_PRIORITIES } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; // ui -import { PriorityIcon } from "@plane/ui"; +import { PriorityIcon } from "@plane/propel/icons"; // components import { FilterHeader, FilterOption } from "@/components/issues/issue-layouts/filters"; diff --git a/apps/web/core/components/issues/issue-layouts/filters/header/filters/state-group.tsx b/apps/web/core/components/issues/issue-layouts/filters/header/filters/state-group.tsx index be38f0c73d..4896b0d726 100644 --- a/apps/web/core/components/issues/issue-layouts/filters/header/filters/state-group.tsx +++ b/apps/web/core/components/issues/issue-layouts/filters/header/filters/state-group.tsx @@ -4,7 +4,7 @@ import React, { useState } from "react"; import { observer } from "mobx-react"; // plane imports import { STATE_GROUPS } from "@plane/constants"; -import { StateGroupIcon } from "@plane/ui"; +import { StateGroupIcon } from "@plane/propel/icons"; // components import { FilterHeader, FilterOption } from "@/components/issues/issue-layouts/filters"; diff --git a/apps/web/core/components/issues/issue-layouts/filters/header/filters/state.tsx b/apps/web/core/components/issues/issue-layouts/filters/header/filters/state.tsx index f8506c817d..c7f0206b8c 100644 --- a/apps/web/core/components/issues/issue-layouts/filters/header/filters/state.tsx +++ b/apps/web/core/components/issues/issue-layouts/filters/header/filters/state.tsx @@ -4,9 +4,10 @@ import React, { useMemo, useState } from "react"; import sortBy from "lodash/sortBy"; import { observer } from "mobx-react"; import { EIconSize } from "@plane/constants"; +import { StateGroupIcon } from "@plane/propel/icons"; import { IState } from "@plane/types"; // components -import { Loader, StateGroupIcon } from "@plane/ui"; +import { Loader } from "@plane/ui"; import { FilterHeader, FilterOption } from "@/components/issues/issue-layouts/filters"; // ui // types diff --git a/apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/helper.tsx b/apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/helper.tsx index 80c4ae4f37..32e114e6eb 100644 --- a/apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/helper.tsx +++ b/apps/web/core/components/issues/issue-layouts/quick-action-dropdowns/helper.tsx @@ -2,8 +2,9 @@ import { useMemo } from "react"; import { Copy, ExternalLink, Link, Pencil, Trash2, XCircle, ArchiveRestoreIcon } from "lucide-react"; // plane imports import { useTranslation } from "@plane/i18n"; +import { ArchiveIcon } from "@plane/propel/icons"; import { EIssuesStoreType, TIssue } from "@plane/types"; -import { ArchiveIcon, TContextMenuItem, TOAST_TYPE, setToast } from "@plane/ui"; +import { TContextMenuItem, TOAST_TYPE, setToast } from "@plane/ui"; import { copyUrlToClipboard, generateWorkItemLink } from "@plane/utils"; // types import { createCopyMenuWithDuplication } from "@/plane-web/components/issues/issue-layouts/quick-action-dropdowns"; diff --git a/apps/web/core/components/issues/issue-layouts/utils.tsx b/apps/web/core/components/issues/issue-layouts/utils.tsx index c63ce1b0f9..a7b0b9fc76 100644 --- a/apps/web/core/components/issues/issue-layouts/utils.tsx +++ b/apps/web/core/components/issues/issue-layouts/utils.tsx @@ -12,6 +12,7 @@ import scrollIntoView from "smooth-scroll-into-view-if-needed"; import { ContrastIcon } from "lucide-react"; // plane types import { EIconSize, ISSUE_PRIORITIES, STATE_GROUPS } from "@plane/constants"; +import { CycleGroupIcon, DiceIcon, PriorityIcon, StateGroupIcon, ISvgIcons } from "@plane/propel/icons"; import { EIssuesStoreType, GroupByColumnTypes, @@ -30,7 +31,7 @@ import { TGetColumns, } from "@plane/types"; // plane ui -import { Avatar, CycleGroupIcon, DiceIcon, ISvgIcons, PriorityIcon, StateGroupIcon } from "@plane/ui"; +import { Avatar } from "@plane/ui"; import { renderFormattedDate, getFileURL } from "@plane/utils"; // components import { Logo } from "@/components/common/logo"; diff --git a/apps/web/core/components/issues/peek-overview/header.tsx b/apps/web/core/components/issues/peek-overview/header.tsx index b6ced1a967..99c79ced4b 100644 --- a/apps/web/core/components/issues/peek-overview/header.tsx +++ b/apps/web/core/components/issues/peek-overview/header.tsx @@ -7,9 +7,10 @@ import { Link2, MoveDiagonal, MoveRight } from "lucide-react"; // plane imports import { WORK_ITEM_TRACKER_EVENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; +import { CenterPanelIcon, FullScreenPanelIcon, SidePanelIcon } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; import { EIssuesStoreType, TNameDescriptionLoader } from "@plane/types"; -import { CenterPanelIcon, CustomSelect, FullScreenPanelIcon, SidePanelIcon, TOAST_TYPE, setToast } from "@plane/ui"; +import { CustomSelect, TOAST_TYPE, setToast } from "@plane/ui"; import { copyUrlToClipboard, generateWorkItemLink } from "@plane/utils"; // helpers import { captureError, captureSuccess } from "@/helpers/event-tracker.helper"; diff --git a/apps/web/core/components/issues/peek-overview/properties.tsx b/apps/web/core/components/issues/peek-overview/properties.tsx index 25a33a221c..2017de0597 100644 --- a/apps/web/core/components/issues/peek-overview/properties.tsx +++ b/apps/web/core/components/issues/peek-overview/properties.tsx @@ -6,7 +6,7 @@ import { Signal, Tag, Triangle, LayoutPanelTop, CalendarClock, CalendarCheck2, U // i18n import { useTranslation } from "@plane/i18n"; // ui icons -import { DiceIcon, DoubleCircleIcon, ContrastIcon } from "@plane/ui"; +import { DiceIcon, DoubleCircleIcon, ContrastIcon } from "@plane/propel/icons"; import { cn, getDate, renderFormattedPayloadDate, shouldHighlightIssueDueDate } from "@plane/utils"; // components import { DateDropdown } from "@/components/dropdowns/date"; diff --git a/apps/web/core/components/modules/analytics-sidebar/progress-stats.tsx b/apps/web/core/components/modules/analytics-sidebar/progress-stats.tsx index 555e7e32bb..d64c542105 100644 --- a/apps/web/core/components/modules/analytics-sidebar/progress-stats.tsx +++ b/apps/web/core/components/modules/analytics-sidebar/progress-stats.tsx @@ -5,6 +5,7 @@ import { observer } from "mobx-react"; import Image from "next/image"; import { Tab } from "@headlessui/react"; import { useTranslation } from "@plane/i18n"; +import { StateGroupIcon } from "@plane/propel/icons"; import { IIssueFilterOptions, IIssueFilters, @@ -13,7 +14,7 @@ import { TModulePlotType, TStateGroups, } from "@plane/types"; -import { Avatar, StateGroupIcon } from "@plane/ui"; +import { Avatar } from "@plane/ui"; import { cn, getFileURL } from "@plane/utils"; // components import { SingleProgressStats } from "@/components/core/sidebar/single-progress-stats"; diff --git a/apps/web/core/components/modules/analytics-sidebar/root.tsx b/apps/web/core/components/modules/analytics-sidebar/root.tsx index a99bfb57fc..ab402b97ff 100644 --- a/apps/web/core/components/modules/analytics-sidebar/root.tsx +++ b/apps/web/core/components/modules/analytics-sidebar/root.tsx @@ -16,9 +16,10 @@ import { } from "@plane/constants"; // plane types import { useTranslation } from "@plane/i18n"; +import { LayersIcon, ModuleStatusIcon } from "@plane/propel/icons"; import { ILinkDetails, IModule, ModuleLink } from "@plane/types"; // plane ui -import { Loader, LayersIcon, CustomSelect, ModuleStatusIcon, TOAST_TYPE, setToast, TextArea } from "@plane/ui"; +import { Loader, CustomSelect, TOAST_TYPE, setToast, TextArea } from "@plane/ui"; // components // helpers import { getDate, renderFormattedPayloadDate } from "@plane/utils"; diff --git a/apps/web/core/components/modules/applied-filters/status.tsx b/apps/web/core/components/modules/applied-filters/status.tsx index 15a2e8b6ee..d5c10eea10 100644 --- a/apps/web/core/components/modules/applied-filters/status.tsx +++ b/apps/web/core/components/modules/applied-filters/status.tsx @@ -5,7 +5,7 @@ import { X } from "lucide-react"; // ui import { MODULE_STATUS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; -import { ModuleStatusIcon } from "@plane/ui"; +import { ModuleStatusIcon } from "@plane/propel/icons"; // constants type Props = { diff --git a/apps/web/core/components/modules/dropdowns/filters/root.tsx b/apps/web/core/components/modules/dropdowns/filters/root.tsx index d2537868ac..df2f52dbf0 100644 --- a/apps/web/core/components/modules/dropdowns/filters/root.tsx +++ b/apps/web/core/components/modules/dropdowns/filters/root.tsx @@ -4,8 +4,8 @@ import { useState } from "react"; import { observer } from "mobx-react"; import { Search, X } from "lucide-react"; // plane imports +import { TModuleStatus } from "@plane/propel/icons"; import { TModuleDisplayFilters, TModuleFilters } from "@plane/types"; -import { TModuleStatus } from "@plane/ui"; // components import { FilterOption } from "@/components/issues/issue-layouts/filters"; import { FilterLead, FilterMembers, FilterStartDate, FilterStatus, FilterTargetDate } from "@/components/modules"; diff --git a/apps/web/core/components/modules/dropdowns/filters/status.tsx b/apps/web/core/components/modules/dropdowns/filters/status.tsx index f1aa3b14dd..09ee9e494b 100644 --- a/apps/web/core/components/modules/dropdowns/filters/status.tsx +++ b/apps/web/core/components/modules/dropdowns/filters/status.tsx @@ -4,9 +4,9 @@ import React, { useState } from "react"; import { observer } from "mobx-react"; import { MODULE_STATUS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; +import { ModuleStatusIcon } from "@plane/propel/icons"; import { TModuleStatus } from "@plane/types"; // components -import { ModuleStatusIcon } from "@plane/ui"; import { FilterHeader, FilterOption } from "@/components/issues/issue-layouts/filters"; type Props = { diff --git a/apps/web/core/components/modules/gantt-chart/blocks.tsx b/apps/web/core/components/modules/gantt-chart/blocks.tsx index dfaeb067e5..6fc10df6d2 100644 --- a/apps/web/core/components/modules/gantt-chart/blocks.tsx +++ b/apps/web/core/components/modules/gantt-chart/blocks.tsx @@ -5,8 +5,8 @@ import Link from "next/link"; import { useParams } from "next/navigation"; // ui import { MODULE_STATUS } from "@plane/constants"; +import { ModuleStatusIcon } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; -import { ModuleStatusIcon } from "@plane/ui"; // components import { SIDEBAR_WIDTH } from "@/components/gantt-chart/constants"; import { getBlockViewDetails } from "@/components/issues/issue-layouts/utils"; diff --git a/apps/web/core/components/modules/module-card-item.tsx b/apps/web/core/components/modules/module-card-item.tsx index beb4e91984..39bed0337c 100644 --- a/apps/web/core/components/modules/module-card-item.tsx +++ b/apps/web/core/components/modules/module-card-item.tsx @@ -16,17 +16,10 @@ import { MODULE_TRACKER_ELEMENTS, } from "@plane/constants"; import { useLocalStorage } from "@plane/hooks"; +import { LayersIcon } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; import { IModule } from "@plane/types"; -import { - Card, - FavoriteStar, - LayersIcon, - LinearProgressIndicator, - TOAST_TYPE, - setPromiseToast, - setToast, -} from "@plane/ui"; +import { Card, FavoriteStar, LinearProgressIndicator, TOAST_TYPE, setPromiseToast, setToast } from "@plane/ui"; import { getDate, renderFormattedPayloadDate, generateQueryParams } from "@plane/utils"; // components import { DateRangeDropdown } from "@/components/dropdowns/date-range"; diff --git a/apps/web/core/components/modules/module-status-dropdown.tsx b/apps/web/core/components/modules/module-status-dropdown.tsx index a3b2d58817..fa7be76fca 100644 --- a/apps/web/core/components/modules/module-status-dropdown.tsx +++ b/apps/web/core/components/modules/module-status-dropdown.tsx @@ -2,8 +2,9 @@ import React, { FC } from "react"; import { observer } from "mobx-react"; import { MODULE_STATUS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; +import { ModuleStatusIcon, TModuleStatus } from "@plane/propel/icons"; import { IModule } from "@plane/types"; -import { CustomSelect, TModuleStatus, ModuleStatusIcon } from "@plane/ui"; +import { CustomSelect } from "@plane/ui"; type Props = { isDisabled: boolean; diff --git a/apps/web/core/components/modules/quick-actions.tsx b/apps/web/core/components/modules/quick-actions.tsx index 026479cfbb..2b79316ed1 100644 --- a/apps/web/core/components/modules/quick-actions.tsx +++ b/apps/web/core/components/modules/quick-actions.tsx @@ -14,7 +14,8 @@ import { } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; // ui -import { ArchiveIcon, ContextMenu, CustomMenu, TContextMenuItem, TOAST_TYPE, setToast } from "@plane/ui"; +import { ArchiveIcon } from "@plane/propel/icons"; +import { ContextMenu, CustomMenu, TContextMenuItem, TOAST_TYPE, setToast } from "@plane/ui"; import { copyUrlToClipboard, cn } from "@plane/utils"; // components import { ArchiveModuleModal, CreateUpdateModuleModal, DeleteModuleModal } from "@/components/modules"; diff --git a/apps/web/core/components/modules/select/status.tsx b/apps/web/core/components/modules/select/status.tsx index 7da437946c..38aee57a1c 100644 --- a/apps/web/core/components/modules/select/status.tsx +++ b/apps/web/core/components/modules/select/status.tsx @@ -6,9 +6,10 @@ import React from "react"; import { Controller, FieldError, Control } from "react-hook-form"; import { MODULE_STATUS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; +import { DoubleCircleIcon, ModuleStatusIcon } from "@plane/propel/icons"; import type { IModule } from "@plane/types"; // ui -import { CustomSelect, DoubleCircleIcon, ModuleStatusIcon } from "@plane/ui"; +import { CustomSelect } from "@plane/ui"; // types // constants diff --git a/apps/web/core/components/modules/sidebar-select/select-status.tsx b/apps/web/core/components/modules/sidebar-select/select-status.tsx index 9d7a7fda93..c1bf48c074 100644 --- a/apps/web/core/components/modules/sidebar-select/select-status.tsx +++ b/apps/web/core/components/modules/sidebar-select/select-status.tsx @@ -6,9 +6,10 @@ import React from "react"; import { Control, Controller, UseFormWatch } from "react-hook-form"; import { MODULE_STATUS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; +import { DoubleCircleIcon } from "@plane/propel/icons"; import { IModule } from "@plane/types"; // ui -import { CustomSelect, DoubleCircleIcon } from "@plane/ui"; +import { CustomSelect } from "@plane/ui"; // types // common // constants diff --git a/apps/web/core/components/onboarding/header.tsx b/apps/web/core/components/onboarding/header.tsx index 0ab68fea32..bdba2cc00d 100644 --- a/apps/web/core/components/onboarding/header.tsx +++ b/apps/web/core/components/onboarding/header.tsx @@ -4,9 +4,9 @@ import { FC } from "react"; import { observer } from "mobx-react"; import { ChevronLeft } from "lucide-react"; // plane imports +import { PlaneLockup } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; import { EOnboardingSteps, TOnboardingStep } from "@plane/types"; -import { PlaneLockup } from "@plane/ui"; import { cn } from "@plane/utils"; // hooks import { useUser } from "@/hooks/store/user"; diff --git a/apps/web/core/components/onboarding/tour/root.tsx b/apps/web/core/components/onboarding/tour/root.tsx index 9c7c33cf06..86fe84c101 100644 --- a/apps/web/core/components/onboarding/tour/root.tsx +++ b/apps/web/core/components/onboarding/tour/root.tsx @@ -6,7 +6,8 @@ import Image, { StaticImageData } from "next/image"; import { X } from "lucide-react"; // plane imports import { PRODUCT_TOUR_TRACKER_ELEMENTS } from "@plane/constants"; -import { Button, PlaneLockup } from "@plane/ui"; +import { PlaneLockup } from "@plane/propel/icons"; +import { Button } from "@plane/ui"; // helpers import { captureClick } from "@/helpers/event-tracker.helper"; // hooks diff --git a/apps/web/core/components/onboarding/tour/sidebar.tsx b/apps/web/core/components/onboarding/tour/sidebar.tsx index bfc3fa09e8..b416eacb10 100644 --- a/apps/web/core/components/onboarding/tour/sidebar.tsx +++ b/apps/web/core/components/onboarding/tour/sidebar.tsx @@ -2,7 +2,7 @@ // icons import { FileText, Layers } from "lucide-react"; -import { ContrastIcon, DiceIcon, LayersIcon } from "@plane/ui"; +import { ContrastIcon, DiceIcon, LayersIcon } from "@plane/propel/icons"; // types import { TTourSteps } from "./root"; diff --git a/apps/web/core/components/pages/dropdowns/actions.tsx b/apps/web/core/components/pages/dropdowns/actions.tsx index 3b08dbef41..5ad00a6c90 100644 --- a/apps/web/core/components/pages/dropdowns/actions.tsx +++ b/apps/web/core/components/pages/dropdowns/actions.tsx @@ -20,7 +20,8 @@ import { EPageAccess, PROJECT_PAGE_TRACKER_ELEMENTS } from "@plane/constants"; // plane editor import type { EditorRefApi } from "@plane/editor"; // plane ui -import { ArchiveIcon, ContextMenu, CustomMenu, TContextMenuItem } from "@plane/ui"; +import { ArchiveIcon } from "@plane/propel/icons"; +import { ContextMenu, CustomMenu, TContextMenuItem } from "@plane/ui"; // components import { cn } from "@plane/utils"; import { DeletePageModal } from "@/components/pages/modals/delete-page-modal"; diff --git a/apps/web/core/components/pages/header/archived-badge.tsx b/apps/web/core/components/pages/header/archived-badge.tsx index afe24fd592..34e812eb9a 100644 --- a/apps/web/core/components/pages/header/archived-badge.tsx +++ b/apps/web/core/components/pages/header/archived-badge.tsx @@ -1,6 +1,6 @@ import { observer } from "mobx-react"; // plane imports -import { ArchiveIcon } from "@plane/ui"; +import { ArchiveIcon } from "@plane/propel/icons"; import { renderFormattedDate } from "@plane/utils"; // store import type { TPageInstance } from "@/store/pages/base-page"; diff --git a/apps/web/core/components/profile/overview/stats.tsx b/apps/web/core/components/profile/overview/stats.tsx index cf0f15d3e1..34da37fd32 100644 --- a/apps/web/core/components/profile/overview/stats.tsx +++ b/apps/web/core/components/profile/overview/stats.tsx @@ -6,8 +6,9 @@ import { useParams } from "next/navigation"; // ui import { UserCircle2 } from "lucide-react"; import { useTranslation } from "@plane/i18n"; +import { CreateIcon, LayerStackIcon } from "@plane/propel/icons"; import { IUserProfileData } from "@plane/types"; -import { CreateIcon, LayerStackIcon, Loader, Card, ECardSpacing, ECardDirection } from "@plane/ui"; +import { Loader, Card, ECardSpacing, ECardDirection } from "@plane/ui"; // types type Props = { diff --git a/apps/web/core/components/project-states/group-item.tsx b/apps/web/core/components/project-states/group-item.tsx index 82a68a4d66..4598631971 100644 --- a/apps/web/core/components/project-states/group-item.tsx +++ b/apps/web/core/components/project-states/group-item.tsx @@ -6,8 +6,8 @@ import { ChevronDown, Plus } from "lucide-react"; // plane imports import { EIconSize, STATE_TRACKER_ELEMENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; +import { StateGroupIcon } from "@plane/propel/icons"; import { IState, TStateGroups, TStateOperationsCallbacks } from "@plane/types"; -import { StateGroupIcon } from "@plane/ui"; import { cn } from "@plane/utils"; // components import { StateList, StateCreate } from "@/components/project-states"; diff --git a/apps/web/core/components/project-states/state-item-title.tsx b/apps/web/core/components/project-states/state-item-title.tsx index 7bfe7fc6f3..80027cee7d 100644 --- a/apps/web/core/components/project-states/state-item-title.tsx +++ b/apps/web/core/components/project-states/state-item-title.tsx @@ -3,8 +3,8 @@ import { observer } from "mobx-react"; import { GripVertical, Pencil } from "lucide-react"; // plane imports import { EIconSize, STATE_TRACKER_ELEMENTS } from "@plane/constants"; +import { StateGroupIcon } from "@plane/propel/icons"; import { IState, TStateOperationsCallbacks } from "@plane/types"; -import { StateGroupIcon } from "@plane/ui"; // local imports import { useProjectState } from "@/hooks/store/use-project-state"; import { StateDelete, StateMarksAsDefault } from "./options"; diff --git a/apps/web/core/components/stickies/action-bar.tsx b/apps/web/core/components/stickies/action-bar.tsx index 9b6e1ed926..640f615a3e 100644 --- a/apps/web/core/components/stickies/action-bar.tsx +++ b/apps/web/core/components/stickies/action-bar.tsx @@ -6,8 +6,8 @@ import { Plus, StickyNote as StickyIcon, X } from "lucide-react"; // plane hooks import { useOutsideClickDetector } from "@plane/hooks"; // plane ui +import { RecentStickyIcon, StickyNoteIcon } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; -import { RecentStickyIcon, StickyNoteIcon } from "@plane/ui"; // plane utils import { cn } from "@plane/utils"; // hooks diff --git a/apps/web/core/components/stickies/modal/stickies.tsx b/apps/web/core/components/stickies/modal/stickies.tsx index 1cc16bfc6d..c70665e36f 100644 --- a/apps/web/core/components/stickies/modal/stickies.tsx +++ b/apps/web/core/components/stickies/modal/stickies.tsx @@ -2,7 +2,7 @@ import { observer } from "mobx-react"; import { useParams } from "next/navigation"; import { Plus, X } from "lucide-react"; // plane ui -import { RecentStickyIcon } from "@plane/ui"; +import { RecentStickyIcon } from "@plane/propel/icons"; // hooks import { useSticky } from "@/hooks/use-stickies"; // components diff --git a/apps/web/core/components/workspace-notifications/sidebar/header/options/menu-option/root.tsx b/apps/web/core/components/workspace-notifications/sidebar/header/options/menu-option/root.tsx index d7a298145f..fde618e70b 100644 --- a/apps/web/core/components/workspace-notifications/sidebar/header/options/menu-option/root.tsx +++ b/apps/web/core/components/workspace-notifications/sidebar/header/options/menu-option/root.tsx @@ -5,8 +5,9 @@ import { observer } from "mobx-react"; import { Check, CheckCircle, Clock } from "lucide-react"; // plane imports import { useTranslation } from "@plane/i18n"; +import { ArchiveIcon } from "@plane/propel/icons"; import { TNotificationFilter } from "@plane/types"; -import { ArchiveIcon, PopoverMenu } from "@plane/ui"; +import { PopoverMenu } from "@plane/ui"; // hooks import { useWorkspaceNotifications } from "@/hooks/store/notifications"; // local imports diff --git a/apps/web/core/components/workspace-notifications/sidebar/notification-card/options/archive.tsx b/apps/web/core/components/workspace-notifications/sidebar/notification-card/options/archive.tsx index 0c6a8ab216..b5134495c5 100644 --- a/apps/web/core/components/workspace-notifications/sidebar/notification-card/options/archive.tsx +++ b/apps/web/core/components/workspace-notifications/sidebar/notification-card/options/archive.tsx @@ -6,7 +6,8 @@ import { ArchiveRestore } from "lucide-react"; // plane imports import { NOTIFICATION_TRACKER_ELEMENTS, NOTIFICATION_TRACKER_EVENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; -import { ArchiveIcon, TOAST_TYPE, setToast } from "@plane/ui"; +import { ArchiveIcon } from "@plane/propel/icons"; +import { TOAST_TYPE, setToast } from "@plane/ui"; // helpers import { captureError, captureSuccess } from "@/helpers/event-tracker.helper"; // hooks diff --git a/apps/web/core/components/workspace/sidebar/favorites/favorite-folder.tsx b/apps/web/core/components/workspace/sidebar/favorites/favorite-folder.tsx index 14a9e9e52a..f9f5c881ff 100644 --- a/apps/web/core/components/workspace/sidebar/favorites/favorite-folder.tsx +++ b/apps/web/core/components/workspace/sidebar/favorites/favorite-folder.tsx @@ -20,9 +20,10 @@ import { Disclosure, Transition } from "@headlessui/react"; // plane imports import { useOutsideClickDetector } from "@plane/hooks"; import { useTranslation } from "@plane/i18n"; +import { FavoriteFolderIcon } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; import { IFavorite, InstructionType } from "@plane/types"; -import { CustomMenu, DropIndicator, FavoriteFolderIcon, DragHandle } from "@plane/ui"; +import { CustomMenu, DropIndicator, DragHandle } from "@plane/ui"; // helpers import { cn } from "@plane/utils"; // hooks diff --git a/apps/web/core/components/workspace/sidebar/favorites/new-fav-folder.tsx b/apps/web/core/components/workspace/sidebar/favorites/new-fav-folder.tsx index 5412196b55..160a820ee9 100644 --- a/apps/web/core/components/workspace/sidebar/favorites/new-fav-folder.tsx +++ b/apps/web/core/components/workspace/sidebar/favorites/new-fav-folder.tsx @@ -6,7 +6,8 @@ import { useOutsideClickDetector } from "@plane/hooks"; import { useTranslation } from "@plane/i18n"; // plane helpers // plane ui -import { FavoriteFolderIcon, Input, setToast, TOAST_TYPE } from "@plane/ui"; +import { FavoriteFolderIcon } from "@plane/propel/icons"; +import { Input, setToast, TOAST_TYPE } from "@plane/ui"; // hooks import { useFavorite } from "@/hooks/store/use-favorite"; diff --git a/apps/web/core/components/workspace/sidebar/project-navigation.tsx b/apps/web/core/components/workspace/sidebar/project-navigation.tsx index f90f5d65a6..5931376342 100644 --- a/apps/web/core/components/workspace/sidebar/project-navigation.tsx +++ b/apps/web/core/components/workspace/sidebar/project-navigation.tsx @@ -7,9 +7,9 @@ import { useParams, usePathname } from "next/navigation"; import { FileText, Layers } from "lucide-react"; import { EUserPermissionsLevel, EUserPermissions } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; +import { DiceIcon, ContrastIcon, LayersIcon, Intake } from "@plane/propel/icons"; import { EUserProjectRoles } from "@plane/types"; // plane ui -import { DiceIcon, ContrastIcon, LayersIcon, Intake } from "@plane/ui"; // components import { SidebarNavItem } from "@/components/sidebar/sidebar-navigation"; // hooks diff --git a/apps/web/core/components/workspace/sidebar/projects-list-item.tsx b/apps/web/core/components/workspace/sidebar/projects-list-item.tsx index 09bcbec998..3ae47541bc 100644 --- a/apps/web/core/components/workspace/sidebar/projects-list-item.tsx +++ b/apps/web/core/components/workspace/sidebar/projects-list-item.tsx @@ -15,8 +15,9 @@ import { Disclosure, Transition } from "@headlessui/react"; import { EUserPermissions, EUserPermissionsLevel, MEMBER_TRACKER_ELEMENTS } from "@plane/constants"; import { useOutsideClickDetector } from "@plane/hooks"; import { useTranslation } from "@plane/i18n"; +import { ArchiveIcon } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; -import { CustomMenu, ArchiveIcon, DropIndicator, DragHandle, ControlLink } from "@plane/ui"; +import { CustomMenu, DropIndicator, DragHandle, ControlLink } from "@plane/ui"; import { cn } from "@plane/utils"; // components import { Logo } from "@/components/common/logo"; diff --git a/apps/web/core/components/workspace/sidebar/user-menu.tsx b/apps/web/core/components/workspace/sidebar/user-menu.tsx index 2b9bcfcee9..17d2dbe616 100644 --- a/apps/web/core/components/workspace/sidebar/user-menu.tsx +++ b/apps/web/core/components/workspace/sidebar/user-menu.tsx @@ -5,8 +5,8 @@ import { observer } from "mobx-react"; import { useParams } from "next/navigation"; import { Home, Inbox, PenSquare } from "lucide-react"; // plane imports +import { UserActivityIcon } from "@plane/propel/icons"; import { EUserWorkspaceRoles } from "@plane/types"; -import { UserActivityIcon } from "@plane/ui"; // hooks import { useUserPermissions, useUser } from "@/hooks/store/user"; // local imports diff --git a/apps/web/core/components/workspace/sidebar/workspace-menu.tsx b/apps/web/core/components/workspace/sidebar/workspace-menu.tsx index a1fde4936c..81f595d9e9 100644 --- a/apps/web/core/components/workspace/sidebar/workspace-menu.tsx +++ b/apps/web/core/components/workspace/sidebar/workspace-menu.tsx @@ -6,8 +6,8 @@ import { useParams } from "next/navigation"; import { BarChart2, Briefcase, Layers } from "lucide-react"; import { Disclosure, Transition } from "@headlessui/react"; // plane imports +import { ContrastIcon } from "@plane/propel/icons"; import { EUserWorkspaceRoles } from "@plane/types"; -import { ContrastIcon } from "@plane/ui"; // hooks import useLocalStorage from "@/hooks/use-local-storage"; // local imports diff --git a/apps/web/core/constants/editor.ts b/apps/web/core/constants/editor.ts index 57ef821f36..ff046b917d 100644 --- a/apps/web/core/constants/editor.ts +++ b/apps/web/core/constants/editor.ts @@ -25,7 +25,7 @@ import { } from "lucide-react"; // plane imports import type { TCommandExtraProps, TEditorCommands, TEditorFontStyle } from "@plane/editor"; -import { MonospaceIcon, SansSerifIcon, SerifIcon } from "@plane/ui"; +import { MonospaceIcon, SansSerifIcon, SerifIcon } from "@plane/propel/icons"; import { convertRemToPixel } from "@plane/utils"; type TEditorTypes = "lite" | "document" | "sticky"; diff --git a/apps/web/core/constants/plans.tsx b/apps/web/core/constants/plans.tsx index 3946f1c264..717e2ac7d0 100644 --- a/apps/web/core/constants/plans.tsx +++ b/apps/web/core/constants/plans.tsx @@ -1,7 +1,7 @@ import { Mail, MessageCircle } from "lucide-react"; +import { DiscordIcon } from "@plane/propel/icons"; import { EProductSubscriptionEnum } from "@plane/types"; // plane imports -import { DiscordIcon } from "@plane/ui"; import { cn } from "@plane/utils"; export type TPlanFeatureData = React.ReactNode | boolean | null; diff --git a/apps/web/core/layouts/auth-layout/workspace-wrapper.tsx b/apps/web/core/layouts/auth-layout/workspace-wrapper.tsx index cc1f4c1d61..dfe7748a45 100644 --- a/apps/web/core/layouts/auth-layout/workspace-wrapper.tsx +++ b/apps/web/core/layouts/auth-layout/workspace-wrapper.tsx @@ -11,8 +11,9 @@ import useSWRImmutable from "swr/immutable"; // ui import { LogOut } from "lucide-react"; import { EUserPermissions, EUserPermissionsLevel } from "@plane/constants"; +import { PlaneLogo } from "@plane/propel/icons"; import { Tooltip } from "@plane/propel/tooltip"; -import { Button, getButtonStyling, PlaneLogo, setToast, TOAST_TYPE } from "@plane/ui"; +import { Button, getButtonStyling, setToast, TOAST_TYPE } from "@plane/ui"; // components import { cn } from "@plane/utils"; import { LogoSpinner } from "@/components/common/logo-spinner"; diff --git a/packages/propel/package.json b/packages/propel/package.json index f5f5e39b4b..d8887a77bb 100644 --- a/packages/propel/package.json +++ b/packages/propel/package.json @@ -24,6 +24,7 @@ "./command": "./dist/command/index.js", "./dialog": "./dist/dialog/index.js", "./emoji-icon-picker": "./dist/emoji-icon-picker/index.js", + "./icons": "./dist/icons/index.js", "./menu": "./dist/menu/index.js", "./popover": "./dist/popover/index.js", "./styles/fonts": "./dist/styles/fonts/index.css", diff --git a/packages/ui/src/icons/activity-icon.tsx b/packages/propel/src/icons/activity-icon.tsx similarity index 100% rename from packages/ui/src/icons/activity-icon.tsx rename to packages/propel/src/icons/activity-icon.tsx diff --git a/packages/ui/src/icons/ai-icon.tsx b/packages/propel/src/icons/ai-icon.tsx similarity index 100% rename from packages/ui/src/icons/ai-icon.tsx rename to packages/propel/src/icons/ai-icon.tsx diff --git a/packages/ui/src/icons/archive-icon.tsx b/packages/propel/src/icons/archive-icon.tsx similarity index 100% rename from packages/ui/src/icons/archive-icon.tsx rename to packages/propel/src/icons/archive-icon.tsx diff --git a/packages/ui/src/icons/at-risk-icon.tsx b/packages/propel/src/icons/at-risk-icon.tsx similarity index 100% rename from packages/ui/src/icons/at-risk-icon.tsx rename to packages/propel/src/icons/at-risk-icon.tsx diff --git a/packages/ui/src/icons/bar-icon.tsx b/packages/propel/src/icons/bar-icon.tsx similarity index 100% rename from packages/ui/src/icons/bar-icon.tsx rename to packages/propel/src/icons/bar-icon.tsx diff --git a/packages/ui/src/icons/blocked-icon.tsx b/packages/propel/src/icons/blocked-icon.tsx similarity index 100% rename from packages/ui/src/icons/blocked-icon.tsx rename to packages/propel/src/icons/blocked-icon.tsx diff --git a/packages/ui/src/icons/blocker-icon.tsx b/packages/propel/src/icons/blocker-icon.tsx similarity index 100% rename from packages/ui/src/icons/blocker-icon.tsx rename to packages/propel/src/icons/blocker-icon.tsx diff --git a/packages/ui/src/icons/brand/accenture-logo.tsx b/packages/propel/src/icons/brand/accenture-logo.tsx similarity index 100% rename from packages/ui/src/icons/brand/accenture-logo.tsx rename to packages/propel/src/icons/brand/accenture-logo.tsx diff --git a/packages/ui/src/icons/brand/dolby-logo.tsx b/packages/propel/src/icons/brand/dolby-logo.tsx similarity index 100% rename from packages/ui/src/icons/brand/dolby-logo.tsx rename to packages/propel/src/icons/brand/dolby-logo.tsx diff --git a/packages/ui/src/icons/brand/index.ts b/packages/propel/src/icons/brand/index.ts similarity index 100% rename from packages/ui/src/icons/brand/index.ts rename to packages/propel/src/icons/brand/index.ts diff --git a/packages/ui/src/icons/brand/plane-lockup.tsx b/packages/propel/src/icons/brand/plane-lockup.tsx similarity index 100% rename from packages/ui/src/icons/brand/plane-lockup.tsx rename to packages/propel/src/icons/brand/plane-lockup.tsx diff --git a/packages/ui/src/icons/brand/plane-logo.tsx b/packages/propel/src/icons/brand/plane-logo.tsx similarity index 100% rename from packages/ui/src/icons/brand/plane-logo.tsx rename to packages/propel/src/icons/brand/plane-logo.tsx diff --git a/packages/ui/src/icons/brand/plane-wordmark.tsx b/packages/propel/src/icons/brand/plane-wordmark.tsx similarity index 100% rename from packages/ui/src/icons/brand/plane-wordmark.tsx rename to packages/propel/src/icons/brand/plane-wordmark.tsx diff --git a/packages/ui/src/icons/brand/sony-logo.tsx b/packages/propel/src/icons/brand/sony-logo.tsx similarity index 100% rename from packages/ui/src/icons/brand/sony-logo.tsx rename to packages/propel/src/icons/brand/sony-logo.tsx diff --git a/packages/ui/src/icons/brand/zerodha-logo.tsx b/packages/propel/src/icons/brand/zerodha-logo.tsx similarity index 100% rename from packages/ui/src/icons/brand/zerodha-logo.tsx rename to packages/propel/src/icons/brand/zerodha-logo.tsx diff --git a/packages/ui/src/icons/calendar-after-icon.tsx b/packages/propel/src/icons/calendar-after-icon.tsx similarity index 100% rename from packages/ui/src/icons/calendar-after-icon.tsx rename to packages/propel/src/icons/calendar-after-icon.tsx diff --git a/packages/ui/src/icons/calendar-before-icon.tsx b/packages/propel/src/icons/calendar-before-icon.tsx similarity index 100% rename from packages/ui/src/icons/calendar-before-icon.tsx rename to packages/propel/src/icons/calendar-before-icon.tsx diff --git a/packages/ui/src/icons/center-panel-icon.tsx b/packages/propel/src/icons/center-panel-icon.tsx similarity index 100% rename from packages/ui/src/icons/center-panel-icon.tsx rename to packages/propel/src/icons/center-panel-icon.tsx diff --git a/packages/ui/src/icons/comment-fill-icon.tsx b/packages/propel/src/icons/comment-fill-icon.tsx similarity index 100% rename from packages/ui/src/icons/comment-fill-icon.tsx rename to packages/propel/src/icons/comment-fill-icon.tsx diff --git a/packages/ui/src/icons/create-icon.tsx b/packages/propel/src/icons/create-icon.tsx similarity index 100% rename from packages/ui/src/icons/create-icon.tsx rename to packages/propel/src/icons/create-icon.tsx diff --git a/packages/ui/src/icons/cycle/circle-dot-full-icon.tsx b/packages/propel/src/icons/cycle/circle-dot-full-icon.tsx similarity index 100% rename from packages/ui/src/icons/cycle/circle-dot-full-icon.tsx rename to packages/propel/src/icons/cycle/circle-dot-full-icon.tsx diff --git a/packages/ui/src/icons/cycle/contrast-icon.tsx b/packages/propel/src/icons/cycle/contrast-icon.tsx similarity index 100% rename from packages/ui/src/icons/cycle/contrast-icon.tsx rename to packages/propel/src/icons/cycle/contrast-icon.tsx diff --git a/packages/ui/src/icons/cycle/cycle-group-icon.tsx b/packages/propel/src/icons/cycle/cycle-group-icon.tsx similarity index 100% rename from packages/ui/src/icons/cycle/cycle-group-icon.tsx rename to packages/propel/src/icons/cycle/cycle-group-icon.tsx index 00c52f6118..3fc97c2a71 100644 --- a/packages/ui/src/icons/cycle/cycle-group-icon.tsx +++ b/packages/propel/src/icons/cycle/cycle-group-icon.tsx @@ -1,5 +1,5 @@ -import { CircleDotDashed, Circle } from "lucide-react"; import * as React from "react"; +import { CircleDotDashed, Circle } from "lucide-react"; import { CircleDotFullIcon } from "./circle-dot-full-icon"; import { ContrastIcon } from "./contrast-icon"; diff --git a/packages/ui/src/icons/cycle/double-circle-icon.tsx b/packages/propel/src/icons/cycle/double-circle-icon.tsx similarity index 100% rename from packages/ui/src/icons/cycle/double-circle-icon.tsx rename to packages/propel/src/icons/cycle/double-circle-icon.tsx diff --git a/packages/ui/src/icons/cycle/helper.tsx b/packages/propel/src/icons/cycle/helper.tsx similarity index 100% rename from packages/ui/src/icons/cycle/helper.tsx rename to packages/propel/src/icons/cycle/helper.tsx diff --git a/packages/ui/src/icons/cycle/index.ts b/packages/propel/src/icons/cycle/index.ts similarity index 100% rename from packages/ui/src/icons/cycle/index.ts rename to packages/propel/src/icons/cycle/index.ts diff --git a/packages/ui/src/icons/dice-icon.tsx b/packages/propel/src/icons/dice-icon.tsx similarity index 100% rename from packages/ui/src/icons/dice-icon.tsx rename to packages/propel/src/icons/dice-icon.tsx diff --git a/packages/ui/src/icons/discord-icon.tsx b/packages/propel/src/icons/discord-icon.tsx similarity index 100% rename from packages/ui/src/icons/discord-icon.tsx rename to packages/propel/src/icons/discord-icon.tsx diff --git a/packages/ui/src/icons/display-properties.tsx b/packages/propel/src/icons/display-properties.tsx similarity index 100% rename from packages/ui/src/icons/display-properties.tsx rename to packages/propel/src/icons/display-properties.tsx diff --git a/packages/ui/src/icons/done-icon.tsx b/packages/propel/src/icons/done-icon.tsx similarity index 94% rename from packages/ui/src/icons/done-icon.tsx rename to packages/propel/src/icons/done-icon.tsx index 82783ea1d1..36fc491f32 100644 --- a/packages/ui/src/icons/done-icon.tsx +++ b/packages/propel/src/icons/done-icon.tsx @@ -2,7 +2,7 @@ import * as React from "react"; import { ISvgIcons } from "./type"; -export const DoneState: React.FC = ({ width = "10", height = "11", className, color }) => ( +export const DoneState: React.FC = ({ width = "10", height = "11", className }) => ( = ({ width = "10", height = "11", className, color }) => ( +export const PlannedState: React.FC = ({ width = "10", height = "11", className }) => ( = ({ className = "text-current", ...rest }) => ( - +export const UpdatesIcon: React.FC = ({ className = "text-current" }) => ( + Date: Thu, 4 Sep 2025 18:14:48 +0530 Subject: [PATCH 085/138] [WIKI-641] fix: overwrite tailwind typography plugin styles #7723 --- packages/editor/src/styles/editor.css | 40 +++++++++++++-------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/packages/editor/src/styles/editor.css b/packages/editor/src/styles/editor.css index fa9d9521f1..fca94f0a8b 100644 --- a/packages/editor/src/styles/editor.css +++ b/packages/editor/src/styles/editor.css @@ -339,9 +339,9 @@ p.editor-paragraph-block { } padding-bottom: var(--heading-1-padding-bottom); - font-size: var(--font-size-h1); - line-height: var(--line-height-h1); - font-weight: 600; + font-size: var(--font-size-h1) !important; + line-height: var(--line-height-h1) !important; + font-weight: 600 !important; } .prose :where(h2.editor-heading-block):not(:where([class~="not-prose"], [class~="not-prose"] *)) { @@ -350,9 +350,9 @@ p.editor-paragraph-block { } padding-bottom: var(--heading-2-padding-bottom); - font-size: var(--font-size-h2); - line-height: var(--line-height-h2); - font-weight: 600; + font-size: var(--font-size-h2) !important; + line-height: var(--line-height-h2) !important; + font-weight: 600 !important; } .prose :where(h3.editor-heading-block):not(:where([class~="not-prose"], [class~="not-prose"] *)) { @@ -361,9 +361,9 @@ p.editor-paragraph-block { } padding-bottom: var(--heading-3-padding-bottom); - font-size: var(--font-size-h3); - line-height: var(--line-height-h3); - font-weight: 600; + font-size: var(--font-size-h3) !important; + line-height: var(--line-height-h3) !important; + font-weight: 600 !important; } .prose :where(h4.editor-heading-block):not(:where([class~="not-prose"], [class~="not-prose"] *)) { @@ -372,9 +372,9 @@ p.editor-paragraph-block { } padding-bottom: var(--heading-4-padding-bottom); - font-size: var(--font-size-h4); - line-height: var(--line-height-h4); - font-weight: 600; + font-size: var(--font-size-h4) !important; + line-height: var(--line-height-h4) !important; + font-weight: 600 !important; } .prose :where(h5.editor-heading-block):not(:where([class~="not-prose"], [class~="not-prose"] *)) { @@ -383,9 +383,9 @@ p.editor-paragraph-block { } padding-bottom: var(--heading-5-padding-bottom); - font-size: var(--font-size-h5); - line-height: var(--line-height-h5); - font-weight: 600; + font-size: var(--font-size-h5) !important; + line-height: var(--line-height-h5) !important; + font-weight: 600 !important; } .prose :where(h6.editor-heading-block):not(:where([class~="not-prose"], [class~="not-prose"] *)) { @@ -394,9 +394,9 @@ p.editor-paragraph-block { } padding-bottom: var(--heading-6-padding-bottom); - font-size: var(--font-size-h6); - line-height: var(--line-height-h6); - font-weight: 600; + font-size: var(--font-size-h6) !important; + line-height: var(--line-height-h6) !important; + font-weight: 600 !important; } .prose :where(p.editor-paragraph-block):not(:where([class~="not-prose"], [class~="not-prose"] *)) { @@ -418,8 +418,8 @@ p.editor-paragraph-block { } } - font-size: var(--font-size-regular); - line-height: var(--line-height-regular); + font-size: var(--font-size-regular) !important; + line-height: var(--line-height-regular) !important; } p.editor-paragraph-block + p.editor-paragraph-block { From b68d2ca92144ea384d6b56d069b8bdc5e447bf77 Mon Sep 17 00:00:00 2001 From: Aaryan Khandelwal <65252264+aaryan610@users.noreply.github.com> Date: Thu, 4 Sep 2025 18:16:03 +0530 Subject: [PATCH 086/138] [WIKI-642] fix: editor bubble menu overflow issues #7724 --- packages/editor/src/core/components/menus/bubble-menu/root.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/editor/src/core/components/menus/bubble-menu/root.tsx b/packages/editor/src/core/components/menus/bubble-menu/root.tsx index 09b462e488..d2cc489a97 100644 --- a/packages/editor/src/core/components/menus/bubble-menu/root.tsx +++ b/packages/editor/src/core/components/menus/bubble-menu/root.tsx @@ -155,7 +155,7 @@ export const EditorBubbleMenu: FC = (props: { editor: Edi {!isSelecting && (
Date: Thu, 4 Sep 2025 18:57:50 +0530 Subject: [PATCH 087/138] [WIKI-637] fix: work item description version history (#7725) * fix: work item description version history * chore: add key to the editor --- .../core/components/core/description-versions/modal.tsx | 7 ++++--- .../web/core/components/core/description-versions/root.tsx | 5 ++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/apps/web/core/components/core/description-versions/modal.tsx b/apps/web/core/components/core/description-versions/modal.tsx index 0704e1bbd4..dedd69cab6 100644 --- a/apps/web/core/components/core/description-versions/modal.tsx +++ b/apps/web/core/components/core/description-versions/modal.tsx @@ -131,13 +131,14 @@ export const DescriptionVersionsModal: React.FC = observer((props) => { {/* End header */} {/* Version description */}
- {activeVersionDescription ? ( + {activeVersionId && activeVersionDescription ? (

"} + id={activeVersionId} + initialValue={activeVersionDescription} projectId={projectId} ref={editorRef} workspaceId={workspaceId} diff --git a/apps/web/core/components/core/description-versions/root.tsx b/apps/web/core/components/core/description-versions/root.tsx index 52faa60154..abd1ae31ed 100644 --- a/apps/web/core/components/core/description-versions/root.tsx +++ b/apps/web/core/components/core/description-versions/root.tsx @@ -48,6 +48,9 @@ export const DescriptionVersionsRoot: React.FC = observer((props) => { const versionsCount = versions?.length ?? 0; const activeVersionDetails = versions?.find((version) => version.id === activeVersionId); const activeVersionIndex = versions?.findIndex((version) => version.id === activeVersionId); + const activeVersionDescription = activeVersionResponse + ? (activeVersionResponse.description_html ?? "

") + : undefined; const handleNavigation = useCallback( (direction: "prev" | "next") => { @@ -64,7 +67,7 @@ export const DescriptionVersionsRoot: React.FC = observer((props) => { return ( <>

"} + activeVersionDescription={activeVersionDescription} activeVersionDetails={activeVersionDetails} handleClose={() => { setIsModalOpen(false); From a1500c22068090ac57470b4f1050217e0d9f799d Mon Sep 17 00:00:00 2001 From: Aaryan Khandelwal <65252264+aaryan610@users.noreply.github.com> Date: Fri, 5 Sep 2025 13:50:44 +0530 Subject: [PATCH 088/138] [WIKI-644] fix: remove unnecessary props from the editor package #7726 --- .../components/editor/document/editor.tsx | 26 ++++++++----------- .../components/pages/editor/editor-body.tsx | 16 ++---------- .../src/ce/extensions/core/extensions.ts | 2 +- .../src/ce/extensions/document-extensions.tsx | 5 +--- .../editors/document/collaborative-editor.tsx | 24 +++-------------- .../components/editors/document/editor.tsx | 15 +++-------- .../components/editors/editor-wrapper.tsx | 4 +-- .../editor/src/core/extensions/extensions.ts | 9 +++---- .../core/hooks/use-collaborative-editor.ts | 6 ++--- packages/editor/src/core/hooks/use-editor.ts | 6 ++--- packages/editor/src/core/types/editor.ts | 3 --- packages/editor/src/core/types/hook.ts | 7 ++--- 12 files changed, 36 insertions(+), 87 deletions(-) diff --git a/apps/web/core/components/editor/document/editor.tsx b/apps/web/core/components/editor/document/editor.tsx index 42969d0515..19679895df 100644 --- a/apps/web/core/components/editor/document/editor.tsx +++ b/apps/web/core/components/editor/document/editor.tsx @@ -1,6 +1,12 @@ import React, { forwardRef } from "react"; // plane imports -import { DocumentEditorWithRef, type EditorRefApi, type IDocumentEditorProps, type TFileHandler } from "@plane/editor"; +import { + DocumentEditorWithRef, + IEditorPropsExtended, + type EditorRefApi, + type IDocumentEditorProps, + type TFileHandler, +} from "@plane/editor"; import { MakeOptional, TSearchEntityRequestPayload, TSearchResponse } from "@plane/types"; import { cn } from "@plane/utils"; // hooks @@ -8,15 +14,14 @@ import { useEditorConfig, useEditorMention } from "@/hooks/editor"; import { useMember } from "@/hooks/store/use-member"; // plane web hooks import { useEditorFlagging } from "@/plane-web/hooks/use-editor-flagging"; -import { useIssueEmbed } from "@/plane-web/hooks/use-issue-embed"; // local imports import { EditorMentionsRoot } from "../embeds/mentions"; type DocumentEditorWrapperProps = MakeOptional< - Omit, + Omit, "disabledExtensions" | "editable" | "flaggedExtensions" > & { - embedHandler?: Partial; + extendedEditorProps?: Partial; workspaceSlug: string; workspaceId: string; projectId?: string; @@ -35,7 +40,7 @@ export const DocumentEditor = forwardRef ({ display_name: getUserDetails(id)?.display_name ?? "" }), }} - embedHandler={{ - issue: issueEmbedProps, - ...embedHandler, - }} - extendedEditorProps={{}} + extendedEditorProps={extendedEditorProps} {...rest} containerClassName={cn("relative pl-3 pb-3", containerClassName)} /> diff --git a/apps/web/core/components/pages/editor/editor-body.tsx b/apps/web/core/components/pages/editor/editor-body.tsx index 3ada9bf3ca..a57f44058d 100644 --- a/apps/web/core/components/pages/editor/editor-body.tsx +++ b/apps/web/core/components/pages/editor/editor-body.tsx @@ -1,5 +1,6 @@ import { Dispatch, SetStateAction, useCallback, useMemo } from "react"; import { observer } from "mobx-react"; +// plane imports import { LIVE_BASE_PATH, LIVE_BASE_URL } from "@plane/constants"; import { CollaborativeDocumentEditorWithRef, @@ -22,16 +23,11 @@ import { useMember } from "@/hooks/store/use-member"; import { useWorkspace } from "@/hooks/store/use-workspace"; import { useUser } from "@/hooks/store/user"; import { usePageFilters } from "@/hooks/use-page-filters"; -// plane web components +// plane web imports import { EditorAIMenu } from "@/plane-web/components/pages"; -// plane web types import type { TExtendedEditorExtensionsConfig } from "@/plane-web/hooks/pages"; -// plane web store import { EPageStoreType } from "@/plane-web/hooks/store"; -// plane web hooks import { useEditorFlagging } from "@/plane-web/hooks/use-editor-flagging"; - -import { useIssueEmbed } from "@/plane-web/hooks/use-issue-embed"; // store import type { TPageInstance } from "@/store/pages/base-page"; // local imports @@ -96,11 +92,6 @@ export const PageEditorBody: React.FC = observer((props) => { editor: { editorRef, updateAssetsList }, } = page; const workspaceId = getWorkspaceBySlug(workspaceSlug)?.id ?? ""; - // issue-embed - const { issueEmbedProps } = useIssueEmbed({ - fetchEmbedSuggestions: handlers.fetchEntity, - workspaceSlug, - }); // use editor mention const { fetchMentions } = useEditorMention({ searchEntity: handlers.fetchEntity, @@ -244,9 +235,6 @@ export const PageEditorBody: React.FC = observer((props) => { renderComponent: (props) => , getMentionedEntityDetails: (id: string) => ({ display_name: getUserDetails(id)?.display_name ?? "" }), }} - embedHandler={{ - issue: issueEmbedProps, - }} realtimeConfig={realtimeConfig} serverHandler={serverHandler} user={userConfig} diff --git a/packages/editor/src/ce/extensions/core/extensions.ts b/packages/editor/src/ce/extensions/core/extensions.ts index da03ba3861..e09038bca5 100644 --- a/packages/editor/src/ce/extensions/core/extensions.ts +++ b/packages/editor/src/ce/extensions/core/extensions.ts @@ -4,7 +4,7 @@ import type { IEditorProps } from "@/types"; export type TCoreAdditionalExtensionsProps = Pick< IEditorProps, - "disabledExtensions" | "flaggedExtensions" | "fileHandler" | "embedHandler" + "disabledExtensions" | "flaggedExtensions" | "fileHandler" | "extendedEditorProps" >; export const CoreEditorAdditionalExtensions = (props: TCoreAdditionalExtensionsProps): Extensions => { diff --git a/packages/editor/src/ce/extensions/document-extensions.tsx b/packages/editor/src/ce/extensions/document-extensions.tsx index 8260da7d43..abdb282e70 100644 --- a/packages/editor/src/ce/extensions/document-extensions.tsx +++ b/packages/editor/src/ce/extensions/document-extensions.tsx @@ -1,16 +1,13 @@ import type { HocuspocusProvider } from "@hocuspocus/provider"; import type { AnyExtension } from "@tiptap/core"; import { SlashCommands } from "@/extensions"; -// plane editor types -import type { TEmbedConfig } from "@/plane-editor/types"; // types import type { IEditorProps, TExtensions, TUserDetails } from "@/types"; export type TDocumentEditorAdditionalExtensionsProps = Pick< IEditorProps, - "disabledExtensions" | "flaggedExtensions" | "fileHandler" + "disabledExtensions" | "flaggedExtensions" | "fileHandler" | "extendedEditorProps" > & { - embedConfig: TEmbedConfig | undefined; isEditable: boolean; provider?: HocuspocusProvider; userDetails: TUserDetails; 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 038184204e..d29cfd4a88 100644 --- a/packages/editor/src/core/components/editors/document/collaborative-editor.tsx +++ b/packages/editor/src/core/components/editors/document/collaborative-editor.tsx @@ -1,13 +1,10 @@ -import type { Extensions } from "@tiptap/core"; -import React, { useMemo } from "react"; +import React from "react"; // plane imports import { cn } from "@plane/utils"; // components import { PageRenderer } from "@/components/editors"; // constants import { DEFAULT_DISPLAY_CONFIG } from "@/constants/config"; -// extensions -import { WorkItemEmbedExtension } from "@/extensions"; // helpers import { getEditorClassNames } from "@/helpers/common"; // hooks @@ -23,14 +20,13 @@ const CollaborativeDocumentEditor: React.FC = bubbleMenuEnabled = true, containerClassName, documentLoaderClassName, - extensions: externalExtensions = [], + extensions = [], disabledExtensions, displayConfig = DEFAULT_DISPLAY_CONFIG, editable, editorClassName = "", editorProps, extendedEditorProps, - embedHandler, fileHandler, flaggedExtensions, forwardedRef, @@ -50,27 +46,13 @@ const CollaborativeDocumentEditor: React.FC = user, } = props; - const extensions: Extensions = useMemo(() => { - const allExtensions = [...externalExtensions]; - - if (embedHandler?.issue) { - allExtensions.push( - WorkItemEmbedExtension({ - widgetCallback: embedHandler.issue.widgetCallback, - }) - ); - } - - return allExtensions; - }, [externalExtensions, embedHandler.issue]); - // use document editor const { editor, hasServerConnectionFailed, hasServerSynced } = useCollaborativeEditor({ disabledExtensions, editable, editorClassName, editorProps, - embedHandler, + extendedEditorProps, extensions, fileHandler, flaggedExtensions, diff --git a/packages/editor/src/core/components/editors/document/editor.tsx b/packages/editor/src/core/components/editors/document/editor.tsx index e2b3754cc1..60f29eca96 100644 --- a/packages/editor/src/core/components/editors/document/editor.tsx +++ b/packages/editor/src/core/components/editors/document/editor.tsx @@ -7,7 +7,7 @@ import { PageRenderer } from "@/components/editors"; // constants import { DEFAULT_DISPLAY_CONFIG } from "@/constants/config"; // extensions -import { HeadingListExtension, WorkItemEmbedExtension, SideMenuExtension } from "@/extensions"; +import { HeadingListExtension, SideMenuExtension } from "@/extensions"; // helpers import { getEditorClassNames } from "@/helpers/common"; // hooks @@ -25,7 +25,7 @@ const DocumentEditor = (props: IDocumentEditorProps) => { displayConfig = DEFAULT_DISPLAY_CONFIG, editable, editorClassName = "", - embedHandler, + extendedEditorProps, fileHandler, flaggedExtensions, forwardedRef, @@ -39,13 +39,6 @@ const DocumentEditor = (props: IDocumentEditorProps) => { } = props; const extensions: Extensions = useMemo(() => { const additionalExtensions: Extensions = []; - if (embedHandler?.issue) { - additionalExtensions.push( - WorkItemEmbedExtension({ - widgetCallback: embedHandler.issue.widgetCallback, - }) - ); - } additionalExtensions.push( SideMenuExtension({ aiEnabled: !disabledExtensions?.includes("ai"), @@ -54,7 +47,7 @@ const DocumentEditor = (props: IDocumentEditorProps) => { HeadingListExtension, ...DocumentEditorAdditionalExtensions({ disabledExtensions, - embedConfig: embedHandler, + extendedEditorProps, flaggedExtensions, isEditable: editable, fileHandler, @@ -73,6 +66,7 @@ const DocumentEditor = (props: IDocumentEditorProps) => { editable, editorClassName, enableHistory: true, + extendedEditorProps, extensions, fileHandler, flaggedExtensions, @@ -82,7 +76,6 @@ const DocumentEditor = (props: IDocumentEditorProps) => { initialValue: value, mentionHandler, onChange, - embedHandler, }); const editorContainerClassName = getEditorClassNames({ diff --git a/packages/editor/src/core/components/editors/editor-wrapper.tsx b/packages/editor/src/core/components/editors/editor-wrapper.tsx index 7de71bf6f4..2ef07631da 100644 --- a/packages/editor/src/core/components/editors/editor-wrapper.tsx +++ b/packages/editor/src/core/components/editors/editor-wrapper.tsx @@ -25,6 +25,7 @@ export const EditorWrapper: React.FC = (props) => { editable, editorClassName = "", editorProps, + extendedEditorProps, extensions, id, initialValue, @@ -41,7 +42,6 @@ export const EditorWrapper: React.FC = (props) => { placeholder, tabIndex, value, - embedHandler, } = props; const editor = useEditor({ @@ -50,6 +50,7 @@ export const EditorWrapper: React.FC = (props) => { editorClassName, editorProps, enableHistory: true, + extendedEditorProps, extensions, fileHandler, flaggedExtensions, @@ -66,7 +67,6 @@ export const EditorWrapper: React.FC = (props) => { placeholder, tabIndex, value, - embedHandler, }); const editorContainerClassName = getEditorClassNames({ diff --git a/packages/editor/src/core/extensions/extensions.ts b/packages/editor/src/core/extensions/extensions.ts index eda64824ff..b7df5f7330 100644 --- a/packages/editor/src/core/extensions/extensions.ts +++ b/packages/editor/src/core/extensions/extensions.ts @@ -29,7 +29,7 @@ import { // plane editor extensions import { CoreEditorAdditionalExtensions } from "@/plane-editor/extensions"; // types -import type { IEditorProps, TEmbedConfig } from "@/types"; +import type { IEditorProps } from "@/types"; // local imports import { CustomImageExtension } from "./custom-image/extension"; import { EmojiExtension } from "./emoji/extension"; @@ -45,11 +45,10 @@ type TArguments = Pick< | "mentionHandler" | "placeholder" | "tabIndex" - | "embedHandler" + | "extendedEditorProps" > & { enableHistory: boolean; editable: boolean; - embedHandler?: TEmbedConfig; }; export const CoreEditorExtensions = (args: TArguments): Extensions => { @@ -62,8 +61,8 @@ export const CoreEditorExtensions = (args: TArguments): Extensions => { mentionHandler, placeholder, tabIndex, - embedHandler, editable, + extendedEditorProps, } = args; const extensions = [ @@ -118,7 +117,7 @@ export const CoreEditorExtensions = (args: TArguments): Extensions => { disabledExtensions, flaggedExtensions, fileHandler, - embedHandler, + extendedEditorProps, }), ]; diff --git a/packages/editor/src/core/hooks/use-collaborative-editor.ts b/packages/editor/src/core/hooks/use-collaborative-editor.ts index 46f7c4d82c..514ee4019c 100644 --- a/packages/editor/src/core/hooks/use-collaborative-editor.ts +++ b/packages/editor/src/core/hooks/use-collaborative-editor.ts @@ -20,7 +20,7 @@ export const useCollaborativeEditor = (props: TCollaborativeEditorHookProps) => editable, editorClassName = "", editorProps = {}, - embedHandler, + extendedEditorProps, extensions = [], fileHandler, flaggedExtensions, @@ -80,8 +80,8 @@ export const useCollaborativeEditor = (props: TCollaborativeEditorHookProps) => ); const editor = useEditor({ - embedHandler, disabledExtensions, + extendedEditorProps, id, editable, editorProps, @@ -99,7 +99,7 @@ export const useCollaborativeEditor = (props: TCollaborativeEditorHookProps) => ...extensions, ...DocumentEditorAdditionalExtensions({ disabledExtensions, - embedConfig: embedHandler, + extendedEditorProps, fileHandler, flaggedExtensions, isEditable: editable, diff --git a/packages/editor/src/core/hooks/use-editor.ts b/packages/editor/src/core/hooks/use-editor.ts index 22ca31143c..1285a6a7e2 100644 --- a/packages/editor/src/core/hooks/use-editor.ts +++ b/packages/editor/src/core/hooks/use-editor.ts @@ -20,6 +20,7 @@ export const useEditor = (props: TEditorHookProps) => { editorClassName = "", editorProps = {}, enableHistory, + extendedEditorProps, extensions = [], fileHandler, flaggedExtensions, @@ -32,7 +33,6 @@ export const useEditor = (props: TEditorHookProps) => { onAssetChange, onChange, onEditorFocus, - embedHandler, onTransaction, placeholder, provider, @@ -55,16 +55,16 @@ export const useEditor = (props: TEditorHookProps) => { }, extensions: [ ...CoreEditorExtensions({ - editable, disabledExtensions, + editable, enableHistory, + extendedEditorProps, fileHandler, flaggedExtensions, isTouchDevice, mentionHandler, placeholder, tabIndex, - embedHandler, }), ...extensions, ], diff --git a/packages/editor/src/core/types/editor.ts b/packages/editor/src/core/types/editor.ts index 33fb71f6c3..762d87d684 100644 --- a/packages/editor/src/core/types/editor.ts +++ b/packages/editor/src/core/types/editor.ts @@ -143,7 +143,6 @@ export type IEditorProps = { editorClassName?: string; editorProps?: EditorProps; extensions?: Extensions; - embedHandler?: TEmbedConfig; flaggedExtensions: TExtensions[]; fileHandler: TFileHandler; forwardedRef?: React.MutableRefObject; @@ -174,7 +173,6 @@ export type ICollaborativeDocumentEditorProps = Omit & { aiHandler?: TAIHandler; - embedHandler: TEmbedConfig; user?: TUserDetails; value: Content; }; diff --git a/packages/editor/src/core/types/hook.ts b/packages/editor/src/core/types/hook.ts index 0376fc14db..a48480c9c2 100644 --- a/packages/editor/src/core/types/hook.ts +++ b/packages/editor/src/core/types/hook.ts @@ -8,12 +8,12 @@ type TCoreHookProps = Pick< | "disabledExtensions" | "editorClassName" | "editorProps" + | "extendedEditorProps" | "extensions" | "flaggedExtensions" | "handleEditorReady" | "isTouchDevice" | "onEditorFocus" - | "embedHandler" >; export type TEditorHookProps = TCoreHookProps & @@ -51,7 +51,4 @@ export type TCollaborativeEditorHookProps = TCoreHookProps & | "placeholder" | "tabIndex" > & - Pick< - ICollaborativeDocumentEditorProps, - "dragDropEnabled" | "embedHandler" | "realtimeConfig" | "serverHandler" | "user" - >; + Pick; From af1dcd335ef07f66032ce60e94364b03db2ce923 Mon Sep 17 00:00:00 2001 From: Vipin Chaudhary Date: Fri, 5 Sep 2025 14:14:30 +0530 Subject: [PATCH 089/138] [WIKI-640] chore: refactor link view #7727 --- .../editor/src/ce/components/link-container.tsx | 14 ++++++++++++++ .../core/components/editors/editor-container.tsx | 6 +++--- 2 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 packages/editor/src/ce/components/link-container.tsx diff --git a/packages/editor/src/ce/components/link-container.tsx b/packages/editor/src/ce/components/link-container.tsx new file mode 100644 index 0000000000..dcbedc0880 --- /dev/null +++ b/packages/editor/src/ce/components/link-container.tsx @@ -0,0 +1,14 @@ +import { Editor } from "@tiptap/core"; +import { LinkViewContainer } from "@/components/editors/link-view-container"; + +export const LinkContainer = ({ + editor, + containerRef, +}: { + editor: Editor; + containerRef: React.RefObject; +}) => ( + <> + + +); diff --git a/packages/editor/src/core/components/editors/editor-container.tsx b/packages/editor/src/core/components/editors/editor-container.tsx index 7f19171cbd..dad2b7f79f 100644 --- a/packages/editor/src/core/components/editors/editor-container.tsx +++ b/packages/editor/src/core/components/editors/editor-container.tsx @@ -5,10 +5,10 @@ import { cn } from "@plane/utils"; // constants import { DEFAULT_DISPLAY_CONFIG } from "@/constants/config"; import { CORE_EXTENSIONS } from "@/constants/extension"; +// components +import { LinkContainer } from "@/plane-editor/components/link-container"; // types import { TDisplayConfig } from "@/types"; -// components -import { LinkViewContainer } from "./link-view-container"; type Props = { children: ReactNode; @@ -95,7 +95,7 @@ export const EditorContainer: FC = (props) => { )} > {children} - {!isTouchDevice && } + {!isTouchDevice && }
); From a696b6039c8be8e572c1ba3af0f84ae886fff701 Mon Sep 17 00:00:00 2001 From: Jayash Tripathy <76092296+JayashTripathy@users.noreply.github.com> Date: Fri, 5 Sep 2025 14:55:33 +0530 Subject: [PATCH 090/138] [WEB-4835] feat: storybook enhancements (#7702) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ✨ feat: integrate Storybook addons and enhance Tabs component - Added `@storybook/addon-designs` and `@storybook/addon-docs` to the project dependencies. - Enhanced the Tabs component stories to support dynamic tab options. - Introduced a custom theme for Storybook with a new manager configuration. - Added a new SVG logo for branding in Storybook. - Pinned the storybook and related packages version * ♻️ refactor: update Storybook manager configuration by removing unused import * ♻️ refactor: enhance Tabs story with size labels and layout adjustments * 🚨 fix: lint issues * 🚨 fix: lock file * ✏️ fix: update brand image path in Storybook manager configuration * ♻️ refactor: improve Tabs story by ensuring safe default value and enhancing content rendering --- packages/propel/.storybook/main.ts | 2 +- packages/propel/.storybook/manager.ts | 14 + packages/propel/.storybook/preview.ts | 13 +- packages/propel/package.json | 8 +- packages/propel/public/plane-lockup-light.svg | 16 ++ packages/propel/src/tabs/tabs.stories.tsx | 103 ++++--- pnpm-lock.yaml | 251 +++++++++++++----- 7 files changed, 291 insertions(+), 116 deletions(-) create mode 100644 packages/propel/.storybook/manager.ts create mode 100644 packages/propel/public/plane-lockup-light.svg diff --git a/packages/propel/.storybook/main.ts b/packages/propel/.storybook/main.ts index b493c8f312..2fe48942aa 100644 --- a/packages/propel/.storybook/main.ts +++ b/packages/propel/.storybook/main.ts @@ -11,7 +11,7 @@ function getAbsolutePath(value: string) { } const config: StorybookConfig = { stories: ["../src/**/*.stories.@(ts|tsx)"], - addons: [], + addons: ["@storybook/addon-designs", "@storybook/addon-docs"], framework: { name: getAbsolutePath("@storybook/react-vite"), options: {}, diff --git a/packages/propel/.storybook/manager.ts b/packages/propel/.storybook/manager.ts new file mode 100644 index 0000000000..b0d3a40220 --- /dev/null +++ b/packages/propel/.storybook/manager.ts @@ -0,0 +1,14 @@ +import { addons } from "storybook/manager-api"; +import { create } from "storybook/theming"; + +const planeTheme = create({ + base: "dark", + brandTitle: "Plane UI", + brandUrl: "https://plane.so", + brandImage: "plane-lockup-light.svg", + brandTarget: "_self", +}); + +addons.setConfig({ + theme: planeTheme, +}); diff --git a/packages/propel/.storybook/preview.ts b/packages/propel/.storybook/preview.ts index 1c5245934f..e2f23614e1 100644 --- a/packages/propel/.storybook/preview.ts +++ b/packages/propel/.storybook/preview.ts @@ -1,11 +1,14 @@ import type { Preview } from "@storybook/react-vite"; import "@plane/tailwind-config/global.css"; -const preview: Preview = { - parameters: { - controls: { - matchers: {}, - }, +const parameters: Preview["parameters"] = { + controls: { + matchers: {}, }, }; + +const preview: Preview = { + parameters, + tags: ["autodocs"], +}; export default preview; diff --git a/packages/propel/package.json b/packages/propel/package.json index d8887a77bb..1fab620b8d 100644 --- a/packages/propel/package.json +++ b/packages/propel/package.json @@ -55,11 +55,13 @@ "@plane/eslint-config": "workspace:*", "@plane/tailwind-config": "workspace:*", "@plane/typescript-config": "workspace:*", - "@storybook/react-vite": "^9.1.2", + "@storybook/addon-designs": "10.0.2", + "@storybook/addon-docs": "9.1.2", + "@storybook/react-vite": "9.1.2", "@types/react": "catalog:", "@types/react-dom": "catalog:", - "eslint-plugin-storybook": "^9.1.2", - "storybook": "^9.1.2", + "eslint-plugin-storybook": "9.1.2", + "storybook": "9.1.2", "tsdown": "catalog:", "typescript": "catalog:" } diff --git a/packages/propel/public/plane-lockup-light.svg b/packages/propel/public/plane-lockup-light.svg new file mode 100644 index 0000000000..d319a79eb6 --- /dev/null +++ b/packages/propel/public/plane-lockup-light.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/packages/propel/src/tabs/tabs.stories.tsx b/packages/propel/src/tabs/tabs.stories.tsx index 28e7dc11ec..49f9de438d 100644 --- a/packages/propel/src/tabs/tabs.stories.tsx +++ b/packages/propel/src/tabs/tabs.stories.tsx @@ -1,64 +1,97 @@ -import { Fragment } from "react"; +import { ComponentProps } from "react"; import type { Meta, StoryObj } from "@storybook/react-vite"; import { Tabs } from "./tabs"; -const meta: Meta = { +type TabOption = { + label: string; + value: string; +}; + +const tabOptions: TabOption[] = [ + { label: "Account", value: "account" }, + { label: "Password", value: "password" }, +]; + +interface StoryProps extends ComponentProps { + options: TabOption[]; +} + +const meta: Meta = { title: "Components/Tabs", component: Tabs, parameters: { layout: "centered", }, + args: { + defaultValue: "account", + options: tabOptions, + }, }; export default meta; type Story = StoryObj; export const Basic: Story = { - render: () => ( -
- - - Overview - Settings - - - - Overview settings go here - - - Settings settings go here - - -
- ), + args: { + options: [ + { + label: "Account", + value: "account", + }, + { + label: "Password", + value: "password", + }, + ], + }, + + render: ({ defaultValue, options }) => { + const safeDefault = options?.some((o) => o.value === defaultValue) ? defaultValue : options?.[0]?.value; + return ( +
+ + + {options.map((option) => ( + + {option.label} + + ))} + + + {options.map((option) => ( + + {option.label} content goes here + + ))} + +
+ ); + }, }; export const Sizes: Story = { - render: () => { + render: ({ defaultValue, options }) => { const sizes = ["sm", "md", "lg"] as const; - const labels = { + const sizeLabels: Record<(typeof sizes)[number], string> = { sm: "Small", md: "Medium", lg: "Large", }; - return ( -
- {sizes.map((size, index) => ( - - {index > 0 &&
} -
{labels[size]}
- +
+ {sizes.map((size) => ( +
+
{sizeLabels[size]}
+ - - Overview - - - Settings - + {options.map((option) => ( + + {option.label} + + ))} - +
))}
); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6ab42f3d97..447b635661 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1039,8 +1039,14 @@ importers: '@plane/typescript-config': specifier: workspace:* version: link:../typescript-config + '@storybook/addon-designs': + specifier: 10.0.2 + version: 10.0.2(@storybook/addon-docs@9.1.2(@types/react@18.3.11)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(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.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))) + '@storybook/addon-docs': + specifier: 9.1.2 + version: 9.1.2(@types/react@18.3.11)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))) '@storybook/react-vite': - specifier: ^9.1.2 + specifier: 9.1.2 version: 9.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.50.0)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.8.3)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) '@types/react': specifier: 'catalog:' @@ -1049,10 +1055,10 @@ importers: specifier: 'catalog:' version: 18.3.1 eslint-plugin-storybook: - specifier: ^9.1.2 + specifier: 9.1.2 version: 9.1.2(eslint@8.57.1)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.8.3) storybook: - specifier: ^9.1.2 + specifier: 9.1.2 version: 9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) tsdown: specifier: 'catalog:' @@ -1808,6 +1814,14 @@ packages: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@figspec/components@1.0.3': + resolution: {integrity: sha512-fBwHzJ4ouuOUJEi+yBZIrOy+0/fAjB3AeTcIHTT1PRxLz8P63xwC7R0EsIJXhScIcc+PljGmqbbVJCjLsnaGYA==} + + '@figspec/react@1.0.4': + resolution: {integrity: sha512-jaPvkIef4d6NjsRiw91OZabrfdPH9FtoPGYcY5mpXjYEcdUqIq1aHtLq3SkMVyVysEapTEJ6yS8amy93MyXBEQ==} + peerDependencies: + react: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + '@floating-ui/core@1.7.3': resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} @@ -2056,6 +2070,15 @@ packages: '@lifeomic/attempt@3.1.0': resolution: {integrity: sha512-QZqem4QuAnAyzfz+Gj5/+SLxqwCAw2qmt7732ZXodr6VDWGeYLG6w1i/vYLa55JQM9wRuBKLmXmiZ2P0LtE5rw==} + '@lit-labs/react@1.2.1': + resolution: {integrity: sha512-DiZdJYFU0tBbdQkfwwRSwYyI/mcWkg3sWesKRsHUd4G+NekTmmeq9fzsurvcKTNVa0comNljwtg4Hvi1ds3V+A==} + + '@lit-labs/ssr-dom-shim@1.4.0': + resolution: {integrity: sha512-ficsEARKnmmW5njugNYKipTm4SFnbik7CXtoencDZzmzo/dQ+2Q0bgkzJuoJP20Aj0F+izzJjOqsnkd6F/o1bw==} + + '@lit/reactive-element@1.6.3': + resolution: {integrity: sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==} + '@mdx-js/react@3.1.0': resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==} peerDependencies: @@ -2493,78 +2516,78 @@ packages: '@remirror/core-constants@3.0.0': resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} - '@rolldown/binding-android-arm64@1.0.0-beta.34': - resolution: {integrity: sha512-jf5GNe5jP3Sr1Tih0WKvg2bzvh5T/1TA0fn1u32xSH7ca/p5t+/QRr4VRFCV/na5vjwKEhwWrChsL2AWlY+eoA==} + '@rolldown/binding-android-arm64@1.0.0-beta.35': + resolution: {integrity: sha512-zVTg0544Ib1ldJSWwjy8URWYHlLFJ98rLnj+2FIj5fRs4KqGKP4VgH/pVUbXNGxeLFjItie6NSK1Un7nJixneQ==} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-beta.34': - resolution: {integrity: sha512-2F/TqH4QuJQ34tgWxqBjFL3XV1gMzeQgUO8YRtCPGBSP0GhxtoFzsp7KqmQEothsxztlv+KhhT9Dbg3HHwHViQ==} + '@rolldown/binding-darwin-arm64@1.0.0-beta.35': + resolution: {integrity: sha512-WPy0qx22CABTKDldEExfpYHWHulRoPo+m/YpyxP+6ODUPTQexWl8Wp12fn1CVP0xi0rOBj7ugs6+kKMAJW56wQ==} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.34': - resolution: {integrity: sha512-E1QuFslgLWbHQ8Qli/AqUKdfg0pockQPwRxVbhNQ74SciZEZpzLaujkdmOLSccMlSXDfFCF8RPnMoRAzQ9JV8Q==} + '@rolldown/binding-darwin-x64@1.0.0-beta.35': + resolution: {integrity: sha512-3k1TabJafF/GgNubXMkfp93d5p30SfIMOmQ5gm1tFwO+baMxxVPwDs3FDvSl+feCWwXxBA+bzemgkaDlInmp1Q==} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-beta.34': - resolution: {integrity: sha512-VS8VInNCwnkpI9WeQaWu3kVBq9ty6g7KrHdLxYMzeqz24+w9hg712TcWdqzdY6sn+24lUoMD9jTZrZ/qfVpk0g==} + '@rolldown/binding-freebsd-x64@1.0.0-beta.35': + resolution: {integrity: sha512-GAiapN5YyIocnBVNEiOxMfWO9NqIeEKKWohj1sPLGc61P+9N1meXOOCiAPbLU+adXq0grtbYySid+Or7f2q+Mg==} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.34': - resolution: {integrity: sha512-4St4emjcnULnxJYb/5ZDrH/kK/j6PcUgc3eAqH5STmTrcF+I9m/X2xvSF2a2bWv1DOQhxBewThu0KkwGHdgu5w==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.35': + resolution: {integrity: sha512-okPKKIE73qkUMvq7dxDyzD0VIysdV4AirHqjf8tGTjuNoddUAl3WAtMYbuZCEKJwUyI67UINKO1peFVlYEb+8w==} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.34': - resolution: {integrity: sha512-a737FTqhFUoWfnebS2SnQ2BS50p0JdukdkUBwy2J06j4hZ6Eej0zEB8vTfAqoCjn8BQKkXBy+3Sx0IRkgwz1gA==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.35': + resolution: {integrity: sha512-Nky8Q2cxyKVkEETntrvcmlzNir5khQbDfX3PflHPbZY7XVZalllRqw7+MW5vn+jTsk5BfKVeLsvrF4344IU55g==} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.34': - resolution: {integrity: sha512-NH+FeQWKyuw0k+PbXqpFWNfvD8RPvfJk766B/njdaWz4TmiEcSB0Nb6guNw1rBpM1FmltQYb3fFnTumtC6pRfA==} + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.35': + resolution: {integrity: sha512-8aHpWVSfZl3Dy2VNFG9ywmlCPAJx45g0z+qdOeqmYceY7PBAT4QGzii9ig1hPb1pY8K45TXH44UzQwr2fx352Q==} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.34': - resolution: {integrity: sha512-Q3RSCivp8pNadYK8ke3hLnQk08BkpZX9BmMjgwae2FWzdxhxxUiUzd9By7kneUL0vRQ4uRnhD9VkFQ+Haeqdvw==} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.35': + resolution: {integrity: sha512-1r1Ac/vTcm1q4kRiX/NB6qtorF95PhjdCxKH3Z5pb+bWMDZnmcz18fzFlT/3C6Qpj/ZqUF+EUrG4QEDXtVXGgg==} cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.34': - resolution: {integrity: sha512-wDd/HrNcVoBhWWBUW3evJHoo7GJE/RofssBy3Dsiip05YUBmokQVrYAyrboOY4dzs/lJ7HYeBtWQ9hj8wlyF0A==} + '@rolldown/binding-linux-x64-musl@1.0.0-beta.35': + resolution: {integrity: sha512-AFl1LnuhUBDfX2j+cE6DlVGROv4qG7GCPDhR1kJqi2+OuXGDkeEjqRvRQOFErhKz1ckkP/YakvN7JheLJ2PKHQ==} cpu: [x64] os: [linux] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.34': - resolution: {integrity: sha512-dH3FTEV6KTNWpYSgjSXZzeX7vLty9oBYn6R3laEdhwZftQwq030LKL+5wyQdlbX5pnbh4h127hpv3Hl1+sj8dg==} + '@rolldown/binding-openharmony-arm64@1.0.0-beta.35': + resolution: {integrity: sha512-Tuwb8vPs+TVJlHhyLik+nwln/burvIgaPDgg6wjNZ23F1ttjZi0w0rQSZfAgsX4jaUbylwCETXQmTp3w6vcJMw==} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.34': - resolution: {integrity: sha512-y5BUf+QtO0JsIDKA51FcGwvhJmv89BYjUl8AmN7jqD6k/eU55mH6RJYnxwCsODq5m7KSSTigVb6O7/GqB8wbPw==} + '@rolldown/binding-wasm32-wasi@1.0.0-beta.35': + resolution: {integrity: sha512-rG0OozgqNUYcpu50MpICMlJflexRVtQfjlN9QYf6hoel46VvY0FbKGwBKoeUp2K5D4i8lV04DpEMfTZlzRjeiA==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.34': - resolution: {integrity: sha512-ga5hFhdTwpaNxEiuxZHWnD3ed0GBAzbgzS5tRHpe0ObptxM1a9Xrq6TVfNQirBLwb5Y7T/FJmJi3pmdLy95ljg==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.35': + resolution: {integrity: sha512-WeOfAZrycFo9+ZqTDp3YDCAOLolymtKGwImrr9n+OW0lpwI2UKyKXbAwGXRhydAYbfrNmuqWyfyoAnLh3X9Hjg==} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.34': - resolution: {integrity: sha512-4/MBp9T9eRnZskxWr8EXD/xHvLhdjWaeX/qY9LPRG1JdCGV3DphkLTy5AWwIQ5jhAy2ZNJR5z2fYRlpWU0sIyQ==} + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.35': + resolution: {integrity: sha512-XkLT7ikKGiUDvLh7qtJHRukbyyP1BIrD1xb7A+w4PjIiOKeOH8NqZ+PBaO4plT7JJnLxx+j9g/3B7iylR1nTFQ==} cpu: [ia32] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.34': - resolution: {integrity: sha512-7O5iUBX6HSBKlQU4WykpUoEmb0wQmonb6ziKFr3dJTHud2kzDnWMqk344T0qm3uGv9Ddq6Re/94pInxo1G2d4w==} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.35': + resolution: {integrity: sha512-rftASFKVzjbcQHTCYHaBIDrnQFzbeV50tm4hVugG3tPjd435RHZC2pbeGV5IPdKEqyJSuurM/GfbV3kLQ3LY/A==} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-beta.34': - resolution: {integrity: sha512-LyAREkZHP5pMom7c24meKmJCdhf2hEyvam2q0unr3or9ydwDL+DJ8chTF6Av/RFPb3rH8UFBdMzO5MxTZW97oA==} + '@rolldown/pluginutils@1.0.0-beta.35': + resolution: {integrity: sha512-slYrCpoxJUqzFDDNlvrOYRazQUNRvWPjXA17dAOISY3rDMxX6k8K4cj2H+hEYMHF81HO3uNd5rHVigAWRM5dSg==} '@rollup/pluginutils@5.2.0': resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} @@ -2701,11 +2724,31 @@ packages: peerDependencies: storybook: ^8.6.14 + '@storybook/addon-designs@10.0.2': + resolution: {integrity: sha512-MP7av/of6QMPH7bRjwjTC34GySy2bfyh3WwLWeztQOuNWMEFUOWzjh9iIyCiOBl7VADSXeL4SOJGIiGzQznFZw==} + peerDependencies: + '@storybook/addon-docs': ^0.0.0-0 || ^9.0.0 || ^9.1.0-0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^0.0.0-0 || ^9.0.0 || ^9.1.0-0 + peerDependenciesMeta: + '@storybook/addon-docs': + optional: true + react: + optional: true + react-dom: + optional: true + '@storybook/addon-docs@8.6.14': resolution: {integrity: sha512-Obpd0OhAF99JyU5pp5ci17YmpcQtMNgqW2pTXV8jAiiipWpwO++hNDeQmLmlSXB399XjtRDOcDVkoc7rc6JzdQ==} peerDependencies: storybook: ^8.6.14 + '@storybook/addon-docs@9.1.2': + resolution: {integrity: sha512-U3eHJ8lQFfEZ/OcgdKkUBbW2Y2tpAsHfy8lQOBgs5Pgj9biHEJcUmq+drOS/sJhle673eoBcUFmspXulI4KP1w==} + peerDependencies: + storybook: ^9.1.2 + '@storybook/addon-essentials@8.6.14': resolution: {integrity: sha512-5ZZSHNaW9mXMOFkoPyc3QkoNGdJHETZydI62/OASR0lmPlJ1065TNigEo5dJddmZNn0/3bkE8eKMAzLnO5eIdA==} peerDependencies: @@ -5774,6 +5817,15 @@ packages: linkifyjs@4.3.2: resolution: {integrity: sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==} + lit-element@3.3.3: + resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} + + lit-html@2.8.0: + resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} + + lit@2.8.0: + resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} + loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} @@ -7033,8 +7085,8 @@ packages: vue-tsc: optional: true - rolldown@1.0.0-beta.34: - resolution: {integrity: sha512-Wwh7EwalMzzX3Yy3VN58VEajeR2Si8+HDNMf706jPLIqU7CxneRW+dQVfznf5O0TWTnJyu4npelwg2bzTXB1Nw==} + rolldown@1.0.0-beta.35: + resolution: {integrity: sha512-gJATyqcsJe0Cs8RMFO8XgFjfTc0lK1jcSvirDQDSIfsJE+vt53QH/Ob+OBSJsXb98YtZXHfP/bHpELpPwCprow==} hasBin: true rollup@4.50.0: @@ -8559,6 +8611,16 @@ snapshots: '@eslint/js@8.57.1': {} + '@figspec/components@1.0.3': + dependencies: + lit: 2.8.0 + + '@figspec/react@1.0.4(react@18.3.1)': + dependencies: + '@figspec/components': 1.0.3 + '@lit-labs/react': 1.2.1 + react: 18.3.1 + '@floating-ui/core@1.7.3': dependencies: '@floating-ui/utils': 0.2.10 @@ -8833,6 +8895,14 @@ snapshots: '@lifeomic/attempt@3.1.0': {} + '@lit-labs/react@1.2.1': {} + + '@lit-labs/ssr-dom-shim@1.4.0': {} + + '@lit/reactive-element@1.6.3': + dependencies: + '@lit-labs/ssr-dom-shim': 1.4.0 + '@mdx-js/react@3.1.0(@types/react@18.3.11)(react@18.3.1)': dependencies: '@types/mdx': 2.0.13 @@ -9305,51 +9375,51 @@ snapshots: '@remirror/core-constants@3.0.0': {} - '@rolldown/binding-android-arm64@1.0.0-beta.34': + '@rolldown/binding-android-arm64@1.0.0-beta.35': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-beta.34': + '@rolldown/binding-darwin-arm64@1.0.0-beta.35': optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.34': + '@rolldown/binding-darwin-x64@1.0.0-beta.35': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.34': + '@rolldown/binding-freebsd-x64@1.0.0-beta.35': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.34': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.35': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.34': + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.35': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.34': + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.35': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.34': + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.35': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.34': + '@rolldown/binding-linux-x64-musl@1.0.0-beta.35': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-beta.34': + '@rolldown/binding-openharmony-arm64@1.0.0-beta.35': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.34': + '@rolldown/binding-wasm32-wasi@1.0.0-beta.35': dependencies: '@napi-rs/wasm-runtime': 1.0.3 optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.34': + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.35': optional: true - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.34': + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.35': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.34': + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.35': optional: true - '@rolldown/pluginutils@1.0.0-beta.34': {} + '@rolldown/pluginutils@1.0.0-beta.35': {} '@rollup/pluginutils@5.2.0(rollup@4.50.0)': dependencies: @@ -9449,6 +9519,15 @@ snapshots: storybook: 8.6.14(prettier@3.6.2) ts-dedent: 2.2.0 + '@storybook/addon-designs@10.0.2(@storybook/addon-docs@9.1.2(@types/react@18.3.11)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(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.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(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.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) + optionalDependencies: + '@storybook/addon-docs': 9.1.2(@types/react@18.3.11)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(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.6.2))': dependencies: '@mdx-js/react': 3.1.0(@types/react@18.3.11)(react@18.3.1) @@ -9462,6 +9541,19 @@ snapshots: transitivePeerDependencies: - '@types/react' + '@storybook/addon-docs@9.1.2(@types/react@18.3.11)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)))': + dependencies: + '@mdx-js/react': 3.1.0(@types/react@18.3.11)(react@18.3.1) + '@storybook/csf-plugin': 9.1.2(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(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.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(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.2(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.0.0(@types/node@22.17.2)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1)) + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@types/react' + '@storybook/addon-essentials@8.6.14(@types/react@18.3.11)(storybook@8.6.14(prettier@3.6.2))': dependencies: '@storybook/addon-actions': 8.6.14(storybook@8.6.14(prettier@3.6.2)) @@ -10395,8 +10487,7 @@ snapshots: '@types/triple-beam@1.3.5': {} - '@types/trusted-types@2.0.7': - optional: true + '@types/trusted-types@2.0.7': {} '@types/unist@2.0.11': {} @@ -12938,6 +13029,22 @@ snapshots: linkifyjs@4.3.2: {} + lit-element@3.3.3: + dependencies: + '@lit-labs/ssr-dom-shim': 1.4.0 + '@lit/reactive-element': 1.6.3 + lit-html: 2.8.0 + + lit-html@2.8.0: + dependencies: + '@types/trusted-types': 2.0.7 + + lit@2.8.0: + dependencies: + '@lit/reactive-element': 1.6.3 + lit-element: 3.3.3 + lit-html: 2.8.0 + loader-runner@4.3.0: {} locate-path@5.0.0: @@ -14314,7 +14421,7 @@ snapshots: dependencies: glob: 7.2.3 - rolldown-plugin-dts@0.15.10(rolldown@1.0.0-beta.34)(typescript@5.8.3): + rolldown-plugin-dts@0.15.10(rolldown@1.0.0-beta.35)(typescript@5.8.3): dependencies: '@babel/generator': 7.28.3 '@babel/parser': 7.28.3 @@ -14324,34 +14431,34 @@ snapshots: debug: 4.4.1(supports-color@5.5.0) dts-resolver: 2.1.2 get-tsconfig: 4.10.1 - rolldown: 1.0.0-beta.34 + rolldown: 1.0.0-beta.35 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: - oxc-resolver - supports-color - rolldown@1.0.0-beta.34: + rolldown@1.0.0-beta.35: dependencies: '@oxc-project/runtime': 0.82.3 '@oxc-project/types': 0.82.3 - '@rolldown/pluginutils': 1.0.0-beta.34 + '@rolldown/pluginutils': 1.0.0-beta.35 ansis: 4.1.0 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.34 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.34 - '@rolldown/binding-darwin-x64': 1.0.0-beta.34 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.34 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.34 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.34 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.34 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.34 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.34 - '@rolldown/binding-openharmony-arm64': 1.0.0-beta.34 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.34 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.34 - '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.34 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.34 + '@rolldown/binding-android-arm64': 1.0.0-beta.35 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.35 + '@rolldown/binding-darwin-x64': 1.0.0-beta.35 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.35 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.35 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.35 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.35 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.35 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.35 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.35 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.35 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.35 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.35 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.35 rollup@4.50.0: dependencies: @@ -15035,8 +15142,8 @@ snapshots: diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 - rolldown: 1.0.0-beta.34 - rolldown-plugin-dts: 0.15.10(rolldown@1.0.0-beta.34)(typescript@5.8.3) + rolldown: 1.0.0-beta.35 + rolldown-plugin-dts: 0.15.10(rolldown@1.0.0-beta.35)(typescript@5.8.3) semver: 7.7.2 tinyexec: 1.0.1 tinyglobby: 0.2.14 From ff181e566f9f1203f7434328b700a9f5b8555ebd Mon Sep 17 00:00:00 2001 From: Jayash Tripathy <76092296+JayashTripathy@users.noreply.github.com> Date: Fri, 5 Sep 2025 15:51:05 +0530 Subject: [PATCH 091/138] [WEB-4738] feat: add Skeleton component with respective stories in propel (#7704) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ✨ feat: add Skeleton component with respective stories in propel * 🚨 fix: lint issues * ♻️ refactor : enhance Skeleton component with improved props and structure * ✨ feat: add Skeleton component entry to package.json * 🚨 fix: lint * ♻️ refactor: rename Skeleton to skeleton * fix: rename fixes * ♻️ refactor: rename skeleton * 🚨 fix: lint * ♻️ refactor: add skeleton entry to tsdown config and package.json * ♻️ refactor: sorted propel exports --------- Co-authored-by: sriramveeraghanta --- packages/propel/package.json | 1 + packages/propel/src/skeleton/index.ts | 1 + packages/propel/src/skeleton/root.tsx | 36 +++++++++++++++++++ .../propel/src/skeleton/skeleton.stories.tsx | 33 +++++++++++++++++ packages/propel/tsdown.config.ts | 1 + 5 files changed, 72 insertions(+) create mode 100644 packages/propel/src/skeleton/index.ts create mode 100644 packages/propel/src/skeleton/root.tsx create mode 100644 packages/propel/src/skeleton/skeleton.stories.tsx diff --git a/packages/propel/package.json b/packages/propel/package.json index 1fab620b8d..15933f2af5 100644 --- a/packages/propel/package.json +++ b/packages/propel/package.json @@ -27,6 +27,7 @@ "./icons": "./dist/icons/index.js", "./menu": "./dist/menu/index.js", "./popover": "./dist/popover/index.js", + "./skeleton": "./dist/skeleton/index.js", "./styles/fonts": "./dist/styles/fonts/index.css", "./switch": "./dist/switch/index.js", "./table": "./dist/table/index.js", diff --git a/packages/propel/src/skeleton/index.ts b/packages/propel/src/skeleton/index.ts new file mode 100644 index 0000000000..1efe34c51e --- /dev/null +++ b/packages/propel/src/skeleton/index.ts @@ -0,0 +1 @@ +export * from "./root"; diff --git a/packages/propel/src/skeleton/root.tsx b/packages/propel/src/skeleton/root.tsx new file mode 100644 index 0000000000..dee2c27f06 --- /dev/null +++ b/packages/propel/src/skeleton/root.tsx @@ -0,0 +1,36 @@ +import React from "react"; +// helpers +import { cn } from "../utils/classname"; + +type SkeletonProps = { + children: React.ReactNode; + className?: string; + ariaLabel?: string; +}; + +const SkeletonRoot = ({ children, className = "", ariaLabel = "Loading content" }: SkeletonProps) => ( +
+ {children} +
+); + +type ItemProps = { + height?: string; + width?: string; + className?: string; +}; + +const SkeletonItem: React.FC = ({ height = "auto", width = "auto", className = "" }) => ( +
+); + +const Skeleton = Object.assign(SkeletonRoot, { Item: SkeletonItem }); + +SkeletonRoot.displayName = "plane-ui-skeleton"; +SkeletonItem.displayName = "plane-ui-skeleton-item"; + +export { Skeleton }; diff --git a/packages/propel/src/skeleton/skeleton.stories.tsx b/packages/propel/src/skeleton/skeleton.stories.tsx new file mode 100644 index 0000000000..262bcd0529 --- /dev/null +++ b/packages/propel/src/skeleton/skeleton.stories.tsx @@ -0,0 +1,33 @@ +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { Skeleton } from "./index"; + +const meta: Meta = { + title: "Components/Skeleton", + component: Skeleton, + parameters: { + layout: "centered", + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + render: () => ( + + + + ), +}; + +export const Card: Story = { + render: () => ( + + +
+ + +
+
+ ), +}; diff --git a/packages/propel/tsdown.config.ts b/packages/propel/tsdown.config.ts index 05d57001ae..8f23c301cb 100644 --- a/packages/propel/tsdown.config.ts +++ b/packages/propel/tsdown.config.ts @@ -13,6 +13,7 @@ export default defineConfig({ "src/icons/index.ts", "src/menu/index.ts", "src/popover/index.ts", + "src/skeleton/index.ts", "src/switch/index.ts", "src/table/index.ts", "src/tabs/index.ts", From 20d139cc9eeec8396ab298b5c04827234ebc448d Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Fri, 5 Sep 2025 20:16:39 +0530 Subject: [PATCH 092/138] [WEB-4839] chore: maintenance mode empty state updated (#7728) * chore: maintenance mode empty state updated * chore: code refactor * chore: code refactor * chore: code refactor --- .../instance/maintenance-message.tsx | 48 +++++++--- .../components/instance/maintenance-view.tsx | 49 +++++----- .../instance/maintenance-message.tsx | 2 +- .../public/instance/maintenance-mode-dark.svg | 86 ++++++++++++++++++ .../instance/maintenance-mode-light.svg | 86 ++++++++++++++++++ apps/web/public/maintenance-mode.webp | Bin 119864 -> 0 bytes 6 files changed, 233 insertions(+), 38 deletions(-) create mode 100644 apps/web/public/instance/maintenance-mode-dark.svg create mode 100644 apps/web/public/instance/maintenance-mode-light.svg delete mode 100644 apps/web/public/maintenance-mode.webp diff --git a/apps/web/ce/components/instance/maintenance-message.tsx b/apps/web/ce/components/instance/maintenance-message.tsx index 1f7efa79f3..067c95f5ec 100644 --- a/apps/web/ce/components/instance/maintenance-message.tsx +++ b/apps/web/ce/components/instance/maintenance-message.tsx @@ -1,17 +1,37 @@ -import { observer } from "mobx-react"; -import { useTranslation } from "@plane/i18n"; - -export const MaintenanceMessage = observer(() => { - // hooks - const { t } = useTranslation(); +export const MaintenanceMessage = () => { + const linkMap = [ + { + key: "mail_to", + label: "Contact Support", + value: "mailto:support@plane.so", + }, + ]; return ( -

- {t( - "self_hosted_maintenance_message.plane_didnt_start_up_this_could_be_because_one_or_more_plane_services_failed_to_start" - )} -
- {t("self_hosted_maintenance_message.choose_view_logs_from_setup_sh_and_docker_logs_to_be_sure")} -

+ <> +
+

+ 🚧 Looks like Plane didn't start up correctly! +

+ + Some services might have failed to start. Please check your container logs to identify and resolve the issue. + If you're stuck, reach out to our support team for more help. + +
+
+ {linkMap.map((link) => ( + + ))} +
+ ); -}); +}; diff --git a/apps/web/core/components/instance/maintenance-view.tsx b/apps/web/core/components/instance/maintenance-view.tsx index 8dd4c34e78..2fdc7f635a 100644 --- a/apps/web/core/components/instance/maintenance-view.tsx +++ b/apps/web/core/components/instance/maintenance-view.tsx @@ -2,33 +2,36 @@ import { FC } from "react"; import Image from "next/image"; -// ui -import { Button } from "@plane/ui"; +import { useTheme } from "next-themes"; // layouts import DefaultLayout from "@/layouts/default-layout"; // components import { MaintenanceMessage } from "@/plane-web/components/instance"; // images -import maintenanceModeImage from "@/public/maintenance-mode.webp"; +import maintenanceModeDarkModeImage from "@/public/instance/maintenance-mode-dark.svg"; +import maintenanceModeLightModeImage from "@/public/instance/maintenance-mode-light.svg"; -export const MaintenanceView: FC = () => ( - -
-
- ProjectSettingImg +export const MaintenanceView: FC = () => { + // hooks + const { resolvedTheme } = useTheme(); + // derived values + const maintenanceModeImage = resolvedTheme === "dark" ? maintenanceModeDarkModeImage : maintenanceModeLightModeImage; + return ( + +
+
+ ProjectSettingImg +
+
+ +
-
- - -
-
- -); + + ); +}; diff --git a/apps/web/ee/components/instance/maintenance-message.tsx b/apps/web/ee/components/instance/maintenance-message.tsx index 0c55a8c2db..314e064547 100644 --- a/apps/web/ee/components/instance/maintenance-message.tsx +++ b/apps/web/ee/components/instance/maintenance-message.tsx @@ -1 +1 @@ -export const MaintenanceMessage = () => <>; +export * from "ce/components/instance/maintenance-message"; diff --git a/apps/web/public/instance/maintenance-mode-dark.svg b/apps/web/public/instance/maintenance-mode-dark.svg new file mode 100644 index 0000000000..546125ff9d --- /dev/null +++ b/apps/web/public/instance/maintenance-mode-dark.svg @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web/public/instance/maintenance-mode-light.svg b/apps/web/public/instance/maintenance-mode-light.svg new file mode 100644 index 0000000000..6cd8bab407 --- /dev/null +++ b/apps/web/public/instance/maintenance-mode-light.svg @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/web/public/maintenance-mode.webp b/apps/web/public/maintenance-mode.webp deleted file mode 100644 index 98ba4ba672910e16d5cfbd0ca345ef107bd04c48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119864 zcmd3N-7`qb&|SlTw3Hy-%>YApHv`fNl0(PPpwg|NApP=t z&$+JiFPsn0mwm0h*1hg^@BPHJ9vwAhWxly581IziwG6c07~)}IU=Tl!Now zb1hJ{*&vx&SngY{?J3+4foxn!nH$c_g3xB#cHfFb2H-ekk-xGM@1L`$a4c1_UOGLSUdG|jFEfN>bqJjj#ddwyYDF;2HlPVpF*}dp87}rwz(8iq>`C$ z1E|3PYOTnJhy2qjr=8@r?$>#y4gAuwa_iW8*33YQrvVx%Hfkw0#t#o`e*D6T6_I+= z7{&J(PlH6izu23Mio*SstJ(@%X@z~AH$TjQ!eBN23nqNmVTX8BH!{OdJ^7ifo(4$# z=L2SJ`0%h~_ajSR>ViicTlV}J)fIixi%gk@4VFin{};z;hkE`{L_&hTK_*ykgKqEH z^|J}z#K%ZHYALLbe(oN8vVHaH#@63Lo(KPaf_Yu{g@KrX??#Fl_@&MHzl2hRGaeqC z>?qEEox~9Ar9_zhenR^vH(2_MjK$7>RxSXw5P;g$`Q$HaQ>mFfLK|?f+D~3(S<;43 zm2a5;VgMumrL+?(vp>dNIwxR`q~u^w{(_T9fT33K@Sg=7Fp~0UbpOz)KRzq4F=%i4 z3mfNP?UM|U8HgbQP%GjI+PU<-SZ%|Z$7I!_!e)F73WYwhw9>lWyN0}ww$J|@YS`kY z_fv_)RruNUPZIto4;l}>4-5}7_d&N0{~mrnY(5MsQ$;1SA0(8I&S{X_ZA!+HKz z(B%u0kDD?94|?0P4?B0~srC1pM-1@Qd$N=K_<-N}A0C9Z{`Fcs{M(#;5WCsUb$Pfv zW^fa~Z$4pwcH9lE%ZzO?^xfl@p=9FjJT&gVj+t|r-ai@NV84nK4nla|3TDfwir?># zZ!lf$z6lEQyj?qTJ$x|pJoiz#r@TN0eSElDzHOiWZQf-5`69n)JM>P)>D(vc_VW4< zY_g|KW?se2+iy9DiZRGyIHOhQJ@0O<+tD{S<1TV<=LP;%qUX(CzkNo-?T>p! z*L9!ivi|n9#s?hP`=TWCjhE@JoD8pIPPHe`F8`E_-w^rcmEUDU&m+UeU!N#!$Bu$! zybt~BEa@-OOixWV;O;a1LZ7$2Yhsr7(kw72?;@CJ ziU>;ICF{?j)X`Eri_m znNHQ}>}zaKnU<@kbL#t1w@eYPiQij9=47~tx)X$GLYiMNy-=7CyErWy-@rXP+*$ub z6zEyuDHWi#uUD#0(ym-*I*}A;E;q3>7=aVQ2z6M9E?~WZ9~qk@ zdL5jlI;A?k0i~QJv5aSc&>s8GegH_bGR|_ir@}A|$x_6ynEO~y5F6}XAZepz9Es1& zpwIhmdx}T2R8Nm{yUZ9sSN2$BEBZ;Xy3g!2^X~m@;8Yx zvWTy|!c>vDrG+@fT3(be$^7Zr%i!At(>=y58oDsRXle@c2nq6xQ0YgsUL@&^(u^DU zIuDX((8^jO5ELmJx_|kNp1;tN1jQIuNYe6c zqGNE>JB_zvq@X0qOzX4f2&zZm^$I}Ft%8;%CIw&{%{^=*MqB&5k*_6eI!b9UO3La1 zzbWVt|GfN?N{W&&6;#XtCDee*ub`cb#giyF)Ya6)Qi|Bg<=VYX&c`J#Aozt^_ z09FXPg)tSEXA+{(Of_l+&l(0LPFn|2H3t1a-TrP=0SN&G931)Uc^n$$s^@o>o#x-A zxF~Q`u_-b~+0zBJvO;l~Ng^vKOHFy8mNZQQV6s^5s8aq~avP8Ukf2fKFz})3<+=T3 zresE(8XULwYSG9DHDh<)K5mCJTAoqmC`}7sBqdeEx%Lm4(v&Ysve8wK4Z(s;Bny(& zl!c?4EEZ`XcFcm7e-;@c?ljEq|M2xG+A$M2*7~+mTF%(?DRafv7;xEC#1W~*$S3bj zfhTej{Tf~;3%B4V14v7U%f7Wl+2R0M1i;>H67o>7W;^0RfZ$i0o92d~Zd5+KLYxpV zE5fRWss$uu<>O#X+jO)Du~efjB{u~`M-8)HZdsc4xSjJYsYFFNq?V8?6!!SU9nFYR z(x8h*nuLs!nvt12V7nA*{%`l(7p~q{&HkWF$^9L8-mXi zrm&|d$cdqll5qhyd$P;yP)L(1oV{|+kSxBHvd_lIFpvc#L>{?qv=a|rU^7&ZU_dL)TEB#? z9Ukd*lS+q%OrS@i`fXs(^_cB zLuojdJ=LJskTwv^*xxHr}fK|!c|S_L42RY3#Y0;goj zH%47QouT>K1QSPF6_4A+tI%0$m3;U3?HH24E5FggvI1xHIjf-yO@lY_&Ndxsn)jrX z@k6*h4WYvP=RL{Jrd#@7Tr^REeDY-l)4ZOt!)u&W(%=tH+Sr$DG0WiW4g z;4;Dr$}}3GLiOONZRBeQggwo8b0cQ+RI6wStg%U!GWRYO*;Ti_suil#|IJVcKVru#%X!_H)&@BK$P3d^wbA`tW`jdnO*9DF zgy23M7Zf_;6^}=wNc*Rn3JJ4q$DLNl)BTFH3g0s-nq`>X{+J^o`4%D{&g=nBi&LHz z$cpHCJ;oScYHJo57mmzW@U3$Mx0VT~4)%S!Cpdx{-H%aGe@&ToLX?Gb*LNQ!5HN=- z+3{HALGz|X7oD@cL(?OQO4wr*_mrZGU1GcsHT>O-k5teE%#9>U+9_+f0niD!BW!xh z1WMJ35ax)D6Q-uTxR8zmq0vTmzM9HMlMSv8SAzXvtj$ejrH%-P#O*ASc;K=SL;#AE z5ER0PJ?hvN+6;jOdeoA$=Bo~|xoDHUvP_dH{fr|QrK)H7tw>3`nsC|a3f)2pMF6jN zOw2U|n(e&VBFeHBQ3z!sL>Xijq14RRDD&jT8!jWj0yJ!zcgm_65j0Yuv}rLceoP2S zUE4T^8=Di@+)P{JZ9h=U_b-UQ@Kcog-DkLqp790s*!E(QkUV=9D&PMQBf^c} zxpLQv7P?&VF1M{kT70z|Z|X#g6H+(Y*$7P9W+8V1r|8EY%Y|{o1-btQM}o3S3rnvu z?K>5Kx~M}02TyAa!b@DPX4>k~<_103S}S6JPn#NDRDqp5jNc|1b(=n|{5FR<*@~|s zd~f1h;P1FmnQiSc@2nBjs3x4+v3A_47TGXj!#92?1a55=(h#Ix$`1~tMdfEAYf8a1 zGc;fu*HfNJ0z!jEw6at4&Qg;S6oPKg9&cS*^tK)%S}w|DQ3n9r!(4WEfq!Yk&^Y5Ou`~eadPOs24#ZKgtBQqA&usS2AMBCG21WV zqLrFkfa576(8JQ_v2k{V%FR22B9unw&XCS>VMsQtk*67n%nlk7RaPIBBgMtTtz?lB zzv)?$E+`EPvx)}L@_@5iZ_EP+kcfchoB2Kjn%;(24 zomImI(G4YBhL44eo6sqV1d|X_9qwBnE?nF+>*!ePcuX{YVz_Grg)Hfynw*!Mb;wmn zW1IpNdF?YYy07t})){w|)kR4FZFnubbRTNyBODkiT-(?ZK^fv}&|KKs)S6CW?N}z& zGT^`sd(;cT#ZBXDi>qhWmX2^VU{>e^2L;U=ho+*t5^3$xyfw+CvqmU!A8IHRI&@~c zVg%ta$l}3MIFDuwk*>=RTC}-=#xoM7Gpo^K9~yH(Z`&$O5ra+MqMtWS#dF-EfR{uApr)+i`v(5y}jw7LwB_D9LtAd;TQeP0EKc3?&c20&DUM7 z{q<@!Nc6SKnz37z8!SK)plpEUXp(br8%nJHk1{tu(>J7Xd|g%T9Ba$gx{-#pwP?j1 zuWD45J=WKj8m|*v`Wd>z4FlTcqva?ViHD*pNGLK5Q7|y`c?oVMC~;13$T-6Wk7R?%Z(kg$88Z z7-2WachuJW+T?02G|7NF%$+-hEMCDYviZ^9Q&OYN}b07JutV0 zf`Lr5Q{cD`;&~?})X{F>8xoQjKG&&8Em*Y>J;8FM5i}GIOFxI&KJY=0+tvU|9J~vCuky2Fp)UgN4SlWc zXSqY&2|^21n|lQ7?(F%^RZ%S#HS|ovludX?zaqrFILmTnGi;V9?9})TH+NZv$ zMF-^BTh~g#ZI`E7m+b5^EgLps0((=kMYAlNhF@AIhf4}h7C;iUmmLXts1P7)6Cb~B z{dfEO9a5~q!t!d=14&TFBgHU_ynw&jckNf-P^FCD1lkHE2lY+r0OGE!RW7Bo^P8rf zGy4);=q8m|Ic}ec8S6%<-84<;^Fw~~SC7AYo8I*G+O2ip+^)fysXs}R$kHsM<^B_b zmm-9XXarh_d)~SFro!aic84kJd>nIgF@XXs%2J$IX=v6sL*8unaP7i*g{V+O>Vr5H zrb32>Lundk^g#z}yO(LYF=uG{d*CEr?fhcQ_OdeK((e8T_pAkVyoe!U#HN?*uMz9z zgw56xBV}#~2%p*q4%d{f8_3PF&y-xCNww0{;C#K^v6hn8mQpgx=YFh5s+|!TE=|6L zIGQmR&elNDjB%uuYb)xwnAn?aS1DGl@aVK19_ZD06)npFJ3>yXonj&oZ z5SK_hOM$<}-3F*`!K{{-GgI#gc_te=BOGG?8ivIyp{5LDIU2zZH9l<}YA$WGZnkkc z#Hp4QJlp5|s4s;sbzVt9o~^d9ca&5oM+q55YIW)p{a)KK2kR-T2SAaRgq>WixJ_uI zymM~nnSi6HkuqV!Oc8+So46Cn_PD-Nm&Ex^7R z1_ysw&0FnQ1C%;>hm~l@Fu5!5MJ1_5VQ;K49FDJS69GtzSeX;uc6I#BR9(_z9#cK; zh^LwnuhoYcuN(V^39ruY%thKdI8dT%y!ryXno8rRPXCDWv?UD8z?EqPe8-u&C%HTA zAmg4xXdKF&O}#gZrq14C2L>a@-egj1>PZ|drCZix&pGh=f5*zamJUkI8>`c-?=PU* zDx}ZT?dMdcEZk-nT9v+*R)g82julF)gqAY#cL(crTL-4>!kk`jSUNn( z6|Q_Mij802|LzoNZt*uE$oLSm6=$-a^+BxkK;$?wi?36|uEQC$ZcM4k)u?naXjI&| z6G#mkmMn*`##{$Zaiy(_rQ+%;P>#(L3qh9U%~beJR*1`NZD2ZdDu`Akpj%DHrMjQl zJJt5r)b3z9dt0irS^2J6sf!gSoNKk$X?%E--b7a^oGR=jR_oMU zDqO#m%abnXVV$@u;291x<>#yGhRG*ZAFY<>0n85nhd8 z>Ik4fWS-7`4`X+A98{-{`kpT@vhX&1O}hSIDL)Upd4C-Bl`%2)f!!Ux)o7o~JTJA^ z@whV@kZWD0YxU27@qk0&Nd2tlKb1VK2uD6@&nX&ZW~IuFO0(Rpi7alYqm9%s6!lnr zd4Er%nVxXapcAYXwIAgSeoYhEaRl=6FPaN<+xAkO5J;Eg-MP@f|9d2}WeNB7N+_f^ z(>2`&jaqO2kU2RiIutmjv@b@1%I2HYvcN)MRLe-ZpyP|q$V}%(XG^om+{y4^-t9nAIWi`??i$@09Q|sNyo3b*i|Dhy@Iw+x> zWAHVBN8E!tzS3KI_{?u3Q_;zH?(oBo4$`H;EtPX{`%p^`fQ`!ylowAK>NLa)B(!!k zj1!J00*3+~3mbnh2Dluz>2uSEd77BL`e|RQre7Jt`#16^c~% zJ6uMZ{Uo8FtDL#t{ZSov+uaAR_vcYX>m5?h+G-yT&)6tkKTR$;=}uDFfQ>2GnS#xw5jEPD(FCE?Xnr8fzO2QHCb1 zNC`=+5h7CO=x}9Nng8{W*M3*GH|@ zCtN6KU8wpKk3hmKE4gNHcWxS*@tbkYJg!0XW_uYVQ>6ZRIC<$umPvK@O>Rnf1S1(C zPbbPr7dqnDrzer*JCU0l+w3rIq_FsJq?N>LOm(d;q@>IHaK~Et?2XdUYoc)ayP>sk zh@V%2iJzZlU6*&~Ha{ynlur4j^=IJ?cd-_bSviVG*uiSqeFaFT*!p7Z(5N`n$>W%^ zXanm{f#)VSnE?yKI|CGyGJet2?iiszA(?&QkeAW#G&TcB*xz{tSQf*5$6B$4>@YpG zO&GFGFgKZtd~nZ@>-J5o&dbx?My~KArth8PUA&)}AFP1hpy%VtSVK>8!pj_anycs> zfrJqgYc__5Cb5z%OxLi9k#)AoQb;_bf{oGeOjjg{vd;wb*gK!o1SM;$Y3I(%iOZNKbMS(Fe)-h!zp95VeDetuC>ukQ zi8FB_C&3e>poXwLPl~gB^;XsjPrd%xfX-F=!0J7A4fbEtmC)v-DRthyJ?4w zF7I$w4&Y*Z9ZQxzZQjmp&g0FQ`-s^YhbDqGm{Zx1#qk7Va~kvUCt{Lo(=YwWt0J-C zrOB6n9fS#|xl53aKALUEa{|jDrOxrVT9tpeS6T_pX614M@)y8slX9H=!@de{H zT8nxA{$!BoT>4|Z`}3f9fs<}hKjZ*ivfO&GE*4seBJy-ALyT}wmz{`cgetRS>B36( zJ&jr*0&2`JkJtN+j5MHHUIa%nBDn7T$M=9X58^rNl1_`82e%5inK0pumeR+E9M0xUQUp zTU~4Du8um(8(fBoWeHTbjuhw$9^}=|$DzsXUBp(@kKerPT!Y!ijF%j`lyK$yUq_C- z3bOpRdQUk>d^crnvVY8%?mUGC;(E1fR95_vCP0&GQ3-Qd4IVC4ui;?JEm-v)A06ff=wn z&o;WON1%7Vy4Rpk!a|;f1n<`2p)r^eH2D2L6XRG1J zs8-2H#B`Ua#xYJr+~O+Kem4H}xNaV{n^OhT)$v|79lF@tKa{#VtJ-w+HTg?6+5Y!p z5m&#}n?Jj9xzK+_%&6RD<*4Io-K9oYvAJUcI4(FgDdGg$5|Tods%#Nl#Y;W&C3_-= z>3HTG#m#M$$0OE+aFYO?yLpPCJdBKy;5LuU{2XwNf3C-tOZE)8$~eE?=sVq!`thXO zx5(a-AlgZ_ee4OHZtWc^PQu#SCC?>v_ktJ{+;;qZJ-}5|IgZc8!|3(o81hHL^aTG>PW28S>fcRU zmnWJoiRj6#2xX5BPQo@)E1~w4oz12TnoGQ%oGW4JBwnqD^eDi7MUgxyD}_?@p3m>^ zETR;cim&tx$XYVLeLMM?*6yJv0#OcKcAVBEY@F?0`Q(2o#eX>@rqakFTxq$YWh)_l z@rO%eJ7^f^@4n2v9egiQLigb9gmd;K=Sl=;6RfdvaWy|6XyM5FW_@P-(z{bas71n~ znMFKW?G+cgI4YDGhonWG{=)xN;&VA0krd64hHrf-tst1Ub!sEuym#GzL2>K;kXTLj z>G5)h%*16Htg12lD0=lVLf%Kqy0aSOp9a_UmVyD?8nz69v2Opyo>F>#L

C$rPuyeDFW;xL%J0#e4<*vPFa`Zr4rQ<5^1Z_kHTClXOCRy6CCsnFo)*(&43Gbps zNj-n^oMb@{T9oP#%MImmPR~L%48l|pwRX0~GC2^_jnvxw!+?C+6`gFCr8YvZ74NPM ztD%7Ix?8j@Z;h*WXz*5)F;F8vwoxM|YmEfJp#>VJ@{qFnA*`=65j+{9= zE4go)WNPe8Gcf>|>Z>T7-bnl0&*h8-1>X^KMwu-j0r1hXcm0w>jjgDC-&6(6>(aB{ z!{+e*pR|WWwo_UD8+(QHT;Egl($1m&*~(zjZM>%X1G9bQdS3gINd4pR>}>VGi!`>s zZkN~?Z8yDfxopbKhQKOQy+rW|nKjE^uyV3$vl}6?)#U!*7GUT0>h=-Kld1(rV9FE3 zDXR9XzU>J4f`Q_t!{kG8I=bpQM*=?kFya>AbZG2UzVh5^VQDL+duSZ0kg;0v6Sp7j zFLM^`6;zcgzRP`S;~%X}%Ouu}8-k;TWG3ajKE;Rm zOhF#MRMkw7>Z4rna82Kufvs!#cV6x1T2HENoW9AaOsIb|MeaRB>0gtz>Pi_K`#2zB zJ3a+ZM-3bs)1l!x?UdWrk$9!qIHrIiP{tnV_(grAx!b*_0;#;}GoEej0wiE;Dwv85 zNJ5$vEWs*kv19-(*D=O&W-Gzqw2-i^8j;i0gu3e*UCY=j-{B5t+Cz0aksK>_AF(;* zVAUWP9?)K`9gB%)bfBK1h+WB@a9<#7>*bGoBDIuv3jJGr+ztyjem@J^6!^U;P=p zm8(UhYHFPsx8P}u4~PyT?yjSAQc-co(5@rXDzZaewNyy6vg3oLSLp1Qv_Ar2*O+nA z5L4&;J*%iv!i|X>jufN1dG~L=wO2l6ij?$;By&lU5P`#-R9w9gUsP~d0|ZyG*d`E` zF*8B3DxvyBFZd#%k_HN%pm9^c-F`R`xaMe)mOsQ2ZbF})a_K>~PdOdtYWJn zk8pq@bKw^KH6y{`J?n)A_+CAAYDN~L_z6&!{gXvIix)@QFa`l4XUdwRFsE7DK|-w| zx8fYH3N1=hi0a=)-T@KZ4N1RAkxsavD#)JjEzlqbW_Rki11G{r1(s+vtR5 zMtmv7wxO?!y%;y?JFescVPR=Qb9`aWSXl6s!gQ9Ou=2R z&#nY&2u~o++*Eo(vaYj`l`0jEk!4f&6V+OB@$@$9a>9yClB(|eFZH<6B2AhVrE@Jm zo*vip0peABtDoRla52^54zSOuhlI@$_2FY3eu*RN1bj73_|NxIUX2@8XPc2A7$ zHFb-$+#!~(KI||JPawTnpYZvM@DxVV4lSUSJSnLP1D~Mvk-1gx=$305fGL2VVN2hP zjBE@c7ngv;T2FltO~9i%)NLzdTREZzmaZMiXsTp@K>eCDkzdP> zT+Nc-=@n;KQEUm5zNI|)St$N3F@ZP)IMfFmeB|bfYtt1is~RKEc5N4K+Ph~$6%cT2 zoGc<23u3hT26XUUlH;?_f8_fQRgBD}ZR!LpN1fUoCKi;bWIFYG{`Kj`)5q~;Kcpj1 zPb2UB?xXfReVbm9o`qq8?@>XEuKYozmYKMfpFRaQ%45d8d(xL{VW5n&rRhNYK}%Ct za|ntpe+ehoda~*-$OCb5H%Wb=GW>lAC;_w$|?tlF*9AZ(Lsw>{DZ_7N0=}s>6Z&i z+0;_t5csNw!yH}q(E@gWi#Uj>%Qj;Q@53(&k*|DJ$RMw7sf6u5h={|wu^9Rf`RVJR zQZ*dhVe8RqNz{s+R&%kRz_X`AxbZp(epWi=T-bQ^y0Xt59+Ic6Do5OOrK_0Cm(UEd z;J19d+X3md@94J8yuP#6)}$zEt8#4Dpr4zD84O2`i#_z+94ik`&Cs}RFUcC7Vme8v zG!hsAHe-nyr}seBn}3P72gPtJFj^n@5CRKZp9k#0R|n`n¬DQQC#oweOOPKy=!P zz7+eBoE)FE5iPtP@!KDdMy#j?@1KA4I)0s$)Y4+N70ZarVe#0EHG9OaqfA<{q5Mz& z;AO_{_b9x2I(miRdvfa$llXq80KL@uUzyU82+j0uFX3E~ZgI{9KN3#us8JGDc^x7i z2SDu_-y|J(L}O6+-AqdFR8m-&kVPpLN8(csrVsAnd${sX7c8GxF1;bxI|PU~_$KIa z2H!2kRgUoxRsU8~=@|wG5((#Wns6RE9qNAw=eGSS@gb%ljCb2eIX)+nwQQ|yJCN!; zwjO{BU<@t|X8QDWsfc>}O@SwX>3v{2w-jH+6E?eVj;SGJoCW^a7Ne_a#ZCb_@uwb# zLt3+y@2j=KyE&_f&62w?=9yJ$bJPIIwghVv7XL!C_;23*QnaSBqsf$gh8sqnvOvzb z9bC;wFh_*{6#8MpFh?(etxHSK>61U3#i&VYKV|;h7IbZHNb9^(pu1Shb~gHeJ)I&Q zu=WZfrjRh7>F{HC=zQ_pn~6J*q51o#YAHi=1WER4m;?kPvhsg0aSQW^*`FA2MFRVq$_e@((MG1pFl54$zH9VjJWB>tLJj@;NXW4c#6mw1Zu6bf zHnT_2AAaXt-SVHYadBJx=?CulH5*V7a#`49tW+OoR+_4jyj%s+HVVtZ6;7$Og!`NA zwucX#L7ju1JplyEhIEZKOAc~Flg7!y!j5vNe=mRMt8QNUox|b&hX2j?v{TDLlhooe zllt zs79!Y|Cx>v_iqkFvTV8_l++XWw0us%Irem#Vm7WAVNy4e5rml3+lm#)P&XT{{+aFx z;wWJ!52qM-1+i*tEZ-d*_K2`NVvzWvtg5Q!fD6EhDrHJkTfCK*f4?sg)h6*}ZzWCq z4c~+u$Le>_oLmf$n3G#Ou=k6TwC<891#h^zr%rMd^Q}5p3X2V#_f_IKRnhhj=c|B^ zZG_@xtdzsm7>+4jx!W+(QM>+I1%UWyX_$aBm-Y;Z~KX z_pj(z0`uuqWh&{YaG^s~jRS%3f}wozb;o;$xk`@7W zgSMo%uZm};toU}?mK9Shq=fRq)7s+sc&4I0cm<{(IkHWAbSMvCUQrgmmml!f#F%*F zFgj1!JA&A#{H63mN3Y22`87o{Cl@;nQ}sBt@2iq>3Lb{~uS9kaIc)Gq{-<)J#HybF znJNz9hBhgE8OD-jtbRQvKhk1;Nma1rjEuMu)zj`a%xyX8e$2epDZDJ4I&4u_*Pl=% zhmzt6C(kE~sbq9bV|H)*^7S@e?2@WgU?jF;e8K`mClz8_3_#f<-3YjSNTnjF>BtMo z>iVejOxQ5&+18CrV55m-y?Q@%!;6a|J$FE1B^>OS)ye)2#0XExUAN=PfdsmnUCF4e zL^dKFb%*aHxFj>dO28+hPtLx-S!)X0RR8lzPu!l_n`rb2+j~SVMp^j>V|TBSw{st> zhi|l2@wS!am@#Xk*lm)TA_@EK>7>FhzQaDI!oW2^kSrrBW-W#KaQCIl<>|@Qdhg?z zhl|gN%S!h_E3U53bCFNu;MEW7TagG8=h4$N^QyhTiajr#O2n=_QzO+jKR5!25TvpC zpmvVwOMjGqjx&>wGOCL;5l&L!kz!|Rgk8G$^n5t&@<=>6(a!Dc^Ss0Z1^-`{ymh=+ zjYjMBUS@+6Xb*HXRy8OrmT7I3l__$oUu6ORA?BuR=E9}y}x%7E1`X&Am=jv9ZOTgmKq1X+MfT|BF zqfP?kcnJ3$vCOjZb{5^J$KDK~5UR1)<#&xWBkj`G$<-M076kIavTfs1;%(#L%MXz& zb$m-3m=y1=XR9S$&dk{I=eMxqHaPxBlfNAO`x5iH_Jn|~A;jQ8ZbCk+Gl4Yuw^c)A zW6+rO5QD1`w~bYxH@CbRBWoDIu-p0mZrs1kx4d(9?MJIb=82}(6H$@1t$7Za)$M*t z8S9(enDxk}%bdH`B*6-B8G(!kSP&fN<4YK`o81$-r$S1e>DRy zXnJ+7%08NsH|0><%8Pl>4GP4ADzw8K7`)!NPc(nX9*UP)M_i{&7g&hR=6S zR&zakJnDTaI>`oZL@l1WyjlC;x%pTPG>?qa$I5_Dyu-rw@yjtzh4I`D6U+=ixyp)R z53x}GA?*i4!x|t80z|L+606BSm4bhJl;DZTw&q&IIZ@6D9_R~UIc?&~zaPMSo-5ng zoA@)rwWy?KWr%je*^ithT@~%xgl30n%j6+!ImxI1i&T$jC73i&Adip?XOM%Z{zPB& z)a-Pz>+$S>_RSN~)zuHHgD*s{oJZ=jH#jz?;)%teHu%(Gj#lIDe+=YUeI;j@2z}wH zPECfxUimvTBt5Dr#CvKuJH4<3n2Y$SmWbs~y5L}17netY^n;}j2H)mvaQMCOWKop9 zMTWcE4O`>$7lPCP^3k`yF+|q4skh>6!&#Lr2e$MD00i-R}OcC(mDf z$I7Nn%mSf3}U9tpXi zwj3a5wxnujCh(bX=&0^I=&oAPTH9dwjv<=!AFTEGMDgujFTY-`zfab1l!>CZ4ly=)Le?ARWKmfGT?c3(y^ zHNI&c{&KfTDYm9}n(1fTcSlApYgzw)aCQ7<=)S|d4t8nD9P8%(w$(Fi4Q9fXU&V>p z;tvV-l=A(My{BY2H*C~o0=CM@q%%Vb3OKlAKMJeJy}saS_EGu}c)jztw&*?TQsU2( zwSR=8!@~xcv%><(g5vC}2AIhu*s%nG&wiTHb4d#pg8tn)jigL#r{sC&0;sT~lSFoN zCt!R_bQNEK6Y(l+r`?;yF1HJ(K6}qPe&ajgd<5Qtgi1CEw%gUKN@g@(5Csbg|Y|`j*9|;n$>_jhI9a94McTeru9T7Xi;{TN9s zt0AKGUCW<4z6fSZ+-jzCYH-?N@RHQVu_39^#Daw0Ep0{cv$m1q&2CzTwXHU$ZgWQe zsmYvai?l-;#Z*@2QD(aIx)~M@wfQGFY%^ixtRxqfwT1}LMOOc|P07s=PhuG5wf@PM z9~-jIMgG&$htok7(W`jX({K+_n+fMF=ec`bs4b7XvVopry1H5#dvXbGQXV6{z-{n? z+X!OP!Pe+JtLEd7zU)d{GOJ@DT{l@cSXTCV+wadK#{Zk0(lV{>3#Xw#CmdurkKsgF zbcGg?w#o}B0248mxAe5aw{f}pqNI6wIQ0A~U;0Mho6lr}1Rz8dmkQSM#>V^nwe|Pj z)}sWnZ|%l9ZAG0jMgvS9)C`1tVLJY^;n^B$r6sZi#EgILFx)BjEf$yKAZlq8*cN3eu72h%2epftdb0pq89r2na2{uID^?O|2nGrpZk-rbQJo~SXshS_H(PrP<)*L(rhtF-A z5C%oKF|_GAqHC+{sv0;+Nx)ZB6=ZJ>0o zY_7GlIZs?wzh9&g<_%ey_$yw@;fn0JqG@?bs_J;Z0qM7G(f68xT=F-g&VtV4bq&3! zF;JUYArKEH_leFz0ETM%+{E)%GlQ`?MOh7_(YBiKMChd-yPK|O)fQveT#i0DdNIQt)LV!ltUalpf$@~LbUT+4sH zgc*<;fLdt`C||ml=wZL}(q>8){8s#-D(#l#L&873-O>hYXRK_;@~?4OMozTf;$w_e zzXW@O;=SAp2XytCWYt~(T691J9$*}1F=nn5_G-Y*X5TtE(<_ooGbu2uRb%=e+*^sIYDbEr0 zEmNl)u5ol8z=VjsTVz#>ku-79=X2*#Z%cY}f0aXYwjjaDM0Dj&)tq&g+gRHx@|ABO zC5(=-Ab7x`Nw2-(L!CPBrxA=1v6p=f%w)BPhRH^v-P~j)Wl8dte`L`8U(LbX^1E_7 zH%mluUpELu#&MtFJ;%xXz79%9x>^2qPB#h3__HiYd7jx0HZ_fS8znN_&>Lk-;O^o?OO8jb^@XQ+r0Mh2hptERs9{ph1EZTJC~ux{5a+)7 z!DD9wrkqc^m|ypUW-@uq9+kjgpPhB+?|02q3bEvPFs&~bK5;;e)N>c#zK*9Vpb4+W zOb~?JGfl@dea6X2YffB!LcFB?#+slELENH* z@qCq^^Kh$gOAY!696UksnDnsAV!En&C#!K5cNDWaMUlxrSArm~ov5vZ3W0^jh`$R2 z3R~;umRjtY04-2_>8Nk2eJxj#B>z`(vVJ^+QCRfMJ{H%F@vN#id#R54{0+l*HKz6* zgjSt##Md}G${?hr%?S(_kKjMj8Vx40C0$LYF2ZuSa0C_<3-#J1RWmd9l5pfzD^*z^ zzEw7AVA8b@ZdvmU3fVz~o;-gF&=TN$jZ6 z?CO;iAmUmZ63Rc?+Sjg0{kQG!_;&-kTMf~Q$`!T4jIvLUsQzPUb01oll_zcT5?^3J zXqvN*xx3f@hb#Yd5-}nst?JU8?3zo>y?&~_kl8ZMl7Y-Hw*t7Ne0 z`-`R!4g&%_Z-oq}bt8`tn;?rJZ-tYxU8?hpaqi)M;ptcG7P*1 zYd!d2_^6wGAA`Ch1;d|u45GP# zyQ`u6LSS$u0VDO}^i&}k&AL#=2KO+H3a8b6|BiIIxwzI2!Y-<(SO4e7o$i+5R4IUz zLZ2&)dqEp0Vc;;V&ZLjID!_^Q*>xs4LGdTV!W8H6Dp!e~&9r-+R;;H+ML|l{Zhjw& zoOFD}6t0l<5`X6W!IzjAy&GffCj%AS>F2DI*5k;1TQgS>fy;!ID1}vbui2kAEqrli zia)G(9x8oTl8ItLrl|v~Y&5g{+=vPeeY}U^|K1!GT-tg&MOJOii#d&CPw{}Pte83Z z*Kl8=AX4sE+9 zzPk7I*sQsjd%Vdz9qHVc{>1!3?5pHWF~AfkSh%uPM_ZUWzSM1bYotrY`ZATsl$+9} zf%XvAP4OFea7qS=lm1isXX6!%>bqXeJ0}7xrd^X+Lm?6!rES;ZCiwZ_dAp3<>skJn zA!Ep+)(?MhzB}u-NqUUGYERl+l?(Z`dCrl6mU*I~oS9bK3zSAX-0cSPfbaZYB;@O&IdwRv_ut9)rTJeV zgtXH*(<__cgI8OS?rSnMnMA+?KJDP3ViJ3Fc~eAt#8i4oHNn7v&!yzVU*-frbfa)l zJ6w?2R$X`=t;Uc#J96%KN8;Bc)@$y}w{Z%B*8t_I5OV`DA$tKY1u)!&J}XPBN!@m2 z7%}TOCM$AO>+3fmR zS6Ly;@E78&^ekWA&73iU zUY4nlvXZh2_9gYwQSswccX3~rw?S4L8JDLGzUw6Vs0QNJ!H@!So*uczuYDOW7IV%E zn8_*btW@+UqZMbX9(!afixNj2w|}hVH*_EQ|NCgUSYRWjkfHW=LRCq1O5rkBxORJSv)QKLF|#k9)3 z>Y6Xi^=!Vmfz$ zM#L$30iVg|1Ax(029o-`tpAR@le*}VNQ~Ao0OIR9+@38+una2|U-p&?PMs{2E|n~O zxzYtJ07M>oj@Sya%jwMP-iG!w{fpa@qNG%AexJMkXVB5pVivf(Unyg8>VItw``1rW zVF_Ow&zGnRs7p5+70l();)!Ca{3W=q#cXOGuXU;_zh|8YFhoL&1FN}3r%r#pJ*I_5 zST(9x=-07~RgT>ctYhRUH`xEf+uk=X--H!#OJts2P_9nLTx86QnD;!ql6zb`{E`V9 z>0D<%2D}zeL3%yRTwBU^%f%X3e;O?wWoy{iN^k1UDs`zfGZQsEej#shYO3*^>)@)Q z@0*%60#Iv~iN`SeYa%8&eEz@ya?l*)IHg=5LQ4}_$*);vz*%o@qcJZzRuLZg$&s}U zko(noP^OqMbIf<1_bqi4_0k%|r%+>k2B#)eOifd}(aLNwzyEjf&yw%2H-C+syF9N8 zv_+ogKd>;`Nl*O8OF;jp=;2!^V^7hsFlLPv% zFKW$~Tc^SGF**#BSW{oJT390 zATf?XQ_G2l@A)?Xb<|tp{lY7rMV^EJuCG>!Ku?i(C7 z0lQt~&`bc|D-gBMA6fug-!WH%%+1?uO8e>WGcxCa$bkL0OX=&vUsvvM5&hFcfGIM| z{6Hjgb~S#f^-rCD{%HNM-dha<=h2xqN(j_BRqKax)|o$h$bAaEUj23T1~^Hu9u3!l16QoxZl!Y)P}{DmnieZWkv-;@GC!+c98Z23o!A zU9-5;cXFnF)XH1S7qI@l%T<54y4BzklP$H%dy*0pc0VDT%x`l0uWyk@5siO4);+qN z8^BU!Tvux#)#*A+{`K#O(v`HB!=v0Dm}44==OMGXmP7VAvSa3*V}{udLW2z{hXFSQ z_3I5l94UMXY1h^?I-DGhv7r*6FY_i@u|NY_MbHGzd_(JzJ>jR z9V4Qpb~Fs>iwTs>Y@I%rzMXG8VIu=mJ_C2=+!)||19DSWAt(ZCf9k}2Evor<-`<&K zz~55(oV#kw2PugrikuX!;qfAE+%Ox#L|gq}bG(WEPDZZU%lG!s-(6!3rwAkFA?&}t zfz0=z=LF>?Fg^LlGJ5qvEvCd?vZ;_4^ByU_x0hT^0yT`UTo|7 z(LQw+XBlR@kBW%XEuH^pP-hyMNSh0D7|u-X#qHBUC$x8aJ{T-M+R0GIs>k;>drAcx z4}_wYwSODmAW(Og^t7d-?JGk4CxUk7Mo!SiKL>d!3b>87UaQBM%9*K=`X66A@Z!Gz zR2WgxQV#gzQ>dt})1I!=(|tV#+&)(g73MFw1DCK9`}On567Bc9YGGW- z`-7{ljunwxS~^{ALw%F|$qgBjiw{cm9o#z1B(Kb->`%X{9!$}lfb#Jqd9Y=SeMbTmA3xHfUrt=uB_pN*RJy7P@5*HYijw`WatBB z5`7$d_bProJPm@wpn)Z1cD`-v(#ts$$lR>idx=hrZ{AhW#n)ckvS_og1*&;Egit8k zTraaNm0jn`H)Ug0+Dw}ZFD3_66s==d1P@M*mnFkfvAfB!_H+K0>dDR~K`Jq3*@>Sb zs0y3)`u@RcSc!3!O776Y)^dZb^AN1JO$|?2mCah(CeF^mM|a^ek@W$lbzazw)`~6p zSUNtJe2`uVl{3-{^-NRL@FV~{>B!pZURu#?K9AkC+dgyrluah7XLIr1=48~OS=itE zH2WzJG{+kJd1RcEet%Q^3Md)cHm+96_3-n5q%9!9)uyy=t`vHM^(NRiK@amr_rrb` z+iLI7cB>sHgu5_hXJ|-Fz)jG$fe}&<5(E&o<{?kcosT$z@-JLA1%m>e-gFsZVftrp zqslV@?dAbO&lWAVXcg^Sbp+O2mYVlTCC#K)=-lwy$s=!0BFv<~W9bVF#K5X4W~#~1 zmJ_vC2l1d*K7z|jLXRweEv#@~OkVWzVuT2>=5+?bZ+R?h&^gDrGS+(V|+|wCZ zn!wDsM4oJ(zrNn9mB&}Z{}tDYVMfWdu=Qj>v1>_@dHcA0e0!(j)3j-9lwIWwMn$0U!N1*vZk;Y>1=FoBU=&EjF>dr@_*J6Bt?2Nt zj7_lTfpsT&dD}dHQM=dx70g;|4XSFq;Vt08!{B1cbIBsVHGVP?q%=@~dT*v2YW_Cx zw!e*+vF{J(2aJj@1${=rO55E=zkG_Px!92>*3j1sfA!yw>Y_2io#ebQcv;98gtBa( zP+DynA1GV(4c8riwwWEqs$0%1l3Vj4u$}SGjI&ymM@>Gyor9TdhKVCq`ad^fF(l>R zzt%&-Bcy?M1&LghR64f&jr)7PW{cU+;u&Y!IuDn+4}Z8cK_@=GyUM|HEt+%1nHnfR zBs%;{?JOU_8}J;E&|W75=7`N$e$=@d{;T+Em$n&A)weVw7`l`3ByO02=TFc78Dg|Z z^rUvl{S*~Nt1y87Df)v_7^a=j+axd}o4|GU$6q&fDJ#T=@XB*4HrB7*o=sQ9caxUu zm9FqZW8m?``(il+4Gf^LNPuJRnldylNXP^Vat=k zUr*Y^>Gbjj`PUPusqZ}I$>C*=@=9oz2=vrK4<&bE+@VvYYabz}4|{qK42Oq#?H|6U zsm=a}Rp0k{KV~u)(D7RM_U$Zbu${uT1RlG)*6Qm)P>u4&z!_7vW*D{c4fBo@}58bAE!?LX<33|1MLCkYvV zau4_nP$YLe7ftmWa3mTG+xX7D+r^yoqQv0gpHc>_v|sCh9JYxph}ag-PsqyJt?#~@ zOCO^TdQL#Y`6wMj5zbj724hy>EluFJ4*DCsjvzt~5#Pp%;w07%T7^3w9(qO^44xLGh_czG+?cAV~3U5A%z{6~Fx<9D}-ZC)!)6(u{K}92i@W{5THRpGmuqO{*rSZu1zC( z(u@_{oxLSXtLKPH|GD?e)>B+;s$fxTJh&5e2ni-(TKj)!VcUyO96Z9lJ&$d#7I|(r zup))q{@_&k(cE_2HlN|MOUNq3wR7^0N-NuiebP&xb8+4jnOhG8Q?jG;n-!9HW+i7g zIj_xa7rjpGqx3q9{U=Kfit@KOP;zVpEz${6Sp&{0VQa>wt7{SHGQ?%aFuvL4-6l5{ z6}AD1_IZhdt^ap*81^nuCcSRmEZ(U91>Zup<-W%q6x%JEwA1=a4#Cey43@OEJ#ZCx zTQQq#G#d>on2gk-d_B5FRy%wO zfpjkO6#r2+@d1opbuX1SoReZNke+Dxd!Sd+Ddne+vc}^!OFed*Mk1z_eBxF}VXMv} ztyTu_X5@6ymNU$<&Xo15(#I|p3SF1~njO)w9*?rtOw!%<9Z*2|KvcjCpL)ff6)Qh# zmt`091w7LnY?GIrJ80$2`HfykE=|jE$P!#~$RYh)!lKa=5Y|@eAS&p+luSQ#mk+psA?r}KOHs0+ZS#7HsqRC z6VK>77697&ozfg6wJC#-fZJQu+tTc1F%2=PrGD z%oaoG_c@1H6;65Le-aCrbM#0O4MGQ8J}A_HLg(Mnvf8s!g`$F&>TsJ8c98%J!19iB z-YX$l5{9(w#CJV^)nu5ZYrS*j?sgLlldOgAC0ZURAraGNxXXPJ13MkmOa>cnNmWda z_nPx$O0Ptmu)N~1y&|#Ns^osK0GUj_{Ug{bq;zzgk9W-6m&16KlY_(6Q9J4933Ix7 z{`9Rz|0%VgdCDp%7Q{k+%<%R!lO}lMn$L}YR9MElBBhbdE(do1VyU^VT(cnE-Mimw zKLTCdhm$U3gTIy1UpN|sP;1f}*0TEab-o%}g5>cm@?Y1@Cq#&q=>$`Gw%cy|9)VD4 zOUcVHwy?q$1;ki5N!@hvZ$uSK2VLwOE^h*i`=EQNtJ|Jn`lQUWZE}jVjY}O+P~lij zhTVUk?lObn5dV0yoRhXw|;C+tSs%1zn_QUh$!vT(b+ z98Zz;4%$0>jM36B8YT*YtT|j!xfcN+0Z8pAGcBPTYl~Aaeb+fxmlVi8vQzzkU@I&KX(-sXxOhY>B3|CG5qQQ zQ$;$nvGxELdF`f_#B#CUjy7Oe(}qr|g{)4c7Tl9vg@A{-maqb6JtZCWg1GYOd{FVd z0c9Vs0?D;x_c$eDuWw9WZsq!y|IY)J%U`XWt8~#YIx2xa$vF{Q$6m2*UjHW#1CKO0 z3Z*#)xR}PhBfWpV*>hf)sgyrb4zk}2x%&P4cpLt76|6F(N(HCWz6)RX{UB^MCOqWn zLP=Jb9g5Rf43h-BrSUZj1xt+^J6OiC!PK6)$C1ShR^=~a#zhE6| zV5*3|*$~jJ8{du{R8M~Brf*CTQl_-S+0UUxJ`hNrBp2&CL5t|iRXY(Owa8d2GGNQ0 zywa)whYX2{HQ&gI=&&5UO$_)X@ur$?B@6pwF>Fggo#+Au>#dM3FvOd9d zUcHn>s(+3t&hQJsbFi>NpLE^yZ{_Ca zPdLL4AK5&J2yHBT7As$8SLchiL-y?i<64)K)kyW5n9Ae@el_W3u$Ev@&$_P_B^bV8 zw>)56Vv}_0-NJSHa@)mv7;_qWqviP7mcO5m0;I&1>Rh3Ue^AZ3?fJ>p`P`wQZ&0K! z#d6(5!Bzc9WJuF8CoS}-E2uP_U`YwaNT{T84oKxWogg!(^xNt9%9|?9*WrHt`-_JP zU{ZMaoAacG2i~BG3#qR4ZsNw#)M4+3U_8n*dEZyAJgJj?PAL6+imOyFVhn3lpW7 zV$fI4chWN4cOD@|Zj&!3lp1}5;1=t?Xe%psR}_^BR>tZ6U}MU=m5%wTz3Rf%x$w2U zMNT*bY;E0sn$$q=ea{CpQJ@=ie7MoQep&0w)r9-9#Crd6GnvRN7plO~@65u#{-M4r zacwUcogz(gT})pzACYgA7V?%_AL|PebwGEgZOf-_OF0#P+$=3t9Gcs=M0YRrp;yV( zM-veGLN%f02}v~F=}X#0ma5jyX>t{OKiDD2!WRZ1ovC&@Wfq)w-YXLxqQ4N)03uc! z?F4aP*+LMO74Q7;$8JX~n9X<~aKG+I{JI8igii8SaCIer3k_2;KjYd>NO;}Dhqq|z z4yyM(gF+679lVQt_AhT=iFmtAdX9TE_@W~tvew$RVmLplGG8b}X%a}5p&PzIeSxCG z2cSYWZ!#pu?(c}uerrhU;-Uv7*l)eQy9wBh2BvPm{;&6t+x(m~qx3`f^{53Jh&BuG zTTWia;f7h_y<7ge*`#UblN9N*#*r{Gy*K`+-+ zY*xV>(J}HoP5tZ5++zicXwu_O=SI8reNs0d&CX$Wm=*h_cVhF5n#u{raKp<1+{uV(8AyCd^#4u_iz zudpl{W}|r0sxSeHI{k+jZD#yPlTlTarguMg&~Fx!T=Gl(nl? z^O0R@`77T0_5Rft4_hbDxLZr|LLZVF%~5M7NJ(t%hZTPO2Cqzc*Y#NtZI7g}%8$+m zxsufWuFbYtw5|Z{{~7-KWo=Ul+Rmz{%_!C{4t>_KWw3%Q zY9eg8WzF_A*jjSVI;SJ-C8f@6-63d@9u_gs%jHB?yjGpn>+0YEXcu8jyjF&45~3gp?j+TJ zE#UmfJ?2`)nF4d{`Q0ZJG^aoM&}#SO9yv5@!s(Y!=c5N9#JYNWyqXdYgz`~vmqq2i zm}TH9*C#$ zPy7MpI!|k}2e}MC7p^7 z;{SAO?OCUPk{xw8IZbCvYC-_#Ijw^GrU$==h6QaOt4^iTKT;$D#I5k+X*a1IM9BUTAr@NK^9714TzyujPzC`~N_EaJ<}n7f2yWlv34t)c410 zq=N3;JgQb-ZC>onh&6gWoZ0m7v;m2`LcmE{3nrLY#}$e_i{YSP;O`b!fOm2MO;&LH zH>!P7KK|bv^XnkOoY=NMS%4}G{%on+F%#?~Pe?M}<)h{V$@5{Juke2Q_vy!y2&cb7 z@pYE-d}S#PN6YljFEz`0vBzk!*=_z>6c?6kssG8&P+q3}8rCqj=xX!Fr ze5QnH3GHt2akvsKK-g&t!+?}o@=q2ITz20VZ_$@9&(5`d&(p6=f?_Q-M?)f5YERi7 z2HMDpFq@fX%Cg5LRqv~Ppz?38O91ST1ej1eknZ=tm~>ppU3IB_O5hS9LJ4Ap?4I+j zlSNJ@6y3L6?c<2ta>P6b!1}XU-CN*C8j*{ksq&ZHx?|h?<)%|gGGhz_blry)&5Hf7 zOxgv@F{3PPZBcVIM8QgTZ?2~SxhJxn8MdPlbb5+_)L=suB3vO zJH3HplyDZox((5qD6RN;z7n=%Ug3$1eN`LD*q+)3OF6_7c>_^F9i*_uu+8Z#c8R54 z2YZi5E}})y^a~HMbQ5=@Z8fu$`HVEBEOXIJRzA{5km{OM6j!@Z zeS@Xr_+=rDi=oh1r6`apbK|1ZYVvPEgL+r<$uRR3Q#Ya}SCiEz{Ts^a`7v@`td>o- zcV*OAUpjWD%>bF^TMFfDf8Qdfr|Icj)W@CoA9 z;cZ>zTmcI@x{ST9?JsyEkeY|$Ln89rz>3#$%so&`Kk8IISGO7)qF|DXT9d7sO_g2! zAOY*Tvixsmn7<7$u5ApwyP8o~T4cdDg8nElHk>$i>w&moyA?n3e)Pl?c7yh6NN{*8 z$?~L~z5Q2CrhRQ-pGBo4Mhu9UeB_`-tv#ytZbjqsi=CXf{fYm=AC#77<4c4^bor`u z3DN?Y6iQI1_2!94CL{2kpqc|AdFV^glPj-(r)(eU^OfnkWXM{rm(8j5k%LNf6J8*J zFT5-4@yJ$H(9RtU=?mUY3oY8rDNfx{qcaJ_ynr=i=2BjDT2t_dfU5T&cytnF+@Sky zur9~@;aRi`*=BGVPcuW%*T3=Iyr+|jy#(8Udp7}ZlIdZcEj;w)U=+*!!^W}0NH=pa zt1`&U+*~A(_T&UR+O{*VZ_%7Z6To@bAqMh-SCRgsBmG7By1C^|ea^-$Kyt*Qw)`jP zI1C|~nHZK_q+2$>+VegJU--E_h3ZB+L!YENSM5As?F|u{8e;~Zd*E(%cn_wke6Pfjj3G4Bb#_wzc7MOHmXdcS9rbYQx)nAM1&(Ls%^D z^M0q{6ecvxYi67b9DoSC2aZaOtd?^XbU2wZi#Ft3H# zK)-1p)q_{On}n*byXKkMG_}m8hC%+4k*&?m3w4h(?JlWB%*_OBYYDh1a_3I?)`+O# z%qIrs#`oz4rhysdAy}*fKT>PE(X8A+yg2L8)Jq!WBel^ht<8uUv+M)d-l3p?nW=ty zjfDGdF}Byz4k>E!;%-zZLKvUOOcOL(uYDz?uOd`jr=$GE5UE%96LeC1#ICt*^bo=4 zhy(^ySrQtntv-|7VX)KGdZ5VE3=lvs0@Mtezh`)Sy3k=MP^s8gpiS6Yb@*N5^S#bYnKqC;VZ^Y2|!p4Zxo0;4Leu#>lI9jzP?!gc0= z4y%)Fv+v(VNqsYl5>}F4-`gwAZM%&@j1|;Ty{qUP?^}fT9H*(0hZ(d9l_k^;Lj#VS zVHuKbffB^%o4u(h5D($+z~lY0gD{D`qb!!%mNS)F~7@2GZOn#haHz& z9HO5t>+{wc7;Yo^k(Er44Z*WU{$^mJYHc>)0$C)ICP>Nd-4E`te8DqsL^ReBd6i*M zU6X0vtzN4be@+W9OaKzwJ#-x^=j88dHAC=CntvdwOGD3g%x7waMfK}KI7$_d)3GD< z-CgF4vo=UmVZ6a4Pvp!E%kSI3ggs<0&BHig`M}H2l5xp%y)RvR{3ebf(5iHA-6rC| z>DUds7#3tH0y}#_3ttYLm&y%r$?YwX*$V1KnQr{3gQQ7Ots2#JNK~qiM&enACOTt21-B?cWeSv zOmOzTZcS0YLK^A;*;;*VX{yUK+;36~W*ucHtitC7vQZz78mW9N&f$44lVKHyiGv!g zI^WQME~i1}!|8!dya?0-w`WIGqLlFI7*}1jojW4RsvfSN!BzR(MHfbDl7(@%<(Ub| z)~NWjBBfW4m5e&Al-rZ;h=at2=wkbEsfWA%8U%?2O19Y~A91CqUw=KZl3+jF!SCK(Nv z?7%*4zne-8uGN;64)zeT1ItCK{{FCPIWnL{T^>(=^JWo6*a9{4J;8m5VeFPG+y>$H z!4Udwutu9MMGfEmN{S-$iJHG6qg?gZn>STEqwe3>JfF?Yvd(D_Qh~W{1P&uLdZ5V-SVNf4dlVtla&MN4h-X_8O^~%AX!%Zkg#bFMn0TDh0op}r`7 z7X#s0hAPA1@pRc{{_QcY9flSCbk|8Y*);D}<;CxDWR$P9Y1G*L)@hy2Jp)rC7Gmf! z(w9U)AO9eg{_>TR(h#sX_-ha zlKXlAR-&@F~=}fNp~(G`Sr>G zd!_(VnLDk?Q4C=v5b{}dQmHxmU+9vNd;l?nY-H;LBU)p^9BV2O*Lkx=?%>nNe& z)ow-k5EF2}?S&AocM*e!b&nO_`O%VSS+inb}Of=ABuaqj(PnJ#+^c|H(Iirx|6?*3Mi>*jY+F{SOQ{dB( zp?T6zWyL(O3;{Qc;`Y}cLz51ky32U;;yZ-1QJD!9M$I`d!Su>udW^D5koK~EF=Kgv zN?ra(tja--Do(OozSU!4#D@0bgq|IKCev=Rk*hGzkeF@)oxJgF7EP`1?BAUVETC+B z{^OoAuL~s<)p{@wBsQ>hYb}`IuW#8Pea_Djut^RmWIJHh6L4(L?=E|S}pHnhx zkOfD^k^DKz$Esa_Z9ETXEPAy<*d=|y1f#5nxx_R)JE>IIF_Tq3!?_pQJ|vT+lLNzaGJ*R*9Rnsnm3|Gamm z&nZ>rkP9dV>50RNQbw*i(a?y+dwa&YBqI38fyFbgXg|{`EplZiffn~D;Q5_GHj&iR z56XaK@#W;JD*NrV;Qk?=c1<}mj3i5g)%a8~CwmH=jQ0)Qell*G2|`9wmfj`6o`U5o z%;@rq&_Dm1!NwfR$ZnI|bGc69u6WVaX1C`+(A4~^DmnMbbj}N4#Kr;Q&X+7DMc%Wv zP-}v}sU+%4W@DG%C>t{_TwuFWYR;v-aOv<%#I1a2kaeK~KiN?)FDwt*5X66ZUI2v{ zcP9JjLmk>YX;`>#!81$MRGN~+n5q~()m~VapSnT2-T03RPl}bc>pjJCTxAZ*t*-Jb zp7b1?3^pvUeUB-ih)*f$w=B0p*A*b(PR_tpY1AtQzVUJ5_H^o6QXX{kp-+&HzQN?r zvZS?wN*a-+A`Xtb2g0y4+Ra^{B#{qT1uwr6DPm zGB;d0F$ly(iklt+-wbYWJv~eXNn{luv1Q<0GxqU$4zL2HD3s z+wp7VndXea3zmu`{OR}LgxxiAK&NywEz7tcCivp6oYTbCVzjL69o?-@d%PaWqrSzm ztDseXUxhIiaHr)&_=EA~`s@F`ps1o#yYx=8wYZ{BiiUar)%7(J#>2WMSY`7VCORr` z^{^#+E)yt544Mk=B6kJEnsaGO(MT*uU3G33wz3h{idvPbN7~YI_xp!UN)BW045Sm+ zzO%x_2{qKCA}T?dT&kR|ulbV~KM_{G^#5f3s>uTJ7Pp-|OCO2rA7Xf&aAmRyEoM7+ zS#5zSf$3gZ=fw1@J2sW7aVd^qIH_}0lS{bjD~gE6`?nrIRB*9i2*#v>sGJ-0-POR! zHu)9RDn#Jy{mAgew63qA`{cyhwmPM?%!1QJPRP-AZ@LQ&heX8qYhAVK9p}rW^;v}=P+jKdsi5WVTD>( z|2-h;md?L|904bR)6P#;e+2n8Tngq>JA{5?^58m}9cUWv5Et~}R0Ev6IM^ApMVDZS z#=|Ykotv%Twwc!cWY+Os#~Vld({6Qdd@I#vBrn@V)-W)Up)zQcq)H#xdfW9>bSU#`ef`kzQ&6rjGc3X&X3e$c~(v@#Rr_k$fbR82Y}rh?{U_3>SwCk!U@ zml4;KdG}br1T>Z1dx>Ve32&MTRt>_1k7t245gN3pdEa0E?~5c7Yd|FB?H|ODpF?eF z7n7wr=Ux|qk5G>tczeb&zJ5q;Ok5uU=t|I9B=}OX4Vvzo5bL&{0DD!@jN@(nE zZJ>b>BP<2CrCo6m{quPy<-pdq0bx9q{ozD8a2JVL zbR~6AX4|8(N-QcTRMVw6&ZMK(3WF~pT6h#g1BIss zgfF-@=%rNxB)U&O)o6{NISFNPPA|3}W0yOMDgttZr%VGssh-Q9qM`+Am@|da z`=sygP74n|x^)!7<@6 zyw&DCF?&?$EbIt`t$n|(hO-%6hKVMYJ0LPx2tmVfhxiAwZw^P5F8SOA%-3HS5V=BY zCCjE>%J7QlCN}JPOGB%9JwBEnuzo%oXbM)W|MpL1MemewC~?0_yINxI28zfaCKT#5 zTur{JVN!CnVUZCb3aSYs^-0p3{Z|?JY;wjAYJ~+2?1Sl#@LSsOo{yPs-!9!W;s1pi z#658*D3w`Vc3oXAzp?_vr1;2^IeWQR zq}#Lt0cz&fi5V@i8(-tT-;2mQ(T zXe!a)YVpX{{^3Klp5pm~ymZH1+8z0+S}p^mz5C~wnKyeNxaY?#oJ8}ujO{^Yc6R)W zi$Lp(I~(+enua>H0Wrdv@#}uCAJD;mcYL1lrWZgFq-#$DE%=6#m9GA}Tvnpubzewf z{t8N1Tb9;L?VIpJ=2MSv{TlEe7Hq}Y)SbrP%j{jp(<_7;)J6wnaS3s;$PIZ6$6Y(R zI0maqjJt|8q2{$S-#@2|cD(qD%lH9sN)bt8mP?QzMX0Ht_DfbV1>?xD_rZFgNZAWbBtC+;_H`0C%|n!b34 z5zg5in*|_oEsUwhEtXR$n>mAAH!Bfx_Zd^@$Q8vZ>#S{{wFGRqW?@caVaBH5YUHFb zt~mQWv@(M77kriq5w_XO>q%^(mmsgg#2DE_f%l3Ri$K*H>9FhWAVO+|@3xP}7EZnv*t zjJ!QozM#%m6VBSS;~i{z%u;tU3eEDVaOh?ua9)u`VCLT;BAE8OjjHWi16N6jse^4F z2EQH&m+dSo;PbKJIexr=8h9X+Ia*-EVS2=f8|PQYNqNUYz{Fp@-Y5sH=E47G-xS>9 zks6@A$_7>aIJJ+UIIj-hlwUz~)z@S;nW5bWgf~Z+EMxe6AKIH?>mYS5zuI7Plqlc2ZQ&~p-ady-{92Re0g?L4RIn-MLobns>%g=lUVKs?9zFRf3|rxs zlGAb8XBXdY48M9EVfB6fr6H}Nm09Nd9|G}jc4-#{lR6elhLo2a=Hh4C_GJhdPWY%_ zZ6EbbHOg8?#~d&gUaRx4&gwE017llsqi<9y*sxXcQsyFeI+>j-lsb(#@F8@N(Yi-U zSs~b9d_kvB)^P_3a_Ly#`l6+LCf&&%9{T&tdUc+ch< z;(c$#v?QQUOl)d`?ZKnkHvtuvahyA%!-C%8Lr2bzR(jYF848?ooyL+l9o=_`&%S;a zC+1;gWawM=Nt|G8Xt;4W{_29g04lCx3+dqhPvNP4 zA0cEhF2*={ylLIS_eG5s(YPfi1RIFAjh4SB?k(rO*%Q|ME2-$7_7xJDd)7AnLD