From 36f236f6666637b0bc180f5aec3c376a604b8cbb Mon Sep 17 00:00:00 2001 From: Pham Ngoc Duong Date: Mon, 27 Oct 2025 21:59:44 +0700 Subject: [PATCH 01/85] fix(pplx-ext:command-menu): excessive cache restore & minor UX bugs --- .../cli/src/web-stores/firefox-publish.ts | 2 +- perplexity/extension/package.json | 2 +- .../src/components/icons/ClockTemporary.tsx | 20 ++++++++ .../extension/src/components/ui/command.tsx | 7 +-- .../__core__/slash-command/Wrapper.cs-ui.tsx | 7 --- .../routes/Home/HomepageUpdateAnnouncer.tsx | 11 +++-- .../src/plugins/command-menu/CommandMenu.tsx | 19 +------ .../_locales/plugin-command-menu.bn-BD.ts | 1 + .../_locales/plugin-command-menu.cs-CZ.ts | 1 + .../_locales/plugin-command-menu.de-DE.ts | 1 + .../_locales/plugin-command-menu.el-GR.ts | 1 + .../_locales/plugin-command-menu.en-US.ts | 1 + .../_locales/plugin-command-menu.es-ES.ts | 1 + .../_locales/plugin-command-menu.fr-FR.ts | 1 + .../_locales/plugin-command-menu.hi-IN.ts | 1 + .../_locales/plugin-command-menu.hr-HR.ts | 1 + .../_locales/plugin-command-menu.hu-HU.ts | 1 + .../_locales/plugin-command-menu.id-ID.ts | 1 + .../_locales/plugin-command-menu.it-IT.ts | 1 + .../_locales/plugin-command-menu.ja-JP.ts | 1 + .../_locales/plugin-command-menu.ko-KR.ts | 1 + .../_locales/plugin-command-menu.nl-NL.ts | 1 + .../_locales/plugin-command-menu.pl-PL.ts | 1 + .../_locales/plugin-command-menu.pt-BR.ts | 1 + .../_locales/plugin-command-menu.pt-PT.ts | 1 + .../_locales/plugin-command-menu.ro-RO.ts | 1 + .../_locales/plugin-command-menu.ru-RU.ts | 1 + .../_locales/plugin-command-menu.sk-SK.ts | 1 + .../plugin-command-menu.sr-Cyrl-ME.ts | 1 + .../_locales/plugin-command-menu.zh-CN.ts | 1 + .../_locales/plugin-command-menu.zh-TW.ts | 1 + .../command-menu/pages/threads/Page.tsx | 1 + .../command-menu/pages/threads/SpaceBadge.tsx | 5 +- .../command-menu/pages/threads/ThreadItem.tsx | 32 +++++++++--- .../pages/threads/filters/context.tsx | 22 ++++++--- .../pages/threads/useLoadMoreItems.tsx | 2 +- .../command-menu/store/slices/pages/index.ts | 5 +- ...model-selection-mismatch-warning.loader.ts | 30 ++++++------ .../prompt-history/hooks/useLoadMoreItems.tsx | 2 +- .../slash-command/CommandMenuContent.tsx | 49 ++++++++++--------- .../slash-command/CommandMenuItem.tsx | 2 +- .../src/services/externals/pplx-api/index.ts | 2 +- .../externals/pplx-api/pplx-api.types.ts | 1 + .../src/services/infra/i18n/dayjs.ts | 4 ++ .../src/services/infra/query-client/utils.ts | 17 +++++++ 45 files changed, 174 insertions(+), 92 deletions(-) create mode 100644 perplexity/extension/src/components/icons/ClockTemporary.tsx diff --git a/perplexity/extension/cli/src/web-stores/firefox-publish.ts b/perplexity/extension/cli/src/web-stores/firefox-publish.ts index fbcfcde35..c55507821 100644 --- a/perplexity/extension/cli/src/web-stores/firefox-publish.ts +++ b/perplexity/extension/cli/src/web-stores/firefox-publish.ts @@ -46,7 +46,7 @@ async function main(): Promise { const metdataData = { version: { release_notes: { - "en-US": releaseNotes ?? "", + "en-US": releaseNotes ?? "No changelog for this version", }, }, }; diff --git a/perplexity/extension/package.json b/perplexity/extension/package.json index 924843325..cf33e791a 100644 --- a/perplexity/extension/package.json +++ b/perplexity/extension/package.json @@ -1,6 +1,6 @@ { "name": "pplx-ext", - "version": "2.7.7", + "version": "2.7.8", "author": "pnd280", "type": "module", "scripts": { diff --git a/perplexity/extension/src/components/icons/ClockTemporary.tsx b/perplexity/extension/src/components/icons/ClockTemporary.tsx new file mode 100644 index 000000000..0509edcff --- /dev/null +++ b/perplexity/extension/src/components/icons/ClockTemporary.tsx @@ -0,0 +1,20 @@ +import React from "react"; + +export const ClockTemporary: React.FC> = ( + props, +) => ( + + + +); + +export default ClockTemporary; diff --git a/perplexity/extension/src/components/ui/command.tsx b/perplexity/extension/src/components/ui/command.tsx index 55cc64334..eeb167c9d 100644 --- a/perplexity/extension/src/components/ui/command.tsx +++ b/perplexity/extension/src/components/ui/command.tsx @@ -106,7 +106,7 @@ export function CommandList({ import("@/plugins/__core__/slash-command/SlashCommandMenu"), @@ -11,11 +9,6 @@ const { SlashCommandMenu } = lazily( const SlashCommandMenuWrapper = withPluginsGuard(SlashCommandMenu, { dependentCorePluginIds: ["slashCommand"], - additionalCheck: () => { - return ( - !isMobileStore.getState().isMobile || whereAmI() === "comet_assistant" - ); - }, }); export const uiGroup: UiGroupId = "global"; diff --git a/perplexity/extension/src/plugins/__ui-groups__/routes/Home/HomepageUpdateAnnouncer.tsx b/perplexity/extension/src/plugins/__ui-groups__/routes/Home/HomepageUpdateAnnouncer.tsx index 2c3187fa0..9c37da9d4 100644 --- a/perplexity/extension/src/plugins/__ui-groups__/routes/Home/HomepageUpdateAnnouncer.tsx +++ b/perplexity/extension/src/plugins/__ui-groups__/routes/Home/HomepageUpdateAnnouncer.tsx @@ -8,15 +8,16 @@ export default function HomepageUpdateAnnouncer() { const slogan = useHomeDomObserverStore((store) => store.slogan, deepEqual); - const anchor = slogan ? $(slogan).find(">*").first()[0] : null; + if (!isUpdateAvailable || !slogan) return null; - if (!anchor || document.body.contains(anchor) || !isUpdateAvailable) - return null; + const $container = $(slogan).parent().parent(); + + if (!$container.length) return null; return ( - + -
+
A new version of Complexity is available!
diff --git a/perplexity/extension/src/plugins/command-menu/CommandMenu.tsx b/perplexity/extension/src/plugins/command-menu/CommandMenu.tsx index 1d0677794..321d957b8 100644 --- a/perplexity/extension/src/plugins/command-menu/CommandMenu.tsx +++ b/perplexity/extension/src/plugins/command-menu/CommandMenu.tsx @@ -1,11 +1,6 @@ import { useHotkeys } from "react-hotkeys-hook"; -import { - Command, - CommandDialog, - CommandList, - useCommandListManualScroll, -} from "@/components/ui/command"; +import { Command, CommandDialog, CommandList } from "@/components/ui/command"; import CommandFooter from "@/plugins/command-menu/components/CommandFooter"; import CommandInput from "@/plugins/command-menu/components/CommandInput"; import CommandSidecar from "@/plugins/command-menu/components/CommandSidecar"; @@ -29,16 +24,8 @@ export function CommandMenu() { setSidecarOpen, } = useCommandMenuStore(); - const commandListRef = useRef(null); - const settings = ExtensionSettingsService.cachedSync.plugins.commandMenu; - useCommandListManualScroll({ - enabled: open, - commandListRef, - willUpdateValue: selectingValue, - }); - useHotkeys( keysToString(settings.keybindings.toggle), (e) => { @@ -93,9 +80,7 @@ export function CommandMenu() { )} > diff --git a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.bn-BD.ts b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.bn-BD.ts index 9edd4ecc9..b098d8a18 100644 --- a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.bn-BD.ts +++ b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.bn-BD.ts @@ -90,5 +90,6 @@ export default { common: { noResults: "কোন ফলাফল পাওয়া যায়নি", current: "বর্তমান", + expires: "{date} এ মেয়াদ শেষ হয়", }, } as const satisfies Translations; diff --git a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.cs-CZ.ts b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.cs-CZ.ts index 688b17d1d..b96a077be 100644 --- a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.cs-CZ.ts +++ b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.cs-CZ.ts @@ -90,5 +90,6 @@ export default { common: { noResults: "Nenalezeny žádné výsledky", current: "Aktuální", + expires: "Vyprší {date}", }, } as const satisfies Translations; diff --git a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.de-DE.ts b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.de-DE.ts index 175b29fd3..8d8b4c3f3 100644 --- a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.de-DE.ts +++ b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.de-DE.ts @@ -90,5 +90,6 @@ export default { common: { noResults: "Keine Ergebnisse gefunden", current: "Aktuell", + expires: "Läuft ab {date}", }, } as const satisfies Translations; diff --git a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.el-GR.ts b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.el-GR.ts index 580b1ea59..0b87c9843 100644 --- a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.el-GR.ts +++ b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.el-GR.ts @@ -90,5 +90,6 @@ export default { common: { noResults: "Δεν βρέθηκαν αποτελέσματα", current: "Τρέχον", + expires: "Λήγει {date}", }, } as const satisfies Translations; diff --git a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.en-US.ts b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.en-US.ts index 0f486309d..4040b4442 100644 --- a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.en-US.ts +++ b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.en-US.ts @@ -90,5 +90,6 @@ export default { common: { noResults: "No results found", current: "Current", + expires: "Expires {date}", }, } as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.es-ES.ts b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.es-ES.ts index 0db995bc4..ebc8d817e 100644 --- a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.es-ES.ts +++ b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.es-ES.ts @@ -90,5 +90,6 @@ export default { common: { noResults: "No se encontraron resultados", current: "Actual", + expires: "Expira {date}", }, } as const satisfies Translations; diff --git a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.fr-FR.ts b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.fr-FR.ts index 15fb3accb..438f31c92 100644 --- a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.fr-FR.ts +++ b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.fr-FR.ts @@ -90,5 +90,6 @@ export default { common: { noResults: "Aucun résultat trouvé", current: "Actuel", + expires: "Expiration {date}", }, } as const satisfies Translations; diff --git a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.hi-IN.ts b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.hi-IN.ts index a49e0a5e2..d6a32124c 100644 --- a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.hi-IN.ts +++ b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.hi-IN.ts @@ -90,5 +90,6 @@ export default { common: { noResults: "कोई परिणाम नहीं मिला", current: "वर्तमान", + expires: "{date} को समाप्त होता है", }, } as const satisfies Translations; diff --git a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.hr-HR.ts b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.hr-HR.ts index 92b5d719a..c8111bf2e 100644 --- a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.hr-HR.ts +++ b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.hr-HR.ts @@ -90,5 +90,6 @@ export default { common: { noResults: "Nema rezultata", current: "Trenutno", + expires: "Ističe {date}", }, } as const satisfies Translations; diff --git a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.hu-HU.ts b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.hu-HU.ts index 333241344..76f2d92dd 100644 --- a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.hu-HU.ts +++ b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.hu-HU.ts @@ -90,5 +90,6 @@ export default { common: { noResults: "Nincs találat", current: "Jelenlegi", + expires: "Lejár: {date}", }, } as const satisfies Translations; diff --git a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.id-ID.ts b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.id-ID.ts index ad06e189e..7499cc69e 100644 --- a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.id-ID.ts +++ b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.id-ID.ts @@ -90,5 +90,6 @@ export default { common: { noResults: "Tidak ada hasil ditemukan", current: "Saat Ini", + expires: "Berakhir {date}", }, } as const satisfies Translations; diff --git a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.it-IT.ts b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.it-IT.ts index 826e30c31..51647195f 100644 --- a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.it-IT.ts +++ b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.it-IT.ts @@ -90,5 +90,6 @@ export default { common: { noResults: "Nessun risultato trovato", current: "Corrente", + expires: "Scade {date}", }, } as const satisfies Translations; diff --git a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.ja-JP.ts b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.ja-JP.ts index 644e01a60..b167c859b 100644 --- a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.ja-JP.ts +++ b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.ja-JP.ts @@ -90,5 +90,6 @@ export default { common: { noResults: "結果が見つかりません", current: "現在", + expires: "{date}に有効期限が切れます", }, } as const satisfies Translations; diff --git a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.ko-KR.ts b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.ko-KR.ts index 9ddbdfb29..8cdb3d966 100644 --- a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.ko-KR.ts +++ b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.ko-KR.ts @@ -90,5 +90,6 @@ export default { common: { noResults: "결과를 찾을 수 없음", current: "현재", + expires: "{date}에 만료됨", }, } as const satisfies Translations; diff --git a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.nl-NL.ts b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.nl-NL.ts index c7c5a8722..c8688e5ce 100644 --- a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.nl-NL.ts +++ b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.nl-NL.ts @@ -90,5 +90,6 @@ export default { common: { noResults: "Geen resultaten gevonden", current: "Huidige", + expires: "Verloopt {date}", }, } as const satisfies Translations; diff --git a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.pl-PL.ts b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.pl-PL.ts index 3d20d212c..84b2562e4 100644 --- a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.pl-PL.ts +++ b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.pl-PL.ts @@ -90,5 +90,6 @@ export default { common: { noResults: "Nie znaleziono wyników", current: "Bieżący", + expires: "Wygasa {date}", }, } as const satisfies Translations; diff --git a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.pt-BR.ts b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.pt-BR.ts index afb4e5449..d4769e93a 100644 --- a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.pt-BR.ts +++ b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.pt-BR.ts @@ -90,5 +90,6 @@ export default { common: { noResults: "Nenhum resultado encontrado", current: "Atual", + expires: "Expira {date}", }, } as const satisfies Translations; diff --git a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.pt-PT.ts b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.pt-PT.ts index ca7700699..11429a2bb 100644 --- a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.pt-PT.ts +++ b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.pt-PT.ts @@ -90,5 +90,6 @@ export default { common: { noResults: "Nenhum resultado encontrado", current: "Actual", + expires: "Expira {date}", }, } as const satisfies Translations; diff --git a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.ro-RO.ts b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.ro-RO.ts index 3bda98386..d661328bb 100644 --- a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.ro-RO.ts +++ b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.ro-RO.ts @@ -90,5 +90,6 @@ export default { common: { noResults: "Nu s-au găsit rezultate", current: "Curent", + expires: "Expiră {date}", }, } as const satisfies Translations; diff --git a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.ru-RU.ts b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.ru-RU.ts index 92d48151b..729389d32 100644 --- a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.ru-RU.ts +++ b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.ru-RU.ts @@ -90,5 +90,6 @@ export default { common: { noResults: "Результаты не найдены", current: "Текущий", + expires: "Истекает {date}", }, } as const satisfies Translations; diff --git a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.sk-SK.ts b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.sk-SK.ts index 549fdfe1e..3979ce05a 100644 --- a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.sk-SK.ts +++ b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.sk-SK.ts @@ -90,5 +90,6 @@ export default { common: { noResults: "Nenašli sa žiadne výsledky", current: "Aktuálne", + expires: "Vypršie {date}", }, } as const satisfies Translations; diff --git a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.sr-Cyrl-ME.ts b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.sr-Cyrl-ME.ts index cb34d2967..6e8592d82 100644 --- a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.sr-Cyrl-ME.ts +++ b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.sr-Cyrl-ME.ts @@ -90,5 +90,6 @@ export default { common: { noResults: "Нема резултата", current: "Тренутно", + expires: "Истиче {date}", }, } as const satisfies Translations; diff --git a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.zh-CN.ts b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.zh-CN.ts index d20fb4c8f..a50a165a7 100644 --- a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.zh-CN.ts +++ b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.zh-CN.ts @@ -90,5 +90,6 @@ export default { common: { noResults: "未找到结果", current: "当前", + expires: "于 {date} 过期", }, } as const satisfies Translations; diff --git a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.zh-TW.ts b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.zh-TW.ts index 02c417fec..9ac0d2610 100644 --- a/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.zh-TW.ts +++ b/perplexity/extension/src/plugins/command-menu/_locales/plugin-command-menu.zh-TW.ts @@ -90,5 +90,6 @@ export default { common: { noResults: "找不到結果", current: "目前", + expires: "於 {date} 過期", }, } as const satisfies Translations; diff --git a/perplexity/extension/src/plugins/command-menu/pages/threads/Page.tsx b/perplexity/extension/src/plugins/command-menu/pages/threads/Page.tsx index 53898682b..47a3678db 100644 --- a/perplexity/extension/src/plugins/command-menu/pages/threads/Page.tsx +++ b/perplexity/extension/src/plugins/command-menu/pages/threads/Page.tsx @@ -3,6 +3,7 @@ import { ThreadsSearchFiltersProvider } from "@/plugins/command-menu/pages/threa import ThreadsSearchFilters from "@/plugins/command-menu/pages/threads/filters/Index"; import ThreadCommandItems from "@/plugins/command-menu/pages/threads/ThreadCommandItems"; import type { ThreadsSearchPayload } from "@/services/externals/pplx-api/pplx-api.types"; +import { useCommandMenuStore } from "../../store"; declare module "@/plugins/command-menu/store/slices/pages/types" { interface CommandMenuPagesArgsRegistry { diff --git a/perplexity/extension/src/plugins/command-menu/pages/threads/SpaceBadge.tsx b/perplexity/extension/src/plugins/command-menu/pages/threads/SpaceBadge.tsx index 596c59bab..393279e61 100644 --- a/perplexity/extension/src/plugins/command-menu/pages/threads/SpaceBadge.tsx +++ b/perplexity/extension/src/plugins/command-menu/pages/threads/SpaceBadge.tsx @@ -10,7 +10,10 @@ export default function SpaceBadge({ space: NonNullable; }) { return ( - +
{ e.preventDefault(); diff --git a/perplexity/extension/src/plugins/command-menu/pages/threads/ThreadItem.tsx b/perplexity/extension/src/plugins/command-menu/pages/threads/ThreadItem.tsx index 5805987f0..8d4b77f04 100644 --- a/perplexity/extension/src/plugins/command-menu/pages/threads/ThreadItem.tsx +++ b/perplexity/extension/src/plugins/command-menu/pages/threads/ThreadItem.tsx @@ -1,6 +1,7 @@ import { Highlight } from "@ark-ui/react/highlight"; import { isHotkeyPressed } from "react-hotkeys-hook"; +import ClockTemporary from "@/components/icons/ClockTemporary"; import { Badge } from "@/components/ui/badge"; import { CommandItem, @@ -16,7 +17,7 @@ import { useCurrentPage } from "@/plugins/command-menu/hooks/useCurrentPage"; import SpaceBadge from "@/plugins/command-menu/pages/threads/SpaceBadge"; import { commandMenuStore } from "@/plugins/command-menu/store"; import type { ThreadSearchResponseApi } from "@/services/externals/pplx-api/pplx-api.types"; -import { formatRelativeTime } from "@/services/infra/i18n"; +import { formatExactDate, formatRelativeTime } from "@/services/infra/i18n"; import { jsonUtils } from "@/utils/misc/utils"; type ThreadItemProps = { @@ -65,7 +66,7 @@ const ThreadItem = memo(({ thread, searchValue }: ThreadItemProps) => { commandMenuStore.getState().setOpen(false); }} > - +
{ {t("plugin-command-menu.common.current")} )} - {!isSpaceThreadsPage && thread.collection && ( - - )}
- - {formatRelativeTime(thread.last_query_datetime)} + +
{formatRelativeTime(thread.last_query_datetime)}
{firstAnswer != null && ( @@ -98,6 +96,26 @@ const ThreadItem = memo(({ thread, searchValue }: ThreadItemProps) => { />
)} +
+ {thread.expiry_time && ( +
+
+ + Temporary Thread +
+
+ {t("plugin-command-menu.common.expires", { + date: formatExactDate(thread.expiry_time), + })} +
+
+ )} + {!isSpaceThreadsPage && thread.collection && ( +
+ +
+ )} +
); diff --git a/perplexity/extension/src/plugins/command-menu/pages/threads/filters/context.tsx b/perplexity/extension/src/plugins/command-menu/pages/threads/filters/context.tsx index 4b286b05d..a52925d5b 100644 --- a/perplexity/extension/src/plugins/command-menu/pages/threads/filters/context.tsx +++ b/perplexity/extension/src/plugins/command-menu/pages/threads/filters/context.tsx @@ -1,3 +1,5 @@ +import type { OmitKeyof } from "@tanstack/react-query"; + import type { ThreadsSearchPayload } from "@/services/externals/pplx-api/pplx-api.types"; export type SourceValue = ThreadsSearchPayload["querySourceFilter"]; @@ -6,7 +8,10 @@ export type WithTemporaryThreadValue = ThreadsSearchPayload["withTemporaryThreads"]; export type SortValue = ThreadsSearchPayload["ascending"]; -export type ThreadsSearchFiltersState = ThreadsSearchPayload; +export type ThreadsSearchFiltersState = OmitKeyof< + ThreadsSearchPayload, + "limit" | "offset" | "searchValue" +>; export type ThreadsSearchFiltersActions = { setSource: (value: SourceValue) => void; @@ -21,19 +26,20 @@ export type ThreadsSearchFiltersContextValue = { actions: ThreadsSearchFiltersActions; }; -export const defaultFiltersState: ThreadsSearchFiltersState = {}; +export const defaultFiltersState: ThreadsSearchFiltersState = { + withTemporaryThreads: true, +}; export const ThreadsSearchFiltersContext = createContext(null); export function useThreadsSearchFilters() { - const context = useContext(ThreadsSearchFiltersContext); + const context = use(ThreadsSearchFiltersContext); - if (!context) { - throw new Error( - "useThreadsSearchFilters must be used within a ThreadsSearchFiltersProvider", - ); - } + invariant( + context != null, + "useThreadsSearchFilters must be used within a ThreadsSearchFiltersProvider", + ); return context; } diff --git a/perplexity/extension/src/plugins/command-menu/pages/threads/useLoadMoreItems.tsx b/perplexity/extension/src/plugins/command-menu/pages/threads/useLoadMoreItems.tsx index 8ff212fd1..7a4442c81 100644 --- a/perplexity/extension/src/plugins/command-menu/pages/threads/useLoadMoreItems.tsx +++ b/perplexity/extension/src/plugins/command-menu/pages/threads/useLoadMoreItems.tsx @@ -14,7 +14,7 @@ export default function useLoadMoreItems({ triggerRef: (node: Element | null) => void; } { const [triggerRef, entry] = useIntersectionObserver({ - root: $("[data-command-menu-list]")[0], + root: $("[cmdk-list]")[0], threshold: 0, rootMargin: "0px 0px 5px 0px", }); diff --git a/perplexity/extension/src/plugins/command-menu/store/slices/pages/index.ts b/perplexity/extension/src/plugins/command-menu/store/slices/pages/index.ts index 7ea0bf7ee..95a0a36d9 100644 --- a/perplexity/extension/src/plugins/command-menu/store/slices/pages/index.ts +++ b/perplexity/extension/src/plugins/command-menu/store/slices/pages/index.ts @@ -44,7 +44,10 @@ export const createPagesStackSlice: BoundStateCreator = ( set({ pageStack: newStack, shouldLocalFilter: page.shouldLocalFilter, - searchValue: "", + searchValue: + page.args != null && "searchValue" in page.args + ? page.args.searchValue + : "", selectingValue: "", sidecarOpen: page.sidecarOpen, }); diff --git a/perplexity/extension/src/plugins/language-model-selector/model-selection-mismatch-warning.loader.ts b/perplexity/extension/src/plugins/language-model-selector/model-selection-mismatch-warning.loader.ts index de00bbb49..7b4601bf9 100644 --- a/perplexity/extension/src/plugins/language-model-selector/model-selection-mismatch-warning.loader.ts +++ b/perplexity/extension/src/plugins/language-model-selector/model-selection-mismatch-warning.loader.ts @@ -10,15 +10,21 @@ declare module "@/plugins/__async-deps__/async-loaders" { export default function () { AsyncLoaderRegistry.register({ id: "plugin:queryBox:languageModelSelector:modelSelectionMismatchWarning", - dependencies: ["cache:pluginsEnableStates", "cache:extensionSettings"], + dependencies: [ + "cache:pluginsEnableStates", + "cache:extensionSettings", + "store:pluginGuards", + ], loader: ({ "cache:pluginsEnableStates": pluginsEnableStates, "cache:extensionSettings": extensionSettings, + "store:pluginGuards": pluginGuards, }) => { if ( !pluginsEnableStates["queryBox:languageModelSelector"] || !extensionSettings.plugins["queryBox:languageModelSelector"] - .showModelSelectionMismatchWarning + .showModelSelectionMismatchWarning || + pluginGuards.subTier == null ) return; @@ -28,18 +34,14 @@ export default function () { if (messageBlocks == null) return; for (const messageBlock of messageBlocks) { - if ( - messageBlock.content.displayModel !== "turbo" && - messageBlock.content.userSelectedModel !== - messageBlock.content.displayModel - ) { - const $displayModelButton = - messageBlock.nodes.$displayModelButton; - - if (!$displayModelButton[0]) continue; - - $displayModelButton.addClass("cplx-model-mismatch-warning"); - } + messageBlock.nodes.$displayModelButton.toggleClass( + "cplx-model-mismatch-warning", + messageBlock.content.displayModel != null && + messageBlock.content.userSelectedModel != null && + messageBlock.content.displayModel !== "turbo" && + messageBlock.content.userSelectedModel !== + messageBlock.content.displayModel, + ); } }, { diff --git a/perplexity/extension/src/plugins/prompt-history/hooks/useLoadMoreItems.tsx b/perplexity/extension/src/plugins/prompt-history/hooks/useLoadMoreItems.tsx index bc0c3e94f..7a4442c81 100644 --- a/perplexity/extension/src/plugins/prompt-history/hooks/useLoadMoreItems.tsx +++ b/perplexity/extension/src/plugins/prompt-history/hooks/useLoadMoreItems.tsx @@ -14,7 +14,7 @@ export default function useLoadMoreItems({ triggerRef: (node: Element | null) => void; } { const [triggerRef, entry] = useIntersectionObserver({ - root: $("[data-prompt-history-command-list]")[0], + root: $("[cmdk-list]")[0], threshold: 0, rootMargin: "0px 0px 5px 0px", }); diff --git a/perplexity/extension/src/plugins/prompt-history/slash-command/CommandMenuContent.tsx b/perplexity/extension/src/plugins/prompt-history/slash-command/CommandMenuContent.tsx index fd30eb126..522357959 100644 --- a/perplexity/extension/src/plugins/prompt-history/slash-command/CommandMenuContent.tsx +++ b/perplexity/extension/src/plugins/prompt-history/slash-command/CommandMenuContent.tsx @@ -9,7 +9,6 @@ import { CommandGroup, CommandInput, CommandList, - useCommandListManualScroll, } from "@/components/ui/command"; import { CommandItemSkeleton } from "@/components/ui/command"; import { getPlatform } from "@/hooks/usePlatformDetection"; @@ -26,6 +25,7 @@ export function PromptHistoryCommandMenuContent() { const [searchValue, setSearchValue] = useState(""); const [selectingValue, setSelectingValue] = useState(""); + const debouncedSearchValue = useDebounce(searchValue, 200); const { items, @@ -41,14 +41,6 @@ export function PromptHistoryCommandMenuContent() { enabled: true, }); - const commandListRef = useRef(null); - - useCommandListManualScroll({ - enabled: true, - commandListRef, - willUpdateValue: selectingValue, - }); - const { triggerRef } = useLoadMoreItems({ hasNextPage, isFetching, @@ -58,6 +50,21 @@ export function PromptHistoryCommandMenuContent() { const deleteItem = async (id: string) => { await PromptHistoryService.Instance.delete(id); + if (items != null) { + const currentIndex = items.findIndex((item) => item.id === id); + + if (currentIndex !== -1 && items.length > 1) { + const nextIndex = + currentIndex < items.length - 1 ? currentIndex + 1 : currentIndex - 1; + const nextItem = items[nextIndex]; + if (nextItem != null) { + setSelectingValue(nextItem.id); + } + } else { + setSelectingValue(""); + } + } + void queryClient.invalidateQueries({ queryKey: promptHistoryQueries.infinite.all(), }); @@ -123,11 +130,7 @@ export function PromptHistoryCommandMenuContent() { value={searchValue} onValueChange={setSearchValue} /> - + {items.map((item) => ( ))} + {!isLoading && ( + + {t("plugin-prompt-history.search.noResults")} + + )} + {(isLoading || isFetchingNextPage) && ( + + )} + {hasNextPage &&
} - {!isLoading && ( - - {t("plugin-prompt-history.search.noResults")} - - )} - {(isLoading || isFetchingNextPage) && ( - - )} - {hasNextPage &&
} ); diff --git a/perplexity/extension/src/plugins/prompt-history/slash-command/CommandMenuItem.tsx b/perplexity/extension/src/plugins/prompt-history/slash-command/CommandMenuItem.tsx index 8ffd6ccd6..0463f8147 100644 --- a/perplexity/extension/src/plugins/prompt-history/slash-command/CommandMenuItem.tsx +++ b/perplexity/extension/src/plugins/prompt-history/slash-command/CommandMenuItem.tsx @@ -40,7 +40,7 @@ const PromptHistoryCommandMenuItem = memo( slashCommandMenuStore.getState().setOpen(false); }} > - + shouldDehydrateQuery(query, { excludeKeys, includeKeys }), + serializeData: (data) => { + // Only persist the first page of infinite queries + if ( + data != null && + typeof data === "object" && + "pages" in data && + "pageParams" in data && + Array.isArray(data.pages) && + Array.isArray(data.pageParams) + ) { + return { + pages: [data.pages[0]], + pageParams: [data.pageParams[0]], + }; + } + return data; + }, }, }); }, From 8acc98f53094a3233293ca2101388bd70b0151b7 Mon Sep 17 00:00:00 2001 From: Pham Ngoc Duong Date: Tue, 28 Oct 2025 09:39:36 +0700 Subject: [PATCH 02/85] chore: update deps & minor refactors --- .github/ISSUE_TEMPLATE/bug_report.yml | 44 ++- .github/ISSUE_TEMPLATE/config.yml | 4 +- .github/ISSUE_TEMPLATE/feature_request.yml | 4 +- .github/ISSUE_TEMPLATE/translation_issues.yml | 4 +- packages/async-dep-manager/package.json | 2 +- .../i18n.md => packages/i18n/README.md | 4 +- .../.cursor/commands/locale-string-extract.md | 28 +- .../.cursor/commands/locale-translate.md | 6 - perplexity/extension/changelogs/2.7.9.md | 7 + perplexity/extension/cli/package.json | 2 +- perplexity/extension/docs/tech-stack.md | 2 +- perplexity/extension/package.json | 12 +- .../extension/src/_locales/common.bn-BD.ts | 2 +- .../extension/src/_locales/common.cs-CZ.ts | 2 +- .../extension/src/_locales/common.de-DE.ts | 3 +- .../extension/src/_locales/common.el-GR.ts | 2 +- .../extension/src/_locales/common.en-US.ts | 2 +- .../extension/src/_locales/common.es-ES.ts | 2 +- .../extension/src/_locales/common.fr-FR.ts | 2 +- .../extension/src/_locales/common.hi-IN.ts | 2 +- .../extension/src/_locales/common.hr-HR.ts | 2 +- .../extension/src/_locales/common.hu-HU.ts | 2 +- .../extension/src/_locales/common.id-ID.ts | 2 +- .../extension/src/_locales/common.it-IT.ts | 2 +- .../extension/src/_locales/common.ja-JP.ts | 2 +- .../extension/src/_locales/common.ko-KR.ts | 2 +- .../extension/src/_locales/common.nl-NL.ts | 2 +- .../extension/src/_locales/common.pl-PL.ts | 2 +- .../extension/src/_locales/common.pt-BR.ts | 2 +- .../extension/src/_locales/common.pt-PT.ts | 2 +- .../extension/src/_locales/common.ro-RO.ts | 2 +- .../extension/src/_locales/common.ru-RU.ts | 2 +- .../extension/src/_locales/common.sk-SK.ts | 2 +- .../src/_locales/common.sr-Cyrl-ME.ts | 2 +- .../extension/src/_locales/common.zh-CN.ts | 2 +- .../extension/src/_locales/common.zh-TW.ts | 2 +- .../extension/src/auto-imports-config.ts | 9 +- perplexity/extension/src/auto-imports.d.ts | 1 + .../ExtensionUpdateInfoDialogWrapper.tsx | 100 ++---- .../PostUpdateReleaseNotesDialog.tsx | 108 ------ .../src/components/SponsorChannels.tsx | 57 +++ .../src/components/SponsorDialogWrapper.tsx | 114 ------ .../extension/src/components/ui/command.tsx | 1 - .../extension/src/components/ui/use-toast.ts | 25 +- .../components/CometAffiliateCard.tsx | 18 +- .../components/SponsorDialogWrapper.tsx | 76 ++++ .../components/sidebar/Sidebar.tsx | 10 +- .../release-notes/DirectReleaseNotesPage.tsx | 41 --- .../FullScreenReleaseNotesPage.tsx | 93 +++++ .../settings/sections/GeneralSection.tsx | 18 +- .../pages/themes/components/ThemeForm.tsx | 8 +- .../themes/context/CreateThemeProvider.tsx | 10 +- .../themes/context/EditThemeProvider.tsx | 10 +- .../src/entrypoints/options-page/router.tsx | 13 +- .../_main-world/spa-router/spa-router.ts | 19 +- .../thread/message-blocks/types.ts | 1 + .../thread/message-blocks/utils.ts | 16 +- .../src/plugins/__ui-groups__/_root/Misc.tsx | 13 - .../query-box/_context/scoped-store.ts | 22 -- .../comet-assistant/CometAssistant.tsx | 2 +- .../query-box/{_context => }/context.tsx | 17 +- .../elements/query-box/follow-up/FollowUp.tsx | 2 +- .../elements/query-box/main/Main.tsx | 2 +- .../elements/query-box/space/Space.tsx | 2 +- .../routes/Home/CometAffiliateDialog.tsx | 21 +- .../__ui-groups__/routes/Home/index.tsx | 14 +- .../Home/update-announcer/PostUpdateBadge.tsx | 73 ++++ .../UpdateAnnouncer.tsx} | 4 +- .../post-update-announcer.bg-worker.ts | 16 + .../hooks/useHookMobileTrigger.ts | 2 - .../comet-isolated-zoom/index.manifest.ts | 2 +- .../src/plugins/comet-isolated-zoom/loader.ts | 19 +- .../comet-isolated-zoom/settings-ui.tsx | 73 ++++ .../items/actions/ActionItems.tsx | 4 +- .../command-menu/pages/threads/Page.tsx | 1 - .../force-writing-mode/ForceWritingMode.tsx | 8 +- .../LanguageModelSelector.tsx | 2 +- .../components/desktop/LanguageModelGroup.tsx | 5 +- .../components/desktop/index.tsx | 2 +- .../components/mobile/LanguageModelGroup.tsx | 2 +- .../store/sync.loader.ts | 2 +- .../src/plugins/thread-artifacts/styles.css | 11 +- .../MirroredCodeBlockContext.tsx | 38 +- .../sticky-header.css | 4 + .../ThreadMessageTtsButton.tsx | 7 +- .../src/plugins/thread-toc/FloatingToggle.tsx | 39 --- .../src/plugins/thread-toc/ThreadToc.tsx | 129 ++----- .../src/plugins/thread-toc/TocMenuToggle.tsx | 37 ++ .../src/plugins/thread-toc/TocPanel.tsx | 101 ++++++ .../plugins/thread-toc/usePanelPosition.ts | 76 ++-- .../comet-affiliate/index.remote-resources.ts | 19 + .../dom-selectors/defaults.ts | 2 + .../dom-selectors/types.ts | 1 + .../features/content-script-utils/index.ts | 14 +- .../instant-css/browser-startup.bg-worker.ts | 10 - .../extension-settings/defaults.ts | 1 - .../extension-settings/types.ts | 1 - .../src/services/infra/query-client/utils.ts | 3 + pnpm-lock.yaml | 329 +++++++++--------- pnpm-workspace.yaml | 2 +- 100 files changed, 1121 insertions(+), 929 deletions(-) rename perplexity/extension/.cursor/commands/i18n.md => packages/i18n/README.md (95%) create mode 100644 perplexity/extension/changelogs/2.7.9.md delete mode 100644 perplexity/extension/src/components/PostUpdateReleaseNotesDialog.tsx create mode 100644 perplexity/extension/src/components/SponsorChannels.tsx delete mode 100644 perplexity/extension/src/components/SponsorDialogWrapper.tsx rename perplexity/extension/src/{ => entrypoints/options-page}/components/CometAffiliateCard.tsx (72%) create mode 100644 perplexity/extension/src/entrypoints/options-page/components/SponsorDialogWrapper.tsx delete mode 100644 perplexity/extension/src/entrypoints/options-page/dashboard/pages/release-notes/DirectReleaseNotesPage.tsx create mode 100644 perplexity/extension/src/entrypoints/options-page/dashboard/pages/release-notes/FullScreenReleaseNotesPage.tsx delete mode 100644 perplexity/extension/src/plugins/__ui-groups__/elements/query-box/_context/scoped-store.ts rename perplexity/extension/src/plugins/__ui-groups__/elements/query-box/{_context => }/context.tsx (58%) create mode 100644 perplexity/extension/src/plugins/__ui-groups__/routes/Home/update-announcer/PostUpdateBadge.tsx rename perplexity/extension/src/plugins/__ui-groups__/routes/Home/{HomepageUpdateAnnouncer.tsx => update-announcer/UpdateAnnouncer.tsx} (89%) create mode 100644 perplexity/extension/src/plugins/__ui-groups__/routes/Home/update-announcer/post-update-announcer.bg-worker.ts create mode 100644 perplexity/extension/src/plugins/comet-isolated-zoom/settings-ui.tsx delete mode 100644 perplexity/extension/src/plugins/thread-toc/FloatingToggle.tsx create mode 100644 perplexity/extension/src/plugins/thread-toc/TocMenuToggle.tsx create mode 100644 perplexity/extension/src/plugins/thread-toc/TocPanel.tsx create mode 100644 perplexity/extension/src/services/externals/cplx-api/remote-resources/comet-affiliate/index.remote-resources.ts delete mode 100644 perplexity/extension/src/services/features/instant-css/browser-startup.bg-worker.ts diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index eb3668435..7d7d8e226 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -11,17 +11,27 @@ body: id: version attributes: label: Version - description: Which version of the extension are you running? - placeholder: 0.0.1.0 + description: Which version of the extension are you using? + placeholder: 2.x.x ("Latest" is not an acceptable answer) validations: required: true - type: textarea id: bug-description attributes: label: Describe the bug - description: A clear and concise description of what the bug is. + description: A clear and concise description of what the bug is validations: required: true + - type: checkboxes + id: bug-confirm + attributes: + label: Bug confirmation + description: Make sure this is not a native bug from Perplexity.ai + options: + - label: I am not able to reproduce the issue with the extension disabled + required: true + - label: I have re-installed the extension and the issue persists + required: true - type: textarea id: reproduction-steps attributes: @@ -34,43 +44,39 @@ body: 4. See error validations: required: true - - type: checkboxes - id: bug-confirm - attributes: - label: Bug confirmation - description: Make sure this is not a native bug from Perplexity.ai - options: - - label: I am not able to reproduce the issue with the extension disabled - required: true - - label: I have re-installed the extension and the issue persists - required: true - - type: textarea id: expected-behavior attributes: label: Expected behavior - description: A clear and concise description of what you expected to happen. + description: A clear and concise description of what you expected to happen validations: required: true + - type: textarea + id: debug-logs + attributes: + label: Debug Logs + description: Include debug logs from the Settings Dashboard > Settings > Debug > Copy + validations: + required: false - type: textarea id: screenshots attributes: label: Screenshots - description: If applicable, add screenshots to help explain your problem. + description: If applicable, add screenshots to help explain your problem validations: required: false - type: input id: browser attributes: label: Browser - description: Provide the browser(s) and version(s) where the issue occurs. Please explicitly mention "mobile" if the issue occurs on mobile browsers. - placeholder: e.g. Google Chrome 128, Firefox Android 133 + description: Provide the browser(s) and version(s) where the issue occurs + placeholder: e.g. Google Chrome 140, Firefox Android 133, Comet 140, etc. validations: required: true - type: textarea id: additional-context attributes: label: Additional context - description: Add any other context about the problem here. + description: Add any other context about the problem here validations: required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index c4828069b..745f305b1 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,5 @@ blank_issues_enabled: true contact_links: - - name: Discuss your ideas/issues on Discord + - name: Get quick support on Discord url: https://discord.cplx.app - about: Get quick help from the community. \ No newline at end of file + about: Get quick help from the community. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index bb788b874..3c302ee7d 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -7,7 +7,7 @@ body: id: feature-description attributes: label: Feature Description - description: Provide a clear and concise description of the feature you'd like to see. + description: Provide a clear and concise description of the feature you'd like to see validations: required: true - type: textarea @@ -22,7 +22,7 @@ body: id: alternatives attributes: label: Alternatives Considered - description: Describe any alternative solutions or features you've considered. + description: Describe any alternative solutions or features you've considered placeholder: I've thought about... but... validations: required: false \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/translation_issues.yml b/.github/ISSUE_TEMPLATE/translation_issues.yml index 54eef44e4..1af2b612e 100644 --- a/.github/ISSUE_TEMPLATE/translation_issues.yml +++ b/.github/ISSUE_TEMPLATE/translation_issues.yml @@ -40,7 +40,7 @@ body: id: suggested-translation attributes: label: Suggested Translation - description: If you have a suggestion for the correct translation, please provide it here. + description: If you have a suggestion for the correct translation, please provide it here placeholder: Your suggested translation... validations: required: false @@ -48,7 +48,7 @@ body: id: context attributes: label: Context - description: Where did you find this translation? Please provide as much context as possible. + description: Where did you find this translation? Please provide as much context as possible placeholder: | - Location in the settings dashboard/perplexity.ai - Screenshot (if possible) diff --git a/packages/async-dep-manager/package.json b/packages/async-dep-manager/package.json index 0960e67fd..f8969770b 100644 --- a/packages/async-dep-manager/package.json +++ b/packages/async-dep-manager/package.json @@ -29,6 +29,6 @@ "tsup": "^8.5.0", "typescript": "catalog:types", "typescript-eslint": "catalog:lint", - "vitest": "^4.0.3" + "vitest": "^4.0.4" } } diff --git a/perplexity/extension/.cursor/commands/i18n.md b/packages/i18n/README.md similarity index 95% rename from perplexity/extension/.cursor/commands/i18n.md rename to packages/i18n/README.md index d070f14c6..1569cd721 100644 --- a/perplexity/extension/.cursor/commands/i18n.md +++ b/packages/i18n/README.md @@ -1,6 +1,6 @@ -# Internationalization (i18n) Guide +# Internationalization -This guide explains the key formatting options and component usage for translations in this project. +Custom implementation of internationalization (courtesy of [WebDevSimplified](https://www.youtube.com/watch?v=VbZVx13b2oY)). ## Formatting Types diff --git a/perplexity/extension/.cursor/commands/locale-string-extract.md b/perplexity/extension/.cursor/commands/locale-string-extract.md index d3aa4577a..03d55870f 100644 --- a/perplexity/extension/.cursor/commands/locale-string-extract.md +++ b/perplexity/extension/.cursor/commands/locale-string-extract.md @@ -1,9 +1,3 @@ ---- -description: -globs: -alwaysApply: false ---- - ## Task 1. Extract strings into the specified `{namespace}.{locale}.ts` locale file. @@ -15,36 +9,30 @@ alwaysApply: false ## IMPORTANT RESTRICTIONS: -- NEVER import any dependencies (`t` or `Trans`), they are globally available. +- NEVER import any dependencies (`t` or `Trans`), they are auto-imported and globally available. - ALWAYS use the `t(...)` function directly. -- NEVER import `t` because it is available globally (auto-imported). -- ONLY use `Trans` component for complex translations. -- DO NOT ask for confirmation - just do it. +- ONLY use `Trans` for translations with component placeholders. ## TRANSLATION SYNTAXES -### Normal string - ## Examples ```ts import type { LanguageMessages } from "@complexity/i18n"; export default { - pluginsPage: { - noPluginsFound: { - title: "No plugins found", - description: - "Try adjusting your search term/filters or <0>request a new one 😉", - }, + noPluginsFound: { + title: "No plugins found", + description: + "Try adjusting your search term/filters or <0>request a new one 😉", }, } as const satisfies LanguageMessages; ``` ```tsx -
{t("dashboard-plugins-page.pluginsPage.noPluginsFound.title")}
+
{t("noPluginsFound.title")}
!", + title: "Comet চেষ্টা করুন - একটি বিনামূল্যে <0/> সাবস্ক্রিপশন পান!", description: "Comet চেষ্টা করুন - Perplexity এর নতুন ব্রাউজার - এবং একটি বিনামূল্যে <0/> সাবস্ক্রিপশন পান এবং এর মধ্যে সরাসরি Complexity এর উন্নয়নে অবদান রাখুন।", claimButton: "এখনই দাবি করুন", diff --git a/perplexity/extension/src/_locales/common.cs-CZ.ts b/perplexity/extension/src/_locales/common.cs-CZ.ts index fbf59f871..e42d2cd44 100644 --- a/perplexity/extension/src/_locales/common.cs-CZ.ts +++ b/perplexity/extension/src/_locales/common.cs-CZ.ts @@ -11,7 +11,7 @@ export default { descriptionLine2: "Pokud Complexity přináší hodnotu do vašeho pracovního postupu, zvažte prosím příspěvek na jeho budoucnost!", cometAffiliate: { - title: "Zdarma <0/>!", + title: "Vyzkoušejte Comet - Získejte bezplatné předplatné <0/>!", description: "Vyzkoušejte Comet - nový prohlížeč od Perplexity - a získejte bezplatné předplatné <0/> a zároveň přímo přispějte k vývoji Complexity.", claimButton: "Získat nyní", diff --git a/perplexity/extension/src/_locales/common.de-DE.ts b/perplexity/extension/src/_locales/common.de-DE.ts index 83a8b2984..d992e71e5 100644 --- a/perplexity/extension/src/_locales/common.de-DE.ts +++ b/perplexity/extension/src/_locales/common.de-DE.ts @@ -11,7 +11,8 @@ export default { descriptionLine2: "Wenn Complexity Ihren Arbeitsablauf bereichert, erwägen Sie bitte, zu seiner Zukunft beizutragen!", cometAffiliate: { - title: "Kostenlos <0/>!", + title: + "Probieren Sie Comet aus - Erhalten Sie ein kostenloses <0/>-Abonnement!", description: "Probieren Sie Comet aus - einen neuen Browser von Perplexity - und erhalten Sie ein kostenloses <0/>-Abonnement und tragen gleichzeitig direkt zur Entwicklung von Complexity bei.", claimButton: "Jetzt beanspruchen", diff --git a/perplexity/extension/src/_locales/common.el-GR.ts b/perplexity/extension/src/_locales/common.el-GR.ts index 3b01eb715..cf0b7ad11 100644 --- a/perplexity/extension/src/_locales/common.el-GR.ts +++ b/perplexity/extension/src/_locales/common.el-GR.ts @@ -11,7 +11,7 @@ export default { descriptionLine2: "Αν το Complexity προσθέτει αξία στη ροή εργασίας σας, παρακαλώ σκεφτείτε να συνεισφέρετε στο μέλλον του!", cometAffiliate: { - title: "Δωρεάν <0/>!", + title: "Δοκιμάστε το Comet - Λάβετε δωρεάν <0/> abonnement!", description: "Δοκιμάστε το Comet - ένα νέο πρόγραμμα περιήγησης από το Perplexity - και λάβετε ένα δωρεάν <0/> abonnement ενώ συγχρόνως συνεισφέρετε άμεσα στην ανάπτυξη του Complexity.", claimButton: "Διεκδικήστε το τώρα", diff --git a/perplexity/extension/src/_locales/common.en-US.ts b/perplexity/extension/src/_locales/common.en-US.ts index 66ac4469f..812663229 100644 --- a/perplexity/extension/src/_locales/common.en-US.ts +++ b/perplexity/extension/src/_locales/common.en-US.ts @@ -11,7 +11,7 @@ export default { descriptionLine2: "If Complexity adds value to your workflow, please consider contributing to its future!", cometAffiliate: { - title: "Free <0/>!", + title: "Try Comet - Get a free <0/> subscription!", description: "Try out Comet - a new browser from Perplexity - and get a free <0/> subscription and meanwhile directly contribute to the development of Complexity.", claimButton: "Claim it now", diff --git a/perplexity/extension/src/_locales/common.es-ES.ts b/perplexity/extension/src/_locales/common.es-ES.ts index 8b136a01b..1e9afd1a5 100644 --- a/perplexity/extension/src/_locales/common.es-ES.ts +++ b/perplexity/extension/src/_locales/common.es-ES.ts @@ -11,7 +11,7 @@ export default { descriptionLine2: "Si Complexity aporta valor a tu flujo de trabajo, ¡considera contribuir a su futuro!", cometAffiliate: { - title: "¡Gratis <0/>!", + title: "Prueba Comet - ¡Obtén una suscripción <0/> gratuita!", description: "Prueba Comet - el nuevo navegador de Perplexity - y obtén una suscripción <0/> gratuita y contribuye directamente al desarrollo de Complexity.", claimButton: "Reclamarlo ahora", diff --git a/perplexity/extension/src/_locales/common.fr-FR.ts b/perplexity/extension/src/_locales/common.fr-FR.ts index 54c2669bb..9aa333e6f 100644 --- a/perplexity/extension/src/_locales/common.fr-FR.ts +++ b/perplexity/extension/src/_locales/common.fr-FR.ts @@ -11,7 +11,7 @@ export default { descriptionLine2: "Si Complexity ajoute de la valeur à votre flux de travail, merci d'envisager de contribuer à son avenir !", cometAffiliate: { - title: "Gratuit <0/>!", + title: "Essayez Comet - Obtenez un abonnement <0/> gratuit!", description: "Essayez Comet - le nouveau navigateur de Perplexity - et obtenez un abonnement <0/> gratuit et contribuez directement au développement de Complexity.", claimButton: "Réclamez-le maintenant", diff --git a/perplexity/extension/src/_locales/common.hi-IN.ts b/perplexity/extension/src/_locales/common.hi-IN.ts index ff035c3c7..bc6bc8b87 100644 --- a/perplexity/extension/src/_locales/common.hi-IN.ts +++ b/perplexity/extension/src/_locales/common.hi-IN.ts @@ -11,7 +11,7 @@ export default { descriptionLine2: "यदि Complexity आपके workflow में मूल्य जोड़ता है, तो कृपया इसके भविष्य में योगदान देने पर विचार करें!", cometAffiliate: { - title: "मुफ्त <0/>!", + title: "Comet आजमाएं - एक मुफ्त <0/> सदस्यता प्राप्त करें!", description: "Comet आजमाएं - Perplexity का नया ब्राउज़र - और एक मुफ्त <0/> सदस्यता प्राप्त करें और इस बीच Complexity के विकास में सीधे योगदान करें।", claimButton: "अभी दावा करें", diff --git a/perplexity/extension/src/_locales/common.hr-HR.ts b/perplexity/extension/src/_locales/common.hr-HR.ts index a4158e0cc..7ab69c617 100644 --- a/perplexity/extension/src/_locales/common.hr-HR.ts +++ b/perplexity/extension/src/_locales/common.hr-HR.ts @@ -12,7 +12,7 @@ export default { descriptionLine2: "Ako Complexity dodaje vrijednost vašem tijeku rada, razmislite o doprinosu njegovoj budućnosti!", cometAffiliate: { - title: "Besplatno <0/>!", + title: "Isprobajte Comet - Dobijte besplatnu <0/> pretplatu!", description: "Isprobajte Comet - novi preglednik od Perplexityja - i dobijte besplatnu <0/> pretplatu i istovremeno izravno doprinijeti razvoju Complexityja.", claimButton: "Zatražite sada", diff --git a/perplexity/extension/src/_locales/common.hu-HU.ts b/perplexity/extension/src/_locales/common.hu-HU.ts index 386326bec..11372706d 100644 --- a/perplexity/extension/src/_locales/common.hu-HU.ts +++ b/perplexity/extension/src/_locales/common.hu-HU.ts @@ -11,7 +11,7 @@ export default { descriptionLine2: "Ha a Complexity értéket ad a munkafolyamatodhoz, kérjük, fontold meg a jövőjének támogatását!", cometAffiliate: { - title: "Ingyenes <0/>!", + title: "Próbáld ki a Comet-et - Szerezz ingyenes <0/> előfizetést!", description: "Próbáld ki a Comet-et - a Perplexity új böngészőjét - és szerezz ingyenes <0/> előfizetést, miközben közvetlenül hozzájárulsz a Complexity fejlesztéséhez.", claimButton: "Igényelj most", diff --git a/perplexity/extension/src/_locales/common.id-ID.ts b/perplexity/extension/src/_locales/common.id-ID.ts index 351cbcd58..cde02876f 100644 --- a/perplexity/extension/src/_locales/common.id-ID.ts +++ b/perplexity/extension/src/_locales/common.id-ID.ts @@ -11,7 +11,7 @@ export default { descriptionLine2: "Jika Complexity menambah nilai pada alur kerja Anda, mohon pertimbangkan untuk berkontribusi pada masa depannya!", cometAffiliate: { - title: "Gratis <0/>!", + title: "Coba Comet - Dapatkan langganan <0/> gratis!", description: "Coba Comet - browser baru dari Perplexity - dan dapatkan langganan <0/> gratis dan sementara itu berkontribusi langsung pada pengembangan Complexity.", claimButton: "Klaim sekarang", diff --git a/perplexity/extension/src/_locales/common.it-IT.ts b/perplexity/extension/src/_locales/common.it-IT.ts index 5a209089d..b140050ab 100644 --- a/perplexity/extension/src/_locales/common.it-IT.ts +++ b/perplexity/extension/src/_locales/common.it-IT.ts @@ -11,7 +11,7 @@ export default { descriptionLine2: "Se Complexity aggiunge valore al tuo flusso di lavoro, considera di contribuire al suo futuro!", cometAffiliate: { - title: "Gratuito <0/>!", + title: "Prova Comet - Ottieni un abbonamento <0/> gratuito!", description: "Prova Comet - il nuovo browser di Perplexity - e ottieni un abbonamento <0/> gratuito e contribuisci direttamente allo sviluppo di Complexity.", claimButton: "Richiedi ora", diff --git a/perplexity/extension/src/_locales/common.ja-JP.ts b/perplexity/extension/src/_locales/common.ja-JP.ts index 444cfcaaf..46abfce2a 100644 --- a/perplexity/extension/src/_locales/common.ja-JP.ts +++ b/perplexity/extension/src/_locales/common.ja-JP.ts @@ -11,7 +11,7 @@ export default { descriptionLine2: "Complexityがあなたのワークフローに価値をもたらしているなら、今後の発展のためにご支援をお願いします!", cometAffiliate: { - title: "無料 <0/>!", + title: "Cometを試して、無料の<0/>サブスクリプションを取得!", description: "Perplexityの新しいブラウザであるCometを試して、無料の<0/>サブスクリプションを取得し、同時にComplexityの開発に直接貢献してください。", claimButton: "今すぐ受け取る", diff --git a/perplexity/extension/src/_locales/common.ko-KR.ts b/perplexity/extension/src/_locales/common.ko-KR.ts index 0745b720a..3d3fc85e1 100644 --- a/perplexity/extension/src/_locales/common.ko-KR.ts +++ b/perplexity/extension/src/_locales/common.ko-KR.ts @@ -11,7 +11,7 @@ export default { descriptionLine2: "Complexity가 여러분의 워크플로우에 가치를 더한다면, 미래를 위해 기여해 주세요!", cometAffiliate: { - title: "무료 <0/>!", + title: "Comet을 시도하세요 - 무료 <0/> 구독을 받으세요!", description: "Perplexity의 새로운 브라우저인 Comet을 시도하고 무료 <0/> 구독을 얻으면서 동시에 Complexity 개발에 직접 기여하세요.", claimButton: "지금 받기", diff --git a/perplexity/extension/src/_locales/common.nl-NL.ts b/perplexity/extension/src/_locales/common.nl-NL.ts index 912707c75..74fa1d48f 100644 --- a/perplexity/extension/src/_locales/common.nl-NL.ts +++ b/perplexity/extension/src/_locales/common.nl-NL.ts @@ -11,7 +11,7 @@ export default { descriptionLine2: "Als Complexity waarde toevoegt aan je workflow, overweeg dan om bij te dragen aan de toekomst ervan!", cometAffiliate: { - title: "Gratis <0/>!", + title: "Probeer Comet - Krijg een gratis <0/>-abonnement!", description: "Probeer Comet - een nieuwe browser van Perplexity - en krijg een gratis <0/>-abonnement en draag ondertussen direct bij aan de ontwikkeling van Complexity.", claimButton: "Claim het nu", diff --git a/perplexity/extension/src/_locales/common.pl-PL.ts b/perplexity/extension/src/_locales/common.pl-PL.ts index 05f759998..a807d5cb1 100644 --- a/perplexity/extension/src/_locales/common.pl-PL.ts +++ b/perplexity/extension/src/_locales/common.pl-PL.ts @@ -11,7 +11,7 @@ export default { descriptionLine2: "Jeśli Complexity wnosi wartość do Twojego workflow, rozważ wsparcie jego przyszłości!", cometAffiliate: { - title: "Bezpłatnie <0/>!", + title: "Spróbuj Comet - Zdobądź darmową subskrypcję <0/>!", description: "Spróbuj Comet - nową przeglądarkę od Perplexity - i zdobądź darmową subskrypcję <0/> i jednocześnie bezpośrednio przyczynij się do rozwoju Complexity.", claimButton: "Odbierz teraz", diff --git a/perplexity/extension/src/_locales/common.pt-BR.ts b/perplexity/extension/src/_locales/common.pt-BR.ts index 123045e03..dba029163 100644 --- a/perplexity/extension/src/_locales/common.pt-BR.ts +++ b/perplexity/extension/src/_locales/common.pt-BR.ts @@ -11,7 +11,7 @@ export default { descriptionLine2: "Se o Complexity agrega valor ao seu fluxo de trabalho, por favor, considere contribuir para o seu futuro!", cometAffiliate: { - title: "Grátis <0/>!", + title: "Experimente Comet - Ganhe uma assinatura <0/> gratuita!", description: "Experimente Comet - um novo navegador da Perplexity - e ganhe uma assinatura <0/> gratuita e, enquanto isso, contribua diretamente para o desenvolvimento do Complexity.", claimButton: "Reivindique agora", diff --git a/perplexity/extension/src/_locales/common.pt-PT.ts b/perplexity/extension/src/_locales/common.pt-PT.ts index f273ad8b6..52e8cf428 100644 --- a/perplexity/extension/src/_locales/common.pt-PT.ts +++ b/perplexity/extension/src/_locales/common.pt-PT.ts @@ -11,7 +11,7 @@ export default { descriptionLine2: "Se o Complexity acrescenta valor ao seu fluxo de trabalho, por favor considere contribuir para o seu futuro!", cometAffiliate: { - title: "Grátis <0/>!", + title: "Experimente Comet - Obtenha uma subscrição <0/> gratuita!", description: "Experimente Comet - um novo navegador da Perplexity - e obtenha uma subscrição <0/> gratuita e, enquanto isso, contribua diretamente para o desenvolvimento do Complexity.", claimButton: "Reivindique agora", diff --git a/perplexity/extension/src/_locales/common.ro-RO.ts b/perplexity/extension/src/_locales/common.ro-RO.ts index 214dd1c11..a76a2f447 100644 --- a/perplexity/extension/src/_locales/common.ro-RO.ts +++ b/perplexity/extension/src/_locales/common.ro-RO.ts @@ -11,7 +11,7 @@ export default { descriptionLine2: "Dacă Complexity adaugă valoare fluxului dvs. de lucru, vă rugăm să luați în considerare contribuția la viitorul său!", cometAffiliate: { - title: "Gratuit <0/>!", + title: "Încercați Comet - Obțineți un abonament gratuit <0/>!", description: "Încercați Comet - noul browser de la Perplexity - și obțineți un abonament gratuit <0/> și în același timp contribuiți direct la dezvoltarea Complexity.", claimButton: "Revendicați acum", diff --git a/perplexity/extension/src/_locales/common.ru-RU.ts b/perplexity/extension/src/_locales/common.ru-RU.ts index 5f547e1d5..0555daae2 100644 --- a/perplexity/extension/src/_locales/common.ru-RU.ts +++ b/perplexity/extension/src/_locales/common.ru-RU.ts @@ -11,7 +11,7 @@ export default { descriptionLine2: "Если Complexity добавляет ценность в ваш рабочий процесс, пожалуйста, рассмотрите возможность внести свой вклад в его будущее!", cometAffiliate: { - title: "Бесплатно <0/>!", + title: "Попробуйте Comet - Получите бесплатную подписку на <0/>!", description: "Попробуйте Comet - новый браузер от Perplexity - и получите бесплатную подписку на <0/> и одновременно напрямую внесите вклад в развитие Complexity.", claimButton: "Получить сейчас", diff --git a/perplexity/extension/src/_locales/common.sk-SK.ts b/perplexity/extension/src/_locales/common.sk-SK.ts index 540c8de2b..be5c2a0f1 100644 --- a/perplexity/extension/src/_locales/common.sk-SK.ts +++ b/perplexity/extension/src/_locales/common.sk-SK.ts @@ -11,7 +11,7 @@ export default { descriptionLine2: "Ak Complexity pridáva hodnotu vášmu pracovnému postupu, zvážte, prosím, príspevok na jeho budúcnosť!", cometAffiliate: { - title: "Bezplatne <0/>!", + title: "Vyskúšajte Comet - Získajte bezplatné predplatné <0/>!", description: "Vyskúšajte Comet - nový prehliadač od Perplexity - a získajte bezplatné predplatné <0/> a zároveň priamo prispejte k vývoju Complexity.", claimButton: "Získať teraz", diff --git a/perplexity/extension/src/_locales/common.sr-Cyrl-ME.ts b/perplexity/extension/src/_locales/common.sr-Cyrl-ME.ts index 6bbbbdf86..e92a6878e 100644 --- a/perplexity/extension/src/_locales/common.sr-Cyrl-ME.ts +++ b/perplexity/extension/src/_locales/common.sr-Cyrl-ME.ts @@ -12,7 +12,7 @@ export default { descriptionLine2: "Ako Complexity dodaje vrednost vašem toku rada, razmislite o doprinosu njegovoj budućnosti!", cometAffiliate: { - title: "Бесплатно <0/>!", + title: "Испробајте Comet - Добијте бесплатну <0/> претплату!", description: "Испробајте Comet - нов веб-прегледач од Перплексити - и добијте бесплатну <0/> претплату и истовремено директно допринесите развоју Complexity-а.", claimButton: "Преузмите сада", diff --git a/perplexity/extension/src/_locales/common.zh-CN.ts b/perplexity/extension/src/_locales/common.zh-CN.ts index efca87ea9..107def613 100644 --- a/perplexity/extension/src/_locales/common.zh-CN.ts +++ b/perplexity/extension/src/_locales/common.zh-CN.ts @@ -11,7 +11,7 @@ export default { descriptionLine2: "如果Complexity为您的工作流程带来价值,请考虑为它的未来贡献一份力量!", cometAffiliate: { - title: "免费 <0/>!", + title: "尝试 Comet - 获得免费 <0/> 订阅!", description: "尝试 Comet - Perplexity 推出的全新浏览器 - 获得免费 <0/> 订阅,同时直接为 Complexity 的开发做出贡献。", claimButton: "立即领取", diff --git a/perplexity/extension/src/_locales/common.zh-TW.ts b/perplexity/extension/src/_locales/common.zh-TW.ts index 79ce8f192..c9821ea45 100644 --- a/perplexity/extension/src/_locales/common.zh-TW.ts +++ b/perplexity/extension/src/_locales/common.zh-TW.ts @@ -11,7 +11,7 @@ export default { descriptionLine2: "如果 Complexity 為您的工作流程帶來價值,請考慮為它的未來貢獻一份心力!", cometAffiliate: { - title: "免費 <0/>!", + title: "試試 Comet - 取得免費 <0/> 訂閱!", description: "試試 Comet - Perplexity 推出的全新瀏覽器 - 取得免費 <0/> 訂閱,同時直接為 Complexity 的開發做出貢獻。", claimButton: "立即領取", diff --git a/perplexity/extension/src/auto-imports-config.ts b/perplexity/extension/src/auto-imports-config.ts index 154b9f011..62f80311d 100644 --- a/perplexity/extension/src/auto-imports-config.ts +++ b/perplexity/extension/src/auto-imports-config.ts @@ -6,7 +6,14 @@ const unimportConfig: Partial = { "react", { from: "react", - imports: ["createContext", "lazy", "memo", "use", "useDeferredValue"], + imports: [ + "createContext", + "lazy", + "memo", + "use", + "useDeferredValue", + "useEffectEvent", + ], }, { from: "@complexity/i18n", diff --git a/perplexity/extension/src/auto-imports.d.ts b/perplexity/extension/src/auto-imports.d.ts index 1ef029e60..3e5900d5a 100644 --- a/perplexity/extension/src/auto-imports.d.ts +++ b/perplexity/extension/src/auto-imports.d.ts @@ -10,6 +10,7 @@ declare global { useContext, useDeferredValue, useEffect, + useEffectEvent, useMemo, useReducer, useRef, diff --git a/perplexity/extension/src/components/ExtensionUpdateInfoDialogWrapper.tsx b/perplexity/extension/src/components/ExtensionUpdateInfoDialogWrapper.tsx index c1d6e9f1d..e7fa6312e 100644 --- a/perplexity/extension/src/components/ExtensionUpdateInfoDialogWrapper.tsx +++ b/perplexity/extension/src/components/ExtensionUpdateInfoDialogWrapper.tsx @@ -7,17 +7,16 @@ import { DialogContent, DialogDescription, DialogHeader, + DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Image } from "@/components/ui/image"; -import { toast } from "@/components/ui/use-toast"; import { cplxApiQueries } from "@/services/externals/cplx-api/query-keys"; import { CplxVersionsService } from "@/services/externals/cplx-api/remote-resources/versions"; import { ContentScriptBgUtilsService } from "@/services/features/content-script-utils/service-init.bg-worker"; import TablerArrowRight from "~icons/tabler/arrow-right"; -import TablerExternalLink from "~icons/tabler/external-link"; -import TablerInfoCircle from "~icons/tabler/info-circle"; +import TablerArrowUpRight from "~icons/tabler/arrow-up-right"; export default function ExtensionUpdateInfoDialogWrapper({ children, @@ -44,50 +43,44 @@ export default function ExtensionUpdateInfoDialogWrapper({ {children} - - A new version of the extension is available! + + + A new version of the extension is available! + - Please update to receive enhancements and bug fixes. - -
-
-
{APP_CONFIG.VERSION}
- -
- {latestVersion} +
Please update to receive enhancements and bug fixes.
+
+
+
{APP_CONFIG.VERSION}
+ +
{ + void ContentScriptBgUtilsService.Instance.openFullScreenReleaseNotes( + { + version: latestVersionWithChangelog, + }, + ); + }} + > +
{latestVersion}
+ +
-
- -
{ - if (!latestVersion) return; - void ContentScriptBgUtilsService.Instance.openDirectReleaseNotes({ - version: latestVersionWithChangelog, - }); - }} - > - Release Notes - -
- -
-
- - +
+
The upgrade should be happening automatically when you restart - the browser, or force it to manually update in the{" "} + the browser, or force it to manually update in{" "} {APP_CONFIG.BROWSER === "firefox" ? ( - => Complexity + => Complexity. ) : ( - "." + ` (remember to turn on Developer mode).` )} - -
+
+
extension-management-page
-
- Or click{" "} - - HERE - {" "} - to revisit the store and manually reinstall the extension if none - of the above works (remember to export your settings!). -
-
+
); @@ -129,15 +105,7 @@ function ExtensionManagementPageLink() { role="link" className="x:inline-block x:cursor-pointer x:text-primary x:underline" onClick={() => { - if (APP_CONFIG.BROWSER === "chrome") { - void navigator.clipboard.writeText("chrome://extensions"); - } else { - void navigator.clipboard.writeText("about:addons"); - } - toast({ - title: "✅ Link copied to clipboard", - description: "Please manually open the copied link.", - }); + void ContentScriptBgUtilsService.Instance.openExtensionsManagementPage(); }} > {APP_CONFIG.BROWSER === "chrome" ? "chrome://extensions" : "about:addons"} diff --git a/perplexity/extension/src/components/PostUpdateReleaseNotesDialog.tsx b/perplexity/extension/src/components/PostUpdateReleaseNotesDialog.tsx deleted file mode 100644 index 03d369786..000000000 --- a/perplexity/extension/src/components/PostUpdateReleaseNotesDialog.tsx +++ /dev/null @@ -1,108 +0,0 @@ -import { useQuery } from "@tanstack/react-query"; - -import { APP_CONFIG } from "@/app.config"; -import ChangelogRenderer from "@/components/changelog/ChangelogRenderer"; -import { Button } from "@/components/ui/button"; -import { - Dialog, - DialogClose, - DialogContent, - DialogFooter, - DialogHeader, - DialogTitle, - DialogTrigger, -} from "@/components/ui/dialog"; -import { cplxApiQueries } from "@/services/externals/cplx-api/query-keys"; -import { ExtensionSettingsService } from "@/services/infra/extension-api-wrappers/extension-settings"; - -export function PostUpdateReleaseNotesDialog() { - const [open, setOpen] = useState(true); - - const { - data: changelog, - isLoading, - isError, - } = useQuery( - cplxApiQueries.changelog.detail({ - version: APP_CONFIG.VERSION, - }), - ); - - useEffect(() => { - void ExtensionSettingsService.set((draft) => { - draft.isPostUpdateReleaseNotesPopupDismissed = true; - }); - }, []); - - if (isLoading || isError || !changelog) return null; - - return ( - setOpen(open)}> - - - - {t("common.releaseNotes.title", { version: APP_CONFIG.VERSION })} - - - - - { - void ExtensionSettingsService.set((draft) => { - draft.showPostUpdateReleaseNotesPopup = false; - draft.isPostUpdateReleaseNotesPopupDismissed = true; - }); - setOpen(false); - }} - > - - - - - - - - - ); -} - -function DontShowAgainForFutureUpdatesConfirmDialog({ - children, - onConfirm, -}: { - children: React.ReactNode; - onConfirm: () => void; -}) { - return ( - - {children} - - - - {t("common.releaseNotes.confirmDialog.title")} - - - -
- {t("common.releaseNotes.confirmDialog.message")} -
- - - - - - - - - -
-
- ); -} diff --git a/perplexity/extension/src/components/SponsorChannels.tsx b/perplexity/extension/src/components/SponsorChannels.tsx new file mode 100644 index 000000000..ab02e6ecd --- /dev/null +++ b/perplexity/extension/src/components/SponsorChannels.tsx @@ -0,0 +1,57 @@ +import { Button } from "@/components/ui/button"; + +import Fa7BrandsPaypal from "~icons/fa7-brands/paypal"; +import SimpleIconsKofi from "~icons/simple-icons/kofi"; +import TablerMail from "~icons/tabler/mail"; + +export default function SponsorChannels() { + return ( + <> +
+
+ {t("common.sponsorDialog.donation.title")} +
+ +
+
+
+ {t("common.sponsorDialog.sponsorship.title")} +
+ +
+ + ); +} diff --git a/perplexity/extension/src/components/SponsorDialogWrapper.tsx b/perplexity/extension/src/components/SponsorDialogWrapper.tsx deleted file mode 100644 index d77a9434c..000000000 --- a/perplexity/extension/src/components/SponsorDialogWrapper.tsx +++ /dev/null @@ -1,114 +0,0 @@ -import PplxPro from "@/components/icons/PplxPro"; -import { Button } from "@/components/ui/button"; -import { - Dialog, - DialogContent, - DialogDescription, - DialogHeader, - DialogTitle, - DialogTrigger, -} from "@/components/ui/dialog"; -import { useIsMobileStore } from "@/hooks/is-mobile-store"; - -import Fa7BrandsPaypal from "~icons/fa7-brands/paypal"; -import SimpleIconsKofi from "~icons/simple-icons/kofi"; -import TablerLink from "~icons/tabler/link"; -import TablerMail from "~icons/tabler/mail"; - -export default function SponsorDialogWrapper({ - children, -}: { - children: React.ReactNode; -}) { - return ( - - {children} - -
- - - - {t("common.sponsorDialog.title")} - - -
-
{t("common.sponsorDialog.description")}
-
{t("common.sponsorDialog.descriptionLine2")}
-
-
-
- -
-
- , - ]} - /> -
- -
- -
-
- {t("common.sponsorDialog.donation.title")} -
- -
- - - -
- ); -} diff --git a/perplexity/extension/src/components/ui/command.tsx b/perplexity/extension/src/components/ui/command.tsx index eeb167c9d..cd98ff1e9 100644 --- a/perplexity/extension/src/components/ui/command.tsx +++ b/perplexity/extension/src/components/ui/command.tsx @@ -2,7 +2,6 @@ import { Slot } from "@radix-ui/react-slot"; import { Command as CommandPrimitive } from "cmdk"; import type { ComponentProps } from "react"; import * as React from "react"; -import { useEffect } from "react"; import type { DialogProps } from "@/components/ui/dialog"; import { Dialog, DialogContent } from "@/components/ui/dialog"; diff --git a/perplexity/extension/src/components/ui/use-toast.ts b/perplexity/extension/src/components/ui/use-toast.ts index bd36722ae..a4a6b0386 100644 --- a/perplexity/extension/src/components/ui/use-toast.ts +++ b/perplexity/extension/src/components/ui/use-toast.ts @@ -177,18 +177,19 @@ export function toast({ ...props }: Toast) { export function useToast() { const [state, setState] = useState(memoryState); - useEffect( - function () { - listeners.push(setState); - return function () { - const index = listeners.indexOf(setState); - if (index > -1) { - listeners.splice(index, 1); - } - }; - }, - [state], - ); + const registerListener = useEffectEvent(() => { + listeners.push(setState); + return function () { + const index = listeners.indexOf(setState); + if (index > -1) { + listeners.splice(index, 1); + } + }; + }); + + useEffect(() => { + return registerListener(); + }, []); return { ...state, diff --git a/perplexity/extension/src/components/CometAffiliateCard.tsx b/perplexity/extension/src/entrypoints/options-page/components/CometAffiliateCard.tsx similarity index 72% rename from perplexity/extension/src/components/CometAffiliateCard.tsx rename to perplexity/extension/src/entrypoints/options-page/components/CometAffiliateCard.tsx index 896b7df5e..d3df47baf 100644 --- a/perplexity/extension/src/components/CometAffiliateCard.tsx +++ b/perplexity/extension/src/entrypoints/options-page/components/CometAffiliateCard.tsx @@ -1,10 +1,22 @@ import { CometCard } from "@/components/CometCard"; import PplxComet from "@/components/icons/PplxComet"; import PplxPro from "@/components/icons/PplxPro"; +import { persistentQueryClient } from "@/entrypoints/options-page/persistent-query-client"; +import { cometAffiliateRemoteResourceConfig } from "@/services/externals/cplx-api/remote-resources/comet-affiliate/index.remote-resources"; +import { getRemoteResource } from "@/services/externals/cplx-api/remote-resources/utils"; import TablerLink from "~icons/tabler/link"; +const cometAffiliateConfigPromise = getRemoteResource( + cometAffiliateRemoteResourceConfig, + persistentQueryClient, +); + export default function CometAffiliateCard() { + const cometAffiliateConfig = use(cometAffiliateConfigPromise); + + if (!cometAffiliateConfig.enabled) return null; + return (
@@ -16,7 +28,7 @@ export default function CometAffiliateCard() { transform: "none", opacity: 1, }} - href="https://pplx.ai/pnd280" + href={`https://${cometAffiliateConfig.link}`} target="_blank" rel="noopener noreferrer" > @@ -35,7 +47,9 @@ export default function CometAffiliateCard() {
-  pplx.ai/pnd280 + +  {cometAffiliateConfig.link} +
diff --git a/perplexity/extension/src/entrypoints/options-page/components/SponsorDialogWrapper.tsx b/perplexity/extension/src/entrypoints/options-page/components/SponsorDialogWrapper.tsx new file mode 100644 index 000000000..36c0ee85a --- /dev/null +++ b/perplexity/extension/src/entrypoints/options-page/components/SponsorDialogWrapper.tsx @@ -0,0 +1,76 @@ +import PplxPro from "@/components/icons/PplxPro"; +import SponsorChannels from "@/components/SponsorChannels"; +import { Button } from "@/components/ui/button"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog"; +import { persistentQueryClient } from "@/entrypoints/options-page/persistent-query-client"; +import { useIsMobileStore } from "@/hooks/is-mobile-store"; +import { cometAffiliateRemoteResourceConfig } from "@/services/externals/cplx-api/remote-resources/comet-affiliate/index.remote-resources"; +import { getRemoteResource } from "@/services/externals/cplx-api/remote-resources/utils"; + +import TablerLink from "~icons/tabler/link"; + +const cometAffiliateConfig = await getRemoteResource( + cometAffiliateRemoteResourceConfig, + persistentQueryClient, +); + +export default function SponsorDialogWrapper({ + children, +}: { + children: React.ReactNode; +}) { + return ( + + {children} + +
+ + + + {t("common.sponsorDialog.title")} + + +
+
{t("common.sponsorDialog.description")}
+
{t("common.sponsorDialog.descriptionLine2")}
+
+
+ {cometAffiliateConfig.enabled && ( +
+
+ , + ]} + /> +
+ +
+ )} + + +
+
+
+ +
+ ); +} diff --git a/perplexity/extension/src/entrypoints/options-page/components/sidebar/Sidebar.tsx b/perplexity/extension/src/entrypoints/options-page/components/sidebar/Sidebar.tsx index 906f16ad0..778d5e050 100644 --- a/perplexity/extension/src/entrypoints/options-page/components/sidebar/Sidebar.tsx +++ b/perplexity/extension/src/entrypoints/options-page/components/sidebar/Sidebar.tsx @@ -1,12 +1,12 @@ -import type { ComponentProps } from "react"; +import { Suspense, type ComponentProps } from "react"; import { NavLink, useMatch } from "react-router-dom"; -import CometAffiliateCard from "@/components/CometAffiliateCard"; -import SponsorDialogWrapper from "@/components/SponsorDialogWrapper"; +import CometAffiliateCard from "@/entrypoints/options-page/components/CometAffiliateCard"; import { type NavItem } from "@/entrypoints/options-page/components/sidebar/nav-items"; import { useOptionsPageSidebarStore } from "@/entrypoints/options-page/components/sidebar/store"; import Version from "@/entrypoints/options-page/components/sidebar/Version"; import SidebarUpdateAnnouncer from "@/entrypoints/options-page/components/SidebarUpdateAnnouncer"; +import SponsorDialogWrapper from "@/entrypoints/options-page/components/SponsorDialogWrapper"; import TablerChevronDown from "~icons/tabler/chevron-down"; import TablerChevronRight from "~icons/tabler/chevron-right"; @@ -98,7 +98,9 @@ export default function Sidebar() {
- + + + diff --git a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/release-notes/DirectReleaseNotesPage.tsx b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/release-notes/DirectReleaseNotesPage.tsx deleted file mode 100644 index fb1ae4b15..000000000 --- a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/release-notes/DirectReleaseNotesPage.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { useQuery } from "@tanstack/react-query"; -import { useLoaderData } from "react-router-dom"; - -import ChangelogRenderer from "@/components/changelog/ChangelogRenderer"; -import LoadingOverlay from "@/components/LoadingOverlay"; -import { H1, H2 } from "@/components/ui/typography"; -import { cplxApiQueries } from "@/services/externals/cplx-api/query-keys"; - -export function DirectReleaseNotesPage() { - const { version } = useLoaderData() as { version: string }; - - const { - data: changelog, - isLoading, - isError, - } = useQuery({ - ...cplxApiQueries.changelog.detail({ - version: version, - }), - }); - - if (isLoading) return ; - - return ( -
-

Release Notes

-

- v{version} -

- {changelog && } - {(!changelog || isError) && ( -
-

No changelog found for this version

-

- This version may not have any changelog. -

-
- )} -
- ); -} diff --git a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/release-notes/FullScreenReleaseNotesPage.tsx b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/release-notes/FullScreenReleaseNotesPage.tsx new file mode 100644 index 000000000..1774deee6 --- /dev/null +++ b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/release-notes/FullScreenReleaseNotesPage.tsx @@ -0,0 +1,93 @@ +import { useQuery } from "@tanstack/react-query"; +import { useLoaderData } from "react-router-dom"; + +import ChangelogRenderer from "@/components/changelog/ChangelogRenderer"; +import PplxPro from "@/components/icons/PplxPro"; +import SponsorChannels from "@/components/SponsorChannels"; +import { Button } from "@/components/ui/button"; +import { Skeleton } from "@/components/ui/skeleton"; +import { H2 } from "@/components/ui/typography"; +import { persistentQueryClient } from "@/entrypoints/options-page/persistent-query-client"; +import { cplxApiQueries } from "@/services/externals/cplx-api/query-keys"; +import { cometAffiliateRemoteResourceConfig } from "@/services/externals/cplx-api/remote-resources/comet-affiliate/index.remote-resources"; +import { getRemoteResource } from "@/services/externals/cplx-api/remote-resources/utils"; + +import TablerLink from "~icons/tabler/link"; + +const cometAffiliateConfig = await getRemoteResource( + cometAffiliateRemoteResourceConfig, + persistentQueryClient, +); + +export function FullScreenReleaseNotesPage() { + const { version } = useLoaderData() as { version: string }; + + const { data, isLoading, isError } = useQuery({ + ...cplxApiQueries.changelog.detail({ + version: version, + }), + }); + + const noChangelog = data != null && !isError && data.length === 0; + + return ( +
+

+ v{version} +

+ {isLoading && ( +
+
+ + + +
+
+ + + +
+
+ )} + {data && !noChangelog && ( +
+ +
+

+ Support future development +

+
+ {cometAffiliateConfig.enabled && ( +
+
+ , + ]} + /> +
+ +
+ )} + + +
+
+
+ )} + {noChangelog &&
No changelog for this version
} + {isError &&
Failed to load changelog for this version
} +
+ ); +} diff --git a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/settings/sections/GeneralSection.tsx b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/settings/sections/GeneralSection.tsx index e57d0a743..69fe7ed46 100644 --- a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/settings/sections/GeneralSection.tsx +++ b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/settings/sections/GeneralSection.tsx @@ -7,18 +7,16 @@ import { HoverCardTrigger, } from "@/components/ui/hover-card"; import { Image } from "@/components/ui/image"; -import { Switch } from "@/components/ui/switch"; import ExtensionIconActionSelect from "@/entrypoints/options-page/dashboard/pages/settings/components/ExtensionIconActionSelect"; import ManagePermissionsDialogWrapper from "@/entrypoints/options-page/dashboard/pages/settings/components/ManagePermissionsDialogWrapper"; import SettingsItem from "@/entrypoints/options-page/dashboard/pages/settings/SettingsItem"; import SettingsSection from "@/entrypoints/options-page/dashboard/pages/settings/SettingsSection"; -import useExtensionSettings from "@/services/infra/extension-api-wrappers/extension-settings/useExtensionSettings"; +import TablerExternalLink from "~icons/tabler/external-link"; import TablerQuestionCircle from "~icons/tabler/question-circle"; export default function GeneralSection() { const navigate = useNavigate(); - const { settings, mutation } = useExtensionSettings(); return ( @@ -44,21 +42,13 @@ export default function GeneralSection() {
- - - mutation.mutate((store) => { - store.showPostUpdateReleaseNotesPopup = checked; - }) - } - /> - - + ); diff --git a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/themes/components/ThemeForm.tsx b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/themes/components/ThemeForm.tsx index fd59825a6..86133ccd8 100644 --- a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/themes/components/ThemeForm.tsx +++ b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/themes/components/ThemeForm.tsx @@ -1,3 +1,5 @@ +import { useFormState } from "react-hook-form"; + import { Button } from "@/components/ui/button"; import { FormProvider, @@ -20,6 +22,8 @@ export function ThemeForm() { const { form, onSubmit, isPending, submitText, footer } = useThemeFormContext(); + const formState = useFormState({ control: form.control }); + return (
@@ -164,9 +168,7 @@ export function ThemeForm() { {footer}
{ el?.focus(); }} - href="https://pplx.ai/pnd280" + href={`https://${cometAffiliateConfig.link}`} target="_blank" rel="noopener noreferrer" > diff --git a/perplexity/extension/src/plugins/__ui-groups__/routes/Home/index.tsx b/perplexity/extension/src/plugins/__ui-groups__/routes/Home/index.tsx index 6b89f3340..807de733e 100644 --- a/perplexity/extension/src/plugins/__ui-groups__/routes/Home/index.tsx +++ b/perplexity/extension/src/plugins/__ui-groups__/routes/Home/index.tsx @@ -1,12 +1,20 @@ +import { Suspense } from "react"; + import CsUiPluginsGuard from "@/plugins/__async-deps__/plugins-guard/CsUiPluginsGuard"; import CometAffiliateDialog from "@/plugins/__ui-groups__/routes/Home/CometAffiliateDialog"; -import HomepageUpdateAnnouncer from "@/plugins/__ui-groups__/routes/Home/HomepageUpdateAnnouncer"; +import { PostUpdateBadge } from "@/plugins/__ui-groups__/routes/Home/update-announcer/PostUpdateBadge"; +import UpdateAnnouncer from "@/plugins/__ui-groups__/routes/Home/update-announcer/UpdateAnnouncer"; export default function HomepageComponents() { return ( - - + + + + + + + ); } diff --git a/perplexity/extension/src/plugins/__ui-groups__/routes/Home/update-announcer/PostUpdateBadge.tsx b/perplexity/extension/src/plugins/__ui-groups__/routes/Home/update-announcer/PostUpdateBadge.tsx new file mode 100644 index 000000000..2b400b870 --- /dev/null +++ b/perplexity/extension/src/plugins/__ui-groups__/routes/Home/update-announcer/PostUpdateBadge.tsx @@ -0,0 +1,73 @@ +import { useQuery } from "@tanstack/react-query"; + +import { APP_CONFIG } from "@/app.config"; +import Cplx from "@/components/icons/Cplx"; +import { Portal } from "@/components/ui/portal"; +import useExtensionUpdate from "@/hooks/useExtensionUpdate"; +import { cplxApiQueries } from "@/services/externals/cplx-api/query-keys"; +import { ContentScriptBgUtilsService } from "@/services/features/content-script-utils/service-init.bg-worker"; +import { ExtensionSettingsService } from "@/services/infra/extension-api-wrappers/extension-settings"; + +import TablerX from "~icons/tabler/x"; + +export function PostUpdateBadge() { + const settings = ExtensionSettingsService.cachedSync; + + const [open, setOpen] = useState( + !settings.isPostUpdateReleaseNotesPopupDismissed, + ); + + const { isUpdateAvailable } = useExtensionUpdate(); + + const { data } = useQuery({ + ...cplxApiQueries.changelog.detail({ + version: APP_CONFIG.VERSION, + }), + enabled: + !settings.isPostUpdateReleaseNotesPopupDismissed && !isUpdateAvailable, + retry: false, + refetchOnReconnect: false, + refetchOnWindowFocus: false, + staleTime: ms("30s"), + }); + + if (!open || isUpdateAvailable || data == null || data.length === 0) + return null; + + const dismiss = () => { + void ExtensionSettingsService.set((draft) => { + draft.isPostUpdateReleaseNotesPopupDismissed = true; + }); + setOpen(false); + }; + + return ( + +
{ + void ContentScriptBgUtilsService.Instance.openFullScreenReleaseNotes({ + version: APP_CONFIG.VERSION, + }); + dismiss(); + }} + > +
+
+ + Release Notes +
+
{ + e.stopPropagation(); + dismiss(); + }} + > + +
+
+
+
+ ); +} diff --git a/perplexity/extension/src/plugins/__ui-groups__/routes/Home/HomepageUpdateAnnouncer.tsx b/perplexity/extension/src/plugins/__ui-groups__/routes/Home/update-announcer/UpdateAnnouncer.tsx similarity index 89% rename from perplexity/extension/src/plugins/__ui-groups__/routes/Home/HomepageUpdateAnnouncer.tsx rename to perplexity/extension/src/plugins/__ui-groups__/routes/Home/update-announcer/UpdateAnnouncer.tsx index 9c37da9d4..699fd6db5 100644 --- a/perplexity/extension/src/plugins/__ui-groups__/routes/Home/HomepageUpdateAnnouncer.tsx +++ b/perplexity/extension/src/plugins/__ui-groups__/routes/Home/update-announcer/UpdateAnnouncer.tsx @@ -3,12 +3,12 @@ import { Portal } from "@/components/ui/portal"; import useExtensionUpdate from "@/hooks/useExtensionUpdate"; import { useHomeDomObserverStore } from "@/plugins/__core__/dom-observers/home/store"; -export default function HomepageUpdateAnnouncer() { +export default function UpdateAnnouncer() { const { isUpdateAvailable } = useExtensionUpdate(); const slogan = useHomeDomObserverStore((store) => store.slogan, deepEqual); - if (!isUpdateAvailable || !slogan) return null; + if (!slogan || !isUpdateAvailable) return null; const $container = $(slogan).parent().parent(); diff --git a/perplexity/extension/src/plugins/__ui-groups__/routes/Home/update-announcer/post-update-announcer.bg-worker.ts b/perplexity/extension/src/plugins/__ui-groups__/routes/Home/update-announcer/post-update-announcer.bg-worker.ts new file mode 100644 index 000000000..8baab0b63 --- /dev/null +++ b/perplexity/extension/src/plugins/__ui-groups__/routes/Home/update-announcer/post-update-announcer.bg-worker.ts @@ -0,0 +1,16 @@ +import { APP_CONFIG } from "@/app.config"; +import { ExtensionSettingsService } from "@/services/infra/extension-api-wrappers/extension-settings"; + +export default function () { + chrome.runtime.onInstalled.addListener(async (details) => { + if (APP_CONFIG.IS_DEV) return; + + if (details == null) return; + + if (details.reason !== chrome.runtime.OnInstalledReason.UPDATE) return; + + void ExtensionSettingsService.set((draft) => { + draft.isPostUpdateReleaseNotesPopupDismissed = false; + }); + }); +} diff --git a/perplexity/extension/src/plugins/better-sidebar/hooks/useHookMobileTrigger.ts b/perplexity/extension/src/plugins/better-sidebar/hooks/useHookMobileTrigger.ts index 8868791b4..5090f9cdf 100644 --- a/perplexity/extension/src/plugins/better-sidebar/hooks/useHookMobileTrigger.ts +++ b/perplexity/extension/src/plugins/better-sidebar/hooks/useHookMobileTrigger.ts @@ -1,5 +1,3 @@ -import { useEffect } from "react"; - import { useSidebarDomObserverStore } from "@/plugins/__core__/dom-observers/sidebar/store"; import { betterSidebarStore } from "@/plugins/better-sidebar/store"; diff --git a/perplexity/extension/src/plugins/comet-isolated-zoom/index.manifest.ts b/perplexity/extension/src/plugins/comet-isolated-zoom/index.manifest.ts index 13be9c702..5a59edb36 100644 --- a/perplexity/extension/src/plugins/comet-isolated-zoom/index.manifest.ts +++ b/perplexity/extension/src/plugins/comet-isolated-zoom/index.manifest.ts @@ -18,7 +18,7 @@ export default definePlugin({ id: "comet:isolatedZoom", title: "Comet: Isolated Zoom", description: - "Enable interface zoom on Comet Assistant without affecting the main page. Use Ctrl/Cmd + Mouse Wheel or Ctrl/Cmd + 0 to reset zoom.", + "Enable interface zoom on Comet Assistant without affecting the main page", dashboardMeta: { tags: ["ui", "cometAssistant", "cometAssistantOnly"], categories: ["comet"], diff --git a/perplexity/extension/src/plugins/comet-isolated-zoom/loader.ts b/perplexity/extension/src/plugins/comet-isolated-zoom/loader.ts index 9f0be9d55..2a4758306 100644 --- a/perplexity/extension/src/plugins/comet-isolated-zoom/loader.ts +++ b/perplexity/extension/src/plugins/comet-isolated-zoom/loader.ts @@ -59,19 +59,20 @@ export default async function () { } }); - $(document).on("wheel", (e) => { - if (e.ctrlKey || e.metaKey) { - e.preventDefault(); - const wheelEvent = e.originalEvent as WheelEvent | undefined; - if (wheelEvent) { - if (wheelEvent.deltaY < 0) { + document.addEventListener( + "wheel", + (e) => { + if (e.ctrlKey || e.metaKey) { + e.preventDefault(); + if (e.deltaY < 0) { void setZoom(undefined, 0.25); - } else if (wheelEvent.deltaY > 0) { + } else if (e.deltaY > 0) { void setZoom(undefined, -0.25); } } - } - }); + }, + { passive: false }, + ); }, }); } diff --git a/perplexity/extension/src/plugins/comet-isolated-zoom/settings-ui.tsx b/perplexity/extension/src/plugins/comet-isolated-zoom/settings-ui.tsx new file mode 100644 index 000000000..c9f6ff5f1 --- /dev/null +++ b/perplexity/extension/src/plugins/comet-isolated-zoom/settings-ui.tsx @@ -0,0 +1,73 @@ +import type { PluginId } from "@/__registries__/plugins/meta.types"; +import { + Slider, + SliderControl, + SliderLabel, + SliderRange, + SliderThumb, + SliderTrack, + SliderValueText, +} from "@/components/ui/slider"; +import { Switch } from "@/components/ui/switch"; +import useExtensionSettings from "@/services/infra/extension-api-wrappers/extension-settings/useExtensionSettings"; + +export const pluginId: PluginId = "comet:isolatedZoom"; + +export default function ThreadMessageTtsPluginSettingsUi() { + const { settings, mutation } = useExtensionSettings(); + const pluginSettings = settings?.plugins["comet:isolatedZoom"]; + + if (!settings) return null; + + return ( +
+ { + mutation.mutate((draft) => { + draft.plugins["comet:isolatedZoom"].enabled = checked; + }); + }} + /> + +
+
+
Use Ctrl/Cmd + Mouse Wheel or Ctrl/Cmd + 0 to reset zoom.
+
+ Or use this slider when you can't zoom on the Assistant window. +
+
+
+ { + mutation.mutate((draft) => { + draft.plugins["comet:isolatedZoom"].zoomLevel = value[0] ?? 1; + }); + }} + > +
+ Zoom Level + +
+ + + + + + +
+
+ After changing the zoom level, you need to reload the Assistant + window (Ctrl/Cmd + R). +
+
+
+
+ ); +} diff --git a/perplexity/extension/src/plugins/command-menu/items/actions/ActionItems.tsx b/perplexity/extension/src/plugins/command-menu/items/actions/ActionItems.tsx index cbbbb12fc..79dc36349 100644 --- a/perplexity/extension/src/plugins/command-menu/items/actions/ActionItems.tsx +++ b/perplexity/extension/src/plugins/command-menu/items/actions/ActionItems.tsx @@ -8,6 +8,7 @@ import { } from "@/components/ui/command"; import { useColorSchemeStore } from "@/plugins/__async-deps__/global-stores/color-scheme-store"; import usePplxIncognitoMode from "@/plugins/__async-deps__/hooks/usePplxIncognitoMode"; +import { useSpaRouter } from "@/plugins/__core__/_main-world/spa-router/utils"; import CommandItemGuard from "@/plugins/command-menu/components/CommandItemGuard"; import { getRawItems } from "@/plugins/command-menu/items/actions/items"; import { commandMenuStore } from "@/plugins/command-menu/store"; @@ -15,7 +16,8 @@ import { getGroupedItems } from "@/plugins/command-menu/utils"; import { whereAmI } from "@/utils/misc/utils"; export default function ActionItems() { - const location = whereAmI(); + const url = useSpaRouter((state) => state.url); + const location = whereAmI(url); const isIncognito = usePplxIncognitoMode(); const colorScheme = useColorSchemeStore((state) => state.colorScheme); diff --git a/perplexity/extension/src/plugins/command-menu/pages/threads/Page.tsx b/perplexity/extension/src/plugins/command-menu/pages/threads/Page.tsx index 47a3678db..53898682b 100644 --- a/perplexity/extension/src/plugins/command-menu/pages/threads/Page.tsx +++ b/perplexity/extension/src/plugins/command-menu/pages/threads/Page.tsx @@ -3,7 +3,6 @@ import { ThreadsSearchFiltersProvider } from "@/plugins/command-menu/pages/threa import ThreadsSearchFilters from "@/plugins/command-menu/pages/threads/filters/Index"; import ThreadCommandItems from "@/plugins/command-menu/pages/threads/ThreadCommandItems"; import type { ThreadsSearchPayload } from "@/services/externals/pplx-api/pplx-api.types"; -import { useCommandMenuStore } from "../../store"; declare module "@/plugins/command-menu/store/slices/pages/types" { interface CommandMenuPagesArgsRegistry { diff --git a/perplexity/extension/src/plugins/force-writing-mode/ForceWritingMode.tsx b/perplexity/extension/src/plugins/force-writing-mode/ForceWritingMode.tsx index 173d75bae..e240896cd 100644 --- a/perplexity/extension/src/plugins/force-writing-mode/ForceWritingMode.tsx +++ b/perplexity/extension/src/plugins/force-writing-mode/ForceWritingMode.tsx @@ -28,8 +28,8 @@ const normalizeCss = await getVersionedRemoteResource( export function ForceWritingModeToggle() { const [isOpen, setIsOpen] = useState(false); - const [warningShown, setWarningShown] = useLocalStorage( - "cplx.spacesThreadsForceWritingMode.warningShown", + const [showWarning, setShowWarning] = useLocalStorage( + "cplx.plugin:queryBox:spacesThreadsForceWritingMode:showWarning", true, ); @@ -59,7 +59,7 @@ export function ForceWritingModeToggle() { return ( { if (!forceWritingMode) return; @@ -92,7 +92,7 @@ export function ForceWritingModeToggle() { - diff --git a/perplexity/extension/src/plugins/language-model-selector/LanguageModelSelector.tsx b/perplexity/extension/src/plugins/language-model-selector/LanguageModelSelector.tsx index af64e2b10..bba7a1128 100644 --- a/perplexity/extension/src/plugins/language-model-selector/LanguageModelSelector.tsx +++ b/perplexity/extension/src/plugins/language-model-selector/LanguageModelSelector.tsx @@ -7,7 +7,7 @@ import { DomSelectorsService } from "@/plugins/__core__/dom-selectors/service-in import { ScopedQueryBoxContext, useScopedQueryBoxContext, -} from "@/plugins/__ui-groups__/elements/query-box/_context/context"; +} from "@/plugins/__ui-groups__/elements/query-box/context"; import { getActiveQueryBoxTextbox } from "@/plugins/__ui-groups__/elements/query-box/utils"; import CometAssistantLanguageModelSelectorTriggerButton from "@/plugins/language-model-selector/components/CometAssistantTriggerButton"; import DesktopContent from "@/plugins/language-model-selector/components/desktop"; diff --git a/perplexity/extension/src/plugins/language-model-selector/components/desktop/LanguageModelGroup.tsx b/perplexity/extension/src/plugins/language-model-selector/components/desktop/LanguageModelGroup.tsx index ceac8b76d..c0d1c4455 100644 --- a/perplexity/extension/src/plugins/language-model-selector/components/desktop/LanguageModelGroup.tsx +++ b/perplexity/extension/src/plugins/language-model-selector/components/desktop/LanguageModelGroup.tsx @@ -93,10 +93,7 @@ export default function LanguageModelGroup({ value={model.code} className="x:flex x:cursor-pointer x:items-center x:justify-start x:gap-2 x:text-foreground" onClick={() => { - localStorage.setItem( - "cplx.last-selected-language-model", - model.code, - ); + localStorage.setItem("cplx:lastSelectedLanguageModel", model.code); }} > diff --git a/perplexity/extension/src/plugins/language-model-selector/components/desktop/index.tsx b/perplexity/extension/src/plugins/language-model-selector/components/desktop/index.tsx index 9efc7803f..904c2af36 100644 --- a/perplexity/extension/src/plugins/language-model-selector/components/desktop/index.tsx +++ b/perplexity/extension/src/plugins/language-model-selector/components/desktop/index.tsx @@ -1,7 +1,7 @@ import { DropdownMenuContent } from "@/components/ui/dropdown-menu"; import { SelectContent } from "@/components/ui/select"; import { usePluginGuardsStore } from "@/plugins/__async-deps__/plugins-guard/store"; -import { ScopedQueryBoxContext } from "@/plugins/__ui-groups__/elements/query-box/_context/context"; +import { ScopedQueryBoxContext } from "@/plugins/__ui-groups__/elements/query-box/context"; import LanguageModelGroup from "@/plugins/language-model-selector/components/desktop/LanguageModelGroup"; import { LanguageModelSelectorContext } from "@/plugins/language-model-selector/context"; import { diff --git a/perplexity/extension/src/plugins/language-model-selector/components/mobile/LanguageModelGroup.tsx b/perplexity/extension/src/plugins/language-model-selector/components/mobile/LanguageModelGroup.tsx index 1c0e73938..2f3e90793 100644 --- a/perplexity/extension/src/plugins/language-model-selector/components/mobile/LanguageModelGroup.tsx +++ b/perplexity/extension/src/plugins/language-model-selector/components/mobile/LanguageModelGroup.tsx @@ -69,7 +69,7 @@ export default function MobileLanguageModelGroup({ className="x:gap-2 x:p-4 x:text-base" onClick={() => { localStorage.setItem( - "cplx.last-selected-language-model", + "cplx:lastSelectedLanguageModel", model.code, ); }} diff --git a/perplexity/extension/src/plugins/language-model-selector/store/sync.loader.ts b/perplexity/extension/src/plugins/language-model-selector/store/sync.loader.ts index 66cb77e78..1aa0c8d1f 100644 --- a/perplexity/extension/src/plugins/language-model-selector/store/sync.loader.ts +++ b/perplexity/extension/src/plugins/language-model-selector/store/sync.loader.ts @@ -47,7 +47,7 @@ function getModelType(modelCode: LanguageModelCode): LanguageModelType { function initializeFromCookie(): void { const lastSelectedLanguageModel = localStorage.getItem( - "cplx.last-selected-language-model", + "cplx:lastSelectedLanguageModel", ); if ( diff --git a/perplexity/extension/src/plugins/thread-artifacts/styles.css b/perplexity/extension/src/plugins/thread-artifacts/styles.css index 01726b9e8..11e0246c3 100644 --- a/perplexity/extension/src/plugins/thread-artifacts/styles.css +++ b/perplexity/extension/src/plugins/thread-artifacts/styles.css @@ -42,10 +42,13 @@ body { [data-cplx-artifact-active-panel="list"] ) [data-cplx-component="thread-wrapper"] - + div - .relative - > .bg-base { - @apply x:xl:shadow-none; + + div { + .w-full, + .relative { + & > .bg-base { + @apply x:xl:shadow-none; + } + } } &[data-cplx-artifact-active-panel="artifact"] diff --git a/perplexity/extension/src/plugins/thread-better-code-blocks/MirroredCodeBlockContext.tsx b/perplexity/extension/src/plugins/thread-better-code-blocks/MirroredCodeBlockContext.tsx index 3b14f7433..8e50d6bab 100644 --- a/perplexity/extension/src/plugins/thread-better-code-blocks/MirroredCodeBlockContext.tsx +++ b/perplexity/extension/src/plugins/thread-better-code-blocks/MirroredCodeBlockContext.tsx @@ -1,3 +1,4 @@ +import { useStore } from "zustand"; import { subscribeWithSelector } from "zustand/middleware"; import { immer } from "zustand/middleware/immer"; import { createWithEqualityFn } from "zustand/traditional"; @@ -70,33 +71,32 @@ const MirroredCodeBlockContext = createContext( null, ); -export const MirroredCodeBlockContextProvider = memo( - function MirroredCodeBlockContextProvider({ - storeValue, - children, - }: { - storeValue: InitialState; - children: React.ReactNode; - }) { - // eslint-disable-next-line react-hooks/refs - const store = useRef(createStore(storeValue)).current; +export function MirroredCodeBlockContextProvider({ + storeValue, + children, +}: { + storeValue: InitialState; + children: React.ReactNode; +}) { + const [store] = useState(() => createStore(storeValue)); - return ( - - {children} - - ); - }, -); + return ( + + {children} + + ); +} export function useMirroredCodeBlockContext() { - const store = use(MirroredCodeBlockContext)?.(); + const context = use(MirroredCodeBlockContext); invariant( - store != null, + context != null, "useMirroredCodeBlockContext must be used within a MirroredCodeBlockContext", ); + const store = useStore(context); + const codeBlock = useThreadCodeBlock({ messageBlockIndex: store.sourceMessageBlockIndex, codeBlockIndex: store.sourceCodeBlockIndex, diff --git a/perplexity/extension/src/plugins/thread-better-code-blocks/sticky-header.css b/perplexity/extension/src/plugins/thread-better-code-blocks/sticky-header.css index 37cea9e11..4ccc20939 100644 --- a/perplexity/extension/src/plugins/thread-better-code-blocks/sticky-header.css +++ b/perplexity/extension/src/plugins/thread-better-code-blocks/sticky-header.css @@ -3,3 +3,7 @@ [data-cplx-code-block-header][data-sticky="true"] { @apply x:sticky x:top-(--header-height) x:@[1540px]/main:top-0; } + +[location="comet_assistant"] [data-cplx-code-block-header][data-sticky="true"] { + @apply x:top-0; +} diff --git a/perplexity/extension/src/plugins/thread-message-tts/ThreadMessageTtsButton.tsx b/perplexity/extension/src/plugins/thread-message-tts/ThreadMessageTtsButton.tsx index e7a45cfde..a8d343d6a 100644 --- a/perplexity/extension/src/plugins/thread-message-tts/ThreadMessageTtsButton.tsx +++ b/perplexity/extension/src/plugins/thread-message-tts/ThreadMessageTtsButton.tsx @@ -7,7 +7,6 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; -import { useEvent } from "@/hooks/useEvent"; import { threadMessageBlocksDomObserverStore } from "@/plugins/__core__/dom-observers/thread/message-blocks/store"; import { useThreadMessageIndexContext } from "@/plugins/__ui-groups__/elements/thread-message-index-context"; import usePplxTtsRequest from "@/plugins/thread-message-tts/hooks/usePplxTtsRequest"; @@ -32,7 +31,7 @@ export function ThreadMessageTtsButton() { ]?.content.backendUuid; const [voice, setVoice] = useLocalStorage( - "cplx.plugins.thread:messageTts.voice", + "cplx.plugin:thread:messageTts.voice", "Mike", ); @@ -75,7 +74,7 @@ export function ThreadMessageTtsButton() { void playTts({ voice: params?.voice ?? voice, backendUuid }); }; - const cleanup = useEvent(() => { + const cleanup = useEffectEvent(() => { if (!isPlaying) return; coordinator.getPlayer().clearBuffer(); @@ -86,7 +85,7 @@ export function ThreadMessageTtsButton() { return () => { cleanup(); }; - }, [cleanup]); + }, []); if (!isPlaying && isPending) { return ( diff --git a/perplexity/extension/src/plugins/thread-toc/FloatingToggle.tsx b/perplexity/extension/src/plugins/thread-toc/FloatingToggle.tsx deleted file mode 100644 index 5a62b4b8f..000000000 --- a/perplexity/extension/src/plugins/thread-toc/FloatingToggle.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { usePanelPosition } from "@/plugins/thread-toc/usePanelPosition"; - -import TablerMenu from "~icons/tabler/menu-2"; - -type FloatingToggleProps = { - isOpen: boolean; - onClick: () => void; -}; - -export default function FloatingToggle({ - isOpen, - onClick, -}: FloatingToggleProps) { - const { position } = usePanelPosition() ?? {}; - - if (position == null) return null; - - const { top } = position; - - return ( -
- -
- ); -} diff --git a/perplexity/extension/src/plugins/thread-toc/ThreadToc.tsx b/perplexity/extension/src/plugins/thread-toc/ThreadToc.tsx index 4c89d90b2..61923ee33 100644 --- a/perplexity/extension/src/plugins/thread-toc/ThreadToc.tsx +++ b/perplexity/extension/src/plugins/thread-toc/ThreadToc.tsx @@ -1,31 +1,27 @@ import React from "react"; -import { useEvent } from "@/hooks/useEvent"; import { useThreadDomObserverStore } from "@/plugins/__core__/dom-observers/thread/store"; -import { DomSelectorsService } from "@/plugins/__core__/dom-selectors/service-init.loader"; -import FloatingToggle from "@/plugins/thread-toc/FloatingToggle"; -import TocItem from "@/plugins/thread-toc/TocItem"; +import { TocMenuToggle } from "@/plugins/thread-toc/TocMenuToggle"; +import { TocPanel } from "@/plugins/thread-toc/TocPanel"; import { useHandleTouch } from "@/plugins/thread-toc/useHandleTouch"; -import { - PANEL_WIDTH, - usePanelPosition, -} from "@/plugins/thread-toc/usePanelPosition"; +import { usePanelPosition } from "@/plugins/thread-toc/usePanelPosition"; import { useThreadTocItems } from "@/plugins/thread-toc/useThreadTocItems"; -import { scrollToElement } from "@/utils/dom-utils/generics"; -import { PPLX_SCROLLBAR_CLASSES } from "@/utils/dom-utils/pplx-scrollbar-classes"; - -import TablerX from "~icons/tabler/x"; export function ThreadToc() { - const tocItems = useThreadTocItems(); + const [isOpen, setIsOpen] = useState(false); const threadWrapper = useThreadDomObserverStore( (store) => store.$wrapper?.[0], deepEqual, ); - const [isOpen, setIsOpen] = useState(false); - const containerRef = useRef(null); + const containerRef = useRef(null); + + const tocItems = useThreadTocItems(); + + const panelPosition = usePanelPosition({ + tocItems, + }); useHandleTouch({ containerRef, @@ -33,98 +29,27 @@ export function ThreadToc() { setIsOpen, }); - const { position, isOverflowing } = usePanelPosition() ?? {}; - const { top, left } = position ?? {}; - - const handleToggleOpen = useEvent(() => setIsOpen(true)); - const handleToggleClose = useEvent(() => setIsOpen(false)); - - const shouldShowToc = tocItems.length > 1 && !!position; - - const isFloating = (() => { - if (isOverflowing) return true; - - const activeTopMostId = tocItems.findIndex((item) => item.isActiveTopMost); - const tabState = new URLSearchParams(window.location.search).get( - activeTopMostId.toString(), - ); - return tabState != null && !["d", "r", "t"].includes(tabState); - })(); + const shouldShowToc = tocItems.length > 1 && panelPosition != null; if (!shouldShowToc || threadWrapper == null) return null; return ( <> - {isFloating && ( - - )} -
- {isFloating && ( -
- -
- )} -
- {tocItems.map((item, idx) => ( - { - const $element = $( - `${DomSelectorsService.Root.cplxAttribute( - DomSelectorsService.Root.internalAttributes.THREAD.MESSAGE - .BLOCK, - )}[data-index="${item.id}"]`, - ); - if ($element.length) scrollToElement($element, 0, 300); - }} - onContextMenu={() => { - const $element = $( - `${DomSelectorsService.Root.cplxAttribute( - DomSelectorsService.Root.internalAttributes.THREAD.MESSAGE - .BLOCK, - )}[data-index="${item.id}"]`, - ); - if ($element.length && $element.height() != null) - scrollToElement( - $element, - $element.height()! - window.innerHeight / 2, - 300, - ); - }} - /> - ))} -
-
+ setIsOpen(true)} + /> + setIsOpen(false)} + /> ); } diff --git a/perplexity/extension/src/plugins/thread-toc/TocMenuToggle.tsx b/perplexity/extension/src/plugins/thread-toc/TocMenuToggle.tsx new file mode 100644 index 000000000..877dcbdc9 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-toc/TocMenuToggle.tsx @@ -0,0 +1,37 @@ +import React, { Activity } from "react"; + +import TablerMenu from "~icons/tabler/menu-2"; + +type TocMenuToggleProps = { + top: number; + isOpen: boolean; + isFloating: boolean; + onToggleOpen: () => void; +}; + +export function TocMenuToggle({ + top, + isOpen, + isFloating, + onToggleOpen, +}: TocMenuToggleProps) { + return ( + +
+ +
+
+ ); +} diff --git a/perplexity/extension/src/plugins/thread-toc/TocPanel.tsx b/perplexity/extension/src/plugins/thread-toc/TocPanel.tsx new file mode 100644 index 000000000..6bf126f0a --- /dev/null +++ b/perplexity/extension/src/plugins/thread-toc/TocPanel.tsx @@ -0,0 +1,101 @@ +import React, { Activity } from "react"; + +import { DomSelectorsService } from "@/plugins/__core__/dom-selectors/service-init.loader"; +import TocItem from "@/plugins/thread-toc/TocItem"; +import { PANEL_WIDTH } from "@/plugins/thread-toc/usePanelPosition"; +import type { TocItem as TocItemType } from "@/plugins/thread-toc/useThreadTocItems"; +import { scrollToElement } from "@/utils/dom-utils/generics"; +import { PPLX_SCROLLBAR_CLASSES } from "@/utils/dom-utils/pplx-scrollbar-classes"; + +import TablerX from "~icons/tabler/x"; + +type TocPanelProps = { + containerRef: React.RefObject; + top: number; + left: number; + isOpen: boolean; + isFloating: boolean; + tocItems: TocItemType[]; + onToggleClosed: () => void; +}; + +export function TocPanel({ + containerRef, + top, + left, + isOpen, + isFloating, + tocItems, + onToggleClosed, +}: TocPanelProps) { + return ( + +
+ {isFloating && ( +
+ +
+ )} +
+ {tocItems.map((item, idx) => ( + { + const $element = $( + `${DomSelectorsService.Root.cplxAttribute( + DomSelectorsService.Root.internalAttributes.THREAD.MESSAGE + .BLOCK, + )}[data-index="${item.id}"]`, + ); + if ($element.length) scrollToElement($element, 0, 300); + }} + onContextMenu={() => { + const $element = $( + `${DomSelectorsService.Root.cplxAttribute( + DomSelectorsService.Root.internalAttributes.THREAD.MESSAGE + .BLOCK, + )}[data-index="${item.id}"]`, + ); + if ($element.length && $element.height() != null) + scrollToElement( + $element, + $element.height()! - window.innerHeight / 2, + 300, + ); + }} + /> + ))} +
+
+
+ ); +} diff --git a/perplexity/extension/src/plugins/thread-toc/usePanelPosition.ts b/perplexity/extension/src/plugins/thread-toc/usePanelPosition.ts index 653f04b17..36cbb0973 100644 --- a/perplexity/extension/src/plugins/thread-toc/usePanelPosition.ts +++ b/perplexity/extension/src/plugins/thread-toc/usePanelPosition.ts @@ -1,10 +1,10 @@ import { useDebounce, useWindowSize } from "@uidotdev/usehooks"; -import debounce from "lodash/debounce"; import { usePplxCookiesStore } from "@/plugins/__async-deps__/global-stores/pplx-cookies-store"; import { useSpaRouter } from "@/plugins/__core__/_main-world/spa-router/utils"; import { useThreadMessageBlocksDomObserverStore } from "@/plugins/__core__/dom-observers/thread/message-blocks/store"; import { useThreadDomObserverStore } from "@/plugins/__core__/dom-observers/thread/store"; +import type { TocItem } from "@/plugins/thread-toc/useThreadTocItems"; export const PANEL_WIDTH = 230; @@ -13,19 +13,23 @@ type PanelPosition = { isOverflowing: boolean; }; -export function usePanelPosition(): PanelPosition | null { - const { url } = useSpaRouter(); - const windowSize = useDebounce(useWindowSize(), 200); - const [panelPosition, setPanelPosition] = useState( - null, - ); +export function usePanelPosition({ + tocItems, +}: { + tocItems: TocItem[]; +}): PanelPosition | null { const threadWrapper = useThreadDomObserverStore( (store) => store.$wrapper?.[0], deepEqual, ); + const activeMessageBlockId = tocItems.findIndex( + (item) => item.isActiveTopMost, + ); + const threadContentWrapper = useThreadMessageBlocksDomObserverStore( - (store) => store.messageBlocks?.[0]?.nodes.$answer[0], + (store) => + store.messageBlocks?.[activeMessageBlockId]?.nodes.$contentWrapper[0], deepEqual, ); @@ -36,21 +40,35 @@ export function usePanelPosition(): PanelPosition | null { deepEqual, ); - const calculatePosition = () => { - if (threadWrapper == null || threadContentWrapper == null) return null; + const windowSize = useDebounce( + useWindowSize(), + tocItems.length > 5 ? 200 : 0, + ); + + const url = useSpaRouter((store) => store.url); + + const calculatePosition = useCallback(() => { + void (isSidebarPinned && windowSize != null && url != null); + + if (threadWrapper == null) { + return null; + } const $threadWrapper = $(threadWrapper); const $children = $threadWrapper.children(); const $firstChild = $children.first(); const threadWrapperOffset = $firstChild.offset(); - if (!threadWrapperOffset) return null; + if (!threadWrapperOffset) { + console.log("threadWrapperOffset is null"); + return null; + } const navbarHeightStr = document.body.style.getPropertyValue("--header-height"); const navbarHeight = navbarHeightStr ? parseInt(navbarHeightStr) : 53; - let threadContentWrapperWidth = threadContentWrapper.offsetWidth ?? 0; + let threadContentWrapperWidth = threadContentWrapper?.offsetWidth ?? 0; const validChildren = $children.filter((index, child) => { return index > 0 && !child.classList.contains("fixed"); @@ -63,15 +81,11 @@ export function usePanelPosition(): PanelPosition | null { if (width != null) threadContentWrapperWidth += width; }); - if (threadContentWrapperWidth === 0) return null; - - const threadContentWrapperOffset = - threadContentWrapper.getBoundingClientRect(); - - if (threadContentWrapperOffset == null) return null; + const threadContentWrapperOffsetLeft = + threadContentWrapper?.getBoundingClientRect().left ?? 0; const panelRightEdge = - threadContentWrapperOffset.left + + threadContentWrapperOffsetLeft + threadContentWrapperWidth + PANEL_WIDTH + 32; @@ -79,25 +93,13 @@ export function usePanelPosition(): PanelPosition | null { return { position: { top: navbarHeight + 20, - left: threadContentWrapperWidth + threadContentWrapperOffset.left + 28, + left: threadContentWrapperWidth + threadContentWrapperOffsetLeft + 28, }, - isOverflowing: panelRightEdge > window.innerWidth, - }; - }; - - const debouncedUpdate = debounce(() => { - const newPanelPosition = calculatePosition(); - if (newPanelPosition == null) return; - setPanelPosition(newPanelPosition); - }, 100); - - useEffect(() => { - debouncedUpdate(); - - return () => { - debouncedUpdate.cancel(); + isOverflowing: + panelRightEdge > window.innerWidth || + threadContentWrapperOffsetLeft === 0, }; - }, [windowSize, url, isSidebarPinned, debouncedUpdate]); + }, [isSidebarPinned, threadContentWrapper, threadWrapper, url, windowSize]); - return panelPosition; + return calculatePosition(); } diff --git a/perplexity/extension/src/services/externals/cplx-api/remote-resources/comet-affiliate/index.remote-resources.ts b/perplexity/extension/src/services/externals/cplx-api/remote-resources/comet-affiliate/index.remote-resources.ts new file mode 100644 index 000000000..7f61cc582 --- /dev/null +++ b/perplexity/extension/src/services/externals/cplx-api/remote-resources/comet-affiliate/index.remote-resources.ts @@ -0,0 +1,19 @@ +/* cli-ignore */ + +import z from "zod"; + +import { APP_CONFIG } from "@/app.config"; +import { defineRemoteResource } from "@/services/externals/cplx-api/remote-resources"; + +export const cometAffiliateRemoteResourceConfig = defineRemoteResource({ + resourcePath: "comet-affiliate.json", + type: "json", + fallback: { + enabled: APP_CONFIG.IS_DEV, + link: "pplx.ai/pnd280", + }, + zodSchema: z.object({ + enabled: z.boolean(), + link: z.string(), + }), +}); diff --git a/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/defaults.ts b/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/defaults.ts index 2b78f2f43..6c6332261 100644 --- a/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/defaults.ts +++ b/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/defaults.ts @@ -40,6 +40,8 @@ export const DOM_SELECTORS: DomSelectors = { }, STICKY_HEADER: ".h-headerHeight.backdrop-blur-md", SOURCES: ".gap-sm.grid.grid-cols-4.md\\:px-0", + CONTENT_WRAPPER: + ".isolate.mx-auto > .bg-base ~ .max-w-threadContentWidth", ANSWER: "div[id*='markdown-content-']", ANSWER_TEXT_CONTENT: ".prose.text-pretty", /** The footer of the message (share, rewrite, model name, etc.) */ diff --git a/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/types.ts b/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/types.ts index 711f19a2a..79ba10a6f 100644 --- a/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/types.ts +++ b/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/types.ts @@ -33,6 +33,7 @@ export const DomSelectorsSchema = z.object({ }), STICKY_HEADER: z.string(), SOURCES: z.string(), + CONTENT_WRAPPER: z.string(), ANSWER: z.string(), ANSWER_TEXT_CONTENT: z.string(), FOOTER: z.string(), diff --git a/perplexity/extension/src/services/features/content-script-utils/index.ts b/perplexity/extension/src/services/features/content-script-utils/index.ts index d1e54182d..55ac3dde8 100644 --- a/perplexity/extension/src/services/features/content-script-utils/index.ts +++ b/perplexity/extension/src/services/features/content-script-utils/index.ts @@ -25,11 +25,19 @@ export class ContentScriptBgUtilsServiceImpl { void chrome.runtime.openOptionsPage(); } - static async openDirectReleaseNotes({ version }: { version: string }) { - const optionsPageUrl = getOptionsPageUrl({ isDev: APP_CONFIG.IS_DEV }); + static async openExtensionsManagementPage() { + if (APP_CONFIG.BROWSER === "chrome") { + void chrome.tabs.create({ + url: `chrome://extensions?id=${chrome.runtime.id}`, + }); + } else { + // noop, Firefox doesnt allow opening about:* pages + } + } + static async openFullScreenReleaseNotes({ version }: { version: string }) { void chrome.tabs.create({ - url: `${optionsPageUrl}#/direct-release-notes?version=${version}`, + url: `${getOptionsPageUrl({ isDev: APP_CONFIG.IS_DEV })}#/fs-release-notes?version=${version}`, }); } diff --git a/perplexity/extension/src/services/features/instant-css/browser-startup.bg-worker.ts b/perplexity/extension/src/services/features/instant-css/browser-startup.bg-worker.ts deleted file mode 100644 index b5d8df4ba..000000000 --- a/perplexity/extension/src/services/features/instant-css/browser-startup.bg-worker.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { InstantCssService } from "@/services/features/instant-css"; -import { InstantCssInjectorService } from "@/services/features/instant-css/injector/service-init.bg-worker"; - -export default async function () { - chrome.runtime.onStartup.addListener(async () => { - if (!(await InstantCssService.hasPermissions())) return; - - await InstantCssInjectorService.Instance.forceInjectAllPplxTabs(); - }); -} diff --git a/perplexity/extension/src/services/infra/extension-api-wrappers/extension-settings/defaults.ts b/perplexity/extension/src/services/infra/extension-api-wrappers/extension-settings/defaults.ts index f5c56a254..570a8e97b 100644 --- a/perplexity/extension/src/services/infra/extension-api-wrappers/extension-settings/defaults.ts +++ b/perplexity/extension/src/services/infra/extension-api-wrappers/extension-settings/defaults.ts @@ -6,6 +6,5 @@ export const DEFAULT_EXTENSION_SETTINGS: ExtensionSettings = { theme: "complexity", extensionIconAction: "perplexity", devMode: false, - showPostUpdateReleaseNotesPopup: false, isPostUpdateReleaseNotesPopupDismissed: false, } as const; diff --git a/perplexity/extension/src/services/infra/extension-api-wrappers/extension-settings/types.ts b/perplexity/extension/src/services/infra/extension-api-wrappers/extension-settings/types.ts index 5ea78d645..e957d0d5b 100644 --- a/perplexity/extension/src/services/infra/extension-api-wrappers/extension-settings/types.ts +++ b/perplexity/extension/src/services/infra/extension-api-wrappers/extension-settings/types.ts @@ -9,7 +9,6 @@ export const ExtensionSettingsSchema = z.object({ PluginManifestsRegistry.settingsZodSchema as unknown as z.ZodType, theme: z.string(), extensionIconAction: z.enum(EXTENSION_ICON_ACTIONS), - showPostUpdateReleaseNotesPopup: z.boolean(), isPostUpdateReleaseNotesPopupDismissed: z.boolean(), devMode: z.boolean(), devTools: z diff --git a/perplexity/extension/src/services/infra/query-client/utils.ts b/perplexity/extension/src/services/infra/query-client/utils.ts index d5dc8cd30..17b2f75e6 100644 --- a/perplexity/extension/src/services/infra/query-client/utils.ts +++ b/perplexity/extension/src/services/infra/query-client/utils.ts @@ -69,6 +69,9 @@ function shouldDehydrateQuery( ): boolean { const queryKey = query.queryKey; + // Only persist queries that are truly cacheable + if (query.state.status !== "success") return false; + if (excludeKeys.some((exclude) => queryKey.includes(exclude))) { return false; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 77616240c..b33596fd0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,8 +17,8 @@ catalogs: version: 8.46.2 types: '@types/chrome': - specifier: ^0.1.24 - version: 0.1.24 + specifier: ^0.1.27 + version: 0.1.27 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -76,8 +76,8 @@ importers: specifier: catalog:lint version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) vitest: - specifier: ^4.0.3 - version: 4.0.3(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) + specifier: ^4.0.4 + version: 4.0.4(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) packages/cli-logger: devDependencies: @@ -117,7 +117,7 @@ importers: version: link:../typescript-config '@types/chrome': specifier: catalog:types - version: 0.1.24 + version: 0.1.27 '@types/node': specifier: 22.17.2 version: 22.17.2 @@ -157,7 +157,7 @@ importers: version: 2.2.1 '@types/chrome': specifier: catalog:types - version: 0.1.24 + version: 0.1.27 '@types/node': specifier: 22.17.2 version: 22.17.2 @@ -484,8 +484,8 @@ importers: specifier: ^2.2.1 version: 2.2.1 '@iconify/json': - specifier: ^2.2.400 - version: 2.2.400 + specifier: ^2.2.401 + version: 2.2.401 '@playwright/test': specifier: ^1.56.1 version: 1.56.1 @@ -512,7 +512,7 @@ importers: version: 5.90.2(@tanstack/react-query@5.90.5(react@19.2.0))(react@19.2.0) '@types/chrome': specifier: catalog:types - version: 0.1.24 + version: 0.1.27 '@types/culori': specifier: ^4.0.1 version: 4.0.1 @@ -550,8 +550,8 @@ importers: specifier: ^5.1.0 version: 5.1.0(vite@7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)) '@vitest/ui': - specifier: ^4.0.3 - version: 4.0.3(vitest@4.0.3) + specifier: ^4.0.4 + version: 4.0.4(vitest@4.0.4) babel-plugin-react-compiler: specifier: ^1.0.0 version: 1.0.0 @@ -569,7 +569,7 @@ importers: version: 9.38.0(jiti@2.6.1) eslint-plugin-boundaries: specifier: ^5.1.0 - version: 5.1.0(eslint@9.38.0(jiti@2.6.1)) + version: 5.1.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1)) glob: specifier: ^11.0.3 version: 11.0.3 @@ -592,11 +592,11 @@ importers: specifier: ^0.18.12 version: 0.18.12(markmap-common@0.18.9) mermaid: - specifier: ^11.12.0 - version: 11.12.0 + specifier: ^11.12.1 + version: 11.12.1 minimatch: - specifier: ^10.0.3 - version: 10.0.3 + specifier: ^10.1.1 + version: 10.1.1 postcss: specifier: ^8.5.6 version: 8.5.6 @@ -628,14 +628,14 @@ importers: specifier: ^7.1.12 version: 7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) vitest: - specifier: ^4.0.3 - version: 4.0.3(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) + specifier: ^4.0.4 + version: 4.0.4(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) perplexity/extension/cli: dependencies: '@aws-sdk/client-s3': - specifier: ^3.917.0 - version: 3.917.0 + specifier: ^3.919.0 + version: 3.919.0 '@dotenvx/dotenvx': specifier: ^1.51.0 version: 1.51.0 @@ -726,12 +726,12 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-s3@3.917.0': - resolution: {integrity: sha512-3L73mDCpH7G0koFv3p3WkkEKqC5wn2EznKtNMrJ6hczPIr2Cu6DJz8VHeTZp9wFZLPrIBmh3ZW1KiLujT5Fd2w==} + '@aws-sdk/client-s3@3.919.0': + resolution: {integrity: sha512-UEPH2B9RnsS7Jo/oXe5DGrqQhWvRj6YBkLr7bsAZoYl4Sj1RbwDimiyGbhbuarnX5wCjpwSW860CFmShh/1z5w==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.916.0': - resolution: {integrity: sha512-Eu4PtEUL1MyRvboQnoq5YKg0Z9vAni3ccebykJy615xokVZUdA3di2YxHM/hykDQX7lcUC62q9fVIvh0+UNk/w==} + '@aws-sdk/client-sso@3.919.0': + resolution: {integrity: sha512-9DVw/1DCzZ9G7Jofnhpg/XDC3wdJ3NAJdNWY1TrgE5ZcpTM+UTIQMGyaljCv9rgxggutHBgmBI5lP3YMcPk9ZQ==} engines: {node: '>=18.0.0'} '@aws-sdk/core@3.916.0': @@ -746,24 +746,24 @@ packages: resolution: {integrity: sha512-NmooA5Z4/kPFJdsyoJgDxuqXC1C6oPMmreJjbOPqcwo6E/h2jxaG8utlQFgXe5F9FeJsMx668dtxVxSYnAAqHQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.917.0': - resolution: {integrity: sha512-rvQ0QamLySRq+Okc0ZqFHZ3Fbvj3tYuWNIlzyEKklNmw5X5PM1idYKlOJflY2dvUGkIqY3lUC9SC2WL+1s7KIw==} + '@aws-sdk/credential-provider-ini@3.919.0': + resolution: {integrity: sha512-fAWVfh0P54UFbyAK4tmIPh/X3COFAyXYSp8b2Pc1R6GRwDDMvrAigwGJuyZS4BmpPlXij1gB0nXbhM5Yo4MMMA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.917.0': - resolution: {integrity: sha512-n7HUJ+TgU9wV/Z46yR1rqD9hUjfG50AKi+b5UXTlaDlVD8bckg40i77ROCllp53h32xQj/7H0yBIYyphwzLtmg==} + '@aws-sdk/credential-provider-node@3.919.0': + resolution: {integrity: sha512-GL5filyxYS+eZq8ZMQnY5hh79Wxor7Rljo0SUJxZVwEj8cf3zY0MMuwoXU1HQrVabvYtkPDOWSreX8GkIBtBCw==} engines: {node: '>=18.0.0'} '@aws-sdk/credential-provider-process@3.916.0': resolution: {integrity: sha512-SXDyDvpJ1+WbotZDLJW1lqP6gYGaXfZJrgFSXIuZjHb75fKeNRgPkQX/wZDdUvCwdrscvxmtyJorp2sVYkMcvA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.916.0': - resolution: {integrity: sha512-gu9D+c+U/Dp1AKBcVxYHNNoZF9uD4wjAKYCjgSN37j4tDsazwMEylbbZLuRNuxfbXtizbo4/TiaxBXDbWM7AkQ==} + '@aws-sdk/credential-provider-sso@3.919.0': + resolution: {integrity: sha512-oN1XG/frOc2K2KdVwRQjLTBLM1oSFJLtOhuV/6g9N0ASD+44uVJai1CF9JJv5GjHGV+wsqAt+/Dzde0tZEXirA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.917.0': - resolution: {integrity: sha512-pZncQhFbwW04pB0jcD5OFv3x2gAddDYCVxyJVixgyhSw7bKCYxqu6ramfq1NxyVpmm+qsw+ijwi/3cCmhUHF/A==} + '@aws-sdk/credential-provider-web-identity@3.919.0': + resolution: {integrity: sha512-Wi7RmyWA8kUJ++/8YceC7U5r4LyvOHGCnJLDHliP8rOC8HLdSgxw/Upeq3WmC+RPw1zyGOtEDRS/caop2xLXEA==} engines: {node: '>=18.0.0'} '@aws-sdk/middleware-bucket-endpoint@3.914.0': @@ -774,8 +774,8 @@ packages: resolution: {integrity: sha512-UPBq1ZP2CaxwbncWSbVqkhYXQrmfNiqAtHyBxi413hjRVZ4JhQ1UyH7pz5yqiG8zx2/+Po8cUD4SDUwJgda4nw==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.916.0': - resolution: {integrity: sha512-CBRRg6slHHBYAm26AWY/pECHK0vVO/peDoNhZiAzUNt4jV6VftotjszEJ904pKGOr7/86CfZxtCnP3CCs3lQjA==} + '@aws-sdk/middleware-flexible-checksums@3.919.0': + resolution: {integrity: sha512-br56Wg1o5hLrMXX2iMjq12Cno/jsx9l2Y0KDI7hD4NFWycKCdsUpI1sjm8Asj18JbrbNWiCeAbFFlzcD8h+4wg==} engines: {node: '>=18.0.0'} '@aws-sdk/middleware-host-header@3.914.0': @@ -790,8 +790,8 @@ packages: resolution: {integrity: sha512-/gaW2VENS5vKvJbcE1umV4Ag3NuiVzpsANxtrqISxT3ovyro29o1RezW/Avz/6oJqjnmgz8soe9J1t65jJdiNg==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-recursion-detection@3.914.0': - resolution: {integrity: sha512-yiAjQKs5S2JKYc+GrkvGMwkUvhepXDigEXpSJqUseR/IrqHhvGNuOxDxq+8LbDhM4ajEW81wkiBbU+Jl9G82yQ==} + '@aws-sdk/middleware-recursion-detection@3.919.0': + resolution: {integrity: sha512-q3MAUxLQve4rTfAannUCx2q1kAHkBBsxt6hVUpzi63KC4lBLScc1ltr7TI+hDxlfGRWGo54jRegb2SsY9Jm+Mw==} engines: {node: '>=18.0.0'} '@aws-sdk/middleware-sdk-s3@3.916.0': @@ -806,8 +806,8 @@ packages: resolution: {integrity: sha512-mzF5AdrpQXc2SOmAoaQeHpDFsK2GE6EGcEACeNuoESluPI2uYMpuuNMYrUufdnIAIyqgKlis0NVxiahA5jG42w==} engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.916.0': - resolution: {integrity: sha512-tgg8e8AnVAer0rcgeWucFJ/uNN67TbTiDHfD+zIOPKep0Z61mrHEoeT/X8WxGIOkEn4W6nMpmS4ii8P42rNtnA==} + '@aws-sdk/nested-clients@3.919.0': + resolution: {integrity: sha512-5D9OQsMPkbkp4KHM7JZv/RcGCpr3E1L7XX7U9sCxY+sFGeysltoviTmaIBXsJ2IjAJbBULtf0G/J+2cfH5OP+w==} engines: {node: '>=18.0.0'} '@aws-sdk/region-config-resolver@3.914.0': @@ -818,8 +818,8 @@ packages: resolution: {integrity: sha512-fuzUMo6xU7e0NBzBA6TQ4FUf1gqNbg4woBSvYfxRRsIfKmSMn9/elXXn4sAE5UKvlwVQmYnb6p7dpVRPyFvnQA==} engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.916.0': - resolution: {integrity: sha512-13GGOEgq5etbXulFCmYqhWtpcEQ6WI6U53dvXbheW0guut8fDFJZmEv7tKMTJgiybxh7JHd0rWcL9JQND8DwoQ==} + '@aws-sdk/token-providers@3.919.0': + resolution: {integrity: sha512-6aFv4lzXbfbkl0Pv37Us8S/ZkqplOQZIEgQg7bfMru7P96Wv2jVnDGsEc5YyxMnnRyIB90naQ5JgslZ4rkpknw==} engines: {node: '>=18.0.0'} '@aws-sdk/types@3.914.0': @@ -854,8 +854,8 @@ packages: resolution: {integrity: sha512-k75evsBD5TcIjedycYS7QXQ98AmOtbnxRJOPtCo0IwYRmy7UvqgS/gBL5SmrIqeV6FDSYRQMgdBxSMp6MLmdew==} engines: {node: '>=18.0.0'} - '@aws/lambda-invoke-store@0.0.1': - resolution: {integrity: sha512-ORHRQ2tmvnBXc8t/X9Z8IcSbBA4xTLKuN873FopzklHMeqBst7YG0d+AX97inkvDX+NChYtSr+qGfcqGFaI8Zw==} + '@aws/lambda-invoke-store@0.1.1': + resolution: {integrity: sha512-RcLam17LdlbSOSp9VxmUu1eI6Mwxp+OwhD2QhiSNmNCzoDb0EeUXTD2n/WbcnrAYMGlmf05th6QYq23VqvJqpA==} engines: {node: '>=18.0.0'} '@babel/code-frame@7.27.1': @@ -1297,8 +1297,8 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@iconify/json@2.2.400': - resolution: {integrity: sha512-L8cy1YE/H0LFO4Pu7hfyylkrQmawL8sTOCH2PcBDydWA1FpoKijeIzweRJ6e9grvn2li9Yu+Pe32Jq9x4MKpaw==} + '@iconify/json@2.2.401': + resolution: {integrity: sha512-pBz8s09X2Aac6EhpfH1eWcu0Wqwuhgh3gmcoFgkrr6qUR1V2qZyz/TKo2hwGEEyyWqH2kc9t50qHRb0hxoG1/g==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -2565,8 +2565,8 @@ packages: '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} - '@types/chrome@0.1.24': - resolution: {integrity: sha512-9iO9HL2bMeGS4C8m6gNFWUyuPE5HEUFk+rGh+7oriUjg+ata4Fc9PoVlu8xvGm7yoo3AmS3J6fAjoFj61NL2rw==} + '@types/chrome@0.1.27': + resolution: {integrity: sha512-pkkCb0Ft8X+Igi751POzT+YqchSxUCtB6s4Gs6ttgSj8qzJga/qlJMgSW1mKxuQTW4i0sTqQbqVtzXDS5AU+4A==} '@types/culori@4.0.1': resolution: {integrity: sha512-43M51r/22CjhbOXyGT361GZ9vncSVQ39u62x5eJdBQFviI8zWp2X5jzqg7k4M6PVgDQAClpy2bUe2dtwEgEDVQ==} @@ -2929,11 +2929,11 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - '@vitest/expect@4.0.3': - resolution: {integrity: sha512-v3eSDx/bF25pzar6aEJrrdTXJduEBU3uSGXHslIdGIpJVP8tQQHV6x1ZfzbFQ/bLIomLSbR/2ZCfnaEGkWkiVQ==} + '@vitest/expect@4.0.4': + resolution: {integrity: sha512-0ioMscWJtfpyH7+P82sGpAi3Si30OVV73jD+tEqXm5+rIx9LgnfdaOn45uaFkKOncABi/PHL00Yn0oW/wK4cXw==} - '@vitest/mocker@4.0.3': - resolution: {integrity: sha512-evZcRspIPbbiJEe748zI2BRu94ThCBE+RkjCpVF8yoVYuTV7hMe+4wLF/7K86r8GwJHSmAPnPbZhpXWWrg1qbA==} + '@vitest/mocker@4.0.4': + resolution: {integrity: sha512-UTtKgpjWj+pvn3lUM55nSg34098obGhSHH+KlJcXesky8b5wCUgg7s60epxrS6yAG8slZ9W8T9jGWg4PisMf5Q==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0-0 @@ -2943,25 +2943,25 @@ packages: vite: optional: true - '@vitest/pretty-format@4.0.3': - resolution: {integrity: sha512-N7gly/DRXzxa9w9sbDXwD9QNFYP2hw90LLLGDobPNwiWgyW95GMxsCt29/COIKKh3P7XJICR38PSDePenMBtsw==} + '@vitest/pretty-format@4.0.4': + resolution: {integrity: sha512-lHI2rbyrLVSd1TiHGJYyEtbOBo2SDndIsN3qY4o4xe2pBxoJLD6IICghNCvD7P+BFin6jeyHXiUICXqgl6vEaQ==} - '@vitest/runner@4.0.3': - resolution: {integrity: sha512-1/aK6fPM0lYXWyGKwop2Gbvz1plyTps/HDbIIJXYtJtspHjpXIeB3If07eWpVH4HW7Rmd3Rl+IS/+zEAXrRtXA==} + '@vitest/runner@4.0.4': + resolution: {integrity: sha512-99EDqiCkncCmvIZj3qJXBZbyoQ35ghOwVWNnQ5nj0Hnsv4Qm40HmrMJrceewjLVvsxV/JSU4qyx2CGcfMBmXJw==} - '@vitest/snapshot@4.0.3': - resolution: {integrity: sha512-amnYmvZ5MTjNCP1HZmdeczAPLRD6iOm9+2nMRUGxbe/6sQ0Ymur0NnR9LIrWS8JA3wKE71X25D6ya/3LN9YytA==} + '@vitest/snapshot@4.0.4': + resolution: {integrity: sha512-XICqf5Gi4648FGoBIeRgnHWSNDp+7R5tpclGosFaUUFzY6SfcpsfHNMnC7oDu/iOLBxYfxVzaQpylEvpgii3zw==} - '@vitest/spy@4.0.3': - resolution: {integrity: sha512-82vVL8Cqz7rbXaNUl35V2G7xeNMAjBdNOVaHbrzznT9BmiCiPOzhf0FhU3eP41nP1bLDm/5wWKZqkG4nyU95DQ==} + '@vitest/spy@4.0.4': + resolution: {integrity: sha512-G9L13AFyYECo40QG7E07EdYnZZYCKMTSp83p9W8Vwed0IyCG1GnpDLxObkx8uOGPXfDpdeVf24P1Yka8/q1s9g==} - '@vitest/ui@4.0.3': - resolution: {integrity: sha512-HURRrgGVzz2GQ2Imurp55FA+majHXgCXMzcwtojUZeRsAXyHNgEvxGRJf4QQY4kJeVakiugusGYeUqBgZ/xylg==} + '@vitest/ui@4.0.4': + resolution: {integrity: sha512-CmuFQLKw5SaLU/Flo8dLiQw2P2ONguhjfhBL9AYkTeDZPToE8laGvObXqRzS5G+4RD4SgWcI1USAmGxMVIqT0g==} peerDependencies: - vitest: 4.0.3 + vitest: 4.0.4 - '@vitest/utils@4.0.3': - resolution: {integrity: sha512-qV6KJkq8W3piW6MDIbGOmn1xhvcW4DuA07alqaQ+vdx7YA49J85pnwnxigZVQFQw3tWnQNRKWwhz5wbP6iv/GQ==} + '@vitest/utils@4.0.4': + resolution: {integrity: sha512-4bJLmSvZLyVbNsYFRpPYdJViG9jZyRvMZ35IF4ymXbRZoS+ycYghmwTGiscTXduUg2lgKK7POWIyXJNute1hjw==} '@vscode/markdown-it-katex@1.1.2': resolution: {integrity: sha512-+4IIv5PgrmhKvW/3LpkpkGg257OViEhXkOOgCyj5KMsjsOfnRXkni8XAuuF9Ui5p3B8WnUovlDXAQNb8RJ/RaQ==} @@ -3362,8 +3362,8 @@ packages: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} - atomically@2.0.3: - resolution: {integrity: sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==} + atomically@2.1.0: + resolution: {integrity: sha512-+gDffFXRW6sl/HCwbta7zK4uNqbPjv4YJEAdz7Vu+FLQHe77eZ4bvbJGi4hE0QPeJlMYMA3piXEr1UL3dAwx7Q==} available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} @@ -3931,8 +3931,8 @@ packages: resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} engines: {node: '>=0.12'} - dagre-d3-es@7.0.11: - resolution: {integrity: sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==} + dagre-d3-es@7.0.13: + resolution: {integrity: sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==} data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} @@ -4118,8 +4118,8 @@ packages: resolution: {integrity: sha512-dS5cbA9rA2VR4Ybuvhg6jvdmp46ubLn3E+px8cG/35aEDNclrqoCjg6mt0HYZ/M+OoESS3jSkCrqk1kWAEhWAw==} engines: {bun: '>=1', deno: '>=2', node: '>=16'} - electron-to-chromium@1.5.240: - resolution: {integrity: sha512-OBwbZjWgrCOH+g6uJsA2/7Twpas2OlepS9uvByJjR2datRDuKGYeD+nP8lBBks2qnB7bGJNHDUx7c/YLaT3QMQ==} + electron-to-chromium@1.5.242: + resolution: {integrity: sha512-msZ7SYGFpXkm/iUizlMrm/FPNeYo8uSltQccLVFO3fV4RN2JWGdG7Aatztxtw3uDWp3DkupfkrosLjUnhY+iOw==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -5662,8 +5662,8 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - mermaid@11.12.0: - resolution: {integrity: sha512-ZudVx73BwrMJfCFmSSJT84y6u5brEoV8DOItdHomNLz32uBjNrelm7mg95X7g+C6UoQH/W6mBLGDEDv73JdxBg==} + mermaid@11.12.1: + resolution: {integrity: sha512-UlIZrRariB11TY1RtTgUWp65tphtBv4CSq7vyS2ZZ2TgoMjs2nloq+wFqxiwcxlhHUvs7DPGgMjs2aeQxz5h9g==} micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} @@ -5769,8 +5769,8 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} - minimatch@10.0.3: - resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} engines: {node: 20 || >=22} minimatch@3.1.2: @@ -6634,8 +6634,8 @@ packages: engines: {node: '>=10'} hasBin: true - set-cookie-parser@2.7.1: - resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} @@ -6887,8 +6887,11 @@ packages: strnum@2.1.1: resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} - stubborn-fs@1.2.5: - resolution: {integrity: sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==} + stubborn-fs@2.0.0: + resolution: {integrity: sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==} + + stubborn-utils@1.0.1: + resolution: {integrity: sha512-bwtct4FpoH1eYdSMFc84fxnYynWwsy2u0joj94K+6caiPnjZIpwTLHT2u7CFAS0GumaBZVB5Y2GkJ46mJS76qg==} style-mod@4.1.3: resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==} @@ -7366,18 +7369,18 @@ packages: yaml: optional: true - vitest@4.0.3: - resolution: {integrity: sha512-IUSop8jgaT7w0g1yOM/35qVtKjr/8Va4PrjzH1OUb0YH4c3OXB2lCZDkMAB6glA8T5w8S164oJGsbcmAecr4sA==} + vitest@4.0.4: + resolution: {integrity: sha512-hV31h0/bGbtmDQc0KqaxsTO1v4ZQeF8ojDFuy4sZhFadwAqqvJA0LDw68QUocctI5EDpFMql/jVWKuPYHIf2Ew==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.0.3 - '@vitest/browser-preview': 4.0.3 - '@vitest/browser-webdriverio': 4.0.3 - '@vitest/ui': 4.0.3 + '@vitest/browser-playwright': 4.0.4 + '@vitest/browser-preview': 4.0.4 + '@vitest/browser-webdriverio': 4.0.4 + '@vitest/ui': 4.0.4 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -7455,8 +7458,8 @@ packages: whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - when-exit@2.1.4: - resolution: {integrity: sha512-4rnvd3A1t16PWzrBUcSDZqcAmsUIy4minDXT/CZ8F2mVDgd65i4Aalimgz1aQkRGU0iH5eT5+6Rx2TK8o443Pg==} + when-exit@2.1.5: + resolution: {integrity: sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==} when@3.7.7: resolution: {integrity: sha512-9lFZp/KHoqH6bPKjbWqa+3Dg/K/r2v0X/3/G2x4DBGchVS2QX2VXL3cZV994WQVnTM1/PD71Az25nAzryEUugw==} @@ -7767,20 +7770,20 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.917.0': + '@aws-sdk/client-s3@3.919.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 '@aws-sdk/core': 3.916.0 - '@aws-sdk/credential-provider-node': 3.917.0 + '@aws-sdk/credential-provider-node': 3.919.0 '@aws-sdk/middleware-bucket-endpoint': 3.914.0 '@aws-sdk/middleware-expect-continue': 3.917.0 - '@aws-sdk/middleware-flexible-checksums': 3.916.0 + '@aws-sdk/middleware-flexible-checksums': 3.919.0 '@aws-sdk/middleware-host-header': 3.914.0 '@aws-sdk/middleware-location-constraint': 3.914.0 '@aws-sdk/middleware-logger': 3.914.0 - '@aws-sdk/middleware-recursion-detection': 3.914.0 + '@aws-sdk/middleware-recursion-detection': 3.919.0 '@aws-sdk/middleware-sdk-s3': 3.916.0 '@aws-sdk/middleware-ssec': 3.914.0 '@aws-sdk/middleware-user-agent': 3.916.0 @@ -7829,14 +7832,14 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.916.0': + '@aws-sdk/client-sso@3.919.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 '@aws-sdk/core': 3.916.0 '@aws-sdk/middleware-host-header': 3.914.0 '@aws-sdk/middleware-logger': 3.914.0 - '@aws-sdk/middleware-recursion-detection': 3.914.0 + '@aws-sdk/middleware-recursion-detection': 3.919.0 '@aws-sdk/middleware-user-agent': 3.916.0 '@aws-sdk/region-config-resolver': 3.914.0 '@aws-sdk/types': 3.914.0 @@ -7909,15 +7912,15 @@ snapshots: '@smithy/util-stream': 4.5.4 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.917.0': + '@aws-sdk/credential-provider-ini@3.919.0': dependencies: '@aws-sdk/core': 3.916.0 '@aws-sdk/credential-provider-env': 3.916.0 '@aws-sdk/credential-provider-http': 3.916.0 '@aws-sdk/credential-provider-process': 3.916.0 - '@aws-sdk/credential-provider-sso': 3.916.0 - '@aws-sdk/credential-provider-web-identity': 3.917.0 - '@aws-sdk/nested-clients': 3.916.0 + '@aws-sdk/credential-provider-sso': 3.919.0 + '@aws-sdk/credential-provider-web-identity': 3.919.0 + '@aws-sdk/nested-clients': 3.919.0 '@aws-sdk/types': 3.914.0 '@smithy/credential-provider-imds': 4.2.3 '@smithy/property-provider': 4.2.3 @@ -7927,14 +7930,14 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.917.0': + '@aws-sdk/credential-provider-node@3.919.0': dependencies: '@aws-sdk/credential-provider-env': 3.916.0 '@aws-sdk/credential-provider-http': 3.916.0 - '@aws-sdk/credential-provider-ini': 3.917.0 + '@aws-sdk/credential-provider-ini': 3.919.0 '@aws-sdk/credential-provider-process': 3.916.0 - '@aws-sdk/credential-provider-sso': 3.916.0 - '@aws-sdk/credential-provider-web-identity': 3.917.0 + '@aws-sdk/credential-provider-sso': 3.919.0 + '@aws-sdk/credential-provider-web-identity': 3.919.0 '@aws-sdk/types': 3.914.0 '@smithy/credential-provider-imds': 4.2.3 '@smithy/property-provider': 4.2.3 @@ -7953,11 +7956,11 @@ snapshots: '@smithy/types': 4.8.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.916.0': + '@aws-sdk/credential-provider-sso@3.919.0': dependencies: - '@aws-sdk/client-sso': 3.916.0 + '@aws-sdk/client-sso': 3.919.0 '@aws-sdk/core': 3.916.0 - '@aws-sdk/token-providers': 3.916.0 + '@aws-sdk/token-providers': 3.919.0 '@aws-sdk/types': 3.914.0 '@smithy/property-provider': 4.2.3 '@smithy/shared-ini-file-loader': 4.3.3 @@ -7966,10 +7969,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.917.0': + '@aws-sdk/credential-provider-web-identity@3.919.0': dependencies: '@aws-sdk/core': 3.916.0 - '@aws-sdk/nested-clients': 3.916.0 + '@aws-sdk/nested-clients': 3.919.0 '@aws-sdk/types': 3.914.0 '@smithy/property-provider': 4.2.3 '@smithy/shared-ini-file-loader': 4.3.3 @@ -7995,7 +7998,7 @@ snapshots: '@smithy/types': 4.8.0 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.916.0': + '@aws-sdk/middleware-flexible-checksums@3.919.0': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 @@ -8030,10 +8033,10 @@ snapshots: '@smithy/types': 4.8.0 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.914.0': + '@aws-sdk/middleware-recursion-detection@3.919.0': dependencies: '@aws-sdk/types': 3.914.0 - '@aws/lambda-invoke-store': 0.0.1 + '@aws/lambda-invoke-store': 0.1.1 '@smithy/protocol-http': 5.3.3 '@smithy/types': 4.8.0 tslib: 2.8.1 @@ -8071,14 +8074,14 @@ snapshots: '@smithy/types': 4.8.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.916.0': + '@aws-sdk/nested-clients@3.919.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 '@aws-sdk/core': 3.916.0 '@aws-sdk/middleware-host-header': 3.914.0 '@aws-sdk/middleware-logger': 3.914.0 - '@aws-sdk/middleware-recursion-detection': 3.914.0 + '@aws-sdk/middleware-recursion-detection': 3.919.0 '@aws-sdk/middleware-user-agent': 3.916.0 '@aws-sdk/region-config-resolver': 3.914.0 '@aws-sdk/types': 3.914.0 @@ -8130,10 +8133,10 @@ snapshots: '@smithy/types': 4.8.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.916.0': + '@aws-sdk/token-providers@3.919.0': dependencies: '@aws-sdk/core': 3.916.0 - '@aws-sdk/nested-clients': 3.916.0 + '@aws-sdk/nested-clients': 3.919.0 '@aws-sdk/types': 3.914.0 '@smithy/property-provider': 4.2.3 '@smithy/shared-ini-file-loader': 4.3.3 @@ -8184,7 +8187,7 @@ snapshots: fast-xml-parser: 5.2.5 tslib: 2.8.1 - '@aws/lambda-invoke-store@0.0.1': {} + '@aws/lambda-invoke-store@0.1.1': {} '@babel/code-frame@7.27.1': dependencies: @@ -8692,7 +8695,7 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@iconify/json@2.2.400': + '@iconify/json@2.2.401': dependencies: '@iconify/types': 2.0.0 pathe: 2.0.3 @@ -10002,7 +10005,7 @@ snapshots: '@types/deep-eql': 4.0.2 assertion-error: 2.0.1 - '@types/chrome@0.1.24': + '@types/chrome@0.1.27': dependencies: '@types/filesystem': 0.0.36 '@types/har-format': 1.2.16 @@ -10387,54 +10390,54 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/expect@4.0.3': + '@vitest/expect@4.0.4': dependencies: '@standard-schema/spec': 1.0.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.0.3 - '@vitest/utils': 4.0.3 + '@vitest/spy': 4.0.4 + '@vitest/utils': 4.0.4 chai: 6.2.0 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.3(vite@7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))': + '@vitest/mocker@4.0.4(vite@7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))': dependencies: - '@vitest/spy': 4.0.3 + '@vitest/spy': 4.0.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: vite: 7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) - '@vitest/pretty-format@4.0.3': + '@vitest/pretty-format@4.0.4': dependencies: tinyrainbow: 3.0.3 - '@vitest/runner@4.0.3': + '@vitest/runner@4.0.4': dependencies: - '@vitest/utils': 4.0.3 + '@vitest/utils': 4.0.4 pathe: 2.0.3 - '@vitest/snapshot@4.0.3': + '@vitest/snapshot@4.0.4': dependencies: - '@vitest/pretty-format': 4.0.3 + '@vitest/pretty-format': 4.0.4 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.0.3': {} + '@vitest/spy@4.0.4': {} - '@vitest/ui@4.0.3(vitest@4.0.3)': + '@vitest/ui@4.0.4(vitest@4.0.4)': dependencies: - '@vitest/utils': 4.0.3 + '@vitest/utils': 4.0.4 fflate: 0.8.2 flatted: 3.3.3 pathe: 2.0.3 sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vitest: 4.0.3(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) + vitest: 4.0.4(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) - '@vitest/utils@4.0.3': + '@vitest/utils@4.0.4': dependencies: - '@vitest/pretty-format': 4.0.3 + '@vitest/pretty-format': 4.0.4 tinyrainbow: 3.0.3 '@vscode/markdown-it-katex@1.1.2': @@ -11174,10 +11177,10 @@ snapshots: atomic-sleep@1.0.0: {} - atomically@2.0.3: + atomically@2.1.0: dependencies: - stubborn-fs: 1.2.5 - when-exit: 2.1.4 + stubborn-fs: 2.0.0 + when-exit: 2.1.5 available-typed-arrays@1.0.7: dependencies: @@ -11247,7 +11250,7 @@ snapshots: dependencies: baseline-browser-mapping: 2.8.20 caniuse-lite: 1.0.30001751 - electron-to-chromium: 1.5.240 + electron-to-chromium: 1.5.242 node-releases: 2.0.26 update-browserslist-db: 1.1.4(browserslist@4.27.0) @@ -11524,7 +11527,7 @@ snapshots: configstore@7.1.0: dependencies: - atomically: 2.0.3 + atomically: 2.1.0 dot-prop: 9.0.0 graceful-fs: 4.2.11 xdg-basedir: 5.1.0 @@ -11773,7 +11776,7 @@ snapshots: es5-ext: 0.10.64 type: 2.7.3 - dagre-d3-es@7.0.11: + dagre-d3-es@7.0.13: dependencies: d3: 7.9.0 lodash-es: 4.17.21 @@ -11938,7 +11941,7 @@ snapshots: '@noble/curves': 1.9.7 '@noble/hashes': 1.8.0 - electron-to-chromium@1.5.240: {} + electron-to-chromium@1.5.242: {} emoji-regex@10.6.0: {} @@ -12184,6 +12187,16 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0(jiti@2.6.1)): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.38.0(jiti@2.6.1) + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)): dependencies: debug: 3.2.7 @@ -12194,12 +12207,12 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-boundaries@5.1.0(eslint@9.38.0(jiti@2.6.1)): + eslint-plugin-boundaries@5.1.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1)): dependencies: chalk: 4.1.2 eslint: 9.38.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0(jiti@2.6.1)) micromatch: 4.0.8 transitivePeerDependencies: - '@typescript-eslint/parser' @@ -12757,7 +12770,7 @@ snapshots: dependencies: foreground-child: 3.3.1 jackspeak: 4.1.1 - minimatch: 10.0.3 + minimatch: 10.1.1 minipass: 7.1.2 package-json-from-dist: 1.0.1 path-scurry: 2.0.0 @@ -13847,7 +13860,7 @@ snapshots: merge2@1.4.1: {} - mermaid@11.12.0: + mermaid@11.12.1: dependencies: '@braintree/sanitize-url': 7.1.1 '@iconify/utils': 3.0.2 @@ -13858,7 +13871,7 @@ snapshots: cytoscape-fcose: 2.2.0(cytoscape@3.33.1) d3: 7.9.0 d3-sankey: 0.12.3 - dagre-d3-es: 7.0.11 + dagre-d3-es: 7.0.13 dayjs: 1.11.18 dompurify: 3.3.0 katex: 0.16.25 @@ -14078,7 +14091,7 @@ snapshots: mimic-function@5.0.1: {} - minimatch@10.0.3: + minimatch@10.1.1: dependencies: '@isaacs/brace-expansion': 5.0.0 @@ -14637,7 +14650,7 @@ snapshots: dependencies: cookie: 1.0.2 react: 19.2.0 - set-cookie-parser: 2.7.1 + set-cookie-parser: 2.7.2 optionalDependencies: react-dom: 19.2.0(react@19.2.0) @@ -14934,7 +14947,7 @@ snapshots: semver@7.7.3: {} - set-cookie-parser@2.7.1: {} + set-cookie-parser@2.7.2: {} set-function-length@1.2.2: dependencies: @@ -15235,7 +15248,11 @@ snapshots: strnum@2.1.1: {} - stubborn-fs@1.2.5: {} + stubborn-fs@2.0.0: + dependencies: + stubborn-utils: 1.0.1 + + stubborn-utils@1.0.1: {} style-mod@4.1.3: {} @@ -15766,15 +15783,15 @@ snapshots: terser: 5.44.0 yaml: 2.8.1 - vitest@4.0.3(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1): + vitest@4.0.4(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1): dependencies: - '@vitest/expect': 4.0.3 - '@vitest/mocker': 4.0.3(vite@7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)) - '@vitest/pretty-format': 4.0.3 - '@vitest/runner': 4.0.3 - '@vitest/snapshot': 4.0.3 - '@vitest/spy': 4.0.3 - '@vitest/utils': 4.0.3 + '@vitest/expect': 4.0.4 + '@vitest/mocker': 4.0.4(vite@7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)) + '@vitest/pretty-format': 4.0.4 + '@vitest/runner': 4.0.4 + '@vitest/snapshot': 4.0.4 + '@vitest/spy': 4.0.4 + '@vitest/utils': 4.0.4 debug: 4.4.3 es-module-lexer: 1.7.0 expect-type: 1.2.2 @@ -15791,7 +15808,7 @@ snapshots: optionalDependencies: '@types/debug': 4.1.12 '@types/node': 22.17.2 - '@vitest/ui': 4.0.3(vitest@4.0.3) + '@vitest/ui': 4.0.4(vitest@4.0.4) transitivePeerDependencies: - jiti - less @@ -15888,7 +15905,7 @@ snapshots: tr46: 1.0.1 webidl-conversions: 4.0.2 - when-exit@2.1.4: {} + when-exit@2.1.5: {} when@3.7.7: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 7c7d65647..178b16ee6 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -10,7 +10,7 @@ catalogs: prettier: ^3.6.2 typescript-eslint: ^8.46.2 types: - '@types/chrome': ^0.1.24 + '@types/chrome': ^0.1.27 typescript: ^5.9.3 ignoredBuiltDependencies: From 62eeab250696aa2ea52aaefabf2e936e535e969f Mon Sep 17 00:00:00 2001 From: Pham Ngoc Duong Date: Wed, 29 Oct 2025 17:33:53 +0700 Subject: [PATCH 03/85] chore: update bug report template --- .github/ISSUE_TEMPLATE/bug_report.yml | 36 +++++++-------------------- 1 file changed, 9 insertions(+), 27 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 7d7d8e226..f055cec97 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -3,10 +3,6 @@ description: File a bug report title: "[Bug]: " labels: ["bug"] body: - - type: markdown - attributes: - value: | - Thanks for taking the time to fill out this bug report! - type: input id: version attributes: @@ -15,11 +11,19 @@ body: placeholder: 2.x.x ("Latest" is not an acceptable answer) validations: required: true + - type: input + id: browser + attributes: + label: Browser + description: Provide the browser(s) and version(s) where the issue occurs + placeholder: e.g. Google Chrome 140, Firefox Android 133, Comet 140, etc. + validations: + required: true - type: textarea id: bug-description attributes: label: Describe the bug - description: A clear and concise description of what the bug is + description: A clear and concise description of what the bug is, screenshots/recordings will help speed up the resolution process validations: required: true - type: checkboxes @@ -58,25 +62,3 @@ body: description: Include debug logs from the Settings Dashboard > Settings > Debug > Copy validations: required: false - - type: textarea - id: screenshots - attributes: - label: Screenshots - description: If applicable, add screenshots to help explain your problem - validations: - required: false - - type: input - id: browser - attributes: - label: Browser - description: Provide the browser(s) and version(s) where the issue occurs - placeholder: e.g. Google Chrome 140, Firefox Android 133, Comet 140, etc. - validations: - required: true - - type: textarea - id: additional-context - attributes: - label: Additional context - description: Add any other context about the problem here - validations: - required: false From a081d3ae55448f2387ecf5178ec65e1053c1c62a Mon Sep 17 00:00:00 2001 From: Pham Ngoc Duong Date: Thu, 30 Oct 2025 14:52:21 +0700 Subject: [PATCH 04/85] lint(pplx-ext): enforce `no-unnecessary-condition` --- .github/ISSUE_TEMPLATE/bug_report.yml | 1 + README.md | 7 - packages/async-dep-manager/package.json | 2 +- packages/eslint-config/rules/typescript.js | 3 +- perplexity/extension/.gitignore | 4 +- perplexity/extension/.vscode/settings.json | 3 +- perplexity/extension/README.md | 7 - perplexity/extension/changelogs/2.7.10.md | 5 + perplexity/extension/cli/package.json | 2 +- .../cli/src/web-stores/firefox-publish.ts | 6 +- perplexity/extension/lint-f.txt | 179 ++ perplexity/extension/lint.txt | 425 +++++ perplexity/extension/package.json | 22 +- .../src/__registries__/core-plugins/index.ts | 4 +- .../src/__registries__/cs-hash-router.ts | 1 + .../src/__registries__/cs-ui/index.tsx | 1 + .../src/__registries__/plugin-settings-uis.ts | 2 + .../src/__registries__/plugins/index.ts | 4 +- .../src/__registries__/plugins/predicates.ts | 7 - .../extension/src/auto-imports-config.ts | 4 + perplexity/extension/src/auto-imports.d.ts | 1 + .../ExtensionContextInvalidationWatchdog.tsx | 2 +- .../extension/src/components/Toaster.tsx | 2 +- .../src/components/hotkey-recorder/index.tsx | 9 +- .../src/components/hotkey-recorder/utils.ts | 2 +- .../src/components/icons/FaFileExport.tsx | 23 - .../src/components/icons/FlagVietnam.tsx | 27 - .../extension/src/components/ui/combo.tsx | 6 +- .../src/components/ui/floating-panel.tsx | 2 +- .../extension/src/components/ui/form.tsx | 4 - .../src/components/ui/hover-card.tsx | 6 +- .../extension/src/components/ui/select.tsx | 6 +- .../extension/src/components/ui/use-toast.ts | 2 +- .../src/data/dashboard/themes/migration.ts | 1 + .../components/sidebar/Version.tsx | 2 +- .../options-page/dashboard/Dashboard.tsx | 2 +- .../pages/plugins/PluginsEnableSet.tsx | 2 +- .../components/plugin-card/PluginCard.tsx | 5 - .../plugin-card/PluginCardContext.tsx | 14 +- .../plugin-card/PluginCardFooter.tsx | 43 +- .../components/plugin-card/PluginCardTags.tsx | 2 +- .../components/plugin-card/usePluginCard.ts | 2 +- .../PluginSettingsWrapper.tsx | 5 +- .../pages/plugins/hooks/useFilteredPlugins.ts | 11 +- .../dashboard/pages/settings/IndexPage.tsx | 2 +- .../components/ExtensionIconActionSelect.tsx | 4 +- .../settings/components/ImportDataButtons.tsx | 26 +- .../ManagePermissionsDialogWrapper.tsx | 8 +- .../settings/sections/DevToolsSection.tsx | 2 +- .../ColorInput/BuiltInColorPicker.tsx | 9 +- .../themes/components/InstantCssEnable.tsx | 6 +- .../ThemeCard/DisableThemeButton.tsx | 2 +- .../themes/components/ThemeCard/ThemeCard.tsx | 6 +- .../themes/context/EditThemeProvider.tsx | 4 +- .../onboarding/ExtensionIconAction.tsx | 8 +- .../options-page/onboarding/index.tsx | 4 +- .../plugins-guard/CsUiPluginsGuard.tsx | 10 +- .../__async-deps__/plugins-guard/guards.ts | 10 +- .../plugins-guard/store.loader.ts | 28 +- .../_main-world/fiber-search/utils.ts | 21 +- .../network-intercept/_service/index.test.ts | 2 +- .../network-intercept/_service/index.ts | 9 +- .../network-intercept/interceptors/fetch.ts | 7 +- .../interceptors/navigator-beacon.ts | 4 +- .../interceptors/web-socket.ts | 2 +- .../web-socket-message-parser.ts | 2 +- .../instant-css-background-watchdog.ts | 4 +- .../rebuild-on-ext-update.bg-worker.ts | 2 - .../_main-world/actions/code-block-content.ts | 9 +- .../plugins/__core__/dom-observers/index.ts | 19 +- .../internal-search-states/index.loader.ts | 2 +- .../thread/message-blocks/index.loader.ts | 6 + .../src/plugins/__core__/enable-states.ts | 2 +- .../plugins/__core__/pplx-web-socket/index.ts | 12 +- .../slash-command/store/slices/pages/utils.ts | 4 +- .../__core__/slash-command/textbox-adapter.ts | 2 +- .../elements/query-box/portal-containers.ts | 118 -- .../__ui-groups__/elements/query-box/utils.ts | 30 +- .../elements/thread-message-index-context.tsx | 11 +- .../routes/Home/CometAffiliateDialog.tsx | 1 - .../post-update-announcer.bg-worker.ts | 2 - .../better-search-params/settings-ui.tsx | 3 +- .../src/plugins/better-search-params/utils.ts | 5 +- .../plugins/better-sidebar/settings-ui.tsx | 58 +- .../ActionDialog.tsx | 2 +- .../settings-ui.tsx | 7 +- .../src/plugins/comet-isolated-zoom/loader.ts | 2 +- .../comet-isolated-zoom/settings-ui.tsx | 7 +- .../src/plugins/command-menu/cache.loader.ts | 4 +- .../command-menu/pages/space-threads/Page.tsx | 2 +- .../command-menu/pages/spaces/Footer.tsx | 4 +- .../pages/spaces/SpaceItemFile.tsx | 24 +- .../pages/spaces/SpacePreview.tsx | 9 +- .../command-menu/pages/threads/ThreadItem.tsx | 18 +- .../pages/threads/filters/SortFilter.tsx | 2 +- .../pages/threads/filters/SourceFilter.tsx | 2 +- .../filters/TemporaryThreadsFilter.tsx | 3 +- .../pages/threads/filters/TypeFilter.tsx | 2 +- .../src/plugins/command-menu/settings-ui.tsx | 6 +- .../SpacesSearchPageKeybinding.tsx | 5 +- .../ThreadsSearchPageKeybinding.tsx | 5 +- .../ToggleCommandDialogKeybinding.tsx | 4 +- .../settings-ui/ToggleSidecarKeybinding.tsx | 5 +- .../force-writing-mode/settings-ui.tsx | 6 +- .../home-custom-slogan/settings-ui.tsx | 6 +- .../image-gen-model-selector/settings-ui.tsx | 4 +- .../components/TriggerButton.tsx | 5 +- ...model-selection-mismatch-warning.loader.ts | 3 +- .../language-model-selector/settings-ui.tsx | 11 +- .../store/sync.loader.ts | 2 +- .../plugins/language-model-selector/utils.ts | 6 +- .../prompt-history/hooks/usePromptHistory.ts | 2 +- .../plugins/prompt-history/settings-ui.tsx | 17 +- .../src/plugins/prompt-history/utils.ts | 2 +- .../settings-ui.tsx | 5 +- .../components/ArtifactContent.tsx | 6 +- .../components/ArtifactHeader.tsx | 22 +- .../PrePromptInstallationDialog.tsx | 8 +- .../thread-artifacts/components/Preview.tsx | 2 - .../components/PreviewToggle.tsx | 6 +- .../components/VersionsNavigator.tsx | 11 +- .../components/renderer/Markmap.tsx | 51 +- .../components/renderer/Mermaid.tsx | 51 +- .../plugins/thread-artifacts/settings-ui.tsx | 6 +- .../plugins/thread-artifacts/store.loader.ts | 7 +- .../useHandleArtifactsState.ts | 1 - .../useHandleAutonomousArtifactsState.ts | 3 +- .../src/plugins/thread-artifacts/utils.ts | 11 +- .../settings-ui/FineGrainedOptions.tsx | 36 +- .../settings-ui/GlobalOptions.tsx | 30 +- .../settings-ui/index.tsx | 4 +- .../sticky-header.css | 3 +- .../variants/HighlightedCode.tsx | 2 +- .../artifact-placeholders/Wrapper.tsx | 8 +- .../variants/base/Header.tsx | 4 +- .../variants/base/Wrapper.tsx | 2 +- .../settings-ui.tsx | 5 +- .../_main-world/trigger-rewrite-option.ts | 8 +- .../settings-ui.tsx | 5 +- .../settings-ui.tsx | 6 +- .../plugins/thread-export/ExportActions.tsx | 24 - .../src/plugins/thread-export/ExportMenu.tsx | 105 +- .../_locales/plugin-thread-export.bn-BD.ts | 4 + .../_locales/plugin-thread-export.cs-CZ.ts | 4 + .../_locales/plugin-thread-export.de-DE.ts | 4 + .../_locales/plugin-thread-export.el-GR.ts | 4 + .../_locales/plugin-thread-export.en-US.ts | 4 + .../_locales/plugin-thread-export.es-ES.ts | 4 + .../_locales/plugin-thread-export.fr-FR.ts | 4 + .../_locales/plugin-thread-export.hi-IN.ts | 4 + .../_locales/plugin-thread-export.hr-HR.ts | 4 + .../_locales/plugin-thread-export.hu-HU.ts | 4 + .../_locales/plugin-thread-export.id-ID.ts | 4 + .../_locales/plugin-thread-export.it-IT.ts | 4 + .../_locales/plugin-thread-export.ja-JP.ts | 4 + .../_locales/plugin-thread-export.ko-KR.ts | 4 + .../_locales/plugin-thread-export.nl-NL.ts | 4 + .../_locales/plugin-thread-export.pl-PL.ts | 4 + .../_locales/plugin-thread-export.pt-BR.ts | 4 + .../_locales/plugin-thread-export.pt-PT.ts | 4 + .../_locales/plugin-thread-export.ro-RO.ts | 4 + .../_locales/plugin-thread-export.ru-RU.ts | 4 + .../_locales/plugin-thread-export.sk-SK.ts | 4 + .../plugin-thread-export.sr-Cyrl-ME.ts | 4 + .../_locales/plugin-thread-export.zh-CN.ts | 4 + .../_locales/plugin-thread-export.zh-TW.ts | 4 + .../thread-export/hooks/useCopyPplxThread.ts | 32 +- .../src/plugins/thread-export/settings-ui.tsx | 5 +- .../thread-message-length/settings-ui.tsx | 7 +- .../hooks/usePplxTtsRequest.ts | 17 +- .../thread-message-tts/player/coordinator.ts | 6 +- .../player/pplx-streaming-tts-player.ts | 27 +- .../thread-message-tts/settings-ui.tsx | 7 +- .../src/plugins/thread-raw-headings/loader.ts | 2 +- .../thread-raw-headings/settings-ui.tsx | 5 +- .../src/plugins/thread-toc/TocPanel.tsx | 5 +- .../src/plugins/thread-toc/settings-ui.tsx | 5 +- .../plugins/thread-toc/usePanelPosition.ts | 32 +- .../src/plugins/zen-mode/settings-ui.tsx | 13 +- .../extension/src/plugins/zen-mode/utils.ts | 2 +- .../comet-affiliate/index.remote-resources.ts | 2 +- .../cplx-api/remote-resources/utils.ts | 5 +- .../versioned-remote-resources/utils.ts | 9 +- .../src/services/externals/pplx-api/index.ts | 15 +- .../externals/pplx-api/pplx-api.types.ts | 2 +- .../services/externals/pplx-api/query-keys.ts | 29 +- .../features/content-script-utils/index.ts | 4 - .../features/instant-css/coordinator.ts | 4 +- .../extension-settings/migrations.ts | 9 +- .../useExtensionSettings.ts | 12 +- .../src/services/infra/i18n/dayjs.ts | 2 +- .../src/services/infra/indexed-db/index.ts | 7 +- .../src/services/infra/query-client/index.ts | 5 +- perplexity/extension/src/types/utils.types.ts | 4 +- .../extension/src/utils/dom-utils/generics.ts | 2 +- .../src/utils/dom-utils/lexical-utils.ts | 9 +- .../src/utils/misc/normalize-path.ts | 1 + perplexity/extension/src/utils/misc/utils.ts | 4 +- .../src/utils/wrappers/clipboard-utils.ts | 22 + .../extension/src/utils/wrappers/comet.ts | 11 +- .../src/utils/wrappers/error-wrapper.ts | 47 - .../src/utils/wrappers/try-catch.test.ts | 249 +++ .../extension/src/utils/wrappers/try-catch.ts | 65 + pnpm-lock.yaml | 1456 ++++++++--------- 204 files changed, 2380 insertions(+), 1801 deletions(-) create mode 100644 perplexity/extension/changelogs/2.7.10.md create mode 100644 perplexity/extension/lint-f.txt create mode 100644 perplexity/extension/lint.txt delete mode 100644 perplexity/extension/src/components/icons/FaFileExport.tsx delete mode 100644 perplexity/extension/src/components/icons/FlagVietnam.tsx delete mode 100644 perplexity/extension/src/plugins/__ui-groups__/elements/query-box/portal-containers.ts delete mode 100644 perplexity/extension/src/plugins/thread-export/ExportActions.tsx delete mode 100644 perplexity/extension/src/utils/wrappers/error-wrapper.ts create mode 100644 perplexity/extension/src/utils/wrappers/try-catch.test.ts create mode 100644 perplexity/extension/src/utils/wrappers/try-catch.ts diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index f055cec97..41bc3b005 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -60,5 +60,6 @@ body: attributes: label: Debug Logs description: Include debug logs from the Settings Dashboard > Settings > Debug > Copy + render: json validations: required: false diff --git a/README.md b/README.md index 3c2b05914..ffe2bb0ca 100644 --- a/README.md +++ b/README.md @@ -10,13 +10,6 @@
---- - -> [!TIP] -> 🎁 **FREE PERPLEXITY PRO!** Sign up, ask your first question on the new Comet browser, and unlock premium features instantly for the first 30 days ➡️ [https://pplx.ai/pnd280](https://pplx.ai/pnd280) - ---- - > [!NOTE] > Originally a [Perplexity AI](https://perplexity.ai/) extension, this repository has now been restructured into a suite of enhancements for multiple platforms and services. diff --git a/packages/async-dep-manager/package.json b/packages/async-dep-manager/package.json index f8969770b..0648ca195 100644 --- a/packages/async-dep-manager/package.json +++ b/packages/async-dep-manager/package.json @@ -29,6 +29,6 @@ "tsup": "^8.5.0", "typescript": "catalog:types", "typescript-eslint": "catalog:lint", - "vitest": "^4.0.4" + "vitest": "^4.0.5" } } diff --git a/packages/eslint-config/rules/typescript.js b/packages/eslint-config/rules/typescript.js index 1675dc989..50df26fa4 100644 --- a/packages/eslint-config/rules/typescript.js +++ b/packages/eslint-config/rules/typescript.js @@ -18,8 +18,9 @@ export default defineConfig({ "@typescript-eslint/consistent-type-imports": "error", "@typescript-eslint/no-explicit-any": "warn", "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/no-this-alias": "off", + "@typescript-eslint/no-this-alias": "error", "@typescript-eslint/no-unsafe-declaration-merging": "error", + "@typescript-eslint/no-unnecessary-condition": "error", "@typescript-eslint/no-floating-promises": [ "warn", { diff --git a/perplexity/extension/.gitignore b/perplexity/extension/.gitignore index 0c796b00d..b1ab5e115 100644 --- a/perplexity/extension/.gitignore +++ b/perplexity/extension/.gitignore @@ -28,4 +28,6 @@ secrets.*.js /release /changelogs/listing.json -cdn \ No newline at end of file +cdn + +.eslintcache \ No newline at end of file diff --git a/perplexity/extension/.vscode/settings.json b/perplexity/extension/.vscode/settings.json index de6b4dde5..a416a0d2a 100644 --- a/perplexity/extension/.vscode/settings.json +++ b/perplexity/extension/.vscode/settings.json @@ -13,7 +13,8 @@ "**/*.tsbuildinfo": true, "**/CVS": true, "**/node_modules": true, - "**/Thumbs.db": true + "**/Thumbs.db": true, + "**/.eslintcache": true }, "files.watcherExclude": { "**/.git/objects/**": true, diff --git a/perplexity/extension/README.md b/perplexity/extension/README.md index c856f62a2..46eb4a9e9 100644 --- a/perplexity/extension/README.md +++ b/perplexity/extension/README.md @@ -38,13 +38,6 @@ A powerful browser extension that enhances your Perplexity AI experience with ad ---- - -> [!TIP] -> 🎁 **FREE PERPLEXITY PRO!** Sign up, ask your first question on the new Comet browser, and unlock premium features instantly for the first 30 days ➡️ [https://pplx.ai/pnd280](https://pplx.ai/pnd280) - ---- - ## Capabilities - Provides a comprehensive set of added features and UI/UX improvements with excellent modularity and customization diff --git a/perplexity/extension/changelogs/2.7.10.md b/perplexity/extension/changelogs/2.7.10.md new file mode 100644 index 000000000..6eb5c2b0e --- /dev/null +++ b/perplexity/extension/changelogs/2.7.10.md @@ -0,0 +1,5 @@ +## Bug Fixes + +- `Thread Export`: Fixed an issue with download on long threads +- `Command Menu`: Fixed Space files download +- Speculative fix for rare cases where Thread Plugins might not work after a new answer is generated diff --git a/perplexity/extension/cli/package.json b/perplexity/extension/cli/package.json index 8563dc4e8..5da049852 100644 --- a/perplexity/extension/cli/package.json +++ b/perplexity/extension/cli/package.json @@ -14,7 +14,7 @@ "r2:versioned-rr:gen": "dotenvx run -f ./src/r2/.env --quiet -- bun ./src/r2/remote-resources/versioned.ts" }, "dependencies": { - "@aws-sdk/client-s3": "^3.919.0", + "@aws-sdk/client-s3": "^3.921.0", "@dotenvx/dotenvx": "^1.51.0", "chrome-webstore-upload": "^4.0.3", "commander": "^14.0.2", diff --git a/perplexity/extension/cli/src/web-stores/firefox-publish.ts b/perplexity/extension/cli/src/web-stores/firefox-publish.ts index c55507821..842428479 100644 --- a/perplexity/extension/cli/src/web-stores/firefox-publish.ts +++ b/perplexity/extension/cli/src/web-stores/firefox-publish.ts @@ -3,7 +3,7 @@ import path from "path"; import process from "process"; import packageJson from "#/package.json" assert { type: "json" }; -import { errorWrapper } from "#/src/utils/wrappers/error-wrapper"; +import { tryCatch } from "#/src/utils/wrappers/try-catch"; import { Logger } from "@complexity/cli-logger"; import { execAsync } from "@/utils"; @@ -39,9 +39,9 @@ async function main(): Promise { fs.mkdirSync(extractDir, { recursive: true }); try { - const [releaseNotes] = errorWrapper(() => + const [releaseNotes] = tryCatch(() => fs.readFileSync(path.join(CHANGELOG_DIR, `${extVersion}.md`), "utf8"), - )(); + ); const metdataData = { version: { diff --git a/perplexity/extension/lint-f.txt b/perplexity/extension/lint-f.txt new file mode 100644 index 000000000..bbd9fdb94 --- /dev/null +++ b/perplexity/extension/lint-f.txt @@ -0,0 +1,179 @@ +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\__registries__\core-plugins\index.ts + 28:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 92:17 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\__registries__\cs-hash-router.ts + 14:15 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\__registries__\cs-ui\index.tsx + 123:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\__registries__\plugin-settings-uis.ts + 35:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 40:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\__registries__\plugins\index.ts + 54:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 223:17 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\__registries__\plugins\predicates.ts + 11:5 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\components\ExtensionContextInvalidationWatchdog.tsx + 18:14 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\components\hotkey-recorder\index.tsx + 26:19 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 132:26 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 141:5 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 161:11 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\components\hotkey-recorder\utils.ts + 34:12 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\components\ui\floating-panel.tsx + 174:12 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\components\ui\form.tsx + 46:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\data\dashboard\themes\migration.ts + 12:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\plugins\PluginsEnableSet.tsx + 92:15 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\plugins\components\plugin-card\PluginCard.tsx + 34:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\plugins\components\plugin-card\PluginCardContext.tsx + 59:5 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 59:36 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\plugins\components\plugin-card\PluginCardFooter.tsx + 51:16 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 83:27 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\plugins\components\plugin-card\PluginCardTags.tsx + 10:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\plugins\components\plugin-card\usePluginCard.ts + 53:17 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\plugins\hooks\useFilteredPlugins.ts + 27:11 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 43:12 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\settings\IndexPage.tsx + 15:16 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\settings\components\ExtensionIconActionSelect.tsx + 19:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition + 21:33 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\settings\components\ImportDataButtons.tsx + 23:11 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\settings\components\ManagePermissionsDialogWrapper.tsx + 48:12 error Unnecessary conditional, comparison is always true, since `2 > 0` is true @typescript-eslint/no-unnecessary-condition + 54:20 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 54:45 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 55:46 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 56:29 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 56:49 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\settings\sections\DevToolsSection.tsx + 37:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\themes\components\ColorInput\BuiltInColorPicker.tsx + 97:5 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\themes\components\InstantCssEnable.tsx + 25:24 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 25:37 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\themes\components\ThemeCard\DisableThemeButton.tsx + 13:33 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 13:50 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\themes\components\ThemeCard\ThemeCard.tsx + 22:33 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\themes\context\EditThemeProvider.tsx + 33:30 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 34:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\onboarding\ExtensionIconAction.tsx + 40:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition + 42:33 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\onboarding\index.tsx + 163:37 error Unnecessary conditional, value is always truthy @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__async-deps__\plugins-guard\CsUiPluginsGuard.tsx + 109:33 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 187:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 259:11 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 364:52 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__async-deps__\plugins-guard\guards.ts + 50:51 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 100:49 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 111:57 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 134:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 156:27 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__async-deps__\plugins-guard\store.loader.ts + 105:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 132:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 140:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 147:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 157:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\_main-world\fiber-search\utils.ts + 173:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 206:24 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 206:49 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 465:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\_main-world\network-intercept\_service\index.ts + 18:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\_main-world\network-intercept\interceptors\navigator-beacon.ts + 26:22 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 28:22 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\_main-world\network-intercept\interceptors\web-socket.ts + 7:18 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 52:11 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\_main-world\network-intercept\interceptors\xhr.ts + 32:13 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\_main-world\network-intercept\web-socket-message-parser.ts + 21:21 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\custom-theme\instant-css-background-watchdog.ts + 20:10 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 27:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\custom-theme\rebuild-on-ext-update.bg-worker.ts + 9:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\dom-observers\index.ts + 278:13 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 393:22 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 442:44 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\dom-observers\internal-search-states\index.loader.ts + 49:17 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\enable-states.ts + 28:17 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\pplx-web-socket\index.ts + 15:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\slash-command\store\slices\pages\utils.ts + 16:65 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 19:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition \ No newline at end of file diff --git a/perplexity/extension/lint.txt b/perplexity/extension/lint.txt new file mode 100644 index 000000000..829e55b92 --- /dev/null +++ b/perplexity/extension/lint.txt @@ -0,0 +1,425 @@ + +> pplx-ext@2.7.9 lintq C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension +> pnpm lint --quiet + + +> pplx-ext@2.7.9 lint C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension +> eslint ./src --cache --concurrency auto "--quiet" + + + + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\slash-command\textbox-adapter.ts + 30:10 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 30:27 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__ui-groups__\elements\query-box\portal-containers.ts + 96:22 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__ui-groups__\elements\query-box\utils.ts + 78:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 91:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 122:11 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__ui-groups__\elements\thread-message-index-context.tsx + 25:5 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__ui-groups__\routes\Home\CometAffiliateDialog.tsx + 38:5 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__ui-groups__\routes\Home\update-announcer\post-update-announcer.bg-worker.ts + 8:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\better-sidebar\settings-ui.tsx + 13:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 25:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 25:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 33:22 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\cloudflare-timeout-auto-reload\ActionDialog.tsx + 21:13 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\cloudflare-timeout-auto-reload\settings-ui.tsx + 37:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 51:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition + 68:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 68:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 78:21 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 78:35 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\comet-isolated-zoom\loader.ts + 53:37 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\comet-isolated-zoom\settings-ui.tsx + 18:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 20:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition + 26:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 26:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 47:21 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 47:35 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\pages\space-threads\Page.tsx + 16:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 16:38 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\pages\spaces\Footer.tsx + 42:45 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 68:45 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\pages\spaces\SpaceItemFile.tsx + 38:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\pages\spaces\SpacePreview.tsx + 13:36 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 13:41 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 20:42 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 20:47 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 54:22 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\pages\threads\ThreadItem.tsx + 89:10 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\pages\threads\filters\SortFilter.tsx + 46:13 error Unnecessary conditional, value is always truthy @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\pages\threads\filters\SourceFilter.tsx + 42:13 error Unnecessary conditional, value is always truthy @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\pages\threads\filters\TemporaryThreadsFilter.tsx + 45:13 error Unnecessary conditional, value is always truthy @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\pages\threads\filters\TypeFilter.tsx + 40:13 error Unnecessary conditional, value is always truthy @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\settings-ui.tsx + 15:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition + 21:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 21:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 28:16 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\settings-ui\SpacesSearchPageKeybinding.tsx + 8:5 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 8:13 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\settings-ui\ThreadsSearchPageKeybinding.tsx + 8:5 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 8:13 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\settings-ui\ToggleCommandDialogKeybinding.tsx + 7:23 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 7:31 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\settings-ui\ToggleSidecarKeybinding.tsx + 8:5 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 8:13 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\force-writing-mode\settings-ui.tsx + 11:13 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 17:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 17:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\home-custom-slogan\settings-ui.tsx + 20:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition + 26:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 36:33 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\image-gen-model-selector\settings-ui.tsx + 11:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition + 21:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 21:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\language-model-selector\components\TriggerButton.tsx + 51:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\language-model-selector\model-selection-mismatch-warning.loader.ts + 39:15 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\language-model-selector\settings-ui.tsx + 18:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition + 39:11 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 65:15 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 80:17 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\language-model-selector\store\sync.loader.ts + 87:11 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\language-model-selector\utils.ts + 14:41 error Unnecessary conditional, value is always truthy @typescript-eslint/no-unnecessary-condition + 48:33 error Unnecessary conditional, value is always truthy @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\prompt-history\hooks\usePromptHistory.ts + 29:23 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\prompt-history\settings-ui.tsx + 23:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 31:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition + 41:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 41:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 45:22 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 59:22 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 59:36 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 77:22 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 77:36 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 100:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 100:58 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 100:68 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 101:33 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 101:59 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 101:69 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 126:19 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\prompt-history\utils.ts + 30:31 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\query-box-submit-on-ctrl-enter\settings-ui.tsx + 9:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 11:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition + 17:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 17:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-artifacts\components\ArtifactHeader.tsx + 93:16 error Unnecessary conditional, value is always truthy @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-artifacts\components\Preview.tsx + 11:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-artifacts\components\PreviewToggle.tsx + 26:10 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 35:10 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-artifacts\components\VersionsNavigator.tsx + 32:60 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 36:38 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 53:17 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 54:41 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 89:17 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 90:41 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-artifacts\components\renderer\Markmap.tsx + 65:16 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 76:15 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-artifacts\components\renderer\Mermaid.tsx + 70:16 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 81:15 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-artifacts\settings-ui.tsx + 16:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 23:16 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-artifacts\store.loader.ts + 88:17 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-artifacts\useHandleArtifactsState.ts + 37:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 37:18 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-artifacts\useHandleAutonomousArtifactsState.ts + 61:52 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 115:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-artifacts\utils.ts + 49:7 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-better-code-blocks\settings-ui\FineGrainedOptions.tsx + 37:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 49:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 63:28 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 78:28 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 95:30 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 111:37 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 113:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 130:18 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 135:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 150:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 168:28 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 186:35 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 188:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 207:28 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 219:18 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 226:39 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 240:39 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 254:39 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-better-code-blocks\settings-ui\GlobalOptions.tsx + 20:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 29:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 39:28 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 50:21 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 65:23 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 65:69 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 79:25 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 79:71 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 83:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 83:72 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 102:21 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 103:15 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 117:21 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 118:15 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 133:21 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 133:66 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 149:23 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 149:68 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 153:24 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 153:69 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-better-code-blocks\settings-ui\index.tsx + 30:16 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 84:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-better-code-blocks\variants\HighlightedCode.tsx + 45:59 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-better-code-blocks\variants\artifact-placeholders\Wrapper.tsx + 26:30 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 38:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-better-code-blocks\variants\base\Header.tsx + 55:50 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 57:37 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 57:54 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-better-code-blocks\variants\base\Wrapper.tsx + 19:38 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-better-message-copy-buttons\settings-ui.tsx + 10:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 12:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition + 18:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 18:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-better-rewrite-dropdown\settings-ui.tsx + 10:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 12:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition + 22:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 22:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-custom-container-width\settings-ui.tsx + 27:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition + 33:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 41:16 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-export\ExportMenu.tsx + 53:27 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-export\hooks\useCopyPplxThread.ts + 128:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 170:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-export\settings-ui.tsx + 10:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 12:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition + 18:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 18:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-message-length\settings-ui.tsx + 10:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 12:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition + 18:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 18:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 29:20 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 29:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-message-tts\hooks\usePplxTtsRequest.ts + 32:17 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 38:35 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 38:52 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 66:21 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 67:17 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 67:23 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-message-tts\player\coordinator.ts + 13:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-message-tts\player\pplx-streaming-tts-player.ts + 117:38 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 149:9 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition + 166:9 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition + 166:34 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 175:9 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition + 175:34 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 186:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 187:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 188:7 error Unnecessary conditional, value is always truthy @typescript-eslint/no-unnecessary-condition + 204:45 error Unnecessary conditional, value is always truthy @typescript-eslint/no-unnecessary-condition + 224:27 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-message-tts\settings-ui.tsx + 19:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 21:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition + 28:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 28:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 42:19 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 42:33 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-raw-headings\loader.ts + 34:10 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-raw-headings\settings-ui.tsx + 10:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 12:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition + 18:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 18:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-toc\TocPanel.tsx + 44:30 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 46:30 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-toc\settings-ui.tsx + 10:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 12:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition + 21:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 21:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-toc\usePanelPosition.ts + 51:30 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 51:52 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\zen-mode\settings-ui.tsx + 10:23 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 10:31 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 25:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 25:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 32:16 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 40:22 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 40:30 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 50:15 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 50:23 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\zen-mode\utils.ts + 16:42 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\services\features\content-script-utils\index.ts + 14:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 18:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\services\features\instant-css\coordinator.ts + 46:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + 66:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\services\infra\i18n\dayjs.ts + 73:47 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\services\infra\indexed-db\index.ts + 97:13 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\utils\dom-utils\generics.ts + 45:16 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\utils\dom-utils\lexical-utils.ts + 111:31 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 124:28 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 124:47 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 124:55 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 125:24 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 125:43 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + 125:49 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + 177:24 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition + +C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\utils\misc\normalize-path.ts + 7:9 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition + +✖ 336 problems (336 errors, 0 warnings) + + ELIFECYCLE  Command failed with exit code 1. + ELIFECYCLE  Command failed with exit code 1. diff --git a/perplexity/extension/package.json b/perplexity/extension/package.json index ccb7ae0f2..882d7f36f 100644 --- a/perplexity/extension/package.json +++ b/perplexity/extension/package.json @@ -1,6 +1,6 @@ { "name": "pplx-ext", - "version": "2.7.9", + "version": "2.7.10", "author": "pnd280", "type": "module", "scripts": { @@ -19,10 +19,10 @@ "e2e:ui": "pnpm dx:chrome playwright test --ui", "firefox:publish": "cd ./cli && pnpm firefox:publish", "fmt": "prettier --write '**/*.{tsx,ts,css,json}'", - "lint": "eslint ./src", + "lint": "eslint ./src --cache", "lint-staged": "lint-staged", - "lintf": "eslint ./src --fix", - "lintq": "eslint ./src --quiet", + "lintf": "pnpm lint --fix", + "lintq": "pnpm lint --quiet", "r2:cache-buster:bump": "cd ./cli && pnpm r2:cache-buster:bump", "r2:changelog:push": "cd ./cli && pnpm r2:changelog:push", "r2:pull": "cd ./cli && pnpm r2:pull", @@ -57,7 +57,7 @@ "cmdk": "^1.1.1", "comctx": "^1.4.3", "culori": "^4.0.2", - "dayjs": "^1.11.18", + "dayjs": "^1.11.19", "dedent": "^1.7.0", "dexie": "^4.2.1", "engine.io-parser": "^5.2.3", @@ -78,8 +78,8 @@ "react-hotkeys-hook": "^5.2.1", "react-lazily": "^0.9.2", "react-markdown": "^10.1.0", - "react-router-dom": "^7.9.4", - "react-syntax-highlighter": "^15.6.6", + "react-router-dom": "^7.9.5", + "react-syntax-highlighter": "^16.1.0", "rehype-raw": "^7.0.0", "rehype-sanitize": "^6.0.0", "rehype-stringify": "^10.0.1", @@ -102,7 +102,7 @@ "@complexity/eslint-config": "workspace:*", "@complexity/typescript-config": "workspace:*", "@crxjs/vite-plugin": "^2.2.1", - "@iconify/json": "^2.2.401", + "@iconify/json": "^2.2.402", "@playwright/test": "^1.56.1", "@svgr/core": "^8.1.0", "@svgr/plugin-jsx": "^8.1.0", @@ -124,10 +124,10 @@ "@types/react-syntax-highlighter": "^15.5.13", "@types/semver": "^7.7.1", "@vitejs/plugin-react": "^5.1.0", - "@vitest/ui": "^4.0.4", + "@vitest/ui": "^4.0.5", "babel-plugin-react-compiler": "^1.0.0", "browserslist": "^4.27.0", - "caniuse-lite": "^1.0.30001751", + "caniuse-lite": "^1.0.30001752", "chalk": "5.6.2", "eslint": "catalog:lint", "eslint-plugin-boundaries": "^5.1.0", @@ -150,7 +150,7 @@ "unimport": "^5.5.0", "unplugin-icons": "^22.5.0", "vite": "^7.1.12", - "vitest": "^4.0.4" + "vitest": "^4.0.5" }, "engines": { "node": "^22.12.0" diff --git a/perplexity/extension/src/__registries__/core-plugins/index.ts b/perplexity/extension/src/__registries__/core-plugins/index.ts index 26adb7592..f71811525 100644 --- a/perplexity/extension/src/__registries__/core-plugins/index.ts +++ b/perplexity/extension/src/__registries__/core-plugins/index.ts @@ -25,7 +25,7 @@ export default class CorePluginsRegistry { visited.add(id); const plugin = this.manifest[id]; - const deps = plugin?.dependencies; + const deps = plugin.dependencies; if (deps) { for (const depId of deps) { @@ -89,7 +89,7 @@ export default class CorePluginsRegistry { const allDeps = new Set(); const plugin = CorePluginsRegistry.manifest[pluginId]; - if (plugin?.dependencies) { + if (plugin.dependencies) { for (const dep of plugin.dependencies) { allDeps.add(dep); const transitiveDeps = visit(dep, path); diff --git a/perplexity/extension/src/__registries__/cs-hash-router.ts b/perplexity/extension/src/__registries__/cs-hash-router.ts index 7a168a7fc..130af48ee 100644 --- a/perplexity/extension/src/__registries__/cs-hash-router.ts +++ b/perplexity/extension/src/__registries__/cs-hash-router.ts @@ -11,6 +11,7 @@ export const hashRouterObservers: RouteObject[] = (() => { } >, ).map((module) => { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition invariant(module.default != null, "[HashRouter] Invalid context"); return module.default; diff --git a/perplexity/extension/src/__registries__/cs-ui/index.tsx b/perplexity/extension/src/__registries__/cs-ui/index.tsx index 9c81664ad..e546e5319 100644 --- a/perplexity/extension/src/__registries__/cs-ui/index.tsx +++ b/perplexity/extension/src/__registries__/cs-ui/index.tsx @@ -120,6 +120,7 @@ export default class CsUiRegistry { (function () { CsUiRegistry.Components.forEach((module) => { invariant( + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition module.default != null, "Plugin Component must have a default export", ); diff --git a/perplexity/extension/src/__registries__/plugin-settings-uis.ts b/perplexity/extension/src/__registries__/plugin-settings-uis.ts index fcae2ae06..49a95266e 100644 --- a/perplexity/extension/src/__registries__/plugin-settings-uis.ts +++ b/perplexity/extension/src/__registries__/plugin-settings-uis.ts @@ -32,11 +32,13 @@ export const PluginSettingsUis: PluginSettingsUIs = (() => { for (const [_, module] of Object.entries(entries)) { invariant( + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition module.default != null, `Plugin settings UI for "${module.pluginId}" is declared but missing default export`, ); invariant( + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition module.pluginId != null, `Plugin settings UI for "${module.pluginId}" is declared but missing \`pluginId\` export`, ); diff --git a/perplexity/extension/src/__registries__/plugins/index.ts b/perplexity/extension/src/__registries__/plugins/index.ts index e5f95fc80..bb74c58db 100644 --- a/perplexity/extension/src/__registries__/plugins/index.ts +++ b/perplexity/extension/src/__registries__/plugins/index.ts @@ -51,7 +51,7 @@ export class PluginManifestsRegistry { visited.add(id); const plugin = this.meta[id]; - const deps = plugin?.dependencies?.plugins; + const deps = plugin.dependencies?.plugins; if (deps) { for (const depId of deps) { @@ -220,7 +220,7 @@ export class PluginManifestsRegistry { const allDeps = new Set(); const plugin = PluginManifestsRegistry.meta[pluginId]; - if (plugin?.dependencies?.plugins) { + if (plugin.dependencies?.plugins) { for (const dep of plugin.dependencies.plugins) { allDeps.add(dep); const transitiveDeps = visit(dep, path); diff --git a/perplexity/extension/src/__registries__/plugins/predicates.ts b/perplexity/extension/src/__registries__/plugins/predicates.ts index 47c7ebebe..3ed032dce 100644 --- a/perplexity/extension/src/__registries__/plugins/predicates.ts +++ b/perplexity/extension/src/__registries__/plugins/predicates.ts @@ -4,10 +4,3 @@ import type { PluginId } from "@/__registries__/plugins/meta.types"; export function isPluginId(value: string): value is PluginId { return Object.keys(PluginManifestsRegistry.meta).includes(value); } - -export function isPrivatePluginId(value: string): value is PluginId { - return ( - isPluginId(value) && - PluginManifestsRegistry.meta[value].dashboardMeta == null - ); -} diff --git a/perplexity/extension/src/auto-imports-config.ts b/perplexity/extension/src/auto-imports-config.ts index 62f80311d..8f7fac2d2 100644 --- a/perplexity/extension/src/auto-imports-config.ts +++ b/perplexity/extension/src/auto-imports-config.ts @@ -47,6 +47,10 @@ const unimportConfig: Partial = { as: "ms", from: "ms", }, + { + name: "tryCatch", + from: "@/utils/wrappers/try-catch.ts", + }, ], }; diff --git a/perplexity/extension/src/auto-imports.d.ts b/perplexity/extension/src/auto-imports.d.ts index 3e5900d5a..03bfbd278 100644 --- a/perplexity/extension/src/auto-imports.d.ts +++ b/perplexity/extension/src/auto-imports.d.ts @@ -29,4 +29,5 @@ declare global { const { isMainWorldContext, sleep }: typeof import("@/utils/misc/utils.ts"); const { default: $ }: typeof import("jquery"); const ms: typeof import("ms"); + const tryCatch: typeof import("@/utils/wrappers/try-catch.ts").tryCatch; } diff --git a/perplexity/extension/src/components/ExtensionContextInvalidationWatchdog.tsx b/perplexity/extension/src/components/ExtensionContextInvalidationWatchdog.tsx index 37e1beee1..a2715f253 100644 --- a/perplexity/extension/src/components/ExtensionContextInvalidationWatchdog.tsx +++ b/perplexity/extension/src/components/ExtensionContextInvalidationWatchdog.tsx @@ -15,7 +15,7 @@ export function ExtensionContextInvalidationWatchdog() { const { data: isValidContext, refetch } = useQuery({ queryKey: ["extensionContextInvalidationWatchdog"], queryFn: () => { - return chrome.runtime.id != null; + return (chrome.runtime.id as string | null) != null; }, refetchInterval: ms("10s"), refetchOnReconnect: "always", diff --git a/perplexity/extension/src/components/Toaster.tsx b/perplexity/extension/src/components/Toaster.tsx index 0050844fc..0efaeee00 100644 --- a/perplexity/extension/src/components/Toaster.tsx +++ b/perplexity/extension/src/components/Toaster.tsx @@ -34,7 +34,7 @@ export function Toaster({ className={cn("x:w-max x:font-sans", className)} {...props} > -
+
{isReactNode(title) && {title}} {isReactNode(description) && ( {description} diff --git a/perplexity/extension/src/components/hotkey-recorder/index.tsx b/perplexity/extension/src/components/hotkey-recorder/index.tsx index ae3798c95..e3b957d63 100644 --- a/perplexity/extension/src/components/hotkey-recorder/index.tsx +++ b/perplexity/extension/src/components/hotkey-recorder/index.tsx @@ -23,7 +23,7 @@ export function useHotkeyRecorder({ const activeKeysRef = useRef>(new Set()); const displayKeys = isRecording - ? recordedKeys?.size + ? recordedKeys.size ? orderKeys(Array.from(recordedKeys)) : [] : orderKeys(savedKeys); @@ -129,7 +129,7 @@ export function useHotkeyRecorder({ const handleStopRecording = () => { if (!isValidKeyCombination(recordedKeys)) { resetKeys(); - } else if (onSave && recordedKeys != null) { + } else if (onSave) { const orderedKeys = orderKeys(Array.from(recordedKeys)); setSavedKeys(orderedKeys); onSave(orderedKeys); @@ -137,8 +137,7 @@ export function useHotkeyRecorder({ stop(); }; - const isValidCombination = - recordedKeys != null ? isValidKeyCombination(recordedKeys) : true; + const isValidCombination = isValidKeyCombination(recordedKeys); const HotkeyRecorderComponent = () => ( ): boolean { - if (!keys?.size) return false; + if (!keys.size) return false; const keyArray = Array.from(keys).map((k) => k.toLowerCase()); const hasModifier = keyArray.some((k) => MODIFIER_KEYS.has(k)); diff --git a/perplexity/extension/src/components/icons/FaFileExport.tsx b/perplexity/extension/src/components/icons/FaFileExport.tsx deleted file mode 100644 index 66b52efa9..000000000 --- a/perplexity/extension/src/components/icons/FaFileExport.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import type { SVGProps } from "react"; - -const FaFileExport = (props: SVGProps) => { - return ( - - - - - ); -}; - -export default FaFileExport; diff --git a/perplexity/extension/src/components/icons/FlagVietnam.tsx b/perplexity/extension/src/components/icons/FlagVietnam.tsx deleted file mode 100644 index 48bca2fcc..000000000 --- a/perplexity/extension/src/components/icons/FlagVietnam.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import * as React from "react"; - -const FlagVietnam = ({ ...props }: React.SVGProps) => ( - - - - -); - -export default FlagVietnam; diff --git a/perplexity/extension/src/components/ui/combo.tsx b/perplexity/extension/src/components/ui/combo.tsx index d9dd3f3e9..c7b9bdb49 100644 --- a/perplexity/extension/src/components/ui/combo.tsx +++ b/perplexity/extension/src/components/ui/combo.tsx @@ -19,8 +19,6 @@ const ComboboxContext = createContext({ portal: true, }); -const ComboboxContextProvider = ComboboxContext.Provider; - export function Combobox({ portal, ...props @@ -28,13 +26,13 @@ export function Combobox({ portal?: boolean; }) { return ( - - + ); } diff --git a/perplexity/extension/src/components/ui/floating-panel.tsx b/perplexity/extension/src/components/ui/floating-panel.tsx index 319c6b719..21fd7ae3a 100644 --- a/perplexity/extension/src/components/ui/floating-panel.tsx +++ b/perplexity/extension/src/components/ui/floating-panel.tsx @@ -171,7 +171,7 @@ export function FloatingPanelStageTrigger({ > {children != null ? children - : (stageIcons[stage as keyof typeof stageIcons] ?? null)} + : stageIcons[stage as keyof typeof stageIcons]} ); } diff --git a/perplexity/extension/src/components/ui/form.tsx b/perplexity/extension/src/components/ui/form.tsx index 2e761a462..6806cb2d7 100644 --- a/perplexity/extension/src/components/ui/form.tsx +++ b/perplexity/extension/src/components/ui/form.tsx @@ -43,10 +43,6 @@ export function useFormField() { const fieldState = getFieldState(fieldContext.name, formState); - if (fieldContext == null) { - throw new Error("useFormField should be used within "); - } - const { id } = itemContext; return { diff --git a/perplexity/extension/src/components/ui/hover-card.tsx b/perplexity/extension/src/components/ui/hover-card.tsx index b975566db..29148f08c 100644 --- a/perplexity/extension/src/components/ui/hover-card.tsx +++ b/perplexity/extension/src/components/ui/hover-card.tsx @@ -13,8 +13,6 @@ export const HoverCardLocalContext = createContext({ portal: true, }); -export const HoverCardLocalContextProvider = HoverCardLocalContext.Provider; - export function HoverCard({ portal, ...props @@ -22,13 +20,13 @@ export function HoverCard({ portal?: boolean; }) { return ( - - + ); } diff --git a/perplexity/extension/src/components/ui/select.tsx b/perplexity/extension/src/components/ui/select.tsx index 37ca48d99..410a66d4d 100644 --- a/perplexity/extension/src/components/ui/select.tsx +++ b/perplexity/extension/src/components/ui/select.tsx @@ -18,8 +18,6 @@ const SelectLocalContext = createContext({ portal: true, }); -const SelectLocalContextProvider = SelectLocalContext.Provider; - export const SelectContext = ArkSelect.Context; export function Select({ @@ -29,13 +27,13 @@ export function Select({ portal?: boolean; }) { return ( - unmountOnExit={false} lazyMount={true} {...props} /> - + ); } diff --git a/perplexity/extension/src/components/ui/use-toast.ts b/perplexity/extension/src/components/ui/use-toast.ts index a4a6b0386..2d1e83751 100644 --- a/perplexity/extension/src/components/ui/use-toast.ts +++ b/perplexity/extension/src/components/ui/use-toast.ts @@ -4,7 +4,7 @@ import type { ToastActionElement, ToastProps } from "@/components/ui/toast"; const TOAST_LIMIT = 3; -type ToasterToast = ToastProps & { +type ToasterToast = Omit & { id: string; title?: React.ReactNode; description?: React.ReactNode; diff --git a/perplexity/extension/src/data/dashboard/themes/migration.ts b/perplexity/extension/src/data/dashboard/themes/migration.ts index 001bc0530..2b83ef2ab 100644 --- a/perplexity/extension/src/data/dashboard/themes/migration.ts +++ b/perplexity/extension/src/data/dashboard/themes/migration.ts @@ -9,6 +9,7 @@ export function legacyThemeMigration(theme: Theme) { console.log("Migrating theme", theme.id); + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (theme.config.accentColorSelection == null) { theme.config.accentColorSelection = "default"; } diff --git a/perplexity/extension/src/entrypoints/options-page/components/sidebar/Version.tsx b/perplexity/extension/src/entrypoints/options-page/components/sidebar/Version.tsx index 5acc7a8c8..45fc3a8b6 100644 --- a/perplexity/extension/src/entrypoints/options-page/components/sidebar/Version.tsx +++ b/perplexity/extension/src/entrypoints/options-page/components/sidebar/Version.tsx @@ -18,7 +18,7 @@ export default function Version() { if (newClickCount >= 7) { setClicks(0); - if (settings?.devMode) { + if (settings.devMode) { toast({ title: "Dev mode already enabled", }); diff --git a/perplexity/extension/src/entrypoints/options-page/dashboard/Dashboard.tsx b/perplexity/extension/src/entrypoints/options-page/dashboard/Dashboard.tsx index 2b0fb6b45..a48dd4d90 100644 --- a/perplexity/extension/src/entrypoints/options-page/dashboard/Dashboard.tsx +++ b/perplexity/extension/src/entrypoints/options-page/dashboard/Dashboard.tsx @@ -21,7 +21,7 @@ export function Dashboard() { -
+
diff --git a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/PluginsEnableSet.tsx b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/PluginsEnableSet.tsx index a4d5a5130..023db3a05 100644 --- a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/PluginsEnableSet.tsx +++ b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/PluginsEnableSet.tsx @@ -89,7 +89,7 @@ export default function PluginsEnableSet() { const { settings, mutation } = useExtensionSettings(); const isDefaultSettings = (() => isEqual( - settings?.plugins, + settings.plugins, PluginManifestsRegistry.settingsFallbackValues, ))(); const [open, setOpen] = useState( diff --git a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/components/plugin-card/PluginCard.tsx b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/components/plugin-card/PluginCard.tsx index cf1a78973..9d9e83eb1 100644 --- a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/components/plugin-card/PluginCard.tsx +++ b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/components/plugin-card/PluginCard.tsx @@ -9,7 +9,6 @@ import { PluginCardHeader } from "@/entrypoints/options-page/dashboard/pages/plu import { PluginCardTags } from "@/entrypoints/options-page/dashboard/pages/plugins/components/plugin-card/PluginCardTags"; import { PluginLockDownOverlay } from "@/entrypoints/options-page/dashboard/pages/plugins/components/plugin-card/PluginLockDownOverlay"; import PluginCardSkeleton from "@/entrypoints/options-page/dashboard/pages/plugins/components/PluginCardSkeleton"; -import useExtensionSettings from "@/services/infra/extension-api-wrappers/extension-settings/useExtensionSettings"; type PluginCardProps = { pluginId: PluginId; }; @@ -25,14 +24,10 @@ const PluginCardContent = memo(() => { }, } = usePluginCardContext(); - const { settings } = useExtensionSettings(); - if (isLoading) { return ; } - if (!settings) return null; - return (
({ @@ -77,10 +76,11 @@ export function PluginCardProvider({ export function usePluginCardContext() { const context = use(PluginCardContext); - if (context === null) { - throw new Error( - "usePluginCardContext must be used within a PluginCardProvider", - ); - } + + invariant( + context != null, + "usePluginCardContext must be used within a PluginCardProvider", + ); + return context; } diff --git a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/components/plugin-card/PluginCardFooter.tsx b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/components/plugin-card/PluginCardFooter.tsx index d8d179cc3..cf51f8fa6 100644 --- a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/components/plugin-card/PluginCardFooter.tsx +++ b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/components/plugin-card/PluginCardFooter.tsx @@ -48,27 +48,26 @@ export function PluginCardFooter() { )}
- {settings?.plugins[pluginId].enabled && - !areAllDependentPluginsEnabled && ( - -
Enable the following plugins:
-
    - {Array.from( - PluginManifestsRegistry.getAllPluginDependencies(pluginId), - ).map((dependentPluginId) => ( -
  • - {PluginManifestsRegistry.meta[dependentPluginId].title} -
  • - ))} -
-
- } - > - - - )} + {settings.plugins[pluginId].enabled && !areAllDependentPluginsEnabled && ( + +
Enable the following plugins:
+
    + {Array.from( + PluginManifestsRegistry.getAllPluginDependencies(pluginId), + ).map((dependentPluginId) => ( +
  • + {PluginManifestsRegistry.meta[dependentPluginId].title} +
  • + ))} +
+
+ } + > + + + )} {!isLockedDown && ( { diff --git a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/components/plugin-card/PluginCardTags.tsx b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/components/plugin-card/PluginCardTags.tsx index 79ebefee2..0c66ad89d 100644 --- a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/components/plugin-card/PluginCardTags.tsx +++ b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/components/plugin-card/PluginCardTags.tsx @@ -7,7 +7,7 @@ export function PluginCardTags() { pluginInfo: { tags }, } = usePluginCardContext(); - if (tags == null || tags.length === 0) return null; + if (tags.length === 0) return null; return ( diff --git a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/components/plugin-card/usePluginCard.ts b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/components/plugin-card/usePluginCard.ts index 7826c08ec..37dfca272 100644 --- a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/components/plugin-card/usePluginCard.ts +++ b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/components/plugin-card/usePluginCard.ts @@ -50,7 +50,7 @@ export function usePluginCard(pluginId: PluginId) { return Array.from(allDependencies).every( (dependentPluginId) => - settings?.plugins[dependentPluginId].enabled && + settings.plugins[dependentPluginId].enabled && !pluginsStates[dependentPluginId].isOnMaintenance && !pluginsStates[dependentPluginId].isOutdated, ); diff --git a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/components/plugin-settings-uis/PluginSettingsWrapper.tsx b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/components/plugin-settings-uis/PluginSettingsWrapper.tsx index 24b7b5202..f4aa23395 100644 --- a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/components/plugin-settings-uis/PluginSettingsWrapper.tsx +++ b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/components/plugin-settings-uis/PluginSettingsWrapper.tsx @@ -1,3 +1,4 @@ +import { Suspense } from "react"; import { useLocation, useNavigate, useParams } from "react-router-dom"; import { PluginSettingsUis } from "@/__registries__/plugin-settings-uis"; @@ -43,7 +44,7 @@ export default function PluginSettingsWrapper() { } return ( - <> + {isFromPluginList && !isOpenInFullScreen ? ( <> @@ -54,7 +55,7 @@ export default function PluginSettingsWrapper() { )} - + ); } diff --git a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/hooks/useFilteredPlugins.ts b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/hooks/useFilteredPlugins.ts index 4a04b2c95..6c602e7ff 100644 --- a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/hooks/useFilteredPlugins.ts +++ b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/plugins/hooks/useFilteredPlugins.ts @@ -23,9 +23,7 @@ export function useFilteredPlugins({ const matchesSearch = (plugin.title + plugin.description) .toLowerCase() .includes(searchTerm.toLowerCase()); - const hasTags = - plugin.dashboardMeta.tags !== undefined && - plugin.dashboardMeta.tags.length > 0; + const hasTags = plugin.dashboardMeta.tags.length > 0; const matchesTags = selectedTags.length === 0 || @@ -40,10 +38,9 @@ export function useFilteredPlugins({ const matchesCategories = categories.length === 0 || - (plugin.dashboardMeta.categories !== undefined && - plugin.dashboardMeta.categories.some((category) => - categories.includes(category), - )); + plugin.dashboardMeta.categories.some((category) => + categories.includes(category), + ); return ( matchesSearch && matchesTags && !hasExcludedTags && matchesCategories diff --git a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/settings/IndexPage.tsx b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/settings/IndexPage.tsx index 84b88cf50..08a1729ad 100644 --- a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/settings/IndexPage.tsx +++ b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/settings/IndexPage.tsx @@ -12,7 +12,7 @@ export function IndexPage() { - {settings?.devMode && } + {settings.devMode && }
); } diff --git a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/settings/components/ExtensionIconActionSelect.tsx b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/settings/components/ExtensionIconActionSelect.tsx index 86e61e3fc..84f916578 100644 --- a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/settings/components/ExtensionIconActionSelect.tsx +++ b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/settings/components/ExtensionIconActionSelect.tsx @@ -16,9 +16,7 @@ import useExtensionSettings from "@/services/infra/extension-api-wrappers/extens export default function ExtensionIconActionSelect() { const { settings, mutation } = useExtensionSettings(); - if (!settings) return null; - - const selectedValue = settings?.extensionIconAction; + const selectedValue = settings.extensionIconAction; return ( handleBehaviorChange(value)} > diff --git a/perplexity/extension/src/plugins/comet-isolated-zoom/loader.ts b/perplexity/extension/src/plugins/comet-isolated-zoom/loader.ts index 2a4758306..d3ebf0965 100644 --- a/perplexity/extension/src/plugins/comet-isolated-zoom/loader.ts +++ b/perplexity/extension/src/plugins/comet-isolated-zoom/loader.ts @@ -50,7 +50,7 @@ export default async function () { } } - void setZoom(extensionSettings?.plugins["comet:isolatedZoom"].zoomLevel); + void setZoom(extensionSettings.plugins["comet:isolatedZoom"].zoomLevel); $(document).on("keydown", (e) => { if ((e.ctrlKey || e.metaKey) && e.key === "0") { diff --git a/perplexity/extension/src/plugins/comet-isolated-zoom/settings-ui.tsx b/perplexity/extension/src/plugins/comet-isolated-zoom/settings-ui.tsx index c9f6ff5f1..436b59d78 100644 --- a/perplexity/extension/src/plugins/comet-isolated-zoom/settings-ui.tsx +++ b/perplexity/extension/src/plugins/comet-isolated-zoom/settings-ui.tsx @@ -15,15 +15,12 @@ export const pluginId: PluginId = "comet:isolatedZoom"; export default function ThreadMessageTtsPluginSettingsUi() { const { settings, mutation } = useExtensionSettings(); - const pluginSettings = settings?.plugins["comet:isolatedZoom"]; - - if (!settings) return null; return (
{ mutation.mutate((draft) => { draft.plugins["comet:isolatedZoom"].enabled = checked; @@ -44,7 +41,7 @@ export default function ThreadMessageTtsPluginSettingsUi() { max={5} step={0.25} className="x:flex x:w-full x:flex-col x:gap-4" - value={[pluginSettings?.zoomLevel ?? 1]} + value={[settings.plugins["comet:isolatedZoom"].zoomLevel]} onValueChange={({ value }) => { mutation.mutate((draft) => { draft.plugins["comet:isolatedZoom"].zoomLevel = value[0] ?? 1; diff --git a/perplexity/extension/src/plugins/command-menu/cache.loader.ts b/perplexity/extension/src/plugins/command-menu/cache.loader.ts index 535d73e67..cd0069258 100644 --- a/perplexity/extension/src/plugins/command-menu/cache.loader.ts +++ b/perplexity/extension/src/plugins/command-menu/cache.loader.ts @@ -21,7 +21,7 @@ export default async function () { queryKey: pplxApiQueries.spaces.detail().queryKey, enabled: false, }).subscribe((data) => { - if (data.status !== "success" || data.fetchStatus !== "idle") return; + if (data.status !== "success") return; void persistentQueryClient.persistQueryClient(); }); @@ -33,7 +33,7 @@ export default async function () { }).queryKey, enabled: false, }).subscribe((data) => { - if (data.status !== "success" || data.fetchStatus !== "idle") return; + if (data.status !== "success") return; void persistentQueryClient.persistQueryClient(); }); diff --git a/perplexity/extension/src/plugins/command-menu/pages/space-threads/Page.tsx b/perplexity/extension/src/plugins/command-menu/pages/space-threads/Page.tsx index 38924ad70..f4e944ffd 100644 --- a/perplexity/extension/src/plugins/command-menu/pages/space-threads/Page.tsx +++ b/perplexity/extension/src/plugins/command-menu/pages/space-threads/Page.tsx @@ -13,7 +13,7 @@ const SpaceThreadsPage = memo(() => { if (currentPage?.pageId !== "spaceThreads") return null; - const spaceSlug = currentPage?.args?.spaceSlug; + const spaceSlug = currentPage.args.spaceSlug; if (!spaceSlug) { return null; diff --git a/perplexity/extension/src/plugins/command-menu/pages/spaces/Footer.tsx b/perplexity/extension/src/plugins/command-menu/pages/spaces/Footer.tsx index 819c1fb7b..d6410f567 100644 --- a/perplexity/extension/src/plugins/command-menu/pages/spaces/Footer.tsx +++ b/perplexity/extension/src/plugins/command-menu/pages/spaces/Footer.tsx @@ -39,7 +39,7 @@ export default function SpacesSearchItemsFooter() { title: t("plugin-command-menu.spaces.footer.openInNewTab"), keybinding: [Key.Alt, Key.Enter], onSelect: () => { - void openInNewTab(`/spaces/${space?.slug}`); + void openInNewTab(`/spaces/${space.slug}`); commandMenuStore.getState().setOpen(false); }, }, @@ -65,7 +65,7 @@ export default function SpacesSearchItemsFooter() { title: t("plugin-command-menu.spaces.footer.goToSpace"), keybinding: [Key.Enter], onSelect: () => { - void softNavigate(`/spaces/${space?.slug}`); + void softNavigate(`/spaces/${space.slug}`); commandMenuStore.getState().setOpen(false); }, }, diff --git a/perplexity/extension/src/plugins/command-menu/pages/spaces/SpaceItemFile.tsx b/perplexity/extension/src/plugins/command-menu/pages/spaces/SpaceItemFile.tsx index 509bed0a0..e5f529e54 100644 --- a/perplexity/extension/src/plugins/command-menu/pages/spaces/SpaceItemFile.tsx +++ b/perplexity/extension/src/plugins/command-menu/pages/spaces/SpaceItemFile.tsx @@ -1,20 +1,16 @@ import { useQueryClient } from "@tanstack/react-query"; import Tooltip from "@/components/Tooltip"; -import type { - Space, - SpaceFilesApiResponse, -} from "@/services/externals/pplx-api/pplx-api.types"; +import { toast } from "@/components/ui/use-toast"; +import type { SpaceFilesApiResponse } from "@/services/externals/pplx-api/pplx-api.types"; import { pplxApiQueries } from "@/services/externals/pplx-api/query-keys"; import TablerFile from "~icons/tabler/file"; export default function SpaceItemFiles({ file, - spaceUuid, }: { file: SpaceFilesApiResponse["files"][number]; - spaceUuid: Space["uuid"]; }) { const queryClient = useQueryClient(); @@ -29,12 +25,20 @@ export default function SpaceItemFiles({ { - const fileDownloadUrl = await queryClient.fetchQuery( - pplxApiQueries.space.files.downloadUrl.detail( - spaceUuid, - file.file_uuid, + const s3Url = file.file_s3_url; + if (!s3Url) { + toast({ + description: "Can't get the download URL for this file", + }); + return; + } + + const [fileDownloadUrl] = await tryCatch(() => + queryClient.fetchQuery( + pplxApiQueries.space.downloadFile.detail(s3Url), ), ); + if (fileDownloadUrl?.file_url) { window.open(fileDownloadUrl.file_url, "_blank"); } diff --git a/perplexity/extension/src/plugins/command-menu/pages/spaces/SpacePreview.tsx b/perplexity/extension/src/plugins/command-menu/pages/spaces/SpacePreview.tsx index de967cdea..b1a4a29f5 100644 --- a/perplexity/extension/src/plugins/command-menu/pages/spaces/SpacePreview.tsx +++ b/perplexity/extension/src/plugins/command-menu/pages/spaces/SpacePreview.tsx @@ -10,15 +10,14 @@ import TablerLink from "~icons/tabler/link"; export default function SpacePreview({ space }: { space: Space }) { const { data: spaceDetails } = useQuery({ - ...pplxApiQueries.space.detail(space?.uuid ?? ""), + ...pplxApiQueries.space.detail(space.uuid), refetchOnWindowFocus: false, refetchOnMount: false, staleTime: ms("10s"), }); const { data: files } = useQuery({ - ...pplxApiQueries.space.files.detail(space?.uuid ?? ""), - enabled: spaceDetails?.file_count != null && spaceDetails.file_count > 0, + ...pplxApiQueries.space.files.detail(space.uuid), refetchOnWindowFocus: false, refetchOnMount: false, staleTime: ms("30s"), @@ -51,7 +50,7 @@ export default function SpacePreview({ space }: { space: Space }) {
)} - {files && files?.num_total_files > 0 && ( + {files && files.num_total_files > 0 && (
{t("plugin-command-menu.spaces.preview.files", { @@ -59,7 +58,7 @@ export default function SpacePreview({ space }: { space: Space }) { })}
{files.files.map((file, index) => ( - + ))}
)} diff --git a/perplexity/extension/src/plugins/command-menu/pages/threads/ThreadItem.tsx b/perplexity/extension/src/plugins/command-menu/pages/threads/ThreadItem.tsx index 8d4b77f04..842355fdf 100644 --- a/perplexity/extension/src/plugins/command-menu/pages/threads/ThreadItem.tsx +++ b/perplexity/extension/src/plugins/command-menu/pages/threads/ThreadItem.tsx @@ -86,16 +86,14 @@ const ThreadItem = memo(({ thread, searchValue }: ThreadItemProps) => {
{formatRelativeTime(thread.last_query_datetime)}
- {firstAnswer != null && ( -
- -
- )} +
+ +
{thread.expiry_time && (
diff --git a/perplexity/extension/src/plugins/command-menu/pages/threads/filters/SortFilter.tsx b/perplexity/extension/src/plugins/command-menu/pages/threads/filters/SortFilter.tsx index c87f505ea..f35b95ac0 100644 --- a/perplexity/extension/src/plugins/command-menu/pages/threads/filters/SortFilter.tsx +++ b/perplexity/extension/src/plugins/command-menu/pages/threads/filters/SortFilter.tsx @@ -42,7 +42,7 @@ export default function SortFilter() { [state.ascending ? "oldest" : "newest"] satisfies SortItem["value"][] } onValueChange={({ value: values }) => { - const value = values[0] as SortItem["value"]; + const value = values[0] as SortItem["value"] | undefined; if (value) { actions.setSort(value === "oldest"); } diff --git a/perplexity/extension/src/plugins/command-menu/pages/threads/filters/SourceFilter.tsx b/perplexity/extension/src/plugins/command-menu/pages/threads/filters/SourceFilter.tsx index ecc2b7a8b..bd4ac5d21 100644 --- a/perplexity/extension/src/plugins/command-menu/pages/threads/filters/SourceFilter.tsx +++ b/perplexity/extension/src/plugins/command-menu/pages/threads/filters/SourceFilter.tsx @@ -38,7 +38,7 @@ export default function SourceFilter() { positioning={{ sameWidth: true }} value={[state.querySourceFilter || "all"] satisfies SourceItem["value"][]} onValueChange={({ value: values }) => { - const value = values[0] as SourceItem["value"]; + const value = values[0] as SourceItem["value"] | undefined; if (value) { actions.setSource(value === "all" ? undefined : value); } diff --git a/perplexity/extension/src/plugins/command-menu/pages/threads/filters/TemporaryThreadsFilter.tsx b/perplexity/extension/src/plugins/command-menu/pages/threads/filters/TemporaryThreadsFilter.tsx index cd8f208f3..ee96c8af6 100644 --- a/perplexity/extension/src/plugins/command-menu/pages/threads/filters/TemporaryThreadsFilter.tsx +++ b/perplexity/extension/src/plugins/command-menu/pages/threads/filters/TemporaryThreadsFilter.tsx @@ -40,8 +40,7 @@ export default function TemporaryThreadsFilter() { [state.withTemporaryThreads ? "show" : "hide"] satisfies Item["value"][] } onValueChange={({ value: values }) => { - const value = values[0] as Item["value"]; - + const value = values[0] as Item["value"] | undefined; if (value) { actions.setWithTemporaryThreads(value === "show" ? true : false); } diff --git a/perplexity/extension/src/plugins/command-menu/pages/threads/filters/TypeFilter.tsx b/perplexity/extension/src/plugins/command-menu/pages/threads/filters/TypeFilter.tsx index 2227de3d2..7bdd65950 100644 --- a/perplexity/extension/src/plugins/command-menu/pages/threads/filters/TypeFilter.tsx +++ b/perplexity/extension/src/plugins/command-menu/pages/threads/filters/TypeFilter.tsx @@ -36,7 +36,7 @@ export default function TypeFilter() { positioning={{ sameWidth: true }} value={[state.threadTypeFilter || "all"] satisfies TypeItems["value"][]} onValueChange={({ value: values }) => { - const value = values[0] as TypeItems["value"]; + const value = values[0] as TypeItems["value"] | undefined; if (value) { actions.setType(value === "all" ? undefined : value); } diff --git a/perplexity/extension/src/plugins/command-menu/settings-ui.tsx b/perplexity/extension/src/plugins/command-menu/settings-ui.tsx index 5a7ce5aee..766a466f9 100644 --- a/perplexity/extension/src/plugins/command-menu/settings-ui.tsx +++ b/perplexity/extension/src/plugins/command-menu/settings-ui.tsx @@ -12,20 +12,18 @@ export const pluginId: PluginId = "commandMenu"; export default function CommandMenuPluginSettingsUi() { const { settings, mutation } = useExtensionSettings(); - if (!settings) return null; - return (
{ mutation.mutate((draft) => { draft.plugins["commandMenu"].enabled = checked; }); }} /> - {settings?.plugins["commandMenu"].enabled && ( + {settings.plugins["commandMenu"].enabled && (
diff --git a/perplexity/extension/src/plugins/command-menu/settings-ui/SpacesSearchPageKeybinding.tsx b/perplexity/extension/src/plugins/command-menu/settings-ui/SpacesSearchPageKeybinding.tsx index 37052b448..d9fc0b6e6 100644 --- a/perplexity/extension/src/plugins/command-menu/settings-ui/SpacesSearchPageKeybinding.tsx +++ b/perplexity/extension/src/plugins/command-menu/settings-ui/SpacesSearchPageKeybinding.tsx @@ -4,11 +4,8 @@ import useExtensionSettings from "@/services/infra/extension-api-wrappers/extens export default function SpacesSearchPageKeybinding() { const { settings, mutation } = useExtensionSettings(); - const defaultKeys = - settings?.plugins["commandMenu"].keybindings.spacesSearch ?? []; - const { HotkeyRecorderUi } = useHotkeyRecorder({ - defaultKeys, + defaultKeys: settings.plugins["commandMenu"].keybindings.spacesSearch, onSave: (keys) => { mutation.mutate((draft) => { draft.plugins["commandMenu"].keybindings.spacesSearch = keys; diff --git a/perplexity/extension/src/plugins/command-menu/settings-ui/ThreadsSearchPageKeybinding.tsx b/perplexity/extension/src/plugins/command-menu/settings-ui/ThreadsSearchPageKeybinding.tsx index 0c64e06b1..34fa04fbd 100644 --- a/perplexity/extension/src/plugins/command-menu/settings-ui/ThreadsSearchPageKeybinding.tsx +++ b/perplexity/extension/src/plugins/command-menu/settings-ui/ThreadsSearchPageKeybinding.tsx @@ -4,11 +4,8 @@ import useExtensionSettings from "@/services/infra/extension-api-wrappers/extens export default function ThreadsSearchPageKeybinding() { const { settings, mutation } = useExtensionSettings(); - const defaultKeys = - settings?.plugins["commandMenu"].keybindings.threadsSearch ?? []; - const { HotkeyRecorderUi } = useHotkeyRecorder({ - defaultKeys, + defaultKeys: settings.plugins["commandMenu"].keybindings.threadsSearch, onSave: (keys) => { mutation.mutate((draft) => { draft.plugins["commandMenu"].keybindings.threadsSearch = keys; diff --git a/perplexity/extension/src/plugins/command-menu/settings-ui/ToggleCommandDialogKeybinding.tsx b/perplexity/extension/src/plugins/command-menu/settings-ui/ToggleCommandDialogKeybinding.tsx index 7ab98e5c4..583761a40 100644 --- a/perplexity/extension/src/plugins/command-menu/settings-ui/ToggleCommandDialogKeybinding.tsx +++ b/perplexity/extension/src/plugins/command-menu/settings-ui/ToggleCommandDialogKeybinding.tsx @@ -4,10 +4,8 @@ import useExtensionSettings from "@/services/infra/extension-api-wrappers/extens export default function ToggleCommandDialogKeybinding() { const { settings, mutation } = useExtensionSettings(); - const defaultKeys = settings?.plugins["commandMenu"].keybindings.toggle ?? []; - const { HotkeyRecorderUi } = useHotkeyRecorder({ - defaultKeys, + defaultKeys: settings.plugins["commandMenu"].keybindings.toggle, onSave: (keys) => { mutation.mutate((draft) => { draft.plugins["commandMenu"].keybindings.toggle = keys; diff --git a/perplexity/extension/src/plugins/command-menu/settings-ui/ToggleSidecarKeybinding.tsx b/perplexity/extension/src/plugins/command-menu/settings-ui/ToggleSidecarKeybinding.tsx index 2e96ad6af..e6badb26d 100644 --- a/perplexity/extension/src/plugins/command-menu/settings-ui/ToggleSidecarKeybinding.tsx +++ b/perplexity/extension/src/plugins/command-menu/settings-ui/ToggleSidecarKeybinding.tsx @@ -4,11 +4,8 @@ import useExtensionSettings from "@/services/infra/extension-api-wrappers/extens export default function ToggleSidecarKeybinding() { const { settings, mutation } = useExtensionSettings(); - const defaultKeys = - settings?.plugins["commandMenu"].keybindings.toggleSidecar ?? []; - const { HotkeyRecorderUi } = useHotkeyRecorder({ - defaultKeys, + defaultKeys: settings.plugins["commandMenu"].keybindings.toggleSidecar, onSave: (keys) => { mutation.mutate((draft) => { draft.plugins["commandMenu"].keybindings.toggleSidecar = keys; diff --git a/perplexity/extension/src/plugins/force-writing-mode/settings-ui.tsx b/perplexity/extension/src/plugins/force-writing-mode/settings-ui.tsx index 4daca7f75..306561102 100644 --- a/perplexity/extension/src/plugins/force-writing-mode/settings-ui.tsx +++ b/perplexity/extension/src/plugins/force-writing-mode/settings-ui.tsx @@ -7,14 +7,14 @@ export const pluginId: PluginId = "queryBox:spacesThreadsForceWritingMode"; export default function SpacesThreadsForceWritingModePluginSettingsUi() { const { settings, mutation } = useExtensionSettings(); - const pluginSettings = - settings?.plugins["queryBox:spacesThreadsForceWritingMode"]; return (
{ mutation.mutate((draft) => { draft.plugins["queryBox:spacesThreadsForceWritingMode"].enabled = diff --git a/perplexity/extension/src/plugins/home-custom-slogan/settings-ui.tsx b/perplexity/extension/src/plugins/home-custom-slogan/settings-ui.tsx index 7d07ce874..2d8dc85ad 100644 --- a/perplexity/extension/src/plugins/home-custom-slogan/settings-ui.tsx +++ b/perplexity/extension/src/plugins/home-custom-slogan/settings-ui.tsx @@ -17,13 +17,11 @@ export default function CustomHomeSloganPluginSettingsUi() { }); }, 300); - if (!settings) return null; - return (
mutation.mutate((draft) => { draft.plugins["home:customSlogan"].enabled = checked; @@ -33,7 +31,7 @@ export default function CustomHomeSloganPluginSettingsUi() {
debouncedMutate(value)} />
diff --git a/perplexity/extension/src/plugins/image-gen-model-selector/settings-ui.tsx b/perplexity/extension/src/plugins/image-gen-model-selector/settings-ui.tsx index 324037550..0be1d1da6 100644 --- a/perplexity/extension/src/plugins/image-gen-model-selector/settings-ui.tsx +++ b/perplexity/extension/src/plugins/image-gen-model-selector/settings-ui.tsx @@ -8,8 +8,6 @@ export const pluginId: PluginId = "imageGenModelSelector"; export default function ImageGenModelSelectorPluginSettingsUi() { const { settings, mutation } = useExtensionSettings(); - if (!settings) return null; - return (

@@ -18,7 +16,7 @@ export default function ImageGenModelSelectorPluginSettingsUi() {

{ mutation.mutate((draft) => { draft.plugins["imageGenModelSelector"].enabled = checked; diff --git a/perplexity/extension/src/plugins/language-model-selector/components/TriggerButton.tsx b/perplexity/extension/src/plugins/language-model-selector/components/TriggerButton.tsx index 213bfc815..d9afc096e 100644 --- a/perplexity/extension/src/plugins/language-model-selector/components/TriggerButton.tsx +++ b/perplexity/extension/src/plugins/language-model-selector/components/TriggerButton.tsx @@ -26,7 +26,7 @@ export default function BetterLanguageModelSelectorTriggerButton() { const type = Object.entries(PplxLanguageModelsService.allModels).find( ([_, models]) => models.some((m) => m.code === selectedLanguageModel), - )?.[0]; + )?.[0] as LanguageModelType | undefined; const TypeIcon = type ? LanguageModelTypeIcons[type as LanguageModelType] @@ -48,8 +48,7 @@ export default function BetterLanguageModelSelectorTriggerButton() { {isAuto ? type - ? (advancedModeLabelMap[type as LanguageModelType] ?? - `${type.charAt(0).toUpperCase()}${type.slice(1)}`) + ? advancedModeLabelMap[type] : modelInfo?.shortLabel : modelInfo?.shortLabel} diff --git a/perplexity/extension/src/plugins/language-model-selector/model-selection-mismatch-warning.loader.ts b/perplexity/extension/src/plugins/language-model-selector/model-selection-mismatch-warning.loader.ts index 7b4601bf9..414421142 100644 --- a/perplexity/extension/src/plugins/language-model-selector/model-selection-mismatch-warning.loader.ts +++ b/perplexity/extension/src/plugins/language-model-selector/model-selection-mismatch-warning.loader.ts @@ -36,8 +36,7 @@ export default function () { for (const messageBlock of messageBlocks) { messageBlock.nodes.$displayModelButton.toggleClass( "cplx-model-mismatch-warning", - messageBlock.content.displayModel != null && - messageBlock.content.userSelectedModel != null && + messageBlock.content.userSelectedModel != null && messageBlock.content.displayModel !== "turbo" && messageBlock.content.userSelectedModel !== messageBlock.content.displayModel, diff --git a/perplexity/extension/src/plugins/language-model-selector/settings-ui.tsx b/perplexity/extension/src/plugins/language-model-selector/settings-ui.tsx index 4e6089e49..bd64f0452 100644 --- a/perplexity/extension/src/plugins/language-model-selector/settings-ui.tsx +++ b/perplexity/extension/src/plugins/language-model-selector/settings-ui.tsx @@ -15,8 +15,6 @@ export const pluginId: PluginId = "queryBox:languageModelSelector"; export default function LanguageModelSelectorPluginSettingsUi() { const { settings, mutation } = useExtensionSettings(); - if (!settings) return null; - return (
@@ -35,9 +33,7 @@ export default function LanguageModelSelectorPluginSettingsUi() {
{ mutation.mutate((draft) => { draft.plugins["queryBox:languageModelSelector"].enabled = checked; @@ -63,7 +59,7 @@ export default function LanguageModelSelectorPluginSettingsUi() { } checked={ settings.plugins["queryBox:languageModelSelector"] - .showModelSelectionMismatchWarning ?? false + .showModelSelectionMismatchWarning } onCheckedChange={({ checked }) => { mutation.mutate((draft) => { @@ -77,8 +73,7 @@ export default function LanguageModelSelectorPluginSettingsUi() { { mutation.mutate((draft) => { diff --git a/perplexity/extension/src/plugins/language-model-selector/store/sync.loader.ts b/perplexity/extension/src/plugins/language-model-selector/store/sync.loader.ts index 1aa0c8d1f..cca284aa1 100644 --- a/perplexity/extension/src/plugins/language-model-selector/store/sync.loader.ts +++ b/perplexity/extension/src/plugins/language-model-selector/store/sync.loader.ts @@ -84,7 +84,7 @@ function syncToInternalSearchStates(): void { betterLanguageModelSelectorStore.subscribe( (state) => state.model, (model) => { - if (model == null || !isLanguageModelCode(model)) { + if (!isLanguageModelCode(model)) { return; } diff --git a/perplexity/extension/src/plugins/language-model-selector/utils.ts b/perplexity/extension/src/plugins/language-model-selector/utils.ts index 14a995c0c..b0a9d4e49 100644 --- a/perplexity/extension/src/plugins/language-model-selector/utils.ts +++ b/perplexity/extension/src/plugins/language-model-selector/utils.ts @@ -11,7 +11,7 @@ function filterAndMapSelectItems( const subTier = pluginGuardsStore.getState().subTier; return models - .filter((model) => !model.isMax || (model.isMax && subTier === "max")) + .filter((model) => !model.isMax || subTier === "max") .map((model) => ({ id: model.code as LanguageModelCode, label: model.label, @@ -44,9 +44,7 @@ export function filterAndMapModels( ) { const { subTier } = pluginGuardsStore.getState(); - return models.filter( - (model) => !model.isMax || (model.isMax && subTier === "max"), - ); + return models.filter((model) => !model.isMax || subTier === "max"); } export function getModelsByType(type: LanguageModelType) { diff --git a/perplexity/extension/src/plugins/prompt-history/hooks/usePromptHistory.ts b/perplexity/extension/src/plugins/prompt-history/hooks/usePromptHistory.ts index 5fcdfcda6..19b1aeb54 100644 --- a/perplexity/extension/src/plugins/prompt-history/hooks/usePromptHistory.ts +++ b/perplexity/extension/src/plugins/prompt-history/hooks/usePromptHistory.ts @@ -26,7 +26,7 @@ export function usePromptHistory({ InfiniteData<{ items: PromptHistory[]; total: number }, number> >( promptHistoryQueries.infinite.detail({ - searchTerm: previousSearchValue ?? "", + searchTerm: previousSearchValue, }).queryKey, ); }, diff --git a/perplexity/extension/src/plugins/prompt-history/settings-ui.tsx b/perplexity/extension/src/plugins/prompt-history/settings-ui.tsx index 1a953f302..b6fa74e4e 100644 --- a/perplexity/extension/src/plugins/prompt-history/settings-ui.tsx +++ b/perplexity/extension/src/plugins/prompt-history/settings-ui.tsx @@ -20,7 +20,6 @@ export const pluginId: PluginId = "promptHistory"; export default function PromptHistoryPluginSettingsUi() { const { settings, mutation } = useExtensionSettings(); - const pluginSettings = settings?.plugins["promptHistory"]; const handleEnableChange = (checked: boolean) => { mutation.mutate((draft) => { @@ -28,8 +27,6 @@ export default function PromptHistoryPluginSettingsUi() { }); }; - if (!settings) return null; - return (

@@ -38,11 +35,11 @@ export default function PromptHistoryPluginSettingsUi() {

handleEnableChange(checked)} /> - {pluginSettings?.enabled && ( + {settings.plugins["promptHistory"].enabled && (
@@ -56,7 +53,7 @@ export default function PromptHistoryPluginSettingsUi() {
} - checked={pluginSettings?.trigger.onSubmit ?? false} + checked={settings.plugins["promptHistory"].trigger.onSubmit} onCheckedChange={({ checked }) => { mutation.mutate((draft) => { draft.plugins["promptHistory"].trigger.onSubmit = checked; @@ -74,7 +71,7 @@ export default function PromptHistoryPluginSettingsUi() {
} - checked={pluginSettings?.trigger.onNavigation ?? false} + checked={settings.plugins["promptHistory"].trigger.onNavigation} onCheckedChange={({ checked }) => { mutation.mutate((draft) => { draft.plugins["promptHistory"].trigger.onNavigation = checked; @@ -97,8 +94,8 @@ export default function PromptHistoryPluginSettingsUi() { function SlashCommandMenuActivationShortcutsSettings() { const { settings, mutation } = useExtensionSettings(); - const shortcutType = settings?.plugins["promptHistory"]?.shortcut?.type; - const shortcutValue = settings?.plugins["promptHistory"]?.shortcut?.value; + const shortcutType = settings.plugins["promptHistory"].shortcut.type; + const shortcutValue = settings.plugins["promptHistory"].shortcut.value; const shortcutTypeItems = [ { id: "keybinding", title: "Keyboard Shortcut" }, { id: "command", title: "Text Command" }, @@ -123,7 +120,7 @@ function SlashCommandMenuActivationShortcutsSettings() { itemToString: (item) => item.title, itemToValue: (item) => item.id, })} - value={[shortcutType ?? "keybinding"]} + value={[shortcutType]} positioning={{ sameWidth: true }} onValueChange={({ value }) => { mutation.mutate((draft) => { diff --git a/perplexity/extension/src/plugins/prompt-history/utils.ts b/perplexity/extension/src/plugins/prompt-history/utils.ts index cd8a49c7c..e6c9404a0 100644 --- a/perplexity/extension/src/plugins/prompt-history/utils.ts +++ b/perplexity/extension/src/plugins/prompt-history/utils.ts @@ -27,7 +27,7 @@ export const handlePromptSave = async (params?: { } } - if (prompt == null || prompt?.length === 0 || prompt.trim() === "") return; + if (prompt == null || prompt.length === 0 || prompt.trim() === "") return; await PromptHistoryService.Instance.deduplicateAdd({ prompt, diff --git a/perplexity/extension/src/plugins/query-box-submit-on-ctrl-enter/settings-ui.tsx b/perplexity/extension/src/plugins/query-box-submit-on-ctrl-enter/settings-ui.tsx index 8ef15bf06..cddb317c4 100644 --- a/perplexity/extension/src/plugins/query-box-submit-on-ctrl-enter/settings-ui.tsx +++ b/perplexity/extension/src/plugins/query-box-submit-on-ctrl-enter/settings-ui.tsx @@ -6,15 +6,12 @@ export const pluginId: PluginId = "queryBox:submitOnCtrlEnter"; export default function SubmitOnCtrlEnterPluginSettingsUi() { const { settings, mutation } = useExtensionSettings(); - const pluginSettings = settings?.plugins["queryBox:submitOnCtrlEnter"]; - - if (!settings) return null; return (
{ mutation.mutate((draft) => { draft.plugins["queryBox:submitOnCtrlEnter"].enabled = checked; diff --git a/perplexity/extension/src/plugins/thread-artifacts/components/ArtifactContent.tsx b/perplexity/extension/src/plugins/thread-artifacts/components/ArtifactContent.tsx index cf7b67a54..0eff638c4 100644 --- a/perplexity/extension/src/plugins/thread-artifacts/components/ArtifactContent.tsx +++ b/perplexity/extension/src/plugins/thread-artifacts/components/ArtifactContent.tsx @@ -4,7 +4,6 @@ import ArtifactCodeView from "@/plugins/thread-artifacts/components/ArtifactCode import ArtifactPreview from "@/plugins/thread-artifacts/components/Preview"; import { ARTIFACT_INITIAL_STATE } from "@/plugins/thread-artifacts/consts"; import { useArtifactsStore } from "@/plugins/thread-artifacts/store"; -import type { ArtifactLanguage } from "@/plugins/thread-artifacts/types"; import { getInterpretedArtifactLanguage } from "@/plugins/thread-artifacts/utils"; import { PPLX_SCROLLBAR_CLASSES } from "@/utils/dom-utils/pplx-scrollbar-classes"; @@ -16,18 +15,17 @@ export default function ArtifactContent() { messageBlockIndex: selectedCodeBlockLocation?.messageBlockIndex, codeBlockIndex: selectedCodeBlockLocation?.codeBlockIndex, }); - const isInFlight = selectedCodeBlock?.states.isInFlight; const artifactViewMode = useArtifactsStore((state) => state.state); const language = getInterpretedArtifactLanguage( selectedCodeBlock?.content.language ?? "text", - ) as ArtifactLanguage; + ); const previewKey = useArtifactsStore((state) => state.refreshPreviewKey); const isValidArtifactCode = useArtifactsStore( (state) => state.isValidArtifactCode, ); - if (!isValidArtifactCode) return null; + if (!isValidArtifactCode || !language) return null; return ( - {isAutonomousArtifactLanguage && ( - - - - )} + + + )}
diff --git a/perplexity/extension/src/plugins/thread-artifacts/components/PrePromptInstallationDialog.tsx b/perplexity/extension/src/plugins/thread-artifacts/components/PrePromptInstallationDialog.tsx index 2db849b3a..c49066822 100644 --- a/perplexity/extension/src/plugins/thread-artifacts/components/PrePromptInstallationDialog.tsx +++ b/perplexity/extension/src/plugins/thread-artifacts/components/PrePromptInstallationDialog.tsx @@ -20,7 +20,7 @@ import { softNavigate } from "@/plugins/__core__/_main-world/spa-router/utils"; import { PplxApiService } from "@/services/externals/pplx-api"; import { setCookie } from "@/utils/dom-utils/generics"; import { fetchTextResource } from "@/utils/misc/utils"; -import { errorWrapper } from "@/utils/wrappers/error-wrapper"; +import { tryCatch } from "@/utils/wrappers/try-catch"; import TablerLoaderCircle from "~icons/tabler/loader-2"; @@ -64,11 +64,11 @@ export function ArtifactsPrePromptInstallationDialog() { 365, ); - await errorWrapper(() => + await tryCatch(() => PplxApiService.updateSpace(data.uuid, { enable_web_by_default: false, }), - )(); + ); void softNavigate(`/spaces/${data.slug}`); }, @@ -125,7 +125,7 @@ export function ArtifactsPrePromptInstallationDialog() { className="x:float-right x:mt-4 x:mr-4" content={artfiactsInstruction} /> -
+
{artfiactsInstruction}
diff --git a/perplexity/extension/src/plugins/thread-artifacts/components/Preview.tsx b/perplexity/extension/src/plugins/thread-artifacts/components/Preview.tsx index cfd784c30..18d8ab8ca 100644 --- a/perplexity/extension/src/plugins/thread-artifacts/components/Preview.tsx +++ b/perplexity/extension/src/plugins/thread-artifacts/components/Preview.tsx @@ -8,8 +8,6 @@ export default function ArtifactPreview({ }) { const Component = ARTIFACT_RENDERERS[language]; - if (Component == null) return null; - return (
diff --git a/perplexity/extension/src/plugins/thread-artifacts/components/PreviewToggle.tsx b/perplexity/extension/src/plugins/thread-artifacts/components/PreviewToggle.tsx index 315cacd1b..7af847a40 100644 --- a/perplexity/extension/src/plugins/thread-artifacts/components/PreviewToggle.tsx +++ b/perplexity/extension/src/plugins/thread-artifacts/components/PreviewToggle.tsx @@ -23,8 +23,7 @@ export default function PreviewToggle({ state === "preview", })} > - {ARTIFACTS_LANGUAGE_PREVIEW_TOGGLE_TEXT[language] ?? - t("plugin-artifacts.toggle.preview")} + {ARTIFACTS_LANGUAGE_PREVIEW_TOGGLE_TEXT[language]}
- {ARTIFACTS_LANGUAGE_RAW_TOGGLE_TEXT[language] ?? - t("plugin-artifacts.toggle.code")} + {ARTIFACTS_LANGUAGE_RAW_TOGGLE_TEXT[language]}
); diff --git a/perplexity/extension/src/plugins/thread-artifacts/components/VersionsNavigator.tsx b/perplexity/extension/src/plugins/thread-artifacts/components/VersionsNavigator.tsx index e532de9d6..8883690e7 100644 --- a/perplexity/extension/src/plugins/thread-artifacts/components/VersionsNavigator.tsx +++ b/perplexity/extension/src/plugins/thread-artifacts/components/VersionsNavigator.tsx @@ -29,11 +29,10 @@ export default function AutonomousArtifactVersionsNavigator() { (location) => location.messageBlockIndex === selectedCodeBlockLocation?.messageBlockIndex && - location.codeBlockIndex === selectedCodeBlockLocation?.codeBlockIndex, + location.codeBlockIndex === selectedCodeBlockLocation.codeBlockIndex, ); const hasNextVersion = - versions?.location && - currentLocationIndex !== versions?.location.length - 1; + versions?.location && currentLocationIndex !== versions.location.length - 1; const hasPreviousVersion = versions?.location && currentLocationIndex !== 0; if (!versions || currentLocationIndex == null) return null; @@ -50,8 +49,7 @@ export default function AutonomousArtifactVersionsNavigator() { disabled={!hasPreviousVersion} onClick={() => { artifactsStore.setState((draft) => { - if (currentLocationIndex == null) return; - const newLocation = versions?.location[currentLocationIndex - 1]; + const newLocation = versions.location[currentLocationIndex - 1]; if (!newLocation) return; draft.selectedCodeBlockLocation = newLocation; }); @@ -86,8 +84,7 @@ export default function AutonomousArtifactVersionsNavigator() { disabled={!hasNextVersion} onClick={() => { artifactsStore.setState((draft) => { - if (currentLocationIndex == null) return; - const newLocation = versions?.location[currentLocationIndex + 1]; + const newLocation = versions.location[currentLocationIndex + 1]; if (!newLocation) return; draft.selectedCodeBlockLocation = newLocation; }); diff --git a/perplexity/extension/src/plugins/thread-artifacts/components/renderer/Markmap.tsx b/perplexity/extension/src/plugins/thread-artifacts/components/renderer/Markmap.tsx index 00092f561..d07273a3b 100644 --- a/perplexity/extension/src/plugins/thread-artifacts/components/renderer/Markmap.tsx +++ b/perplexity/extension/src/plugins/thread-artifacts/components/renderer/Markmap.tsx @@ -62,7 +62,7 @@ export default function MarkmapRenderer() { {!isPending && markmapRendererResponded && !isSuccess && - !result?.error && ( + !result.error && (
Failed to render provided markmap code. Try to reload the @@ -70,34 +70,31 @@ export default function MarkmapRenderer() {
)} - {!isPending && - markmapRendererResponded && - !isSuccess && - result?.error && ( -
-
- An error occurred while rendering: -
-
- {result.error} -
- -
- )} + $queryBoxTextbox.trigger("focus"); + document.execCommand("insertText", false, errorText); + }} + > + Fix Error + +
+ )} Failed to render provided mermaid code. Try to reload the @@ -75,34 +75,31 @@ export default function MermaidRenderer() {
)} - {!isPending && - mermaidRendererResponded && - !isSuccess && - result?.error && ( -
-
- An error occurred while rendering: -
-
- {result.error} -
- -
- )} + $queryBoxTextbox.trigger("focus"); + document.execCommand("insertText", false, errorText); + }} + > + Fix Error + +
+ )}
+
mutation.mutate((draft) => { draft.plugins["thread:artifacts"].enabled = checked; }) } /> - {settings?.plugins["thread:artifacts"].enabled && ( + {settings.plugins["thread:artifacts"].enabled && (

For the AI to acknowledge the ability to use Artifacts, you need to diff --git a/perplexity/extension/src/plugins/thread-artifacts/store.loader.ts b/perplexity/extension/src/plugins/thread-artifacts/store.loader.ts index bd0eaa3cd..ef98cc729 100644 --- a/perplexity/extension/src/plugins/thread-artifacts/store.loader.ts +++ b/perplexity/extension/src/plugins/thread-artifacts/store.loader.ts @@ -85,7 +85,6 @@ const initializeAutonomousMode = () => { codeBlocksChunks.forEach((chunks, chunkIndex) => { chunks.forEach((codeBlock, codeBlockIndex) => { if ( - codeBlock == null || !codeBlock.content.language || !isAutonomousArtifactLanguageString(codeBlock.content.language) ) @@ -96,7 +95,11 @@ const initializeAutonomousMode = () => { codeBlock.content.language, ); - if (!(interpretedLanguage in ARTIFACT_PLACEHOLDERS)) return; + if ( + interpretedLanguage == null || + !(interpretedLanguage in ARTIFACT_PLACEHOLDERS) + ) + return; updateArtifactBlocks({ key, diff --git a/perplexity/extension/src/plugins/thread-artifacts/useHandleArtifactsState.ts b/perplexity/extension/src/plugins/thread-artifacts/useHandleArtifactsState.ts index 6862580f5..47292d8c0 100644 --- a/perplexity/extension/src/plugins/thread-artifacts/useHandleArtifactsState.ts +++ b/perplexity/extension/src/plugins/thread-artifacts/useHandleArtifactsState.ts @@ -34,7 +34,6 @@ export function useHandleArtifactsState() { const isValidArtifactCode = codeBlock?.content.code != null && - codeBlock?.content.language != null && (isArtifactLanguageString(codeBlock.content.language) || isAutonomousArtifactLanguageString(codeBlock.content.language)); diff --git a/perplexity/extension/src/plugins/thread-artifacts/useHandleAutonomousArtifactsState.ts b/perplexity/extension/src/plugins/thread-artifacts/useHandleAutonomousArtifactsState.ts index 159bcb5c0..8e7bf4e8f 100644 --- a/perplexity/extension/src/plugins/thread-artifacts/useHandleAutonomousArtifactsState.ts +++ b/perplexity/extension/src/plugins/thread-artifacts/useHandleAutonomousArtifactsState.ts @@ -58,7 +58,7 @@ export default function useHandleAutonomousArtifactsState() { const isCurrentlySelected = chunkIndex === selectedCodeBlockLocation?.messageBlockIndex && - codeIndex === selectedCodeBlockLocation?.codeBlockIndex; + codeIndex === selectedCodeBlockLocation.codeBlockIndex; if (!codeBlock.states.isInFlight || isCurrentlySelected) continue; @@ -112,7 +112,6 @@ export default function useHandleAutonomousArtifactsState() { !hasAutoPreviewTriggered && selectedCodeBlock && !selectedCodeBlock.states.isInFlight && - selectedCodeBlockLocation != null && selectedCodeBlock === codeBlocksChunks[selectedCodeBlockLocation.messageBlockIndex]?.[ selectedCodeBlockLocation.codeBlockIndex diff --git a/perplexity/extension/src/plugins/thread-artifacts/utils.ts b/perplexity/extension/src/plugins/thread-artifacts/utils.ts index 321dd0ffa..80d543b61 100644 --- a/perplexity/extension/src/plugins/thread-artifacts/utils.ts +++ b/perplexity/extension/src/plugins/thread-artifacts/utils.ts @@ -43,17 +43,12 @@ export const isAutonomousArtifactLanguageString = ( export const getInterpretedArtifactLanguage = ( languageString: string, -): ArtifactLanguage | string => { +): ArtifactLanguage | undefined => { if (isArtifactLanguageString(languageString)) - return ( - ARTIFACT_LANGUAGES[languageString] ?? - ARTIFACT_INTERPRETED_LANGUAGES[languageString] - ); + return ARTIFACT_INTERPRETED_LANGUAGES[languageString]; if (isAutonomousArtifactLanguageString(languageString)) - return languageString.split(":")[1] ?? languageString; - - return languageString; + return languageString.split(":")[1] as ArtifactLanguage; }; export function getArtifactTitle(languageString: string | undefined | null) { diff --git a/perplexity/extension/src/plugins/thread-better-code-blocks/settings-ui/FineGrainedOptions.tsx b/perplexity/extension/src/plugins/thread-better-code-blocks/settings-ui/FineGrainedOptions.tsx index 16b684298..5768c7121 100644 --- a/perplexity/extension/src/plugins/thread-better-code-blocks/settings-ui/FineGrainedOptions.tsx +++ b/perplexity/extension/src/plugins/thread-better-code-blocks/settings-ui/FineGrainedOptions.tsx @@ -34,7 +34,7 @@ export default function BetterCodeBlockFineGrainedOptions({

{ mutation.mutate({ language, @@ -46,7 +46,7 @@ export default function BetterCodeBlockFineGrainedOptions({ /> { mutation.mutate({ language, @@ -60,7 +60,7 @@ export default function BetterCodeBlockFineGrainedOptions({
{ mutation.mutate({ language, @@ -75,7 +75,7 @@ export default function BetterCodeBlockFineGrainedOptions({ { mutation.mutate({ language, @@ -92,7 +92,7 @@ export default function BetterCodeBlockFineGrainedOptions({
{ mutation.mutate({ language, @@ -108,9 +108,9 @@ export default function BetterCodeBlockFineGrainedOptions({ { if (Number(e.target.value) < 0) { return; @@ -127,12 +127,12 @@ export default function BetterCodeBlockFineGrainedOptions({
- {settings?.maxHeight.enabled && ( + {settings.maxHeight.enabled && ( <> { mutation.mutate({ language, @@ -147,7 +147,7 @@ export default function BetterCodeBlockFineGrainedOptions({ { mutation.mutate({ language, @@ -165,7 +165,7 @@ export default function BetterCodeBlockFineGrainedOptions({
{ mutation.mutate({ language, @@ -183,9 +183,9 @@ export default function BetterCodeBlockFineGrainedOptions({ min={50} max={100} step={25} - defaultValue={settings?.maxWidth.value} + defaultValue={settings.maxWidth.value} className="x:w-[100px]" - disabled={!settings?.maxWidth.enabled} + disabled={!settings.maxWidth.enabled} onChange={(e) => { const value = Number(e.target.value); if (value < 50 || value > 100) { @@ -204,7 +204,7 @@ export default function BetterCodeBlockFineGrainedOptions({
{ mutation.mutate({ language, @@ -216,14 +216,14 @@ export default function BetterCodeBlockFineGrainedOptions({ }); }} /> - {settings?.placeholderText.enabled && ( + {settings.placeholderText.enabled && (
{ debouncedMutate({ @@ -237,7 +237,7 @@ export default function BetterCodeBlockFineGrainedOptions({ { debouncedMutate({ @@ -251,7 +251,7 @@ export default function BetterCodeBlockFineGrainedOptions({ { debouncedMutate({ diff --git a/perplexity/extension/src/plugins/thread-better-code-blocks/settings-ui/GlobalOptions.tsx b/perplexity/extension/src/plugins/thread-better-code-blocks/settings-ui/GlobalOptions.tsx index cc444b24b..c92563547 100644 --- a/perplexity/extension/src/plugins/thread-better-code-blocks/settings-ui/GlobalOptions.tsx +++ b/perplexity/extension/src/plugins/thread-better-code-blocks/settings-ui/GlobalOptions.tsx @@ -17,7 +17,7 @@ export default function BetterCodeBlockGlobalOptions() {
{ mutation.mutate((draft) => { draft.plugins["thread:betterCodeBlocks"].stickyHeader = checked; @@ -26,7 +26,7 @@ export default function BetterCodeBlockGlobalOptions() { /> { mutation.mutate((draft) => { draft.plugins["thread:betterCodeBlocks"].showLineNumbers = checked; @@ -36,7 +36,7 @@ export default function BetterCodeBlockGlobalOptions() {
{ mutation.mutate((draft) => { draft.plugins["thread:betterCodeBlocks"].unwrap.enabled = checked; @@ -47,7 +47,7 @@ export default function BetterCodeBlockGlobalOptions() { textLabel="Show toggle button" className="x:ml-8" checked={ - settings?.plugins["thread:betterCodeBlocks"].unwrap.showToggleButton + settings.plugins["thread:betterCodeBlocks"].unwrap.showToggleButton } onCheckedChange={({ checked }) => { mutation.mutate((draft) => { @@ -62,7 +62,7 @@ export default function BetterCodeBlockGlobalOptions() { { mutation.mutate((draft) => { @@ -76,11 +76,11 @@ export default function BetterCodeBlockGlobalOptions() { type="number" min={300} defaultValue={ - settings?.plugins["thread:betterCodeBlocks"].maxHeight?.value + settings.plugins["thread:betterCodeBlocks"].maxHeight.value } className="x:w-[100px]" disabled={ - !settings?.plugins["thread:betterCodeBlocks"].maxHeight?.enabled + !settings.plugins["thread:betterCodeBlocks"].maxHeight.enabled } onChange={(e) => { if (Number(e.target.value) < 300) { @@ -99,8 +99,8 @@ export default function BetterCodeBlockGlobalOptions() { textLabel="Collapse by default" className="x:ml-8" checked={ - settings?.plugins["thread:betterCodeBlocks"].maxHeight - ?.collapseByDefault + settings.plugins["thread:betterCodeBlocks"].maxHeight + .collapseByDefault } onCheckedChange={({ checked }) => { mutation.mutate((draft) => { @@ -114,8 +114,8 @@ export default function BetterCodeBlockGlobalOptions() { textLabel="Show toggle button" className="x:ml-8" checked={ - settings?.plugins["thread:betterCodeBlocks"].maxHeight - ?.showToggleButton + settings.plugins["thread:betterCodeBlocks"].maxHeight + .showToggleButton } onCheckedChange={({ checked }) => { mutation.mutate((draft) => { @@ -129,9 +129,7 @@ export default function BetterCodeBlockGlobalOptions() {
{ mutation.mutate((draft) => { draft.plugins["thread:betterCodeBlocks"].maxWidth.enabled = @@ -146,11 +144,11 @@ export default function BetterCodeBlockGlobalOptions() { max={100} step={25} defaultValue={ - settings?.plugins["thread:betterCodeBlocks"].maxWidth?.value + settings.plugins["thread:betterCodeBlocks"].maxWidth.value } className="x:w-[100px]" disabled={ - !settings?.plugins["thread:betterCodeBlocks"].maxWidth?.enabled + !settings.plugins["thread:betterCodeBlocks"].maxWidth.enabled } onChange={(e) => { const value = Number(e.target.value); diff --git a/perplexity/extension/src/plugins/thread-better-code-blocks/settings-ui/index.tsx b/perplexity/extension/src/plugins/thread-better-code-blocks/settings-ui/index.tsx index 14e5db7cf..0ad816006 100644 --- a/perplexity/extension/src/plugins/thread-better-code-blocks/settings-ui/index.tsx +++ b/perplexity/extension/src/plugins/thread-better-code-blocks/settings-ui/index.tsx @@ -27,7 +27,7 @@ export default function BetterCodeBlocksPluginSettingsUi() {
- {settings?.plugins["thread:betterCodeBlocks"].enabled && ( + {settings.plugins["thread:betterCodeBlocks"].enabled && ( { @@ -81,7 +81,7 @@ function Header() {
{ mutation.mutate((draft) => { draft.plugins["thread:betterCodeBlocks"].enabled = checked; diff --git a/perplexity/extension/src/plugins/thread-better-code-blocks/sticky-header.css b/perplexity/extension/src/plugins/thread-better-code-blocks/sticky-header.css index 4ccc20939..e7b56915c 100644 --- a/perplexity/extension/src/plugins/thread-better-code-blocks/sticky-header.css +++ b/perplexity/extension/src/plugins/thread-better-code-blocks/sticky-header.css @@ -1,7 +1,8 @@ @reference "../../assets/index.css"; [data-cplx-code-block-header][data-sticky="true"] { - @apply x:sticky x:top-(--header-height) x:@[1540px]/main:top-0; + @apply x:sticky x:top-(--header-height); + /* @apply x:@[1540px]/main:top-0 */ } [location="comet_assistant"] [data-cplx-code-block-header][data-sticky="true"] { diff --git a/perplexity/extension/src/plugins/thread-better-code-blocks/variants/HighlightedCode.tsx b/perplexity/extension/src/plugins/thread-better-code-blocks/variants/HighlightedCode.tsx index 6722bd103..61f7864d2 100644 --- a/perplexity/extension/src/plugins/thread-better-code-blocks/variants/HighlightedCode.tsx +++ b/perplexity/extension/src/plugins/thread-better-code-blocks/variants/HighlightedCode.tsx @@ -42,7 +42,7 @@ const HighlightedCodeWrapper = memo(() => { if (!codeBlock) return null; const showLineNumbers = - fineGrainedSettings?.showLineNumbers ?? globalSettings?.showLineNumbers; + fineGrainedSettings?.showLineNumbers ?? globalSettings.showLineNumbers; return (
{isInFlight ? (
- {fineGrainedSettings?.placeholderText?.loading && ( + {fineGrainedSettings?.placeholderText.loading && (
- {fineGrainedSettings?.placeholderText?.loading} + {fineGrainedSettings.placeholderText.loading}
)} diff --git a/perplexity/extension/src/plugins/thread-better-code-blocks/variants/base/Wrapper.tsx b/perplexity/extension/src/plugins/thread-better-code-blocks/variants/base/Wrapper.tsx index b22a73de4..d095e8fbe 100644 --- a/perplexity/extension/src/plugins/thread-better-code-blocks/variants/base/Wrapper.tsx +++ b/perplexity/extension/src/plugins/thread-better-code-blocks/variants/base/Wrapper.tsx @@ -16,7 +16,7 @@ const BaseCodeBlockWrapper = memo(function BaseCodeBlockWrapper() { const isSelectedArtifactCodeBlock = selectedArtifactCodeBlockLocation?.messageBlockIndex === sourceMessageBlockIndex && - selectedArtifactCodeBlockLocation?.codeBlockIndex === sourceCodeBlockIndex; + selectedArtifactCodeBlockLocation.codeBlockIndex === sourceCodeBlockIndex; return (
{ mutation.mutate((draft) => { draft.plugins["thread:betterMessageCopyButtons"].enabled = checked; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_main-world/trigger-rewrite-option.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_main-world/trigger-rewrite-option.ts index 4a31ce1aa..85b1df1fa 100644 --- a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_main-world/trigger-rewrite-option.ts +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_main-world/trigger-rewrite-option.ts @@ -1,7 +1,6 @@ import FiberSearchService from "@/plugins/__core__/_main-world/fiber-search"; import { DomSelectorsService } from "@/plugins/__core__/dom-selectors/service-init.loader"; import { DomSelectorsServiceImpl } from "@/services/externals/cplx-api/versioned-remote-resources/dom-selectors"; -import { errorWrapper } from "@/utils/wrappers/error-wrapper"; import { walkFiberNode } from "@/utils/wrappers/react-fiber"; export async function triggerRewriteOption(params: { @@ -35,9 +34,10 @@ export async function triggerRewriteOption(params: { if (fiberNode == null) return false; - const [triggerRewriteOptionHandler] = errorWrapper<() => void>(() => { - return walkFiberNode(fiberNode, params.fiberConfig.dataNodePath); - })(); + const [triggerRewriteOptionHandler] = tryCatch( + () => + walkFiberNode(fiberNode, params.fiberConfig.dataNodePath) as () => void, + ); if (triggerRewriteOptionHandler == null) return false; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/settings-ui.tsx b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/settings-ui.tsx index a050a02e7..28e121777 100644 --- a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/settings-ui.tsx +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/settings-ui.tsx @@ -7,9 +7,6 @@ export const pluginId: PluginId = "thread:betterRewriteDropdowns"; export default function BetterThreadRewriteDropdownsPluginSettingsUi() { const { settings, mutation } = useExtensionSettings(); - const pluginSettings = settings?.plugins["thread:betterRewriteDropdowns"]; - - if (!settings) return null; return (
@@ -19,7 +16,7 @@ export default function BetterThreadRewriteDropdownsPluginSettingsUi() {
{ mutation.mutate((draft) => { draft.plugins["thread:betterRewriteDropdowns"].enabled = checked; diff --git a/perplexity/extension/src/plugins/thread-custom-container-width/settings-ui.tsx b/perplexity/extension/src/plugins/thread-custom-container-width/settings-ui.tsx index e6dd9472d..4cea66f71 100644 --- a/perplexity/extension/src/plugins/thread-custom-container-width/settings-ui.tsx +++ b/perplexity/extension/src/plugins/thread-custom-container-width/settings-ui.tsx @@ -24,13 +24,11 @@ export default function CustomThreadContainerWidthPluginSettingsUi() { }); }, 300); - if (!settings) return null; - return (
mutation.mutate((draft) => { draft.plugins["thread:customThreadContainerWidth"].enabled = @@ -38,7 +36,7 @@ export default function CustomThreadContainerWidthPluginSettingsUi() { }) } /> - {settings?.plugins["thread:customThreadContainerWidth"].enabled && ( + {settings.plugins["thread:customThreadContainerWidth"].enabled && (
void; - onCopy: () => void; -}; - -export function ExportActions({ onDownload, onCopy }: ExportActionsProps) { - return ( -
- - -
- ); -} diff --git a/perplexity/extension/src/plugins/thread-export/ExportMenu.tsx b/perplexity/extension/src/plugins/thread-export/ExportMenu.tsx index ef8ee3ab3..b67eebe69 100644 --- a/perplexity/extension/src/plugins/thread-export/ExportMenu.tsx +++ b/perplexity/extension/src/plugins/thread-export/ExportMenu.tsx @@ -1,4 +1,3 @@ -import FaFileExport from "@/components/icons/FaFileExport"; import Tooltip from "@/components/Tooltip"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; @@ -12,31 +11,32 @@ import { useIsMobileStore } from "@/hooks/is-mobile-store"; import useToggleButtonText from "@/hooks/useToggleButtonText"; import { useThreadDomObserverStore } from "@/plugins/__core__/dom-observers/thread/store"; import type { ExportOption } from "@/plugins/thread-export/export-options"; -import { ExportActions } from "@/plugins/thread-export/ExportActions"; import { ExportFormatSelect } from "@/plugins/thread-export/ExportFormatSelect"; import { useCopyPplxThread } from "@/plugins/thread-export/hooks/useCopyPplxThread"; import downloadFile from "@/utils/misc/download-file"; -import { parseUrl } from "@/utils/misc/utils"; import TablerCheck from "~icons/tabler/check"; +import TablerCopy from "~icons/tabler/copy"; +import TablerFileDownload from "~icons/tabler/file-download"; +import TablerFileExport from "~icons/tabler/file-export"; import TablerLoaderCircle from "~icons/tabler/loader-2"; -const ExportMenu = memo(() => { - const isThreadInFlight = useThreadDomObserverStore( - (state) => state.states.isInFlight, - deepEqual, - ); - +export default function ExportMenu() { const { isMobile } = useIsMobileStore(); const { copyThread, isFetching, getContent } = useCopyPplxThread(); const [open, setOpen] = useState(false); const [includeCitations, setIncludeCitations] = useState(true); const [_format, setFormat] = useState("markdown"); + const isThreadInFlight = useThreadDomObserverStore( + (state) => state.states.isInFlight, + deepEqual, + ); + const defaultIdleText = isFetching ? ( ) : ( - + ); const [copyConfirmText, setCopyConfirmText] = useToggleButtonText({ @@ -44,13 +44,40 @@ const ExportMenu = memo(() => { }); const handleDownload = async (withCitations: boolean) => { + const filename = `${document.title.substring(0, 100)} ${withCitations ? "" : " (no-citations)"}.md`; + try { - const slug = - (parseUrl().pathname.split("/").pop() || - `thread-${new Date().getTime()}`) + - (withCitations ? "" : " (no-citations)"); + const start = performance.now(); const content = await getContent({ withCitations }); - const filename = `${document.title.substring(0, 100) ?? slug}.md`; + const elapsed = performance.now() - start; + + // if the time between calling .showSaveFilePicker and the last user gesture is too long, the browser will raise a security error. + if (elapsed > 500) { + toast({ + title: ( +
+ + + {t( + "plugin-thread-export.actions.largeFileDownloadPrompt.title", + )} + +
+ ), + description: t( + "plugin-thread-export.actions.largeFileDownloadPrompt.description", + ), + className: "x:cursor-pointer", + onClick: () => { + void downloadFile({ + data: content, + filename, + }); + }, + }); + return; + } + await downloadFile({ data: content, filename, @@ -76,7 +103,7 @@ const ExportMenu = memo(() => { + +
); -}); - -export default ExportMenu; +} diff --git a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.bn-BD.ts b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.bn-BD.ts index b295bec97..ce3451d6a 100644 --- a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.bn-BD.ts +++ b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.bn-BD.ts @@ -9,6 +9,10 @@ export default { includeCitations: "উদ্ধৃতি অন্তর্ভুক্ত করুন", actions: { download: "ডাউনলোড", + largeFileDownloadPrompt: { + title: "আপনার ডাউনলোড প্রস্তুত", + description: "ডাউনলোড শুরু করতে এখানে ক্লিক করুন", + }, copy: "কপি", }, errors: { diff --git a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.cs-CZ.ts b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.cs-CZ.ts index 80693bbcb..f070c83a0 100644 --- a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.cs-CZ.ts +++ b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.cs-CZ.ts @@ -9,6 +9,10 @@ export default { includeCitations: "Zahrnout citace", actions: { download: "Stáhnout", + largeFileDownloadPrompt: { + title: "Vaše stažení je připraveno", + description: "Klikněte zde pro zahájení stažení", + }, copy: "Kopírovat", }, errors: { diff --git a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.de-DE.ts b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.de-DE.ts index d812c617b..82453b073 100644 --- a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.de-DE.ts +++ b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.de-DE.ts @@ -9,6 +9,10 @@ export default { includeCitations: "Zitate einschließen", actions: { download: "Herunterladen", + largeFileDownloadPrompt: { + title: "Ihr Download ist bereit", + description: "Klicken Sie hier, um den Download zu starten", + }, copy: "Kopieren", }, errors: { diff --git a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.el-GR.ts b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.el-GR.ts index 1f7667d54..a6d2509f4 100644 --- a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.el-GR.ts +++ b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.el-GR.ts @@ -9,6 +9,10 @@ export default { includeCitations: "Συμπερίληψη παραπομπών", actions: { download: "Λήψη", + largeFileDownloadPrompt: { + title: "Η λήψη σας είναι έτοιμη", + description: "Κάντε κλικ εδώ για να ξεκινήσετε τη λήψη", + }, copy: "Αντιγραφή", }, errors: { diff --git a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.en-US.ts b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.en-US.ts index 05cbbd5d2..c7b6709b8 100644 --- a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.en-US.ts +++ b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.en-US.ts @@ -9,6 +9,10 @@ export default { includeCitations: "Include citations", actions: { download: "Download", + largeFileDownloadPrompt: { + title: "Your download is ready", + description: "Click here to start the download", + }, copy: "Copy", }, errors: { diff --git a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.es-ES.ts b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.es-ES.ts index cd7096015..e9e8687ce 100644 --- a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.es-ES.ts +++ b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.es-ES.ts @@ -9,6 +9,10 @@ export default { includeCitations: "Incluir citas", actions: { download: "Descargar", + largeFileDownloadPrompt: { + title: "Su descarga está lista", + description: "Haga clic aquí para iniciar la descarga", + }, copy: "Copiar", }, errors: { diff --git a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.fr-FR.ts b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.fr-FR.ts index 80cd83707..1651ac196 100644 --- a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.fr-FR.ts +++ b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.fr-FR.ts @@ -9,6 +9,10 @@ export default { includeCitations: "Inclure les citations", actions: { download: "Télécharger", + largeFileDownloadPrompt: { + title: "Votre téléchargement est prêt", + description: "Cliquez ici pour démarrer le téléchargement", + }, copy: "Copier", }, errors: { diff --git a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.hi-IN.ts b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.hi-IN.ts index e4b02d488..c998eb77a 100644 --- a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.hi-IN.ts +++ b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.hi-IN.ts @@ -9,6 +9,10 @@ export default { includeCitations: "उद्धरण शामिल करें", actions: { download: "डाउनलोड करें", + largeFileDownloadPrompt: { + title: "आपका डाउनलोड तैयार है", + description: "डाउनलोड शुरू करने के लिए यहाँ क्लिक करें", + }, copy: "कॉपी करें", }, errors: { diff --git a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.hr-HR.ts b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.hr-HR.ts index f88346669..380ce7c5f 100644 --- a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.hr-HR.ts +++ b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.hr-HR.ts @@ -9,6 +9,10 @@ export default { includeCitations: "Uključi citate", actions: { download: "Preuzmi", + largeFileDownloadPrompt: { + title: "Vaše preuzimanje je spremno", + description: "Kliknite ovdje za početak preuzimanja", + }, copy: "Kopiraj", }, errors: { diff --git a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.hu-HU.ts b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.hu-HU.ts index a32d5964d..dd1428bbc 100644 --- a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.hu-HU.ts +++ b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.hu-HU.ts @@ -9,6 +9,10 @@ export default { includeCitations: "Hivatkozások hozzáadása", actions: { download: "Letöltés", + largeFileDownloadPrompt: { + title: "A letöltésed elkészült", + description: "Kattints ide a letöltés indításához", + }, copy: "Másolás", }, errors: { diff --git a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.id-ID.ts b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.id-ID.ts index 01c67de12..475d6544a 100644 --- a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.id-ID.ts +++ b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.id-ID.ts @@ -9,6 +9,10 @@ export default { includeCitations: "Sertakan kutipan", actions: { download: "Unduh", + largeFileDownloadPrompt: { + title: "Unduhan Anda siap", + description: "Klik di sini untuk memulai unduhan", + }, copy: "Salin", }, errors: { diff --git a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.it-IT.ts b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.it-IT.ts index a5f89546b..e210dc0b2 100644 --- a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.it-IT.ts +++ b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.it-IT.ts @@ -9,6 +9,10 @@ export default { includeCitations: "Includi citazioni", actions: { download: "Scarica", + largeFileDownloadPrompt: { + title: "Il tuo download è pronto", + description: "Clicca qui per avviare il download", + }, copy: "Copia", }, errors: { diff --git a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.ja-JP.ts b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.ja-JP.ts index 27fba00c3..e69431ca7 100644 --- a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.ja-JP.ts +++ b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.ja-JP.ts @@ -9,6 +9,10 @@ export default { includeCitations: "引用を含める", actions: { download: "ダウンロード", + largeFileDownloadPrompt: { + title: "ダウンロードの準備ができました", + description: "ここをクリックしてダウンロードを開始", + }, copy: "コピー", }, errors: { diff --git a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.ko-KR.ts b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.ko-KR.ts index bfc7f96c3..4cbe75a4f 100644 --- a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.ko-KR.ts +++ b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.ko-KR.ts @@ -9,6 +9,10 @@ export default { includeCitations: "인용 포함", actions: { download: "다운로드", + largeFileDownloadPrompt: { + title: "다운로드가 준비되었습니다", + description: "여기를 클릭하여 다운로드를 시작하세요", + }, copy: "복사", }, errors: { diff --git a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.nl-NL.ts b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.nl-NL.ts index f9da91a46..edc0ce760 100644 --- a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.nl-NL.ts +++ b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.nl-NL.ts @@ -9,6 +9,10 @@ export default { includeCitations: "Citaten toevoegen", actions: { download: "Downloaden", + largeFileDownloadPrompt: { + title: "Uw download is klaar", + description: "Klik hier om het downloaden te starten", + }, copy: "Kopiëren", }, errors: { diff --git a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.pl-PL.ts b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.pl-PL.ts index dbea84a39..6e740575e 100644 --- a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.pl-PL.ts +++ b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.pl-PL.ts @@ -9,6 +9,10 @@ export default { includeCitations: "Dołącz cytaty", actions: { download: "Pobierz", + largeFileDownloadPrompt: { + title: "Twoje pobieranie jest gotowe", + description: "Kliknij tutaj, aby rozpocząć pobieranie", + }, copy: "Kopiuj", }, errors: { diff --git a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.pt-BR.ts b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.pt-BR.ts index d91a7c015..94bb9f0b3 100644 --- a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.pt-BR.ts +++ b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.pt-BR.ts @@ -9,6 +9,10 @@ export default { includeCitations: "Incluir citações", actions: { download: "Baixar", + largeFileDownloadPrompt: { + title: "Seu download está pronto", + description: "Clique aqui para iniciar o download", + }, copy: "Copiar", }, errors: { diff --git a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.pt-PT.ts b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.pt-PT.ts index e8c52726a..d6f9ac595 100644 --- a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.pt-PT.ts +++ b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.pt-PT.ts @@ -9,6 +9,10 @@ export default { includeCitations: "Incluir citações", actions: { download: "Descarregar", + largeFileDownloadPrompt: { + title: "O seu descarregamento está pronto", + description: "Clique aqui para iniciar o descarregamento", + }, copy: "Copiar", }, errors: { diff --git a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.ro-RO.ts b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.ro-RO.ts index 51e6ee136..c29f92f99 100644 --- a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.ro-RO.ts +++ b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.ro-RO.ts @@ -9,6 +9,10 @@ export default { includeCitations: "Include citările", actions: { download: "Descarcă", + largeFileDownloadPrompt: { + title: "Descărcarea dvs. este gata", + description: "Faceți clic aici pentru a începe descărcarea", + }, copy: "Copiază", }, errors: { diff --git a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.ru-RU.ts b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.ru-RU.ts index a229645d6..1faba9ac1 100644 --- a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.ru-RU.ts +++ b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.ru-RU.ts @@ -9,6 +9,10 @@ export default { includeCitations: "Включить цитаты", actions: { download: "Скачать", + largeFileDownloadPrompt: { + title: "Ваша загрузка готова", + description: "Нажмите здесь, чтобы начать загрузку", + }, copy: "Копировать", }, errors: { diff --git a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.sk-SK.ts b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.sk-SK.ts index fed57d89a..f6e2652ff 100644 --- a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.sk-SK.ts +++ b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.sk-SK.ts @@ -9,6 +9,10 @@ export default { includeCitations: "Zahrnúť citácie", actions: { download: "Stiahnuť", + largeFileDownloadPrompt: { + title: "Vaše sťahovanie je pripravené", + description: "Kliknite sem pre spustenie sťahovania", + }, copy: "Kopírovať", }, errors: { diff --git a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.sr-Cyrl-ME.ts b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.sr-Cyrl-ME.ts index ef0d4af20..cead9e26b 100644 --- a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.sr-Cyrl-ME.ts +++ b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.sr-Cyrl-ME.ts @@ -9,6 +9,10 @@ export default { includeCitations: "Укључи цитате", actions: { download: "Преузми", + largeFileDownloadPrompt: { + title: "Ваше преузимање је спремно", + description: "Кликните овде да започнете преузимање", + }, copy: "Копирај", }, errors: { diff --git a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.zh-CN.ts b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.zh-CN.ts index 035752403..7d6265ea8 100644 --- a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.zh-CN.ts +++ b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.zh-CN.ts @@ -9,6 +9,10 @@ export default { includeCitations: "包含引用", actions: { download: "下载", + largeFileDownloadPrompt: { + title: "您的下载已准备就绪", + description: "点击此处开始下载", + }, copy: "复制", }, errors: { diff --git a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.zh-TW.ts b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.zh-TW.ts index 2dd2ff01b..4d30dff4a 100644 --- a/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.zh-TW.ts +++ b/perplexity/extension/src/plugins/thread-export/_locales/plugin-thread-export.zh-TW.ts @@ -9,6 +9,10 @@ export default { includeCitations: "包含引用", actions: { download: "下載", + largeFileDownloadPrompt: { + title: "您的下載已準備就緒", + description: "點擊此處開始下載", + }, copy: "複製", }, errors: { diff --git a/perplexity/extension/src/plugins/thread-export/hooks/useCopyPplxThread.ts b/perplexity/extension/src/plugins/thread-export/hooks/useCopyPplxThread.ts index df8eef3b3..214778f5e 100644 --- a/perplexity/extension/src/plugins/thread-export/hooks/useCopyPplxThread.ts +++ b/perplexity/extension/src/plugins/thread-export/hooks/useCopyPplxThread.ts @@ -9,7 +9,6 @@ import type { ThreadMessageApiResponse } from "@/services/externals/pplx-api/ppl import { pplxApiQueries } from "@/services/externals/pplx-api/query-keys"; import { parseUrl } from "@/utils/misc/utils"; import { dualClipboardPut } from "@/utils/wrappers/clipboard-utils"; -import { errorWrapper } from "@/utils/wrappers/error-wrapper"; type FetchFn = () => Promise; @@ -63,10 +62,18 @@ export function useCopyPplxThread() { withCitations: CopyMessageParams["withCitations"]; onComplete?: CopyMessageParams["onComplete"]; }) { - if (withCitations) { - await copyThreadWithCitations({ fetchFn }); - } else { - await copyThreadWithoutCitations({ fetchFn }); + try { + if (withCitations) { + await copyThreadWithCitations({ fetchFn }); + } else { + await copyThreadWithoutCitations({ fetchFn }); + } + } catch (error) { + toast({ + title: "❌ Failed to copy thread", + description: + error instanceof Error ? error.message : "Unknown error occurred", + }); } onComplete?.(); }, @@ -125,7 +132,7 @@ async function copyMessageWithCitations({ "$1", ); - if (content.webResults != null && content.webResults.length) { + if (content.webResults.length) { void dualClipboardPut({ markdown: `${cleanAnswer}\n\nCitations:\n${PplxThreadExport.formatWebResults(content.webResults)}`, }); @@ -167,10 +174,6 @@ async function copyContent({ messageBlockIndex?: number; fetchFn: FetchFn; }) { - if (fetchFn == null) { - throw new Error("Fetch function not provided"); - } - const threadJson = await fetchFn(); if (threadJson == null) { throw new Error("Failed to fetch thread info"); @@ -184,12 +187,5 @@ async function copyContent({ messageIndex: messageBlockIndex, }); - const [, error] = await errorWrapper(() => - dualClipboardPut({ markdown: message }), - )(); - - if (error) { - console.error(error); - throw new Error("Please click/focus on the page while copying!"); - } + await dualClipboardPut({ markdown: message }); } diff --git a/perplexity/extension/src/plugins/thread-export/settings-ui.tsx b/perplexity/extension/src/plugins/thread-export/settings-ui.tsx index 6e4b6cb1c..878a51f7a 100644 --- a/perplexity/extension/src/plugins/thread-export/settings-ui.tsx +++ b/perplexity/extension/src/plugins/thread-export/settings-ui.tsx @@ -7,15 +7,12 @@ export const pluginId: PluginId = "thread:exportThread"; export default function ExportThreadPluginSettingsUi() { const { settings, mutation } = useExtensionSettings(); - const pluginSettings = settings?.plugins["thread:exportThread"]; - - if (!settings) return null; return (
{ mutation.mutate((draft) => { draft.plugins["thread:exportThread"].enabled = checked; diff --git a/perplexity/extension/src/plugins/thread-message-length/settings-ui.tsx b/perplexity/extension/src/plugins/thread-message-length/settings-ui.tsx index 1519aa4d7..4155c0564 100644 --- a/perplexity/extension/src/plugins/thread-message-length/settings-ui.tsx +++ b/perplexity/extension/src/plugins/thread-message-length/settings-ui.tsx @@ -7,15 +7,12 @@ export const pluginId: PluginId = "thread:showMessageLength"; export default function ThreadShowMessageLengthPluginSettingsUi() { const { settings, mutation } = useExtensionSettings(); - const pluginSettings = settings?.plugins["thread:showMessageLength"]; - - if (!settings) return null; return (
{ mutation.mutate((draft) => { draft.plugins["thread:showMessageLength"].enabled = checked; @@ -26,7 +23,7 @@ export default function ThreadShowMessageLengthPluginSettingsUi() { {settings.plugins["thread:showMessageLength"].enabled && ( { mutation.mutate((draft) => { draft.plugins["thread:showMessageLength"].showTokens = checked; diff --git a/perplexity/extension/src/plugins/thread-message-tts/hooks/usePplxTtsRequest.ts b/perplexity/extension/src/plugins/thread-message-tts/hooks/usePplxTtsRequest.ts index 66cc813d5..7b079c259 100644 --- a/perplexity/extension/src/plugins/thread-message-tts/hooks/usePplxTtsRequest.ts +++ b/perplexity/extension/src/plugins/thread-message-tts/hooks/usePplxTtsRequest.ts @@ -22,20 +22,21 @@ export default function usePplxTtsRequest({ mutationFn: async (params?: { voice: TtsVoice; backendUuid: string }) => { invariant(params?.backendUuid, "[ThreadMessageTts] Invalid context"); - socketRef.current = - await InternalWebSocketManager.getInstance().handShake({ + const [socket] = await tryCatch(() => + InternalWebSocketManager.getInstance().handShake({ upgrade: APP_CONFIG.BROWSER === "chrome", - }); + }), + ); - const socket = socketRef.current; + socketRef.current = socket; invariant(socket != null, "[ThreadMessageTts] Invalid context"); const handleAudio = (packet: { - data: ArrayLike; + data: ArrayLike | null; uuid: string; }) => { - if (packet.uuid === params?.backendUuid && packet.data != null) { + if (packet.uuid === params.backendUuid && packet.data != null) { onBufferUpdate?.(new Int16Array(packet.data)); } }; @@ -63,8 +64,8 @@ export default function usePplxTtsRequest({ is_page: false, version: "2.13", completed: true, - uuid: params?.backendUuid, - preset: params?.voice ?? "Mike", + uuid: params.backendUuid, + preset: params.voice, }); onStreamComplete(); diff --git a/perplexity/extension/src/plugins/thread-message-tts/player/coordinator.ts b/perplexity/extension/src/plugins/thread-message-tts/player/coordinator.ts index 599ae10ff..c93a8547c 100644 --- a/perplexity/extension/src/plugins/thread-message-tts/player/coordinator.ts +++ b/perplexity/extension/src/plugins/thread-message-tts/player/coordinator.ts @@ -2,7 +2,8 @@ import { PplxStreamingTtsPlayer } from "@/plugins/thread-message-tts/player/pplx import { ExtensionSettingsService } from "@/services/infra/extension-api-wrappers/extension-settings"; export class PplxTtsPlayerCoordinator { - private static instance: PplxTtsPlayerCoordinator; + private static instance: PplxTtsPlayerCoordinator = + new PplxTtsPlayerCoordinator(); private player: PplxStreamingTtsPlayer | null = null; private onPlayerStop: (() => void) | null = null; @@ -10,9 +11,6 @@ export class PplxTtsPlayerCoordinator { private constructor() {} public static getInstance(): PplxTtsPlayerCoordinator { - if (PplxTtsPlayerCoordinator.instance == null) { - PplxTtsPlayerCoordinator.instance = new PplxTtsPlayerCoordinator(); - } return PplxTtsPlayerCoordinator.instance; } diff --git a/perplexity/extension/src/plugins/thread-message-tts/player/pplx-streaming-tts-player.ts b/perplexity/extension/src/plugins/thread-message-tts/player/pplx-streaming-tts-player.ts index d9c048f0a..6e42dbb48 100644 --- a/perplexity/extension/src/plugins/thread-message-tts/player/pplx-streaming-tts-player.ts +++ b/perplexity/extension/src/plugins/thread-message-tts/player/pplx-streaming-tts-player.ts @@ -114,8 +114,7 @@ export class PplxStreamingTtsPlayer { latencyMs: number, durationSamples: number, ) { - if (this.audioContext == null || this.audioContext.sampleRate == null) - return; + if (this.audioContext == null) return; const durationMs = (durationSamples / this.audioContext.sampleRate) * 1000; const totalMs = Math.max(0, latencyMs + durationMs); @@ -146,10 +145,6 @@ export class PplxStreamingTtsPlayer { await this.audioContext.resume(); } - if (!this.isSessionActive) { - return; - } - let playbackOptions: AudioAPI.AudioPlaybackOptions = {}; if (APP_CONFIG.BROWSER === "firefox") { @@ -163,30 +158,18 @@ export class PplxStreamingTtsPlayer { }; } - if (!this.isSessionActive || this.audioContext == null) { - return; - } - this.weasoundPlayback = await AudioAPI.createAudioPlayback( this.audioContext, playbackOptions, ); - if (!this.isSessionActive || this.weasoundPlayback == null) { - return; - } - this.weasoundPlayback.setPlaybackRate(this.playbackRate); const audioNode = this.weasoundPlayback.unsharedNode() || this.weasoundPlayback.sharedNode(); - if ( - audioNode != null && - this.audioContext != null && - this.audioContext.destination != null && - this.isSessionActive - ) { + + if (audioNode != null) { audioNode.connect(this.audioContext.destination); } @@ -201,7 +184,7 @@ export class PplxStreamingTtsPlayer { this.isPlayingChunks = true; try { - while (this.audioChunks.length > 0 && this.isSessionActive) { + while (this.audioChunks.length > 0) { const chunk = this.audioChunks.shift(); if (!chunk || !this.weasoundPlayback) { continue; @@ -221,7 +204,7 @@ export class PplxStreamingTtsPlayer { ); } - const latencyMs = this.weasoundPlayback.play([float32Array]) ?? 0; + const latencyMs = this.weasoundPlayback.play([float32Array]); if (this.onAudioStart && !this.hasStartedPlayback) { this.hasStartedPlayback = true; diff --git a/perplexity/extension/src/plugins/thread-message-tts/settings-ui.tsx b/perplexity/extension/src/plugins/thread-message-tts/settings-ui.tsx index fe4acbe94..f3018ea5f 100644 --- a/perplexity/extension/src/plugins/thread-message-tts/settings-ui.tsx +++ b/perplexity/extension/src/plugins/thread-message-tts/settings-ui.tsx @@ -16,16 +16,13 @@ export const pluginId: PluginId = "thread:messageTts"; export default function ThreadMessageTtsPluginSettingsUi() { const { settings, mutation } = useExtensionSettings(); - const pluginSettings = settings?.plugins["thread:messageTts"]; - - if (!settings) return null; return (
Right-click to open voice menu. Only supports English content.
{ mutation.mutate((draft) => { draft.plugins["thread:messageTts"].enabled = checked; @@ -39,7 +36,7 @@ export default function ThreadMessageTtsPluginSettingsUi() { max={2} step={0.05} className="x:flex x:w-full x:flex-col x:gap-4" - value={[pluginSettings?.playbackRate ?? 1]} + value={[settings.plugins["thread:messageTts"].playbackRate]} onValueChange={({ value }) => { mutation.mutate((draft) => { draft.plugins["thread:messageTts"].playbackRate = value[0] ?? 1; diff --git a/perplexity/extension/src/plugins/thread-raw-headings/loader.ts b/perplexity/extension/src/plugins/thread-raw-headings/loader.ts index ba7c6be6b..100aa3f0e 100644 --- a/perplexity/extension/src/plugins/thread-raw-headings/loader.ts +++ b/perplexity/extension/src/plugins/thread-raw-headings/loader.ts @@ -12,7 +12,7 @@ declare module "@/plugins/__async-deps__/async-loaders" { } } -let cleanup: () => void | null; +let cleanup: (() => void) | null; export default function () { AsyncLoaderRegistry.register({ diff --git a/perplexity/extension/src/plugins/thread-raw-headings/settings-ui.tsx b/perplexity/extension/src/plugins/thread-raw-headings/settings-ui.tsx index b60e32e38..04bd683a5 100644 --- a/perplexity/extension/src/plugins/thread-raw-headings/settings-ui.tsx +++ b/perplexity/extension/src/plugins/thread-raw-headings/settings-ui.tsx @@ -7,15 +7,12 @@ export const pluginId: PluginId = "thread:rawHeadings"; export default function RawHeadingsPluginSettingsUi() { const { settings, mutation } = useExtensionSettings(); - const pluginSettings = settings?.plugins["thread:rawHeadings"]; - - if (!settings) return null; return (
{ mutation.mutate((draft) => { draft.plugins["thread:rawHeadings"].enabled = checked; diff --git a/perplexity/extension/src/plugins/thread-toc/TocPanel.tsx b/perplexity/extension/src/plugins/thread-toc/TocPanel.tsx index 6bf126f0a..84a4267b0 100644 --- a/perplexity/extension/src/plugins/thread-toc/TocPanel.tsx +++ b/perplexity/extension/src/plugins/thread-toc/TocPanel.tsx @@ -41,9 +41,8 @@ export function TocPanel({ style={ { ["--panel-width"]: `${PANEL_WIDTH}px`, - ["--panel-top"]: top != null ? `${top}px` : undefined, - ["--panel-left"]: - !isFloating && left != null ? `${left}px` : undefined, + ["--panel-top"]: `${top}px`, + ["--panel-left"]: !isFloating && `${left}px`, } as React.CSSProperties } > diff --git a/perplexity/extension/src/plugins/thread-toc/settings-ui.tsx b/perplexity/extension/src/plugins/thread-toc/settings-ui.tsx index 508b1f5bb..c4670a7ea 100644 --- a/perplexity/extension/src/plugins/thread-toc/settings-ui.tsx +++ b/perplexity/extension/src/plugins/thread-toc/settings-ui.tsx @@ -7,9 +7,6 @@ export const pluginId: PluginId = "thread:toc"; export default function ThreadToCPluginSettingsUi() { const { settings, mutation } = useExtensionSettings(); - const pluginSettings = settings?.plugins["thread:toc"]; - - if (!settings) return null; return (
@@ -18,7 +15,7 @@ export default function ThreadToCPluginSettingsUi() {
{ mutation.mutate((draft) => { draft.plugins["thread:toc"].enabled = checked; diff --git a/perplexity/extension/src/plugins/thread-toc/usePanelPosition.ts b/perplexity/extension/src/plugins/thread-toc/usePanelPosition.ts index 36cbb0973..06238a490 100644 --- a/perplexity/extension/src/plugins/thread-toc/usePanelPosition.ts +++ b/perplexity/extension/src/plugins/thread-toc/usePanelPosition.ts @@ -6,7 +6,7 @@ import { useThreadMessageBlocksDomObserverStore } from "@/plugins/__core__/dom-o import { useThreadDomObserverStore } from "@/plugins/__core__/dom-observers/thread/store"; import type { TocItem } from "@/plugins/thread-toc/useThreadTocItems"; -export const PANEL_WIDTH = 230; +export const PANEL_WIDTH = 300; type PanelPosition = { position: { top: number; left: number }; @@ -27,11 +27,17 @@ export function usePanelPosition({ (item) => item.isActiveTopMost, ); - const threadContentWrapper = useThreadMessageBlocksDomObserverStore( - (store) => - store.messageBlocks?.[activeMessageBlockId]?.nodes.$contentWrapper[0], - deepEqual, - ); + const activeMessageBlockContentWrapper = + useThreadMessageBlocksDomObserverStore((store) => { + const messageBlock = store.messageBlocks?.[activeMessageBlockId]; + + if (messageBlock == null) return null; + + if (messageBlock.states.isVirtualized) + return store.messageBlocks?.[0]?.nodes.$contentWrapper[0]; + + return messageBlock.nodes.$contentWrapper[0]; + }, deepEqual); const isSidebarPinned = usePplxCookiesStore( (store) => @@ -48,6 +54,7 @@ export function usePanelPosition({ const url = useSpaRouter((store) => store.url); const calculatePosition = useCallback(() => { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition void (isSidebarPinned && windowSize != null && url != null); if (threadWrapper == null) { @@ -68,7 +75,8 @@ export function usePanelPosition({ document.body.style.getPropertyValue("--header-height"); const navbarHeight = navbarHeightStr ? parseInt(navbarHeightStr) : 53; - let threadContentWrapperWidth = threadContentWrapper?.offsetWidth ?? 0; + let threadContentWrapperWidth = + activeMessageBlockContentWrapper?.offsetWidth ?? 0; const validChildren = $children.filter((index, child) => { return index > 0 && !child.classList.contains("fixed"); @@ -82,7 +90,7 @@ export function usePanelPosition({ }); const threadContentWrapperOffsetLeft = - threadContentWrapper?.getBoundingClientRect().left ?? 0; + activeMessageBlockContentWrapper?.getBoundingClientRect().left ?? 0; const panelRightEdge = threadContentWrapperOffsetLeft + @@ -99,7 +107,13 @@ export function usePanelPosition({ panelRightEdge > window.innerWidth || threadContentWrapperOffsetLeft === 0, }; - }, [isSidebarPinned, threadContentWrapper, threadWrapper, url, windowSize]); + }, [ + isSidebarPinned, + activeMessageBlockContentWrapper, + threadWrapper, + url, + windowSize, + ]); return calculatePosition(); } diff --git a/perplexity/extension/src/plugins/zen-mode/settings-ui.tsx b/perplexity/extension/src/plugins/zen-mode/settings-ui.tsx index cac93d5a3..6a37206e7 100644 --- a/perplexity/extension/src/plugins/zen-mode/settings-ui.tsx +++ b/perplexity/extension/src/plugins/zen-mode/settings-ui.tsx @@ -7,10 +7,9 @@ export const pluginId: PluginId = "zenMode"; export default function ZenModePluginSettingsUi() { const { settings, mutation } = useExtensionSettings(); - const defaultKeys = settings?.plugins["zenMode"].hotkey ?? []; const { HotkeyRecorderUi } = useHotkeyRecorder({ - defaultKeys, + defaultKeys: settings.plugins["zenMode"].hotkey, onSave: (keys) => { mutation.mutate((draft) => { draft.plugins["zenMode"].hotkey = keys; @@ -22,14 +21,14 @@ export default function ZenModePluginSettingsUi() {
{ mutation.mutate((draft) => { draft.plugins["zenMode"].enabled = checked; }); }} /> - {settings?.plugins["zenMode"].enabled && ( + {settings.plugins["zenMode"].enabled && ( <>
Activation hotkey:
@@ -37,7 +36,7 @@ export default function ZenModePluginSettingsUi() {
{ mutation.mutate((draft) => { draft.plugins["zenMode"].persistent = checked; @@ -46,9 +45,7 @@ export default function ZenModePluginSettingsUi() { /> { mutation.mutate((draft) => { draft.plugins["zenMode"].alwaysHideRelatedQuestions = checked; diff --git a/perplexity/extension/src/plugins/zen-mode/utils.ts b/perplexity/extension/src/plugins/zen-mode/utils.ts index ef998aff9..0714e3a70 100644 --- a/perplexity/extension/src/plugins/zen-mode/utils.ts +++ b/perplexity/extension/src/plugins/zen-mode/utils.ts @@ -13,7 +13,7 @@ export function toggleZenMode(forceState?: boolean): boolean { $("body").attr("data-cplx-zen-mode", newZenMode); - if (ExtensionSettingsService.cachedSync?.plugins["zenMode"].persistent) { + if (ExtensionSettingsService.cachedSync.plugins["zenMode"].persistent) { localStorage.setItem("cplx.zen-mode.last-state", newZenMode); } diff --git a/perplexity/extension/src/services/externals/cplx-api/remote-resources/comet-affiliate/index.remote-resources.ts b/perplexity/extension/src/services/externals/cplx-api/remote-resources/comet-affiliate/index.remote-resources.ts index 7f61cc582..b2bfd9585 100644 --- a/perplexity/extension/src/services/externals/cplx-api/remote-resources/comet-affiliate/index.remote-resources.ts +++ b/perplexity/extension/src/services/externals/cplx-api/remote-resources/comet-affiliate/index.remote-resources.ts @@ -10,7 +10,7 @@ export const cometAffiliateRemoteResourceConfig = defineRemoteResource({ type: "json", fallback: { enabled: APP_CONFIG.IS_DEV, - link: "pplx.ai/pnd280", + link: "pplx.ai/paradroid", }, zodSchema: z.object({ enabled: z.boolean(), diff --git a/perplexity/extension/src/services/externals/cplx-api/remote-resources/utils.ts b/perplexity/extension/src/services/externals/cplx-api/remote-resources/utils.ts index e8d0d002a..5f26852ca 100644 --- a/perplexity/extension/src/services/externals/cplx-api/remote-resources/utils.ts +++ b/perplexity/extension/src/services/externals/cplx-api/remote-resources/utils.ts @@ -2,7 +2,6 @@ import { APP_CONFIG } from "@/app.config"; import { cplxApiQueries } from "@/services/externals/cplx-api/query-keys"; import type { RemoteResource } from "@/services/externals/cplx-api/remote-resources/types"; import type PersistentQueryClient from "@/services/infra/query-client"; -import { errorWrapper } from "@/utils/wrappers/error-wrapper"; export async function getRemoteResource( resourceConfig: RemoteResource, @@ -11,7 +10,7 @@ export async function getRemoteResource( if (APP_CONFIG.IS_DEV || APP_CONFIG.CPLX_CDN_URL == null) return resourceConfig.fallback; - const [resource, error] = await errorWrapper(() => + const [resource, error] = await tryCatch(() => persistentQueryClient.queryClient.fetchQuery({ ...cplxApiQueries.remoteResource.detail({ resourcePath: resourceConfig.resourcePath, @@ -19,7 +18,7 @@ export async function getRemoteResource( }), retry: false, }), - )(); + ); if (error) return resourceConfig.fallback; diff --git a/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/utils.ts b/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/utils.ts index c535de8f4..5d25eb860 100644 --- a/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/utils.ts +++ b/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/utils.ts @@ -5,7 +5,6 @@ import { cplxApiQueries } from "@/services/externals/cplx-api/query-keys"; import { VersionedRemoteResourceListingSchema } from "@/services/externals/cplx-api/versioned-remote-resources/types"; import type { VersionedRemoteResource } from "@/services/externals/cplx-api/versioned-remote-resources/types"; import type PersistentQueryClient from "@/services/infra/query-client"; -import { errorWrapper } from "@/utils/wrappers/error-wrapper"; export async function getVersionedRemoteResource( resourceConfig: VersionedRemoteResource, @@ -18,7 +17,7 @@ export async function getVersionedRemoteResource( if (entry == null) return resourceConfig.fallback; - const [resource, error] = await errorWrapper(() => + const [resource, error] = await tryCatch(() => persistentQueryClient.queryClient.fetchQuery({ ...cplxApiQueries.versionedRemoteResource.detail({ resourcePath: `${resourceConfig.name}/${entry}`, @@ -26,7 +25,7 @@ export async function getVersionedRemoteResource( }), retry: false, }), - )(); + ); void persistentQueryClient.persistQueryClient(); @@ -39,7 +38,7 @@ async function getResourceEntry( resourceConfig: VersionedRemoteResource, persistentQueryClient: PersistentQueryClient, ): Promise { - const [listing, error] = await errorWrapper( + const [listing, error] = await tryCatch( async () => await persistentQueryClient.queryClient.fetchQuery( cplxApiQueries.versionedRemoteResource.detail({ @@ -47,7 +46,7 @@ async function getResourceEntry( zodSchema: VersionedRemoteResourceListingSchema, }), ), - )(); + ); if (error) return null; diff --git a/perplexity/extension/src/services/externals/pplx-api/index.ts b/perplexity/extension/src/services/externals/pplx-api/index.ts index 0ea493c4f..f2594f5dc 100644 --- a/perplexity/extension/src/services/externals/pplx-api/index.ts +++ b/perplexity/extension/src/services/externals/pplx-api/index.ts @@ -234,25 +234,20 @@ export class PplxApiService { } static async fetchSpaceFileDownloadUrl({ - fileUuid, - spaceUuid, + fileS3Url, }: { - fileUuid: string; - spaceUuid: string; + fileS3Url: string; }): Promise { // POST https://www.perplexity.ai/rest/file-repository/download-file?version=2.13&source=default // payload: {"file_uuid":"a1baad94-9a0a-4c84-925e-b8d41960f428","file_repository_info":{"file_repository_type":"COLLECTION","owner_id":"cf11f61d-4f74-4582-9f2c-365f5419989b"}} const resp = await fetch( - "https://www.perplexity.ai/rest/file-repository/download-file?version=2.13&source=default", + "https://www.perplexity.ai/rest/file-repository/download?version=2.18&source=default", { method: "POST", body: JSON.stringify({ - file_uuid: fileUuid, - file_repository_info: { - file_repository_type: "COLLECTION", - owner_id: spaceUuid, - }, + file_url: fileS3Url, + view_mode: false, }), headers: { "Content-Type": "application/json", diff --git a/perplexity/extension/src/services/externals/pplx-api/pplx-api.types.ts b/perplexity/extension/src/services/externals/pplx-api/pplx-api.types.ts index f8356aa6f..d2b921448 100644 --- a/perplexity/extension/src/services/externals/pplx-api/pplx-api.types.ts +++ b/perplexity/extension/src/services/externals/pplx-api/pplx-api.types.ts @@ -20,7 +20,7 @@ export type PplxAuthSessionApiResponse = { image: string; id: string; username: string; - subscription_status: string; + subscription_status?: string; subscription_source: string; payment_tier: string; subscription_tier: string; diff --git a/perplexity/extension/src/services/externals/pplx-api/query-keys.ts b/perplexity/extension/src/services/externals/pplx-api/query-keys.ts index 0f3cf0064..095e9ed86 100644 --- a/perplexity/extension/src/services/externals/pplx-api/query-keys.ts +++ b/perplexity/extension/src/services/externals/pplx-api/query-keys.ts @@ -96,25 +96,18 @@ export const pplxApiQueries = { queryKey: [...pplxApiQueries.space.files.all(spaceUuid)] as const, queryFn: () => PplxApiService.fetchSpaceFiles(spaceUuid), }), - downloadUrl: { - all: (spaceUuid: Space["uuid"], fileUuid: string) => - [ - ...pplxApiQueries.space.files.all(spaceUuid), - "downloadUrl", - { fileUuid }, + }, + downloadFile: { + all: (fileS3Url: string) => + [...pplxApiQueries.space.all(), "downloadFile", { fileS3Url }] as const, + detail: (fileS3Url: string) => + queryOptions({ + queryKey: [ + ...pplxApiQueries.space.downloadFile.all(fileS3Url), ] as const, - detail: (spaceUuid: Space["uuid"], fileUuid: string) => - queryOptions({ - queryKey: [ - ...pplxApiQueries.space.files.downloadUrl.all( - spaceUuid, - fileUuid, - ), - ] as const, - queryFn: () => - PplxApiService.fetchSpaceFileDownloadUrl({ spaceUuid, fileUuid }), - }), - }, + queryFn: () => + PplxApiService.fetchSpaceFileDownloadUrl({ fileS3Url }), + }), }, threads: { all: (spaceSlug: Space["slug"]) => diff --git a/perplexity/extension/src/services/features/content-script-utils/index.ts b/perplexity/extension/src/services/features/content-script-utils/index.ts index 55ac3dde8..141e474fc 100644 --- a/perplexity/extension/src/services/features/content-script-utils/index.ts +++ b/perplexity/extension/src/services/features/content-script-utils/index.ts @@ -11,12 +11,8 @@ export class ContentScriptBgUtilsServiceImpl { }) { const windowId = (await chrome.tabs.get(currentTabId)).windowId; - if (windowId == null) return; - const window = await chrome.windows.get(windowId); - if (window == null) return; - // eslint-disable-next-line @typescript-eslint/no-explicit-any return (window as any).sidecarTabId as number | undefined; } diff --git a/perplexity/extension/src/services/features/instant-css/coordinator.ts b/perplexity/extension/src/services/features/instant-css/coordinator.ts index 81b5df56c..66085aec6 100644 --- a/perplexity/extension/src/services/features/instant-css/coordinator.ts +++ b/perplexity/extension/src/services/features/instant-css/coordinator.ts @@ -43,7 +43,7 @@ export class InstantCssCoordinator { if (enabled === false) return; - if (params.css == null || !params.css.length) return; + if (!params.css.length) return; void chrome.scripting.insertCSS({ target: { tabId }, @@ -63,7 +63,7 @@ export class InstantCssCoordinator { async removeCss(params: InstantCss & { tabId: number }) { const { tabId } = params; - if (params.css == null || !params.css.length) return; + if (!params.css.length) return; void chrome.scripting.removeCSS({ target: { tabId }, diff --git a/perplexity/extension/src/services/infra/extension-api-wrappers/extension-settings/migrations.ts b/perplexity/extension/src/services/infra/extension-api-wrappers/extension-settings/migrations.ts index 063eb624b..6127e45b3 100644 --- a/perplexity/extension/src/services/infra/extension-api-wrappers/extension-settings/migrations.ts +++ b/perplexity/extension/src/services/infra/extension-api-wrappers/extension-settings/migrations.ts @@ -5,18 +5,17 @@ import { APP_CONFIG } from "@/app.config"; import { DEFAULT_EXTENSION_SETTINGS } from "@/services/infra/extension-api-wrappers/extension-settings/defaults"; import type { ExtensionSettings } from "@/services/infra/extension-api-wrappers/extension-settings/types"; import type { MaybePromise } from "@/types/utils.types"; -import { errorWrapper } from "@/utils/wrappers/error-wrapper"; export const migrations = { 2: async (): Promise => { - const [result, error] = await errorWrapper(async () => { + const [result, error] = await tryCatch(async () => { const oldFlatSchema = await chrome.storage.local.get(); const newSchema = transfromFlatSchema(oldFlatSchema); await chrome.storage.local.clear(); return newSchema; - })(); + }); if (error) { if (APP_CONFIG.IS_DEV) { @@ -31,14 +30,14 @@ export const migrations = { return result; }, 3: (oldSettings): ExtensionSettings => { - const [result, error] = errorWrapper(() => { + const [result, error] = tryCatch(() => { return produce(oldSettings, (draft) => { draft.plugins.commandMenu.keybindings.toggle = [ // eslint-disable-next-line @typescript-eslint/no-explicit-any (oldSettings.plugins.commandMenu as any).hotkey, ]; }); - })(); + }); if (error) { if (APP_CONFIG.IS_DEV) { diff --git a/perplexity/extension/src/services/infra/extension-api-wrappers/extension-settings/useExtensionSettings.ts b/perplexity/extension/src/services/infra/extension-api-wrappers/extension-settings/useExtensionSettings.ts index 20d7bd282..d2b805281 100644 --- a/perplexity/extension/src/services/infra/extension-api-wrappers/extension-settings/useExtensionSettings.ts +++ b/perplexity/extension/src/services/infra/extension-api-wrappers/extension-settings/useExtensionSettings.ts @@ -1,16 +1,16 @@ -import { useQuery } from "@tanstack/react-query"; +import { useSuspenseQuery } from "@tanstack/react-query"; import { extensionSettingsQueries } from "@/services/infra/extension-api-wrappers/extension-settings/query-keys"; import { useExtensionSettingsMutation } from "@/services/infra/extension-api-wrappers/extension-settings/useExtensionSettingsMutation"; import { isInContentScript } from "@/utils/misc/utils"; export default function useExtensionSettings() { - if (isInContentScript()) - throw new Error( - "Extension settings can not be reactive in content scripts! Use static methods from `ExtensionSettingsService` instead.", - ); + invariant( + !isInContentScript(), + "Extension settings can not be reactive in content scripts! Use static methods from `ExtensionSettingsService` instead.", + ); - const data = useQuery(extensionSettingsQueries.detail()); + const data = useSuspenseQuery(extensionSettingsQueries.detail()); const mutation = useExtensionSettingsMutation(); return { settings: data.data, mutation }; diff --git a/perplexity/extension/src/services/infra/i18n/dayjs.ts b/perplexity/extension/src/services/infra/i18n/dayjs.ts index 584578715..355acd022 100644 --- a/perplexity/extension/src/services/infra/i18n/dayjs.ts +++ b/perplexity/extension/src/services/infra/i18n/dayjs.ts @@ -70,6 +70,6 @@ export async function initializeDayjsLocale() { "ru-RU": () => import("dayjs/locale/ru"), }; - await importsMap[language as SupportedLangs]?.(); + await importsMap[language as SupportedLangs](); dayjs.locale(dayjsLocaleImportNamesMap[language as SupportedLangs]); } diff --git a/perplexity/extension/src/services/infra/indexed-db/index.ts b/perplexity/extension/src/services/infra/indexed-db/index.ts index 56bd0fdc8..109e8773f 100644 --- a/perplexity/extension/src/services/infra/indexed-db/index.ts +++ b/perplexity/extension/src/services/infra/indexed-db/index.ts @@ -91,9 +91,10 @@ export class IndexedDbService extends Dexie { Array.isArray(records) && !IndexedDbService.EXCLUDED_FROM_EXPORT.has(tableName) ) { - const table = this[ - tableName as keyof IndexedDbService - ] as Table; + const table = this[tableName as keyof IndexedDbService] as + | Table + | undefined; + if (table != null) { await table.bulkPut(records); } diff --git a/perplexity/extension/src/services/infra/query-client/index.ts b/perplexity/extension/src/services/infra/query-client/index.ts index 14a88476c..fa9ea9e0e 100644 --- a/perplexity/extension/src/services/infra/query-client/index.ts +++ b/perplexity/extension/src/services/infra/query-client/index.ts @@ -13,7 +13,6 @@ import { debouncedPersistQueryClient, } from "@/services/infra/query-client/utils"; import { waitUntil } from "@/utils/misc/utils"; -import { errorWrapper } from "@/utils/wrappers/error-wrapper"; export default class PersistentQueryClient { id: string; @@ -59,7 +58,7 @@ export default class PersistentQueryClient { ); if (buster == null) { - const [remoteBuster] = await errorWrapper(() => config.busterFetchFn())(); + const [remoteBuster] = await tryCatch(() => config.busterFetchFn()); buster = remoteBuster ?? APP_CONFIG.VERSION; void storage.setItem(`local:queryCacheBuster:${config.id}`, buster); } @@ -121,7 +120,7 @@ export default class PersistentQueryClient { if (this.sessionInvalidated) return; if (document.visibilityState === "visible") { - const [remoteBuster] = await errorWrapper(this.busterFetchFn)(); + const [remoteBuster] = await tryCatch(this.busterFetchFn); if (remoteBuster != null && remoteBuster !== this.buster) { console.log( diff --git a/perplexity/extension/src/types/utils.types.ts b/perplexity/extension/src/types/utils.types.ts index 9ebd78ae7..118b82c4f 100644 --- a/perplexity/extension/src/types/utils.types.ts +++ b/perplexity/extension/src/types/utils.types.ts @@ -32,7 +32,7 @@ export function isReactNode(node: unknown): node is React.ReactNode { export function isZodError(error: unknown): error is ZodError { return ( error instanceof ZodError || - (error as ZodError)?.name === "ZodError" || - Array.isArray((error as ZodError)?.issues) + (error as ZodError).name === "ZodError" || + Array.isArray((error as ZodError).issues) ); } diff --git a/perplexity/extension/src/utils/dom-utils/generics.ts b/perplexity/extension/src/utils/dom-utils/generics.ts index dee28472c..ad8afb4c3 100644 --- a/perplexity/extension/src/utils/dom-utils/generics.ts +++ b/perplexity/extension/src/utils/dom-utils/generics.ts @@ -42,7 +42,7 @@ export function getWordOnCaret(element: HTMLTextAreaElement) { const text = element.value; const caret = element.selectionStart; - if (!text || caret === undefined) { + if (!text) { return { word: "", start: 0, diff --git a/perplexity/extension/src/utils/dom-utils/lexical-utils.ts b/perplexity/extension/src/utils/dom-utils/lexical-utils.ts index c691828f2..803db73e4 100644 --- a/perplexity/extension/src/utils/dom-utils/lexical-utils.ts +++ b/perplexity/extension/src/utils/dom-utils/lexical-utils.ts @@ -106,9 +106,10 @@ export function setSelection( if (textNodes.length > 0) { const lastNode = textNodes[textNodes.length - 1]; + return { node: lastNode?.node ?? element, - offset: lastNode?.node?.textContent?.length ?? 0, + offset: lastNode?.node.textContent?.length ?? 0, }; } @@ -121,8 +122,8 @@ export function setSelection( try { const range = document.createRange(); - range.setStart(startPos?.node ?? element, startPos?.offset ?? 0); - range.setEnd(endPos?.node ?? element, endPos?.offset ?? 0); + range.setStart(startPos.node ?? element, startPos.offset); + range.setEnd(endPos.node ?? element, endPos.offset); sel.removeAllRanges(); sel.addRange(range); @@ -174,7 +175,7 @@ export function getSelection(element: HTMLElement): TextboxSelection { for (let i = 0; i < textNodes.length; i++) { const textNode = textNodes[i]; if (textNode?.node === targetNode) { - return textNode?.start + targetOffset; + return textNode.start + targetOffset; } } return 0; diff --git a/perplexity/extension/src/utils/misc/normalize-path.ts b/perplexity/extension/src/utils/misc/normalize-path.ts index f4e780988..402feefe9 100644 --- a/perplexity/extension/src/utils/misc/normalize-path.ts +++ b/perplexity/extension/src/utils/misc/normalize-path.ts @@ -4,6 +4,7 @@ export function normalizePath(filePath: string, dirname?: string): string { return path.posix.join( ...path .resolve( + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition dirname ?? process.cwd() ?? path.resolve(__dirname, "../.."), filePath, ) diff --git a/perplexity/extension/src/utils/misc/utils.ts b/perplexity/extension/src/utils/misc/utils.ts index 3d3d0ef35..d17cda2af 100644 --- a/perplexity/extension/src/utils/misc/utils.ts +++ b/perplexity/extension/src/utils/misc/utils.ts @@ -1,7 +1,6 @@ import { MatchPattern } from "@webext-core/match-patterns"; import type { MaybePromise } from "@/types/utils.types"; -import { errorWrapper } from "@/utils/wrappers/error-wrapper"; export const jsonUtils = { safeParse(json: string) { @@ -146,6 +145,7 @@ export function isMainWorldContext() { ); } +// TODO: should be isInContentScriptPplx export function isInContentScript() { return whereAmI() !== "unknown"; } @@ -232,7 +232,7 @@ export function waitUntil(params: { if (isRunning) return; isRunning = true; - const [result, error] = await errorWrapper(condition)(); + const [result, error] = await tryCatch(async () => condition()); isRunning = false; if (!error && result === true) { diff --git a/perplexity/extension/src/utils/wrappers/clipboard-utils.ts b/perplexity/extension/src/utils/wrappers/clipboard-utils.ts index 4a633ab37..c582e3892 100644 --- a/perplexity/extension/src/utils/wrappers/clipboard-utils.ts +++ b/perplexity/extension/src/utils/wrappers/clipboard-utils.ts @@ -19,6 +19,22 @@ export async function dualClipboardPut({ }): Promise { const richText = (await processor.process(markdown)).value as string; + const waitUntilTabActive = async () => { + if (!document.hasFocus()) { + await new Promise((resolve) => { + const handler = () => { + if (document.hasFocus()) { + window.removeEventListener("focus", handler); + setTimeout(() => { + resolve(); + }, 500); + } + }; + window.addEventListener("focus", handler); + }); + } + }; + if (typeof ClipboardItem !== "undefined") { const html = new Blob([richText], { type: "text/html" }); const text = new Blob([markdown], { type: "text/plain" }); @@ -26,6 +42,9 @@ export async function dualClipboardPut({ "text/html": html, "text/plain": text, }); + + await waitUntilTabActive(); + await navigator.clipboard.write([data]); } else { const listener = (e: ClipboardEvent) => { @@ -34,6 +53,9 @@ export async function dualClipboardPut({ e.preventDefault(); }; document.addEventListener("copy", listener); + + await waitUntilTabActive(); + document.execCommand("copy"); document.removeEventListener("copy", listener); } diff --git a/perplexity/extension/src/utils/wrappers/comet.ts b/perplexity/extension/src/utils/wrappers/comet.ts index 1cc2cb3ea..a49468454 100644 --- a/perplexity/extension/src/utils/wrappers/comet.ts +++ b/perplexity/extension/src/utils/wrappers/comet.ts @@ -3,7 +3,6 @@ import { APP_CONFIG } from "@/app.config"; import { ContentScriptBgUtilsService } from "@/services/features/content-script-utils/service-init.bg-worker"; import { whereAmI } from "@/utils/misc/utils"; -import { errorWrapper } from "@/utils/wrappers/error-wrapper"; export function isCometBrowserSync(): boolean { if (APP_CONFIG.BROWSER !== "chrome") return false; @@ -37,17 +36,19 @@ export async function isCsInjectable(): Promise { const tabs = await chrome.tabs.query({}); for (const tab of tabs) { - if (tab.id == null || tab.url == null || tab.url.length === 0) continue; + const tabId = tab.id; + + if (tabId == null || tab.url == null || tab.url.length === 0) continue; if (whereAmI(tab.url) === "unknown") continue; - const [, error] = await errorWrapper( + const [, error] = await tryCatch( async () => await chrome.scripting.executeScript({ - target: { tabId: tab.id! }, + target: { tabId }, func: () => {}, }), - )(); + ); if (error) { return false; diff --git a/perplexity/extension/src/utils/wrappers/error-wrapper.ts b/perplexity/extension/src/utils/wrappers/error-wrapper.ts deleted file mode 100644 index 180213606..000000000 --- a/perplexity/extension/src/utils/wrappers/error-wrapper.ts +++ /dev/null @@ -1,47 +0,0 @@ -type ErrorWrapperResult = [T, null] | [null, Error]; - -/** - * Wraps a function to provide consistent error handling - * @param callback The function to wrap (can be sync or async) - * @param errorMessage Optional custom error message - * @returns A wrapped version of the callback that returns [result, error] - */ -export function errorWrapper( - callback: () => TResult extends Promise ? never : TResult, - errorMessage?: string, -): () => ErrorWrapperResult; -export function errorWrapper( - callback: () => Promise | (TResult | Promise), - errorMessage?: string, -): () => Promise>; -export function errorWrapper( - callback: () => TResult | Promise, - errorMessage?: string, -): () => ErrorWrapperResult | Promise> { - return () => { - try { - const result = callback(); - if (result instanceof Promise) { - return result - .then((value) => [value, null] as ErrorWrapperResult) - .catch((error) => { - const message = - errorMessage || "An error occurred during operation"; - const wrappedError = new Error( - `${message}: ${error instanceof Error ? error.message : String(error)}`, - { cause: error }, - ); - return [null, wrappedError] as ErrorWrapperResult; - }); - } - return [result, null] as ErrorWrapperResult; - } catch (error) { - const message = errorMessage || "An error occurred during operation"; - const wrappedError = new Error( - `${message}: ${error instanceof Error ? error.message : String(error)}`, - { cause: error }, - ); - return [null, wrappedError] as ErrorWrapperResult; - } - }; -} diff --git a/perplexity/extension/src/utils/wrappers/try-catch.test.ts b/perplexity/extension/src/utils/wrappers/try-catch.test.ts new file mode 100644 index 000000000..1926de452 --- /dev/null +++ b/perplexity/extension/src/utils/wrappers/try-catch.test.ts @@ -0,0 +1,249 @@ +import { describe, it, expect } from "vitest"; + +import { tryCatch } from "@/utils/wrappers/try-catch"; + +describe("tryCatch", () => { + describe("synchronous execution", () => { + describe("successful execution", () => { + it("should return [result, null] when callback succeeds", () => { + const [result, error] = tryCatch(() => "success"); + expect(result).toBe("success"); + expect(error).toBeNull(); + }); + + it("should work with different return types", () => { + const [stringResult] = tryCatch(() => "hello"); + expect(stringResult).toBe("hello"); + + const [numberResult] = tryCatch(() => 42); + expect(numberResult).toBe(42); + + const [objectResult] = tryCatch(() => ({ key: "value" })); + expect(objectResult).toEqual({ key: "value" }); + + const [arrayResult] = tryCatch(() => [1, 2, 3]); + expect(arrayResult).toEqual([1, 2, 3]); + + const [nullResult] = tryCatch(() => null); + expect(nullResult).toBeNull(); + + const [undefinedResult] = tryCatch(() => undefined); + expect(undefinedResult).toBeUndefined(); + }); + }); + + describe("error handling", () => { + it("should return [null, Error] when callback throws Error", () => { + const result = tryCatch((): string => { + throw new Error("test error"); + }); + const [value, error] = result; + + expect(value).toBeNull(); + expect(error).toBeInstanceOf(Error); + expect((error as Error).message).toBe("test error"); + }); + + it("should convert non-Error values to Error with message", () => { + const result1 = tryCatch((): string => { + throw "string error"; + }); + const [value1, error1] = result1; + expect(value1).toBeNull(); + expect(error1).toBeInstanceOf(Error); + expect((error1 as Error).message).toBe("string error"); + expect((error1 as Error).cause).toBe("string error"); + + const result2 = tryCatch((): number => { + throw 123; + }); + const [value2, error2] = result2; + expect(value2).toBeNull(); + expect(error2).toBeInstanceOf(Error); + expect((error2 as Error).message).toBe("123"); + expect((error2 as Error).cause).toBe(123); + + const result3 = tryCatch((): null => { + throw null; + }); + const [value3, error3] = result3; + expect(value3).toBeNull(); + expect(error3).toBeInstanceOf(Error); + expect((error3 as Error).message).toBe("null"); + expect((error3 as Error).cause).toBe(null); + }); + + it("should preserve original error as cause property", () => { + const originalError = new Error("original"); + const result = tryCatch((): string => { + throw originalError; + }); + const [value, error] = result; + + expect(value).toBeNull(); + expect(error).toBeInstanceOf(Error); + expect((error as Error).message).toBe("original"); + expect((error as Error).cause).toBe(originalError); + }); + }); + + describe("custom error message handling", () => { + it("should use custom error string when provided", () => { + const result = tryCatch((): string => { + throw new Error("original error"); + }, "custom error message"); + const [value, error] = result; + + expect(value).toBeNull(); + expect(error).toBe("custom error message"); + }); + + it("should use custom error object when provided", () => { + const customError = { code: 500, message: "custom error" }; + const result = tryCatch((): string => { + throw new Error("original error"); + }, customError); + const [value, error] = result; + + expect(value).toBeNull(); + expect(error).toBe(customError); + }); + + it("should use custom error for non-Error thrown values", () => { + const customError = "my custom error"; + const result = tryCatch((): string => { + throw "thrown string"; + }, customError); + const [value, error] = result; + + expect(value).toBeNull(); + expect(error).toBe(customError); + }); + }); + }); + + describe("asynchronous execution", () => { + describe("successful execution", () => { + it("should return Promise that resolves to [result, null] when callback succeeds", async () => { + const [result, error] = await tryCatch(async () => "success"); + expect(result).toBe("success"); + expect(error).toBeNull(); + }); + + it("should work with different return types", async () => { + const [stringResult] = await tryCatch(async () => "hello"); + expect(stringResult).toBe("hello"); + + const [numberResult] = await tryCatch(async () => 42); + expect(numberResult).toBe(42); + + const [objectResult] = await tryCatch(async () => ({ + key: "value", + })); + expect(objectResult).toEqual({ key: "value" }); + }); + + it("should handle async operations", async () => { + const [result] = await tryCatch(async () => { + await new Promise((resolve) => setTimeout(resolve, 10)); + return "delayed result"; + }); + + expect(result).toBe("delayed result"); + }); + }); + + describe("error handling", () => { + it("should return Promise that resolves to [null, Error] when callback rejects", async () => { + const [result, error] = await tryCatch(async () => { + throw new Error("async error"); + }); + + expect(result).toBeNull(); + expect(error).toBeInstanceOf(Error); + expect((error as Error).message).toBe("async error"); + }); + + it("should preserve original error as cause property", async () => { + const originalError = new Error("original async error"); + const [result, error] = await tryCatch(async () => { + throw originalError; + }); + + expect(result).toBeNull(); + expect(error).toBeInstanceOf(Error); + expect((error as Error).message).toBe("original async error"); + expect((error as Error).cause).toBe(originalError); + }); + + it("should convert non-Error rejected values to Error", async () => { + const [result1, error1] = await tryCatch(async () => { + throw "string error"; + }); + expect(result1).toBeNull(); + expect(error1).toBeInstanceOf(Error); + expect((error1 as Error).message).toBe("string error"); + expect((error1 as Error).cause).toBe("string error"); + + const [result2, error2] = await tryCatch(async () => { + throw 123; + }); + expect(result2).toBeNull(); + expect(error2).toBeInstanceOf(Error); + expect((error2 as Error).message).toBe("123"); + expect((error2 as Error).cause).toBe(123); + }); + + it("should handle rejected Promise with Error", async () => { + const [result, error] = await tryCatch(async () => { + return Promise.reject(new Error("rejected error")); + }); + + expect(result).toBeNull(); + expect(error).toBeInstanceOf(Error); + expect((error as Error).message).toBe("rejected error"); + }); + }); + + describe("custom error message handling", () => { + it("should use custom error string when provided", async () => { + const [result, error] = await tryCatch(async () => { + throw new Error("original error"); + }, "custom async error message"); + + expect(result).toBeNull(); + expect(error).toBe("custom async error message"); + }); + + it("should use custom error object when provided", async () => { + const customError = { code: 500, message: "custom async error" }; + const [result, error] = await tryCatch(async () => { + throw new Error("original error"); + }, customError); + + expect(result).toBeNull(); + expect(error).toBe(customError); + }); + + it("should use custom error for non-Error rejected values", async () => { + const customError = "my custom async error"; + const [result, error] = await tryCatch(async () => { + throw "thrown string"; + }, customError); + + expect(result).toBeNull(); + expect(error).toBe(customError); + }); + + it("should use custom error for rejected Promise", async () => { + const customError = "custom rejection error"; + const [result, error] = await tryCatch(async () => { + return Promise.reject(new Error("rejected")); + }, customError); + + expect(result).toBeNull(); + expect(error).toBe(customError); + }); + }); + }); +}); diff --git a/perplexity/extension/src/utils/wrappers/try-catch.ts b/perplexity/extension/src/utils/wrappers/try-catch.ts new file mode 100644 index 000000000..f9e12108b --- /dev/null +++ b/perplexity/extension/src/utils/wrappers/try-catch.ts @@ -0,0 +1,65 @@ +import type { MaybePromise } from "@/types/utils.types"; + +type ErrorWrapperResult = [T, null] | [null, E]; + +/** + * Wraps a function to provide consistent error handling and executes it immediately + * @param callback The function to wrap (can be sync or async) + * @param errorMessage Optional custom error message or data + * @returns A tuple [result, error] where result is the value or null, and error is null or the error + * @template TResult The type of the successful result + */ +export function tryCatch( + callback: () => Promise, +): Promise>; +export function tryCatch( + callback: () => Promise, + errorMessage: TError, +): Promise>; +export function tryCatch( + callback: () => TResult, +): ErrorWrapperResult; +export function tryCatch( + callback: () => TResult, + errorMessage: TError, +): ErrorWrapperResult; +export function tryCatch( + callback: () => MaybePromise, + errorMessage?: TError, +): MaybePromise> { + try { + const result = callback(); + if (result instanceof Promise) { + return result + .then((value) => [value, null] as ErrorWrapperResult) + .catch((error) => { + let errorResult: TError; + + if (errorMessage !== undefined) { + errorResult = errorMessage; + } else { + errorResult = new Error( + error instanceof Error ? error.message : String(error), + { cause: error }, + ) as TError; + } + + return [null, errorResult] as ErrorWrapperResult; + }); + } + return [result, null] as ErrorWrapperResult; + } catch (error) { + let errorResult: TError; + + if (errorMessage !== undefined) { + errorResult = errorMessage; + } else { + errorResult = new Error( + error instanceof Error ? error.message : String(error), + { cause: error }, + ) as TError; + } + + return [null, errorResult] as ErrorWrapperResult; + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b33596fd0..cc3daee0e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -76,8 +76,8 @@ importers: specifier: catalog:lint version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) vitest: - specifier: ^4.0.4 - version: 4.0.4(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) + specifier: ^4.0.5 + version: 4.0.5(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.5)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) packages/cli-logger: devDependencies: @@ -354,8 +354,8 @@ importers: specifier: ^4.0.2 version: 4.0.2 dayjs: - specifier: ^1.11.18 - version: 1.11.18 + specifier: ^1.11.19 + version: 1.11.19 dedent: specifier: ^1.7.0 version: 1.7.0 @@ -417,11 +417,11 @@ importers: specifier: ^10.1.0 version: 10.1.0(@types/react@19.2.2)(react@19.2.0) react-router-dom: - specifier: ^7.9.4 - version: 7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: ^7.9.5 + version: 7.9.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react-syntax-highlighter: - specifier: ^15.6.6 - version: 15.6.6(react@19.2.0) + specifier: ^16.1.0 + version: 16.1.0(react@19.2.0) rehype-raw: specifier: ^7.0.0 version: 7.0.0 @@ -484,8 +484,8 @@ importers: specifier: ^2.2.1 version: 2.2.1 '@iconify/json': - specifier: ^2.2.401 - version: 2.2.401 + specifier: ^2.2.402 + version: 2.2.402 '@playwright/test': specifier: ^1.56.1 version: 1.56.1 @@ -550,8 +550,8 @@ importers: specifier: ^5.1.0 version: 5.1.0(vite@7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)) '@vitest/ui': - specifier: ^4.0.4 - version: 4.0.4(vitest@4.0.4) + specifier: ^4.0.5 + version: 4.0.5(vitest@4.0.5) babel-plugin-react-compiler: specifier: ^1.0.0 version: 1.0.0 @@ -559,8 +559,8 @@ importers: specifier: ^4.27.0 version: 4.27.0 caniuse-lite: - specifier: ^1.0.30001751 - version: 1.0.30001751 + specifier: ^1.0.30001752 + version: 1.0.30001752 chalk: specifier: 5.6.2 version: 5.6.2 @@ -628,14 +628,14 @@ importers: specifier: ^7.1.12 version: 7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) vitest: - specifier: ^4.0.4 - version: 4.0.4(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) + specifier: ^4.0.5 + version: 4.0.5(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.5)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) perplexity/extension/cli: dependencies: '@aws-sdk/client-s3': - specifier: ^3.919.0 - version: 3.919.0 + specifier: ^3.921.0 + version: 3.921.0 '@dotenvx/dotenvx': specifier: ^1.51.0 version: 1.51.0 @@ -726,123 +726,123 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-s3@3.919.0': - resolution: {integrity: sha512-UEPH2B9RnsS7Jo/oXe5DGrqQhWvRj6YBkLr7bsAZoYl4Sj1RbwDimiyGbhbuarnX5wCjpwSW860CFmShh/1z5w==} + '@aws-sdk/client-s3@3.921.0': + resolution: {integrity: sha512-vwe+OmgsducnvzouQDKRXyzZqMY4CCdlh+XdPJZz7LH+v7kYvsqIB0PiRMhcDc4d+QUOw6oZgY3V3Spi0twU/Q==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.919.0': - resolution: {integrity: sha512-9DVw/1DCzZ9G7Jofnhpg/XDC3wdJ3NAJdNWY1TrgE5ZcpTM+UTIQMGyaljCv9rgxggutHBgmBI5lP3YMcPk9ZQ==} + '@aws-sdk/client-sso@3.921.0': + resolution: {integrity: sha512-qWyT7WikdkPRAMuWidZ2l8jcQAPwNjvLcFZ/8K+oCAaMLt0LKLd7qeTwZ5tZFNqRNPXKfE8MkvAjyqSpE3i2yg==} engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.916.0': - resolution: {integrity: sha512-1JHE5s6MD5PKGovmx/F1e01hUbds/1y3X8rD+Gvi/gWVfdg5noO7ZCerpRsWgfzgvCMZC9VicopBqNHCKLykZA==} + '@aws-sdk/core@3.921.0': + resolution: {integrity: sha512-1eiD9ZO9cvEHdQUn/pwJVGN9LXg6D0O7knGVA0TA/v7nFSYy0n8RYG8vdnlcoYYnV1BcHgaf4KmRVMOszafNZQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.916.0': - resolution: {integrity: sha512-3gDeqOXcBRXGHScc6xb7358Lyf64NRG2P08g6Bu5mv1Vbg9PKDyCAZvhKLkG7hkdfAM8Yc6UJNhbFxr1ud/tCQ==} + '@aws-sdk/credential-provider-env@3.921.0': + resolution: {integrity: sha512-RGG+zZdOYGJBQ8+L7BI6v41opoF8knErMtBZAUGcD3gvWEhjatc7lSbIpBeYWbTaWPPLHQU+ZVbmQ/jRLBgefw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.916.0': - resolution: {integrity: sha512-NmooA5Z4/kPFJdsyoJgDxuqXC1C6oPMmreJjbOPqcwo6E/h2jxaG8utlQFgXe5F9FeJsMx668dtxVxSYnAAqHQ==} + '@aws-sdk/credential-provider-http@3.921.0': + resolution: {integrity: sha512-TAv08Ow0oF/olV4DTLoPDj46KMk35bL1IUCfToESDrWk1TOSur7d4sCL0p/7dUsAxS244cEgeyIIijKNtxj2AA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.919.0': - resolution: {integrity: sha512-fAWVfh0P54UFbyAK4tmIPh/X3COFAyXYSp8b2Pc1R6GRwDDMvrAigwGJuyZS4BmpPlXij1gB0nXbhM5Yo4MMMA==} + '@aws-sdk/credential-provider-ini@3.921.0': + resolution: {integrity: sha512-MUSRYGiMRq5NRGPRgJ7Nuh7GqXzE9iteAwdbzMJ4pnImgr7CjeWDihCIGk+gKLSG+NoRVVJM0V9PA4rxFir0Pg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.919.0': - resolution: {integrity: sha512-GL5filyxYS+eZq8ZMQnY5hh79Wxor7Rljo0SUJxZVwEj8cf3zY0MMuwoXU1HQrVabvYtkPDOWSreX8GkIBtBCw==} + '@aws-sdk/credential-provider-node@3.921.0': + resolution: {integrity: sha512-bxUAqRyo49WzKWn/XS0d8QXT9GydY/ew5m58PYfSMwYfmwBZXx1GLSWe3tZnefm6santFiqmIWfMmeRWdygKmQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.916.0': - resolution: {integrity: sha512-SXDyDvpJ1+WbotZDLJW1lqP6gYGaXfZJrgFSXIuZjHb75fKeNRgPkQX/wZDdUvCwdrscvxmtyJorp2sVYkMcvA==} + '@aws-sdk/credential-provider-process@3.921.0': + resolution: {integrity: sha512-DM62ooWI/aZ+ENBcLszuKmOkiICf6p4vYO2HgA3Cy2OEsTsjb67NEcntksxpZkD3mSIrCy/Qi4Z7tc77gle2Nw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.919.0': - resolution: {integrity: sha512-oN1XG/frOc2K2KdVwRQjLTBLM1oSFJLtOhuV/6g9N0ASD+44uVJai1CF9JJv5GjHGV+wsqAt+/Dzde0tZEXirA==} + '@aws-sdk/credential-provider-sso@3.921.0': + resolution: {integrity: sha512-Nh5jPJ6Y6nu3cHzZnq394lGXE5YO8Szke5zlATbNI7Tl0QJR65GE0IZsBcjzRMGpYX6ENCqPDK8FmklkmCYyVQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.919.0': - resolution: {integrity: sha512-Wi7RmyWA8kUJ++/8YceC7U5r4LyvOHGCnJLDHliP8rOC8HLdSgxw/Upeq3WmC+RPw1zyGOtEDRS/caop2xLXEA==} + '@aws-sdk/credential-provider-web-identity@3.921.0': + resolution: {integrity: sha512-VWcbgB2/shPPK674roHV4s8biCtvn0P/05EbTqy9WeyM5Oblx291gRGccyDhQbJbOL/6diRPBM08tlKPlBKNfw==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-bucket-endpoint@3.914.0': - resolution: {integrity: sha512-mHLsVnPPp4iq3gL2oEBamfpeETFV0qzxRHmcnCfEP3hualV8YF8jbXGmwPCPopUPQDpbYDBHYtXaoClZikCWPQ==} + '@aws-sdk/middleware-bucket-endpoint@3.921.0': + resolution: {integrity: sha512-D4AVjNAmy7KYycM/mOzbQRZbOOU0mY4T3nmW//CE8amqsAmmeIW6ff2AH/5yGRp8aNjQInZ9npXHTThKc4a+LA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-expect-continue@3.917.0': - resolution: {integrity: sha512-UPBq1ZP2CaxwbncWSbVqkhYXQrmfNiqAtHyBxi413hjRVZ4JhQ1UyH7pz5yqiG8zx2/+Po8cUD4SDUwJgda4nw==} + '@aws-sdk/middleware-expect-continue@3.921.0': + resolution: {integrity: sha512-XnHLbyu6uZlS8DbxpB1TFWYCi+IOdf8PAfijkiOCdl1vf9pBZBE45xvghSd+Ck0EqlKQl4mEy9sB0Vv1ERnMfQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.919.0': - resolution: {integrity: sha512-br56Wg1o5hLrMXX2iMjq12Cno/jsx9l2Y0KDI7hD4NFWycKCdsUpI1sjm8Asj18JbrbNWiCeAbFFlzcD8h+4wg==} + '@aws-sdk/middleware-flexible-checksums@3.921.0': + resolution: {integrity: sha512-8bgPdSpcAPeXDnxMGnL2Nj2EfWhU95U7Q+C+XvAPlkSPSi0tFU2F1/D6hdVBQ5MCjL9areamAt2qO/Tt3+IEUw==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-host-header@3.914.0': - resolution: {integrity: sha512-7r9ToySQ15+iIgXMF/h616PcQStByylVkCshmQqcdeynD/lCn2l667ynckxW4+ql0Q+Bo/URljuhJRxVJzydNA==} + '@aws-sdk/middleware-host-header@3.921.0': + resolution: {integrity: sha512-eX1Ka29XzuEcXG4YABTwyLtPLchjmcjSjaq4irKJTFkxSYzX7gjoKt18rh/ZzOWOSqi23+cpjvBacL4VBKvE2Q==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-location-constraint@3.914.0': - resolution: {integrity: sha512-Mpd0Sm9+GN7TBqGnZg1+dO5QZ/EOYEcDTo7KfvoyrXScMlxvYm9fdrUVMmLdPn/lntweZGV3uNrs+huasGOOTA==} + '@aws-sdk/middleware-location-constraint@3.921.0': + resolution: {integrity: sha512-KjYtPvAks/WgCc9sRbqTM0MP3+utMT+OJ1NN61kyiCiUJuMyKFb3olhCUIJHajP5trTsXCiwFsuysj9x2iupJw==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-logger@3.914.0': - resolution: {integrity: sha512-/gaW2VENS5vKvJbcE1umV4Ag3NuiVzpsANxtrqISxT3ovyro29o1RezW/Avz/6oJqjnmgz8soe9J1t65jJdiNg==} + '@aws-sdk/middleware-logger@3.921.0': + resolution: {integrity: sha512-14Qqp8wisKGj/2Y22OfO5jTBG5Xez+p3Zr2piAtz7AcbY8vBEoZbd6f+9lwwVFC73Aobkau223wzKbGT8HYQMw==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-recursion-detection@3.919.0': - resolution: {integrity: sha512-q3MAUxLQve4rTfAannUCx2q1kAHkBBsxt6hVUpzi63KC4lBLScc1ltr7TI+hDxlfGRWGo54jRegb2SsY9Jm+Mw==} + '@aws-sdk/middleware-recursion-detection@3.921.0': + resolution: {integrity: sha512-MYU5oI2b97M7u1dC1nt7SiGEvvLrQDlzV6hq9CB5TYX2glgbyvkaS//1Tjm87VF6qVSf5jYfwFDPeFGd8O1NrQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-sdk-s3@3.916.0': - resolution: {integrity: sha512-pjmzzjkEkpJObzmTthqJPq/P13KoNFuEi/x5PISlzJtHofCNcyXeVAQ90yvY2dQ6UXHf511Rh1/ytiKy2A8M0g==} + '@aws-sdk/middleware-sdk-s3@3.921.0': + resolution: {integrity: sha512-u4fkE6sn5KWojhPUeDIqRx0BJlQug60PzAnLPlxeIvy2+ZeTSY64WYwF6V7wIZCf1RIstiBA/hQUsX07LfbvNg==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-ssec@3.914.0': - resolution: {integrity: sha512-V1Oae/oLVbpNb9uWs+v80GKylZCdsbqs2c2Xb1FsAUPtYeSnxFuAWsF3/2AEMSSpFe0dTC5KyWr/eKl2aim9VQ==} + '@aws-sdk/middleware-ssec@3.921.0': + resolution: {integrity: sha512-hxu8bzu99afvBwyrq2YLUc6fOIR4kipGFsdTAfkXAoniYCaMA4eehSlvfWhbgUnNHbXb/KoP+lk8UTnx+gU8vQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.916.0': - resolution: {integrity: sha512-mzF5AdrpQXc2SOmAoaQeHpDFsK2GE6EGcEACeNuoESluPI2uYMpuuNMYrUufdnIAIyqgKlis0NVxiahA5jG42w==} + '@aws-sdk/middleware-user-agent@3.921.0': + resolution: {integrity: sha512-gXgokMBTPZAbQMm1+JOxItqA81aSFK6n7V2mAwxdmHjzCUZacX5RzkVPNbSaPPgDkroYnIzK09EusIpM6dLaqw==} engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.919.0': - resolution: {integrity: sha512-5D9OQsMPkbkp4KHM7JZv/RcGCpr3E1L7XX7U9sCxY+sFGeysltoviTmaIBXsJ2IjAJbBULtf0G/J+2cfH5OP+w==} + '@aws-sdk/nested-clients@3.921.0': + resolution: {integrity: sha512-GV9aV8WqH/EWo4x3T5BrYb2ph1yfYuzUXZc0hhvxbFbDKD8m2fX9menao3Mgm7E5C68Su392u+MD9SGmGCmfKQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/region-config-resolver@3.914.0': - resolution: {integrity: sha512-KlmHhRbn1qdwXUdsdrJ7S/MAkkC1jLpQ11n+XvxUUUCGAJd1gjC7AjxPZUM7ieQ2zcb8bfEzIU7al+Q3ZT0u7Q==} + '@aws-sdk/region-config-resolver@3.921.0': + resolution: {integrity: sha512-cSycw4wXcvsrssUdcEaeYQhQcZYVsBwHtgATh9HcIm01PrMV0lV71vcoyZ+9vUhwHwchRT6dItAyTHSQxwjvjg==} engines: {node: '>=18.0.0'} - '@aws-sdk/signature-v4-multi-region@3.916.0': - resolution: {integrity: sha512-fuzUMo6xU7e0NBzBA6TQ4FUf1gqNbg4woBSvYfxRRsIfKmSMn9/elXXn4sAE5UKvlwVQmYnb6p7dpVRPyFvnQA==} + '@aws-sdk/signature-v4-multi-region@3.921.0': + resolution: {integrity: sha512-pFtJXtrf8cOsCgEb2OoPwQP4BKrnwIq69FuLowvWrXllFntAoAdEYaj9wNxPyl4pGqvo/9zO9CtkMb53PNxmWQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.919.0': - resolution: {integrity: sha512-6aFv4lzXbfbkl0Pv37Us8S/ZkqplOQZIEgQg7bfMru7P96Wv2jVnDGsEc5YyxMnnRyIB90naQ5JgslZ4rkpknw==} + '@aws-sdk/token-providers@3.921.0': + resolution: {integrity: sha512-d+w6X7ykqXirFBF+dYyK5Ntw0KmO2sgMj+JLR/vAe1vaR8/Fuqs3yOAFU7yNEzpcnbLJmMznxKpht03CSEMh4Q==} engines: {node: '>=18.0.0'} - '@aws-sdk/types@3.914.0': - resolution: {integrity: sha512-kQWPsRDmom4yvAfyG6L1lMmlwnTzm1XwMHOU+G5IFlsP4YEaMtXidDzW/wiivY0QFrhfCz/4TVmu0a2aPU57ug==} + '@aws-sdk/types@3.921.0': + resolution: {integrity: sha512-mqEG8+vFh5w0ZZC+R8VCOdSk998Hy93pIDuwYpfMAWgYwVhFaIMOLn1fZw0w2DhTs5+ONHHwMJ6uVXtuuqOLQQ==} engines: {node: '>=18.0.0'} '@aws-sdk/util-arn-parser@3.893.0': resolution: {integrity: sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-endpoints@3.916.0': - resolution: {integrity: sha512-bAgUQwvixdsiGNcuZSDAOWbyHlnPtg8G8TyHD6DTfTmKTHUW6tAn+af/ZYJPXEzXhhpwgJqi58vWnsiDhmr7NQ==} + '@aws-sdk/util-endpoints@3.921.0': + resolution: {integrity: sha512-kuJYRqug6V8gOg401BuK4w4IAVO3575VDR8iYiFw0gPwNIfOXvdlChfsJQoREqwJfif45J4eSmUsFtMfx87BQg==} engines: {node: '>=18.0.0'} '@aws-sdk/util-locate-window@3.893.0': resolution: {integrity: sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-user-agent-browser@3.914.0': - resolution: {integrity: sha512-rMQUrM1ECH4kmIwlGl9UB0BtbHy6ZuKdWFrIknu8yGTRI/saAucqNTh5EI1vWBxZ0ElhK5+g7zOnUuhSmVQYUA==} + '@aws-sdk/util-user-agent-browser@3.921.0': + resolution: {integrity: sha512-buhv/ICWr4Nt8bquHOejCiVikBsfEYw4/HSc9U050QebRXIakt50zKYaWDQw4iCMeeqCiwE9mElEaXJAysythg==} - '@aws-sdk/util-user-agent-node@3.916.0': - resolution: {integrity: sha512-CwfWV2ch6UdjuSV75ZU99N03seEUb31FIUrXBnwa6oONqj/xqXwrxtlUMLx6WH3OJEE4zI3zt5PjlTdGcVwf4g==} + '@aws-sdk/util-user-agent-node@3.921.0': + resolution: {integrity: sha512-Ilftai6AMAU1cEaUqIiTxkyj1NupLhP9Eq8HRfVuIH8489J2wLCcOyiLklAgSzBNmrxW+fagxkY+Dg0lFwmcVA==} engines: {node: '>=18.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -850,8 +850,8 @@ packages: aws-crt: optional: true - '@aws-sdk/xml-builder@3.914.0': - resolution: {integrity: sha512-k75evsBD5TcIjedycYS7QXQ98AmOtbnxRJOPtCo0IwYRmy7UvqgS/gBL5SmrIqeV6FDSYRQMgdBxSMp6MLmdew==} + '@aws-sdk/xml-builder@3.921.0': + resolution: {integrity: sha512-LVHg0jgjyicKKvpNIEMXIMr1EBViESxcPkqfOlT+X1FkmUMTNZEEVF18tOJg4m4hV5vxtkWcqtr4IEeWa1C41Q==} engines: {node: '>=18.0.0'} '@aws/lambda-invoke-store@0.1.1': @@ -1207,14 +1207,18 @@ packages: resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.4.1': - resolution: {integrity: sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==} + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/core@0.16.0': resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1235,8 +1239,8 @@ packages: resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.4.0': - resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==} + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@floating-ui/core@1.7.3': @@ -1297,8 +1301,8 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@iconify/json@2.2.401': - resolution: {integrity: sha512-pBz8s09X2Aac6EhpfH1eWcu0Wqwuhgh3gmcoFgkrr6qUR1V2qZyz/TKo2hwGEEyyWqH2kc9t50qHRb0hxoG1/g==} + '@iconify/json@2.2.402': + resolution: {integrity: sha512-c4fqEUW+JrolUzwQJR5m4BgoAGGlTn8YjelJW1kc0k5b45/PztyNtLC+VT7Rwgc/sPYEDB4gwbQJCiwnJRku7A==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -2043,8 +2047,8 @@ packages: '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@smithy/abort-controller@4.2.3': - resolution: {integrity: sha512-xWL9Mf8b7tIFuAlpjKtRPnHrR8XVrwTj5NPYO/QwZPtc0SDLsPxb56V5tzi5yspSMytISHybifez+4jlrx0vkQ==} + '@smithy/abort-controller@4.2.4': + resolution: {integrity: sha512-Z4DUr/AkgyFf1bOThW2HwzREagee0sB5ycl+hDiSZOfRLW8ZgrOjDi6g8mHH19yyU5E2A/64W3z6SMIf5XiUSQ==} engines: {node: '>=18.0.0'} '@smithy/chunked-blob-reader-native@4.2.1': @@ -2055,56 +2059,56 @@ packages: resolution: {integrity: sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==} engines: {node: '>=18.0.0'} - '@smithy/config-resolver@4.4.0': - resolution: {integrity: sha512-Kkmz3Mup2PGp/HNJxhCWkLNdlajJORLSjwkcfrj0E7nu6STAEdcMR1ir5P9/xOmncx8xXfru0fbUYLlZog/cFg==} + '@smithy/config-resolver@4.4.1': + resolution: {integrity: sha512-BciDJ5hkyYEGBBKMbjGB1A/Zq8bYZ41Zo9BMnGdKF6QD1fY4zIkYx6zui/0CHaVGnv6h0iy8y4rnPX9CPCAPyQ==} engines: {node: '>=18.0.0'} - '@smithy/core@3.17.1': - resolution: {integrity: sha512-V4Qc2CIb5McABYfaGiIYLTmo/vwNIK7WXI5aGveBd9UcdhbOMwcvIMxIw/DJj1S9QgOMa/7FBkarMdIC0EOTEQ==} + '@smithy/core@3.17.2': + resolution: {integrity: sha512-n3g4Nl1Te+qGPDbNFAYf+smkRVB+JhFsGy9uJXXZQEufoP4u0r+WLh6KvTDolCswaagysDc/afS1yvb2jnj1gQ==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.2.3': - resolution: {integrity: sha512-hA1MQ/WAHly4SYltJKitEsIDVsNmXcQfYBRv2e+q04fnqtAX5qXaybxy/fhUeAMCnQIdAjaGDb04fMHQefWRhw==} + '@smithy/credential-provider-imds@4.2.4': + resolution: {integrity: sha512-YVNMjhdz2pVto5bRdux7GMs0x1m0Afz3OcQy/4Yf9DH4fWOtroGH7uLvs7ZmDyoBJzLdegtIPpXrpJOZWvUXdw==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-codec@4.2.3': - resolution: {integrity: sha512-rcr0VH0uNoMrtgKuY7sMfyKqbHc4GQaQ6Yp4vwgm+Z6psPuOgL+i/Eo/QWdXRmMinL3EgFM0Z1vkfyPyfzLmjw==} + '@smithy/eventstream-codec@4.2.4': + resolution: {integrity: sha512-aV8blR9RBDKrOlZVgjOdmOibTC2sBXNiT7WA558b4MPdsLTV6sbyc1WIE9QiIuYMJjYtnPLciefoqSW8Gi+MZQ==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-browser@4.2.3': - resolution: {integrity: sha512-EcS0kydOr2qJ3vV45y7nWnTlrPmVIMbUFOZbMG80+e2+xePQISX9DrcbRpVRFTS5Nqz3FiEbDcTCAV0or7bqdw==} + '@smithy/eventstream-serde-browser@4.2.4': + resolution: {integrity: sha512-d5T7ZS3J/r8P/PDjgmCcutmNxnSRvPH1U6iHeXjzI50sMr78GLmFcrczLw33Ap92oEKqa4CLrkAPeSSOqvGdUA==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-config-resolver@4.3.3': - resolution: {integrity: sha512-GewKGZ6lIJ9APjHFqR2cUW+Efp98xLu1KmN0jOWxQ1TN/gx3HTUPVbLciFD8CfScBj2IiKifqh9vYFRRXrYqXA==} + '@smithy/eventstream-serde-config-resolver@4.3.4': + resolution: {integrity: sha512-lxfDT0UuSc1HqltOGsTEAlZ6H29gpfDSdEPTapD5G63RbnYToZ+ezjzdonCCH90j5tRRCw3aLXVbiZaBW3VRVg==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-node@4.2.3': - resolution: {integrity: sha512-uQobOTQq2FapuSOlmGLUeGTpvcBLE5Fc7XjERUSk4dxEi4AhTwuyHYZNAvL4EMUp7lzxxkKDFaJ1GY0ovrj0Kg==} + '@smithy/eventstream-serde-node@4.2.4': + resolution: {integrity: sha512-TPhiGByWnYyzcpU/K3pO5V7QgtXYpE0NaJPEZBCa1Y5jlw5SjqzMSbFiLb+ZkJhqoQc0ImGyVINqnq1ze0ZRcQ==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-universal@4.2.3': - resolution: {integrity: sha512-QIvH/CKOk1BZPz/iwfgbh1SQD5Y0lpaw2kLA8zpLRRtYMPXeYUEWh+moTaJyqDaKlbrB174kB7FSRFiZ735tWw==} + '@smithy/eventstream-serde-universal@4.2.4': + resolution: {integrity: sha512-GNI/IXaY/XBB1SkGBFmbW033uWA0tj085eCxYih0eccUe/PFR7+UBQv9HNDk2fD9TJu7UVsCWsH99TkpEPSOzQ==} engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.3.4': - resolution: {integrity: sha512-bwigPylvivpRLCm+YK9I5wRIYjFESSVwl8JQ1vVx/XhCw0PtCi558NwTnT2DaVCl5pYlImGuQTSwMsZ+pIavRw==} + '@smithy/fetch-http-handler@5.3.5': + resolution: {integrity: sha512-mg83SM3FLI8Sa2ooTJbsh5MFfyMTyNRwxqpKHmE0ICRIa66Aodv80DMsTQI02xBLVJ0hckwqTRr5IGAbbWuFLQ==} engines: {node: '>=18.0.0'} - '@smithy/hash-blob-browser@4.2.4': - resolution: {integrity: sha512-W7eIxD+rTNsLB/2ynjmbdeP7TgxRXprfvqQxKFEfy9HW2HeD7t+g+KCIrY0pIn/GFjA6/fIpH+JQnfg5TTk76Q==} + '@smithy/hash-blob-browser@4.2.5': + resolution: {integrity: sha512-kCdgjD2J50qAqycYx0imbkA9tPtyQr1i5GwbK/EOUkpBmJGSkJe4mRJm+0F65TUSvvui1HZ5FFGFCND7l8/3WQ==} engines: {node: '>=18.0.0'} - '@smithy/hash-node@4.2.3': - resolution: {integrity: sha512-6+NOdZDbfuU6s1ISp3UOk5Rg953RJ2aBLNLLBEcamLjHAg1Po9Ha7QIB5ZWhdRUVuOUrT8BVFR+O2KIPmw027g==} + '@smithy/hash-node@4.2.4': + resolution: {integrity: sha512-kKU0gVhx/ppVMntvUOZE7WRMFW86HuaxLwvqileBEjL7PoILI8/djoILw3gPQloGVE6O0oOzqafxeNi2KbnUJw==} engines: {node: '>=18.0.0'} - '@smithy/hash-stream-node@4.2.3': - resolution: {integrity: sha512-EXMSa2yiStVII3x/+BIynyOAZlS7dGvI7RFrzXa/XssBgck/7TXJIvnjnCu328GY/VwHDC4VeDyP1S4rqwpYag==} + '@smithy/hash-stream-node@4.2.4': + resolution: {integrity: sha512-amuh2IJiyRfO5MV0X/YFlZMD6banjvjAwKdeJiYGUbId608x+oSNwv3vlyW2Gt6AGAgl3EYAuyYLGRX/xU8npQ==} engines: {node: '>=18.0.0'} - '@smithy/invalid-dependency@4.2.3': - resolution: {integrity: sha512-Cc9W5DwDuebXEDMpOpl4iERo8I0KFjTnomK2RMdhhR87GwrSmUmwMxS4P5JdRf+LsjOdIqumcerwRgYMr/tZ9Q==} + '@smithy/invalid-dependency@4.2.4': + resolution: {integrity: sha512-z6aDLGiHzsMhbS2MjetlIWopWz//K+mCoPXjW6aLr0mypF+Y7qdEh5TyJ20Onf9FbWHiWl4eC+rITdizpnXqOw==} engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@2.2.0': @@ -2115,76 +2119,76 @@ packages: resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} engines: {node: '>=18.0.0'} - '@smithy/md5-js@4.2.3': - resolution: {integrity: sha512-5+4bUEJQi/NRgzdA5SVXvAwyvEnD0ZAiKzV3yLO6dN5BG8ScKBweZ8mxXXUtdxq+Dx5k6EshKk0XJ7vgvIPSnA==} + '@smithy/md5-js@4.2.4': + resolution: {integrity: sha512-h7kzNWZuMe5bPnZwKxhVbY1gan5+TZ2c9JcVTHCygB14buVGOZxLl+oGfpY2p2Xm48SFqEWdghpvbBdmaz3ncQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-content-length@4.2.3': - resolution: {integrity: sha512-/atXLsT88GwKtfp5Jr0Ks1CSa4+lB+IgRnkNrrYP0h1wL4swHNb0YONEvTceNKNdZGJsye+W2HH8W7olbcPUeA==} + '@smithy/middleware-content-length@4.2.4': + resolution: {integrity: sha512-hJRZuFS9UsElX4DJSJfoX4M1qXRH+VFiLMUnhsWvtOOUWRNvvOfDaUSdlNbjwv1IkpVjj/Rd/O59Jl3nhAcxow==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.3.5': - resolution: {integrity: sha512-SIzKVTvEudFWJbxAaq7f2GvP3jh2FHDpIFI6/VAf4FOWGFZy0vnYMPSRj8PGYI8Hjt29mvmwSRgKuO3bK4ixDw==} + '@smithy/middleware-endpoint@4.3.6': + resolution: {integrity: sha512-PXehXofGMFpDqr933rxD8RGOcZ0QBAWtuzTgYRAHAL2BnKawHDEdf/TnGpcmfPJGwonhginaaeJIKluEojiF/w==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.4.5': - resolution: {integrity: sha512-DCaXbQqcZ4tONMvvdz+zccDE21sLcbwWoNqzPLFlZaxt1lDtOE2tlVpRSwcTOJrjJSUThdgEYn7HrX5oLGlK9A==} + '@smithy/middleware-retry@4.4.6': + resolution: {integrity: sha512-OhLx131znrEDxZPAvH/OYufR9d1nB2CQADyYFN4C3V/NQS7Mg4V6uvxHC/Dr96ZQW8IlHJTJ+vAhKt6oxWRndA==} engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.2.3': - resolution: {integrity: sha512-8g4NuUINpYccxiCXM5s1/V+uLtts8NcX4+sPEbvYQDZk4XoJfDpq5y2FQxfmUL89syoldpzNzA0R9nhzdtdKnQ==} + '@smithy/middleware-serde@4.2.4': + resolution: {integrity: sha512-jUr3x2CDhV15TOX2/Uoz4gfgeqLrRoTQbYAuhLS7lcVKNev7FeYSJ1ebEfjk+l9kbb7k7LfzIR/irgxys5ZTOg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-stack@4.2.3': - resolution: {integrity: sha512-iGuOJkH71faPNgOj/gWuEGS6xvQashpLwWB1HjHq1lNNiVfbiJLpZVbhddPuDbx9l4Cgl0vPLq5ltRfSaHfspA==} + '@smithy/middleware-stack@4.2.4': + resolution: {integrity: sha512-Gy3TKCOnm9JwpFooldwAboazw+EFYlC+Bb+1QBsSi5xI0W5lX81j/P5+CXvD/9ZjtYKRgxq+kkqd/KOHflzvgA==} engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@4.3.3': - resolution: {integrity: sha512-NzI1eBpBSViOav8NVy1fqOlSfkLgkUjUTlohUSgAEhHaFWA3XJiLditvavIP7OpvTjDp5u2LhtlBhkBlEisMwA==} + '@smithy/node-config-provider@4.3.4': + resolution: {integrity: sha512-3X3w7qzmo4XNNdPKNS4nbJcGSwiEMsNsRSunMA92S4DJLLIrH5g1AyuOA2XKM9PAPi8mIWfqC+fnfKNsI4KvHw==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.4.3': - resolution: {integrity: sha512-MAwltrDB0lZB/H6/2M5PIsISSwdI5yIh6DaBB9r0Flo9nx3y0dzl/qTMJPd7tJvPdsx6Ks/cwVzheGNYzXyNbQ==} + '@smithy/node-http-handler@4.4.4': + resolution: {integrity: sha512-VXHGfzCXLZeKnFp6QXjAdy+U8JF9etfpUXD1FAbzY1GzsFJiDQRQIt2CnMUvUdz3/YaHNqT3RphVWMUpXTIODA==} engines: {node: '>=18.0.0'} - '@smithy/property-provider@4.2.3': - resolution: {integrity: sha512-+1EZ+Y+njiefCohjlhyOcy1UNYjT+1PwGFHCxA/gYctjg3DQWAU19WigOXAco/Ql8hZokNehpzLd0/+3uCreqQ==} + '@smithy/property-provider@4.2.4': + resolution: {integrity: sha512-g2DHo08IhxV5GdY3Cpt/jr0mkTlAD39EJKN27Jb5N8Fb5qt8KG39wVKTXiTRCmHHou7lbXR8nKVU14/aRUf86w==} engines: {node: '>=18.0.0'} - '@smithy/protocol-http@5.3.3': - resolution: {integrity: sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==} + '@smithy/protocol-http@5.3.4': + resolution: {integrity: sha512-3sfFd2MAzVt0Q/klOmjFi3oIkxczHs0avbwrfn1aBqtc23WqQSmjvk77MBw9WkEQcwbOYIX5/2z4ULj8DuxSsw==} engines: {node: '>=18.0.0'} - '@smithy/querystring-builder@4.2.3': - resolution: {integrity: sha512-LOVCGCmwMahYUM/P0YnU/AlDQFjcu+gWbFJooC417QRB/lDJlWSn8qmPSDp+s4YVAHOgtgbNG4sR+SxF/VOcJQ==} + '@smithy/querystring-builder@4.2.4': + resolution: {integrity: sha512-KQ1gFXXC+WsbPFnk7pzskzOpn4s+KheWgO3dzkIEmnb6NskAIGp/dGdbKisTPJdtov28qNDohQrgDUKzXZBLig==} engines: {node: '>=18.0.0'} - '@smithy/querystring-parser@4.2.3': - resolution: {integrity: sha512-cYlSNHcTAX/wc1rpblli3aUlLMGgKZ/Oqn8hhjFASXMCXjIqeuQBei0cnq2JR8t4RtU9FpG6uyl6PxyArTiwKA==} + '@smithy/querystring-parser@4.2.4': + resolution: {integrity: sha512-aHb5cqXZocdzEkZ/CvhVjdw5l4r1aU/9iMEyoKzH4eXMowT6M0YjBpp7W/+XjkBnY8Xh0kVd55GKjnPKlCwinQ==} engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@4.2.3': - resolution: {integrity: sha512-NkxsAxFWwsPsQiwFG2MzJ/T7uIR6AQNh1SzcxSUnmmIqIQMlLRQDKhc17M7IYjiuBXhrQRjQTo3CxX+DobS93g==} + '@smithy/service-error-classification@4.2.4': + resolution: {integrity: sha512-fdWuhEx4+jHLGeew9/IvqVU/fxT/ot70tpRGuOLxE3HzZOyKeTQfYeV1oaBXpzi93WOk668hjMuuagJ2/Qs7ng==} engines: {node: '>=18.0.0'} - '@smithy/shared-ini-file-loader@4.3.3': - resolution: {integrity: sha512-9f9Ixej0hFhroOK2TxZfUUDR13WVa8tQzhSzPDgXe5jGL3KmaM9s8XN7RQwqtEypI82q9KHnKS71CJ+q/1xLtQ==} + '@smithy/shared-ini-file-loader@4.3.4': + resolution: {integrity: sha512-y5ozxeQ9omVjbnJo9dtTsdXj9BEvGx2X8xvRgKnV+/7wLBuYJQL6dOa/qMY6omyHi7yjt1OA97jZLoVRYi8lxA==} engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.3.3': - resolution: {integrity: sha512-CmSlUy+eEYbIEYN5N3vvQTRfqt0lJlQkaQUIf+oizu7BbDut0pozfDjBGecfcfWf7c62Yis4JIEgqQ/TCfodaA==} + '@smithy/signature-v4@5.3.4': + resolution: {integrity: sha512-ScDCpasxH7w1HXHYbtk3jcivjvdA1VICyAdgvVqKhKKwxi+MTwZEqFw0minE+oZ7F07oF25xh4FGJxgqgShz0A==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.9.1': - resolution: {integrity: sha512-Ngb95ryR5A9xqvQFT5mAmYkCwbXvoLavLFwmi7zVg/IowFPCfiqRfkOKnbc/ZRL8ZKJ4f+Tp6kSu6wjDQb8L/g==} + '@smithy/smithy-client@4.9.2': + resolution: {integrity: sha512-gZU4uAFcdrSi3io8U99Qs/FvVdRxPvIMToi+MFfsy/DN9UqtknJ1ais+2M9yR8e0ASQpNmFYEKeIKVcMjQg3rg==} engines: {node: '>=18.0.0'} - '@smithy/types@4.8.0': - resolution: {integrity: sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==} + '@smithy/types@4.8.1': + resolution: {integrity: sha512-N0Zn0OT1zc+NA+UVfkYqQzviRh5ucWwO7mBV3TmHHprMnfcJNfhlPicDkBHi0ewbh+y3evR6cNAW0Raxvb01NA==} engines: {node: '>=18.0.0'} - '@smithy/url-parser@4.2.3': - resolution: {integrity: sha512-I066AigYvY3d9VlU3zG9XzZg1yT10aNqvCaBTw9EPgu5GrsEl1aUkcMvhkIXascYH1A8W0LQo3B1Kr1cJNcQEw==} + '@smithy/url-parser@4.2.4': + resolution: {integrity: sha512-w/N/Iw0/PTwJ36PDqU9PzAwVElo4qXxCC0eCTlUtIz/Z5V/2j/cViMHi0hPukSBHp4DVwvUlUhLgCzqSJ6plrg==} engines: {node: '>=18.0.0'} '@smithy/util-base64@4.3.0': @@ -2211,32 +2215,32 @@ packages: resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.3.4': - resolution: {integrity: sha512-qI5PJSW52rnutos8Bln8nwQZRpyoSRN6k2ajyoUHNMUzmWqHnOJCnDELJuV6m5PML0VkHI+XcXzdB+6awiqYUw==} + '@smithy/util-defaults-mode-browser@4.3.5': + resolution: {integrity: sha512-GwaGjv/QLuL/QHQaqhf/maM7+MnRFQQs7Bsl6FlaeK6lm6U7mV5AAnVabw68cIoMl5FQFyKK62u7RWRzWL25OQ==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.2.6': - resolution: {integrity: sha512-c6M/ceBTm31YdcFpgfgQAJaw3KbaLuRKnAz91iMWFLSrgxRpYm03c3bu5cpYojNMfkV9arCUelelKA7XQT36SQ==} + '@smithy/util-defaults-mode-node@4.2.7': + resolution: {integrity: sha512-6hinjVqec0WYGsqN7h9hL/ywfULmJJNXGXnNZW7jrIn/cFuC/aVlVaiDfBIJEvKcOrmN8/EgsW69eY0gXABeHw==} engines: {node: '>=18.0.0'} - '@smithy/util-endpoints@3.2.3': - resolution: {integrity: sha512-aCfxUOVv0CzBIkU10TubdgKSx5uRvzH064kaiPEWfNIvKOtNpu642P4FP1hgOFkjQIkDObrfIDnKMKkeyrejvQ==} + '@smithy/util-endpoints@3.2.4': + resolution: {integrity: sha512-f+nBDhgYRCmUEDKEQb6q0aCcOTXRDqH5wWaFHJxt4anB4pKHlgGoYP3xtioKXH64e37ANUkzWf6p4Mnv1M5/Vg==} engines: {node: '>=18.0.0'} '@smithy/util-hex-encoding@4.2.0': resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} engines: {node: '>=18.0.0'} - '@smithy/util-middleware@4.2.3': - resolution: {integrity: sha512-v5ObKlSe8PWUHCqEiX2fy1gNv6goiw6E5I/PN2aXg3Fb/hse0xeaAnSpXDiWl7x6LamVKq7senB+m5LOYHUAHw==} + '@smithy/util-middleware@4.2.4': + resolution: {integrity: sha512-fKGQAPAn8sgV0plRikRVo6g6aR0KyKvgzNrPuM74RZKy/wWVzx3BMk+ZWEueyN3L5v5EDg+P582mKU+sH5OAsg==} engines: {node: '>=18.0.0'} - '@smithy/util-retry@4.2.3': - resolution: {integrity: sha512-lLPWnakjC0q9z+OtiXk+9RPQiYPNAovt2IXD3CP4LkOnd9NpUsxOjMx1SnoUVB7Orb7fZp67cQMtTBKMFDvOGg==} + '@smithy/util-retry@4.2.4': + resolution: {integrity: sha512-yQncJmj4dtv/isTXxRb4AamZHy4QFr4ew8GxS6XLWt7sCIxkPxPzINWd7WLISEFPsIan14zrKgvyAF+/yzfwoA==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.5.4': - resolution: {integrity: sha512-+qDxSkiErejw1BAIXUFBSfM5xh3arbz1MmxlbMCKanDDZtVEQ7PSKW9FQS0Vud1eI/kYn0oCTVKyNzRlq+9MUw==} + '@smithy/util-stream@4.5.5': + resolution: {integrity: sha512-7M5aVFjT+HPilPOKbOmQfCIPchZe4DSBc1wf1+NvHvSoFTiFtauZzT+onZvCj70xhXd0AEmYnZYmdJIuwxOo4w==} engines: {node: '>=18.0.0'} '@smithy/util-uri-escape@4.2.0': @@ -2251,8 +2255,8 @@ packages: resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} engines: {node: '>=18.0.0'} - '@smithy/util-waiter@4.2.3': - resolution: {integrity: sha512-5+nU///E5sAdD7t3hs4uwvCTWQtTR8JwKwOCSJtBRx0bY1isDo1QwH87vRK86vlFLBTISqoDA2V6xvP6nF1isQ==} + '@smithy/util-waiter@4.2.4': + resolution: {integrity: sha512-roKXtXIC6fopFvVOju8VYHtguc/jAcMlK8IlDOHsrQn0ayMkHynjm/D2DCMRf7MJFXzjHhlzg2edr3QPEakchQ==} engines: {node: '>=18.0.0'} '@smithy/uuid@1.1.0': @@ -2691,9 +2695,6 @@ packages: '@types/har-format@1.2.16': resolution: {integrity: sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==} - '@types/hast@2.3.10': - resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} - '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -2727,6 +2728,9 @@ packages: '@types/pako@2.0.4': resolution: {integrity: sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw==} + '@types/prismjs@1.26.5': + resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} + '@types/react-dom@19.2.2': resolution: {integrity: sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==} peerDependencies: @@ -2929,11 +2933,11 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - '@vitest/expect@4.0.4': - resolution: {integrity: sha512-0ioMscWJtfpyH7+P82sGpAi3Si30OVV73jD+tEqXm5+rIx9LgnfdaOn45uaFkKOncABi/PHL00Yn0oW/wK4cXw==} + '@vitest/expect@4.0.5': + resolution: {integrity: sha512-DJctLVlKoddvP/G389oGmKWNG6GD9frm2FPXARziU80Rjo7SIYxQzb2YFzmQ4fVD3Q5utUYY8nUmWrqsuIlIXQ==} - '@vitest/mocker@4.0.4': - resolution: {integrity: sha512-UTtKgpjWj+pvn3lUM55nSg34098obGhSHH+KlJcXesky8b5wCUgg7s60epxrS6yAG8slZ9W8T9jGWg4PisMf5Q==} + '@vitest/mocker@4.0.5': + resolution: {integrity: sha512-iYHIy72LfbK+mL5W8zXROp6oOcJKXWeKcNjcPPsqoa18qIEDrhB6/Z08o0wRajTd6SSSDNw8NCSIHVNOMpz0mw==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0-0 @@ -2943,25 +2947,25 @@ packages: vite: optional: true - '@vitest/pretty-format@4.0.4': - resolution: {integrity: sha512-lHI2rbyrLVSd1TiHGJYyEtbOBo2SDndIsN3qY4o4xe2pBxoJLD6IICghNCvD7P+BFin6jeyHXiUICXqgl6vEaQ==} + '@vitest/pretty-format@4.0.5': + resolution: {integrity: sha512-t1T/sSdsYyNc5AZl0EMeD0jW9cpJe2cODP0R++ZQe1kTkpgrwEfxGFR/yCG4w8ZybizbXRTHU7lE8sTDD/QsGw==} - '@vitest/runner@4.0.4': - resolution: {integrity: sha512-99EDqiCkncCmvIZj3qJXBZbyoQ35ghOwVWNnQ5nj0Hnsv4Qm40HmrMJrceewjLVvsxV/JSU4qyx2CGcfMBmXJw==} + '@vitest/runner@4.0.5': + resolution: {integrity: sha512-CQVVe+YEeKSiFBD5gBAmRDQglm4PnMBYzeTmt06t5iWtsUN9StQeeKhYCea/oaqBYilf8sARG6fSctUcEL/UmQ==} - '@vitest/snapshot@4.0.4': - resolution: {integrity: sha512-XICqf5Gi4648FGoBIeRgnHWSNDp+7R5tpclGosFaUUFzY6SfcpsfHNMnC7oDu/iOLBxYfxVzaQpylEvpgii3zw==} + '@vitest/snapshot@4.0.5': + resolution: {integrity: sha512-jfmSAeR6xYNEvcD+/RxFGA1bzpqHtkVhgxo2cxXia+Q3xX7m6GpZij07rz+WyQcA/xEGn4eIS1OItkMyWsGBmQ==} - '@vitest/spy@4.0.4': - resolution: {integrity: sha512-G9L13AFyYECo40QG7E07EdYnZZYCKMTSp83p9W8Vwed0IyCG1GnpDLxObkx8uOGPXfDpdeVf24P1Yka8/q1s9g==} + '@vitest/spy@4.0.5': + resolution: {integrity: sha512-TUmVQpAQign7r8+EnZsgTF3vY9BdGofTUge1rGNbnHn2IN3FChiQoT9lrPz7A7AVUZJU2LAZXl4v66HhsNMhoA==} - '@vitest/ui@4.0.4': - resolution: {integrity: sha512-CmuFQLKw5SaLU/Flo8dLiQw2P2ONguhjfhBL9AYkTeDZPToE8laGvObXqRzS5G+4RD4SgWcI1USAmGxMVIqT0g==} + '@vitest/ui@4.0.5': + resolution: {integrity: sha512-msuwwWsWSKKOid91osirrm0hDUFojT9wde4GSefCj7BHz9SrXbFJSbrrKKEow0AmGhQi/k2FxIWnVifioWbMVg==} peerDependencies: - vitest: 4.0.4 + vitest: 4.0.5 - '@vitest/utils@4.0.4': - resolution: {integrity: sha512-4bJLmSvZLyVbNsYFRpPYdJViG9jZyRvMZ35IF4ymXbRZoS+ycYghmwTGiscTXduUg2lgKK7POWIyXJNute1hjw==} + '@vitest/utils@4.0.5': + resolution: {integrity: sha512-V5RndUgCB5/AfNvK9zxGCrRs99IrPYtMTIdUzJMMFs9nrmE5JXExIEfjVtUteyTRiLfCm+dCRMHf/Uu7Mm8/dg==} '@vscode/markdown-it-katex@1.1.2': resolution: {integrity: sha512-+4IIv5PgrmhKvW/3LpkpkGg257OViEhXkOOgCyj5KMsjsOfnRXkni8XAuuF9Ui5p3B8WnUovlDXAQNb8RJ/RaQ==} @@ -3401,8 +3405,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.8.20: - resolution: {integrity: sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ==} + baseline-browser-mapping@2.8.21: + resolution: {integrity: sha512-JU0h5APyQNsHOlAM7HnQnPToSDQoEBZqzu/YBlqDnEeymPnZDREeXJA3KBMQee+dKteAxZ2AtvQEvVYdZf241Q==} hasBin: true binary-extensions@2.3.0: @@ -3495,8 +3499,8 @@ packages: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} - caniuse-lite@1.0.30001751: - resolution: {integrity: sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==} + caniuse-lite@1.0.30001752: + resolution: {integrity: sha512-vKUk7beoukxE47P5gcVNKkDRzXdVofotshHwfR9vmpeFKxmI5PBpgOMC18LUJUA/DvJ70Y7RveasIBraqsyO/g==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -3519,26 +3523,17 @@ packages: character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - character-entities-legacy@1.1.4: - resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - character-entities@1.2.4: - resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} - character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - character-reference-invalid@1.1.4: - resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - chardet@2.1.0: - resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} cheerio-select@2.1.0: resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} @@ -3648,9 +3643,6 @@ packages: comctx@1.4.3: resolution: {integrity: sha512-Z1fisV3l6kucW+GZDg3AI2+ffWGd+Q/RCBKGbpQ8oe6U3p6wmTM/NciP4RRgLYYDW4aZgZIXRUQz1YnFX1QsjQ==} - comma-separated-tokens@1.0.8: - resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} - comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -3946,8 +3938,8 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} - dayjs@1.11.18: - resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==} + dayjs@1.11.19: + resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} debounce@1.2.1: resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} @@ -4118,8 +4110,8 @@ packages: resolution: {integrity: sha512-dS5cbA9rA2VR4Ybuvhg6jvdmp46ubLn3E+px8cG/35aEDNclrqoCjg6mt0HYZ/M+OoESS3jSkCrqk1kWAEhWAw==} engines: {bun: '>=1', deno: '>=2', node: '>=16'} - electron-to-chromium@1.5.242: - resolution: {integrity: sha512-msZ7SYGFpXkm/iUizlMrm/FPNeYo8uSltQccLVFO3fV4RN2JWGdG7Aatztxtw3uDWp3DkupfkrosLjUnhY+iOw==} + electron-to-chromium@1.5.244: + resolution: {integrity: sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -4822,9 +4814,6 @@ packages: hast-util-from-parse5@8.0.3: resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} - hast-util-parse-selector@2.2.5: - resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} - hast-util-parse-selector@4.0.0: resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} @@ -4846,9 +4835,6 @@ packages: hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - hastscript@6.0.0: - resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} - hastscript@9.0.1: resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} @@ -5003,15 +4989,9 @@ packages: resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} engines: {node: '>=0.10.0'} - is-alphabetical@1.0.4: - resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - is-alphanumerical@1.0.4: - resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} - is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} @@ -5061,9 +5041,6 @@ packages: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} - is-decimal@1.0.4: - resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -5101,9 +5078,6 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-hexadecimal@1.0.4: - resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} @@ -5874,8 +5848,8 @@ packages: node-notifier@10.0.1: resolution: {integrity: sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ==} - node-releases@2.0.26: - resolution: {integrity: sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==} + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -6005,9 +5979,6 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - parse-entities@2.0.0: - resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} - parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} @@ -6242,10 +6213,6 @@ packages: engines: {node: '>=14'} hasBin: true - prismjs@1.27.0: - resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} - engines: {node: '>=6'} - prismjs@1.30.0: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} @@ -6263,9 +6230,6 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - property-information@5.6.0: - resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} - property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} @@ -6378,15 +6342,15 @@ packages: '@types/react': optional: true - react-router-dom@7.9.4: - resolution: {integrity: sha512-f30P6bIkmYvnHHa5Gcu65deIXoA2+r3Eb6PJIAddvsT9aGlchMatJ51GgpU470aSqRRbFX22T70yQNUGuW3DfA==} + react-router-dom@7.9.5: + resolution: {integrity: sha512-mkEmq/K8tKN63Ae2M7Xgz3c9l9YNbY+NHH6NNeUmLA3kDkhKXRsNb/ZpxaEunvGo2/3YXdk5EJU3Hxp3ocaBPw==} engines: {node: '>=20.0.0'} peerDependencies: react: '>=18' react-dom: '>=18' - react-router@7.9.4: - resolution: {integrity: sha512-SD3G8HKviFHg9xj7dNODUKDFgpG4xqD5nhyd0mYoB5iISepuZAvzSr8ywxgxKJ52yRzf/HWtVHc9AWwoTbljvA==} + react-router@7.9.5: + resolution: {integrity: sha512-JmxqrnBZ6E9hWmf02jzNn9Jm3UqyeimyiwzD69NjxGySG6lIz/1LVPsoTCwN7NBX2XjCEa1LIX5EMz1j2b6u6A==} engines: {node: '>=20.0.0'} peerDependencies: react: '>=18' @@ -6405,8 +6369,9 @@ packages: '@types/react': optional: true - react-syntax-highlighter@15.6.6: - resolution: {integrity: sha512-DgXrc+AZF47+HvAPEmn7Ua/1p10jNoVZVI/LoPiYdtY+OM+/nG5yefLHKJwdKqY1adMuHFbeyBaG9j64ML7vTw==} + react-syntax-highlighter@16.1.0: + resolution: {integrity: sha512-E40/hBiP5rCNwkeBN1vRP+xow1X0pndinO+z3h7HLsHyjztbyjfzNWNKuAsJj+7DLam9iT4AaaOZnueCU+Nplg==} + engines: {node: '>= 16.20.2'} peerDependencies: react: '>= 0.14.0' @@ -6441,8 +6406,8 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - refractor@3.6.0: - resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} + refractor@5.0.0: + resolution: {integrity: sha512-QXOrHQF5jOpjjLfiNk5GFnWhRXvxjUVnlFxkeDmewR5sXkr3iM46Zo+CnRR8B+MDVqkULW4EcLVcRBNOPXHosw==} regexp-tree@0.1.27: resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} @@ -6737,9 +6702,6 @@ packages: engines: {node: '>= 8'} deprecated: The work that was done in this beta branch won't be included in future versions - space-separated-tokens@1.1.5: - resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} - space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -7369,18 +7331,18 @@ packages: yaml: optional: true - vitest@4.0.4: - resolution: {integrity: sha512-hV31h0/bGbtmDQc0KqaxsTO1v4ZQeF8ojDFuy4sZhFadwAqqvJA0LDw68QUocctI5EDpFMql/jVWKuPYHIf2Ew==} + vitest@4.0.5: + resolution: {integrity: sha512-4H+J28MI5oeYgGg3h5BFSkQ1g/2GKK1IR8oorH3a6EQQbb7CwjbnyBjH4PGxw9/6vpwAPNzaeUMp4Js4WJmdXQ==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.0.4 - '@vitest/browser-preview': 4.0.4 - '@vitest/browser-webdriverio': 4.0.4 - '@vitest/ui': 4.0.4 + '@vitest/browser-playwright': 4.0.5 + '@vitest/browser-preview': 4.0.5 + '@vitest/browser-webdriverio': 4.0.5 + '@vitest/ui': 4.0.5 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -7565,10 +7527,6 @@ packages: resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} engines: {node: '>=0.4.0'} - xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -7726,20 +7684,20 @@ snapshots: '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.914.0 + '@aws-sdk/types': 3.921.0 tslib: 2.8.1 '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.914.0 + '@aws-sdk/types': 3.921.0 tslib: 2.8.1 '@aws-crypto/sha1-browser@5.2.0': dependencies: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.914.0 + '@aws-sdk/types': 3.921.0 '@aws-sdk/util-locate-window': 3.893.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -7749,7 +7707,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.914.0 + '@aws-sdk/types': 3.921.0 '@aws-sdk/util-locate-window': 3.893.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -7757,7 +7715,7 @@ snapshots: '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.914.0 + '@aws-sdk/types': 3.921.0 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -7766,424 +7724,425 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.914.0 + '@aws-sdk/types': 3.921.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.919.0': + '@aws-sdk/client-s3@3.921.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.916.0 - '@aws-sdk/credential-provider-node': 3.919.0 - '@aws-sdk/middleware-bucket-endpoint': 3.914.0 - '@aws-sdk/middleware-expect-continue': 3.917.0 - '@aws-sdk/middleware-flexible-checksums': 3.919.0 - '@aws-sdk/middleware-host-header': 3.914.0 - '@aws-sdk/middleware-location-constraint': 3.914.0 - '@aws-sdk/middleware-logger': 3.914.0 - '@aws-sdk/middleware-recursion-detection': 3.919.0 - '@aws-sdk/middleware-sdk-s3': 3.916.0 - '@aws-sdk/middleware-ssec': 3.914.0 - '@aws-sdk/middleware-user-agent': 3.916.0 - '@aws-sdk/region-config-resolver': 3.914.0 - '@aws-sdk/signature-v4-multi-region': 3.916.0 - '@aws-sdk/types': 3.914.0 - '@aws-sdk/util-endpoints': 3.916.0 - '@aws-sdk/util-user-agent-browser': 3.914.0 - '@aws-sdk/util-user-agent-node': 3.916.0 - '@aws-sdk/xml-builder': 3.914.0 - '@smithy/config-resolver': 4.4.0 - '@smithy/core': 3.17.1 - '@smithy/eventstream-serde-browser': 4.2.3 - '@smithy/eventstream-serde-config-resolver': 4.3.3 - '@smithy/eventstream-serde-node': 4.2.3 - '@smithy/fetch-http-handler': 5.3.4 - '@smithy/hash-blob-browser': 4.2.4 - '@smithy/hash-node': 4.2.3 - '@smithy/hash-stream-node': 4.2.3 - '@smithy/invalid-dependency': 4.2.3 - '@smithy/md5-js': 4.2.3 - '@smithy/middleware-content-length': 4.2.3 - '@smithy/middleware-endpoint': 4.3.5 - '@smithy/middleware-retry': 4.4.5 - '@smithy/middleware-serde': 4.2.3 - '@smithy/middleware-stack': 4.2.3 - '@smithy/node-config-provider': 4.3.3 - '@smithy/node-http-handler': 4.4.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/smithy-client': 4.9.1 - '@smithy/types': 4.8.0 - '@smithy/url-parser': 4.2.3 + '@aws-sdk/core': 3.921.0 + '@aws-sdk/credential-provider-node': 3.921.0 + '@aws-sdk/middleware-bucket-endpoint': 3.921.0 + '@aws-sdk/middleware-expect-continue': 3.921.0 + '@aws-sdk/middleware-flexible-checksums': 3.921.0 + '@aws-sdk/middleware-host-header': 3.921.0 + '@aws-sdk/middleware-location-constraint': 3.921.0 + '@aws-sdk/middleware-logger': 3.921.0 + '@aws-sdk/middleware-recursion-detection': 3.921.0 + '@aws-sdk/middleware-sdk-s3': 3.921.0 + '@aws-sdk/middleware-ssec': 3.921.0 + '@aws-sdk/middleware-user-agent': 3.921.0 + '@aws-sdk/region-config-resolver': 3.921.0 + '@aws-sdk/signature-v4-multi-region': 3.921.0 + '@aws-sdk/types': 3.921.0 + '@aws-sdk/util-endpoints': 3.921.0 + '@aws-sdk/util-user-agent-browser': 3.921.0 + '@aws-sdk/util-user-agent-node': 3.921.0 + '@aws-sdk/xml-builder': 3.921.0 + '@smithy/config-resolver': 4.4.1 + '@smithy/core': 3.17.2 + '@smithy/eventstream-serde-browser': 4.2.4 + '@smithy/eventstream-serde-config-resolver': 4.3.4 + '@smithy/eventstream-serde-node': 4.2.4 + '@smithy/fetch-http-handler': 5.3.5 + '@smithy/hash-blob-browser': 4.2.5 + '@smithy/hash-node': 4.2.4 + '@smithy/hash-stream-node': 4.2.4 + '@smithy/invalid-dependency': 4.2.4 + '@smithy/md5-js': 4.2.4 + '@smithy/middleware-content-length': 4.2.4 + '@smithy/middleware-endpoint': 4.3.6 + '@smithy/middleware-retry': 4.4.6 + '@smithy/middleware-serde': 4.2.4 + '@smithy/middleware-stack': 4.2.4 + '@smithy/node-config-provider': 4.3.4 + '@smithy/node-http-handler': 4.4.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 + '@smithy/url-parser': 4.2.4 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.4 - '@smithy/util-defaults-mode-node': 4.2.6 - '@smithy/util-endpoints': 3.2.3 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-retry': 4.2.3 - '@smithy/util-stream': 4.5.4 + '@smithy/util-defaults-mode-browser': 4.3.5 + '@smithy/util-defaults-mode-node': 4.2.7 + '@smithy/util-endpoints': 3.2.4 + '@smithy/util-middleware': 4.2.4 + '@smithy/util-retry': 4.2.4 + '@smithy/util-stream': 4.5.5 '@smithy/util-utf8': 4.2.0 - '@smithy/util-waiter': 4.2.3 + '@smithy/util-waiter': 4.2.4 '@smithy/uuid': 1.1.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.919.0': + '@aws-sdk/client-sso@3.921.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.916.0 - '@aws-sdk/middleware-host-header': 3.914.0 - '@aws-sdk/middleware-logger': 3.914.0 - '@aws-sdk/middleware-recursion-detection': 3.919.0 - '@aws-sdk/middleware-user-agent': 3.916.0 - '@aws-sdk/region-config-resolver': 3.914.0 - '@aws-sdk/types': 3.914.0 - '@aws-sdk/util-endpoints': 3.916.0 - '@aws-sdk/util-user-agent-browser': 3.914.0 - '@aws-sdk/util-user-agent-node': 3.916.0 - '@smithy/config-resolver': 4.4.0 - '@smithy/core': 3.17.1 - '@smithy/fetch-http-handler': 5.3.4 - '@smithy/hash-node': 4.2.3 - '@smithy/invalid-dependency': 4.2.3 - '@smithy/middleware-content-length': 4.2.3 - '@smithy/middleware-endpoint': 4.3.5 - '@smithy/middleware-retry': 4.4.5 - '@smithy/middleware-serde': 4.2.3 - '@smithy/middleware-stack': 4.2.3 - '@smithy/node-config-provider': 4.3.3 - '@smithy/node-http-handler': 4.4.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/smithy-client': 4.9.1 - '@smithy/types': 4.8.0 - '@smithy/url-parser': 4.2.3 + '@aws-sdk/core': 3.921.0 + '@aws-sdk/middleware-host-header': 3.921.0 + '@aws-sdk/middleware-logger': 3.921.0 + '@aws-sdk/middleware-recursion-detection': 3.921.0 + '@aws-sdk/middleware-user-agent': 3.921.0 + '@aws-sdk/region-config-resolver': 3.921.0 + '@aws-sdk/types': 3.921.0 + '@aws-sdk/util-endpoints': 3.921.0 + '@aws-sdk/util-user-agent-browser': 3.921.0 + '@aws-sdk/util-user-agent-node': 3.921.0 + '@smithy/config-resolver': 4.4.1 + '@smithy/core': 3.17.2 + '@smithy/fetch-http-handler': 5.3.5 + '@smithy/hash-node': 4.2.4 + '@smithy/invalid-dependency': 4.2.4 + '@smithy/middleware-content-length': 4.2.4 + '@smithy/middleware-endpoint': 4.3.6 + '@smithy/middleware-retry': 4.4.6 + '@smithy/middleware-serde': 4.2.4 + '@smithy/middleware-stack': 4.2.4 + '@smithy/node-config-provider': 4.3.4 + '@smithy/node-http-handler': 4.4.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 + '@smithy/url-parser': 4.2.4 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.4 - '@smithy/util-defaults-mode-node': 4.2.6 - '@smithy/util-endpoints': 3.2.3 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-retry': 4.2.3 + '@smithy/util-defaults-mode-browser': 4.3.5 + '@smithy/util-defaults-mode-node': 4.2.7 + '@smithy/util-endpoints': 3.2.4 + '@smithy/util-middleware': 4.2.4 + '@smithy/util-retry': 4.2.4 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.916.0': - dependencies: - '@aws-sdk/types': 3.914.0 - '@aws-sdk/xml-builder': 3.914.0 - '@smithy/core': 3.17.1 - '@smithy/node-config-provider': 4.3.3 - '@smithy/property-provider': 4.2.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/signature-v4': 5.3.3 - '@smithy/smithy-client': 4.9.1 - '@smithy/types': 4.8.0 + '@aws-sdk/core@3.921.0': + dependencies: + '@aws-sdk/types': 3.921.0 + '@aws-sdk/xml-builder': 3.921.0 + '@smithy/core': 3.17.2 + '@smithy/node-config-provider': 4.3.4 + '@smithy/property-provider': 4.2.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/signature-v4': 5.3.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 '@smithy/util-base64': 4.3.0 - '@smithy/util-middleware': 4.2.3 + '@smithy/util-middleware': 4.2.4 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.916.0': + '@aws-sdk/credential-provider-env@3.921.0': dependencies: - '@aws-sdk/core': 3.916.0 - '@aws-sdk/types': 3.914.0 - '@smithy/property-provider': 4.2.3 - '@smithy/types': 4.8.0 + '@aws-sdk/core': 3.921.0 + '@aws-sdk/types': 3.921.0 + '@smithy/property-provider': 4.2.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.916.0': - dependencies: - '@aws-sdk/core': 3.916.0 - '@aws-sdk/types': 3.914.0 - '@smithy/fetch-http-handler': 5.3.4 - '@smithy/node-http-handler': 4.4.3 - '@smithy/property-provider': 4.2.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/smithy-client': 4.9.1 - '@smithy/types': 4.8.0 - '@smithy/util-stream': 4.5.4 + '@aws-sdk/credential-provider-http@3.921.0': + dependencies: + '@aws-sdk/core': 3.921.0 + '@aws-sdk/types': 3.921.0 + '@smithy/fetch-http-handler': 5.3.5 + '@smithy/node-http-handler': 4.4.4 + '@smithy/property-provider': 4.2.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 + '@smithy/util-stream': 4.5.5 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.919.0': - dependencies: - '@aws-sdk/core': 3.916.0 - '@aws-sdk/credential-provider-env': 3.916.0 - '@aws-sdk/credential-provider-http': 3.916.0 - '@aws-sdk/credential-provider-process': 3.916.0 - '@aws-sdk/credential-provider-sso': 3.919.0 - '@aws-sdk/credential-provider-web-identity': 3.919.0 - '@aws-sdk/nested-clients': 3.919.0 - '@aws-sdk/types': 3.914.0 - '@smithy/credential-provider-imds': 4.2.3 - '@smithy/property-provider': 4.2.3 - '@smithy/shared-ini-file-loader': 4.3.3 - '@smithy/types': 4.8.0 + '@aws-sdk/credential-provider-ini@3.921.0': + dependencies: + '@aws-sdk/core': 3.921.0 + '@aws-sdk/credential-provider-env': 3.921.0 + '@aws-sdk/credential-provider-http': 3.921.0 + '@aws-sdk/credential-provider-process': 3.921.0 + '@aws-sdk/credential-provider-sso': 3.921.0 + '@aws-sdk/credential-provider-web-identity': 3.921.0 + '@aws-sdk/nested-clients': 3.921.0 + '@aws-sdk/types': 3.921.0 + '@smithy/credential-provider-imds': 4.2.4 + '@smithy/property-provider': 4.2.4 + '@smithy/shared-ini-file-loader': 4.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.919.0': - dependencies: - '@aws-sdk/credential-provider-env': 3.916.0 - '@aws-sdk/credential-provider-http': 3.916.0 - '@aws-sdk/credential-provider-ini': 3.919.0 - '@aws-sdk/credential-provider-process': 3.916.0 - '@aws-sdk/credential-provider-sso': 3.919.0 - '@aws-sdk/credential-provider-web-identity': 3.919.0 - '@aws-sdk/types': 3.914.0 - '@smithy/credential-provider-imds': 4.2.3 - '@smithy/property-provider': 4.2.3 - '@smithy/shared-ini-file-loader': 4.3.3 - '@smithy/types': 4.8.0 + '@aws-sdk/credential-provider-node@3.921.0': + dependencies: + '@aws-sdk/credential-provider-env': 3.921.0 + '@aws-sdk/credential-provider-http': 3.921.0 + '@aws-sdk/credential-provider-ini': 3.921.0 + '@aws-sdk/credential-provider-process': 3.921.0 + '@aws-sdk/credential-provider-sso': 3.921.0 + '@aws-sdk/credential-provider-web-identity': 3.921.0 + '@aws-sdk/types': 3.921.0 + '@smithy/credential-provider-imds': 4.2.4 + '@smithy/property-provider': 4.2.4 + '@smithy/shared-ini-file-loader': 4.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.916.0': + '@aws-sdk/credential-provider-process@3.921.0': dependencies: - '@aws-sdk/core': 3.916.0 - '@aws-sdk/types': 3.914.0 - '@smithy/property-provider': 4.2.3 - '@smithy/shared-ini-file-loader': 4.3.3 - '@smithy/types': 4.8.0 + '@aws-sdk/core': 3.921.0 + '@aws-sdk/types': 3.921.0 + '@smithy/property-provider': 4.2.4 + '@smithy/shared-ini-file-loader': 4.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.919.0': + '@aws-sdk/credential-provider-sso@3.921.0': dependencies: - '@aws-sdk/client-sso': 3.919.0 - '@aws-sdk/core': 3.916.0 - '@aws-sdk/token-providers': 3.919.0 - '@aws-sdk/types': 3.914.0 - '@smithy/property-provider': 4.2.3 - '@smithy/shared-ini-file-loader': 4.3.3 - '@smithy/types': 4.8.0 + '@aws-sdk/client-sso': 3.921.0 + '@aws-sdk/core': 3.921.0 + '@aws-sdk/token-providers': 3.921.0 + '@aws-sdk/types': 3.921.0 + '@smithy/property-provider': 4.2.4 + '@smithy/shared-ini-file-loader': 4.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.919.0': + '@aws-sdk/credential-provider-web-identity@3.921.0': dependencies: - '@aws-sdk/core': 3.916.0 - '@aws-sdk/nested-clients': 3.919.0 - '@aws-sdk/types': 3.914.0 - '@smithy/property-provider': 4.2.3 - '@smithy/shared-ini-file-loader': 4.3.3 - '@smithy/types': 4.8.0 + '@aws-sdk/core': 3.921.0 + '@aws-sdk/nested-clients': 3.921.0 + '@aws-sdk/types': 3.921.0 + '@smithy/property-provider': 4.2.4 + '@smithy/shared-ini-file-loader': 4.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/middleware-bucket-endpoint@3.914.0': + '@aws-sdk/middleware-bucket-endpoint@3.921.0': dependencies: - '@aws-sdk/types': 3.914.0 + '@aws-sdk/types': 3.921.0 '@aws-sdk/util-arn-parser': 3.893.0 - '@smithy/node-config-provider': 4.3.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 + '@smithy/node-config-provider': 4.3.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 '@smithy/util-config-provider': 4.2.0 tslib: 2.8.1 - '@aws-sdk/middleware-expect-continue@3.917.0': + '@aws-sdk/middleware-expect-continue@3.921.0': dependencies: - '@aws-sdk/types': 3.914.0 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 + '@aws-sdk/types': 3.921.0 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.919.0': + '@aws-sdk/middleware-flexible-checksums@3.921.0': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.916.0 - '@aws-sdk/types': 3.914.0 + '@aws-sdk/core': 3.921.0 + '@aws-sdk/types': 3.921.0 '@smithy/is-array-buffer': 4.2.0 - '@smithy/node-config-provider': 4.3.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-stream': 4.5.4 + '@smithy/node-config-provider': 4.3.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 + '@smithy/util-middleware': 4.2.4 + '@smithy/util-stream': 4.5.5 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.914.0': + '@aws-sdk/middleware-host-header@3.921.0': dependencies: - '@aws-sdk/types': 3.914.0 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 + '@aws-sdk/types': 3.921.0 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/middleware-location-constraint@3.914.0': + '@aws-sdk/middleware-location-constraint@3.921.0': dependencies: - '@aws-sdk/types': 3.914.0 - '@smithy/types': 4.8.0 + '@aws-sdk/types': 3.921.0 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.914.0': + '@aws-sdk/middleware-logger@3.921.0': dependencies: - '@aws-sdk/types': 3.914.0 - '@smithy/types': 4.8.0 + '@aws-sdk/types': 3.921.0 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.919.0': + '@aws-sdk/middleware-recursion-detection@3.921.0': dependencies: - '@aws-sdk/types': 3.914.0 + '@aws-sdk/types': 3.921.0 '@aws/lambda-invoke-store': 0.1.1 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.916.0': + '@aws-sdk/middleware-sdk-s3@3.921.0': dependencies: - '@aws-sdk/core': 3.916.0 - '@aws-sdk/types': 3.914.0 + '@aws-sdk/core': 3.921.0 + '@aws-sdk/types': 3.921.0 '@aws-sdk/util-arn-parser': 3.893.0 - '@smithy/core': 3.17.1 - '@smithy/node-config-provider': 4.3.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/signature-v4': 5.3.3 - '@smithy/smithy-client': 4.9.1 - '@smithy/types': 4.8.0 + '@smithy/core': 3.17.2 + '@smithy/node-config-provider': 4.3.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/signature-v4': 5.3.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 '@smithy/util-config-provider': 4.2.0 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-stream': 4.5.4 + '@smithy/util-middleware': 4.2.4 + '@smithy/util-stream': 4.5.5 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@aws-sdk/middleware-ssec@3.914.0': + '@aws-sdk/middleware-ssec@3.921.0': dependencies: - '@aws-sdk/types': 3.914.0 - '@smithy/types': 4.8.0 + '@aws-sdk/types': 3.921.0 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.916.0': + '@aws-sdk/middleware-user-agent@3.921.0': dependencies: - '@aws-sdk/core': 3.916.0 - '@aws-sdk/types': 3.914.0 - '@aws-sdk/util-endpoints': 3.916.0 - '@smithy/core': 3.17.1 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 + '@aws-sdk/core': 3.921.0 + '@aws-sdk/types': 3.921.0 + '@aws-sdk/util-endpoints': 3.921.0 + '@smithy/core': 3.17.2 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.919.0': + '@aws-sdk/nested-clients@3.921.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.916.0 - '@aws-sdk/middleware-host-header': 3.914.0 - '@aws-sdk/middleware-logger': 3.914.0 - '@aws-sdk/middleware-recursion-detection': 3.919.0 - '@aws-sdk/middleware-user-agent': 3.916.0 - '@aws-sdk/region-config-resolver': 3.914.0 - '@aws-sdk/types': 3.914.0 - '@aws-sdk/util-endpoints': 3.916.0 - '@aws-sdk/util-user-agent-browser': 3.914.0 - '@aws-sdk/util-user-agent-node': 3.916.0 - '@smithy/config-resolver': 4.4.0 - '@smithy/core': 3.17.1 - '@smithy/fetch-http-handler': 5.3.4 - '@smithy/hash-node': 4.2.3 - '@smithy/invalid-dependency': 4.2.3 - '@smithy/middleware-content-length': 4.2.3 - '@smithy/middleware-endpoint': 4.3.5 - '@smithy/middleware-retry': 4.4.5 - '@smithy/middleware-serde': 4.2.3 - '@smithy/middleware-stack': 4.2.3 - '@smithy/node-config-provider': 4.3.3 - '@smithy/node-http-handler': 4.4.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/smithy-client': 4.9.1 - '@smithy/types': 4.8.0 - '@smithy/url-parser': 4.2.3 + '@aws-sdk/core': 3.921.0 + '@aws-sdk/middleware-host-header': 3.921.0 + '@aws-sdk/middleware-logger': 3.921.0 + '@aws-sdk/middleware-recursion-detection': 3.921.0 + '@aws-sdk/middleware-user-agent': 3.921.0 + '@aws-sdk/region-config-resolver': 3.921.0 + '@aws-sdk/types': 3.921.0 + '@aws-sdk/util-endpoints': 3.921.0 + '@aws-sdk/util-user-agent-browser': 3.921.0 + '@aws-sdk/util-user-agent-node': 3.921.0 + '@smithy/config-resolver': 4.4.1 + '@smithy/core': 3.17.2 + '@smithy/fetch-http-handler': 5.3.5 + '@smithy/hash-node': 4.2.4 + '@smithy/invalid-dependency': 4.2.4 + '@smithy/middleware-content-length': 4.2.4 + '@smithy/middleware-endpoint': 4.3.6 + '@smithy/middleware-retry': 4.4.6 + '@smithy/middleware-serde': 4.2.4 + '@smithy/middleware-stack': 4.2.4 + '@smithy/node-config-provider': 4.3.4 + '@smithy/node-http-handler': 4.4.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 + '@smithy/url-parser': 4.2.4 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.4 - '@smithy/util-defaults-mode-node': 4.2.6 - '@smithy/util-endpoints': 3.2.3 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-retry': 4.2.3 + '@smithy/util-defaults-mode-browser': 4.3.5 + '@smithy/util-defaults-mode-node': 4.2.7 + '@smithy/util-endpoints': 3.2.4 + '@smithy/util-middleware': 4.2.4 + '@smithy/util-retry': 4.2.4 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.914.0': + '@aws-sdk/region-config-resolver@3.921.0': dependencies: - '@aws-sdk/types': 3.914.0 - '@smithy/config-resolver': 4.4.0 - '@smithy/types': 4.8.0 + '@aws-sdk/types': 3.921.0 + '@smithy/config-resolver': 4.4.1 + '@smithy/node-config-provider': 4.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.916.0': + '@aws-sdk/signature-v4-multi-region@3.921.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.916.0 - '@aws-sdk/types': 3.914.0 - '@smithy/protocol-http': 5.3.3 - '@smithy/signature-v4': 5.3.3 - '@smithy/types': 4.8.0 + '@aws-sdk/middleware-sdk-s3': 3.921.0 + '@aws-sdk/types': 3.921.0 + '@smithy/protocol-http': 5.3.4 + '@smithy/signature-v4': 5.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/token-providers@3.919.0': + '@aws-sdk/token-providers@3.921.0': dependencies: - '@aws-sdk/core': 3.916.0 - '@aws-sdk/nested-clients': 3.919.0 - '@aws-sdk/types': 3.914.0 - '@smithy/property-provider': 4.2.3 - '@smithy/shared-ini-file-loader': 4.3.3 - '@smithy/types': 4.8.0 + '@aws-sdk/core': 3.921.0 + '@aws-sdk/nested-clients': 3.921.0 + '@aws-sdk/types': 3.921.0 + '@smithy/property-provider': 4.2.4 + '@smithy/shared-ini-file-loader': 4.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/types@3.914.0': + '@aws-sdk/types@3.921.0': dependencies: - '@smithy/types': 4.8.0 + '@smithy/types': 4.8.1 tslib: 2.8.1 '@aws-sdk/util-arn-parser@3.893.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.916.0': + '@aws-sdk/util-endpoints@3.921.0': dependencies: - '@aws-sdk/types': 3.914.0 - '@smithy/types': 4.8.0 - '@smithy/url-parser': 4.2.3 - '@smithy/util-endpoints': 3.2.3 + '@aws-sdk/types': 3.921.0 + '@smithy/types': 4.8.1 + '@smithy/url-parser': 4.2.4 + '@smithy/util-endpoints': 3.2.4 tslib: 2.8.1 '@aws-sdk/util-locate-window@3.893.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.914.0': + '@aws-sdk/util-user-agent-browser@3.921.0': dependencies: - '@aws-sdk/types': 3.914.0 - '@smithy/types': 4.8.0 + '@aws-sdk/types': 3.921.0 + '@smithy/types': 4.8.1 bowser: 2.12.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.916.0': + '@aws-sdk/util-user-agent-node@3.921.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.916.0 - '@aws-sdk/types': 3.914.0 - '@smithy/node-config-provider': 4.3.3 - '@smithy/types': 4.8.0 + '@aws-sdk/middleware-user-agent': 3.921.0 + '@aws-sdk/types': 3.921.0 + '@smithy/node-config-provider': 4.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/xml-builder@3.914.0': + '@aws-sdk/xml-builder@3.921.0': dependencies: - '@smithy/types': 4.8.0 + '@smithy/types': 4.8.1 fast-xml-parser: 5.2.5 tslib: 2.8.1 @@ -8597,14 +8556,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.4.1': + '@eslint/config-helpers@0.4.2': dependencies: - '@eslint/core': 0.16.0 + '@eslint/core': 0.17.0 '@eslint/core@0.16.0': dependencies: '@types/json-schema': 7.0.15 + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 @@ -8639,9 +8602,9 @@ snapshots: '@eslint/object-schema@2.1.7': {} - '@eslint/plugin-kit@0.4.0': + '@eslint/plugin-kit@0.4.1': dependencies: - '@eslint/core': 0.16.0 + '@eslint/core': 0.17.0 levn: 0.4.1 '@floating-ui/core@1.7.3': @@ -8695,7 +8658,7 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@iconify/json@2.2.401': + '@iconify/json@2.2.402': dependencies: '@iconify/types': 2.0.0 pathe: 2.0.3 @@ -8765,7 +8728,7 @@ snapshots: '@inquirer/external-editor@1.0.2(@types/node@22.17.2)': dependencies: - chardet: 2.1.0 + chardet: 2.1.1 iconv-lite: 0.7.0 optionalDependencies: '@types/node': 22.17.2 @@ -9382,9 +9345,9 @@ snapshots: '@sec-ant/readable-stream@0.4.1': {} - '@smithy/abort-controller@4.2.3': + '@smithy/abort-controller@4.2.4': dependencies: - '@smithy/types': 4.8.0 + '@smithy/types': 4.8.1 tslib: 2.8.1 '@smithy/chunked-blob-reader-native@4.2.1': @@ -9396,97 +9359,97 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/config-resolver@4.4.0': + '@smithy/config-resolver@4.4.1': dependencies: - '@smithy/node-config-provider': 4.3.3 - '@smithy/types': 4.8.0 + '@smithy/node-config-provider': 4.3.4 + '@smithy/types': 4.8.1 '@smithy/util-config-provider': 4.2.0 - '@smithy/util-endpoints': 3.2.3 - '@smithy/util-middleware': 4.2.3 + '@smithy/util-endpoints': 3.2.4 + '@smithy/util-middleware': 4.2.4 tslib: 2.8.1 - '@smithy/core@3.17.1': + '@smithy/core@3.17.2': dependencies: - '@smithy/middleware-serde': 4.2.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 + '@smithy/middleware-serde': 4.2.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-stream': 4.5.4 + '@smithy/util-middleware': 4.2.4 + '@smithy/util-stream': 4.5.5 '@smithy/util-utf8': 4.2.0 '@smithy/uuid': 1.1.0 tslib: 2.8.1 - '@smithy/credential-provider-imds@4.2.3': + '@smithy/credential-provider-imds@4.2.4': dependencies: - '@smithy/node-config-provider': 4.3.3 - '@smithy/property-provider': 4.2.3 - '@smithy/types': 4.8.0 - '@smithy/url-parser': 4.2.3 + '@smithy/node-config-provider': 4.3.4 + '@smithy/property-provider': 4.2.4 + '@smithy/types': 4.8.1 + '@smithy/url-parser': 4.2.4 tslib: 2.8.1 - '@smithy/eventstream-codec@4.2.3': + '@smithy/eventstream-codec@4.2.4': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.8.0 + '@smithy/types': 4.8.1 '@smithy/util-hex-encoding': 4.2.0 tslib: 2.8.1 - '@smithy/eventstream-serde-browser@4.2.3': + '@smithy/eventstream-serde-browser@4.2.4': dependencies: - '@smithy/eventstream-serde-universal': 4.2.3 - '@smithy/types': 4.8.0 + '@smithy/eventstream-serde-universal': 4.2.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/eventstream-serde-config-resolver@4.3.3': + '@smithy/eventstream-serde-config-resolver@4.3.4': dependencies: - '@smithy/types': 4.8.0 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/eventstream-serde-node@4.2.3': + '@smithy/eventstream-serde-node@4.2.4': dependencies: - '@smithy/eventstream-serde-universal': 4.2.3 - '@smithy/types': 4.8.0 + '@smithy/eventstream-serde-universal': 4.2.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/eventstream-serde-universal@4.2.3': + '@smithy/eventstream-serde-universal@4.2.4': dependencies: - '@smithy/eventstream-codec': 4.2.3 - '@smithy/types': 4.8.0 + '@smithy/eventstream-codec': 4.2.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.3.4': + '@smithy/fetch-http-handler@5.3.5': dependencies: - '@smithy/protocol-http': 5.3.3 - '@smithy/querystring-builder': 4.2.3 - '@smithy/types': 4.8.0 + '@smithy/protocol-http': 5.3.4 + '@smithy/querystring-builder': 4.2.4 + '@smithy/types': 4.8.1 '@smithy/util-base64': 4.3.0 tslib: 2.8.1 - '@smithy/hash-blob-browser@4.2.4': + '@smithy/hash-blob-browser@4.2.5': dependencies: '@smithy/chunked-blob-reader': 5.2.0 '@smithy/chunked-blob-reader-native': 4.2.1 - '@smithy/types': 4.8.0 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/hash-node@4.2.3': + '@smithy/hash-node@4.2.4': dependencies: - '@smithy/types': 4.8.0 + '@smithy/types': 4.8.1 '@smithy/util-buffer-from': 4.2.0 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/hash-stream-node@4.2.3': + '@smithy/hash-stream-node@4.2.4': dependencies: - '@smithy/types': 4.8.0 + '@smithy/types': 4.8.1 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/invalid-dependency@4.2.3': + '@smithy/invalid-dependency@4.2.4': dependencies: - '@smithy/types': 4.8.0 + '@smithy/types': 4.8.1 tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': @@ -9497,126 +9460,126 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/md5-js@4.2.3': + '@smithy/md5-js@4.2.4': dependencies: - '@smithy/types': 4.8.0 + '@smithy/types': 4.8.1 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/middleware-content-length@4.2.3': + '@smithy/middleware-content-length@4.2.4': dependencies: - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.3.5': + '@smithy/middleware-endpoint@4.3.6': dependencies: - '@smithy/core': 3.17.1 - '@smithy/middleware-serde': 4.2.3 - '@smithy/node-config-provider': 4.3.3 - '@smithy/shared-ini-file-loader': 4.3.3 - '@smithy/types': 4.8.0 - '@smithy/url-parser': 4.2.3 - '@smithy/util-middleware': 4.2.3 + '@smithy/core': 3.17.2 + '@smithy/middleware-serde': 4.2.4 + '@smithy/node-config-provider': 4.3.4 + '@smithy/shared-ini-file-loader': 4.3.4 + '@smithy/types': 4.8.1 + '@smithy/url-parser': 4.2.4 + '@smithy/util-middleware': 4.2.4 tslib: 2.8.1 - '@smithy/middleware-retry@4.4.5': + '@smithy/middleware-retry@4.4.6': dependencies: - '@smithy/node-config-provider': 4.3.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/service-error-classification': 4.2.3 - '@smithy/smithy-client': 4.9.1 - '@smithy/types': 4.8.0 - '@smithy/util-middleware': 4.2.3 - '@smithy/util-retry': 4.2.3 + '@smithy/node-config-provider': 4.3.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/service-error-classification': 4.2.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 + '@smithy/util-middleware': 4.2.4 + '@smithy/util-retry': 4.2.4 '@smithy/uuid': 1.1.0 tslib: 2.8.1 - '@smithy/middleware-serde@4.2.3': + '@smithy/middleware-serde@4.2.4': dependencies: - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/middleware-stack@4.2.3': + '@smithy/middleware-stack@4.2.4': dependencies: - '@smithy/types': 4.8.0 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/node-config-provider@4.3.3': + '@smithy/node-config-provider@4.3.4': dependencies: - '@smithy/property-provider': 4.2.3 - '@smithy/shared-ini-file-loader': 4.3.3 - '@smithy/types': 4.8.0 + '@smithy/property-provider': 4.2.4 + '@smithy/shared-ini-file-loader': 4.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/node-http-handler@4.4.3': + '@smithy/node-http-handler@4.4.4': dependencies: - '@smithy/abort-controller': 4.2.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/querystring-builder': 4.2.3 - '@smithy/types': 4.8.0 + '@smithy/abort-controller': 4.2.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/querystring-builder': 4.2.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/property-provider@4.2.3': + '@smithy/property-provider@4.2.4': dependencies: - '@smithy/types': 4.8.0 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/protocol-http@5.3.3': + '@smithy/protocol-http@5.3.4': dependencies: - '@smithy/types': 4.8.0 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/querystring-builder@4.2.3': + '@smithy/querystring-builder@4.2.4': dependencies: - '@smithy/types': 4.8.0 + '@smithy/types': 4.8.1 '@smithy/util-uri-escape': 4.2.0 tslib: 2.8.1 - '@smithy/querystring-parser@4.2.3': + '@smithy/querystring-parser@4.2.4': dependencies: - '@smithy/types': 4.8.0 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/service-error-classification@4.2.3': + '@smithy/service-error-classification@4.2.4': dependencies: - '@smithy/types': 4.8.0 + '@smithy/types': 4.8.1 - '@smithy/shared-ini-file-loader@4.3.3': + '@smithy/shared-ini-file-loader@4.3.4': dependencies: - '@smithy/types': 4.8.0 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/signature-v4@5.3.3': + '@smithy/signature-v4@5.3.4': dependencies: '@smithy/is-array-buffer': 4.2.0 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 '@smithy/util-hex-encoding': 4.2.0 - '@smithy/util-middleware': 4.2.3 + '@smithy/util-middleware': 4.2.4 '@smithy/util-uri-escape': 4.2.0 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/smithy-client@4.9.1': + '@smithy/smithy-client@4.9.2': dependencies: - '@smithy/core': 3.17.1 - '@smithy/middleware-endpoint': 4.3.5 - '@smithy/middleware-stack': 4.2.3 - '@smithy/protocol-http': 5.3.3 - '@smithy/types': 4.8.0 - '@smithy/util-stream': 4.5.4 + '@smithy/core': 3.17.2 + '@smithy/middleware-endpoint': 4.3.6 + '@smithy/middleware-stack': 4.2.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 + '@smithy/util-stream': 4.5.5 tslib: 2.8.1 - '@smithy/types@4.8.0': + '@smithy/types@4.8.1': dependencies: tslib: 2.8.1 - '@smithy/url-parser@4.2.3': + '@smithy/url-parser@4.2.4': dependencies: - '@smithy/querystring-parser': 4.2.3 - '@smithy/types': 4.8.0 + '@smithy/querystring-parser': 4.2.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 '@smithy/util-base64@4.3.0': @@ -9647,49 +9610,49 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.3.4': + '@smithy/util-defaults-mode-browser@4.3.5': dependencies: - '@smithy/property-provider': 4.2.3 - '@smithy/smithy-client': 4.9.1 - '@smithy/types': 4.8.0 + '@smithy/property-provider': 4.2.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.2.6': + '@smithy/util-defaults-mode-node@4.2.7': dependencies: - '@smithy/config-resolver': 4.4.0 - '@smithy/credential-provider-imds': 4.2.3 - '@smithy/node-config-provider': 4.3.3 - '@smithy/property-provider': 4.2.3 - '@smithy/smithy-client': 4.9.1 - '@smithy/types': 4.8.0 + '@smithy/config-resolver': 4.4.1 + '@smithy/credential-provider-imds': 4.2.4 + '@smithy/node-config-provider': 4.3.4 + '@smithy/property-provider': 4.2.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/util-endpoints@3.2.3': + '@smithy/util-endpoints@3.2.4': dependencies: - '@smithy/node-config-provider': 4.3.3 - '@smithy/types': 4.8.0 + '@smithy/node-config-provider': 4.3.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 '@smithy/util-hex-encoding@4.2.0': dependencies: tslib: 2.8.1 - '@smithy/util-middleware@4.2.3': + '@smithy/util-middleware@4.2.4': dependencies: - '@smithy/types': 4.8.0 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/util-retry@4.2.3': + '@smithy/util-retry@4.2.4': dependencies: - '@smithy/service-error-classification': 4.2.3 - '@smithy/types': 4.8.0 + '@smithy/service-error-classification': 4.2.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/util-stream@4.5.4': + '@smithy/util-stream@4.5.5': dependencies: - '@smithy/fetch-http-handler': 5.3.4 - '@smithy/node-http-handler': 4.4.3 - '@smithy/types': 4.8.0 + '@smithy/fetch-http-handler': 5.3.5 + '@smithy/node-http-handler': 4.4.4 + '@smithy/types': 4.8.1 '@smithy/util-base64': 4.3.0 '@smithy/util-buffer-from': 4.2.0 '@smithy/util-hex-encoding': 4.2.0 @@ -9710,10 +9673,10 @@ snapshots: '@smithy/util-buffer-from': 4.2.0 tslib: 2.8.1 - '@smithy/util-waiter@4.2.3': + '@smithy/util-waiter@4.2.4': dependencies: - '@smithy/abort-controller': 4.2.3 - '@smithy/types': 4.8.0 + '@smithy/abort-controller': 4.2.4 + '@smithy/types': 4.8.1 tslib: 2.8.1 '@smithy/uuid@1.1.0': @@ -10153,10 +10116,6 @@ snapshots: '@types/har-format@1.2.16': {} - '@types/hast@2.3.10': - dependencies: - '@types/unist': 2.0.11 - '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 @@ -10187,6 +10146,8 @@ snapshots: '@types/pako@2.0.4': {} + '@types/prismjs@1.26.5': {} + '@types/react-dom@19.2.2(@types/react@19.2.2)': dependencies: '@types/react': 19.2.2 @@ -10390,54 +10351,54 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/expect@4.0.4': + '@vitest/expect@4.0.5': dependencies: '@standard-schema/spec': 1.0.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.0.4 - '@vitest/utils': 4.0.4 + '@vitest/spy': 4.0.5 + '@vitest/utils': 4.0.5 chai: 6.2.0 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.4(vite@7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))': + '@vitest/mocker@4.0.5(vite@7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))': dependencies: - '@vitest/spy': 4.0.4 + '@vitest/spy': 4.0.5 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: vite: 7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) - '@vitest/pretty-format@4.0.4': + '@vitest/pretty-format@4.0.5': dependencies: tinyrainbow: 3.0.3 - '@vitest/runner@4.0.4': + '@vitest/runner@4.0.5': dependencies: - '@vitest/utils': 4.0.4 + '@vitest/utils': 4.0.5 pathe: 2.0.3 - '@vitest/snapshot@4.0.4': + '@vitest/snapshot@4.0.5': dependencies: - '@vitest/pretty-format': 4.0.4 + '@vitest/pretty-format': 4.0.5 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.0.4': {} + '@vitest/spy@4.0.5': {} - '@vitest/ui@4.0.4(vitest@4.0.4)': + '@vitest/ui@4.0.5(vitest@4.0.5)': dependencies: - '@vitest/utils': 4.0.4 + '@vitest/utils': 4.0.5 fflate: 0.8.2 flatted: 3.3.3 pathe: 2.0.3 sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vitest: 4.0.4(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) + vitest: 4.0.5(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.5)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) - '@vitest/utils@4.0.4': + '@vitest/utils@4.0.5': dependencies: - '@vitest/pretty-format': 4.0.4 + '@vitest/pretty-format': 4.0.5 tinyrainbow: 3.0.3 '@vscode/markdown-it-katex@1.1.2': @@ -11206,7 +11167,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.8.20: {} + baseline-browser-mapping@2.8.21: {} binary-extensions@2.3.0: {} @@ -11248,10 +11209,10 @@ snapshots: browserslist@4.27.0: dependencies: - baseline-browser-mapping: 2.8.20 - caniuse-lite: 1.0.30001751 - electron-to-chromium: 1.5.242 - node-releases: 2.0.26 + baseline-browser-mapping: 2.8.21 + caniuse-lite: 1.0.30001752 + electron-to-chromium: 1.5.244 + node-releases: 2.0.27 update-browserslist-db: 1.1.4(browserslist@4.27.0) buffer-crc32@0.2.13: {} @@ -11301,7 +11262,7 @@ snapshots: camelcase@8.0.0: {} - caniuse-lite@1.0.30001751: {} + caniuse-lite@1.0.30001752: {} ccount@2.0.1: {} @@ -11318,19 +11279,13 @@ snapshots: character-entities-html4@2.1.0: {} - character-entities-legacy@1.1.4: {} - character-entities-legacy@3.0.0: {} - character-entities@1.2.4: {} - character-entities@2.0.2: {} - character-reference-invalid@1.1.4: {} - character-reference-invalid@2.0.1: {} - chardet@2.1.0: {} + chardet@2.1.1: {} cheerio-select@2.1.0: dependencies: @@ -11483,8 +11438,6 @@ snapshots: comctx@1.4.3: {} - comma-separated-tokens@1.0.8: {} - comma-separated-tokens@2.0.3: {} commander@11.1.0: {} @@ -11799,7 +11752,7 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 - dayjs@1.11.18: {} + dayjs@1.11.19: {} debounce@1.2.1: {} @@ -11941,7 +11894,7 @@ snapshots: '@noble/curves': 1.9.7 '@noble/hashes': 1.8.0 - electron-to-chromium@1.5.242: {} + electron-to-chromium@1.5.244: {} emoji-regex@10.6.0: {} @@ -12292,7 +12245,7 @@ snapshots: dependencies: '@babel/helper-validator-identifier': 7.28.5 '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) - '@eslint/plugin-kit': 0.4.0 + '@eslint/plugin-kit': 0.4.1 change-case: 5.4.4 ci-info: 4.3.1 clean-regexp: 1.0.0 @@ -12372,11 +12325,11 @@ snapshots: '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.21.1 - '@eslint/config-helpers': 0.4.1 + '@eslint/config-helpers': 0.4.2 '@eslint/core': 0.16.0 '@eslint/eslintrc': 3.3.1 '@eslint/js': 9.38.0 - '@eslint/plugin-kit': 0.4.0 + '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 @@ -12915,8 +12868,6 @@ snapshots: vfile-location: 5.0.3 web-namespaces: 2.0.1 - hast-util-parse-selector@2.2.5: {} - hast-util-parse-selector@4.0.0: dependencies: '@types/hast': 3.0.4 @@ -12991,14 +12942,6 @@ snapshots: dependencies: '@types/hast': 3.0.4 - hastscript@6.0.0: - dependencies: - '@types/hast': 2.3.10 - comma-separated-tokens: 1.0.8 - hast-util-parse-selector: 2.2.5 - property-information: 5.6.0 - space-separated-tokens: 1.1.5 - hastscript@9.0.1: dependencies: '@types/hast': 3.0.4 @@ -13135,15 +13078,8 @@ snapshots: is-relative: 1.0.0 is-windows: 1.0.2 - is-alphabetical@1.0.4: {} - is-alphabetical@2.0.1: {} - is-alphanumerical@1.0.4: - dependencies: - is-alphabetical: 1.0.4 - is-decimal: 1.0.4 - is-alphanumerical@2.0.1: dependencies: is-alphabetical: 2.0.1 @@ -13203,8 +13139,6 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-decimal@1.0.4: {} - is-decimal@2.0.1: {} is-docker@2.2.1: {} @@ -13235,8 +13169,6 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-hexadecimal@1.0.4: {} - is-hexadecimal@2.0.1: {} is-in-ci@1.0.0: {} @@ -13872,7 +13804,7 @@ snapshots: d3: 7.9.0 d3-sankey: 0.12.3 dagre-d3-es: 7.0.13 - dayjs: 1.11.18 + dayjs: 1.11.19 dompurify: 3.3.0 katex: 0.16.25 khroma: 2.1.0 @@ -14181,7 +14113,7 @@ snapshots: uuid: 8.3.2 which: 2.0.2 - node-releases@2.0.26: {} + node-releases@2.0.27: {} normalize-path@3.0.0: {} @@ -14325,15 +14257,6 @@ snapshots: dependencies: callsites: 3.1.0 - parse-entities@2.0.0: - dependencies: - character-entities: 1.2.4 - character-entities-legacy: 1.1.4 - character-reference-invalid: 1.1.4 - is-alphanumerical: 1.0.4 - is-decimal: 1.0.4 - is-hexadecimal: 1.0.4 - parse-entities@4.0.2: dependencies: '@types/unist': 2.0.11 @@ -14516,8 +14439,6 @@ snapshots: prettier@3.6.2: {} - prismjs@1.27.0: {} - prismjs@1.30.0: {} process-nextick-args@2.0.1: {} @@ -14534,10 +14455,6 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 - property-information@5.6.0: - dependencies: - xtend: 4.0.2 - property-information@6.5.0: {} property-information@7.1.0: {} @@ -14640,13 +14557,13 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 - react-router-dom@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + react-router-dom@7.9.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - react-router: 7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react-router: 7.9.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react-router@7.9.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + react-router@7.9.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: cookie: 1.0.2 react: 19.2.0 @@ -14662,7 +14579,7 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 - react-syntax-highlighter@15.6.6(react@19.2.0): + react-syntax-highlighter@16.1.0(react@19.2.0): dependencies: '@babel/runtime': 7.28.4 highlight.js: 10.7.3 @@ -14670,7 +14587,7 @@ snapshots: lowlight: 1.20.0 prismjs: 1.30.0 react: 19.2.0 - refractor: 3.6.0 + refractor: 5.0.0 react@19.2.0: {} @@ -14713,11 +14630,12 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 - refractor@3.6.0: + refractor@5.0.0: dependencies: - hastscript: 6.0.0 - parse-entities: 2.0.0 - prismjs: 1.27.0 + '@types/hast': 3.0.4 + '@types/prismjs': 1.26.5 + hastscript: 9.0.1 + parse-entities: 4.0.2 regexp-tree@0.1.27: {} @@ -15072,8 +14990,6 @@ snapshots: dependencies: whatwg-url: 7.1.0 - space-separated-tokens@1.1.5: {} - space-separated-tokens@2.0.2: {} sparkles@2.1.0: {} @@ -15783,15 +15699,15 @@ snapshots: terser: 5.44.0 yaml: 2.8.1 - vitest@4.0.4(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1): + vitest@4.0.5(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.5)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1): dependencies: - '@vitest/expect': 4.0.4 - '@vitest/mocker': 4.0.4(vite@7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)) - '@vitest/pretty-format': 4.0.4 - '@vitest/runner': 4.0.4 - '@vitest/snapshot': 4.0.4 - '@vitest/spy': 4.0.4 - '@vitest/utils': 4.0.4 + '@vitest/expect': 4.0.5 + '@vitest/mocker': 4.0.5(vite@7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)) + '@vitest/pretty-format': 4.0.5 + '@vitest/runner': 4.0.5 + '@vitest/snapshot': 4.0.5 + '@vitest/spy': 4.0.5 + '@vitest/utils': 4.0.5 debug: 4.4.3 es-module-lexer: 1.7.0 expect-type: 1.2.2 @@ -15808,7 +15724,7 @@ snapshots: optionalDependencies: '@types/debug': 4.1.12 '@types/node': 22.17.2 - '@vitest/ui': 4.0.4(vitest@4.0.4) + '@vitest/ui': 4.0.5(vitest@4.0.5) transitivePeerDependencies: - jiti - less @@ -16023,8 +15939,6 @@ snapshots: xmlhttprequest-ssl@2.1.2: {} - xtend@4.0.2: {} - y18n@5.0.8: {} yallist@3.1.1: {} From 961ecc18c532d7864bd0040b7b1b7eee9d8b987f Mon Sep 17 00:00:00 2001 From: Pham Ngoc Duong Date: Sat, 1 Nov 2025 14:29:18 +0700 Subject: [PATCH 05/85] refactor(pplx-ext): components positioning --- perplexity/extension/changelogs/2.7.10.md | 5 + .../extension/src/components/ui/use-toast.ts | 45 ++++-- .../options-page/playground/Playground.tsx | 104 ++------------ .../actions/internal-search-states.ts | 18 ++- .../_main-world/actions/thread-messages.ts | 13 +- .../dom-observers/thread/index.loader.ts | 17 --- .../dom-observers/thread/observers.ts | 26 ---- .../__core__/dom-observers/thread/store.ts | 3 - .../plugins/thread-artifacts/Artifacts.tsx | 38 +++-- .../components/ArtifactContent.tsx | 3 + .../components/ArtifactFooter.tsx | 2 +- .../components/ArtifactHeader.tsx | 2 +- .../components/ArtifactsList.tsx | 4 +- .../components/PreviewToggle.tsx | 4 +- .../src/plugins/thread-artifacts/consts.ts | 36 +++++ .../src/plugins/thread-artifacts/styles.css | 90 ++---------- .../src/plugins/thread-artifacts/types.ts | 3 + .../src/plugins/thread-artifacts/utils.ts | 16 +-- .../_main-world/trigger-rewrite-option.ts | 9 +- .../plugins/thread-export/ThreadExport.tsx | 14 -- .../thread-export/hide-open-in-app-btn.css | 4 - .../thread-export/index.remote-resources.ts | 11 -- .../src/plugins/thread-toc/ThreadToc.tsx | 18 ++- .../src/plugins/thread-toc/TocMenuToggle.tsx | 45 +++--- .../src/plugins/thread-toc/TocPanel.tsx | 134 +++++++++--------- .../src/plugins/thread-toc/index.manifest.ts | 2 +- .../thread-toc/index.remote-resources.ts | 11 ++ .../src/plugins/thread-toc/styles.css | 9 ++ .../plugins/thread-toc/usePanelPosition.ts | 50 ++----- .../dom-selectors/defaults.ts | 9 +- .../dom-selectors/types.ts | 4 +- 31 files changed, 315 insertions(+), 434 deletions(-) delete mode 100644 perplexity/extension/src/plugins/thread-export/hide-open-in-app-btn.css delete mode 100644 perplexity/extension/src/plugins/thread-export/index.remote-resources.ts create mode 100644 perplexity/extension/src/plugins/thread-toc/index.remote-resources.ts create mode 100644 perplexity/extension/src/plugins/thread-toc/styles.css diff --git a/perplexity/extension/changelogs/2.7.10.md b/perplexity/extension/changelogs/2.7.10.md index 6eb5c2b0e..ef7ad7877 100644 --- a/perplexity/extension/changelogs/2.7.10.md +++ b/perplexity/extension/changelogs/2.7.10.md @@ -1,3 +1,8 @@ +## Improvements + +- `Thread ToC`: Slightly increase the panel width +- `Artifacts`: Improve positioning & automatically unpin the sidebar when the artifacts panel is opened + ## Bug Fixes - `Thread Export`: Fixed an issue with download on long threads diff --git a/perplexity/extension/src/components/ui/use-toast.ts b/perplexity/extension/src/components/ui/use-toast.ts index 2d1e83751..c4f6ffb73 100644 --- a/perplexity/extension/src/components/ui/use-toast.ts +++ b/perplexity/extension/src/components/ui/use-toast.ts @@ -155,17 +155,42 @@ export function toast({ ...props }: Toast) { dispatch({ type: "DISMISS_TOAST", toastId: id }); } - dispatch({ - type: "ADD_TOAST", - toast: { - ...props, - id, - open: true, - onOpenChange: function (open) { - if (!open) dismiss(); + // Check if adding this toast would exceed the limit + const currentToastCount = memoryState.toasts.length; + if (currentToastCount >= TOAST_LIMIT) { + // Dismiss the oldest toast first + const oldestToast = memoryState.toasts[memoryState.toasts.length - 1]; + if (oldestToast) { + dispatch({ type: "DISMISS_TOAST", toastId: oldestToast.id }); + } + + // Delay adding the new toast to allow the old one to start sliding out + setTimeout(function () { + dispatch({ + type: "ADD_TOAST", + toast: { + ...props, + id, + open: true, + onOpenChange: function (open) { + if (!open) dismiss(); + }, + }, + }); + }, 150); // Small delay to allow slide-out animation to start + } else { + dispatch({ + type: "ADD_TOAST", + toast: { + ...props, + id, + open: true, + onOpenChange: function (open) { + if (!open) dismiss(); + }, }, - }, - }); + }); + } return { id: id, diff --git a/perplexity/extension/src/entrypoints/options-page/playground/Playground.tsx b/perplexity/extension/src/entrypoints/options-page/playground/Playground.tsx index 8579d13c1..75b4fa2ff 100644 --- a/perplexity/extension/src/entrypoints/options-page/playground/Playground.tsx +++ b/perplexity/extension/src/entrypoints/options-page/playground/Playground.tsx @@ -1,100 +1,22 @@ -import { useStore } from "zustand"; -import { createStore, type StoreApi } from "zustand/vanilla"; +import { toast } from "@/components/ui/use-toast"; -type CountStore = { - count: number; - increment: () => void; - decrement: () => void; - reset: () => void; -}; - -const CounterContext = createContext | null>(null); - -function CounterDisplay() { - const countStore = useContext(CounterContext); - if (!countStore) - throw new Error("CounterDisplay must be used within CounterProvider"); - const { count } = useStore(countStore); - - return ( -
- Count: - {count} -
- ); -} - -function CounterControls() { - const countStore = useContext(CounterContext); - if (!countStore) - throw new Error("CounterControls must be used within CounterProvider"); - const { increment, decrement } = useStore(countStore); - - return ( -
- - -
- ); -} - -function CounterReset() { - const countStore = useContext(CounterContext); - if (!countStore) - throw new Error("CounterReset must be used within CounterProvider"); - const { reset, count } = useStore(countStore); +export function Playground() { + const [count, setCount] = useState(0); return ( -
+
); } - -function Counter() { - const [countStore] = useState(() => - createStore((set) => ({ - count: 0, - increment: () => - set((state: { count: number }) => ({ count: state.count + 1 })), - decrement: () => - set((state: { count: number }) => ({ count: state.count - 1 })), - reset: () => set({ count: 0 }), - })), - ); - - return ( - -
- - - -
-
- ); -} - -export function Playground() { - return ( -
- - -
- ); -} diff --git a/perplexity/extension/src/plugins/__core__/dom-observers/_main-world/actions/internal-search-states.ts b/perplexity/extension/src/plugins/__core__/dom-observers/_main-world/actions/internal-search-states.ts index 0e73f05e2..3937bb542 100644 --- a/perplexity/extension/src/plugins/__core__/dom-observers/_main-world/actions/internal-search-states.ts +++ b/perplexity/extension/src/plugins/__core__/dom-observers/_main-world/actions/internal-search-states.ts @@ -1,5 +1,6 @@ -import deepClone from "lodash/cloneDeep"; +import cloneDeep from "lodash/cloneDeep"; +import { APP_CONFIG } from "@/app.config"; import FiberSearchService from "@/plugins/__core__/_main-world/fiber-search"; import { localInternalSearchStatesStatesFiberPath, @@ -9,6 +10,7 @@ import type { InternalSearchStatesObserverStoreType, SearchStates, } from "@/plugins/__core__/dom-observers/internal-search-states/store"; +import { DomSelectorsService } from "@/plugins/__core__/dom-selectors/service-init.loader"; import { walkFiberNode } from "@/utils/wrappers/react-fiber"; export async function setInternalSearchStates({ @@ -20,7 +22,7 @@ export async function setInternalSearchStates({ remoteValidationFiberPath?: string[]; remoteStatesFiberPath?: string[]; }): Promise { - const statesFiberNode = getStatesNodePath({ + const statesFiberNode = await getStatesNodePath({ remoteStatesFiberPath, remoteValidationFiberPath, }); @@ -49,7 +51,7 @@ export async function getInternalSearchStates({ remoteValidationFiberPath?: string[]; remoteStatesFiberPath?: string[]; }): Promise { - const statesFiberNode = getStatesNodePath({ + const statesFiberNode = await getStatesNodePath({ remoteStatesFiberPath, remoteValidationFiberPath, }); @@ -57,13 +59,13 @@ export async function getInternalSearchStates({ if (statesFiberNode == null) return null; return { - sources: deepClone(statesFiberNode.sources) ?? [], + sources: cloneDeep(statesFiberNode.sources) ?? [], model: statesFiberNode.configuredModel ?? null, searchMode: statesFiberNode.configuredSearchMode ?? "search", }; } -function getStatesNodePath({ +async function getStatesNodePath({ remoteStatesFiberPath, remoteValidationFiberPath, }: { @@ -83,12 +85,16 @@ function getStatesNodePath({ }, }, { - rootElementSelector: "#root", + rootElementSelector: (await DomSelectorsService.Instance.getCache()).ROOT, maxDepth: 100, }, ); if (fiberNode == null) { + if (APP_CONFIG.IS_DEV) { + console.error("❌ [InternalSearchStates] States fiber node not found"); + } + return null; } diff --git a/perplexity/extension/src/plugins/__core__/dom-observers/_main-world/actions/thread-messages.ts b/perplexity/extension/src/plugins/__core__/dom-observers/_main-world/actions/thread-messages.ts index 2e9364e36..ace29caa7 100644 --- a/perplexity/extension/src/plugins/__core__/dom-observers/_main-world/actions/thread-messages.ts +++ b/perplexity/extension/src/plugins/__core__/dom-observers/_main-world/actions/thread-messages.ts @@ -1,5 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ +import { APP_CONFIG } from "@/app.config"; import FiberSearchService from "@/plugins/__core__/_main-world/fiber-search"; import type { PplxWebResult } from "@/plugins/__core__/pplx-thread-export"; import type { LanguageModelCode } from "@/services/externals/cplx-api/remote-resources/pplx-language-models/types"; @@ -25,7 +26,7 @@ export async function getThreadMessages({ messageNodePath: string[]; }; }): Promise { - return FiberSearchService.findFiberNodes( + const fiberNodes = FiberSearchService.findFiberNodes( { name: fiberConfig.name, }, @@ -39,7 +40,15 @@ export async function getThreadMessages({ expectSameDepth: true, cache: false, }, - ).map((entryNode: any): MessageBlockFiberData => { + ); + + if (fiberNodes.length === 0) { + if (APP_CONFIG.IS_DEV) { + console.error("❌ [ThreadMessages] No fiber nodes found"); + } + } + + return fiberNodes.map((entryNode: any): MessageBlockFiberData => { const entry = JSON.parse( JSON.stringify(walkFiberNode(entryNode, fiberConfig.messageNodePath)), ); diff --git a/perplexity/extension/src/plugins/__core__/dom-observers/thread/index.loader.ts b/perplexity/extension/src/plugins/__core__/dom-observers/thread/index.loader.ts index 46c311d5d..d8dc13ba2 100644 --- a/perplexity/extension/src/plugins/__core__/dom-observers/thread/index.loader.ts +++ b/perplexity/extension/src/plugins/__core__/dom-observers/thread/index.loader.ts @@ -5,12 +5,10 @@ import { observeNavbarOverflowMenuButtonWrapper, observeNavbar, observeWrapper, - observePageWrapper, observeMessageBlocksWrapper, } from "@/plugins/__core__/dom-observers/thread/observers"; import { threadDomObserverStore } from "@/plugins/__core__/dom-observers/thread/store"; import { createDomObserverId } from "@/plugins/__core__/dom-observers/types"; -import { DomSelectorsService } from "@/plugins/__core__/dom-selectors/service-init.loader"; import { whereAmI } from "@/utils/misc/utils"; declare module "@/plugins/__async-deps__/async-loaders" { @@ -46,7 +44,6 @@ export default function () { } function cleanup() { - domObserverService.unsubscribe(createDomObserverId("thread", "pageWrapper")); domObserverService.unsubscribe(createDomObserverId("thread", "navbar")); domObserverService.unsubscribe( createDomObserverId("thread", "navbarOverflowMenuButton"), @@ -61,10 +58,6 @@ function observeThread(location: ReturnType) { cleanup(); if (location === "thread") { - observePageWrapper({ - observerId: createDomObserverId("thread", "pageWrapper"), - }); - observeNavbar({ observerId: createDomObserverId("thread", "navbar"), }); @@ -81,10 +74,6 @@ function observeThread(location: ReturnType) { observerId: createDomObserverId("thread", "messageBlocksWrapper"), }); } else if (location === "comet_assistant") { - observePageWrapper({ - observerId: createDomObserverId("thread", "pageWrapper"), - }); - observeWrapper({ observerId: createDomObserverId("thread", "wrapper"), }); @@ -94,11 +83,5 @@ function observeThread(location: ReturnType) { }); } else { threadDomObserverStore.getState().resetStore(); - - $( - DomSelectorsService.Root.cplxAttribute( - DomSelectorsService.Root.internalAttributes.THREAD.PAGE_WRAPPER, - ), - ).internalComponentAttr(null); } } diff --git a/perplexity/extension/src/plugins/__core__/dom-observers/thread/observers.ts b/perplexity/extension/src/plugins/__core__/dom-observers/thread/observers.ts index c4d1aa9ac..2172b1943 100644 --- a/perplexity/extension/src/plugins/__core__/dom-observers/thread/observers.ts +++ b/perplexity/extension/src/plugins/__core__/dom-observers/thread/observers.ts @@ -3,32 +3,6 @@ import { domObserverService } from "@/plugins/__core__/dom-observers"; import { threadDomObserverStore } from "@/plugins/__core__/dom-observers/thread/store"; import { DomSelectorsService } from "@/plugins/__core__/dom-selectors/service-init.loader"; -export function observePageWrapper({ observerId }: { observerId: string }) { - return domObserverService.subscribe({ - id: observerId, - selector: DomSelectorsService.Root.cachedSync.THREAD.PAGE_WRAPPER, - onAdd: (node) => { - const $pageWrapper = $(node as HTMLElement); - - if (!$pageWrapper.length) return; - - $pageWrapper.internalComponentAttr( - DomSelectorsService.Root.internalAttributes.THREAD.PAGE_WRAPPER, - ); - - threadDomObserverStore.setState({ - $pageWrapper, - }); - }, - onRemove: () => { - threadDomObserverStore.setState({ - $pageWrapper: null, - }); - }, - existingCheck: true, - }); -} - export function observeNavbar({ observerId }: { observerId: string }) { return domObserverService.subscribe({ id: observerId, diff --git a/perplexity/extension/src/plugins/__core__/dom-observers/thread/store.ts b/perplexity/extension/src/plugins/__core__/dom-observers/thread/store.ts index 7f0382ddd..e3b32f16f 100644 --- a/perplexity/extension/src/plugins/__core__/dom-observers/thread/store.ts +++ b/perplexity/extension/src/plugins/__core__/dom-observers/thread/store.ts @@ -3,7 +3,6 @@ import { immer } from "zustand/middleware/immer"; import { createWithEqualityFn } from "zustand/traditional"; type ThreadDomObserverStoreType = { - $pageWrapper: JQuery | null; $navbar: JQuery | null; $overflowMenuButtonWrapper: JQuery | null; $wrapper: JQuery | null; @@ -22,7 +21,6 @@ export const threadDomObserverStore = $navbar: null, $overflowMenuButtonWrapper: null, $wrapper: null, - $pageWrapper: null, $messageBlocksWrapper: null, states: { isInFlight: false, @@ -32,7 +30,6 @@ export const threadDomObserverStore = $navbar: null, $overflowMenuButtonWrapper: null, $wrapper: null, - $pageWrapper: null, $messageBlocksWrapper: null, states: { isInFlight: false, diff --git a/perplexity/extension/src/plugins/thread-artifacts/Artifacts.tsx b/perplexity/extension/src/plugins/thread-artifacts/Artifacts.tsx index fd2ada4ca..01b257756 100644 --- a/perplexity/extension/src/plugins/thread-artifacts/Artifacts.tsx +++ b/perplexity/extension/src/plugins/thread-artifacts/Artifacts.tsx @@ -2,7 +2,7 @@ import { Portal } from "@/components/ui/portal"; import { useInsertCss } from "@/hooks/useInsertCss"; import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; import useThreadCodeBlock from "@/plugins/__core__/dom-observers/thread/code-blocks/hooks/useThreadCodeBlock"; -import { useThreadDomObserverStore } from "@/plugins/__core__/dom-observers/thread/store"; +import { DomSelectorsService } from "@/plugins/__core__/dom-selectors/service-init.loader"; import ArtifactContent from "@/plugins/thread-artifacts/components/ArtifactContent"; import ArtifactFooter from "@/plugins/thread-artifacts/components/ArtifactFooter"; import ArtifactHeader from "@/plugins/thread-artifacts/components/ArtifactHeader"; @@ -12,6 +12,7 @@ import { useArtifactsStore } from "@/plugins/thread-artifacts/store"; import { useHandleArtifactsState } from "@/plugins/thread-artifacts/useHandleArtifactsState"; import useHandleAutonomousArtifactsState from "@/plugins/thread-artifacts/useHandleAutonomousArtifactsState"; import { getVersionedRemoteResource } from "@/services/externals/cplx-api/versioned-remote-resources/utils"; +import { getCookie } from "@/utils/dom-utils/generics"; const normalizeCss = await getVersionedRemoteResource( normalizeCssResourceConfig, @@ -19,10 +20,7 @@ const normalizeCss = await getVersionedRemoteResource( ); export function Artifacts() { - const threadWrapper = useThreadDomObserverStore( - (state) => state.$wrapper?.[0], - deepEqual, - ); + const root = document.querySelector(DomSelectorsService.Root.cachedSync.ROOT); useHandleArtifactsState(); useHandleAutonomousArtifactsState(); @@ -58,18 +56,28 @@ export function Artifacts() { ); }, [isArtifactOpen, isArtifactsListOpen]); - if (!threadWrapper || (!isArtifactOpen && !isArtifactsListOpen)) return null; + useEffect(() => { + if (isArtifactOpen && getCookie("isSidebarPinned") === "true") { + const $pinSidebarButton = $( + DomSelectorsService.Root.cachedSync.SIDEBAR.PIN_SIDEBAR_BUTTON, + ); + + if (!$pinSidebarButton.length) return; + + $pinSidebarButton.trigger("click"); + } + }, [isArtifactOpen]); + + if ( + !root || + !(root instanceof HTMLElement) || + (!isArtifactOpen && !isArtifactsListOpen) + ) + return null; return ( - -
+ +
{isArtifactsListOpen && } {isArtifactOpen && selectedCodeBlock != null && (
diff --git a/perplexity/extension/src/plugins/thread-artifacts/components/ArtifactContent.tsx b/perplexity/extension/src/plugins/thread-artifacts/components/ArtifactContent.tsx index 0eff638c4..0ae0f9fd2 100644 --- a/perplexity/extension/src/plugins/thread-artifacts/components/ArtifactContent.tsx +++ b/perplexity/extension/src/plugins/thread-artifacts/components/ArtifactContent.tsx @@ -20,6 +20,9 @@ export default function ArtifactContent() { const language = getInterpretedArtifactLanguage( selectedCodeBlock?.content.language ?? "text", ); + + console.log(language, selectedCodeBlock?.content.language); + const previewKey = useArtifactsStore((state) => state.refreshPreviewKey); const isValidArtifactCode = useArtifactsStore( (state) => state.isValidArtifactCode, diff --git a/perplexity/extension/src/plugins/thread-artifacts/components/ArtifactFooter.tsx b/perplexity/extension/src/plugins/thread-artifacts/components/ArtifactFooter.tsx index 31151afa6..f57f196aa 100644 --- a/perplexity/extension/src/plugins/thread-artifacts/components/ArtifactFooter.tsx +++ b/perplexity/extension/src/plugins/thread-artifacts/components/ArtifactFooter.tsx @@ -22,7 +22,7 @@ export default function ArtifactFooter() { ) as ArtifactLanguage; return ( -
+
{ARTIFACT_LANGUAGE_ACTION_BUTTONS[language] && diff --git a/perplexity/extension/src/plugins/thread-artifacts/components/ArtifactHeader.tsx b/perplexity/extension/src/plugins/thread-artifacts/components/ArtifactHeader.tsx index 54e575058..1ddd687d0 100644 --- a/perplexity/extension/src/plugins/thread-artifacts/components/ArtifactHeader.tsx +++ b/perplexity/extension/src/plugins/thread-artifacts/components/ArtifactHeader.tsx @@ -49,7 +49,7 @@ export default function ArtifactHeader() { if (!isArtifactLanguage && !isAutonomousArtifactLanguage) return null; return ( -
+
{ diff --git a/perplexity/extension/src/plugins/thread-artifacts/components/ArtifactsList.tsx b/perplexity/extension/src/plugins/thread-artifacts/components/ArtifactsList.tsx index eaa2a6197..fe4f1ea95 100644 --- a/perplexity/extension/src/plugins/thread-artifacts/components/ArtifactsList.tsx +++ b/perplexity/extension/src/plugins/thread-artifacts/components/ArtifactsList.tsx @@ -60,12 +60,12 @@ export default function ArtifactsList() { ) : ( <> - + {description} {count > 1 && ( - + {t("plugin-artifacts.list.versions", { count })} )} diff --git a/perplexity/extension/src/plugins/thread-artifacts/components/PreviewToggle.tsx b/perplexity/extension/src/plugins/thread-artifacts/components/PreviewToggle.tsx index 7af847a40..1172530c9 100644 --- a/perplexity/extension/src/plugins/thread-artifacts/components/PreviewToggle.tsx +++ b/perplexity/extension/src/plugins/thread-artifacts/components/PreviewToggle.tsx @@ -18,7 +18,7 @@ export default function PreviewToggle({ onClick={() => setState(state === "code" ? "preview" : "code")} >
= { react: "code", plantuml: "code", markmap: "preview", + svg: "preview", + md: "preview", + mmd: "preview", }; type ArtifactPlaceholders = Record< @@ -70,6 +73,9 @@ AsyncLoaderRegistry.register({ react: t("plugin-artifacts.toggle.preview"), plantuml: t("plugin-artifacts.toggle.preview"), markmap: t("plugin-artifacts.toggle.preview"), + svg: t("plugin-artifacts.toggle.preview"), + md: t("plugin-artifacts.toggle.preview"), + mmd: t("plugin-artifacts.toggle.preview"), }; ARTIFACTS_LANGUAGE_RAW_TOGGLE_TEXT = { @@ -79,9 +85,19 @@ AsyncLoaderRegistry.register({ react: t("plugin-artifacts.toggle.code"), plantuml: t("plugin-artifacts.toggle.code"), markmap: t("plugin-artifacts.toggle.code"), + svg: t("plugin-artifacts.toggle.code"), + md: t("plugin-artifacts.toggle.code"), + mmd: t("plugin-artifacts.toggle.code"), }; ARTIFACT_PLACEHOLDERS = { + md: { + icon: StashArticle, + defaultTitle: "Markdown", + description: t("plugin-artifacts.placeholder.description", { + name: "markdown", + }), + }, markdown: { icon: StashArticle, defaultTitle: "Markdown", @@ -89,6 +105,13 @@ AsyncLoaderRegistry.register({ name: "markdown", }), }, + mmd: { + icon: TreeOutlineRounded, + defaultTitle: "Mermaid", + description: t("plugin-artifacts.placeholder.description", { + name: "mermaid", + }), + }, mermaid: { icon: TreeOutlineRounded, defaultTitle: "Mermaid", @@ -103,6 +126,13 @@ AsyncLoaderRegistry.register({ name: "html", }), }, + svg: { + icon: MdiXml, + defaultTitle: "SVG", + description: t("plugin-artifacts.placeholder.description", { + name: "html", + }), + }, react: { icon: TablerBrandReact, defaultTitle: "React", @@ -129,9 +159,12 @@ AsyncLoaderRegistry.register({ }); export const ARTIFACT_RENDERERS: Record = { + mmd: MermaidRenderer, mermaid: MermaidRenderer, + md: MarkdownRenderer, markdown: MarkdownRenderer, html: HtmlRenderer, + svg: HtmlRenderer, react: ReactRenderer, plantuml: PlantUmlRenderer, markmap: MarkmapRenderer, @@ -141,9 +174,12 @@ export const ARTIFACT_LANGUAGE_ACTION_BUTTONS: Record< ArtifactLanguage, ComponentType | null > = { + mmd: null, mermaid: MermaidArtifactsActionButtonsWrapper, html: null, + svg: null, react: null, + md: null, markdown: null, plantuml: PlantUmlArtifactsActionButtonsWrapper, markmap: MarkmapArtifactsActionButtonsWrapper, diff --git a/perplexity/extension/src/plugins/thread-artifacts/styles.css b/perplexity/extension/src/plugins/thread-artifacts/styles.css index 11e0246c3..d043320d0 100644 --- a/perplexity/extension/src/plugins/thread-artifacts/styles.css +++ b/perplexity/extension/src/plugins/thread-artifacts/styles.css @@ -1,90 +1,28 @@ @reference "../../assets/index.css"; -body { - &[data-cplx-artifact-active-panel] { - /* Hide bottom bar buttons' labels */ - [data-cplx-component="message-block-footer"] - div - + .relative.truncate.text-center.px-1.leading-loose.-mb-px { - display: none; - } +#root { + @apply x:flex; - /* the "Help" floating button */ - .bottom-md.right-md.m-sm.fixed.hidden.lg\:block { - display: none; - } - - [data-cplx-component="thread-wrapper"] { - display: flex; - justify-content: center; - isolation: isolate; - min-height: 100vh; - height: max-content; - } + & > .border-subtlest.ring-subtlest.divide-subtlest.bg-underlay { + @apply x:flex-1; } - &[data-cplx-artifact-active-panel="artifact"] - [data-cplx-component="thread-wrapper"] { - > :first-child { - @apply x:md:min-w-[500px]; - @apply x:xl:w-[500px]; - } + /* hide the query to prevent navbar overflow */ + [data-cplx-component="thread-navbar"] .max-w-\[300px\] { + @apply x:hidden; } - .max-w-threadContentWidth.mx-auto .bg-base.bg-offset { - box-shadow: none !important; + #cplx-artifact { + @apply x:absolute x:top-(--header-height) x:right-4 x:size-full x:max-h-[calc(100dvh-12rem)] x:max-w-3/4 x:overflow-y-auto x:rounded-xl x:border x:border-border/50 x:bg-secondary x:xl:static x:xl:h-auto x:xl:max-h-none x:xl:w-full x:xl:max-w-none x:xl:flex-1/3 x:xl:rounded-none; } } -body { - &:is( - [data-cplx-artifact-active-panel="artifact"], - [data-cplx-artifact-active-panel="list"] - ) - [data-cplx-component="thread-wrapper"] - + div { - .w-full, - .relative { - & > .bg-base { - @apply x:xl:shadow-none; - } - } - } - - &[data-cplx-artifact-active-panel="artifact"] - [data-cplx-component="thread-wrapper"] { - padding-bottom: 0; - - & + div { - @apply x:xl:max-w-[500px]; - } - - #cplx-artifact { - height: calc(100dvh - var(--header-height, 54px) - 12rem); - @apply x:xl:h-[calc(100dvh-var(--header-height,54px))]; - @apply x:rounded-lg x:xl:rounded-none x:xl:rounded-tl-lg; - @apply x:xl:border-r-0 x:xl:border-b-0; - - &[data-open] { - @apply x:w-[75vw] x:xl:w-[200%]; - } - } - } - - &[data-cplx-artifact-active-panel="list"] { - #cplx-artifact { - height: calc(100dvh - var(--header-height, 54px) - 12rem); - @apply x:rounded-lg; - - &[data-open] { - @apply x:w-[30vw] x:xl:w-[20%] x:xl:min-w-[400px]; - } - } +body[data-cplx-artifact-active-panel="list"] { + #root > .border-subtlest.ring-subtlest.divide-subtlest.bg-underlay { + @apply x:xl:flex-1/2; } -} -:root[data-erp="tab"] - body[data-cplx-artifact-active-panel="artifact"] #cplx-artifact { - @apply x:xl:h-[calc(100dvh-var(--header-height,54px))]; + @apply x:max-w-1/2 x:xl:flex-1; + } } diff --git a/perplexity/extension/src/plugins/thread-artifacts/types.ts b/perplexity/extension/src/plugins/thread-artifacts/types.ts index 0a9e3b442..12931ae72 100644 --- a/perplexity/extension/src/plugins/thread-artifacts/types.ts +++ b/perplexity/extension/src/plugins/thread-artifacts/types.ts @@ -3,6 +3,9 @@ export const ARTIFACT_LANGUAGES = { mermaid: "mermaid", markmap: "markmap", html: "html", + svg: "html", + md: "markdown", + mmd: "mermaid", react: "react", plantuml: "plantuml", } as const satisfies Partial>; diff --git a/perplexity/extension/src/plugins/thread-artifacts/utils.ts b/perplexity/extension/src/plugins/thread-artifacts/utils.ts index 80d543b61..c375ba111 100644 --- a/perplexity/extension/src/plugins/thread-artifacts/utils.ts +++ b/perplexity/extension/src/plugins/thread-artifacts/utils.ts @@ -3,24 +3,12 @@ import { type ArtifactLanguage, } from "@/plugins/thread-artifacts/types"; -export const ARTIFACT_INTERPRETED_LANGUAGES: Record = - { - svg: "html", - md: "markdown", - mmd: "mermaid", - plantuml: "plantuml", - markmap: "markmap", - }; - export const isArtifactLanguageString = ( languageString: string | null | undefined, ): languageString is ArtifactLanguage => { if (languageString == null) return false; - return ( - languageString in ARTIFACT_LANGUAGES || - languageString in ARTIFACT_INTERPRETED_LANGUAGES - ); + return languageString in ARTIFACT_LANGUAGES; }; export const isAutonomousArtifactLanguageString = ( @@ -45,7 +33,7 @@ export const getInterpretedArtifactLanguage = ( languageString: string, ): ArtifactLanguage | undefined => { if (isArtifactLanguageString(languageString)) - return ARTIFACT_INTERPRETED_LANGUAGES[languageString]; + return ARTIFACT_LANGUAGES[languageString]; if (isAutonomousArtifactLanguageString(languageString)) return languageString.split(":")[1] as ArtifactLanguage; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_main-world/trigger-rewrite-option.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_main-world/trigger-rewrite-option.ts index 85b1df1fa..8f64f1025 100644 --- a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_main-world/trigger-rewrite-option.ts +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_main-world/trigger-rewrite-option.ts @@ -1,3 +1,4 @@ +import { APP_CONFIG } from "@/app.config"; import FiberSearchService from "@/plugins/__core__/_main-world/fiber-search"; import { DomSelectorsService } from "@/plugins/__core__/dom-selectors/service-init.loader"; import { DomSelectorsServiceImpl } from "@/services/externals/cplx-api/versioned-remote-resources/dom-selectors"; @@ -32,7 +33,13 @@ export async function triggerRewriteOption(params: { }, ); - if (fiberNode == null) return false; + if (fiberNode == null) { + if (APP_CONFIG.IS_DEV) { + console.error("❌ [TriggerRewriteOption] No fiber node found"); + } + + return false; + } const [triggerRewriteOptionHandler] = tryCatch( () => diff --git a/perplexity/extension/src/plugins/thread-export/ThreadExport.tsx b/perplexity/extension/src/plugins/thread-export/ThreadExport.tsx index 3a4aba18f..3fcf30003 100644 --- a/perplexity/extension/src/plugins/thread-export/ThreadExport.tsx +++ b/perplexity/extension/src/plugins/thread-export/ThreadExport.tsx @@ -1,24 +1,10 @@ import { Portal } from "@/components/ui/portal"; -import { useInsertCss } from "@/hooks/useInsertCss"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; import ExportMenu from "@/plugins/thread-export/ExportMenu"; -import { hideOpenInAppBtnCssResourceConfig } from "@/plugins/thread-export/index.remote-resources"; import useCreatePortalContainer from "@/plugins/thread-export/useCreatePortalContainer"; -import { getVersionedRemoteResource } from "@/services/externals/cplx-api/versioned-remote-resources/utils"; - -const hideOpenInAppBtnCss = await getVersionedRemoteResource( - hideOpenInAppBtnCssResourceConfig, - persistentQueryClient, -); export function ThreadExport() { const portalContainer = useCreatePortalContainer(); - useInsertCss({ - id: "hide-open-in-app-btn", - css: hideOpenInAppBtnCss, - }); - return ( diff --git a/perplexity/extension/src/plugins/thread-export/hide-open-in-app-btn.css b/perplexity/extension/src/plugins/thread-export/hide-open-in-app-btn.css deleted file mode 100644 index 29f22e0ca..000000000 --- a/perplexity/extension/src/plugins/thread-export/hide-open-in-app-btn.css +++ /dev/null @@ -1,4 +0,0 @@ -[data-cplx-component="thread-navbar"] a[role="button"][href*="https://perplexity.sng"] -{ - display: none; -} diff --git a/perplexity/extension/src/plugins/thread-export/index.remote-resources.ts b/perplexity/extension/src/plugins/thread-export/index.remote-resources.ts deleted file mode 100644 index 06d6e12ba..000000000 --- a/perplexity/extension/src/plugins/thread-export/index.remote-resources.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { z } from "zod"; - -import hideOpenInAppBtnCss from "@/plugins/thread-export/hide-open-in-app-btn.css?inline"; -import { defineVersionedRemoteResource } from "@/services/externals/cplx-api/versioned-remote-resources"; - -export const hideOpenInAppBtnCssResourceConfig = defineVersionedRemoteResource({ - name: "plugin.exportThread.hideOpenInAppBtnCss", - type: "css", - fallback: hideOpenInAppBtnCss, - zodSchema: z.string(), -}); diff --git a/perplexity/extension/src/plugins/thread-toc/ThreadToc.tsx b/perplexity/extension/src/plugins/thread-toc/ThreadToc.tsx index 61923ee33..9d0ded061 100644 --- a/perplexity/extension/src/plugins/thread-toc/ThreadToc.tsx +++ b/perplexity/extension/src/plugins/thread-toc/ThreadToc.tsx @@ -1,11 +1,18 @@ -import React from "react"; - +import { useInsertCss } from "@/hooks/useInsertCss"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; import { useThreadDomObserverStore } from "@/plugins/__core__/dom-observers/thread/store"; +import { threadTocCssResourceConfig } from "@/plugins/thread-toc/index.remote-resources"; import { TocMenuToggle } from "@/plugins/thread-toc/TocMenuToggle"; import { TocPanel } from "@/plugins/thread-toc/TocPanel"; import { useHandleTouch } from "@/plugins/thread-toc/useHandleTouch"; import { usePanelPosition } from "@/plugins/thread-toc/usePanelPosition"; import { useThreadTocItems } from "@/plugins/thread-toc/useThreadTocItems"; +import { getVersionedRemoteResource } from "@/services/externals/cplx-api/versioned-remote-resources/utils"; + +const threadTocCss = await getVersionedRemoteResource( + threadTocCssResourceConfig, + persistentQueryClient, +); export function ThreadToc() { const [isOpen, setIsOpen] = useState(false); @@ -23,6 +30,11 @@ export function ThreadToc() { tocItems, }); + useInsertCss({ + id: "thread-toc", + css: threadTocCss, + }); + useHandleTouch({ containerRef, isOpen, @@ -36,14 +48,12 @@ export function ThreadToc() { return ( <> setIsOpen(true)} /> void; }; export function TocMenuToggle({ - top, isOpen, isFloating, onToggleOpen, }: TocMenuToggleProps) { + const threadWrapper = useThreadDomObserverStore( + (store) => store.$wrapper?.[0], + deepEqual, + ); + return ( - -
- -
-
+ + +
+ +
+
+
); } diff --git a/perplexity/extension/src/plugins/thread-toc/TocPanel.tsx b/perplexity/extension/src/plugins/thread-toc/TocPanel.tsx index 84a4267b0..88210d566 100644 --- a/perplexity/extension/src/plugins/thread-toc/TocPanel.tsx +++ b/perplexity/extension/src/plugins/thread-toc/TocPanel.tsx @@ -1,5 +1,7 @@ import React, { Activity } from "react"; +import { Portal } from "@/components/ui/portal"; +import { useThreadDomObserverStore } from "@/plugins/__core__/dom-observers/thread/store"; import { DomSelectorsService } from "@/plugins/__core__/dom-selectors/service-init.loader"; import TocItem from "@/plugins/thread-toc/TocItem"; import { PANEL_WIDTH } from "@/plugins/thread-toc/usePanelPosition"; @@ -11,7 +13,6 @@ import TablerX from "~icons/tabler/x"; type TocPanelProps = { containerRef: React.RefObject; - top: number; left: number; isOpen: boolean; isFloating: boolean; @@ -21,80 +22,85 @@ type TocPanelProps = { export function TocPanel({ containerRef, - top, left, isOpen, isFloating, tocItems, onToggleClosed, }: TocPanelProps) { + const threadWrapper = useThreadDomObserverStore( + (store) => store.$wrapper?.[0], + deepEqual, + ); + return ( - -
- {isFloating && ( -
- -
- )} + +
- {tocItems.map((item, idx) => ( - { - const $element = $( - `${DomSelectorsService.Root.cplxAttribute( - DomSelectorsService.Root.internalAttributes.THREAD.MESSAGE - .BLOCK, - )}[data-index="${item.id}"]`, - ); - if ($element.length) scrollToElement($element, 0, 300); - }} - onContextMenu={() => { - const $element = $( - `${DomSelectorsService.Root.cplxAttribute( - DomSelectorsService.Root.internalAttributes.THREAD.MESSAGE - .BLOCK, - )}[data-index="${item.id}"]`, - ); - if ($element.length && $element.height() != null) - scrollToElement( - $element, - $element.height()! - window.innerHeight / 2, - 300, + {isFloating && ( +
+ +
+ )} +
+ {tocItems.map((item, idx) => ( + { + const $element = $( + `${DomSelectorsService.Root.cplxAttribute( + DomSelectorsService.Root.internalAttributes.THREAD.MESSAGE + .BLOCK, + )}[data-index="${item.id}"]`, ); - }} - /> - ))} + if ($element.length) scrollToElement($element, 0, 300); + }} + onContextMenu={() => { + const $element = $( + `${DomSelectorsService.Root.cplxAttribute( + DomSelectorsService.Root.internalAttributes.THREAD.MESSAGE + .BLOCK, + )}[data-index="${item.id}"]`, + ); + if ($element.length && $element.height() != null) + scrollToElement( + $element, + $element.height()! - window.innerHeight / 2, + 300, + ); + }} + /> + ))} +
-
-
+ +
); } diff --git a/perplexity/extension/src/plugins/thread-toc/index.manifest.ts b/perplexity/extension/src/plugins/thread-toc/index.manifest.ts index 6338def58..de1086f76 100644 --- a/perplexity/extension/src/plugins/thread-toc/index.manifest.ts +++ b/perplexity/extension/src/plugins/thread-toc/index.manifest.ts @@ -23,7 +23,7 @@ export default definePlugin({ uiRouteSegment: "thread-toc", }, dependencies: { - corePlugins: ["domObservers:thread:messageBlocks"], + corePlugins: ["domObservers:thread", "domObservers:thread:messageBlocks"], }, }, settingsSchema: { diff --git a/perplexity/extension/src/plugins/thread-toc/index.remote-resources.ts b/perplexity/extension/src/plugins/thread-toc/index.remote-resources.ts new file mode 100644 index 000000000..670f16ccb --- /dev/null +++ b/perplexity/extension/src/plugins/thread-toc/index.remote-resources.ts @@ -0,0 +1,11 @@ +import { z } from "zod"; + +import threadTocCss from "@/plugins/thread-toc/styles.css?inline"; +import { defineVersionedRemoteResource } from "@/services/externals/cplx-api/versioned-remote-resources"; + +export const threadTocCssResourceConfig = defineVersionedRemoteResource({ + name: "plugin.threadToc.css", + type: "css", + fallback: threadTocCss, + zodSchema: z.string(), +}); diff --git a/perplexity/extension/src/plugins/thread-toc/styles.css b/perplexity/extension/src/plugins/thread-toc/styles.css new file mode 100644 index 000000000..2afbc1e23 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-toc/styles.css @@ -0,0 +1,9 @@ +@reference "../../assets/index.css"; + +#thread-toc-container { + top: calc(var(--header-height) + 20px); +} + +#thread-toc-menu-toggle { + @apply x:top-[calc(var(--header-height)+100px)] x:md:top-[calc(var(--header-height)+20px)]; +} diff --git a/perplexity/extension/src/plugins/thread-toc/usePanelPosition.ts b/perplexity/extension/src/plugins/thread-toc/usePanelPosition.ts index 06238a490..486b42bf4 100644 --- a/perplexity/extension/src/plugins/thread-toc/usePanelPosition.ts +++ b/perplexity/extension/src/plugins/thread-toc/usePanelPosition.ts @@ -9,7 +9,7 @@ import type { TocItem } from "@/plugins/thread-toc/useThreadTocItems"; export const PANEL_WIDTH = 300; type PanelPosition = { - position: { top: number; left: number }; + position: { left: number }; isOverflowing: boolean; }; @@ -57,55 +57,21 @@ export function usePanelPosition({ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition void (isSidebarPinned && windowSize != null && url != null); - if (threadWrapper == null) { + if (threadWrapper == null || activeMessageBlockContentWrapper == null) { return null; } - const $threadWrapper = $(threadWrapper); - const $children = $threadWrapper.children(); + const threadContentWrapperOffsetRight = + activeMessageBlockContentWrapper.offsetLeft + + activeMessageBlockContentWrapper.offsetWidth; - const $firstChild = $children.first(); - const threadWrapperOffset = $firstChild.offset(); - if (!threadWrapperOffset) { - console.log("threadWrapperOffset is null"); - return null; - } - - const navbarHeightStr = - document.body.style.getPropertyValue("--header-height"); - const navbarHeight = navbarHeightStr ? parseInt(navbarHeightStr) : 53; - - let threadContentWrapperWidth = - activeMessageBlockContentWrapper?.offsetWidth ?? 0; - - const validChildren = $children.filter((index, child) => { - return index > 0 && !child.classList.contains("fixed"); - }); - - if (validChildren.length > 0) threadContentWrapperWidth += 32; - - validChildren.each((_, child) => { - const width = $(child).width(); - if (width != null) threadContentWrapperWidth += width; - }); - - const threadContentWrapperOffsetLeft = - activeMessageBlockContentWrapper?.getBoundingClientRect().left ?? 0; - - const panelRightEdge = - threadContentWrapperOffsetLeft + - threadContentWrapperWidth + - PANEL_WIDTH + - 32; + const panelRightEdge = threadContentWrapperOffsetRight + PANEL_WIDTH + 64; return { position: { - top: navbarHeight + 20, - left: threadContentWrapperWidth + threadContentWrapperOffsetLeft + 28, + left: threadContentWrapperOffsetRight + 32, }, - isOverflowing: - panelRightEdge > window.innerWidth || - threadContentWrapperOffsetLeft === 0, + isOverflowing: panelRightEdge > threadWrapper.offsetWidth, }; }, [ isSidebarPinned, diff --git a/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/defaults.ts b/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/defaults.ts index 6c6332261..457edda33 100644 --- a/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/defaults.ts +++ b/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/defaults.ts @@ -5,19 +5,20 @@ import type { DomSelectors } from "@/services/externals/cplx-api/versioned-remote-resources/dom-selectors/types"; export const DOM_SELECTORS: DomSelectors = { - PAGE_WRAPPER: ".h-\\[100dvh\\]", - PAGE_CHILD_WRAPPER: ".h-\\[100dvh\\] > [class^=erp][style^=padding]", + ROOT: "#root", + PAGE_WRAPPER: + "#root > .border-subtlest.ring-subtlest.divide-subtlest.bg-underlay", SIDEBAR: { WRAPPER: ".group\\/sidebar", CHILD: { MENU: ".group\\/sidebar-menu", }, MOBILE_TRIGGER: `.h-headerHeight.backdrop-blur-md button:has(svg>path[d="M4 6l16 0 M4 12l16 0 M4 18l16 0"])`, + PIN_SIDEBAR_BUTTON: 'button[data-testid="sidebar-pin-sidebar"]', }, THREAD: { /** The outermost container that wraps the thread container and the query box */ NAVBAR: ".h-headerHeight.backdrop-blur-md", - PAGE_WRAPPER: ".h-\\[100dvh\\] > .max-h-screen", WRAPPER: ".h-headerHeight.backdrop-blur-md + div", /** The container that wraps all messages */ MESSAGE_BLOCKS_WRAPPER: { @@ -143,6 +144,7 @@ export const DOM_SELECTORS: DomSelectors = { * Selectors that are generated by the extension. */ export const INTERNAL_ATTRIBUTES = { + PAGE_WRAPPER: "page-wrapper", SIDEBAR: { WRAPPER: "sidebar-wrapper", MOBILE_TRIGGER: "sidebar-mobile-trigger", @@ -161,7 +163,6 @@ export const INTERNAL_ATTRIBUTES = { EXPORT_THREAD_BUTTON: "thread-export-button", OVERFLOW_MENU_BUTTON_WRAPPER: "thread-overflow-menu-button-wrapper", }, - PAGE_WRAPPER: "thread-page-wrapper", WRAPPER: "thread-wrapper", MESSAGE_BLOCKS_WRAPPER: "thread-message-blocks-wrapper", TOC_CONTAINER: "thread-toc-container", diff --git a/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/types.ts b/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/types.ts index 79ba10a6f..24b3ea409 100644 --- a/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/types.ts +++ b/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/types.ts @@ -1,18 +1,18 @@ import { z } from "zod"; export const DomSelectorsSchema = z.object({ + ROOT: z.string(), PAGE_WRAPPER: z.string(), - PAGE_CHILD_WRAPPER: z.string(), SIDEBAR: z.object({ WRAPPER: z.string(), CHILD: z.object({ MENU: z.string(), }), MOBILE_TRIGGER: z.string(), + PIN_SIDEBAR_BUTTON: z.string(), }), THREAD: z.object({ NAVBAR: z.string(), - PAGE_WRAPPER: z.string(), WRAPPER: z.string(), MESSAGE_BLOCKS_WRAPPER: z.object({ DESKTOP: z.object({ From 31f979d8ec2b45fc07f0c7f04a8d36df839879fd Mon Sep 17 00:00:00 2001 From: Pham Ngoc Duong Date: Sat, 1 Nov 2025 21:19:31 +0700 Subject: [PATCH 06/85] lint: clean up --- package.json | 2 +- packages/async-dep-manager/package.json | 6 +- .../src/async-dep-registry.ts | 4 - packages/cli-logger/package.json | 5 +- .../examples/extension/package.json | 4 +- packages/comctx-adapters/package.json | 4 +- .../comctx-adapters/src/adapters/browser.ts | 6 +- .../src/adapters/tab-consumer.ts | 8 +- packages/eslint-config/base.js | 3 +- packages/eslint-config/package.json | 6 +- packages/eslint-config/rules/imports.js | 4 +- packages/eslint-config/rules/react.js | 76 +- packages/eslint-config/rules/typescript.js | 5 +- packages/i18n/package.json | 4 +- packages/i18n/src/utils.ts | 2 +- packages/typescript-config/package.json | 5 +- packages/weasound/package.json | 3 + perplexity/extension/changelogs/2.7.10.md | 4 +- perplexity/extension/cli/package.json | 4 +- perplexity/extension/eslint.config.js | 3 + perplexity/extension/package.json | 10 +- .../ExtensionContextInvalidationWatchdog.tsx | 2 +- .../src/components/icons/ClockTemporary.tsx | 2 +- .../src/components/icons/PplxComet.tsx | 2 +- .../extension/src/components/ui/command.tsx | 7 +- .../extension/src/components/ui/portal.tsx | 2 +- .../components/SponsorDialogWrapper.tsx | 5 +- .../FullScreenReleaseNotesPage.tsx | 5 +- .../pages/themes/components/ThemeForm.tsx | 4 +- .../options-page/onboarding/CometPatch.tsx | 2 +- .../{follow-up-query-box.css => styles.css} | 0 .../query-box/index.remote-resources.ts | 4 +- .../main/{main-query-box.css => styles.css} | 4 +- .../routes/Home/CometAffiliateDialog.tsx | 10 +- .../comet-isolated-zoom/settings-ui.tsx | 2 +- .../command-menu/pages/spaces/Footer.tsx | 3 +- .../force-writing-mode/ForceWritingMode.tsx | 2 +- .../plugins/prompt-history/settings-ui.tsx | 2 +- .../src/plugins/thread-toc/TocPanel.tsx | 3 +- pnpm-lock.yaml | 650 +++++++++--------- pnpm-workspace.yaml | 2 +- 41 files changed, 447 insertions(+), 434 deletions(-) rename perplexity/extension/src/plugins/__ui-groups__/elements/query-box/follow-up/{follow-up-query-box.css => styles.css} (100%) rename perplexity/extension/src/plugins/__ui-groups__/elements/query-box/main/{main-query-box.css => styles.css} (90%) diff --git a/package.json b/package.json index 9e3c47c5c..8d6bbf276 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "husky": "^9.1.7", "lint-staged": "^16.2.6", "prettier": "catalog:lint", - "turbo": "^2.5.8", + "turbo": "^2.6.0", "typescript": "catalog:types" }, "packageManager": "pnpm@10.19.0", diff --git a/packages/async-dep-manager/package.json b/packages/async-dep-manager/package.json index 0648ca195..314d59a1c 100644 --- a/packages/async-dep-manager/package.json +++ b/packages/async-dep-manager/package.json @@ -23,12 +23,12 @@ "@complexity/eslint-config": "workspace:*", "@complexity/typescript-config": "workspace:*", "@types/node": "22.17.2", - "eslint": "catalog:lint", - "globals": "16.4.0", + "eslint": "9.38.0", + "globals": "16.5.0", "prettier": "catalog:lint", "tsup": "^8.5.0", "typescript": "catalog:types", "typescript-eslint": "catalog:lint", - "vitest": "^4.0.5" + "vitest": "^4.0.6" } } diff --git a/packages/async-dep-manager/src/async-dep-registry.ts b/packages/async-dep-manager/src/async-dep-registry.ts index b8f33fdb6..5258692d9 100644 --- a/packages/async-dep-manager/src/async-dep-registry.ts +++ b/packages/async-dep-manager/src/async-dep-registry.ts @@ -362,10 +362,6 @@ export class AsyncDependencyRegistry< this._pendingWarnings.set(id, warningTimeoutId); return new Promise((resolve) => { - if (this._pendingResolvers == null) { - this._pendingResolvers = new Map(); - } - if (!this._pendingResolvers.has(id)) { this._pendingResolvers.set(id, new Set()); } diff --git a/packages/cli-logger/package.json b/packages/cli-logger/package.json index 6dbb1d005..7d82c91b9 100644 --- a/packages/cli-logger/package.json +++ b/packages/cli-logger/package.json @@ -19,8 +19,11 @@ "@complexity/typescript-config": "workspace:*", "@types/node": "22.17.2", "chalk": "5.6.2", - "globals": "16.4.0", + "globals": "16.5.0", "tsup": "^8.5.0", "typescript": "catalog:types" + }, + "dependencies": { + "eslint": "9.38.0" } } diff --git a/packages/comctx-adapters/examples/extension/package.json b/packages/comctx-adapters/examples/extension/package.json index 6c883426d..2ceea033c 100644 --- a/packages/comctx-adapters/examples/extension/package.json +++ b/packages/comctx-adapters/examples/extension/package.json @@ -21,8 +21,8 @@ "@crxjs/vite-plugin": "^2.2.1", "@types/chrome": "catalog:types", "@types/node": "22.17.2", - "eslint": "catalog:lint", - "globals": "16.4.0", + "eslint": "9.38.0", + "globals": "16.5.0", "prettier": "catalog:lint", "typescript": "catalog:types", "typescript-eslint": "catalog:lint", diff --git a/packages/comctx-adapters/package.json b/packages/comctx-adapters/package.json index 92e4d3c15..1f16e7854 100644 --- a/packages/comctx-adapters/package.json +++ b/packages/comctx-adapters/package.json @@ -27,8 +27,8 @@ "@complexity/typescript-config": "workspace:*", "@types/chrome": "catalog:types", "@types/node": "22.17.2", - "eslint": "catalog:lint", - "globals": "16.4.0", + "eslint": "9.38.0", + "globals": "16.5.0", "prettier": "catalog:lint", "typescript": "catalog:types", "typescript-eslint": "catalog:lint" diff --git a/packages/comctx-adapters/src/adapters/browser.ts b/packages/comctx-adapters/src/adapters/browser.ts index 33246e382..7691cb962 100644 --- a/packages/comctx-adapters/src/adapters/browser.ts +++ b/packages/comctx-adapters/src/adapters/browser.ts @@ -4,15 +4,15 @@ type MessageMeta = { sender: { tabId: NonNullable["id"]; frameId: chrome.runtime.MessageSender["frameId"]; - }; + } | null; }; export class BrowserRuntimeAdapter implements Adapter { sendMessage: SendMessage = async (message) => { if (message.meta.sender != null && message.meta.sender.tabId != null) { - chrome.tabs.sendMessage(message.meta.sender.tabId, message); + void chrome.tabs.sendMessage(message.meta.sender.tabId, message); } else { - chrome.runtime.sendMessage(message); + void chrome.runtime.sendMessage(message); } }; diff --git a/packages/comctx-adapters/src/adapters/tab-consumer.ts b/packages/comctx-adapters/src/adapters/tab-consumer.ts index 6f7cbc273..79b475bc4 100644 --- a/packages/comctx-adapters/src/adapters/tab-consumer.ts +++ b/packages/comctx-adapters/src/adapters/tab-consumer.ts @@ -16,12 +16,8 @@ export class TabConsumerAdapter implements Adapter { this.frameId = frameId ?? 0; } - sendMessage: SendMessage = (message) => { - const tab = chrome.tabs.get(this.tabId); - - if (tab == null) return; - - chrome.tabs.sendMessage(this.tabId, message, { + sendMessage: SendMessage = async (message) => { + void chrome.tabs.sendMessage(this.tabId, message, { frameId: this.frameId, }); }; diff --git a/packages/eslint-config/base.js b/packages/eslint-config/base.js index f83ec2be1..693461009 100644 --- a/packages/eslint-config/base.js +++ b/packages/eslint-config/base.js @@ -1,4 +1,3 @@ -// @ts-check import eslintConfigPrettier from "eslint-config-prettier"; import js from "@eslint/js"; @@ -8,7 +7,7 @@ import unicornPlugin from "eslint-plugin-unicorn"; export default defineConfig([ js.configs.recommended, - ...tseslint.configs.recommended, + tseslint.configs.recommended, eslintConfigPrettier, { linterOptions: { diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index be9321e6a..2284b5982 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -7,9 +7,9 @@ ".": "./index.js" }, "devDependencies": { - "@eslint/js": "^9.38.0", + "@eslint/js": "9.38.0", "@limegrass/eslint-plugin-import-alias": "^1.6.0", - "eslint": "catalog:lint", + "eslint": "9.38.0", "eslint-config-prettier": "^10.1.8", "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-import": "^2.32.0", @@ -17,7 +17,7 @@ "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-react-refresh": "^0.4.24", "eslint-plugin-unicorn": "62.0.0", - "globals": "16.4.0", + "globals": "16.5.0", "typescript-eslint": "catalog:lint" } } diff --git a/packages/eslint-config/rules/imports.js b/packages/eslint-config/rules/imports.js index 815a1b487..2c6119e22 100644 --- a/packages/eslint-config/rules/imports.js +++ b/packages/eslint-config/rules/imports.js @@ -1,6 +1,4 @@ -// @ts-check - -import * as importPlugin from "eslint-plugin-import"; +import importPlugin from "eslint-plugin-import"; import importAliasPlugin from "@limegrass/eslint-plugin-import-alias"; import { defineConfig } from "eslint/config"; diff --git a/packages/eslint-config/rules/react.js b/packages/eslint-config/rules/react.js index 7227a7d4a..5e2337bdd 100644 --- a/packages/eslint-config/rules/react.js +++ b/packages/eslint-config/rules/react.js @@ -1,46 +1,42 @@ -// @ts-check - import reactPlugin from "eslint-plugin-react"; import reactHooksPlugin from "eslint-plugin-react-hooks"; import reactRefreshPlugin from "eslint-plugin-react-refresh"; import { defineConfig } from "eslint/config"; -export default defineConfig([ - { - extends: [reactHooksPlugin.configs.flat["recommended-latest"]], - plugins: { - react: reactPlugin, - "react-hooks": reactHooksPlugin, - "react-refresh": reactRefreshPlugin, - }, - settings: { - react: { version: "detect" }, - }, - rules: { - "react-hooks/rules-of-hooks": "error", - "react-hooks/exhaustive-deps": "warn", - "react-refresh/only-export-components": [ - "warn", - { allowConstantExport: true }, - ], - "react/react-in-jsx-scope": "off", - "react/prop-types": "off", - "react/jsx-sort-props": [ - "warn", - { - callbacksLast: true, - shorthandFirst: true, - ignoreCase: true, - reservedFirst: true, - noSortAlphabetically: true, - }, - ], - "react/jsx-no-useless-fragment": [ - "warn", - { - allowExpressions: true, - }, - ], - }, +export default defineConfig({ + extends: [ + reactPlugin.configs.flat.recommended, + reactPlugin.configs.flat["jsx-runtime"], + reactHooksPlugin.configs.flat["recommended-latest"], + reactRefreshPlugin.configs.recommended, + ], + settings: { + react: { version: "detect" }, + }, + rules: { + "react-hooks/rules-of-hooks": "error", + "react-hooks/exhaustive-deps": "warn", + "react-refresh/only-export-components": [ + "warn", + { allowConstantExport: true }, + ], + "react/react-in-jsx-scope": "off", + "react/prop-types": "off", + "react/jsx-sort-props": [ + "warn", + { + callbacksLast: true, + shorthandFirst: true, + ignoreCase: true, + reservedFirst: true, + noSortAlphabetically: true, + }, + ], + "react/jsx-no-useless-fragment": [ + "warn", + { + allowExpressions: true, + }, + ], }, -]); +}); diff --git a/packages/eslint-config/rules/typescript.js b/packages/eslint-config/rules/typescript.js index 50df26fa4..cd7827335 100644 --- a/packages/eslint-config/rules/typescript.js +++ b/packages/eslint-config/rules/typescript.js @@ -1,4 +1,3 @@ -// @ts-check import { defineConfig } from "eslint/config"; import tseslint from "typescript-eslint"; @@ -11,9 +10,7 @@ export default defineConfig({ project: "./tsconfig.json", }, }, - plugins: { - "@typescript-eslint": tseslint.plugin, - }, + extends: [tseslint.configs.recommended], rules: { "@typescript-eslint/consistent-type-imports": "error", "@typescript-eslint/no-explicit-any": "warn", diff --git a/packages/i18n/package.json b/packages/i18n/package.json index f98c29621..f24c3fc94 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -27,8 +27,8 @@ "@types/node": "22.17.2", "@types/react": "^19.2.2", "@types/react-dom": "^19.2.2", - "eslint": "catalog:lint", - "globals": "16.4.0", + "eslint": "9.38.0", + "globals": "16.5.0", "prettier": "catalog:lint", "tsup": "^8.5.0", "typescript": "catalog:types", diff --git a/packages/i18n/src/utils.ts b/packages/i18n/src/utils.ts index 2dfd77090..8b55b4daa 100644 --- a/packages/i18n/src/utils.ts +++ b/packages/i18n/src/utils.ts @@ -1,6 +1,6 @@ import { initI18n, type DotPaths, type Params } from "@/lib/init"; -let i18n: Awaited>; +let i18n: Awaited> | null = null; export async function init(params: Parameters[0]) { i18n = await initI18n(params); diff --git a/packages/typescript-config/package.json b/packages/typescript-config/package.json index dceeba76a..bc4f1ee98 100644 --- a/packages/typescript-config/package.json +++ b/packages/typescript-config/package.json @@ -1,5 +1,8 @@ { "name": "@complexity/typescript-config", "version": "0.0.0", - "private": true + "private": true, + "dependencies": { + "eslint": "9.38.0" + } } diff --git a/packages/weasound/package.json b/packages/weasound/package.json index c66b261ca..4dd70a80c 100644 --- a/packages/weasound/package.json +++ b/packages/weasound/package.json @@ -38,5 +38,8 @@ "terser": "^5.44.0", "tsup": "^8.5.0", "typescript": "catalog:types" + }, + "dependencies": { + "eslint": "9.38.0" } } diff --git a/perplexity/extension/changelogs/2.7.10.md b/perplexity/extension/changelogs/2.7.10.md index ef7ad7877..06b2c4807 100644 --- a/perplexity/extension/changelogs/2.7.10.md +++ b/perplexity/extension/changelogs/2.7.10.md @@ -6,5 +6,7 @@ ## Bug Fixes - `Thread Export`: Fixed an issue with download on long threads -- `Command Menu`: Fixed Space files download +- `Command Menu`: + - Fixed Space files download + - Fixed keybinding for copy space ID on macOS. Cmd + C should now work as expected. - Speculative fix for rare cases where Thread Plugins might not work after a new answer is generated diff --git a/perplexity/extension/cli/package.json b/perplexity/extension/cli/package.json index 5da049852..4909240f5 100644 --- a/perplexity/extension/cli/package.json +++ b/perplexity/extension/cli/package.json @@ -14,7 +14,7 @@ "r2:versioned-rr:gen": "dotenvx run -f ./src/r2/.env --quiet -- bun ./src/r2/remote-resources/versioned.ts" }, "dependencies": { - "@aws-sdk/client-s3": "^3.921.0", + "@aws-sdk/client-s3": "^3.922.0", "@dotenvx/dotenvx": "^1.51.0", "chrome-webstore-upload": "^4.0.3", "commander": "^14.0.2", @@ -30,7 +30,7 @@ "@complexity/typescript-config": "workspace:*", "@types/mime-types": "^3.0.1", "@types/node": "22.17.2", - "eslint": "catalog:lint", + "eslint": "9.38.0", "prettier": "catalog:lint", "typescript": "catalog:types", "typescript-eslint": "catalog:lint" diff --git a/perplexity/extension/eslint.config.js b/perplexity/extension/eslint.config.js index 795b2760c..80d3dc7a1 100644 --- a/perplexity/extension/eslint.config.js +++ b/perplexity/extension/eslint.config.js @@ -48,6 +48,9 @@ export default defineConfig([ }, { extends: [baseReactConfig], + rules: { + "react/jsx-no-undef": "off", + }, ignores: [...commonIgnores, "e2e/**"], }, boundariesConfig, diff --git a/perplexity/extension/package.json b/perplexity/extension/package.json index 882d7f36f..367952199 100644 --- a/perplexity/extension/package.json +++ b/perplexity/extension/package.json @@ -74,7 +74,7 @@ "pako": "^2.1.0", "react": "^19.2.0", "react-dom": "^19.2.0", - "react-hook-form": "^7.65.0", + "react-hook-form": "^7.66.0", "react-hotkeys-hook": "^5.2.1", "react-lazily": "^0.9.2", "react-markdown": "^10.1.0", @@ -124,15 +124,15 @@ "@types/react-syntax-highlighter": "^15.5.13", "@types/semver": "^7.7.1", "@vitejs/plugin-react": "^5.1.0", - "@vitest/ui": "^4.0.5", + "@vitest/ui": "^4.0.6", "babel-plugin-react-compiler": "^1.0.0", "browserslist": "^4.27.0", "caniuse-lite": "^1.0.30001752", "chalk": "5.6.2", - "eslint": "catalog:lint", + "eslint": "9.38.0", "eslint-plugin-boundaries": "^5.1.0", "glob": "^11.0.3", - "globals": "16.4.0", + "globals": "16.5.0", "gulp": "^5.0.1", "gulp-zip": "^6.1.0", "markmap-lib": "^0.18.12", @@ -150,7 +150,7 @@ "unimport": "^5.5.0", "unplugin-icons": "^22.5.0", "vite": "^7.1.12", - "vitest": "^4.0.5" + "vitest": "^4.0.6" }, "engines": { "node": "^22.12.0" diff --git a/perplexity/extension/src/components/ExtensionContextInvalidationWatchdog.tsx b/perplexity/extension/src/components/ExtensionContextInvalidationWatchdog.tsx index a2715f253..b2876efe7 100644 --- a/perplexity/extension/src/components/ExtensionContextInvalidationWatchdog.tsx +++ b/perplexity/extension/src/components/ExtensionContextInvalidationWatchdog.tsx @@ -56,7 +56,7 @@ export function WarningDialog() { - +
diff --git a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/release-notes/FullScreenReleaseNotesPage.tsx b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/release-notes/FullScreenReleaseNotesPage.tsx index 1774deee6..dbb484e81 100644 --- a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/release-notes/FullScreenReleaseNotesPage.tsx +++ b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/release-notes/FullScreenReleaseNotesPage.tsx @@ -63,7 +63,10 @@ export function FullScreenReleaseNotesPage() { , + , ]} />
diff --git a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/themes/components/ThemeForm.tsx b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/themes/components/ThemeForm.tsx index 86133ccd8..65154fab8 100644 --- a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/themes/components/ThemeForm.tsx +++ b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/themes/components/ThemeForm.tsx @@ -125,8 +125,8 @@ export function ThemeForm() { readable, and remove font ligatures.
- Require at least one plugin in the "Thread" category to be - active. + Require at least one plugin in the "Thread" + category to be active.
diff --git a/perplexity/extension/src/entrypoints/options-page/onboarding/CometPatch.tsx b/perplexity/extension/src/entrypoints/options-page/onboarding/CometPatch.tsx index 737e67076..09b6e6578 100644 --- a/perplexity/extension/src/entrypoints/options-page/onboarding/CometPatch.tsx +++ b/perplexity/extension/src/entrypoints/options-page/onboarding/CometPatch.tsx @@ -22,7 +22,7 @@ export default function CometPatch() { context.goToNextStep(); }} > - No, I'm not using Comet + No, I'm not using Comet
); diff --git a/perplexity/extension/src/plugins/__ui-groups__/elements/query-box/follow-up/follow-up-query-box.css b/perplexity/extension/src/plugins/__ui-groups__/elements/query-box/follow-up/styles.css similarity index 100% rename from perplexity/extension/src/plugins/__ui-groups__/elements/query-box/follow-up/follow-up-query-box.css rename to perplexity/extension/src/plugins/__ui-groups__/elements/query-box/follow-up/styles.css diff --git a/perplexity/extension/src/plugins/__ui-groups__/elements/query-box/index.remote-resources.ts b/perplexity/extension/src/plugins/__ui-groups__/elements/query-box/index.remote-resources.ts index bae154faa..a4d6862cd 100644 --- a/perplexity/extension/src/plugins/__ui-groups__/elements/query-box/index.remote-resources.ts +++ b/perplexity/extension/src/plugins/__ui-groups__/elements/query-box/index.remote-resources.ts @@ -1,7 +1,7 @@ import { z } from "zod"; -import queryBoxFollowUpQueryBoxNormalizeCss from "@/plugins/__ui-groups__/elements/query-box/follow-up/follow-up-query-box.css?inline"; -import queryBoxMainQueryBoxNormalizeCss from "@/plugins/__ui-groups__/elements/query-box/main/main-query-box.css?inline"; +import queryBoxFollowUpQueryBoxNormalizeCss from "@/plugins/__ui-groups__/elements/query-box/follow-up/styles.css?inline"; +import queryBoxMainQueryBoxNormalizeCss from "@/plugins/__ui-groups__/elements/query-box/main/styles.css?inline"; import { defineVersionedRemoteResource } from "@/services/externals/cplx-api/versioned-remote-resources"; export const queryBoxMainQueryBoxNormalizeCssResourceConfig = diff --git a/perplexity/extension/src/plugins/__ui-groups__/elements/query-box/main/main-query-box.css b/perplexity/extension/src/plugins/__ui-groups__/elements/query-box/main/styles.css similarity index 90% rename from perplexity/extension/src/plugins/__ui-groups__/elements/query-box/main/main-query-box.css rename to perplexity/extension/src/plugins/__ui-groups__/elements/query-box/main/styles.css index 52c53d180..76bd41608 100644 --- a/perplexity/extension/src/plugins/__ui-groups__/elements/query-box/main/main-query-box.css +++ b/perplexity/extension/src/plugins/__ui-groups__/elements/query-box/main/styles.css @@ -1,4 +1,4 @@ -@reference "../../../../../assets/index.css"; +/* @reference "../../../../../assets/index.css"; [data-cplx-component="cplx-main-query-box"], [data-cplx-component="cplx-space-query-box"] { @@ -21,4 +21,4 @@ > :last-child button:not([aria-label="Submit"]) { @apply x:min-h-8 x:min-w-8; -} +} */ diff --git a/perplexity/extension/src/plugins/__ui-groups__/routes/Home/CometAffiliateDialog.tsx b/perplexity/extension/src/plugins/__ui-groups__/routes/Home/CometAffiliateDialog.tsx index fc7933ab0..7813992f5 100644 --- a/perplexity/extension/src/plugins/__ui-groups__/routes/Home/CometAffiliateDialog.tsx +++ b/perplexity/extension/src/plugins/__ui-groups__/routes/Home/CometAffiliateDialog.tsx @@ -52,7 +52,10 @@ export default function CometAffiliateDialog() { , + , ]} /> @@ -62,7 +65,10 @@ export default function CometAffiliateDialog() { , + , ]} />
diff --git a/perplexity/extension/src/plugins/comet-isolated-zoom/settings-ui.tsx b/perplexity/extension/src/plugins/comet-isolated-zoom/settings-ui.tsx index 436b59d78..f6c0d634e 100644 --- a/perplexity/extension/src/plugins/comet-isolated-zoom/settings-ui.tsx +++ b/perplexity/extension/src/plugins/comet-isolated-zoom/settings-ui.tsx @@ -32,7 +32,7 @@ export default function ThreadMessageTtsPluginSettingsUi() {
Use Ctrl/Cmd + Mouse Wheel or Ctrl/Cmd + 0 to reset zoom.
- Or use this slider when you can't zoom on the Assistant window. + Or use this slider when you can't zoom on the Assistant window.
diff --git a/perplexity/extension/src/plugins/command-menu/pages/spaces/Footer.tsx b/perplexity/extension/src/plugins/command-menu/pages/spaces/Footer.tsx index d6410f567..a2099fbc6 100644 --- a/perplexity/extension/src/plugins/command-menu/pages/spaces/Footer.tsx +++ b/perplexity/extension/src/plugins/command-menu/pages/spaces/Footer.tsx @@ -1,4 +1,5 @@ import { toast } from "@/components/ui/use-toast"; +import { getPlatform } from "@/hooks/usePlatformDetection"; import { openInNewTab, softNavigate, @@ -25,7 +26,7 @@ export default function SpacesSearchItemsFooter() { commandMenuStore.getState().setFooterItems([ { title: t("plugin-command-menu.spaces.footer.copyId"), - keybinding: [Key.Control, "c"], + keybinding: [getPlatform() === "mac" ? Key.Meta : Key.Control, "c"], onSelect: async () => { await navigator.clipboard.writeText(space.uuid); diff --git a/perplexity/extension/src/plugins/force-writing-mode/ForceWritingMode.tsx b/perplexity/extension/src/plugins/force-writing-mode/ForceWritingMode.tsx index e240896cd..b2e1cc1e5 100644 --- a/perplexity/extension/src/plugins/force-writing-mode/ForceWritingMode.tsx +++ b/perplexity/extension/src/plugins/force-writing-mode/ForceWritingMode.tsx @@ -93,7 +93,7 @@ export function ForceWritingModeToggle() { diff --git a/perplexity/extension/src/plugins/prompt-history/settings-ui.tsx b/perplexity/extension/src/plugins/prompt-history/settings-ui.tsx index b6fa74e4e..33da6da08 100644 --- a/perplexity/extension/src/plugins/prompt-history/settings-ui.tsx +++ b/perplexity/extension/src/plugins/prompt-history/settings-ui.tsx @@ -147,7 +147,7 @@ function SlashCommandMenuActivationShortcutsSettings() { ) : (
- // + {`//`} =18.0.0'} - '@aws-sdk/client-sso@3.921.0': - resolution: {integrity: sha512-qWyT7WikdkPRAMuWidZ2l8jcQAPwNjvLcFZ/8K+oCAaMLt0LKLd7qeTwZ5tZFNqRNPXKfE8MkvAjyqSpE3i2yg==} + '@aws-sdk/client-sso@3.922.0': + resolution: {integrity: sha512-jdHs7uy7cSpiMvrxhYmqHyJxgK7hyqw4plG8OQ4YTBpq0SbfAxdoOuOkwJ1IVUUQho4otR1xYYjiX/8e8J8qwQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.921.0': - resolution: {integrity: sha512-1eiD9ZO9cvEHdQUn/pwJVGN9LXg6D0O7knGVA0TA/v7nFSYy0n8RYG8vdnlcoYYnV1BcHgaf4KmRVMOszafNZQ==} + '@aws-sdk/core@3.922.0': + resolution: {integrity: sha512-EvfP4cqJfpO3L2v5vkIlTkMesPtRwWlMfsaW6Tpfm7iYfBOuTi6jx60pMDMTyJNVfh6cGmXwh/kj1jQdR+w99Q==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.921.0': - resolution: {integrity: sha512-RGG+zZdOYGJBQ8+L7BI6v41opoF8knErMtBZAUGcD3gvWEhjatc7lSbIpBeYWbTaWPPLHQU+ZVbmQ/jRLBgefw==} + '@aws-sdk/credential-provider-env@3.922.0': + resolution: {integrity: sha512-WikGQpKkROJSK3D3E7odPjZ8tU7WJp5/TgGdRuZw3izsHUeH48xMv6IznafpRTmvHcjAbDQj4U3CJZNAzOK/OQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.921.0': - resolution: {integrity: sha512-TAv08Ow0oF/olV4DTLoPDj46KMk35bL1IUCfToESDrWk1TOSur7d4sCL0p/7dUsAxS244cEgeyIIijKNtxj2AA==} + '@aws-sdk/credential-provider-http@3.922.0': + resolution: {integrity: sha512-i72DgHMK7ydAEqdzU0Duqh60Q8W59EZmRJ73y0Y5oFmNOqnYsAI+UXyOoCsubp+Dkr6+yOwAn1gPt1XGE9Aowg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.921.0': - resolution: {integrity: sha512-MUSRYGiMRq5NRGPRgJ7Nuh7GqXzE9iteAwdbzMJ4pnImgr7CjeWDihCIGk+gKLSG+NoRVVJM0V9PA4rxFir0Pg==} + '@aws-sdk/credential-provider-ini@3.922.0': + resolution: {integrity: sha512-bVF+pI5UCLNkvbiZr/t2fgTtv84s8FCdOGAPxQiQcw5qOZywNuuCCY3wIIchmQr6GJr8YFkEp5LgDCac5EC5aQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.921.0': - resolution: {integrity: sha512-bxUAqRyo49WzKWn/XS0d8QXT9GydY/ew5m58PYfSMwYfmwBZXx1GLSWe3tZnefm6santFiqmIWfMmeRWdygKmQ==} + '@aws-sdk/credential-provider-node@3.922.0': + resolution: {integrity: sha512-agCwaD6mBihToHkjycL8ObIS2XOnWypWZZWhJSoWyHwFrhEKz1zGvgylK9Dc711oUfU+zU6J8e0JPKNJMNb3BQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.921.0': - resolution: {integrity: sha512-DM62ooWI/aZ+ENBcLszuKmOkiICf6p4vYO2HgA3Cy2OEsTsjb67NEcntksxpZkD3mSIrCy/Qi4Z7tc77gle2Nw==} + '@aws-sdk/credential-provider-process@3.922.0': + resolution: {integrity: sha512-1DZOYezT6okslpvMW7oA2q+y17CJd4fxjNFH0jtThfswdh9CtG62+wxenqO+NExttq0UMaKisrkZiVrYQBTShw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.921.0': - resolution: {integrity: sha512-Nh5jPJ6Y6nu3cHzZnq394lGXE5YO8Szke5zlATbNI7Tl0QJR65GE0IZsBcjzRMGpYX6ENCqPDK8FmklkmCYyVQ==} + '@aws-sdk/credential-provider-sso@3.922.0': + resolution: {integrity: sha512-nbD3G3hShTYxLCkKMqLkLPtKwAAfxdY/k9jHtZmVBFXek2T6tQrqZHKxlAu+fd23Ga4/Aik7DLQQx1RA1a5ipg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.921.0': - resolution: {integrity: sha512-VWcbgB2/shPPK674roHV4s8biCtvn0P/05EbTqy9WeyM5Oblx291gRGccyDhQbJbOL/6diRPBM08tlKPlBKNfw==} + '@aws-sdk/credential-provider-web-identity@3.922.0': + resolution: {integrity: sha512-wjGIhgMHGGQfQTdFaJphNOKyAL8wZs6znJdHADPVURmgR+EWLyN/0fDO1u7wx8xaLMZpbHIFWBEvf9TritR/cQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-bucket-endpoint@3.921.0': - resolution: {integrity: sha512-D4AVjNAmy7KYycM/mOzbQRZbOOU0mY4T3nmW//CE8amqsAmmeIW6ff2AH/5yGRp8aNjQInZ9npXHTThKc4a+LA==} + '@aws-sdk/middleware-bucket-endpoint@3.922.0': + resolution: {integrity: sha512-Dpr2YeOaLFqt3q1hocwBesynE3x8/dXZqXZRuzSX/9/VQcwYBFChHAm4mTAl4zuvArtDbLrwzWSxmOWYZGtq5w==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-expect-continue@3.921.0': - resolution: {integrity: sha512-XnHLbyu6uZlS8DbxpB1TFWYCi+IOdf8PAfijkiOCdl1vf9pBZBE45xvghSd+Ck0EqlKQl4mEy9sB0Vv1ERnMfQ==} + '@aws-sdk/middleware-expect-continue@3.922.0': + resolution: {integrity: sha512-xmnLWMtmHJHJBupSWMUEW1gyxuRIeQ1Ov2xa8Tqq77fPr4Ft2AluEwiDMaZIMHoAvpxWKEEt9Si59Li7GIA+bQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.921.0': - resolution: {integrity: sha512-8bgPdSpcAPeXDnxMGnL2Nj2EfWhU95U7Q+C+XvAPlkSPSi0tFU2F1/D6hdVBQ5MCjL9areamAt2qO/Tt3+IEUw==} + '@aws-sdk/middleware-flexible-checksums@3.922.0': + resolution: {integrity: sha512-G363np7YcJhf+gBucskdv8cOTbs2TRwocEzRupuqDIooGDlLBlfJrvwehdgtWR8l53yjJR3zcHvGrVPTe2h8Nw==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-host-header@3.921.0': - resolution: {integrity: sha512-eX1Ka29XzuEcXG4YABTwyLtPLchjmcjSjaq4irKJTFkxSYzX7gjoKt18rh/ZzOWOSqi23+cpjvBacL4VBKvE2Q==} + '@aws-sdk/middleware-host-header@3.922.0': + resolution: {integrity: sha512-HPquFgBnq/KqKRVkiuCt97PmWbKtxQ5iUNLEc6FIviqOoZTmaYG3EDsIbuFBz9C4RHJU4FKLmHL2bL3FEId6AA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-location-constraint@3.921.0': - resolution: {integrity: sha512-KjYtPvAks/WgCc9sRbqTM0MP3+utMT+OJ1NN61kyiCiUJuMyKFb3olhCUIJHajP5trTsXCiwFsuysj9x2iupJw==} + '@aws-sdk/middleware-location-constraint@3.922.0': + resolution: {integrity: sha512-T4iqd7WQ2DDjCH/0s50mnhdoX+IJns83ZE+3zj9IDlpU0N2aq8R91IG890qTfYkUEdP9yRm0xir/CNed+v6Dew==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-logger@3.921.0': - resolution: {integrity: sha512-14Qqp8wisKGj/2Y22OfO5jTBG5Xez+p3Zr2piAtz7AcbY8vBEoZbd6f+9lwwVFC73Aobkau223wzKbGT8HYQMw==} + '@aws-sdk/middleware-logger@3.922.0': + resolution: {integrity: sha512-AkvYO6b80FBm5/kk2E636zNNcNgjztNNUxpqVx+huyGn9ZqGTzS4kLqW2hO6CBe5APzVtPCtiQsXL24nzuOlAg==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-recursion-detection@3.921.0': - resolution: {integrity: sha512-MYU5oI2b97M7u1dC1nt7SiGEvvLrQDlzV6hq9CB5TYX2glgbyvkaS//1Tjm87VF6qVSf5jYfwFDPeFGd8O1NrQ==} + '@aws-sdk/middleware-recursion-detection@3.922.0': + resolution: {integrity: sha512-TtSCEDonV/9R0VhVlCpxZbp/9sxQvTTRKzIf8LxW3uXpby6Wl8IxEciBJlxmSkoqxh542WRcko7NYODlvL/gDA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-sdk-s3@3.921.0': - resolution: {integrity: sha512-u4fkE6sn5KWojhPUeDIqRx0BJlQug60PzAnLPlxeIvy2+ZeTSY64WYwF6V7wIZCf1RIstiBA/hQUsX07LfbvNg==} + '@aws-sdk/middleware-sdk-s3@3.922.0': + resolution: {integrity: sha512-ygg8lME1oFAbsH42ed2wtGqfHLoT5irgx6VC4X98j79fV1qXEwwwbqMsAiMQ/HJehpjqAFRVsHox3MHLN48Z5A==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-ssec@3.921.0': - resolution: {integrity: sha512-hxu8bzu99afvBwyrq2YLUc6fOIR4kipGFsdTAfkXAoniYCaMA4eehSlvfWhbgUnNHbXb/KoP+lk8UTnx+gU8vQ==} + '@aws-sdk/middleware-ssec@3.922.0': + resolution: {integrity: sha512-eHvSJZTSRJO+/tjjGD6ocnPc8q9o3m26+qbwQTu/4V6yOJQ1q+xkDZNqwJQphL+CodYaQ7uljp8g1Ji/AN3D9w==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.921.0': - resolution: {integrity: sha512-gXgokMBTPZAbQMm1+JOxItqA81aSFK6n7V2mAwxdmHjzCUZacX5RzkVPNbSaPPgDkroYnIzK09EusIpM6dLaqw==} + '@aws-sdk/middleware-user-agent@3.922.0': + resolution: {integrity: sha512-N4Qx/9KP3oVQBJOrSghhz8iZFtUC2NNeSZt88hpPhbqAEAtuX8aD8OzVcpnAtrwWqy82Yd2YTxlkqMGkgqnBsQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.921.0': - resolution: {integrity: sha512-GV9aV8WqH/EWo4x3T5BrYb2ph1yfYuzUXZc0hhvxbFbDKD8m2fX9menao3Mgm7E5C68Su392u+MD9SGmGCmfKQ==} + '@aws-sdk/nested-clients@3.922.0': + resolution: {integrity: sha512-uYvKCF1TGh/MuJ4TMqmUM0Csuao02HawcseG4LUDyxdUsd/EFuxalWq1Cx4fKZQ2K8F504efZBjctMAMNY+l7A==} engines: {node: '>=18.0.0'} - '@aws-sdk/region-config-resolver@3.921.0': - resolution: {integrity: sha512-cSycw4wXcvsrssUdcEaeYQhQcZYVsBwHtgATh9HcIm01PrMV0lV71vcoyZ+9vUhwHwchRT6dItAyTHSQxwjvjg==} + '@aws-sdk/region-config-resolver@3.922.0': + resolution: {integrity: sha512-44Y/rNNwhngR2KHp6gkx//TOr56/hx6s4l+XLjOqH7EBCHL7XhnrT1y92L+DLiroVr1tCSmO8eHQwBv0Y2+mvw==} engines: {node: '>=18.0.0'} - '@aws-sdk/signature-v4-multi-region@3.921.0': - resolution: {integrity: sha512-pFtJXtrf8cOsCgEb2OoPwQP4BKrnwIq69FuLowvWrXllFntAoAdEYaj9wNxPyl4pGqvo/9zO9CtkMb53PNxmWQ==} + '@aws-sdk/signature-v4-multi-region@3.922.0': + resolution: {integrity: sha512-mmsgEEL5pE+A7gFYiJMDBCLVciaXq4EFI5iAP7bPpnHvOplnNOYxVy2IreKMllGvrfjVyLnwxzZYlo5zZ65FWg==} engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.921.0': - resolution: {integrity: sha512-d+w6X7ykqXirFBF+dYyK5Ntw0KmO2sgMj+JLR/vAe1vaR8/Fuqs3yOAFU7yNEzpcnbLJmMznxKpht03CSEMh4Q==} + '@aws-sdk/token-providers@3.922.0': + resolution: {integrity: sha512-/inmPnjZE0ZBE16zaCowAvouSx05FJ7p6BQYuzlJ8vxEU0sS0Hf8fvhuiRnN9V9eDUPIBY+/5EjbMWygXL4wlQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/types@3.921.0': - resolution: {integrity: sha512-mqEG8+vFh5w0ZZC+R8VCOdSk998Hy93pIDuwYpfMAWgYwVhFaIMOLn1fZw0w2DhTs5+ONHHwMJ6uVXtuuqOLQQ==} + '@aws-sdk/types@3.922.0': + resolution: {integrity: sha512-eLA6XjVobAUAMivvM7DBL79mnHyrm+32TkXNWZua5mnxF+6kQCfblKKJvxMZLGosO53/Ex46ogim8IY5Nbqv2w==} engines: {node: '>=18.0.0'} '@aws-sdk/util-arn-parser@3.893.0': resolution: {integrity: sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-endpoints@3.921.0': - resolution: {integrity: sha512-kuJYRqug6V8gOg401BuK4w4IAVO3575VDR8iYiFw0gPwNIfOXvdlChfsJQoREqwJfif45J4eSmUsFtMfx87BQg==} + '@aws-sdk/util-endpoints@3.922.0': + resolution: {integrity: sha512-4ZdQCSuNMY8HMlR1YN4MRDdXuKd+uQTeKIr5/pIM+g3TjInZoj8imvXudjcrFGA63UF3t92YVTkBq88mg58RXQ==} engines: {node: '>=18.0.0'} '@aws-sdk/util-locate-window@3.893.0': resolution: {integrity: sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-user-agent-browser@3.921.0': - resolution: {integrity: sha512-buhv/ICWr4Nt8bquHOejCiVikBsfEYw4/HSc9U050QebRXIakt50zKYaWDQw4iCMeeqCiwE9mElEaXJAysythg==} + '@aws-sdk/util-user-agent-browser@3.922.0': + resolution: {integrity: sha512-qOJAERZ3Plj1st7M4Q5henl5FRpE30uLm6L9edZqZXGR6c7ry9jzexWamWVpQ4H4xVAVmiO9dIEBAfbq4mduOA==} - '@aws-sdk/util-user-agent-node@3.921.0': - resolution: {integrity: sha512-Ilftai6AMAU1cEaUqIiTxkyj1NupLhP9Eq8HRfVuIH8489J2wLCcOyiLklAgSzBNmrxW+fagxkY+Dg0lFwmcVA==} + '@aws-sdk/util-user-agent-node@3.922.0': + resolution: {integrity: sha512-NrPe/Rsr5kcGunkog0eBV+bY0inkRELsD2SacC4lQZvZiXf8VJ2Y7j+Yq1tB+h+FPLsdt3v9wItIvDf/laAm0Q==} engines: {node: '>=18.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -2933,11 +2942,11 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - '@vitest/expect@4.0.5': - resolution: {integrity: sha512-DJctLVlKoddvP/G389oGmKWNG6GD9frm2FPXARziU80Rjo7SIYxQzb2YFzmQ4fVD3Q5utUYY8nUmWrqsuIlIXQ==} + '@vitest/expect@4.0.6': + resolution: {integrity: sha512-5j8UUlBVhOjhj4lR2Nt9sEV8b4WtbcYh8vnfhTNA2Kn5+smtevzjNq+xlBuVhnFGXiyPPNzGrOVvmyHWkS5QGg==} - '@vitest/mocker@4.0.5': - resolution: {integrity: sha512-iYHIy72LfbK+mL5W8zXROp6oOcJKXWeKcNjcPPsqoa18qIEDrhB6/Z08o0wRajTd6SSSDNw8NCSIHVNOMpz0mw==} + '@vitest/mocker@4.0.6': + resolution: {integrity: sha512-3COEIew5HqdzBFEYN9+u0dT3i/NCwppLnO1HkjGfAP1Vs3vti1Hxm/MvcbC4DAn3Szo1M7M3otiAaT83jvqIjA==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0-0 @@ -2947,25 +2956,25 @@ packages: vite: optional: true - '@vitest/pretty-format@4.0.5': - resolution: {integrity: sha512-t1T/sSdsYyNc5AZl0EMeD0jW9cpJe2cODP0R++ZQe1kTkpgrwEfxGFR/yCG4w8ZybizbXRTHU7lE8sTDD/QsGw==} + '@vitest/pretty-format@4.0.6': + resolution: {integrity: sha512-4vptgNkLIA1W1Nn5X4x8rLJBzPiJwnPc+awKtfBE5hNMVsoAl/JCCPPzNrbf+L4NKgklsis5Yp2gYa+XAS442g==} - '@vitest/runner@4.0.5': - resolution: {integrity: sha512-CQVVe+YEeKSiFBD5gBAmRDQglm4PnMBYzeTmt06t5iWtsUN9StQeeKhYCea/oaqBYilf8sARG6fSctUcEL/UmQ==} + '@vitest/runner@4.0.6': + resolution: {integrity: sha512-trPk5qpd7Jj+AiLZbV/e+KiiaGXZ8ECsRxtnPnCrJr9OW2mLB72Cb824IXgxVz/mVU3Aj4VebY+tDTPn++j1Og==} - '@vitest/snapshot@4.0.5': - resolution: {integrity: sha512-jfmSAeR6xYNEvcD+/RxFGA1bzpqHtkVhgxo2cxXia+Q3xX7m6GpZij07rz+WyQcA/xEGn4eIS1OItkMyWsGBmQ==} + '@vitest/snapshot@4.0.6': + resolution: {integrity: sha512-PaYLt7n2YzuvxhulDDu6c9EosiRuIE+FI2ECKs6yvHyhoga+2TBWI8dwBjs+IeuQaMtZTfioa9tj3uZb7nev1g==} - '@vitest/spy@4.0.5': - resolution: {integrity: sha512-TUmVQpAQign7r8+EnZsgTF3vY9BdGofTUge1rGNbnHn2IN3FChiQoT9lrPz7A7AVUZJU2LAZXl4v66HhsNMhoA==} + '@vitest/spy@4.0.6': + resolution: {integrity: sha512-g9jTUYPV1LtRPRCQfhbMintW7BTQz1n6WXYQYRQ25qkyffA4bjVXjkROokZnv7t07OqfaFKw1lPzqKGk1hmNuQ==} - '@vitest/ui@4.0.5': - resolution: {integrity: sha512-msuwwWsWSKKOid91osirrm0hDUFojT9wde4GSefCj7BHz9SrXbFJSbrrKKEow0AmGhQi/k2FxIWnVifioWbMVg==} + '@vitest/ui@4.0.6': + resolution: {integrity: sha512-1ekpBsYNUm0Xv/0YsTvoSRmiRkmzz9Pma7qQ3Ui76sg2gwp2/ewSWqx4W/HfaN5dF0E8iBbidFo1wGaeqXYIrQ==} peerDependencies: - vitest: 4.0.5 + vitest: 4.0.6 - '@vitest/utils@4.0.5': - resolution: {integrity: sha512-V5RndUgCB5/AfNvK9zxGCrRs99IrPYtMTIdUzJMMFs9nrmE5JXExIEfjVtUteyTRiLfCm+dCRMHf/Uu7Mm8/dg==} + '@vitest/utils@4.0.6': + resolution: {integrity: sha512-bG43VS3iYKrMIZXBo+y8Pti0O7uNju3KvNn6DrQWhQQKcLavMB+0NZfO1/QBAEbq0MaQ3QjNsnnXlGQvsh0Z6A==} '@vscode/markdown-it-katex@1.1.2': resolution: {integrity: sha512-+4IIv5PgrmhKvW/3LpkpkGg257OViEhXkOOgCyj5KMsjsOfnRXkni8XAuuF9Ui5p3B8WnUovlDXAQNb8RJ/RaQ==} @@ -3405,8 +3414,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.8.21: - resolution: {integrity: sha512-JU0h5APyQNsHOlAM7HnQnPToSDQoEBZqzu/YBlqDnEeymPnZDREeXJA3KBMQee+dKteAxZ2AtvQEvVYdZf241Q==} + baseline-browser-mapping@2.8.22: + resolution: {integrity: sha512-/tk9kky/d8T8CTXIQYASLyhAxR5VwL3zct1oAoVTaOUHwrmsGnfbRwNdEq+vOl2BN8i3PcDdP0o4Q+jjKQoFbQ==} hasBin: true binary-extensions@2.3.0: @@ -4723,8 +4732,8 @@ packages: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} - globals@16.4.0: - resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} + globals@16.5.0: + resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} engines: {node: '>=18'} globalthis@1.0.4: @@ -6278,8 +6287,8 @@ packages: peerDependencies: react: ^19.2.0 - react-hook-form@7.65.0: - resolution: {integrity: sha512-xtOzDz063WcXvGWaHgLNrNzlsdFgtUWcb32E6WFaGTd7kPZG3EeDusjdZfUsPwKCKVXy1ZlntifaHZ4l8pAsmw==} + react-hook-form@7.66.0: + resolution: {integrity: sha512-xXBqsWGKrY46ZqaHDo+ZUYiMUgi8suYu5kdrS20EG8KiL7VRQitEbNjm+UcrDYrNi1YLyfpmAeGjCZYXLT9YBw==} engines: {node: '>=18.0.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 @@ -7019,38 +7028,38 @@ packages: typescript: optional: true - turbo-darwin-64@2.5.8: - resolution: {integrity: sha512-Dh5bCACiHO8rUXZLpKw+m3FiHtAp2CkanSyJre+SInEvEr5kIxjGvCK/8MFX8SFRjQuhjtvpIvYYZJB4AGCxNQ==} + turbo-darwin-64@2.6.0: + resolution: {integrity: sha512-6vHnLAubHj8Ib45Knu+oY0ZVCLO7WcibzAvt5b1E72YHqAs4y8meMAGMZM0jLqWPh/9maHDc16/qBCMxtW4pXg==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.5.8: - resolution: {integrity: sha512-f1H/tQC9px7+hmXn6Kx/w8Jd/FneIUnvLlcI/7RGHunxfOkKJKvsoiNzySkoHQ8uq1pJnhJ0xNGTlYM48ZaJOQ==} + turbo-darwin-arm64@2.6.0: + resolution: {integrity: sha512-IU+gWMEXNBw8H0pxvE7nPEa5p6yahxbN8g/Q4Bf0AHymsAFqsScgV0peeNbWybdmY9jk1LPbALOsF2kY1I7ZiQ==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.5.8: - resolution: {integrity: sha512-hMyvc7w7yadBlZBGl/bnR6O+dJTx3XkTeyTTH4zEjERO6ChEs0SrN8jTFj1lueNXKIHh1SnALmy6VctKMGnWfw==} + turbo-linux-64@2.6.0: + resolution: {integrity: sha512-CKoiJ2ZFJLCDsWdRlZg+ew1BkGn8iCEGdePhISVpjsGwkJwSVhVu49z2zKdBeL1IhcSKS2YALwp9ellNZANJxw==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.5.8: - resolution: {integrity: sha512-LQELGa7bAqV2f+3rTMRPnj5G/OHAe2U+0N9BwsZvfMvHSUbsQ3bBMWdSQaYNicok7wOZcHjz2TkESn1hYK6xIQ==} + turbo-linux-arm64@2.6.0: + resolution: {integrity: sha512-WroVCdCvJbrhNxNdw7XB7wHAfPPJPV+IXY+ZKNed+9VdfBu/2mQNfKnvqTuFTH7n+Pdpv8to9qwhXRTJe26upg==} cpu: [arm64] os: [linux] - turbo-windows-64@2.5.8: - resolution: {integrity: sha512-3YdcaW34TrN1AWwqgYL9gUqmZsMT4T7g8Y5Azz+uwwEJW+4sgcJkIi9pYFyU4ZBSjBvkfuPZkGgfStir5BBDJQ==} + turbo-windows-64@2.6.0: + resolution: {integrity: sha512-7pZo5aGQPR+A7RMtWCZHusarJ6y15LQ+o3jOmpMxTic/W6Bad+jSeqo07TWNIseIWjCVzrSv27+0odiYRYtQdA==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.5.8: - resolution: {integrity: sha512-eFC5XzLmgXJfnAK3UMTmVECCwuBcORrWdewoiXBnUm934DY6QN8YowC/srhNnROMpaKaqNeRpoB5FxCww3eteQ==} + turbo-windows-arm64@2.6.0: + resolution: {integrity: sha512-1Ty+NwIksQY7AtFUCPrTpcKQE7zmd/f7aRjdT+qkqGFQjIjFYctEtN7qo4vpQPBgCfS1U3ka83A2u/9CfJQ3wQ==} cpu: [arm64] os: [win32] - turbo@2.5.8: - resolution: {integrity: sha512-5c9Fdsr9qfpT3hA0EyYSFRZj1dVVsb6KIWubA9JBYZ/9ZEAijgUEae0BBR/Xl/wekt4w65/lYLTFaP3JmwSO8w==} + turbo@2.6.0: + resolution: {integrity: sha512-kC5VJqOXo50k0/0jnJDDjibLAXalqT9j7PQ56so0pN+81VR4Fwb2QgIE9dTzT3phqOTQuEXkPh3sCpnv5Isz2g==} hasBin: true type-check@0.4.0: @@ -7331,18 +7340,18 @@ packages: yaml: optional: true - vitest@4.0.5: - resolution: {integrity: sha512-4H+J28MI5oeYgGg3h5BFSkQ1g/2GKK1IR8oorH3a6EQQbb7CwjbnyBjH4PGxw9/6vpwAPNzaeUMp4Js4WJmdXQ==} + vitest@4.0.6: + resolution: {integrity: sha512-gR7INfiVRwnEOkCk47faros/9McCZMp5LM+OMNWGLaDBSvJxIzwjgNFufkuePBNaesGRnLmNfW+ddbUJRZn0nQ==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.0.5 - '@vitest/browser-preview': 4.0.5 - '@vitest/browser-webdriverio': 4.0.5 - '@vitest/ui': 4.0.5 + '@vitest/browser-playwright': 4.0.6 + '@vitest/browser-preview': 4.0.6 + '@vitest/browser-webdriverio': 4.0.6 + '@vitest/ui': 4.0.6 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -7684,20 +7693,20 @@ snapshots: '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.921.0 + '@aws-sdk/types': 3.922.0 tslib: 2.8.1 '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.921.0 + '@aws-sdk/types': 3.922.0 tslib: 2.8.1 '@aws-crypto/sha1-browser@5.2.0': dependencies: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.921.0 + '@aws-sdk/types': 3.922.0 '@aws-sdk/util-locate-window': 3.893.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -7707,7 +7716,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.921.0 + '@aws-sdk/types': 3.922.0 '@aws-sdk/util-locate-window': 3.893.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -7715,7 +7724,7 @@ snapshots: '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.921.0 + '@aws-sdk/types': 3.922.0 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -7724,33 +7733,33 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.921.0 + '@aws-sdk/types': 3.922.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.921.0': + '@aws-sdk/client-s3@3.922.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.921.0 - '@aws-sdk/credential-provider-node': 3.921.0 - '@aws-sdk/middleware-bucket-endpoint': 3.921.0 - '@aws-sdk/middleware-expect-continue': 3.921.0 - '@aws-sdk/middleware-flexible-checksums': 3.921.0 - '@aws-sdk/middleware-host-header': 3.921.0 - '@aws-sdk/middleware-location-constraint': 3.921.0 - '@aws-sdk/middleware-logger': 3.921.0 - '@aws-sdk/middleware-recursion-detection': 3.921.0 - '@aws-sdk/middleware-sdk-s3': 3.921.0 - '@aws-sdk/middleware-ssec': 3.921.0 - '@aws-sdk/middleware-user-agent': 3.921.0 - '@aws-sdk/region-config-resolver': 3.921.0 - '@aws-sdk/signature-v4-multi-region': 3.921.0 - '@aws-sdk/types': 3.921.0 - '@aws-sdk/util-endpoints': 3.921.0 - '@aws-sdk/util-user-agent-browser': 3.921.0 - '@aws-sdk/util-user-agent-node': 3.921.0 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/credential-provider-node': 3.922.0 + '@aws-sdk/middleware-bucket-endpoint': 3.922.0 + '@aws-sdk/middleware-expect-continue': 3.922.0 + '@aws-sdk/middleware-flexible-checksums': 3.922.0 + '@aws-sdk/middleware-host-header': 3.922.0 + '@aws-sdk/middleware-location-constraint': 3.922.0 + '@aws-sdk/middleware-logger': 3.922.0 + '@aws-sdk/middleware-recursion-detection': 3.922.0 + '@aws-sdk/middleware-sdk-s3': 3.922.0 + '@aws-sdk/middleware-ssec': 3.922.0 + '@aws-sdk/middleware-user-agent': 3.922.0 + '@aws-sdk/region-config-resolver': 3.922.0 + '@aws-sdk/signature-v4-multi-region': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@aws-sdk/util-endpoints': 3.922.0 + '@aws-sdk/util-user-agent-browser': 3.922.0 + '@aws-sdk/util-user-agent-node': 3.922.0 '@aws-sdk/xml-builder': 3.921.0 '@smithy/config-resolver': 4.4.1 '@smithy/core': 3.17.2 @@ -7790,20 +7799,20 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.921.0': + '@aws-sdk/client-sso@3.922.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.921.0 - '@aws-sdk/middleware-host-header': 3.921.0 - '@aws-sdk/middleware-logger': 3.921.0 - '@aws-sdk/middleware-recursion-detection': 3.921.0 - '@aws-sdk/middleware-user-agent': 3.921.0 - '@aws-sdk/region-config-resolver': 3.921.0 - '@aws-sdk/types': 3.921.0 - '@aws-sdk/util-endpoints': 3.921.0 - '@aws-sdk/util-user-agent-browser': 3.921.0 - '@aws-sdk/util-user-agent-node': 3.921.0 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/middleware-host-header': 3.922.0 + '@aws-sdk/middleware-logger': 3.922.0 + '@aws-sdk/middleware-recursion-detection': 3.922.0 + '@aws-sdk/middleware-user-agent': 3.922.0 + '@aws-sdk/region-config-resolver': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@aws-sdk/util-endpoints': 3.922.0 + '@aws-sdk/util-user-agent-browser': 3.922.0 + '@aws-sdk/util-user-agent-node': 3.922.0 '@smithy/config-resolver': 4.4.1 '@smithy/core': 3.17.2 '@smithy/fetch-http-handler': 5.3.5 @@ -7833,9 +7842,9 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.921.0': + '@aws-sdk/core@3.922.0': dependencies: - '@aws-sdk/types': 3.921.0 + '@aws-sdk/types': 3.922.0 '@aws-sdk/xml-builder': 3.921.0 '@smithy/core': 3.17.2 '@smithy/node-config-provider': 4.3.4 @@ -7849,18 +7858,18 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.921.0': + '@aws-sdk/credential-provider-env@3.922.0': dependencies: - '@aws-sdk/core': 3.921.0 - '@aws-sdk/types': 3.921.0 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/types': 3.922.0 '@smithy/property-provider': 4.2.4 '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.921.0': + '@aws-sdk/credential-provider-http@3.922.0': dependencies: - '@aws-sdk/core': 3.921.0 - '@aws-sdk/types': 3.921.0 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/types': 3.922.0 '@smithy/fetch-http-handler': 5.3.5 '@smithy/node-http-handler': 4.4.4 '@smithy/property-provider': 4.2.4 @@ -7870,16 +7879,16 @@ snapshots: '@smithy/util-stream': 4.5.5 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.921.0': + '@aws-sdk/credential-provider-ini@3.922.0': dependencies: - '@aws-sdk/core': 3.921.0 - '@aws-sdk/credential-provider-env': 3.921.0 - '@aws-sdk/credential-provider-http': 3.921.0 - '@aws-sdk/credential-provider-process': 3.921.0 - '@aws-sdk/credential-provider-sso': 3.921.0 - '@aws-sdk/credential-provider-web-identity': 3.921.0 - '@aws-sdk/nested-clients': 3.921.0 - '@aws-sdk/types': 3.921.0 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/credential-provider-env': 3.922.0 + '@aws-sdk/credential-provider-http': 3.922.0 + '@aws-sdk/credential-provider-process': 3.922.0 + '@aws-sdk/credential-provider-sso': 3.922.0 + '@aws-sdk/credential-provider-web-identity': 3.922.0 + '@aws-sdk/nested-clients': 3.922.0 + '@aws-sdk/types': 3.922.0 '@smithy/credential-provider-imds': 4.2.4 '@smithy/property-provider': 4.2.4 '@smithy/shared-ini-file-loader': 4.3.4 @@ -7888,15 +7897,15 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.921.0': + '@aws-sdk/credential-provider-node@3.922.0': dependencies: - '@aws-sdk/credential-provider-env': 3.921.0 - '@aws-sdk/credential-provider-http': 3.921.0 - '@aws-sdk/credential-provider-ini': 3.921.0 - '@aws-sdk/credential-provider-process': 3.921.0 - '@aws-sdk/credential-provider-sso': 3.921.0 - '@aws-sdk/credential-provider-web-identity': 3.921.0 - '@aws-sdk/types': 3.921.0 + '@aws-sdk/credential-provider-env': 3.922.0 + '@aws-sdk/credential-provider-http': 3.922.0 + '@aws-sdk/credential-provider-ini': 3.922.0 + '@aws-sdk/credential-provider-process': 3.922.0 + '@aws-sdk/credential-provider-sso': 3.922.0 + '@aws-sdk/credential-provider-web-identity': 3.922.0 + '@aws-sdk/types': 3.922.0 '@smithy/credential-provider-imds': 4.2.4 '@smithy/property-provider': 4.2.4 '@smithy/shared-ini-file-loader': 4.3.4 @@ -7905,21 +7914,21 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.921.0': + '@aws-sdk/credential-provider-process@3.922.0': dependencies: - '@aws-sdk/core': 3.921.0 - '@aws-sdk/types': 3.921.0 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/types': 3.922.0 '@smithy/property-provider': 4.2.4 '@smithy/shared-ini-file-loader': 4.3.4 '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.921.0': + '@aws-sdk/credential-provider-sso@3.922.0': dependencies: - '@aws-sdk/client-sso': 3.921.0 - '@aws-sdk/core': 3.921.0 - '@aws-sdk/token-providers': 3.921.0 - '@aws-sdk/types': 3.921.0 + '@aws-sdk/client-sso': 3.922.0 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/token-providers': 3.922.0 + '@aws-sdk/types': 3.922.0 '@smithy/property-provider': 4.2.4 '@smithy/shared-ini-file-loader': 4.3.4 '@smithy/types': 4.8.1 @@ -7927,11 +7936,11 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.921.0': + '@aws-sdk/credential-provider-web-identity@3.922.0': dependencies: - '@aws-sdk/core': 3.921.0 - '@aws-sdk/nested-clients': 3.921.0 - '@aws-sdk/types': 3.921.0 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/nested-clients': 3.922.0 + '@aws-sdk/types': 3.922.0 '@smithy/property-provider': 4.2.4 '@smithy/shared-ini-file-loader': 4.3.4 '@smithy/types': 4.8.1 @@ -7939,9 +7948,9 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/middleware-bucket-endpoint@3.921.0': + '@aws-sdk/middleware-bucket-endpoint@3.922.0': dependencies: - '@aws-sdk/types': 3.921.0 + '@aws-sdk/types': 3.922.0 '@aws-sdk/util-arn-parser': 3.893.0 '@smithy/node-config-provider': 4.3.4 '@smithy/protocol-http': 5.3.4 @@ -7949,20 +7958,20 @@ snapshots: '@smithy/util-config-provider': 4.2.0 tslib: 2.8.1 - '@aws-sdk/middleware-expect-continue@3.921.0': + '@aws-sdk/middleware-expect-continue@3.922.0': dependencies: - '@aws-sdk/types': 3.921.0 + '@aws-sdk/types': 3.922.0 '@smithy/protocol-http': 5.3.4 '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.921.0': + '@aws-sdk/middleware-flexible-checksums@3.922.0': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.921.0 - '@aws-sdk/types': 3.921.0 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/types': 3.922.0 '@smithy/is-array-buffer': 4.2.0 '@smithy/node-config-provider': 4.3.4 '@smithy/protocol-http': 5.3.4 @@ -7972,37 +7981,37 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.921.0': + '@aws-sdk/middleware-host-header@3.922.0': dependencies: - '@aws-sdk/types': 3.921.0 + '@aws-sdk/types': 3.922.0 '@smithy/protocol-http': 5.3.4 '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/middleware-location-constraint@3.921.0': + '@aws-sdk/middleware-location-constraint@3.922.0': dependencies: - '@aws-sdk/types': 3.921.0 + '@aws-sdk/types': 3.922.0 '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.921.0': + '@aws-sdk/middleware-logger@3.922.0': dependencies: - '@aws-sdk/types': 3.921.0 + '@aws-sdk/types': 3.922.0 '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.921.0': + '@aws-sdk/middleware-recursion-detection@3.922.0': dependencies: - '@aws-sdk/types': 3.921.0 + '@aws-sdk/types': 3.922.0 '@aws/lambda-invoke-store': 0.1.1 '@smithy/protocol-http': 5.3.4 '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.921.0': + '@aws-sdk/middleware-sdk-s3@3.922.0': dependencies: - '@aws-sdk/core': 3.921.0 - '@aws-sdk/types': 3.921.0 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/types': 3.922.0 '@aws-sdk/util-arn-parser': 3.893.0 '@smithy/core': 3.17.2 '@smithy/node-config-provider': 4.3.4 @@ -8016,36 +8025,36 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@aws-sdk/middleware-ssec@3.921.0': + '@aws-sdk/middleware-ssec@3.922.0': dependencies: - '@aws-sdk/types': 3.921.0 + '@aws-sdk/types': 3.922.0 '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.921.0': + '@aws-sdk/middleware-user-agent@3.922.0': dependencies: - '@aws-sdk/core': 3.921.0 - '@aws-sdk/types': 3.921.0 - '@aws-sdk/util-endpoints': 3.921.0 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@aws-sdk/util-endpoints': 3.922.0 '@smithy/core': 3.17.2 '@smithy/protocol-http': 5.3.4 '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.921.0': + '@aws-sdk/nested-clients@3.922.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.921.0 - '@aws-sdk/middleware-host-header': 3.921.0 - '@aws-sdk/middleware-logger': 3.921.0 - '@aws-sdk/middleware-recursion-detection': 3.921.0 - '@aws-sdk/middleware-user-agent': 3.921.0 - '@aws-sdk/region-config-resolver': 3.921.0 - '@aws-sdk/types': 3.921.0 - '@aws-sdk/util-endpoints': 3.921.0 - '@aws-sdk/util-user-agent-browser': 3.921.0 - '@aws-sdk/util-user-agent-node': 3.921.0 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/middleware-host-header': 3.922.0 + '@aws-sdk/middleware-logger': 3.922.0 + '@aws-sdk/middleware-recursion-detection': 3.922.0 + '@aws-sdk/middleware-user-agent': 3.922.0 + '@aws-sdk/region-config-resolver': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@aws-sdk/util-endpoints': 3.922.0 + '@aws-sdk/util-user-agent-browser': 3.922.0 + '@aws-sdk/util-user-agent-node': 3.922.0 '@smithy/config-resolver': 4.4.1 '@smithy/core': 3.17.2 '@smithy/fetch-http-handler': 5.3.5 @@ -8075,28 +8084,28 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.921.0': + '@aws-sdk/region-config-resolver@3.922.0': dependencies: - '@aws-sdk/types': 3.921.0 + '@aws-sdk/types': 3.922.0 '@smithy/config-resolver': 4.4.1 '@smithy/node-config-provider': 4.3.4 '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.921.0': + '@aws-sdk/signature-v4-multi-region@3.922.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.921.0 - '@aws-sdk/types': 3.921.0 + '@aws-sdk/middleware-sdk-s3': 3.922.0 + '@aws-sdk/types': 3.922.0 '@smithy/protocol-http': 5.3.4 '@smithy/signature-v4': 5.3.4 '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/token-providers@3.921.0': + '@aws-sdk/token-providers@3.922.0': dependencies: - '@aws-sdk/core': 3.921.0 - '@aws-sdk/nested-clients': 3.921.0 - '@aws-sdk/types': 3.921.0 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/nested-clients': 3.922.0 + '@aws-sdk/types': 3.922.0 '@smithy/property-provider': 4.2.4 '@smithy/shared-ini-file-loader': 4.3.4 '@smithy/types': 4.8.1 @@ -8104,7 +8113,7 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/types@3.921.0': + '@aws-sdk/types@3.922.0': dependencies: '@smithy/types': 4.8.1 tslib: 2.8.1 @@ -8113,9 +8122,9 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.921.0': + '@aws-sdk/util-endpoints@3.922.0': dependencies: - '@aws-sdk/types': 3.921.0 + '@aws-sdk/types': 3.922.0 '@smithy/types': 4.8.1 '@smithy/url-parser': 4.2.4 '@smithy/util-endpoints': 3.2.4 @@ -8125,17 +8134,17 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.921.0': + '@aws-sdk/util-user-agent-browser@3.922.0': dependencies: - '@aws-sdk/types': 3.921.0 + '@aws-sdk/types': 3.922.0 '@smithy/types': 4.8.1 bowser: 2.12.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.921.0': + '@aws-sdk/util-user-agent-node@3.922.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.921.0 - '@aws-sdk/types': 3.921.0 + '@aws-sdk/middleware-user-agent': 3.922.0 + '@aws-sdk/types': 3.922.0 '@smithy/node-config-provider': 4.3.4 '@smithy/types': 4.8.1 tslib: 2.8.1 @@ -8632,10 +8641,10 @@ snapshots: dependencies: is-negated-glob: 1.0.0 - '@hookform/resolvers@5.2.2(react-hook-form@7.65.0(react@19.2.0))': + '@hookform/resolvers@5.2.2(react-hook-form@7.66.0(react@19.2.0))': dependencies: '@standard-schema/utils': 0.3.0 - react-hook-form: 7.65.0(react@19.2.0) + react-hook-form: 7.66.0(react@19.2.0) '@humanfs/core@0.19.1': {} @@ -10351,54 +10360,54 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/expect@4.0.5': + '@vitest/expect@4.0.6': dependencies: '@standard-schema/spec': 1.0.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.0.5 - '@vitest/utils': 4.0.5 + '@vitest/spy': 4.0.6 + '@vitest/utils': 4.0.6 chai: 6.2.0 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.5(vite@7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))': + '@vitest/mocker@4.0.6(vite@7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))': dependencies: - '@vitest/spy': 4.0.5 + '@vitest/spy': 4.0.6 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: vite: 7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) - '@vitest/pretty-format@4.0.5': + '@vitest/pretty-format@4.0.6': dependencies: tinyrainbow: 3.0.3 - '@vitest/runner@4.0.5': + '@vitest/runner@4.0.6': dependencies: - '@vitest/utils': 4.0.5 + '@vitest/utils': 4.0.6 pathe: 2.0.3 - '@vitest/snapshot@4.0.5': + '@vitest/snapshot@4.0.6': dependencies: - '@vitest/pretty-format': 4.0.5 + '@vitest/pretty-format': 4.0.6 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.0.5': {} + '@vitest/spy@4.0.6': {} - '@vitest/ui@4.0.5(vitest@4.0.5)': + '@vitest/ui@4.0.6(vitest@4.0.6)': dependencies: - '@vitest/utils': 4.0.5 + '@vitest/utils': 4.0.6 fflate: 0.8.2 flatted: 3.3.3 pathe: 2.0.3 sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vitest: 4.0.5(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.5)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) + vitest: 4.0.6(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) - '@vitest/utils@4.0.5': + '@vitest/utils@4.0.6': dependencies: - '@vitest/pretty-format': 4.0.5 + '@vitest/pretty-format': 4.0.6 tinyrainbow: 3.0.3 '@vscode/markdown-it-katex@1.1.2': @@ -11167,7 +11176,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.8.21: {} + baseline-browser-mapping@2.8.22: {} binary-extensions@2.3.0: {} @@ -11209,7 +11218,7 @@ snapshots: browserslist@4.27.0: dependencies: - baseline-browser-mapping: 2.8.21 + baseline-browser-mapping: 2.8.22 caniuse-lite: 1.0.30001752 electron-to-chromium: 1.5.244 node-releases: 2.0.27 @@ -12136,36 +12145,27 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) eslint: 9.38.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)): - dependencies: - debug: 3.2.7 - optionalDependencies: - eslint: 9.38.0(jiti@2.6.1) - eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.38.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-plugin-boundaries@5.1.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1)): + eslint-plugin-boundaries@5.1.0(eslint@9.38.0(jiti@2.6.1)): dependencies: chalk: 4.1.2 eslint: 9.38.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)) micromatch: 4.0.8 transitivePeerDependencies: - '@typescript-eslint/parser' @@ -12173,7 +12173,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -12184,7 +12184,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.38.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -12195,6 +12195,8 @@ snapshots: semver: 6.3.1 string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -12253,7 +12255,7 @@ snapshots: eslint: 9.38.0(jiti@2.6.1) esquery: 1.6.0 find-up-simple: 1.0.1 - globals: 16.4.0 + globals: 16.5.0 indent-string: 5.0.0 is-builtin-module: 5.0.0 jsesc: 3.1.0 @@ -12763,7 +12765,7 @@ snapshots: globals@15.15.0: {} - globals@16.4.0: {} + globals@16.5.0: {} globalthis@1.0.4: dependencies: @@ -14497,7 +14499,7 @@ snapshots: react: 19.2.0 scheduler: 0.27.0 - react-hook-form@7.65.0(react@19.2.0): + react-hook-form@7.66.0(react@19.2.0): dependencies: react: 19.2.0 @@ -15342,32 +15344,32 @@ snapshots: - tsx - yaml - turbo-darwin-64@2.5.8: + turbo-darwin-64@2.6.0: optional: true - turbo-darwin-arm64@2.5.8: + turbo-darwin-arm64@2.6.0: optional: true - turbo-linux-64@2.5.8: + turbo-linux-64@2.6.0: optional: true - turbo-linux-arm64@2.5.8: + turbo-linux-arm64@2.6.0: optional: true - turbo-windows-64@2.5.8: + turbo-windows-64@2.6.0: optional: true - turbo-windows-arm64@2.5.8: + turbo-windows-arm64@2.6.0: optional: true - turbo@2.5.8: + turbo@2.6.0: optionalDependencies: - turbo-darwin-64: 2.5.8 - turbo-darwin-arm64: 2.5.8 - turbo-linux-64: 2.5.8 - turbo-linux-arm64: 2.5.8 - turbo-windows-64: 2.5.8 - turbo-windows-arm64: 2.5.8 + turbo-darwin-64: 2.6.0 + turbo-darwin-arm64: 2.6.0 + turbo-linux-64: 2.6.0 + turbo-linux-arm64: 2.6.0 + turbo-windows-64: 2.6.0 + turbo-windows-arm64: 2.6.0 type-check@0.4.0: dependencies: @@ -15699,15 +15701,15 @@ snapshots: terser: 5.44.0 yaml: 2.8.1 - vitest@4.0.5(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.5)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1): + vitest@4.0.6(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1): dependencies: - '@vitest/expect': 4.0.5 - '@vitest/mocker': 4.0.5(vite@7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)) - '@vitest/pretty-format': 4.0.5 - '@vitest/runner': 4.0.5 - '@vitest/snapshot': 4.0.5 - '@vitest/spy': 4.0.5 - '@vitest/utils': 4.0.5 + '@vitest/expect': 4.0.6 + '@vitest/mocker': 4.0.6(vite@7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)) + '@vitest/pretty-format': 4.0.6 + '@vitest/runner': 4.0.6 + '@vitest/snapshot': 4.0.6 + '@vitest/spy': 4.0.6 + '@vitest/utils': 4.0.6 debug: 4.4.3 es-module-lexer: 1.7.0 expect-type: 1.2.2 @@ -15724,7 +15726,7 @@ snapshots: optionalDependencies: '@types/debug': 4.1.12 '@types/node': 22.17.2 - '@vitest/ui': 4.0.5(vitest@4.0.5) + '@vitest/ui': 4.0.6(vitest@4.0.6) transitivePeerDependencies: - jiti - less diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 178b16ee6..b5cebd650 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -6,7 +6,7 @@ packages: catalogs: lint: - eslint: ^9.38.0 + eslint: 9.38.0 prettier: ^3.6.2 typescript-eslint: ^8.46.2 types: From b5ecc533163668dbdd0d9d98883f4af5e4bc1051 Mon Sep 17 00:00:00 2001 From: Pham Ngoc Duong Date: Sat, 1 Nov 2025 23:40:23 +0700 Subject: [PATCH 07/85] fix(pplx-ext): conflict with no-script addon on firefox --- perplexity/extension/package.json | 2 +- perplexity/extension/src/manifest.base.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/perplexity/extension/package.json b/perplexity/extension/package.json index 367952199..46ef5141b 100644 --- a/perplexity/extension/package.json +++ b/perplexity/extension/package.json @@ -1,6 +1,6 @@ { "name": "pplx-ext", - "version": "2.7.10", + "version": "2.7.11", "author": "pnd280", "type": "module", "scripts": { diff --git a/perplexity/extension/src/manifest.base.ts b/perplexity/extension/src/manifest.base.ts index 31bb99a34..d2d49fa55 100644 --- a/perplexity/extension/src/manifest.base.ts +++ b/perplexity/extension/src/manifest.base.ts @@ -48,7 +48,8 @@ export const baseManifest: ManifestV3Options = { matches: APP_CONFIG["perplexity-ai"].globalMatches, exclude_matches: APP_CONFIG["perplexity-ai"].globalExcludeMatches, js: ["src/entrypoints/content-scripts/index.ts"], - run_at: "document_start", + run_at: + APP_CONFIG.BROWSER === "firefox" ? "document_end" : "document_start", }, { matches: APP_CONFIG["perplexity-ai"].globalMatches, From c218a2d681a56b1662665e7e64879c32c56da38e Mon Sep 17 00:00:00 2001 From: Pham Ngoc Duong Date: Sun, 2 Nov 2025 20:18:34 +0700 Subject: [PATCH 08/85] chore(pplx-ext): update new icon selectors --- .../hide-native-model-selector.css | 9 +------ .../hide-native-buttons.css | 7 +---- .../hide-native-rewrite-dropdowns.css | 5 +--- .../dom-selectors/defaults.ts | 27 ++++++++----------- 4 files changed, 14 insertions(+), 34 deletions(-) diff --git a/perplexity/extension/src/plugins/language-model-selector/hide-native-model-selector.css b/perplexity/extension/src/plugins/language-model-selector/hide-native-model-selector.css index d406a7db2..4cc0bc605 100644 --- a/perplexity/extension/src/plugins/language-model-selector/hide-native-model-selector.css +++ b/perplexity/extension/src/plugins/language-model-selector/hide-native-model-selector.css @@ -14,14 +14,7 @@ [data-cplx-component="cplx-follow-up-query-box"], [data-cplx-component="cplx-space-query-box"] { [data-cplx-component="query-box-cplx-right-toolbar-components-left-wrapper"] - ~ div:has( - > span - > button - > div - > div - > svg - > path[d="M5 5m0 1a1 1 0 0 1 1 -1h12a1 1 0 0 1 1 1v12a1 1 0 0 1 -1 1h-12a1 1 0 0 1 -1 -1z M9 9h6v6h-6z M3 10h2 M3 14h2 M10 3v2 M14 3v2 M21 10h-2 M21 14h-2 M14 21v-2 M10 21v-2"] - ) { + ~ div:has(> span > button svg > use[*|href="#pplx-icon-cpu"]) { display: none; } } diff --git a/perplexity/extension/src/plugins/thread-better-message-copy-buttons/hide-native-buttons.css b/perplexity/extension/src/plugins/thread-better-message-copy-buttons/hide-native-buttons.css index cf8093fdd..9835e809b 100644 --- a/perplexity/extension/src/plugins/thread-better-message-copy-buttons/hide-native-buttons.css +++ b/perplexity/extension/src/plugins/thread-better-message-copy-buttons/hide-native-buttons.css @@ -1,9 +1,4 @@ [data-cplx-component="message-block-footer"] - button:has( - > div - > div - > svg - > path[d="M7 7m0 2.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667z M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1"] - ) { + button:has(> div > div svg > use[*|href="#pplx-icon-copy"]) { display: none; } diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/hide-native-rewrite-dropdowns.css b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/hide-native-rewrite-dropdowns.css index 94cb8bc7f..def5455e3 100644 --- a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/hide-native-rewrite-dropdowns.css +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/hide-native-rewrite-dropdowns.css @@ -1,8 +1,5 @@ [data-cplx-component="message-block-footer"] > :first-child { - > div:has( - svg - > path[d="M4 12v-3a3 3 0 0 1 3 -3h13m-3 -3l3 3l-3 3 M20 12v3a3 3 0 0 1 -3 3h-13m3 3l-3 -3l3 -3"] - ) { + > div:has(svg > use[*|href="#pplx-icon-repeat"]) { display: none; } } diff --git a/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/defaults.ts b/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/defaults.ts index 457edda33..4eff8c944 100644 --- a/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/defaults.ts +++ b/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/defaults.ts @@ -13,7 +13,7 @@ export const DOM_SELECTORS: DomSelectors = { CHILD: { MENU: ".group\\/sidebar-menu", }, - MOBILE_TRIGGER: `.h-headerHeight.backdrop-blur-md button:has(svg>path[d="M4 6l16 0 M4 12l16 0 M4 18l16 0"])`, + MOBILE_TRIGGER: `.h-headerHeight.backdrop-blur-md button:has(svg > use[*|href="#pplx-icon-menu-2"])`, PIN_SIDEBAR_BUTTON: 'button[data-testid="sidebar-pin-sidebar"]', }, THREAD: { @@ -49,18 +49,15 @@ export const DOM_SELECTORS: DomSelectors = { FOOTER: ".gap-y-sm.md\\:gap-y-md.flex.flex-col > .flex.items-center.justify-between", FOOTER_CHILD: { - DISPLAY_MODEL_BUTTON: - 'button:has(svg>path[d="M5 5m0 1a1 1 0 0 1 1 -1h12a1 1 0 0 1 1 1v12a1 1 0 0 1 -1 1h-12a1 1 0 0 1 -1 -1z M9 9h6v6h-6z M3 10h2 M3 14h2 M10 3v2 M14 3v2 M21 10h-2 M21 14h-2 M14 21v-2 M10 21v-2"])', - REWRITE_BUTTON: - 'button:has(svg>path[d="M4 12v-3a3 3 0 0 1 3 -3h13m-3 -3l3 3l-3 3 M20 12v3a3 3 0 0 1 -3 3h-13m3 3l-3 -3l3 -3"])', + DISPLAY_MODEL_BUTTON: 'button:has(svg > use[*|href="#pplx-icon-cpu"])', + REWRITE_BUTTON: 'button:has(svg > use[*|href="#pplx-icon-repeat"])', REWRITE_BUTTON_WRAPPER: - 'div:has(>span>button svg>path[d="M4 12v-3a3 3 0 0 1 3 -3h13m-3 -3l3 3l-3 3 M20 12v3a3 3 0 0 1 -3 3h-13m3 3l-3 -3l3 -3"])', - COPY_BUTTON: - 'button:has(>div>div>svg>path[d="M7 7m0 2.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667z M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1"])', + 'div:has(> span > button svg > use[*|href="#pplx-icon-repeat"])', + COPY_BUTTON: 'button:has(>div>div>svg>use[*|href="#pplx-icon-copy"])', THUMBS_DOWN_BUTTON: - 'button:has(>div>div>svg>path[d="M7 7m0 2.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667z M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1"])', + 'button:has(>div>div>svg>use[*|href="#pplx-icon-thumb-down"])', MISC_BUTTON_WRAPPER: - 'div:has(>span>button>div>div>svg>path[d="M5 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0 M12 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0 M19 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"])', + 'div:has(>span>button svg > use[*|href="#pplx-icon-dots"])', }, IMAGE_GEN: { HEADER: "div:has(+.gap-sm.grid.grid-cols-2)", @@ -106,12 +103,10 @@ export const DOM_SELECTORS: DomSelectors = { EDIT_QUERY: "div[contenteditable='true'][role='textbox']:not([id])", ARBITRARY: "#ask-input,div[contenteditable='true'][role='textbox']", }, - ATTACH_BUTTON: - 'button:has(svg>path[d="M15 7l-6.5 6.5a1.5 1.5 0 0 0 3 3l6.5 -6.5a3 3 0 0 0 -6 -6l-6.5 6.5a4.5 4.5 0 0 0 9 9l6.5 -6.5"])', + ATTACH_BUTTON: 'button:has(svg>use[*|href="#pplx-icon-paperclip"])', SUBMIT_BUTTON: - 'button[data-testid="submit-button"], button:has(>div>div>svg>path[d="M0 12.6663C0 13.4018 0.59792 13.9997 1.33333 13.9997C2.06875 13.9997 2.66667 13.4018 2.66667 12.6663V11.333C2.66667 10.5975 2.06875 9.99967 1.33333 9.99967C0.59792 9.99967 0 10.5975 0 11.333V12.6663ZM6.66667 5.33301C7.40213 5.33301 8 5.93087 8 6.66634V17.333C8 18.0685 7.40213 18.6663 6.66667 18.6663C5.9312 18.6663 5.33333 18.0685 5.33333 17.333V6.66634C5.33333 5.93087 5.9312 5.33301 6.66667 5.33301ZM10.6667 21.333C10.6667 22.0685 11.2645 22.6663 12 22.6663C12.7355 22.6663 13.3333 22.0685 13.3333 21.333V2.66634C13.3333 1.93093 12.7355 1.33301 12 1.33301C11.2645 1.33301 10.6667 1.93093 10.6667 2.66634V21.333ZM17.3333 5.33301C18.0688 5.33301 18.6667 5.93087 18.6667 6.66634V17.333C18.6667 18.0685 18.0688 18.6663 17.3333 18.6663C16.5979 18.6663 16 18.0685 16 17.333V6.66634C16 5.93087 16.5979 5.33301 17.3333 5.33301ZM24 11.333C24 10.5975 23.4021 9.99967 22.6667 9.99967C21.9312 9.99967 21.3333 10.5975 21.3333 11.333V12.6663C21.3333 13.4018 21.9312 13.9997 22.6667 13.9997C23.4021 13.9997 24 13.4018 24 12.6663V11.333Z"]), button:has(>div>div>svg>path[d="M17 4h-10a3 3 0 0 0 -3 3v10a3 3 0 0 0 3 3h10a3 3 0 0 0 3 -3v-10a3 3 0 0 0 -3 -3z"])', - FORK_BUTTON: - 'button:has(svg>path[d="M12 18m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0 M7 6m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0 M17 6m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0 M7 8v2a2 2 0 0 0 2 2h6a2 2 0 0 0 2 -2v-2 M12 12l0 4"])', + 'button[data-testid="submit-button"], button:has(>div>div>svg>path[d="M0 12.6663C0 13.4018 0.59792 13.9997 1.33333 13.9997C2.06875 13.9997 2.66667 13.4018 2.66667 12.6663V11.333C2.66667 10.5975 2.06875 9.99967 1.33333 9.99967C0.59792 9.99967 0 10.5975 0 11.333V12.6663ZM6.66667 5.33301C7.40213 5.33301 8 5.93087 8 6.66634V17.333C8 18.0685 7.40213 18.6663 6.66667 18.6663C5.9312 18.6663 5.33333 18.0685 5.33333 17.333V6.66634C5.33333 5.93087 5.9312 5.33301 6.66667 5.33301ZM10.6667 21.333C10.6667 22.0685 11.2645 22.6663 12 22.6663C12.7355 22.6663 13.3333 22.0685 13.3333 21.333V2.66634C13.3333 1.93093 12.7355 1.33301 12 1.33301C11.2645 1.33301 10.6667 1.93093 10.6667 2.66634V21.333ZM17.3333 5.33301C18.0688 5.33301 18.6667 5.93087 18.6667 6.66634V17.333C18.6667 18.0685 18.0688 18.6663 17.3333 18.6663C16.5979 18.6663 16 18.0685 16 17.333V6.66634C16 5.93087 16.5979 5.33301 17.3333 5.33301ZM24 11.333C24 10.5975 23.4021 9.99967 22.6667 9.99967C21.9312 9.99967 21.3333 10.5975 21.3333 11.333V12.6663C21.3333 13.4018 21.9312 13.9997 22.6667 13.9997C23.4021 13.9997 24 13.4018 24 12.6663V11.333Z"]), button:has(svg > use[*|href="#pplx-icon-git-fork"])', + FORK_BUTTON: 'button:has(svg > use[*|href="#pplx-icon-git-fork"])', PRO_SEARCH_TOGGLE: "button#copilot-toggle", INCOGNITO_TOGGLE: ".mr-xs.flex.shrink-0.items-center", TYPEAHEAD_MENU: "#typeahead-menu", @@ -136,7 +131,7 @@ export const DOM_SELECTORS: DomSelectors = { THREAD_TITLE: ".min-w-0 .cursor-pointer.transition.duration-300.hover\\:opacity-70", THREAD_TITLE_INPUT: 'input[placeholder="Untitled"]', - OVERFLOW_MENU_BUTTON_WRAPPER: `div:has(>span>button>div>div>svg>path[d="M5 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0 M12 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0 M19 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"])`, + OVERFLOW_MENU_BUTTON_WRAPPER: `div:has(>span>button svg > use[*|href="#pplx-icon-dots"])`, }, } as const; From 46a56063a61803dbe29c822647e1b5448964350c Mon Sep 17 00:00:00 2001 From: Pham Ngoc Duong Date: Sun, 2 Nov 2025 22:50:02 +0700 Subject: [PATCH 09/85] fix(pplx-ext:plugin:better-code-blocks): broken language resolver --- perplexity/extension/changelogs/2.7.12.md | 3 +++ .../thread-better-code-blocks/variants/HighlightedCode.tsx | 5 ++--- 2 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 perplexity/extension/changelogs/2.7.12.md diff --git a/perplexity/extension/changelogs/2.7.12.md b/perplexity/extension/changelogs/2.7.12.md new file mode 100644 index 000000000..ebf915404 --- /dev/null +++ b/perplexity/extension/changelogs/2.7.12.md @@ -0,0 +1,3 @@ +## Bug Fixes + +- `Better Code Blocks`: Fixed an issue where code blocks were not highlighted \ No newline at end of file diff --git a/perplexity/extension/src/plugins/thread-better-code-blocks/variants/HighlightedCode.tsx b/perplexity/extension/src/plugins/thread-better-code-blocks/variants/HighlightedCode.tsx index 61f7864d2..0e3fabc8f 100644 --- a/perplexity/extension/src/plugins/thread-better-code-blocks/variants/HighlightedCode.tsx +++ b/perplexity/extension/src/plugins/thread-better-code-blocks/variants/HighlightedCode.tsx @@ -22,9 +22,8 @@ const HighlightedCodeWrapper = memo(() => { const code = codeBlock?.content.code ?? ""; const language = codeBlock?.content.language; - const interpretedLanguage = getInterpretedArtifactLanguage( - language ?? "text", - ); + const interpretedLanguage = + getInterpretedArtifactLanguage(language ?? "text") ?? language; const wrapperRef = useRef(null); const codeRef = useRef(null); From bcaf8fc3042c4d6622d56e50d4f6d81619a34a38 Mon Sep 17 00:00:00 2001 From: Pham Ngoc Duong Date: Mon, 3 Nov 2025 10:08:36 +0700 Subject: [PATCH 10/85] fix(pplx-ext): force clear persistent query cache on update --- .../pages/settings/components/ClearAllDataButton.tsx | 2 +- .../components/ClearRemoteResourcesCache.tsx | 2 +- .../index.ts} | 0 .../global-stores/remote-image-models.loader.ts | 2 +- .../global-stores/remote-language-models.loader.ts | 2 +- .../misc/pplx-user-settings-invalidation.loader.ts | 2 +- .../index.ts | 0 .../persistent-query-client/post-update.bg-worker.ts | 12 ++++++++++++ .../auth-api-prefetch-and-persist.loader.ts | 2 +- .../__async-deps__/plugins-guard/store.loader.ts | 2 +- .../__async-deps__/plugins-states/index.loader.ts | 2 +- .../plugins/__async-deps__/plugins-states/index.ts | 2 +- .../remote-resources/fetched-resources.ts | 2 +- .../dom-observers/thread/message-blocks/utils.ts | 2 +- .../plugins/__core__/dom-selectors/remote.loader.ts | 2 +- .../__ui-groups__/_root/setup-root.loader.tsx | 2 +- .../__ui-groups__/elements/query-box/css.loader.ts | 2 +- .../routes/Home/CometAffiliateDialog.tsx | 2 +- .../src/plugins/better-sidebar/index.loader.ts | 2 +- .../better-sidebar/prevent-layout-shift.loader.ts | 2 +- .../src/plugins/command-menu/cache.loader.ts | 2 +- .../plugins/force-writing-mode/ForceWritingMode.tsx | 2 +- .../src/plugins/home-custom-slogan/loader.ts | 2 +- .../plugins/image-gen-model-selector/store/index.ts | 2 +- .../plugins/image-gen-model-selector/store/loader.ts | 2 +- .../plugins/language-model-selector/css.loader.ts | 2 +- .../network-intercept-middlewares.loader.ts | 2 +- .../src/plugins/thread-artifacts/Artifacts.tsx | 2 +- .../thread-better-code-blocks/BetterCodeBlocks.tsx | 2 +- .../src/plugins/thread-better-code-blocks/utils.ts | 2 +- .../thread-better-message-copy-buttons/css.loader.ts | 2 +- .../thread-better-rewrite-dropdown/css.loader.ts | 2 +- .../thread-better-rewrite-dropdown/handle-rewrite.ts | 2 +- .../src/plugins/thread-raw-headings/loader.ts | 2 +- .../extension/src/plugins/thread-toc/ThreadToc.tsx | 2 +- perplexity/extension/src/plugins/zen-mode/loader.ts | 2 +- .../src/services/infra/query-client/index.ts | 8 ++++++-- 37 files changed, 51 insertions(+), 35 deletions(-) rename perplexity/extension/src/entrypoints/options-page/{persistent-query-client.ts => persistent-query-client/index.ts} (100%) rename perplexity/extension/src/plugins/__async-deps__/{persistent-query-cache => persistent-query-client}/index.ts (100%) create mode 100644 perplexity/extension/src/plugins/__async-deps__/persistent-query-client/post-update.bg-worker.ts diff --git a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/settings/components/ClearAllDataButton.tsx b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/settings/components/ClearAllDataButton.tsx index b390937a3..3bb8dcacc 100644 --- a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/settings/components/ClearAllDataButton.tsx +++ b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/settings/components/ClearAllDataButton.tsx @@ -13,7 +13,7 @@ import { } from "@/components/ui/dialog"; import { Ul } from "@/components/ui/typography"; import { persistentQueryClient } from "@/entrypoints/options-page/persistent-query-client"; -import { persistentQueryClient as csPersistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient as csPersistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { ExtensionSettingsService } from "@/services/infra/extension-api-wrappers/extension-settings"; import { db } from "@/services/infra/indexed-db"; diff --git a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/settings/components/ClearRemoteResourcesCache.tsx b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/settings/components/ClearRemoteResourcesCache.tsx index 94e5b251a..e40912d48 100644 --- a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/settings/components/ClearRemoteResourcesCache.tsx +++ b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/settings/components/ClearRemoteResourcesCache.tsx @@ -1,7 +1,7 @@ import { Button } from "@/components/ui/button"; import { persistentQueryClient } from "@/entrypoints/options-page/persistent-query-client"; import useToggleButtonText from "@/hooks/useToggleButtonText"; -import { persistentQueryClient as csPersistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient as csPersistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; export default function ClearRemoteResourcesCache() { const [buttonText, setButtonText] = useToggleButtonText({ diff --git a/perplexity/extension/src/entrypoints/options-page/persistent-query-client.ts b/perplexity/extension/src/entrypoints/options-page/persistent-query-client/index.ts similarity index 100% rename from perplexity/extension/src/entrypoints/options-page/persistent-query-client.ts rename to perplexity/extension/src/entrypoints/options-page/persistent-query-client/index.ts diff --git a/perplexity/extension/src/plugins/__async-deps__/global-stores/remote-image-models.loader.ts b/perplexity/extension/src/plugins/__async-deps__/global-stores/remote-image-models.loader.ts index bcedef790..c339af6b5 100644 --- a/perplexity/extension/src/plugins/__async-deps__/global-stores/remote-image-models.loader.ts +++ b/perplexity/extension/src/plugins/__async-deps__/global-stores/remote-image-models.loader.ts @@ -1,5 +1,5 @@ import { AsyncLoaderRegistry } from "@/plugins/__async-deps__/async-loaders"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { PplxImageModelsService } from "@/services/externals/cplx-api/remote-resources/pplx-image-models"; import type { ImageModel } from "@/services/externals/cplx-api/remote-resources/pplx-image-models/types"; diff --git a/perplexity/extension/src/plugins/__async-deps__/global-stores/remote-language-models.loader.ts b/perplexity/extension/src/plugins/__async-deps__/global-stores/remote-language-models.loader.ts index 83d5319bc..c2fe08b4d 100644 --- a/perplexity/extension/src/plugins/__async-deps__/global-stores/remote-language-models.loader.ts +++ b/perplexity/extension/src/plugins/__async-deps__/global-stores/remote-language-models.loader.ts @@ -1,5 +1,5 @@ import { AsyncLoaderRegistry } from "@/plugins/__async-deps__/async-loaders"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { PplxLanguageModelsService } from "@/services/externals/cplx-api/remote-resources/pplx-language-models"; import type { LanguageModelsList } from "@/services/externals/cplx-api/remote-resources/pplx-language-models/types"; diff --git a/perplexity/extension/src/plugins/__async-deps__/misc/pplx-user-settings-invalidation.loader.ts b/perplexity/extension/src/plugins/__async-deps__/misc/pplx-user-settings-invalidation.loader.ts index 6f6ae3ec7..2a81ab889 100644 --- a/perplexity/extension/src/plugins/__async-deps__/misc/pplx-user-settings-invalidation.loader.ts +++ b/perplexity/extension/src/plugins/__async-deps__/misc/pplx-user-settings-invalidation.loader.ts @@ -1,7 +1,7 @@ import debounce from "lodash/debounce"; import { AsyncLoaderRegistry } from "@/plugins/__async-deps__/async-loaders"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { NetworkInterceptMiddlewareManagerService } from "@/plugins/__core__/_main-world/network-intercept/_service/service-init.loader"; import { pplxApiQueries } from "@/services/externals/pplx-api/query-keys"; diff --git a/perplexity/extension/src/plugins/__async-deps__/persistent-query-cache/index.ts b/perplexity/extension/src/plugins/__async-deps__/persistent-query-client/index.ts similarity index 100% rename from perplexity/extension/src/plugins/__async-deps__/persistent-query-cache/index.ts rename to perplexity/extension/src/plugins/__async-deps__/persistent-query-client/index.ts diff --git a/perplexity/extension/src/plugins/__async-deps__/persistent-query-client/post-update.bg-worker.ts b/perplexity/extension/src/plugins/__async-deps__/persistent-query-client/post-update.bg-worker.ts new file mode 100644 index 000000000..ede50d689 --- /dev/null +++ b/perplexity/extension/src/plugins/__async-deps__/persistent-query-client/post-update.bg-worker.ts @@ -0,0 +1,12 @@ +import PersistentQueryClient from "@/services/infra/query-client"; + +export default function () { + chrome.runtime.onInstalled.addListener((details) => { + if (details.reason !== chrome.runtime.OnInstalledReason.UPDATE) return; + + console.log("Wiping query cache. REASON: UPDATE"); + + void PersistentQueryClient.wipeQueryCache("contentScript"); + void PersistentQueryClient.wipeQueryCache("optionsPage"); + }); +} diff --git a/perplexity/extension/src/plugins/__async-deps__/plugins-guard/auth-api-prefetch-and-persist.loader.ts b/perplexity/extension/src/plugins/__async-deps__/plugins-guard/auth-api-prefetch-and-persist.loader.ts index 34be9a039..a7c0add08 100644 --- a/perplexity/extension/src/plugins/__async-deps__/plugins-guard/auth-api-prefetch-and-persist.loader.ts +++ b/perplexity/extension/src/plugins/__async-deps__/plugins-guard/auth-api-prefetch-and-persist.loader.ts @@ -1,5 +1,5 @@ import { AsyncLoaderRegistry } from "@/plugins/__async-deps__/async-loaders"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { getPplxAuthOrgStatusQueryObserver, getPplxAuthQueryObserver, diff --git a/perplexity/extension/src/plugins/__async-deps__/plugins-guard/store.loader.ts b/perplexity/extension/src/plugins/__async-deps__/plugins-guard/store.loader.ts index 7761718a5..02a814d90 100644 --- a/perplexity/extension/src/plugins/__async-deps__/plugins-guard/store.loader.ts +++ b/perplexity/extension/src/plugins/__async-deps__/plugins-guard/store.loader.ts @@ -2,7 +2,7 @@ import { QueryObserver } from "@tanstack/react-query"; import { isMobileStore } from "@/hooks/is-mobile-store"; import { AsyncLoaderRegistry } from "@/plugins/__async-deps__/async-loaders"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { pluginGuardsStore, type PluginGuardsStoreType, diff --git a/perplexity/extension/src/plugins/__async-deps__/plugins-states/index.loader.ts b/perplexity/extension/src/plugins/__async-deps__/plugins-states/index.loader.ts index a85045b82..47d349a3c 100644 --- a/perplexity/extension/src/plugins/__async-deps__/plugins-states/index.loader.ts +++ b/perplexity/extension/src/plugins/__async-deps__/plugins-states/index.loader.ts @@ -1,5 +1,5 @@ import { AsyncLoaderRegistry } from "@/plugins/__async-deps__/async-loaders"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { PluginsStatesService } from "@/plugins/__async-deps__/plugins-states"; import { CplxVersionsService } from "@/services/externals/cplx-api/remote-resources/versions"; diff --git a/perplexity/extension/src/plugins/__async-deps__/plugins-states/index.ts b/perplexity/extension/src/plugins/__async-deps__/plugins-states/index.ts index 49cd9a7a1..ddf2f0e17 100644 --- a/perplexity/extension/src/plugins/__async-deps__/plugins-states/index.ts +++ b/perplexity/extension/src/plugins/__async-deps__/plugins-states/index.ts @@ -1,5 +1,5 @@ import { APP_CONFIG } from "@/app.config"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { featureCompatResourceConfig } from "@/plugins/__async-deps__/plugins-states/index.remote-resources"; import type { PluginsEnableStates } from "@/plugins/__async-deps__/plugins-states/types"; import { diff --git a/perplexity/extension/src/plugins/__core__/dom-observers/internal-search-states/remote-resources/fetched-resources.ts b/perplexity/extension/src/plugins/__core__/dom-observers/internal-search-states/remote-resources/fetched-resources.ts index f816f3ac3..e974468df 100644 --- a/perplexity/extension/src/plugins/__core__/dom-observers/internal-search-states/remote-resources/fetched-resources.ts +++ b/perplexity/extension/src/plugins/__core__/dom-observers/internal-search-states/remote-resources/fetched-resources.ts @@ -1,4 +1,4 @@ -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { internalSearchStatesStatesFiberPathResourceConfig, internalSearchStatesValidateFiberPathResourceConfig, diff --git a/perplexity/extension/src/plugins/__core__/dom-observers/thread/message-blocks/utils.ts b/perplexity/extension/src/plugins/__core__/dom-observers/thread/message-blocks/utils.ts index eca25b91b..27477c791 100644 --- a/perplexity/extension/src/plugins/__core__/dom-observers/thread/message-blocks/utils.ts +++ b/perplexity/extension/src/plugins/__core__/dom-observers/thread/message-blocks/utils.ts @@ -1,4 +1,4 @@ -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { DomObserversMainWorldActions } from "@/plugins/__core__/dom-observers/_main-world"; import type { MessageBlockFiberData } from "@/plugins/__core__/dom-observers/_main-world/actions/thread-messages"; import { threadMessageBlocksFiberConfigResourceConfig } from "@/plugins/__core__/dom-observers/thread/message-blocks/remote-resources/index.remote-resources"; diff --git a/perplexity/extension/src/plugins/__core__/dom-selectors/remote.loader.ts b/perplexity/extension/src/plugins/__core__/dom-selectors/remote.loader.ts index 71b8fb0fa..48217458b 100644 --- a/perplexity/extension/src/plugins/__core__/dom-selectors/remote.loader.ts +++ b/perplexity/extension/src/plugins/__core__/dom-selectors/remote.loader.ts @@ -1,5 +1,5 @@ import { AsyncLoaderRegistry } from "@/plugins/__async-deps__/async-loaders"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { DomSelectorsService } from "@/plugins/__core__/dom-selectors/service-init.loader"; import { domSelectorsResourceConfig } from "@/services/externals/cplx-api/versioned-remote-resources/dom-selectors/index.remote-resources"; import type { DomSelectors } from "@/services/externals/cplx-api/versioned-remote-resources/dom-selectors/types"; diff --git a/perplexity/extension/src/plugins/__ui-groups__/_root/setup-root.loader.tsx b/perplexity/extension/src/plugins/__ui-groups__/_root/setup-root.loader.tsx index 9ec951f12..11e0e36d9 100644 --- a/perplexity/extension/src/plugins/__ui-groups__/_root/setup-root.loader.tsx +++ b/perplexity/extension/src/plugins/__ui-groups__/_root/setup-root.loader.tsx @@ -3,7 +3,7 @@ import { createRoot } from "react-dom/client"; import { RouterProvider } from "react-router-dom"; import { AsyncLoaderRegistry } from "@/plugins/__async-deps__/async-loaders"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { createRouter } from "@/plugins/__core__/hash-router/router"; import CsUiRoot from "@/plugins/__ui-groups__/_root/CsUiRoot"; diff --git a/perplexity/extension/src/plugins/__ui-groups__/elements/query-box/css.loader.ts b/perplexity/extension/src/plugins/__ui-groups__/elements/query-box/css.loader.ts index d1d0880cc..dae48ac07 100644 --- a/perplexity/extension/src/plugins/__ui-groups__/elements/query-box/css.loader.ts +++ b/perplexity/extension/src/plugins/__ui-groups__/elements/query-box/css.loader.ts @@ -1,5 +1,5 @@ import { globalCssStore } from "@/plugins/__async-deps__/global-stores/global-css-store"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { queryBoxFollowUpQueryBoxNormalizeCssResourceConfig, queryBoxMainQueryBoxNormalizeCssResourceConfig, diff --git a/perplexity/extension/src/plugins/__ui-groups__/routes/Home/CometAffiliateDialog.tsx b/perplexity/extension/src/plugins/__ui-groups__/routes/Home/CometAffiliateDialog.tsx index 7813992f5..8d285083c 100644 --- a/perplexity/extension/src/plugins/__ui-groups__/routes/Home/CometAffiliateDialog.tsx +++ b/perplexity/extension/src/plugins/__ui-groups__/routes/Home/CometAffiliateDialog.tsx @@ -11,7 +11,7 @@ import { DialogHeader, } from "@/components/ui/dialog"; import { Image } from "@/components/ui/image"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { usePluginGuardsStore } from "@/plugins/__async-deps__/plugins-guard/store"; import { cometAffiliateRemoteResourceConfig } from "@/services/externals/cplx-api/remote-resources/comet-affiliate/index.remote-resources"; import { getRemoteResource } from "@/services/externals/cplx-api/remote-resources/utils"; diff --git a/perplexity/extension/src/plugins/better-sidebar/index.loader.ts b/perplexity/extension/src/plugins/better-sidebar/index.loader.ts index 921127fb0..8edffb397 100644 --- a/perplexity/extension/src/plugins/better-sidebar/index.loader.ts +++ b/perplexity/extension/src/plugins/better-sidebar/index.loader.ts @@ -1,5 +1,5 @@ import { AsyncLoaderRegistry } from "@/plugins/__async-deps__/async-loaders"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { betterSidebarNormalizeCssResourceConfig } from "@/plugins/better-sidebar/index.remote-resources"; import { getVersionedRemoteResource } from "@/services/externals/cplx-api/versioned-remote-resources/utils"; import { insertCss } from "@/utils/dom-utils/generics"; diff --git a/perplexity/extension/src/plugins/better-sidebar/prevent-layout-shift.loader.ts b/perplexity/extension/src/plugins/better-sidebar/prevent-layout-shift.loader.ts index 5c498ba18..8ba2f343c 100644 --- a/perplexity/extension/src/plugins/better-sidebar/prevent-layout-shift.loader.ts +++ b/perplexity/extension/src/plugins/better-sidebar/prevent-layout-shift.loader.ts @@ -1,5 +1,5 @@ import { AsyncLoaderRegistry } from "@/plugins/__async-deps__/async-loaders"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { betterSidebarNormalizeCollapsedCssResourceConfig, betterSidebarNormalizeExpandedCssResourceConfig, diff --git a/perplexity/extension/src/plugins/command-menu/cache.loader.ts b/perplexity/extension/src/plugins/command-menu/cache.loader.ts index cd0069258..10ad22667 100644 --- a/perplexity/extension/src/plugins/command-menu/cache.loader.ts +++ b/perplexity/extension/src/plugins/command-menu/cache.loader.ts @@ -1,7 +1,7 @@ import { QueryObserver } from "@tanstack/react-query"; import { AsyncLoaderRegistry } from "@/plugins/__async-deps__/async-loaders"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { pplxApiQueries } from "@/services/externals/pplx-api/query-keys"; declare module "@/plugins/__async-deps__/async-loaders" { diff --git a/perplexity/extension/src/plugins/force-writing-mode/ForceWritingMode.tsx b/perplexity/extension/src/plugins/force-writing-mode/ForceWritingMode.tsx index b2e1cc1e5..1bcac1d58 100644 --- a/perplexity/extension/src/plugins/force-writing-mode/ForceWritingMode.tsx +++ b/perplexity/extension/src/plugins/force-writing-mode/ForceWritingMode.tsx @@ -13,7 +13,7 @@ import { DialogTrigger, } from "@/components/ui/dialog"; import { useInsertCss } from "@/hooks/useInsertCss"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { getActiveQueryBox } from "@/plugins/__ui-groups__/elements/query-box/utils"; import { normalizeCssResourceConfig } from "@/plugins/force-writing-mode/index.remote-resources"; import { useForceWritingModeStore } from "@/plugins/force-writing-mode/store"; diff --git a/perplexity/extension/src/plugins/home-custom-slogan/loader.ts b/perplexity/extension/src/plugins/home-custom-slogan/loader.ts index 33aca1f1a..7556f4a56 100644 --- a/perplexity/extension/src/plugins/home-custom-slogan/loader.ts +++ b/perplexity/extension/src/plugins/home-custom-slogan/loader.ts @@ -1,5 +1,5 @@ import { AsyncLoaderRegistry } from "@/plugins/__async-deps__/async-loaders"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { homeDomObserverStore } from "@/plugins/__core__/dom-observers/home/store"; import { DomSelectorsService } from "@/plugins/__core__/dom-selectors/service-init.loader"; import { homeCustomSloganCssResourceConfig } from "@/plugins/home-custom-slogan/index.remote-resources"; diff --git a/perplexity/extension/src/plugins/image-gen-model-selector/store/index.ts b/perplexity/extension/src/plugins/image-gen-model-selector/store/index.ts index 385878056..772f0f589 100644 --- a/perplexity/extension/src/plugins/image-gen-model-selector/store/index.ts +++ b/perplexity/extension/src/plugins/image-gen-model-selector/store/index.ts @@ -2,7 +2,7 @@ import { subscribeWithSelector } from "zustand/middleware"; import { immer } from "zustand/middleware/immer"; import { createWithEqualityFn } from "zustand/traditional"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { type ImageModel } from "@/services/externals/cplx-api/remote-resources/pplx-image-models/types"; import { PplxApiService } from "@/services/externals/pplx-api"; import { pplxApiQueries } from "@/services/externals/pplx-api/query-keys"; diff --git a/perplexity/extension/src/plugins/image-gen-model-selector/store/loader.ts b/perplexity/extension/src/plugins/image-gen-model-selector/store/loader.ts index c32091fe4..6072b688e 100644 --- a/perplexity/extension/src/plugins/image-gen-model-selector/store/loader.ts +++ b/perplexity/extension/src/plugins/image-gen-model-selector/store/loader.ts @@ -1,7 +1,7 @@ import { QueryObserver } from "@tanstack/react-query"; import { AsyncLoaderRegistry } from "@/plugins/__async-deps__/async-loaders"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { pluginGuardsStore } from "@/plugins/__async-deps__/plugins-guard/store"; import { imageGenModelSelectorStore } from "@/plugins/image-gen-model-selector/store"; import { isImageModelCode } from "@/services/externals/cplx-api/remote-resources/pplx-image-models/types"; diff --git a/perplexity/extension/src/plugins/language-model-selector/css.loader.ts b/perplexity/extension/src/plugins/language-model-selector/css.loader.ts index f8ebda39f..019f44b09 100644 --- a/perplexity/extension/src/plugins/language-model-selector/css.loader.ts +++ b/perplexity/extension/src/plugins/language-model-selector/css.loader.ts @@ -1,5 +1,5 @@ import { globalCssStore } from "@/plugins/__async-deps__/global-stores/global-css-store"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { hideNativeModelSelectorCssResourceConfig } from "@/plugins/language-model-selector/index.remote-resources"; import { getVersionedRemoteResource } from "@/services/externals/cplx-api/versioned-remote-resources/utils"; diff --git a/perplexity/extension/src/plugins/prompt-history/network-intercept-middlewares.loader.ts b/perplexity/extension/src/plugins/prompt-history/network-intercept-middlewares.loader.ts index 5d475a80d..bf87a8346 100644 --- a/perplexity/extension/src/plugins/prompt-history/network-intercept-middlewares.loader.ts +++ b/perplexity/extension/src/plugins/prompt-history/network-intercept-middlewares.loader.ts @@ -1,5 +1,5 @@ import { AsyncLoaderRegistry } from "@/plugins/__async-deps__/async-loaders"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { NetworkInterceptMiddlewareManagerService } from "@/plugins/__core__/_main-world/network-intercept/_service/service-init.loader"; import { parsePerplexityAskEvent } from "@/plugins/__core__/_main-world/network-intercept/utils/parse-perplexity-ask-event"; import { promptHistoryQueries } from "@/plugins/prompt-history/indexed-db/query-keys"; diff --git a/perplexity/extension/src/plugins/thread-artifacts/Artifacts.tsx b/perplexity/extension/src/plugins/thread-artifacts/Artifacts.tsx index 01b257756..ed718d675 100644 --- a/perplexity/extension/src/plugins/thread-artifacts/Artifacts.tsx +++ b/perplexity/extension/src/plugins/thread-artifacts/Artifacts.tsx @@ -1,6 +1,6 @@ import { Portal } from "@/components/ui/portal"; import { useInsertCss } from "@/hooks/useInsertCss"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import useThreadCodeBlock from "@/plugins/__core__/dom-observers/thread/code-blocks/hooks/useThreadCodeBlock"; import { DomSelectorsService } from "@/plugins/__core__/dom-selectors/service-init.loader"; import ArtifactContent from "@/plugins/thread-artifacts/components/ArtifactContent"; diff --git a/perplexity/extension/src/plugins/thread-better-code-blocks/BetterCodeBlocks.tsx b/perplexity/extension/src/plugins/thread-better-code-blocks/BetterCodeBlocks.tsx index dd3a5c747..3b2fea590 100644 --- a/perplexity/extension/src/plugins/thread-better-code-blocks/BetterCodeBlocks.tsx +++ b/perplexity/extension/src/plugins/thread-better-code-blocks/BetterCodeBlocks.tsx @@ -2,7 +2,7 @@ import type { ReactNode } from "react"; import { Portal } from "@/components/ui/portal"; import { useInsertCss } from "@/hooks/useInsertCss"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import useThreadCodeBlock from "@/plugins/__core__/dom-observers/thread/code-blocks/hooks/useThreadCodeBlock"; import { useThreadCodeBlocksDomObserverStore } from "@/plugins/__core__/dom-observers/thread/code-blocks/store"; import { diff --git a/perplexity/extension/src/plugins/thread-better-code-blocks/utils.ts b/perplexity/extension/src/plugins/thread-better-code-blocks/utils.ts index 051d029a2..861153b0c 100644 --- a/perplexity/extension/src/plugins/thread-better-code-blocks/utils.ts +++ b/perplexity/extension/src/plugins/thread-better-code-blocks/utils.ts @@ -1,4 +1,4 @@ -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import type { CodeBlock } from "@/plugins/__core__/dom-observers/thread/code-blocks/types"; import { DomSelectorsService } from "@/plugins/__core__/dom-selectors/service-init.loader"; import { betterCodeBlocksFineGrainedOptionsQueries } from "@/plugins/thread-better-code-blocks/indexed-db/query-keys"; diff --git a/perplexity/extension/src/plugins/thread-better-message-copy-buttons/css.loader.ts b/perplexity/extension/src/plugins/thread-better-message-copy-buttons/css.loader.ts index 7aefb8f60..f0aaba9df 100644 --- a/perplexity/extension/src/plugins/thread-better-message-copy-buttons/css.loader.ts +++ b/perplexity/extension/src/plugins/thread-better-message-copy-buttons/css.loader.ts @@ -1,5 +1,5 @@ import { globalCssStore } from "@/plugins/__async-deps__/global-stores/global-css-store"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { hideNativeCopyButtonsCssResourceConfig } from "@/plugins/thread-better-message-copy-buttons/index.remote-resources"; import { getVersionedRemoteResource } from "@/services/externals/cplx-api/versioned-remote-resources/utils"; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/css.loader.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/css.loader.ts index 8c640078f..d7370759f 100644 --- a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/css.loader.ts +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/css.loader.ts @@ -1,5 +1,5 @@ import { globalCssStore } from "@/plugins/__async-deps__/global-stores/global-css-store"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { threadBetterRewriteDropdownHideNativeDropdownsCssResourceConfig } from "@/plugins/thread-better-rewrite-dropdown/index.remote-resources"; import { getVersionedRemoteResource } from "@/services/externals/cplx-api/versioned-remote-resources/utils"; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/handle-rewrite.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/handle-rewrite.ts index 0b10afde9..00419fce9 100644 --- a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/handle-rewrite.ts +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/handle-rewrite.ts @@ -1,6 +1,6 @@ import { produce } from "immer"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { NetworkInterceptMiddlewareManagerService } from "@/plugins/__core__/_main-world/network-intercept/_service/service-init.loader"; import { encodePerplexityAskEvent, diff --git a/perplexity/extension/src/plugins/thread-raw-headings/loader.ts b/perplexity/extension/src/plugins/thread-raw-headings/loader.ts index 100aa3f0e..7e86a8d7e 100644 --- a/perplexity/extension/src/plugins/thread-raw-headings/loader.ts +++ b/perplexity/extension/src/plugins/thread-raw-headings/loader.ts @@ -1,5 +1,5 @@ import { AsyncLoaderRegistry } from "@/plugins/__async-deps__/async-loaders"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { spaRouteChangeCompleteSubscribe } from "@/plugins/__core__/_main-world/spa-router/utils"; import { threadRawHeadingsCssResourceConfig } from "@/plugins/thread-raw-headings/index.remote-resources"; import { getVersionedRemoteResource } from "@/services/externals/cplx-api/versioned-remote-resources/utils"; diff --git a/perplexity/extension/src/plugins/thread-toc/ThreadToc.tsx b/perplexity/extension/src/plugins/thread-toc/ThreadToc.tsx index 9d0ded061..c7ab6bb6e 100644 --- a/perplexity/extension/src/plugins/thread-toc/ThreadToc.tsx +++ b/perplexity/extension/src/plugins/thread-toc/ThreadToc.tsx @@ -1,5 +1,5 @@ import { useInsertCss } from "@/hooks/useInsertCss"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { useThreadDomObserverStore } from "@/plugins/__core__/dom-observers/thread/store"; import { threadTocCssResourceConfig } from "@/plugins/thread-toc/index.remote-resources"; import { TocMenuToggle } from "@/plugins/thread-toc/TocMenuToggle"; diff --git a/perplexity/extension/src/plugins/zen-mode/loader.ts b/perplexity/extension/src/plugins/zen-mode/loader.ts index 1ce37ac0d..7f7380f82 100644 --- a/perplexity/extension/src/plugins/zen-mode/loader.ts +++ b/perplexity/extension/src/plugins/zen-mode/loader.ts @@ -1,5 +1,5 @@ import { AsyncLoaderRegistry } from "@/plugins/__async-deps__/async-loaders"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-cache"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { commandMenuStore } from "@/plugins/command-menu/index.public"; import { alwaysHideRelatedQuestionsCssResourceConfig, diff --git a/perplexity/extension/src/services/infra/query-client/index.ts b/perplexity/extension/src/services/infra/query-client/index.ts index fa9ea9e0e..daca87f9b 100644 --- a/perplexity/extension/src/services/infra/query-client/index.ts +++ b/perplexity/extension/src/services/infra/query-client/index.ts @@ -110,8 +110,12 @@ export default class PersistentQueryClient { }; wipeQueryCache = async (): Promise => { - void storage.removeItem(`local:queryCacheBuster:${this.id}`); - void this.persister.removeClient(); + await PersistentQueryClient.wipeQueryCache(this.id, this.persister); + }; + + public static wipeQueryCache = async (id: string, persister?: Persister) => { + await storage.removeItem(`local:queryCacheBuster:${id}`); + await (persister ?? createDexiePersister(id)).removeClient(); }; private initInvalidator() { From 0dc9ac3e3df13569d4f28584b5f9efad9fbb2710 Mon Sep 17 00:00:00 2001 From: Pham Ngoc Duong Date: Mon, 3 Nov 2025 15:05:09 +0700 Subject: [PATCH 11/85] chore: update deps --- packages/async-dep-manager/package.json | 2 +- packages/cli-logger/package.json | 2 +- .../examples/extension/package.json | 2 +- packages/comctx-adapters/package.json | 2 +- packages/eslint-config/package.json | 2 +- packages/i18n/package.json | 2 +- packages/typescript-config/package.json | 2 +- packages/weasound/package.json | 2 +- perplexity/extension/cli/package.json | 2 +- perplexity/extension/package.json | 16 +- pnpm-lock.yaml | 1608 +++++++++-------- pnpm-workspace.yaml | 1 + 12 files changed, 833 insertions(+), 810 deletions(-) diff --git a/packages/async-dep-manager/package.json b/packages/async-dep-manager/package.json index 314d59a1c..124734693 100644 --- a/packages/async-dep-manager/package.json +++ b/packages/async-dep-manager/package.json @@ -23,7 +23,7 @@ "@complexity/eslint-config": "workspace:*", "@complexity/typescript-config": "workspace:*", "@types/node": "22.17.2", - "eslint": "9.38.0", + "eslint": "catalog:lint", "globals": "16.5.0", "prettier": "catalog:lint", "tsup": "^8.5.0", diff --git a/packages/cli-logger/package.json b/packages/cli-logger/package.json index 7d82c91b9..f0bf3e85f 100644 --- a/packages/cli-logger/package.json +++ b/packages/cli-logger/package.json @@ -24,6 +24,6 @@ "typescript": "catalog:types" }, "dependencies": { - "eslint": "9.38.0" + "eslint": "catalog:lint" } } diff --git a/packages/comctx-adapters/examples/extension/package.json b/packages/comctx-adapters/examples/extension/package.json index 2ceea033c..edfdb733f 100644 --- a/packages/comctx-adapters/examples/extension/package.json +++ b/packages/comctx-adapters/examples/extension/package.json @@ -21,7 +21,7 @@ "@crxjs/vite-plugin": "^2.2.1", "@types/chrome": "catalog:types", "@types/node": "22.17.2", - "eslint": "9.38.0", + "eslint": "catalog:lint", "globals": "16.5.0", "prettier": "catalog:lint", "typescript": "catalog:types", diff --git a/packages/comctx-adapters/package.json b/packages/comctx-adapters/package.json index 1f16e7854..258a941bd 100644 --- a/packages/comctx-adapters/package.json +++ b/packages/comctx-adapters/package.json @@ -27,7 +27,7 @@ "@complexity/typescript-config": "workspace:*", "@types/chrome": "catalog:types", "@types/node": "22.17.2", - "eslint": "9.38.0", + "eslint": "catalog:lint", "globals": "16.5.0", "prettier": "catalog:lint", "typescript": "catalog:types", diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index 2284b5982..bdbf433e2 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -9,7 +9,7 @@ "devDependencies": { "@eslint/js": "9.38.0", "@limegrass/eslint-plugin-import-alias": "^1.6.0", - "eslint": "9.38.0", + "eslint": "catalog:lint", "eslint-config-prettier": "^10.1.8", "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-import": "^2.32.0", diff --git a/packages/i18n/package.json b/packages/i18n/package.json index f24c3fc94..0d603c852 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -27,7 +27,7 @@ "@types/node": "22.17.2", "@types/react": "^19.2.2", "@types/react-dom": "^19.2.2", - "eslint": "9.38.0", + "eslint": "catalog:lint", "globals": "16.5.0", "prettier": "catalog:lint", "tsup": "^8.5.0", diff --git a/packages/typescript-config/package.json b/packages/typescript-config/package.json index bc4f1ee98..10fb23a36 100644 --- a/packages/typescript-config/package.json +++ b/packages/typescript-config/package.json @@ -3,6 +3,6 @@ "version": "0.0.0", "private": true, "dependencies": { - "eslint": "9.38.0" + "eslint": "catalog:lint" } } diff --git a/packages/weasound/package.json b/packages/weasound/package.json index 4dd70a80c..d8098dc5f 100644 --- a/packages/weasound/package.json +++ b/packages/weasound/package.json @@ -40,6 +40,6 @@ "typescript": "catalog:types" }, "dependencies": { - "eslint": "9.38.0" + "eslint": "catalog:lint" } } diff --git a/perplexity/extension/cli/package.json b/perplexity/extension/cli/package.json index 4909240f5..b33ef96dc 100644 --- a/perplexity/extension/cli/package.json +++ b/perplexity/extension/cli/package.json @@ -30,7 +30,7 @@ "@complexity/typescript-config": "workspace:*", "@types/mime-types": "^3.0.1", "@types/node": "22.17.2", - "eslint": "9.38.0", + "eslint": "catalog:lint", "prettier": "catalog:lint", "typescript": "catalog:types", "typescript-eslint": "catalog:lint" diff --git a/perplexity/extension/package.json b/perplexity/extension/package.json index 46ef5141b..d40841cd0 100644 --- a/perplexity/extension/package.json +++ b/perplexity/extension/package.json @@ -1,6 +1,6 @@ { "name": "pplx-ext", - "version": "2.7.11", + "version": "2.7.12", "author": "pnd280", "type": "module", "scripts": { @@ -19,7 +19,7 @@ "e2e:ui": "pnpm dx:chrome playwright test --ui", "firefox:publish": "cd ./cli && pnpm firefox:publish", "fmt": "prettier --write '**/*.{tsx,ts,css,json}'", - "lint": "eslint ./src --cache", + "lint": "eslint ./src", "lint-staged": "lint-staged", "lintf": "pnpm lint --fix", "lintq": "pnpm lint --quiet", @@ -36,7 +36,7 @@ "zip:firefox": "pnpm dx:firefox gulp createPackage" }, "dependencies": { - "@ark-ui/react": "^5.26.2", + "@ark-ui/react": "^5.27.1", "@codesandbox/sandpack-react": "^2.20.0", "@comctx-adapters/core": "workspace:*", "@complexity/async-dep-registry": "workspace:*", @@ -47,8 +47,8 @@ "@radix-ui/react-scroll-area": "^1.2.10", "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-toast": "^1.2.15", - "@tanstack/react-query": "^5.90.5", - "@tanstack/react-query-persist-client": "^5.90.7", + "@tanstack/react-query": "^5.90.6", + "@tanstack/react-query-persist-client": "^5.90.8", "@uidotdev/usehooks": "^2.4.1", "@webext-core/match-patterns": "^1.0.3", "@wxt-dev/storage": "^1.2.6", @@ -102,7 +102,7 @@ "@complexity/eslint-config": "workspace:*", "@complexity/typescript-config": "workspace:*", "@crxjs/vite-plugin": "^2.2.1", - "@iconify/json": "^2.2.402", + "@iconify/json": "^2.2.403", "@playwright/test": "^1.56.1", "@svgr/core": "^8.1.0", "@svgr/plugin-jsx": "^8.1.0", @@ -127,9 +127,9 @@ "@vitest/ui": "^4.0.6", "babel-plugin-react-compiler": "^1.0.0", "browserslist": "^4.27.0", - "caniuse-lite": "^1.0.30001752", + "caniuse-lite": "^1.0.30001753", "chalk": "5.6.2", - "eslint": "9.38.0", + "eslint": "catalog:lint", "eslint-plugin-boundaries": "^5.1.0", "glob": "^11.0.3", "globals": "16.5.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a9573a3f1..aebbfb5b0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,6 +6,9 @@ settings: catalogs: lint: + eslint: + specifier: 9.38.0 + version: 9.38.0 prettier: specifier: ^3.6.2 version: 3.6.2 @@ -55,7 +58,7 @@ importers: specifier: 22.17.2 version: 22.17.2 eslint: - specifier: 9.38.0 + specifier: catalog:lint version: 9.38.0(jiti@2.6.1) globals: specifier: 16.5.0 @@ -79,7 +82,7 @@ importers: packages/cli-logger: dependencies: eslint: - specifier: 9.38.0 + specifier: catalog:lint version: 9.38.0(jiti@2.6.1) devDependencies: '@complexity/typescript-config': @@ -123,7 +126,7 @@ importers: specifier: 22.17.2 version: 22.17.2 eslint: - specifier: 9.38.0 + specifier: catalog:lint version: 9.38.0(jiti@2.6.1) globals: specifier: 16.5.0 @@ -163,7 +166,7 @@ importers: specifier: 22.17.2 version: 22.17.2 eslint: - specifier: 9.38.0 + specifier: catalog:lint version: 9.38.0(jiti@2.6.1) globals: specifier: 16.5.0 @@ -184,13 +187,13 @@ importers: packages/eslint-config: devDependencies: '@eslint/js': - specifier: ^9.38.0 + specifier: 9.38.0 version: 9.38.0 '@limegrass/eslint-plugin-import-alias': specifier: ^1.6.0 version: 1.6.0(eslint@9.38.0(jiti@2.6.1)) eslint: - specifier: 9.38.0 + specifier: catalog:lint version: 9.38.0(jiti@2.6.1) eslint-config-prettier: specifier: ^10.1.8 @@ -200,7 +203,7 @@ importers: version: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.38.0(jiti@2.6.1)) eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)) + version: 2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)) eslint-plugin-react: specifier: ^7.37.5 version: 7.37.5(eslint@9.38.0(jiti@2.6.1)) @@ -245,7 +248,7 @@ importers: specifier: ^19.2.2 version: 19.2.2(@types/react@19.2.2) eslint: - specifier: 9.38.0 + specifier: catalog:lint version: 9.38.0(jiti@2.6.1) globals: specifier: 16.5.0 @@ -266,13 +269,13 @@ importers: packages/typescript-config: dependencies: eslint: - specifier: 9.38.0 + specifier: catalog:lint version: 9.38.0(jiti@2.6.1) packages/weasound: dependencies: eslint: - specifier: 9.38.0 + specifier: catalog:lint version: 9.38.0(jiti@2.6.1) devDependencies: '@complexity/typescript-config': @@ -300,8 +303,8 @@ importers: perplexity/extension: dependencies: '@ark-ui/react': - specifier: ^5.26.2 - version: 5.26.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: ^5.27.1 + version: 5.27.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@codesandbox/sandpack-react': specifier: ^2.20.0 version: 2.20.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -333,11 +336,11 @@ importers: specifier: ^1.2.15 version: 1.2.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tanstack/react-query': - specifier: ^5.90.5 - version: 5.90.5(react@19.2.0) + specifier: ^5.90.6 + version: 5.90.6(react@19.2.0) '@tanstack/react-query-persist-client': - specifier: ^5.90.7 - version: 5.90.7(@tanstack/react-query@5.90.5(react@19.2.0))(react@19.2.0) + specifier: ^5.90.8 + version: 5.90.8(@tanstack/react-query@5.90.6(react@19.2.0))(react@19.2.0) '@uidotdev/usehooks': specifier: ^2.4.1 version: 2.4.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -493,8 +496,8 @@ importers: specifier: ^2.2.1 version: 2.2.1 '@iconify/json': - specifier: ^2.2.402 - version: 2.2.402 + specifier: ^2.2.403 + version: 2.2.403 '@playwright/test': specifier: ^1.56.1 version: 1.56.1 @@ -518,7 +521,7 @@ importers: version: 5.91.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) '@tanstack/react-query-devtools': specifier: ^5.90.2 - version: 5.90.2(@tanstack/react-query@5.90.5(react@19.2.0))(react@19.2.0) + version: 5.90.2(@tanstack/react-query@5.90.6(react@19.2.0))(react@19.2.0) '@types/chrome': specifier: catalog:types version: 0.1.27 @@ -568,17 +571,17 @@ importers: specifier: ^4.27.0 version: 4.27.0 caniuse-lite: - specifier: ^1.0.30001752 - version: 1.0.30001752 + specifier: ^1.0.30001753 + version: 1.0.30001753 chalk: specifier: 5.6.2 version: 5.6.2 eslint: - specifier: 9.38.0 + specifier: catalog:lint version: 9.38.0(jiti@2.6.1) eslint-plugin-boundaries: specifier: ^5.1.0 - version: 5.1.0(eslint@9.38.0(jiti@2.6.1)) + version: 5.1.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1)) glob: specifier: ^11.0.3 version: 11.0.3 @@ -686,7 +689,7 @@ importers: specifier: 22.17.2 version: 22.17.2 eslint: - specifier: 9.38.0 + specifier: catalog:lint version: 9.38.0(jiti@2.6.1) prettier: specifier: catalog:lint @@ -706,8 +709,8 @@ packages: '@antfu/utils@9.3.0': resolution: {integrity: sha512-9hFT4RauhcUzqOE4f1+frMKLZrgNog5b06I7VmZQV1BkvwvqrbC8EBZf3L1eEL2AKb6rNKjER0sEvJiSP1FXEA==} - '@ark-ui/react@5.26.2': - resolution: {integrity: sha512-qB2i9AoxhXbADTo+LEphrf/mOnxJJP18ya/0lmoZ4LZ4/K7rY4gStPaj79gKJzIkLYpOO1G4sS5ycPk/Btmiig==} + '@ark-ui/react@5.27.1': + resolution: {integrity: sha512-Rg5UPIXMtD0h2JLKS1meQ5qbx5TLLsDoiCpzhbcPCnFyH/c78nqm8ee1RHOjeCnxohNYStSwi49KLzpxttE+Rw==} peerDependencies: react: '>=18.0.0' react-dom: '>=18.0.0' @@ -1046,158 +1049,158 @@ packages: '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - '@esbuild/aix-ppc64@0.25.11': - resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.11': - resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.11': - resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.11': - resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.11': - resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.11': - resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.11': - resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.11': - resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.11': - resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.11': - resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.11': - resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.11': - resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.11': - resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.11': - resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.11': - resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.11': - resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.11': - resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.11': - resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.11': - resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.11': - resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.11': - resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.11': - resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.11': - resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.11': - resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.11': - resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.11': - resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1310,8 +1313,8 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@iconify/json@2.2.402': - resolution: {integrity: sha512-c4fqEUW+JrolUzwQJR5m4BgoAGGlTn8YjelJW1kc0k5b45/PztyNtLC+VT7Rwgc/sPYEDB4gwbQJCiwnJRku7A==} + '@iconify/json@2.2.403': + resolution: {integrity: sha512-TU27b9pVsbYuTKF7i/OHAB5rUscWhe85AEk0vPkDT1MMqV7ZWWxUk5B7j03JHacX5NCtggB1KiCz985wjc7HVQ==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -2534,14 +2537,14 @@ packages: peerDependencies: eslint: ^8.57.0 || ^9.0.0 - '@tanstack/query-core@5.90.5': - resolution: {integrity: sha512-wLamYp7FaDq6ZnNehypKI5fNvxHPfTYylE0m/ZpuuzJfJqhR5Pxg9gvGBHZx4n7J+V5Rg5mZxHHTlv25Zt5u+w==} + '@tanstack/query-core@5.90.6': + resolution: {integrity: sha512-AnZSLF26R8uX+tqb/ivdrwbVdGemdEDm1Q19qM6pry6eOZ6bEYiY7mWhzXT1YDIPTNEVcZ5kYP9nWjoxDLiIVw==} '@tanstack/query-devtools@5.90.1': resolution: {integrity: sha512-GtINOPjPUH0OegJExZ70UahT9ykmAhmtNVcmtdnOZbxLwT7R5OmRztR5Ahe3/Cu7LArEmR6/588tAycuaWb1xQ==} - '@tanstack/query-persist-client-core@5.91.4': - resolution: {integrity: sha512-HZ8kvAbhttLZKUO4ASHl49u7dQXzRVEogi7/6CCZ5BBItWh2hoEUqy9QHUS4ji7iZiuXe4jwTJNzq2VIuxlnsQ==} + '@tanstack/query-persist-client-core@5.91.5': + resolution: {integrity: sha512-wo+8ni3VBNqE2FIo8OiiaxbGNmRgyBalQnLFzupOId9gtOIsr++ADCi0dVnvdf1k+LWGfnijyWFxnXmkDKdf2A==} '@tanstack/react-query-devtools@5.90.2': resolution: {integrity: sha512-vAXJzZuBXtCQtrY3F/yUNJCV4obT/A/n81kb3+YqLbro5Z2+phdAbceO+deU3ywPw8B42oyJlp4FhO0SoivDFQ==} @@ -2549,14 +2552,14 @@ packages: '@tanstack/react-query': ^5.90.2 react: ^18 || ^19 - '@tanstack/react-query-persist-client@5.90.7': - resolution: {integrity: sha512-TlEzewa4YN51ZhbLZ9HzIBTY/b1K7xFJGSm1cUCE+tNnzSUwiLWhoD6H7EvgWb/KJePYDIJ3hGWLwQPdP86fmA==} + '@tanstack/react-query-persist-client@5.90.8': + resolution: {integrity: sha512-IcdOPGmk5KoQQxbsZboyurA9n6CKqdnz7BS2TAuPgbCxhVdpXloQ99hJPOk4QEtV3QhdQyAVrntiGfr/ReYobg==} peerDependencies: - '@tanstack/react-query': ^5.90.5 + '@tanstack/react-query': ^5.90.6 react: ^18 || ^19 - '@tanstack/react-query@5.90.5': - resolution: {integrity: sha512-pN+8UWpxZkEJ/Rnnj2v2Sxpx1WFlaa9L6a4UO89p6tTQbeo+m0MS8oYDjbggrR8QcTyjKoYWKS3xJQGr3ExT8Q==} + '@tanstack/react-query@5.90.6': + resolution: {integrity: sha512-gB1sljYjcobZKxjPbKSa31FUTyr+ROaBdoH+wSSs9Dk+yDCmMs+TkTV3PybRRVLC7ax7q0erJ9LvRWnMktnRAw==} peerDependencies: react: ^18 || ^19 @@ -2991,222 +2994,225 @@ packages: '@wxt-dev/storage@1.2.6': resolution: {integrity: sha512-f6AknnpJvhNHW4s0WqwSGCuZAj0fjP3EVNPBO5kB30pY+3Zt/nqZGqJN6FgBLCSkYjPJ8VL1hNX5LMVmvxQoDw==} - '@zag-js/accordion@1.26.3': - resolution: {integrity: sha512-xZgXTc4AhH0vha5zLjjSj3GZml2LFMhJnZ/F9TU0KEci7xML1U0n2ay4KydgtiEG31/A3j3LLE+vON+/N/0jAg==} + '@zag-js/accordion@1.27.0': + resolution: {integrity: sha512-fRPNZaORLd+pa3dfVMUOhHemf98gq33p0NdwdHwPkl2E2nWsQJkFCbqhAR9DJR/Td5b37rEsmPUtOXMHoKc5dw==} - '@zag-js/anatomy@1.26.3': - resolution: {integrity: sha512-2HL+BDX05zRtctKwrSlYEtxeLdiJZIV5SbEpqTNvbNJ9aZNxHKgg0ciEi0bYZe8qJ70TqfNfwWb2xwRamzedhg==} + '@zag-js/anatomy@1.27.0': + resolution: {integrity: sha512-fzd+sv0Xn+LbculHDHUMdJUuODwqtr/sVrOl5fcfLhwX1qXV91ZNgN6wWsAdvevG9eoMhP3tGxoei57ys7YlWQ==} - '@zag-js/angle-slider@1.26.3': - resolution: {integrity: sha512-tmOcOLiKN+5enp2YobuZkhVCWY8Q78SnGVO4tJgj+IjZ1PU/EJwipAiAXRM1Adl/6MPIwIMe2ag5g+Qi9xIDuw==} + '@zag-js/angle-slider@1.27.0': + resolution: {integrity: sha512-xDLMmHkX3AXpN0eLccvmbaq/zSzYi8G84ucsI5hjeyofdCIq+ZzXulxFesk1eBKXqut40Umc9UjrFWf2NwL/AA==} - '@zag-js/aria-hidden@1.26.3': - resolution: {integrity: sha512-F6P7Ff4iqly4VmxBRZaJoG09QonOIlYDmMRgHH8d8vca7aBmR5InTxy3iOjCZvX3U4xFFednEARRPjncy4Vl6Q==} + '@zag-js/aria-hidden@1.27.0': + resolution: {integrity: sha512-kDUl0eey7wBCNFAdrAxvse4Rbto0OpMaa0wf0rm5w+oB2kp7IqK5Tuq6rF4T72HDZHxs4FMhR4puWpmle+2IqA==} - '@zag-js/async-list@1.26.3': - resolution: {integrity: sha512-rcM4E8ITSpTANSgk6QX7TKbLyewE1iHOYIJ0NKvSLqfLqSXZgjYTVbWnOmt5q3UOhR3paCbxkEtSdX2/ZCNO/A==} + '@zag-js/async-list@1.27.0': + resolution: {integrity: sha512-ts7zxVnt1NHU4VQdBNO3LIkig6Ub2rqWlbJkW3vIhV/2MJsbMya8ZECa2Od7TAYr8Mu4KF0z7qt7JPsnOodImQ==} - '@zag-js/auto-resize@1.26.3': - resolution: {integrity: sha512-/hIJGEHjknBnrbGjz7NqZbRGCldklJEvePMbMi5JnELZIFRCcCKnvaXwq7DS1mYODjsLqxBZRSL4y0hNxExk4Q==} + '@zag-js/auto-resize@1.27.0': + resolution: {integrity: sha512-E4hBld3CTtKz5mtTZDXX+URzHvKRn/C0fvYnP9BopPZfG4GUCLhnBGEGZxAWV/hLZ1/Rq0I0X+g/iU5hRxKngA==} - '@zag-js/avatar@1.26.3': - resolution: {integrity: sha512-CGQunbcfHzDi1p1B51TN+sGLGaBgLTsgHpqKM8YbR385hMuULcUguOwcnx7rFBq/w79QsdrACwhz3LFlZOsyUQ==} + '@zag-js/avatar@1.27.0': + resolution: {integrity: sha512-O3o3UQRyltbOysbkHQKRvfeGfG23iuOvXSIsRWbT5Q8rsAoocz3utlV1uoH00bGTvBPimdoYb4vrnLejJDFKfw==} - '@zag-js/bottom-sheet@1.26.3': - resolution: {integrity: sha512-qhlkSmBz/Ch2piku5h7itWNO0Uit4pTlhICVb8lLf0Q17X7SNxGYW+pMKAQMlL2M4EgA9tV1z/xE1pW4R05F6A==} + '@zag-js/bottom-sheet@1.27.0': + resolution: {integrity: sha512-nswX/7qzF7nGBkMhEQ6UgP//CISUSwzcZIuFJ3RceTNJ1XUarskX/KiC6lf7WTJ2YUPdceRds6Y6EootHGcRHQ==} - '@zag-js/carousel@1.26.3': - resolution: {integrity: sha512-zF7RD7SR/nzl2CDPIp06J3eMXbY2Vk4auMzo9R4puuGN3XSh4+KYmKRt6DH5XmkOd/fFknT3eHH2gNRlpxBaMQ==} + '@zag-js/carousel@1.27.0': + resolution: {integrity: sha512-hjRZnV+5swzKHW9MloViQZpAMHN4e7WKMteiZoH5WeTKcq66RetezmlOiyvBBt3k59PZwk0Y8WFxNA0L94Amzw==} - '@zag-js/checkbox@1.26.3': - resolution: {integrity: sha512-7WcJChF9jKLr3e5aJfLNiMxmAA8iYt2ZEjEmmaL1KRDUyONpig9JMDX5mg4u3iXQvZdmsxCptIYHXwdYjZjr3Q==} + '@zag-js/checkbox@1.27.0': + resolution: {integrity: sha512-nJjGIvGzSOj6t3A/jjDULcSIHIp45Rp+FE100Yad71MDJEfQhXpeHALBGSKJrzn3Bk4QDsmkDrlTXEmXbWtDJg==} - '@zag-js/clipboard@1.26.3': - resolution: {integrity: sha512-Cx8oafXtujYRlBU0XA2aXb78bs3JgNVZ4ikR6cm7Qo1AMUxh7FejIBNVaWGzHxUc5XrfliKGvQzJotyrGS3GDA==} + '@zag-js/clipboard@1.27.0': + resolution: {integrity: sha512-ndEr6zyKj57eHKiTEpNgGNTSRAUFkHKVs5/C1ysgQzDnvSwd+yaSsm4JGYDlmOg5rCCZVY3Cyw4qcsFEQKDiAg==} - '@zag-js/collapsible@1.26.3': - resolution: {integrity: sha512-vPnWRHolQXdXhP0GkNMADZsBuxhLqGzv/krrJitslYOwsKebtrYz3DrIvtLwpRPsED4igzNLv1ihHPa89kaOAA==} + '@zag-js/collapsible@1.27.0': + resolution: {integrity: sha512-IQ88gl+PAEFs4qVrepum8PksykVf2mAKmw+ZSViHnzRYnHGtNEtvgVeJKO9eFEdtMJVtyTKIlExkoQyWdfc9OA==} - '@zag-js/collection@1.26.3': - resolution: {integrity: sha512-AYiIuZZ3Fr8eVH657uKGobf6WU5t7a4f/HfFiekwfvG0U0vsySBP7eOxukMvQJDCRNEKxARW9JyDj9pl4d7T8Q==} + '@zag-js/collection@1.27.0': + resolution: {integrity: sha512-O/2CdEdYbEC8H86CvHRcC31+6+cYPDLWIeGDvylFmwU3qvOLXgWjptDwp/4d60/ni02gPfq7W2qOL2nfMhUH1g==} - '@zag-js/color-picker@1.26.3': - resolution: {integrity: sha512-qsmgl1vHIavY+wH9jHLXlVnbSn+HBbIJy9ysC1vyM1nAM8Qm1P+h1PhojxgPkVujI6QcxSBzA+YcY56ZuSUHdw==} + '@zag-js/color-picker@1.27.0': + resolution: {integrity: sha512-zSM6ZzFlmTcemMH7pNzEsGtwVFmNZc3Nwqno4Fd/1sJSGrkvXAwymYeoRk3PEi0dTcpYwHCn9sCH4M4ZiZJGkw==} - '@zag-js/color-utils@1.26.3': - resolution: {integrity: sha512-II2mfISJc0xLupXHmfc5AABG0pZy0cYwn741yjlbe7orubWnFLZLmVCzLF4b0qpLzYM+c+MnRVAb/YV6t7Mw6A==} + '@zag-js/color-utils@1.27.0': + resolution: {integrity: sha512-ejqLTKM1sE07ZGkaNG1eRCs56hNjHPMgmnZl8GhwOLO7Ku8wnYTNdocdlwYLeV7shV3PFmzl5cVEOH1Dnsifzw==} - '@zag-js/combobox@1.26.3': - resolution: {integrity: sha512-CejmsLlKhxfSg0FkGMMS8JPGnCa3sCHv4hZrqRrBuhUJaLjiH5/VazV+WFlHEDUrSzVWUNeoYiZuqQlBWuIeCA==} + '@zag-js/combobox@1.27.0': + resolution: {integrity: sha512-PuucoFx6LyHPqdr2PaCgbOrlaDTBgeQa8skVIeKSepS6IMEqJztx9HNLbeCgqcticGB/JxTFv0cfdnm+8F97Uw==} - '@zag-js/core@1.26.3': - resolution: {integrity: sha512-NU/uBGEFE5kUDJfvayZuPom/mcvJjjIytBclIO4/dCt1IBo+C1ETbpQjG/RgpfmSjfAs2G/9pQgdqobakyWU2A==} + '@zag-js/core@1.27.0': + resolution: {integrity: sha512-wM5M4DQE1iCnowivXtDrauzM0cwVFWukxrcNFXB2eX0MPMjMjrb3uGdk5Mm9JxKGKLtAlhloOzijjS7JHwW+SQ==} - '@zag-js/date-picker@1.26.3': - resolution: {integrity: sha512-3JZckrr1EI01bEYfKeB4nAgI4f+bWZLQnfOq8LtiL4HnS0a31Z3DYFxk3r49X4dxg3B62j1tlb6DzdQJARaElg==} + '@zag-js/date-picker@1.27.0': + resolution: {integrity: sha512-EpLkY2BnK8GovEOlG31OoqK7iFqt+lRUKmB/AsECdstAwppr1EoklfeCFPX6FKAejuwrSj0+o4Ds6//9poHjag==} peerDependencies: '@internationalized/date': '>=3.0.0' - '@zag-js/date-utils@1.26.3': - resolution: {integrity: sha512-eoWJZzFY3fkTJU7rzFcRLGCecAnJiu1/xHrB317jgHd0eCGUrgJVY2m0h+agWUCIFtt1VdvEbcf9R9rZmQm7LQ==} + '@zag-js/date-utils@1.27.0': + resolution: {integrity: sha512-0f669Pjg0bzV8oE7sxZQlnR0sBQAFv8/UEciP5OYRqIvtILpnxoMKuZIzs1ZHt9w24WScB0k6lIqVKXta4lHjA==} peerDependencies: '@internationalized/date': '>=3.0.0' - '@zag-js/dialog@1.26.3': - resolution: {integrity: sha512-8fRmRdTrmX5o9IRCo9kpldlM+L4boesyU3mDYCGoCxymzUImg8Crr+8y3uUHEKFWdxnlisYfBGbC586kWaaCSQ==} + '@zag-js/dialog@1.27.0': + resolution: {integrity: sha512-YnVApCZ9s1AnmwcPExolFoct6llG2lofkjyFrVxPJkQhxk6/qlqFZdeCZArIW1sNiURmyZZBq7AEfbs7jYXKpQ==} + + '@zag-js/dismissable@1.27.0': + resolution: {integrity: sha512-ttwJb+C/epldAV9nzENJ0a2lExusq9KHSr6hqFC2WM96xDFyCE7pnDw27PFHwNgSUJWBjMgjx0TRJvWSvzwfCg==} - '@zag-js/dismissable@1.26.3': - resolution: {integrity: sha512-THAzkq2KLYq7px+pdIZ4QQoRjF02nxa5WXXVyw+cv7yb+CNcemcNaPtAAIORJhKsQC+1XF1JNiT5TKrvhSprhw==} + '@zag-js/dom-query@1.27.0': + resolution: {integrity: sha512-URe81xXzbwzZd4EIv/bJrrWuQAS9pZbkL789rsHj/nfcumtTipi5TW7O2EccGvI7edgVCPlih+HS75E7exyUOQ==} - '@zag-js/dom-query@1.26.3': - resolution: {integrity: sha512-ZI/EzpWRDFjeSuXiHuCHwFUtFXX7ZNiBiOnsqR5AnbQSTEvYv+Oo803RRuQ+zHDpGSFyYluSnT00/zt4vskXDQ==} + '@zag-js/editable@1.27.0': + resolution: {integrity: sha512-WNQ3pAouF4i1Qp7CdQm1atv9K3XYWR9ILUzOn3K0P8mkv6fqvszt0KMszXxY0Uqf/GvD5lnDI3ZJ0keNUWNMrQ==} - '@zag-js/editable@1.26.3': - resolution: {integrity: sha512-DdlBwOqoXbF+X0uM7k5mYxiKI4eDkX+BYar/DnEifnEgpsTkYMtl3J5B9WmuWmFtmSoTauScHQsVe3OmVCTqTA==} + '@zag-js/file-upload@1.27.0': + resolution: {integrity: sha512-AbJQVHeZI083xWusdZwhLP5bGYqAmYsLk5Wu2N8GRX8cghyLI+9IwKoLGjuM7LBpTTul1tBw/fBr8+4LOodGbw==} - '@zag-js/file-upload@1.26.3': - resolution: {integrity: sha512-SAifHG71HmRyAUHlqj50xjMr0Ua0uDp8qOucgr7kP2xQvxp8ETfJ5LXrvf+IWv67bF4GmXgIH5Tn7OVEY6ETWQ==} + '@zag-js/file-utils@1.27.0': + resolution: {integrity: sha512-jJUR8Q2amS84PuMzEBlTmIrWZmSq2UwPXIF6phAvIA/E9/0S7M4nPu6aWM+b1B4/uxb0yW2Idjq21ybGhbK+sg==} - '@zag-js/file-utils@1.26.3': - resolution: {integrity: sha512-chXv4dL4SeBdGuNvHlPRZDDsIqRZ1YHAX7kHTZhQbp8iqXSZR/XCnwnQg93b7pb6rG9P8oN+f/pYAuKfrulXbA==} + '@zag-js/floating-panel@1.27.0': + resolution: {integrity: sha512-/w0eAeHK53zJ07U3z00RjHX9DJz3YZ5UcBnMleR61ymANVd2ICnyxGG/kr29cmnDdizaUE0PcD4p0dwQpJLLEg==} - '@zag-js/floating-panel@1.26.3': - resolution: {integrity: sha512-Xue020m4gb9K/zboeW+r6bhSzqqwQpuGqfeFqgekP1XZTxGcEBDHO330gngi6hu7gO9DEMVr1sKinJKZ5kgQ2Q==} + '@zag-js/focus-trap@1.27.0': + resolution: {integrity: sha512-UzOQ+MkHeRAHnLxMYHZifDDXXZAa7S7pRGt1rFTKw0J7OnrrybwyDYQaBNmQxjrOTShw90pSp7RBMUz9yuUjPA==} - '@zag-js/focus-trap@1.26.3': - resolution: {integrity: sha512-mzvt9pzZ80T7O3TDcpUc7kybuWcOEO6yWvDUbJybJsMCKMvLG3HpH14gcPGOL41YZ7RTOh5PixdML8/Xb7/5Iw==} + '@zag-js/focus-visible@1.27.0': + resolution: {integrity: sha512-zE53T401uXfdqy1FxfinkqBZ8spE1iXTZ5M+0j2+S62QPwh5UFwbrqO5PSSn2fTkj3KlK6eBYmv6rhvIcFGJCQ==} - '@zag-js/focus-visible@1.26.3': - resolution: {integrity: sha512-gjcOCZeVlqDsCes3z5bmVLmVJQXhs+aMFs3+1JCmOUOT9zfLQ4HLlGfoesG3Zf2h/VUiIV6oZIJDLu3t/iUSig==} + '@zag-js/highlight-word@1.27.0': + resolution: {integrity: sha512-0akVl+GX6VIFOmTuKykkkvkswNJKP8nC9tvjlj1/MeMNKu3rR4UTweVdnPlMeiQtp/oh2ArEoN+lCIzz4iPHBg==} - '@zag-js/highlight-word@1.26.3': - resolution: {integrity: sha512-AylY/vZMPzN4FfZeeURlMmyvS4ytQDvAYFOGLPwJjK9zajIuP7CuIa6DtkAIvhf1hfb4oHtH4MwHA2TA2hfUAQ==} + '@zag-js/hover-card@1.27.0': + resolution: {integrity: sha512-wiBDePKVlVnPqJOGYzXTjza05qmzeDDl0TFz0RPkjc44UZPUWBc/ghgUEW4UP879sI0ip9f2EOFvZJR4jj7N/g==} - '@zag-js/hover-card@1.26.3': - resolution: {integrity: sha512-M6hEQHZnwx4PeGIl3GsMdGFtKvp2f+dYiDttqkhi5DCcWN4S3173mExK7MNFTgqFCGLTqX86w4eIyWRGBWrZ0Q==} + '@zag-js/i18n-utils@1.27.0': + resolution: {integrity: sha512-rWFUTGE+0LkPOOWTmii2M9nNWt+46b7gsEsStrBen+IhRGWKKS+RLr/aJiAC0K4+BZJP0OaEFEMzYZ8IXynSyA==} - '@zag-js/i18n-utils@1.26.3': - resolution: {integrity: sha512-wFCVuUK3/GjOryQYPbsQMKlE7LX2sFgU0JccbzrvvKLe1fBCznESWrYjPd93hA+Dm6myQYQa9maxnJ2HiVB4vA==} + '@zag-js/interact-outside@1.27.0': + resolution: {integrity: sha512-FhOABcaDq0vQwHSEeI9S/9dcNeghLE5t/TwPzquGUmbDxloczVKMOzkZAZJViQkvtHbMjaCDJnURcyP1KDPUOw==} - '@zag-js/interact-outside@1.26.3': - resolution: {integrity: sha512-CBTagsGQ6QXaPISc8SS1wwjdpZNgMJt3ecYCIA0FP7QwUXNSnNVq7izxXwyoSzkO6xLkXS+kiqwd9guKTUBQ0Q==} + '@zag-js/json-tree-utils@1.27.0': + resolution: {integrity: sha512-x8xUgXlF2xNjnUAAeOqSBCC4Lw5oiR/k++EZ3KG5uqgkPBOlpveb9lmTBVGMxGI4v1gG7wqdFF5CeWSR5sLaOw==} - '@zag-js/json-tree-utils@1.26.3': - resolution: {integrity: sha512-SubdKHCnAqZAFd4H0YOCBLFS2ZKP9+eq6+sBlj/2M8hmFPltjSDQWHko5u+/RMo3nKae/FpxLu2yo4CsswKpHA==} + '@zag-js/listbox@1.27.0': + resolution: {integrity: sha512-awND6os+sICTSUxVzckl712TzMrl4bQEhfrMtpYGNgEj9cg33OQd6ljKGllZajqT+zUu+HAuByI9ygm0q9aEJg==} - '@zag-js/listbox@1.26.3': - resolution: {integrity: sha512-oeD5s8R37xTo+sXIEAb4uNzu+RxTfSdojchg7WGBQMQfbgiTyyzSpZeQ1WpvdiRNiI7RREKfCBwNDEE+EWwwHA==} + '@zag-js/live-region@1.27.0': + resolution: {integrity: sha512-zsu534ILXiaoxf0lviJiBoEPkPLY1uy0N/a2hjfdcz2oCIYDcY8WAh7aubRy7gQRrvkAg84PtxkGA0ymTne3jw==} - '@zag-js/live-region@1.26.3': - resolution: {integrity: sha512-of7L/R3sdDmsRU3JhZ0azKWqveCBSsTU6yT9xDocY+m7g4MRyUtNfzaqpVDQeJI1S7BD6rGhL7podYYuRhJUvg==} + '@zag-js/marquee@1.27.0': + resolution: {integrity: sha512-1RtFx8+k4/UfrhVo94dAtFg/GyOyd1QTjOQ4DWmx5hijOtACbi6/QjRWUlep8foyzP4zTwAYszD/ApvZ/OMUTA==} - '@zag-js/menu@1.26.3': - resolution: {integrity: sha512-92GHkFKW6PdG8DUnXlZWJskW+rjWtHUgdPUVOI94EN/+Bz7IqJ0AtVTiR9Sc/tuvxP6RRcBelD1pj+8+wVucfg==} + '@zag-js/menu@1.27.0': + resolution: {integrity: sha512-R1pCj+zxXLmXHAgtkA/QkBSxBU4/2FG+5PNrUhEkBxdoPQdB4oeYdcqxZRyFKWnganQVPy/bcJi3fF1NXjj+HA==} - '@zag-js/number-input@1.26.3': - resolution: {integrity: sha512-Ft/Ot4jJpkaTGS1wK7z9YzdKxqAAKOM8EiGFHcMufPpyGwLIxNmScXNVGTjDqdWIIW3rPPrxLtIlA4ovUe4ZsQ==} + '@zag-js/number-input@1.27.0': + resolution: {integrity: sha512-0FMKxjJLjecX4bB2anDXxPvLuHn3SDyDaZgIqFwSJzr63vSL6X5KRV0G2Y8Rfnu6/HKWNwXmA2jxN/OOPwAYww==} - '@zag-js/pagination@1.26.3': - resolution: {integrity: sha512-dTuDXWx833UUzVfn0HLoTtj0SIfKr5sJl/CEyLaLLS4+GAhDYsPkkPereLSjAL3ffUoKzqkqACh17wI/IibmgQ==} + '@zag-js/pagination@1.27.0': + resolution: {integrity: sha512-rYIf5aY14vNPcK05gL/fsuImgQxZ8YDmfSGZAdosrbgXGzV7oW6HMMq1CtEsruOhJgfd7vp8C1a2KJnmQjjb7Q==} - '@zag-js/password-input@1.26.3': - resolution: {integrity: sha512-rdItTM+TnhW6Wpzt0fPhqLug0BfHUZYSK3+77gny9ZhrBH9XrPXBbHb3ORzmGZfBFuVG+bmF1shI+wg6YS/6rA==} + '@zag-js/password-input@1.27.0': + resolution: {integrity: sha512-MJxiysWKYZU9tD6HwnLuMdriSH0SsS1AtfOD215Gl/rtWTNm2CDujX6BJAX2Gisxki3PqVYLI4VjWo80tucpqw==} - '@zag-js/pin-input@1.26.3': - resolution: {integrity: sha512-4e5h3T9UirAd8+StrHJ180PComxXofg2Pc5NxYs1D73dIKRhbB03Gbbt8ONJg0Pys3HCCcMe5IMzhmmwIdTBCw==} + '@zag-js/pin-input@1.27.0': + resolution: {integrity: sha512-PrOUz/covtfRiwW0l6jDO4ZzFvQkGlxuo+0JgUVbwykUXwT3NWjs+ANdvxETXi6LBQ1r1j2awq6t6lQhAeHkRQ==} - '@zag-js/popover@1.26.3': - resolution: {integrity: sha512-9eohN1s5ha0mwF6AIht9SE6D0Nl40IL4BY8gL4QWiaLZPPuILqzFby7yug+USdQuMNV2sk7ow6khaU2f7DTQEQ==} + '@zag-js/popover@1.27.0': + resolution: {integrity: sha512-uRFuZcJfSitv02OPpmEsDmIKJQF9JprXgrsgnNvbDRMw2njfMIXvoDqQS+duqYrnz78QKJL7TSgDy6xXbaEOig==} - '@zag-js/popper@1.26.3': - resolution: {integrity: sha512-rCBhh+yfMUmBKJkzFvOdeeS3z/uHgbts1lXQ9SZqHBXQ8zQNjSREdQt9E1Ge2lR+ZPtwLpS8adrUtLzLRFc7Uw==} + '@zag-js/popper@1.27.0': + resolution: {integrity: sha512-1eEEdhmIjZ7d9ymCB4QH8iCnPw3SHPNMaIccux3hz1cFZxwkgQprkiMl59BRwXMzM1wBHHQ5B8muznaUVvOMFQ==} - '@zag-js/presence@1.26.3': - resolution: {integrity: sha512-K3jKOcqimLOGRGcywY128NRzUHeUKXVKYALA5yi/gn6EfJRbX/lV/CQGG9dRiVpI+KnpuCIgJ5zr0ojU0d27yw==} + '@zag-js/presence@1.27.0': + resolution: {integrity: sha512-u4YCQteURyDHbf6gy6ko9EScqU1qDUdl7xkuMe2Jl+bKRvpOPShA3/yVwLXaEcwQCIURJSg39huWRuuWYYWYjQ==} - '@zag-js/progress@1.26.3': - resolution: {integrity: sha512-NwCjePJLEhtNypBFvHg74dtzx6TsK4+1lr/2jwDWO7/vTCLzMRa6TzHD/Tt6KJl5SlLKRSPeCRRc3pnOmKC4LA==} + '@zag-js/progress@1.27.0': + resolution: {integrity: sha512-63cZO153qOrt8c/JWbiQ/x1zk3CJb7fhA7ZCNuGsloPgTEUHBtp0X6V01jSR/Y9SEK7ftUHhWUidTdnP56+5AQ==} - '@zag-js/qr-code@1.26.3': - resolution: {integrity: sha512-Tq3TWpECOlUmYiC+8svYaUaocBYH4/psAAl2tq4f2qQdCYsB3c20DAG/x6GaDZPf6EFPC/jSgIjCDeBZGw2g4A==} + '@zag-js/qr-code@1.27.0': + resolution: {integrity: sha512-jaSklNbr+GXwecAn/Ack2tu7YhIsaCtML7YHEEHa23cutVn3JVWH3xaZGkTXlNpfxRbuPUFcX5YRax8hwUkiGg==} - '@zag-js/radio-group@1.26.3': - resolution: {integrity: sha512-3JLamlpsaa5qW2BzQ6qjoSS70DV2E5YBJWdFAYIHKttQMBzxhRux0U3GR7SCVXp6C7xinR+/xxYEt4uexMK2MQ==} + '@zag-js/radio-group@1.27.0': + resolution: {integrity: sha512-VF1d/UlrpdnNN2iL4IzZLu2KBiMopw8qCFvfjSZVthIhEKpPrnc/VgHgZPhYmPveF3+pI22hZ8KUzoacDfd/rA==} - '@zag-js/rating-group@1.26.3': - resolution: {integrity: sha512-4Ki6GtCY5+su2V6080NlYtOwt+DTjvWcJ0SVPqc/TDe6FgefkHhqAlTClKWVR8hocxk5Mq0z3mgZZ/Y2Yzss9Q==} + '@zag-js/rating-group@1.27.0': + resolution: {integrity: sha512-7Mgfgr1UNh9ZF0A7UY5PpT18niMMV6RzrcUFIbBXAIKslfVvjTrT7FPnuT3JJN6BknL6BEYXTvpgf7IEtMyxTg==} - '@zag-js/react@1.26.3': - resolution: {integrity: sha512-Z+O89rAmpMmNTMmdLAambnnwTwsRYMAiUZe7RF5TjlLuWMtV6Nc5TpBii3fqxZ/5S9vaUMtDMb9gsHPEfOR7Kw==} + '@zag-js/react@1.27.0': + resolution: {integrity: sha512-NyO+wd0CN5DmdvbDqOUHMsSnfl3SMFHszB+FqUlIPK5/fkpw/d/z2VCs4qHZ5t12w4goKcb2UKXdzbrqhA4jOQ==} peerDependencies: react: '>=18.0.0' react-dom: '>=18.0.0' - '@zag-js/rect-utils@1.26.3': - resolution: {integrity: sha512-+ayBRgNO0xo+sJmnGfZDTKxHyWj6acAUjELwlcHbT0LIxMULTPxbA+Sf1d8Zz3x4fah9v2UN6/AaIrYnldFxTQ==} + '@zag-js/rect-utils@1.27.0': + resolution: {integrity: sha512-a6WKKURCVxv+c+vSC8K3/c7sHdbGtPNNU26/WRUGDdy9yz6C4cqPMy+43m/0vWF7/+hWLoLLClNQlE76M/PS0Q==} - '@zag-js/remove-scroll@1.26.3': - resolution: {integrity: sha512-vofKmcJqN9AQqH6BXOii6cIQ5wj6w4cMj0psGeMUE5Rh1Xifg6chvp6ZMX0EqlTz5pYuE9e3VLPpuWUEuY+8Hg==} + '@zag-js/remove-scroll@1.27.0': + resolution: {integrity: sha512-4MtYINKEhY0bz84Ot75+FKtRFXCmz8qyhN9zMfcU12lwvdYY07yDAlzaG10kFCGGmf1RDPOwxmtd+Dl1JcRWXQ==} - '@zag-js/scroll-area@1.26.3': - resolution: {integrity: sha512-C35ad+q5tZkZQwgoiUwyB/HoGLiin+DBPKvKcXQjztGMTB8fv/7n0vzKdpbo5BEFV626ys8vKGV/WY9Zkjdj6w==} + '@zag-js/scroll-area@1.27.0': + resolution: {integrity: sha512-QF5y2Myturf4mnZKWuN6x8A3u79QaYN7EYfzhOEoAvtOg2ak5dBYgLR0vuxSPsJIh5vYIt160pPohls886lNgQ==} - '@zag-js/scroll-snap@1.26.3': - resolution: {integrity: sha512-Pzy2p2xAYILg18Z2h8xtVZqxgcITf7igXIJEngR8Tmvg+97NBYHPgl9sp86mNdoVKkQ5FB4ohirYvHrHONIurw==} + '@zag-js/scroll-snap@1.27.0': + resolution: {integrity: sha512-GYhzIkjwl8Oi0LAatKG/0yuPKeY8NzsX1Dvipw1ES8vD3k+bjESf2RY+lc8mQRC3NbOE+UHVA6EfULnxDriBBw==} - '@zag-js/select@1.26.3': - resolution: {integrity: sha512-4T7Y6fd8FZiTuPQWjuBNG6MWDZbVPO74BlEpBJdbDK9LEJnR2yPnDmNS855BAk0ERzw4UWBwX/HbbDDaYwiRiQ==} + '@zag-js/select@1.27.0': + resolution: {integrity: sha512-5IOGaS04vHnMA/3CCTdScoszZGtCsWAUta6qLcC1FGQehwvcoJPPhT2jY6RLE80YdsvUOEdL3hkYPlhH9VsJ5g==} - '@zag-js/signature-pad@1.26.3': - resolution: {integrity: sha512-2oO06kTt96POPkQ1VvXcfSKihHJAdGSKhIQHpi5pqPl5OWCyD7DlqVeeP+IHsoTSOIyR2w1EzEG9PCQFc9F50Q==} + '@zag-js/signature-pad@1.27.0': + resolution: {integrity: sha512-rJ1OPkE2D+WmSpwHitwXw73nNXtrxsc0pEyO07DuY1Ua0M7L5OV18JqDc4mWvEI13itSmXF5rkFtCUxI+fIzbg==} - '@zag-js/slider@1.26.3': - resolution: {integrity: sha512-EIZcljXslieIz6uWe4YOUjrZbLiW5w6LFhlSfszDs4OGnyKxOImiFWEhuArPCGW7CyuyISFy1GWFW+vi5+6Y1w==} + '@zag-js/slider@1.27.0': + resolution: {integrity: sha512-XRccFvA5Grflp0HRLCo+Ru2zUGr9Sk7/RNI2O+RSLKbdifFVQnLFK9WTyHHw1ns0qxMZbU1/lNGk4NFg5hh3UQ==} - '@zag-js/splitter@1.26.3': - resolution: {integrity: sha512-dN4ZbOXv83bBVsDyZxBFmPB/o/0OMcOTVIdZbt7aOe1y2z/As/8omzg6zzhqrIV+ASVJwFl6R+QHMngS2NZFhQ==} + '@zag-js/splitter@1.27.0': + resolution: {integrity: sha512-uZmKai+3vW9nwsoST//6HtGWdLVuQWgNYQTHy0v69borNR30ng5RrQvy4t6P6orXwWmTEfF8t2paJkvWHYy5/Q==} - '@zag-js/steps@1.26.3': - resolution: {integrity: sha512-eM4ytff6eo93J6AlG8OJcKZ7t5XF8SLLHDJFKIGG59GDYtK8oPSdIVkjy6Ud4XvKXhKufZJUqT7qDT8UDOHxww==} + '@zag-js/steps@1.27.0': + resolution: {integrity: sha512-vaiZBPtgQpPNwDPEXRH7KL/UMc/uvPCal5pbVUZYJlA/QbXSIkfWWaaXY1dQHMN92IbNRYWpfvBPEbMHOvwXwQ==} - '@zag-js/store@1.26.3': - resolution: {integrity: sha512-mDBylMkKKobJTUCJmuLDRzZsDRBkwQFcjlyCFQa9fLAjVhfCkF2Y3lAp3MuyqeJa+c7X3BbkXDD/kL2UoiTFMg==} + '@zag-js/store@1.27.0': + resolution: {integrity: sha512-LDK02t58I5YerVpW0t4Q3Jvu/NLv6fufeVo2WuGvYw5T6VJ/aGaPoRV8ENRyoSXuW4DSkVVDrm1jQNXuahK8Jg==} - '@zag-js/switch@1.26.3': - resolution: {integrity: sha512-Fc56yuh0cIf0/8AdRtBS9YVoxIIESQiYf61QMQS/pfO8hBeSFQQmbjeAf8MyOd2QadWwoNKABCiUArP2nBl1Rg==} + '@zag-js/switch@1.27.0': + resolution: {integrity: sha512-OYLG/Aer2l8yJDV/7xXCjpGDn+ODnIODXDHJ8QxWoXYqiJggZeX+lLsEODN9Wfj/Ssb9F0h/zdaMXRgp6IWGEg==} - '@zag-js/tabs@1.26.3': - resolution: {integrity: sha512-3Iqb+TAw49WldJaMczyzhOQl6F/x9QBgMSp7NhE6AIMaityr0ZE3jCU0qYS+F2DPAu7ng87SOCVA0dOaO/J4eg==} + '@zag-js/tabs@1.27.0': + resolution: {integrity: sha512-+PwOMJGjGdcOIpXFyA/zJQaE0d7mboqgAE7GZXkAYZG80pBpQhoEio0RpMg66UvMFEqbjbi6Xb3E4U6Lvt+DtA==} - '@zag-js/tags-input@1.26.3': - resolution: {integrity: sha512-BSzQtfx72zhs4mfBsWReY30HhnKg1KSTzCVThm8oHmkcDGvpDuUbylM2KMsQdgYWTGYHI4FiIzUsUd+RVDOAgw==} + '@zag-js/tags-input@1.27.0': + resolution: {integrity: sha512-xa9/M+5bPr5L4KQjl5X2w7I5NTSspbVcWpFjLw6w2bczo23PeayfOrNDhcFkOenn10OREA7vluVLlLkKJeq48Q==} - '@zag-js/timer@1.26.3': - resolution: {integrity: sha512-VwRvtY8OJSsSii3Is+8iqf48eY2tc5bKEgCOCQ3JKWhlDtj+Z9toXEQzR2aEiCk64M9AnzKFhFjDS+l7GmWIGg==} + '@zag-js/timer@1.27.0': + resolution: {integrity: sha512-7jwRMUsSn+FqXAebFLvgcMLU5G9D6j/zD0GfWhW0SEjUATfnMXf/pfqy/qPkEjxw/A+BntzHJ/wvsmemjbchsw==} - '@zag-js/toast@1.26.3': - resolution: {integrity: sha512-JOLvSHXC4hKlzNb2dDU7tvXIY6U4M+z8ewnHSAOO8Sl8OKTE3pbRU3Q9A0B2qW/3qteQA/P7411e5WrWdxn+9Q==} + '@zag-js/toast@1.27.0': + resolution: {integrity: sha512-Ng6DTh1dNdsTl6xqNJi6QxXxmf2wfA73YQVdLv8AOPG9ppLH/JORrM7XPJl4FQajox7r9mOnAKnHdcPywKZT2A==} - '@zag-js/toggle-group@1.26.3': - resolution: {integrity: sha512-CL6oOih/7R8r2NAq7U9HuR5MYlDmAPmS2q9VZINb415bKYuFEJyGMClFB3B+NFaLy6KG/voYahOBJ1NRsgMnxQ==} + '@zag-js/toggle-group@1.27.0': + resolution: {integrity: sha512-6yw50UiQryDH6M14dr6x6WQpUjocmaQcGASc0JRh69MbjD9fs0EzpjZBEWhTSjB0GrC6+AIrO/5ToAOTMO8RAw==} - '@zag-js/toggle@1.26.3': - resolution: {integrity: sha512-nxsVxkQCTzeOCJcOwqrsIccSf+jjAKmVrmFD0l5IjvZWrypukKPmUFd9BgM7QYTtd3STaQPMMjkYzfFQ/SljzA==} + '@zag-js/toggle@1.27.0': + resolution: {integrity: sha512-NzRp02KUlTPI+R7TnNCWxj483jGAIdBRd3GDHTh/kzGzxpPtGP6S8DkpMs9/0bqgm31kkvYPLb2EjMZD2nP1pg==} - '@zag-js/tooltip@1.26.3': - resolution: {integrity: sha512-givMhlRGWt9PD9JMrA+GBceD2ViQT8MUgb5r/ovDdaahW8xlMkosWIBnjJBafilrg3tw2Oemw1gPwctcPjAlMQ==} + '@zag-js/tooltip@1.27.0': + resolution: {integrity: sha512-6rLC39vAnC196xzw00GNeWephveKrj4goCXw+MEIkJTiKSYM78BcZkAndi929isiyda7XJ2Fb5vJ2oUg1vJgEQ==} - '@zag-js/tour@1.26.3': - resolution: {integrity: sha512-2WqYTpCTo46LWsF/arI+kuCexDDbgyKwE0hYjsK5NKf1BFAsAWpwmZ1Ne1RGDYl52sXMGfGu7tCQhDzGTzWU9w==} + '@zag-js/tour@1.27.0': + resolution: {integrity: sha512-tKsDcYLJJP5LY66hAlGP2lwelW1AjUxg3k4LxxEOdmWP//VlVxw6a7auaSPMeJ5kM3g4bn58CYsTTqlSqNZRmQ==} - '@zag-js/tree-view@1.26.3': - resolution: {integrity: sha512-3P376SKf/poaUUjeobm/qenxaO8ApB/P/rpplkUE3fZVhnwKJbzKoUeNZiTpVX36FaJBb3AwBavmyQxMuYoxiQ==} + '@zag-js/tree-view@1.27.0': + resolution: {integrity: sha512-Y3syrU7ht9gQXM7JNwXeBYos1/dpzyS1Of4uWsmV9mlz08VN0d+zTDwPUH4e2xczaEIFW5LMhttf/AGSGT+3Yw==} - '@zag-js/types@1.26.3': - resolution: {integrity: sha512-fJf2CgNLQuaFCRZzwGP69vWdFPc1bd1sPngzrYxIfT9SpIRFcBUrBa3p8hXlXg3EScx4O8qC0PrMe9NasUXV1Q==} + '@zag-js/types@1.27.0': + resolution: {integrity: sha512-gd9G4C4Nszgs8VYE33aDM76olSExGqJi1J0gkH2Z6X9/isG/7AC3sF2R4ucJtfvnliCEX0I0soGFQiLd53S9HA==} - '@zag-js/utils@1.26.3': - resolution: {integrity: sha512-C5PlGTVfuMYc/GydvyIyxjSoHib9ZNcinLoucZaRjXF4l6ClDPIlujXc11//XZ0EajpxOKNhfjP9m9stj5Vk0A==} + '@zag-js/utils@1.27.0': + resolution: {integrity: sha512-kKaqcQDogeUa3Q9+z1YICBAbBVTPC1RdFdDJ8HJ+RxpbwhsfRmgcYFdtiQu4+nruG82BgoIUtdt9KzQAbM4rHQ==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -3414,8 +3420,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.8.22: - resolution: {integrity: sha512-/tk9kky/d8T8CTXIQYASLyhAxR5VwL3zct1oAoVTaOUHwrmsGnfbRwNdEq+vOl2BN8i3PcDdP0o4Q+jjKQoFbQ==} + baseline-browser-mapping@2.8.23: + resolution: {integrity: sha512-616V5YX4bepJFzNyOfce5Fa8fDJMfoxzOIzDCZwaGL8MKVpFrXqfNUoIpRn9YMI5pXf/VKgzjB4htFMsFKKdiQ==} hasBin: true binary-extensions@2.3.0: @@ -3508,8 +3514,8 @@ packages: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} - caniuse-lite@1.0.30001752: - resolution: {integrity: sha512-vKUk7beoukxE47P5gcVNKkDRzXdVofotshHwfR9vmpeFKxmI5PBpgOMC18LUJUA/DvJ70Y7RveasIBraqsyO/g==} + caniuse-lite@1.0.30001753: + resolution: {integrity: sha512-Bj5H35MD/ebaOV4iDLqPEtiliTN29qkGtEHCwawWn4cYm+bPJM2NsaP30vtZcnERClMzp52J4+aw2UNbK4o+zw==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -4215,8 +4221,8 @@ packages: resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} engines: {node: '>=0.12'} - esbuild@0.25.11: - resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} hasBin: true @@ -4959,8 +4965,8 @@ packages: resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - inline-style-parser@0.2.4: - resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + inline-style-parser@0.2.6: + resolution: {integrity: sha512-gtGXVaBdl5mAes3rPcMedEBm12ibjt1kDMFfheul1wUAOVEJW60voNdMVzVkfLN06O7ZaD/rxhfKgtlgtTbMjg==} inquirer@12.10.0: resolution: {integrity: sha512-K/epfEnDBZj2Q3NMDcgXWZye3nhSPeoJnOh8lcKWrldw54UEZfS4EmAMsAsmVbl7qKi+vjAsy39Sz4fbgRMewg==} @@ -6861,17 +6867,17 @@ packages: stubborn-fs@2.0.0: resolution: {integrity: sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==} - stubborn-utils@1.0.1: - resolution: {integrity: sha512-bwtct4FpoH1eYdSMFc84fxnYynWwsy2u0joj94K+6caiPnjZIpwTLHT2u7CFAS0GumaBZVB5Y2GkJ46mJS76qg==} + stubborn-utils@1.0.2: + resolution: {integrity: sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg==} style-mod@4.1.3: resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==} - style-to-js@1.1.18: - resolution: {integrity: sha512-JFPn62D4kJaPTnhFUI244MThx+FEGbi+9dw1b9yBBQ+1CZpV7QAT8kUtJ7b7EUNdHajjF/0x8fT+16oLJoojLg==} + style-to-js@1.1.19: + resolution: {integrity: sha512-Ev+SgeqiNGT1ufsXyVC5RrJRXdrkRJ1Gol9Qw7Pb72YCKJXrBvP0ckZhBeVSrw2m06DJpei2528uIpjMb4TsoQ==} - style-to-object@1.0.11: - resolution: {integrity: sha512-5A560JmXr7wDyGLK12Nq/EYS38VkGlglVzkis1JEdbGWSnbQIEhZzTJhzURXN5/8WwwFCs/f/VVcmkTppbXLow==} + style-to-object@1.0.12: + resolution: {integrity: sha512-ddJqYnoT4t97QvN2C95bCgt+m7AAgXjVnkk/jxAfmp7EAB8nnqqZYEbMd3em7/vEomDb2LAQKAy1RFfv41mdNw==} stylis@4.3.6: resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} @@ -7624,69 +7630,70 @@ snapshots: '@antfu/utils@9.3.0': {} - '@ark-ui/react@5.26.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@ark-ui/react@5.27.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@internationalized/date': 3.10.0 - '@zag-js/accordion': 1.26.3 - '@zag-js/anatomy': 1.26.3 - '@zag-js/angle-slider': 1.26.3 - '@zag-js/async-list': 1.26.3 - '@zag-js/auto-resize': 1.26.3 - '@zag-js/avatar': 1.26.3 - '@zag-js/bottom-sheet': 1.26.3 - '@zag-js/carousel': 1.26.3 - '@zag-js/checkbox': 1.26.3 - '@zag-js/clipboard': 1.26.3 - '@zag-js/collapsible': 1.26.3 - '@zag-js/collection': 1.26.3 - '@zag-js/color-picker': 1.26.3 - '@zag-js/color-utils': 1.26.3 - '@zag-js/combobox': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/date-picker': 1.26.3(@internationalized/date@3.10.0) - '@zag-js/date-utils': 1.26.3(@internationalized/date@3.10.0) - '@zag-js/dialog': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/editable': 1.26.3 - '@zag-js/file-upload': 1.26.3 - '@zag-js/file-utils': 1.26.3 - '@zag-js/floating-panel': 1.26.3 - '@zag-js/focus-trap': 1.26.3 - '@zag-js/highlight-word': 1.26.3 - '@zag-js/hover-card': 1.26.3 - '@zag-js/i18n-utils': 1.26.3 - '@zag-js/json-tree-utils': 1.26.3 - '@zag-js/listbox': 1.26.3 - '@zag-js/menu': 1.26.3 - '@zag-js/number-input': 1.26.3 - '@zag-js/pagination': 1.26.3 - '@zag-js/password-input': 1.26.3 - '@zag-js/pin-input': 1.26.3 - '@zag-js/popover': 1.26.3 - '@zag-js/presence': 1.26.3 - '@zag-js/progress': 1.26.3 - '@zag-js/qr-code': 1.26.3 - '@zag-js/radio-group': 1.26.3 - '@zag-js/rating-group': 1.26.3 - '@zag-js/react': 1.26.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@zag-js/scroll-area': 1.26.3 - '@zag-js/select': 1.26.3 - '@zag-js/signature-pad': 1.26.3 - '@zag-js/slider': 1.26.3 - '@zag-js/splitter': 1.26.3 - '@zag-js/steps': 1.26.3 - '@zag-js/switch': 1.26.3 - '@zag-js/tabs': 1.26.3 - '@zag-js/tags-input': 1.26.3 - '@zag-js/timer': 1.26.3 - '@zag-js/toast': 1.26.3 - '@zag-js/toggle': 1.26.3 - '@zag-js/toggle-group': 1.26.3 - '@zag-js/tooltip': 1.26.3 - '@zag-js/tour': 1.26.3 - '@zag-js/tree-view': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/accordion': 1.27.0 + '@zag-js/anatomy': 1.27.0 + '@zag-js/angle-slider': 1.27.0 + '@zag-js/async-list': 1.27.0 + '@zag-js/auto-resize': 1.27.0 + '@zag-js/avatar': 1.27.0 + '@zag-js/bottom-sheet': 1.27.0 + '@zag-js/carousel': 1.27.0 + '@zag-js/checkbox': 1.27.0 + '@zag-js/clipboard': 1.27.0 + '@zag-js/collapsible': 1.27.0 + '@zag-js/collection': 1.27.0 + '@zag-js/color-picker': 1.27.0 + '@zag-js/color-utils': 1.27.0 + '@zag-js/combobox': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/date-picker': 1.27.0(@internationalized/date@3.10.0) + '@zag-js/date-utils': 1.27.0(@internationalized/date@3.10.0) + '@zag-js/dialog': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/editable': 1.27.0 + '@zag-js/file-upload': 1.27.0 + '@zag-js/file-utils': 1.27.0 + '@zag-js/floating-panel': 1.27.0 + '@zag-js/focus-trap': 1.27.0 + '@zag-js/highlight-word': 1.27.0 + '@zag-js/hover-card': 1.27.0 + '@zag-js/i18n-utils': 1.27.0 + '@zag-js/json-tree-utils': 1.27.0 + '@zag-js/listbox': 1.27.0 + '@zag-js/marquee': 1.27.0 + '@zag-js/menu': 1.27.0 + '@zag-js/number-input': 1.27.0 + '@zag-js/pagination': 1.27.0 + '@zag-js/password-input': 1.27.0 + '@zag-js/pin-input': 1.27.0 + '@zag-js/popover': 1.27.0 + '@zag-js/presence': 1.27.0 + '@zag-js/progress': 1.27.0 + '@zag-js/qr-code': 1.27.0 + '@zag-js/radio-group': 1.27.0 + '@zag-js/rating-group': 1.27.0 + '@zag-js/react': 1.27.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@zag-js/scroll-area': 1.27.0 + '@zag-js/select': 1.27.0 + '@zag-js/signature-pad': 1.27.0 + '@zag-js/slider': 1.27.0 + '@zag-js/splitter': 1.27.0 + '@zag-js/steps': 1.27.0 + '@zag-js/switch': 1.27.0 + '@zag-js/tabs': 1.27.0 + '@zag-js/tags-input': 1.27.0 + '@zag-js/timer': 1.27.0 + '@zag-js/toast': 1.27.0 + '@zag-js/toggle': 1.27.0 + '@zag-js/toggle-group': 1.27.0 + '@zag-js/tooltip': 1.27.0 + '@zag-js/tour': 1.27.0 + '@zag-js/tree-view': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) @@ -8467,82 +8474,82 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.25.11': + '@esbuild/aix-ppc64@0.25.12': optional: true - '@esbuild/android-arm64@0.25.11': + '@esbuild/android-arm64@0.25.12': optional: true - '@esbuild/android-arm@0.25.11': + '@esbuild/android-arm@0.25.12': optional: true - '@esbuild/android-x64@0.25.11': + '@esbuild/android-x64@0.25.12': optional: true - '@esbuild/darwin-arm64@0.25.11': + '@esbuild/darwin-arm64@0.25.12': optional: true - '@esbuild/darwin-x64@0.25.11': + '@esbuild/darwin-x64@0.25.12': optional: true - '@esbuild/freebsd-arm64@0.25.11': + '@esbuild/freebsd-arm64@0.25.12': optional: true - '@esbuild/freebsd-x64@0.25.11': + '@esbuild/freebsd-x64@0.25.12': optional: true - '@esbuild/linux-arm64@0.25.11': + '@esbuild/linux-arm64@0.25.12': optional: true - '@esbuild/linux-arm@0.25.11': + '@esbuild/linux-arm@0.25.12': optional: true - '@esbuild/linux-ia32@0.25.11': + '@esbuild/linux-ia32@0.25.12': optional: true - '@esbuild/linux-loong64@0.25.11': + '@esbuild/linux-loong64@0.25.12': optional: true - '@esbuild/linux-mips64el@0.25.11': + '@esbuild/linux-mips64el@0.25.12': optional: true - '@esbuild/linux-ppc64@0.25.11': + '@esbuild/linux-ppc64@0.25.12': optional: true - '@esbuild/linux-riscv64@0.25.11': + '@esbuild/linux-riscv64@0.25.12': optional: true - '@esbuild/linux-s390x@0.25.11': + '@esbuild/linux-s390x@0.25.12': optional: true - '@esbuild/linux-x64@0.25.11': + '@esbuild/linux-x64@0.25.12': optional: true - '@esbuild/netbsd-arm64@0.25.11': + '@esbuild/netbsd-arm64@0.25.12': optional: true - '@esbuild/netbsd-x64@0.25.11': + '@esbuild/netbsd-x64@0.25.12': optional: true - '@esbuild/openbsd-arm64@0.25.11': + '@esbuild/openbsd-arm64@0.25.12': optional: true - '@esbuild/openbsd-x64@0.25.11': + '@esbuild/openbsd-x64@0.25.12': optional: true - '@esbuild/openharmony-arm64@0.25.11': + '@esbuild/openharmony-arm64@0.25.12': optional: true - '@esbuild/sunos-x64@0.25.11': + '@esbuild/sunos-x64@0.25.12': optional: true - '@esbuild/win32-arm64@0.25.11': + '@esbuild/win32-arm64@0.25.12': optional: true - '@esbuild/win32-ia32@0.25.11': + '@esbuild/win32-ia32@0.25.12': optional: true - '@esbuild/win32-x64@0.25.11': + '@esbuild/win32-x64@0.25.12': optional: true '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': @@ -8667,7 +8674,7 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@iconify/json@2.2.402': + '@iconify/json@2.2.403': dependencies: '@iconify/types': 2.0.0 pathe: 2.0.3 @@ -9921,29 +9928,29 @@ snapshots: - supports-color - typescript - '@tanstack/query-core@5.90.5': {} + '@tanstack/query-core@5.90.6': {} '@tanstack/query-devtools@5.90.1': {} - '@tanstack/query-persist-client-core@5.91.4': + '@tanstack/query-persist-client-core@5.91.5': dependencies: - '@tanstack/query-core': 5.90.5 + '@tanstack/query-core': 5.90.6 - '@tanstack/react-query-devtools@5.90.2(@tanstack/react-query@5.90.5(react@19.2.0))(react@19.2.0)': + '@tanstack/react-query-devtools@5.90.2(@tanstack/react-query@5.90.6(react@19.2.0))(react@19.2.0)': dependencies: '@tanstack/query-devtools': 5.90.1 - '@tanstack/react-query': 5.90.5(react@19.2.0) + '@tanstack/react-query': 5.90.6(react@19.2.0) react: 19.2.0 - '@tanstack/react-query-persist-client@5.90.7(@tanstack/react-query@5.90.5(react@19.2.0))(react@19.2.0)': + '@tanstack/react-query-persist-client@5.90.8(@tanstack/react-query@5.90.6(react@19.2.0))(react@19.2.0)': dependencies: - '@tanstack/query-persist-client-core': 5.91.4 - '@tanstack/react-query': 5.90.5(react@19.2.0) + '@tanstack/query-persist-client-core': 5.91.5 + '@tanstack/react-query': 5.90.6(react@19.2.0) react: 19.2.0 - '@tanstack/react-query@5.90.5(react@19.2.0)': + '@tanstack/react-query@5.90.6(react@19.2.0)': dependencies: - '@tanstack/query-core': 5.90.5 + '@tanstack/query-core': 5.90.6 react: 19.2.0 '@tybys/wasm-util@0.10.1': @@ -10429,520 +10436,528 @@ snapshots: async-mutex: 0.5.0 dequal: 2.0.3 - '@zag-js/accordion@1.26.3': + '@zag-js/accordion@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/anatomy@1.26.3': {} + '@zag-js/anatomy@1.27.0': {} - '@zag-js/angle-slider@1.26.3': + '@zag-js/angle-slider@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/rect-utils': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/rect-utils': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/aria-hidden@1.26.3': + '@zag-js/aria-hidden@1.27.0': dependencies: - '@zag-js/dom-query': 1.26.3 + '@zag-js/dom-query': 1.27.0 - '@zag-js/async-list@1.26.3': + '@zag-js/async-list@1.27.0': dependencies: - '@zag-js/core': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/core': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/auto-resize@1.26.3': + '@zag-js/auto-resize@1.27.0': dependencies: - '@zag-js/dom-query': 1.26.3 + '@zag-js/dom-query': 1.27.0 - '@zag-js/avatar@1.26.3': + '@zag-js/avatar@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/bottom-sheet@1.26.3': + '@zag-js/bottom-sheet@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/aria-hidden': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dismissable': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/focus-trap': 1.26.3 - '@zag-js/remove-scroll': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/aria-hidden': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dismissable': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/focus-trap': 1.27.0 + '@zag-js/remove-scroll': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/carousel@1.26.3': + '@zag-js/carousel@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/scroll-snap': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/scroll-snap': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/checkbox@1.26.3': + '@zag-js/checkbox@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/focus-visible': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/focus-visible': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/clipboard@1.26.3': + '@zag-js/clipboard@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/collapsible@1.26.3': + '@zag-js/collapsible@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/collection@1.26.3': + '@zag-js/collection@1.27.0': dependencies: - '@zag-js/utils': 1.26.3 + '@zag-js/utils': 1.27.0 - '@zag-js/color-picker@1.26.3': + '@zag-js/color-picker@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/color-utils': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dismissable': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/popper': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/color-utils': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dismissable': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/popper': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/color-utils@1.26.3': + '@zag-js/color-utils@1.27.0': dependencies: - '@zag-js/utils': 1.26.3 + '@zag-js/utils': 1.27.0 - '@zag-js/combobox@1.26.3': + '@zag-js/combobox@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/aria-hidden': 1.26.3 - '@zag-js/collection': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dismissable': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/popper': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/aria-hidden': 1.27.0 + '@zag-js/collection': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dismissable': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/popper': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/core@1.26.3': + '@zag-js/core@1.27.0': dependencies: - '@zag-js/dom-query': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/dom-query': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/date-picker@1.26.3(@internationalized/date@3.10.0)': + '@zag-js/date-picker@1.27.0(@internationalized/date@3.10.0)': dependencies: '@internationalized/date': 3.10.0 - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/date-utils': 1.26.3(@internationalized/date@3.10.0) - '@zag-js/dismissable': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/live-region': 1.26.3 - '@zag-js/popper': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 - - '@zag-js/date-utils@1.26.3(@internationalized/date@3.10.0)': + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/date-utils': 1.27.0(@internationalized/date@3.10.0) + '@zag-js/dismissable': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/live-region': 1.27.0 + '@zag-js/popper': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 + + '@zag-js/date-utils@1.27.0(@internationalized/date@3.10.0)': dependencies: '@internationalized/date': 3.10.0 - '@zag-js/dialog@1.26.3': + '@zag-js/dialog@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/aria-hidden': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dismissable': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/focus-trap': 1.26.3 - '@zag-js/remove-scroll': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/aria-hidden': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dismissable': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/focus-trap': 1.27.0 + '@zag-js/remove-scroll': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/dismissable@1.26.3': + '@zag-js/dismissable@1.27.0': dependencies: - '@zag-js/dom-query': 1.26.3 - '@zag-js/interact-outside': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/dom-query': 1.27.0 + '@zag-js/interact-outside': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/dom-query@1.26.3': + '@zag-js/dom-query@1.27.0': dependencies: - '@zag-js/types': 1.26.3 + '@zag-js/types': 1.27.0 - '@zag-js/editable@1.26.3': + '@zag-js/editable@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/interact-outside': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/interact-outside': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/file-upload@1.26.3': + '@zag-js/file-upload@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/file-utils': 1.26.3 - '@zag-js/i18n-utils': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/file-utils': 1.27.0 + '@zag-js/i18n-utils': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/file-utils@1.26.3': + '@zag-js/file-utils@1.27.0': dependencies: - '@zag-js/i18n-utils': 1.26.3 + '@zag-js/i18n-utils': 1.27.0 - '@zag-js/floating-panel@1.26.3': + '@zag-js/floating-panel@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/popper': 1.26.3 - '@zag-js/rect-utils': 1.26.3 - '@zag-js/store': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/popper': 1.27.0 + '@zag-js/rect-utils': 1.27.0 + '@zag-js/store': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/focus-trap@1.26.3': + '@zag-js/focus-trap@1.27.0': dependencies: - '@zag-js/dom-query': 1.26.3 + '@zag-js/dom-query': 1.27.0 - '@zag-js/focus-visible@1.26.3': + '@zag-js/focus-visible@1.27.0': dependencies: - '@zag-js/dom-query': 1.26.3 + '@zag-js/dom-query': 1.27.0 - '@zag-js/highlight-word@1.26.3': {} + '@zag-js/highlight-word@1.27.0': {} - '@zag-js/hover-card@1.26.3': + '@zag-js/hover-card@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dismissable': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/popper': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dismissable': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/popper': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/i18n-utils@1.26.3': + '@zag-js/i18n-utils@1.27.0': dependencies: - '@zag-js/dom-query': 1.26.3 + '@zag-js/dom-query': 1.27.0 - '@zag-js/interact-outside@1.26.3': + '@zag-js/interact-outside@1.27.0': dependencies: - '@zag-js/dom-query': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/dom-query': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/json-tree-utils@1.26.3': {} + '@zag-js/json-tree-utils@1.27.0': {} - '@zag-js/listbox@1.26.3': + '@zag-js/listbox@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/collection': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/focus-visible': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/collection': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/focus-visible': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/live-region@1.26.3': {} + '@zag-js/live-region@1.27.0': {} - '@zag-js/menu@1.26.3': + '@zag-js/marquee@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dismissable': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/popper': 1.26.3 - '@zag-js/rect-utils': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/number-input@1.26.3': + '@zag-js/menu@1.27.0': + dependencies: + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dismissable': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/popper': 1.27.0 + '@zag-js/rect-utils': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 + + '@zag-js/number-input@1.27.0': dependencies: '@internationalized/number': 3.6.5 - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 - - '@zag-js/pagination@1.26.3': - dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 - - '@zag-js/password-input@1.26.3': - dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 - - '@zag-js/pin-input@1.26.3': - dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 - - '@zag-js/popover@1.26.3': - dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/aria-hidden': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dismissable': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/focus-trap': 1.26.3 - '@zag-js/popper': 1.26.3 - '@zag-js/remove-scroll': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 - - '@zag-js/popper@1.26.3': + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 + + '@zag-js/pagination@1.27.0': + dependencies: + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 + + '@zag-js/password-input@1.27.0': + dependencies: + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 + + '@zag-js/pin-input@1.27.0': + dependencies: + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 + + '@zag-js/popover@1.27.0': + dependencies: + '@zag-js/anatomy': 1.27.0 + '@zag-js/aria-hidden': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dismissable': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/focus-trap': 1.27.0 + '@zag-js/popper': 1.27.0 + '@zag-js/remove-scroll': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 + + '@zag-js/popper@1.27.0': dependencies: '@floating-ui/dom': 1.7.4 - '@zag-js/dom-query': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/dom-query': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/presence@1.26.3': + '@zag-js/presence@1.27.0': dependencies: - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/types': 1.26.3 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/types': 1.27.0 - '@zag-js/progress@1.26.3': + '@zag-js/progress@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/qr-code@1.26.3': + '@zag-js/qr-code@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 proxy-memoize: 3.0.1 uqr: 0.1.2 - '@zag-js/radio-group@1.26.3': + '@zag-js/radio-group@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/focus-visible': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/focus-visible': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/rating-group@1.26.3': + '@zag-js/rating-group@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/react@1.26.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@zag-js/react@1.27.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@zag-js/core': 1.26.3 - '@zag-js/store': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/core': 1.27.0 + '@zag-js/store': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@zag-js/rect-utils@1.26.3': {} + '@zag-js/rect-utils@1.27.0': {} - '@zag-js/remove-scroll@1.26.3': + '@zag-js/remove-scroll@1.27.0': dependencies: - '@zag-js/dom-query': 1.26.3 + '@zag-js/dom-query': 1.27.0 - '@zag-js/scroll-area@1.26.3': + '@zag-js/scroll-area@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/scroll-snap@1.26.3': + '@zag-js/scroll-snap@1.27.0': dependencies: - '@zag-js/dom-query': 1.26.3 + '@zag-js/dom-query': 1.27.0 - '@zag-js/select@1.26.3': + '@zag-js/select@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/collection': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dismissable': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/popper': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/collection': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dismissable': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/popper': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/signature-pad@1.26.3': + '@zag-js/signature-pad@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 perfect-freehand: 1.2.2 - '@zag-js/slider@1.26.3': + '@zag-js/slider@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/splitter@1.26.3': + '@zag-js/splitter@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/steps@1.26.3': + '@zag-js/steps@1.27.0': dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 - '@zag-js/store@1.26.3': + '@zag-js/store@1.27.0': dependencies: proxy-compare: 3.0.1 - '@zag-js/switch@1.26.3': - dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/focus-visible': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 - - '@zag-js/tabs@1.26.3': - dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 - - '@zag-js/tags-input@1.26.3': - dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/auto-resize': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/interact-outside': 1.26.3 - '@zag-js/live-region': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 - - '@zag-js/timer@1.26.3': - dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 - - '@zag-js/toast@1.26.3': - dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dismissable': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 - - '@zag-js/toggle-group@1.26.3': - dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 - - '@zag-js/toggle@1.26.3': - dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 - - '@zag-js/tooltip@1.26.3': - dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/focus-visible': 1.26.3 - '@zag-js/popper': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 - - '@zag-js/tour@1.26.3': - dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dismissable': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/focus-trap': 1.26.3 - '@zag-js/interact-outside': 1.26.3 - '@zag-js/popper': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 - - '@zag-js/tree-view@1.26.3': - dependencies: - '@zag-js/anatomy': 1.26.3 - '@zag-js/collection': 1.26.3 - '@zag-js/core': 1.26.3 - '@zag-js/dom-query': 1.26.3 - '@zag-js/types': 1.26.3 - '@zag-js/utils': 1.26.3 - - '@zag-js/types@1.26.3': + '@zag-js/switch@1.27.0': + dependencies: + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/focus-visible': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 + + '@zag-js/tabs@1.27.0': + dependencies: + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 + + '@zag-js/tags-input@1.27.0': + dependencies: + '@zag-js/anatomy': 1.27.0 + '@zag-js/auto-resize': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/interact-outside': 1.27.0 + '@zag-js/live-region': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 + + '@zag-js/timer@1.27.0': + dependencies: + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 + + '@zag-js/toast@1.27.0': + dependencies: + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dismissable': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 + + '@zag-js/toggle-group@1.27.0': + dependencies: + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 + + '@zag-js/toggle@1.27.0': + dependencies: + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 + + '@zag-js/tooltip@1.27.0': + dependencies: + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/focus-visible': 1.27.0 + '@zag-js/popper': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 + + '@zag-js/tour@1.27.0': + dependencies: + '@zag-js/anatomy': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dismissable': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/focus-trap': 1.27.0 + '@zag-js/interact-outside': 1.27.0 + '@zag-js/popper': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 + + '@zag-js/tree-view@1.27.0': + dependencies: + '@zag-js/anatomy': 1.27.0 + '@zag-js/collection': 1.27.0 + '@zag-js/core': 1.27.0 + '@zag-js/dom-query': 1.27.0 + '@zag-js/types': 1.27.0 + '@zag-js/utils': 1.27.0 + + '@zag-js/types@1.27.0': dependencies: csstype: 3.1.3 - '@zag-js/utils@1.26.3': {} + '@zag-js/utils@1.27.0': {} acorn-jsx@5.3.2(acorn@8.15.0): dependencies: @@ -11176,7 +11191,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.8.22: {} + baseline-browser-mapping@2.8.23: {} binary-extensions@2.3.0: {} @@ -11218,8 +11233,8 @@ snapshots: browserslist@4.27.0: dependencies: - baseline-browser-mapping: 2.8.22 - caniuse-lite: 1.0.30001752 + baseline-browser-mapping: 2.8.23 + caniuse-lite: 1.0.30001753 electron-to-chromium: 1.5.244 node-releases: 2.0.27 update-browserslist-db: 1.1.4(browserslist@4.27.0) @@ -11241,9 +11256,9 @@ snapshots: dependencies: run-applescript: 7.1.0 - bundle-require@5.1.0(esbuild@0.25.11): + bundle-require@5.1.0(esbuild@0.25.12): dependencies: - esbuild: 0.25.11 + esbuild: 0.25.12 load-tsconfig: 0.2.5 cac@6.7.14: {} @@ -11271,7 +11286,7 @@ snapshots: camelcase@8.0.0: {} - caniuse-lite@1.0.30001752: {} + caniuse-lite@1.0.30001753: {} ccount@2.0.1: {} @@ -12074,34 +12089,34 @@ snapshots: d: 1.0.2 ext: 1.7.0 - esbuild@0.25.11: + esbuild@0.25.12: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.11 - '@esbuild/android-arm': 0.25.11 - '@esbuild/android-arm64': 0.25.11 - '@esbuild/android-x64': 0.25.11 - '@esbuild/darwin-arm64': 0.25.11 - '@esbuild/darwin-x64': 0.25.11 - '@esbuild/freebsd-arm64': 0.25.11 - '@esbuild/freebsd-x64': 0.25.11 - '@esbuild/linux-arm': 0.25.11 - '@esbuild/linux-arm64': 0.25.11 - '@esbuild/linux-ia32': 0.25.11 - '@esbuild/linux-loong64': 0.25.11 - '@esbuild/linux-mips64el': 0.25.11 - '@esbuild/linux-ppc64': 0.25.11 - '@esbuild/linux-riscv64': 0.25.11 - '@esbuild/linux-s390x': 0.25.11 - '@esbuild/linux-x64': 0.25.11 - '@esbuild/netbsd-arm64': 0.25.11 - '@esbuild/netbsd-x64': 0.25.11 - '@esbuild/openbsd-arm64': 0.25.11 - '@esbuild/openbsd-x64': 0.25.11 - '@esbuild/openharmony-arm64': 0.25.11 - '@esbuild/sunos-x64': 0.25.11 - '@esbuild/win32-arm64': 0.25.11 - '@esbuild/win32-ia32': 0.25.11 - '@esbuild/win32-x64': 0.25.11 + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 escalade@3.2.0: {} @@ -12145,27 +12160,36 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) eslint: 9.38.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)): + dependencies: + debug: 3.2.7 + optionalDependencies: + eslint: 9.38.0(jiti@2.6.1) + eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.38.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-plugin-boundaries@5.1.0(eslint@9.38.0(jiti@2.6.1)): + eslint-plugin-boundaries@5.1.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1)): dependencies: chalk: 4.1.2 eslint: 9.38.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0(jiti@2.6.1)) micromatch: 4.0.8 transitivePeerDependencies: - '@typescript-eslint/parser' @@ -12173,7 +12197,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)): + eslint-plugin-import@2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -12184,7 +12208,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.38.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)) + eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -12195,8 +12219,6 @@ snapshots: semver: 6.3.1 string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -12924,7 +12946,7 @@ snapshots: mdast-util-mdxjs-esm: 2.0.1 property-information: 7.1.0 space-separated-tokens: 2.0.2 - style-to-js: 1.1.18 + style-to-js: 1.1.19 unist-util-position: 5.0.0 vfile-message: 4.0.3 transitivePeerDependencies: @@ -13043,7 +13065,7 @@ snapshots: ini@4.1.3: {} - inline-style-parser@0.2.4: {} + inline-style-parser@0.2.6: {} inquirer@12.10.0(@types/node@22.17.2): dependencies: @@ -15168,19 +15190,19 @@ snapshots: stubborn-fs@2.0.0: dependencies: - stubborn-utils: 1.0.1 + stubborn-utils: 1.0.2 - stubborn-utils@1.0.1: {} + stubborn-utils@1.0.2: {} style-mod@4.1.3: {} - style-to-js@1.1.18: + style-to-js@1.1.19: dependencies: - style-to-object: 1.0.11 + style-to-object: 1.0.12 - style-to-object@1.0.11: + style-to-object@1.0.12: dependencies: - inline-style-parser: 0.2.4 + inline-style-parser: 0.2.6 stylis@4.3.6: {} @@ -15317,12 +15339,12 @@ snapshots: tsup@8.5.0(@swc/core@1.13.19(@swc/helpers@0.5.17))(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3)(yaml@2.8.1): dependencies: - bundle-require: 5.1.0(esbuild@0.25.11) + bundle-require: 5.1.0(esbuild@0.25.12) cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.2 debug: 4.4.3 - esbuild: 0.25.11 + esbuild: 0.25.12 fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 @@ -15687,7 +15709,7 @@ snapshots: vite@7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1): dependencies: - esbuild: 0.25.11 + esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index b5cebd650..86562925c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -18,6 +18,7 @@ ignoredBuiltDependencies: onlyBuiltDependencies: - '@parcel/watcher' + - '@swc/core' - '@tailwindcss/oxide' - es5-ext - esbuild From d72734a7ae7d4245450f9952c41c83a483a97d6f Mon Sep 17 00:00:00 2001 From: Pham Ngoc Duong Date: Mon, 3 Nov 2025 23:52:22 +0700 Subject: [PATCH 12/85] lint(pplx-ext): module exports --- packages/eslint-config/index.js | 2 + packages/eslint-config/package.json | 1 + .../eslint-config/plugins/typed-exports.js | 391 ++++++++++++++++++ .../eslint-config/boundaries/elements.js | 2 - .../eslint-config/boundaries/index.js | 1 - .../eslint-config/module-exports/index.js | 122 ++++++ perplexity/extension/eslint.config.js | 11 +- .../src/__registries__/bg-workers.ts | 15 +- .../src/__registries__/core-plugins/utils.ts | 4 +- .../src/__registries__/cs-hash-router.ts | 7 +- .../src/__registries__/cs-loaders.ts | 4 +- .../src/__registries__/plugin-settings-uis.ts | 15 +- .../src/__registries__/plugins/index.ts | 4 +- .../src/__registries__/plugins/utils.ts | 2 +- .../extension/src/__registries__/types.ts | 7 + perplexity/extension/tsconfig.json | 1 - pnpm-lock.yaml | 19 +- 17 files changed, 550 insertions(+), 58 deletions(-) create mode 100644 packages/eslint-config/plugins/typed-exports.js create mode 100644 perplexity/extension/eslint-config/module-exports/index.js create mode 100644 perplexity/extension/src/__registries__/types.ts diff --git a/packages/eslint-config/index.js b/packages/eslint-config/index.js index f5e568535..3f13782d3 100644 --- a/packages/eslint-config/index.js +++ b/packages/eslint-config/index.js @@ -3,3 +3,5 @@ export { default as baseImportConfig } from "./rules/imports.js"; export { default as baseTypescriptConfig } from "./rules/typescript.js"; export { default as baseConfig } from "./base.js"; + +export { default as typedExportsPlugin } from "./plugins/typed-exports.js"; diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index bdbf433e2..65033995c 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -9,6 +9,7 @@ "devDependencies": { "@eslint/js": "9.38.0", "@limegrass/eslint-plugin-import-alias": "^1.6.0", + "@typescript-eslint/utils": "^8.46.2", "eslint": "catalog:lint", "eslint-config-prettier": "^10.1.8", "eslint-import-resolver-typescript": "4.4.4", diff --git a/packages/eslint-config/plugins/typed-exports.js b/packages/eslint-config/plugins/typed-exports.js new file mode 100644 index 000000000..9222c424e --- /dev/null +++ b/packages/eslint-config/plugins/typed-exports.js @@ -0,0 +1,391 @@ +import { ESLintUtils } from "@typescript-eslint/utils"; +import ts from "typescript"; + +const createRule = ESLintUtils.RuleCreator(() => ""); + +/** + * @typedef {Object} TypeRequirement + * @property {"default" | "named"} type - Whether to check the default export or a named export + * @property {string} [exportName] - For named exports, the specific export name to check. If omitted, any named export matching the type is accepted + * @property {Object} tsType - The TypeScript type to enforce + * @property {string} tsType.name - The name of the TypeScript type/interface to check against + * @property {string} tsType.path - The module path where the type is defined (e.g., "@/__registries__/types") + * @property {string} [message] - Custom error message to display when the export is missing or incorrect + */ + +/** + * ESLint rule to enforce that files export variables with specific TypeScript types. + * + * This rule validates that: + * - Default exports match a specified type from a specified module + * - Named exports match specified types from specified modules + * - Export names match expected names (for named exports) + * + * @example + * // Enforce default export of a specific type + * { + * "typed-exports/typed-exports": ["error", [ + * { + * type: "default", + * tsType: { + * name: "MyType", + * path: "@/types/my-types" + * } + * } + * ]] + * } + * + * @example + * // Enforce named export with a specific name and type + * { + * "typed-exports/typed-exports": ["error", [ + * { + * type: "named", + * exportName: "myExport", + * tsType: { + * name: "MyExportType", + * path: "@/types/exports" + * } + * } + * ]] + * } + * + * @example + * // Enforce both default and named exports + * { + * "typed-exports/typed-exports": ["error", [ + * { + * type: "default", + * tsType: { + * name: "DefaultType", + * path: "@/types/defaults" + * } + * }, + * { + * type: "named", + * exportName: "namedExport", + * tsType: { + * name: "NamedType", + * path: "@/types/named" + * } + * } + * ]] + * } + * + * @example + * // Use a custom error message + * { + * "typed-exports/typed-exports": ["error", [ + * { + * type: "default", + * tsType: { + * name: "MyConfig", + * path: "@/types/config" + * }, + * message: "Configuration files must export a valid MyConfig object" + * } + * ]] + * } + */ +const typedExportsPlugin = createRule({ + name: "typed-exports", + meta: { + type: "problem", + docs: { + description: + "Enforce that files export variables with specific types from specific files", + }, + messages: { + missingRequiredExport: + "File must export {{exportType}} of type {{typeName}} from {{typePath}}", + incorrectExportType: + "Export {{exportName}} must be of type {{typeName}} from {{typePath}}, but got {{actualType}}", + incorrectExportName: "Named export must be called {{expectedName}}", + wrongImportSource: + "Type {{typeName}} must be imported from {{expectedPath}}", + customMessage: "{{message}}", + }, + /** + * Schema for the rule options. + * Accepts an array of export requirements, where each requirement specifies: + * - type: "default" | "named" - The export type to validate + * - exportName: string (optional) - For named exports, the specific name to check + * - tsType: { name: string, path: string } - The TypeScript type and its module path + * - message: string (optional) - Custom error message to display + */ + schema: [ + { + type: "array", + items: { + type: "object", + properties: { + type: { type: "string", enum: ["default", "named"] }, + exportName: { type: "string" }, + tsType: { + type: "object", + properties: { + name: { type: "string" }, + path: { type: "string" }, + }, + required: ["name", "path"], + }, + message: { type: "string" }, + }, + required: ["type", "tsType"], + }, + }, + ], + }, + defaultOptions: [[]], + create(context) { + const exportRequirements = context.options[0] || []; + const filename = context.filename; + + if (exportRequirements.length === 0) return {}; + + const foundExports = { default: null, named: new Map() }; + const expectedTypeCache = new Map(); + + // Helpers + const getTypeInfo = (node) => { + const parserServices = context.sourceCode.parserServices; + if ( + !parserServices || + !parserServices.program || + !parserServices.esTreeNodeToTSNodeMap + ) + return null; + try { + const checker = parserServices.program.getTypeChecker(); + const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node); + if (!tsNode) return null; + const type = checker.getTypeAtLocation(tsNode); + const typeString = checker.typeToString(type); + const symbol = type.getSymbol() || type.aliasSymbol; + return { type, typeString, symbol, checker }; + } catch { + return null; + } + }; + + const getExpectedType = (typeName, typePath, checker) => { + const cacheKey = `${typeName}|${typePath}`; + if (expectedTypeCache.has(cacheKey)) { + return expectedTypeCache.get(cacheKey); + } + const program = context.sourceCode.parserServices.program; + const localChecker = checker || program.getTypeChecker(); + const resolved = ts.resolveModuleName( + typePath, + filename, + program.getCompilerOptions(), + ts.sys, + ); + if (!resolved.resolvedModule) return null; + const sourceFile = program.getSourceFile( + resolved.resolvedModule.resolvedFileName, + ); + if (!sourceFile) return null; + const moduleSymbol = + localChecker.getSymbolAtLocation(sourceFile) || sourceFile.symbol; + if (!moduleSymbol) return null; + const exports = localChecker.getExportsOfModule(moduleSymbol); + let typeSymbol = exports.find((exp) => exp.name === typeName); + if (!typeSymbol) return null; + if (typeSymbol.flags & ts.SymbolFlags.Alias) { + typeSymbol = localChecker.getAliasedSymbol(typeSymbol); + } + let expectedType = null; + const decl = typeSymbol.declarations && typeSymbol.declarations[0]; + if (decl && ts.isTypeAliasDeclaration(decl)) { + expectedType = localChecker.getTypeFromTypeNode(decl.type); + } + if (!expectedType) { + expectedType = localChecker.getDeclaredTypeOfSymbol(typeSymbol); + } + expectedTypeCache.set(cacheKey, expectedType); + return expectedType; + }; + + const hasAllExpectedProperties = (actualType, expectedType, checker) => { + const expectedProps = checker.getPropertiesOfType(expectedType); + if (expectedProps.length === 0) return false; + const actualProps = checker.getPropertiesOfType(actualType); + if (actualProps.length === 0) return false; + const actualNames = new Set(actualProps.map((p) => p.name)); + return expectedProps.every((p) => actualNames.has(p.name)); + }; + + const matchesExpectedType = (actual, expected, checker) => { + const actualSym = actual.aliasSymbol || actual.symbol; + const expectedSym = expected.aliasSymbol || expected.symbol; + return ( + (actualSym && expectedSym && actualSym === expectedSym) || + checker.isTypeAssignableTo(actual, expected) || + hasAllExpectedProperties(actual, expected, checker) + ); + }; + + const recordExport = (name, node, typeInfo) => { + if (!typeInfo) return; + const data = { + node, + type: typeInfo.type, + typeString: typeInfo.typeString, + symbol: typeInfo.symbol, + checker: typeInfo.checker, + }; + if (name === null) { + foundExports.default = data; + } else { + foundExports.named.set(name, data); + } + }; + + const findMatchingNamedExport = (typeName, typePath, checker) => { + for (const [, data] of foundExports.named) { + const expectedType = getExpectedType(typeName, typePath, checker); + if (!expectedType) continue; + if (matchesExpectedType(data.type, expectedType, checker)) { + return data; + } + } + return null; + }; + + const validateExport = ( + exportData, + typeName, + typePath, + exportName, + customMessage, + ) => { + if (!exportData) { + if (customMessage) { + context.report({ + node: context.sourceCode.ast, + messageId: "customMessage", + data: { message: customMessage }, + }); + } else { + const exportType = + exportName === null + ? "default" + : exportName + ? `named export '${exportName}'` + : "named"; + context.report({ + node: context.sourceCode.ast, + messageId: "missingRequiredExport", + data: { exportType, typeName, typePath }, + }); + } + return; + } + const expectedType = getExpectedType( + typeName, + typePath, + exportData.checker, + ); + if (!expectedType) return; + if ( + !matchesExpectedType(exportData.type, expectedType, exportData.checker) + ) { + if (customMessage) { + context.report({ + node: exportData.node, + messageId: "customMessage", + data: { message: customMessage }, + }); + } else { + const displayName = + exportName === null + ? "default export" + : exportName || "named export"; + context.report({ + node: exportData.node, + messageId: "incorrectExportType", + data: { + exportName: displayName, + typeName, + typePath, + actualType: exportData.typeString, + }, + }); + } + } + }; + + return { + ExportDefaultDeclaration(node) { + const typeInfo = getTypeInfo(node.declaration); + recordExport(null, node, typeInfo); + }, + + ExportNamedDeclaration(node) { + if (node.declaration) { + if ( + node.declaration.type === "VariableDeclaration" && + node.declaration.declarations.length > 0 + ) { + const varDecl = node.declaration.declarations[0]; + if (varDecl.id.type === "Identifier") { + const typeInfo = getTypeInfo(varDecl.id); + recordExport(varDecl.id.name, node, typeInfo); + } + } + } + if (node.specifiers && node.specifiers.length > 0) { + for (const specifier of node.specifiers) { + if (specifier.type === "ExportSpecifier") { + const typeInfo = getTypeInfo(specifier.local); + if (!typeInfo) continue; + const exportedName = + specifier.exported.type === "Identifier" + ? specifier.exported.name + : specifier.exported.value; + recordExport(exportedName, node, typeInfo); + } + } + } + }, + + "Program:exit"() { + for (const req of exportRequirements) { + const { type, exportName, tsType, message } = req; + if (type === "default") { + validateExport( + foundExports.default, + tsType.name, + tsType.path, + null, + message, + ); + } else if (type === "named") { + let exportData = null; + if (exportName) { + exportData = foundExports.named.get(exportName); + } else { + exportData = findMatchingNamedExport( + tsType.name, + tsType.path, + // Use any checker available; they're all equivalent + foundExports.named.values().next().value?.checker || + foundExports.default?.checker, + ); + } + validateExport( + exportData, + tsType.name, + tsType.path, + exportName, + message, + ); + } + } + }, + }; + }, +}); + +export default typedExportsPlugin; diff --git a/perplexity/extension/eslint-config/boundaries/elements.js b/perplexity/extension/eslint-config/boundaries/elements.js index ca03a0045..17cb49035 100644 --- a/perplexity/extension/eslint-config/boundaries/elements.js +++ b/perplexity/extension/eslint-config/boundaries/elements.js @@ -1,5 +1,3 @@ -// @ts-check - export const elements = [ { type: "module-registries", diff --git a/perplexity/extension/eslint-config/boundaries/index.js b/perplexity/extension/eslint-config/boundaries/index.js index 8e624471f..0df4f2281 100644 --- a/perplexity/extension/eslint-config/boundaries/index.js +++ b/perplexity/extension/eslint-config/boundaries/index.js @@ -1,4 +1,3 @@ -// @ts-check import boundariesPlugin from "eslint-plugin-boundaries"; import { elements } from "./elements.js"; import { rules } from "./rules.js"; diff --git a/perplexity/extension/eslint-config/module-exports/index.js b/perplexity/extension/eslint-config/module-exports/index.js new file mode 100644 index 000000000..b10462d63 --- /dev/null +++ b/perplexity/extension/eslint-config/module-exports/index.js @@ -0,0 +1,122 @@ +import { defineConfig } from "eslint/config"; +import { typedExportsPlugin } from "@complexity/eslint-config"; + +const typedExportsPluginConfig = { + plugins: { + "typed-exports": { + rules: { + "typed-exports": typedExportsPlugin, + }, + }, + }, +}; + +const createTypedExportsRule = (files, requirements) => ({ + ...typedExportsPluginConfig, + files, + rules: { + "typed-exports/typed-exports": ["error", requirements], + }, +}); + +export default defineConfig([ + createTypedExportsRule( + ["src/plugins/__core__/**/index.manifest.core.ts"], + [ + { + type: "default", + tsType: { + name: "CorePluginManifest", + path: "@/__registries__/core-plugins/types", + }, + }, + ], + ), + createTypedExportsRule( + ["src/plugins/*/index.manifest.ts"], + [ + { + type: "default", + tsType: { + name: "PluginManifest", + path: "@/__registries__/plugins/types", + }, + }, + ], + ), + createTypedExportsRule( + ["src/{services,plugins,entrypoints}/**/*.bg-worker.ts"], + [ + { + type: "default", + tsType: { + name: "DefaultExportFunction", + path: "@/__registries__/types", + }, + message: "Must export default a valid function.", + }, + ], + ), + createTypedExportsRule( + ["src/plugins/**/*.hash-router.ts"], + [ + { + type: "default", + tsType: { + name: "ReactRouterRouteObject", + path: "@/__registries__/types", + }, + message: + "Must export default a valid React Router route object `RouteObject`.", + }, + ], + ), + createTypedExportsRule( + ["src/plugins/**/loader.*", "src/plugins/**/*.loader.*"], + [ + { + type: "default", + tsType: { + name: "DefaultExportFunction", + path: "@/__registries__/types", + }, + message: "Must export default a valid function.", + }, + ], + ), + createTypedExportsRule( + ["src/plugins/*/settings-ui.tsx", "src/plugins/*/settings-ui/index.tsx"], + [ + { + type: "default", + tsType: { + name: "ReactComponent", + path: "@/__registries__/types", + }, + message: "Must export default a valid React component.", + }, + { + type: "named", + exportName: "pluginId", + tsType: { + name: "PluginId", + path: "@/__registries__/plugins/meta.types", + }, + message: "Must export a string which matches a valid `pluginId`.", + }, + ], + ), + createTypedExportsRule( + ["src/plugins/**/*.cs-ui.tsx"], + [ + { + type: "default", + tsType: { + name: "ReactComponent", + path: "@/__registries__/types", + }, + message: "Must export default a valid React component.", + }, + ], + ), +]); diff --git a/perplexity/extension/eslint.config.js b/perplexity/extension/eslint.config.js index 80d3dc7a1..c35e83c53 100644 --- a/perplexity/extension/eslint.config.js +++ b/perplexity/extension/eslint.config.js @@ -1,14 +1,15 @@ -// @ts-check import { baseConfig, baseImportConfig, baseReactConfig, baseTypescriptConfig, } from "@complexity/eslint-config"; + import globals from "globals"; import { defineConfig } from "eslint/config"; import boundariesConfig from "./eslint-config/boundaries/index.js"; import tanstackQueryConfig from "./eslint-config/tanstack-query.js"; +import moduleExportsConfig from "./eslint-config/module-exports/index.js"; const commonIgnores = [ "dist/**", @@ -21,7 +22,7 @@ export default defineConfig([ baseConfig, { extends: [baseTypescriptConfig], - ignores: [...commonIgnores, "**/*.js"], + ignores: [...commonIgnores, "**/*.js", "eslint-config/**"], }, { extends: [ @@ -55,6 +56,7 @@ export default defineConfig([ }, boundariesConfig, tanstackQueryConfig, + moduleExportsConfig, { languageOptions: { ecmaVersion: 2020, @@ -63,7 +65,10 @@ export default defineConfig([ ...globals.browser, ...globals.es2020, }, + parserOptions: { + projectService: true, + }, }, - ignores: [...commonIgnores], + ignores: [...commonIgnores, "eslint-config/**"], }, ]); diff --git a/perplexity/extension/src/__registries__/bg-workers.ts b/perplexity/extension/src/__registries__/bg-workers.ts index cb007a4c5..e8489ce7e 100644 --- a/perplexity/extension/src/__registries__/bg-workers.ts +++ b/perplexity/extension/src/__registries__/bg-workers.ts @@ -1,19 +1,16 @@ export function setupBackgroundWorkers() { const workers = import.meta.glob( - ["@/services/**/*.bg-worker.ts", "@/plugins/**/*.bg-worker.ts"], - { - eager: true, - }, + [ + "@/services/**/*.bg-worker.ts", + "@/plugins/**/*.bg-worker.ts", + "@/entrypoints/**/*.bg-worker.ts", + ], + { eager: true }, ) as Record void }>; for (const [path, module] of Object.entries(workers)) { const worker = module.default; - invariant( - typeof worker == "function", - `[BG-WORKER MODULE REGISTRATION ERROR] Default export is not a function in ${path}`, - ); - try { worker(); } catch (error) { diff --git a/perplexity/extension/src/__registries__/core-plugins/utils.ts b/perplexity/extension/src/__registries__/core-plugins/utils.ts index 9e925dc9a..da5ec20d6 100644 --- a/perplexity/extension/src/__registries__/core-plugins/utils.ts +++ b/perplexity/extension/src/__registries__/core-plugins/utils.ts @@ -6,7 +6,7 @@ import type { export const defineCorePlugin = < const T extends CorePluginManifest, >( - params: T, -) => { + params: T & CorePluginManifest, +): T & CorePluginManifest => { return params; }; diff --git a/perplexity/extension/src/__registries__/cs-hash-router.ts b/perplexity/extension/src/__registries__/cs-hash-router.ts index 130af48ee..2c4afc18e 100644 --- a/perplexity/extension/src/__registries__/cs-hash-router.ts +++ b/perplexity/extension/src/__registries__/cs-hash-router.ts @@ -10,10 +10,5 @@ export const hashRouterObservers: RouteObject[] = (() => { default: RouteObject; } >, - ).map((module) => { - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - invariant(module.default != null, "[HashRouter] Invalid context"); - - return module.default; - }); + ).map((module) => module.default); })(); diff --git a/perplexity/extension/src/__registries__/cs-loaders.ts b/perplexity/extension/src/__registries__/cs-loaders.ts index e95c4cfa9..33e4421c4 100644 --- a/perplexity/extension/src/__registries__/cs-loaders.ts +++ b/perplexity/extension/src/__registries__/cs-loaders.ts @@ -13,7 +13,7 @@ export async function executeLibCsLoaders() { export async function executeCsLoaders() { const loaders = import.meta.glob( - ["@/plugins/**/loader.{ts,tsx}", "@/plugins/**/*.loader.{ts,tsx}"], + ["@/plugins/**/loader.*", "@/plugins/**/*.loader.*"], { eager: false, }, @@ -31,8 +31,6 @@ export async function executeCsLoaders() { const importedModules = await Promise.all(modulePromises); const executionPromises = importedModules.map(async ({ path, module }) => { - invariant("default" in module, `Loader "${path}" has no default export`); - try { await Promise.resolve((module.default as () => void | Promise)()); } catch (error) { diff --git a/perplexity/extension/src/__registries__/plugin-settings-uis.ts b/perplexity/extension/src/__registries__/plugin-settings-uis.ts index 49a95266e..527e9bd4e 100644 --- a/perplexity/extension/src/__registries__/plugin-settings-uis.ts +++ b/perplexity/extension/src/__registries__/plugin-settings-uis.ts @@ -1,7 +1,6 @@ import React from "react"; import type { PluginId } from "@/__registries__/plugins/meta.types"; -import { invariant } from "@/utils/misc/utils"; export type PluginSettingsUIs = Partial< Record< @@ -17,7 +16,7 @@ export const PluginSettingsUis: PluginSettingsUIs = (() => { const settingsUis: PluginSettingsUIs = {}; const entries = import.meta.glob( - ["@/plugins/**/settings-ui.tsx", "@/plugins/**/settings-ui/index.tsx"], + ["@/plugins/*/settings-ui.tsx", "@/plugins/*/settings-ui/index.tsx"], { eager: true, }, @@ -31,18 +30,6 @@ export const PluginSettingsUis: PluginSettingsUIs = (() => { >; for (const [_, module] of Object.entries(entries)) { - invariant( - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - module.default != null, - `Plugin settings UI for "${module.pluginId}" is declared but missing default export`, - ); - - invariant( - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - module.pluginId != null, - `Plugin settings UI for "${module.pluginId}" is declared but missing \`pluginId\` export`, - ); - settingsUis[module.pluginId] = { component: React.createElement(module.default), openInFullScreen: module.openInFullScreen ?? false, diff --git a/perplexity/extension/src/__registries__/plugins/index.ts b/perplexity/extension/src/__registries__/plugins/index.ts index bb74c58db..ca8fa4810 100644 --- a/perplexity/extension/src/__registries__/plugins/index.ts +++ b/perplexity/extension/src/__registries__/plugins/index.ts @@ -167,14 +167,12 @@ export class PluginManifestsRegistry { } (function () { - const entries = import.meta.glob("@/plugins/**/index.manifest.ts", { + const entries = import.meta.glob("@/plugins/*/index.manifest.ts", { eager: true, }) as Record>; const sortedEntries = Object.entries(entries) .map(([path, module]) => { - invariant("default" in module, `Plugin "${path}" has no default export`); - const params = module.default as PluginManifest< keyof PluginsSettingsRegistry >; diff --git a/perplexity/extension/src/__registries__/plugins/utils.ts b/perplexity/extension/src/__registries__/plugins/utils.ts index ff3fd89c3..16e06aa4c 100644 --- a/perplexity/extension/src/__registries__/plugins/utils.ts +++ b/perplexity/extension/src/__registries__/plugins/utils.ts @@ -6,6 +6,6 @@ export const definePlugin = < const TParams extends PluginManifest, >( params: TParams & PluginManifest, -): TParams => { +): TParams & PluginManifest => { return params; }; diff --git a/perplexity/extension/src/__registries__/types.ts b/perplexity/extension/src/__registries__/types.ts new file mode 100644 index 000000000..08754a0e5 --- /dev/null +++ b/perplexity/extension/src/__registries__/types.ts @@ -0,0 +1,7 @@ +// Helper types for ESLint checks + +import type { RouteObject } from "react-router-dom"; + +export type DefaultExportFunction = () => void; +export type ReactRouterRouteObject = RouteObject; +export type ReactComponent = React.FC; diff --git a/perplexity/extension/tsconfig.json b/perplexity/extension/tsconfig.json index b35e8208f..5b32c00b2 100644 --- a/perplexity/extension/tsconfig.json +++ b/perplexity/extension/tsconfig.json @@ -1,7 +1,6 @@ { "extends": "@complexity/typescript-config/base.json", "compilerOptions": { - "allowJs": false, "baseUrl": ".", "jsx": "react-jsx", "lib": ["DOM", "DOM.Iterable", "ESNext"], diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aebbfb5b0..cade94706 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -192,6 +192,9 @@ importers: '@limegrass/eslint-plugin-import-alias': specifier: ^1.6.0 version: 1.6.0(eslint@9.38.0(jiti@2.6.1)) + '@typescript-eslint/utils': + specifier: ^8.46.2 + version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) eslint: specifier: catalog:lint version: 9.38.0(jiti@2.6.1) @@ -581,7 +584,7 @@ importers: version: 9.38.0(jiti@2.6.1) eslint-plugin-boundaries: specifier: ^5.1.0 - version: 5.1.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1)) + version: 5.1.0(eslint@9.38.0(jiti@2.6.1)) glob: specifier: ^11.0.3 version: 11.0.3 @@ -12164,16 +12167,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0(jiti@2.6.1)): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.38.0(jiti@2.6.1) - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)): dependencies: debug: 3.2.7 @@ -12184,12 +12177,12 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-boundaries@5.1.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1)): + eslint-plugin-boundaries@5.1.0(eslint@9.38.0(jiti@2.6.1)): dependencies: chalk: 4.1.2 eslint: 9.38.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0(jiti@2.6.1)) + eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)) micromatch: 4.0.8 transitivePeerDependencies: - '@typescript-eslint/parser' From 9b9734664d5113080b1ad66a24ac59a7a328d009 Mon Sep 17 00:00:00 2001 From: Pham Ngoc Duong Date: Tue, 4 Nov 2025 16:22:58 +0700 Subject: [PATCH 13/85] chore: update deps --- packages/eslint-config/package.json | 2 +- perplexity/extension/changelogs/2.7.13.md | 3 + perplexity/extension/cli/package.json | 2 +- perplexity/extension/package.json | 4 +- .../src/__registries__/cs-ui/index.tsx | 11 + .../auth-api-prefetch-and-persist.loader.ts | 30 +- .../plugins-guard/store.loader.ts | 4 +- .../network-intercept/_service/index.ts | 3 + .../network-intercept/interceptors/fetch.ts | 59 ++-- .../useCreatePortalContainers.ts | 2 +- .../thread-navbar-attributes/Group.tsx | 21 ++ .../thread-navbar-attributes/Wrapper.ts | 22 ++ .../useCreatePortalContainer.ts | 29 ++ .../__ui-groups__/routes/Thread/index.tsx | 2 + .../src/plugins/command-menu/cache.loader.ts | 54 ++-- .../src/plugins/thread-export/ExportMenu.tsx | 2 +- .../plugins/thread-export/ThreadExport.tsx | 13 - .../plugins/thread-export/Wrapper.cs-ui.tsx | 9 +- .../plugins/thread-export/index.manifest.ts | 1 + .../thread-export/useCreatePortalContainer.ts | 42 --- .../src/plugins/thread-toc/ThreadToc.tsx | 65 ---- .../src/plugins/thread-toc/TocItem.tsx | 8 +- .../src/plugins/thread-toc/TocMenuToggle.tsx | 51 ++-- .../thread-toc/TocMenuToggleWrapper.cs-ui.tsx | 17 ++ .../src/plugins/thread-toc/TocPanel.tsx | 69 +++-- ...er.cs-ui.tsx => TocPanelWrapper.cs-ui.tsx} | 6 +- .../src/plugins/thread-toc/index.manifest.ts | 1 + .../src/plugins/thread-toc/store/index.ts | 27 ++ .../plugins/thread-toc/store/store.loader.ts | 84 ++++++ .../src/plugins/thread-toc/store/types.ts | 13 + .../src/plugins/thread-toc/store/utils.ts | 281 ++++++++++++++++++ .../plugins/thread-toc/usePanelPosition.ts | 85 ------ .../plugins/thread-toc/useThreadTocItems.ts | 249 ---------------- .../dom-selectors/defaults.ts | 1 - pnpm-lock.yaml | 208 ++++++------- pnpm-workspace.yaml | 2 +- 36 files changed, 790 insertions(+), 692 deletions(-) create mode 100644 perplexity/extension/changelogs/2.7.13.md create mode 100644 perplexity/extension/src/plugins/__ui-groups__/elements/thread-navbar-attributes/Group.tsx create mode 100644 perplexity/extension/src/plugins/__ui-groups__/elements/thread-navbar-attributes/Wrapper.ts create mode 100644 perplexity/extension/src/plugins/__ui-groups__/elements/thread-navbar-attributes/useCreatePortalContainer.ts delete mode 100644 perplexity/extension/src/plugins/thread-export/ThreadExport.tsx delete mode 100644 perplexity/extension/src/plugins/thread-export/useCreatePortalContainer.ts delete mode 100644 perplexity/extension/src/plugins/thread-toc/ThreadToc.tsx create mode 100644 perplexity/extension/src/plugins/thread-toc/TocMenuToggleWrapper.cs-ui.tsx rename perplexity/extension/src/plugins/thread-toc/{Wrapper.cs-ui.tsx => TocPanelWrapper.cs-ui.tsx} (53%) create mode 100644 perplexity/extension/src/plugins/thread-toc/store/index.ts create mode 100644 perplexity/extension/src/plugins/thread-toc/store/store.loader.ts create mode 100644 perplexity/extension/src/plugins/thread-toc/store/types.ts create mode 100644 perplexity/extension/src/plugins/thread-toc/store/utils.ts delete mode 100644 perplexity/extension/src/plugins/thread-toc/usePanelPosition.ts delete mode 100644 perplexity/extension/src/plugins/thread-toc/useThreadTocItems.ts diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index 65033995c..7cec2119a 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -9,7 +9,7 @@ "devDependencies": { "@eslint/js": "9.38.0", "@limegrass/eslint-plugin-import-alias": "^1.6.0", - "@typescript-eslint/utils": "^8.46.2", + "@typescript-eslint/utils": "^8.46.3", "eslint": "catalog:lint", "eslint-config-prettier": "^10.1.8", "eslint-import-resolver-typescript": "4.4.4", diff --git a/perplexity/extension/changelogs/2.7.13.md b/perplexity/extension/changelogs/2.7.13.md new file mode 100644 index 000000000..9b26989f8 --- /dev/null +++ b/perplexity/extension/changelogs/2.7.13.md @@ -0,0 +1,3 @@ +## Misc + +Stability improvements diff --git a/perplexity/extension/cli/package.json b/perplexity/extension/cli/package.json index b33ef96dc..398a23442 100644 --- a/perplexity/extension/cli/package.json +++ b/perplexity/extension/cli/package.json @@ -15,7 +15,7 @@ }, "dependencies": { "@aws-sdk/client-s3": "^3.922.0", - "@dotenvx/dotenvx": "^1.51.0", + "@dotenvx/dotenvx": "^1.51.1", "chrome-webstore-upload": "^4.0.3", "commander": "^14.0.2", "glob": "^11.0.3", diff --git a/perplexity/extension/package.json b/perplexity/extension/package.json index d40841cd0..4c540b4d1 100644 --- a/perplexity/extension/package.json +++ b/perplexity/extension/package.json @@ -1,6 +1,6 @@ { "name": "pplx-ext", - "version": "2.7.12", + "version": "2.7.13", "author": "pnd280", "type": "module", "scripts": { @@ -41,7 +41,7 @@ "@comctx-adapters/core": "workspace:*", "@complexity/async-dep-registry": "workspace:*", "@complexity/i18n": "workspace:*", - "@dotenvx/dotenvx": "^1.51.0", + "@dotenvx/dotenvx": "^1.51.1", "@hookform/resolvers": "^5.2.2", "@radix-ui/react-collapsible": "^1.1.12", "@radix-ui/react-scroll-area": "^1.2.10", diff --git a/perplexity/extension/src/__registries__/cs-ui/index.tsx b/perplexity/extension/src/__registries__/cs-ui/index.tsx index e546e5319..3437c7a42 100644 --- a/perplexity/extension/src/__registries__/cs-ui/index.tsx +++ b/perplexity/extension/src/__registries__/cs-ui/index.tsx @@ -82,6 +82,17 @@ export default class CsUiRegistry { CsUiRegistry.Components, ); + static ThreadNavbarAttributesGroupComponents = (() => + CsUiRegistry.Components.map((module, idx) => { + if (module.uiGroup == null) return null; + + if ( + typeof module.uiGroup === "string" && + module.uiGroup === "thread:navbarAttributes" + ) + return ; + }).filter((component) => component != null))(); + static CommandMenuItemsGroupComponents = (() => CsUiRegistry.Components.map((module, idx) => { if (module.uiGroup == null) return null; diff --git a/perplexity/extension/src/plugins/__async-deps__/plugins-guard/auth-api-prefetch-and-persist.loader.ts b/perplexity/extension/src/plugins/__async-deps__/plugins-guard/auth-api-prefetch-and-persist.loader.ts index a7c0add08..39dc995ce 100644 --- a/perplexity/extension/src/plugins/__async-deps__/plugins-guard/auth-api-prefetch-and-persist.loader.ts +++ b/perplexity/extension/src/plugins/__async-deps__/plugins-guard/auth-api-prefetch-and-persist.loader.ts @@ -1,14 +1,11 @@ import { AsyncLoaderRegistry } from "@/plugins/__async-deps__/async-loaders"; import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; -import { - getPplxAuthOrgStatusQueryObserver, - getPplxAuthQueryObserver, -} from "@/plugins/__async-deps__/plugins-guard/store.loader"; import type { PplxAuthSessionApiResponse, PplxOrgSettingsApiResponse, } from "@/services/externals/pplx-api/pplx-api.types"; import { pplxApiQueries } from "@/services/externals/pplx-api/query-keys"; +import { isSubArray } from "@/utils/misc/utils"; declare module "@/plugins/__async-deps__/async-loaders" { interface AsyncLoadersRegistry { @@ -24,16 +21,21 @@ export default async function () { id: "store:pluginGuards:authApiPrefetch", dependencies: [], loader: async () => { - getPplxAuthQueryObserver().subscribe((data) => { - if (data.status !== "success" || data.fetchStatus !== "idle") return; - - void persistentQueryClient.persistQueryClient(); - }); - - getPplxAuthOrgStatusQueryObserver().subscribe((data) => { - if (data.status !== "success" || data.fetchStatus !== "idle") return; - - void persistentQueryClient.persistQueryClient(); + persistentQueryClient.queryClient.getQueryCache().subscribe((event) => { + if ( + isSubArray( + pplxApiQueries.auth.detail().queryKey as unknown as unknown[], + event.query.queryKey, + ) + ) { + if ( + event.type !== "observerResultsUpdated" || + event.query.state.status !== "success" || + event.query.state.fetchStatus !== "idle" + ) { + void persistentQueryClient.persistQueryClient(); + } + } }); return { diff --git a/perplexity/extension/src/plugins/__async-deps__/plugins-guard/store.loader.ts b/perplexity/extension/src/plugins/__async-deps__/plugins-guard/store.loader.ts index 02a814d90..7c901dc8d 100644 --- a/perplexity/extension/src/plugins/__async-deps__/plugins-guard/store.loader.ts +++ b/perplexity/extension/src/plugins/__async-deps__/plugins-guard/store.loader.ts @@ -23,13 +23,13 @@ declare module "@/plugins/__async-deps__/async-loaders" { } } -export const getPplxAuthQueryObserver = () => +const getPplxAuthQueryObserver = () => new QueryObserver( persistentQueryClient.queryClient, pplxApiQueries.auth.detail(), ); -export const getPplxAuthOrgStatusQueryObserver = () => +const getPplxAuthOrgStatusQueryObserver = () => new QueryObserver( persistentQueryClient.queryClient, pplxApiQueries.auth.orgStatus.detail(), diff --git a/perplexity/extension/src/plugins/__core__/_main-world/network-intercept/_service/index.ts b/perplexity/extension/src/plugins/__core__/_main-world/network-intercept/_service/index.ts index e6a770f5d..da8746ecc 100644 --- a/perplexity/extension/src/plugins/__core__/_main-world/network-intercept/_service/index.ts +++ b/perplexity/extension/src/plugins/__core__/_main-world/network-intercept/_service/index.ts @@ -1,3 +1,4 @@ +import { APP_CONFIG } from "@/app.config"; import type { Middleware, MiddlewareNameBasedPriority, @@ -133,6 +134,8 @@ export class NetworkInterceptMiddlewareManagerImpl { } async noop({ data }: { data: MiddlewareData }) { + if (!APP_CONFIG.IS_DEV) return; + switch (data.type) { case "networkIntercept:webSocketEvent": // console.log("%cwebSocketEvent", "color: blue", { diff --git a/perplexity/extension/src/plugins/__core__/_main-world/network-intercept/interceptors/fetch.ts b/perplexity/extension/src/plugins/__core__/_main-world/network-intercept/interceptors/fetch.ts index 4c8b0d8bc..83220feba 100644 --- a/perplexity/extension/src/plugins/__core__/_main-world/network-intercept/interceptors/fetch.ts +++ b/perplexity/extension/src/plugins/__core__/_main-world/network-intercept/interceptors/fetch.ts @@ -3,27 +3,30 @@ import { NetworkInterceptMiddlewareManagerService } from "@/plugins/__core__/_ma export function initFetchInterceptor() { const originalFetch = window.fetch; - window.fetch = async function (input: RequestInfo | URL, init?: RequestInit) { - if (init?.body == null || typeof init.body !== "string") { - return originalFetch.call(window, input, init); - } - - const [modifiedBody, error] = await tryCatch(() => - interceptRequest(input, init.body as string), - ); + window.fetch = async function ( + request: RequestInfo | URL, + init?: RequestInit, + ) { + // void logRequest(constructUrl(request), init?.body as string); + + if (init?.body != null && typeof init.body === "string") { + const [modifiedBody, error] = await tryCatch(() => + interceptRequest(request, init.body as string), + ); + + if (error) { + return originalFetch.call(window, request, init); + } - if (error) { - return originalFetch.call(window, input, init); - } + if (modifiedBody === "") { + return new Response("", { status: 200 }); + } - if (modifiedBody === "") { - return new Response("", { status: 200 }); + init.body = modifiedBody; } - init.body = modifiedBody; - - const response = await originalFetch.call(window, input, init); - const url = constructUrl(input); + const response = await originalFetch.call(window, request, init); + const url = constructUrl(request); if (response.headers.get("content-type")?.includes("text/event-stream")) { return handleStreamingResponse(response, url); @@ -33,13 +36,13 @@ export function initFetchInterceptor() { }; } -async function interceptRequest(input: RequestInfo | URL, body: string) { +async function interceptRequest(request: RequestInfo | URL, body: string) { const resp = await NetworkInterceptMiddlewareManagerService.Proxy.executeMiddlewares({ data: { type: "networkIntercept:fetchEvent", event: "request", - payload: { url: constructUrl(input), data: body }, + payload: { url: constructUrl(request), data: body }, }, }); @@ -87,7 +90,7 @@ function handleStreamingResponse(response: Response, url: string) { const events = parseSSEChunk(chunk); for (const event of events) { - await log(url, response.status, event.data); + void logResponse(url, response.status, event.data); } controller.enqueue(result.value); @@ -111,11 +114,21 @@ function handleStreamingResponse(response: Response, url: string) { async function handleRegularResponse(response: Response, url: string) { const clonedResponse = response.clone(); const body = await clonedResponse.text(); - await log(url, response.status, body); + void logResponse(url, response.status, body); return response; } -async function log(url: string, status: number, data: string) { +async function logRequest(url: string, data: string) { + void NetworkInterceptMiddlewareManagerService.Proxy.executeMiddlewares({ + data: { + type: "networkIntercept:fetchEvent", + event: "request", + payload: { url, data }, + }, + }); +} + +async function logResponse(url: string, status: number, data: string) { void NetworkInterceptMiddlewareManagerService.Proxy.noop({ data: { type: "networkIntercept:fetchEvent", @@ -127,6 +140,6 @@ async function log(url: string, status: number, data: string) { function constructUrl(url: unknown) { if (url instanceof URL) return url.href; - if (typeof url === "string") return url; + if (typeof url === "string") return new URL(url, window.location.origin).href; return ""; } diff --git a/perplexity/extension/src/plugins/__ui-groups__/elements/thread-message-footer/useCreatePortalContainers.ts b/perplexity/extension/src/plugins/__ui-groups__/elements/thread-message-footer/useCreatePortalContainers.ts index b94260a4c..64d7df594 100644 --- a/perplexity/extension/src/plugins/__ui-groups__/elements/thread-message-footer/useCreatePortalContainers.ts +++ b/perplexity/extension/src/plugins/__ui-groups__/elements/thread-message-footer/useCreatePortalContainers.ts @@ -1,7 +1,7 @@ import { useThreadMessageBlocksDomObserverStore } from "@/plugins/__core__/dom-observers/thread/message-blocks/store"; import { DomSelectorsService } from "@/plugins/__core__/dom-selectors/service-init.loader"; -const OBSERVER_ID = "cplx-thread-message-footer-extra-buttons-wrapper"; +const OBSERVER_ID = "thread-message-footer-extra-buttons-wrapper"; export function useCreatePortalContainers(): (Element | null)[] { const messageBlocks = useThreadMessageBlocksDomObserverStore( diff --git a/perplexity/extension/src/plugins/__ui-groups__/elements/thread-navbar-attributes/Group.tsx b/perplexity/extension/src/plugins/__ui-groups__/elements/thread-navbar-attributes/Group.tsx new file mode 100644 index 000000000..36058b032 --- /dev/null +++ b/perplexity/extension/src/plugins/__ui-groups__/elements/thread-navbar-attributes/Group.tsx @@ -0,0 +1,21 @@ +import CsUiRegistry from "@/__registries__/cs-ui"; +import { Portal } from "@/components/ui/portal"; +import { useCreatePortalContainer } from "@/plugins/__ui-groups__/elements/thread-navbar-attributes/useCreatePortalContainer"; + +declare module "@/__registries__/cs-ui/types" { + interface UiGroupsRegistry { + "thread:navbarAttributes": void; + } +} + +export function ThreadNavbarAttributesPluginsGroup() { + const portalContainer = useCreatePortalContainer(); + + return ( + +
+ {CsUiRegistry.ThreadNavbarAttributesGroupComponents} +
+
+ ); +} diff --git a/perplexity/extension/src/plugins/__ui-groups__/elements/thread-navbar-attributes/Wrapper.ts b/perplexity/extension/src/plugins/__ui-groups__/elements/thread-navbar-attributes/Wrapper.ts new file mode 100644 index 000000000..9ae246499 --- /dev/null +++ b/perplexity/extension/src/plugins/__ui-groups__/elements/thread-navbar-attributes/Wrapper.ts @@ -0,0 +1,22 @@ +import { lazily } from "react-lazily"; + +import { shouldEnableUiGroup } from "@/plugins/__async-deps__/plugins-guard/predicates"; +import { withPluginsGuard } from "@/plugins/__async-deps__/plugins-guard/withPluginsGuard"; + +const { ThreadNavbarAttributesPluginsGroup } = lazily( + () => + import("@/plugins/__ui-groups__/elements/thread-navbar-attributes/Group"), +); + +const ThreadNavbarAttributesPluginsGroupWrapper = withPluginsGuard( + ThreadNavbarAttributesPluginsGroup, + { + location: ["thread", "comet_assistant"], + additionalCheck: () => + shouldEnableUiGroup({ + uiGroup: "thread:navbarAttributes", + }), + }, +); + +export default ThreadNavbarAttributesPluginsGroupWrapper; diff --git a/perplexity/extension/src/plugins/__ui-groups__/elements/thread-navbar-attributes/useCreatePortalContainer.ts b/perplexity/extension/src/plugins/__ui-groups__/elements/thread-navbar-attributes/useCreatePortalContainer.ts new file mode 100644 index 000000000..5fb946faf --- /dev/null +++ b/perplexity/extension/src/plugins/__ui-groups__/elements/thread-navbar-attributes/useCreatePortalContainer.ts @@ -0,0 +1,29 @@ +import { useThreadDomObserverStore } from "@/plugins/__core__/dom-observers/thread/store"; +import { DomSelectorsService } from "@/plugins/__core__/dom-selectors/service-init.loader"; + +const OBSERVER_ID = "thread-navbar-attributes-wrapper"; + +export function useCreatePortalContainer(): HTMLElement | null { + const $overflowMenuButtonWrapper = useThreadDomObserverStore( + (state) => state.$overflowMenuButtonWrapper, + deepEqual, + ); + + if (!$overflowMenuButtonWrapper?.[0]) { + return null; + } + + const $wrapper = $($overflowMenuButtonWrapper[0]).parent(); + + const $existingPortalContainer = $wrapper.find( + DomSelectorsService.Root.cplxAttribute(OBSERVER_ID), + ); + + if ($existingPortalContainer[0]) return $existingPortalContainer[0]; + + const $portalContainer = $("
").internalComponentAttr(OBSERVER_ID); + + $wrapper.append($portalContainer); + + return $portalContainer[0] ?? null; +} diff --git a/perplexity/extension/src/plugins/__ui-groups__/routes/Thread/index.tsx b/perplexity/extension/src/plugins/__ui-groups__/routes/Thread/index.tsx index 58a4a3821..6ae17c710 100644 --- a/perplexity/extension/src/plugins/__ui-groups__/routes/Thread/index.tsx +++ b/perplexity/extension/src/plugins/__ui-groups__/routes/Thread/index.tsx @@ -1,5 +1,6 @@ import CsUiPluginsGuard from "@/plugins/__async-deps__/plugins-guard/CsUiPluginsGuard"; import ThreadMessageFooterPluginsGroupWrapper from "@/plugins/__ui-groups__/elements/thread-message-footer/Wrapper"; +import ThreadNavbarAttributesPluginsGroupWrapper from "@/plugins/__ui-groups__/elements/thread-navbar-attributes/Wrapper"; import ThreadQueryEditButtonPluginsGroupWrapper from "@/plugins/__ui-groups__/elements/thread-query-edit-button/Wrapper"; export default function ThreadComponents() { @@ -7,6 +8,7 @@ export default function ThreadComponents() { + ); } diff --git a/perplexity/extension/src/plugins/command-menu/cache.loader.ts b/perplexity/extension/src/plugins/command-menu/cache.loader.ts index 10ad22667..4c687f5d9 100644 --- a/perplexity/extension/src/plugins/command-menu/cache.loader.ts +++ b/perplexity/extension/src/plugins/command-menu/cache.loader.ts @@ -1,8 +1,7 @@ -import { QueryObserver } from "@tanstack/react-query"; - import { AsyncLoaderRegistry } from "@/plugins/__async-deps__/async-loaders"; import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { pplxApiQueries } from "@/services/externals/pplx-api/query-keys"; +import { isSubArray } from "@/utils/misc/utils"; declare module "@/plugins/__async-deps__/async-loaders" { interface AsyncLoadersRegistry { @@ -14,28 +13,45 @@ export default async function () { AsyncLoaderRegistry.register({ id: "plugin:commandMenu:prefetchAndPersist", dependencies: ["cache:pluginsEnableStates"], - loader: ({ "cache:pluginsEnableStates": pluginsEnableStates }) => { + loader: async ({ "cache:pluginsEnableStates": pluginsEnableStates }) => { if (!pluginsEnableStates["commandMenu"]) return; - new QueryObserver(persistentQueryClient.queryClient, { - queryKey: pplxApiQueries.spaces.detail().queryKey, - enabled: false, - }).subscribe((data) => { - if (data.status !== "success") return; + persistentQueryClient.queryClient.getQueryCache().subscribe((event) => { + const queryKey = event.query.queryKey; - void persistentQueryClient.persistQueryClient(); - }); + if ( + isSubArray( + pplxApiQueries.threads.infinite.all() as unknown as unknown[], + queryKey, + ) + ) { + if ( + event.type !== "observerResultsUpdated" || + event.query.state.status !== "success" || + event.query.state.fetchStatus !== "idle" + ) { + void persistentQueryClient.persistQueryClient(); + } + + return; + } - new QueryObserver(persistentQueryClient.queryClient, { - queryKey: pplxApiQueries.threads.infinite.detail({ - searchValue: "", - initialPageParam: 0, - }).queryKey, - enabled: false, - }).subscribe((data) => { - if (data.status !== "success") return; + if ( + isSubArray( + pplxApiQueries.spaces.detail().queryKey as unknown as unknown[], + queryKey, + ) + ) { + if ( + event.type !== "observerResultsUpdated" || + event.query.state.status !== "success" || + event.query.state.fetchStatus !== "idle" + ) { + void persistentQueryClient.persistQueryClient(); + } - void persistentQueryClient.persistQueryClient(); + return; + } }); }, }); diff --git a/perplexity/extension/src/plugins/thread-export/ExportMenu.tsx b/perplexity/extension/src/plugins/thread-export/ExportMenu.tsx index b67eebe69..4d25aa2cc 100644 --- a/perplexity/extension/src/plugins/thread-export/ExportMenu.tsx +++ b/perplexity/extension/src/plugins/thread-export/ExportMenu.tsx @@ -21,7 +21,7 @@ import TablerFileDownload from "~icons/tabler/file-download"; import TablerFileExport from "~icons/tabler/file-export"; import TablerLoaderCircle from "~icons/tabler/loader-2"; -export default function ExportMenu() { +export function ThreadExportMenu() { const { isMobile } = useIsMobileStore(); const { copyThread, isFetching, getContent } = useCopyPplxThread(); const [open, setOpen] = useState(false); diff --git a/perplexity/extension/src/plugins/thread-export/ThreadExport.tsx b/perplexity/extension/src/plugins/thread-export/ThreadExport.tsx deleted file mode 100644 index 3fcf30003..000000000 --- a/perplexity/extension/src/plugins/thread-export/ThreadExport.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { Portal } from "@/components/ui/portal"; -import ExportMenu from "@/plugins/thread-export/ExportMenu"; -import useCreatePortalContainer from "@/plugins/thread-export/useCreatePortalContainer"; - -export function ThreadExport() { - const portalContainer = useCreatePortalContainer(); - - return ( - - - - ); -} diff --git a/perplexity/extension/src/plugins/thread-export/Wrapper.cs-ui.tsx b/perplexity/extension/src/plugins/thread-export/Wrapper.cs-ui.tsx index cdf01ac2f..f76e92056 100644 --- a/perplexity/extension/src/plugins/thread-export/Wrapper.cs-ui.tsx +++ b/perplexity/extension/src/plugins/thread-export/Wrapper.cs-ui.tsx @@ -1,14 +1,17 @@ import { lazily } from "react-lazily"; +import type { UiGroupId } from "@/__registries__/cs-ui/types"; import { withPluginsGuard } from "@/plugins/__async-deps__/plugins-guard/withPluginsGuard"; -const { ThreadExport } = lazily( - () => import("@/plugins/thread-export/ThreadExport"), +const { ThreadExportMenu } = lazily( + () => import("@/plugins/thread-export/ExportMenu"), ); -const ExportThreadWrapper = withPluginsGuard(ThreadExport, { +const ExportThreadWrapper = withPluginsGuard(ThreadExportMenu, { dependentPluginIds: ["thread:exportThread"], location: ["thread"], }); +export const uiGroup: UiGroupId = "thread:navbarAttributes"; + export default ExportThreadWrapper; diff --git a/perplexity/extension/src/plugins/thread-export/index.manifest.ts b/perplexity/extension/src/plugins/thread-export/index.manifest.ts index 09c366e4e..9a29831bf 100644 --- a/perplexity/extension/src/plugins/thread-export/index.manifest.ts +++ b/perplexity/extension/src/plugins/thread-export/index.manifest.ts @@ -25,6 +25,7 @@ export default definePlugin({ }, dependencies: { corePlugins: ["domObservers:thread:messageBlocks"], + uiGroups: ["thread:navbarAttributes"], }, }, settingsSchema: { diff --git a/perplexity/extension/src/plugins/thread-export/useCreatePortalContainer.ts b/perplexity/extension/src/plugins/thread-export/useCreatePortalContainer.ts deleted file mode 100644 index 4572720ae..000000000 --- a/perplexity/extension/src/plugins/thread-export/useCreatePortalContainer.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { useThreadDomObserverStore } from "@/plugins/__core__/dom-observers/thread/store"; -import { DomSelectorsService } from "@/plugins/__core__/dom-selectors/service-init.loader"; - -export default function useObserver() { - const $overflowMenuButtonWrapper = useThreadDomObserverStore( - (state) => state.$overflowMenuButtonWrapper, - deepEqual, - ); - - return (() => { - if ($overflowMenuButtonWrapper == null || !$overflowMenuButtonWrapper[0]) { - $( - DomSelectorsService.Root.cplxAttribute( - DomSelectorsService.Root.internalAttributes.THREAD.NAVBAR_CHILD - .EXPORT_THREAD_BUTTON, - ), - ).remove(); - - return null; - } - - const $wrapper = $($overflowMenuButtonWrapper[0]).parent(); - - const $existingPortalContainer = $wrapper.find( - DomSelectorsService.Root.cplxAttribute( - DomSelectorsService.Root.internalAttributes.THREAD.NAVBAR_CHILD - .EXPORT_THREAD_BUTTON, - ), - ); - - if ($existingPortalContainer.length) return $existingPortalContainer[0]; - - const $portalContainer = $("
").internalComponentAttr( - DomSelectorsService.Root.internalAttributes.THREAD.NAVBAR_CHILD - .EXPORT_THREAD_BUTTON, - ); - - $wrapper.append($portalContainer); - - return $portalContainer[0]; - })(); -} diff --git a/perplexity/extension/src/plugins/thread-toc/ThreadToc.tsx b/perplexity/extension/src/plugins/thread-toc/ThreadToc.tsx deleted file mode 100644 index c7ab6bb6e..000000000 --- a/perplexity/extension/src/plugins/thread-toc/ThreadToc.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import { useInsertCss } from "@/hooks/useInsertCss"; -import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; -import { useThreadDomObserverStore } from "@/plugins/__core__/dom-observers/thread/store"; -import { threadTocCssResourceConfig } from "@/plugins/thread-toc/index.remote-resources"; -import { TocMenuToggle } from "@/plugins/thread-toc/TocMenuToggle"; -import { TocPanel } from "@/plugins/thread-toc/TocPanel"; -import { useHandleTouch } from "@/plugins/thread-toc/useHandleTouch"; -import { usePanelPosition } from "@/plugins/thread-toc/usePanelPosition"; -import { useThreadTocItems } from "@/plugins/thread-toc/useThreadTocItems"; -import { getVersionedRemoteResource } from "@/services/externals/cplx-api/versioned-remote-resources/utils"; - -const threadTocCss = await getVersionedRemoteResource( - threadTocCssResourceConfig, - persistentQueryClient, -); - -export function ThreadToc() { - const [isOpen, setIsOpen] = useState(false); - - const threadWrapper = useThreadDomObserverStore( - (store) => store.$wrapper?.[0], - deepEqual, - ); - - const containerRef = useRef(null); - - const tocItems = useThreadTocItems(); - - const panelPosition = usePanelPosition({ - tocItems, - }); - - useInsertCss({ - id: "thread-toc", - css: threadTocCss, - }); - - useHandleTouch({ - containerRef, - isOpen, - setIsOpen, - }); - - const shouldShowToc = tocItems.length > 1 && panelPosition != null; - - if (!shouldShowToc || threadWrapper == null) return null; - - return ( - <> - setIsOpen(true)} - /> - setIsOpen(false)} - /> - - ); -} diff --git a/perplexity/extension/src/plugins/thread-toc/TocItem.tsx b/perplexity/extension/src/plugins/thread-toc/TocItem.tsx index 9d3b82f8f..c13ab365b 100644 --- a/perplexity/extension/src/plugins/thread-toc/TocItem.tsx +++ b/perplexity/extension/src/plugins/thread-toc/TocItem.tsx @@ -1,6 +1,6 @@ -import type { TocItem as TocItemType } from "@/plugins/thread-toc/useThreadTocItems"; +import type { TocItem as TocItemType } from "@/plugins/thread-toc/store/types"; -const TocItem = memo(function TocItem({ +export default function TocItem({ item, onClick, onContextMenu, @@ -38,6 +38,4 @@ const TocItem = memo(function TocItem({
); -}); - -export default TocItem; +} diff --git a/perplexity/extension/src/plugins/thread-toc/TocMenuToggle.tsx b/perplexity/extension/src/plugins/thread-toc/TocMenuToggle.tsx index f754fa5ec..8a3e7537b 100644 --- a/perplexity/extension/src/plugins/thread-toc/TocMenuToggle.tsx +++ b/perplexity/extension/src/plugins/thread-toc/TocMenuToggle.tsx @@ -1,40 +1,29 @@ import { Activity } from "react"; -import { Portal } from "@/components/ui/portal"; -import { useThreadDomObserverStore } from "@/plugins/__core__/dom-observers/thread/store"; +import Tooltip from "@/components/Tooltip"; +import { Button } from "@/components/ui/button"; +import { useThreadTocStore } from "@/plugins/thread-toc/store"; -import TablerMenuDeep from "~icons/tabler/menu-deep"; +import TablerMenu2 from "~icons/tabler/menu-2"; -type TocMenuToggleProps = { - isOpen: boolean; - isFloating: boolean; - onToggleOpen: () => void; -}; - -export function TocMenuToggle({ - isOpen, - isFloating, - onToggleOpen, -}: TocMenuToggleProps) { - const threadWrapper = useThreadDomObserverStore( - (store) => store.$wrapper?.[0], - deepEqual, - ); +export function TocMenuToggle() { + const isOpen = useThreadTocStore((state) => state.isOpen); + const setIsOpen = useThreadTocStore((state) => state.setIsOpen); + const panelPosition = useThreadTocStore((state) => state.panelPosition); + const isFloating = panelPosition?.isOverflowing; return ( - - -
+ +
-
-
+ + + + ); } diff --git a/perplexity/extension/src/plugins/thread-toc/TocMenuToggleWrapper.cs-ui.tsx b/perplexity/extension/src/plugins/thread-toc/TocMenuToggleWrapper.cs-ui.tsx new file mode 100644 index 000000000..d5d2e6109 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-toc/TocMenuToggleWrapper.cs-ui.tsx @@ -0,0 +1,17 @@ +import { lazily } from "react-lazily"; + +import type { UiGroupId } from "@/__registries__/cs-ui/types"; +import { withPluginsGuard } from "@/plugins/__async-deps__/plugins-guard/withPluginsGuard"; + +const { TocMenuToggle } = lazily( + () => import("@/plugins/thread-toc/TocMenuToggle"), +); + +export const TocMenuToggleWrapper = withPluginsGuard(TocMenuToggle, { + dependentPluginIds: ["thread:toc"], + location: ["thread"], +}); + +export const uiGroup: UiGroupId = "thread:navbarAttributes"; + +export default TocMenuToggleWrapper; diff --git a/perplexity/extension/src/plugins/thread-toc/TocPanel.tsx b/perplexity/extension/src/plugins/thread-toc/TocPanel.tsx index 940976020..b691fe195 100644 --- a/perplexity/extension/src/plugins/thread-toc/TocPanel.tsx +++ b/perplexity/extension/src/plugins/thread-toc/TocPanel.tsx @@ -1,44 +1,61 @@ -import type React from "react"; import { Activity } from "react"; import { Portal } from "@/components/ui/portal"; +import { useInsertCss } from "@/hooks/useInsertCss"; +import { persistentQueryClient } from "@/plugins/__async-deps__/persistent-query-client"; import { useThreadDomObserverStore } from "@/plugins/__core__/dom-observers/thread/store"; import { DomSelectorsService } from "@/plugins/__core__/dom-selectors/service-init.loader"; +import { threadTocCssResourceConfig } from "@/plugins/thread-toc/index.remote-resources"; +import { useThreadTocStore } from "@/plugins/thread-toc/store"; import TocItem from "@/plugins/thread-toc/TocItem"; -import { PANEL_WIDTH } from "@/plugins/thread-toc/usePanelPosition"; -import type { TocItem as TocItemType } from "@/plugins/thread-toc/useThreadTocItems"; +import { useHandleTouch } from "@/plugins/thread-toc/useHandleTouch"; +import { getVersionedRemoteResource } from "@/services/externals/cplx-api/versioned-remote-resources/utils"; import { scrollToElement } from "@/utils/dom-utils/generics"; import { PPLX_SCROLLBAR_CLASSES } from "@/utils/dom-utils/pplx-scrollbar-classes"; import TablerX from "~icons/tabler/x"; -type TocPanelProps = { - containerRef: React.RefObject; - left: number; - isOpen: boolean; - isFloating: boolean; - tocItems: TocItemType[]; - onToggleClosed: () => void; -}; +const threadTocCss = await getVersionedRemoteResource( + threadTocCssResourceConfig, + persistentQueryClient, +); + +export function TocPanel() { + const isOpen = useThreadTocStore((state) => state.isOpen); + const setIsOpen = useThreadTocStore((state) => state.setIsOpen); + const tocItems = useThreadTocStore((state) => state.tocItems); + const panelPosition = useThreadTocStore((state) => state.panelPosition); -export function TocPanel({ - containerRef, - left, - isOpen, - isFloating, - tocItems, - onToggleClosed, -}: TocPanelProps) { const threadWrapper = useThreadDomObserverStore( (store) => store.$wrapper?.[0], deepEqual, ); + const containerRef = useRef(null); + + useInsertCss({ + id: "thread-toc", + css: threadTocCss, + }); + + useHandleTouch({ + containerRef, + isOpen, + setIsOpen, + }); + + const shouldShowToc = tocItems.length > 1 && panelPosition != null; + + if (!shouldShowToc || threadWrapper == null) return null; + + const isFloating = panelPosition.isOverflowing; + const width = panelPosition.width; + const left = panelPosition.position.left; + return ( - - + +
setIsOpen(false)} >
@@ -101,7 +118,7 @@ export function TocPanel({ ))}
- - + + ); } diff --git a/perplexity/extension/src/plugins/thread-toc/Wrapper.cs-ui.tsx b/perplexity/extension/src/plugins/thread-toc/TocPanelWrapper.cs-ui.tsx similarity index 53% rename from perplexity/extension/src/plugins/thread-toc/Wrapper.cs-ui.tsx rename to perplexity/extension/src/plugins/thread-toc/TocPanelWrapper.cs-ui.tsx index a42d9cc11..0e0944d32 100644 --- a/perplexity/extension/src/plugins/thread-toc/Wrapper.cs-ui.tsx +++ b/perplexity/extension/src/plugins/thread-toc/TocPanelWrapper.cs-ui.tsx @@ -2,11 +2,11 @@ import { lazily } from "react-lazily"; import { withPluginsGuard } from "@/plugins/__async-deps__/plugins-guard/withPluginsGuard"; -const { ThreadToc } = lazily(() => import("@/plugins/thread-toc/ThreadToc")); +const { TocPanel } = lazily(() => import("@/plugins/thread-toc/TocPanel")); -export const ThreadTocWrapper = withPluginsGuard(ThreadToc, { +export const TocPanelWrapper = withPluginsGuard(TocPanel, { dependentPluginIds: ["thread:toc"], location: ["thread"], }); -export default ThreadTocWrapper; +export default TocPanelWrapper; diff --git a/perplexity/extension/src/plugins/thread-toc/index.manifest.ts b/perplexity/extension/src/plugins/thread-toc/index.manifest.ts index de1086f76..4ed725ea1 100644 --- a/perplexity/extension/src/plugins/thread-toc/index.manifest.ts +++ b/perplexity/extension/src/plugins/thread-toc/index.manifest.ts @@ -24,6 +24,7 @@ export default definePlugin({ }, dependencies: { corePlugins: ["domObservers:thread", "domObservers:thread:messageBlocks"], + uiGroups: ["thread:navbarAttributes"], }, }, settingsSchema: { diff --git a/perplexity/extension/src/plugins/thread-toc/store/index.ts b/perplexity/extension/src/plugins/thread-toc/store/index.ts new file mode 100644 index 000000000..65981d4db --- /dev/null +++ b/perplexity/extension/src/plugins/thread-toc/store/index.ts @@ -0,0 +1,27 @@ +import { create } from "zustand"; +import { subscribeWithSelector } from "zustand/middleware"; +import { immer } from "zustand/middleware/immer"; + +import type { PanelPosition, TocItem } from "@/plugins/thread-toc/store/types"; + +type ThreadTocStore = { + isOpen: boolean; + setIsOpen: (isOpen: boolean) => void; + tocItems: TocItem[]; + panelPosition: PanelPosition | null; +}; + +export const threadTocStore = create()( + subscribeWithSelector( + immer( + (set): ThreadTocStore => ({ + isOpen: false, + setIsOpen: (isOpen: boolean) => set({ isOpen }), + tocItems: [], + panelPosition: null, + }), + ), + ), +); + +export const useThreadTocStore = threadTocStore; diff --git a/perplexity/extension/src/plugins/thread-toc/store/store.loader.ts b/perplexity/extension/src/plugins/thread-toc/store/store.loader.ts new file mode 100644 index 000000000..a85704707 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-toc/store/store.loader.ts @@ -0,0 +1,84 @@ +import { pplxCookiesStore } from "@/plugins/__async-deps__/global-stores/pplx-cookies-store"; +import { spaRouterStoreSubscribe } from "@/plugins/__core__/_main-world/spa-router/utils"; +import { threadMessageBlocksDomObserverStore } from "@/plugins/__core__/dom-observers/thread/message-blocks/store"; +import { threadDomObserverStore } from "@/plugins/__core__/dom-observers/thread/store"; +import { threadTocStore } from "@/plugins/thread-toc/store"; +import { utils } from "@/plugins/thread-toc/store/utils"; +import { getTaskScheduler } from "@/utils/misc/utils"; +import { deepEqual } from "@/utils/wrappers/deep-equal"; + +export default function () { + threadMessageBlocksDomObserverStore.subscribe( + ({ messageBlocks }) => messageBlocks, + (messageBlocks) => { + utils.setCurrentMessageBlocks(messageBlocks); + + if ( + !utils.getPendingUpdate() && + !deepEqual(messageBlocks, utils.getLastMessageBlocks()) + ) { + utils.setLastMessageBlocks(messageBlocks); + utils.setPendingUpdate(true); + + getTaskScheduler()(() => { + utils.updateItems(messageBlocks, utils.getCurrentTocItems()); + utils.setPendingUpdate(false); + }); + } + }, + { equalityFn: deepEqual }, + ); + + threadTocStore.subscribe( + (state) => state.tocItems, + (tocItems) => { + utils.setCurrentTocItems(tocItems); + const delay = utils.getDebounceDelay(tocItems.length); + utils.debouncedCalculatePanelPosition(delay); + }, + { equalityFn: deepEqual }, + ); + + threadDomObserverStore.subscribe( + (state) => state.$wrapper, + ($wrapper) => { + utils.setCurrentThreadWrapper($wrapper?.[0] ?? null); + utils.calculatePanelPosition(); + }, + { equalityFn: deepEqual }, + ); + + pplxCookiesStore.subscribe( + (state) => + state.cookies.find((cookie) => cookie.name === "isSidebarPinned"), + () => { + utils.calculatePanelPosition(); + }, + { equalityFn: deepEqual }, + ); + + spaRouterStoreSubscribe( + (url) => url, + () => { + utils.calculatePanelPosition(); + }, + ); + + const handleResize = () => { + const newWidth = window.innerWidth; + const newHeight = window.innerHeight; + + if ( + newWidth !== utils.getWindowWidth() || + newHeight !== utils.getWindowHeight() + ) { + utils.setWindowWidth(newWidth); + utils.setWindowHeight(newHeight); + + const delay = utils.getDebounceDelay(utils.getCurrentTocItems().length); + utils.debouncedCalculatePanelPosition(delay); + } + }; + + window.addEventListener("resize", handleResize); +} diff --git a/perplexity/extension/src/plugins/thread-toc/store/types.ts b/perplexity/extension/src/plugins/thread-toc/store/types.ts new file mode 100644 index 000000000..444ed1b9f --- /dev/null +++ b/perplexity/extension/src/plugins/thread-toc/store/types.ts @@ -0,0 +1,13 @@ +export type TocItem = { + id: number; + title: string; + element: JQuery; + isActive?: boolean; + isActiveTopMost?: boolean; +}; + +export type PanelPosition = { + position: { left: number }; + isOverflowing: boolean; + width: number; +}; diff --git a/perplexity/extension/src/plugins/thread-toc/store/utils.ts b/perplexity/extension/src/plugins/thread-toc/store/utils.ts new file mode 100644 index 000000000..b6d578f9f --- /dev/null +++ b/perplexity/extension/src/plugins/thread-toc/store/utils.ts @@ -0,0 +1,281 @@ +import type { MessageBlock } from "@/plugins/__core__/dom-observers/thread/message-blocks/types"; +import { threadTocStore } from "@/plugins/thread-toc/store"; +import type { TocItem } from "@/plugins/thread-toc/store/types"; + +const DEBOUNCE_DELAY_THRESHOLD = 5; +const DEBOUNCE_DELAY_MS = 200; +const PANEL_PADDING = 64; +const PANEL_MARGIN = 32; +const DEFAULT_HEADER_HEIGHT = 53; +const MAX_PANEL_WIDTH = 300; +const MIN_PANEL_WIDTH = 150; + +let activeId: number | null = null; +let topMostId: number | null = null; +let observer: IntersectionObserver | null = null; +let topMostObserver: IntersectionObserver | null = null; +let lastMessageBlocks: MessageBlock[] | null = null; +let pendingUpdate = false; + +let windowWidth = window.innerWidth; +let windowHeight = window.innerHeight; +let debounceTimer: ReturnType | null = null; +let currentTocItems: TocItem[] = []; +let currentThreadWrapper: HTMLElement | null = null; +let currentMessageBlocks: MessageBlock[] | null = null; + +const createObservers = (() => { + let cachedObserver: IntersectionObserver | null = null; + let cachedTopMostObserver: IntersectionObserver | null = null; + + const getHeaderHeight = () => { + return ( + parseInt( + getComputedStyle(document.body).getPropertyValue("--header-height"), + ) || DEFAULT_HEADER_HEIGHT + ); + }; + + const createIntersectionHandler = ( + callback: (id: number) => void, + ): IntersectionObserverCallback => { + return (entries) => { + for (const entry of entries) { + if (entry.isIntersecting) { + const elementId = entry.target.getAttribute("data-index"); + if (elementId) { + callback(parseInt(elementId)); + break; + } + } + } + }; + }; + + return ( + onIntersect: (id: number) => void, + onTopMostIntersect: (id: number) => void, + ) => { + if (!cachedObserver) { + cachedObserver = new IntersectionObserver( + createIntersectionHandler(onIntersect), + { + threshold: 0, + rootMargin: "-49% 0px -49% 0px", + }, + ); + } + + if (!cachedTopMostObserver) { + const headerHeight = getHeaderHeight(); + cachedTopMostObserver = new IntersectionObserver( + createIntersectionHandler(onTopMostIntersect), + { + threshold: 0, + rootMargin: `-${headerHeight + PANEL_MARGIN}px 0px -90% 0px`, + }, + ); + } + + return { + observer: cachedObserver, + topMostObserver: cachedTopMostObserver, + }; + }; +})(); + +const cleanupObserver = () => { + if (observer) { + observer.disconnect(); + observer = null; + } + if (topMostObserver) { + topMostObserver.disconnect(); + topMostObserver = null; + } +}; + +const updateActiveItem = (id: number) => { + if (activeId === id) return; + + activeId = id; + + threadTocStore.setState((state) => ({ + tocItems: state.tocItems.map((item) => + item.id === id + ? { ...item, isActive: true } + : item.isActive + ? { ...item, isActive: false } + : item, + ), + })); +}; + +const updateTopMostItem = (id: number) => { + if (topMostId === id) return; + + topMostId = id; + + threadTocStore.setState((state) => ({ + tocItems: state.tocItems.map((item) => + item.id === id + ? { ...item, isActiveTopMost: true } + : item.isActiveTopMost + ? { ...item, isActiveTopMost: false } + : item, + ), + })); +}; + +const updateItems = ( + messageBlocks: MessageBlock[] | null, + previousTocItems: TocItem[], +) => { + if (!messageBlocks) return; + + cleanupObserver(); + + const observers = createObservers(updateActiveItem, updateTopMostItem); + observer = observers.observer; + topMostObserver = observers.topMostObserver; + + const existingTitles = new Map( + previousTocItems.map((item) => [item.id, item.title]), + ); + + const newItems = messageBlocks.map( + ({ nodes: { $wrapper }, content: { title } }, idx: number) => { + const element = $wrapper[0]; + if (element) { + observer!.observe(element); + topMostObserver!.observe(element); + } + + const itemTitle = + title.length > 0 ? title : (existingTitles.get(idx) ?? ""); + + return { + id: idx, + title: itemTitle, + element: $wrapper, + isActive: idx === activeId, + isActiveTopMost: idx === topMostId, + }; + }, + ); + + threadTocStore.setState({ tocItems: newItems }); +}; + +const getActiveMessageBlockContentWrapper = (): HTMLElement | null => { + if (currentTocItems.length === 0 || !currentMessageBlocks) { + return null; + } + + const activeMessageBlockId = currentTocItems.findIndex( + (item) => item.isActiveTopMost, + ); + const targetBlockId = activeMessageBlockId === -1 ? 0 : activeMessageBlockId; + const messageBlock = currentMessageBlocks[targetBlockId]; + + if (!messageBlock) { + return null; + } + + if (messageBlock.states.isVirtualized) { + return currentMessageBlocks[0]?.nodes.$contentWrapper[0] ?? null; + } + + return messageBlock.nodes.$contentWrapper[0] ?? null; +}; + +const calculatePanelPosition = () => { + if (currentThreadWrapper == null || currentTocItems.length === 0) { + threadTocStore.setState({ panelPosition: null }); + return; + } + + const activeMessageBlockContentWrapper = + getActiveMessageBlockContentWrapper(); + + if (activeMessageBlockContentWrapper == null) { + threadTocStore.setState({ panelPosition: null }); + return; + } + + const threadContentWrapperOffsetRight = + activeMessageBlockContentWrapper.offsetLeft + + activeMessageBlockContentWrapper.offsetWidth; + + const availableSpace = + currentThreadWrapper.offsetWidth - + threadContentWrapperOffsetRight - + PANEL_PADDING - + PANEL_MARGIN; + + const panelWidth = Math.max( + MIN_PANEL_WIDTH, + Math.min(MAX_PANEL_WIDTH, availableSpace), + ); + + const panelRightEdge = + threadContentWrapperOffsetRight + panelWidth + PANEL_PADDING; + const isOverflowing = panelRightEdge > currentThreadWrapper.offsetWidth; + + threadTocStore.setState({ + panelPosition: { + position: { + left: threadContentWrapperOffsetRight + PANEL_MARGIN, + }, + isOverflowing, + width: isOverflowing ? MAX_PANEL_WIDTH : panelWidth, + }, + }); +}; + +const getDebounceDelay = (tocItemsLength: number) => { + return tocItemsLength > DEBOUNCE_DELAY_THRESHOLD ? DEBOUNCE_DELAY_MS : 0; +}; + +const debouncedCalculatePanelPosition = (delay: number) => { + if (debounceTimer) { + clearTimeout(debounceTimer); + } + debounceTimer = setTimeout(() => { + calculatePanelPosition(); + debounceTimer = null; + }, delay); +}; + +export const utils = { + updateItems, + calculatePanelPosition, + debouncedCalculatePanelPosition, + getDebounceDelay, + setCurrentMessageBlocks: (blocks: MessageBlock[] | null) => { + currentMessageBlocks = blocks; + }, + setCurrentTocItems: (items: TocItem[]) => { + currentTocItems = items; + }, + setCurrentThreadWrapper: (wrapper: HTMLElement | null) => { + currentThreadWrapper = wrapper; + }, + getCurrentTocItems: () => currentTocItems, + getLastMessageBlocks: () => lastMessageBlocks, + setLastMessageBlocks: (blocks: MessageBlock[] | null) => { + lastMessageBlocks = blocks; + }, + getPendingUpdate: () => pendingUpdate, + setPendingUpdate: (value: boolean) => { + pendingUpdate = value; + }, + getWindowWidth: () => windowWidth, + getWindowHeight: () => windowHeight, + setWindowWidth: (width: number) => { + windowWidth = width; + }, + setWindowHeight: (height: number) => { + windowHeight = height; + }, +}; diff --git a/perplexity/extension/src/plugins/thread-toc/usePanelPosition.ts b/perplexity/extension/src/plugins/thread-toc/usePanelPosition.ts deleted file mode 100644 index 486b42bf4..000000000 --- a/perplexity/extension/src/plugins/thread-toc/usePanelPosition.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { useDebounce, useWindowSize } from "@uidotdev/usehooks"; - -import { usePplxCookiesStore } from "@/plugins/__async-deps__/global-stores/pplx-cookies-store"; -import { useSpaRouter } from "@/plugins/__core__/_main-world/spa-router/utils"; -import { useThreadMessageBlocksDomObserverStore } from "@/plugins/__core__/dom-observers/thread/message-blocks/store"; -import { useThreadDomObserverStore } from "@/plugins/__core__/dom-observers/thread/store"; -import type { TocItem } from "@/plugins/thread-toc/useThreadTocItems"; - -export const PANEL_WIDTH = 300; - -type PanelPosition = { - position: { left: number }; - isOverflowing: boolean; -}; - -export function usePanelPosition({ - tocItems, -}: { - tocItems: TocItem[]; -}): PanelPosition | null { - const threadWrapper = useThreadDomObserverStore( - (store) => store.$wrapper?.[0], - deepEqual, - ); - - const activeMessageBlockId = tocItems.findIndex( - (item) => item.isActiveTopMost, - ); - - const activeMessageBlockContentWrapper = - useThreadMessageBlocksDomObserverStore((store) => { - const messageBlock = store.messageBlocks?.[activeMessageBlockId]; - - if (messageBlock == null) return null; - - if (messageBlock.states.isVirtualized) - return store.messageBlocks?.[0]?.nodes.$contentWrapper[0]; - - return messageBlock.nodes.$contentWrapper[0]; - }, deepEqual); - - const isSidebarPinned = usePplxCookiesStore( - (store) => - store.cookies.find((cookie) => cookie.name === "isSidebarPinned") - ?.value === "true", - deepEqual, - ); - - const windowSize = useDebounce( - useWindowSize(), - tocItems.length > 5 ? 200 : 0, - ); - - const url = useSpaRouter((store) => store.url); - - const calculatePosition = useCallback(() => { - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - void (isSidebarPinned && windowSize != null && url != null); - - if (threadWrapper == null || activeMessageBlockContentWrapper == null) { - return null; - } - - const threadContentWrapperOffsetRight = - activeMessageBlockContentWrapper.offsetLeft + - activeMessageBlockContentWrapper.offsetWidth; - - const panelRightEdge = threadContentWrapperOffsetRight + PANEL_WIDTH + 64; - - return { - position: { - left: threadContentWrapperOffsetRight + 32, - }, - isOverflowing: panelRightEdge > threadWrapper.offsetWidth, - }; - }, [ - isSidebarPinned, - activeMessageBlockContentWrapper, - threadWrapper, - url, - windowSize, - ]); - - return calculatePosition(); -} diff --git a/perplexity/extension/src/plugins/thread-toc/useThreadTocItems.ts b/perplexity/extension/src/plugins/thread-toc/useThreadTocItems.ts deleted file mode 100644 index 1e96d0cb1..000000000 --- a/perplexity/extension/src/plugins/thread-toc/useThreadTocItems.ts +++ /dev/null @@ -1,249 +0,0 @@ -import { useSyncExternalStore } from "react"; - -import { threadMessageBlocksDomObserverStore } from "@/plugins/__core__/dom-observers/thread/message-blocks/store"; -import type { MessageBlock } from "@/plugins/__core__/dom-observers/thread/message-blocks/types"; -import { getTaskScheduler } from "@/utils/misc/utils"; - -export type TocItem = { - id: number; - title: string; - element: JQuery; - isActive?: boolean; - isActiveTopMost?: boolean; -}; - -type TocStore = { - items: TocItem[]; - activeId: number | null; - topMostId: number | null; - observer: IntersectionObserver | null; - topMostObserver: IntersectionObserver | null; -}; - -const createObservers = (() => { - let cachedObserver: IntersectionObserver | null = null; - let cachedTopMostObserver: IntersectionObserver | null = null; - - return ( - onIntersect: (id: number) => void, - onTopMostIntersect: (id: number) => void, - ) => { - if (!cachedObserver) { - cachedObserver = new IntersectionObserver( - (entries) => { - for (const entry of entries) { - if (entry.isIntersecting) { - const elementId = entry.target.getAttribute("data-index"); - if (elementId) { - onIntersect(parseInt(elementId)); - break; - } - } - } - }, - { - threshold: 0, - rootMargin: "-49% 0px -49% 0px", - }, - ); - } - - if (!cachedTopMostObserver) { - const navbarHeight = - parseInt( - getComputedStyle(document.body).getPropertyValue("--header-height"), - ) || 53; - - cachedTopMostObserver = new IntersectionObserver( - (entries) => { - for (const entry of entries) { - if (entry.isIntersecting) { - const elementId = entry.target.getAttribute("data-index"); - if (elementId) { - onTopMostIntersect(parseInt(elementId)); - break; - } - } - } - }, - { - threshold: 0, - rootMargin: `-${navbarHeight + 32}px 0px -90% 0px`, - }, - ); - } - - return { - observer: cachedObserver, - topMostObserver: cachedTopMostObserver, - cleanup: () => { - if (cachedObserver) { - cachedObserver.disconnect(); - } - if (cachedTopMostObserver) { - cachedTopMostObserver.disconnect(); - } - }, - }; - }; -})(); - -const createTocStore = () => { - const state: TocStore = { - items: [], - activeId: null, - topMostId: null, - observer: null, - topMostObserver: null, - }; - - const cleanupObserver = () => { - if (state.observer) { - state.observer.disconnect(); - state.observer = null; - } - if (state.topMostObserver) { - state.topMostObserver.disconnect(); - state.topMostObserver = null; - } - }; - - let lastMessageBlocks: MessageBlock[] | null = null; - let pendingUpdate = false; - - const listeners = new Set<() => void>(); - - const getSnapshot = () => { - const messageBlocks = - threadMessageBlocksDomObserverStore.getState().messageBlocks; - - if (!pendingUpdate && !deepEqual(messageBlocks, lastMessageBlocks)) { - lastMessageBlocks = messageBlocks; - pendingUpdate = true; - - getTaskScheduler()(() => { - updateItems(messageBlocks); - pendingUpdate = false; - }); - } - - return state.items; - }; - - const subscribe = (listener: () => void) => { - listeners.add(listener); - - const unsubscribeMessageBlocks = - threadMessageBlocksDomObserverStore.subscribe( - ({ messageBlocks }) => messageBlocks, - () => { - const messageBlocks = - threadMessageBlocksDomObserverStore.getState().messageBlocks; - if (!deepEqual(messageBlocks, lastMessageBlocks)) { - listener(); - } - }, - { equalityFn: deepEqual }, - ); - - return () => { - listeners.delete(listener); - unsubscribeMessageBlocks(); - cleanupObserver(); - }; - }; - - const emitChanges = () => { - if (listeners.size > 0) { - listeners.forEach((listener) => listener()); - } - }; - - const updateActiveItem = (id: number) => { - if (state.activeId === id) return; - - state.activeId = id; - - state.items = state.items.map((item) => - item.id === id - ? { ...item, isActive: true } - : item.isActive - ? { ...item, isActive: false } - : item, - ); - - emitChanges(); - }; - - const updateTopMostItem = (id: number) => { - if (state.topMostId === id) return; - - state.topMostId = id; - - state.items = state.items.map((item) => - item.id === id - ? { ...item, isActiveTopMost: true } - : item.isActiveTopMost - ? { ...item, isActiveTopMost: false } - : item, - ); - - emitChanges(); - }; - - const updateItems = (messageBlocks: MessageBlock[] | null) => { - if (!messageBlocks) return; - - cleanupObserver(); - - const { observer, topMostObserver } = createObservers( - updateActiveItem, - updateTopMostItem, - ); - - state.observer = observer; - state.topMostObserver = topMostObserver; - - const existingTitles = new Map( - state.items.map((item) => [item.id, item.title]), - ); - - state.items = messageBlocks.map( - ({ nodes: { $wrapper }, content: { title } }, idx: number) => { - if ($wrapper[0]) { - observer.observe($wrapper[0]); - topMostObserver.observe($wrapper[0]); - } - - const itemTitle = - title.length > 0 ? title : (existingTitles.get(idx) ?? ""); - - return { - id: idx, - title: itemTitle, - element: $wrapper, - isActive: idx === state.activeId, - isActiveTopMost: idx === state.topMostId, - }; - }, - ); - - emitChanges(); - }; - - return { - subscribe, - getSnapshot, - getActiveItem: () => state.items.find((item) => item.isActive) || null, - }; -}; - -const tocStore = createTocStore(); - -export function useThreadTocItems() { - return useSyncExternalStore(tocStore.subscribe, tocStore.getSnapshot); -} - -export function useActiveThreadTocItem() { - return tocStore.getActiveItem(); -} diff --git a/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/defaults.ts b/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/defaults.ts index 4eff8c944..91a7b6256 100644 --- a/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/defaults.ts +++ b/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/defaults.ts @@ -155,7 +155,6 @@ export const INTERNAL_ATTRIBUTES = { THREAD: { NAVBAR: "thread-navbar", NAVBAR_CHILD: { - EXPORT_THREAD_BUTTON: "thread-export-button", OVERFLOW_MENU_BUTTON_WRAPPER: "thread-overflow-menu-button-wrapper", }, WRAPPER: "thread-wrapper", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cade94706..828d01c64 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,8 +13,8 @@ catalogs: specifier: ^3.6.2 version: 3.6.2 typescript-eslint: - specifier: ^8.46.2 - version: 8.46.2 + specifier: ^8.46.3 + version: 8.46.3 types: '@types/chrome': specifier: ^0.1.27 @@ -74,7 +74,7 @@ importers: version: 5.9.3 typescript-eslint: specifier: catalog:lint - version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) vitest: specifier: ^4.0.6 version: 4.0.6(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) @@ -139,7 +139,7 @@ importers: version: 5.9.3 typescript-eslint: specifier: catalog:lint - version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) packages/comctx-adapters/examples/extension: dependencies: @@ -179,7 +179,7 @@ importers: version: 5.9.3 typescript-eslint: specifier: catalog:lint - version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) vite: specifier: ^7.1.12 version: 7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) @@ -193,8 +193,8 @@ importers: specifier: ^1.6.0 version: 1.6.0(eslint@9.38.0(jiti@2.6.1)) '@typescript-eslint/utils': - specifier: ^8.46.2 - version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + specifier: ^8.46.3 + version: 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) eslint: specifier: catalog:lint version: 9.38.0(jiti@2.6.1) @@ -224,7 +224,7 @@ importers: version: 16.5.0 typescript-eslint: specifier: catalog:lint - version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) packages/i18n: dependencies: @@ -267,7 +267,7 @@ importers: version: 5.9.3 typescript-eslint: specifier: catalog:lint - version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) packages/typescript-config: dependencies: @@ -321,8 +321,8 @@ importers: specifier: workspace:* version: link:../../packages/i18n '@dotenvx/dotenvx': - specifier: ^1.51.0 - version: 1.51.0 + specifier: ^1.51.1 + version: 1.51.1 '@hookform/resolvers': specifier: ^5.2.2 version: 5.2.2(react-hook-form@7.66.0(react@19.2.0)) @@ -632,7 +632,7 @@ importers: version: 5.9.3 typescript-eslint: specifier: catalog:lint - version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) unimport: specifier: ^5.5.0 version: 5.5.0 @@ -652,8 +652,8 @@ importers: specifier: ^3.922.0 version: 3.922.0 '@dotenvx/dotenvx': - specifier: ^1.51.0 - version: 1.51.0 + specifier: ^1.51.1 + version: 1.51.1 chrome-webstore-upload: specifier: ^4.0.3 version: 4.0.3 @@ -702,7 +702,7 @@ importers: version: 5.9.3 typescript-eslint: specifier: catalog:lint - version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) packages: @@ -996,8 +996,8 @@ packages: '@codemirror/language@6.11.3': resolution: {integrity: sha512-9HBM2XnwDj7fnu0551HkGdrUrrqmYq/WC5iv6nbY2WdicXdGbhR/gfbZOH73Aqj4351alY1+aoG9rCNfiwS1RA==} - '@codemirror/lint@6.9.1': - resolution: {integrity: sha512-te7To1EQHePBQQzasDKWmK2xKINIXpk+xAiSYr9ZN+VB4KaT+/Hi2PEkeErTk5BV3PTz1TLyQL4MtJfPkKZ9sw==} + '@codemirror/lint@6.9.2': + resolution: {integrity: sha512-sv3DylBiIyi+xKwRCJAAsBZZZWo82shJ/RTMymLabAdtbkV5cSKwWDeCgtUq3v8flTaXS2y1kKkICuRYtUswyQ==} '@codemirror/state@6.5.2': resolution: {integrity: sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==} @@ -1033,8 +1033,8 @@ packages: engines: {node: '>= 0.10.4'} hasBin: true - '@dotenvx/dotenvx@1.51.0': - resolution: {integrity: sha512-CbMGzyOYSyFF7d4uaeYwO9gpSBzLTnMmSmTVpCZjvpJFV69qYbjYPpzNnCz1mb2wIvEhjWjRwQWuBzTO0jITww==} + '@dotenvx/dotenvx@1.51.1': + resolution: {integrity: sha512-fqcQxcxC4LOaUlW8IkyWw8x0yirlLUkbxohz9OnWvVWjf73J5yyw7jxWnkOJaUKXZotcGEScDox9MU6rSkcDgg==} hasBin: true '@ecies/ciphers@0.2.4': @@ -1043,11 +1043,11 @@ packages: peerDependencies: '@noble/ciphers': ^1.0.0 - '@emnapi/core@1.6.0': - resolution: {integrity: sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==} + '@emnapi/core@1.7.0': + resolution: {integrity: sha512-pJdKGq/1iquWYtv1RRSljZklxHCOCAJFJrImO5ZLKPJVJlVUcs8yFwNQlqS0Lo8xT1VAXXTCZocF9n26FWEKsw==} - '@emnapi/runtime@1.6.0': - resolution: {integrity: sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==} + '@emnapi/runtime@1.7.0': + resolution: {integrity: sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==} '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} @@ -1511,8 +1511,8 @@ packages: '@lezer/javascript@1.5.4': resolution: {integrity: sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==} - '@lezer/lr@1.4.2': - resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==} + '@lezer/lr@1.4.3': + resolution: {integrity: sha512-yenN5SqAxAPv/qMnpWW0AT7l+SxVrgG+u0tNsRQWqbrz66HIl8DnEbBObvy21J5K7+I1v7gsAnlE2VQ5yYVSeA==} '@limegrass/eslint-plugin-import-alias@1.6.0': resolution: {integrity: sha512-wGhyo/HeZYhtJqKMPHDKNF4BKyC45G/WVX7HZ5xfoyWqFSzev/uPSKzuaLsQbtUcwwLqLdMAiCmlv+4XIl6WrA==} @@ -2778,63 +2778,63 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.46.2': - resolution: {integrity: sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==} + '@typescript-eslint/eslint-plugin@8.46.3': + resolution: {integrity: sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.46.2 + '@typescript-eslint/parser': ^8.46.3 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.46.2': - resolution: {integrity: sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==} + '@typescript-eslint/parser@8.46.3': + resolution: {integrity: sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.46.2': - resolution: {integrity: sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==} + '@typescript-eslint/project-service@8.46.3': + resolution: {integrity: sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.46.2': - resolution: {integrity: sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==} + '@typescript-eslint/scope-manager@8.46.3': + resolution: {integrity: sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.46.2': - resolution: {integrity: sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==} + '@typescript-eslint/tsconfig-utils@8.46.3': + resolution: {integrity: sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.46.2': - resolution: {integrity: sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==} + '@typescript-eslint/type-utils@8.46.3': + resolution: {integrity: sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.46.2': - resolution: {integrity: sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==} + '@typescript-eslint/types@8.46.3': + resolution: {integrity: sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.46.2': - resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==} + '@typescript-eslint/typescript-estree@8.46.3': + resolution: {integrity: sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.46.2': - resolution: {integrity: sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==} + '@typescript-eslint/utils@8.46.3': + resolution: {integrity: sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.46.2': - resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==} + '@typescript-eslint/visitor-keys@8.46.3': + resolution: {integrity: sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@uidotdev/usehooks@2.4.1': @@ -6592,8 +6592,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + sax@1.4.2: + resolution: {integrity: sha512-FySGAa0RGcFiN6zfrO9JvK1r7TB59xuzCcTHOBXBNoKgDejlOQCR2KL/FGk3/iDlsqyYg1ELZpOmlg09B01Czw==} scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} @@ -7105,8 +7105,8 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript-eslint@8.46.2: - resolution: {integrity: sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg==} + typescript-eslint@8.46.3: + resolution: {integrity: sha512-bAfgMavTuGo+8n6/QQDVQz4tZ4f7Soqg53RbrlZQEoAltYop/XR4RAts/I0BrO3TTClTSTFJ0wYbla+P8cEWJA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -8338,7 +8338,7 @@ snapshots: dependencies: '@codemirror/autocomplete': 6.19.1 '@codemirror/language': 6.11.3 - '@codemirror/lint': 6.9.1 + '@codemirror/lint': 6.9.2 '@codemirror/state': 6.5.2 '@codemirror/view': 6.38.6 '@lezer/common': 1.3.0 @@ -8350,10 +8350,10 @@ snapshots: '@codemirror/view': 6.38.6 '@lezer/common': 1.3.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.2 + '@lezer/lr': 1.4.3 style-mod: 4.1.3 - '@codemirror/lint@6.9.1': + '@codemirror/lint@6.9.2': dependencies: '@codemirror/state': 6.5.2 '@codemirror/view': 6.38.6 @@ -8445,7 +8445,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@dotenvx/dotenvx@1.51.0': + '@dotenvx/dotenvx@1.51.1': dependencies: commander: 11.1.0 dotenv: 17.2.3 @@ -8461,13 +8461,13 @@ snapshots: dependencies: '@noble/ciphers': 1.3.0 - '@emnapi/core@1.6.0': + '@emnapi/core@1.7.0': dependencies: '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.6.0': + '@emnapi/runtime@1.7.0': dependencies: tslib: 2.8.1 optional: true @@ -8875,7 +8875,7 @@ snapshots: dependencies: '@lezer/common': 1.3.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.2 + '@lezer/lr': 1.4.3 '@lezer/highlight@1.2.3': dependencies: @@ -8885,15 +8885,15 @@ snapshots: dependencies: '@lezer/common': 1.3.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.2 + '@lezer/lr': 1.4.3 '@lezer/javascript@1.5.4': dependencies: '@lezer/common': 1.3.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.2 + '@lezer/lr': 1.4.3 - '@lezer/lr@1.4.2': + '@lezer/lr@1.4.3': dependencies: '@lezer/common': 1.3.0 @@ -8944,8 +8944,8 @@ snapshots: '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.6.0 - '@emnapi/runtime': 1.6.0 + '@emnapi/core': 1.7.0 + '@emnapi/runtime': 1.7.0 '@tybys/wasm-util': 0.10.1 optional: true @@ -9925,7 +9925,7 @@ snapshots: '@tanstack/eslint-plugin-query@5.91.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) eslint: 9.38.0(jiti@2.6.1) transitivePeerDependencies: - supports-color @@ -10199,14 +10199,14 @@ snapshots: dependencies: '@types/node': 22.17.2 - '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/type-utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.46.2 + '@typescript-eslint/parser': 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.3 + '@typescript-eslint/type-utils': 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.3 eslint: 9.38.0(jiti@2.6.1) graphemer: 1.4.0 ignore: 7.0.5 @@ -10216,41 +10216,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.46.2 + '@typescript-eslint/scope-manager': 8.46.3 + '@typescript-eslint/types': 8.46.3 + '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.3 debug: 4.4.3 eslint: 9.38.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.46.2(typescript@5.9.3)': + '@typescript-eslint/project-service@8.46.3(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) - '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/tsconfig-utils': 8.46.3(typescript@5.9.3) + '@typescript-eslint/types': 8.46.3 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.46.2': + '@typescript-eslint/scope-manager@8.46.3': dependencies: - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/visitor-keys': 8.46.2 + '@typescript-eslint/types': 8.46.3 + '@typescript-eslint/visitor-keys': 8.46.3 - '@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.46.3(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.46.3 + '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 eslint: 9.38.0(jiti@2.6.1) ts-api-utils: 2.1.0(typescript@5.9.3) @@ -10258,14 +10258,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.46.2': {} + '@typescript-eslint/types@8.46.3': {} - '@typescript-eslint/typescript-estree@8.46.2(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.46.3(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.46.2(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/visitor-keys': 8.46.2 + '@typescript-eslint/project-service': 8.46.3(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.46.3(typescript@5.9.3) + '@typescript-eslint/types': 8.46.3 + '@typescript-eslint/visitor-keys': 8.46.3 debug: 4.4.3 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -10276,20 +10276,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.3 + '@typescript-eslint/types': 8.46.3 + '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) eslint: 9.38.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.46.2': + '@typescript-eslint/visitor-keys@8.46.3': dependencies: - '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/types': 8.46.3 eslint-visitor-keys: 4.2.1 '@uidotdev/usehooks@2.4.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': @@ -14864,7 +14864,7 @@ snapshots: safer-buffer@2.1.2: {} - sax@1.4.1: {} + sax@1.4.2: {} scheduler@0.27.0: {} @@ -15431,12 +15431,12 @@ snapshots: typedarray@0.0.6: {} - typescript-eslint@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) eslint: 9.38.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: @@ -15949,7 +15949,7 @@ snapshots: xml2js@0.6.2: dependencies: - sax: 1.4.1 + sax: 1.4.2 xmlbuilder: 11.0.1 xmlbuilder@11.0.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 86562925c..c9b130119 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -8,7 +8,7 @@ catalogs: lint: eslint: 9.38.0 prettier: ^3.6.2 - typescript-eslint: ^8.46.2 + typescript-eslint: ^8.46.3 types: '@types/chrome': ^0.1.27 typescript: ^5.9.3 From 5ae9a3af38ee3ddf4b58639abdb5619ac5256144 Mon Sep 17 00:00:00 2001 From: Pham Ngoc Duong Date: Tue, 4 Nov 2025 22:54:42 +0700 Subject: [PATCH 14/85] fix(pplx-ext): minor ui degradations --- perplexity/extension/changelogs/2.7.13.md | 2 +- perplexity/extension/lint-f.txt | 179 -------- perplexity/extension/lint.txt | 425 ------------------ perplexity/extension/package.json | 1 + .../extension/src/components/ui/command.tsx | 37 +- .../pages/release-notes/IndexPage.tsx | 5 +- .../slash-command/SlashCommandMenu.tsx | 3 +- .../plugins/better-sidebar/BetterSidebar.tsx | 3 +- .../better-sidebar/listeners.loader.ts | 6 +- .../prevent-layout-shift.loader.ts | 5 +- .../src/plugins/better-sidebar/store.ts | 6 +- .../src/plugins/command-menu/CommandMenu.tsx | 5 +- .../space-threads/SpaceThreadCommandItems.tsx | 4 +- .../pages/spaces/SpacePreview.tsx | 3 +- .../pages/threads/ThreadCommandItems.tsx | 4 +- .../pages/threads/useLoadMoreItems.tsx | 12 +- .../ImageGenModelSelector.tsx | 3 +- .../components/desktop/index.tsx | 3 +- .../prompt-history/hooks/useLoadMoreItems.tsx | 12 +- .../plugins/thread-artifacts/Artifacts.tsx | 7 +- .../components/ArtifactContent.tsx | 5 +- .../src/plugins/thread-artifacts/styles.css | 9 +- .../thread-message-tts/settings-ui.tsx | 2 +- .../src/plugins/thread-toc/TocPanel.tsx | 9 +- .../plugins/thread-toc/store/store.loader.ts | 51 +-- .../src/plugins/thread-toc/store/utils.ts | 102 ++--- .../utils/dom-utils/pplx-scrollbar-classes.ts | 2 - pnpm-lock.yaml | 26 +- 28 files changed, 148 insertions(+), 783 deletions(-) delete mode 100644 perplexity/extension/lint-f.txt delete mode 100644 perplexity/extension/lint.txt delete mode 100644 perplexity/extension/src/utils/dom-utils/pplx-scrollbar-classes.ts diff --git a/perplexity/extension/changelogs/2.7.13.md b/perplexity/extension/changelogs/2.7.13.md index 9b26989f8..51c735e35 100644 --- a/perplexity/extension/changelogs/2.7.13.md +++ b/perplexity/extension/changelogs/2.7.13.md @@ -1,3 +1,3 @@ ## Misc -Stability improvements +- Stability improvements diff --git a/perplexity/extension/lint-f.txt b/perplexity/extension/lint-f.txt deleted file mode 100644 index bbd9fdb94..000000000 --- a/perplexity/extension/lint-f.txt +++ /dev/null @@ -1,179 +0,0 @@ -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\__registries__\core-plugins\index.ts - 28:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 92:17 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\__registries__\cs-hash-router.ts - 14:15 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\__registries__\cs-ui\index.tsx - 123:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\__registries__\plugin-settings-uis.ts - 35:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 40:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\__registries__\plugins\index.ts - 54:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 223:17 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\__registries__\plugins\predicates.ts - 11:5 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\components\ExtensionContextInvalidationWatchdog.tsx - 18:14 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\components\hotkey-recorder\index.tsx - 26:19 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 132:26 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 141:5 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 161:11 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\components\hotkey-recorder\utils.ts - 34:12 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\components\ui\floating-panel.tsx - 174:12 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\components\ui\form.tsx - 46:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\data\dashboard\themes\migration.ts - 12:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\plugins\PluginsEnableSet.tsx - 92:15 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\plugins\components\plugin-card\PluginCard.tsx - 34:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\plugins\components\plugin-card\PluginCardContext.tsx - 59:5 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 59:36 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\plugins\components\plugin-card\PluginCardFooter.tsx - 51:16 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 83:27 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\plugins\components\plugin-card\PluginCardTags.tsx - 10:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\plugins\components\plugin-card\usePluginCard.ts - 53:17 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\plugins\hooks\useFilteredPlugins.ts - 27:11 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 43:12 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\settings\IndexPage.tsx - 15:16 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\settings\components\ExtensionIconActionSelect.tsx - 19:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition - 21:33 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\settings\components\ImportDataButtons.tsx - 23:11 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\settings\components\ManagePermissionsDialogWrapper.tsx - 48:12 error Unnecessary conditional, comparison is always true, since `2 > 0` is true @typescript-eslint/no-unnecessary-condition - 54:20 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 54:45 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 55:46 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 56:29 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 56:49 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\settings\sections\DevToolsSection.tsx - 37:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\themes\components\ColorInput\BuiltInColorPicker.tsx - 97:5 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\themes\components\InstantCssEnable.tsx - 25:24 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 25:37 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\themes\components\ThemeCard\DisableThemeButton.tsx - 13:33 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 13:50 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\themes\components\ThemeCard\ThemeCard.tsx - 22:33 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\dashboard\pages\themes\context\EditThemeProvider.tsx - 33:30 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 34:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\onboarding\ExtensionIconAction.tsx - 40:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition - 42:33 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\entrypoints\options-page\onboarding\index.tsx - 163:37 error Unnecessary conditional, value is always truthy @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__async-deps__\plugins-guard\CsUiPluginsGuard.tsx - 109:33 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 187:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 259:11 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 364:52 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__async-deps__\plugins-guard\guards.ts - 50:51 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 100:49 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 111:57 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 134:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 156:27 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__async-deps__\plugins-guard\store.loader.ts - 105:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 132:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 140:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 147:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 157:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\_main-world\fiber-search\utils.ts - 173:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 206:24 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 206:49 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 465:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\_main-world\network-intercept\_service\index.ts - 18:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\_main-world\network-intercept\interceptors\navigator-beacon.ts - 26:22 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 28:22 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\_main-world\network-intercept\interceptors\web-socket.ts - 7:18 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 52:11 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\_main-world\network-intercept\interceptors\xhr.ts - 32:13 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\_main-world\network-intercept\web-socket-message-parser.ts - 21:21 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\custom-theme\instant-css-background-watchdog.ts - 20:10 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 27:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\custom-theme\rebuild-on-ext-update.bg-worker.ts - 9:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\dom-observers\index.ts - 278:13 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 393:22 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 442:44 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\dom-observers\internal-search-states\index.loader.ts - 49:17 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\enable-states.ts - 28:17 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\pplx-web-socket\index.ts - 15:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\slash-command\store\slices\pages\utils.ts - 16:65 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 19:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition \ No newline at end of file diff --git a/perplexity/extension/lint.txt b/perplexity/extension/lint.txt deleted file mode 100644 index 829e55b92..000000000 --- a/perplexity/extension/lint.txt +++ /dev/null @@ -1,425 +0,0 @@ - -> pplx-ext@2.7.9 lintq C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension -> pnpm lint --quiet - - -> pplx-ext@2.7.9 lint C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension -> eslint ./src --cache --concurrency auto "--quiet" - - - - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__core__\slash-command\textbox-adapter.ts - 30:10 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 30:27 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__ui-groups__\elements\query-box\portal-containers.ts - 96:22 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__ui-groups__\elements\query-box\utils.ts - 78:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 91:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 122:11 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__ui-groups__\elements\thread-message-index-context.tsx - 25:5 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__ui-groups__\routes\Home\CometAffiliateDialog.tsx - 38:5 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\__ui-groups__\routes\Home\update-announcer\post-update-announcer.bg-worker.ts - 8:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\better-sidebar\settings-ui.tsx - 13:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 25:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 25:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 33:22 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\cloudflare-timeout-auto-reload\ActionDialog.tsx - 21:13 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\cloudflare-timeout-auto-reload\settings-ui.tsx - 37:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 51:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition - 68:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 68:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 78:21 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 78:35 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\comet-isolated-zoom\loader.ts - 53:37 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\comet-isolated-zoom\settings-ui.tsx - 18:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 20:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition - 26:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 26:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 47:21 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 47:35 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\pages\space-threads\Page.tsx - 16:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 16:38 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\pages\spaces\Footer.tsx - 42:45 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 68:45 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\pages\spaces\SpaceItemFile.tsx - 38:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\pages\spaces\SpacePreview.tsx - 13:36 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 13:41 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 20:42 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 20:47 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 54:22 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\pages\threads\ThreadItem.tsx - 89:10 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\pages\threads\filters\SortFilter.tsx - 46:13 error Unnecessary conditional, value is always truthy @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\pages\threads\filters\SourceFilter.tsx - 42:13 error Unnecessary conditional, value is always truthy @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\pages\threads\filters\TemporaryThreadsFilter.tsx - 45:13 error Unnecessary conditional, value is always truthy @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\pages\threads\filters\TypeFilter.tsx - 40:13 error Unnecessary conditional, value is always truthy @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\settings-ui.tsx - 15:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition - 21:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 21:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 28:16 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\settings-ui\SpacesSearchPageKeybinding.tsx - 8:5 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 8:13 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\settings-ui\ThreadsSearchPageKeybinding.tsx - 8:5 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 8:13 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\settings-ui\ToggleCommandDialogKeybinding.tsx - 7:23 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 7:31 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\command-menu\settings-ui\ToggleSidecarKeybinding.tsx - 8:5 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 8:13 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\force-writing-mode\settings-ui.tsx - 11:13 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 17:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 17:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\home-custom-slogan\settings-ui.tsx - 20:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition - 26:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 36:33 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\image-gen-model-selector\settings-ui.tsx - 11:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition - 21:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 21:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\language-model-selector\components\TriggerButton.tsx - 51:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\language-model-selector\model-selection-mismatch-warning.loader.ts - 39:15 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\language-model-selector\settings-ui.tsx - 18:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition - 39:11 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 65:15 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 80:17 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\language-model-selector\store\sync.loader.ts - 87:11 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\language-model-selector\utils.ts - 14:41 error Unnecessary conditional, value is always truthy @typescript-eslint/no-unnecessary-condition - 48:33 error Unnecessary conditional, value is always truthy @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\prompt-history\hooks\usePromptHistory.ts - 29:23 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\prompt-history\settings-ui.tsx - 23:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 31:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition - 41:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 41:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 45:22 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 59:22 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 59:36 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 77:22 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 77:36 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 100:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 100:58 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 100:68 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 101:33 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 101:59 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 101:69 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 126:19 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\prompt-history\utils.ts - 30:31 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\query-box-submit-on-ctrl-enter\settings-ui.tsx - 9:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 11:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition - 17:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 17:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-artifacts\components\ArtifactHeader.tsx - 93:16 error Unnecessary conditional, value is always truthy @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-artifacts\components\Preview.tsx - 11:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-artifacts\components\PreviewToggle.tsx - 26:10 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 35:10 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-artifacts\components\VersionsNavigator.tsx - 32:60 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 36:38 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 53:17 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 54:41 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 89:17 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 90:41 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-artifacts\components\renderer\Markmap.tsx - 65:16 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 76:15 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-artifacts\components\renderer\Mermaid.tsx - 70:16 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 81:15 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-artifacts\settings-ui.tsx - 16:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 23:16 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-artifacts\store.loader.ts - 88:17 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-artifacts\useHandleArtifactsState.ts - 37:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 37:18 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-artifacts\useHandleAutonomousArtifactsState.ts - 61:52 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 115:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-artifacts\utils.ts - 49:7 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-better-code-blocks\settings-ui\FineGrainedOptions.tsx - 37:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 49:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 63:28 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 78:28 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 95:30 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 111:37 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 113:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 130:18 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 135:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 150:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 168:28 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 186:35 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 188:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 207:28 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 219:18 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 226:39 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 240:39 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 254:39 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-better-code-blocks\settings-ui\GlobalOptions.tsx - 20:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 29:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 39:28 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 50:21 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 65:23 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 65:69 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 79:25 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 79:71 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 83:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 83:72 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 102:21 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 103:15 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 117:21 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 118:15 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 133:21 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 133:66 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 149:23 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 149:68 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 153:24 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 153:69 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-better-code-blocks\settings-ui\index.tsx - 30:16 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 84:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-better-code-blocks\variants\HighlightedCode.tsx - 45:59 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-better-code-blocks\variants\artifact-placeholders\Wrapper.tsx - 26:30 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 38:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-better-code-blocks\variants\base\Header.tsx - 55:50 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 57:37 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 57:54 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-better-code-blocks\variants\base\Wrapper.tsx - 19:38 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-better-message-copy-buttons\settings-ui.tsx - 10:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 12:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition - 18:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 18:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-better-rewrite-dropdown\settings-ui.tsx - 10:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 12:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition - 22:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 22:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-custom-container-width\settings-ui.tsx - 27:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition - 33:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 41:16 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-export\ExportMenu.tsx - 53:27 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-export\hooks\useCopyPplxThread.ts - 128:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 170:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-export\settings-ui.tsx - 10:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 12:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition - 18:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 18:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-message-length\settings-ui.tsx - 10:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 12:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition - 18:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 18:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 29:20 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 29:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-message-tts\hooks\usePplxTtsRequest.ts - 32:17 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 38:35 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 38:52 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 66:21 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 67:17 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 67:23 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-message-tts\player\coordinator.ts - 13:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-message-tts\player\pplx-streaming-tts-player.ts - 117:38 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 149:9 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition - 166:9 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition - 166:34 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 175:9 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition - 175:34 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 186:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 187:7 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 188:7 error Unnecessary conditional, value is always truthy @typescript-eslint/no-unnecessary-condition - 204:45 error Unnecessary conditional, value is always truthy @typescript-eslint/no-unnecessary-condition - 224:27 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-message-tts\settings-ui.tsx - 19:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 21:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition - 28:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 28:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 42:19 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 42:33 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-raw-headings\loader.ts - 34:10 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-raw-headings\settings-ui.tsx - 10:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 12:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition - 18:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 18:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-toc\TocPanel.tsx - 44:30 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 46:30 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-toc\settings-ui.tsx - 10:34 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 12:7 error Unnecessary conditional, value is always falsy @typescript-eslint/no-unnecessary-condition - 21:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 21:32 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\thread-toc\usePanelPosition.ts - 51:30 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 51:52 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\zen-mode\settings-ui.tsx - 10:23 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 10:31 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 25:18 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 25:26 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 32:16 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 40:22 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 40:30 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 50:15 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 50:23 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\plugins\zen-mode\utils.ts - 16:42 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\services\features\content-script-utils\index.ts - 14:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 18:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\services\features\instant-css\coordinator.ts - 46:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - 66:9 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\services\infra\i18n\dayjs.ts - 73:47 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\services\infra\indexed-db\index.ts - 97:13 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\utils\dom-utils\generics.ts - 45:16 error Unnecessary conditional, the types have no overlap @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\utils\dom-utils\lexical-utils.ts - 111:31 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 124:28 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 124:47 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 124:55 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 125:24 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 125:43 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - 125:49 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - 177:24 error Unnecessary optional chain on a non-nullish value @typescript-eslint/no-unnecessary-condition - -C:\Users\pnd28\Desktop\fedora\complexity\perplexity\extension\src\utils\misc\normalize-path.ts - 7:9 error Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined @typescript-eslint/no-unnecessary-condition - -✖ 336 problems (336 errors, 0 warnings) - - ELIFECYCLE  Command failed with exit code 1. - ELIFECYCLE  Command failed with exit code 1. diff --git a/perplexity/extension/package.json b/perplexity/extension/package.json index 4c540b4d1..622c68176 100644 --- a/perplexity/extension/package.json +++ b/perplexity/extension/package.json @@ -72,6 +72,7 @@ "ms": "^2.1.3", "nanoid": "^5.1.6", "pako": "^2.1.0", + "position-observer": "^1.0.3", "react": "^19.2.0", "react-dom": "^19.2.0", "react-hook-form": "^7.66.0", diff --git a/perplexity/extension/src/components/ui/command.tsx b/perplexity/extension/src/components/ui/command.tsx index 26d44daa1..ad0ea0c99 100644 --- a/perplexity/extension/src/components/ui/command.tsx +++ b/perplexity/extension/src/components/ui/command.tsx @@ -5,8 +5,6 @@ import * as React from "react"; import type { DialogProps } from "@/components/ui/dialog"; import { Dialog, DialogContent } from "@/components/ui/dialog"; -import { PPLX_SCROLLBAR_CLASSES } from "@/utils/dom-utils/pplx-scrollbar-classes"; -import { getTaskScheduler, isInContentScript } from "@/utils/misc/utils"; import TablerSearch from "~icons/tabler/search"; @@ -105,7 +103,7 @@ export function CommandList({ return ( ); } - -/** - * Custom hook to handle manual scrolling for CommandList when CommandItems are memoized - * Use this when the default scroll behavior glitches - * or use scroll-padding-block-start and scroll-padding-block-end to add padding to the top and bottom of the list - */ -export function useCommandListManualScroll({ - enabled, - commandListRef, - willUpdateValue, -}: { - enabled: boolean; - commandListRef: React.RefObject; - willUpdateValue: string; -}) { - useEffect(() => { - if (!enabled || !commandListRef.current) return; - - getTaskScheduler()(() => { - const selectedItem = commandListRef.current?.querySelector( - '[cmdk-item][aria-selected="true"]', - ); - - if (selectedItem && selectedItem instanceof HTMLElement) { - selectedItem.scrollIntoView({ - block: "nearest", - inline: "nearest", - behavior: "instant", - }); - } - }); - }, [commandListRef, enabled, willUpdateValue]); -} diff --git a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/release-notes/IndexPage.tsx b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/release-notes/IndexPage.tsx index 80c03c851..a61c9c148 100644 --- a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/release-notes/IndexPage.tsx +++ b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/release-notes/IndexPage.tsx @@ -4,7 +4,6 @@ import ChangelogRenderer from "@/components/changelog/ChangelogRenderer"; import { Skeleton } from "@/components/ui/skeleton"; import { useVersionPagination } from "@/entrypoints/options-page/dashboard/pages/release-notes/hooks/useVersionPagination"; import { cplxApiQueries } from "@/services/externals/cplx-api/query-keys"; -import { PPLX_SCROLLBAR_CLASSES } from "@/utils/dom-utils/pplx-scrollbar-classes"; import TablerLoaderCircle from "~icons/tabler/loader-2"; @@ -44,9 +43,7 @@ export function IndexPage() {

-
+
{loadedVersions.map((version, index) => { const changelogQuery = changelogQueries[index]; const isLoading = changelogQuery?.isLoading; diff --git a/perplexity/extension/src/plugins/__core__/slash-command/SlashCommandMenu.tsx b/perplexity/extension/src/plugins/__core__/slash-command/SlashCommandMenu.tsx index f9b168c11..304f4d8aa 100644 --- a/perplexity/extension/src/plugins/__core__/slash-command/SlashCommandMenu.tsx +++ b/perplexity/extension/src/plugins/__core__/slash-command/SlashCommandMenu.tsx @@ -4,7 +4,6 @@ import { useBlurHandler } from "@/plugins/__core__/slash-command/hooks/useBlurHa import useSlashCommandPanel from "@/plugins/__core__/slash-command/hooks/useSlashCommandPanel"; import IndexPage from "@/plugins/__core__/slash-command/pages/IndexPage"; import { slashCommandMenuStore } from "@/plugins/__core__/slash-command/store"; -import { PPLX_SCROLLBAR_CLASSES } from "@/utils/dom-utils/pplx-scrollbar-classes"; declare module "@/__registries__/cs-ui/types" { interface UiGroupsRegistry { @@ -28,7 +27,7 @@ export function SlashCommandMenu() { ref={contentRef} data-slash-command-menu-content className={cn( - PPLX_SCROLLBAR_CLASSES, + "custom-scrollbar", "x:w-(--reference-width) x:overflow-x-hidden x:rounded-2xl x:border-border/80 x:bg-secondary x:p-0 x:shadow-lg", )} onKeyDown={(e) => { diff --git a/perplexity/extension/src/plugins/better-sidebar/BetterSidebar.tsx b/perplexity/extension/src/plugins/better-sidebar/BetterSidebar.tsx index 3e548017f..802859f9e 100644 --- a/perplexity/extension/src/plugins/better-sidebar/BetterSidebar.tsx +++ b/perplexity/extension/src/plugins/better-sidebar/BetterSidebar.tsx @@ -22,7 +22,6 @@ import { useBetterSidebarStore, } from "@/plugins/better-sidebar/store"; import usePortalContainer from "@/plugins/better-sidebar/usePortalContainer"; -import { PPLX_SCROLLBAR_CLASSES } from "@/utils/dom-utils/pplx-scrollbar-classes"; import LuPanelLeftClose from "~icons/lucide/panel-left-close"; import LuPanelLeftOpen from "~icons/lucide/panel-left-open"; @@ -97,7 +96,7 @@ export function BetterSidebar() {
- + diff --git a/perplexity/extension/src/plugins/better-sidebar/listeners.loader.ts b/perplexity/extension/src/plugins/better-sidebar/listeners.loader.ts index 350af10e9..b1e41c7a4 100644 --- a/perplexity/extension/src/plugins/better-sidebar/listeners.loader.ts +++ b/perplexity/extension/src/plugins/better-sidebar/listeners.loader.ts @@ -2,7 +2,6 @@ import { AsyncLoaderRegistry } from "@/plugins/__async-deps__/async-loaders"; import { applyLayoutShiftPreventionInstantCss } from "@/plugins/better-sidebar/prevent-layout-shift.loader"; import { betterSidebarStore } from "@/plugins/better-sidebar/store"; import { ExtensionSettingsService } from "@/services/infra/extension-api-wrappers/extension-settings"; -import { setCookie } from "@/utils/dom-utils/generics"; declare module "@/plugins/__async-deps__/async-loaders" { interface AsyncLoadersRegistry { @@ -20,7 +19,10 @@ export default function () { (open) => { if (!pluginsEnableStates["betterSidebar"]) return; - setCookie("isSidebarPinned", open.toString(), 365); + localStorage.setItem( + "pplx.local-user-settings.isSidebarPinned", + open.toString(), + ); void applyLayoutShiftPreventionInstantCss({ enabled: diff --git a/perplexity/extension/src/plugins/better-sidebar/prevent-layout-shift.loader.ts b/perplexity/extension/src/plugins/better-sidebar/prevent-layout-shift.loader.ts index 8ba2f343c..895222e3a 100644 --- a/perplexity/extension/src/plugins/better-sidebar/prevent-layout-shift.loader.ts +++ b/perplexity/extension/src/plugins/better-sidebar/prevent-layout-shift.loader.ts @@ -8,7 +8,6 @@ import { getVersionedRemoteResource } from "@/services/externals/cplx-api/versio import { InstantCssService } from "@/services/features/instant-css"; import { ExtensionSettingsService } from "@/services/infra/extension-api-wrappers/extension-settings"; import { sendMessage } from "@/types/chrome-runtime-message"; -import { getCookie } from "@/utils/dom-utils/generics"; declare module "@/plugins/__async-deps__/async-loaders" { interface AsyncLoadersRegistry { @@ -57,7 +56,9 @@ export async function applyLayoutShiftPreventionInstantCss({ if (!tabId) return; - const state = getCookie("isSidebarPinned"); + const state = localStorage.getItem( + "pplx.local-user-settings.isSidebarPinned", + ); const action = enabled ? InstantCssService.registerInstantCss diff --git a/perplexity/extension/src/plugins/better-sidebar/store.ts b/perplexity/extension/src/plugins/better-sidebar/store.ts index d25e216d6..7df7418bf 100644 --- a/perplexity/extension/src/plugins/better-sidebar/store.ts +++ b/perplexity/extension/src/plugins/better-sidebar/store.ts @@ -2,8 +2,6 @@ import { subscribeWithSelector } from "zustand/middleware"; import { immer } from "zustand/middleware/immer"; import { createWithEqualityFn } from "zustand/traditional"; -import { getCookie } from "@/utils/dom-utils/generics"; - export type BetterSidebarStoreType = { open: boolean; setOpen: (open: boolean) => void; @@ -14,7 +12,9 @@ export const betterSidebarStore = subscribeWithSelector( immer( (set): BetterSidebarStoreType => ({ - open: getCookie("isSidebarPinned") === "true", + open: + localStorage.getItem("pplx.local-user-settings.isSidebarPinned") === + "true", setOpen: (open) => set({ open }), }), ), diff --git a/perplexity/extension/src/plugins/command-menu/CommandMenu.tsx b/perplexity/extension/src/plugins/command-menu/CommandMenu.tsx index 321d957b8..e9dfb4302 100644 --- a/perplexity/extension/src/plugins/command-menu/CommandMenu.tsx +++ b/perplexity/extension/src/plugins/command-menu/CommandMenu.tsx @@ -10,7 +10,6 @@ import SpacesPage from "@/plugins/command-menu/pages/spaces/Page"; import ThreadsPage from "@/plugins/command-menu/pages/threads/Page"; import { useCommandMenuStore } from "@/plugins/command-menu/store"; import { ExtensionSettingsService } from "@/services/infra/extension-api-wrappers/extension-settings"; -import { PPLX_SCROLLBAR_CLASSES } from "@/utils/dom-utils/pplx-scrollbar-classes"; import { keysToString } from "@/utils/misc/utils"; export function CommandMenu() { @@ -80,7 +79,7 @@ export function CommandMenu() { )} > @@ -93,7 +92,7 @@ export function CommandMenu() { {sidecarOpen && (
diff --git a/perplexity/extension/src/plugins/command-menu/pages/space-threads/SpaceThreadCommandItems.tsx b/perplexity/extension/src/plugins/command-menu/pages/space-threads/SpaceThreadCommandItems.tsx index 998cf5a10..c3a8a10f5 100644 --- a/perplexity/extension/src/plugins/command-menu/pages/space-threads/SpaceThreadCommandItems.tsx +++ b/perplexity/extension/src/plugins/command-menu/pages/space-threads/SpaceThreadCommandItems.tsx @@ -57,7 +57,9 @@ export default function SpaceThreadCommandItems({ {isFetchingNextPage && ( )} - {hasNextPage &&
} + {hasNextPage && !isFetchingNextPage && ( +
+ )} )} diff --git a/perplexity/extension/src/plugins/command-menu/pages/spaces/SpacePreview.tsx b/perplexity/extension/src/plugins/command-menu/pages/spaces/SpacePreview.tsx index b1a4a29f5..f494fbc68 100644 --- a/perplexity/extension/src/plugins/command-menu/pages/spaces/SpacePreview.tsx +++ b/perplexity/extension/src/plugins/command-menu/pages/spaces/SpacePreview.tsx @@ -4,7 +4,6 @@ import MarkdownRenderer from "@/components/MarkdownRenderer"; import SpaceItemFile from "@/plugins/command-menu/pages/spaces/SpaceItemFile"; import type { Space } from "@/services/externals/pplx-api/pplx-api.types"; import { pplxApiQueries } from "@/services/externals/pplx-api/query-keys"; -import { PPLX_SCROLLBAR_CLASSES } from "@/utils/dom-utils/pplx-scrollbar-classes"; import TablerLink from "~icons/tabler/link"; @@ -42,7 +41,7 @@ export default function SpacePreview({ space }: { space: Space }) {
diff --git a/perplexity/extension/src/plugins/command-menu/pages/threads/ThreadCommandItems.tsx b/perplexity/extension/src/plugins/command-menu/pages/threads/ThreadCommandItems.tsx index 2d05df56c..33758085b 100644 --- a/perplexity/extension/src/plugins/command-menu/pages/threads/ThreadCommandItems.tsx +++ b/perplexity/extension/src/plugins/command-menu/pages/threads/ThreadCommandItems.tsx @@ -64,7 +64,9 @@ export default function ThreadCommandItems() { {isFetchingNextPage && ( )} - {hasNextPage &&
} + {hasNextPage && !isFetchingNextPage && ( +
+ )} )} diff --git a/perplexity/extension/src/plugins/command-menu/pages/threads/useLoadMoreItems.tsx b/perplexity/extension/src/plugins/command-menu/pages/threads/useLoadMoreItems.tsx index 7a4442c81..f7bf9ddb2 100644 --- a/perplexity/extension/src/plugins/command-menu/pages/threads/useLoadMoreItems.tsx +++ b/perplexity/extension/src/plugins/command-menu/pages/threads/useLoadMoreItems.tsx @@ -19,11 +19,17 @@ export default function useLoadMoreItems({ rootMargin: "0px 0px 5px 0px", }); - useEffect(() => { - if (entry?.isIntersecting && hasNextPage && !isFetching) { + const fetch = useEffectEvent(() => { + if (hasNextPage && !isFetching) { fetchNextPage(); } - }, [entry, hasNextPage, isFetching, fetchNextPage]); + }); + + useEffect(() => { + if (!entry?.isIntersecting) return; + + fetch(); + }, [entry]); return { triggerRef }; } diff --git a/perplexity/extension/src/plugins/image-gen-model-selector/ImageGenModelSelector.tsx b/perplexity/extension/src/plugins/image-gen-model-selector/ImageGenModelSelector.tsx index 74c600736..ad48410df 100644 --- a/perplexity/extension/src/plugins/image-gen-model-selector/ImageGenModelSelector.tsx +++ b/perplexity/extension/src/plugins/image-gen-model-selector/ImageGenModelSelector.tsx @@ -16,7 +16,6 @@ import usePortalContainer from "@/plugins/image-gen-model-selector/usePortalCont import { PplxImageModelsService } from "@/services/externals/cplx-api/remote-resources/pplx-image-models"; import type { ImageModel } from "@/services/externals/cplx-api/remote-resources/pplx-image-models/types"; import { isReactNode } from "@/types/utils.types"; -import { PPLX_SCROLLBAR_CLASSES } from "@/utils/dom-utils/pplx-scrollbar-classes"; import TablerCpu from "~icons/tabler/cpu"; import TablerPhoto from "~icons/tabler/photo"; @@ -77,7 +76,7 @@ export function ImageGenModelSelector() { diff --git a/perplexity/extension/src/plugins/language-model-selector/components/desktop/index.tsx b/perplexity/extension/src/plugins/language-model-selector/components/desktop/index.tsx index 904c2af36..bc9664a20 100644 --- a/perplexity/extension/src/plugins/language-model-selector/components/desktop/index.tsx +++ b/perplexity/extension/src/plugins/language-model-selector/components/desktop/index.tsx @@ -9,7 +9,6 @@ import { getModelsByType, } from "@/plugins/language-model-selector/utils"; import { LanguageModelTypeIcons } from "@/services/externals/cplx-api/remote-resources/pplx-language-models/icons"; -import { PPLX_SCROLLBAR_CLASSES } from "@/utils/dom-utils/pplx-scrollbar-classes"; export default function DesktopContent() { const context = use(LanguageModelSelectorContext); @@ -38,7 +37,7 @@ export default function DesktopContent() { return ( diff --git a/perplexity/extension/src/plugins/prompt-history/hooks/useLoadMoreItems.tsx b/perplexity/extension/src/plugins/prompt-history/hooks/useLoadMoreItems.tsx index 7a4442c81..f7bf9ddb2 100644 --- a/perplexity/extension/src/plugins/prompt-history/hooks/useLoadMoreItems.tsx +++ b/perplexity/extension/src/plugins/prompt-history/hooks/useLoadMoreItems.tsx @@ -19,11 +19,17 @@ export default function useLoadMoreItems({ rootMargin: "0px 0px 5px 0px", }); - useEffect(() => { - if (entry?.isIntersecting && hasNextPage && !isFetching) { + const fetch = useEffectEvent(() => { + if (hasNextPage && !isFetching) { fetchNextPage(); } - }, [entry, hasNextPage, isFetching, fetchNextPage]); + }); + + useEffect(() => { + if (!entry?.isIntersecting) return; + + fetch(); + }, [entry]); return { triggerRef }; } diff --git a/perplexity/extension/src/plugins/thread-artifacts/Artifacts.tsx b/perplexity/extension/src/plugins/thread-artifacts/Artifacts.tsx index ed718d675..7dd8af883 100644 --- a/perplexity/extension/src/plugins/thread-artifacts/Artifacts.tsx +++ b/perplexity/extension/src/plugins/thread-artifacts/Artifacts.tsx @@ -12,7 +12,6 @@ import { useArtifactsStore } from "@/plugins/thread-artifacts/store"; import { useHandleArtifactsState } from "@/plugins/thread-artifacts/useHandleArtifactsState"; import useHandleAutonomousArtifactsState from "@/plugins/thread-artifacts/useHandleAutonomousArtifactsState"; import { getVersionedRemoteResource } from "@/services/externals/cplx-api/versioned-remote-resources/utils"; -import { getCookie } from "@/utils/dom-utils/generics"; const normalizeCss = await getVersionedRemoteResource( normalizeCssResourceConfig, @@ -57,7 +56,11 @@ export function Artifacts() { }, [isArtifactOpen, isArtifactsListOpen]); useEffect(() => { - if (isArtifactOpen && getCookie("isSidebarPinned") === "true") { + const isSidebarPinned = + localStorage.getItem("pplx.local-user-settings.isSidebarPinned") === + "true"; + + if (isArtifactOpen && isSidebarPinned) { const $pinSidebarButton = $( DomSelectorsService.Root.cachedSync.SIDEBAR.PIN_SIDEBAR_BUTTON, ); diff --git a/perplexity/extension/src/plugins/thread-artifacts/components/ArtifactContent.tsx b/perplexity/extension/src/plugins/thread-artifacts/components/ArtifactContent.tsx index 0ae0f9fd2..2ed9cbb0a 100644 --- a/perplexity/extension/src/plugins/thread-artifacts/components/ArtifactContent.tsx +++ b/perplexity/extension/src/plugins/thread-artifacts/components/ArtifactContent.tsx @@ -5,7 +5,6 @@ import ArtifactPreview from "@/plugins/thread-artifacts/components/Preview"; import { ARTIFACT_INITIAL_STATE } from "@/plugins/thread-artifacts/consts"; import { useArtifactsStore } from "@/plugins/thread-artifacts/store"; import { getInterpretedArtifactLanguage } from "@/plugins/thread-artifacts/utils"; -import { PPLX_SCROLLBAR_CLASSES } from "@/utils/dom-utils/pplx-scrollbar-classes"; export default function ArtifactContent() { const selectedCodeBlockLocation = useArtifactsStore( @@ -21,8 +20,6 @@ export default function ArtifactContent() { selectedCodeBlock?.content.language ?? "text", ); - console.log(language, selectedCodeBlock?.content.language); - const previewKey = useArtifactsStore((state) => state.refreshPreviewKey); const isValidArtifactCode = useArtifactsStore( (state) => state.isValidArtifactCode, @@ -38,7 +35,7 @@ export default function ArtifactContent() { ? "code" : artifactViewMode } - className={cn(PPLX_SCROLLBAR_CLASSES, "x:size-full x:overflow-auto")} + className={cn("custom-scrollbar", "x:size-full x:overflow-auto")} > diff --git a/perplexity/extension/src/plugins/thread-artifacts/styles.css b/perplexity/extension/src/plugins/thread-artifacts/styles.css index d043320d0..570790289 100644 --- a/perplexity/extension/src/plugins/thread-artifacts/styles.css +++ b/perplexity/extension/src/plugins/thread-artifacts/styles.css @@ -13,7 +13,7 @@ } #cplx-artifact { - @apply x:absolute x:top-(--header-height) x:right-4 x:size-full x:max-h-[calc(100dvh-12rem)] x:max-w-3/4 x:overflow-y-auto x:rounded-xl x:border x:border-border/50 x:bg-secondary x:xl:static x:xl:h-auto x:xl:max-h-none x:xl:w-full x:xl:max-w-none x:xl:flex-1/3 x:xl:rounded-none; + @apply x:absolute x:top-(--header-height) x:right-4 x:size-full x:max-h-[calc(100dvh-12rem)] x:max-w-3/4 x:overflow-y-auto x:rounded-xl x:border x:border-border/50 x:bg-secondary x:xl:static x:xl:h-auto x:xl:max-h-dvh x:xl:w-full x:xl:max-w-none x:xl:flex-1/3 x:xl:rounded-none; } } @@ -26,3 +26,10 @@ body[data-cplx-artifact-active-panel="list"] { @apply x:max-w-1/2 x:xl:flex-1; } } + +body[data-cplx-artifact-active-panel] { + /* the "Help" floating button */ + main > .bottom-md.right-md.m-sm.fixed.hidden { + display: none; + } +} diff --git a/perplexity/extension/src/plugins/thread-message-tts/settings-ui.tsx b/perplexity/extension/src/plugins/thread-message-tts/settings-ui.tsx index f3018ea5f..6e60af53d 100644 --- a/perplexity/extension/src/plugins/thread-message-tts/settings-ui.tsx +++ b/perplexity/extension/src/plugins/thread-message-tts/settings-ui.tsx @@ -19,7 +19,7 @@ export default function ThreadMessageTtsPluginSettingsUi() { return (
-
Right-click to open voice menu. Only supports English content.
+
Right-click on the play button to open voice menu.
state.tocItems); const panelPosition = useThreadTocStore((state) => state.panelPosition); - const threadWrapper = useThreadDomObserverStore( + const portalContainer = useThreadDomObserverStore( (store) => store.$wrapper?.[0], deepEqual, ); @@ -46,7 +45,7 @@ export function TocPanel() { const shouldShowToc = tocItems.length > 1 && panelPosition != null; - if (!shouldShowToc || threadWrapper == null) return null; + if (!shouldShowToc || portalContainer == null) return null; const isFloating = panelPosition.isOverflowing; const width = panelPosition.width; @@ -54,7 +53,7 @@ export function TocPanel() { return ( - +
state.tocItems, (tocItems) => { utils.setCurrentTocItems(tocItems); - const delay = utils.getDebounceDelay(tocItems.length); - utils.debouncedCalculatePanelPosition(delay); + utils.calculatePanelPosition(); }, { equalityFn: deepEqual }, ); + const observer = new PositionObserver((_entries) => { + utils.calculatePanelPosition(); + }); + threadDomObserverStore.subscribe( (state) => state.$wrapper, ($wrapper) => { utils.setCurrentThreadWrapper($wrapper?.[0] ?? null); utils.calculatePanelPosition(); - }, - { equalityFn: deepEqual }, - ); - pplxCookiesStore.subscribe( - (state) => - state.cookies.find((cookie) => cookie.name === "isSidebarPinned"), - () => { - utils.calculatePanelPosition(); - }, - { equalityFn: deepEqual }, - ); + observer.disconnect(); - spaRouterStoreSubscribe( - (url) => url, - () => { - utils.calculatePanelPosition(); + if ($wrapper == null) { + return; + } + + observer.observe($wrapper[0] as Element); }, + { equalityFn: deepEqual }, ); - - const handleResize = () => { - const newWidth = window.innerWidth; - const newHeight = window.innerHeight; - - if ( - newWidth !== utils.getWindowWidth() || - newHeight !== utils.getWindowHeight() - ) { - utils.setWindowWidth(newWidth); - utils.setWindowHeight(newHeight); - - const delay = utils.getDebounceDelay(utils.getCurrentTocItems().length); - utils.debouncedCalculatePanelPosition(delay); - } - }; - - window.addEventListener("resize", handleResize); } diff --git a/perplexity/extension/src/plugins/thread-toc/store/utils.ts b/perplexity/extension/src/plugins/thread-toc/store/utils.ts index b6d578f9f..4d2234b5c 100644 --- a/perplexity/extension/src/plugins/thread-toc/store/utils.ts +++ b/perplexity/extension/src/plugins/thread-toc/store/utils.ts @@ -1,14 +1,14 @@ +import debounce from "lodash/debounce"; + import type { MessageBlock } from "@/plugins/__core__/dom-observers/thread/message-blocks/types"; import { threadTocStore } from "@/plugins/thread-toc/store"; import type { TocItem } from "@/plugins/thread-toc/store/types"; -const DEBOUNCE_DELAY_THRESHOLD = 5; -const DEBOUNCE_DELAY_MS = 200; const PANEL_PADDING = 64; const PANEL_MARGIN = 32; const DEFAULT_HEADER_HEIGHT = 53; const MAX_PANEL_WIDTH = 300; -const MIN_PANEL_WIDTH = 150; +const MIN_PANEL_WIDTH = 230; let activeId: number | null = null; let topMostId: number | null = null; @@ -19,7 +19,6 @@ let pendingUpdate = false; let windowWidth = window.innerWidth; let windowHeight = window.innerHeight; -let debounceTimer: ReturnType | null = null; let currentTocItems: TocItem[] = []; let currentThreadWrapper: HTMLElement | null = null; let currentMessageBlocks: MessageBlock[] | null = null; @@ -189,69 +188,62 @@ const getActiveMessageBlockContentWrapper = (): HTMLElement | null => { return messageBlock.nodes.$contentWrapper[0] ?? null; }; -const calculatePanelPosition = () => { - if (currentThreadWrapper == null || currentTocItems.length === 0) { - threadTocStore.setState({ panelPosition: null }); - return; - } - - const activeMessageBlockContentWrapper = - getActiveMessageBlockContentWrapper(); +const calculatePanelPosition = debounce( + () => { + if (currentThreadWrapper == null || currentTocItems.length === 0) { + threadTocStore.setState({ panelPosition: null }); + return; + } - if (activeMessageBlockContentWrapper == null) { - threadTocStore.setState({ panelPosition: null }); - return; - } + const activeMessageBlockContentWrapper = + getActiveMessageBlockContentWrapper(); - const threadContentWrapperOffsetRight = - activeMessageBlockContentWrapper.offsetLeft + - activeMessageBlockContentWrapper.offsetWidth; + if (activeMessageBlockContentWrapper == null) { + threadTocStore.setState({ panelPosition: null }); + return; + } - const availableSpace = - currentThreadWrapper.offsetWidth - - threadContentWrapperOffsetRight - - PANEL_PADDING - - PANEL_MARGIN; + const threadContentWrapperOffsetRight = + activeMessageBlockContentWrapper.offsetLeft + + activeMessageBlockContentWrapper.offsetWidth; - const panelWidth = Math.max( - MIN_PANEL_WIDTH, - Math.min(MAX_PANEL_WIDTH, availableSpace), - ); + if (threadContentWrapperOffsetRight <= 0) { + threadTocStore.setState({ panelPosition: null }); + return; + } - const panelRightEdge = - threadContentWrapperOffsetRight + panelWidth + PANEL_PADDING; - const isOverflowing = panelRightEdge > currentThreadWrapper.offsetWidth; + const availableSpace = + currentThreadWrapper.offsetWidth - + threadContentWrapperOffsetRight - + PANEL_PADDING - + PANEL_MARGIN; - threadTocStore.setState({ - panelPosition: { - position: { - left: threadContentWrapperOffsetRight + PANEL_MARGIN, - }, - isOverflowing, - width: isOverflowing ? MAX_PANEL_WIDTH : panelWidth, - }, - }); -}; + const panelWidth = Math.max( + MIN_PANEL_WIDTH, + Math.min(MAX_PANEL_WIDTH, availableSpace), + ); -const getDebounceDelay = (tocItemsLength: number) => { - return tocItemsLength > DEBOUNCE_DELAY_THRESHOLD ? DEBOUNCE_DELAY_MS : 0; -}; + const panelRightEdge = + threadContentWrapperOffsetRight + panelWidth + PANEL_PADDING; + const isOverflowing = panelRightEdge > currentThreadWrapper.offsetWidth; -const debouncedCalculatePanelPosition = (delay: number) => { - if (debounceTimer) { - clearTimeout(debounceTimer); - } - debounceTimer = setTimeout(() => { - calculatePanelPosition(); - debounceTimer = null; - }, delay); -}; + threadTocStore.setState({ + panelPosition: { + position: { + left: threadContentWrapperOffsetRight + PANEL_MARGIN, + }, + isOverflowing, + width: isOverflowing ? MAX_PANEL_WIDTH : panelWidth, + }, + }); + }, + 150, + { leading: true, trailing: true, maxWait: 1000 }, +); export const utils = { updateItems, calculatePanelPosition, - debouncedCalculatePanelPosition, - getDebounceDelay, setCurrentMessageBlocks: (blocks: MessageBlock[] | null) => { currentMessageBlocks = blocks; }, diff --git a/perplexity/extension/src/utils/dom-utils/pplx-scrollbar-classes.ts b/perplexity/extension/src/utils/dom-utils/pplx-scrollbar-classes.ts deleted file mode 100644 index e9c02e6ec..000000000 --- a/perplexity/extension/src/utils/dom-utils/pplx-scrollbar-classes.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const PPLX_SCROLLBAR_CLASSES = - "scrollbar-thin scrollbar-track-transparent scrollbar-thumb-idle dark:scrollbar-thumb-idleDark"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 828d01c64..0f262099e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -413,6 +413,9 @@ importers: pako: specifier: ^2.1.0 version: 2.1.0 + position-observer: + specifier: ^1.0.3 + version: 1.0.3 react: specifier: ^19.2.0 version: 19.2.0 @@ -584,7 +587,7 @@ importers: version: 9.38.0(jiti@2.6.1) eslint-plugin-boundaries: specifier: ^5.1.0 - version: 5.1.0(eslint@9.38.0(jiti@2.6.1)) + version: 5.1.0(@typescript-eslint/parser@8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1)) glob: specifier: ^11.0.3 version: 11.0.3 @@ -6137,6 +6140,9 @@ packages: points-on-path@0.2.1: resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + position-observer@1.0.3: + resolution: {integrity: sha512-iqzsYcYB7wo9kd3Juw4XaVPhlLCfKhZLv6TrH096reU6tIcXuftPkA41+nqQgnPGzVo5zTC4tJ7GnIRTxrnZbQ==} + possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -12167,6 +12173,16 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0(jiti@2.6.1)): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.38.0(jiti@2.6.1) + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)): dependencies: debug: 3.2.7 @@ -12177,12 +12193,12 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-boundaries@5.1.0(eslint@9.38.0(jiti@2.6.1)): + eslint-plugin-boundaries@5.1.0(@typescript-eslint/parser@8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1)): dependencies: chalk: 4.1.2 eslint: 9.38.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0(jiti@2.6.1)) micromatch: 4.0.8 transitivePeerDependencies: - '@typescript-eslint/parser' @@ -14427,6 +14443,10 @@ snapshots: path-data-parser: 0.1.0 points-on-curve: 0.2.0 + position-observer@1.0.3: + optionalDependencies: + '@rollup/rollup-linux-x64-gnu': 4.52.5 + possible-typed-array-names@1.1.0: {} postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.6)(yaml@2.8.1): From 39c140ddc7a5643b95035f20feed6382f5b5b7c4 Mon Sep 17 00:00:00 2001 From: Pham Ngoc Duong Date: Wed, 5 Nov 2025 14:19:25 +0700 Subject: [PATCH 15/85] feat(pplx-ext:plugin:message-rewrite-dropdown): force redo search --- perplexity/extension/changelogs/2.8.0.md | 8 + perplexity/extension/package.json | 2 +- .../extension/src/components/ui/checkbox.tsx | 8 +- .../src/components/ui/dropdown-menu.tsx | 2 +- .../_main-world/fiber-search/index.ts | 14 + .../_main-world/fiber-search/utils.ts | 401 +++++++++++++++++- .../network-intercept/interceptors/fetch.ts | 92 ++-- .../useCreatePortalContainer.ts | 3 +- .../components/desktop/LanguageModelGroup.tsx | 85 ++-- .../components/desktop/index.tsx | 10 +- .../components/mobile/index.tsx | 3 +- .../hide-native-model-selector.css | 4 +- .../hide-native-buttons.css | 2 +- .../RedoSearchSwitch.tsx | 29 ++ .../ThreadBetterRewriteDropdown.tsx | 45 +- .../_locales/index.ts | 13 + ...in-thread-better-rewrite-dropdown.bn-BD.ts | 6 + ...in-thread-better-rewrite-dropdown.cs-CZ.ts | 6 + ...in-thread-better-rewrite-dropdown.de-DE.ts | 6 + ...in-thread-better-rewrite-dropdown.el-GR.ts | 6 + ...in-thread-better-rewrite-dropdown.en-US.ts | 6 + ...in-thread-better-rewrite-dropdown.es-ES.ts | 6 + ...in-thread-better-rewrite-dropdown.fr-FR.ts | 6 + ...in-thread-better-rewrite-dropdown.hi-IN.ts | 6 + ...in-thread-better-rewrite-dropdown.hr-HR.ts | 6 + ...in-thread-better-rewrite-dropdown.hu-HU.ts | 6 + ...in-thread-better-rewrite-dropdown.id-ID.ts | 6 + ...in-thread-better-rewrite-dropdown.it-IT.ts | 6 + ...in-thread-better-rewrite-dropdown.ja-JP.ts | 6 + ...in-thread-better-rewrite-dropdown.ko-KR.ts | 6 + ...in-thread-better-rewrite-dropdown.nl-NL.ts | 6 + ...in-thread-better-rewrite-dropdown.pl-PL.ts | 6 + ...in-thread-better-rewrite-dropdown.pt-BR.ts | 6 + ...in-thread-better-rewrite-dropdown.pt-PT.ts | 6 + ...in-thread-better-rewrite-dropdown.ro-RO.ts | 6 + ...in-thread-better-rewrite-dropdown.ru-RU.ts | 6 + ...in-thread-better-rewrite-dropdown.sk-SK.ts | 6 + ...read-better-rewrite-dropdown.sr-Cyrl-ME.ts | 6 + ...in-thread-better-rewrite-dropdown.zh-CN.ts | 6 + ...in-thread-better-rewrite-dropdown.zh-TW.ts | 6 + .../_main-world/trigger-rewrite-option.ts | 1 + .../handle-rewrite.ts | 5 + .../hide-native-rewrite-dropdowns.css | 2 +- .../index.manifest.ts | 7 +- .../index.remote-resources.ts | 12 +- .../settings-ui.tsx | 2 +- .../src/plugins/thread-export/ExportMenu.tsx | 2 - .../index.manifest.ts | 36 ++ .../loader.ts | 90 ++++ .../src/plugins/thread-toc/store/utils.ts | 2 +- .../dom-selectors/defaults.ts | 21 +- 51 files changed, 903 insertions(+), 142 deletions(-) create mode 100644 perplexity/extension/changelogs/2.8.0.md create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/RedoSearchSwitch.tsx create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/index.ts create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.bn-BD.ts create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.cs-CZ.ts create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.de-DE.ts create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.el-GR.ts create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.en-US.ts create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.es-ES.ts create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.fr-FR.ts create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.hi-IN.ts create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.hr-HR.ts create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.hu-HU.ts create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.id-ID.ts create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.it-IT.ts create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.ja-JP.ts create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.ko-KR.ts create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.nl-NL.ts create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.pl-PL.ts create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.pt-BR.ts create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.pt-PT.ts create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.ro-RO.ts create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.ru-RU.ts create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.sk-SK.ts create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.sr-Cyrl-ME.ts create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.zh-CN.ts create mode 100644 perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.zh-TW.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/index.manifest.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/loader.ts diff --git a/perplexity/extension/changelogs/2.8.0.md b/perplexity/extension/changelogs/2.8.0.md new file mode 100644 index 000000000..4110e3739 --- /dev/null +++ b/perplexity/extension/changelogs/2.8.0.md @@ -0,0 +1,8 @@ +## What's New + +- `Message Completion Notification`: Show system notifications when normal searches/answers (not including Research/Labs) are completed +- `Better Rewrite Dropdown`: Added a new option to force the agent to redo the search process + +## Bug Fixes + +- `Thread: Table of Contents`: Fixed positioning issues diff --git a/perplexity/extension/package.json b/perplexity/extension/package.json index 622c68176..a48cd494e 100644 --- a/perplexity/extension/package.json +++ b/perplexity/extension/package.json @@ -1,6 +1,6 @@ { "name": "pplx-ext", - "version": "2.7.13", + "version": "2.8.0", "author": "pnd280", "type": "module", "scripts": { diff --git a/perplexity/extension/src/components/ui/checkbox.tsx b/perplexity/extension/src/components/ui/checkbox.tsx index 11caeb94f..f4012fb43 100644 --- a/perplexity/extension/src/components/ui/checkbox.tsx +++ b/perplexity/extension/src/components/ui/checkbox.tsx @@ -5,13 +5,13 @@ import type { ReactNode } from "react"; import TablerCheck from "~icons/tabler/check"; const checkboxVariants = cva( - "x:size-4 x:shrink-0 x:rounded-sm x:border x:border-border x:ring-offset-background x:transition-all x:group-data-disabled:cursor-not-allowed x:group-data-disabled:opacity-50 x:focus-visible:ring-2 x:focus-visible:ring-ring x:focus-visible:ring-offset-2 x:focus-visible:outline-none x:data-[state=checked]:bg-primary x:data-[state=checked]:text-foreground-subtle", + "x:shrink-0 x:rounded-sm x:border x:border-border x:ring-offset-background x:transition-all x:group-data-disabled:cursor-not-allowed x:group-data-disabled:opacity-50 x:focus-visible:ring-2 x:focus-visible:ring-ring x:focus-visible:ring-offset-2 x:focus-visible:outline-none x:data-[state=checked]:bg-primary x:data-[state=checked]:text-foreground-subtle", { variants: { size: { - sm: "x:size-3", - base: "x:size-4", - lg: "x:size-5", + sm: "x:size-3.5", + base: "x:size-4.5", + lg: "x:size-5.5", }, }, defaultVariants: { diff --git a/perplexity/extension/src/components/ui/dropdown-menu.tsx b/perplexity/extension/src/components/ui/dropdown-menu.tsx index f688ebe96..6706f9eac 100644 --- a/perplexity/extension/src/components/ui/dropdown-menu.tsx +++ b/perplexity/extension/src/components/ui/dropdown-menu.tsx @@ -32,7 +32,7 @@ export function DropdownMenuContent({ boolean; + maxDepth: number; + expectSameDepth: boolean; + visitedNodesRef: VisitedNodesRef; +}) { + const { + startFiber, + nodeMatches, + maxDepth, + expectSameDepth, + visitedNodesRef, + } = params; + const resultPaths: FiberPath[] = []; + const stackNodes: (Fiber | null)[] = [startFiber]; + const stackDepths: number[] = [0]; + const stackPaths: ("child" | "sibling" | "return")[][] = [[]]; + const visited = new Set(); + let targetDepth: number | null = null; + + while (stackNodes.length) { + const node = stackNodes.pop(); + const depth = stackDepths.pop(); + const currentPath = stackPaths.pop(); + if ( + node == null || + depth == null || + currentPath == null || + Math.abs(depth) > maxDepth + ) + continue; + + if (visited.has(node)) continue; + visited.add(node); + + if (expectSameDepth && targetDepth != null && depth !== targetDepth) { + continue; + } + + visitedNodesRef.current++; + + if (nodeMatches(node)) { + resultPaths.push({ directions: currentPath }); + if (expectSameDepth && targetDepth == null) { + targetDepth = depth; + } + } + + // Traverse downward (child and sibling) + const sibling = node.sibling; + if (sibling != null && !visited.has(sibling)) { + stackNodes.push(sibling); + stackDepths.push(depth); + stackPaths.push([...currentPath, "sibling"]); + } + const child = node.child; + if ( + child != null && + !visited.has(child) && + (!expectSameDepth || targetDepth == null) + ) { + stackNodes.push(child); + stackDepths.push(depth + 1); + stackPaths.push([...currentPath, "child"]); + } + + // Traverse upward (return) + const parent = node.return; + if ( + parent != null && + !visited.has(parent) && + (!expectSameDepth || targetDepth == null) + ) { + stackNodes.push(parent); + stackDepths.push(depth - 1); + stackPaths.push([...currentPath, "return"]); + } + + // Traverse upward siblings (parent's siblings) + if (parent != null) { + const parentSibling = parent.sibling; + if (parentSibling != null && !visited.has(parentSibling)) { + stackNodes.push(parentSibling); + stackDepths.push(depth - 1); + stackPaths.push([...currentPath, "return", "sibling"]); + } + } + } + + return resultPaths; +} + +function searchAllFibersUpward(params: { + startFiber: Fiber; + nodeMatches: (node: Fiber) => boolean; + maxDepth: number; + expectSameDepth: boolean; + visitedNodesRef: VisitedNodesRef; +}) { + const { + startFiber, + nodeMatches, + maxDepth, + expectSameDepth, + visitedNodesRef, + } = params; + const resultPaths: FiberPath[] = []; + const stackNodes: (Fiber | null)[] = [startFiber]; + const stackDepths: number[] = [0]; + const stackPaths: ("return" | "sibling")[][] = [[]]; + const visited = new Set(); + let targetDepth: number | null = null; + + while (stackNodes.length) { + const node = stackNodes.pop(); + const depth = stackDepths.pop(); + const currentPath = stackPaths.pop(); + if ( + node == null || + depth == null || + currentPath == null || + Math.abs(depth) > maxDepth + ) + continue; + + if (visited.has(node)) continue; + visited.add(node); + + if (expectSameDepth && targetDepth != null && depth !== targetDepth) { + continue; + } + + visitedNodesRef.current++; + + if (nodeMatches(node)) { + resultPaths.push({ directions: currentPath }); + if (expectSameDepth && targetDepth == null) { + targetDepth = depth; + } + } + + // Only traverse upward (return) + const parent = node.return; + if ( + parent != null && + !visited.has(parent) && + (!expectSameDepth || targetDepth == null) + ) { + stackNodes.push(parent); + stackDepths.push(depth - 1); + stackPaths.push([...currentPath, "return"]); + } + + // Traverse upward siblings (parent's siblings) + if (parent != null) { + const parentSibling = parent.sibling; + if (parentSibling != null && !visited.has(parentSibling)) { + stackNodes.push(parentSibling); + stackDepths.push(depth - 1); + stackPaths.push([...currentPath, "return", "sibling"]); + } + } + + // Also check current node's siblings at the same level (when going upward, siblings are lateral moves) + const sibling = node.sibling; + if (sibling != null && !visited.has(sibling)) { + stackNodes.push(sibling); + stackDepths.push(depth); + stackPaths.push([...currentPath, "sibling"]); + } + } + + return resultPaths; +} + function searchSingleFiber(params: { startFiber: Fiber; nodeMatches: (node: Fiber) => boolean; @@ -368,6 +554,142 @@ function searchSingleFiber(params: { return null; } +function searchSingleFiberUpward(params: { + startFiber: Fiber; + nodeMatches: (node: Fiber) => boolean; + maxDepth: number; + visitedNodesRef: VisitedNodesRef; +}) { + const { startFiber, nodeMatches, maxDepth, visitedNodesRef } = params; + const queueNodes: (Fiber | null)[] = [startFiber]; + const queueDepths: number[] = [0]; + const queuePaths: ("return" | "sibling")[][] = [[]]; + const visited = new Set(); + let head = 0; + + while (head < queueNodes.length) { + const node = queueNodes[head]; + const depth = queueDepths[head]; + const currentPath = queuePaths[head]; + head++; + if ( + node == null || + depth == null || + currentPath == null || + Math.abs(depth) > maxDepth + ) + continue; + + if (visited.has(node)) continue; + visited.add(node); + + visitedNodesRef.current++; + + if (nodeMatches(node)) { + return { directions: currentPath }; + } + + // Only traverse upward (return) + const parent = node.return; + if (parent != null && !visited.has(parent)) { + queueNodes.push(parent); + queueDepths.push(depth - 1); + queuePaths.push([...currentPath, "return"]); + } + + // Traverse upward siblings (parent's siblings) + if (parent != null) { + const parentSibling = parent.sibling; + if (parentSibling != null && !visited.has(parentSibling)) { + queueNodes.push(parentSibling); + queueDepths.push(depth - 1); + queuePaths.push([...currentPath, "return", "sibling"]); + } + } + + // Also check current node's siblings at the same level (lateral moves) + const sibling = node.sibling; + if (sibling != null && !visited.has(sibling)) { + queueNodes.push(sibling); + queueDepths.push(depth); + queuePaths.push([...currentPath, "sibling"]); + } + } + + return null; +} + +function searchSingleFiberWithUpward(params: { + startFiber: Fiber; + nodeMatches: (node: Fiber) => boolean; + maxDepth: number; + visitedNodesRef: VisitedNodesRef; +}) { + const { startFiber, nodeMatches, maxDepth, visitedNodesRef } = params; + const queueNodes: (Fiber | null)[] = [startFiber]; + const queueDepths: number[] = [0]; + const queuePaths: ("child" | "sibling" | "return")[][] = [[]]; + const visited = new Set(); + let head = 0; + + while (head < queueNodes.length) { + const node = queueNodes[head]; + const depth = queueDepths[head]; + const currentPath = queuePaths[head]; + head++; + if ( + node == null || + depth == null || + currentPath == null || + Math.abs(depth) > maxDepth + ) + continue; + + if (visited.has(node)) continue; + visited.add(node); + + visitedNodesRef.current++; + + if (nodeMatches(node)) { + return { directions: currentPath }; + } + + // Traverse downward (child and sibling) + const child = node.child; + if (child != null && !visited.has(child)) { + queueNodes.push(child); + queueDepths.push(depth + 1); + queuePaths.push([...currentPath, "child"]); + } + const sibling = node.sibling; + if (sibling != null && !visited.has(sibling)) { + queueNodes.push(sibling); + queueDepths.push(depth); + queuePaths.push([...currentPath, "sibling"]); + } + + // Traverse upward (return) + const parent = node.return; + if (parent != null && !visited.has(parent)) { + queueNodes.push(parent); + queueDepths.push(depth - 1); + queuePaths.push([...currentPath, "return"]); + } + + // Traverse upward siblings (parent's siblings) + if (parent != null) { + const parentSibling = parent.sibling; + if (parentSibling != null && !visited.has(parentSibling)) { + queueNodes.push(parentSibling); + queueDepths.push(depth - 1); + queuePaths.push([...currentPath, "return", "sibling"]); + } + } + } + + return null; +} + export function findFiberNodes( condition: NameSearchCondition, options: NameSearchSingleOptions, @@ -450,6 +772,20 @@ export function findFiberNodes( * { name: "DynamicComponent" }, * { rootElementSelector: "#root", cache: false } * ); + * + * @example + * // Search upward through parent nodes + * const parentNode = findFiberNodes( + * { name: "ParentComponent" }, + * { rootElementSelector: "#child", traverseDirection: "up" } + * ); + * + * @example + * // Search in both directions + * const nodes = findFiberNodes( + * { name: "SharedComponent" }, + * { rootElementSelector: "#root", findAll: true, traverseDirection: "both" } + * ); */ export function findFiberNodes( condition: FiberSearchCondition, @@ -462,6 +798,7 @@ export function findFiberNodes( "expectSameDepth" in options ? options.expectSameDepth === true : false; const cache = options.cache !== false; const profile = options.profile === true; + const traverseDirection = options.traverseDirection ?? "down"; let shouldReturnCached = false; let cachedPaths: FiberPath[] | null = null; @@ -575,13 +912,30 @@ export function findFiberNodes( const startedAt = profile ? performance.now() : 0; if (findAll) { - const resultPaths = searchAllFibers({ - startFiber, - nodeMatches, - maxDepth, - expectSameDepth, - visitedNodesRef, - }); + const resultPaths = + traverseDirection === "up" + ? searchAllFibersUpward({ + startFiber, + nodeMatches, + maxDepth, + expectSameDepth, + visitedNodesRef, + }) + : traverseDirection === "both" + ? searchAllFibersWithUpward({ + startFiber, + nodeMatches, + maxDepth, + expectSameDepth, + visitedNodesRef, + }) + : searchAllFibers({ + startFiber, + nodeMatches, + maxDepth, + expectSameDepth, + visitedNodesRef, + }); const results: Fiber[] = []; for (const path of resultPaths) { @@ -597,6 +951,7 @@ export function findFiberNodes( mode: "findAll", cached: false, cacheEnabled: cache, + traverseDirection, durationMs: Number(duration.toFixed(2)), visitedNodes: visitedNodesRef.current, matches: results.length, @@ -624,12 +979,27 @@ export function findFiberNodes( return results; } - const resultPath = searchSingleFiber({ - startFiber, - nodeMatches, - maxDepth, - visitedNodesRef, - }); + const resultPath = + traverseDirection === "up" + ? searchSingleFiberUpward({ + startFiber, + nodeMatches, + maxDepth, + visitedNodesRef, + }) + : traverseDirection === "both" + ? searchSingleFiberWithUpward({ + startFiber, + nodeMatches, + maxDepth, + visitedNodesRef, + }) + : searchSingleFiber({ + startFiber, + nodeMatches, + maxDepth, + visitedNodesRef, + }); const result = resultPath ? followPath(startFiber, resultPath) : null; @@ -639,6 +1009,7 @@ export function findFiberNodes( mode: "single", cached: false, cacheEnabled: cache, + traverseDirection, durationMs: Number(duration.toFixed(2)), visitedNodes: visitedNodesRef.current, match: result ? getComponentNameFromFiber(result) : null, diff --git a/perplexity/extension/src/plugins/__core__/_main-world/network-intercept/interceptors/fetch.ts b/perplexity/extension/src/plugins/__core__/_main-world/network-intercept/interceptors/fetch.ts index 83220feba..ecd2499b0 100644 --- a/perplexity/extension/src/plugins/__core__/_main-world/network-intercept/interceptors/fetch.ts +++ b/perplexity/extension/src/plugins/__core__/_main-world/network-intercept/interceptors/fetch.ts @@ -7,62 +7,59 @@ export function initFetchInterceptor() { request: RequestInfo | URL, init?: RequestInit, ) { - // void logRequest(constructUrl(request), init?.body as string); - if (init?.body != null && typeof init.body === "string") { const [modifiedBody, error] = await tryCatch(() => - interceptRequest(request, init.body as string), + NetworkInterceptMiddlewareManagerService.Proxy.executeMiddlewares({ + data: { + type: "networkIntercept:fetchEvent", + event: "request", + payload: { + url: constructUrl(request), + data: init.body?.toString() ?? "", + }, + }, + }), ); if (error) { return originalFetch.call(window, request, init); } - if (modifiedBody === "") { + if (modifiedBody != null && modifiedBody.payload.data === "") { return new Response("", { status: 200 }); } - init.body = modifiedBody; + init.body = modifiedBody?.payload.data ?? ""; } const response = await originalFetch.call(window, request, init); - const url = constructUrl(request); if (response.headers.get("content-type")?.includes("text/event-stream")) { - return handleStreamingResponse(response, url); + return handleStreamingResponse(response); } - return handleRegularResponse(response, url); + return handleRegularResponse(response); }; } -async function interceptRequest(request: RequestInfo | URL, body: string) { - const resp = - await NetworkInterceptMiddlewareManagerService.Proxy.executeMiddlewares({ - data: { - type: "networkIntercept:fetchEvent", - event: "request", - payload: { url: constructUrl(request), data: body }, - }, - }); - - return resp?.payload.data ?? ""; -} - function parseSSEChunk(chunk: string): { event: string; data: string }[] { const events: { event: string; data: string }[] = []; - const eventStrings = chunk.split("\n\n").filter(Boolean); + const eventStrings = chunk + .replace(/\r\n|\r/g, "\n") + .split("\n\n") + .filter(Boolean); for (const eventString of eventStrings) { const lines = eventString.split("\n"); - let event = "message"; + let event = ""; let data = ""; for (const line of lines) { - if (line.startsWith("event:")) { - event = line.slice(6).trim(); - } else if (line.startsWith("data:")) { - data = line.slice(5).trim(); + const sanitizedLine = line.trim(); + if (sanitizedLine.startsWith("event:")) { + event = sanitizedLine.slice(6).trim(); + } else if (sanitizedLine.startsWith("data:")) { + data = sanitizedLine.slice(5).trim(); } } @@ -74,7 +71,7 @@ function parseSSEChunk(chunk: string): { event: string; data: string }[] { return events; } -function handleStreamingResponse(response: Response, url: string) { +function handleStreamingResponse(response: Response) { const reader = response.body?.getReader(); if (!reader) return response; @@ -87,10 +84,23 @@ function handleStreamingResponse(response: Response, url: string) { let result = await reader.read(); while (!result.done) { const chunk = decoder.decode(result.value, { stream: true }); + const events = parseSSEChunk(chunk); for (const event of events) { - void logResponse(url, response.status, event.data); + void NetworkInterceptMiddlewareManagerService.Proxy.executeMiddlewares( + { + data: { + type: "networkIntercept:fetchEvent", + event: "response", + payload: { + url: constructUrl(response.url), + status: response.status, + data: event.data, + }, + }, + }, + ); } controller.enqueue(result.value); @@ -111,31 +121,21 @@ function handleStreamingResponse(response: Response, url: string) { ); } -async function handleRegularResponse(response: Response, url: string) { +async function handleRegularResponse(response: Response) { const clonedResponse = response.clone(); const body = await clonedResponse.text(); - void logResponse(url, response.status, body); - return response; -} - -async function logRequest(url: string, data: string) { - void NetworkInterceptMiddlewareManagerService.Proxy.executeMiddlewares({ - data: { - type: "networkIntercept:fetchEvent", - event: "request", - payload: { url, data }, - }, - }); -} - -async function logResponse(url: string, status: number, data: string) { void NetworkInterceptMiddlewareManagerService.Proxy.noop({ data: { type: "networkIntercept:fetchEvent", event: "response", - payload: { url, status, data }, + payload: { + url: constructUrl(response.url), + status: response.status, + data: body, + }, }, }); + return response; } function constructUrl(url: unknown) { diff --git a/perplexity/extension/src/plugins/__ui-groups__/elements/thread-navbar-attributes/useCreatePortalContainer.ts b/perplexity/extension/src/plugins/__ui-groups__/elements/thread-navbar-attributes/useCreatePortalContainer.ts index 5fb946faf..3ece66bb2 100644 --- a/perplexity/extension/src/plugins/__ui-groups__/elements/thread-navbar-attributes/useCreatePortalContainer.ts +++ b/perplexity/extension/src/plugins/__ui-groups__/elements/thread-navbar-attributes/useCreatePortalContainer.ts @@ -10,10 +10,11 @@ export function useCreatePortalContainer(): HTMLElement | null { ); if (!$overflowMenuButtonWrapper?.[0]) { + $(DomSelectorsService.Root.cplxAttribute(OBSERVER_ID)).remove(); return null; } - const $wrapper = $($overflowMenuButtonWrapper[0]).parent(); + const $wrapper = $overflowMenuButtonWrapper.parent(); const $existingPortalContainer = $wrapper.find( DomSelectorsService.Root.cplxAttribute(OBSERVER_ID), diff --git a/perplexity/extension/src/plugins/language-model-selector/components/desktop/LanguageModelGroup.tsx b/perplexity/extension/src/plugins/language-model-selector/components/desktop/LanguageModelGroup.tsx index c0d1c4455..87ad5bf36 100644 --- a/perplexity/extension/src/plugins/language-model-selector/components/desktop/LanguageModelGroup.tsx +++ b/perplexity/extension/src/plugins/language-model-selector/components/desktop/LanguageModelGroup.tsx @@ -10,7 +10,10 @@ import { SelectItem, SelectGroup, SelectLabel } from "@/components/ui/select"; import { LanguageModelSelectorContext } from "@/plugins/language-model-selector/context"; import { useModelLimits } from "@/plugins/language-model-selector/hooks/useModelLimits"; import { PplxLanguageModelsService } from "@/services/externals/cplx-api/remote-resources/pplx-language-models"; -import type { LanguageModel } from "@/services/externals/cplx-api/remote-resources/pplx-language-models/types"; +import type { + LanguageModel, + LanguageModelCode, +} from "@/services/externals/cplx-api/remote-resources/pplx-language-models/types"; import TablerCpu from "~icons/tabler/cpu"; @@ -59,47 +62,57 @@ export default function LanguageModelGroup({ {title} )} - {models.map((model) => renderModelItem(model))} + {models.map((model) => + renderModelItem({ model, modelsLimits, tooltipPlacement, ItemComp }), + )} ); +} - function renderModelItem(model: LanguageModel) { - const Icon = PplxLanguageModelsService.icons[model.icon] ?? TablerCpu; +function renderModelItem({ + model, + modelsLimits, + tooltipPlacement, + ItemComp, +}: { + model: LanguageModel; + modelsLimits: Partial>; + tooltipPlacement: "left" | "right"; + ItemComp: typeof DropdownMenuItem | typeof SelectItem; +}) { + const Icon = PplxLanguageModelsService.icons[model.icon] ?? TablerCpu; - const modelLimit = modelsLimits[model.code as keyof typeof modelsLimits]; - const limit = - modelLimit === Infinity - ? t("plugin-model-selectors.languageModelSelector.usesLeft.unlimited") - : typeof modelLimit === "number" - ? t("plugin-model-selectors.languageModelSelector.usesLeft.limited", { - count: modelLimit, - }) - : ""; + const modelLimit = modelsLimits[model.code as keyof typeof modelsLimits]; + const limit = + modelLimit === Infinity + ? t("plugin-model-selectors.languageModelSelector.usesLeft.unlimited") + : typeof modelLimit === "number" + ? t("plugin-model-selectors.languageModelSelector.usesLeft.limited", { + count: modelLimit, + }) + : ""; - const tooltipContent = limit; + const tooltipContent = limit; - return ( - {tooltipContent}
} + disabled={modelsLimits[model.code as keyof typeof modelsLimits] == null} + positioning={{ placement: tooltipPlacement, gutter: 10 }} + > + {tooltipContent}
- } - disabled={modelsLimits[model.code as keyof typeof modelsLimits] == null} - positioning={{ placement: tooltipPlacement, gutter: 10 }} + item={model.code} + value={model.code} + className="x:flex x:cursor-pointer x:items-center x:justify-start x:gap-2 x:text-foreground" + onClick={() => { + localStorage.setItem("cplx:lastSelectedLanguageModel", model.code); + }} > - { - localStorage.setItem("cplx:lastSelectedLanguageModel", model.code); - }} - > - - {model.label} - - - ); - } + + {model.label} + + + ); } diff --git a/perplexity/extension/src/plugins/language-model-selector/components/desktop/index.tsx b/perplexity/extension/src/plugins/language-model-selector/components/desktop/index.tsx index bc9664a20..3246846c7 100644 --- a/perplexity/extension/src/plugins/language-model-selector/components/desktop/index.tsx +++ b/perplexity/extension/src/plugins/language-model-selector/components/desktop/index.tsx @@ -10,7 +10,13 @@ import { } from "@/plugins/language-model-selector/utils"; import { LanguageModelTypeIcons } from "@/services/externals/cplx-api/remote-resources/pplx-language-models/icons"; -export default function DesktopContent() { +export default function DesktopContent({ + children, + className, +}: { + children?: React.ReactNode; + className?: string; +}) { const context = use(LanguageModelSelectorContext); if (!context) throw new Error("LanguageModelSelectorContext not found"); @@ -39,8 +45,10 @@ export default function DesktopContent() { className={cn( "custom-scrollbar", "x:flex x:max-h-[calc(var(--available-height))] x:items-start x:justify-between x:gap-2 x:overflow-y-auto x:p-2", + className, )} > + {children}
store.subTier); const searchModels = getModelsByType("search"); @@ -24,6 +24,7 @@ export default function MobileContent({ ...props }: DialogProps) { closeButton={false} className="x:flex x:flex-col x:gap-2" > + {children} div > div svg > use[*|href="#pplx-icon-copy"]) { + button:has(use[*|href="#pplx-icon-copy"]) { display: none; } diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/RedoSearchSwitch.tsx b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/RedoSearchSwitch.tsx new file mode 100644 index 000000000..077b8cf10 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/RedoSearchSwitch.tsx @@ -0,0 +1,29 @@ +import Tooltip from "@/components/Tooltip"; +import { Checkbox } from "@/components/ui/checkbox"; + +export default function RedoSearchSwitch({ + redoSearch, + setRedoSearch, + className, +}: { + redoSearch: boolean; + setRedoSearch: (redoSearch: boolean) => void; + className?: string; +}) { + return ( +
+ +
+ {t("plugin-thread-better-rewrite-dropdown.redoSearch")} +
+ + } + className="x:ml-auto x:w-fit x:flex-row-reverse x:items-center" + onCheckedChange={({ checked }) => setRedoSearch(Boolean(checked))} + /> +
+ ); +} diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/ThreadBetterRewriteDropdown.tsx b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/ThreadBetterRewriteDropdown.tsx index eb49393c7..7676f870d 100644 --- a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/ThreadBetterRewriteDropdown.tsx +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/ThreadBetterRewriteDropdown.tsx @@ -6,15 +6,13 @@ import { } from "@/components/ui/dropdown-menu"; import { useIsMobileStore } from "@/hooks/is-mobile-store"; import { useRegisteredGlobalCssEntry } from "@/plugins/__async-deps__/global-stores/global-css-store"; -import { - threadMessageBlocksDomObserverStore, - useThreadMessageBlocksDomObserverStore, -} from "@/plugins/__core__/dom-observers/thread/message-blocks/store"; +import { useThreadMessageBlocksDomObserverStore } from "@/plugins/__core__/dom-observers/thread/message-blocks/store"; import { useThreadMessageIndexContext } from "@/plugins/__ui-groups__/elements/thread-message-index-context"; import { DesktopContent } from "@/plugins/language-model-selector/index.public"; import { MobileContent } from "@/plugins/language-model-selector/index.public"; import { LanguageModelSelectorContext } from "@/plugins/language-model-selector/index.public"; import { handleRewrite } from "@/plugins/thread-better-rewrite-dropdown/handle-rewrite"; +import RedoSearchSwitch from "@/plugins/thread-better-rewrite-dropdown/RedoSearchSwitch"; import { isLanguageModelCode } from "@/services/externals/cplx-api/remote-resources/pplx-language-models/predicates"; import type { LanguageModelCode } from "@/services/externals/cplx-api/remote-resources/pplx-language-models/types"; @@ -26,6 +24,8 @@ export function ThreadBetterRewriteDropdown() { const [highlightedItem, setHighlightedItem] = useState("claude2"); + const [redoSearch, setRedoSearch] = useState(false); + useRegisteredGlobalCssEntry({ entryIds: ["thread-message-footer-hide-native-rewrite-dropdowns"], subscriberId: "thread-better-rewrite-dropdown#" + messageBlockIndex, @@ -33,7 +33,18 @@ export function ThreadBetterRewriteDropdown() { const isReadOnly = useThreadMessageBlocksDomObserverStore((store) => { return store.messageBlocks?.[messageBlockIndex]?.states.isReadOnly; - }, deepEqual); + }); + + const modelPreferences = useThreadMessageBlocksDomObserverStore((store) => { + return store.messageBlocks?.[messageBlockIndex]?.content.displayModel; + }); + + const haveSources = useThreadMessageBlocksDomObserverStore((store) => { + return ( + store.messageBlocks?.[messageBlockIndex]?.content.webResults != null && + store.messageBlocks[messageBlockIndex].content.webResults.length > 0 + ); + }); if (isReadOnly) return null; @@ -48,10 +59,6 @@ export function ThreadBetterRewriteDropdown() { }} onOpenChange={async ({ open }) => { if (open) { - const modelPreferences = - threadMessageBlocksDomObserverStore.getState().messageBlocks?.[ - messageBlockIndex - ]?.content.displayModel; setHighlightedItem(modelPreferences ?? null); } @@ -66,6 +73,7 @@ export function ThreadBetterRewriteDropdown() { handleRewrite({ selectedModel: value as LanguageModelCode, messageBlockIndex, + redoSearch: redoSearch === true, }); }} > @@ -90,9 +98,24 @@ export function ThreadBetterRewriteDropdown() { setIsOpen(open)} - /> + > + {haveSources && ( + + )} + ) : ( - + + {haveSources && ( + + )} + )} diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/index.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/index.ts new file mode 100644 index 000000000..44113379b --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/index.ts @@ -0,0 +1,13 @@ +import type { TranslationShape } from "@complexity/i18n"; + +import type translations from "@/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.en-US"; + +export const namespace = "plugin-thread-better-rewrite-dropdown"; + +export type Translations = TranslationShape; + +declare module "@complexity/i18n" { + interface TranslationsRegistry { + [namespace]: typeof translations; + } +} diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.bn-BD.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.bn-BD.ts new file mode 100644 index 000000000..13cbc925a --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.bn-BD.ts @@ -0,0 +1,6 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + tooltip: "এজেন্টকে অনুসন্ধান প্রক্রিয়া পুনরায় করতে বাধ্য করুন", + redoSearch: "অনুসন্ধান পুনরায় করুন", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.cs-CZ.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.cs-CZ.ts new file mode 100644 index 000000000..44c6b2f9d --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.cs-CZ.ts @@ -0,0 +1,6 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + tooltip: "Přinutit agenta znovu provést proces vyhledávání", + redoSearch: "Znovu vyhledat", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.de-DE.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.de-DE.ts new file mode 100644 index 000000000..58f56acea --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.de-DE.ts @@ -0,0 +1,6 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + tooltip: "Den Agenten dazu zwingen, den Suchprozess erneut durchzuführen", + redoSearch: "Suche wiederholen", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.el-GR.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.el-GR.ts new file mode 100644 index 000000000..1d7213066 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.el-GR.ts @@ -0,0 +1,6 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + tooltip: "Επιβάλετε στον πράκτορα να επαναλάβει τη διαδικασία αναζήτησης", + redoSearch: "Επανάληψη αναζήτησης", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.en-US.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.en-US.ts new file mode 100644 index 000000000..4db53a764 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.en-US.ts @@ -0,0 +1,6 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + tooltip: "Force the agent to redo the search process", + redoSearch: "Redo search", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.es-ES.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.es-ES.ts new file mode 100644 index 000000000..e01623d4e --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.es-ES.ts @@ -0,0 +1,6 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + tooltip: "Forzar al agente a repetir el proceso de búsqueda", + redoSearch: "Repetir búsqueda", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.fr-FR.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.fr-FR.ts new file mode 100644 index 000000000..2f02f658b --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.fr-FR.ts @@ -0,0 +1,6 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + tooltip: "Forcer l'agent à répéter le processus de recherche", + redoSearch: "Refaire la recherche", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.hi-IN.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.hi-IN.ts new file mode 100644 index 000000000..ba106fa44 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.hi-IN.ts @@ -0,0 +1,6 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + tooltip: "एजेंट को खोज प्रक्रिया को फिर से करने के लिए मजबूर करें", + redoSearch: "खोज फिर से करें", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.hr-HR.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.hr-HR.ts new file mode 100644 index 000000000..983784f11 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.hr-HR.ts @@ -0,0 +1,6 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + tooltip: "Prisilite agenta da ponovi proces pretraživanja", + redoSearch: "Ponovi pretraživanje", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.hu-HU.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.hu-HU.ts new file mode 100644 index 000000000..0be3198b3 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.hu-HU.ts @@ -0,0 +1,6 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + tooltip: "Kényszerítse az ügynököt, hogy ismételje meg a keresési folyamatot", + redoSearch: "Keresés újra", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.id-ID.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.id-ID.ts new file mode 100644 index 000000000..5988cdd14 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.id-ID.ts @@ -0,0 +1,6 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + tooltip: "Memaksa agen untuk melakukan ulang proses pencarian", + redoSearch: "Lakukan pencarian ulang", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.it-IT.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.it-IT.ts new file mode 100644 index 000000000..8a59305a8 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.it-IT.ts @@ -0,0 +1,6 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + tooltip: "Forza l'agente a ripetere il processo di ricerca", + redoSearch: "Ripeti ricerca", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.ja-JP.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.ja-JP.ts new file mode 100644 index 000000000..602c78eb9 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.ja-JP.ts @@ -0,0 +1,6 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + tooltip: "エージェントに検索プロセスを再実行させる", + redoSearch: "検索を再実行", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.ko-KR.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.ko-KR.ts new file mode 100644 index 000000000..73651b310 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.ko-KR.ts @@ -0,0 +1,6 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + tooltip: "에이전트가 검색 프로세스를 다시 실행하도록 강제", + redoSearch: "검색 다시 실행", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.nl-NL.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.nl-NL.ts new file mode 100644 index 000000000..e024ba864 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.nl-NL.ts @@ -0,0 +1,6 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + tooltip: "Dwing de agent om het zoekproces opnieuw uit te voeren", + redoSearch: "Zoekopdracht opnieuw uitvoeren", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.pl-PL.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.pl-PL.ts new file mode 100644 index 000000000..4cdb774cc --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.pl-PL.ts @@ -0,0 +1,6 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + tooltip: "Wymuś na agencie ponowne wykonanie procesu wyszukiwania", + redoSearch: "Powtórz wyszukiwanie", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.pt-BR.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.pt-BR.ts new file mode 100644 index 000000000..68a84b828 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.pt-BR.ts @@ -0,0 +1,6 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + tooltip: "Forçar o agente a repetir o processo de pesquisa", + redoSearch: "Repetir pesquisa", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.pt-PT.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.pt-PT.ts new file mode 100644 index 000000000..68a84b828 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.pt-PT.ts @@ -0,0 +1,6 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + tooltip: "Forçar o agente a repetir o processo de pesquisa", + redoSearch: "Repetir pesquisa", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.ro-RO.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.ro-RO.ts new file mode 100644 index 000000000..c9fee248b --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.ro-RO.ts @@ -0,0 +1,6 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + tooltip: "Forțați agentul să repete procesul de căutare", + redoSearch: "Repetă căutarea", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.ru-RU.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.ru-RU.ts new file mode 100644 index 000000000..c2f888495 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.ru-RU.ts @@ -0,0 +1,6 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + tooltip: "Заставить агента повторить процесс поиска", + redoSearch: "Повторить поиск", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.sk-SK.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.sk-SK.ts new file mode 100644 index 000000000..6e88d0572 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.sk-SK.ts @@ -0,0 +1,6 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + tooltip: "Prinútiť agenta, aby znova vykonal proces vyhľadávania", + redoSearch: "Znovu vyhľadať", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.sr-Cyrl-ME.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.sr-Cyrl-ME.ts new file mode 100644 index 000000000..e7662e0aa --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.sr-Cyrl-ME.ts @@ -0,0 +1,6 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + tooltip: "Приморите агента да понови процес претраживања", + redoSearch: "Поново претражи", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.zh-CN.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.zh-CN.ts new file mode 100644 index 000000000..f48e62b9b --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.zh-CN.ts @@ -0,0 +1,6 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + tooltip: "强制代理重新执行搜索过程", + redoSearch: "重新搜索", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.zh-TW.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.zh-TW.ts new file mode 100644 index 000000000..f5af28f6b --- /dev/null +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_locales/plugin-thread-better-rewrite-dropdown.zh-TW.ts @@ -0,0 +1,6 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + tooltip: "強制代理重新執行搜尋過程", + redoSearch: "重新搜尋", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_main-world/trigger-rewrite-option.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_main-world/trigger-rewrite-option.ts index 8f64f1025..05f79bccc 100644 --- a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_main-world/trigger-rewrite-option.ts +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/_main-world/trigger-rewrite-option.ts @@ -30,6 +30,7 @@ export async function triggerRewriteOption(params: { exact: true, maxDepth: 100, cache: false, + traverseDirection: "up", }, ); diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/handle-rewrite.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/handle-rewrite.ts index 00419fce9..f5b4f1aaf 100644 --- a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/handle-rewrite.ts +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/handle-rewrite.ts @@ -19,9 +19,11 @@ const remoteFiberConfig = await getVersionedRemoteResource( export const handleRewrite = ({ selectedModel, messageBlockIndex, + redoSearch, }: { selectedModel: LanguageModelCode; messageBlockIndex: number; + redoSearch: boolean; }) => { NetworkInterceptMiddlewareManagerService.Root.addMiddleware({ id: "instant-rewrite-model-change", @@ -54,6 +56,9 @@ export const handleRewrite = ({ // eslint-disable-next-line @typescript-eslint/no-explicit-any const newParams = produce(parsedData.params, (draft: any) => { draft.model_preference = selectedModel; + if (redoSearch) { + draft.redo_search = true; + } }); const newEncodedPayload = encodePerplexityAskEvent({ diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/hide-native-rewrite-dropdowns.css b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/hide-native-rewrite-dropdowns.css index def5455e3..85bc99a39 100644 --- a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/hide-native-rewrite-dropdowns.css +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/hide-native-rewrite-dropdowns.css @@ -1,5 +1,5 @@ [data-cplx-component="message-block-footer"] > :first-child { - > div:has(svg > use[*|href="#pplx-icon-repeat"]) { + > button:has(use[*|href="#pplx-icon-repeat"]) { display: none; } } diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/index.manifest.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/index.manifest.ts index 17c29d075..b0d789e42 100644 --- a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/index.manifest.ts +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/index.manifest.ts @@ -16,10 +16,11 @@ export default definePlugin({ meta: { id: "thread:betterRewriteDropdowns", title: "Better Rewrite Dropdowns", - description: "A better dropdown for rewriting messages", + description: + "A better dropdown for rewriting messages.\nOptionally forces the agent to redo the search process.", dashboardMeta: { - tags: ["ui", "pplxPro"], - categories: ["thread"], + tags: ["ui", "pplxPro", "updated"], + categories: ["thread", "featured"], uiRouteSegment: "thread-better-rewrite-dropdowns", }, dependencies: { diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/index.remote-resources.ts b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/index.remote-resources.ts index addd9e669..3b4195ce4 100644 --- a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/index.remote-resources.ts +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/index.remote-resources.ts @@ -16,8 +16,16 @@ export const threadBetterRewriteDropdownFiberConfigResourceConfig = name: "plugin.threadBetterRewriteDropdown.fiberConfig", type: "json", fallback: { - name: "DropDownMenu", - dataNodePath: ["memoizedProps", "footer", "props", "onClickRewrite"], + name: "DropdownMenu", + dataNodePath: [ + "return", + "memoizedProps", + "children", + "props", + "footer", + "props", + "onClickRewrite", + ], }, zodSchema: z.object({ name: z.string(), diff --git a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/settings-ui.tsx b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/settings-ui.tsx index 28e121777..b47df64d5 100644 --- a/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/settings-ui.tsx +++ b/perplexity/extension/src/plugins/thread-better-rewrite-dropdown/settings-ui.tsx @@ -26,7 +26,7 @@ export default function BetterThreadRewriteDropdownsPluginSettingsUi() {
better-thread-rewrite-dropdowns diff --git a/perplexity/extension/src/plugins/thread-export/ExportMenu.tsx b/perplexity/extension/src/plugins/thread-export/ExportMenu.tsx index 4d25aa2cc..01a059154 100644 --- a/perplexity/extension/src/plugins/thread-export/ExportMenu.tsx +++ b/perplexity/extension/src/plugins/thread-export/ExportMenu.tsx @@ -115,8 +115,6 @@ export function ThreadExportMenu() { -
Export all messages
-
; + } +} + +const schema = z.object({ + enabled: z.boolean(), +}); + +export default definePlugin({ + meta: { + id: "thread:messageCompletionNotification", + title: "Message Completion Notification", + description: + "Show system notifications when normal searches/answers (not including Research/Labs) are completed.\nRequires browser notifications to be enabled.", + dashboardMeta: { + tags: ["new"], + categories: ["thread", "featured"], + uiRouteSegment: "thread-message-completion-notification", + }, + dependencies: { + corePlugins: ["networkIntercept"], + }, + }, + settingsSchema: { + schema, + fallback: { + enabled: false, + }, + }, +}); diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/loader.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/loader.ts new file mode 100644 index 000000000..ab7c73ec4 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/loader.ts @@ -0,0 +1,90 @@ +import z from "zod"; + +import { toast } from "@/components/ui/use-toast"; +import { AsyncLoaderRegistry } from "@/plugins/__async-deps__/async-loaders"; +import { NetworkInterceptMiddlewareManagerService } from "@/plugins/__core__/_main-world/network-intercept/_service/service-init.loader"; +import { isSearchLanguageModelCode } from "@/services/externals/cplx-api/remote-resources/pplx-language-models/predicates"; + +declare module "@/plugins/__async-deps__/async-loaders" { + interface AsyncLoadersRegistry { + "plugin:thread:messageCompletionNotification": void; + } +} + +export default function () { + AsyncLoaderRegistry.register({ + id: "plugin:thread:messageCompletionNotification", + dependencies: ["cache:pluginsEnableStates"], + loader: async ({ "cache:pluginsEnableStates": pluginsEnableStates }) => { + if (!pluginsEnableStates["thread:messageCompletionNotification"]) return; + + if (Notification.permission === "default") { + const permissionReq = await Notification.requestPermission(); + + if (permissionReq === "denied") { + toast({ + title: "Thread Message Completion Notification", + description: "Please enable notifications for this plugin to work", + }); + return; + } + } + + const schema = z.object({ + status: z.string(), + query_str: z.string().optional(), + display_model: z.string(), + }); + + NetworkInterceptMiddlewareManagerService.Root.updateMiddleware({ + id: "message-completion-notification", + async middlewareFn({ data, skip }) { + if (document.visibilityState === "visible") return skip(); + + const isSSEResponse = + data.type === "networkIntercept:fetchEvent" && + data.event === "response"; + + if ( + !isSSEResponse || + !data.payload.url.includes("/rest/sse/perplexity_ask") + ) { + return skip(); + } + + const [parsedData] = tryCatch(() => + schema.parse(JSON.parse(data.payload.data)), + ); + + if (parsedData == null) { + return skip(); + } + + if ( + !isSearchLanguageModelCode(parsedData.display_model) || + parsedData.status !== "COMPLETED" + ) { + return skip(); + } + + const queryStr = parsedData.query_str ?? document.title; + + const title = + queryStr.length > 100 ? queryStr.slice(0, 100) + "..." : queryStr; + + const notification = new Notification("Your answer is ready!", { + body: title, + icon: "https://www.google.com/s2/favicons?sz=128&domain=perplexity.ai", + }); + + notification.onclick = () => { + window.focus(); + notification.close(); + }; + + return skip(); + }, + }); + }, + }); +} diff --git a/perplexity/extension/src/plugins/thread-toc/store/utils.ts b/perplexity/extension/src/plugins/thread-toc/store/utils.ts index 4d2234b5c..1dc417016 100644 --- a/perplexity/extension/src/plugins/thread-toc/store/utils.ts +++ b/perplexity/extension/src/plugins/thread-toc/store/utils.ts @@ -190,7 +190,7 @@ const getActiveMessageBlockContentWrapper = (): HTMLElement | null => { const calculatePanelPosition = debounce( () => { - if (currentThreadWrapper == null || currentTocItems.length === 0) { + if (currentThreadWrapper == null || currentTocItems.length < 2) { threadTocStore.setState({ panelPosition: null }); return; } diff --git a/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/defaults.ts b/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/defaults.ts index 91a7b6256..96dbdfa8f 100644 --- a/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/defaults.ts +++ b/perplexity/extension/src/services/externals/cplx-api/versioned-remote-resources/dom-selectors/defaults.ts @@ -49,15 +49,12 @@ export const DOM_SELECTORS: DomSelectors = { FOOTER: ".gap-y-sm.md\\:gap-y-md.flex.flex-col > .flex.items-center.justify-between", FOOTER_CHILD: { - DISPLAY_MODEL_BUTTON: 'button:has(svg > use[*|href="#pplx-icon-cpu"])', - REWRITE_BUTTON: 'button:has(svg > use[*|href="#pplx-icon-repeat"])', - REWRITE_BUTTON_WRAPPER: - 'div:has(> span > button svg > use[*|href="#pplx-icon-repeat"])', - COPY_BUTTON: 'button:has(>div>div>svg>use[*|href="#pplx-icon-copy"])', - THUMBS_DOWN_BUTTON: - 'button:has(>div>div>svg>use[*|href="#pplx-icon-thumb-down"])', - MISC_BUTTON_WRAPPER: - 'div:has(>span>button svg > use[*|href="#pplx-icon-dots"])', + DISPLAY_MODEL_BUTTON: 'button:has(use[*|href="#pplx-icon-cpu"])', + REWRITE_BUTTON: 'button:has(use[*|href="#pplx-icon-repeat"])', + REWRITE_BUTTON_WRAPPER: 'button:has(use[*|href="#pplx-icon-repeat"])', + COPY_BUTTON: 'button:has(use[*|href="#pplx-icon-copy"])', + THUMBS_DOWN_BUTTON: 'button:has(use[*|href="#pplx-icon-thumb-down"])', + MISC_BUTTON_WRAPPER: 'div:has(>button use[*|href="#pplx-icon-dots"])', }, IMAGE_GEN: { HEADER: "div:has(+.gap-sm.grid.grid-cols-2)", @@ -103,10 +100,10 @@ export const DOM_SELECTORS: DomSelectors = { EDIT_QUERY: "div[contenteditable='true'][role='textbox']:not([id])", ARBITRARY: "#ask-input,div[contenteditable='true'][role='textbox']", }, - ATTACH_BUTTON: 'button:has(svg>use[*|href="#pplx-icon-paperclip"])', + ATTACH_BUTTON: 'button:has(use[*|href="#pplx-icon-paperclip"])', SUBMIT_BUTTON: - 'button[data-testid="submit-button"], button:has(>div>div>svg>path[d="M0 12.6663C0 13.4018 0.59792 13.9997 1.33333 13.9997C2.06875 13.9997 2.66667 13.4018 2.66667 12.6663V11.333C2.66667 10.5975 2.06875 9.99967 1.33333 9.99967C0.59792 9.99967 0 10.5975 0 11.333V12.6663ZM6.66667 5.33301C7.40213 5.33301 8 5.93087 8 6.66634V17.333C8 18.0685 7.40213 18.6663 6.66667 18.6663C5.9312 18.6663 5.33333 18.0685 5.33333 17.333V6.66634C5.33333 5.93087 5.9312 5.33301 6.66667 5.33301ZM10.6667 21.333C10.6667 22.0685 11.2645 22.6663 12 22.6663C12.7355 22.6663 13.3333 22.0685 13.3333 21.333V2.66634C13.3333 1.93093 12.7355 1.33301 12 1.33301C11.2645 1.33301 10.6667 1.93093 10.6667 2.66634V21.333ZM17.3333 5.33301C18.0688 5.33301 18.6667 5.93087 18.6667 6.66634V17.333C18.6667 18.0685 18.0688 18.6663 17.3333 18.6663C16.5979 18.6663 16 18.0685 16 17.333V6.66634C16 5.93087 16.5979 5.33301 17.3333 5.33301ZM24 11.333C24 10.5975 23.4021 9.99967 22.6667 9.99967C21.9312 9.99967 21.3333 10.5975 21.3333 11.333V12.6663C21.3333 13.4018 21.9312 13.9997 22.6667 13.9997C23.4021 13.9997 24 13.4018 24 12.6663V11.333Z"]), button:has(svg > use[*|href="#pplx-icon-git-fork"])', - FORK_BUTTON: 'button:has(svg > use[*|href="#pplx-icon-git-fork"])', + 'button[data-testid="submit-button"], button:has(>div>div>svg>path[d="M0 12.6663C0 13.4018 0.59792 13.9997 1.33333 13.9997C2.06875 13.9997 2.66667 13.4018 2.66667 12.6663V11.333C2.66667 10.5975 2.06875 9.99967 1.33333 9.99967C0.59792 9.99967 0 10.5975 0 11.333V12.6663ZM6.66667 5.33301C7.40213 5.33301 8 5.93087 8 6.66634V17.333C8 18.0685 7.40213 18.6663 6.66667 18.6663C5.9312 18.6663 5.33333 18.0685 5.33333 17.333V6.66634C5.33333 5.93087 5.9312 5.33301 6.66667 5.33301ZM10.6667 21.333C10.6667 22.0685 11.2645 22.6663 12 22.6663C12.7355 22.6663 13.3333 22.0685 13.3333 21.333V2.66634C13.3333 1.93093 12.7355 1.33301 12 1.33301C11.2645 1.33301 10.6667 1.93093 10.6667 2.66634V21.333ZM17.3333 5.33301C18.0688 5.33301 18.6667 5.93087 18.6667 6.66634V17.333C18.6667 18.0685 18.0688 18.6663 17.3333 18.6663C16.5979 18.6663 16 18.0685 16 17.333V6.66634C16 5.93087 16.5979 5.33301 17.3333 5.33301ZM24 11.333C24 10.5975 23.4021 9.99967 22.6667 9.99967C21.9312 9.99967 21.3333 10.5975 21.3333 11.333V12.6663C21.3333 13.4018 21.9312 13.9997 22.6667 13.9997C23.4021 13.9997 24 13.4018 24 12.6663V11.333Z"]), button:has(use[*|href="#pplx-icon-git-fork"])', + FORK_BUTTON: 'button:has(use[*|href="#pplx-icon-git-fork"])', PRO_SEARCH_TOGGLE: "button#copilot-toggle", INCOGNITO_TOGGLE: ".mr-xs.flex.shrink-0.items-center", TYPEAHEAD_MENU: "#typeahead-menu", From 1ea02229038dd3803aae16e271aae27e26328a8f Mon Sep 17 00:00:00 2001 From: Pham Ngoc Duong Date: Thu, 6 Nov 2025 10:59:51 +0700 Subject: [PATCH 16/85] chore: update deps --- package.json | 2 +- packages/async-dep-manager/package.json | 2 +- .../examples/extension/package.json | 2 +- packages/eslint-config/package.json | 2 +- packages/weasound/package.json | 2 +- perplexity/extension/changelogs/2.8.1.md | 3 + perplexity/extension/cli/package.json | 2 +- perplexity/extension/package.json | 14 +- .../extension/src/components/AsyncButton.tsx | 7 + .../src/components/icons/AtomicSimple.tsx | 20 - .../icons/{ByteDance..tsx => ByteDance.tsx} | 0 .../src/components/icons/FaArrowUpRight.tsx | 20 - .../src/components/icons/FaFileTypePdf.tsx | 29 - .../src/components/icons/FaLightBulbOn.tsx | 19 - .../src/components/icons/FaMarkdown.tsx | 24 - .../src/components/icons/FaPencilSquare.tsx | 18 - .../src/components/icons/MdiWrapDisabled.tsx | 19 - .../src/components/icons/MistralAiIcon.tsx | 45 -- .../src/components/icons/PlaygroundAiIcon.tsx | 23 - .../src/components/icons/PplxRewrite.tsx | 20 - .../FullScreenReleaseNotesPage.tsx | 3 - .../routes/Home/CometAffiliateDialog.tsx | 5 +- .../routes/Settings/SettingsDashboardLink.tsx | 5 +- .../CopyButton.tsx | 4 +- .../ThreadBetterRewriteDropdown.tsx | 5 +- .../plugins/thread-export/export-options.ts | 9 +- .../_locales/index.ts | 13 + ...d-message-completion-notification.bn-BD.ts | 5 + ...d-message-completion-notification.cs-CZ.ts | 5 + ...d-message-completion-notification.de-DE.ts | 5 + ...d-message-completion-notification.el-GR.ts | 5 + ...d-message-completion-notification.en-US.ts | 5 + ...d-message-completion-notification.es-ES.ts | 5 + ...d-message-completion-notification.fr-FR.ts | 5 + ...d-message-completion-notification.hi-IN.ts | 5 + ...d-message-completion-notification.hr-HR.ts | 5 + ...d-message-completion-notification.hu-HU.ts | 5 + ...d-message-completion-notification.id-ID.ts | 5 + ...d-message-completion-notification.it-IT.ts | 5 + ...d-message-completion-notification.ja-JP.ts | 5 + ...d-message-completion-notification.ko-KR.ts | 5 + ...d-message-completion-notification.nl-NL.ts | 5 + ...d-message-completion-notification.pl-PL.ts | 5 + ...d-message-completion-notification.pt-BR.ts | 5 + ...d-message-completion-notification.pt-PT.ts | 5 + ...d-message-completion-notification.ro-RO.ts | 5 + ...d-message-completion-notification.ru-RU.ts | 5 + ...d-message-completion-notification.sk-SK.ts | 5 + ...sage-completion-notification.sr-Cyrl-ME.ts | 5 + ...d-message-completion-notification.zh-CN.ts | 5 + ...d-message-completion-notification.zh-TW.ts | 5 + .../loader.ts | 11 +- .../pplx-image-models/icons.tsx | 2 +- pnpm-lock.yaml | 611 +++++++++--------- pnpm-workspace.yaml | 2 +- 55 files changed, 496 insertions(+), 567 deletions(-) create mode 100644 perplexity/extension/changelogs/2.8.1.md delete mode 100644 perplexity/extension/src/components/icons/AtomicSimple.tsx rename perplexity/extension/src/components/icons/{ByteDance..tsx => ByteDance.tsx} (100%) delete mode 100644 perplexity/extension/src/components/icons/FaArrowUpRight.tsx delete mode 100644 perplexity/extension/src/components/icons/FaFileTypePdf.tsx delete mode 100644 perplexity/extension/src/components/icons/FaLightBulbOn.tsx delete mode 100644 perplexity/extension/src/components/icons/FaMarkdown.tsx delete mode 100644 perplexity/extension/src/components/icons/FaPencilSquare.tsx delete mode 100644 perplexity/extension/src/components/icons/MdiWrapDisabled.tsx delete mode 100644 perplexity/extension/src/components/icons/MistralAiIcon.tsx delete mode 100644 perplexity/extension/src/components/icons/PlaygroundAiIcon.tsx delete mode 100644 perplexity/extension/src/components/icons/PplxRewrite.tsx create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/_locales/index.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.bn-BD.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.cs-CZ.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.de-DE.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.el-GR.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.en-US.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.es-ES.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.fr-FR.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.hi-IN.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.hr-HR.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.hu-HU.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.id-ID.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.it-IT.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.ja-JP.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.ko-KR.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.nl-NL.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.pl-PL.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.pt-BR.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.pt-PT.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.ro-RO.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.ru-RU.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.sk-SK.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.sr-Cyrl-ME.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.zh-CN.ts create mode 100644 perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.zh-TW.ts diff --git a/package.json b/package.json index 8d6bbf276..9cbc67436 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "turbo": "^2.6.0", "typescript": "catalog:types" }, - "packageManager": "pnpm@10.19.0", + "packageManager": "pnpm@10.20.0", "engines": { "node": "^22.12.0" }, diff --git a/packages/async-dep-manager/package.json b/packages/async-dep-manager/package.json index 124734693..263c93833 100644 --- a/packages/async-dep-manager/package.json +++ b/packages/async-dep-manager/package.json @@ -29,6 +29,6 @@ "tsup": "^8.5.0", "typescript": "catalog:types", "typescript-eslint": "catalog:lint", - "vitest": "^4.0.6" + "vitest": "^4.0.7" } } diff --git a/packages/comctx-adapters/examples/extension/package.json b/packages/comctx-adapters/examples/extension/package.json index edfdb733f..a3152326d 100644 --- a/packages/comctx-adapters/examples/extension/package.json +++ b/packages/comctx-adapters/examples/extension/package.json @@ -26,6 +26,6 @@ "prettier": "catalog:lint", "typescript": "catalog:types", "typescript-eslint": "catalog:lint", - "vite": "^7.1.12" + "vite": "^7.2.0" } } diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index 7cec2119a..38d6c2cfa 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -7,7 +7,7 @@ ".": "./index.js" }, "devDependencies": { - "@eslint/js": "9.38.0", + "@eslint/js": "^9.39.1", "@limegrass/eslint-plugin-import-alias": "^1.6.0", "@typescript-eslint/utils": "^8.46.3", "eslint": "catalog:lint", diff --git a/packages/weasound/package.json b/packages/weasound/package.json index d8098dc5f..d6bef55d3 100644 --- a/packages/weasound/package.json +++ b/packages/weasound/package.json @@ -35,7 +35,7 @@ "@types/node": "22.17.2", "libav.js": "4.5.6", "prettier": "catalog:lint", - "terser": "^5.44.0", + "terser": "^5.44.1", "tsup": "^8.5.0", "typescript": "catalog:types" }, diff --git a/perplexity/extension/changelogs/2.8.1.md b/perplexity/extension/changelogs/2.8.1.md new file mode 100644 index 000000000..51c735e35 --- /dev/null +++ b/perplexity/extension/changelogs/2.8.1.md @@ -0,0 +1,3 @@ +## Misc + +- Stability improvements diff --git a/perplexity/extension/cli/package.json b/perplexity/extension/cli/package.json index 398a23442..a482641af 100644 --- a/perplexity/extension/cli/package.json +++ b/perplexity/extension/cli/package.json @@ -14,7 +14,7 @@ "r2:versioned-rr:gen": "dotenvx run -f ./src/r2/.env --quiet -- bun ./src/r2/remote-resources/versioned.ts" }, "dependencies": { - "@aws-sdk/client-s3": "^3.922.0", + "@aws-sdk/client-s3": "^3.925.0", "@dotenvx/dotenvx": "^1.51.1", "chrome-webstore-upload": "^4.0.3", "commander": "^14.0.2", diff --git a/perplexity/extension/package.json b/perplexity/extension/package.json index a48cd494e..1b852aca9 100644 --- a/perplexity/extension/package.json +++ b/perplexity/extension/package.json @@ -1,6 +1,6 @@ { "name": "pplx-ext", - "version": "2.8.0", + "version": "2.8.2", "author": "pnd280", "type": "module", "scripts": { @@ -45,10 +45,10 @@ "@hookform/resolvers": "^5.2.2", "@radix-ui/react-collapsible": "^1.1.12", "@radix-ui/react-scroll-area": "^1.2.10", - "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-slot": "^1.2.4", "@radix-ui/react-toast": "^1.2.15", - "@tanstack/react-query": "^5.90.6", - "@tanstack/react-query-persist-client": "^5.90.8", + "@tanstack/react-query": "^5.90.7", + "@tanstack/react-query-persist-client": "^5.90.9", "@uidotdev/usehooks": "^2.4.1", "@webext-core/match-patterns": "^1.0.3", "@wxt-dev/storage": "^1.2.6", @@ -125,7 +125,7 @@ "@types/react-syntax-highlighter": "^15.5.13", "@types/semver": "^7.7.1", "@vitejs/plugin-react": "^5.1.0", - "@vitest/ui": "^4.0.6", + "@vitest/ui": "^4.0.7", "babel-plugin-react-compiler": "^1.0.0", "browserslist": "^4.27.0", "caniuse-lite": "^1.0.30001753", @@ -150,8 +150,8 @@ "typescript-eslint": "catalog:lint", "unimport": "^5.5.0", "unplugin-icons": "^22.5.0", - "vite": "^7.1.12", - "vitest": "^4.0.6" + "vite": "^7.2.0", + "vitest": "^4.0.7" }, "engines": { "node": "^22.12.0" diff --git a/perplexity/extension/src/components/AsyncButton.tsx b/perplexity/extension/src/components/AsyncButton.tsx index f9211d2a4..90337d103 100644 --- a/perplexity/extension/src/components/AsyncButton.tsx +++ b/perplexity/extension/src/components/AsyncButton.tsx @@ -2,6 +2,7 @@ import type { ReactNode } from "react"; import type { ButtonProps } from "@/components/ui/button"; import { Button } from "@/components/ui/button"; +import { toast } from "@/components/ui/use-toast"; type AsyncButtonProps = Omit & { onClick: () => Promise; @@ -21,6 +22,12 @@ export default function AsyncButton({ setIsLoading(true); try { await onClick(); + } catch (error) { + toast({ + title: "Error", + description: + error instanceof Error ? error.message : "An unknown error occurred", + }); } finally { setIsLoading(false); } diff --git a/perplexity/extension/src/components/icons/AtomicSimple.tsx b/perplexity/extension/src/components/icons/AtomicSimple.tsx deleted file mode 100644 index 0d7f2b836..000000000 --- a/perplexity/extension/src/components/icons/AtomicSimple.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import type { SVGProps } from "react"; - -export default function AtomicSimple({ ...props }: SVGProps) { - return ( - - ); -} diff --git a/perplexity/extension/src/components/icons/ByteDance..tsx b/perplexity/extension/src/components/icons/ByteDance.tsx similarity index 100% rename from perplexity/extension/src/components/icons/ByteDance..tsx rename to perplexity/extension/src/components/icons/ByteDance.tsx diff --git a/perplexity/extension/src/components/icons/FaArrowUpRight.tsx b/perplexity/extension/src/components/icons/FaArrowUpRight.tsx deleted file mode 100644 index cca5ee072..000000000 --- a/perplexity/extension/src/components/icons/FaArrowUpRight.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import type { SVGProps } from "react"; - -export default function FaArrowUpRight({ ...props }: SVGProps) { - return ( - - ); -} diff --git a/perplexity/extension/src/components/icons/FaFileTypePdf.tsx b/perplexity/extension/src/components/icons/FaFileTypePdf.tsx deleted file mode 100644 index 4ccc1e6e4..000000000 --- a/perplexity/extension/src/components/icons/FaFileTypePdf.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import type { SVGProps } from "react"; - -export default function FaFileTypePdf({ - className, - ...props -}: SVGProps) { - return ( - - - - - - - - - ); -} diff --git a/perplexity/extension/src/components/icons/FaLightBulbOn.tsx b/perplexity/extension/src/components/icons/FaLightBulbOn.tsx deleted file mode 100644 index 9aaada202..000000000 --- a/perplexity/extension/src/components/icons/FaLightBulbOn.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import type { SVGProps } from "react"; - -export default function FaLightBulbOn({ ...props }: SVGProps) { - return ( - - - - ); -} diff --git a/perplexity/extension/src/components/icons/FaMarkdown.tsx b/perplexity/extension/src/components/icons/FaMarkdown.tsx deleted file mode 100644 index 1a44a1cf5..000000000 --- a/perplexity/extension/src/components/icons/FaMarkdown.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import type { SVGProps } from "react"; - -const FaMarkdown = (props: SVGProps) => { - return ( - - - - - - ); -}; - -export default FaMarkdown; diff --git a/perplexity/extension/src/components/icons/FaPencilSquare.tsx b/perplexity/extension/src/components/icons/FaPencilSquare.tsx deleted file mode 100644 index 01af0434d..000000000 --- a/perplexity/extension/src/components/icons/FaPencilSquare.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import type { SVGProps } from "react"; - -export default function FaPencilSquare(props: SVGProps) { - return ( - - - - ); -} diff --git a/perplexity/extension/src/components/icons/MdiWrapDisabled.tsx b/perplexity/extension/src/components/icons/MdiWrapDisabled.tsx deleted file mode 100644 index a769b6aa4..000000000 --- a/perplexity/extension/src/components/icons/MdiWrapDisabled.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import type { SVGProps } from "react"; - -export function MdiWrapDisabled(props: SVGProps) { - return ( - - {/* Icon from Material Design Icons by Pictogrammers - https://github.com/Templarian/MaterialDesign/blob/master/LICENSE */} - - - ); -} diff --git a/perplexity/extension/src/components/icons/MistralAiIcon.tsx b/perplexity/extension/src/components/icons/MistralAiIcon.tsx deleted file mode 100644 index 24201d465..000000000 --- a/perplexity/extension/src/components/icons/MistralAiIcon.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import type { SVGProps } from "react"; - -export default function MistralAiIcon({ ...props }: SVGProps) { - return ( - - - - - - - - - - - - - - - - - - - ); -} diff --git a/perplexity/extension/src/components/icons/PlaygroundAiIcon.tsx b/perplexity/extension/src/components/icons/PlaygroundAiIcon.tsx deleted file mode 100644 index 4bc73223b..000000000 --- a/perplexity/extension/src/components/icons/PlaygroundAiIcon.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import type { SVGProps } from "react"; - -export default function PlaygroundAiIcon({ - ...props -}: SVGProps) { - return ( - - - - ); -} diff --git a/perplexity/extension/src/components/icons/PplxRewrite.tsx b/perplexity/extension/src/components/icons/PplxRewrite.tsx deleted file mode 100644 index 9f05524c7..000000000 --- a/perplexity/extension/src/components/icons/PplxRewrite.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import type { SVGProps } from "react"; - -export default function PplxRewrite(props: SVGProps) { - return ( - - - - - ); -} diff --git a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/release-notes/FullScreenReleaseNotesPage.tsx b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/release-notes/FullScreenReleaseNotesPage.tsx index dbb484e81..6e8444116 100644 --- a/perplexity/extension/src/entrypoints/options-page/dashboard/pages/release-notes/FullScreenReleaseNotesPage.tsx +++ b/perplexity/extension/src/entrypoints/options-page/dashboard/pages/release-notes/FullScreenReleaseNotesPage.tsx @@ -53,9 +53,6 @@ export function FullScreenReleaseNotesPage() {
-

- Support future development -

{cometAffiliateConfig.enabled && (
diff --git a/perplexity/extension/src/plugins/__ui-groups__/routes/Home/CometAffiliateDialog.tsx b/perplexity/extension/src/plugins/__ui-groups__/routes/Home/CometAffiliateDialog.tsx index 8d285083c..f960830cc 100644 --- a/perplexity/extension/src/plugins/__ui-groups__/routes/Home/CometAffiliateDialog.tsx +++ b/perplexity/extension/src/plugins/__ui-groups__/routes/Home/CometAffiliateDialog.tsx @@ -42,7 +42,8 @@ export default function CometAffiliateDialog() { return ( setDismissed(true)} @@ -81,7 +82,7 @@ export default function CometAffiliateDialog() { > Comet Invitation diff --git a/perplexity/extension/src/plugins/__ui-groups__/routes/Settings/SettingsDashboardLink.tsx b/perplexity/extension/src/plugins/__ui-groups__/routes/Settings/SettingsDashboardLink.tsx index e80295cf5..529f65871 100644 --- a/perplexity/extension/src/plugins/__ui-groups__/routes/Settings/SettingsDashboardLink.tsx +++ b/perplexity/extension/src/plugins/__ui-groups__/routes/Settings/SettingsDashboardLink.tsx @@ -1,11 +1,12 @@ import Cplx from "@/components/icons/Cplx"; -import FaArrowUpRight from "@/components/icons/FaArrowUpRight"; import { Portal } from "@/components/ui/portal"; import { useIsMobileStore } from "@/hooks/is-mobile-store"; import { useSettingsPageDomObserverStore } from "@/plugins/__core__/dom-observers/settings-page/store"; import { DomSelectorsService } from "@/plugins/__core__/dom-selectors/service-init.loader"; import { ContentScriptBgUtilsService } from "@/services/features/content-script-utils/service-init.bg-worker"; +import TablerArrowUpRight from "~icons/tabler/arrow-up-right"; + export function SettingsDashboardLink() { const isMobile = useIsMobileStore((store) => store.isMobile); @@ -59,7 +60,7 @@ export function SettingsDashboardLink() {
Complexity
- +
); diff --git a/perplexity/extension/src/plugins/thread-better-message-copy-buttons/CopyButton.tsx b/perplexity/extension/src/plugins/thread-better-message-copy-buttons/CopyButton.tsx index f4bd156b6..458d90d56 100644 --- a/perplexity/extension/src/plugins/thread-better-message-copy-buttons/CopyButton.tsx +++ b/perplexity/extension/src/plugins/thread-better-message-copy-buttons/CopyButton.tsx @@ -1,4 +1,3 @@ -import FaMarkdown from "@/components/icons/FaMarkdown"; import Tooltip from "@/components/Tooltip"; import { DropdownMenu, @@ -14,6 +13,7 @@ import TablerCheck from "~icons/tabler/check"; import TablerCopy from "~icons/tabler/copy"; import TablerLinkOff from "~icons/tabler/link-off"; import TablerLoaderCircle from "~icons/tabler/loader-2"; +import TablerMarkdown from "~icons/tabler/markdown"; type CopyButtonProps = { messageBlockIndex: number; @@ -71,7 +71,7 @@ const CopyButton = memo(function CopyButton({ value={"with-citations" satisfies CopyOptions} className="x:flex x:items-center x:gap-2" > - + {t("plugin-better-copy-buttons.options.default")} - +
diff --git a/perplexity/extension/src/plugins/thread-export/export-options.ts b/perplexity/extension/src/plugins/thread-export/export-options.ts index 15d54197d..625d95ecf 100644 --- a/perplexity/extension/src/plugins/thread-export/export-options.ts +++ b/perplexity/extension/src/plugins/thread-export/export-options.ts @@ -1,19 +1,18 @@ -import FaFileTypePdf from "@/components/icons/FaFileTypePdf"; -import FaMarkdown from "@/components/icons/FaMarkdown"; - import TablerBrandHtml5 from "~icons/tabler/brand-html5"; +import TablerFileTypePdf from "~icons/tabler/file-type-pdf"; +import TablerMarkdown from "~icons/tabler/markdown"; export const EXPORT_OPTIONS = [ { label: "Markdown", value: "markdown", - icon: FaMarkdown, + icon: TablerMarkdown, isDisabled: false, }, { label: "PDF (soon)", value: "pdf", - icon: FaFileTypePdf, + icon: TablerFileTypePdf, isDisabled: true, }, { diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/index.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/index.ts new file mode 100644 index 000000000..e48db0f41 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/index.ts @@ -0,0 +1,13 @@ +import type { TranslationShape } from "@complexity/i18n"; + +import type translations from "@/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.en-US"; + +export const namespace = "plugin-thread-message-completion-notification"; + +export type Translations = TranslationShape; + +declare module "@complexity/i18n" { + interface TranslationsRegistry { + [namespace]: typeof translations; + } +} diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.bn-BD.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.bn-BD.ts new file mode 100644 index 000000000..2fb166e31 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.bn-BD.ts @@ -0,0 +1,5 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + answerIsReady: "আপনার উত্তর প্রস্তুত!", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.cs-CZ.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.cs-CZ.ts new file mode 100644 index 000000000..ec5d5a48f --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.cs-CZ.ts @@ -0,0 +1,5 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + answerIsReady: "Vaše odpověď je připravena!", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.de-DE.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.de-DE.ts new file mode 100644 index 000000000..315d78f52 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.de-DE.ts @@ -0,0 +1,5 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + answerIsReady: "Ihre Antwort ist bereit!", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.el-GR.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.el-GR.ts new file mode 100644 index 000000000..19be43abb --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.el-GR.ts @@ -0,0 +1,5 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + answerIsReady: "Η απάντησή σας είναι έτοιμη!", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.en-US.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.en-US.ts new file mode 100644 index 000000000..1e1bb9558 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.en-US.ts @@ -0,0 +1,5 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + answerIsReady: "Your answer is ready!", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.es-ES.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.es-ES.ts new file mode 100644 index 000000000..a0a034dda --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.es-ES.ts @@ -0,0 +1,5 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + answerIsReady: "¡Tu respuesta está lista!", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.fr-FR.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.fr-FR.ts new file mode 100644 index 000000000..39031171d --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.fr-FR.ts @@ -0,0 +1,5 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + answerIsReady: "Votre réponse est prête !", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.hi-IN.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.hi-IN.ts new file mode 100644 index 000000000..0f939b926 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.hi-IN.ts @@ -0,0 +1,5 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + answerIsReady: "आपका उत्तर तैयार है!", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.hr-HR.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.hr-HR.ts new file mode 100644 index 000000000..60a786f28 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.hr-HR.ts @@ -0,0 +1,5 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + answerIsReady: "Vaš odgovor je spreman!", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.hu-HU.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.hu-HU.ts new file mode 100644 index 000000000..7afd486b9 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.hu-HU.ts @@ -0,0 +1,5 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + answerIsReady: "A válasza kész!", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.id-ID.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.id-ID.ts new file mode 100644 index 000000000..337d2f11c --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.id-ID.ts @@ -0,0 +1,5 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + answerIsReady: "Jawaban Anda sudah siap!", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.it-IT.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.it-IT.ts new file mode 100644 index 000000000..a11e995e2 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.it-IT.ts @@ -0,0 +1,5 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + answerIsReady: "La tua risposta è pronta!", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.ja-JP.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.ja-JP.ts new file mode 100644 index 000000000..74c210463 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.ja-JP.ts @@ -0,0 +1,5 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + answerIsReady: "回答の準備ができました!", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.ko-KR.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.ko-KR.ts new file mode 100644 index 000000000..0f44b2390 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.ko-KR.ts @@ -0,0 +1,5 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + answerIsReady: "답변이 준비되었습니다!", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.nl-NL.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.nl-NL.ts new file mode 100644 index 000000000..9700219ef --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.nl-NL.ts @@ -0,0 +1,5 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + answerIsReady: "Uw antwoord is klaar!", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.pl-PL.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.pl-PL.ts new file mode 100644 index 000000000..883a3bd49 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.pl-PL.ts @@ -0,0 +1,5 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + answerIsReady: "Twoja odpowiedź jest gotowa!", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.pt-BR.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.pt-BR.ts new file mode 100644 index 000000000..3c64f683b --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.pt-BR.ts @@ -0,0 +1,5 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + answerIsReady: "Sua resposta está pronta!", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.pt-PT.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.pt-PT.ts new file mode 100644 index 000000000..6dd46621a --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.pt-PT.ts @@ -0,0 +1,5 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + answerIsReady: "A sua resposta está pronta!", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.ro-RO.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.ro-RO.ts new file mode 100644 index 000000000..a0c9f6293 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.ro-RO.ts @@ -0,0 +1,5 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + answerIsReady: "Răspunsul dvs. este gata!", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.ru-RU.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.ru-RU.ts new file mode 100644 index 000000000..e0c686ea0 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.ru-RU.ts @@ -0,0 +1,5 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + answerIsReady: "Ваш ответ готов!", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.sk-SK.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.sk-SK.ts new file mode 100644 index 000000000..f677b9996 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.sk-SK.ts @@ -0,0 +1,5 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + answerIsReady: "Vaša odpoveď je pripravená!", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.sr-Cyrl-ME.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.sr-Cyrl-ME.ts new file mode 100644 index 000000000..ef0cedb4b --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.sr-Cyrl-ME.ts @@ -0,0 +1,5 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + answerIsReady: "Ваш одговор је спреман!", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.zh-CN.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.zh-CN.ts new file mode 100644 index 000000000..0005f7edc --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.zh-CN.ts @@ -0,0 +1,5 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + answerIsReady: "您的答案已准备就绪!", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.zh-TW.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.zh-TW.ts new file mode 100644 index 000000000..692ad0767 --- /dev/null +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/_locales/plugin-thread-message-completion-notification.zh-TW.ts @@ -0,0 +1,5 @@ +import { type LanguageMessages } from "@complexity/i18n"; + +export default { + answerIsReady: "您的答案已準備就緒!", +} as const satisfies LanguageMessages; diff --git a/perplexity/extension/src/plugins/thread-message-completion-notification/loader.ts b/perplexity/extension/src/plugins/thread-message-completion-notification/loader.ts index ab7c73ec4..8a2a24d28 100644 --- a/perplexity/extension/src/plugins/thread-message-completion-notification/loader.ts +++ b/perplexity/extension/src/plugins/thread-message-completion-notification/loader.ts @@ -72,10 +72,13 @@ export default function () { const title = queryStr.length > 100 ? queryStr.slice(0, 100) + "..." : queryStr; - const notification = new Notification("Your answer is ready!", { - body: title, - icon: "https://www.google.com/s2/favicons?sz=128&domain=perplexity.ai", - }); + const notification = new Notification( + t("plugin-thread-message-completion-notification.answerIsReady"), + { + body: title, + icon: "https://www.google.com/s2/favicons?sz=128&domain=perplexity.ai", + }, + ); notification.onclick = () => { window.focus(); diff --git a/perplexity/extension/src/services/externals/cplx-api/remote-resources/pplx-image-models/icons.tsx b/perplexity/extension/src/services/externals/cplx-api/remote-resources/pplx-image-models/icons.tsx index 0915367d7..9b04d77ae 100644 --- a/perplexity/extension/src/services/externals/cplx-api/remote-resources/pplx-image-models/icons.tsx +++ b/perplexity/extension/src/services/externals/cplx-api/remote-resources/pplx-image-models/icons.tsx @@ -1,5 +1,5 @@ import BlackForestLabs from "@/components/icons/BlackForestLabsIcon"; -import { IconParkOutlineBytedance } from "@/components/icons/ByteDance."; +import { IconParkOutlineBytedance } from "@/components/icons/ByteDance"; import type { ImageModel } from "@/services/externals/cplx-api/remote-resources/pplx-image-models/types"; import SiGoogleGemini from "~icons/simple-icons/googlegemini"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0f262099e..71089441a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,8 +7,8 @@ settings: catalogs: lint: eslint: - specifier: 9.38.0 - version: 9.38.0 + specifier: ^9.39.1 + version: 9.39.1 prettier: specifier: ^3.6.2 version: 3.6.2 @@ -59,7 +59,7 @@ importers: version: 22.17.2 eslint: specifier: catalog:lint - version: 9.38.0(jiti@2.6.1) + version: 9.39.1(jiti@2.6.1) globals: specifier: 16.5.0 version: 16.5.0 @@ -74,16 +74,16 @@ importers: version: 5.9.3 typescript-eslint: specifier: catalog:lint - version: 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) vitest: - specifier: ^4.0.6 - version: 4.0.6(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) + specifier: ^4.0.7 + version: 4.0.7(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.7)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.1) packages/cli-logger: dependencies: eslint: specifier: catalog:lint - version: 9.38.0(jiti@2.6.1) + version: 9.39.1(jiti@2.6.1) devDependencies: '@complexity/typescript-config': specifier: workspace:* @@ -127,7 +127,7 @@ importers: version: 22.17.2 eslint: specifier: catalog:lint - version: 9.38.0(jiti@2.6.1) + version: 9.39.1(jiti@2.6.1) globals: specifier: 16.5.0 version: 16.5.0 @@ -139,7 +139,7 @@ importers: version: 5.9.3 typescript-eslint: specifier: catalog:lint - version: 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) packages/comctx-adapters/examples/extension: dependencies: @@ -167,7 +167,7 @@ importers: version: 22.17.2 eslint: specifier: catalog:lint - version: 9.38.0(jiti@2.6.1) + version: 9.39.1(jiti@2.6.1) globals: specifier: 16.5.0 version: 16.5.0 @@ -179,52 +179,52 @@ importers: version: 5.9.3 typescript-eslint: specifier: catalog:lint - version: 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) vite: - specifier: ^7.1.12 - version: 7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) + specifier: ^7.2.0 + version: 7.2.0(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.1) packages/eslint-config: devDependencies: '@eslint/js': - specifier: 9.38.0 - version: 9.38.0 + specifier: ^9.39.1 + version: 9.39.1 '@limegrass/eslint-plugin-import-alias': specifier: ^1.6.0 - version: 1.6.0(eslint@9.38.0(jiti@2.6.1)) + version: 1.6.0(eslint@9.39.1(jiti@2.6.1)) '@typescript-eslint/utils': specifier: ^8.46.3 - version: 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: specifier: catalog:lint - version: 9.38.0(jiti@2.6.1) + version: 9.39.1(jiti@2.6.1) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@9.38.0(jiti@2.6.1)) + version: 10.1.8(eslint@9.39.1(jiti@2.6.1)) eslint-import-resolver-typescript: specifier: 4.4.4 - version: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.38.0(jiti@2.6.1)) + version: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)) + version: 2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.38.0(jiti@2.6.1)) + version: 7.37.5(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-react-hooks: specifier: ^7.0.1 - version: 7.0.1(eslint@9.38.0(jiti@2.6.1)) + version: 7.0.1(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-react-refresh: specifier: ^0.4.24 - version: 0.4.24(eslint@9.38.0(jiti@2.6.1)) + version: 0.4.24(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-unicorn: specifier: 62.0.0 - version: 62.0.0(eslint@9.38.0(jiti@2.6.1)) + version: 62.0.0(eslint@9.39.1(jiti@2.6.1)) globals: specifier: 16.5.0 version: 16.5.0 typescript-eslint: specifier: catalog:lint - version: 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) packages/i18n: dependencies: @@ -252,7 +252,7 @@ importers: version: 19.2.2(@types/react@19.2.2) eslint: specifier: catalog:lint - version: 9.38.0(jiti@2.6.1) + version: 9.39.1(jiti@2.6.1) globals: specifier: 16.5.0 version: 16.5.0 @@ -267,19 +267,19 @@ importers: version: 5.9.3 typescript-eslint: specifier: catalog:lint - version: 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) packages/typescript-config: dependencies: eslint: specifier: catalog:lint - version: 9.38.0(jiti@2.6.1) + version: 9.39.1(jiti@2.6.1) packages/weasound: dependencies: eslint: specifier: catalog:lint - version: 9.38.0(jiti@2.6.1) + version: 9.39.1(jiti@2.6.1) devDependencies: '@complexity/typescript-config': specifier: workspace:* @@ -294,8 +294,8 @@ importers: specifier: catalog:lint version: 3.6.2 terser: - specifier: ^5.44.0 - version: 5.44.0 + specifier: ^5.44.1 + version: 5.44.1 tsup: specifier: ^8.5.0 version: 8.5.0(@swc/core@1.13.19(@swc/helpers@0.5.17))(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3)(yaml@2.8.1) @@ -333,17 +333,17 @@ importers: specifier: ^1.2.10 version: 1.2.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@radix-ui/react-slot': - specifier: ^1.2.3 - version: 1.2.3(@types/react@19.2.2)(react@19.2.0) + specifier: ^1.2.4 + version: 1.2.4(@types/react@19.2.2)(react@19.2.0) '@radix-ui/react-toast': specifier: ^1.2.15 version: 1.2.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tanstack/react-query': - specifier: ^5.90.6 - version: 5.90.6(react@19.2.0) + specifier: ^5.90.7 + version: 5.90.7(react@19.2.0) '@tanstack/react-query-persist-client': - specifier: ^5.90.8 - version: 5.90.8(@tanstack/react-query@5.90.6(react@19.2.0))(react@19.2.0) + specifier: ^5.90.9 + version: 5.90.9(@tanstack/react-query@5.90.7(react@19.2.0))(react@19.2.0) '@uidotdev/usehooks': specifier: ^2.4.1 version: 2.4.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -521,13 +521,13 @@ importers: version: 0.5.19(tailwindcss@4.1.16) '@tailwindcss/vite': specifier: ^4.1.16 - version: 4.1.16(vite@7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)) + version: 4.1.16(vite@7.2.0(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.1)) '@tanstack/eslint-plugin-query': specifier: ^5.91.2 - version: 5.91.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + version: 5.91.2(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@tanstack/react-query-devtools': specifier: ^5.90.2 - version: 5.90.2(@tanstack/react-query@5.90.6(react@19.2.0))(react@19.2.0) + version: 5.90.2(@tanstack/react-query@5.90.7(react@19.2.0))(react@19.2.0) '@types/chrome': specifier: catalog:types version: 0.1.27 @@ -566,10 +566,10 @@ importers: version: 7.7.1 '@vitejs/plugin-react': specifier: ^5.1.0 - version: 5.1.0(vite@7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)) + version: 5.1.0(vite@7.2.0(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.1)) '@vitest/ui': - specifier: ^4.0.6 - version: 4.0.6(vitest@4.0.6) + specifier: ^4.0.7 + version: 4.0.7(vitest@4.0.7) babel-plugin-react-compiler: specifier: ^1.0.0 version: 1.0.0 @@ -584,10 +584,10 @@ importers: version: 5.6.2 eslint: specifier: catalog:lint - version: 9.38.0(jiti@2.6.1) + version: 9.39.1(jiti@2.6.1) eslint-plugin-boundaries: specifier: ^5.1.0 - version: 5.1.0(@typescript-eslint/parser@8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1)) + version: 5.1.0(eslint@9.39.1(jiti@2.6.1)) glob: specifier: ^11.0.3 version: 11.0.3 @@ -635,7 +635,7 @@ importers: version: 5.9.3 typescript-eslint: specifier: catalog:lint - version: 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) unimport: specifier: ^5.5.0 version: 5.5.0 @@ -643,17 +643,17 @@ importers: specifier: ^22.5.0 version: 22.5.0(@svgr/core@8.1.0(typescript@5.9.3)) vite: - specifier: ^7.1.12 - version: 7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) + specifier: ^7.2.0 + version: 7.2.0(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.1) vitest: - specifier: ^4.0.6 - version: 4.0.6(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) + specifier: ^4.0.7 + version: 4.0.7(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.7)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.1) perplexity/extension/cli: dependencies: '@aws-sdk/client-s3': - specifier: ^3.922.0 - version: 3.922.0 + specifier: ^3.925.0 + version: 3.925.0 '@dotenvx/dotenvx': specifier: ^1.51.1 version: 1.51.1 @@ -696,7 +696,7 @@ importers: version: 22.17.2 eslint: specifier: catalog:lint - version: 9.38.0(jiti@2.6.1) + version: 9.39.1(jiti@2.6.1) prettier: specifier: catalog:lint version: 3.6.2 @@ -705,7 +705,7 @@ importers: version: 5.9.3 typescript-eslint: specifier: catalog:lint - version: 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) packages: @@ -744,12 +744,12 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-s3@3.922.0': - resolution: {integrity: sha512-SZRaZUUAHCWfEyBf4SRSPd29ko4uFoJpfd0E/w1meE68XhFB52FTtz/71UqYcwqZmN+s7oUNFFZT+DE/dnQSEA==} + '@aws-sdk/client-s3@3.925.0': + resolution: {integrity: sha512-imAul+6pyJYH4cbxPz1OiFXxrKKTRqVzlT2e0M6zbPHmUcJsF5E+b+4qvHQChU8wFGtIWJHH/JChF2ibfTnXdA==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.922.0': - resolution: {integrity: sha512-jdHs7uy7cSpiMvrxhYmqHyJxgK7hyqw4plG8OQ4YTBpq0SbfAxdoOuOkwJ1IVUUQho4otR1xYYjiX/8e8J8qwQ==} + '@aws-sdk/client-sso@3.925.0': + resolution: {integrity: sha512-ixC9CyXe/mBo1X+bzOxIIzsdBYzM+klWoHUYzwnPMrXhpDrMjj8D24R/FPqrDnhoYYXiyS4BApRLpeymsFJq2Q==} engines: {node: '>=18.0.0'} '@aws-sdk/core@3.922.0': @@ -764,24 +764,24 @@ packages: resolution: {integrity: sha512-i72DgHMK7ydAEqdzU0Duqh60Q8W59EZmRJ73y0Y5oFmNOqnYsAI+UXyOoCsubp+Dkr6+yOwAn1gPt1XGE9Aowg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.922.0': - resolution: {integrity: sha512-bVF+pI5UCLNkvbiZr/t2fgTtv84s8FCdOGAPxQiQcw5qOZywNuuCCY3wIIchmQr6GJr8YFkEp5LgDCac5EC5aQ==} + '@aws-sdk/credential-provider-ini@3.925.0': + resolution: {integrity: sha512-TOs/UkKWwXrSPolRTChpDUQjczw6KqbbanF0EzjUm3sp/AS1ThOQCKuTTdaOBZXkCIJdvRmZjF3adccE3rAoXg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.922.0': - resolution: {integrity: sha512-agCwaD6mBihToHkjycL8ObIS2XOnWypWZZWhJSoWyHwFrhEKz1zGvgylK9Dc711oUfU+zU6J8e0JPKNJMNb3BQ==} + '@aws-sdk/credential-provider-node@3.925.0': + resolution: {integrity: sha512-+T9mnnTY73MLkVxsk5RtzE4fv7GnMhR7iXhL/yTusf1zLfA09uxlA9VCz6tWxm5rHcO4ZN0x4hnqqDhM+DB5KQ==} engines: {node: '>=18.0.0'} '@aws-sdk/credential-provider-process@3.922.0': resolution: {integrity: sha512-1DZOYezT6okslpvMW7oA2q+y17CJd4fxjNFH0jtThfswdh9CtG62+wxenqO+NExttq0UMaKisrkZiVrYQBTShw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.922.0': - resolution: {integrity: sha512-nbD3G3hShTYxLCkKMqLkLPtKwAAfxdY/k9jHtZmVBFXek2T6tQrqZHKxlAu+fd23Ga4/Aik7DLQQx1RA1a5ipg==} + '@aws-sdk/credential-provider-sso@3.925.0': + resolution: {integrity: sha512-aZlUC6LRsOMDvIu0ifF62mTjL3KGzclWu5XBBN8eLDAYTdhqMxv3HyrqWoiHnGZnZGaVU+II+qsVoeBnGOwHow==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.922.0': - resolution: {integrity: sha512-wjGIhgMHGGQfQTdFaJphNOKyAL8wZs6znJdHADPVURmgR+EWLyN/0fDO1u7wx8xaLMZpbHIFWBEvf9TritR/cQ==} + '@aws-sdk/credential-provider-web-identity@3.925.0': + resolution: {integrity: sha512-dR34s8Sfd1wJBzIuvRFO2FCnLmYD8iwPWrdXWI2ZypFt1EQR8jeQ20mnS+UOCoR5Z0tY6wJqEgTXKl4KuZ+DUg==} engines: {node: '>=18.0.0'} '@aws-sdk/middleware-bucket-endpoint@3.922.0': @@ -824,20 +824,20 @@ packages: resolution: {integrity: sha512-N4Qx/9KP3oVQBJOrSghhz8iZFtUC2NNeSZt88hpPhbqAEAtuX8aD8OzVcpnAtrwWqy82Yd2YTxlkqMGkgqnBsQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.922.0': - resolution: {integrity: sha512-uYvKCF1TGh/MuJ4TMqmUM0Csuao02HawcseG4LUDyxdUsd/EFuxalWq1Cx4fKZQ2K8F504efZBjctMAMNY+l7A==} + '@aws-sdk/nested-clients@3.925.0': + resolution: {integrity: sha512-Fc8QhH+1YzGQb5aWQUX6gRnKSzUZ9p3p/muqXIgYBL8RSd5O6hSPhDTyrOWE247zFlOjVlAlEnoTMJKarH0cIA==} engines: {node: '>=18.0.0'} - '@aws-sdk/region-config-resolver@3.922.0': - resolution: {integrity: sha512-44Y/rNNwhngR2KHp6gkx//TOr56/hx6s4l+XLjOqH7EBCHL7XhnrT1y92L+DLiroVr1tCSmO8eHQwBv0Y2+mvw==} + '@aws-sdk/region-config-resolver@3.925.0': + resolution: {integrity: sha512-FOthcdF9oDb1pfQBRCfWPZhJZT5wqpvdAS5aJzB1WDZ+6EuaAhLzLH/fW1slDunIqq1PSQGG3uSnVglVVOvPHQ==} engines: {node: '>=18.0.0'} '@aws-sdk/signature-v4-multi-region@3.922.0': resolution: {integrity: sha512-mmsgEEL5pE+A7gFYiJMDBCLVciaXq4EFI5iAP7bPpnHvOplnNOYxVy2IreKMllGvrfjVyLnwxzZYlo5zZ65FWg==} engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.922.0': - resolution: {integrity: sha512-/inmPnjZE0ZBE16zaCowAvouSx05FJ7p6BQYuzlJ8vxEU0sS0Hf8fvhuiRnN9V9eDUPIBY+/5EjbMWygXL4wlQ==} + '@aws-sdk/token-providers@3.925.0': + resolution: {integrity: sha512-F4Oibka1W5YYDeL+rGt/Hg3NLjOzrJdmuZOE0OFQt/U6dnJwYmYi2gFqduvZnZcD1agNm37mh7/GUq1zvKS6ig==} engines: {node: '>=18.0.0'} '@aws-sdk/types@3.922.0': @@ -1040,8 +1040,8 @@ packages: resolution: {integrity: sha512-fqcQxcxC4LOaUlW8IkyWw8x0yirlLUkbxohz9OnWvVWjf73J5yyw7jxWnkOJaUKXZotcGEScDox9MU6rSkcDgg==} hasBin: true - '@ecies/ciphers@0.2.4': - resolution: {integrity: sha512-t+iX+Wf5nRKyNzk8dviW3Ikb/280+aEJAnw9YXvCp2tYGPSkMki+NRY+8aNLmVFv3eNtMdvViPNOPxS8SZNP+w==} + '@ecies/ciphers@0.2.5': + resolution: {integrity: sha512-GalEZH4JgOMHYYcYmVqnFirFsjZHeoGMDt9IxEnM9F7GRUUyUksJ7Ou53L83WHJq3RWKD3AcBpo0iQh0oMpf8A==} engines: {bun: '>=1', deno: '>=2', node: '>=16'} peerDependencies: '@noble/ciphers': ^1.0.0 @@ -1229,10 +1229,6 @@ packages: resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.16.0': - resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.17.0': resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1249,8 +1245,8 @@ packages: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/js@9.38.0': - resolution: {integrity: sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==} + '@eslint/js@9.39.1': + resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.7': @@ -1839,6 +1835,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-primitive@2.1.4': + resolution: {integrity: sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-scroll-area@1.2.10': resolution: {integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==} peerDependencies: @@ -1861,6 +1870,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-slot@1.2.4': + resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-toast@1.2.15': resolution: {integrity: sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==} peerDependencies: @@ -2077,8 +2095,8 @@ packages: resolution: {integrity: sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==} engines: {node: '>=18.0.0'} - '@smithy/config-resolver@4.4.1': - resolution: {integrity: sha512-BciDJ5hkyYEGBBKMbjGB1A/Zq8bYZ41Zo9BMnGdKF6QD1fY4zIkYx6zui/0CHaVGnv6h0iy8y4rnPX9CPCAPyQ==} + '@smithy/config-resolver@4.4.2': + resolution: {integrity: sha512-4Jys0ni2tB2VZzgslbEgszZyMdTkPOFGA8g+So/NjR8oy6Qwaq4eSwsrRI+NMtb0Dq4kqCzGUu/nGUx7OM/xfw==} engines: {node: '>=18.0.0'} '@smithy/core@3.17.2': @@ -2237,8 +2255,8 @@ packages: resolution: {integrity: sha512-GwaGjv/QLuL/QHQaqhf/maM7+MnRFQQs7Bsl6FlaeK6lm6U7mV5AAnVabw68cIoMl5FQFyKK62u7RWRzWL25OQ==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.2.7': - resolution: {integrity: sha512-6hinjVqec0WYGsqN7h9hL/ywfULmJJNXGXnNZW7jrIn/cFuC/aVlVaiDfBIJEvKcOrmN8/EgsW69eY0gXABeHw==} + '@smithy/util-defaults-mode-node@4.2.8': + resolution: {integrity: sha512-gIoTf9V/nFSIZ0TtgDNLd+Ws59AJvijmMDYrOozoMHPJaG9cMRdqNO50jZTlbM6ydzQYY8L/mQ4tKSw/TB+s6g==} engines: {node: '>=18.0.0'} '@smithy/util-endpoints@3.2.4': @@ -2543,14 +2561,14 @@ packages: peerDependencies: eslint: ^8.57.0 || ^9.0.0 - '@tanstack/query-core@5.90.6': - resolution: {integrity: sha512-AnZSLF26R8uX+tqb/ivdrwbVdGemdEDm1Q19qM6pry6eOZ6bEYiY7mWhzXT1YDIPTNEVcZ5kYP9nWjoxDLiIVw==} + '@tanstack/query-core@5.90.7': + resolution: {integrity: sha512-6PN65csiuTNfBMXqQUxQhCNdtm1rV+9kC9YwWAIKcaxAauq3Wu7p18j3gQY3YIBJU70jT/wzCCZ2uqto/vQgiQ==} '@tanstack/query-devtools@5.90.1': resolution: {integrity: sha512-GtINOPjPUH0OegJExZ70UahT9ykmAhmtNVcmtdnOZbxLwT7R5OmRztR5Ahe3/Cu7LArEmR6/588tAycuaWb1xQ==} - '@tanstack/query-persist-client-core@5.91.5': - resolution: {integrity: sha512-wo+8ni3VBNqE2FIo8OiiaxbGNmRgyBalQnLFzupOId9gtOIsr++ADCi0dVnvdf1k+LWGfnijyWFxnXmkDKdf2A==} + '@tanstack/query-persist-client-core@5.91.6': + resolution: {integrity: sha512-VDnWKhXn4YD8fosh35oSEkwqvsO9vveOyswp4bL/L8SZuQukPFRjyNIq4xGHO/olQneudLt57MdA4mYLAp5P5g==} '@tanstack/react-query-devtools@5.90.2': resolution: {integrity: sha512-vAXJzZuBXtCQtrY3F/yUNJCV4obT/A/n81kb3+YqLbro5Z2+phdAbceO+deU3ywPw8B42oyJlp4FhO0SoivDFQ==} @@ -2558,14 +2576,14 @@ packages: '@tanstack/react-query': ^5.90.2 react: ^18 || ^19 - '@tanstack/react-query-persist-client@5.90.8': - resolution: {integrity: sha512-IcdOPGmk5KoQQxbsZboyurA9n6CKqdnz7BS2TAuPgbCxhVdpXloQ99hJPOk4QEtV3QhdQyAVrntiGfr/ReYobg==} + '@tanstack/react-query-persist-client@5.90.9': + resolution: {integrity: sha512-rNisr2kq/WUvO8vBhNkfeK/QmLJ8w4cP1vVPB04ENFMW863Y9kDUuI21ryRheZBefFzicuBzOIQq9XdhzBRfGw==} peerDependencies: - '@tanstack/react-query': ^5.90.6 + '@tanstack/react-query': ^5.90.7 react: ^18 || ^19 - '@tanstack/react-query@5.90.6': - resolution: {integrity: sha512-gB1sljYjcobZKxjPbKSa31FUTyr+ROaBdoH+wSSs9Dk+yDCmMs+TkTV3PybRRVLC7ax7q0erJ9LvRWnMktnRAw==} + '@tanstack/react-query@5.90.7': + resolution: {integrity: sha512-wAHc/cgKzW7LZNFloThyHnV/AX9gTg3w5yAv0gvQHPZoCnepwqCMtzbuPbb2UvfvO32XZ46e8bPOYbfZhzVnnQ==} peerDependencies: react: ^18 || ^19 @@ -2951,11 +2969,11 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - '@vitest/expect@4.0.6': - resolution: {integrity: sha512-5j8UUlBVhOjhj4lR2Nt9sEV8b4WtbcYh8vnfhTNA2Kn5+smtevzjNq+xlBuVhnFGXiyPPNzGrOVvmyHWkS5QGg==} + '@vitest/expect@4.0.7': + resolution: {integrity: sha512-jGRG6HghnJDjljdjYIoVzX17S6uCVCBRFnsgdLGJ6CaxfPh8kzUKe/2n533y4O/aeZ/sIr7q7GbuEbeGDsWv4Q==} - '@vitest/mocker@4.0.6': - resolution: {integrity: sha512-3COEIew5HqdzBFEYN9+u0dT3i/NCwppLnO1HkjGfAP1Vs3vti1Hxm/MvcbC4DAn3Szo1M7M3otiAaT83jvqIjA==} + '@vitest/mocker@4.0.7': + resolution: {integrity: sha512-OsDwLS7WnpuNslOV6bJkXVYVV/6RSc4eeVxV7h9wxQPNxnjRvTTrIikfwCbMyl8XJmW6oOccBj2Q07YwZtQcCw==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0-0 @@ -2965,25 +2983,25 @@ packages: vite: optional: true - '@vitest/pretty-format@4.0.6': - resolution: {integrity: sha512-4vptgNkLIA1W1Nn5X4x8rLJBzPiJwnPc+awKtfBE5hNMVsoAl/JCCPPzNrbf+L4NKgklsis5Yp2gYa+XAS442g==} + '@vitest/pretty-format@4.0.7': + resolution: {integrity: sha512-YY//yxqTmk29+/pK+Wi1UB4DUH3lSVgIm+M10rAJ74pOSMgT7rydMSc+vFuq9LjZLhFvVEXir8EcqMke3SVM6Q==} - '@vitest/runner@4.0.6': - resolution: {integrity: sha512-trPk5qpd7Jj+AiLZbV/e+KiiaGXZ8ECsRxtnPnCrJr9OW2mLB72Cb824IXgxVz/mVU3Aj4VebY+tDTPn++j1Og==} + '@vitest/runner@4.0.7': + resolution: {integrity: sha512-orU1lsu4PxLEcDWfjVCNGIedOSF/YtZ+XMrd1PZb90E68khWCNzD8y1dtxtgd0hyBIQk8XggteKN/38VQLvzuw==} - '@vitest/snapshot@4.0.6': - resolution: {integrity: sha512-PaYLt7n2YzuvxhulDDu6c9EosiRuIE+FI2ECKs6yvHyhoga+2TBWI8dwBjs+IeuQaMtZTfioa9tj3uZb7nev1g==} + '@vitest/snapshot@4.0.7': + resolution: {integrity: sha512-xJL+Nkw0OjaUXXQf13B8iKK5pI9QVtN9uOtzNHYuG/o/B7fIEg0DQ+xOe0/RcqwDEI15rud1k7y5xznBKGUXAA==} - '@vitest/spy@4.0.6': - resolution: {integrity: sha512-g9jTUYPV1LtRPRCQfhbMintW7BTQz1n6WXYQYRQ25qkyffA4bjVXjkROokZnv7t07OqfaFKw1lPzqKGk1hmNuQ==} + '@vitest/spy@4.0.7': + resolution: {integrity: sha512-FW4X8hzIEn4z+HublB4hBF/FhCVaXfIHm8sUfvlznrcy1MQG7VooBgZPMtVCGZtHi0yl3KESaXTqsKh16d8cFg==} - '@vitest/ui@4.0.6': - resolution: {integrity: sha512-1ekpBsYNUm0Xv/0YsTvoSRmiRkmzz9Pma7qQ3Ui76sg2gwp2/ewSWqx4W/HfaN5dF0E8iBbidFo1wGaeqXYIrQ==} + '@vitest/ui@4.0.7': + resolution: {integrity: sha512-aIFPci9xoTmVkxpqsSKcRG/Hn0lTy421jsCehHydYeIMd+getn0Pue0JqY5cW8yZglZjMeX0YfIy5wDtQDHEcA==} peerDependencies: - vitest: 4.0.6 + vitest: 4.0.7 - '@vitest/utils@4.0.6': - resolution: {integrity: sha512-bG43VS3iYKrMIZXBo+y8Pti0O7uNju3KvNn6DrQWhQQKcLavMB+0NZfO1/QBAEbq0MaQ3QjNsnnXlGQvsh0Z6A==} + '@vitest/utils@4.0.7': + resolution: {integrity: sha512-HNrg9CM/Z4ZWB6RuExhuC6FPmLipiShKVMnT9JlQvfhwR47JatWLChA6mtZqVHqypE6p/z6ofcjbyWpM7YLxPQ==} '@vscode/markdown-it-katex@1.1.2': resolution: {integrity: sha512-+4IIv5PgrmhKvW/3LpkpkGg257OViEhXkOOgCyj5KMsjsOfnRXkni8XAuuF9Ui5p3B8WnUovlDXAQNb8RJ/RaQ==} @@ -3279,8 +3297,8 @@ packages: ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - ansi-escapes@7.1.1: - resolution: {integrity: sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==} + ansi-escapes@7.2.0: + resolution: {integrity: sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==} engines: {node: '>=18'} ansi-regex@5.0.1: @@ -3426,8 +3444,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.8.23: - resolution: {integrity: sha512-616V5YX4bepJFzNyOfce5Fa8fDJMfoxzOIzDCZwaGL8MKVpFrXqfNUoIpRn9YMI5pXf/VKgzjB4htFMsFKKdiQ==} + baseline-browser-mapping@2.8.25: + resolution: {integrity: sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==} hasBin: true binary-extensions@2.3.0: @@ -4131,8 +4149,8 @@ packages: resolution: {integrity: sha512-dS5cbA9rA2VR4Ybuvhg6jvdmp46ubLn3E+px8cG/35aEDNclrqoCjg6mt0HYZ/M+OoESS3jSkCrqk1kWAEhWAw==} engines: {bun: '>=1', deno: '>=2', node: '>=16'} - electron-to-chromium@1.5.244: - resolution: {integrity: sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==} + electron-to-chromium@1.5.245: + resolution: {integrity: sha512-rdmGfW47ZhL/oWEJAY4qxRtdly2B98ooTJ0pdEI4jhVLZ6tNf8fPtov2wS1IRKwFJT92le3x4Knxiwzl7cPPpQ==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -4373,8 +4391,8 @@ packages: deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true - eslint@9.38.0: - resolution: {integrity: sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==} + eslint@9.39.1: + resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -5351,8 +5369,8 @@ packages: kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - ky@1.13.0: - resolution: {integrity: sha512-JeNNGs44hVUp2XxO3FY9WV28ymG7LgO4wju4HL/dCq1A8eKDcFgVrdCn1ssn+3Q/5OQilv5aYsL0DMt5mmAV9w==} + ky@1.14.0: + resolution: {integrity: sha512-Rczb6FMM6JT0lvrOlP5WUOCB7s9XKxzwgErzhKlKde1bEV90FXplV1o87fpt4PU/asJFiqjYJxAJyzJhcrxOsQ==} engines: {node: '>=18'} langium@3.3.1: @@ -6598,8 +6616,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sax@1.4.2: - resolution: {integrity: sha512-FySGAa0RGcFiN6zfrO9JvK1r7TB59xuzCcTHOBXBNoKgDejlOQCR2KL/FGk3/iDlsqyYg1ELZpOmlg09B01Czw==} + sax@1.4.3: + resolution: {integrity: sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==} scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} @@ -6931,8 +6949,8 @@ packages: teex@1.0.1: resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} - terser@5.44.0: - resolution: {integrity: sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==} + terser@5.44.1: + resolution: {integrity: sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==} engines: {node: '>=10'} hasBin: true @@ -6961,8 +6979,9 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyexec@1.0.1: - resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} @@ -7315,8 +7334,8 @@ packages: resolution: {integrity: sha512-0QwqXteBNXgnLCdWdvPQBX6FXRHtIH3VhJPTd5Lwn28tJXc34YqSCWUmkOvtJHBmB3gGoPtrOKk3Ts8/kEZ9aA==} engines: {node: '>=10.13.0'} - vite@7.1.12: - resolution: {integrity: sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==} + vite@7.2.0: + resolution: {integrity: sha512-C/Naxf8H0pBx1PA4BdpT+c/5wdqI9ILMdwjSMILw7tVIh3JsxzZqdeTLmmdaoh5MYUEOyBnM9K3o0DzoZ/fe+w==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -7355,18 +7374,18 @@ packages: yaml: optional: true - vitest@4.0.6: - resolution: {integrity: sha512-gR7INfiVRwnEOkCk47faros/9McCZMp5LM+OMNWGLaDBSvJxIzwjgNFufkuePBNaesGRnLmNfW+ddbUJRZn0nQ==} + vitest@4.0.7: + resolution: {integrity: sha512-xQroKAadK503CrmbzCISvQUjeuvEZzv6U0wlnlVFOi5i3gnzfH4onyQ29f3lzpe0FresAiTAd3aqK0Bi/jLI8w==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.0.6 - '@vitest/browser-preview': 4.0.6 - '@vitest/browser-webdriverio': 4.0.6 - '@vitest/ui': 4.0.6 + '@vitest/browser-playwright': 4.0.7 + '@vitest/browser-preview': 4.0.7 + '@vitest/browser-webdriverio': 4.0.7 + '@vitest/ui': 4.0.7 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -7635,7 +7654,7 @@ snapshots: '@antfu/install-pkg@1.1.0': dependencies: package-manager-detector: 1.5.0 - tinyexec: 1.0.1 + tinyexec: 1.0.2 '@antfu/utils@9.3.0': {} @@ -7753,13 +7772,13 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.922.0': + '@aws-sdk/client-s3@3.925.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 '@aws-sdk/core': 3.922.0 - '@aws-sdk/credential-provider-node': 3.922.0 + '@aws-sdk/credential-provider-node': 3.925.0 '@aws-sdk/middleware-bucket-endpoint': 3.922.0 '@aws-sdk/middleware-expect-continue': 3.922.0 '@aws-sdk/middleware-flexible-checksums': 3.922.0 @@ -7770,14 +7789,14 @@ snapshots: '@aws-sdk/middleware-sdk-s3': 3.922.0 '@aws-sdk/middleware-ssec': 3.922.0 '@aws-sdk/middleware-user-agent': 3.922.0 - '@aws-sdk/region-config-resolver': 3.922.0 + '@aws-sdk/region-config-resolver': 3.925.0 '@aws-sdk/signature-v4-multi-region': 3.922.0 '@aws-sdk/types': 3.922.0 '@aws-sdk/util-endpoints': 3.922.0 '@aws-sdk/util-user-agent-browser': 3.922.0 '@aws-sdk/util-user-agent-node': 3.922.0 '@aws-sdk/xml-builder': 3.921.0 - '@smithy/config-resolver': 4.4.1 + '@smithy/config-resolver': 4.4.2 '@smithy/core': 3.17.2 '@smithy/eventstream-serde-browser': 4.2.4 '@smithy/eventstream-serde-config-resolver': 4.3.4 @@ -7803,7 +7822,7 @@ snapshots: '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 '@smithy/util-defaults-mode-browser': 4.3.5 - '@smithy/util-defaults-mode-node': 4.2.7 + '@smithy/util-defaults-mode-node': 4.2.8 '@smithy/util-endpoints': 3.2.4 '@smithy/util-middleware': 4.2.4 '@smithy/util-retry': 4.2.4 @@ -7815,7 +7834,7 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.922.0': + '@aws-sdk/client-sso@3.925.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 @@ -7824,12 +7843,12 @@ snapshots: '@aws-sdk/middleware-logger': 3.922.0 '@aws-sdk/middleware-recursion-detection': 3.922.0 '@aws-sdk/middleware-user-agent': 3.922.0 - '@aws-sdk/region-config-resolver': 3.922.0 + '@aws-sdk/region-config-resolver': 3.925.0 '@aws-sdk/types': 3.922.0 '@aws-sdk/util-endpoints': 3.922.0 '@aws-sdk/util-user-agent-browser': 3.922.0 '@aws-sdk/util-user-agent-node': 3.922.0 - '@smithy/config-resolver': 4.4.1 + '@smithy/config-resolver': 4.4.2 '@smithy/core': 3.17.2 '@smithy/fetch-http-handler': 5.3.5 '@smithy/hash-node': 4.2.4 @@ -7849,7 +7868,7 @@ snapshots: '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 '@smithy/util-defaults-mode-browser': 4.3.5 - '@smithy/util-defaults-mode-node': 4.2.7 + '@smithy/util-defaults-mode-node': 4.2.8 '@smithy/util-endpoints': 3.2.4 '@smithy/util-middleware': 4.2.4 '@smithy/util-retry': 4.2.4 @@ -7895,15 +7914,15 @@ snapshots: '@smithy/util-stream': 4.5.5 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.922.0': + '@aws-sdk/credential-provider-ini@3.925.0': dependencies: '@aws-sdk/core': 3.922.0 '@aws-sdk/credential-provider-env': 3.922.0 '@aws-sdk/credential-provider-http': 3.922.0 '@aws-sdk/credential-provider-process': 3.922.0 - '@aws-sdk/credential-provider-sso': 3.922.0 - '@aws-sdk/credential-provider-web-identity': 3.922.0 - '@aws-sdk/nested-clients': 3.922.0 + '@aws-sdk/credential-provider-sso': 3.925.0 + '@aws-sdk/credential-provider-web-identity': 3.925.0 + '@aws-sdk/nested-clients': 3.925.0 '@aws-sdk/types': 3.922.0 '@smithy/credential-provider-imds': 4.2.4 '@smithy/property-provider': 4.2.4 @@ -7913,14 +7932,14 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.922.0': + '@aws-sdk/credential-provider-node@3.925.0': dependencies: '@aws-sdk/credential-provider-env': 3.922.0 '@aws-sdk/credential-provider-http': 3.922.0 - '@aws-sdk/credential-provider-ini': 3.922.0 + '@aws-sdk/credential-provider-ini': 3.925.0 '@aws-sdk/credential-provider-process': 3.922.0 - '@aws-sdk/credential-provider-sso': 3.922.0 - '@aws-sdk/credential-provider-web-identity': 3.922.0 + '@aws-sdk/credential-provider-sso': 3.925.0 + '@aws-sdk/credential-provider-web-identity': 3.925.0 '@aws-sdk/types': 3.922.0 '@smithy/credential-provider-imds': 4.2.4 '@smithy/property-provider': 4.2.4 @@ -7939,11 +7958,11 @@ snapshots: '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.922.0': + '@aws-sdk/credential-provider-sso@3.925.0': dependencies: - '@aws-sdk/client-sso': 3.922.0 + '@aws-sdk/client-sso': 3.925.0 '@aws-sdk/core': 3.922.0 - '@aws-sdk/token-providers': 3.922.0 + '@aws-sdk/token-providers': 3.925.0 '@aws-sdk/types': 3.922.0 '@smithy/property-provider': 4.2.4 '@smithy/shared-ini-file-loader': 4.3.4 @@ -7952,10 +7971,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.922.0': + '@aws-sdk/credential-provider-web-identity@3.925.0': dependencies: '@aws-sdk/core': 3.922.0 - '@aws-sdk/nested-clients': 3.922.0 + '@aws-sdk/nested-clients': 3.925.0 '@aws-sdk/types': 3.922.0 '@smithy/property-provider': 4.2.4 '@smithy/shared-ini-file-loader': 4.3.4 @@ -8057,7 +8076,7 @@ snapshots: '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.922.0': + '@aws-sdk/nested-clients@3.925.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 @@ -8066,12 +8085,12 @@ snapshots: '@aws-sdk/middleware-logger': 3.922.0 '@aws-sdk/middleware-recursion-detection': 3.922.0 '@aws-sdk/middleware-user-agent': 3.922.0 - '@aws-sdk/region-config-resolver': 3.922.0 + '@aws-sdk/region-config-resolver': 3.925.0 '@aws-sdk/types': 3.922.0 '@aws-sdk/util-endpoints': 3.922.0 '@aws-sdk/util-user-agent-browser': 3.922.0 '@aws-sdk/util-user-agent-node': 3.922.0 - '@smithy/config-resolver': 4.4.1 + '@smithy/config-resolver': 4.4.2 '@smithy/core': 3.17.2 '@smithy/fetch-http-handler': 5.3.5 '@smithy/hash-node': 4.2.4 @@ -8091,7 +8110,7 @@ snapshots: '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 '@smithy/util-defaults-mode-browser': 4.3.5 - '@smithy/util-defaults-mode-node': 4.2.7 + '@smithy/util-defaults-mode-node': 4.2.8 '@smithy/util-endpoints': 3.2.4 '@smithy/util-middleware': 4.2.4 '@smithy/util-retry': 4.2.4 @@ -8100,10 +8119,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.922.0': + '@aws-sdk/region-config-resolver@3.925.0': dependencies: '@aws-sdk/types': 3.922.0 - '@smithy/config-resolver': 4.4.1 + '@smithy/config-resolver': 4.4.2 '@smithy/node-config-provider': 4.3.4 '@smithy/types': 4.8.1 tslib: 2.8.1 @@ -8117,10 +8136,10 @@ snapshots: '@smithy/types': 4.8.1 tslib: 2.8.1 - '@aws-sdk/token-providers@3.922.0': + '@aws-sdk/token-providers@3.925.0': dependencies: '@aws-sdk/core': 3.922.0 - '@aws-sdk/nested-clients': 3.922.0 + '@aws-sdk/nested-clients': 3.925.0 '@aws-sdk/types': 3.922.0 '@smithy/property-provider': 4.2.4 '@smithy/shared-ini-file-loader': 4.3.4 @@ -8463,7 +8482,7 @@ snapshots: picomatch: 4.0.3 which: 4.0.0 - '@ecies/ciphers@0.2.4(@noble/ciphers@1.3.0)': + '@ecies/ciphers@0.2.5(@noble/ciphers@1.3.0)': dependencies: '@noble/ciphers': 1.3.0 @@ -8566,9 +8585,9 @@ snapshots: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.0(eslint@9.38.0(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1(jiti@2.6.1))': dependencies: - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -8585,10 +8604,6 @@ snapshots: dependencies: '@eslint/core': 0.17.0 - '@eslint/core@0.16.0': - dependencies: - '@types/json-schema': 7.0.15 - '@eslint/core@0.17.0': dependencies: '@types/json-schema': 7.0.15 @@ -8623,7 +8638,7 @@ snapshots: '@eslint/js@8.57.1': {} - '@eslint/js@9.38.0': {} + '@eslint/js@9.39.1': {} '@eslint/object-schema@2.1.7': {} @@ -8903,9 +8918,9 @@ snapshots: dependencies: '@lezer/common': 1.3.0 - '@limegrass/eslint-plugin-import-alias@1.6.0(eslint@9.38.0(jiti@2.6.1))': + '@limegrass/eslint-plugin-import-alias@1.6.0(eslint@9.39.1(jiti@2.6.1))': dependencies: - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) fs-extra: 10.1.0 micromatch: 4.0.8 slash: 3.0.0 @@ -8922,7 +8937,7 @@ snapshots: picocolors: 1.1.1 sembear: 0.7.0 semver: 7.7.3 - tinyexec: 1.0.1 + tinyexec: 1.0.2 validate-npm-package-name: 6.0.2 '@manypkg/find-root@3.1.0': @@ -9196,6 +9211,15 @@ snapshots: '@types/react': 19.2.2 '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/number': 1.1.1 @@ -9220,6 +9244,13 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 + '@radix-ui/react-slot@1.2.4(@types/react@19.2.2)(react@19.2.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.2 + '@radix-ui/react-toast@1.2.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 @@ -9384,7 +9415,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/config-resolver@4.4.1': + '@smithy/config-resolver@4.4.2': dependencies: '@smithy/node-config-provider': 4.3.4 '@smithy/types': 4.8.1 @@ -9642,9 +9673,9 @@ snapshots: '@smithy/types': 4.8.1 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.2.7': + '@smithy/util-defaults-mode-node@4.2.8': dependencies: - '@smithy/config-resolver': 4.4.1 + '@smithy/config-resolver': 4.4.2 '@smithy/credential-provider-imds': 4.2.4 '@smithy/node-config-provider': 4.3.4 '@smithy/property-provider': 4.2.4 @@ -9922,44 +9953,44 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 4.1.16 - '@tailwindcss/vite@4.1.16(vite@7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))': + '@tailwindcss/vite@4.1.16(vite@7.2.0(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.1))': dependencies: '@tailwindcss/node': 4.1.16 '@tailwindcss/oxide': 4.1.16 tailwindcss: 4.1.16 - vite: 7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) + vite: 7.2.0(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.1) - '@tanstack/eslint-plugin-query@5.91.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': + '@tanstack/eslint-plugin-query@5.91.2(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/utils': 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.38.0(jiti@2.6.1) + '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) transitivePeerDependencies: - supports-color - typescript - '@tanstack/query-core@5.90.6': {} + '@tanstack/query-core@5.90.7': {} '@tanstack/query-devtools@5.90.1': {} - '@tanstack/query-persist-client-core@5.91.5': + '@tanstack/query-persist-client-core@5.91.6': dependencies: - '@tanstack/query-core': 5.90.6 + '@tanstack/query-core': 5.90.7 - '@tanstack/react-query-devtools@5.90.2(@tanstack/react-query@5.90.6(react@19.2.0))(react@19.2.0)': + '@tanstack/react-query-devtools@5.90.2(@tanstack/react-query@5.90.7(react@19.2.0))(react@19.2.0)': dependencies: '@tanstack/query-devtools': 5.90.1 - '@tanstack/react-query': 5.90.6(react@19.2.0) + '@tanstack/react-query': 5.90.7(react@19.2.0) react: 19.2.0 - '@tanstack/react-query-persist-client@5.90.8(@tanstack/react-query@5.90.6(react@19.2.0))(react@19.2.0)': + '@tanstack/react-query-persist-client@5.90.9(@tanstack/react-query@5.90.7(react@19.2.0))(react@19.2.0)': dependencies: - '@tanstack/query-persist-client-core': 5.91.5 - '@tanstack/react-query': 5.90.6(react@19.2.0) + '@tanstack/query-persist-client-core': 5.91.6 + '@tanstack/react-query': 5.90.7(react@19.2.0) react: 19.2.0 - '@tanstack/react-query@5.90.6(react@19.2.0)': + '@tanstack/react-query@5.90.7(react@19.2.0)': dependencies: - '@tanstack/query-core': 5.90.6 + '@tanstack/query-core': 5.90.7 react: 19.2.0 '@tybys/wasm-util@0.10.1': @@ -10205,15 +10236,15 @@ snapshots: dependencies: '@types/node': 22.17.2 - '@typescript-eslint/eslint-plugin@8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.46.3 - '@typescript-eslint/type-utils': 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.46.3 - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -10222,14 +10253,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.46.3 '@typescript-eslint/types': 8.46.3 '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.46.3 debug: 4.4.3 - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -10252,13 +10283,13 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.46.3 '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) ts-api-utils: 2.1.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -10282,13 +10313,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.46.3 '@typescript-eslint/types': 8.46.3 '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -10364,7 +10395,7 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitejs/plugin-react@5.1.0(vite@7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))': + '@vitejs/plugin-react@5.1.0(vite@7.2.0(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) @@ -10372,58 +10403,58 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.43 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) + vite: 7.2.0(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitest/expect@4.0.6': + '@vitest/expect@4.0.7': dependencies: '@standard-schema/spec': 1.0.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.0.6 - '@vitest/utils': 4.0.6 + '@vitest/spy': 4.0.7 + '@vitest/utils': 4.0.7 chai: 6.2.0 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.6(vite@7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1))': + '@vitest/mocker@4.0.7(vite@7.2.0(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.1))': dependencies: - '@vitest/spy': 4.0.6 + '@vitest/spy': 4.0.7 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) + vite: 7.2.0(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.1) - '@vitest/pretty-format@4.0.6': + '@vitest/pretty-format@4.0.7': dependencies: tinyrainbow: 3.0.3 - '@vitest/runner@4.0.6': + '@vitest/runner@4.0.7': dependencies: - '@vitest/utils': 4.0.6 + '@vitest/utils': 4.0.7 pathe: 2.0.3 - '@vitest/snapshot@4.0.6': + '@vitest/snapshot@4.0.7': dependencies: - '@vitest/pretty-format': 4.0.6 + '@vitest/pretty-format': 4.0.7 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.0.6': {} + '@vitest/spy@4.0.7': {} - '@vitest/ui@4.0.6(vitest@4.0.6)': + '@vitest/ui@4.0.7(vitest@4.0.7)': dependencies: - '@vitest/utils': 4.0.6 + '@vitest/utils': 4.0.7 fflate: 0.8.2 flatted: 3.3.3 pathe: 2.0.3 sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vitest: 4.0.6(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) + vitest: 4.0.7(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.7)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.1) - '@vitest/utils@4.0.6': + '@vitest/utils@4.0.7': dependencies: - '@vitest/pretty-format': 4.0.6 + '@vitest/pretty-format': 4.0.7 tinyrainbow: 3.0.3 '@vscode/markdown-it-katex@1.1.2': @@ -11047,7 +11078,7 @@ snapshots: dependencies: string-width: 4.2.3 - ansi-escapes@7.1.1: + ansi-escapes@7.2.0: dependencies: environment: 1.1.0 @@ -11200,7 +11231,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.8.23: {} + baseline-browser-mapping@2.8.25: {} binary-extensions@2.3.0: {} @@ -11242,9 +11273,9 @@ snapshots: browserslist@4.27.0: dependencies: - baseline-browser-mapping: 2.8.23 + baseline-browser-mapping: 2.8.25 caniuse-lite: 1.0.30001753 - electron-to-chromium: 1.5.244 + electron-to-chromium: 1.5.245 node-releases: 2.0.27 update-browserslist-db: 1.1.4(browserslist@4.27.0) @@ -11449,7 +11480,7 @@ snapshots: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) transitivePeerDependencies: @@ -11922,12 +11953,12 @@ snapshots: eciesjs@0.4.16: dependencies: - '@ecies/ciphers': 0.2.4(@noble/ciphers@1.3.0) + '@ecies/ciphers': 0.2.5(@noble/ciphers@1.3.0) '@noble/ciphers': 1.3.0 '@noble/curves': 1.9.7 '@noble/hashes': 1.8.0 - electron-to-chromium@1.5.244: {} + electron-to-chromium@1.5.245: {} emoji-regex@10.6.0: {} @@ -12139,9 +12170,9 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-prettier@10.1.8(eslint@9.38.0(jiti@2.6.1)): + eslint-config-prettier@10.1.8(eslint@9.39.1(jiti@2.6.1)): dependencies: - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) eslint-import-context@0.1.9(unrs-resolver@1.11.1): dependencies: @@ -12158,10 +12189,10 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@4.4.4(eslint-plugin-import@2.32.0)(eslint@9.38.0(jiti@2.6.1)): + eslint-import-resolver-typescript@4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)): dependencies: debug: 4.4.3 - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) eslint-import-context: 0.1.9(unrs-resolver@1.11.1) get-tsconfig: 4.13.0 is-bun-module: 2.0.0 @@ -12169,36 +12200,26 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0(jiti@2.6.1)): + eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.1(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)): - dependencies: - debug: 3.2.7 - optionalDependencies: - eslint: 9.38.0(jiti@2.6.1) - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import@2.32.0)(eslint@9.38.0(jiti@2.6.1)) - transitivePeerDependencies: - - supports-color - - eslint-plugin-boundaries@5.1.0(@typescript-eslint/parser@8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1)): + eslint-plugin-boundaries@5.1.0(eslint@9.39.1(jiti@2.6.1)): dependencies: chalk: 4.1.2 - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0(jiti@2.6.1)) + eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.1(jiti@2.6.1)) micromatch: 4.0.8 transitivePeerDependencies: - '@typescript-eslint/parser' @@ -12206,7 +12227,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)): + eslint-plugin-import@2.32.0(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.1(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -12215,9 +12236,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.38.0(jiti@2.6.1)) + eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@9.39.1(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -12237,22 +12258,22 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-plugin-react-hooks@7.0.1(eslint@9.38.0(jiti@2.6.1)): + eslint-plugin-react-hooks@7.0.1(eslint@9.39.1(jiti@2.6.1)): dependencies: '@babel/core': 7.28.5 '@babel/parser': 7.28.5 - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) hermes-parser: 0.25.1 zod: 4.1.12 zod-validation-error: 4.0.2(zod@4.1.12) transitivePeerDependencies: - supports-color - eslint-plugin-react-refresh@0.4.24(eslint@9.38.0(jiti@2.6.1)): + eslint-plugin-react-refresh@0.4.24(eslint@9.39.1(jiti@2.6.1)): dependencies: - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) - eslint-plugin-react@7.37.5(eslint@9.38.0(jiti@2.6.1)): + eslint-plugin-react@7.37.5(eslint@9.39.1(jiti@2.6.1)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -12260,7 +12281,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -12274,16 +12295,16 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-unicorn@62.0.0(eslint@9.38.0(jiti@2.6.1)): + eslint-plugin-unicorn@62.0.0(eslint@9.39.1(jiti@2.6.1)): dependencies: '@babel/helper-validator-identifier': 7.28.5 - '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) '@eslint/plugin-kit': 0.4.1 change-case: 5.4.4 ci-info: 4.3.1 clean-regexp: 1.0.0 core-js-compat: 3.46.0 - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) esquery: 1.6.0 find-up-simple: 1.0.1 globals: 16.5.0 @@ -12353,15 +12374,15 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@9.38.0(jiti@2.6.1): + eslint@9.39.1(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.21.1 '@eslint/config-helpers': 0.4.2 - '@eslint/core': 0.16.0 + '@eslint/core': 0.17.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.38.0 + '@eslint/js': 9.39.1 '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 @@ -13412,7 +13433,7 @@ snapshots: kolorist@1.8.0: {} - ky@1.13.0: {} + ky@1.14.0: {} langium@3.3.1: dependencies: @@ -13562,7 +13583,7 @@ snapshots: log-update@6.1.0: dependencies: - ansi-escapes: 7.1.1 + ansi-escapes: 7.2.0 cli-cursor: 5.0.0 slice-ansi: 7.1.2 strip-ansi: 7.1.2 @@ -14275,7 +14296,7 @@ snapshots: package-json@10.0.1: dependencies: - ky: 1.13.0 + ky: 1.14.0 registry-auth-token: 5.1.0 registry-url: 6.0.1 semver: 7.7.3 @@ -14884,7 +14905,7 @@ snapshots: safer-buffer@2.1.2: {} - sax@1.4.2: {} + sax@1.4.3: {} scheduler@0.27.0: {} @@ -15260,7 +15281,7 @@ snapshots: - bare-abort-controller - react-native-b4a - terser@5.44.0: + terser@5.44.1: dependencies: '@jridgewell/source-map': 0.3.11 acorn: 8.15.0 @@ -15293,7 +15314,7 @@ snapshots: tinyexec@0.3.2: {} - tinyexec@1.0.1: {} + tinyexec@1.0.2: {} tinyglobby@0.2.15: dependencies: @@ -15451,13 +15472,13 @@ snapshots: typedarray@0.0.6: {} - typescript-eslint@8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.3(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.38.0(jiti@2.6.1) + '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -15720,7 +15741,7 @@ snapshots: - bare-abort-controller - react-native-b4a - vite@7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1): + vite@7.2.0(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.1): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -15733,18 +15754,18 @@ snapshots: fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2 - terser: 5.44.0 + terser: 5.44.1 yaml: 2.8.1 - vitest@4.0.6(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1): + vitest@4.0.7(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@4.0.7)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.1): dependencies: - '@vitest/expect': 4.0.6 - '@vitest/mocker': 4.0.6(vite@7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1)) - '@vitest/pretty-format': 4.0.6 - '@vitest/runner': 4.0.6 - '@vitest/snapshot': 4.0.6 - '@vitest/spy': 4.0.6 - '@vitest/utils': 4.0.6 + '@vitest/expect': 4.0.7 + '@vitest/mocker': 4.0.7(vite@7.2.0(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.1)) + '@vitest/pretty-format': 4.0.7 + '@vitest/runner': 4.0.7 + '@vitest/snapshot': 4.0.7 + '@vitest/spy': 4.0.7 + '@vitest/utils': 4.0.7 debug: 4.4.3 es-module-lexer: 1.7.0 expect-type: 1.2.2 @@ -15756,12 +15777,12 @@ snapshots: tinyexec: 0.3.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.1.12(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(yaml@2.8.1) + vite: 7.2.0(@types/node@22.17.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 '@types/node': 22.17.2 - '@vitest/ui': 4.0.6(vitest@4.0.6) + '@vitest/ui': 4.0.7(vitest@4.0.7) transitivePeerDependencies: - jiti - less @@ -15969,7 +15990,7 @@ snapshots: xml2js@0.6.2: dependencies: - sax: 1.4.2 + sax: 1.4.3 xmlbuilder: 11.0.1 xmlbuilder@11.0.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c9b130119..6fe5da64f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -6,7 +6,7 @@ packages: catalogs: lint: - eslint: 9.38.0 + eslint: ^9.39.1 prettier: ^3.6.2 typescript-eslint: ^8.46.3 types: From 1b54f7e11ad684317850b9df5efefc8c4b649f8a Mon Sep 17 00:00:00 2001 From: Pham Ngoc Duong Date: Thu, 6 Nov 2025 22:42:37 +0700 Subject: [PATCH 17/85] refactor(pplx-ext): migrate form handling to @tanstack/react-form --- .../examples/extension/package.json | 2 +- perplexity/extension/package.json | 10 +- perplexity/extension/src/assets/extension.css | 3 +- .../extension/src/components/Toaster.tsx | 7 +- .../extension/src/components/form/field.tsx | 248 ++++++++++++++++++ .../extension/src/components/ui/form.tsx | 141 ---------- .../data/dashboard/themes/built-in-colors.ts | 7 + .../data/dashboard/themes/built-in-themes.ts | 6 +- .../src/data/dashboard/themes/migration.ts | 14 +- .../src/data/dashboard/themes/theme.types.ts | 58 ++-- .../src/data/dashboard/themes/utils.ts | 16 +- .../options-page/dashboard/Dashboard.tsx | 4 +- .../ColorInput/BuiltInColorPicker.tsx | 34 +-- .../themes/components/ColorInput/index.tsx | 81 +++--- .../themes/components/ThemeCard/Banner.tsx | 6 +- .../themes/components/ThemeCard/ThemeCard.tsx | 2 +- .../pages/themes/components/ThemeForm.tsx | 183 ------------- .../themes/components/ThemeFormControls.tsx | 164 ++++++++++++ .../themes/context/EditThemeProvider.tsx | 130 --------- .../pages/themes/context/ThemeFormContext.tsx | 12 +- .../dashboard/pages/themes/context/index.ts | 7 - .../pages/themes/context/useBaseThemeForm.ts | 24 ++ .../pages/themes/hooks/useBaseThemeForm.ts | 22 -- .../pages/create-theme/CreateThemePage.tsx | 40 +-- .../themes/pages/create-theme/ThemeForm.tsx | 36 +++ .../create-theme/context.tsx} | 64 +++-- .../themes/pages/edit-theme/EditThemePage.tsx | 32 +-- .../themes/pages/edit-theme/ThemeForm.tsx | 40 +++ .../pages/themes/pages/edit-theme/context.tsx | 131 +++++++++ .../options-page/playground/Playground.tsx | 32 ++- .../rebuild-on-ext-update.bg-worker.ts | 9 +- .../indexed-db/index.ts | 2 +- .../settings-ui/FineGrainedOptions.tsx | 2 +- perplexity/extension/src/types/utils.types.ts | 4 + pnpm-lock.yaml | 189 ++++++++----- 35 files changed, 987 insertions(+), 775 deletions(-) create mode 100644 perplexity/extension/src/components/form/field.tsx delete mode 100644 perplexity/extension/src/components/ui/form.tsx delete mode 100644 perplexity/extension/src/entrypoints/options-page/dashboard/pages/themes/components/ThemeForm.tsx create mode 100644 perplexity/extension/src/entrypoints/options-page/dashboard/pages/themes/components/ThemeFormControls.tsx delete mode 100644 perplexity/extension/src/entrypoints/options-page/dashboard/pages/themes/context/EditThemeProvider.tsx delete mode 100644 perplexity/extension/src/entrypoints/options-page/dashboard/pages/themes/context/index.ts create mode 100644 perplexity/extension/src/entrypoints/options-page/dashboard/pages/themes/context/useBaseThemeForm.ts delete mode 100644 perplexity/extension/src/entrypoints/options-page/dashboard/pages/themes/hooks/useBaseThemeForm.ts create mode 100644 perplexity/extension/src/entrypoints/options-page/dashboard/pages/themes/pages/create-theme/ThemeForm.tsx rename perplexity/extension/src/entrypoints/options-page/dashboard/pages/themes/{context/CreateThemeProvider.tsx => pages/create-theme/context.tsx} (52%) create mode 100644 perplexity/extension/src/entrypoints/options-page/dashboard/pages/themes/pages/edit-theme/ThemeForm.tsx create mode 100644 perplexity/extension/src/entrypoints/options-page/dashboard/pages/themes/pages/edit-theme/context.tsx diff --git a/packages/comctx-adapters/examples/extension/package.json b/packages/comctx-adapters/examples/extension/package.json index a3152326d..adb3da11d 100644 --- a/packages/comctx-adapters/examples/extension/package.json +++ b/packages/comctx-adapters/examples/extension/package.json @@ -26,6 +26,6 @@ "prettier": "catalog:lint", "typescript": "catalog:types", "typescript-eslint": "catalog:lint", - "vite": "^7.2.0" + "vite": "^7.2.1" } } diff --git a/perplexity/extension/package.json b/perplexity/extension/package.json index 1b852aca9..ccf63ae91 100644 --- a/perplexity/extension/package.json +++ b/perplexity/extension/package.json @@ -42,13 +42,14 @@ "@complexity/async-dep-registry": "workspace:*", "@complexity/i18n": "workspace:*", "@dotenvx/dotenvx": "^1.51.1", - "@hookform/resolvers": "^5.2.2", "@radix-ui/react-collapsible": "^1.1.12", "@radix-ui/react-scroll-area": "^1.2.10", "@radix-ui/react-slot": "^1.2.4", "@radix-ui/react-toast": "^1.2.15", + "@tanstack/react-form": "^1.23.8", "@tanstack/react-query": "^5.90.7", "@tanstack/react-query-persist-client": "^5.90.9", + "@tanstack/zod-form-adapter": "^0.42.1", "@uidotdev/usehooks": "^2.4.1", "@webext-core/match-patterns": "^1.0.3", "@wxt-dev/storage": "^1.2.6", @@ -75,7 +76,6 @@ "position-observer": "^1.0.3", "react": "^19.2.0", "react-dom": "^19.2.0", - "react-hook-form": "^7.66.0", "react-hotkeys-hook": "^5.2.1", "react-lazily": "^0.9.2", "react-markdown": "^10.1.0", @@ -103,7 +103,7 @@ "@complexity/eslint-config": "workspace:*", "@complexity/typescript-config": "workspace:*", "@crxjs/vite-plugin": "^2.2.1", - "@iconify/json": "^2.2.403", + "@iconify/json": "^2.2.404", "@playwright/test": "^1.56.1", "@svgr/core": "^8.1.0", "@svgr/plugin-jsx": "^8.1.0", @@ -128,7 +128,7 @@ "@vitest/ui": "^4.0.7", "babel-plugin-react-compiler": "^1.0.0", "browserslist": "^4.27.0", - "caniuse-lite": "^1.0.30001753", + "caniuse-lite": "^1.0.30001754", "chalk": "5.6.2", "eslint": "catalog:lint", "eslint-plugin-boundaries": "^5.1.0", @@ -150,7 +150,7 @@ "typescript-eslint": "catalog:lint", "unimport": "^5.5.0", "unplugin-icons": "^22.5.0", - "vite": "^7.2.0", + "vite": "^7.2.1", "vitest": "^4.0.7" }, "engines": { diff --git a/perplexity/extension/src/assets/extension.css b/perplexity/extension/src/assets/extension.css index f9e132bfd..3f2a9a2ae 100644 --- a/perplexity/extension/src/assets/extension.css +++ b/perplexity/extension/src/assets/extension.css @@ -18,11 +18,12 @@ --font-mono: "JetBrains Mono", monospace; font-variant-ligatures: none; + font-size: 16px; } @layer base { * { - @apply x:border-border/50 x:font-sans x:text-base; + @apply x:border-border/50 x:font-sans x:text-sm; } body { diff --git a/perplexity/extension/src/components/Toaster.tsx b/perplexity/extension/src/components/Toaster.tsx index 0efaeee00..c171bac42 100644 --- a/perplexity/extension/src/components/Toaster.tsx +++ b/perplexity/extension/src/components/Toaster.tsx @@ -9,7 +9,6 @@ import { ToastViewport, } from "@/components/ui/toast"; import { useToast } from "@/components/ui/use-toast"; -import { isReactNode } from "@/types/utils.types"; export function Toaster({ viewportProps, @@ -35,8 +34,10 @@ export function Toaster({ {...props} >
- {isReactNode(title) && {title}} - {isReactNode(description) && ( + {title != null && title !== "" && ( + {title} + )} + {description != null && description !== "" && ( {description} )}
diff --git a/perplexity/extension/src/components/form/field.tsx b/perplexity/extension/src/components/form/field.tsx new file mode 100644 index 000000000..465a8e78a --- /dev/null +++ b/perplexity/extension/src/components/form/field.tsx @@ -0,0 +1,248 @@ +"use client"; + +import { cva, type VariantProps } from "class-variance-authority"; +import { useMemo } from "react"; + +import { Label } from "@/components/ui/label"; +import { Separator } from "@/components/ui/separator"; +import { cn } from "@/utils/wrappers/cn"; + +function FieldSet({ className, ...props }: React.ComponentProps<"fieldset">) { + return ( +
[data-slot=checkbox-group]]:gap-3 x:has-[>[data-slot=radio-group]]:gap-3", + className, + )} + {...props} + /> + ); +} + +function FieldLegend({ + className, + variant = "legend", + ...props +}: React.ComponentProps<"legend"> & { variant?: "legend" | "label" }) { + return ( + + ); +} + +function FieldGroup({ className, ...props }: React.ComponentProps<"div">) { + return ( +
[data-slot=field-group]]:gap-4 x:@container/field-group x:flex x:w-full x:flex-col x:gap-7 x:data-[slot=checkbox-group]:gap-3", + className, + )} + {...props} + /> + ); +} + +const fieldVariants = cva( + "x:group/field x:flex x:w-full x:gap-3 x:data-[invalid=true]:text-caution", + { + variants: { + orientation: { + vertical: ["[&>*]:w-full [&>.sr-only]:w-auto x:flex-col"], + horizontal: [ + "x:flex-row x:items-center", + "[&>[data-slot=field-label]]:flex-auto", + "x:has-[>[data-slot=field-content]]:items-start x:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px", + ], + responsive: [ + "[&>*]:w-full [&>.sr-only]:w-auto x:flex-col x:@md/field-group:flex-row x:@md/field-group:items-center x:@md/field-group:*:w-auto", + "x:@md/field-group:*:data-[slot=field-label]:flex-auto", + "x:@md/field-group:x:has-[>[data-slot=field-content]]:items-start x:@md/field-group:x:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px", + ], + }, + }, + defaultVariants: { + orientation: "vertical", + }, + }, +); + +function Field({ + className, + orientation = "vertical", + ...props +}: React.ComponentProps<"div"> & VariantProps) { + return ( +
+ ); +} + +function FieldContent({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} + +function FieldLabel({ + className, + ...props +}: React.ComponentProps) { + return ( +