takumi-markdown 1.0.3 → 1.1.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.
@@ -1,40 +1,72 @@
1
1
  /**
2
- * Takumi Markdown - Library CSS
3
- * Include this in your project: import 'takumi-markdown/styles.css'
2
+ * Takumi Markdown - Japanese Typography Optimized CSS
3
+ * 日本語Webタイポグラフィの決定版
4
4
  */
5
5
 
6
- /* === Typography Variables === */
7
- @import url('https://fonts.googleapis.com/css2?family=BIZ+UDGothic:wght@400;700&family=BIZ+UDPGothic:wght@400;700&family=Manrope:wght@400;500;600&family=Fira+Code:wght@400;500&display=swap');
6
+ /* === Web Fonts === */
7
+ @import url('https://fonts.googleapis.com/css2?family=BIZ+UDGothic:wght@400;700&family=BIZ+UDPGothic:wght@400;700&family=Manrope:wght@400;500;600;700&family=Fira+Code:wght@400;500&display=swap');
8
8
 
9
+ /* === Typography Variables === */
9
10
  :root {
10
- /* Typography */
11
- --font-sans: 'Manrope', 'BIZ UDPGothic', 'Hiragino Sans', 'Hiragino Kaku Gothic ProN', 'Yu Gothic Medium', 'Yu Gothic', sans-serif;
12
- --font-mono: 'Fira Code', 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
13
-
14
- --text-base: 16px;
15
- --line-height-base: 1.65;
16
- --line-height-heading: 1.25;
17
-
18
- /* Colors - High Contrast "Crisp" Theme */
11
+ /* Vertical Rhythm Base Unit */
12
+ --rhythm: 1.75rem;
13
+
14
+ /* Fluid Typography */
15
+ --text-base: clamp(15px, 1vw + 12px, 18px);
16
+
17
+ /*
18
+ * 行長(Line Length)
19
+ * 日本語の最適行長: 25-40文字(35文字前後が理想)
20
+ * 日本語は1文字≈1emなので、em単位で指定
21
+ * 35em = 35文字 × フォントサイズ
22
+ * ※ ch単位は欧文"0"幅基準のため日本語には不適切
23
+ */
24
+ --max-width: clamp(320px, 90vw, 38em);
25
+
26
+ /*
27
+ * Font Stacks
28
+ * Manrope(欧文専用フォント)→ 日本語グリフを持たないため、
29
+ * 日本語文字は自動的に BIZ UDPGothic にフォールバックされる
30
+ */
31
+ --font-sans: 'Manrope', 'BIZ UDPGothic', 'Hiragino Sans', 'Hiragino Kaku Gothic ProN', 'Yu Gothic Medium', 'Yu Gothic', system-ui, sans-serif;
32
+ --font-mono: 'Fira Code', 'BIZ UDGothic', 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
33
+
34
+ /* Line Heights */
35
+ --line-height-base: 1.8;
36
+ --line-height-heading: 1.3;
37
+
38
+ /* Colors - High Contrast Theme */
19
39
  --c-bg: #ffffff;
20
40
  --c-text: #1a1a1a;
21
41
  --c-text-muted: #595959;
42
+ --c-text-heading: #0d0d0d;
22
43
  --c-accent: #0969da;
44
+ --c-accent-hover: #0550ae;
23
45
  --c-border: #e1e4e8;
46
+ --c-border-heavy: #c9ccd1;
24
47
  --c-code-bg: #f6f8fa;
48
+ --c-blockquote-bg: #fafbfc;
49
+ --c-blockquote-border: #dfe2e5;
25
50
 
26
- /* Layout */
27
- --max-width: 700px;
51
+ /* Spacing */
28
52
  --spacing-unit: 8px;
29
53
  --radius-sm: 4px;
30
54
  --radius-md: 8px;
55
+
56
+ /* Heading Scale (Major Third) */
57
+ --scale-h1: 2.441em;
58
+ --scale-h2: 1.953em;
59
+ --scale-h3: 1.563em;
60
+ --scale-h4: 1.25em;
61
+ --scale-h5: 1em;
62
+ --scale-h6: 0.875em;
31
63
  }
32
64
 
33
65
  /* === Frontmatter Block === */
34
66
  .frontmatter-block {
35
- margin-bottom: 1.5em;
67
+ margin-bottom: var(--rhythm);
36
68
  border: 1px solid var(--c-border);
37
- border-radius: var(--radius-md, 4px);
69
+ border-radius: var(--radius-md);
38
70
  background-color: var(--c-code-bg);
39
71
  }
40
72
 
@@ -59,120 +91,273 @@
59
91
 
60
92
  .markdown-body ruby rt {
61
93
  font-size: 0.5em;
62
- color: var(--c-text-muted, #666);
94
+ color: var(--c-text-muted);
63
95
  font-weight: 400;
64
96
  }
65
97
 
66
- /* === Main Typography === */
98
+ /* === Main Typography Container === */
67
99
  .markdown-body {
68
100
  width: 100%;
69
101
  max-width: var(--max-width);
70
102
  margin: 0 auto;
71
- padding: 0 var(--spacing-unit);
103
+ padding: 0 calc(var(--spacing-unit) * 2);
104
+
105
+ /* Base Typography */
72
106
  color: var(--c-text);
73
107
  font-family: var(--font-sans);
74
- font-feature-settings: "palt";
108
+ font-size: var(--text-base);
109
+ line-height: var(--line-height-base);
110
+
111
+ /* Japanese Typography Optimization */
112
+ font-feature-settings: "palt", "halt"; /* 約物半角 */
75
113
  font-kerning: normal;
76
114
  text-rendering: optimizeLegibility;
77
115
  -webkit-font-smoothing: antialiased;
78
- font-weight: 400;
79
- -webkit-text-stroke-width: 0.15px;
80
- -webkit-text-stroke-color: #000000;
81
- color: #000000;
116
+ -moz-osx-font-smoothing: grayscale;
117
+
118
+ /* 和欧間スペース(Chrome 120+対応) */
119
+ text-autospace: ideograph-alpha ideograph-numeric;
120
+
121
+ /* 句読点ぶら下げ */
122
+ hanging-punctuation: first allow-end;
123
+
124
+ /* 禁則処理 */
125
+ word-break: normal;
126
+ overflow-wrap: anywhere;
127
+ line-break: strict;
128
+
129
+ /* Letter Spacing */
82
130
  letter-spacing: 0.02em;
83
131
  }
84
132
 
85
- /* Headings */
133
+ /* === First Element Reset === */
134
+ .markdown-body > *:first-child {
135
+ margin-top: 0 !important;
136
+ }
137
+
138
+ .markdown-body > *:last-child {
139
+ margin-bottom: 0 !important;
140
+ }
141
+
142
+ /* === Headings === */
86
143
  .markdown-body h1,
87
144
  .markdown-body h2,
88
145
  .markdown-body h3,
89
146
  .markdown-body h4,
90
147
  .markdown-body h5,
91
148
  .markdown-body h6 {
92
- margin-top: 2em;
93
- margin-bottom: 1em;
149
+ margin-top: calc(var(--rhythm) * 2);
150
+ margin-bottom: var(--rhythm);
94
151
  font-weight: 700;
95
152
  line-height: var(--line-height-heading);
96
- letter-spacing: 0.02em;
153
+ letter-spacing: 0.01em;
154
+ color: var(--c-text-heading);
97
155
  }
98
156
 
157
+ /* H1: 特別な存在感 */
99
158
  .markdown-body h1 {
100
- font-size: 2.25em;
101
- border-bottom: 1px solid var(--c-border);
102
- padding-bottom: 0.3em;
159
+ font-size: var(--scale-h1);
160
+ padding-bottom: 0.4em;
161
+ border-bottom: 2px solid var(--c-text-heading);
162
+ margin-top: 0;
103
163
  }
104
164
 
165
+ /* H2: セクション区切り */
105
166
  .markdown-body h2 {
106
- font-size: 1.75em;
107
- border-bottom: 1px solid var(--c-border);
167
+ font-size: var(--scale-h2);
108
168
  padding-bottom: 0.3em;
169
+ border-bottom: 1px solid var(--c-border-heavy);
109
170
  }
110
171
 
172
+ /* H3: サブセクション */
111
173
  .markdown-body h3 {
112
- font-size: 1.5em;
174
+ font-size: var(--scale-h3);
175
+ color: var(--c-text);
113
176
  }
114
177
 
178
+ /* H4: 強調見出し */
115
179
  .markdown-body h4 {
116
- font-size: 1.25em;
180
+ font-size: var(--scale-h4);
181
+ font-weight: 600;
182
+ color: var(--c-text);
183
+ }
184
+
185
+ /* H5, H6: 軽量見出し */
186
+ .markdown-body h5 {
187
+ font-size: var(--scale-h5);
188
+ font-weight: 600;
189
+ color: var(--c-text-muted);
190
+ text-transform: uppercase;
191
+ letter-spacing: 0.05em;
192
+ }
193
+
194
+ .markdown-body h6 {
195
+ font-size: var(--scale-h6);
196
+ font-weight: 600;
197
+ color: var(--c-text-muted);
198
+ text-transform: uppercase;
199
+ letter-spacing: 0.05em;
117
200
  }
118
201
 
119
- /* Text */
202
+ /* === Paragraphs === */
120
203
  .markdown-body p {
121
204
  margin-top: 0;
122
- margin-bottom: 1.5em;
205
+ margin-bottom: var(--rhythm);
123
206
  text-align: justify;
207
+ text-justify: inter-ideograph;
124
208
  }
125
209
 
126
- .markdown-body>*:first-child {
127
- margin-top: 0 !important;
128
- }
210
+ /* 行長はコンテナの --max-width (38em) で制御 */
129
211
 
130
- /* Blockquotes */
212
+ /* === Blockquotes === */
131
213
  .markdown-body blockquote {
132
- margin: 1.5em 0;
133
- padding: 0.5em 1em;
214
+ position: relative;
215
+ margin: var(--rhythm) 0;
216
+ padding: calc(var(--rhythm) * 0.75) 1.5em;
134
217
  color: var(--c-text-muted);
135
- border-left: 0.25em solid var(--c-border);
136
- background-color: transparent;
218
+ background-color: var(--c-blockquote-bg);
219
+ border-left: 4px solid var(--c-blockquote-border);
220
+ border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
221
+ font-style: italic;
222
+ }
223
+
224
+ /* 装飾的引用符 */
225
+ .markdown-body blockquote::before {
226
+ content: '\201C'; /* " */
227
+ position: absolute;
228
+ top: -0.2em;
229
+ left: 0.3em;
230
+ font-size: 3em;
231
+ color: var(--c-border);
232
+ font-family: Georgia, serif;
233
+ line-height: 1;
234
+ pointer-events: none;
235
+ }
236
+
237
+ .markdown-body blockquote p {
238
+ text-align: left;
239
+ margin-bottom: calc(var(--rhythm) * 0.5);
137
240
  }
138
241
 
139
242
  .markdown-body blockquote p:last-child {
140
243
  margin-bottom: 0;
141
244
  }
142
245
 
143
- /* Lists */
246
+ /* ネストされた引用 */
247
+ .markdown-body blockquote blockquote {
248
+ margin-top: calc(var(--rhythm) * 0.5);
249
+ margin-bottom: 0;
250
+ border-left-color: var(--c-border);
251
+ }
252
+
253
+ .markdown-body blockquote blockquote::before {
254
+ display: none;
255
+ }
256
+
257
+ /* === Lists === */
144
258
  .markdown-body ul,
145
259
  .markdown-body ol {
146
- padding-left: 2em;
147
- margin-bottom: 1.5em;
260
+ padding-left: 1.5em;
261
+ margin-top: 0;
262
+ margin-bottom: var(--rhythm);
263
+ }
264
+
265
+ /* Unordered List: カスタムマーカー */
266
+ .markdown-body ul {
267
+ list-style: none;
268
+ }
269
+
270
+ .markdown-body ul > li {
271
+ position: relative;
272
+ }
273
+
274
+ .markdown-body ul > li::before {
275
+ content: '\2022'; /* • */
276
+ position: absolute;
277
+ left: -1.2em;
278
+ color: var(--c-text-muted);
279
+ font-weight: 700;
280
+ }
281
+
282
+ /* ネストレベルごとのマーカー変化 */
283
+ .markdown-body ul ul > li::before {
284
+ content: '\25E6'; /* ◦ */
285
+ }
286
+
287
+ .markdown-body ul ul ul > li::before {
288
+ content: '\25AA'; /* ▪ */
289
+ }
290
+
291
+ /* Ordered List: スタイリング */
292
+ .markdown-body ol {
293
+ list-style: none;
294
+ counter-reset: ol-counter;
148
295
  }
149
296
 
297
+ .markdown-body ol > li {
298
+ position: relative;
299
+ counter-increment: ol-counter;
300
+ }
301
+
302
+ .markdown-body ol > li::before {
303
+ content: counter(ol-counter) '.';
304
+ position: absolute;
305
+ left: -1.8em;
306
+ width: 1.5em;
307
+ text-align: right;
308
+ color: var(--c-accent);
309
+ font-weight: 600;
310
+ font-variant-numeric: tabular-nums;
311
+ }
312
+
313
+ /* List Item Spacing */
150
314
  .markdown-body li {
151
- margin-bottom: 0.5em;
315
+ margin-bottom: calc(var(--rhythm) * 0.35);
316
+ }
317
+
318
+ .markdown-body li > p {
319
+ margin-bottom: calc(var(--rhythm) * 0.35);
152
320
  }
153
321
 
154
- .markdown-body li>p {
155
- margin-bottom: 0.5em;
322
+ .markdown-body li:last-child {
323
+ margin-bottom: 0;
324
+ }
325
+
326
+ /* Nested Lists */
327
+ .markdown-body ul ul,
328
+ .markdown-body ul ol,
329
+ .markdown-body ol ul,
330
+ .markdown-body ol ol {
331
+ margin-top: calc(var(--rhythm) * 0.35);
332
+ margin-bottom: 0;
156
333
  }
157
334
 
158
- /* Code */
335
+ /* Task Lists */
336
+ .markdown-body input[type="checkbox"] {
337
+ margin-right: 0.5em;
338
+ transform: scale(1.1);
339
+ }
340
+
341
+ /* === Code === */
159
342
  .markdown-body pre {
160
- padding: 1rem;
343
+ padding: 1rem 1.25rem;
161
344
  overflow: auto;
162
- font-size: 0.9em;
163
- line-height: 1.5;
345
+ font-size: 0.875em;
346
+ line-height: 1.6;
164
347
  background-color: var(--c-code-bg);
165
348
  border-radius: var(--radius-md);
166
- margin-bottom: 1.5em;
349
+ margin-bottom: var(--rhythm);
350
+ border: 1px solid var(--c-border);
167
351
  }
168
352
 
169
353
  .markdown-body code {
170
- padding: 0.2em 0.4em;
354
+ padding: 0.15em 0.4em;
171
355
  margin: 0;
172
- font-size: 0.9em;
356
+ font-size: 0.875em;
173
357
  font-family: var(--font-mono);
174
358
  background-color: var(--c-code-bg);
175
359
  border-radius: var(--radius-sm);
360
+ border: 1px solid var(--c-border);
176
361
  }
177
362
 
178
363
  .markdown-body pre code {
@@ -185,7 +370,7 @@
185
370
  border: 0;
186
371
  }
187
372
 
188
- /* Tables */
373
+ /* === Tables === */
189
374
  .markdown-body table {
190
375
  display: block;
191
376
  width: 100%;
@@ -194,7 +379,7 @@
194
379
  overflow: auto;
195
380
  border-spacing: 0;
196
381
  border-collapse: collapse;
197
- margin-bottom: 1.5em;
382
+ margin-bottom: var(--rhythm);
198
383
  }
199
384
 
200
385
  .markdown-body tr {
@@ -208,46 +393,160 @@
208
393
 
209
394
  .markdown-body th,
210
395
  .markdown-body td {
211
- padding: 0.8em 1em;
396
+ padding: 0.65em 1em;
212
397
  border: 1px solid var(--c-border);
213
398
  }
214
399
 
215
400
  .markdown-body th {
216
401
  font-weight: 600;
217
402
  background-color: var(--c-code-bg);
403
+ text-align: left;
218
404
  }
219
405
 
220
- /* Links */
406
+ /* === Links === */
221
407
  .markdown-body a {
222
408
  color: var(--c-accent);
223
409
  text-decoration: none;
410
+ text-underline-offset: 0.15em;
411
+ transition: color 0.15s ease;
224
412
  }
225
413
 
226
414
  .markdown-body a:hover {
415
+ color: var(--c-accent-hover);
227
416
  text-decoration: underline;
228
417
  }
229
418
 
230
- /* Horizontal Rule */
419
+ /* === Horizontal Rule === */
231
420
  .markdown-body hr {
232
- height: 0.25em;
233
- padding: 0;
234
- margin: 2em 0;
235
- background-color: var(--c-border);
421
+ height: 0;
422
+ margin: calc(var(--rhythm) * 1.5) 0;
236
423
  border: 0;
424
+ border-top: 1px solid var(--c-border-heavy);
425
+ }
426
+
427
+ /* === Images === */
428
+ .markdown-body img {
429
+ max-width: 100%;
430
+ height: auto;
431
+ border-radius: var(--radius-sm);
432
+ }
433
+
434
+ /* === Strong & Emphasis === */
435
+ .markdown-body strong {
436
+ font-weight: 700;
437
+ color: var(--c-text-heading);
438
+ }
439
+
440
+ .markdown-body em {
441
+ font-style: italic;
442
+ }
443
+
444
+ /* === Strikethrough === */
445
+ .markdown-body del {
446
+ color: var(--c-text-muted);
447
+ }
448
+
449
+ /* === Definition Lists === */
450
+ .markdown-body dl {
451
+ margin-bottom: var(--rhythm);
452
+ }
453
+
454
+ .markdown-body dt {
455
+ font-weight: 600;
456
+ margin-top: calc(var(--rhythm) * 0.5);
457
+ }
458
+
459
+ .markdown-body dd {
460
+ margin-left: 1.5em;
461
+ margin-bottom: calc(var(--rhythm) * 0.5);
462
+ }
463
+
464
+ /* === Keyboard Input === */
465
+ .markdown-body kbd {
466
+ display: inline-block;
467
+ padding: 0.2em 0.4em;
468
+ font-size: 0.85em;
469
+ font-family: var(--font-mono);
470
+ line-height: 1;
471
+ color: var(--c-text);
472
+ background-color: var(--c-code-bg);
473
+ border: 1px solid var(--c-border-heavy);
474
+ border-radius: var(--radius-sm);
475
+ box-shadow: inset 0 -1px 0 var(--c-border-heavy);
476
+ }
477
+
478
+ /* === Abbreviations === */
479
+ .markdown-body abbr[title] {
480
+ text-decoration: underline dotted;
481
+ cursor: help;
482
+ }
483
+
484
+ /* === Mark (Highlight) === */
485
+ .markdown-body mark {
486
+ padding: 0.1em 0.2em;
487
+ background-color: #fff8c5;
488
+ border-radius: 2px;
489
+ }
490
+
491
+ /* === Responsive Typography === */
492
+ @media (max-width: 600px) {
493
+ .markdown-body {
494
+ padding: 0 calc(var(--spacing-unit) * 1.5);
495
+ }
496
+
497
+ .markdown-body h1 {
498
+ font-size: calc(var(--scale-h1) * 0.85);
499
+ }
500
+
501
+ .markdown-body h2 {
502
+ font-size: calc(var(--scale-h2) * 0.9);
503
+ }
504
+
505
+ .markdown-body h3 {
506
+ font-size: calc(var(--scale-h3) * 0.9);
507
+ }
508
+
509
+ .markdown-body blockquote {
510
+ padding-left: 1em;
511
+ }
512
+
513
+ .markdown-body blockquote::before {
514
+ font-size: 2em;
515
+ }
516
+ }
517
+
518
+ /* === Print Styles === */
519
+ @media print {
520
+ .markdown-body {
521
+ max-width: none;
522
+ font-size: 12pt;
523
+ line-height: 1.5;
524
+ }
525
+
526
+ .markdown-body a {
527
+ color: inherit;
528
+ text-decoration: underline;
529
+ }
530
+
531
+ .markdown-body a[href^="http"]::after {
532
+ content: " (" attr(href) ")";
533
+ font-size: 0.8em;
534
+ color: var(--c-text-muted);
535
+ }
536
+
537
+ .markdown-body pre,
538
+ .markdown-body blockquote {
539
+ page-break-inside: avoid;
540
+ }
541
+
542
+ .markdown-body h1,
543
+ .markdown-body h2,
544
+ .markdown-body h3 {
545
+ page-break-after: avoid;
546
+ }
237
547
  }
238
548
 
239
549
  /* === Syntax Highlighting (highlight.js GitHub theme) === */
240
- /*!
241
- Theme: GitHub
242
- Description: Light theme as seen on github.com
243
- Author: github.com
244
- Maintainer: @Hirse
245
- Updated: 2021-05-15
246
-
247
- Outdated base version: https://github.com/primer/github-syntax-light
248
- Current colors taken from GitHub's CSS
249
- License: BSD-3-Clause
250
- */
251
550
  pre code.hljs {
252
551
  display: block;
253
552
  overflow-x: auto;