Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion PRIVACY.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ All data collected by Panelize is used solely for providing extension functional

### AI Provider Websites

Panelize loads AI provider websites (ChatGPT, Claude, Gemini, Grok, DeepSeek, Kimi, Doubao, Qwen, and Google AI Mode) inside embedded panels. These providers operate under their own privacy policies.
Panelize loads AI provider websites (ChatGPT, Claude, Gemini, Grok, DeepSeek, Kimi, Doubao, Qwen, ChatGLM, and Google AI Mode) inside embedded panels. These providers operate under their own privacy policies.

When you interact with these AI providers through Panelize, you are subject to their respective privacy policies. Panelize does not collect or store the content of your conversations with these services.

Expand Down
8 changes: 6 additions & 2 deletions README.ja.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,11 @@

### 1回の入力で同時送信

統一入力欄から ChatGPT / Claude / Gemini / Grok / Doubao / DeepSeek / Kimi / Google へ同時に送信できます。
統一入力欄から ChatGPT / Claude / Gemini / Grok / Doubao / DeepSeek / Kimi / Qwen / Zhipu (China) / Z.ai (Global) / Google へ同時に送信できます。

### 柔軟なレイアウト

15種類のレイアウトを用意。素早い2モデル比較には1×2、4モデルの比較には1×4が使えます
22種類のレイアウトを用意。素早い2モデル比較には1×2、最大12モデルの比較には1×12または2×6が使えます

<p align="center">
<img src="assets/screenshots/select-layout.png" alt="Layout Selection" width="600">
Expand Down Expand Up @@ -76,6 +76,10 @@ API キー不要。通常どおり各 AI サービスにログインしていれ
- Doubao
- DeepSeek
- Kimi
- Qwen(中国版)
- Qwen(グローバル版)
- Zhipu (China)
- Z.ai (Global)
- Google

<p align="center">
Expand Down
10 changes: 8 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,11 @@ Ever found yourself copying the same prompt across multiple AI tabs just to comp

### 🎯 Ask Once, Compare All

Type your question once and send it to ChatGPT, Claude, Gemini, Grok, Doubao, DeepSeek, Kimi, and Google simultaneously. See which AI gives you the best answer—no tab switching required.
Type your question once and send it to ChatGPT, Claude, Gemini, Grok, Doubao, DeepSeek, Kimi, Qwen, Zhipu (China), Z.ai (Global), and Google simultaneously. See which AI gives you the best answer—no tab switching required.

### 📐 Flexible Layouts

Choose from 15 different layouts to fit your workflow. Need a quick 2-way comparison? Use 1×2. Deep research across 4 models? Try 1×4. The choice is yours.
Choose from 22 different layouts to fit your workflow. Need a quick 2-way comparison? Use 1×2. Deep research across 12 models? Try 1×12 or 2×6. The choice is yours.

<p align="center">
<img src="assets/screenshots/select-layout.png" alt="Layout Selection" width="600">
Expand Down Expand Up @@ -82,6 +82,12 @@ Save your best prompts and reuse them across all providers. Supports variables l
<td align="center"><strong>Kimi</strong></td>
<td align="center"><strong>Google</strong></td>
</tr>
<tr>
<td align="center"><strong>Qwen (China)</strong></td>
<td align="center"><strong>Qwen (Global)</strong></td>
<td align="center"><strong>Zhipu (China)</strong></td>
<td align="center"><strong>Z.ai (Global)</strong></td>
</tr>
</table>

<p align="center">
Expand Down
8 changes: 6 additions & 2 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,11 @@

### 一次提问,同时对比

在统一输入框中输入一次内容,就能同时发送到 ChatGPT、Claude、Gemini、Grok、Doubao、DeepSeek、Kimi、Google。
在统一输入框中输入一次内容,就能同时发送到 ChatGPT、Claude、Gemini、Grok、Doubao、DeepSeek、Kimi、Qwen、Zhipu (China)、Z.ai (Global)、Google。

### 灵活布局

支持 15 种布局。快速双模型对比可用 1×2,四模型深入分析可用4
支持 22 种布局。快速双模型对比可用 1×2,最多可用12 或 2×6 同时对比 12 个模型

<p align="center">
<img src="assets/screenshots/select-layout.png" alt="布局选择" width="600">
Expand Down Expand Up @@ -76,6 +76,10 @@
- Doubao
- DeepSeek
- Kimi
- Qwen(中国版)
- Qwen(海外版)
- Zhipu (China)
- Z.ai (Global)
- Google

<p align="center">
Expand Down
2 changes: 1 addition & 1 deletion _locales/de/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@
"message": "Passen Sie an, wie die Enter-Taste und Modifikatortasten funktionieren, wenn Sie in KI-Anbieter-Eingabefeldern tippen."
},
"descEnterBehavior2": {
"message": "<strong>Gilt für:</strong> ChatGPT, Claude, Gemini, Grok, DeepSeek, Kimi, Doubao, Qwen (China), Qwen (Global) und Google (KI-Modus)."
"message": "<strong>Gilt für:</strong> ChatGPT, Claude, Gemini, Grok, DeepSeek, Kimi, Doubao, Qwen (China), Qwen (Global), Zhipu (China), Z.ai (Global) und Google (KI-Modus)."
},
"labelEnableEnterCustomization": {
"message": "Enter-Tasten-Anpassung aktivieren"
Expand Down
2 changes: 1 addition & 1 deletion _locales/en/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@
"message": "Customize how Enter and modifier keys work when typing in AI provider input fields."
},
"descEnterBehavior2": {
"message": "<strong>Applies to:</strong> ChatGPT, Claude, Gemini, Grok, DeepSeek, Kimi, Doubao, Qwen (China), Qwen (Global), and Google (AI Mode)."
"message": "<strong>Applies to:</strong> ChatGPT, Claude, Gemini, Grok, DeepSeek, Kimi, Doubao, Qwen (China), Qwen (Global), Zhipu (China), Z.ai (Global), and Google (AI Mode)."
},
"labelEnableEnterCustomization": {
"message": "Enable Enter Key Customization"
Expand Down
2 changes: 1 addition & 1 deletion _locales/es/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@
"message": "Personaliza cómo funcionan la tecla Enter y las teclas modificadoras al escribir en los campos de entrada de proveedores de IA."
},
"descEnterBehavior2": {
"message": "<strong>Se aplica a:</strong> ChatGPT, Claude, Gemini, Grok, DeepSeek, Kimi, Doubao, Qwen (China), Qwen (Global) y Google (Modo IA)."
"message": "<strong>Se aplica a:</strong> ChatGPT, Claude, Gemini, Grok, DeepSeek, Kimi, Doubao, Qwen (China), Qwen (Global), Zhipu (China), Z.ai (Global) y Google (Modo IA)."
},
"labelEnableEnterCustomization": {
"message": "Habilitar Personalización de Tecla Enter"
Expand Down
2 changes: 1 addition & 1 deletion _locales/fr/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@
"message": "Personnalisez le fonctionnement de la touche Entrée et des touches modificatrices lors de la saisie dans les champs de saisie des fournisseurs IA."
},
"descEnterBehavior2": {
"message": "<strong>S'applique à :</strong> ChatGPT, Claude, Gemini, Grok, DeepSeek, Kimi, Doubao, Qwen (China), Qwen (Global) et Google (Mode IA)."
"message": "<strong>S'applique à :</strong> ChatGPT, Claude, Gemini, Grok, DeepSeek, Kimi, Doubao, Qwen (China), Qwen (Global), Zhipu (China), Z.ai (Global) et Google (Mode IA)."
},
"labelEnableEnterCustomization": {
"message": "Activer la personnalisation de la touche Entrée"
Expand Down
2 changes: 1 addition & 1 deletion _locales/it/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@
"message": "Personalizza come funzionano il tasto Invio e i tasti modificatori durante la digitazione nei campi di input dei provider IA."
},
"descEnterBehavior2": {
"message": "<strong>Si applica a:</strong> ChatGPT, Claude, Gemini, Grok, DeepSeek, Kimi, Doubao, Qwen (China), Qwen (Global) e Google (Modalità IA)."
"message": "<strong>Si applica a:</strong> ChatGPT, Claude, Gemini, Grok, DeepSeek, Kimi, Doubao, Qwen (China), Qwen (Global), Zhipu (China), Z.ai (Global) e Google (Modalità IA)."
},
"labelEnableEnterCustomization": {
"message": "Abilita personalizzazione tasto Invio"
Expand Down
2 changes: 1 addition & 1 deletion _locales/ja/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@
"message": "AI プロバイダーの入力フィールドで Enter キーと修飾キーがどのように機能するかをカスタマイズします。"
},
"descEnterBehavior2": {
"message": "<strong>適用先:</strong> ChatGPT、Claude、Gemini、Grok、DeepSeek、Kimi、Doubao、Qwen (China)、Qwen (Global)、Google(AI モード)。"
"message": "<strong>適用先:</strong> ChatGPT、Claude、Gemini、Grok、DeepSeek、Kimi、Doubao、Qwen (China)、Qwen (Global)、Zhipu (China)、Z.ai (Global)、Google(AI モード)。"
},
"labelEnableEnterCustomization": {
"message": "Enter キーのカスタマイズを有効にする"
Expand Down
2 changes: 1 addition & 1 deletion _locales/ko/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@
"message": "AI 제공자 입력 필드에서 Enter 키와 수정 키가 작동하는 방식을 사용자 지정합니다."
},
"descEnterBehavior2": {
"message": "<strong>적용 대상:</strong> ChatGPT, Claude, Gemini, Grok, DeepSeek, Kimi, Doubao, Qwen (China), Qwen (Global) 및 Google (AI 모드)."
"message": "<strong>적용 대상:</strong> ChatGPT, Claude, Gemini, Grok, DeepSeek, Kimi, Doubao, Qwen (China), Qwen (Global), Zhipu (China), Z.ai (Global) 및 Google (AI 모드)."
},
"labelEnableEnterCustomization": {
"message": "Enter 키 사용자 지정 활성화"
Expand Down
2 changes: 1 addition & 1 deletion _locales/ru/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@
"message": "Настройте, как работают клавиша Enter и модификаторы при вводе в полях ввода провайдеров ИИ."
},
"descEnterBehavior2": {
"message": "<strong>Применяется к:</strong> ChatGPT, Claude, Gemini, Grok, DeepSeek, Kimi, Doubao, Qwen (China), Qwen (Global) и Google (AI Mode)."
"message": "<strong>Применяется к:</strong> ChatGPT, Claude, Gemini, Grok, DeepSeek, Kimi, Doubao, Qwen (China), Qwen (Global), Zhipu (China), Z.ai (Global) и Google (AI Mode)."
},
"labelEnableEnterCustomization": {
"message": "Включить настройку клавиши Enter"
Expand Down
2 changes: 1 addition & 1 deletion _locales/zh_CN/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@
"message": "自定义在 AI 提供商输入字段中输入时回车键和修饰键的工作方式。"
},
"descEnterBehavior2": {
"message": "<strong>适用于:</strong> ChatGPT、Claude、Gemini、Grok、DeepSeek、Kimi、Doubao、Qwen (China)、Qwen (Global) 和 Google(AI 模式)。"
"message": "<strong>适用于:</strong> ChatGPT、Claude、Gemini、Grok、DeepSeek、Kimi、Doubao、Qwen (China)、Qwen (Global)、Zhipu (China)、Z.ai (Global) 和 Google(AI 模式)。"
},
"labelEnableEnterCustomization": {
"message": "启用回车键自定义"
Expand Down
2 changes: 1 addition & 1 deletion _locales/zh_TW/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@
"message": "自訂在 AI 提供者輸入欄位中輸入時 Enter 鍵和修飾鍵的工作方式。"
},
"descEnterBehavior2": {
"message": "<strong>適用於:</strong> ChatGPT、Claude、Gemini、Grok、DeepSeek、Kimi、Doubao、Qwen (China)、Qwen (Global) 和 Google(AI 模式)。"
"message": "<strong>適用於:</strong> ChatGPT、Claude、Gemini、Grok、DeepSeek、Kimi、Doubao、Qwen (China)、Qwen (Global)、Zhipu (China)、Z.ai (Global) 和 Google(AI 模式)。"
},
"labelEnableEnterCustomization": {
"message": "啟用 Enter 鍵自訂"
Expand Down
84 changes: 84 additions & 0 deletions content-scripts/enter-behavior-chatglm.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
// ChatGLM Enter/Shift+Enter behavior swap
// Depends on enter-behavior-utils.js and button-finder-utils.js.

const CHATGLM_SEND_BUTTON_SELECTORS = [
{
type: 'css',
value: '#search-input-box .enter.is-main-chat .enter-icon-container'
}
];

function isChatGLMInput(element) {
return Boolean(
element &&
element.tagName === 'TEXTAREA' &&
element.offsetParent !== null &&
element.classList.contains('scroll-display-none') &&
element.closest('#search-input-box')
);
}

function insertChatGLMNewline(textarea) {
const start = textarea.selectionStart;
const end = textarea.selectionEnd;
textarea.setRangeText('\n', start, end, 'end');
textarea.dispatchEvent(new Event('input', { bubbles: true }));
textarea.dispatchEvent(new Event('change', { bubbles: true }));
}

function dispatchChatGLMEnter(textarea) {
textarea.dispatchEvent(new KeyboardEvent('keydown', {
key: 'Enter',
code: 'Enter',
keyCode: 13,
which: 13,
bubbles: true,
cancelable: true
}));
}

function dispatchChatGLMSend(sendButton) {
// ChatGLM submits from its mousedown handler; HTMLElement.click() skips it.
sendButton.dispatchEvent(new MouseEvent('mousedown', {
bubbles: true,
cancelable: true,
view: window,
button: 0,
buttons: 1
}));
}

function handleEnterSwap(event) {
if (!event.isTrusted || event.code !== 'Enter' || event.isComposing || !enterKeyConfig?.enabled) {
return;
}

const input = document.activeElement;
if (!isChatGLMInput(input)) {
return;
}

if (matchesModifiers(event, enterKeyConfig.newlineModifiers)) {
event.preventDefault();
event.stopImmediatePropagation();
insertChatGLMNewline(input);
return;
}

if (!matchesModifiers(event, enterKeyConfig.sendModifiers)) {
return;
}

event.preventDefault();
event.stopImmediatePropagation();

const sendButton = window.ButtonFinderUtils?.findButton(CHATGLM_SEND_BUTTON_SELECTORS);
if (sendButton && !sendButton.disabled && sendButton.getAttribute('aria-disabled') !== 'true') {
dispatchChatGLMSend(sendButton);
return;
}

dispatchChatGLMEnter(input);
}

applyEnterSwapSetting();
75 changes: 75 additions & 0 deletions content-scripts/enter-behavior-zai-global.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
// Z.ai Global Enter/Shift+Enter behavior swap
// Depends on enter-behavior-utils.js and button-finder-utils.js.

const ZAI_GLOBAL_SEND_BUTTON_SELECTORS = [
{
type: 'css',
value: 'button.sendMessageButton'
}
];

function isZaiGlobalInput(element) {
return Boolean(
element &&
element.tagName === 'TEXTAREA' &&
element.offsetParent !== null &&
(
element.placeholder === 'How can I help you today?' ||
element.classList.contains('input-scroll')
)
);
}

function insertZaiGlobalNewline(textarea) {
const start = textarea.selectionStart;
const end = textarea.selectionEnd;
textarea.setRangeText('\n', start, end, 'end');
textarea.dispatchEvent(new Event('input', { bubbles: true }));
textarea.dispatchEvent(new Event('change', { bubbles: true }));
}

function dispatchZaiGlobalEnter(textarea) {
textarea.dispatchEvent(new KeyboardEvent('keydown', {
key: 'Enter',
code: 'Enter',
keyCode: 13,
which: 13,
bubbles: true,
cancelable: true
}));
}

function handleEnterSwap(event) {
if (!event.isTrusted || event.code !== 'Enter' || event.isComposing || !enterKeyConfig?.enabled) {
return;
}

const input = document.activeElement;
if (!isZaiGlobalInput(input)) {
return;
}

if (matchesModifiers(event, enterKeyConfig.newlineModifiers)) {
event.preventDefault();
event.stopImmediatePropagation();
insertZaiGlobalNewline(input);
return;
}

if (!matchesModifiers(event, enterKeyConfig.sendModifiers)) {
return;
}

event.preventDefault();
event.stopImmediatePropagation();

const sendButton = window.ButtonFinderUtils?.findButton(ZAI_GLOBAL_SEND_BUTTON_SELECTORS);
if (sendButton && !sendButton.disabled && sendButton.getAttribute('aria-disabled') !== 'true') {
sendButton.click();
return;
}

dispatchZaiGlobalEnter(input);
}

applyEnterSwapSetting();
11 changes: 11 additions & 0 deletions content-scripts/focus-toggle.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,17 @@ function findProviderInput() {
document.querySelector('textarea.ds-scroll-area');
}

// ChatGLM
if (host === 'chatglm.cn') {
return document.querySelector('#search-input-box textarea.scroll-display-none');
}

// Z.ai Global
if (host === 'chat.z.ai') {
return document.querySelector('textarea[placeholder="How can I help you today?"]') ||
document.querySelector('textarea.input-scroll');
}

// Generic fallback: find any visible textarea or contenteditable
const textarea = document.querySelector('textarea:not([hidden])');
if (textarea && textarea.offsetParent !== null) return textarea;
Expand Down
Loading
Loading