@cakejp/design-system 0.12.0 → 0.13.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 +43 -0
- package/CLAUDE.md +6 -2
- package/bin/check-duplicates.mjs +133 -9
- package/bin/exports-parser.mjs +54 -0
- package/bin/init.js +3 -0
- package/contracts/components.json +229 -25
- package/contracts/composition.json +10 -7
- package/contracts/rules.json +6 -4
- package/dist/index.css +1 -1
- package/dist/index.js +2951 -2204
- package/dist/types/components/ec/admin-shell.d.ts +30 -2
- package/dist/types/components/foundations/card.d.ts +27 -3
- package/dist/types/components/foundations/field.d.ts +26 -3
- package/dist/types/components/foundations/input.d.ts +3 -1
- package/dist/types/components/foundations/textarea.d.ts +3 -1
- package/dist/types/components/primitives/chat-composer.d.ts +87 -0
- package/dist/types/components/primitives/content-carousel.d.ts +7 -1
- package/dist/types/components/primitives/date-picker.d.ts +15 -3
- package/dist/types/components/primitives/funnel-shell.d.ts +2 -0
- package/dist/types/components/primitives/image-input.d.ts +119 -0
- package/dist/types/components/primitives/section-header.d.ts +9 -2
- package/dist/types/components/primitives/section.d.ts +35 -2
- package/dist/types/components/primitives/timeline.d.ts +23 -0
- package/dist/types/components/primitives/workspace-shell.d.ts +2 -0
- package/dist/types/index.d.ts +17 -5
- package/dist/types/lib/pagination-range.d.ts +16 -0
- package/dist/types/lib/use-value-length.d.ts +31 -0
- package/package.json +2 -1
- package/src/preset-standalone.css +16 -0
- package/src/preset.css +17 -0
- package/src/styles/typography.css +7 -0
- package/templates/AGENTS.md +2 -0
- package/templates/CLAUDE.md +2 -0
- package/tokens.json +9 -2
package/dist/types/index.d.ts
CHANGED
|
@@ -14,6 +14,8 @@ export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader,
|
|
|
14
14
|
export { Checkbox } from "./components/foundations/checkbox";
|
|
15
15
|
export type { CheckboxProps } from "./components/foundations/checkbox";
|
|
16
16
|
export { CheckboxCardGroup, CheckboxCardItem } from "./components/foundations/checkbox-card";
|
|
17
|
+
export { CheckboxGroup, CheckboxGroupItem } from "./components/foundations/checkbox-group";
|
|
18
|
+
export type { CheckboxGroupProps } from "./components/foundations/checkbox-group";
|
|
17
19
|
export { Collapsible, CollapsibleContent, CollapsibleTrigger } from "./components/foundations/collapsible";
|
|
18
20
|
export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut } from "./components/foundations/command";
|
|
19
21
|
export { ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger } from "./components/foundations/context-menu";
|
|
@@ -21,7 +23,8 @@ export { DataTable } from "./components/foundations/data-table";
|
|
|
21
23
|
export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger } from "./components/foundations/dialog";
|
|
22
24
|
export { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger } from "./components/foundations/drawer";
|
|
23
25
|
export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger } from "./components/foundations/dropdown-menu";
|
|
24
|
-
export { FieldSet, FieldLegend, FieldGroup, FieldDescription, FieldError, FieldSeparator } from "./components/foundations/field";
|
|
26
|
+
export { Field, FieldLabel, FieldSet, FieldLegend, FieldGroup, FieldDescription, FieldError, FieldSeparator, fieldVariants } from "./components/foundations/field";
|
|
27
|
+
export type { FieldProps } from "./components/foundations/field";
|
|
25
28
|
export { FileInput, formatFileNames, validateFileSize } from "./components/foundations/file-input";
|
|
26
29
|
export type { FileInputProps, FileInputError } from "./components/foundations/file-input";
|
|
27
30
|
export { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, useFormField } from "./components/foundations/form";
|
|
@@ -33,7 +36,9 @@ export { Label } from "./components/foundations/label";
|
|
|
33
36
|
export { Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger } from "./components/foundations/menubar";
|
|
34
37
|
export { NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, navigationMenuTriggerStyle } from "./components/foundations/navigation-menu";
|
|
35
38
|
export { Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious } from "./components/foundations/pagination";
|
|
36
|
-
export {
|
|
39
|
+
export { getPaginationRange } from "./lib/pagination-range";
|
|
40
|
+
export type { GetPaginationRangeOptions, PaginationRangeItem } from "./lib/pagination-range";
|
|
41
|
+
export { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from "./components/foundations/popover";
|
|
37
42
|
export { Progress } from "./components/foundations/progress";
|
|
38
43
|
export { ResponsiveDialog, ResponsiveDialogClose, ResponsiveDialogContent, ResponsiveDialogDescription, ResponsiveDialogFooter, ResponsiveDialogHeader, ResponsiveDialogTitle, ResponsiveDialogTrigger, useIsMobile } from "./components/foundations/responsive-dialog";
|
|
39
44
|
export { RadioGroup, RadioGroupItem } from "./components/foundations/radio-group";
|
|
@@ -65,7 +70,7 @@ export type { CoachMarkProps, CoachMarkDirection } from "./components/primitives
|
|
|
65
70
|
export { BannerCarousel } from "./components/primitives/banner-carousel";
|
|
66
71
|
export type { BannerCarouselProps, BannerItem } from "./components/primitives/banner-carousel";
|
|
67
72
|
export { ContentCarousel } from "./components/primitives/content-carousel";
|
|
68
|
-
export type { ContentCarouselProps } from "./components/primitives/content-carousel";
|
|
73
|
+
export type { ContentCarouselProps, ContentCarouselItemsPerView } from "./components/primitives/content-carousel";
|
|
69
74
|
export { StickyActionBar } from "./components/primitives/sticky-action-bar";
|
|
70
75
|
export { BottomTabBar } from "./components/primitives/bottom-tab-bar";
|
|
71
76
|
export type { BottomTabBarProps, BottomTabBarItem } from "./components/primitives/bottom-tab-bar";
|
|
@@ -75,6 +80,8 @@ export { CategoryShortcuts } from "./components/primitives/category-shortcuts";
|
|
|
75
80
|
export type { CategoryShortcutsProps, CategoryShortcutsItem } from "./components/primitives/category-shortcuts";
|
|
76
81
|
export { CategoryScroll } from "./components/primitives/category-scroll";
|
|
77
82
|
export type { CategoryScrollProps, CategoryItem } from "./components/primitives/category-scroll";
|
|
83
|
+
export { ChatComposer } from "./components/primitives/chat-composer";
|
|
84
|
+
export type { ChatComposerProps, ChatComposerAttachmentError } from "./components/primitives/chat-composer";
|
|
78
85
|
export { Chip, chipVariants } from "./components/primitives/chip";
|
|
79
86
|
export type { ChipProps } from "./components/primitives/chip";
|
|
80
87
|
export { StandardPageShell } from "./components/primitives/standard-page-shell";
|
|
@@ -107,6 +114,8 @@ export { ImageCarousel } from "./components/primitives/image-carousel";
|
|
|
107
114
|
export type { ImageCarouselProps } from "./components/primitives/image-carousel";
|
|
108
115
|
export { ImageGallery } from "./components/primitives/image-gallery";
|
|
109
116
|
export type { ImageGalleryProps } from "./components/primitives/image-gallery";
|
|
117
|
+
export { ImageInput, imageInputPreviewVariants } from "./components/primitives/image-input";
|
|
118
|
+
export type { ImageInputProps, ImageInputValidationError } from "./components/primitives/image-input";
|
|
110
119
|
export { ImageUploader } from "./components/primitives/image-uploader";
|
|
111
120
|
export type { ImageUploaderProps, ImageUploaderImage } from "./components/primitives/image-uploader";
|
|
112
121
|
export { KebabMenu } from "./components/primitives/kebab-menu";
|
|
@@ -125,6 +134,8 @@ export { PriceDisplay, priceDisplayVariants } from "./components/primitives/pric
|
|
|
125
134
|
export type { PriceDisplayProps } from "./components/primitives/price-display";
|
|
126
135
|
export { ProgressSteps } from "./components/primitives/progress-steps";
|
|
127
136
|
export type { ProgressStepsProps } from "./components/primitives/progress-steps";
|
|
137
|
+
export { Timeline } from "./components/primitives/timeline";
|
|
138
|
+
export type { TimelineItem, TimelineProps } from "./components/primitives/timeline";
|
|
128
139
|
export { QuantitySelector } from "./components/primitives/quantity-selector";
|
|
129
140
|
export type { QuantitySelectorProps } from "./components/primitives/quantity-selector";
|
|
130
141
|
export { SearchBar } from "./components/primitives/search-bar";
|
|
@@ -132,9 +143,10 @@ export type { SearchBarProps } from "./components/primitives/search-bar";
|
|
|
132
143
|
export { SearchPanel } from "./components/primitives/search-panel";
|
|
133
144
|
export type { SearchPanelProps } from "./components/primitives/search-panel";
|
|
134
145
|
export { Container, containerVariants } from "./components/primitives/container";
|
|
135
|
-
export { Section, sectionVariants } from "./components/primitives/section";
|
|
146
|
+
export { Section, sectionVariants, sectionScrimVariants } from "./components/primitives/section";
|
|
147
|
+
export type { SectionProps, SectionScrim } from "./components/primitives/section";
|
|
136
148
|
export { SectionHeader } from "./components/primitives/section-header";
|
|
137
|
-
export type { SectionHeaderProps, SectionHeaderSize } from "./components/primitives/section-header";
|
|
149
|
+
export type { SectionHeaderDesktopSize, SectionHeaderProps, SectionHeaderSize, } from "./components/primitives/section-header";
|
|
138
150
|
export { SectionNav } from "./components/primitives/section-nav";
|
|
139
151
|
export type { SectionNavProps, SectionNavItem } from "./components/primitives/section-nav";
|
|
140
152
|
export { ShareButtons } from "./components/primitives/share-buttons";
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type PaginationRangeItem = number | "ellipsis";
|
|
2
|
+
export interface GetPaginationRangeOptions {
|
|
3
|
+
/** 現在ページ(1始まり)。範囲外は 1〜totalPages に丸める */
|
|
4
|
+
currentPage: number;
|
|
5
|
+
/** 総ページ数。0以下は空配列を返す */
|
|
6
|
+
totalPages: number;
|
|
7
|
+
/** 現在ページの左右に常時表示するページ数 */
|
|
8
|
+
siblingCount?: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* ページネーションに表示するページ番号と省略記号の窓を返す。
|
|
12
|
+
*
|
|
13
|
+
* 先頭・末尾ページは常に残し、現在ページの前後を siblingCount 件ずつ表示する。
|
|
14
|
+
* 描画は既存の PaginationItem / PaginationLink / PaginationEllipsis を使う。
|
|
15
|
+
*/
|
|
16
|
+
export declare function getPaginationRange({ currentPage, totalPages, siblingCount, }: GetPaginationRangeOptions): PaginationRangeItem[];
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
type CountableElement = HTMLInputElement | HTMLTextAreaElement;
|
|
3
|
+
/**
|
|
4
|
+
* `showCount` 用の文字数を求めるための内部フック。
|
|
5
|
+
*
|
|
6
|
+
* 制御(`value` 指定)のときは `value` をそのまま数える。
|
|
7
|
+
* 非制御のときは **内部 state ではなく実際の DOM の `value`** を数える。
|
|
8
|
+
* react-hook-form の `register()` は `ref` 経由で DOM に直接初期値を書き込み
|
|
9
|
+
* (`reset()` / `defaultValues`)、その経路では `onChange` が発火しないため、
|
|
10
|
+
* 内部 state だけを見ていると初期表示のカウントが 0 のままになる。
|
|
11
|
+
*
|
|
12
|
+
* 初期表示は layout effect で DOM を読み、以後の programmatic な `.value` 代入は
|
|
13
|
+
* 要素自身の value descriptor を監視して拾う。MutationObserver は DOM property の
|
|
14
|
+
* 変更を観測できず、RHF の `setValue()` は再 render を伴わない場合があるため。
|
|
15
|
+
* 元 descriptor(React の value tracker を含む)へ処理を委譲し、detach 時に復元する。
|
|
16
|
+
*
|
|
17
|
+
* consumer の callback ref が返す cleanup は保持し、detach 時に実行する。
|
|
18
|
+
* cleanup を返さない従来の callback ref は detach 時に null を渡すため、
|
|
19
|
+
* React 18/19 どちらの ref 契約も維持する。
|
|
20
|
+
*/
|
|
21
|
+
export declare function useValueLength<T extends CountableElement>({ enabled, value, defaultValue, forwardedRef, }: {
|
|
22
|
+
enabled: boolean;
|
|
23
|
+
value: string | number | readonly string[] | undefined;
|
|
24
|
+
defaultValue: string | number | readonly string[] | undefined;
|
|
25
|
+
forwardedRef: React.Ref<T> | undefined;
|
|
26
|
+
}): {
|
|
27
|
+
ref: React.RefCallback<T>;
|
|
28
|
+
length: number;
|
|
29
|
+
syncFromDom: () => void;
|
|
30
|
+
};
|
|
31
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cakejp/design-system",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Cake.jp Design System — UI コンポーネント・カラートークン・タイポグラフィ",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -153,6 +153,7 @@
|
|
|
153
153
|
"eslint-plugin-storybook": "^10.3.3",
|
|
154
154
|
"globals": "^16.5.0",
|
|
155
155
|
"iconsax-reactjs": "^0.0.8",
|
|
156
|
+
"jsdom": "^29.1.1",
|
|
156
157
|
"lucide-react": "^0.577.0",
|
|
157
158
|
"next-themes": "^0.4.6",
|
|
158
159
|
"playwright": "^1.58.2",
|
|
@@ -405,6 +405,7 @@
|
|
|
405
405
|
*/
|
|
406
406
|
|
|
407
407
|
/* Heading */
|
|
408
|
+
.typo-heading-5xl { font-size: 40px; line-height: 1.35; letter-spacing: 0.04em; font-weight: 700; }
|
|
408
409
|
.typo-heading-4xl { font-size: 32px; line-height: 1.4; letter-spacing: 0.04em; font-weight: 700; }
|
|
409
410
|
.typo-heading-3xl { font-size: 28px; line-height: 1.5; letter-spacing: 0.04em; font-weight: 700; }
|
|
410
411
|
.typo-heading-2xl { font-size: 24px; line-height: 1.5; letter-spacing: 0.04em; font-weight: 700; }
|
|
@@ -424,3 +425,18 @@
|
|
|
424
425
|
.typo-label-md { font-size: 14px; line-height: 1.5; letter-spacing: 0.04em; font-weight: 700; }
|
|
425
426
|
.typo-label-sm { font-size: 12px; line-height: 1.5; font-weight: 500; }
|
|
426
427
|
.typo-label-xs { font-size: 10px; line-height: 1.5; font-weight: 500; }
|
|
428
|
+
|
|
429
|
+
/* --- Touch target utility ---
|
|
430
|
+
* Tailwind を使わない consumer でも preset と同じ44px操作領域を利用できる。 */
|
|
431
|
+
.tap-target {
|
|
432
|
+
position: relative;
|
|
433
|
+
}
|
|
434
|
+
.tap-target::after {
|
|
435
|
+
content: "";
|
|
436
|
+
position: absolute;
|
|
437
|
+
top: 50%;
|
|
438
|
+
left: 50%;
|
|
439
|
+
width: max(100%, 2.75rem);
|
|
440
|
+
height: max(100%, 2.75rem);
|
|
441
|
+
transform: translate(-50%, -50%);
|
|
442
|
+
}
|
package/src/preset.css
CHANGED
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
* - Tailwind 標準色 → Cake.jp マッピング(bg-red-600 等)
|
|
19
19
|
* - シャドウ・角丸トークン
|
|
20
20
|
* - アニメーションユーティリティ
|
|
21
|
+
* - 見た目を変えず44pxの操作領域を確保する tap-target ユーティリティ
|
|
21
22
|
* ============================================ */
|
|
22
23
|
|
|
23
24
|
/* --- Layer 1: Primitive Colors --- */
|
|
@@ -302,6 +303,22 @@
|
|
|
302
303
|
animation: slide-in-left 200ms ease-out;
|
|
303
304
|
}
|
|
304
305
|
|
|
306
|
+
/* --- Touch target utility ---
|
|
307
|
+
* 見た目が44px未満の小型操作部品に付け、透明な疑似要素で実効操作領域だけを拡張する。
|
|
308
|
+
* 隣接ターゲットと重なる密度では使わず、親レイアウト側の gap も確保する。 */
|
|
309
|
+
.tap-target {
|
|
310
|
+
position: relative;
|
|
311
|
+
}
|
|
312
|
+
.tap-target::after {
|
|
313
|
+
content: "";
|
|
314
|
+
position: absolute;
|
|
315
|
+
top: 50%;
|
|
316
|
+
left: 50%;
|
|
317
|
+
width: max(100%, 2.75rem);
|
|
318
|
+
height: max(100%, 2.75rem);
|
|
319
|
+
transform: translate(-50%, -50%);
|
|
320
|
+
}
|
|
321
|
+
|
|
305
322
|
/* --- Base layer --- */
|
|
306
323
|
@layer base {
|
|
307
324
|
* {
|
|
@@ -32,6 +32,13 @@
|
|
|
32
32
|
|
|
33
33
|
/* ─── Heading ─── */
|
|
34
34
|
|
|
35
|
+
@utility typo-heading-5xl {
|
|
36
|
+
font-size: 2.5rem; /* 40px */
|
|
37
|
+
line-height: 1.35; /* 54px */
|
|
38
|
+
letter-spacing: 0.04em;
|
|
39
|
+
font-weight: 700;
|
|
40
|
+
}
|
|
41
|
+
|
|
35
42
|
@utility typo-heading-4xl {
|
|
36
43
|
font-size: 2rem; /* 32px */
|
|
37
44
|
line-height: 1.4; /* 44.8px */
|
package/templates/AGENTS.md
CHANGED
|
@@ -41,6 +41,8 @@ DS に該当パターンが無い場合のみカスタム実装を許可。そ
|
|
|
41
41
|
3. それでも無ければ、手元に台帳を作らず **flashpark/cake-design-system に issue を立てる**。
|
|
42
42
|
4. やむを得ずローカル実装する場合は、「DS に X が追加されたら削除」の条件コメントを必ず添える。
|
|
43
43
|
|
|
44
|
+
**意図的にローカル実装を残すとき(check-duplicates の抑制)**: 対象 export の直前のコメント行(または行末コメント)に `// cakejp-ds-allow-duplicate: <理由>` を書くと、その 1 件だけ検出から外れる。**理由が空なら抑制されない**(形骸化防止)。抑制した件数と理由はサマリに出るので、`--strict` を CI に入れたまま運用できる。
|
|
45
|
+
|
|
44
46
|
## 使用方法
|
|
45
47
|
|
|
46
48
|
### CSS のセットアップ(重要)
|
package/templates/CLAUDE.md
CHANGED
|
@@ -43,6 +43,8 @@ DS に該当パターンが無い場合のみカスタム実装を許可。そ
|
|
|
43
43
|
3. それでも無ければ、手元に台帳を作らず **flashpark/cake-design-system に issue を立てる**。
|
|
44
44
|
4. やむを得ずローカル実装する場合は、「DS に X が追加されたら削除」の条件コメントを必ず添える。
|
|
45
45
|
|
|
46
|
+
**意図的にローカル実装を残すとき(check-duplicates の抑制)**: 対象 export の直前のコメント行(または行末コメント)に `// cakejp-ds-allow-duplicate: <理由>` を書くと、その 1 件だけ検出から外れる。**理由が空なら抑制されない**(形骸化防止)。抑制した件数と理由はサマリに出るので、`--strict` を CI に入れたまま運用できる。
|
|
47
|
+
|
|
46
48
|
## 使用方法
|
|
47
49
|
|
|
48
50
|
### CSS のセットアップ(重要)
|
package/tokens.json
CHANGED
|
@@ -58,14 +58,21 @@
|
|
|
58
58
|
|
|
59
59
|
"typography": {
|
|
60
60
|
"heading": {
|
|
61
|
+
"5xl": {
|
|
62
|
+
"fontSize": "40px",
|
|
63
|
+
"lineHeight": 1.35,
|
|
64
|
+
"letterSpacing": "0.04em",
|
|
65
|
+
"fontWeight": 700,
|
|
66
|
+
"usage": "LP・マーケティング系ヒーローの PC 見出し。SP は 3xl(28px)を基準に段階を上げる。通常ページでは使わない"
|
|
67
|
+
},
|
|
61
68
|
"4xl": {
|
|
62
69
|
"fontSize": "32px",
|
|
63
70
|
"lineHeight": 1.4,
|
|
64
71
|
"letterSpacing": "0.04em",
|
|
65
72
|
"fontWeight": 700,
|
|
66
|
-
"usage": "
|
|
73
|
+
"usage": "LP・マーケティング系ヒーローの PC 見出し(5xlより抑えた表現)。通常ページでは使わない"
|
|
67
74
|
},
|
|
68
|
-
"3xl": { "fontSize": "28px", "lineHeight": 1.5, "letterSpacing": "0.04em", "fontWeight": 700, "usage": "
|
|
75
|
+
"3xl": { "fontSize": "28px", "lineHeight": 1.5, "letterSpacing": "0.04em", "fontWeight": 700, "usage": "通常ページの主見出し・ページタイトル。LPではSP側のヒーロー見出しにも使用" },
|
|
69
76
|
"2xl": { "fontSize": "24px", "lineHeight": 1.5, "letterSpacing": "0.04em", "fontWeight": 700, "usage": "主要セクション見出し" },
|
|
70
77
|
"xl": { "fontSize": "21px", "lineHeight": 1.5, "letterSpacing": "0.04em", "fontWeight": 700, "usage": "サブセクション見出し" },
|
|
71
78
|
"lg": { "fontSize": "18px", "lineHeight": 1.5, "letterSpacing": "0.04em", "fontWeight": 700, "usage": "グループ見出し" },
|