Compare commits

..

24 Commits

Author SHA1 Message Date
Palanikannan M 2f76d6f4a5 chore: fix tsup vulnerability 2025-05-28 02:14:10 +05:30
Palanikannan M 8c80ace344 chore: add constants for editor meta as well 2025-05-27 23:46:26 +05:30
Palanikannan M 7fcb7981ae fix: collaborative editor editable value 2025-05-27 23:43:06 +05:30
Palanikannan M 46b951ca61 fix: image extension names 2025-05-27 23:27:12 +05:30
Palanikannan M 5b067d3a1b fix: iseditable is hard coded 2025-05-27 23:02:15 +05:30
Aaryan Khandelwal dbca7d3bf3 fix: file plugin object reference 2025-05-27 21:04:29 +05:30
Aaryan Khandelwal e9d69ff1ac Merge branch 'preview' of https://github.com/makeplane/plane into refactor/file-plugins 2025-05-27 20:30:12 +05:30
Palanikannan M c44a2096eb fix: image upload types and heading types 2025-05-27 20:23:57 +05:30
Palanikannan M 5491e320c3 fix: tsup reloading issue 2025-05-27 19:12:07 +05:30
Aaryan Khandelwal 394621116b refactor: rename extension files 2025-05-22 16:50:41 +05:30
Aaryan Khandelwal 2ec62b2f83 fix: errors and warnings 2025-05-22 15:39:31 +05:30
Aaryan Khandelwal 90c51c793c chore: use extension enums 2025-05-22 15:09:28 +05:30
Aaryan Khandelwal 017f114c73 refactor: work item embed extension 2025-05-22 13:59:10 +05:30
Aaryan Khandelwal 8725f20d38 Merge branch 'preview' of https://github.com/makeplane/plane into refactor/file-plugins 2025-05-22 13:51:45 +05:30
Palanikannan M e059bccfba chore: refactoring out onCreate into a common utility 2025-05-21 22:45:27 +05:30
Aaryan Khandelwal d9a010396d chore: remove standalone plugin extensions 2025-05-21 19:15:19 +05:30
Aaryan Khandelwal 8711669142 refactor: file plugins 2025-05-21 18:51:25 +05:30
Aaryan Khandelwal 4b3cc93fe4 refactor: utility extension 2025-05-21 18:31:44 +05:30
Aaryan Khandelwal 2223f822fa fix: build errors 2025-05-19 13:39:40 +05:30
Aaryan Khandelwal 27de6f217c chore: extension fileset storage key 2025-05-19 13:33:53 +05:30
Aaryan Khandelwal 07bc613992 chore: update meta tag name 2025-05-19 13:24:22 +05:30
Aaryan Khandelwal c042421344 refactor: image extension storage types 2025-05-19 13:18:54 +05:30
Aaryan Khandelwal fdadf91f89 Merge branch 'preview' of https://github.com/makeplane/plane into refactor/file-plugins 2025-05-19 13:14:04 +05:30
Aaryan Khandelwal 16151e99d1 refactor: file plugins and types 2025-05-16 19:13:33 +05:30
53 changed files with 264 additions and 874 deletions
+1 -1
View File
@@ -57,7 +57,7 @@
"concurrently": "^9.0.1",
"nodemon": "^3.1.7",
"ts-node": "^10.9.2",
"tsup": "8.3.0",
"tsup": "^8.5.0",
"typescript": "5.3.3"
}
}
+1 -1
View File
@@ -27,7 +27,7 @@
"@types/node": "^20.14.9",
"@types/reflect-metadata": "^0.1.0",
"@types/ws": "^8.5.10",
"tsup": "8.3.0",
"tsup": "^8.5.0",
"typescript": "^5.3.3"
},
"peerDependencies": {
+1 -1
View File
@@ -81,7 +81,7 @@
"@types/react": "^18.3.11",
"@types/react-dom": "^18.2.18",
"postcss": "^8.4.38",
"tsup": "8.3.0",
"tsup": "^8.5.0",
"typescript": "5.3.3"
},
"keywords": [
+1 -1
View File
@@ -22,7 +22,7 @@
"@plane/eslint-config": "*",
"@types/node": "^22.5.4",
"@types/react": "^18.3.11",
"tsup": "8.3.0",
"tsup": "^8.5.0",
"typescript": "^5.3.3"
}
}
-9
View File
@@ -24,13 +24,4 @@ export const SUPPORTED_LANGUAGES: ILanguageOption[] = [
{ label: "Türkçe", value: "tr-TR" },
];
/**
* Enum for translation file names
* These are the JSON files that contain translations each category
*/
export enum ETranslationFiles {
TRANSLATIONS = "translations",
ACCESSIBILITY = "accessibility",
}
export const LANGUAGE_STORAGE_KEY = "userLanguage";
@@ -1,27 +0,0 @@
{
"aria_labels": {
"projects_sidebar": {
"workspace_logo": "Logo pracovního prostoru",
"open_workspace_switcher": "Otevřít přepínač pracovního prostoru",
"open_user_menu": "Otevřít uživatelské menu",
"open_command_palette": "Otevřít paletu příkazů",
"open_extended_sidebar": "Otevřít rozšířený postranní panel",
"close_extended_sidebar": "Zavřít rozšířený postranní panel",
"create_favorites_folder": "Vytvořit složku oblíbených",
"open_folder": "Otevřít složku",
"close_folder": "Zavřít složku",
"open_favorites_menu": "Otevřít menu oblíbených",
"close_favorites_menu": "Zavřít menu oblíbených",
"enter_folder_name": "Zadejte název složky",
"create_new_project": "Vytvořit nový projekt",
"open_projects_menu": "Otevřít menu projektů",
"close_projects_menu": "Zavřít menu projektů",
"toggle_quick_actions_menu": "Přepnout menu rychlých akcí",
"open_project_menu": "Otevřít menu projektu",
"close_project_menu": "Zavřít menu projektu",
"collapse_sidebar": "Sbalit postranní panel",
"expand_sidebar": "Rozbalit postranní panel",
"edition_badge": "Otevřít modal placených plánů"
}
}
}
@@ -1,27 +0,0 @@
{
"aria_labels": {
"projects_sidebar": {
"workspace_logo": "Arbeitsbereich-Logo",
"open_workspace_switcher": "Arbeitsbereich-Umschalter öffnen",
"open_user_menu": "Benutzermenü öffnen",
"open_command_palette": "Befehlspalette öffnen",
"open_extended_sidebar": "Erweiterte Seitenleiste öffnen",
"close_extended_sidebar": "Erweiterte Seitenleiste schließen",
"create_favorites_folder": "Favoriten-Ordner erstellen",
"open_folder": "Ordner öffnen",
"close_folder": "Ordner schließen",
"open_favorites_menu": "Favoriten-Menü öffnen",
"close_favorites_menu": "Favoriten-Menü schließen",
"enter_folder_name": "Ordnername eingeben",
"create_new_project": "Neues Projekt erstellen",
"open_projects_menu": "Projekt-Menü öffnen",
"close_projects_menu": "Projekt-Menü schließen",
"toggle_quick_actions_menu": "Schnellaktionen-Menü umschalten",
"open_project_menu": "Projekt-Menü öffnen",
"close_project_menu": "Projekt-Menü schließen",
"collapse_sidebar": "Seitenleiste einklappen",
"expand_sidebar": "Seitenleiste ausklappen",
"edition_badge": "Modal für kostenpflichtige Pläne öffnen"
}
}
}
@@ -1,27 +0,0 @@
{
"aria_labels": {
"projects_sidebar": {
"workspace_logo": "Workspace logo",
"open_workspace_switcher": "Open workspace switcher",
"open_user_menu": "Open user menu",
"open_command_palette": "Open command palette",
"open_extended_sidebar": "Open extended sidebar",
"close_extended_sidebar": "Close extended sidebar",
"create_favorites_folder": "Create favorites folder",
"open_folder": "Open folder",
"close_folder": "Close folder",
"open_favorites_menu": "Open favorites menu",
"close_favorites_menu": "Close favorites menu",
"enter_folder_name": "Enter folder name",
"create_new_project": "Create new project",
"open_projects_menu": "Open projects menu",
"close_projects_menu": "Close projects menu",
"toggle_quick_actions_menu": "Toggle quick actions menu",
"open_project_menu": "Open project menu",
"close_project_menu": "Close project menu",
"collapse_sidebar": "Collapse sidebar",
"expand_sidebar": "Expand sidebar",
"edition_badge": "Open paid plans' modal"
}
}
}
@@ -2296,4 +2296,4 @@
"previously_edited_by": "Previously edited by",
"edited_by": "Edited by"
}
}
}
@@ -1,27 +0,0 @@
{
"aria_labels": {
"projects_sidebar": {
"workspace_logo": "Logo del espacio de trabajo",
"open_workspace_switcher": "Abrir cambiador de espacio de trabajo",
"open_user_menu": "Abrir menú de usuario",
"open_command_palette": "Abrir paleta de comandos",
"open_extended_sidebar": "Abrir barra lateral extendida",
"close_extended_sidebar": "Cerrar barra lateral extendida",
"create_favorites_folder": "Crear carpeta de favoritos",
"open_folder": "Abrir carpeta",
"close_folder": "Cerrar carpeta",
"open_favorites_menu": "Abrir menú de favoritos",
"close_favorites_menu": "Cerrar menú de favoritos",
"enter_folder_name": "Ingresar nombre de carpeta",
"create_new_project": "Crear nuevo proyecto",
"open_projects_menu": "Abrir menú de proyectos",
"close_projects_menu": "Cerrar menú de proyectos",
"toggle_quick_actions_menu": "Alternar menú de acciones rápidas",
"open_project_menu": "Abrir menú de proyecto",
"close_project_menu": "Cerrar menú de proyecto",
"collapse_sidebar": "Colapsar barra lateral",
"expand_sidebar": "Expandir barra lateral",
"edition_badge": "Abrir modal de planes de pago"
}
}
}
@@ -1,27 +0,0 @@
{
"aria_labels": {
"projects_sidebar": {
"workspace_logo": "Logo de l'espace de travail",
"open_workspace_switcher": "Ouvrir le sélecteur d'espace de travail",
"open_user_menu": "Ouvrir le menu utilisateur",
"open_command_palette": "Ouvrir la palette de commandes",
"open_extended_sidebar": "Ouvrir la barre latérale étendue",
"close_extended_sidebar": "Fermer la barre latérale étendue",
"create_favorites_folder": "Créer un dossier de favoris",
"open_folder": "Ouvrir le dossier",
"close_folder": "Fermer le dossier",
"open_favorites_menu": "Ouvrir le menu des favoris",
"close_favorites_menu": "Fermer le menu des favoris",
"enter_folder_name": "Saisir le nom du dossier",
"create_new_project": "Créer un nouveau projet",
"open_projects_menu": "Ouvrir le menu des projets",
"close_projects_menu": "Fermer le menu des projets",
"toggle_quick_actions_menu": "Basculer le menu d'actions rapides",
"open_project_menu": "Ouvrir le menu du projet",
"close_project_menu": "Fermer le menu du projet",
"collapse_sidebar": "Réduire la barre latérale",
"expand_sidebar": "Étendre la barre latérale",
"edition_badge": "Ouvrir le modal des plans payants"
}
}
}
@@ -1,27 +0,0 @@
{
"aria_labels": {
"projects_sidebar": {
"workspace_logo": "Logo ruang kerja",
"open_workspace_switcher": "Buka penukar ruang kerja",
"open_user_menu": "Buka menu pengguna",
"open_command_palette": "Buka palet perintah",
"open_extended_sidebar": "Buka sidebar diperluas",
"close_extended_sidebar": "Tutup sidebar diperluas",
"create_favorites_folder": "Buat folder favorit",
"open_folder": "Buka folder",
"close_folder": "Tutup folder",
"open_favorites_menu": "Buka menu favorit",
"close_favorites_menu": "Tutup menu favorit",
"enter_folder_name": "Masukkan nama folder",
"create_new_project": "Buat proyek baru",
"open_projects_menu": "Buka menu proyek",
"close_projects_menu": "Tutup menu proyek",
"toggle_quick_actions_menu": "Alihkan menu tindakan cepat",
"open_project_menu": "Buka menu proyek",
"close_project_menu": "Tutup menu proyek",
"collapse_sidebar": "Tutup sidebar",
"expand_sidebar": "Perluas sidebar",
"edition_badge": "Buka modal paket berbayar"
}
}
}
@@ -1,27 +0,0 @@
{
"aria_labels": {
"projects_sidebar": {
"workspace_logo": "Logo dell'area di lavoro",
"open_workspace_switcher": "Apri selettore area di lavoro",
"open_user_menu": "Apri menu utente",
"open_command_palette": "Apri tavolozza comandi",
"open_extended_sidebar": "Apri barra laterale estesa",
"close_extended_sidebar": "Chiudi barra laterale estesa",
"create_favorites_folder": "Crea cartella preferiti",
"open_folder": "Apri cartella",
"close_folder": "Chiudi cartella",
"open_favorites_menu": "Apri menu preferiti",
"close_favorites_menu": "Chiudi menu preferiti",
"enter_folder_name": "Inserisci nome cartella",
"create_new_project": "Crea nuovo progetto",
"open_projects_menu": "Apri menu progetti",
"close_projects_menu": "Chiudi menu progetti",
"toggle_quick_actions_menu": "Attiva/disattiva menu azioni rapide",
"open_project_menu": "Apri menu progetto",
"close_project_menu": "Chiudi menu progetto",
"collapse_sidebar": "Comprimi barra laterale",
"expand_sidebar": "Espandi barra laterale",
"edition_badge": "Apri modal piani a pagamento"
}
}
}
@@ -1,27 +0,0 @@
{
"aria_labels": {
"projects_sidebar": {
"workspace_logo": "ワークスペースロゴ",
"open_workspace_switcher": "ワークスペーススイッチャーを開く",
"open_user_menu": "ユーザーメニューを開く",
"open_command_palette": "コマンドパレットを開く",
"open_extended_sidebar": "拡張サイドバーを開く",
"close_extended_sidebar": "拡張サイドバーを閉じる",
"create_favorites_folder": "お気に入りフォルダを作成",
"open_folder": "フォルダを開く",
"close_folder": "フォルダを閉じる",
"open_favorites_menu": "お気に入りメニューを開く",
"close_favorites_menu": "お気に入りメニューを閉じる",
"enter_folder_name": "フォルダ名を入力",
"create_new_project": "新しいプロジェクトを作成",
"open_projects_menu": "プロジェクトメニューを開く",
"close_projects_menu": "プロジェクトメニューを閉じる",
"toggle_quick_actions_menu": "クイックアクションメニューの切り替え",
"open_project_menu": "プロジェクトメニューを開く",
"close_project_menu": "プロジェクトメニューを閉じる",
"collapse_sidebar": "サイドバーを折りたたむ",
"expand_sidebar": "サイドバーを展開",
"edition_badge": "有料プランのモーダルを開く"
}
}
}
@@ -1,27 +0,0 @@
{
"aria_labels": {
"projects_sidebar": {
"workspace_logo": "워크스페이스 로고",
"open_workspace_switcher": "워크스페이스 전환기 열기",
"open_user_menu": "사용자 메뉴 열기",
"open_command_palette": "명령 팔레트 열기",
"open_extended_sidebar": "확장된 사이드바 열기",
"close_extended_sidebar": "확장된 사이드바 닫기",
"create_favorites_folder": "즐겨찾기 폴더 생성",
"open_folder": "폴더 열기",
"close_folder": "폴더 닫기",
"open_favorites_menu": "즐겨찾기 메뉴 열기",
"close_favorites_menu": "즐겨찾기 메뉴 닫기",
"enter_folder_name": "폴더 이름 입력",
"create_new_project": "새 프로젝트 생성",
"open_projects_menu": "프로젝트 메뉴 열기",
"close_projects_menu": "프로젝트 메뉴 닫기",
"toggle_quick_actions_menu": "빠른 작업 메뉴 토글",
"open_project_menu": "프로젝트 메뉴 열기",
"close_project_menu": "프로젝트 메뉴 닫기",
"collapse_sidebar": "사이드바 축소",
"expand_sidebar": "사이드바 확장",
"edition_badge": "유료 플랜 모달 열기"
}
}
}
@@ -1,27 +0,0 @@
{
"aria_labels": {
"projects_sidebar": {
"workspace_logo": "Logo obszaru roboczego",
"open_workspace_switcher": "Otwórz przełącznik obszaru roboczego",
"open_user_menu": "Otwórz menu użytkownika",
"open_command_palette": "Otwórz paletę poleceń",
"open_extended_sidebar": "Otwórz rozszerzoną pasek boczny",
"close_extended_sidebar": "Zamknij rozszerzoną pasek boczny",
"create_favorites_folder": "Utwórz folder ulubionych",
"open_folder": "Otwórz folder",
"close_folder": "Zamknij folder",
"open_favorites_menu": "Otwórz menu ulubionych",
"close_favorites_menu": "Zamknij menu ulubionych",
"enter_folder_name": "Wprowadź nazwę folderu",
"create_new_project": "Utwórz nowy projekt",
"open_projects_menu": "Otwórz menu projektów",
"close_projects_menu": "Zamknij menu projektów",
"toggle_quick_actions_menu": "Przełącz menu szybkich akcji",
"open_project_menu": "Otwórz menu projektu",
"close_project_menu": "Zamknij menu projektu",
"collapse_sidebar": "Zwiń pasek boczny",
"expand_sidebar": "Rozwiń pasek boczny",
"edition_badge": "Otwórz modal płatnych planów"
}
}
}
@@ -1,27 +0,0 @@
{
"aria_labels": {
"projects_sidebar": {
"workspace_logo": "Logo do espaço de trabalho",
"open_workspace_switcher": "Abrir seletor de espaço de trabalho",
"open_user_menu": "Abrir menu do usuário",
"open_command_palette": "Abrir paleta de comandos",
"open_extended_sidebar": "Abrir barra lateral estendida",
"close_extended_sidebar": "Fechar barra lateral estendida",
"create_favorites_folder": "Criar pasta de favoritos",
"open_folder": "Abrir pasta",
"close_folder": "Fechar pasta",
"open_favorites_menu": "Abrir menu de favoritos",
"close_favorites_menu": "Fechar menu de favoritos",
"enter_folder_name": "Digite o nome da pasta",
"create_new_project": "Criar novo projeto",
"open_projects_menu": "Abrir menu de projetos",
"close_projects_menu": "Fechar menu de projetos",
"toggle_quick_actions_menu": "Alternar menu de ações rápidas",
"open_project_menu": "Abrir menu do projeto",
"close_project_menu": "Fechar menu do projeto",
"collapse_sidebar": "Recolher barra lateral",
"expand_sidebar": "Expandir barra lateral",
"edition_badge": "Abrir modal de planos pagos"
}
}
}
@@ -1,27 +0,0 @@
{
"aria_labels": {
"projects_sidebar": {
"workspace_logo": "Logo spațiu de lucru",
"open_workspace_switcher": "Deschide comutator spațiu de lucru",
"open_user_menu": "Deschide meniul utilizatorului",
"open_command_palette": "Deschide paleta de comenzi",
"open_extended_sidebar": "Deschide bara laterală extinsă",
"close_extended_sidebar": "Închide bara laterală extinsă",
"create_favorites_folder": "Creează folder de favorite",
"open_folder": "Deschide folderul",
"close_folder": "Închide folderul",
"open_favorites_menu": "Deschide meniul de favorite",
"close_favorites_menu": "Închide meniul de favorite",
"enter_folder_name": "Introduceți numele folderului",
"create_new_project": "Creează proiect nou",
"open_projects_menu": "Deschide meniul de proiecte",
"close_projects_menu": "Închide meniul de proiecte",
"toggle_quick_actions_menu": "Comută meniul de acțiuni rapide",
"open_project_menu": "Deschide meniul proiectului",
"close_project_menu": "Închide meniul proiectului",
"collapse_sidebar": "Restrânge bara laterală",
"expand_sidebar": "Extinde bara laterală",
"edition_badge": "Deschide modalul planurilor plătite"
}
}
}
@@ -1,27 +0,0 @@
{
"aria_labels": {
"projects_sidebar": {
"workspace_logo": "Логотип рабочей области",
"open_workspace_switcher": "Открыть переключатель рабочей области",
"open_user_menu": "Открыть пользовательское меню",
"open_command_palette": "Открыть палитру команд",
"open_extended_sidebar": "Открыть расширенную боковую панель",
"close_extended_sidebar": "Закрыть расширенную боковую панель",
"create_favorites_folder": "Создать папку избранного",
"open_folder": "Открыть папку",
"close_folder": "Закрыть папку",
"open_favorites_menu": "Открыть меню избранного",
"close_favorites_menu": "Закрыть меню избранного",
"enter_folder_name": "Введите имя папки",
"create_new_project": "Создать новый проект",
"open_projects_menu": "Открыть меню проектов",
"close_projects_menu": "Закрыть меню проектов",
"toggle_quick_actions_menu": "Переключить меню быстрых действий",
"open_project_menu": "Открыть меню проекта",
"close_project_menu": "Закрыть меню проекта",
"collapse_sidebar": "Свернуть боковую панель",
"expand_sidebar": "Развернуть боковую панель",
"edition_badge": "Открыть модал платных планов"
}
}
}
@@ -1,27 +0,0 @@
{
"aria_labels": {
"projects_sidebar": {
"workspace_logo": "Logo pracovného priestoru",
"open_workspace_switcher": "Otvoriť prepínač pracovného priestoru",
"open_user_menu": "Otvoriť používateľské menu",
"open_command_palette": "Otvoriť paletu príkazov",
"open_extended_sidebar": "Otvoriť rozšírený bočný panel",
"close_extended_sidebar": "Zavrieť rozšírený bočný panel",
"create_favorites_folder": "Vytvoriť priečinok obľúbených",
"open_folder": "Otvoriť priečinok",
"close_folder": "Zavrieť priečinok",
"open_favorites_menu": "Otvoriť menu obľúbených",
"close_favorites_menu": "Zavrieť menu obľúbených",
"enter_folder_name": "Zadajte názov priečinka",
"create_new_project": "Vytvoriť nový projekt",
"open_projects_menu": "Otvoriť menu projektov",
"close_projects_menu": "Zavrieť menu projektov",
"toggle_quick_actions_menu": "Prepnúť menu rýchlych akcií",
"open_project_menu": "Otvoriť menu projektu",
"close_project_menu": "Zavrieť menu projektu",
"collapse_sidebar": "Zbaliť bočný panel",
"expand_sidebar": "Rozbaliť bočný panel",
"edition_badge": "Otvoriť modal platených plánov"
}
}
}
@@ -1,27 +0,0 @@
{
"aria_labels": {
"projects_sidebar": {
"workspace_logo": "Çalışma alanı logosu",
"open_workspace_switcher": "Çalışma alanı değiştiricisini aç",
"open_user_menu": "Kullanıcı menüsünü aç",
"open_command_palette": "Komut paletini aç",
"open_extended_sidebar": "Genişletilmiş kenar çubuğunu aç",
"close_extended_sidebar": "Genişletilmiş kenar çubuğunu kapat",
"create_favorites_folder": "Favoriler klasörü oluştur",
"open_folder": "Klasörü aç",
"close_folder": "Klasörü kapat",
"open_favorites_menu": "Favoriler menüsünü aç",
"close_favorites_menu": "Favoriler menüsünü kapat",
"enter_folder_name": "Klasör adını girin",
"create_new_project": "Yeni proje oluştur",
"open_projects_menu": "Projeler menüsünü aç",
"close_projects_menu": "Projeler menüsünü kapat",
"toggle_quick_actions_menu": "Hızlı eylemler menüsünü aç/kapat",
"open_project_menu": "Proje menüsünü aç",
"close_project_menu": "Proje menüsünü kapat",
"collapse_sidebar": "Kenar çubuğunu daralt",
"expand_sidebar": "Kenar çubuğunu genişlet",
"edition_badge": "Ücretli planlar modalını aç"
}
}
}
@@ -1,27 +0,0 @@
{
"aria_labels": {
"projects_sidebar": {
"workspace_logo": "Логотип робочого простору",
"open_workspace_switcher": "Відкрити перемикач робочого простору",
"open_user_menu": "Відкрити меню користувача",
"open_command_palette": "Відкрити палітру команд",
"open_extended_sidebar": "Відкрити розширену бічну панель",
"close_extended_sidebar": "Закрити розширену бічну панель",
"create_favorites_folder": "Створити папку улюблених",
"open_folder": "Відкрити папку",
"close_folder": "Закрити папку",
"open_favorites_menu": "Відкрити меню улюблених",
"close_favorites_menu": "Закрити меню улюблених",
"enter_folder_name": "Введіть назву папки",
"create_new_project": "Створити новий проект",
"open_projects_menu": "Відкрити меню проектів",
"close_projects_menu": "Закрити меню проектів",
"toggle_quick_actions_menu": "Перемкнути меню швидких дій",
"open_project_menu": "Відкрити меню проекту",
"close_project_menu": "Закрити меню проекту",
"collapse_sidebar": "Згорнути бічну панель",
"expand_sidebar": "Розгорнути бічну панель",
"edition_badge": "Відкрити модал платних планів"
}
}
}
@@ -1,27 +0,0 @@
{
"aria_labels": {
"projects_sidebar": {
"workspace_logo": "Logo không gian làm việc",
"open_workspace_switcher": "Mở trình chuyển đổi không gian làm việc",
"open_user_menu": "Mở menu người dùng",
"open_command_palette": "Mở bảng lệnh",
"open_extended_sidebar": "Mở thanh bên mở rộng",
"close_extended_sidebar": "Đóng thanh bên mở rộng",
"create_favorites_folder": "Tạo thư mục yêu thích",
"open_folder": "Mở thư mục",
"close_folder": "Đóng thư mục",
"open_favorites_menu": "Mở menu yêu thích",
"close_favorites_menu": "Đóng menu yêu thích",
"enter_folder_name": "Nhập tên thư mục",
"create_new_project": "Tạo dự án mới",
"open_projects_menu": "Mở menu dự án",
"close_projects_menu": "Đóng menu dự án",
"toggle_quick_actions_menu": "Bật/tắt menu hành động nhanh",
"open_project_menu": "Mở menu dự án",
"close_project_menu": "Đóng menu dự án",
"collapse_sidebar": "Thu gọn thanh bên",
"expand_sidebar": "Mở rộng thanh bên",
"edition_badge": "Mở modal gói trả phí"
}
}
}
@@ -1,27 +0,0 @@
{
"aria_labels": {
"projects_sidebar": {
"workspace_logo": "工作空间徽标",
"open_workspace_switcher": "打开工作空间切换器",
"open_user_menu": "打开用户菜单",
"open_command_palette": "打开命令面板",
"open_extended_sidebar": "打开扩展侧边栏",
"close_extended_sidebar": "关闭扩展侧边栏",
"create_favorites_folder": "创建收藏夹文件夹",
"open_folder": "打开文件夹",
"close_folder": "关闭文件夹",
"open_favorites_menu": "打开收藏夹菜单",
"close_favorites_menu": "关闭收藏夹菜单",
"enter_folder_name": "输入文件夹名称",
"create_new_project": "创建新项目",
"open_projects_menu": "打开项目菜单",
"close_projects_menu": "关闭项目菜单",
"toggle_quick_actions_menu": "切换快速操作菜单",
"open_project_menu": "打开项目菜单",
"close_project_menu": "关闭项目菜单",
"collapse_sidebar": "折叠侧边栏",
"expand_sidebar": "展开侧边栏",
"edition_badge": "打开付费计划模态框"
}
}
}
@@ -1,27 +0,0 @@
{
"aria_labels": {
"projects_sidebar": {
"workspace_logo": "工作空間標誌",
"open_workspace_switcher": "打開工作空間切換器",
"open_user_menu": "打開用戶選單",
"open_command_palette": "打開命令面板",
"open_extended_sidebar": "打開擴展側邊欄",
"close_extended_sidebar": "關閉擴展側邊欄",
"create_favorites_folder": "創建收藏夾文件夾",
"open_folder": "打開文件夾",
"close_folder": "關閉文件夾",
"open_favorites_menu": "打開收藏夾選單",
"close_favorites_menu": "關閉收藏夾選單",
"enter_folder_name": "輸入文件夾名稱",
"create_new_project": "創建新項目",
"open_projects_menu": "打開項目選單",
"close_projects_menu": "關閉項目選單",
"toggle_quick_actions_menu": "切換快速操作選單",
"open_project_menu": "打開項目選單",
"close_project_menu": "關閉項目選單",
"collapse_sidebar": "摺疊側邊欄",
"expand_sidebar": "展開側邊欄",
"edition_badge": "打開付費計劃模態框"
}
}
}
+44 -22
View File
@@ -3,7 +3,7 @@ import get from "lodash/get";
import merge from "lodash/merge";
import { makeAutoObservable, runInAction } from "mobx";
// constants
import { FALLBACK_LANGUAGE, SUPPORTED_LANGUAGES, LANGUAGE_STORAGE_KEY, ETranslationFiles } from "../constants";
import { FALLBACK_LANGUAGE, SUPPORTED_LANGUAGES, LANGUAGE_STORAGE_KEY } from "../constants";
// core translations imports
import coreEn from "../locales/en/core.json";
// types
@@ -130,32 +130,54 @@ export class TranslationStore {
}
}
/**
* Helper function to import and merge multiple translation files for a language
* @param language - The language code
* @param files - Array of file names to import (without .json extension)
* @returns Promise that resolves to merged translations
*/
private async importAndMergeFiles(language: TLanguage, files: string[]): Promise<any> {
try {
const importPromises = files.map((file) => import(`../locales/${language}/${file}.json`));
const modules = await Promise.all(importPromises);
const merged = modules.reduce((acc, module) => merge(acc, module.default), {});
return { default: merged };
} catch (error) {
throw new Error(`Failed to import and merge files for ${language}: ${error}`);
}
}
/**
* Imports the translations for the given language
* @param language - The language to import the translations for
* @returns {Promise<any>}
*/
private async importLanguageFile(language: TLanguage): Promise<any> {
const files = Object.values(ETranslationFiles);
return this.importAndMergeFiles(language, files);
private importLanguageFile(language: TLanguage): Promise<any> {
switch (language) {
case "en":
return import("../locales/en/translations.json");
case "fr":
return import("../locales/fr/translations.json");
case "es":
return import("../locales/es/translations.json");
case "ja":
return import("../locales/ja/translations.json");
case "zh-CN":
return import("../locales/zh-CN/translations.json");
case "zh-TW":
return import("../locales/zh-TW/translations.json");
case "ru":
return import("../locales/ru/translations.json");
case "it":
return import("../locales/it/translations.json");
case "cs":
return import("../locales/cs/translations.json");
case "sk":
return import("../locales/sk/translations.json");
case "de":
return import("../locales/de/translations.json");
case "ua":
return import("../locales/ua/translations.json");
case "pl":
return import("../locales/pl/translations.json");
case "ko":
return import("../locales/ko/translations.json");
case "pt-BR":
return import("../locales/pt-BR/translations.json");
case "id":
return import("../locales/id/translations.json");
case "ro":
return import("../locales/ro/translations.json");
case "vi-VN":
return import("../locales/vi-VN/translations.json");
case "tr-TR":
return import("../locales/tr-TR/translations.json");
default:
throw new Error(`Unsupported language: ${language}`);
}
}
/** Checks if the language is valid based on the supported languages */
+1 -1
View File
@@ -71,7 +71,7 @@
"postcss-cli": "^11.0.0",
"postcss-nested": "^6.0.1",
"storybook": "^8.1.1",
"tsup": "8.3.0",
"tsup": "^8.5.0",
"typescript": "5.3.3"
}
}
+1 -1
View File
@@ -160,7 +160,7 @@ export const Avatar: React.FC<Props> = (props) => {
color: fallbackTextColor ?? "#ffffff",
}}
>
{name?.[0]?.toUpperCase() ?? fallbackText ?? "?"}
{name ? name[0].toUpperCase() : fallbackText ?? "?"}
</div>
)}
</div>
+1 -5
View File
@@ -14,7 +14,6 @@ import { ICustomMenuDropdownProps, ICustomMenuItemProps } from "./helper";
const CustomMenu = (props: ICustomMenuDropdownProps) => {
const {
ariaLabel,
buttonClassName = "",
customButtonClassName = "",
customButtonTabIndex = 0,
@@ -76,7 +75,7 @@ const CustomMenu = (props: ICustomMenuDropdownProps) => {
e.stopPropagation();
e.preventDefault();
isOpen ? closeDropdown() : openDropdown();
menuButtonOnClick?.();
if (menuButtonOnClick) menuButtonOnClick();
};
const handleMouseEnter = () => {
@@ -148,7 +147,6 @@ const CustomMenu = (props: ICustomMenuDropdownProps) => {
className={customButtonClassName}
tabIndex={customButtonTabIndex}
disabled={disabled}
aria-label={ariaLabel}
>
{customButton}
</button>
@@ -166,7 +164,6 @@ const CustomMenu = (props: ICustomMenuDropdownProps) => {
disabled ? "cursor-not-allowed" : "cursor-pointer hover:bg-custom-background-80"
} ${buttonClassName}`}
tabIndex={customButtonTabIndex}
aria-label={ariaLabel}
>
<MoreHorizontal className={`h-3.5 w-3.5 ${verticalEllipsis ? "rotate-90" : ""}`} />
</button>
@@ -186,7 +183,6 @@ const CustomMenu = (props: ICustomMenuDropdownProps) => {
onClick={handleMenuButtonClick}
tabIndex={customButtonTabIndex}
disabled={disabled}
aria-label={ariaLabel}
>
{label}
{!noChevron && <ChevronDown className="h-3.5 w-3.5" />}
-1
View File
@@ -32,7 +32,6 @@ export interface ICustomMenuDropdownProps extends IDropdownProps {
closeOnSelect?: boolean;
portalElement?: Element | null;
openOnHover?: boolean;
ariaLabel?: string;
}
export interface ICustomSelectProps extends IDropdownProps {
+1 -1
View File
@@ -29,7 +29,7 @@
"@types/node": "^22.5.4",
"@types/react": "^18.3.11",
"@types/zxcvbn": "^4.4.5",
"tsup": "8.3.0",
"tsup": "^8.5.0",
"typescript": "^5.3.3"
}
}
@@ -96,7 +96,7 @@ export const ExtendedAppSidebar = observer(() => {
useExtendedSidebarOutsideClickDetector(
extendedSidebarRef,
() => toggleExtendedSidebar(true),
() => toggleExtendedSidebar(false),
"extended-sidebar-toggle"
);
@@ -106,8 +106,8 @@ export const ExtendedAppSidebar = observer(() => {
className={cn(
"absolute top-0 h-full z-[19] flex flex-col gap-0.5 w-[300px] transform transition-all duration-300 ease-in-out bg-custom-sidebar-background-100 border-r border-custom-sidebar-border-200 p-4 shadow-md pb-6",
{
"-translate-x-full opacity-0 pointer-events-none": extendedSidebarCollapsed,
"translate-x-0 opacity-100 pointer-events-auto": !extendedSidebarCollapsed,
"translate-x-0 opacity-100 pointer-events-auto": extendedSidebarCollapsed,
"-translate-x-full opacity-0 pointer-events-none": !extendedSidebarCollapsed,
"left-[70px]": sidebarCollapsed,
"left-[250px]": !sidebarCollapsed,
}
@@ -1,8 +1,7 @@
import { useState } from "react";
import { observer } from "mobx-react";
import packageJson from "package.json";
// plane imports
import { useTranslation } from "@plane/i18n";
// ui
import { Button, Tooltip } from "@plane/ui";
// hooks
import { usePlatformOS } from "@/hooks/use-platform-os";
@@ -10,12 +9,9 @@ import { usePlatformOS } from "@/hooks/use-platform-os";
import { PaidPlanUpgradeModal } from "../license";
export const WorkspaceEditionBadge = observer(() => {
const { isMobile } = usePlatformOS();
// states
const [isPaidPlanPurchaseModalOpen, setIsPaidPlanPurchaseModalOpen] = useState(false);
// translation
const { t } = useTranslation();
// platform
const { isMobile } = usePlatformOS();
return (
<>
@@ -29,8 +25,6 @@ export const WorkspaceEditionBadge = observer(() => {
variant="accent-primary"
className="w-fit min-w-24 cursor-pointer rounded-2xl px-2 py-1 text-center text-sm font-medium outline-none"
onClick={() => setIsPaidPlanPurchaseModalOpen(true)}
aria-haspopup="dialog"
aria-label={t("aria_labels.projects_sidebar.edition_badge")}
>
Community
</Button>
@@ -1,7 +1,5 @@
import { observer } from "mobx-react";
import { Search } from "lucide-react";
// plane imports
import { useTranslation } from "@plane/i18n";
// helpers
import { cn } from "@/helpers/common.helper";
// hooks
@@ -11,12 +9,9 @@ export const AppSearch = observer(() => {
// store hooks
const { sidebarCollapsed } = useAppTheme();
const { toggleCommandPaletteModal } = useCommandPalette();
// translation
const { t } = useTranslation();
return (
<button
type="button"
className={cn(
"flex-shrink-0 size-8 aspect-square grid place-items-center rounded hover:bg-custom-sidebar-background-90 outline-none",
{
@@ -24,7 +19,6 @@ export const AppSearch = observer(() => {
}
)}
onClick={() => toggleCommandPaletteModal(true)}
aria-label={t("aria_labels.projects_sidebar.open_command_palette")}
>
<Search className="size-4 text-custom-sidebar-text-300" />
</button>
@@ -55,7 +55,7 @@ export const ExtendedSidebarItem: FC<TExtendedSidebarItemProps> = observer((prop
const sidebarPreference = getNavigationPreferences(workspaceSlug.toString());
const isPinned = sidebarPreference?.[item.key]?.is_pinned;
const handleLinkClick = () => toggleExtendedSidebar(true);
const handleLinkClick = () => toggleExtendedSidebar();
if (!allowPermissions(item.access as any, EUserPermissionsLevel.WORKSPACE, workspaceSlug.toString())) {
return null;
@@ -38,7 +38,7 @@ export const SidebarItem: FC<TSidebarItemProps> = observer((props) => {
if (window.innerWidth < 768) {
toggleSidebar();
}
if (!extendedSidebarCollapsed) toggleExtendedSidebar();
if (extendedSidebarCollapsed) toggleExtendedSidebar();
};
const staticItems = ["home", "inbox", "pi-chat", "projects"];
+2 -2
View File
@@ -1,7 +1,7 @@
import { Briefcase, FileText, Layers, LucideIcon } from "lucide-react";
import { Briefcase, ContrastIcon, FileText, Layers, LucideIcon } from "lucide-react";
// plane imports
import { IFavorite } from "@plane/types";
import { ContrastIcon, DiceIcon, FavoriteFolderIcon, ISvgIcons } from "@plane/ui";
import { DiceIcon, FavoriteFolderIcon, ISvgIcons } from "@plane/ui";
export const FAVORITE_ITEM_ICONS: Record<string, React.FC<ISvgIcons> | LucideIcon> = {
page: FileText,
@@ -32,7 +32,7 @@ type Options = {
export const cycleEstimateOptions: Options[] = [
{ value: "issues", label: "Work items" },
{ value: "points", label: "Estimates" },
{ value: "points", label: "Points" },
];
export const cycleChartOptions: Options[] = [
{ value: "burndown", label: "Burn-down" },
@@ -1,7 +1,5 @@
import React from "react";
import { observer } from "mobx-react-lite";
import { TCycleEstimateType } from "@plane/types";
import { EEstimateSystem } from "@plane/types/src/enums";
import { CustomSelect } from "@plane/ui";
import { useCycle, useProjectEstimates } from "@/hooks/store";
import { cycleEstimateOptions } from "../analytics-sidebar";
@@ -14,13 +12,12 @@ type TProps = {
cycleId: string;
};
export const EstimateTypeDropdown = observer((props: TProps) => {
export const EstimateTypeDropdown = (props: TProps) => {
const { value, onChange, projectId, cycleId, showDefault = false } = props;
const { getIsPointsDataAvailable } = useCycle();
const { areEstimateEnabledByProjectId, currentProjectEstimateType } = useProjectEstimates();
const { areEstimateEnabledByProjectId } = useProjectEstimates();
const isCurrentProjectEstimateEnabled = projectId && areEstimateEnabledByProjectId(projectId) ? true : false;
return (getIsPointsDataAvailable(cycleId) || isCurrentProjectEstimateEnabled) &&
currentProjectEstimateType !== EEstimateSystem.CATEGORIES ? (
return getIsPointsDataAvailable(cycleId) || isCurrentProjectEstimateEnabled ? (
<div className="relative flex items-center gap-2">
<CustomSelect
value={value}
@@ -39,4 +36,4 @@ export const EstimateTypeDropdown = observer((props: TProps) => {
) : showDefault ? (
<span className="capitalize">{value}</span>
) : null;
});
};
+20 -27
View File
@@ -1,6 +1,4 @@
import { observer } from "mobx-react";
// plane imports
import { useTranslation } from "@plane/i18n";
// plane utils
import { cn } from "@plane/utils";
// helpers
import { getFileURL } from "@/helpers/file.helper";
@@ -11,27 +9,22 @@ type Props = {
classNames?: string;
};
export const WorkspaceLogo = observer((props: Props) => {
// translation
const { t } = useTranslation();
return (
<div
className={cn(
`relative grid h-6 w-6 flex-shrink-0 place-items-center uppercase ${
!props.logo && "rounded bg-custom-primary-500 text-white"
} ${props.classNames ? props.classNames : ""}`
)}
>
{props.logo && props.logo !== "" ? (
<img
src={getFileURL(props.logo)}
className="absolute left-0 top-0 h-full w-full rounded object-cover"
alt={t("aria_labels.projects_sidebar.workspace_logo")}
/>
) : (
(props.name?.[0] ?? "...")
)}
</div>
);
});
export const WorkspaceLogo = (props: Props) => (
<div
className={cn(
`relative grid h-6 w-6 flex-shrink-0 place-items-center uppercase ${
!props.logo && "rounded bg-custom-primary-500 text-white"
} ${props.classNames ? props.classNames : ""}`
)}
>
{props.logo && props.logo !== "" ? (
<img
src={getFileURL(props.logo)}
className="absolute left-0 top-0 h-full w-full rounded object-cover"
alt="Workspace Logo"
/>
) : (
(props.name?.charAt(0) ?? "...")
)}
</div>
);
@@ -25,17 +25,21 @@ import { WorkspaceLogo } from "../logo";
import SidebarDropdownItem from "./dropdown-item";
export const SidebarDropdown = observer(() => {
const { t } = useTranslation();
// store hooks
const { sidebarCollapsed, toggleSidebar } = useAppTheme();
const { data: currentUser } = useUser();
const { signOut } = useUser();
const {
// updateCurrentUser,
// isUserInstanceAdmin,
signOut,
} = useUser();
const { updateUserProfile } = useUserProfile();
const { currentWorkspace: activeWorkspace, workspaces } = useWorkspace();
// derived values
const isWorkspaceCreationEnabled = getIsWorkspaceCreationDisabled() === false;
const isUserInstanceAdmin = false;
// translation
const { t } = useTranslation();
const { currentWorkspace: activeWorkspace, workspaces } = useWorkspace();
// popper-js refs
const [referenceElement, setReferenceElement] = useState<HTMLButtonElement | null>(null);
const [popperElement, setPopperElement] = useState<HTMLDivElement | null>(null);
@@ -83,7 +87,6 @@ export const SidebarDropdown = observer(() => {
"group/menu-button flex items-center justify-between gap-1 p-1 truncate rounded text-sm font-medium text-custom-sidebar-text-200 hover:bg-custom-sidebar-background-80 focus:outline-none",
{ "flex-grow": !sidebarCollapsed }
)}
aria-label={t("aria_labels.projects_sidebar.open_workspace_switcher")}
>
<div className="flex-grow flex items-center gap-2 truncate">
<WorkspaceLogo logo={activeWorkspace?.logo_url} name={activeWorkspace?.name} />
@@ -187,11 +190,7 @@ export const SidebarDropdown = observer(() => {
)}
</Menu>
<Menu as="div" className="relative flex-shrink-0">
<Menu.Button
className="grid place-items-center outline-none"
ref={setReferenceElement}
aria-label={t("aria_labels.projects_sidebar.open_user_menu")}
>
<Menu.Button className="grid place-items-center outline-none" ref={setReferenceElement}>
<Avatar
name={currentUser?.display_name}
src={getFileURL(currentUser?.avatar_url ?? "")}
@@ -17,9 +17,10 @@ import { useParams } from "next/navigation";
import { createRoot } from "react-dom/client";
import { PenSquare, Star, MoreHorizontal, ChevronRight, GripVertical } from "lucide-react";
import { Disclosure, Transition } from "@headlessui/react";
// plane imports
// plane helpers
import { useOutsideClickDetector } from "@plane/hooks";
import { useTranslation } from "@plane/i18n";
// ui
import { IFavorite, InstructionType } from "@plane/types";
import { CustomMenu, Tooltip, DropIndicator, FavoriteFolderIcon, DragHandle } from "@plane/ui";
// helpers
@@ -28,7 +29,7 @@ import { cn } from "@/helpers/common.helper";
import { useAppTheme } from "@/hooks/store";
import { useFavorite } from "@/hooks/store/use-favorite";
import { usePlatformOS } from "@/hooks/use-platform-os";
// local imports
// constants
import { FavoriteRoot } from "./favorite-items";
import { getCanDrop, getInstructionFromPayload } from "./favorites.helpers";
import { NewFavoriteFolder } from "./new-fav-folder";
@@ -53,11 +54,10 @@ export const FavoriteFolder: React.FC<Props> = (props) => {
const [isDragging, setIsDragging] = useState(false);
const [folderToRename, setFolderToRename] = useState<string | boolean | null>(null);
const [instruction, setInstruction] = useState<InstructionType | undefined>(undefined);
// refs
const actionSectionRef = useRef<HTMLDivElement | null>(null);
const elementRef = useRef<HTMLDivElement | null>(null);
// translation
const { t } = useTranslation();
useEffect(() => {
if (favorite.children === undefined && workspaceSlug) {
@@ -231,11 +231,11 @@ export const FavoriteFolder: React.FC<Props> = (props) => {
<span
ref={actionSectionRef}
className="grid place-items-center p-0.5 text-custom-sidebar-text-400 hover:bg-custom-sidebar-background-80 rounded"
onClick={() => setIsMenuActive(!isMenuActive)}
>
<MoreHorizontal className="size-3" />
<MoreHorizontal className="size-4" />
</span>
}
menuButtonOnClick={() => setIsMenuActive(!isMenuActive)}
className={cn(
"opacity-0 pointer-events-none flex-shrink-0 group-hover/project-item:opacity-100 group-hover/project-item:pointer-events-auto",
{
@@ -244,7 +244,6 @@ export const FavoriteFolder: React.FC<Props> = (props) => {
)}
customButtonClassName="grid place-items-center"
placement="bottom-start"
ariaLabel={t("aria_labels.projects_sidebar.toggle_quick_actions_menu")}
>
<CustomMenu.MenuItem onClick={() => handleRemoveFromFavorites(favorite)}>
<span className="flex items-center justify-start gap-2">
@@ -268,12 +267,9 @@ export const FavoriteFolder: React.FC<Props> = (props) => {
"inline-block": isMenuActive,
}
)}
aria-label={t(
open ? "aria_labels.projects_sidebar.close_folder" : "aria_labels.projects_sidebar.open_folder"
)}
>
<ChevronRight
className={cn("size-3 flex-shrink-0 text-custom-sidebar-text-400 transition-transform", {
className={cn("size-4 flex-shrink-0 text-custom-sidebar-text-400 transition-transform", {
"rotate-90": open,
})}
/>
@@ -1,10 +1,8 @@
"use client";
import React, { FC } from "react";
import { observer } from "mobx-react";
import { MoreHorizontal, Star } from "lucide-react";
// plane imports
import { useTranslation } from "@plane/i18n";
import { IFavorite } from "@plane/types";
// ui
import { CustomMenu } from "@plane/ui";
// helpers
import { cn } from "@/helpers/common.helper";
@@ -17,22 +15,19 @@ type Props = {
handleRemoveFromFavorites: (favorite: IFavorite) => void;
};
export const FavoriteItemQuickAction: FC<Props> = observer((props) => {
export const FavoriteItemQuickAction: FC<Props> = (props) => {
const { ref, isMenuActive, onChange, handleRemoveFromFavorites, favorite } = props;
// translation
const { t } = useTranslation();
return (
<CustomMenu
customButton={
<span
ref={ref}
className="grid place-items-center p-0.5 text-custom-sidebar-text-400 hover:bg-custom-sidebar-background-80 rounded"
onClick={() => onChange(!isMenuActive)}
>
<MoreHorizontal className="size-4" />
</span>
}
menuButtonOnClick={() => onChange(!isMenuActive)}
className={cn(
"opacity-0 pointer-events-none flex-shrink-0 group-hover/project-item:opacity-100 group-hover/project-item:pointer-events-auto",
{
@@ -41,7 +36,6 @@ export const FavoriteItemQuickAction: FC<Props> = observer((props) => {
)}
customButtonClassName="grid place-items-center"
placement="bottom-start"
ariaLabel={t("aria_labels.projects_sidebar.toggle_quick_actions_menu")}
>
<CustomMenu.MenuItem onClick={() => handleRemoveFromFavorites(favorite)}>
<span className="flex items-center justify-start gap-2">
@@ -51,4 +45,4 @@ export const FavoriteItemQuickAction: FC<Props> = observer((props) => {
</CustomMenu.MenuItem>
</CustomMenu>
);
});
};
@@ -34,12 +34,13 @@ import { getInstructionFromPayload, TargetData } from "./favorites.helpers";
import { NewFavoriteFolder } from "./new-fav-folder";
export const SidebarFavoritesMenu = observer(() => {
// states
//state
const [createNewFolder, setCreateNewFolder] = useState<boolean | string | null>(null);
const [isDragging, setIsDragging] = useState(false);
// navigation
const { workspaceSlug } = useParams();
// store hooks
const { t } = useTranslation();
const { sidebarCollapsed } = useAppTheme();
const {
favoriteIds,
@@ -49,17 +50,17 @@ export const SidebarFavoritesMenu = observer(() => {
reOrderFavorite,
moveFavoriteToFolder,
} = useFavorite();
// translation
const { t } = useTranslation();
// platform hooks
const { workspaceSlug } = useParams();
const { isMobile } = usePlatformOS();
// local storage
const { setValue: toggleFavoriteMenu, storedValue } = useLocalStorage<boolean>(IS_FAVORITE_MENU_OPEN, false);
// derived values
const isFavoriteMenuOpen = !!storedValue;
// refs
const containerRef = useRef<HTMLDivElement>(null);
const elementRef = useRef<HTMLDivElement>(null);
const containerRef = useRef<HTMLDivElement | null>(null);
const elementRef = useRef(null);
const handleMoveToFolder = (sourceId: string, destinationId: string) => {
moveFavoriteToFolder(workspaceSlug.toString(), sourceId, {
@@ -130,7 +131,6 @@ export const SidebarFavoritesMenu = observer(() => {
});
});
};
const handleRemoveFromFavoritesFolder = (favoriteId: string) => {
removeFromFavoriteFolder(workspaceSlug.toString(), favoriteId).catch(() => {
setToast({
@@ -151,7 +151,7 @@ export const SidebarFavoritesMenu = observer(() => {
});
});
},
[workspaceSlug, reOrderFavorite, t]
[workspaceSlug, reOrderFavorite]
);
useEffect(() => {
@@ -190,68 +190,37 @@ export const SidebarFavoritesMenu = observer(() => {
<>
<Disclosure as="div" defaultOpen ref={containerRef}>
{!sidebarCollapsed && (
<div
<Disclosure.Button
ref={elementRef}
as="button"
className={cn(
"group/favorites-button w-full flex items-center justify-between px-2 py-1.5 rounded text-custom-sidebar-text-400 hover:bg-custom-sidebar-background-90",
"sticky top-0 bg-custom-sidebar-background-100 z-10 group/workspace-button w-full px-2 py-1.5 flex items-center justify-between gap-1 text-custom-sidebar-text-400 hover:bg-custom-sidebar-background-90 rounded text-sm font-semibold",
{
"p-0 justify-center w-fit mx-auto bg-custom-sidebar-background-90 hover:bg-custom-sidebar-background-80":
sidebarCollapsed,
"bg-custom-sidebar-background-80 opacity-60": isDragging,
}
)}
>
<Disclosure.Button
as="button"
type="button"
className={cn(
"w-full flex items-center gap-1 whitespace-nowrap text-left text-sm font-semibold text-custom-sidebar-text-400",
{
"!text-center w-8 px-2 py-1.5 justify-center": sidebarCollapsed,
"bg-custom-sidebar-background-80 opacity-60": isDragging,
}
)}
onClick={() => toggleFavoriteMenu(!isFavoriteMenuOpen)}
aria-label={t(
isFavoriteMenuOpen
? "aria_labels.projects_sidebar.close_favorites_menu"
: "aria_labels.projects_sidebar.open_favorites_menu"
)}
>
<span className="text-sm font-semibold">{t("favorites")}</span>
</Disclosure.Button>
<div className="flex items-center opacity-0 pointer-events-none group-hover/favorites-button:opacity-100 group-hover/favorites-button:pointer-events-auto">
<span onClick={() => toggleFavoriteMenu(!isFavoriteMenuOpen)} className="flex-1 text-start">
{t("favorites")}
</span>
<span className="flex flex-shrink-0 opacity-0 pointer-events-none group-hover/workspace-button:opacity-100 group-hover/workspace-button:pointer-events-auto rounded p-0.5 ">
<Tooltip tooltipHeading={t("create_folder")} tooltipContent="">
<button
type="button"
className="p-0.5 rounded hover:bg-custom-sidebar-background-80 flex-shrink-0 grid place-items-center"
<FolderPlus
onClick={() => {
setCreateNewFolder(true);
if (!isFavoriteMenuOpen) toggleFavoriteMenu(!isFavoriteMenuOpen);
}}
aria-label={t("aria_labels.projects_sidebar.create_favorites_folder")}
>
<FolderPlus className="size-3" />
</button>
</Tooltip>
<Disclosure.Button
as="button"
type="button"
className="p-0.5 rounded hover:bg-custom-sidebar-background-80 flex-shrink-0 grid place-items-center"
onClick={() => toggleFavoriteMenu(!isFavoriteMenuOpen)}
aria-label={t(
isFavoriteMenuOpen
? "aria_labels.projects_sidebar.close_favorites_menu"
: "aria_labels.projects_sidebar.open_favorites_menu"
)}
>
<ChevronRight
className={cn("flex-shrink-0 size-3 transition-all", {
"rotate-90": isFavoriteMenuOpen,
})}
className={cn("size-4 flex-shrink-0 text-custom-sidebar-text-400 transition-transform")}
/>
</Disclosure.Button>
</div>
</div>
</Tooltip>
<ChevronRight
onClick={() => toggleFavoriteMenu(!isFavoriteMenuOpen)}
className={cn("size-4 flex-shrink-0 text-custom-sidebar-text-400 transition-transform", {
"rotate-90": isFavoriteMenuOpen,
})}
/>
</span>
</Disclosure.Button>
)}
<Transition
show={isFavoriteMenuOpen}
@@ -134,14 +134,7 @@ export const NewFavoriteFolder = observer((props: TProps) => {
name="name"
control={control}
rules={{ required: true }}
render={({ field }) => (
<Input
className="w-full"
placeholder={t("new_folder")}
aria-label={t("aria_labels.projects_sidebar.enter_folder_name")}
{...field}
/>
)}
render={({ field }) => <Input className="w-full" placeholder={t("new_folder")} {...field} />}
/>
</form>
</div>
@@ -175,13 +175,8 @@ export const SidebarHelpSection: React.FC<WorkspaceHelpSectionProps> = observer(
isCollapsed ? "w-full" : ""
}`}
onClick={() => toggleSidebar()}
aria-label={t(
isCollapsed
? "aria_labels.projects_sidebar.expand_sidebar"
: "aria_labels.projects_sidebar.collapse_sidebar"
)}
>
<MoveLeft className={`size-4 duration-300 ${isCollapsed ? "rotate-180" : ""}`} />
<MoveLeft className={`h-4 w-4 duration-300 ${isCollapsed ? "rotate-180" : ""}`} />
</button>
</Tooltip>
</div>
@@ -184,13 +184,13 @@ export const SidebarProjectsListItem: React.FC<Props> = observer((props) => {
const sourceId = source?.data?.id as string | undefined;
const destinationId = self?.data?.id as string | undefined;
handleOnProjectDrop?.(sourceId, destinationId, currentInstruction === "DRAG_BELOW");
handleOnProjectDrop && handleOnProjectDrop(sourceId, destinationId, currentInstruction === "DRAG_BELOW");
highlightIssueOnDrop(`sidebar-${sourceId}-${projectListType}`);
},
})
);
}, [projectId, isLastChild, projectListType, handleOnProjectDrop]);
}, [projectRef?.current, dragHandleRef?.current, projectId, isLastChild, projectListType, handleOnProjectDrop]);
useOutsideClickDetector(actionSectionRef, () => setIsMenuActive(false));
useOutsideClickDetector(projectRef, () => projectRef?.current?.classList?.remove(HIGHLIGHT_CLASS));
@@ -284,11 +284,6 @@ export const SidebarProjectsListItem: React.FC<Props> = observer((props) => {
className={cn("flex-grow flex items-center gap-1.5 text-left select-none w-full", {
"justify-center": isSidebarCollapsed,
})}
aria-label={
isProjectListOpen
? t("aria_labels.projects_sidebar.close_project_menu")
: t("aria_labels.projects_sidebar.open_project_menu")
}
>
<div className="size-4 grid place-items-center flex-shrink-0">
<Logo logo={project.logo_props} size={16} />
@@ -315,7 +310,6 @@ export const SidebarProjectsListItem: React.FC<Props> = observer((props) => {
)}
customButtonClassName="grid place-items-center"
placement="bottom-start"
ariaLabel={t("aria_labels.projects_sidebar.toggle_quick_actions_menu")}
useCaptureForOutsideClick
closeOnSelect
>
@@ -390,11 +384,6 @@ export const SidebarProjectsListItem: React.FC<Props> = observer((props) => {
}
)}
onClick={() => setIsProjectListOpen(!isProjectListOpen)}
aria-label={t(
isProjectListOpen
? "aria_labels.projects_sidebar.close_project_menu"
: "aria_labels.projects_sidebar.open_project_menu"
)}
>
<ChevronRight
className={cn("size-4 flex-shrink-0 text-custom-sidebar-text-400 transition-transform", {
@@ -167,17 +167,12 @@ export const SidebarProjectsList: FC = observer(() => {
as="button"
type="button"
className={cn(
"w-full flex items-center gap-1 whitespace-nowrap text-left text-sm font-semibold text-custom-sidebar-text-400",
"group w-full flex items-center gap-1 whitespace-nowrap text-left text-sm font-semibold text-custom-sidebar-text-400",
{
"!text-center w-8 px-2 py-1.5 justify-center": isCollapsed,
}
)}
onClick={() => toggleListDisclosure(!isAllProjectsListOpen)}
aria-label={t(
isAllProjectsListOpen
? "aria_labels.projects_sidebar.close_projects_menu"
: "aria_labels.projects_sidebar.open_projects_menu"
)}
>
<Tooltip tooltipHeading={t("projects")} tooltipContent="" position="right" disabled={!isCollapsed}>
<>
@@ -200,7 +195,6 @@ export const SidebarProjectsList: FC = observer(() => {
setTrackElement(`APP_SIDEBAR_JOINED_BLOCK`);
setIsProjectModalOpen(true);
}}
aria-label={t("aria_labels.projects_sidebar.create_new_project")}
>
<Plus className="size-3" />
</button>
@@ -211,14 +205,9 @@ export const SidebarProjectsList: FC = observer(() => {
type="button"
className="p-0.5 rounded hover:bg-custom-sidebar-background-80 flex-shrink-0"
onClick={() => toggleListDisclosure(!isAllProjectsListOpen)}
aria-label={t(
isAllProjectsListOpen
? "aria_labels.projects_sidebar.close_projects_menu"
: "aria_labels.projects_sidebar.open_projects_menu"
)}
>
<ChevronRight
className={cn("flex-shrink-0 size-3 transition-all", {
className={cn("flex-shrink-0 size-4 transition-all", {
"rotate-90": isAllProjectsListOpen,
})}
/>
@@ -46,9 +46,7 @@ export const SidebarQuickActions = observer(() => {
const handleMouseEnter = () => {
// if enter before time out clear the timeout
if (timeoutRef?.current) {
clearTimeout(timeoutRef.current);
}
timeoutRef?.current && clearTimeout(timeoutRef.current);
setIsDraftButtonOpen(true);
};
@@ -8,7 +8,6 @@ import {
WORKSPACE_SIDEBAR_DYNAMIC_NAVIGATION_ITEMS_LINKS,
WORKSPACE_SIDEBAR_STATIC_NAVIGATION_ITEMS_LINKS,
} from "@plane/constants";
import { useTranslation } from "@plane/i18n";
import { cn } from "@plane/utils";
// components
import { SidebarNavItem } from "@/components/sidebar";
@@ -21,10 +20,9 @@ export const SidebarMenuItems = observer(() => {
// routers
const { workspaceSlug } = useParams();
// store hooks
const { sidebarCollapsed, extendedSidebarCollapsed, toggleExtendedSidebar } = useAppTheme();
const { sidebarCollapsed, toggleExtendedSidebar } = useAppTheme();
const { getNavigationPreferences } = useWorkspace();
// translation
const { t } = useTranslation();
// derived values
const currentWorkspaceNavigationPreferences = getNavigationPreferences(workspaceSlug.toString());
@@ -41,35 +39,31 @@ export const SidebarMenuItems = observer(() => {
);
return (
<div
className={cn("flex flex-col gap-0.5", {
"space-y-0": sidebarCollapsed,
})}
>
{WORKSPACE_SIDEBAR_STATIC_NAVIGATION_ITEMS_LINKS.map((item, _index) => (
<SidebarItem key={`static_${_index}`} item={item} />
))}
{sortedNavigationItems.map((item, _index) => (
<SidebarItem key={`dynamic_${_index}`} item={item} />
))}
<SidebarNavItem className={`${sidebarCollapsed ? "p-0 size-8 aspect-square justify-center mx-auto" : ""}`}>
<button
type="button"
onClick={() => toggleExtendedSidebar()}
className={cn("flex items-center gap-1.5 text-sm font-medium flex-grow text-custom-text-350", {
"justify-center": sidebarCollapsed,
})}
id="extended-sidebar-toggle"
aria-label={t(
extendedSidebarCollapsed
? "aria_labels.projects_sidebar.open_extended_sidebar"
: "aria_labels.projects_sidebar.close_extended_sidebar"
)}
>
<Ellipsis className="flex-shrink-0 size-4" />
{!sidebarCollapsed && <span>More</span>}
</button>
</SidebarNavItem>
</div>
<>
<div
className={cn("flex flex-col gap-0.5", {
"space-y-0": sidebarCollapsed,
})}
>
{WORKSPACE_SIDEBAR_STATIC_NAVIGATION_ITEMS_LINKS.map((item, _index) => (
<SidebarItem key={`static_${_index}`} item={item} />
))}
{sortedNavigationItems.map((item, _index) => (
<SidebarItem key={`dynamic_${_index}`} item={item} />
))}
<SidebarNavItem className={`${sidebarCollapsed ? "p-0 size-8 aspect-square justify-center mx-auto" : ""}`}>
<button
onClick={() => toggleExtendedSidebar()}
className={cn("flex items-center gap-1.5 text-sm font-medium flex-grow text-custom-text-350", {
"justify-center": sidebarCollapsed,
})}
id="extended-sidebar-toggle"
>
<Ellipsis className="size-4" />
{!sidebarCollapsed && <span>More</span>}
</button>
</SidebarNavItem>
</div>
</>
);
});
@@ -27,7 +27,6 @@ export interface IProjectEstimateStore {
currentActiveEstimateId: string | undefined;
currentActiveEstimate: IEstimate | undefined;
archivedEstimateIds: string[] | undefined;
currentProjectEstimateType: TEstimateSystemKeys | undefined;
areEstimateEnabledByProjectId: (projectId: string) => boolean;
estimateIdsByProjectId: (projectId: string) => string[] | undefined;
currentActiveEstimateIdByProjectId: (projectId: string) => string | undefined;
@@ -64,7 +63,6 @@ export class ProjectEstimateStore implements IProjectEstimateStore {
currentActiveEstimateId: computed,
currentActiveEstimate: computed,
archivedEstimateIds: computed,
currentProjectEstimateType: computed,
// actions
getWorkspaceEstimates: action,
getProjectEstimates: action,
@@ -75,11 +73,6 @@ export class ProjectEstimateStore implements IProjectEstimateStore {
}
// computed
get currentProjectEstimateType(): TEstimateSystemKeys | undefined {
return this.currentActiveEstimateId ? this.estimates[this.currentActiveEstimateId]?.type : undefined;
}
/**
* @description get current active estimate id for a project
* @returns { string | undefined }
+8 -7
View File
@@ -1,4 +1,4 @@
import { action, observable, makeObservable, runInAction } from "mobx";
import { action, observable, makeObservable } from "mobx";
export interface IThemeStore {
// observables
@@ -26,7 +26,7 @@ export interface IThemeStore {
export class ThemeStore implements IThemeStore {
// observables
sidebarCollapsed: boolean | undefined = undefined;
extendedSidebarCollapsed: boolean | undefined = true;
extendedSidebarCollapsed: boolean | undefined = undefined;
extendedProjectSidebarCollapsed: boolean | undefined = undefined;
profileSidebarCollapsed: boolean | undefined = undefined;
workspaceAnalyticsSidebarCollapsed: boolean | undefined = undefined;
@@ -78,11 +78,12 @@ export class ThemeStore implements IThemeStore {
* @param collapsed
*/
toggleExtendedSidebar = (collapsed?: boolean) => {
const updatedState = collapsed ?? !this.extendedSidebarCollapsed;
runInAction(() => {
this.extendedSidebarCollapsed = updatedState;
});
localStorage.setItem("extended_sidebar_collapsed", updatedState.toString());
if (collapsed === undefined) {
this.extendedSidebarCollapsed = !this.extendedSidebarCollapsed;
} else {
this.extendedSidebarCollapsed = collapsed;
}
localStorage.setItem("extended_sidebar_collapsed", this.extendedSidebarCollapsed.toString());
};
/**
+83 -76
View File
@@ -4614,7 +4614,7 @@ buffer@^6.0.3:
base64-js "^1.3.1"
ieee754 "^1.2.1"
bundle-require@^5.0.0:
bundle-require@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/bundle-require/-/bundle-require-5.1.0.tgz#8db66f41950da3d77af1ef3322f4c3e04009faee"
integrity sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==
@@ -4771,6 +4771,13 @@ chokidar@^3.3.0, chokidar@^3.5.2, chokidar@^3.5.3, chokidar@^3.6.0:
optionalDependencies:
fsevents "~2.3.2"
chokidar@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30"
integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==
dependencies:
readdirp "^4.0.1"
chownr@^1.1.1:
version "1.1.4"
resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
@@ -4995,7 +5002,12 @@ concurrently@^9.0.1:
tree-kill "^1.2.2"
yargs "^17.7.2"
consola@^3.2.3:
confbox@^0.1.8:
version "0.1.8"
resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06"
integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==
consola@^3.4.0:
version "3.4.2"
resolved "https://registry.yarnpkg.com/consola/-/consola-3.4.2.tgz#5af110145397bb67afdab77013fdc34cae590ea7"
integrity sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==
@@ -5102,7 +5114,7 @@ cross-fetch@^3.1.5:
dependencies:
node-fetch "^2.7.0"
cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
cross-spawn@^7.0.0, cross-spawn@^7.0.2:
version "7.0.6"
resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f"
integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
@@ -5381,7 +5393,7 @@ debug@^3.2.7:
dependencies:
ms "^2.1.1"
debug@^4.3.5:
debug@^4.4.0:
version "4.4.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b"
integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==
@@ -5940,7 +5952,7 @@ esbuild-register@^3.5.0:
dependencies:
debug "^4.3.4"
esbuild@0.25.0, "esbuild@^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0", esbuild@^0.23.0:
esbuild@0.25.0, "esbuild@^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0", esbuild@^0.25.0:
version "0.25.0"
resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz#0de1787a77206c5a79eeb634a623d39b5006ce92"
integrity sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==
@@ -6276,21 +6288,6 @@ events@^3.2.0, events@^3.3.0:
resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
execa@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
dependencies:
cross-spawn "^7.0.3"
get-stream "^6.0.0"
human-signals "^2.1.0"
is-stream "^2.0.0"
merge-stream "^2.0.0"
npm-run-path "^4.0.1"
onetime "^5.1.2"
signal-exit "^3.0.3"
strip-final-newline "^2.0.0"
expand-template@^2.0.3:
version "2.0.3"
resolved "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
@@ -6530,6 +6527,15 @@ find-up@^5.0.0:
locate-path "^6.0.0"
path-exists "^4.0.0"
fix-dts-default-cjs-exports@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz#955cb6b3d519691c57828b078adadf2cb92e9549"
integrity sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==
dependencies:
magic-string "^0.30.17"
mlly "^1.7.4"
rollup "^4.34.8"
fizzy-ui-utils@^2.0.0:
version "2.0.7"
resolved "https://registry.npmjs.org/fizzy-ui-utils/-/fizzy-ui-utils-2.0.7.tgz#7df45dcc4eb374a08b65d39bb9a4beedf7330505"
@@ -6762,11 +6768,6 @@ get-stdin@^9.0.0:
resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575"
integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==
get-stream@^6.0.0:
version "6.0.1"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
get-symbol-description@^1.1.0:
version "1.1.0"
resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee"
@@ -7094,11 +7095,6 @@ https-proxy-agent@^7.0.6:
agent-base "^7.1.2"
debug "4"
human-signals@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
hyphen@^1.6.4:
version "1.10.6"
resolved "https://registry.npmjs.org/hyphen/-/hyphen-1.10.6.tgz#0e779d280e696102b97d7e42f5ca5de2cc97e274"
@@ -7928,7 +7924,7 @@ lz-string@^1.5.0:
resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941"
integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==
magic-string@^0.30.5:
magic-string@^0.30.17, magic-string@^0.30.5:
version "0.30.17"
resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453"
integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==
@@ -8321,11 +8317,6 @@ mime@1.6.0:
resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
mimic-fn@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
mimic-response@^3.1.0:
version "3.1.0"
resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
@@ -8377,6 +8368,16 @@ mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3:
resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
mlly@^1.7.4:
version "1.7.4"
resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.4.tgz#3d7295ea2358ec7a271eaa5d000a0f84febe100f"
integrity sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==
dependencies:
acorn "^8.14.0"
pathe "^2.0.1"
pkg-types "^1.3.0"
ufo "^1.5.4"
mobx-react-lite@^4.1.0:
version "4.1.0"
resolved "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-4.1.0.tgz#6a03ed2d94150848213cfebd7d172e123528a972"
@@ -8587,13 +8588,6 @@ normalize.css@^8.0.1:
resolved "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz#9b98a208738b9cc2634caacbc42d131c97487bf3"
integrity sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==
npm-run-path@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
dependencies:
path-key "^3.0.0"
nprogress@^0.2.0:
version "0.2.0"
resolved "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1"
@@ -8732,13 +8726,6 @@ one-time@^1.0.0:
dependencies:
fn.name "1.x.x"
onetime@^5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
dependencies:
mimic-fn "^2.1.0"
open@^8.0.4:
version "8.4.2"
resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9"
@@ -8921,7 +8908,7 @@ path-is-absolute@^1.0.0:
resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
path-key@^3.0.0, path-key@^3.1.0:
path-key@^3.1.0:
version "3.1.1"
resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
@@ -8954,6 +8941,11 @@ path-type@^6.0.0:
resolved "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz#2f1bb6791a91ce99194caede5d6c5920ed81eb51"
integrity sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==
pathe@^2.0.1:
version "2.0.3"
resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716"
integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==
pathval@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25"
@@ -9055,6 +9047,15 @@ pkg-dir@^4.1.0:
dependencies:
find-up "^4.0.0"
pkg-types@^1.3.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.3.1.tgz#bd7cc70881192777eef5326c19deb46e890917df"
integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==
dependencies:
confbox "^0.1.8"
mlly "^1.7.4"
pathe "^2.0.1"
pkg-up@^3.1.0:
version "3.1.0"
resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5"
@@ -9861,6 +9862,11 @@ readable-stream@^4.0.0:
process "^0.11.10"
string_decoder "^1.3.0"
readdirp@^4.0.1:
version "4.1.2"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d"
integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==
readdirp@~3.6.0:
version "3.6.0"
resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
@@ -10121,7 +10127,7 @@ robust-predicates@^3.0.2:
resolved "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771"
integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==
rollup@^4.19.0:
rollup@^4.34.8:
version "4.41.1"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.41.1.tgz#46ddc1b33cf1b0baa99320d3b0b4973dc2253b6a"
integrity sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==
@@ -10454,11 +10460,6 @@ side-channel@^1.0.6, side-channel@^1.1.0:
side-channel-map "^1.0.1"
side-channel-weakmap "^1.0.2"
signal-exit@^3.0.3:
version "3.0.7"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
signal-exit@^4.0.1:
version "4.1.0"
resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04"
@@ -10744,11 +10745,6 @@ strip-bom@^3.0.0:
resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
strip-final-newline@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
strip-indent@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
@@ -11029,7 +11025,12 @@ tinycolor2@^1.4.1:
resolved "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e"
integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==
tinyglobby@^0.2.1:
tinyexec@^0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2"
integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==
tinyglobby@^0.2.11:
version "0.2.14"
resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.14.tgz#5280b0cf3f972b050e74ae88406c0a6a58f4079d"
integrity sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==
@@ -11207,26 +11208,27 @@ tslib@~2.5.0:
resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913"
integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==
tsup@8.3.0:
version "8.3.0"
resolved "https://registry.yarnpkg.com/tsup/-/tsup-8.3.0.tgz#c7dae40b13d11d81fb144c0f90077a99102a572a"
integrity sha512-ALscEeyS03IomcuNdFdc0YWGVIkwH1Ws7nfTbAPuoILvEV2hpGQAY72LIOjglGo4ShWpZfpBqP/jpQVCzqYQag==
tsup@^8.5.0:
version "8.5.0"
resolved "https://registry.yarnpkg.com/tsup/-/tsup-8.5.0.tgz#4b1e25b1a8f4e4f89b764207bf37cfe2d7411d31"
integrity sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==
dependencies:
bundle-require "^5.0.0"
bundle-require "^5.1.0"
cac "^6.7.14"
chokidar "^3.6.0"
consola "^3.2.3"
debug "^4.3.5"
esbuild "^0.23.0"
execa "^5.1.1"
chokidar "^4.0.3"
consola "^3.4.0"
debug "^4.4.0"
esbuild "^0.25.0"
fix-dts-default-cjs-exports "^1.0.0"
joycon "^3.1.1"
picocolors "^1.0.1"
picocolors "^1.1.1"
postcss-load-config "^6.0.1"
resolve-from "^5.0.0"
rollup "^4.19.0"
rollup "^4.34.8"
source-map "0.8.0-beta.0"
sucrase "^3.35.0"
tinyglobby "^0.2.1"
tinyexec "^0.3.2"
tinyglobby "^0.2.11"
tree-kill "^1.2.2"
tsutils@^3.21.0:
@@ -11380,6 +11382,11 @@ uc.micro@^2.0.0, uc.micro@^2.1.0:
resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee"
integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==
ufo@^1.5.4:
version "1.6.1"
resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.6.1.tgz#ac2db1d54614d1b22c1d603e3aef44a85d8f146b"
integrity sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==
unbox-primitive@^1.1.0:
version "1.1.0"
resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2"