ds-markdown 0.0.14 → 0.0.15-beta.0

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
@@ -38,6 +38,7 @@
38
38
  - 高頻度タイピングサポート(`requestAnimationFrame` モードでは `0ms` に近いタイピング間隔をサポート)
39
39
  - フレーム同期レンダリング、ブラウザの 60fps と完璧にマッチ
40
40
  - スマート文字バッチ処理により、より自然な視覚効果
41
+ - タイピングの中断 `stop` と再開 `resume` をサポート
41
42
 
42
43
  ### 🔧 **柔軟で使いやすい**
43
44
 
@@ -45,6 +46,13 @@
45
46
  - **命令的 API**:ストリーミングデータに適し、より良いパフォーマンス
46
47
  - **ネイティブ TypeScript サポート**:完全な型ヒント
47
48
 
49
+ ### 🧮 **数式サポート**
50
+
51
+ - **KaTeX 統合**:高性能な数式レンダリング
52
+ - **デュアル構文サポート**:`$...$` と `\[...\]` の2つの区切り文字
53
+ - **ストリーミング対応**:タイピングアニメーションでの数式の完璧なサポート
54
+ - **テーマ適応**:ライト/ダークテーマへの自動適応
55
+
48
56
  ---
49
57
 
50
58
  ## 📦 クイックインストール
@@ -64,39 +72,16 @@ pnpm add ds-markdown
64
72
 
65
73
  インストール不要、ブラウザで直接使用できます:
66
74
 
75
+ [DEMO](https://stackblitz.com/edit/stackblitz-starters-7vcclcw7?file=index.html)
76
+
67
77
  ```html
68
78
  <!-- スタイルのインポート -->
69
79
  <link rel="stylesheet" href="https://esm.sh/ds-markdown/dist/style.css" />
80
+ <link rel="stylesheet" href="https://esm.sh/ds-markdown/dist/katex.css" />
70
81
 
71
82
  <!-- コンポーネントのインポート -->
72
- <script type="importmap">
73
- {
74
- "imports": {
75
- "react": "https://esm.sh/react@19.1.0",
76
- "react-dom/client": "https://esm.sh/react-dom@19.1.0/client",
77
- "ds-markdown": "https://esm.sh/ds-markdown"
78
- }
79
- }
80
- </script>
81
- <script type="module" src="https://esm.sh/tsx"></script>
82
-
83
- <script type="text/babel">
84
- import { createRoot } from 'react-dom/client';
85
- import DsMarkdown from 'ds-markdown';
86
-
87
- const markdown = `
88
- # Hello ds-markdown
89
-
90
- これは**高性能**なタイピングアニメーションコンポーネントです!
91
-
92
- ## 特徴
93
- - ⚡ 遅延ゼロのストリーミング
94
- - 🎬 スムーズなタイピングアニメーション
95
- - 🎯 完璧なシンタックスサポート
96
- `;
97
-
98
- const root = createRoot(document.getElementById('root'));
99
- root.render(<DsMarkdown interval={20}>{markdown}</DsMarkdown>);
83
+ <script type="module">
84
+ import Markdown from 'https://esm.sh/ds-markdown';
100
85
  </script>
101
86
  ```
102
87
 
@@ -104,6 +89,8 @@ pnpm add ds-markdown
104
89
 
105
90
  ### 基本的な使用法
106
91
 
92
+ [DEMO](https://stackblitz.com/edit/vitejs-vite-z94syu8j?file=src%2FApp.tsx)
93
+
107
94
  ```tsx
108
95
  import DsMarkdown from 'ds-markdown';
109
96
  import 'ds-markdown/style.css';
@@ -117,6 +104,23 @@ function App() {
117
104
  }
118
105
  ```
119
106
 
107
+ ### 数式サポート
108
+
109
+ ```tsx
110
+ import DsMarkdown from 'ds-markdown';
111
+ import 'ds-markdown/style.css';
112
+ import 'ds-markdown/katex.css'; // 数式スタイルのインポート
113
+
114
+ function MathDemo() {
115
+ return (
116
+ <DsMarkdown interval={20} answerType="answer" math={{ isOpen: true, splitSymbol: 'dollar' }}>
117
+ # ピタゴラスの定理 直角三角形では、斜辺の二乗は二つの直角辺の二乗の和に等しい: $a^2 + b^2 = c^2$ ここで: - $a$ と $b$ は直角辺 - $c$ は斜辺 古典的な「3-4-5」三角形の場合: $c = \sqrt
118
+ {3 ^ (2 + 4) ^ 2} = \sqrt{25} = 5$
119
+ </DsMarkdown>
120
+ );
121
+ }
122
+ ```
123
+
120
124
  ### AI 会話シナリオ
121
125
 
122
126
  ```tsx
@@ -173,21 +177,24 @@ React 19 は多くのエキサイティングな新機能をもたらします
173
177
  | `timerType` | `'setTimeout'` \| `'requestAnimationFrame'` | タイマータイプ | 現在のデフォルトは`setTimeout`、後で`requestAnimationFrame`に変更予定 |
174
178
  | `answerType` | `'thinking'` \| `'answer'` | コンテンツタイプ | `'answer'` |
175
179
  | `theme` | `'light'` \| `'dark'` | テーマタイプ | `'light'` |
180
+ | `math` | `IMarkdownMath` | 数式設定 | `{ isOpen: false, splitSymbol: 'dollar' }` |
176
181
  | `onEnd` | `(data: EndData) => void` | タイピング完了コールバック | - |
177
182
  | `onStart` | `(data: StartData) => void` | タイピング開始コールバック | - |
178
183
  | `onTypedChar` | `(data: CharData) => void` | 文字ごとのタイピングコールバック | - |
179
184
 
180
- ### 命令的 API(ストリーミングシナリオにおすすめ)
185
+ ### 数式設定
181
186
 
182
- ```typescript
183
- import { MarkdownCMD, MarkdownCMDRef } from 'ds-markdown';
187
+ | プロパティ | 型 | 説明 | デフォルト |
188
+ | ------------- | ------------------------- | ---------------------------- | ---------- |
189
+ | `isOpen` | `boolean` | 数式レンダリングを有効にする | `false` |
190
+ | `splitSymbol` | `'dollar'` \| `'bracket'` | 数式区切り文字タイプ | `'dollar'` |
184
191
 
185
- interface MarkdownCMDRef {
186
- push: (content: string, answerType: AnswerType) => void;
187
- clear: () => void;
188
- triggerWholeEnd: () => void;
189
- }
190
- ```
192
+ **区切り文字の説明:**
193
+
194
+ - `'dollar'`:`$...$` `$$...$$` 構文を使用
195
+ - `'bracket'`:`\(...\)` `\[...\]` 構文を使用
196
+
197
+ ### 命令的 API(ストリーミングシナリオにおすすめ)
191
198
 
192
199
  | メソッド | パラメータ | 説明 |
193
200
  | ----------------- | ------------------------------------------- | ------------------------------------ |
@@ -206,50 +213,115 @@ markdownRef.current?.resume(); // アニメーションを再開
206
213
 
207
214
  ---
208
215
 
209
- ## 🎛️ タイマーモード詳細説明
216
+ ## 🧮 数式使用ガイド
217
+
218
+ ### 基本構文
219
+
220
+ ```tsx
221
+ // 1. 数式サポートを有効にする
222
+ <DsMarkdown math={{ isOpen: true }}>
223
+ # 数式の例
224
+
225
+ // インライン数式
226
+ これはインライン数式です:$E = mc^2$
227
+
228
+ // ブロック数式
229
+ $$\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}$$
230
+ </DsMarkdown>
231
+ ```
232
+
233
+ ### 区切り文字の選択
234
+
235
+ ```tsx
236
+ // ドル記号区切り文字を使用(デフォルト)
237
+ <DsMarkdown math={{ isOpen: true, splitSymbol: 'dollar' }}>
238
+ インライン:$a + b = c$
239
+ ブロック:$$\sum_{i=1}^{n} x_i = x_1 + x_2 + \cdots + x_n$$
240
+ </DsMarkdown>
241
+
242
+ // 括弧区切り文字を使用
243
+ <DsMarkdown math={{ isOpen: true, splitSymbol: 'bracket' }}>
244
+ インライン:\(a + b = c\)
245
+ ブロック:\[\sum_{i=1}^{n} x_i = x_1 + x_2 + \cdots + x_n\]
246
+ </DsMarkdown>
247
+ ```
248
+
249
+ ### ストリーミング数式
250
+
251
+ ```tsx
252
+ // ストリーミング出力での数式の完璧なサポート
253
+ const mathContent = ['ピタゴラスの定理:', '$a^2 + b^2 = c^2$', '\n\n', 'ここで:', '- $a$ と $b$ は直角辺', '- $c$ は斜辺'];
254
+
255
+ mathContent.forEach((chunk) => {
256
+ markdownRef.current?.push(chunk, 'answer');
257
+ });
258
+ ```
259
+
260
+ ### スタイルカスタマイズ
261
+
262
+ ```css
263
+ /* 数式スタイルのカスタマイズ */
264
+ .katex {
265
+ font-size: 1.1em;
266
+ }
267
+
268
+ .katex-display {
269
+ margin: 1em 0;
270
+ text-align: center;
271
+ }
272
+
273
+ /* ダークテーマ適応 */
274
+ [data-theme='dark'] .katex {
275
+ color: #e1e1e1;
276
+ }
277
+ ```
278
+
279
+ ---
280
+
281
+ ## 🎛️ タイマーモード詳細
210
282
 
211
283
  ### `requestAnimationFrame` モード 🌟(推奨)
212
284
 
213
285
  ```typescript
214
286
  // 🎯 特徴
215
287
  - 時間駆動:実際の経過時間に基づいて文字数を計算
216
- - バッチ処理:単一フレーム内で複数文字を処理可能
217
- - フレーム同期:ブラウザ 60fps リフレッシュレートと同期
218
- - 高頻度最適化:interval < 16ms の高速タイピングを完璧サポート
288
+ - バッチ処理:1フレーム内で複数の文字を処理可能
289
+ - フレーム同期:ブラウザの60fpsリフレッシュレートと同期
290
+ - 高頻度最適化:interval < 16msの高速タイピングを完璧にサポート
219
291
 
220
292
  // 🎯 適用シナリオ
221
- - 現代 Web アプリケーションのデフォルト選択
293
+ - モダンWebアプリケーションのデフォルト選択
222
294
  - 滑らかなアニメーション効果を追求
223
- - 高頻度タイピング(interval > 0 で十分)
224
- - AI リアルタイム会話シナリオ
295
+ - 高頻度タイピング(interval > 0で十分)
296
+ - AIリアルタイム会話シナリオ
225
297
  ```
226
298
 
227
299
  ### `setTimeout` モード 📟(互換性)
228
300
 
229
301
  ```typescript
230
302
  // 🎯 特徴
231
- - 単一文字:一度に正確に一文字を処理
232
- - 固定間隔:設定時間に従って厳密に実行
233
- - リズム感:クラシックタイプライターのリズム
234
- - 精密制御:特定のタイミング要件に適用
303
+ - 単一文字:毎回正確に1文字を処理
304
+ - 固定間隔:設定された時間に厳密に実行
305
+ - ビート感:クラシックタイプライターのリズム感
306
+ - 精密制御:特定のタイミング要件に適している
235
307
 
236
308
  // 🎯 適用シナリオ
237
- - 精密時間制御が必要
238
- - レトロタイプライター効果の作成
309
+ - 精密な時間制御が必要
310
+ - レトロタイプライター効果を演出
239
311
  - 互換性要件の高いシナリオ
240
312
  ```
241
313
 
242
314
  ### 📊 パフォーマンス比較
243
315
 
244
- | 機能 | requestAnimationFrame | setTimeout |
245
- | -------------------------------- | ------------------------------------- | --------------------- |
246
- | **文字処理** | フレームあたり複数文字を処理可能 | 一度に一文字を処理 |
247
- | **高頻度間隔** | ✅ 優秀(5ms → フレームあたり3文字) | ❌ ラグの可能性 |
248
- | **低頻度間隔** | ✅ 通常(100ms → 6フレーム後に1文字) | ✅ 精密 |
249
- | **視覚効果** | 🎬 滑らかなアニメーション感 | ⚡ 精密なリズム感 |
250
- | **パフォーマンスオーバーヘッド** | 🟢 低(フレーム同期) | 🟡 中程度(タイマー) |
316
+ | 特徴 | requestAnimationFrame | setTimeout |
317
+ | -------------------------------- | ----------------------------------- | ----------------- |
318
+ | **文字処理** | 1フレームで複数文字を処理可能 | 毎回1文字を処理 |
319
+ | **高頻度間隔** | ✅ 優秀(5ms → 1フレーム3文字) | ❌ ラグの可能性 |
320
+ | **低頻度間隔** | ✅ 正常(100ms → 6フレーム後1文字) | ✅ 精密 |
321
+ | **視覚効果** | 🎬 滑らかなアニメーション感 | ⚡ 精密なビート感 |
322
+ | **パフォーマンスオーバーヘッド** | 🟢 低(フレーム同期) | 🟡 中(タイマー) |
251
323
 
252
- 高頻度では `requestAnimationFrame`、低頻度では `setTimeout` を推奨
324
+ 高頻度は`requestAnimationFrame`、低頻度は`setTimeout`を推奨
253
325
 
254
326
  ---
255
327
 
@@ -257,6 +329,8 @@ markdownRef.current?.resume(); // アニメーションを再開
257
329
 
258
330
  ### 📝 AI ストリーミング会話
259
331
 
332
+ [DEMO: 🔧 StackBlitz 体験](https://stackblitz.com/edit/vitejs-vite-2ri8kex3?file=src%2FApp.tsx)
333
+
260
334
  ````tsx
261
335
  import { useRef } from 'react';
262
336
  import { MarkdownCMD, MarkdownCMDRef } from 'ds-markdown';
@@ -271,18 +345,18 @@ function StreamingChat() {
271
345
  // 思考段階
272
346
  markdownRef.current?.push('🤔 あなたの質問を分析しています...', 'thinking');
273
347
  await delay(1000);
274
- markdownRef.current?.push('\n\n✅ 分析完了、回答を開始します', 'thinking');
348
+ markdownRef.current?.push('\n\n✅ 分析完了、回答を開始', 'thinking');
275
349
 
276
350
  // ストリーミング回答
277
351
  const chunks = [
278
- '# React 19 新機能分析\n\n',
352
+ '# React 19 新機能解析\n\n',
279
353
  '## 🚀 React Compiler\n',
280
- 'React 19 の最大のハイライトは **React Compiler** の導入です:\n\n',
281
- '- 🎯 **自動最適化**:手動の memo useMemo が不要\n',
282
- '- ⚡ **パフォーマンス向上**:コンパイル時最適化、ランタイムオーバーヘッドゼロ\n',
283
- '- 🔧 **後方互換**:既存コードの修正不要\n\n',
284
- '## 📝 Actions がフォームを簡素化\n',
285
- '新しい Actions API により、フォーム処理がより簡単になります:\n\n',
354
+ 'React 19 の最大のハイライトは**React Compiler**の導入です:\n\n',
355
+ '- 🎯 **自動最適化**:手動のmemoとuseMemoが不要\n',
356
+ '- ⚡ **パフォーマンス向上**:コンパイル時最適化、実行時ゼロオーバーヘッド\n',
357
+ '- 🔧 **後方互換性**:既存コードの修正不要\n\n',
358
+ '## 📝 Actions フォーム簡素化\n',
359
+ '新しいActions APIによりフォーム処理がより簡単になります:\n\n',
286
360
  '```tsx\n',
287
361
  'function ContactForm({ action }) {\n',
288
362
  ' const [state, formAction] = useActionState(action, null);\n',
@@ -294,7 +368,7 @@ function StreamingChat() {
294
368
  ' );\n',
295
369
  '}\n',
296
370
  '```\n\n',
297
- 'この回答がお役に立てれば幸いです!🎉',
371
+ 'この回答がお役に立てば幸いです!🎉',
298
372
  ];
299
373
 
300
374
  for (const chunk of chunks) {
@@ -305,7 +379,7 @@ function StreamingChat() {
305
379
 
306
380
  return (
307
381
  <div className="chat-container">
308
- <button onClick={simulateAIResponse}>🤖 React 19 機能について質問</button>
382
+ <button onClick={simulateAIResponse}>🤖 React 19 新機能について質問</button>
309
383
 
310
384
  <MarkdownCMD ref={markdownRef} interval={10} timerType="requestAnimationFrame" onEnd={(data) => console.log('段落完了:', data)} />
311
385
  </div>
@@ -315,9 +389,46 @@ function StreamingChat() {
315
389
  const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
316
390
  ````
317
391
 
318
- ### 🔄 ストリーミング Markdown 構文処理
392
+ ### 🧮 数式ストリーミングレンダリング
319
393
 
320
- **核心問題**:ストリーミング出力時、不完全な Markdown 構文がレンダリングエラーを引き起こす可能性
394
+ ```tsx
395
+ function MathStreamingDemo() {
396
+ const markdownRef = useRef<MarkdownCMDRef>(null);
397
+
398
+ const simulateMathResponse = async () => {
399
+ markdownRef.current?.clear();
400
+
401
+ const mathChunks = [
402
+ '# ピタゴラスの定理の説明\n\n',
403
+ '直角三角形では、斜辺の二乗は二つの直角辺の二乗の和に等しい:\n\n',
404
+ '$a^2 + b^2 = c^2$\n\n',
405
+ 'ここで:\n',
406
+ '- $a$ と $b$ は直角辺\n',
407
+ '- $c$ は斜辺\n\n',
408
+ '古典的な「3-4-5」三角形の場合:\n',
409
+ '$c = \\sqrt{3^2 + 4^2} = \\sqrt{25} = 5$\n\n',
410
+ 'この定理は幾何学で広く応用されています!',
411
+ ];
412
+
413
+ for (const chunk of mathChunks) {
414
+ await delay(150);
415
+ markdownRef.current?.push(chunk, 'answer');
416
+ }
417
+ };
418
+
419
+ return (
420
+ <div>
421
+ <button onClick={simulateMathResponse}>📐 ピタゴラスの定理を説明</button>
422
+
423
+ <MarkdownCMD ref={markdownRef} interval={20} timerType="requestAnimationFrame" math={{ isOpen: true, splitSymbol: 'dollar' }} />
424
+ </div>
425
+ );
426
+ }
427
+ ```
428
+
429
+ ### 🔄 ストリーミングMarkdown構文処理
430
+
431
+ **核心問題**:ストリーミング出力時に不完全なMarkdown構文がレンダリングエラーを引き起こす
321
432
 
322
433
  ```tsx
323
434
  // 🚨 問題シナリオ
@@ -325,47 +436,50 @@ push('#'); // "# "
325
436
  push(' '); // "# "
326
437
  push('タイトル'); // "# タイトル"
327
438
  push('\n'); // "# タイトル\n"
328
- push('1'); // "# タイトル\n1" ← これは段落として誤解釈される
439
+ push('1'); // "# タイトル\n1" ← ここで段落として誤解析される
329
440
  push('.'); // "# タイトル\n1." ← 正しいリストを形成
330
441
  push(' 項目'); // "# タイトル\n1. 項目"
331
442
  ```
332
443
 
333
- **✅ スマートソリューション**:コンポーネント内蔵同期バッファリングメカニズム
444
+ **✅ スマート解決策**:内蔵同期バッファリングメカニズム
334
445
 
335
446
  ```tsx
336
- // コンポーネントが構文境界を知的に処理
447
+ // コンポーネントが構文境界をインテリジェントに処理
337
448
  const handleStreamingMarkdown = () => {
338
449
  const chunks = ['#', ' ', '使用', 'スキル', '\n', '1', '.', ' ', 'スキル1', '\n', '2', '.', ' スキル2'];
339
450
 
340
451
  chunks.forEach((chunk) => {
341
452
  markdownRef.current?.push(chunk, 'answer');
342
- // 遅延不要、コンポーネント内部で知的バッファリング
453
+ // 遅延不要、コンポーネントが内部でインテリジェントにバッファリング
343
454
  });
344
455
  };
345
456
 
346
- // 🧠 スマート処理フロー:
347
- // 1. "# 使用スキル\n1" 構文不完全をリアルタイム検出
348
- // 2. スマートバッファリング、より多くの文字を待機
349
- // 3. "." を受信して "1." を形成後、即座に処理
350
- // 4. ゼロ遅延、純粋同期処理
457
+ // 🧠 インテリジェント処理フロー:
458
+ // 1. "# 使用スキル\n1" のような不完全な構文をリアルタイム検出
459
+ // 2. インテリジェントバッファリング、より多くの文字を待機
460
+ // 3. "." を受信して "1." を形成した後すぐに処理
461
+ // 4. ゼロ遅延、純粋な同期処理
351
462
  ```
352
463
 
353
464
  **サポートされる構文検出**:
354
465
 
355
466
  ````typescript
356
- // ✅ 完全構文(即座に処理)
357
- '## タイトル'; // 完全タイトル
358
- '1. リスト項目'; // 完全リスト項目
359
- '- 項目'; // 完全無順序リスト
360
- '> 引用コンテンツ'; // 完全引用
467
+ // ✅ 完全な構文(即座に処理)
468
+ '## タイトル'; // 完全なタイトル
469
+ '1. リスト項目'; // 完全なリスト項目
470
+ '- 項目'; // 完全な順序なしリスト
471
+ '> 引用コンテンツ'; // 完全な引用
361
472
  '```javascript'; // コードブロック開始
362
473
  '```'; // コードブロック終了
363
474
  '改行で終わるコンテンツ\n'; // 改行境界
475
+ '$a + b$'; // 完全な数式
476
+ '$$\\sum x$$'; // 完全なブロック数式
364
477
 
365
- // 🔄 不完全構文(スマートバッファリング)
478
+ // 🔄 不完全な構文(インテリジェントバッファリング)
366
479
  '##'; // タイトル記号のみ
367
480
  '1'; // 数字のみ
368
- '```java'; // 可能なコードブロック開始
481
+ '```java'; // 可能性のあるコードブロック開始
482
+ '$a +'; // 不完全な数式
369
483
  ````
370
484
 
371
485
  ---
@@ -378,37 +492,52 @@ const handleStreamingMarkdown = () => {
378
492
  // ✅ 推奨設定
379
493
  <DsMarkdown
380
494
  timerType="requestAnimationFrame"
381
- interval={15} // 15-30ms が最適体験
495
+ interval={15} // 15-30msが最適な体験
382
496
  />
383
497
 
384
- // ❌ 過小間隔を避ける
498
+ // ❌ 小さすぎる間隔を避ける
385
499
  <DsMarkdown interval={1} /> // パフォーマンス問題を引き起こす可能性
386
500
  ```
387
501
 
388
502
  ### 2. ストリーミングデータ処理
389
503
 
390
504
  ```tsx
391
- // ✅ 推奨:命令的 API
505
+ // ✅ 推奨:命令的API
392
506
  const ref = useRef<MarkdownCMDRef>(null);
393
507
  useEffect(() => {
394
508
  ref.current?.push(newChunk, 'answer');
395
509
  }, [newChunk]);
396
510
 
397
- // ❌ 避ける:頻繁な children 更新
511
+ // ❌ 避ける:頻繁なchildren更新
398
512
  const [content, setContent] = useState('');
399
- // 各更新で全体コンテンツを再解析
513
+ // 毎回の更新でコンテンツ全体を再解析
514
+ ```
515
+
516
+ ### 3. 数式最適化
517
+
518
+ ```tsx
519
+ // ✅ 推奨:数式スタイルを必要に応じて読み込み
520
+ import 'ds-markdown/style.css';
521
+ import 'ds-markdown/katex.css'; // 必要な時のみインポート
522
+
523
+ // ✅ 推奨:区切り文字の合理的な使用
524
+ // シンプルな数式には $...$ で簡潔さを
525
+ // 複雑な数式には $$...$$ で明確さを
526
+
527
+ // ❌ 避ける:不要な時に数式を有効にする
528
+ <DsMarkdown math={{ isOpen: true }}>プレーンテキストコンテンツ</DsMarkdown>;
400
529
  ```
401
530
 
402
- ### 3. 型安全
531
+ ### 4. 型安全性
403
532
 
404
533
  ```tsx
405
534
  import { MarkdownCMDRef } from 'ds-markdown';
406
535
 
407
536
  const ref = useRef<MarkdownCMDRef>(null);
408
- // 完全な TypeScript 型ヒント
537
+ // 完全なTypeScript型ヒント
409
538
  ```
410
539
 
411
- ### 4. スタイルカスタマイズ
540
+ ### 5. スタイルカスタマイズ
412
541
 
413
542
  ```css
414
543
  /* 思考エリアスタイル */
@@ -448,18 +577,33 @@ const ref = useRef<MarkdownCMDRef>(null);
448
577
  padding: 8px 12px;
449
578
  text-align: left;
450
579
  }
580
+
581
+ /* 数式スタイル */
582
+ .katex {
583
+ font-size: 1.1em;
584
+ }
585
+
586
+ .katex-display {
587
+ margin: 1em 0;
588
+ text-align: center;
589
+ }
590
+
591
+ /* ダークテーマ数式 */
592
+ [data-theme='dark'] .katex {
593
+ color: #e1e1e1;
594
+ }
451
595
  ```
452
596
 
453
597
  ---
454
598
 
455
599
  ## 🌐 互換性
456
600
 
457
- | 環境 | バージョン要件 | 説明 |
458
- | -------------- | ----------------------------------- | ---------------------- |
459
- | **React** | 16.8.0+ | Hooks サポートが必要 |
460
- | **TypeScript** | 4.0+ | オプション、ただし推奨 |
461
- | **ブラウザ** | Chrome 60+, Firefox 55+, Safari 12+ | モダンブラウザ |
462
- | **Node.js** | 14.0+ | ビルド環境 |
601
+ | 環境 | バージョン要件 | 説明 |
602
+ | -------------- | ----------------------------------- | ------------------- |
603
+ | **React** | 16.8.0+ | Hooksサポートが必要 |
604
+ | **TypeScript** | 4.0+ | オプションだが推奨 |
605
+ | **ブラウザ** | Chrome 60+, Firefox 55+, Safari 12+ | モダンブラウザ |
606
+ | **Node.js** | 14.0+ | ビルド環境 |
463
607
 
464
608
  ---
465
609
 
@@ -467,7 +611,7 @@ const ref = useRef<MarkdownCMDRef>(null);
467
611
 
468
612
  Issue と Pull Request の提出を歓迎します!
469
613
 
470
- 1. このリポジトリをフォーク
614
+ 1. このリポジトリをFork
471
615
  2. 機能ブランチを作成:`git checkout -b feature/amazing-feature`
472
616
  3. 変更をコミット:`git commit -m 'Add amazing feature'`
473
617
  4. ブランチをプッシュ:`git push origin feature/amazing-feature`
@@ -482,11 +626,11 @@ MIT © [onshinpei](https://github.com/onshinpei)
482
626
  ---
483
627
 
484
628
  <div align="center">
485
- <strong>このプロジェクトがお役に立てば、⭐️ Star でサポートしてください!</strong>
629
+ <strong>このプロジェクトがお役に立てば、⭐️ Star をお願いします!</strong>
486
630
 
487
631
  <br><br>
488
632
 
489
633
  [🐛 問題報告](https://github.com/onshinpei/ds-markdown/issues) |
490
634
  [💡 機能提案](https://github.com/onshinpei/ds-markdown/issues) |
491
- [📖 ドキュメント参照](https://onshinpei.github.io/ds-markdown/)
635
+ [📖 ドキュメント閲覧](https://onshinpei.github.io/ds-markdown/)
492
636
  </div>
package/README.ko.md CHANGED
@@ -45,6 +45,13 @@
45
45
  - **명령형 API**: 스트리밍 데이터에 적합, 더 나은 성능
46
46
  - **네이티브 TypeScript 지원**: 완전한 타입 힌트
47
47
 
48
+ ### 🧮 **수식 지원**
49
+
50
+ - **KaTeX 통합**: 고성능 수식 렌더링
51
+ - **이중 구문 지원**: `$...$` 및 `\[...\]` 구분자
52
+ - **스트리밍 호환**: 타이핑 애니메이션에서 수식의 완벽한 지원
53
+ - **테마 적응**: 라이트/다크 테마에 자동 적응
54
+
48
55
  ---
49
56
 
50
57
  ## 📦 빠른 설치