@k8o/arte-odyssey 4.0.0 → 4.2.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.
@@ -0,0 +1,449 @@
1
+ # ArteOdyssey コンポーネント一覧
2
+
3
+ ## インポート方法
4
+
5
+ ```tsx
6
+ // スタイルシート(必須)
7
+ import '@k8o/arte-odyssey/styles.css';
8
+
9
+ // プロバイダー(アプリルートで1回)
10
+ import { ArteOdysseyProvider } from '@k8o/arte-odyssey/providers';
11
+
12
+ // 各コンポーネント(個別インポート)
13
+ import { Button } from '@k8o/arte-odyssey/button';
14
+ import { Card } from '@k8o/arte-odyssey/card';
15
+ ```
16
+
17
+ ## レイアウト・ナビゲーション
18
+
19
+ ### Accordion
20
+
21
+ 折りたたみ可能なセクション。
22
+
23
+ ```tsx
24
+ import { Accordion, AccordionItem } from '@k8o/arte-odyssey/accordion';
25
+
26
+ <Accordion>
27
+ <AccordionItem title="セクション1">コンテンツ</AccordionItem>
28
+ </Accordion>;
29
+ ```
30
+
31
+ ### Breadcrumb
32
+
33
+ パンくずリスト。
34
+
35
+ ```tsx
36
+ import { Breadcrumb, BreadcrumbItem } from '@k8o/arte-odyssey/breadcrumb';
37
+
38
+ <Breadcrumb>
39
+ <BreadcrumbItem href="/">ホーム</BreadcrumbItem>
40
+ <BreadcrumbItem href="/products">製品</BreadcrumbItem>
41
+ <BreadcrumbItem>詳細</BreadcrumbItem>
42
+ </Breadcrumb>;
43
+ ```
44
+
45
+ ### Card / InteractiveCard
46
+
47
+ コンテンツをグループ化するカード。
48
+
49
+ ```tsx
50
+ import { Card, InteractiveCard } from '@k8o/arte-odyssey/card';
51
+
52
+ // 静的カード
53
+ <Card title="タイトル" variant="primary" width="full" appearance="shadow">
54
+ <div className="p-6">コンテンツ</div>
55
+ </Card>
56
+
57
+ // クリック可能なカード(hover:scale-[1.02], active:scale-[0.98])
58
+ <InteractiveCard title="記事" appearance="bordered">
59
+ <div className="p-6">コンテンツ</div>
60
+ </InteractiveCard>
61
+ ```
62
+
63
+ Props:
64
+
65
+ - `variant`: `'primary'` | `'secondary'`
66
+ - `title`: string
67
+ - `width`: `'full'` | `'fit'`
68
+ - `appearance`: `'shadow'` | `'bordered'`
69
+
70
+ ### Tabs
71
+
72
+ タブ切り替え。
73
+
74
+ ```tsx
75
+ import { Tabs, TabList, Tab, TabPanel } from '@k8o/arte-odyssey/tabs';
76
+
77
+ <Tabs>
78
+ <TabList>
79
+ <Tab>タブ1</Tab>
80
+ <Tab>タブ2</Tab>
81
+ </TabList>
82
+ <TabPanel>パネル1</TabPanel>
83
+ <TabPanel>パネル2</TabPanel>
84
+ </Tabs>;
85
+ ```
86
+
87
+ ### Separator
88
+
89
+ 区切り線。
90
+
91
+ ```tsx
92
+ import { Separator } from '@k8o/arte-odyssey/separator';
93
+
94
+ <Separator />
95
+ <Separator color="mute" />
96
+ <Separator color="subtle" />
97
+ <Separator orientation="vertical" />
98
+ ```
99
+
100
+ ### ScrollLinked
101
+
102
+ スクロール進捗をプログレスバーで表示。
103
+
104
+ ```tsx
105
+ import { ScrollLinked } from '@k8o/arte-odyssey/scroll-linked';
106
+
107
+ <ScrollLinked />
108
+ <ScrollLinked container={containerRef} />
109
+ ```
110
+
111
+ ## ボタン・リンク
112
+
113
+ ### Button
114
+
115
+ ```tsx
116
+ import { Button } from '@k8o/arte-odyssey/button';
117
+
118
+ <Button
119
+ size="sm" | "md" | "lg"
120
+ color="primary" | "gray"
121
+ variant="contained" | "outlined" | "skeleton"
122
+ fullWidth={false}
123
+ startIcon={<Icon />}
124
+ endIcon={<Icon />}
125
+ disabled={false}
126
+ >
127
+ ボタン
128
+ </Button>
129
+ ```
130
+
131
+ ### IconButton
132
+
133
+ アイコンのみのボタン。`bg` prop でスタイルを制御。
134
+
135
+ ```tsx
136
+ import { IconButton } from '@k8o/arte-odyssey/icon-button';
137
+
138
+ <IconButton label="閉じる" bg="transparent" size="md">
139
+ <XIcon />
140
+ </IconButton>;
141
+ ```
142
+
143
+ Props:
144
+
145
+ - `bg`: `'transparent'` | `'base'` | `'primary'`(デフォルト: `'transparent'`)
146
+ - `size`: `'sm'` | `'md'` | `'lg'`
147
+ - `label`: string(必須、aria-label として使用)
148
+
149
+ ### LinkButton
150
+
151
+ リンクスタイルのボタン。Button と同じ `color` / `variant` props。
152
+
153
+ ```tsx
154
+ import { LinkButton } from '@k8o/arte-odyssey/link-button';
155
+
156
+ <LinkButton href="/page" color="gray" variant="outlined">
157
+ リンク
158
+ </LinkButton>;
159
+ ```
160
+
161
+ ### IconLink
162
+
163
+ アイコンのみのリンク。IconButton と同じ `bg` prop。
164
+
165
+ ```tsx
166
+ import { IconLink } from '@k8o/arte-odyssey/icon-link';
167
+
168
+ <IconLink href="/home" bg="base" label="ホーム">
169
+ <HomeIcon />
170
+ </IconLink>;
171
+ ```
172
+
173
+ ### Anchor
174
+
175
+ テキストリンク。
176
+
177
+ ```tsx
178
+ import { Anchor } from '@k8o/arte-odyssey/anchor';
179
+
180
+ <Anchor href="https://example.com" isExternal>
181
+ 外部リンク
182
+ </Anchor>;
183
+ ```
184
+
185
+ ## フォーム
186
+
187
+ ### TextField
188
+
189
+ ```tsx
190
+ import { TextField } from '@k8o/arte-odyssey/text-field';
191
+
192
+ <TextField id="email" defaultValue="" placeholder="example@mail.com" />;
193
+ ```
194
+
195
+ ### Textarea
196
+
197
+ ```tsx
198
+ import { Textarea } from '@k8o/arte-odyssey/textarea';
199
+
200
+ <Textarea label="説明" rows={4} value={value} onChange={onChange} />;
201
+ ```
202
+
203
+ ### Checkbox
204
+
205
+ ```tsx
206
+ import { Checkbox } from '@k8o/arte-odyssey/checkbox';
207
+
208
+ <Checkbox checked={checked} onChange={onChange}>
209
+ 同意する
210
+ </Checkbox>;
211
+ ```
212
+
213
+ ### Radio
214
+
215
+ ```tsx
216
+ import { Radio } from '@k8o/arte-odyssey/radio';
217
+
218
+ <Radio
219
+ labelId="example-radio"
220
+ name="example"
221
+ onChange={onChange}
222
+ options={[
223
+ { value: 'a', label: '選択肢A' },
224
+ { value: 'b', label: '選択肢B' },
225
+ ]}
226
+ value={value}
227
+ />;
228
+ ```
229
+
230
+ ### Select
231
+
232
+ ```tsx
233
+ import { Select } from '@k8o/arte-odyssey/select';
234
+
235
+ <Select
236
+ label="選択"
237
+ options={[
238
+ { value: '1', label: 'オプション1' },
239
+ { value: '2', label: 'オプション2' },
240
+ ]}
241
+ value={value}
242
+ onChange={onChange}
243
+ />;
244
+ ```
245
+
246
+ ### NumberField
247
+
248
+ ```tsx
249
+ import { NumberField } from '@k8o/arte-odyssey/number-field';
250
+
251
+ <NumberField label="数量" min={0} max={100} value={value} onChange={onChange} />;
252
+ ```
253
+
254
+ ### RangeField
255
+
256
+ ```tsx
257
+ import { RangeField } from '@k8o/arte-odyssey/range-field';
258
+
259
+ <RangeField label="音量" min={0} max={100} value={value} onChange={onChange} />;
260
+ ```
261
+
262
+ ### Autocomplete
263
+
264
+ ```tsx
265
+ import { Autocomplete } from '@k8o/arte-odyssey/autocomplete';
266
+
267
+ <Autocomplete label="検索" options={options} value={value} onChange={onChange} />;
268
+ ```
269
+
270
+ ### FileField
271
+
272
+ コンポジットパターンのファイルアップロード。
273
+
274
+ ```tsx
275
+ import { FileField } from '@k8o/arte-odyssey/file-field';
276
+
277
+ <FileField.Root accept="image/*" multiple maxFiles={5}>
278
+ <FileField.Trigger>ファイルを選択</FileField.Trigger>
279
+ <FileField.ItemList />
280
+ </FileField.Root>;
281
+ ```
282
+
283
+ Props (Root):
284
+
285
+ - `accept`: string
286
+ - `multiple`: boolean
287
+ - `maxFiles`: number
288
+ - `isDisabled`, `isInvalid`, `isRequired`: boolean
289
+
290
+ ### FormControl
291
+
292
+ フォームフィールドのラッパー(ラベル・エラー表示を統一)。
293
+
294
+ ```tsx
295
+ import { FormControl } from '@k8o/arte-odyssey/form-control';
296
+
297
+ <FormControl label="ラベル" error="エラーメッセージ" isRequired>
298
+ <TextField id="name" />
299
+ </FormControl>;
300
+ ```
301
+
302
+ ## フィードバック
303
+
304
+ ### Alert
305
+
306
+ ```tsx
307
+ import { Alert } from '@k8o/arte-odyssey/alert';
308
+
309
+ <Alert status="info" | "success" | "warning" | "error">
310
+ メッセージ
311
+ </Alert>
312
+ ```
313
+
314
+ ### Toast
315
+
316
+ ```tsx
317
+ import { useToast } from '@k8o/arte-odyssey/toast';
318
+
319
+ const toast = useToast();
320
+ toast.show({ message: '保存しました', status: 'success' });
321
+ ```
322
+
323
+ ### Progress
324
+
325
+ ```tsx
326
+ import { Progress } from '@k8o/arte-odyssey/progress';
327
+
328
+ <Progress value={50} max={100} />;
329
+ ```
330
+
331
+ ### BaselineStatus
332
+
333
+ Web API のブラウザサポート状況を表示。
334
+
335
+ ```tsx
336
+ import { BaselineStatus } from '@k8o/arte-odyssey/baseline-status';
337
+
338
+ <BaselineStatus featureId="dialog" />;
339
+ ```
340
+
341
+ ## オーバーレイ
342
+
343
+ ### Dialog
344
+
345
+ ```tsx
346
+ import { Dialog } from '@k8o/arte-odyssey/dialog';
347
+
348
+ <Dialog open={open} onClose={onClose} title="確認">
349
+ コンテンツ
350
+ </Dialog>;
351
+ ```
352
+
353
+ ### Drawer
354
+
355
+ ```tsx
356
+ import { Drawer } from '@k8o/arte-odyssey/drawer';
357
+
358
+ <Drawer open={open} onClose={onClose} position="right">
359
+ コンテンツ
360
+ </Drawer>;
361
+ ```
362
+
363
+ ### Modal
364
+
365
+ ```tsx
366
+ import { Modal } from '@k8o/arte-odyssey/modal';
367
+
368
+ <Modal open={open} onClose={onClose}>
369
+ コンテンツ
370
+ </Modal>;
371
+ ```
372
+
373
+ ### Popover
374
+
375
+ ```tsx
376
+ import { Popover } from '@k8o/arte-odyssey/popover';
377
+
378
+ <Popover trigger={<Button>開く</Button>}>ポップオーバーコンテンツ</Popover>;
379
+ ```
380
+
381
+ ### Tooltip
382
+
383
+ ```tsx
384
+ import { Tooltip } from '@k8o/arte-odyssey/tooltip';
385
+
386
+ <Tooltip content="ヒント">
387
+ <Button>ホバー</Button>
388
+ </Tooltip>;
389
+ ```
390
+
391
+ ### DropdownMenu
392
+
393
+ ```tsx
394
+ import { DropdownMenu, DropdownMenuItem } from '@k8o/arte-odyssey/dropdown-menu';
395
+
396
+ <DropdownMenu trigger={<Button>メニュー</Button>}>
397
+ <DropdownMenuItem onClick={handleClick}>アイテム1</DropdownMenuItem>
398
+ <DropdownMenuItem>アイテム2</DropdownMenuItem>
399
+ </DropdownMenu>;
400
+ ```
401
+
402
+ ## データ表示
403
+
404
+ ### Code
405
+
406
+ ```tsx
407
+ import { Code } from '@k8o/arte-odyssey/code';
408
+
409
+ <Code language="typescript">{`const x = 1;`}</Code>;
410
+ ```
411
+
412
+ ### Heading
413
+
414
+ ```tsx
415
+ import { Heading } from '@k8o/arte-odyssey/heading';
416
+
417
+ <Heading level={1}>見出し</Heading>;
418
+ ```
419
+
420
+ ### TextTag
421
+
422
+ ```tsx
423
+ import { TextTag } from '@k8o/arte-odyssey/text-tag';
424
+
425
+ <TextTag>タグ</TextTag>;
426
+ ```
427
+
428
+ ### ListBox
429
+
430
+ ```tsx
431
+ import { ListBox, ListBoxItem } from '@k8o/arte-odyssey/list-box';
432
+
433
+ <ListBox>
434
+ <ListBoxItem>アイテム1</ListBoxItem>
435
+ <ListBoxItem>アイテム2</ListBoxItem>
436
+ </ListBox>;
437
+ ```
438
+
439
+ ## ユーティリティ
440
+
441
+ ### ArteOdysseyProvider
442
+
443
+ ```tsx
444
+ import { ArteOdysseyProvider } from '@k8o/arte-odyssey/providers';
445
+
446
+ <ArteOdysseyProvider>
447
+ <App />
448
+ </ArteOdysseyProvider>;
449
+ ```
@@ -0,0 +1,74 @@
1
+ # インタラクションデザイン
2
+
3
+ ArteOdyssey のインタラクションは「静かな変化」を原則とする。
4
+
5
+ ## インタラクティブ状態
6
+
7
+ 8つの状態を意識して設計する。
8
+
9
+ | 状態 | スタイル |
10
+ | -------- | ----------------------------------------------------- |
11
+ | Default | 基本スタイル |
12
+ | Hover | `hover:bg-bg-mute` — 穏やかな色変化 |
13
+ | Focus | `focus-visible:ring-2 focus-visible:ring-border-info` |
14
+ | Active | `active:bg-bg-emphasize` |
15
+ | Disabled | `opacity-50 cursor-not-allowed` |
16
+ | Loading | スピナーまたはスケルトン |
17
+ | Selected | `bg-primary-bg-subtle` |
18
+ | Error | `border-border-error` + `text-fg-error` |
19
+
20
+ ## トランジション
21
+
22
+ 控えめで自然な動き。
23
+
24
+ | 用途 | 推奨設定 |
25
+ | -------------------- | ------------------------------------------ |
26
+ | ホバー色変化 | `transition-colors duration-150 ease-out` |
27
+ | 透過度変化 | `transition-opacity duration-200 ease-out` |
28
+ | サイズ変化を伴う場合 | `transition-all duration-150 ease-out` |
29
+
30
+ ### タイミングの原則
31
+
32
+ - **100ms**: 即時フィードバック(ボタンプレス)
33
+ - **150–200ms**: 標準トランジション(ホバー、フォーカス)
34
+ - **300ms**: 開閉アニメーション(Accordion, Drawer の限度)
35
+ - **300ms を超えない** — 重く感じる
36
+
37
+ ## フォーカス管理
38
+
39
+ - `focus-visible` を使う(`focus` ではなく)— マウスクリック時にリングが出ない
40
+ - フォーカスリングは `ring-border-info` で統一
41
+ - `outline-hidden` でデフォルトのアウトラインを消してから ring を適用
42
+
43
+ ```tsx
44
+ className = 'focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-border-info';
45
+ ```
46
+
47
+ ## フォームデザイン
48
+
49
+ - ラベルは入力の上に配置(左配置は日本語で読みにくい)
50
+ - エラーメッセージは入力の直下に `text-fg-error text-sm`
51
+ - 必須マークは `*` でラベルの後ろに
52
+ - `FormControl` コンポーネントでラベル・エラー表示を統一
53
+
54
+ ```tsx
55
+ import { FormControl } from '@k8o/arte-odyssey/form-control';
56
+
57
+ <FormControl label="メールアドレス" error="入力してください" isRequired>
58
+ <TextField id="email" placeholder="example@mail.com" />
59
+ </FormControl>;
60
+ ```
61
+
62
+ ## アクセシビリティ
63
+
64
+ - `aria-label` / `aria-describedby` を適切に設定
65
+ - キーボードナビゲーションを確保(Tab, Enter, Escape, 矢印キー)
66
+ - `prefers-reduced-motion` を考慮 — ArteOdyssey の motion ライブラリが自動対応
67
+ - カラーだけに頼らない状態表現(アイコンやテキストを併用)
68
+
69
+ ## やってはいけないこと
70
+
71
+ - bounce / spring 系のイージング
72
+ - 300ms を超えるアニメーション
73
+ - ホバーに強い原色(`bg-primary-bg`)を使う
74
+ - `cursor-pointer` をボタン以外に付ける(リンクにも不要)
@@ -0,0 +1,101 @@
1
+ # スペーシング・レイアウト
2
+
3
+ ArteOdyssey は「余白で語る」デザイン。詰め込まず、空間にゆとりを持たせる。
4
+
5
+ ## スペーシングの原則
6
+
7
+ 4pt ベースのスペーシングシステム。Tailwind の標準スケールを使用。
8
+
9
+ ### コンポーネント内部パディング
10
+
11
+ | 用途 | クラス | 値 |
12
+ | ---------- | ------ | ---- |
13
+ | コンパクト | `p-4` | 16px |
14
+ | 標準 | `p-6` | 24px |
15
+ | ゆったり | `p-8` | 32px |
16
+
17
+ ### リスト・メニューアイテム
18
+
19
+ ```tsx
20
+ className = 'px-3 py-2'; // 水平に余裕、垂直はコンパクト
21
+ ```
22
+
23
+ ### テキスト間の余白
24
+
25
+ | 関係性 | クラス | 用途 |
26
+ | -------------- | ------- | ---------------------------- |
27
+ | 近い要素 | `mt-2` | 説明テキスト、ヘルプテキスト |
28
+ | 標準 | `mt-4` | 段落間、フォームフィールド間 |
29
+ | セクション間 | `mt-8` | セクション区切り |
30
+ | 大セクション間 | `mt-12` | ページレベルの区切り |
31
+
32
+ ## 角丸
33
+
34
+ | 用途 | クラス |
35
+ | -------------------------- | -------------- |
36
+ | Badge, Tag 等小さい要素 | `rounded-sm` |
37
+ | Button, Input | `rounded-md` |
38
+ | Card, Modal, Dialog | `rounded-lg` |
39
+ | プログレスバー, IconButton | `rounded-full` |
40
+
41
+ `rounded-2xl` 以上は使わない。
42
+
43
+ ## シャドウ
44
+
45
+ 基本的に使わない。ボーダーで区切りを表現する。
46
+
47
+ | 用途 | スタイル |
48
+ | ------------------------ | --------------------------------------------------------- |
49
+ | Card(shadow) | `shadow-sm`(`appearance="shadow"` 時) |
50
+ | Card(bordered) | `border border-border-mute`(`appearance="bordered"` 時) |
51
+ | Modal / Dialog / Tooltip | `shadow-md` |
52
+ | Dropdown / ListBox | `shadow-md` |
53
+ | Button | なし |
54
+
55
+ `shadow-xl` 以上は使わない。
56
+
57
+ ## レイアウトパターン
58
+
59
+ ### 余白で階層を作る
60
+
61
+ ```tsx
62
+ // Good: 余白の差で関連度を示す
63
+ <section className="mt-12">
64
+ <Heading level={2}>セクション</Heading>
65
+ <p className="mt-2">直接関連する説明</p>
66
+ <div className="mt-8">やや離れたコンテンツ</div>
67
+ </section>
68
+
69
+ // Bad: すべて同じ余白
70
+ <section className="mt-4">
71
+ <Heading level={2}>セクション</Heading>
72
+ <p className="mt-4">説明</p>
73
+ <div className="mt-4">コンテンツ</div>
74
+ </section>
75
+ ```
76
+
77
+ ### カードは万能ではない
78
+
79
+ すべてのコンテンツをカードに入れる必要はない。余白と Separator で十分なケースが多い。
80
+
81
+ ```tsx
82
+ import { Separator } from '@k8o/arte-odyssey/separator';
83
+
84
+ // Good: Separator で区切る
85
+ <div>
86
+ <section>コンテンツA</section>
87
+ <Separator className="my-8" />
88
+ <section>コンテンツB</section>
89
+ </div>
90
+
91
+ // 過剰: すべてカードに入れる
92
+ <Card>コンテンツA</Card>
93
+ <Card>コンテンツB</Card>
94
+ ```
95
+
96
+ ## やってはいけないこと
97
+
98
+ - `gap-1` や `p-1` のような極端に狭いスペーシング
99
+ - コンテンツの詰め込み(情報密度より余白を優先)
100
+ - ネストされたカード(Card in Card)
101
+ - 12 を超える z-index 値
@@ -0,0 +1,67 @@
1
+ # タイポグラフィ
2
+
3
+ ArteOdyssey のタイポグラフィは「読みやすさ」と「静けさ」を両立する。
4
+
5
+ ## フォントファミリー
6
+
7
+ 日本語最適化のフォントスタック。
8
+
9
+ ```css
10
+ font-family: 'Noto Sans JP', 'M PLUS 2', sans-serif;
11
+ ```
12
+
13
+ - **Inter / Roboto / Open Sans は使わない** — AI が生成した感が出る
14
+ - 日本語テキストが主体のため、和文フォントを優先
15
+
16
+ ## フォントサイズスケール
17
+
18
+ | Tailwind クラス | 値 | 用途 |
19
+ | --------------- | -------- | -------------------- |
20
+ | `text-xs` | 0.75rem | 注釈、キャプション |
21
+ | `text-sm` | 0.875rem | 補足テキスト、ラベル |
22
+ | `text-md` | 1rem | 本文(デフォルト) |
23
+ | `text-lg` | 1.125rem | 小見出し |
24
+ | `text-xl` | 1.25rem | 見出し |
25
+ | `text-2xl` | 1.5rem | 大見出し |
26
+ | `text-3xl` | 1.875rem | ページタイトル |
27
+
28
+ ## フォントウェイト
29
+
30
+ ウェイトは控えめに使う。太字の多用は「静けさ」を損なう。
31
+
32
+ | Tailwind クラス | 値 | 用途 |
33
+ | --------------- | --- | ---------------------------- |
34
+ | `font-normal` | 400 | 本文 |
35
+ | `font-medium` | 450 | 強調テキスト(控えめな強調) |
36
+ | `font-bold` | 700 | 見出し、ボタンラベル |
37
+
38
+ - `font-semibold` (600) や `font-extrabold` (800) は使わない
39
+ - `font-medium` が 450 であることに注意(一般的な 500 より軽い)
40
+
41
+ ## 行間
42
+
43
+ 日本語テキストは欧文より広い行間が必要。
44
+
45
+ - 本文: `leading-relaxed` (1.625) を推奨
46
+ - 見出し: `leading-tight` (1.25) か `leading-snug` (1.375)
47
+ - リスト内: デフォルトの `leading-normal` (1.5)
48
+
49
+ ## Heading コンポーネント
50
+
51
+ 見出しには `Heading` コンポーネントを使う。
52
+
53
+ ```tsx
54
+ import { Heading } from '@k8o/arte-odyssey/heading';
55
+
56
+ <Heading level={1}>ページタイトル</Heading>
57
+ <Heading level={2}>セクション見出し</Heading>
58
+ <Heading level={3}>サブセクション</Heading>
59
+ ```
60
+
61
+ ## やってはいけないこと
62
+
63
+ - 3種類以上のフォントウェイトを1画面で使う
64
+ - `text-3xl` より大きいサイズを使う(ページタイトル以外)
65
+ - `uppercase` や `tracking-widest` を日本語テキストに適用する
66
+ - テキストにグラデーションをかける
67
+ - フォントサイズだけで階層を作る(余白も活用する)