@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.
@@ -2,7 +2,7 @@ import { FC, ReactNode } from "react";
2
2
 
3
3
  //#region src/components/icons/base.d.ts
4
4
  type BaseIconProps = {
5
- size: 'sm' | 'md' | 'lg';
5
+ size: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl';
6
6
  };
7
7
  declare const BaseIcon: FC<BaseIconProps & {
8
8
  renderItem: (arg: {
@@ -1,7 +1,16 @@
1
1
  import { cn } from "../../helpers/cn.mjs";
2
2
  //#region src/components/icons/base.tsx
3
+ const sizeClass = {
4
+ xs: "size-3",
5
+ sm: "size-4",
6
+ md: "size-6",
7
+ lg: "size-8",
8
+ xl: "size-10",
9
+ "2xl": "size-12",
10
+ "3xl": "size-14"
11
+ };
3
12
  const BaseIcon = ({ size, renderItem }) => {
4
- return renderItem({ className: cn(size === "sm" && "size-4", size === "md" && "size-6", size === "lg" && "size-8") });
13
+ return renderItem({ className: cn(sizeClass[size]) });
5
14
  };
6
15
  //#endregion
7
16
  export { BaseIcon };
@@ -52,5 +52,4 @@ import { Popover } from "./overlays/popover/popover.mjs";
52
52
  import { Tooltip } from "./overlays/tooltip/tooltip.mjs";
53
53
  import { ArteOdysseyProvider } from "./providers/arte-odyssey-provider.mjs";
54
54
  import { PortalRootProvider, usePortalRoot } from "./providers/portal-root.mjs";
55
- import { ErrorBoundary } from "./utility/error-boundary/index.mjs";
56
- export { AIIcon, AccessibilityIcon, Accordion, Alert, AlertIcon, Anchor, ArteOdyssey, ArteOdysseyProvider, AtomIcon, Autocomplete, Avatar, BadIcon, Badge, BaselineStatus, BlogIcon, BoringIcon, Breadcrumb, Button, Card, CheckIcon, Checkbox, CheckboxCard, CheckboxGroup, ChevronIcon, CloseIcon, Code, ColorContrastIcon, ColorInfoIcon, CopyIcon, DarkModeIcon, Dialog, DifficultIcon, Drawer, DropdownMenu, EasyIcon, ErrorBoundary, ExternalLinkIcon, FileField, FormControl, FormIcon, GitHubIcon, GoodIcon, Heading, HistoryIcon, IconButton, IconLink, InformativeIcon, InteractiveCard, InterestingIcon, LightModeIcon, LinkButton, LinkIcon, ListBox, ListIcon, LocationIcon, Logo, LogoIcon, MailIcon, MinusIcon, MixedColorIcon, Modal, NavigationMenuIcon, NewsIcon, NumberField, PaletteIcon, PasswordInput, PlusIcon, Popover, PortalRootProvider, PrepareIcon, Progress, PublishDateIcon, QiitaIcon, RSSIcon, Radio, RadioCard, ScrollLinked, Select, SendIcon, Separator, ShallowIcon, ShieldCheckIcon, Skeleton, SlideIcon, Slider, SparklesIcon, Spinner, SubscribeIcon, Switch, Table, TableIcon, Tabs, TagIcon, TextField, Textarea, ToastProvider, Tooltip, TwitterIcon, UpdateDateIcon, ViewIcon, ViewOffIcon, useOpenContext, usePortalRoot, useToast };
55
+ export { AIIcon, AccessibilityIcon, Accordion, Alert, AlertIcon, Anchor, ArteOdyssey, ArteOdysseyProvider, AtomIcon, Autocomplete, Avatar, BadIcon, Badge, BaselineStatus, BlogIcon, BoringIcon, Breadcrumb, Button, Card, CheckIcon, Checkbox, CheckboxCard, CheckboxGroup, ChevronIcon, CloseIcon, Code, ColorContrastIcon, ColorInfoIcon, CopyIcon, DarkModeIcon, Dialog, DifficultIcon, Drawer, DropdownMenu, EasyIcon, ExternalLinkIcon, FileField, FormControl, FormIcon, GitHubIcon, GoodIcon, Heading, HistoryIcon, IconButton, IconLink, InformativeIcon, InteractiveCard, InterestingIcon, LightModeIcon, LinkButton, LinkIcon, ListBox, ListIcon, LocationIcon, Logo, LogoIcon, MailIcon, MinusIcon, MixedColorIcon, Modal, NavigationMenuIcon, NewsIcon, NumberField, PaletteIcon, PasswordInput, PlusIcon, Popover, PortalRootProvider, PrepareIcon, Progress, PublishDateIcon, QiitaIcon, RSSIcon, Radio, RadioCard, ScrollLinked, Select, SendIcon, Separator, ShallowIcon, ShieldCheckIcon, Skeleton, SlideIcon, Slider, SparklesIcon, Spinner, SubscribeIcon, Switch, Table, TableIcon, Tabs, TagIcon, TextField, Textarea, ToastProvider, Tooltip, TwitterIcon, UpdateDateIcon, ViewIcon, ViewOffIcon, useOpenContext, usePortalRoot, useToast };
@@ -52,5 +52,4 @@ import { Popover } from "./overlays/popover/popover.mjs";
52
52
  import { DropdownMenu } from "./overlays/dropdown-menu/dropdown-menu.mjs";
53
53
  import { ListBox } from "./overlays/list-box/list-box.mjs";
54
54
  import { Tooltip } from "./overlays/tooltip/tooltip.mjs";
55
- import { ErrorBoundary } from "./utility/error-boundary/index.mjs";
56
- export { AIIcon, AccessibilityIcon, Accordion, Alert, AlertIcon, Anchor, ArteOdyssey, ArteOdysseyProvider, AtomIcon, Autocomplete, Avatar, BadIcon, Badge, BaselineStatus, BlogIcon, BoringIcon, Breadcrumb, Button, Card, CheckIcon, Checkbox, CheckboxCard, CheckboxGroup, ChevronIcon, CloseIcon, Code, ColorContrastIcon, ColorInfoIcon, CopyIcon, DarkModeIcon, Dialog, DifficultIcon, Drawer, DropdownMenu, EasyIcon, ErrorBoundary, ExternalLinkIcon, FileField, FormControl, FormIcon, GitHubIcon, GoodIcon, Heading, HistoryIcon, IconButton, IconLink, InformativeIcon, InteractiveCard, InterestingIcon, LightModeIcon, LinkButton, LinkIcon, ListBox, ListIcon, LocationIcon, Logo, LogoIcon, MailIcon, MinusIcon, MixedColorIcon, Modal, NavigationMenuIcon, NewsIcon, NumberField, PaletteIcon, PasswordInput, PlusIcon, Popover, PortalRootProvider, PrepareIcon, Progress, PublishDateIcon, QiitaIcon, RSSIcon, Radio, RadioCard, ScrollLinked, Select, SendIcon, Separator, ShallowIcon, ShieldCheckIcon, Skeleton, SlideIcon, Slider, SparklesIcon, Spinner, SubscribeIcon, Switch, Table, TableIcon, Tabs, TagIcon, TextField, Textarea, ToastProvider, Tooltip, TwitterIcon, UpdateDateIcon, ViewIcon, ViewOffIcon, useOpenContext, usePortalRoot, useToast };
55
+ export { AIIcon, AccessibilityIcon, Accordion, Alert, AlertIcon, Anchor, ArteOdyssey, ArteOdysseyProvider, AtomIcon, Autocomplete, Avatar, BadIcon, Badge, BaselineStatus, BlogIcon, BoringIcon, Breadcrumb, Button, Card, CheckIcon, Checkbox, CheckboxCard, CheckboxGroup, ChevronIcon, CloseIcon, Code, ColorContrastIcon, ColorInfoIcon, CopyIcon, DarkModeIcon, Dialog, DifficultIcon, Drawer, DropdownMenu, EasyIcon, ExternalLinkIcon, FileField, FormControl, FormIcon, GitHubIcon, GoodIcon, Heading, HistoryIcon, IconButton, IconLink, InformativeIcon, InteractiveCard, InterestingIcon, LightModeIcon, LinkButton, LinkIcon, ListBox, ListIcon, LocationIcon, Logo, LogoIcon, MailIcon, MinusIcon, MixedColorIcon, Modal, NavigationMenuIcon, NewsIcon, NumberField, PaletteIcon, PasswordInput, PlusIcon, Popover, PortalRootProvider, PrepareIcon, Progress, PublishDateIcon, QiitaIcon, RSSIcon, Radio, RadioCard, ScrollLinked, Select, SendIcon, Separator, ShallowIcon, ShieldCheckIcon, Skeleton, SlideIcon, Slider, SparklesIcon, Spinner, SubscribeIcon, Switch, Table, TableIcon, Tabs, TagIcon, TextField, Textarea, ToastProvider, Tooltip, TwitterIcon, UpdateDateIcon, ViewIcon, ViewOffIcon, useOpenContext, usePortalRoot, useToast };
package/dist/index.d.mts CHANGED
@@ -53,7 +53,6 @@ import { Popover } from "./components/overlays/popover/popover.mjs";
53
53
  import { Tooltip } from "./components/overlays/tooltip/tooltip.mjs";
54
54
  import { ArteOdysseyProvider } from "./components/providers/arte-odyssey-provider.mjs";
55
55
  import { PortalRootProvider, usePortalRoot } from "./components/providers/portal-root.mjs";
56
- import { ErrorBoundary } from "./components/utility/error-boundary/index.mjs";
57
56
  import { cn } from "./helpers/cn.mjs";
58
57
  import { findAllColors } from "./helpers/color/find-all-colors.mjs";
59
58
  import { isInternalRoute } from "./helpers/is-internal-route.mjs";
@@ -74,4 +73,4 @@ import { useStep } from "./hooks/step/index.mjs";
74
73
  import { useTimeout } from "./hooks/timeout/index.mjs";
75
74
  import { useWindowResize } from "./hooks/window-resize/index.mjs";
76
75
  import { useWindowSize } from "./hooks/window-size/index.mjs";
77
- export { AIIcon, AccessibilityIcon, Accordion, Alert, AlertIcon, Anchor, ArteOdyssey, ArteOdysseyProvider, AtomIcon, Autocomplete, Avatar, BadIcon, Badge, BaselineStatus, BlogIcon, BoringIcon, Breadcrumb, Button, Card, CheckIcon, Checkbox, CheckboxCard, CheckboxGroup, ChevronIcon, CloseIcon, Code, ColorContrastIcon, ColorInfoIcon, CopyIcon, DarkModeIcon, Dialog, DifficultIcon, Direction, Drawer, DropdownMenu, EasyIcon, ErrorBoundary, ExternalLinkIcon, FileField, FormControl, FormIcon, GitHubIcon, GoodIcon, Heading, HistoryIcon, IconButton, IconLink, InformativeIcon, InteractiveCard, InterestingIcon, LightModeIcon, LinkButton, LinkIcon, ListBox, ListIcon, LocationIcon, Logo, LogoIcon, MailIcon, MinusIcon, MixedColorIcon, Modal, NavigationMenuIcon, NewsIcon, NumberField, Option, PaletteIcon, PasswordInput, PlusIcon, Popover, PortalRootProvider, PrepareIcon, Progress, PublishDateIcon, QiitaIcon, RSSIcon, Radio, RadioCard, ScrollLinked, Select, SendIcon, Separator, ShallowIcon, ShieldCheckIcon, Skeleton, SlideIcon, Slider, SparklesIcon, Spinner, Status, SubscribeIcon, Switch, Table, TableIcon, Tabs, TagIcon, TextField, Textarea, ToastProvider, Tooltip, TwitterIcon, UpdateDateIcon, ViewIcon, ViewOffIcon, between, cast, cn, commalize, findAllColors, isInternalRoute, toPrecision, useClickAway, useClient, useClipboard, useHash, useInterval, useLocalStorage, useOpenContext, usePortalRoot, useResize, useScrollDirection, useStep, useTimeout, useToast, useWindowResize, useWindowSize, uuidV4 };
76
+ export { AIIcon, AccessibilityIcon, Accordion, Alert, AlertIcon, Anchor, ArteOdyssey, ArteOdysseyProvider, AtomIcon, Autocomplete, Avatar, BadIcon, Badge, BaselineStatus, BlogIcon, BoringIcon, Breadcrumb, Button, Card, CheckIcon, Checkbox, CheckboxCard, CheckboxGroup, ChevronIcon, CloseIcon, Code, ColorContrastIcon, ColorInfoIcon, CopyIcon, DarkModeIcon, Dialog, DifficultIcon, Direction, Drawer, DropdownMenu, EasyIcon, ExternalLinkIcon, FileField, FormControl, FormIcon, GitHubIcon, GoodIcon, Heading, HistoryIcon, IconButton, IconLink, InformativeIcon, InteractiveCard, InterestingIcon, LightModeIcon, LinkButton, LinkIcon, ListBox, ListIcon, LocationIcon, Logo, LogoIcon, MailIcon, MinusIcon, MixedColorIcon, Modal, NavigationMenuIcon, NewsIcon, NumberField, Option, PaletteIcon, PasswordInput, PlusIcon, Popover, PortalRootProvider, PrepareIcon, Progress, PublishDateIcon, QiitaIcon, RSSIcon, Radio, RadioCard, ScrollLinked, Select, SendIcon, Separator, ShallowIcon, ShieldCheckIcon, Skeleton, SlideIcon, Slider, SparklesIcon, Spinner, Status, SubscribeIcon, Switch, Table, TableIcon, Tabs, TagIcon, TextField, Textarea, ToastProvider, Tooltip, TwitterIcon, UpdateDateIcon, ViewIcon, ViewOffIcon, between, cast, cn, commalize, findAllColors, isInternalRoute, toPrecision, useClickAway, useClient, useClipboard, useHash, useInterval, useLocalStorage, useOpenContext, usePortalRoot, useResize, useScrollDirection, useStep, useTimeout, useToast, useWindowResize, useWindowSize, uuidV4 };
package/dist/index.mjs CHANGED
@@ -62,7 +62,6 @@ import { Popover } from "./components/overlays/popover/popover.mjs";
62
62
  import { DropdownMenu } from "./components/overlays/dropdown-menu/dropdown-menu.mjs";
63
63
  import { ListBox } from "./components/overlays/list-box/list-box.mjs";
64
64
  import { Tooltip } from "./components/overlays/tooltip/tooltip.mjs";
65
- import { ErrorBoundary } from "./components/utility/error-boundary/index.mjs";
66
65
  import { useClient } from "./hooks/client/index.mjs";
67
66
  import { useClipboard } from "./hooks/clipboard/index.mjs";
68
67
  import { useHash } from "./hooks/hash/index.mjs";
@@ -73,4 +72,4 @@ import { useScrollDirection } from "./hooks/scroll-direction/index.mjs";
73
72
  import { useStep } from "./hooks/step/index.mjs";
74
73
  import { useWindowResize } from "./hooks/window-resize/index.mjs";
75
74
  import { useWindowSize } from "./hooks/window-size/index.mjs";
76
- export { AIIcon, AccessibilityIcon, Accordion, Alert, AlertIcon, Anchor, ArteOdyssey, ArteOdysseyProvider, AtomIcon, Autocomplete, Avatar, BadIcon, Badge, BaselineStatus, BlogIcon, BoringIcon, Breadcrumb, Button, Card, CheckIcon, Checkbox, CheckboxCard, CheckboxGroup, ChevronIcon, CloseIcon, Code, ColorContrastIcon, ColorInfoIcon, CopyIcon, DarkModeIcon, Dialog, DifficultIcon, Drawer, DropdownMenu, EasyIcon, ErrorBoundary, ExternalLinkIcon, FileField, FormControl, FormIcon, GitHubIcon, GoodIcon, Heading, HistoryIcon, IconButton, IconLink, InformativeIcon, InteractiveCard, InterestingIcon, LightModeIcon, LinkButton, LinkIcon, ListBox, ListIcon, LocationIcon, Logo, LogoIcon, MailIcon, MinusIcon, MixedColorIcon, Modal, NavigationMenuIcon, NewsIcon, NumberField, PaletteIcon, PasswordInput, PlusIcon, Popover, PortalRootProvider, PrepareIcon, Progress, PublishDateIcon, QiitaIcon, RSSIcon, Radio, RadioCard, ScrollLinked, Select, SendIcon, Separator, ShallowIcon, ShieldCheckIcon, Skeleton, SlideIcon, Slider, SparklesIcon, Spinner, SubscribeIcon, Switch, Table, TableIcon, Tabs, TagIcon, TextField, Textarea, ToastProvider, Tooltip, TwitterIcon, UpdateDateIcon, ViewIcon, ViewOffIcon, between, cast, cn, commalize, findAllColors, isInternalRoute, toPrecision, useClickAway, useClient, useClipboard, useHash, useInterval, useLocalStorage, useOpenContext, usePortalRoot, useResize, useScrollDirection, useStep, useTimeout, useToast, useWindowResize, useWindowSize, uuidV4 };
75
+ export { AIIcon, AccessibilityIcon, Accordion, Alert, AlertIcon, Anchor, ArteOdyssey, ArteOdysseyProvider, AtomIcon, Autocomplete, Avatar, BadIcon, Badge, BaselineStatus, BlogIcon, BoringIcon, Breadcrumb, Button, Card, CheckIcon, Checkbox, CheckboxCard, CheckboxGroup, ChevronIcon, CloseIcon, Code, ColorContrastIcon, ColorInfoIcon, CopyIcon, DarkModeIcon, Dialog, DifficultIcon, Drawer, DropdownMenu, EasyIcon, ExternalLinkIcon, FileField, FormControl, FormIcon, GitHubIcon, GoodIcon, Heading, HistoryIcon, IconButton, IconLink, InformativeIcon, InteractiveCard, InterestingIcon, LightModeIcon, LinkButton, LinkIcon, ListBox, ListIcon, LocationIcon, Logo, LogoIcon, MailIcon, MinusIcon, MixedColorIcon, Modal, NavigationMenuIcon, NewsIcon, NumberField, PaletteIcon, PasswordInput, PlusIcon, Popover, PortalRootProvider, PrepareIcon, Progress, PublishDateIcon, QiitaIcon, RSSIcon, Radio, RadioCard, ScrollLinked, Select, SendIcon, Separator, ShallowIcon, ShieldCheckIcon, Skeleton, SlideIcon, Slider, SparklesIcon, Spinner, SubscribeIcon, Switch, Table, TableIcon, Tabs, TagIcon, TextField, Textarea, ToastProvider, Tooltip, TwitterIcon, UpdateDateIcon, ViewIcon, ViewOffIcon, between, cast, cn, commalize, findAllColors, isInternalRoute, toPrecision, useClickAway, useClient, useClipboard, useHash, useInterval, useLocalStorage, useOpenContext, usePortalRoot, useResize, useScrollDirection, useStep, useTimeout, useToast, useWindowResize, useWindowSize, uuidV4 };
package/docs/GUIDE.md ADDED
@@ -0,0 +1,232 @@
1
+ # ArteOdyssey Design Guide
2
+
3
+ `@k8o/arte-odyssey` デザインシステムを使って UI を作るためのガイド。
4
+
5
+ ## セットアップ
6
+
7
+ ```bash
8
+ npm install @k8o/arte-odyssey
9
+ ```
10
+
11
+ ```tsx
12
+ // 1. スタイルシートを読み込む(エントリポイントで1回)
13
+ import '@k8o/arte-odyssey/styles.css';
14
+
15
+ // 2. Provider でアプリを囲む
16
+ import { ArteOdysseyProvider } from '@k8o/arte-odyssey/providers';
17
+
18
+ function App() {
19
+ return (
20
+ <ArteOdysseyProvider>
21
+ <YourApp />
22
+ </ArteOdysseyProvider>
23
+ );
24
+ }
25
+
26
+ // 3. コンポーネントを使う
27
+ import { Button } from '@k8o/arte-odyssey/button';
28
+ import { Card } from '@k8o/arte-odyssey/card';
29
+ ```
30
+
31
+ ### Tailwind CSS の設定
32
+
33
+ `@k8o/arte-odyssey` は Tailwind CSS 4 以上が必要。プロジェクトの CSS で以下を追加:
34
+
35
+ ```css
36
+ @import 'tailwindcss';
37
+ @import '@k8o/arte-odyssey/styles.css';
38
+ ```
39
+
40
+ ## デザインの方向性
41
+
42
+ ### コアコンセプト
43
+
44
+ **「静謐で落ち着いた、余白を活かしたUI」**
45
+
46
+ - **引き算の美学**: 装飾は最小限。必要なものだけ残す
47
+ - **余白で語る**: 詰め込まず、空間にゆとりを持たせる
48
+ - **静かな変化**: アニメーションは控えめに、繊細なフィードバック
49
+ - **穏やかな色**: 目に優しいトーン、グレー系を活かす
50
+
51
+ ### トーン
52
+
53
+ 「図書館の読書スペース」のような空気感。静かで集中できる、心地よい緊張感。
54
+
55
+ ## 美学ガイドライン
56
+
57
+ ### タイポグラフィ
58
+
59
+ **DO:**
60
+
61
+ - 日本語フォント(Noto Sans JP, M PLUS 2)を使う
62
+ - フォントウェイトは 3種類まで(`font-normal`, `font-medium`, `font-bold`)
63
+ - `font-medium` が 450(一般的な 500 より軽い)であることを活かした繊細な強調
64
+
65
+ **DON'T:**
66
+
67
+ - Inter / Roboto / Open Sans を使う
68
+ - 4種類以上のフォントサイズを1画面で使う
69
+ - テキストにグラデーションをかける
70
+
71
+ > [タイポグラフィ詳細](references/typography.md)
72
+
73
+ ### カラー
74
+
75
+ **DO:**
76
+
77
+ - 60-30-10 ルール(ニュートラル60%, サポート30%, アクセント10%)
78
+ - セマンティックカラートークンを使う(`bg-bg-subtle`, `text-fg-mute` 等)
79
+ - ダークモードを独立したトーンで設計する
80
+
81
+ **DON'T:**
82
+
83
+ - グラデーション背景
84
+ - ホバーに `bg-primary-bg` — `bg-bg-mute` を使う
85
+ - 透明度(`/90`)で状態表現 — 専用トークンを使う
86
+ - 生のカラー値(`bg-teal-500`)— セマンティックトークン(`bg-primary-bg`)を使う
87
+
88
+ > [カラー詳細](references/color.md)
89
+
90
+ ### スペーシング
91
+
92
+ **DO:**
93
+
94
+ - `p-6` を標準パディングとする
95
+ - 余白の差で関連度を表す(`mt-2` 近い、`mt-4` 標準、`mt-8` セクション間)
96
+ - Separator でセクションを区切る
97
+
98
+ **DON'T:**
99
+
100
+ - すべてを Card に入れる
101
+ - Card を入れ子にする(Card in Card)
102
+ - `gap-1` のような極端に狭いスペーシング
103
+
104
+ > [スペーシング詳細](references/spatial-design.md)
105
+
106
+ ### インタラクション
107
+
108
+ **DO:**
109
+
110
+ - `transition-colors` を基本にする
111
+ - `focus-visible:ring-2 focus-visible:ring-border-info` でフォーカス表現
112
+ - `hover:bg-bg-mute` で穏やかなホバー
113
+
114
+ **DON'T:**
115
+
116
+ - bounce / spring 系のイージング
117
+ - 300ms を超えるアニメーション
118
+ - ホバーに強い原色を使う
119
+
120
+ > [インタラクション詳細](references/interaction-design.md)
121
+
122
+ ## コンポーネント使用の原則
123
+
124
+ ### Button / LinkButton
125
+
126
+ `color` と `variant` で統一されたスタイル。
127
+
128
+ ```tsx
129
+ import { Button } from '@k8o/arte-odyssey/button';
130
+ import { LinkButton } from '@k8o/arte-odyssey/link-button';
131
+
132
+ // プライマリアクション
133
+ <Button color="primary" variant="contained">保存する</Button>
134
+
135
+ // セカンダリアクション
136
+ <Button color="gray" variant="outlined">キャンセル</Button>
137
+
138
+ // テキストのみ
139
+ <Button variant="skeleton">詳細を見る</Button>
140
+
141
+ // リンクボタン(同じ props)
142
+ <LinkButton href="/settings" color="gray">設定へ</LinkButton>
143
+ ```
144
+
145
+ ### IconButton / IconLink
146
+
147
+ `bg` prop でスタイルを制御(`variant` ではない)。
148
+
149
+ ```tsx
150
+ import { IconButton } from '@k8o/arte-odyssey/icon-button';
151
+ import { IconLink } from '@k8o/arte-odyssey/icon-link';
152
+
153
+ <IconButton bg="transparent" label="コピー"><CopyIcon /></IconButton>
154
+ <IconButton bg="primary" label="送信"><SendIcon /></IconButton>
155
+ <IconLink href="/home" bg="base" label="ホーム"><HomeIcon /></IconLink>
156
+ ```
157
+
158
+ ### Card / InteractiveCard
159
+
160
+ `appearance` prop でシャドウかボーダーかを選択。
161
+
162
+ ```tsx
163
+ import { Card, InteractiveCard } from '@k8o/arte-odyssey/card';
164
+
165
+ // 静的カード
166
+ <Card title="設定" appearance="bordered">
167
+ <p>カードのコンテンツ</p>
168
+ </Card>
169
+
170
+ // クリック可能なカード(ホバーでスケールアップ)
171
+ <InteractiveCard title="記事" appearance="shadow">
172
+ <p>コンテンツ</p>
173
+ </InteractiveCard>
174
+ ```
175
+
176
+ ### フォーム
177
+
178
+ ```tsx
179
+ import { TextField } from '@k8o/arte-odyssey/text-field';
180
+ import { Select } from '@k8o/arte-odyssey/select';
181
+ import { FileField } from '@k8o/arte-odyssey/file-field';
182
+
183
+ <TextField id="email" placeholder="example@mail.com" />
184
+
185
+ <Select
186
+ label="カテゴリ"
187
+ options={[{ value: '1', label: 'オプション1' }]}
188
+ value={value}
189
+ onChange={onChange}
190
+ />
191
+
192
+ <FileField.Root accept="image/*" multiple>
193
+ <FileField.Trigger>ファイルを選択</FileField.Trigger>
194
+ <FileField.ItemList />
195
+ </FileField.Root>
196
+ ```
197
+
198
+ ## アンチパターン: 「AI スロップ」を避ける
199
+
200
+ AI が生成したと一目でわかるUIの特徴を避ける。
201
+
202
+ | アンチパターン | ArteOdyssey での代替 |
203
+ | ------------------------------ | -------------------------------------------------- |
204
+ | パープルグラデーション | Teal/Cyan のフラットカラー |
205
+ | Card in Card(入れ子カード) | Separator + 余白で区切り |
206
+ | グレー背景にグレーテキスト | `text-fg-base` / `text-fg-mute` のコントラスト確保 |
207
+ | すべてに `rounded-2xl` | `rounded-lg` を基本、用途で使い分け |
208
+ | bounce / spring アニメーション | `transition-colors duration-150 ease-out` |
209
+ | Inter フォント | Noto Sans JP / M PLUS 2 |
210
+ | 過剰な glassmorphism | border + subtle な背景色 |
211
+ | 装飾的な絵文字やアイコン | lucide-react の線画アイコンを控えめに |
212
+ | 情報の詰め込み | 余白を活かした疎な配置 |
213
+
214
+ ### AI スロップテスト
215
+
216
+ > このUIを誰かに見せて「AIが作った」と言ったら、すぐに信じるだろうか?
217
+ > もし「はい」なら、それが問題だ。
218
+
219
+ ## 実装の原則
220
+
221
+ - **既存コンポーネントを使う**: カスタムUIの前にまず ArteOdyssey コンポーネントを探す
222
+ - **セマンティックトークンを使う**: 生のカラー値(`bg-teal-500`)ではなくトークン(`bg-primary-bg`)
223
+ - **ダークモードを忘れない**: セマンティックトークンを使えば自動対応
224
+ - **アクセシビリティ**: `aria-label`, キーボードナビゲーション, カラーだけに頼らない状態表現
225
+
226
+ ## 詳細リファレンス
227
+
228
+ - タイポグラフィ: [references/typography.md](references/typography.md)
229
+ - カラーシステム: [references/color.md](references/color.md)
230
+ - スペーシング・レイアウト: [references/spatial-design.md](references/spatial-design.md)
231
+ - インタラクション: [references/interaction-design.md](references/interaction-design.md)
232
+ - コンポーネント一覧: [references/components.md](references/components.md)
@@ -0,0 +1,86 @@
1
+ # カラーシステム
2
+
3
+ ArteOdyssey のカラーは「穏やかさ」を第一に設計されている。
4
+
5
+ ## 設計思想
6
+
7
+ - **60-30-10 ルール**: 60% ニュートラル(グレー系)、30% サポート(bg-subtle 等)、10% アクセント(primary/secondary)
8
+ - Primary に Teal、Secondary に Cyan を使用
9
+ - ダークモードは「ライトモードの反転」ではなく、独立したトーンで設計
10
+ - セマンティックトークンを使えばダークモードは自動対応
11
+
12
+ ## セマンティックカラー(前景)
13
+
14
+ | Tailwind クラス | Light | Dark | 用途 |
15
+ | ----------------- | ---------- | ---------- | ---------------- |
16
+ | `text-fg-base` | gray-900 | gray-50 | 基本テキスト |
17
+ | `text-fg-subtle` | gray-400 | gray-500 | プレースホルダー |
18
+ | `text-fg-mute` | gray-700 | gray-300 | 補足テキスト |
19
+ | `text-fg-inverse` | gray-50 | gray-900 | 反転テキスト |
20
+ | `text-fg-info` | blue-700 | blue-300 | 情報 |
21
+ | `text-fg-success` | green-700 | green-300 | 成功 |
22
+ | `text-fg-warning` | yellow-700 | yellow-300 | 警告 |
23
+ | `text-fg-error` | red-700 | red-300 | エラー |
24
+
25
+ ## セマンティックカラー(背景)
26
+
27
+ | Tailwind クラス | Light | Dark | 用途 |
28
+ | ----------------- | -------- | -------- | ---------------- |
29
+ | `bg-bg-base` | white | gray-900 | 基本背景 |
30
+ | `bg-bg-subtle` | gray-100 | gray-800 | 控えめな背景 |
31
+ | `bg-bg-mute` | gray-200 | gray-700 | ホバー状態用 |
32
+ | `bg-bg-emphasize` | gray-300 | gray-600 | アクティブ状態用 |
33
+ | `bg-bg-inverse` | gray-900 | white | 反転背景 |
34
+
35
+ ## セマンティックカラー(ボーダー)
36
+
37
+ | Tailwind クラス | Light | Dark | 用途 |
38
+ | ------------------------- | -------- | -------- | -------------- |
39
+ | `border-border-base` | gray-400 | gray-600 | 標準ボーダー |
40
+ | `border-border-subtle` | gray-100 | gray-900 | 薄いボーダー |
41
+ | `border-border-mute` | gray-200 | gray-800 | 控えめボーダー |
42
+ | `border-border-emphasize` | gray-500 | gray-500 | 強調ボーダー |
43
+
44
+ ## ブランドカラー(Primary: Teal)
45
+
46
+ | Tailwind クラス | Light | Dark | 用途 |
47
+ | ----------------------- | -------- | -------- | ------------------- |
48
+ | `text-primary-fg` | teal-700 | teal-300 | Primary テキスト |
49
+ | `bg-primary-bg` | teal-300 | teal-700 | Primary 背景 |
50
+ | `bg-primary-bg-subtle` | teal-100 | teal-900 | 薄い Primary 背景 |
51
+ | `bg-primary-bg-mute` | teal-200 | teal-800 | 控えめ Primary 背景 |
52
+ | `border-primary-border` | teal-600 | teal-600 | Primary ボーダー |
53
+
54
+ ## ブランドカラー(Secondary: Cyan)
55
+
56
+ | Tailwind クラス | Light | Dark | 用途 |
57
+ | ------------------------- | -------- | -------- | ------------------- |
58
+ | `text-secondary-fg` | cyan-700 | cyan-300 | Secondary テキスト |
59
+ | `bg-secondary-bg` | cyan-300 | cyan-700 | Secondary 背景 |
60
+ | `bg-secondary-bg-subtle` | cyan-100 | cyan-900 | 薄い Secondary 背景 |
61
+ | `border-secondary-border` | cyan-600 | cyan-600 | Secondary ボーダー |
62
+
63
+ ## 使い方の例
64
+
65
+ ```tsx
66
+ // 基本的なカード風レイアウト
67
+ <div className="bg-bg-base border border-border-mute rounded-lg p-6">
68
+ <h2 className="text-fg-base font-bold">タイトル</h2>
69
+ <p className="text-fg-mute mt-2">補足テキスト</p>
70
+ <span className="text-primary-fg">アクセントテキスト</span>
71
+ </div>
72
+
73
+ // ホバー状態
74
+ <button className="bg-bg-base hover:bg-bg-mute transition-colors">
75
+ ボタン
76
+ </button>
77
+ ```
78
+
79
+ ## やってはいけないこと
80
+
81
+ - グラデーション背景(`bg-gradient-to-*`)
82
+ - 彩度の高い色の広範囲使用(アクセントは小面積で)
83
+ - 透明度による状態表現(`/90`, `/80` など)— 専用のセマンティックカラーを使う
84
+ - ホバーに `bg-primary-bg` を使う — `bg-bg-mute` を優先
85
+ - 生のカラー値(`bg-teal-500`)— セマンティックトークンを使う
86
+ - ダークモードで単純にカラーを反転させる