difit 3.1.1 → 3.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.ja.md CHANGED
@@ -101,18 +101,18 @@ git diff -- /dev/null path/to/file | difit
101
101
 
102
102
  ## ⚙️ CLIオプション
103
103
 
104
- | フラグ | デフォルト | 説明 |
105
- | --------------------- | ------------ | --------------------------------------------------------------------------------- |
106
- | `<target>` | HEAD | コミットハッシュ、タグ、HEAD~n、ブランチ、または特別な引数 |
107
- | `[compare-with]` | - | 比較対象の2番目のコミット(2つの間のdiffを表示) |
108
- | `--pr <url>` | - | レビューするGitHub PRのURL(例:https://github.com/owner/repo/pull/123) |
109
- | `--port` | 4966 | 優先ポート。使用中の場合は+1にフォールバック |
110
- | `--host` | 127.0.0.1 | サーバーをバインドするホストアドレス(外部からアクセスしたい場合は0.0.0.0を指定) |
111
- | `--no-open` | false | ブラウザを自動的に開かない |
112
- | `--mode` | side-by-side | 表示モード。inline`または`side-by-side` |
113
- | `--tui` | false | WebUIの代わりにターミナルUIを使用 |
114
- | `--clean` | false | 起動時に既存コメントと閲覧済みファイルをすべてクリア |
115
- | `--include-untracked` | false | diffにuntrackedファイルを自動的に含める(`.`または`working`のみ有効) |
104
+ | フラグ | デフォルト | 説明 |
105
+ | --------------------- | ---------- | --------------------------------------------------------------------------------- |
106
+ | `<target>` | HEAD | コミットハッシュ、タグ、HEAD~n、ブランチ、または特別な引数 |
107
+ | `[compare-with]` | - | 比較対象の2番目のコミット(2つの間のdiffを表示) |
108
+ | `--pr <url>` | - | レビューするGitHub PRのURL(例:https://github.com/owner/repo/pull/123) |
109
+ | `--port` | 4966 | 優先ポート。使用中の場合は+1にフォールバック |
110
+ | `--host` | 127.0.0.1 | サーバーをバインドするホストアドレス(外部からアクセスしたい場合は0.0.0.0を指定) |
111
+ | `--no-open` | false | ブラウザを自動的に開かない |
112
+ | `--mode` | split | 表示モード。`unified`または`split` |
113
+ | `--tui` | false | WebUIの代わりにターミナルUIを使用 |
114
+ | `--clean` | false | 起動時に既存コメントと閲覧済みファイルをすべてクリア |
115
+ | `--include-untracked` | false | diffにuntrackedファイルを自動的に含める(`.`または`working`のみ有効) |
116
116
 
117
117
  ## 💬 コメントシステム
118
118
 
package/README.ko.md CHANGED
@@ -101,18 +101,18 @@ git diff -- /dev/null path/to/file | difit
101
101
 
102
102
  ## ⚙️ CLI 옵션
103
103
 
104
- | 플래그 | 기본값 | 설명 |
105
- | --------------------- | ------------ | ----------------------------------------------------------------- |
106
- | `<target>` | HEAD | 커밋 해시, 태그, HEAD~n, 브랜치 또는 특수 인수 |
107
- | `[compare-with]` | - | 비교할 선택적 두 번째 커밋 (둘 사이의 diff 표시) |
108
- | `--pr <url>` | - | 검토할 GitHub PR URL (예: https://github.com/owner/repo/pull/123) |
109
- | `--port` | 4966 | 선호 포트; 사용 중인 경우 +1로 대체 |
110
- | `--host` | 127.0.0.1 | 서버를 바인딩할 호스트 주소 (외부 액세스는 0.0.0.0 사용) |
111
- | `--no-open` | false | 브라우저를 자동으로 열지 않음 |
112
- | `--mode` | side-by-side | 표시 모드: `inline` 또는 `side-by-side` |
113
- | `--tui` | false | WebUI 대신 터미널 UI 모드 사용 |
114
- | `--clean` | false | 시작 시 모든 기존 코멘트와 열람된 파일 표시 초기화 |
115
- | `--include-untracked` | false | diff에 untracked 파일 자동 포함 (`.` 또는 `working`에서만 유효) |
104
+ | 플래그 | 기본값 | 설명 |
105
+ | --------------------- | --------- | ----------------------------------------------------------------- |
106
+ | `<target>` | HEAD | 커밋 해시, 태그, HEAD~n, 브랜치 또는 특수 인수 |
107
+ | `[compare-with]` | - | 비교할 선택적 두 번째 커밋 (둘 사이의 diff 표시) |
108
+ | `--pr <url>` | - | 검토할 GitHub PR URL (예: https://github.com/owner/repo/pull/123) |
109
+ | `--port` | 4966 | 선호 포트; 사용 중인 경우 +1로 대체 |
110
+ | `--host` | 127.0.0.1 | 서버를 바인딩할 호스트 주소 (외부 액세스는 0.0.0.0 사용) |
111
+ | `--no-open` | false | 브라우저를 자동으로 열지 않음 |
112
+ | `--mode` | split | 표시 모드: `unified` 또는 `split` |
113
+ | `--tui` | false | WebUI 대신 터미널 UI 모드 사용 |
114
+ | `--clean` | false | 시작 시 모든 기존 코멘트와 열람된 파일 표시 초기화 |
115
+ | `--include-untracked` | false | diff에 untracked 파일 자동 포함 (`.` 또는 `working`에서만 유효) |
116
116
 
117
117
  ## 💬 코멘트 시스템
118
118
 
package/README.md CHANGED
@@ -101,18 +101,18 @@ git diff -- /dev/null path/to/file | difit
101
101
 
102
102
  ## ⚙️ CLI Options
103
103
 
104
- | Flag | Default | Description |
105
- | --------------------- | ------------ | -------------------------------------------------------------------------- |
106
- | `<target>` | HEAD | Commit hash, tag, HEAD~n, branch, or special arguments |
107
- | `[compare-with]` | - | Optional second commit to compare with (shows diff between the two) |
108
- | `--pr <url>` | - | GitHub PR URL to review (e.g., https://github.com/owner/repo/pull/123) |
109
- | `--port` | 4966 | Preferred port; falls back to +1 if occupied |
110
- | `--host` | 127.0.0.1 | Host address to bind server to (use 0.0.0.0 for external access) |
111
- | `--no-open` | false | Don't automatically open browser |
112
- | `--mode` | side-by-side | Display mode: `inline` or `side-by-side` |
113
- | `--tui` | false | Use terminal UI mode instead of WebUI |
114
- | `--clean` | false | Clear all existing comments and viewed files on startup |
115
- | `--include-untracked` | false | Automatically include untracked files in diff (only with `.` or `working`) |
104
+ | Flag | Default | Description |
105
+ | --------------------- | --------- | -------------------------------------------------------------------------- |
106
+ | `<target>` | HEAD | Commit hash, tag, HEAD~n, branch, or special arguments |
107
+ | `[compare-with]` | - | Optional second commit to compare with (shows diff between the two) |
108
+ | `--pr <url>` | - | GitHub PR URL to review (e.g., https://github.com/owner/repo/pull/123) |
109
+ | `--port` | 4966 | Preferred port; falls back to +1 if occupied |
110
+ | `--host` | 127.0.0.1 | Host address to bind server to (use 0.0.0.0 for external access) |
111
+ | `--no-open` | false | Don't automatically open browser |
112
+ | `--mode` | split | Display mode: `unified` or `split` |
113
+ | `--tui` | false | Use terminal UI mode instead of WebUI |
114
+ | `--clean` | false | Clear all existing comments and viewed files on startup |
115
+ | `--include-untracked` | false | Automatically include untracked files in diff (only with `.` or `working`) |
116
116
 
117
117
  ## 💬 Comment System
118
118
 
package/README.zh.md CHANGED
@@ -101,18 +101,18 @@ git diff -- /dev/null path/to/file | difit
101
101
 
102
102
  ## ⚙️ CLI 选项
103
103
 
104
- | 标志 | 默认值 | 描述 |
105
- | --------------------- | ------------ | ---------------------------------------------------------------------- |
106
- | `<target>` | HEAD | 提交哈希、标签、HEAD~n、分支或特殊参数 |
107
- | `[compare-with]` | - | 要比较的可选第二个提交(显示两者之间的差异) |
108
- | `--pr <url>` | - | 要审查的 GitHub PR URL(例如:https://github.com/owner/repo/pull/123) |
109
- | `--port` | 4966 | 首选端口;如果被占用则回退到 +1 |
110
- | `--host` | 127.0.0.1 | 绑定服务器的主机地址(使用 0.0.0.0 进行外部访问) |
111
- | `--no-open` | false | 不自动打开浏览器 |
112
- | `--mode` | side-by-side | 显示模式:`inline` 或 `side-by-side` |
113
- | `--tui` | false | 使用终端 UI 模式而不是 WebUI |
114
- | `--clean` | false | 启动时清除所有现有评论和已查看的文件 |
115
- | `--include-untracked` | false | 自动将 untracked 文件包含在 diff 中(仅在 `.` 或 `working` 时有效) |
104
+ | 标志 | 默认值 | 描述 |
105
+ | --------------------- | --------- | ---------------------------------------------------------------------- |
106
+ | `<target>` | HEAD | 提交哈希、标签、HEAD~n、分支或特殊参数 |
107
+ | `[compare-with]` | - | 要比较的可选第二个提交(显示两者之间的差异) |
108
+ | `--pr <url>` | - | 要审查的 GitHub PR URL(例如:https://github.com/owner/repo/pull/123) |
109
+ | `--port` | 4966 | 首选端口;如果被占用则回退到 +1 |
110
+ | `--host` | 127.0.0.1 | 绑定服务器的主机地址(使用 0.0.0.0 进行外部访问) |
111
+ | `--no-open` | false | 不自动打开浏览器 |
112
+ | `--mode` | split | 显示模式:`unified` 或 `split` |
113
+ | `--tui` | false | 使用终端 UI 模式而不是 WebUI |
114
+ | `--clean` | false | 启动时清除所有现有评论和已查看的文件 |
115
+ | `--include-untracked` | false | 自动将 untracked 文件包含在 diff 中(仅在 `.` 或 `working` 时有效) |
116
116
 
117
117
  ## 💬 评论系统
118
118
 
package/dist/cli/index.js CHANGED
@@ -5,6 +5,7 @@ import { simpleGit } from 'simple-git';
5
5
  import pkg from '../../package.json' with { type: 'json' };
6
6
  import { startServer } from '../server/server.js';
7
7
  import { DiffMode } from '../types/watch.js';
8
+ import { DEFAULT_DIFF_VIEW_MODE, normalizeDiffViewMode } from '../utils/diffMode.js';
8
9
  import { findUntrackedFiles, markFilesIntentToAdd, promptUser, validateDiffArguments, resolvePrCommits, getGitRoot, } from './utils.js';
9
10
  function isSpecialArg(arg) {
10
11
  return arg === 'working' || arg === 'staged' || arg === '.';
@@ -37,7 +38,7 @@ program
37
38
  .option('--port <port>', 'preferred port (auto-assigned if occupied)', parseInt)
38
39
  .option('--host <host>', 'host address to bind', '')
39
40
  .option('--no-open', 'do not automatically open browser')
40
- .option('--mode <mode>', 'diff mode (side-by-side or inline)', 'side-by-side')
41
+ .option('--mode <mode>', 'diff mode (split or unified)', normalizeDiffViewMode, DEFAULT_DIFF_VIEW_MODE)
41
42
  .option('--tui', 'use terminal UI instead of web interface')
42
43
  .option('--pr <url>', 'GitHub PR URL to review (e.g., https://github.com/owner/repo/pull/123)')
43
44
  .option('--clean', 'start with a clean slate by clearing all existing comments')
@@ -2,6 +2,7 @@ import { Command } from 'commander';
2
2
  import React from 'react';
3
3
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
4
4
  import { DiffMode } from '../types/watch.js';
5
+ import { DEFAULT_DIFF_VIEW_MODE, normalizeDiffViewMode } from '../utils/diffMode.js';
5
6
  // Mock all external dependencies
6
7
  vi.mock('simple-git');
7
8
  vi.mock('../server/server.js');
@@ -110,7 +111,7 @@ describe('CLI index.ts', () => {
110
111
  .option('--port <port>', 'port', parseInt)
111
112
  .option('--host <host>', 'host', '')
112
113
  .option('--no-open', 'no-open')
113
- .option('--mode <mode>', 'mode', 'side-by-side')
114
+ .option('--mode <mode>', 'mode', normalizeDiffViewMode, DEFAULT_DIFF_VIEW_MODE)
114
115
  .option('--tui', 'tui')
115
116
  .option('--pr <url>', 'pr')
116
117
  .action(async (commitish, _compareWith, options) => {
@@ -152,7 +153,7 @@ describe('CLI index.ts', () => {
152
153
  preferredPort: undefined,
153
154
  host: '',
154
155
  openBrowser: true,
155
- mode: 'side-by-side',
156
+ mode: 'split',
156
157
  });
157
158
  });
158
159
  });
@@ -175,8 +176,18 @@ describe('CLI index.ts', () => {
175
176
  },
176
177
  {
177
178
  name: '--mode option',
179
+ args: ['--mode', 'unified'],
180
+ expectedOptions: { mode: 'unified' },
181
+ },
182
+ {
183
+ name: '--mode option (legacy inline)',
178
184
  args: ['--mode', 'inline'],
179
- expectedOptions: { mode: 'inline' },
185
+ expectedOptions: { mode: 'unified' },
186
+ },
187
+ {
188
+ name: '--mode option (legacy side-by-side)',
189
+ args: ['--mode', 'side-by-side'],
190
+ expectedOptions: { mode: 'split' },
180
191
  },
181
192
  {
182
193
  name: '--clean option',
@@ -192,7 +203,7 @@ describe('CLI index.ts', () => {
192
203
  .option('--port <port>', 'port', parseInt)
193
204
  .option('--host <host>', 'host', '')
194
205
  .option('--no-open', 'no-open')
195
- .option('--mode <mode>', 'mode', 'side-by-side')
206
+ .option('--mode <mode>', 'mode', normalizeDiffViewMode, DEFAULT_DIFF_VIEW_MODE)
196
207
  .option('--tui', 'tui')
197
208
  .option('--pr <url>', 'pr')
198
209
  .option('--clean', 'start with a clean slate by clearing all existing comments')
@@ -216,7 +227,7 @@ describe('CLI index.ts', () => {
216
227
  preferredPort: expectedOptions.port,
217
228
  host: expectedOptions.host || '',
218
229
  openBrowser: expectedOptions.open !== false,
219
- mode: expectedOptions.mode || 'side-by-side',
230
+ mode: expectedOptions.mode || 'split',
220
231
  clearComments: expectedOptions.clean,
221
232
  };
222
233
  expect(mockStartServer).toHaveBeenCalledWith(expectedCall);
@@ -235,7 +246,7 @@ describe('CLI index.ts', () => {
235
246
  .option('--port <port>', 'port', parseInt)
236
247
  .option('--host <host>', 'host', '')
237
248
  .option('--no-open', 'no-open')
238
- .option('--mode <mode>', 'mode', 'side-by-side')
249
+ .option('--mode <mode>', 'mode', normalizeDiffViewMode, DEFAULT_DIFF_VIEW_MODE)
239
250
  .option('--tui', 'tui')
240
251
  .option('--pr <url>', 'pr')
241
252
  .action(async (commitish, _compareWith, options) => {
@@ -266,7 +277,7 @@ describe('CLI index.ts', () => {
266
277
  .option('--port <port>', 'port', parseInt)
267
278
  .option('--host <host>', 'host', '')
268
279
  .option('--no-open', 'no-open')
269
- .option('--mode <mode>', 'mode', 'side-by-side')
280
+ .option('--mode <mode>', 'mode', normalizeDiffViewMode, DEFAULT_DIFF_VIEW_MODE)
270
281
  .option('--tui', 'tui')
271
282
  .option('--pr <url>', 'pr')
272
283
  .action(async (commitish, _compareWith, options) => {
@@ -297,7 +308,7 @@ describe('CLI index.ts', () => {
297
308
  .option('--port <port>', 'port', parseInt)
298
309
  .option('--host <host>', 'host', '')
299
310
  .option('--no-open', 'no-open')
300
- .option('--mode <mode>', 'mode', 'side-by-side')
311
+ .option('--mode <mode>', 'mode', normalizeDiffViewMode, DEFAULT_DIFF_VIEW_MODE)
301
312
  .option('--tui', 'tui')
302
313
  .option('--pr <url>', 'pr')
303
314
  .option('--include-untracked', 'include untracked')
@@ -333,7 +344,7 @@ describe('CLI index.ts', () => {
333
344
  .option('--port <port>', 'port', parseInt)
334
345
  .option('--host <host>', 'host', '')
335
346
  .option('--no-open', 'no-open')
336
- .option('--mode <mode>', 'mode', 'side-by-side')
347
+ .option('--mode <mode>', 'mode', normalizeDiffViewMode, DEFAULT_DIFF_VIEW_MODE)
337
348
  .option('--tui', 'tui')
338
349
  .option('--pr <url>', 'pr')
339
350
  .option('--include-untracked', 'include untracked')
@@ -375,7 +386,7 @@ describe('CLI index.ts', () => {
375
386
  .option('--port <port>', 'port', parseInt)
376
387
  .option('--host <host>', 'host', '')
377
388
  .option('--no-open', 'no-open')
378
- .option('--mode <mode>', 'mode', 'side-by-side')
389
+ .option('--mode <mode>', 'mode', normalizeDiffViewMode, DEFAULT_DIFF_VIEW_MODE)
379
390
  .option('--tui', 'tui')
380
391
  .option('--pr <url>', 'pr')
381
392
  .action(async (commitish, _compareWith, options) => {
@@ -410,7 +421,7 @@ describe('CLI index.ts', () => {
410
421
  preferredPort: undefined,
411
422
  host: '',
412
423
  openBrowser: true,
413
- mode: 'side-by-side',
424
+ mode: 'split',
414
425
  });
415
426
  });
416
427
  it('rejects PR option with positional arguments', async () => {
@@ -421,7 +432,7 @@ describe('CLI index.ts', () => {
421
432
  .option('--port <port>', 'port', parseInt)
422
433
  .option('--host <host>', 'host', '')
423
434
  .option('--no-open', 'no-open')
424
- .option('--mode <mode>', 'mode', 'side-by-side')
435
+ .option('--mode <mode>', 'mode', normalizeDiffViewMode, DEFAULT_DIFF_VIEW_MODE)
425
436
  .option('--tui', 'tui')
426
437
  .option('--pr <url>', 'pr')
427
438
  .action(async (commitish, _compareWith, options) => {
@@ -452,7 +463,7 @@ describe('CLI index.ts', () => {
452
463
  .option('--port <port>', 'port', parseInt)
453
464
  .option('--host <host>', 'host', '')
454
465
  .option('--no-open', 'no-open')
455
- .option('--mode <mode>', 'mode', 'side-by-side')
466
+ .option('--mode <mode>', 'mode', normalizeDiffViewMode, DEFAULT_DIFF_VIEW_MODE)
456
467
  .option('--tui', 'tui')
457
468
  .option('--pr <url>', 'pr')
458
469
  .action(async (commitish, _compareWith, options) => {
@@ -487,7 +498,7 @@ describe('CLI index.ts', () => {
487
498
  preferredPort: undefined,
488
499
  host: '',
489
500
  openBrowser: true,
490
- mode: 'side-by-side',
501
+ mode: 'split',
491
502
  });
492
503
  });
493
504
  });
@@ -506,7 +517,7 @@ describe('CLI index.ts', () => {
506
517
  .option('--port <port>', 'port', parseInt)
507
518
  .option('--host <host>', 'host', '')
508
519
  .option('--no-open', 'no-open')
509
- .option('--mode <mode>', 'mode', 'side-by-side')
520
+ .option('--mode <mode>', 'mode', normalizeDiffViewMode, DEFAULT_DIFF_VIEW_MODE)
510
521
  .option('--tui', 'tui')
511
522
  .option('--pr <url>', 'pr')
512
523
  .option('--clean', 'start with a clean slate by clearing all existing comments')
@@ -546,7 +557,7 @@ describe('CLI index.ts', () => {
546
557
  .option('--port <port>', 'port', parseInt)
547
558
  .option('--host <host>', 'host', '')
548
559
  .option('--no-open', 'no-open')
549
- .option('--mode <mode>', 'mode', 'side-by-side')
560
+ .option('--mode <mode>', 'mode', normalizeDiffViewMode, DEFAULT_DIFF_VIEW_MODE)
550
561
  .option('--tui', 'tui')
551
562
  .option('--pr <url>', 'pr')
552
563
  .option('--clean', 'start with a clean slate by clearing all existing comments')
@@ -588,7 +599,7 @@ describe('CLI index.ts', () => {
588
599
  .option('--port <port>', 'port', parseInt)
589
600
  .option('--host <host>', 'host', '')
590
601
  .option('--no-open', 'no-open')
591
- .option('--mode <mode>', 'mode', 'side-by-side')
602
+ .option('--mode <mode>', 'mode', normalizeDiffViewMode, DEFAULT_DIFF_VIEW_MODE)
592
603
  .option('--tui', 'tui')
593
604
  .option('--pr <url>', 'pr')
594
605
  .action(async (commitish, _compareWith, options) => {
@@ -631,7 +642,7 @@ describe('CLI index.ts', () => {
631
642
  .option('--port <port>', 'port', parseInt)
632
643
  .option('--host <host>', 'host', '')
633
644
  .option('--no-open', 'no-open')
634
- .option('--mode <mode>', 'mode', 'side-by-side')
645
+ .option('--mode <mode>', 'mode', normalizeDiffViewMode, DEFAULT_DIFF_VIEW_MODE)
635
646
  .option('--tui', 'tui')
636
647
  .option('--pr <url>', 'pr')
637
648
  .action(async (commitish, _compareWith, options) => {
@@ -665,7 +676,7 @@ describe('CLI index.ts', () => {
665
676
  .option('--port <port>', 'port', parseInt)
666
677
  .option('--host <host>', 'host', '')
667
678
  .option('--no-open', 'no-open')
668
- .option('--mode <mode>', 'mode', 'side-by-side')
679
+ .option('--mode <mode>', 'mode', normalizeDiffViewMode, DEFAULT_DIFF_VIEW_MODE)
669
680
  .option('--tui', 'tui')
670
681
  .option('--pr <url>', 'pr')
671
682
  .action(async (commitish, _compareWith, options) => {
@@ -678,9 +689,9 @@ describe('CLI index.ts', () => {
678
689
  mode: options.mode,
679
690
  });
680
691
  });
681
- await program.parseAsync(['--mode', 'inline'], { from: 'user' });
692
+ await program.parseAsync(['--mode', 'unified'], { from: 'user' });
682
693
  expect(mockStartServer).toHaveBeenCalledWith(expect.objectContaining({
683
- mode: 'inline',
694
+ mode: 'unified',
684
695
  }));
685
696
  });
686
697
  it('uses default mode when not specified', async () => {
@@ -692,7 +703,7 @@ describe('CLI index.ts', () => {
692
703
  .option('--port <port>', 'port', parseInt)
693
704
  .option('--host <host>', 'host', '')
694
705
  .option('--no-open', 'no-open')
695
- .option('--mode <mode>', 'mode', 'side-by-side')
706
+ .option('--mode <mode>', 'mode', normalizeDiffViewMode, DEFAULT_DIFF_VIEW_MODE)
696
707
  .option('--tui', 'tui')
697
708
  .option('--pr <url>', 'pr')
698
709
  .action(async (commitish, _compareWith, options) => {
@@ -707,7 +718,7 @@ describe('CLI index.ts', () => {
707
718
  });
708
719
  await program.parseAsync([], { from: 'user' });
709
720
  expect(mockStartServer).toHaveBeenCalledWith(expect.objectContaining({
710
- mode: 'side-by-side',
721
+ mode: 'split',
711
722
  }));
712
723
  });
713
724
  });
@@ -746,7 +757,7 @@ describe('CLI index.ts', () => {
746
757
  .option('--port <port>', 'port', parseInt)
747
758
  .option('--host <host>', 'host', '')
748
759
  .option('--no-open', 'no-open')
749
- .option('--mode <mode>', 'mode', 'side-by-side')
760
+ .option('--mode <mode>', 'mode', normalizeDiffViewMode, DEFAULT_DIFF_VIEW_MODE)
750
761
  .option('--tui', 'tui')
751
762
  .option('--pr <url>', 'pr')
752
763
  .action(async (commitish, _compareWith, options) => {
@@ -770,7 +781,7 @@ describe('CLI index.ts', () => {
770
781
  props: {
771
782
  targetCommitish: 'main',
772
783
  baseCommitish: 'main^',
773
- mode: 'side-by-side',
784
+ mode: 'split',
774
785
  },
775
786
  });
776
787
  });
@@ -783,7 +794,7 @@ describe('CLI index.ts', () => {
783
794
  .option('--port <port>', 'port', parseInt)
784
795
  .option('--host <host>', 'host', '')
785
796
  .option('--no-open', 'no-open')
786
- .option('--mode <mode>', 'mode', 'side-by-side')
797
+ .option('--mode <mode>', 'mode', normalizeDiffViewMode, DEFAULT_DIFF_VIEW_MODE)
787
798
  .option('--tui', 'tui')
788
799
  .option('--pr <url>', 'pr')
789
800
  .action(async (commitish, _compareWith, options) => {
@@ -801,13 +812,13 @@ describe('CLI index.ts', () => {
801
812
  }));
802
813
  }
803
814
  });
804
- await program.parseAsync(['--tui', '--mode', 'inline'], { from: 'user' });
815
+ await program.parseAsync(['--tui', '--mode', 'unified'], { from: 'user' });
805
816
  expect(mockRender).toHaveBeenCalledWith({
806
817
  component: mockTuiApp,
807
818
  props: {
808
819
  targetCommitish: 'HEAD',
809
820
  baseCommitish: 'HEAD^',
810
- mode: 'inline',
821
+ mode: 'unified',
811
822
  },
812
823
  });
813
824
  });
@@ -820,7 +831,7 @@ describe('CLI index.ts', () => {
820
831
  .option('--port <port>', 'port', parseInt)
821
832
  .option('--host <host>', 'host', '')
822
833
  .option('--no-open', 'no-open')
823
- .option('--mode <mode>', 'mode', 'side-by-side')
834
+ .option('--mode <mode>', 'mode', normalizeDiffViewMode, DEFAULT_DIFF_VIEW_MODE)
824
835
  .option('--tui', 'tui')
825
836
  .option('--pr <url>', 'pr')
826
837
  .action(async (commitish, _compareWith, options) => {
@@ -845,13 +856,13 @@ describe('CLI index.ts', () => {
845
856
  }));
846
857
  }
847
858
  });
848
- await program.parseAsync(['working', '--tui', '--mode', 'inline'], { from: 'user' });
859
+ await program.parseAsync(['working', '--tui', '--mode', 'unified'], { from: 'user' });
849
860
  expect(mockRender).toHaveBeenCalledWith({
850
861
  component: mockTuiApp,
851
862
  props: {
852
863
  targetCommitish: 'working',
853
864
  baseCommitish: 'staged',
854
- mode: 'inline',
865
+ mode: 'unified',
855
866
  },
856
867
  });
857
868
  });
@@ -868,7 +879,7 @@ describe('CLI index.ts', () => {
868
879
  .option('--port <port>', 'port', parseInt)
869
880
  .option('--host <host>', 'host', '')
870
881
  .option('--no-open', 'no-open')
871
- .option('--mode <mode>', 'mode', 'side-by-side')
882
+ .option('--mode <mode>', 'mode', normalizeDiffViewMode, DEFAULT_DIFF_VIEW_MODE)
872
883
  .option('--tui', 'tui')
873
884
  .option('--pr <url>', 'pr')
874
885
  .action(async (_commitish, _compareWith, options) => {
@@ -929,7 +940,7 @@ describe('CLI index.ts', () => {
929
940
  .option('--port <port>', 'port', parseInt)
930
941
  .option('--host <host>', 'host', '')
931
942
  .option('--no-open', 'no-open')
932
- .option('--mode <mode>', 'mode', 'side-by-side')
943
+ .option('--mode <mode>', 'mode', normalizeDiffViewMode, DEFAULT_DIFF_VIEW_MODE)
933
944
  .option('--tui', 'tui')
934
945
  .option('--pr <url>', 'pr')
935
946
  .action(async (commitish, compareWith, options) => {
@@ -975,7 +986,7 @@ describe('CLI index.ts', () => {
975
986
  .option('--port <port>', 'port', parseInt)
976
987
  .option('--host <host>', 'host', '')
977
988
  .option('--no-open', 'no-open')
978
- .option('--mode <mode>', 'mode', 'side-by-side')
989
+ .option('--mode <mode>', 'mode', normalizeDiffViewMode, DEFAULT_DIFF_VIEW_MODE)
979
990
  .option('--tui', 'tui')
980
991
  .option('--pr <url>', 'pr')
981
992
  .action(async (commitish, compareWith, options) => {
@@ -1022,7 +1033,7 @@ describe('CLI index.ts', () => {
1022
1033
  .option('--port <port>', 'port', parseInt)
1023
1034
  .option('--host <host>', 'host', '')
1024
1035
  .option('--no-open', 'no-open')
1025
- .option('--mode <mode>', 'mode', 'side-by-side')
1036
+ .option('--mode <mode>', 'mode', normalizeDiffViewMode, DEFAULT_DIFF_VIEW_MODE)
1026
1037
  .option('--tui', 'tui')
1027
1038
  .option('--pr <url>', 'pr')
1028
1039
  .action(async (commitish, compareWith, options) => {
@@ -0,0 +1 @@
1
+ @layer properties{@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:"";--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-100:oklch(93.6% .032 17.717);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-600:oklch(68.1% .162 75.834);--color-green-100:oklch(96.2% .044 156.743);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-400:oklch(74.6% .16 232.661);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--font-weight-medium:500;--font-weight-semibold:600;--tracking-wide:.025em;--radius-md:.375rem;--radius-lg:.5rem;--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-github-bg-primary:#0d1117;--color-github-bg-secondary:#161b22;--color-github-bg-tertiary:#21262d;--color-github-border:#30363d;--color-github-text-primary:#f0f6fc;--color-github-text-secondary:#8b949e;--color-github-text-muted:#6e7681;--color-github-accent:#238636;--color-github-danger:#da3633;--color-github-warning:#d29922;--color-diff-addition-bg:#0d4429;--color-diff-addition-border:#1b7c3d;--color-diff-deletion-bg:#67060c;--color-diff-deletion-border:#da3633;--color-diff-neutral-bg:#21262d;--color-diff-selected-bg:#ae7c1426;--color-diff-selected-border:#ae7c1466;--color-comment-bg:#1c2128;--color-comment-border:#373e47;--color-comment-text:#e6edf3}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::-moz-placeholder{opacity:1}::placeholder{opacity:1}@supports (not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::-moz-placeholder{color:currentColor}::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::-moz-placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.top-1\/2{top:50%}.-right-2{right:calc(var(--spacing)*-2)}.-right-10{right:calc(var(--spacing)*-10)}.right-0{right:calc(var(--spacing)*0)}.left-0{left:calc(var(--spacing)*0)}.left-3{left:calc(var(--spacing)*3)}.isolate{isolation:isolate}.z-0{z-index:0}.z-10{z-index:10}.z-50{z-index:50}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing)*0)}.m-2{margin:calc(var(--spacing)*2)}.mx-3{margin-inline:calc(var(--spacing)*3)}.mx-4{margin-inline:calc(var(--spacing)*4)}.mx-auto{margin-inline:auto}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-6{margin-top:calc(var(--spacing)*6)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.table{display:table}.h-2{height:calc(var(--spacing)*2)}.h-4{height:calc(var(--spacing)*4)}.h-7{height:calc(var(--spacing)*7)}.h-9{height:calc(var(--spacing)*9)}.h-full{height:100%}.h-screen{height:100vh}.max-h-96{max-height:calc(var(--spacing)*96)}.max-h-\[80vh\]{max-height:80vh}.max-h-\[400px\]{max-height:400px}.max-h-\[calc\(80vh-120px\)\]{max-height:calc(80vh - 120px)}.min-h-\[16px\]{min-height:16px}.min-h-\[20px\]{min-height:20px}.min-h-\[60px\]{min-height:60px}.w-1\/2{width:50%}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-\[360px\]{width:360px}.w-\[var\(--line-number-width\)\]{width:var(--line-number-width)}.w-full{width:100%}.max-w-4xl{max-width:var(--container-4xl)}.max-w-\[150px\]{max-width:150px}.max-w-\[var\(--line-number-width\)\]{max-width:var(--line-number-width)}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\[var\(--line-number-width\)\]{min-width:var(--line-number-width)}.min-w-full{min-width:100%}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.table-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.-translate-y-0\.5{--tw-translate-y:calc(var(--spacing)*-.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-0\.5{--tw-translate-y:calc(var(--spacing)*.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-col-resize{cursor:col-resize}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.resize-y{resize:vertical}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[var\(--line-number-width\)_1fr\]{grid-template-columns:var(--line-number-width)1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}.self-center{align-self:center}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-none{--tw-border-style:none;border-style:none}.border-diff-addition-border{border-color:var(--color-diff-addition-border)}.border-diff-deletion-border{border-color:var(--color-diff-deletion-border)}.border-github-accent{border-color:var(--color-github-accent)}.border-github-border{border-color:var(--color-github-border)}.border-github-text-muted{border-color:var(--color-github-text-muted)}.border-github-text-primary{border-color:var(--color-github-text-primary)}.border-transparent{border-color:#0000}.border-yellow-600\/50{border-color:#cd890080}@supports (color:color-mix(in lab,red,red)){.border-yellow-600\/50{border-color:color-mix(in oklab,var(--color-yellow-600)50%,transparent)}}.border-t-github-accent{border-top-color:var(--color-github-accent)}.border-l-diff-selected-border{border-left-color:var(--color-diff-selected-border)}.border-l-yellow-400{border-left-color:var(--color-yellow-400)}.bg-\[var\(--bg-secondary\)\]{background-color:var(--bg-secondary)}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-diff-addition-bg{background-color:var(--color-diff-addition-bg)}.bg-diff-deletion-bg{background-color:var(--color-diff-deletion-bg)}.bg-diff-selected-bg{background-color:var(--color-diff-selected-bg)}.bg-github-accent{background-color:var(--color-github-accent)}.bg-github-bg-primary{background-color:var(--color-github-bg-primary)}.bg-github-bg-secondary{background-color:var(--color-github-bg-secondary)}.bg-github-bg-secondary\/40{background-color:#161b2266}@supports (color:color-mix(in lab,red,red)){.bg-github-bg-secondary\/40{background-color:color-mix(in oklab,var(--color-github-bg-secondary)40%,transparent)}}.bg-github-bg-tertiary{background-color:var(--color-github-bg-tertiary)}.bg-github-bg-tertiary\/80{background-color:#21262dcc}@supports (color:color-mix(in lab,red,red)){.bg-github-bg-tertiary\/80{background-color:color-mix(in oklab,var(--color-github-bg-tertiary)80%,transparent)}}.bg-github-border{background-color:var(--color-github-border)}.bg-github-text-primary{background-color:var(--color-github-text-primary)}.bg-green-100\/10{background-color:#dcfce71a}@supports (color:color-mix(in lab,red,red)){.bg-green-100\/10{background-color:color-mix(in oklab,var(--color-green-100)10%,transparent)}}.bg-red-100\/10{background-color:#ffe2e21a}@supports (color:color-mix(in lab,red,red)){.bg-red-100\/10{background-color:color-mix(in oklab,var(--color-red-100)10%,transparent)}}.bg-transparent{background-color:#0000}.p-0{padding:calc(var(--spacing)*0)}.p-1{padding:calc(var(--spacing)*1)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.pt-4{padding-top:calc(var(--spacing)*4)}.pr-2{padding-right:calc(var(--spacing)*2)}.pr-3{padding-right:calc(var(--spacing)*3)}.pb-px{padding-bottom:1px}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-4{padding-left:calc(var(--spacing)*4)}.pl-6{padding-left:calc(var(--spacing)*6)}.pl-9{padding-left:calc(var(--spacing)*9)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[22px\]{font-size:22px}.text-\[26px\]{font-size:26px}.leading-5{--tw-leading:calc(var(--spacing)*5);line-height:calc(var(--spacing)*5)}.leading-6{--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}.leading-7{--tw-leading:calc(var(--spacing)*7);line-height:calc(var(--spacing)*7)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-github-accent{color:var(--color-github-accent)}.text-github-bg-primary{color:var(--color-github-bg-primary)}.text-github-danger{color:var(--color-github-danger)}.text-github-text-muted{color:var(--color-github-text-muted)}.text-github-text-primary{color:var(--color-github-text-primary)}.text-github-text-secondary{color:var(--color-github-text-secondary)}.text-github-warning{color:var(--color-github-warning)}.text-green-600{color:var(--color-green-600)}.text-sky-400{color:var(--color-sky-400)}.text-white{color:var(--color-white)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.placeholder-github-text-muted::-moz-placeholder{color:var(--color-github-text-muted)}.placeholder-github-text-muted::placeholder{color:var(--color-github-text-muted)}.accent-github-accent{accent-color:var(--color-github-accent)}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-blue-500{--tw-ring-color:var(--color-blue-500)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.\!transition-all{transition-property:all!important;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--tw-duration,var(--default-transition-duration))!important}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.\!duration-300{--tw-duration:.3s!important;transition-duration:.3s!important}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.\!ease-in-out{--tw-ease:var(--ease-in-out)!important;transition-timing-function:var(--ease-in-out)!important}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-text{-webkit-user-select:text;-moz-user-select:text;user-select:text}@media(hover:hover){.group-hover\:text-github-text-primary:is(:where(.group):hover *){color:var(--color-github-text-primary)}}.after\:pointer-events-none:after{content:var(--tw-content);pointer-events:none}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:inset-0:after{content:var(--tw-content);inset:calc(var(--spacing)*0)}.after\:border-t-2:after{content:var(--tw-content);border-top-style:var(--tw-border-style);border-top-width:2px}.after\:border-b-2:after{content:var(--tw-content);border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.after\:border-l-4:after{content:var(--tw-content);border-left-style:var(--tw-border-style);border-left-width:4px}.after\:border-l-5:after{content:var(--tw-content);border-left-style:var(--tw-border-style);border-left-width:5px}.after\:border-blue-500:after{content:var(--tw-content);border-color:var(--color-blue-500)}.after\:border-l-diff-selected-border:after{content:var(--tw-content);border-left-color:var(--color-diff-selected-border)}.after\:bg-blue-100:after{content:var(--tw-content);background-color:var(--color-blue-100)}.after\:bg-diff-selected-bg:after{content:var(--tw-content);background-color:var(--color-diff-selected-bg)}.after\:opacity-30:after{content:var(--tw-content);opacity:.3}.first\:mt-0:first-child{margin-top:calc(var(--spacing)*0)}@media(hover:hover){.hover\:scale-110:hover{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:border-github-accent\/50:hover{border-color:#23863680}@supports (color:color-mix(in lab,red,red)){.hover\:border-github-accent\/50:hover{border-color:color-mix(in oklab,var(--color-github-accent)50%,transparent)}}.hover\:border-github-text-muted:hover{border-color:var(--color-github-text-muted)}.hover\:border-github-text-secondary:hover{border-color:var(--color-github-text-secondary)}.hover\:border-green-600:hover{border-color:var(--color-green-600)}.hover\:bg-diff-selected-bg:hover{background-color:var(--color-diff-selected-bg)}.hover\:bg-github-bg-primary:hover{background-color:var(--color-github-bg-primary)}.hover\:bg-github-bg-secondary:hover{background-color:var(--color-github-bg-secondary)}.hover\:bg-github-bg-tertiary:hover{background-color:var(--color-github-bg-tertiary)}.hover\:bg-github-text-muted:hover{background-color:var(--color-github-text-muted)}.hover\:bg-green-500\/10:hover{background-color:#00c7581a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-green-500\/10:hover{background-color:color-mix(in oklab,var(--color-green-500)10%,transparent)}}.hover\:bg-green-600:hover{background-color:var(--color-green-600)}.hover\:text-github-text-muted:hover{color:var(--color-github-text-muted)}.hover\:text-github-text-primary:hover{color:var(--color-github-text-primary)}.hover\:text-sky-300:hover{color:var(--color-sky-300)}.hover\:opacity-80:hover{opacity:.8}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\:min-h-\[80px\]:focus{min-height:80px}.focus\:border-blue-600:focus{border-color:var(--color-blue-600)}.focus\:border-github-accent:focus{border-color:var(--color-github-accent)}.focus\:bg-diff-selected-bg:focus{background-color:var(--color-diff-selected-bg)}.focus\:bg-github-bg-tertiary:focus{background-color:var(--color-github-bg-tertiary)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-blue-600\/30:focus{--tw-ring-color:#155dfc4d}@supports (color:color-mix(in lab,red,red)){.focus\:ring-blue-600\/30:focus{--tw-ring-color:color-mix(in oklab,var(--color-blue-600)30%,transparent)}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:64rem){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(prefers-color-scheme:dark){.dark\:border-slate-500{border-color:var(--color-slate-500)}.dark\:bg-slate-600{background-color:var(--color-slate-600)}.dark\:text-white{color:var(--color-white)}@media(hover:hover){.dark\:hover\:border-slate-400:hover{border-color:var(--color-slate-400)}.dark\:hover\:bg-slate-500:hover{background-color:var(--color-slate-500)}}}.\[\&_\.token-line\]\:block .token-line{display:block}.\[\&_\.token-line\]\:whitespace-pre .token-line{white-space:pre}.\[\&_code\]\:\!bg-transparent code{background-color:#0000!important}.\[\&_code\]\:text-inherit code{color:inherit}.\[\&_pre\]\:m-0 pre{margin:calc(var(--spacing)*0)}.\[\&_pre\]\:\!bg-transparent pre{background-color:#0000!important}.\[\&_pre\]\:p-0 pre{padding:calc(var(--spacing)*0)}.\[\&_pre\]\:text-inherit pre{color:inherit}}:root{--app-font-size:14px;--app-font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans",Helvetica,Arial,sans-serif}html,body{background-color:var(--color-github-bg-primary);color:var(--color-github-text-primary);font-family:var(--app-font-family);line-height:1.5;font-size:var(--app-font-size)}:root{interpolate-size:allow-keywords}button{cursor:pointer}.markdown-preview-code .token-line{display:block}@keyframes sparkle-rise{0%{opacity:0;transform:translateY(20px)scale(.5)}20%{opacity:1;transform:translateY(10px)scale(1)}80%{opacity:1;transform:translateY(-30px)scale(1)}to{opacity:0;transform:translateY(-40px)scale(.8)}}.animate-sparkle-rise{animation:.8s ease-out both sparkle-rise}html,body,.bg-github-bg-primary,.bg-github-bg-secondary,.bg-github-bg-tertiary,[class*=bg-github],[class*=text-github],[class*=border-github],[class*=bg-diff],[class*=border-diff]{transition:background-color .3s,color .3s,border-color .3s}tr.keyboard-cursor td{position:relative}tr.keyboard-cursor td:before{content:"";pointer-events:none;z-index:1;background-color:#fffd5433;position:absolute;inset:0}tr.keyboard-cursor td:first-child:before{box-shadow:inset 1px 0 #fffd5466,inset 0 1px #fffd5466,inset 0 -1px #fffd5466}tr.keyboard-cursor td:last-child:before{box-shadow:inset -1px 0 #fffd5466,inset 0 1px #fffd5466,inset 0 -1px #fffd5466}tr.keyboard-cursor td:not(:first-child):not(:last-child):before{box-shadow:inset 0 1px #fffd5466,inset 0 -1px #fffd5466}td.keyboard-cursor{position:relative}td.keyboard-cursor:before{content:"";pointer-events:none;z-index:1;background-color:#fffd5433;position:absolute;inset:0;box-shadow:inset 0 0 0 1px #fffd5466}.word-token{cursor:pointer;transition:background-color .15s;position:relative}.word-highlight{background-color:var(--word-highlight-color,#fffd54);border-radius:2px}[data-theme=dark]{color-scheme:dark}[data-theme=light]{color-scheme:light}[data-theme=dark]{--word-highlight-color:#fffd544d}[data-theme=light]{--word-highlight-color:#fffd54}.word-diff-added{background-color:var(--word-diff-added-bg);border-radius:2px;padding:0 1px}.word-diff-removed{background-color:var(--word-diff-removed-bg);border-radius:2px;padding:0 1px}:root,[data-theme=dark]{--word-diff-added-bg:#3fb95066;--word-diff-removed-bg:#f8514966}[data-theme=light]{--word-diff-added-bg:#3fb95080;--word-diff-removed-bg:#f8514980}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}}