@cakejp/design-system 0.17.0 → 0.19.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/CHANGELOG.md +59 -0
- package/CLAUDE.md +15 -0
- package/contracts/components.json +144 -16
- package/contracts/composition.json +1 -1
- package/contracts/rules.json +5 -1
- package/contracts/screen-patterns.json +1 -1
- package/dist/components/ec/admin-shell.js +7 -6
- package/dist/components/ec/product-card.js +107 -102
- package/dist/components/ec/product-option.js +1 -0
- package/dist/components/ec/review-card.js +22 -20
- package/dist/components/ec/review-form.js +1 -0
- package/dist/components/foundations/accordion.js +23 -22
- package/dist/components/foundations/alert.js +1 -0
- package/dist/components/foundations/aspect-ratio.js +3 -2
- package/dist/components/foundations/avatar.js +1 -0
- package/dist/components/foundations/button.js +7 -1
- package/dist/components/foundations/calendar.js +1 -0
- package/dist/components/foundations/checkbox-group.js +1 -0
- package/dist/components/foundations/checkbox.js +1 -0
- package/dist/components/foundations/command.js +1 -0
- package/dist/components/foundations/context-menu.js +1 -0
- package/dist/components/foundations/drawer.js +1 -0
- package/dist/components/foundations/file-input.js +1 -0
- package/dist/components/foundations/form.js +26 -25
- package/dist/components/foundations/pagination.js +49 -46
- package/dist/components/foundations/popover.js +9 -8
- package/dist/components/foundations/radio-group.js +3 -2
- package/dist/components/foundations/responsive-dialog.js +1 -0
- package/dist/components/foundations/separator.js +7 -6
- package/dist/components/foundations/sheet.js +40 -33
- package/dist/components/foundations/slider.js +7 -6
- package/dist/components/foundations/social-icon.js +30 -10
- package/dist/components/foundations/sonner.js +5 -4
- package/dist/components/foundations/tabs.js +45 -25
- package/dist/components/foundations/toggle-group.js +6 -5
- package/dist/components/primitives/admin-side-nav.js +1 -0
- package/dist/components/primitives/chat-composer.js +1 -0
- package/dist/components/primitives/combobox.js +1 -0
- package/dist/components/primitives/content-card.js +111 -0
- package/dist/components/primitives/content-carousel.js +9 -8
- package/dist/components/primitives/date-picker.js +9 -8
- package/dist/components/primitives/footer.js +169 -100
- package/dist/components/primitives/form-field.js +1 -0
- package/dist/components/primitives/header.js +220 -176
- package/dist/components/primitives/image-carousel.js +8 -7
- package/dist/components/primitives/image-gallery.js +15 -14
- package/dist/components/primitives/image-input.js +9 -8
- package/dist/components/primitives/list-item.js +9 -8
- package/dist/components/primitives/menu-drawer.js +60 -56
- package/dist/components/primitives/multi-select.js +7 -6
- package/dist/components/primitives/number-input.js +1 -0
- package/dist/components/primitives/prose.js +52 -0
- package/dist/components/primitives/search-bar.js +81 -66
- package/dist/components/primitives/section-header.js +58 -55
- package/dist/components/primitives/share-buttons.js +93 -85
- package/dist/components/primitives/status-count-tabs.js +8 -7
- package/dist/components/primitives/sub-nav.js +52 -52
- package/dist/index.css +1 -1
- package/dist/index.js +1785 -831
- package/dist/lib/field-labelling.js +7 -6
- package/dist/lib/link-component.js +6 -0
- package/dist/lib/use-value-length.js +1 -0
- package/dist/types/components/ec/_mypage-menu-data.d.ts +3 -3
- package/dist/types/components/ec/admin-shell.d.ts +1 -1
- package/dist/types/components/ec/anniversary-card.d.ts +1 -1
- package/dist/types/components/ec/mypage-shell.d.ts +3 -3
- package/dist/types/components/ec/product-card.d.ts +13 -20
- package/dist/types/components/ec/product-carousel.d.ts +3 -3
- package/dist/types/components/ec/review-card.d.ts +6 -1
- package/dist/types/components/ec/stat-card.d.ts +1 -1
- package/dist/types/components/foundations/alert-dialog.d.ts +1 -1
- package/dist/types/components/foundations/button.d.ts +1 -1
- package/dist/types/components/foundations/calendar.d.ts +1 -1
- package/dist/types/components/foundations/checkbox-group.d.ts +1 -1
- package/dist/types/components/foundations/chip-variants.d.ts +1 -1
- package/dist/types/components/foundations/command.d.ts +1 -1
- package/dist/types/components/foundations/data-table.d.ts +9 -1
- package/dist/types/components/foundations/field.d.ts +2 -2
- package/dist/types/components/foundations/file-input.d.ts +1 -1
- package/dist/types/components/foundations/pagination.d.ts +8 -2
- package/dist/types/components/foundations/responsive-dialog.d.ts +1 -1
- package/dist/types/components/foundations/sheet.d.ts +6 -1
- package/dist/types/components/foundations/skip-link.d.ts +1 -1
- package/dist/types/components/foundations/social-icon.d.ts +1 -1
- package/dist/types/components/foundations/tabs.d.ts +2 -1
- package/dist/types/components/primitives/admin-header.d.ts +1 -1
- package/dist/types/components/primitives/admin-side-nav.d.ts +1 -1
- package/dist/types/components/primitives/banner-carousel.d.ts +2 -2
- package/dist/types/components/primitives/category-scroll.d.ts +2 -2
- package/dist/types/components/primitives/category-shortcuts.d.ts +1 -1
- package/dist/types/components/primitives/chat-composer.d.ts +1 -1
- package/dist/types/components/primitives/chip.d.ts +1 -1
- package/dist/types/components/primitives/content-card.d.ts +67 -0
- package/dist/types/components/primitives/content-carousel.d.ts +1 -1
- package/dist/types/components/primitives/footer.d.ts +21 -1
- package/dist/types/components/primitives/form-field.d.ts +1 -1
- package/dist/types/components/primitives/header.d.ts +30 -2
- package/dist/types/components/primitives/image-input.d.ts +1 -1
- package/dist/types/components/primitives/kebab-menu.d.ts +1 -1
- package/dist/types/components/primitives/menu-drawer.d.ts +7 -1
- package/dist/types/components/primitives/notification-list.d.ts +1 -1
- package/dist/types/components/primitives/prose.d.ts +35 -0
- package/dist/types/components/primitives/search-bar.d.ts +14 -1
- package/dist/types/components/primitives/search-panel.d.ts +1 -1
- package/dist/types/components/primitives/section-header.d.ts +2 -1
- package/dist/types/components/primitives/section-nav.d.ts +1 -1
- package/dist/types/components/primitives/share-buttons.d.ts +26 -4
- package/dist/types/components/primitives/side-nav.d.ts +1 -1
- package/dist/types/components/primitives/social-login-button.d.ts +1 -1
- package/dist/types/components/primitives/sub-nav.d.ts +16 -1
- package/dist/types/index.d.ts +4 -0
- package/dist/types/lib/link-component.d.ts +26 -0
- package/package.json +10 -5
- package/src/components/COMPONENT_LOOKUP.md +7 -5
- package/src/preset-standalone.css +1 -0
- package/src/preset.css +8 -0
- package/src/styles/semantic.css +1 -0
- package/tokens.json +8 -1
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* ヘッダー内側の最大幅。`Container` の同名 size と同じ値を使う(値の正本は Container)。
|
|
4
|
+
* 本文を `Container size="page"` で中央寄せしているサイトで、ロゴ・ナビの左端を本文に揃える。
|
|
5
|
+
*/
|
|
6
|
+
export type HeaderContainerSize = "page" | "wide" | "fluid";
|
|
2
7
|
export interface HeaderAction {
|
|
3
8
|
/** アイコン要素 */
|
|
4
9
|
icon: React.ReactNode;
|
|
@@ -14,6 +19,12 @@ export interface HeaderAction {
|
|
|
14
19
|
href?: string;
|
|
15
20
|
/** バッジ数(通知やカート件数) */
|
|
16
21
|
badge?: React.ReactNode;
|
|
22
|
+
/**
|
|
23
|
+
* `label` をアイコンの右に可視テキストとして出す(既定 false = アイコンのみ)。
|
|
24
|
+
* 「ログイン」等、文字が無いと意味が伝わりにくい導線に使う。
|
|
25
|
+
* true のときは正方形のアイコンボタンではなく、枠線付きのピル型で描画する。
|
|
26
|
+
*/
|
|
27
|
+
showLabel?: boolean;
|
|
17
28
|
}
|
|
18
29
|
export interface HeaderNavItem {
|
|
19
30
|
/** 表示ラベル */
|
|
@@ -56,7 +67,7 @@ export interface HeaderProps extends React.HTMLAttributes<HTMLElement> {
|
|
|
56
67
|
/**
|
|
57
68
|
* インラインナビ(navItems / searchSlot 行)を出し始めるコンテナ幅。
|
|
58
69
|
* - `md`(既定): `@[768px]`+
|
|
59
|
-
* - `lg` : `@[
|
|
70
|
+
* - `lg` : `@[960px]`+(ロゴが多段で横幅を食う等、中幅での同居を避けたいとき)
|
|
60
71
|
* 未満の幅では SP 行(ロゴ + actions)になる。
|
|
61
72
|
*/
|
|
62
73
|
navBreakpoint?: "md" | "lg";
|
|
@@ -70,6 +81,16 @@ export interface HeaderProps extends React.HTMLAttributes<HTMLElement> {
|
|
|
70
81
|
* navItems が無く searchSlot だけを渡した場合も PC 行を描画する。
|
|
71
82
|
*/
|
|
72
83
|
searchSlot?: React.ReactNode;
|
|
84
|
+
/**
|
|
85
|
+
* `searchSlot` を出し始めるコンテナ幅(既定はインラインナビ行と同じ)。
|
|
86
|
+
* tokens.json の切替段に一致する `md`(768px)/ `lg`(960px)のみ。
|
|
87
|
+
* `xl`(1280) はコンテンツ上限段でレイアウトの切替段ではないため受け付けない。
|
|
88
|
+
*
|
|
89
|
+
* 中身を consumer 側の CSS で隠しても、このスロットの器は `flex-1` の幅を
|
|
90
|
+
* 確保し続けてインラインナビを潰す(#243)。狭い帯で検索を出さない場合は
|
|
91
|
+
* CSS ではなくこの prop で器ごと畳むこと。
|
|
92
|
+
*/
|
|
93
|
+
searchBreakpoint?: "md" | "lg";
|
|
73
94
|
/** 右側に配置するカスタム要素(variant="back"で使用) */
|
|
74
95
|
rightSlot?: React.ReactNode;
|
|
75
96
|
/** 検索バーなど中央に配置するカスタム要素(variant="back-search"で使用) */
|
|
@@ -82,6 +103,13 @@ export interface HeaderProps extends React.HTMLAttributes<HTMLElement> {
|
|
|
82
103
|
bottomSlot?: React.ReactNode;
|
|
83
104
|
/** sticky 配置を無効化 */
|
|
84
105
|
disableSticky?: boolean;
|
|
106
|
+
/**
|
|
107
|
+
* ヘッダー内側の最大幅(`Container` と同じ段)。
|
|
108
|
+
* 指定すると背景・border・sticky は全幅のまま、**中身だけ**を中央寄せする。
|
|
109
|
+
* 本文を `Container size="page"` で組んでいるサイトで、ロゴ・ナビの左端が本文と揃う。
|
|
110
|
+
* 未指定なら従来どおり全幅(DOM も従来どおりで内側ラッパーを足さない)。
|
|
111
|
+
*/
|
|
112
|
+
containerSize?: HeaderContainerSize;
|
|
85
113
|
}
|
|
86
114
|
/**
|
|
87
115
|
* ページヘッダー
|
|
@@ -89,5 +117,5 @@ export interface HeaderProps extends React.HTMLAttributes<HTMLElement> {
|
|
|
89
117
|
* アプリ全体で使われるヘッダーの3パターンを1コンポーネントで提供。
|
|
90
118
|
* ロゴ+アクション、戻るボタン+タイトル、戻るボタン+検索の3バリエーション。
|
|
91
119
|
*/
|
|
92
|
-
declare function Header({ className, variant, logo, title, onBack, backLabel, actions, navItems, navBreakpoint, navOverflowLabel, searchSlot, rightSlot, centerSlot, bottomSlot, disableSticky, ...props }: HeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
120
|
+
declare function Header({ className, variant, logo, title, onBack, backLabel, actions, navItems, navBreakpoint, navOverflowLabel, searchSlot, searchBreakpoint, rightSlot, centerSlot, bottomSlot, disableSticky, containerSize, ...props }: HeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
93
121
|
export { Header };
|
|
@@ -93,7 +93,7 @@ export interface ImageInputProps extends VariantProps<typeof imageInputPreviewVa
|
|
|
93
93
|
*
|
|
94
94
|
* ### インポート
|
|
95
95
|
* ```tsx
|
|
96
|
-
* import { ImageInput } from "
|
|
96
|
+
* import { ImageInput } from "../../components/primitives/image-input"
|
|
97
97
|
* ```
|
|
98
98
|
*
|
|
99
99
|
* ### 表示サイズ
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
+
import { type LinkComponent } from "../../lib/link-component";
|
|
2
3
|
export interface MenuSection {
|
|
3
4
|
/** セクションタイトル */
|
|
4
5
|
title?: string;
|
|
@@ -38,6 +39,11 @@ export interface MenuBanner {
|
|
|
38
39
|
href?: string;
|
|
39
40
|
}
|
|
40
41
|
export interface MenuDrawerProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
42
|
+
/**
|
|
43
|
+
* リンクの描画に使うコンポーネント(既定 `a`)。
|
|
44
|
+
* `next/link` 等を渡すとクライアント遷移になる(#236)。
|
|
45
|
+
*/
|
|
46
|
+
linkComponent?: LinkComponent;
|
|
41
47
|
/** ユーザー名(ログイン時) */
|
|
42
48
|
userName?: string;
|
|
43
49
|
/** ログイン状態 */
|
|
@@ -55,5 +61,5 @@ export interface MenuDrawerProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
55
61
|
/** ログインリンクのhref(デフォルト: /security/login_link/) */
|
|
56
62
|
loginHref?: string;
|
|
57
63
|
}
|
|
58
|
-
declare function MenuDrawer({ userName, isLoggedIn, hideLoginLink, sections, banners, onClose, onLogin, loginHref, className, ...props }: MenuDrawerProps): import("react/jsx-runtime").JSX.Element;
|
|
64
|
+
declare function MenuDrawer({ userName, isLoggedIn, hideLoginLink, sections, banners, onClose, onLogin, loginHref, className, linkComponent, ...props }: MenuDrawerProps): import("react/jsx-runtime").JSX.Element;
|
|
59
65
|
export { MenuDrawer };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
export interface ProseProps extends React.HTMLAttributes<HTMLElement> {
|
|
3
|
+
/**
|
|
4
|
+
* CMS(microCMS 等)のリッチテキスト HTML。
|
|
5
|
+
*
|
|
6
|
+
* **サニタイズ済みの HTML だけを渡すこと。** この部品は体裁を当てるだけで、
|
|
7
|
+
* 中身の無害化は行わない(`dangerouslySetInnerHTML` に素通しする)。
|
|
8
|
+
* 未指定なら `children` をそのまま包む。
|
|
9
|
+
*/
|
|
10
|
+
html?: string;
|
|
11
|
+
/** ラップする要素(既定 `div`。記事本文なら `article`) */
|
|
12
|
+
as?: "div" | "article" | "section";
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 記事本文の体裁(見出し・段落・リスト・引用・表・画像・リンク)をトークンで揃える。
|
|
16
|
+
*
|
|
17
|
+
* 各要素の余白・サイズ・線・色を 1 箇所に集約し、記事メディアごとに CSS Modules を
|
|
18
|
+
* 書き分けて見た目がばらつくのを防ぐ。`Container size="narrow"`(760px)と
|
|
19
|
+
* 組み合わせて使う前提の行長になっている。
|
|
20
|
+
*
|
|
21
|
+
* ### AI 向け使用ルール
|
|
22
|
+
*
|
|
23
|
+
* - CMS のリッチテキストを描くときは、consumer 側で `h2` / `p` / `ul` の CSS を書かず
|
|
24
|
+
* これを使う(`ArticleBody.module.css` のような独自 CSS を作らない)
|
|
25
|
+
* - `html` に渡す HTML は **利用側でサニタイズ済み**であること
|
|
26
|
+
* - 記事幅は `Container size="narrow"` で決める。この部品は幅を持たない
|
|
27
|
+
* - 見出しレベルは CMS の出力に従う(この部品は体裁だけを当て、階層は変えない)
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* <Container size="narrow">
|
|
31
|
+
* <Prose as="article" html={sanitizedHtml} />
|
|
32
|
+
* </Container>
|
|
33
|
+
*/
|
|
34
|
+
declare function Prose({ className, html, as: Comp, children, ...props }: ProseProps): import("react/jsx-runtime").JSX.Element;
|
|
35
|
+
export { Prose };
|
|
@@ -6,6 +6,17 @@ export interface SearchBarProps extends Omit<React.InputHTMLAttributes<HTMLInput
|
|
|
6
6
|
size?: "sm" | "md";
|
|
7
7
|
/** 検索リンクURL({query} はクエリに置換) */
|
|
8
8
|
searchHref?: string;
|
|
9
|
+
/**
|
|
10
|
+
* 指定すると `<form method="get" action={action}>` として描画し、素のフォーム送信で遷移する。
|
|
11
|
+
* JS を必要としないので、スクリプト無効環境やクローラでも検索が成立する(SEO 重視のサイト向け)。
|
|
12
|
+
* 送信するクエリのキーは `name`(既定 `"q"`)。`searchHref` とは併用しない(`action` が優先)。
|
|
13
|
+
*/
|
|
14
|
+
action?: string;
|
|
15
|
+
/**
|
|
16
|
+
* 送信するクエリのキー(`action` 指定時の既定 `"q"`)。
|
|
17
|
+
* そのまま input の `name` 属性になる。
|
|
18
|
+
*/
|
|
19
|
+
name?: string;
|
|
9
20
|
}
|
|
10
21
|
/**
|
|
11
22
|
* 検索バーコンポーネント
|
|
@@ -25,7 +36,9 @@ export interface SearchBarProps extends Omit<React.InputHTMLAttributes<HTMLInput
|
|
|
25
36
|
* - `size="sm"` はコンパクトなヘッダー向け
|
|
26
37
|
* - `size="md"` は検索専用ページ向け
|
|
27
38
|
* - `onSearch` で検索クエリを受け取る
|
|
28
|
-
* - `searchHref`
|
|
39
|
+
* - `searchHref` で検索結果ページへの遷移リンクを生成(JS が必要)
|
|
40
|
+
* - **JS 無効環境・SEO を考慮するサイトは `action` を使う**。`<form method="get">` として
|
|
41
|
+
* 描画され、素のフォーム送信で遷移する(`Input` + `Button` で `<form>` を手組みしない)
|
|
29
42
|
*/
|
|
30
43
|
declare const SearchBar: React.ForwardRefExoticComponent<SearchBarProps & React.RefAttributes<HTMLInputElement>>;
|
|
31
44
|
export { SearchBar };
|
|
@@ -58,7 +58,8 @@ export interface SectionHeaderProps extends React.HTMLAttributes<HTMLDivElement>
|
|
|
58
58
|
* - セクション見出し(ランキング等): `size="xl"` or `size="lg"`(デフォルト)
|
|
59
59
|
* - 小見出し・グループラベル: `size="md"` or `size="sm"`
|
|
60
60
|
* - `as` で見出しレベルを上書き可能(同一ページに h1 が複数必要な場合など)
|
|
61
|
-
* - `moreHref`
|
|
61
|
+
* - `moreHref` 指定時はタイトル行がリンクになる(クリック領域拡大)。`subtitle` は
|
|
62
|
+
* 右側アクションの下も含めた全幅で折り返すため、リンクの外に置く(issue #232)
|
|
62
63
|
* - `action` に任意の ReactNode(Button 等)を渡して右側にアクションを配置可能
|
|
63
64
|
* - `align="center"` でランディング/ガイド系の中央寄せ大見出しに切替(`eyebrow` に Badge 等を載せられる)
|
|
64
65
|
*/
|
|
@@ -43,7 +43,7 @@ export interface SectionNavProps extends React.HTMLAttributes<HTMLElement> {
|
|
|
43
43
|
*
|
|
44
44
|
* ### インポート
|
|
45
45
|
* ```tsx
|
|
46
|
-
* import { SectionNav } from '
|
|
46
|
+
* import { SectionNav } from '../../components/primitives/section-nav'
|
|
47
47
|
* ```
|
|
48
48
|
*
|
|
49
49
|
* ### 使い方(vertical=既定)
|
|
@@ -1,9 +1,29 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
+
/** 組み込みの共有先 */
|
|
3
|
+
export type ShareService = "line" | "x" | "facebook" | "hatena" | "copy";
|
|
4
|
+
/** 組み込みに無い共有先を足すための指定 */
|
|
5
|
+
export interface ShareCustomService {
|
|
6
|
+
/** 一意なキー(React の key に使う) */
|
|
7
|
+
key: string;
|
|
8
|
+
/** ボタンの可視ラベル */
|
|
9
|
+
label: string;
|
|
10
|
+
/** 共有先 URL。`{url}` / `{text}` は共有対象に置換される(どちらも URL エンコード済み) */
|
|
11
|
+
href: string;
|
|
12
|
+
/** ラベル左のアイコン */
|
|
13
|
+
icon?: React.ReactNode;
|
|
14
|
+
/** 読み上げ名(未指定ならラベルをそのまま使う) */
|
|
15
|
+
ariaLabel?: string;
|
|
16
|
+
}
|
|
2
17
|
export interface ShareButtonsProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onCopy"> {
|
|
3
18
|
/** シェアURL */
|
|
4
19
|
url?: string;
|
|
5
20
|
/** シェアテキスト */
|
|
6
21
|
text?: string;
|
|
22
|
+
/**
|
|
23
|
+
* 表示する共有先と並び順(既定 `["line", "x", "copy"]`)。
|
|
24
|
+
* 組み込みに無い共有先は `ShareCustomService` を混ぜて足す。
|
|
25
|
+
*/
|
|
26
|
+
services?: Array<ShareService | ShareCustomService>;
|
|
7
27
|
/** コピーボタンのラベル */
|
|
8
28
|
copyLabel?: string;
|
|
9
29
|
/** コピー成功時に一時表示するラベル(約2秒) */
|
|
@@ -16,14 +36,16 @@ export interface ShareButtonsProps extends Omit<React.HTMLAttributes<HTMLDivElem
|
|
|
16
36
|
/**
|
|
17
37
|
* シェアボタンコンポーネント
|
|
18
38
|
*
|
|
19
|
-
*
|
|
20
|
-
* LINE、X(Twitter)、URLコピーに対応。
|
|
39
|
+
* 記事や商品を SNS・URL コピーで共有するためのボタン群。
|
|
21
40
|
*
|
|
22
41
|
* ### AI 向け使用ルール
|
|
23
42
|
*
|
|
24
|
-
* -
|
|
43
|
+
* - 商品詳細ページ・記事ページの共有セクションに使用
|
|
25
44
|
* - `url` と `text` でシェア内容を指定
|
|
45
|
+
* - 共有先は `services` で選ぶ(既定は LINE / X / コピー)。
|
|
46
|
+
* **同じ意匠を `Button asChild` で組み直さない**
|
|
47
|
+
* - 組み込みに無い共有先は `services` に `{ key, label, href, icon }` を混ぜて足す
|
|
26
48
|
* - ボタンは横並び、等幅表示
|
|
27
49
|
*/
|
|
28
|
-
declare function ShareButtons({ className, url, text, copyLabel, copiedLabel, copyErrorLabel, onCopy, ...props }: ShareButtonsProps): import("react/jsx-runtime").JSX.Element;
|
|
50
|
+
declare function ShareButtons({ className, url, text, services, copyLabel, copiedLabel, copyErrorLabel, onCopy, ...props }: ShareButtonsProps): import("react/jsx-runtime").JSX.Element;
|
|
29
51
|
export { ShareButtons };
|
|
@@ -51,7 +51,7 @@ export interface SideNavProps extends React.HTMLAttributes<HTMLElement> {
|
|
|
51
51
|
*
|
|
52
52
|
* ### インポート
|
|
53
53
|
* ```tsx
|
|
54
|
-
* import { SideNav } from '
|
|
54
|
+
* import { SideNav } from '../../components/primitives/side-nav'
|
|
55
55
|
* ```
|
|
56
56
|
*
|
|
57
57
|
* ### 使い方
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import { type SocialPlatform } from "
|
|
2
|
+
import { type SocialPlatform } from "../../components/foundations/social-icon";
|
|
3
3
|
export type SocialProvider = Extract<SocialPlatform, "line" | "amazon" | "google" | "apple">;
|
|
4
4
|
export interface SocialLoginButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
5
5
|
/** ソーシャルプロバイダー */
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
+
import { type LinkComponent } from "../../lib/link-component";
|
|
2
3
|
export interface SubNavItem {
|
|
3
4
|
/** 表示ラベル */
|
|
4
5
|
label: string;
|
|
@@ -10,10 +11,22 @@ export interface SubNavItem {
|
|
|
10
11
|
isActive?: boolean;
|
|
11
12
|
}
|
|
12
13
|
export interface SubNavProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
14
|
+
/**
|
|
15
|
+
* リンクの描画に使うコンポーネント(既定 `a`)。
|
|
16
|
+
* `next/link` 等を渡すとクライアント遷移になる(#236)。
|
|
17
|
+
*/
|
|
18
|
+
linkComponent?: LinkComponent;
|
|
13
19
|
/** ナビゲーション項目 */
|
|
14
20
|
items: SubNavItem[];
|
|
15
21
|
/** スタイルバリアント */
|
|
16
22
|
variant?: "text" | "chip";
|
|
23
|
+
/**
|
|
24
|
+
* ナビ内側の最大幅(`Container` と同じ段)。
|
|
25
|
+
* 指定すると下線(border)は全幅のまま、**中身だけ**を中央寄せする。
|
|
26
|
+
* 本文を `Container size="page"` で組んでいるサイトで、項目の左端が本文と揃う。
|
|
27
|
+
* 未指定なら従来どおり全幅(DOM も従来どおりで内側ラッパーを足さない)。
|
|
28
|
+
*/
|
|
29
|
+
containerSize?: "page" | "wide" | "fluid";
|
|
17
30
|
}
|
|
18
31
|
/**
|
|
19
32
|
* ナビゲーションリボンコンポーネント
|
|
@@ -29,6 +42,8 @@ export interface SubNavProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
29
42
|
* - アクティブ項目は `isActive: true` で下線を強調
|
|
30
43
|
* - テキスト色: アクティブ = 黒(High-Emphasis)、非アクティブ = グレー(Medium-Emphasis)
|
|
31
44
|
* - 必ず `overflow-x-auto` + `scrollbar-hide` で横スクロール対応
|
|
45
|
+
* - 左右の余白は `Container` と同じ(SP 16 / PC 24)。本文を `Container` で中央寄せしている
|
|
46
|
+
* サイトでは `containerSize="page"` を指定すると項目の左端が本文と揃う
|
|
32
47
|
*/
|
|
33
|
-
declare function SubNav({ className, items, variant, ...props }: SubNavProps): import("react/jsx-runtime").JSX.Element;
|
|
48
|
+
declare function SubNav({ className, items, variant, linkComponent, containerSize, ...props }: SubNavProps): import("react/jsx-runtime").JSX.Element;
|
|
34
49
|
export { SubNav };
|
package/dist/types/index.d.ts
CHANGED
|
@@ -91,6 +91,10 @@ export { ChatComposer } from "./components/primitives/chat-composer";
|
|
|
91
91
|
export type { ChatComposerProps, ChatComposerAttachmentError } from "./components/primitives/chat-composer";
|
|
92
92
|
export { Chip, chipVariants } from "./components/primitives/chip";
|
|
93
93
|
export type { ChipProps } from "./components/primitives/chip";
|
|
94
|
+
export { Prose } from "./components/primitives/prose";
|
|
95
|
+
export type { ProseProps } from "./components/primitives/prose";
|
|
96
|
+
export { ContentCard, ContentList } from "./components/primitives/content-card";
|
|
97
|
+
export type { ContentCardProps, ContentCardOrientation, ContentCardAspect, } from "./components/primitives/content-card";
|
|
94
98
|
export { StandardPageShell } from "./components/primitives/standard-page-shell";
|
|
95
99
|
export type { StandardPageShellProps } from "./components/primitives/standard-page-shell";
|
|
96
100
|
/**
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* リンクの描画に使うコンポーネント(#236)
|
|
4
|
+
*
|
|
5
|
+
* DS 内でリンクを複数描く部品(Footer / MenuDrawer / SubNav / Pagination)は
|
|
6
|
+
* 素の `<a>` を描くため、Next.js の `next/link` 等を差し込めずクライアント遷移に
|
|
7
|
+
* ならない。`asChild` は複数リンクを内部で描く部品には向かないため、
|
|
8
|
+
* 「リンク実装そのもの」を差し替える prop を共通の型で用意する。
|
|
9
|
+
*
|
|
10
|
+
* 例: `<Footer linkComponent={Link} … />`(next/link をそのまま渡せる)
|
|
11
|
+
*/
|
|
12
|
+
export type LinkComponent = React.ComponentType<React.AnchorHTMLAttributes<HTMLAnchorElement> & {
|
|
13
|
+
href: string;
|
|
14
|
+
}>;
|
|
15
|
+
/**
|
|
16
|
+
* 実際に使うリンク実装を決める。
|
|
17
|
+
*
|
|
18
|
+
* 外部リンク(`target="_blank"` を付けるもの)は framework のリンク部品に通す
|
|
19
|
+
* 意味が無いため、常に素の `<a>` にフォールバックする。
|
|
20
|
+
*
|
|
21
|
+
* `isExternal` を渡せるのは、項目に `external` フラグを持つ `Footer` だけ。
|
|
22
|
+
* MenuDrawer / SubNav / Pagination の項目に `external` は無く、渡した href は
|
|
23
|
+
* すべて `linkComponent` で描かれる(外部 URL を出し分けたい場合は consumer 側で
|
|
24
|
+
* ラップする)。
|
|
25
|
+
*/
|
|
26
|
+
export declare function resolveLinkComponent(linkComponent: LinkComponent | undefined, isExternal?: boolean): React.ElementType;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cakejp/design-system",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.19.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Cake.jp Design System — UI コンポーネント・カラートークン・タイポグラフィ",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"module": "./dist/index.js",
|
|
29
29
|
"types": "./dist/types/index.d.ts",
|
|
30
30
|
"bin": {
|
|
31
|
-
"cakejp-ds": "
|
|
31
|
+
"cakejp-ds": "bin/init.js"
|
|
32
32
|
},
|
|
33
33
|
"files": [
|
|
34
34
|
"CHANGELOG.md",
|
|
@@ -96,10 +96,11 @@
|
|
|
96
96
|
"generate:lint-rules": "node scripts/generate-lint-rules.mjs",
|
|
97
97
|
"generate:lookup": "node scripts/generate-component-lookup.mjs",
|
|
98
98
|
"lint:contrast": "node scripts/check-contrast.mjs",
|
|
99
|
-
"check": "tsc --noEmit -p tsconfig.app.json && npm run typecheck:stories && bash scripts/check-deps.sh && bash scripts/check-drift.sh && bash scripts/check-docs-drift.sh && bash scripts/lint-scratch.sh && bash scripts/check-story-reuse.sh && bash scripts/check-responsive.sh && node scripts/check-border-color.mjs && npm run lint:contrast && bash scripts/lint-scratch.sh --components && bash scripts/check-generated-drift.sh",
|
|
99
|
+
"check": "tsc --noEmit -p tsconfig.app.json && npm run typecheck:stories && bash scripts/check-deps.sh && bash scripts/check-drift.sh && bash scripts/check-docs-drift.sh && bash scripts/lint-scratch.sh && bash scripts/check-story-reuse.sh && bash scripts/check-responsive.sh && node scripts/check-border-color.mjs && npm run lint:contrast && bash scripts/lint-scratch.sh --components && bash scripts/check-generated-drift.sh && bash scripts/check-agents-mirror.sh",
|
|
100
100
|
"test": "vitest run --config vitest.config.ts",
|
|
101
101
|
"test:interaction": "vitest run --config vitest.storybook.config.ts",
|
|
102
|
-
"test:a11y": "vitest run --config vitest.a11y.config.ts"
|
|
102
|
+
"test:a11y": "vitest run --config vitest.a11y.config.ts",
|
|
103
|
+
"check:consumer-types": "node scripts/check-consumer-types.mjs"
|
|
103
104
|
},
|
|
104
105
|
"dependencies": {
|
|
105
106
|
"class-variance-authority": "^0.7.1",
|
|
@@ -181,5 +182,9 @@
|
|
|
181
182
|
"vite": "^7.3.1",
|
|
182
183
|
"vitest": "^4.1.0",
|
|
183
184
|
"zod": "^4.3.6"
|
|
184
|
-
}
|
|
185
|
+
},
|
|
186
|
+
"directories": {
|
|
187
|
+
"doc": "docs"
|
|
188
|
+
},
|
|
189
|
+
"author": ""
|
|
185
190
|
}
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
| Spinner | `@/components/foundations/spinner` | — | Default, Small, Large, InlineWithText, FullPage |
|
|
58
58
|
| Switch | `@/components/foundations/switch` | — | Default, ON 状態, 無効, サイズ比較, ブロック型, 通知設定例(リスト型) |
|
|
59
59
|
| Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption | `@/components/foundations/table` | — | Default, フッター付き, 商品比較例, カート注文サマリー |
|
|
60
|
-
| Tabs, TabsList, TabsTrigger, TabsContent | `@/components/foundations/tabs` | **variant**: `underbar`, `segment`<br>**scrollable**: `true` | Default(Underbar), タブ数バリエーション, 横スクロール(多数タブ), PC モード(文字幅ベース), Segment(ピル型), Segment 3択, interaction: クリックと矢印キーでの切り替え |
|
|
60
|
+
| Tabs, TabsList, TabsTrigger, TabsContent | `@/components/foundations/tabs` | **variant**: `underbar`, `segment`<br>**scrollable**: `true`<br>**size**: `md`, `sm` | Default(Underbar), タブ数バリエーション, 横スクロール(多数タブ), PC モード(文字幅ベース), Segment(ピル型), Segment 3択, 狭幅(サイドバー 266px), interaction: クリックと矢印キーでの切り替え |
|
|
61
61
|
| Textarea | `@/components/foundations/textarea` | — | Default, 無効, メッセージカード入力例, エラーパターン, レビュー投稿例, 文字数カウンタ |
|
|
62
62
|
| ToggleGroup, ToggleGroupItem | `@/components/foundations/toggle-group` | **width**: `fit`, `full`<br>**variant**: `default`, `outline`<br>**size**: `default`, `sm`, `lg`<br>**variant**: `default`, `outline`<br>**size**: `default`, `sm`, `lg` | Default, 複数選択, サイズ, アイコン付き, アイコンのみ, 無効 |
|
|
63
63
|
| Toggle | `@/components/foundations/toggle` | **variant**: `default`, `outline`<br>**size**: `default`, `sm`, `lg` | Default, TextFormatting, FavoriteToggle, Outline, Sizes |
|
|
@@ -81,6 +81,7 @@
|
|
|
81
81
|
| CoachMark | `@/components/primitives/coach-mark` | — | オンボーディング, 全方向, オンボーディング各方向 |
|
|
82
82
|
| Combobox | `@/components/primitives/combobox` | — | Default |
|
|
83
83
|
| Container | `@/components/primitives/container` | — | Default(page / default gutter), サイズ比較, gutter 比較 |
|
|
84
|
+
| ContentCard, ContentList | `@/components/primitives/content-card` | — | 縦(グリッド一覧), 一覧での高さ揃え, 横(画像が左), リスト(Medium 型), 長いタグラベル |
|
|
84
85
|
| ContentCarousel | `@/components/primitives/content-carousel` | — | ヒーローバナー, 自動再生(5秒), peek表示, 多列カード(PC 3枚), 1枚のみ |
|
|
85
86
|
| DatePicker, DateTimePicker | `@/components/primitives/date-picker` | — | 日付ピッカー, 初期値あり, 選択範囲を制限, 特定日を無効化, FormField 連携, 無効化, クリア可能(任意項目) |
|
|
86
87
|
| EmptyState | `@/components/primitives/empty-state` | — | お気に入り商品(空), カート(空), ブックマーク(空), 検索結果なし, 汎用(説明のみ) |
|
|
@@ -89,7 +90,7 @@
|
|
|
89
90
|
| Footer | `@/components/primitives/footer` | — | Default, 最小構成, SNSリンク付き, 決済方法付き |
|
|
90
91
|
| FormField | `@/components/primitives/form-field` | — | — |
|
|
91
92
|
| FunnelShell | `@/components/primitives/funnel-shell` | — | 注文内容の確認(ご購入手続き) |
|
|
92
|
-
| Header | `@/components/primitives/header` | — | ロゴ+アクション, ロゴ+未ログイン, ロゴ+グローバルナビ+検索スロット(PC), ロゴ+長いナビ(中幅で自動退避), ロゴ+ナビ(navBreakpoint=lg), ロゴセンター(決済・申し込み用), 戻る+タイトル, 戻る+検索バー, 戻る+右側アクション, カスタムロゴ |
|
|
93
|
+
| Header | `@/components/primitives/header` | — | ロゴ+アクション, ロゴ+未ログイン, ロゴ+グローバルナビ+検索スロット(PC), ロゴ+長いナビ(中幅で自動退避), ロゴ+ナビ(navBreakpoint=lg), containerSize=page(本文と左端を揃える), ロゴセンター(決済・申し込み用), 戻る+タイトル, 戻る+検索バー, 戻る+右側アクション, カスタムロゴ |
|
|
93
94
|
| ImageCarousel | `@/components/primitives/image-carousel` | — | バナーカルーセル, 横長バナー, 正方形(商品画像), OGP比率, 自動再生(3秒), PC幅(ビューポート切替で確認), トップページ ヒーローバナー |
|
|
94
95
|
| ImageGallery | `@/components/primitives/image-gallery` | — | ドット付き, サムネイル付き, バナー(16:9), PC商品詳細, 単一画像 |
|
|
95
96
|
| ImageInput | `@/components/primitives/image-input` | **aspect**: `square`, `landscape`<br>**size**: `sm`, `md`, `lg` | 基本, 保存済み画像あり, 表示サイズ, FormField 連携, 検証エラー, クリア不可, 無効化 |
|
|
@@ -103,12 +104,13 @@
|
|
|
103
104
|
| NumberInput, QuantitySelector | `@/components/primitives/number-input` | — | Default, コンパクト型(sm), サイズ比較, 最小・最大値, 無効状態, エラー状態, ゴミ箱アイコン, ゴミ箱+削除確認ダイアログ, 直接入力パターン, 商品詳細での使用例, カート内での使用例, 価格・在庫入力(管理画面), interaction: 増減と min/max のクランプ |
|
|
104
105
|
| PriceDisplay | `@/components/primitives/price-display` | — | Default, セール価格, サイズ比較, セール × サイズ, 税込ラベルなし, 高額商品, 価格レンジ |
|
|
105
106
|
| ProgressSteps | `@/components/primitives/progress-steps` | — | ステップ1(カート), ステップ2(注文内容), ステップ3(確認), ステップ4(完了), 全ステップ一覧, 会員登録フロー |
|
|
106
|
-
|
|
|
107
|
+
| Prose | `@/components/primitives/prose` | — | 記事本文(Container narrow と組み合わせ), children を包む, 幅の広い表(ページを横に伸ばさない) |
|
|
108
|
+
| SearchBar | `@/components/primitives/search-bar` | — | Default, Small(ヘッダー向け), form モード(JS 不要・SEO 向け), カスタムプレースホルダー |
|
|
107
109
|
| SearchPanel | `@/components/primitives/search-panel` | — | — |
|
|
108
|
-
| SectionHeader | `@/components/primitives/section-header` | — | Default, サブタイトル付き, リンクなし, カスタムラベル, カルーセルナビ付き, ナビのみ, ナビ(先頭位置), アクションボタン付き, サブタイトル + アクション, サイズ一覧, キャプション付きサイズ比較, align=, LPヒーロー(SP 3xl / PC 5xl), align=, start / center 比較 |
|
|
110
|
+
| SectionHeader | `@/components/primitives/section-header` | — | Default, サブタイトル付き, リンクなし, カスタムラベル, カルーセルナビ付き, ナビのみ, ナビ(先頭位置), アクションボタン付き, サブタイトル + アクション, 狭幅のサブタイトル + アクション, サイズ一覧, キャプション付きサイズ比較, align=, LPヒーロー(SP 3xl / PC 5xl), align=, start / center 比較 |
|
|
109
111
|
| SectionNav | `@/components/primitives/section-nav` | — | Vertical, Horizontal |
|
|
110
112
|
| Section | `@/components/primitives/section` | — | 推奨: Section + Container, 背景画像 + scrim, 背景バリアント, 縦 spacing バリアント, 配下 Card のサーフェス伝播, ランディング見出し |
|
|
111
|
-
| ShareButtons | `@/components/primitives/share-buttons` | — | Default,
|
|
113
|
+
| ShareButtons | `@/components/primitives/share-buttons` | — | Default, コピーフィードバック, 共有先を指定(Facebook / はてブ), 組み込みに無い共有先を足す |
|
|
112
114
|
| SideNav | `@/components/primitives/side-nav` | — | Default, WithGroupLabels, MypageExample, PrefixMatch |
|
|
113
115
|
| SocialLoginButton | `@/components/primitives/social-login-button` | — | LINE, フルサイズ一覧, アイコンのみ |
|
|
114
116
|
| StandardPageShell | `@/components/primitives/standard-page-shell` | — | 検索結果ページ |
|
package/src/preset.css
CHANGED
|
@@ -52,6 +52,14 @@
|
|
|
52
52
|
--container-md: 48rem; /* 768px — SP/PC 境界(切替段。本番と一致) */
|
|
53
53
|
--container-lg: 60rem; /* 960px — PC 中段(切替段。本番と一致) */
|
|
54
54
|
--container-xl: 80rem; /* 1280px — コンテンツ上限段(DS 定義。本番の切替段ではない) */
|
|
55
|
+
|
|
56
|
+
/* ビューポート用(consumer の md: / lg: / xl:)。コンテナクエリ段と同じ値に揃える。
|
|
57
|
+
Tailwind v4 既定の --breakpoint-lg は 64rem(1024px) で、DS の PC 中段 960px と
|
|
58
|
+
64px ずれる。preset が配らないと全 consumer が @theme で書き直す必要があり、
|
|
59
|
+
書き忘れたプロダクトだけ切替位置がずれる(issue #242)。 */
|
|
60
|
+
--breakpoint-md: 48rem; /* 768px — SP/PC 境界 */
|
|
61
|
+
--breakpoint-lg: 60rem; /* 960px — PC 中段 */
|
|
62
|
+
--breakpoint-xl: 80rem; /* 1280px — コンテンツ上限段 */
|
|
55
63
|
}
|
|
56
64
|
|
|
57
65
|
/* --- Theme: Tailwind integration --- */
|
package/src/styles/semantic.css
CHANGED
package/tokens.json
CHANGED
|
@@ -463,6 +463,10 @@
|
|
|
463
463
|
"x": {
|
|
464
464
|
"value": "#000000FF",
|
|
465
465
|
"usage": "Third-Party-X のCSS契約値"
|
|
466
|
+
},
|
|
467
|
+
"hatena": {
|
|
468
|
+
"value": "#00A4DEFF",
|
|
469
|
+
"usage": "Third-Party-Hatena のCSS契約値(はてなブックマーク)"
|
|
466
470
|
}
|
|
467
471
|
}
|
|
468
472
|
},
|
|
@@ -931,11 +935,12 @@
|
|
|
931
935
|
}
|
|
932
936
|
},
|
|
933
937
|
"breakpoints": {
|
|
934
|
-
"comment": "役割は二層。(1) 切替段=md / lg の2つだけ(値は本番 cakejp.css の境界に一致させた正本。レイアウトの変形はこの2段でのみ行う)。(2) 上限段=xl(1280。「切替段」ではなく DS が定めるコンテンツ幅の上限段。本番に 1280 の切替段は無い=1025/1441 はある)。DS 内部はコンテナクエリ @md: / @lg: / @xl:(preset.css の --container-md / --container-lg / --container-xl)で参照し、生 CSS ではこの px 値をメディアクエリに直書きする(CSS
|
|
938
|
+
"comment": "役割は二層。(1) 切替段=md / lg の2つだけ(値は本番 cakejp.css の境界に一致させた正本。レイアウトの変形はこの2段でのみ行う)。(2) 上限段=xl(1280。「切替段」ではなく DS が定めるコンテンツ幅の上限段。本番に 1280 の切替段は無い=1025/1441 はある)。DS 内部はコンテナクエリ @md: / @lg: / @xl:(preset.css の --container-md / --container-lg / --container-xl)で参照し、生 CSS ではこの px 値をメディアクエリに直書きする(CSS 変数はメディアクエリに使えないため、値の配布は本トークンが担う)。consumer が書くビューポートの md: / lg: / xl: も preset.css の --breakpoint-md / --breakpoint-lg / --breakpoint-xl が同じ段に揃える(Tailwind v4 既定の lg は 1024px で DS の 960px と 64px ずれるため)。値を変えるときは tokens.json と preset.css の --container-* / --breakpoint-* を必ず同時に更新する。独自のブレイクポイント値を発明しない",
|
|
935
939
|
"md": {
|
|
936
940
|
"px": 768,
|
|
937
941
|
"rem": "48rem",
|
|
938
942
|
"container": "--container-md",
|
|
943
|
+
"viewport": "--breakpoint-md",
|
|
939
944
|
"role": "切替段",
|
|
940
945
|
"usage": "SP/PC 境界。767px 以下=SP / 768px 以上=PC。本番 cakejp.css の max-width:767px / min-width:768px と一致"
|
|
941
946
|
},
|
|
@@ -943,6 +948,7 @@
|
|
|
943
948
|
"px": 960,
|
|
944
949
|
"rem": "60rem",
|
|
945
950
|
"container": "--container-lg",
|
|
951
|
+
"viewport": "--breakpoint-lg",
|
|
946
952
|
"role": "切替段",
|
|
947
953
|
"usage": "PC 中段。本番 cakejp.css の min-width:960px 段と一致"
|
|
948
954
|
},
|
|
@@ -950,6 +956,7 @@
|
|
|
950
956
|
"px": 1280,
|
|
951
957
|
"rem": "80rem",
|
|
952
958
|
"container": "--container-xl",
|
|
959
|
+
"viewport": "--breakpoint-xl",
|
|
953
960
|
"role": "上限段",
|
|
954
961
|
"usage": "コンテンツ上限段(切替段ではない)。ページコンテナの標準上限で、1280px 以上では原則レイアウト変形を追加しない。本番 cakejp.css に 1280 の切替段は無い(1025 / 1441 はある)——DS が定める標準上限。実例: MypageShell の PC グリッド max-w-[1280px]"
|
|
955
962
|
}
|