fix(app): keep side panel tab close buttons in view and add a tab menu (#60244)

Co-authored-by: neriousy <34747899+neriousy@users.noreply.github.com>
This commit is contained in:
opencode-agent[bot]
2026-10-29 15:56:26 +01:00
committed by GitHub
Unverified
parent 589c62db60
commit f99bc07445
67 changed files with 180 additions and 1 deletions
@@ -212,6 +212,54 @@ test("closing the last New tab closes the side region, and only a New tab lists
await expect(review).toBeVisible()
})
test("tabs in a narrow side strip shrink to keep their close buttons, and a tab's menu closes the others", async ({
page,
}) => {
await page.setViewportSize({ width: 1000, height: 700 })
const directory = "C:/OpenCode/NarrowStrip"
const key = `local\u0000${base64Encode(directory)}/ses_narrowstrip`
const files = ["a.md", "a-file-name-long-enough-to-overflow-the-side-strip-by-itself.md", "b.md"]
await openSession(page, {
name: "NarrowStrip",
fileList: () => [],
fileContent: (path) => ({ type: "text", content: `contents:${path}` }),
seed: {
panes: { ses_narrowstrip: { review: true, sessionWidth: 640 } },
storage: {
"opencode.global.dat:layout": {
sessionTabs: { [key]: { all: files.map((file) => `file://${file}`), active: `file://${files[1]}` } },
},
},
},
})
const side = page.locator('[data-pane-content="side"]')
const add = side.getByRole("button", { name: "Add tab", exact: true })
await expect(side.getByRole("tab", { name: files[1], exact: true })).toHaveAttribute("aria-selected", "true")
// Every tab's close button stays left of "+", instead of the strip scrolling it away under its edge fade.
const end = (await add.boundingBox())!.x
const closes = side.locator('[data-pane-strip="side"] [data-slot="tabs-trigger-close-button"]')
await expect(closes).toHaveCount(files.length)
for (const close of await closes.all()) {
const box = (await close.boundingBox())!
expect(box.x + box.width).toBeLessThanOrEqual(end)
}
await side.getByRole("tab", { name: "b.md", exact: true }).click({ button: "right" })
await page.getByRole("menuitem", { name: "Close other tabs", exact: true }).click()
await expect(side.getByRole("tab")).toHaveCount(1)
await expect(side.getByRole("tab", { name: "b.md", exact: true })).toHaveAttribute("aria-selected", "true")
// With nothing else to close, the menu offers only the tab itself.
await side.getByRole("tab", { name: "b.md", exact: true }).click({ button: "right" })
await expect(page.getByRole("menuitem", { name: "Close other tabs", exact: true })).toBeDisabled()
await page.getByRole("menuitem", { name: "Close tab", exact: true }).click()
await expect(side.getByRole("tab", { name: "b.md", exact: true })).toHaveCount(0)
})
// A DOM mark survives only while the same node stays mounted.
function mark(locator: Locator) {
return locator.evaluate((element) => element.setAttribute("data-e2e-mounted", "original"))
+1
View File
@@ -725,6 +725,7 @@ export const dict = {
"toast.migration.progress.working.progress": "ውሂብ በማዛወር ላይ {{current}}/{{total}}",
"home.workspaceTip": "ለውጦችን ለብለል ለማቆየት ቀጣዩን ክፍለ ጊዜ በአዲስ የስራ ቦታ ይጀምሩ",
"session.tab.add": "ትር አክል",
"session.tab.closeOthers": "ሌሎች ትሮችን ዝጋ",
"session.queue.attachments.one": "ፕላስ {{count}} አባሪ",
"session.queue.attachments.other": "ፕላስ {{count}} አባሪዎች",
"settings.backToSettings": "ወደ ቅንብሮች ተመለስ",
+1
View File
@@ -777,6 +777,7 @@ export const dict = {
"dialog.server.menu.remove": "إزالة",
"home.workspaceTip": "ابدأ الجلسة التالية في شجرة عمل جديدة لإبقاء التغييرات معزولة",
"session.tab.add": "إضافة علامة تبويب",
"session.tab.closeOthers": "إغلاق علامات التبويب الأخرى",
"session.queue.attachments.one": "بالإضافة إلى {{count}} مرفق",
"session.queue.attachments.other": "بالإضافة إلى \u2068{{count}}\u2069 مرفقات",
"settings.backToSettings": "العودة إلى الإعدادات",
+1
View File
@@ -749,6 +749,7 @@ export const dict = {
"toast.migration.progress.working.progress": "Məlumatlar köçürülür {{current}}/{{total}}",
"home.workspaceTip": "Dəyişiklikləri izolə etmək üçün növbəti sessiyanı yeni iş sahəsində başlayın",
"session.tab.add": "Tab əlavə et",
"session.tab.closeOthers": "Digər tabları bağla",
"session.queue.attachments.one": "{{count}} əlavə əlavə et",
"session.queue.attachments.other": "{{count}} əlavə əlavələr əlavə et",
"settings.backToSettings": "Parametrlərə qayıt",
+1
View File
@@ -748,6 +748,7 @@ export const dict = {
"toast.migration.progress.working.progress": "Мигриране на данни {{current}}/{{total}}",
"home.workspaceTip": "Започнете следващата сесия в ново работно пространство, за да запазите промените изолирани",
"session.tab.add": "Добавяне на раздел",
"session.tab.closeOthers": "Затваряне на другите раздели",
"session.queue.attachments.one": "Плюс {{count}} прикачен файл",
"session.queue.attachments.other": "Плюс {{count}} прикачени файла",
"settings.backToSettings": "Назад към настройките",
+1
View File
@@ -749,6 +749,7 @@ export const dict = {
"toast.migration.progress.working.progress": "ডেটা স্থানান্তরিত হচ্ছে {{current}}/{{total}}",
"home.workspaceTip": "পরিবর্তনগুলিকে বিচ্ছিন্ন রাখতে একটি নতুন কর্মক্ষেত্রে পরবর্তী সেশন শুরু করুন৷",
"session.tab.add": "ট্যাব যোগ করুন",
"session.tab.closeOthers": "অন্য ট্যাবগুলো বন্ধ করুন",
"session.queue.attachments.one": "প্লাস {{count}} সংযুক্তি",
"session.queue.attachments.other": "প্লাস {{count}}টি সংযুক্তি৷",
"settings.backToSettings": "সেটিংসে ফিরে যান",
+1
View File
@@ -37,6 +37,7 @@ export const dict = {
"dialog.server.menu.remove": "Remover",
"home.workspaceTip": "Inicie a próxima sessão em um novo espaço de trabalho para manter as alterações isoladas",
"session.tab.add": "Adicionar guia",
"session.tab.closeOthers": "Fechar outras abas",
"session.queue.attachments.one": "Mais acessório {{count}}",
"session.queue.attachments.other": "Mais acessórios {{count}}",
"settings.backToSettings": "Voltar às configurações",
+1
View File
@@ -813,6 +813,7 @@ export const dict = {
"toast.migration.progress.working.progress": "Migracija podataka {{current}}/{{total}}",
"home.workspaceTip": "Pokrenite sljedeću sesiju u novom radnom prostoru kako bi promjene ostale izolovane",
"session.tab.add": "Dodaj karticu",
"session.tab.closeOthers": "Zatvori ostale kartice",
"session.queue.attachments.one": "Još {{count}} prilog",
"session.queue.attachments.few": "Još {{count}} priloga",
"session.queue.attachments.other": "Još {{count}} priloga",
+1
View File
@@ -744,6 +744,7 @@ export const dict = {
"dialog.server.menu.remove": "Elimina",
"home.workspaceTip": "Inicieu la propera sessió en un nou espai de treball per mantenir els canvis aïllats",
"session.tab.add": "Afegeix una pestanya",
"session.tab.closeOthers": "Tanca les altres pestanyes",
"session.queue.attachments.one": "Més adjunt {{count}}",
"session.queue.attachments.other": "Més fitxers adjunts {{count}}",
"settings.backToSettings": "Tornar a la configuració",
+1
View File
@@ -758,6 +758,7 @@ export const dict = {
"toast.migration.progress.working.progress": "Migrace dat {{current}}/{{total}}",
"home.workspaceTip": "Spusťte příští relaci v novém pracovním prostoru, aby změny zůstaly oddělené",
"session.tab.add": "Přidat kartu",
"session.tab.closeOthers": "Zavřít ostatní karty",
"session.queue.attachments.one": "A {{count}} příloha",
"session.queue.attachments.few": "A {{count}} přílohy",
"session.queue.attachments.many": "A {{count}} přílohy",
+1
View File
@@ -37,6 +37,7 @@ export const dict = {
"dialog.server.menu.remove": "Fjern",
"home.workspaceTip": "Start næste session i et nyt arbejdsområde for at holde ændringer isoleret",
"session.tab.add": "Tilføj fane",
"session.tab.closeOthers": "Luk andre faner",
"session.queue.attachments.one": "Plus {{count}} vedhæftning",
"session.queue.attachments.other": "Plus {{count}} vedhæftede filer",
"settings.backToSettings": "Tilbage til indstillinger",
+1
View File
@@ -43,6 +43,7 @@ export const dict = {
"home.workspaceTip":
"Starten Sie die nächste Sitzung in einem neuen Arbeitsbereich, um Änderungen isoliert zu halten",
"session.tab.add": "Registerkarte hinzufügen",
"session.tab.closeOthers": "Andere Tabs schließen",
"session.queue.attachments.one": "Plus {{count}}-Aufsatz",
"session.queue.attachments.other": "Plus {{count}}-Anbaugeräte",
"settings.backToSettings": "Zurück zu den Einstellungen",
+1
View File
@@ -766,6 +766,7 @@ export const dict = {
"toast.migration.progress.working.progress": "ޑޭޓާ މައިގްރޭޓްކުރުން \u2068{{current}}\u2069/\u2068{{total}}\u2069",
"home.workspaceTip": "ބަދަލުތައް އެކަހެރިކޮށް ބެހެއްޓުމަށްޓަކައި އާ ވޯކްސްޕޭސްއެއްގައި ދެން އޮންނަ ސެޝަން ފެށުން",
"session.tab.add": "ޓެބް އިތުރުކުރުން",
"session.tab.closeOthers": "އެހެން ޓެބްތައް ބަންދުކުރުން",
"session.queue.attachments.one": "ޕްލަސް \u2068{{count}}\u2069 އެޓޭޗްމަންޓް",
"session.queue.attachments.other": "ޕްލަސް \u2068{{count}}\u2069 އެޓޭޗްމަންޓްސް",
"settings.backToSettings": "އެނބުރި ސެޓިންގްސް އަށް",
+1
View File
@@ -741,6 +741,7 @@ export const dict = {
"dialog.server.menu.remove": "བཏོན་བཏང་",
"home.workspaceTip": "བསྒྱུར་བཅོས་ཚུ་སོ་སོ་སྦེ་བཞག་ནི་ལུ་ ལཱ་གི་ས་སྒོ་གསརཔ་ཅིག་ནང་ ཤུལ་མམ་གྱི་ལཱ་ཡུན་འགོ་བཙུགས།",
"session.tab.add": "མཆོང་ལྡེ་ཁ་སྐོང་",
"session.tab.closeOthers": "མཆོང་ལྡེ་གཞན་ཚུ་ཁ་བསྡམས།",
"session.queue.attachments.one": "པ་ལཱསི་ {{count}} མཐུད་སྣེ།",
"session.queue.attachments.other": "དེ་ལས་ {{count}} མཐུད་སྣེ་ཚུ་",
"settings.backToSettings": "གཞི་སྒྲིག་ལུ་ལོག་འགྱོ།",
+1
View File
@@ -743,6 +743,7 @@ export const dict = {
"home.workspaceTip":
"Ξεκινήστε την επόμενη συνεδρία σε νέο χώρο εργασίας για να διατηρήσετε τις αλλαγές απομονωμένες",
"session.tab.add": "Προσθήκη καρτέλας",
"session.tab.closeOthers": "Κλείσιμο των άλλων καρτελών",
"session.queue.attachments.one": "Συν {{count}} συνημμένο",
"session.queue.attachments.other": "Συν {{count}} συνημμένα",
"settings.backToSettings": "Επιστροφή στις ρυθμίσεις",
+1
View File
@@ -582,6 +582,7 @@ export const dict = {
"session.tab.more": "More...",
"session.view.select": "Session view",
"session.tab.add": "Add tab",
"session.tab.closeOthers": "Close other tabs",
"session.tab.recentHint": "Hold {{key}} for recently closed",
"session.tab.showMore": "Show more",
"session.tab.new": "New tab",
+1
View File
@@ -38,6 +38,7 @@ export const dict = {
"dialog.server.menu.remove": "Quitar",
"home.workspaceTip": "Inicie la próxima sesión en un nuevo espacio de trabajo para mantener los cambios aislados",
"session.tab.add": "Agregar pestaña",
"session.tab.closeOthers": "Cerrar otras pestañas",
"session.queue.attachments.one": "Más accesorio {{count}}",
"session.queue.attachments.other": "Más accesorios {{count}}",
"settings.backToSettings": "Volver a la configuración",
+1
View File
@@ -723,6 +723,7 @@ export const dict = {
"dialog.server.menu.remove": "Eemalda",
"home.workspaceTip": "Alustage järgmist seanssi uues tööruumis, et hoida muudatused isoleerituna",
"session.tab.add": "Lisa vahekaart",
"session.tab.closeOthers": "Sule teised vahekaardid",
"session.queue.attachments.one": "Plus {{count}} kinnitus",
"session.queue.attachments.other": "Pluss {{count}} lisaseadmed",
"settings.backToSettings": "Tagasi seadete juurde",
+1
View File
@@ -741,6 +741,7 @@ export const dict = {
"dialog.server.menu.remove": "حذف",
"home.workspaceTip": "نشست بعدی را در یک درخت‌کار جدید آغاز کنید تا تغییرات جدا بمانند",
"session.tab.add": "افزودن زبانه",
"session.tab.closeOthers": "بستن برگه‌های دیگر",
"session.queue.attachments.one": "به‌علاوهٔ {{count}} پیوست",
"session.queue.attachments.other": "به‌علاوهٔ \u2068{{count}}\u2069 پیوست",
"settings.backToSettings": "بازگشت به تنظیمات",
+1
View File
@@ -35,6 +35,7 @@ export const dict = {
"dialog.server.menu.remove": "Poista",
"home.workspaceTip": "Aloita seuraava istunto uudessa työtilassa, jotta muutokset pysyvät erillään",
"session.tab.add": "Lisää välilehti",
"session.tab.closeOthers": "Sulje muut välilehdet",
"session.queue.attachments.one": "Plus {{count}} kiinnitys",
"session.queue.attachments.other": "Plus {{count}} lisälaitteet",
"settings.backToSettings": "Takaisin asetuksiin",
+1
View File
@@ -727,6 +727,7 @@ export const dict = {
"dialog.server.menu.remove": "Strika",
"home.workspaceTip": "Byrja næstu setu í einum nýggjum arbeiðsøki fyri at halda broytingar einstøkar",
"session.tab.add": "Legg flipa til",
"session.tab.closeOthers": "Lat hinar flipanar aftur",
"session.queue.attachments.one": "Pluss {{count}} viðheft",
"session.queue.attachments.other": "Umframt {{count}} viðheftir",
"settings.backToSettings": "Aftur til innstillingar",
+1
View File
@@ -39,6 +39,7 @@ export const dict = {
"home.workspaceTip":
"Démarrez la prochaine session dans un nouvel espace de travail pour garder les modifications isolées",
"session.tab.add": "Ajouter un onglet",
"session.tab.closeOthers": "Fermer les autres onglets",
"session.queue.attachments.one": "Plus accessoire {{count}}",
"session.queue.attachments.other": "Plus les accessoires {{count}}",
"settings.backToSettings": "Retour aux paramètres",
+1
View File
@@ -738,6 +738,7 @@ export const dict = {
"dialog.server.menu.remove": "הסרה",
"home.workspaceTip": "כדאי להתחיל את ההפעלה הבאה בעץ עבודה חדש כדי לשמור את השינויים מבודדים",
"session.tab.add": "הוספת כרטיסייה",
"session.tab.closeOthers": "סגור כרטיסיות אחרות",
"session.queue.attachments.one": "בנוסף ל-{{count}} קובץ מצורף",
"session.queue.attachments.other": "בנוסף ל-\u2068{{count}}\u2069 קבצים מצורפים",
"settings.backToSettings": "חזרה להגדרות",
+1
View File
@@ -749,6 +749,7 @@ export const dict = {
"toast.migration.progress.working.progress": "डेटा माइग्रेट करना {{current}}/{{total}}",
"home.workspaceTip": "परिवर्तनों को पृथक रखने के लिए अगले सत्र को एक नए कार्यक्षेत्र में प्रारंभ करें",
"session.tab.add": "टैब जोड़ें",
"session.tab.closeOthers": "अन्य टैब बंद करें",
"session.queue.attachments.one": "साथ ही {{count}} अनुलग्नक",
"session.queue.attachments.other": "प्लस {{count}} अनुलग्नक",
"settings.backToSettings": "सेटिंग्स पर वापस जाएँ",
+1
View File
@@ -757,6 +757,7 @@ export const dict = {
"toast.migration.progress.working.progress": "Migracija podataka {{current}}/{{total}}",
"home.workspaceTip": "Pokrenite sljedeću sesiju u novom radnom prostoru kako bi promjene ostale izolovane",
"session.tab.add": "Dodaj karticu",
"session.tab.closeOthers": "Zatvori ostale kartice",
"session.queue.attachments.one": "Još {{count}} prilog",
"session.queue.attachments.few": "Još {{count}} priloga",
"session.queue.attachments.other": "Još {{count}} priloga",
+1
View File
@@ -741,6 +741,7 @@ export const dict = {
"home.workspaceTip":
"Indítsa el a következő munkamenetet egy új munkaterületen, hogy a változtatások elszigeteltek maradjanak",
"session.tab.add": "Tabulátor hozzáadása",
"session.tab.closeOthers": "Többi lap bezárása",
"session.queue.attachments.one": "Plusz {{count}} rögzítés",
"session.queue.attachments.other": "Plusz {{count}} tartozékok",
"settings.backToSettings": "Vissza a beállításokhoz",
+1
View File
@@ -743,6 +743,7 @@ export const dict = {
"toast.migration.progress.working.progress": "Տվյալների տեղափոխում՝ {{current}}/{{total}}",
"home.workspaceTip": "Սկսել հաջորդ նստաշրջանը նոր աշխատանքային տարածքում՝ փոփոխությունները մեկուսացնելու համար",
"session.tab.add": "Ավելացնել ներդիր",
"session.tab.closeOthers": "Փակել մյուս ներդիրները",
"session.queue.attachments.one": "Ավելացնել {{count}} կցում",
"session.queue.attachments.other": "Ավելացնել {{count}} կցումներ",
"settings.backToSettings": "Հետ երթ դեպի կարգավորումներ",
+1
View File
@@ -815,6 +815,7 @@ export const dict = {
"toast.migration.progress.working.progress": "Memigrasikan data {{current}}/{{total}}",
"home.workspaceTip": "Mulai sesi berikutnya di ruang kerja baru untuk menjaga perubahan tetap terisolasi",
"session.tab.add": "Tambah tab",
"session.tab.closeOthers": "Tutup tab lain",
"session.queue.attachments.one": "Tambahkan {{count}} lampiran",
"session.queue.attachments.other": "Tambahkan {{count}} lampiran",
"settings.backToSettings": "Kembali ke pengaturan",
+1
View File
@@ -730,6 +730,7 @@ export const dict = {
"dialog.server.menu.remove": "Fjarlægja",
"home.workspaceTip": "Byrjaðu næstu lotu á nýju vinnusvæði til að halda breytingum einangruðum",
"session.tab.add": "Bæta við flipa",
"session.tab.closeOthers": "Loka öðrum flipum",
"session.queue.attachments.one": "Auk {{count}} viðhengi",
"session.queue.attachments.other": "Auk {{count}} viðhengja",
"settings.backToSettings": "Til baka í stillingar",
+1
View File
@@ -37,6 +37,7 @@ export const dict = {
"dialog.server.menu.remove": "Rimuovi",
"home.workspaceTip": "Inizia la sessione successiva in una nuova area di lavoro per mantenere isolate le modifiche",
"session.tab.add": "Aggiungi scheda",
"session.tab.closeOthers": "Chiudi le altre schede",
"session.queue.attachments.one": "Inoltre attacco {{count}}",
"session.queue.attachments.other": "Inoltre accessori {{count}}",
"settings.backToSettings": "Torna alle impostazioni",
+1
View File
@@ -759,6 +759,7 @@ export const dict = {
"toast.migration.progress.working.progress": "データを移行中 {{current}}/{{total}}",
"home.workspaceTip": "変更を隔離するために、新しいワークスペースで次のセッションを開始",
"session.tab.add": "タブを追加",
"session.tab.closeOthers": "他のタブを閉じる",
"session.queue.attachments.one": "添付ファイル {{count}} 件追加",
"session.queue.attachments.other": "添付ファイル {{count}} 件追加",
"settings.backToSettings": "設定に戻る",
+1
View File
@@ -743,6 +743,7 @@ export const dict = {
"toast.migration.progress.working.progress": "მონაცემების გადატანა {{current}}/{{total}}",
"home.workspaceTip": "დაიწყეთ შემდეგი სესიას ახალი სამუშაო სივრცეში, რომ ცვლილებები განცალკევებულად შენარჩუნდეს",
"session.tab.add": "ჩანართის დამატება",
"session.tab.closeOthers": "სხვა ჩანართების დახურვა",
"session.queue.attachments.one": "დამატება {{count}} შემაგანთქმელი",
"session.queue.attachments.other": "დამატება {{count}} შემაგანთქმელი",
"settings.backToSettings": "წარსვლა დასაყენებლებში",
+1
View File
@@ -742,6 +742,7 @@ export const dict = {
"toast.migration.progress.working.progress": "កំពុងផ្ទេរទិន្នន័យ {{current}}/{{total}}",
"home.workspaceTip": "ចាប់ផ្តើមសម័យក្រោយនៅក្នុងកន្លែងធ្វើការថ្មីដើម្បីរក្សា​ការ​ផ្លាស់ប្តូរ​ឲ្យ​ផ្ទាល់ខ្លួន",
"session.tab.add": "បន្ថែមផ្ទាំង",
"session.tab.closeOthers": "បិទផ្ទាំងផ្សេងទៀត",
"session.queue.attachments.one": "បូក {{count}} ភ្ជាប់ឯកសារ",
"session.queue.attachments.other": "បូក {{count}} ភ្ជាប់ឯកសារ",
"settings.backToSettings": "ត្រឡប់ទៅការកំណត់",
+1
View File
@@ -757,6 +757,7 @@ export const dict = {
"toast.migration.progress.working.progress": "데이터 마이그레이션 중 {{current}}/{{total}}",
"home.workspaceTip": "변경 사항을 격리하려면 새 워크스페이스에서 다음 세션 시작",
"session.tab.add": "탭 추가",
"session.tab.closeOthers": "다른 탭 닫기",
"session.queue.attachments.one": "첨부파일 {{count}}개 추가",
"session.queue.attachments.other": "첨부파일 {{count}}개 추가",
"settings.backToSettings": "설정으로 돌아가기",
+1
View File
@@ -740,6 +740,7 @@ export const dict = {
"toast.migration.progress.working.progress": "ການຍ້າຍຂໍ້ມູນ {{current}}/{{total}}",
"home.workspaceTip": "ເລີ່ມ session ຕໍ່ໄປໃນພື້ນທີ່ການເຮັດວຽກໃຫມ່ເພື່ອຮັກສາການປ່ຽນແປງໃຫ້ຖືກແຍກອອກ",
"session.tab.add": "ແຖບເພີ່ມ",
"session.tab.closeOthers": "ປິດແຖບອື່ນ",
"session.queue.attachments.one": "ພ້ອມກັບໄຟລ໌ແນບ {{count}}",
"session.queue.attachments.other": "ພ້ອມກັບໄຟລ໌ແນບ {{count}}",
"settings.backToSettings": "ກັບໄປທີ່ການຕັ້ງຄ່າ",
+1
View File
@@ -751,6 +751,7 @@ export const dict = {
"dialog.server.menu.remove": "Pašalinti",
"home.workspaceTip": "Pradėkite kitą seansą naujoje darbo srityje, kad pakeitimai būtų atskirti",
"session.tab.add": "Pridėti skirtuką",
"session.tab.closeOthers": "Uždaryti kitus skirtukus",
"session.queue.attachments.one": "Plus {{count}} tvirtinimas",
"session.queue.attachments.other": "Plus {{count}} priedai",
"settings.backToSettings": "Atgal į nustatymus",
+1
View File
@@ -739,6 +739,7 @@ export const dict = {
"dialog.server.menu.remove": "Noņemt",
"home.workspaceTip": "Sāciet nākamo sesiju jaunā darbvietā, lai izmaiņas būtu izolētas",
"session.tab.add": "Pievienot cilni",
"session.tab.closeOthers": "Aizvērt citas cilnes",
"session.queue.attachments.one": "Plus {{count}} stiprinājums",
"session.queue.attachments.other": "Plus {{count}} stiprinājumi",
"settings.backToSettings": "Atpakaļ uz iestatījumiem",
+1
View File
@@ -747,6 +747,7 @@ export const dict = {
"toast.migration.progress.working.progress": "Мигрирање на податоци {{current}}/{{total}}",
"home.workspaceTip": "Започнете ја следната сесија во нов работен простор за да ги одделите промените",
"session.tab.add": "Додај јазиче",
"session.tab.closeOthers": "Затвори ги другите картички",
"session.queue.attachments.one": "Плус {{count}} прилог",
"session.queue.attachments.other": "Плус {{count}} прилози",
"settings.backToSettings": "Назад на поставки",
+1
View File
@@ -746,6 +746,7 @@ export const dict = {
"toast.migration.progress.working.progress": "Өгөгдлийг шилжүүлж байна {{current}}/{{total}}",
"home.workspaceTip": "Өөрчлөлтүүдийг тусгаарлахын тулд шинэ ажлын орчинд дараагийн сессийг эхлүүлнэ үү",
"session.tab.add": "Шинэ таб нэмэх",
"session.tab.closeOthers": "Бусад табыг хаах",
"session.queue.attachments.one": "Нэмэлт {{count}} хавсралт",
"session.queue.attachments.other": "Нэмэлт {{count}} хавсралт",
"settings.backToSettings": "Тохиргоонд буцах",
+1
View File
@@ -747,6 +747,7 @@ export const dict = {
"toast.migration.progress.working.progress": "Memindahkan data {{current}}/{{total}}",
"home.workspaceTip": "Mula sesi seterusnya dalam ruang kerja baru untuk memastikan perubahan terasing",
"session.tab.add": "Tambah tab",
"session.tab.closeOthers": "Tutup tab lain",
"session.queue.attachments.one": "Tambah {{count}} lampiran",
"session.queue.attachments.other": "Tambah {{count}} lampiran",
"settings.backToSettings": "Kembali ke tetapan",
+1
View File
@@ -757,6 +757,7 @@ export const dict = {
"home.workspaceTip":
"ပြင်ဆင်မှုများကို ထိန်းသိမ်းထားရန် အလုပ်အပ်ရန် အသစ်သော အလုပ်ဌာနတွင် နောက်ဆုံးအစည်းအဝေးကို စတင်ပါ",
"session.tab.add": "တက်ထည့်ရန်",
"session.tab.closeOthers": "အခြားတဘ်များကို ပိတ်ပါ။",
"session.queue.attachments.one": "နောက်ထပ် ပူးတွဲဖိုင် {{count}} ခု",
"session.queue.attachments.other": "နောက်ထပ် ပူးတွဲဖိုင် {{count}} ခု",
"settings.backToSettings": "ဆက်တင်များသို့ ပြန်သွားရန်",
+1
View File
@@ -748,6 +748,7 @@ export const dict = {
"toast.migration.progress.working.progress": "डेटा माइग्रेट गर्दै {{current}}/{{total}}",
"home.workspaceTip": "परिवर्तनहरूलाई अलग राख्नको लागि नयाँ कार्यस्थानमा अर्को सत्र सुरु गर्नुहोस्",
"session.tab.add": "ट्याब थप्नुहोस्",
"session.tab.closeOthers": "अन्य ट्याबहरू बन्द गर्नुहोस्",
"session.queue.attachments.one": "थप {{count}} संलग्नक",
"session.queue.attachments.other": "थप {{count}} संलग्नहरू",
"settings.backToSettings": "सेटिङहरूमा फर्कनुहोस्",
+1
View File
@@ -37,6 +37,7 @@ export const dict = {
"dialog.server.menu.remove": "Verwijderen",
"home.workspaceTip": "Start de volgende sessie in een nieuwe werkruimte om wijzigingen geïsoleerd te houden",
"session.tab.add": "Tabblad toevoegen",
"session.tab.closeOthers": "Andere tabbladen sluiten",
"session.queue.attachments.one": "Plus {{count}}-hulpstuk",
"session.queue.attachments.other": "Plus {{count}}-hulpstukken",
"settings.backToSettings": "Terug naar instellingen",
+1
View File
@@ -39,6 +39,7 @@ export const dict = {
"dialog.server.menu.remove": "Fjern",
"home.workspaceTip": "Start neste økt i et nytt arbeidsområde for å holde endringer isolert",
"session.tab.add": "Legg til fane",
"session.tab.closeOthers": "Lukk andre faner",
"session.queue.attachments.one": "Pluss {{count}} vedlegg",
"session.queue.attachments.other": "Pluss {{count}} vedlegg",
"settings.backToSettings": "Tilbake til innstillinger",
+1
View File
@@ -757,6 +757,7 @@ export const dict = {
"toast.migration.progress.working.progress": "ڈیٹا دی منتقلی \u2068{{current}}\u2069/\u2068{{total}}\u2069",
"home.workspaceTip": "تبدیلیوں کو الگ تھلگ رکھنے لئی اگلا سیشن ایک نئی ورک اسپیس میں شروع کرو۔",
"session.tab.add": "ٹیب شامل کرو۔",
"session.tab.closeOthers": "ہور ٹیب بند کرو",
"session.queue.attachments.one": "پلس \u2068{{count}}\u2069 منسلکہ",
"session.queue.attachments.other": "پلس \u2068{{count}}\u2069 منسلکات",
"settings.backToSettings": "ترتیبات پر واپس جائیں۔",
+1
View File
@@ -771,6 +771,7 @@ export const dict = {
"toast.migration.progress.working.progress": "Migracja danych {{current}}/{{total}}",
"home.workspaceTip": "Rozpocznij następną sesję w nowym obszarze roboczym, aby zmiany były odizolowane",
"session.tab.add": "Dodaj kartę",
"session.tab.closeOthers": "Zamknij pozostałe karty",
"session.queue.attachments.one": "Jeszcze {{count}} załącznik",
"session.queue.attachments.other": "Jeszcze {{count}} załącznika",
"settings.backToSettings": "Powrót do ustawień",
+1
View File
@@ -738,6 +738,7 @@ export const dict = {
"dialog.server.menu.remove": "Eliminați",
"home.workspaceTip": "Începeți următoarea sesiune într-un spațiu de lucru nou pentru a păstra modificările izolate",
"session.tab.add": "Adăugați fila",
"session.tab.closeOthers": "Închide celelalte file",
"session.queue.attachments.one": "Plus {{count}} atașament",
"session.queue.attachments.other": "Plus {{count}} atașamente",
"settings.backToSettings": "Înapoi la setări",
+1
View File
@@ -827,6 +827,7 @@ export const dict = {
"home.workspaceTip":
"Начните следующую сессию в новом рабочем пространстве, чтобы изменения оставались изолированными",
"session.tab.add": "Добавить вкладку",
"session.tab.closeOthers": "Закрыть другие вкладки",
"session.queue.attachments.one": "Плюс {{count}} вложение",
"session.queue.attachments.other": "Плюс {{count}} вложения",
"settings.backToSettings": "Назад к настройкам",
+1
View File
@@ -744,6 +744,7 @@ export const dict = {
"toast.migration.progress.working.progress": "දත්ත සංක්‍රමණය වෙමින් {{current}}/{{total}}",
"home.workspaceTip": "වෙනස්කම් හුදකලාව තබා ගැනීමට නව වැඩබිමක මීළඟ සැසිය ආරම්භ කරන්න",
"session.tab.add": "ටැබ් එක එකතු කරන්න",
"session.tab.closeOthers": "අනෙක් ටැබ් වසන්න",
"session.queue.attachments.one": "ප්ලස් {{count}} ඇමුණුම",
"session.queue.attachments.other": "ප්ලස් {{count}} ඇමුණුම්",
"settings.backToSettings": "සැකසීම් වෙත ආපසු",
+1
View File
@@ -768,6 +768,7 @@ export const dict = {
"toast.migration.progress.working.progress": "Migrácia údajov {{current}}/{{total}}",
"home.workspaceTip": "Spustite ďalšiu reláciu v novom pracovnom prostredí, aby zostali zmeny izolované",
"session.tab.add": "Pridať kartu",
"session.tab.closeOthers": "Zavrieť ostatné karty",
"session.queue.attachments.one": "Plus {{count}} príloha",
"session.queue.attachments.other": "Plus {{count}} príloh",
"settings.backToSettings": "Späť do nastavení",
+1
View File
@@ -767,6 +767,7 @@ export const dict = {
"toast.migration.progress.working.progress": "Migriram podatke {{current}}/{{total}}",
"home.workspaceTip": "Za naslednjo sejo začnite v novem delovnem prostoru, da ohranite spremembe ločene",
"session.tab.add": "Dodaj zavihek",
"session.tab.closeOthers": "Zapri druge zavihke",
"session.queue.attachments.one": "Še {{count}} priponka",
"session.queue.attachments.other": "Še {{count}} priponk",
"settings.backToSettings": "Nazaj na nastavitve",
+1
View File
@@ -730,6 +730,7 @@ export const dict = {
"dialog.server.menu.remove": "Hiq",
"home.workspaceTip": "Filloni sesionin tjetër në një hapësirë ​​të re pune për të mbajtur ndryshimet të izoluara",
"session.tab.add": "Shto skedën",
"session.tab.closeOthers": "Mbyll skedat e tjera",
"session.queue.attachments.one": "Plus {{count}} bashkëngjitje",
"session.queue.attachments.other": "Plus bashkëngjitjet {{count}}",
"settings.backToSettings": "Kthehu te cilësimet",
+1
View File
@@ -755,6 +755,7 @@ export const dict = {
"toast.migration.progress.working.progress": "Мигрирање података {{current}}/{{total}}",
"home.workspaceTip": "Покрените следећу сесију у новом радном простору да бисте задржали измене изолованим",
"session.tab.add": "Додај картицу",
"session.tab.closeOthers": "Затвори остале картице",
"session.queue.attachments.one": "Још {{count}} прилог",
"session.queue.attachments.other": "Још {{count}} прилога",
"settings.backToSettings": "Назад на подешавања",
+1
View File
@@ -36,6 +36,7 @@ export const dict = {
"dialog.server.menu.remove": "Ta bort",
"home.workspaceTip": "Starta nästa session i en ny arbetsyta för att hålla ändringar isolerade",
"session.tab.add": "Lägg till flik",
"session.tab.closeOthers": "Stäng andra flikar",
"session.queue.attachments.one": "Plus {{count}}-tillbehör",
"session.queue.attachments.other": "Plus {{count}}-tillbehör",
"settings.backToSettings": "Tillbaka till inställningarna",
+1
View File
@@ -748,6 +748,7 @@ export const dict = {
"toast.migration.progress.working.progress": "Интиқоли додаҳо {{current}}/{{total}}",
"home.workspaceTip": "Сеанси навбатиро дар фазои кории нав оғоз кунед, то тағирот дар алоҳидагӣ нигоҳ дошта шавад",
"session.tab.add": "Иловаи ҷадвал",
"session.tab.closeOthers": "Варақаҳои дигарро пӯшед",
"session.queue.attachments.one": "Илова бар замимаи {{count}}",
"session.queue.attachments.other": "Илова бар ин {{count}} замима",
"settings.backToSettings": "Бозгашт ба танзимот",
+1
View File
@@ -802,6 +802,7 @@ export const dict = {
"toast.migration.progress.working.progress": "กำลังย้ายข้อมูล {{current}}/{{total}}",
"home.workspaceTip": "เริ่มเซสชันถัดไปในพื้นที่ทำงานใหม่เพื่อให้การเปลี่ยนแปลงแยกออกจากกัน",
"session.tab.add": "เพิ่มแท็บ",
"session.tab.closeOthers": "ปิดแท็บอื่น",
"session.queue.attachments.one": "เพิ่มไฟล์แนบ {{count}} ไฟล์",
"session.queue.attachments.other": "เพิ่มไฟล์แนบ {{count}} ไฟล์",
"settings.backToSettings": "กลับไปที่การตั้งค่า",
+1
View File
@@ -741,6 +741,7 @@ export const dict = {
"toast.migration.progress.working.progress": "Maglumatlar geçirilýär {{current}}/{{total}}",
"home.workspaceTip": "Üýtgeşmeleri üzňe saklamak üçin indiki sessiýany täze iş ýerinde başlaň",
"session.tab.add": "Salgy goşuň",
"session.tab.closeOthers": "Beýleki salgylary ýapyň",
"session.queue.attachments.one": "Goşmaça {{count}} goşundy",
"session.queue.attachments.other": "Goşmaça {{count}} goşundylar",
"settings.backToSettings": "Sazlamalara dolan",
+1
View File
@@ -806,6 +806,7 @@ export const dict = {
"dialog.server.menu.remove": "Kaldır",
"home.workspaceTip": "Değişiklikleri izole tutmak için sonraki oturumu yeni bir çalışma alanında başlatın",
"session.tab.add": "Sekme ekle",
"session.tab.closeOthers": "Diğer sekmeleri kapat",
"session.queue.attachments.one": "Artı {{count}} eklentisi",
"session.queue.attachments.other": "Ayrıca {{count}} eklentileri",
"settings.backToSettings": "Ayarlara geri dön",
+1
View File
@@ -836,6 +836,7 @@ export const dict = {
"toast.migration.progress.working.progress": "Перенесення даних {{current}}/{{total}}",
"home.workspaceTip": "Розпочніть наступну сесію в новому робочому просторі, щоб ізолювати зміни",
"session.tab.add": "Додати вкладку",
"session.tab.closeOthers": "Закрити інші вкладки",
"session.queue.attachments.one": "Ще {{count}} вкладення",
"session.queue.attachments.other": "Ще {{count}} вкладення",
"settings.backToSettings": "Назад до налаштувань",
+1
View File
@@ -757,6 +757,7 @@ export const dict = {
"toast.migration.progress.working.progress": "ڈیٹا کی منتقلی \u2068{{current}}\u2069/\u2068{{total}}\u2069",
"home.workspaceTip": "تبدیلیوں کو الگ تھلگ رکھنے کے لیے اگلا سیشن ایک نئی ورک اسپیس میں شروع کریں۔",
"session.tab.add": "ٹیب شامل کریں۔",
"session.tab.closeOthers": "دیگر ٹیبز بند کریں",
"session.queue.attachments.one": "پلس \u2068{{count}}\u2069 منسلکہ",
"session.queue.attachments.other": "پلس \u2068{{count}}\u2069 منسلکات",
"settings.backToSettings": "ترتیبات پر واپس جائیں۔",
+1
View File
@@ -747,6 +747,7 @@ export const dict = {
"toast.migration.progress.working.progress": "Maʼlumotlar koʻchirilmoqda {{current}}/{{total}}",
"home.workspaceTip": "O'zgarishlarni izolyatsiya qilish uchun keyingi sessiyani yangi ish maydonida boshlang",
"session.tab.add": "Yorliq qo'shish",
"session.tab.closeOthers": "Boshqa tablarni yoping",
"session.queue.attachments.one": "Yana {{count}} ta biriktirma",
"session.queue.attachments.other": "Yana {{count}} ta biriktirma",
"settings.backToSettings": "Sozlamalarga qaytish",
+1
View File
@@ -753,6 +753,7 @@ export const dict = {
"toast.migration.progress.working.progress": "Đang di chuyển dữ liệu {{current}}/{{total}}",
"home.workspaceTip": "Bắt đầu phiên tiếp theo trong một không gian làm việc mới để giữ các thay đổi riêng biệt",
"session.tab.add": "Thêm tab",
"session.tab.closeOthers": "Đóng các tab khác",
"session.queue.attachments.one": "Thêm {{count}} tệp đính kèm",
"session.queue.attachments.other": "Thêm {{count}} tệp đính kèm",
"settings.backToSettings": "Quay lại cài đặt",
+1
View File
@@ -799,6 +799,7 @@ export const dict = {
"toast.migration.progress.working.progress": "正在迁移数据 {{current}}/{{total}}",
"home.workspaceTip": "在新工作区中开始下一个会话以保持更改独立",
"session.tab.add": "添加标签页",
"session.tab.closeOthers": "关闭其他标签页",
"session.queue.attachments.one": "添加 {{count}} 个附件",
"session.queue.attachments.other": "添加 {{count}} 个附件",
"settings.backToSettings": "返回设置",
+1
View File
@@ -791,6 +791,7 @@ export const dict = {
"toast.migration.progress.working.progress": "正在遷移資料 {{current}}/{{total}}",
"home.workspaceTip": "在新工作區啟動下一個工作階段,以保持變更彼此獨立",
"session.tab.add": "新增分頁",
"session.tab.closeOthers": "關閉其他分頁",
"session.queue.attachments.one": "另加 {{count}} 個附件",
"session.queue.attachments.other": "另加 {{count}} 個附件",
"settings.backToSettings": "返回設定",
@@ -122,7 +122,7 @@ export function PanelTrigger(props: {
>
<Switch
fallback={
<div class="relative">
<div class="relative min-w-0">
<Tabs.Trigger
value={props.value}
id={props.tab.dom?.tab}
@@ -220,6 +220,18 @@ export function PaneTabs(props: {
const modifier = closedTabsModifier()
// The tab a right click opened the tab menu on, and where. One menu serves the strip: a menu around each trigger
// would register the tab in the menu's item collection instead of the strip's.
const [tabMenu, setTabMenu] = createStore({ open: false, key: "", x: 0, y: 0 })
const closable = createMemo(() =>
props.pane.keys().filter((key) => {
const tab = props.region.entry(key)?.tab
return !!tab && !tab.pinned && tab.closable !== false
}),
)
// Without a new tab item, "+" opens a host-owned new tab view listing the launchers, as ⌘T does inside the region.
const current = createMemo(() => props.region.shownNewTab(props.pane.id))
const add = () => props.region.openNewTab(props.pane.id)
@@ -256,6 +268,17 @@ export function PaneTabs(props: {
})
onCleanup(createTabStripScroll({ el, lead: props.pane.lead }))
}}
onContextMenu={(event: MouseEvent) => {
const key =
event.target instanceof Element
? event.target.closest<HTMLElement>("[data-pane-tab]")?.dataset.paneTab
: undefined
// A label's own context menu, such as a terminal's, handles the click first.
if (!key || event.defaultPrevented) return
event.preventDefault()
setTabMenu({ open: true, key, x: event.clientX, y: event.clientY })
}}
>
<For each={props.pane.keys()}>
{(key) => (
@@ -348,6 +371,32 @@ export function PaneTabs(props: {
</Show>
</div>
</Tabs.List>
<Menu
open={tabMenu.open}
onOpenChange={(open) => setTabMenu("open", open)}
modal={false}
placement="bottom-start"
gutter={0}
getAnchorRect={() => ({ x: tabMenu.x, y: tabMenu.y, width: 0, height: 0 })}
>
<Menu.Portal>
<Menu.Content>
<Menu.Item disabled={!closable().includes(tabMenu.key)} onSelect={() => props.region.close(tabMenu.key)}>
{language.t("common.closeTab")}
</Menu.Item>
<Menu.Item
disabled={!closable().some((key) => key !== tabMenu.key)}
onSelect={() => {
const keep = tabMenu.key
closable().forEach((key) => key !== keep && props.region.close(key))
}}
>
{language.t("session.tab.closeOthers")}
</Menu.Item>
</Menu.Content>
</Menu.Portal>
</Menu>
<div
data-slot="session-side-panel-actions"
class="session-review-v2-open-in-app-slot h-[var(--tabs-bar-height)] shrink-0 flex items-center gap-2 pe-3"
+19
View File
@@ -495,10 +495,20 @@
padding-inline-end: 12px;
gap: 8px;
--tabs-review-fade: 8px;
/* Like browser tabs, each tab keeps its natural width while they all fit; otherwise the longest titles truncate
first, and the strip scrolls only once every tab is at its minimum. Close buttons stay in view meanwhile. */
> :not(.sticky) {
flex: 1 1 0;
min-width: 72px;
max-width: max-content;
}
}
[data-slot="tabs-trigger-wrapper"] {
height: 28px;
min-width: 0;
flex-shrink: 1;
padding-inline: 10px;
border: 0;
background-color: transparent;
@@ -510,6 +520,15 @@
[data-slot="tabs-trigger"] {
padding: 0 !important;
/* A plugin's label shrinks with the tab so its own `truncate` text can ellipsize. */
> * {
min-width: 0;
}
}
[data-slot="tabs-trigger-close-button"] {
flex-shrink: 0;
}
/* The 20px close button sits 4px from the tab's end, as from its top and bottom. */