@lism-css/mcp 0.23.0 → 0.26.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.
Files changed (73) hide show
  1. package/README.ja.md +15 -15
  2. package/README.md +5 -5
  3. package/dist/data/docs-index.json +185 -159
  4. package/dist/data/guides/SKILL.md +164 -228
  5. package/dist/data/guides/antipatterns-layout.md +271 -0
  6. package/dist/data/guides/antipatterns.md +121 -196
  7. package/dist/data/guides/base-styles.md +10 -9
  8. package/dist/data/guides/components-core.md +27 -9
  9. package/dist/data/guides/components-ui.md +30 -51
  10. package/dist/data/guides/css-rules.md +104 -107
  11. package/dist/data/guides/customize.md +10 -7
  12. package/dist/data/guides/naming.md +22 -41
  13. package/dist/data/guides/primitive-class.md +5 -5
  14. package/dist/data/guides/primitives/a--decorator.md +2 -28
  15. package/dist/data/guides/primitives/a--divider.md +1 -52
  16. package/dist/data/guides/primitives/a--icon.md +2 -76
  17. package/dist/data/guides/primitives/a--spacer.md +1 -49
  18. package/dist/data/guides/primitives/l--autoColumns.md +7 -54
  19. package/dist/data/guides/primitives/l--box.md +1 -21
  20. package/dist/data/guides/primitives/l--center.md +6 -39
  21. package/dist/data/guides/primitives/l--cluster.md +6 -26
  22. package/dist/data/guides/primitives/l--columns.md +7 -56
  23. package/dist/data/guides/primitives/l--flex.md +5 -62
  24. package/dist/data/guides/primitives/l--flow.md +11 -72
  25. package/dist/data/guides/primitives/l--frame.md +7 -78
  26. package/dist/data/guides/primitives/l--grid.md +5 -56
  27. package/dist/data/guides/primitives/l--stack.md +5 -44
  28. package/dist/data/guides/primitives/l--switchColumns.md +8 -53
  29. package/dist/data/guides/primitives/l--tileGrid.md +7 -44
  30. package/dist/data/guides/primitives/l--withSide.md +9 -79
  31. package/dist/data/guides/property-class/all-props.md +246 -0
  32. package/dist/data/guides/property-class/bd.md +6 -71
  33. package/dist/data/guides/property-class/hov.md +14 -73
  34. package/dist/data/guides/property-class/max-sz.md +3 -39
  35. package/dist/data/guides/property-class.md +33 -250
  36. package/dist/data/guides/references/authoring.md +246 -0
  37. package/dist/data/guides/references/page-sections.md +99 -0
  38. package/dist/data/guides/references/verification.md +75 -0
  39. package/dist/data/guides/responsive.md +44 -15
  40. package/dist/data/guides/set-class.md +2 -12
  41. package/dist/data/guides/tokens.md +20 -16
  42. package/dist/data/guides/trait-class/has--gutter.md +3 -31
  43. package/dist/data/guides/trait-class/has--mask.md +3 -36
  44. package/dist/data/guides/trait-class/has--snap.md +3 -34
  45. package/dist/data/guides/trait-class/has--transition.md +3 -41
  46. package/dist/data/guides/trait-class/is--boxLink.md +2 -63
  47. package/dist/data/guides/trait-class/is--container.md +2 -29
  48. package/dist/data/guides/trait-class/is--layer.md +1 -57
  49. package/dist/data/guides/trait-class/is--wrapper.md +3 -56
  50. package/dist/data/guides/trait-class.md +8 -8
  51. package/dist/data/guides/utility-class.md +1 -1
  52. package/dist/data/meta.js +4 -3
  53. package/dist/index.js +4 -1
  54. package/dist/lib/load-markdown.d.ts +4 -0
  55. package/dist/lib/load-markdown.js +10 -0
  56. package/dist/lib/response.d.ts +5 -0
  57. package/dist/lib/response.js +15 -2
  58. package/dist/lib/schemas.d.ts +35 -0
  59. package/dist/lib/schemas.js +13 -0
  60. package/dist/lib/search.d.ts +2 -0
  61. package/dist/lib/search.js +56 -4
  62. package/dist/lib/types.d.ts +5 -21
  63. package/dist/lib/version.d.ts +2 -0
  64. package/dist/lib/version.js +8 -0
  65. package/dist/tools/convert-css.js +37 -14
  66. package/dist/tools/get-component.js +2 -2
  67. package/dist/tools/get-guide.d.ts +2 -0
  68. package/dist/tools/get-guide.js +41 -18
  69. package/dist/tools/get-overview.js +2 -2
  70. package/dist/tools/get-props-system.js +8 -6
  71. package/dist/tools/get-tokens.js +2 -2
  72. package/dist/tools/search-docs.js +13 -7
  73. package/package.json +21 -6
@@ -2,87 +2,49 @@
2
2
 
3
3
  AI が Lism CSS のコードを生成する際に間違いやすい記法と、その正しい書き方をカタログ化したもの。コードを書く前に該当カテゴリを確認すること。
4
4
 
5
+ 値・スタイル宣言系はこのファイル、構造・レイアウト・レスポンシブ系は [antipatterns-layout.md](./antipatterns-layout.md) に分けている。
6
+
5
7
  ## TOC
6
8
 
7
- - [Token typo(存在しない値)](#token-typo存在しない値)
9
+ ### 値・スタイル宣言系(このファイル)
10
+
8
11
  - [px / 固定値の直書き](#px--固定値の直書き)
9
12
  - [Property Class で書けるのに CSS で書く](#property-class-で書けるのに-css-で書く)
10
- - [`is--` の誤用(状態・バリエーション)](#is---の誤用状態バリエーション)
11
- - [カスタムクラスを全て `c--` にしてしまう](#カスタムクラスを何でも-c---にしない)
12
- - [クラス名の命名ミス(kebab-case)](#クラス名の命名ミスkebab-case)
13
+ - [Token typo(存在しない値)](#token-typo存在しない値)
14
+ - [独自クラスの CSS を所定の `@layer` に入れない](#独自クラスの-css-を所定の-layer-に入れない)
15
+ - [hover を component CSS に書いて負ける](#hover-を-component-css-に書いて負ける)
16
+ - [Reset 済みプロパティの再指定](#reset-済みプロパティの再指定)
13
17
  - [`--keycolor` の誤用](#--keycolor-の誤用)
14
18
  - [Prop 型ミス](#prop-型ミス)
15
- - [レイアウト選択ミス](#レイアウト選択ミス)
16
- - [レスポンシブ抜け](#レスポンシブ抜け)
17
-
18
- ---
19
-
20
- ## Token typo(存在しない値)
21
-
22
- Lism CSS側が用意しているトークン値と異なるものを書かないように注意する。
23
- 正確な一覧は [tokens.md](./tokens.md) を参照すること。
24
-
25
- ただし、ユーザーが独自に追加定義することは可能。あくまでデフォルトで用意されていないもので間違えやすいものを紹介しておく。
26
-
27
- ### カラー
28
-
29
- | NG | OK | 理由 |
30
- |---|---|---|
31
- | `bgc="primary"` | `bgc="brand"` | セマンティックカラーに `primary`/`secondary` は無い。ブランド色は `brand`/`accent` |
32
- | `bgc="secondary"` | `bgc="base-2"` | サブ背景色は `base-2`(`base-3` がユーザーによって追加定義されている可能性もある) |
33
- | `c="muted"` | `c="text-2"` | 補助テキスト色は `text-2` |
34
- | `c="danger"` | `c="red"` | パレットカラーから選ぶ(`red` / `orange` 等) |
35
-
36
- - セマンティックカラー: `base` / `base-2` / `text` / `text-2` / `divider` / `link` / `brand` / `accent` / `neutral`
37
- - パレットカラー: `red` / `blue` / `green` / `yellow` / `purple` / `orange` / `pink` / `gray` / `white` / `black`
38
-
39
- ### スペース(`p` / `m` / `g` 等)
40
-
41
- スペーストークンの数値は**離散的**で、`5/10/15/20/25/30/35/40/50/60/70/80` のみが用意されている。`8/12/14/45/65/75` 等を書きそうになったら、必ず最寄りトークンに丸めるか、ユーザーに方針確認すること(→ [SKILL.md のデザイン取り込みフロー](./SKILL.md#デザインデータ取り込み時のフロー))。
42
19
 
43
- | NG | OK | 理由 |
44
- |---|---|---|
45
- | `p="8"` | `p="10"` | スペーストークンは離散値のみ。tailwindのような4の倍数で連続するスケールではない |
46
- | `g="6"` | `g="5"` | 同上 |
47
- | `m="45"`, `m="55"` | `m="40"` or `m="50"` | `40` 以降の中間値は用意されていない(前半は `5/15/25/35` まで補完済み) |
48
- | `m="100"` | `m="80"` | 上限は `80`(ユーザーが追加定義している可能性はある) |
49
-
50
- ### フォントサイズ(`fz`)
51
-
52
- | NG | OK | 理由 |
53
- |---|---|---|
54
- | `fz="14"` | `fz="s"` | `fz` は文字列キー(数値は不可) |
55
- | `fz="large"`, `fz="md"` | `fz="l"` | 略号は `2xs` / `xs` / `s` / `m` / `l` / `xl` / `2xl` … |
56
-
57
-
58
- ### 角丸 / 影
59
-
60
- | NG | OK | 理由 |
61
- |---|---|---|
62
- | `bdrs="sm"`, `bdrs="round"` | `bdrs="20"`, `bdrs="99"` | 角丸トークンは `10` / `20` / `30` / `40` / `99` / `inner` |
63
- | `bxsh="xs"`, `bxsh="sm"` | `bxsh="10"`, `bxsh="20"` | shadowトークンは `10` / `20` / `30` / `40` / `50` |
64
-
65
- ### プリセット外の値を Lism Props に渡している
66
-
67
- Lism Props では、props.ts で事前定義されたものが `-{prop}:{value}` クラスとして出力される。それ以外の値はそのまま出力されてCSSとして無効になる。
68
-
69
- ```JSX
70
- // NG: 事前定義されたトークン値に合致しないため、-lts:2xl は出力されない
71
- <Text lts="2xl">...</Text>
72
- ```
73
-
74
- 独自にProperty Classを拡張したりトークン値を増やしたりする場合は、 [property-class.md の `:value` 記法](./property-class.md)を活用するか、[`lism.config.js`による拡張](./customize.md)が必要。
20
+ ### 構造・レイアウト・レスポンシブ系(antipatterns-layout.md)
21
+
22
+ - [レイアウト選択ミス](./antipatterns-layout.md#レイアウト選択ミス)
23
+ - [ベーススタイルを CSS 側で持つ部品を `c--` のままにする](./antipatterns-layout.md#ベーススタイルを-css-側で持つ部品を-c---のままにする)
24
+ - [Astro/React Primitive を使わず素の HTML で組む](./antipatterns-layout.md#astroreact-primitive-を使わず素の-html-で組む)
25
+ - [ボタン装飾を reset から自作する](./antipatterns-layout.md#ボタン装飾を-reset-から自作する)
26
+ - [`Frame` 未使用のメディア枠手組み](./antipatterns-layout.md#frame-未使用のメディア枠手組み)
27
+ - [全面リンクの手組み(`BoxLink` 未使用)](./antipatterns-layout.md#全面リンクの手組みboxlink-未使用)
28
+ - [primitive 既定値の重複指定](./antipatterns-layout.md#primitive-既定値の重複指定)
29
+ - [サイト最外殻を `Wrapper` に使う](./antipatterns-layout.md#サイト最外殻を-wrapper-に使う)
30
+ - [row 方向の `Flex` / `Cluster` 直下に `Wrapper` を置く](./antipatterns-layout.md#row-方向の-flex--cluster-直下に-wrapper-を置く)
31
+ - [セクション外殻を `Flex` + `min-h` で組む](./antipatterns-layout.md#セクション外殻を-flex--min-h-で組む)
32
+ - [標準 HTML 属性を `exProps` に入れる](./antipatterns-layout.md#標準-html-属性を-exprops-に入れる)
33
+ - [レスポンシブ抜け](./antipatterns-layout.md#レスポンシブ抜け)
34
+ - [レスポンシブ配列の冗長指定](./antipatterns-layout.md#レスポンシブ配列の冗長指定)
35
+ - [`is--` の誤用(状態・バリエーション)](./antipatterns-layout.md#is---の誤用状態バリエーション)
36
+ - [クラス名の命名ミス](./antipatterns-layout.md#クラス名の命名ミス)
75
37
 
76
38
  ---
77
39
 
78
40
  ## px / 固定値の直書き
79
41
 
80
- デザインデータ由来の px / rem / em をそのまま書くと、Lism CSS のスケール統一が崩れる。**書く前に [SKILL.md のデザインデータ取り込み時のフロー](./SKILL.md#デザインデータ取り込み時のフロー) に従い、ユーザーに「A: そのまま採用 / B: 最寄りトークンに丸める / C: トークン基準値を上書きする」を確認すること**。確認なしに固定値を採用しない。
42
+ デザインデータ由来の px / rem / em をそのまま書くと、Lism CSS のスケール統一が崩れる。**書く前に [デザインデータ取り込みフロー](./references/authoring.md#デザインデータ取り込みフロー) に従うこと**。入力種別ごとの既定動作と、丸め/カスタムトークン化/直書き例外(A/B/C)の選択肢の定義はフロー側が正本。確認なしに固定値を採用しない。
81
43
 
82
44
  ### スペース・サイズ
83
45
 
84
46
  | NG | OK | 理由 |
85
- |---|---|---|
47
+ | --- | --- | --- |
86
48
  | `padding: 3px 10px` | `padding: var(--s5) var(--s10)` または Props で `py="5" px="10"` | `3px` はトークン外。最寄りは `--s5`(4px) |
87
49
  | `min-width: 28px; height: 28px` | `min-w` / `h` をトークン値に丸める、または基準値を上書き | `28px` はトークン外 |
88
50
  | `gap: var(--s5); padding: var(--s10) var(--s15)` を CSS で直書き | `<Lism g="5" py="10" px="15">` | Property Class / Props で書ける |
@@ -90,17 +52,25 @@ Lism Props では、props.ts で事前定義されたものが `-{prop}:{value}`
90
52
  ### 角丸・ボーダー
91
53
 
92
54
  | NG | OK | 理由 |
93
- |---|---|---|
55
+ | --- | --- | --- |
94
56
  | `border-radius: 2px` | `border-radius: var(--bdrs--10)`(4px) | 角丸トークンの最小は `--bdrs--10`(4px)。`2px` はトークン外 |
95
57
  | `border-radius: 6px` | `--bdrs--10`(4px)か `--bdrs--20`(8px)に丸める | 6px はトークン外 |
96
58
 
97
59
  ### タイポグラフィ
98
60
 
99
61
  | NG | OK | 理由 |
100
- |---|---|---|
62
+ | --- | --- | --- |
101
63
  | `font-size: 13px` を直書き | `font-size: var(--fz--xs)` または Props で `fz="xs"` | フォントサイズは調和数列スケール。固定値は避ける |
102
64
  | `letter-spacing: 0.02 / 0.12 / 0.14 / 0.18 / 0.2 / 0.24em` を散在 | `--lts--s/-l/-xl` を使う、または独自の `--lts--*` を `global.css` で追加 | デフォルトの `lts` トークンは `s/l/xl` のみ。多種混在はデザイントークンとして不健全 |
103
65
 
66
+ ### 実測pxの包括例外化(例外の自作)
67
+
68
+ 「正確に再現して」等のユーザー指示を根拠に「ページ固有の実測値として採用」のような例外カテゴリを自作し、実測pxを一括採用してはいけない。`✅例外`にできるのは下記「直書きしてよい例外」に該当する場合だけで、ユーザー指示や実測値であることは根拠にならない。
69
+
70
+ | NG | OK | 理由 |
71
+ | --- | --- | --- |
72
+ | 実装プランに「『正確に再現』に基づくページ固有実測値として採用」と書き、実測pxを一括直書きして自分で✅ | 入力が画像のみなら最寄りトークンへ丸める(丸め先は`tokens.md`で照合)。px固定が必要と判断したら、その方針自体を⏸にする | 例外の許可リストに新カテゴリを自作しない。包括免除は値照合そのものを消す |
73
+
104
74
  ### 直書きしてよい例外
105
75
 
106
76
  - 1px / -1px の罫線・視覚補正(border / margin の打ち消し)
@@ -114,93 +84,115 @@ Lism Props では、props.ts で事前定義されたものが `-{prop}:{value}`
114
84
  `c--*` を定義したくなったら、まず宣言ごとに Property Class へ落とせるか確認する。落とせる宣言を CSS に書くと、CSS が肥大化し、Property Class の利点(差分上書きの容易さ・読みやすさ)が失われる。
115
85
 
116
86
  | NG(CSS 直書き) | OK(Property Class) |
117
- |---|---|
87
+ | --- | --- |
118
88
  | `.c--tag { font-size: var(--fz--xs); padding: var(--s10); background: var(--base-2); border-radius: var(--bdrs--10); }` | `<span class="c--tag -fz:xs -p:10 -bgc:base-2 -bdrs:10">` |
119
89
  | `.c--eyebrow { font-size: var(--fz--2xs); color: var(--text-2); text-transform: uppercase; }` | `<span class="c--eyebrow -fz:2xs -c:text-2 -tt:uppercase">` |
120
90
 
121
-
122
91
  CSS に残すのは、基本的には `::before` / `> li` などの「Primitive / Trait / Property Class で書けないセレクタ」を伴う宣言。単一要素への装飾束は呼び出し側マークアップに移す。
123
92
 
124
- なお、**CSS が空になっても `c--*` クラス名はマークアップに残して構わない**(むしろ推奨)。コンポーネントとしての役割をソースから読み取りやすくする目的で、意味づけ用に付けたままにする。
93
+ なお、CSS が空になっても `c--*` クラス名は何のパーツかを示す名前としてマークアップに残して構わない(→ [css-rules.md の Custom Class](./css-rules.md#custom-classc--))。
125
94
 
95
+ ベーススタイルを CSS 側で管理することを前提にする部品(サイト共通で繰り返し使うボタン・バッジ・カード級)は、`c--*` ではなく `b--*` を使い、CSS を `@layer lism-block` に書く(→ [css-rules.md の Block Class](./css-rules.md#block-classb--))。`b--` の3条件を満たさない `c--*` でこの節の規律を外してはいけない。
126
96
 
127
97
  ---
128
98
 
129
- ## `is--` の誤用(状態・バリエーション)
99
+ ## Token typo(存在しない値)
130
100
 
131
- Lism CSS の `is--` プレフィックスは「**〜である**」という**役割・存在の宣言**を表す trait 用(`is--container` / `is--wrapper` / `is--layer` / `is--boxLink` / `is--coverLink` / `is--skipFlow` / `is--side` 等)。ユーザーが独自に `is--*` を追加することは可能だが、**その要素の役割(trait)を宣言するもの**であることが条件で、**状態管理やスタイルバリエーション目的に流用しない**(`is--active` / `is--current` / `is--solid` などは誤用)。
101
+ Lism CSS側が用意しているトークン値と異なるものを書かないように注意する。
102
+ 正確な一覧は [tokens.md](./tokens.md) を参照すること。
132
103
 
133
- → 詳細: [trait-class.md](./trait-class.md#is-trait役割宣言)
104
+ ただし、ユーザーが独自に追加定義することは可能。あくまでデフォルトで用意されていないもので間違えやすいものを紹介しておく。
134
105
 
135
- `is--` と紛れがちな 2 つの用途は、Lism では別の手段で表現する:
106
+ ### カラー
136
107
 
137
- ### 1. 状態管理 `data-*` 属性を使う
108
+ | NG | OK | 理由 |
109
+ | --- | --- | --- |
110
+ | `bgc="primary"` | `bgc="brand"` | セマンティックカラーに `primary`/`secondary` は無い。ブランド色は `brand`/`accent` |
111
+ | `bgc="secondary"` | `bgc="base-2"` | サブ背景色は `base-2`(`base-3` がユーザーによって追加定義されている可能性もある) |
112
+ | `c="muted"` | `c="text-2"` | 補助テキスト色は `text-2` |
113
+ | `c="danger"` | `c="red"` | パレットカラーから選ぶ(`red` / `orange` 等) |
138
114
 
139
- オン/オフが切り替わる状態(active / current / disabled / open / selected 等)は、`is--*` クラスを増やさず HTML `data-*` 属性で表現する。CSS は属性セレクタで書く。
115
+ - セマンティックカラー: `base` / `base-2` / `text` / `text-2` / `divider` / `link` / `brand` / `accent` / `neutral`
116
+ - パレットカラー: `red` / `blue` / `green` / `yellow` / `purple` / `orange` / `pink` / `gray` / `white` / `black`
140
117
 
141
- | NG | OK |
142
- |---|---|
143
- | `<a class="c--catTab is--active">` + `.c--catTab.is--active { ... }` | `<a class="c--catTab" data-is-active>` + `.c--catTab[data-is-active] { ... }` |
144
- | `<li class="c--pager_num is--current">` + `.c--pager_num.is--current { ... }` | `<li class="c--pager_num" aria-current="page">` + `.c--pager_num[aria-current] { ... }` |
145
- | `<a class="c--pager_nav is--disabled">` + `.c--pager_nav.is--disabled { ... }` | `<a class="c--pager_nav" data-is-disabled>` + `.c--pager_nav[data-is-disabled] { ... }` |
118
+ ### スペース(`p` / `m` / `g` 等)
146
119
 
147
- 理由:
120
+ スペーストークンの数値は**離散的**で、`5/10/15/20/25/30/35/40/50/60/70/80` のみが用意されている。`8/12/14/45/65/75` 等を書きそうになったら、必ず最寄りトークンに丸めるか、ユーザーに方針確認すること(→ [デザインデータ取り込みフロー](./references/authoring.md#デザインデータ取り込みフロー))。
148
121
 
149
- - `is--*` は「役割宣言」用の trait であり、状態を表すクラスを `is--*` として増やすと意味体系(trait か state か)が混在して読みにくくなる
150
- - `data-*` HTML 標準の状態表現で、JS からの切替(`element.dataset.isActive = ''` / `delete element.dataset.isActive`)も自然
151
- - ARIA 属性で意味が表せる場合(`aria-current` / `aria-disabled` / `aria-selected` 等)は ARIA を優先し、その属性自体を CSS セレクタにする
122
+ | NG | OK | 理由 |
123
+ | --- | --- | --- |
124
+ | `p="8"` | `p="10"` | スペーストークンは離散値のみ。tailwindのような4の倍数で連続するスケールではない |
125
+ | `g="6"` | `g="5"` | 同上 |
126
+ | `m="45"`, `m="55"` | `m="40"` or `m="50"` | `40` 以降の中間値は用意されていない(前半は `5/15/25/35` まで補完済み) |
127
+ | `m="100"` | `m="80"` | 上限は `80`(ユーザーが追加定義している可能性はある) |
152
128
 
153
- ### 2. スタイルバリエーション → BEM Modifier `c--{name}--{variant}`
129
+ ### フォントサイズ(`fz`)
154
130
 
155
- 「同じコンポーネントの見た目違い」は、Lism CSS 公式の BEM Modifier 記法で表現する(→ [css-rules.md の Component Class](./css-rules.md#component-classc--))。
131
+ | NG | OK | 理由 |
132
+ | --- | --- | --- |
133
+ | `fz="14"` | `fz="s"` | `fz` は文字列キー(数値は不可) |
134
+ | `fz="large"`, `fz="md"` | `fz="l"` | 略号は `2xs` / `xs` / `s` / `m` / `l` / `xl` / `2xl` … |
156
135
 
157
- | NG | OK |
158
- |---|---|
159
- | `<span class="c--tag is--solid">` + `.c--tag.is--solid { ... }` | `<span class="c--tag c--tag--solid">` + `.c--tag.c--tag--solid { ... }` |
160
- | `<button class="c--button is--outline">` | `<button class="c--button c--button--outline">` |
136
+ ### 角丸 /
161
137
 
162
- なお、Modifier であってもまずは [Property Class で表現できないか](#property-class-で書けるのに-css-で書く) を検討すること。「色だけ違う」程度ならマークアップ側で `-bgc:* -c:*` を差し替えるだけで済むことも多い。
138
+ | NG | OK | 理由 |
139
+ | --- | --- | --- |
140
+ | `bdrs="sm"`, `bdrs="round"` | `bdrs="20"`, `bdrs="99"` | 角丸トークンは `10` / `20` / `30` / `40` / `99` / `inner` |
141
+ | `bxsh="xs"`, `bxsh="sm"` | `bxsh="10"`, `bxsh="20"` | shadowトークンは `10` / `20` / `30` / `40` / `50` |
163
142
 
164
- ---
143
+ ### プリセット外の値を Lism Props に渡している
165
144
 
166
- ## カスタムクラスを全て `c--` にしてしまう
145
+ Lism Props では、props.ts で事前定義されたものが `-{prop}:{value}` クラスとして出力される。それ以外の値はそのまま出力されてCSSとして無効になる。
167
146
 
168
- `c--` は「**コンポーネント**(再利用可能な UI 部品)」を表すプレフィックス。**カスタムクラスを必ず `c--` で命名する必要はない**。サイトの大まかな領域(header / sidebar / main / footer 等)やページ固有のスタイルなど、再利用が前提でないクラスは、独自プレフィックス(`z--` / `p--` 等)やプレフィックスなしの命名も選択肢として検討すること。
147
+ ```JSX
148
+ // NG: 事前定義されたトークン値に合致しないため、-lts:2xl は出力されない
149
+ <Text lts="2xl">...</Text>
150
+ ```
169
151
 
170
- 詳細: [css-rules.md の独自プレフィックス](./css-rules.md#独自プレフィックス)
152
+ 独自にProperty Classを拡張したりトークン値を増やしたりする場合は、 [property-class.md の `:value` 記法](./property-class.md)を活用するか、[`lism.config.js`による拡張](./customize.md)が必要。
171
153
 
172
- | 用途 | 命名の例 | 配置レイヤー |
173
- |---|---|---|
174
- | 再利用可能な UI 部品 | `c--button` / `c--card` / `c--tag` | `@layer lism-component` |
175
- | サイトのゾーニング | `z--header` / `z--sidebar` / `z--articleBody`(または `header` / `sidebar` / `articleBody`) | `@layer lism-custom` |
176
- | ページ固有のスタイル | `p--front` / `p--post`(または `frontPage` / `postPage`) | `@layer lism-custom` |
154
+ ---
177
155
 
178
- `c--header` のような命名も間違いとまでは言えないが、「カスタムクラス=必ず `c--`」ではないことに注意する。
156
+ ## 独自クラスの CSS を所定の `@layer` に入れない
179
157
 
180
- ---
158
+ `.c--*`のCSSは基本的に`@layer lism-custom`内に置く(`b--`のベーススタイルだけ`@layer lism-block`)。Astroの`<style>`内でも同じ。Layer外に置くと、Lism内部レイヤーやProperty Classとの優先順位設計が崩れる。
181
159
 
182
- ## クラス名の命名ミス(kebab-case)
160
+ | NG | OK |
161
+ | --- | --- |
162
+ | `.c--hero { padding: var(--s40); }` | `@layer lism-custom { .c--hero::before { ... } }` |
163
+ | `<style>.c--pricing { ... }</style>` | `<style>@layer lism-custom { .c--pricing { ... } }</style>` |
164
+ | `@layer lism-custom { .b--btn { ... } }` | `@layer lism-block { .b--btn { ... } }` |
183
165
 
184
- Lism CSS では、プレフィックス(`c--` / `is--` / `has--` / `u--` / `set--` 等)に続く名称は **camelCase** で書くのが規約。kebab-case で書くと、BEM の Modifier 区切り(`--`)と視覚的に紛れて読みにくくなる。
166
+ ただし、`c--*`のクラスでは、`padding`/`gap`/`font-size`/`color`などProps/Property Classへ移せる宣言を、Layerへ入れる前にマークアップ側へ移す(`b--`のベーススタイルは対象外で、`@layer lism-block`で CSS 側で管理してよい)。
167
+ また、詳細度の関係で`@layer`の外で書く必要がある場合は外に出してよい。
185
168
 
186
- → 詳細: [naming.md](./naming.md#クラス名)
169
+ ---
170
+
171
+ ## hover を component CSS に書いて負ける
172
+
173
+ hover効果は`-hov:*`、`hov={{}}`、`set--hov`、`has--transition`を優先する。component CSSの`:hover`へ単純な色・影・transformを直接書くと、Property Classやhover変数の設計と競合しやすい。
187
174
 
188
175
  | NG | OK | 理由 |
189
- |---|---|---|
190
- | `c--my-card` | `c--myCard` | プレフィックス後の名称は camelCase |
191
- | `c--my-card--primary` | `c--myCard--primary` | Modifier 区切り `--` と単語区切り `-` が混在して読みにくい |
192
- | `c--card_my-elem` | `c--card_myElem` | Element 名(`_` 後)も camelCase |
193
- | `is--side-bar` / `has--gutter-x` | `is--sideBar` / `has--gutterX` | `is--` / `has--` / `u--` 等にも同じ規則が適用される |
176
+ | --- | --- | --- |
177
+ | `.c--button:hover { box-shadow: var(--bxsh--20); }` | `<Button hov={{ bxsh: '20' }} hasTransition>` | hover用Property Classを使う |
178
+ | `.c--card:hover { background: var(--base-2); }` | `<Box hov={{ bgc: 'base-2' }} hasTransition>` | hover時の値はPropsで宣言できる |
179
+ | `.c--link:hover { --keycolor: var(--brand); }` | `set--hov`や`hov={{ ... }}`を検討 | hover変数の仕組みに寄せる |
194
180
 
195
- ```jsx
196
- // NG: kebab-case
197
- <Stack className="c--feature-card" />
198
- <div className="c--user-profile c--user-profile--compact" />
181
+ 擬似要素や複雑な子孫セレクタが必要なhoverだけCSSに残す。
199
182
 
200
- // OK: camelCase
201
- <Stack className="c--featureCard" />
202
- <div className="c--userProfile c--userProfile--compact" />
203
- ```
183
+ ---
184
+
185
+ ## Reset 済みプロパティの再指定
186
+
187
+ Lism CSSのreset/base styleで既に初期化されている値を、念のために再指定しない。特に`margin:0`系はHTML要素側で処理済みなので、意図的な差分が無い限り追加しない。
188
+
189
+ | NG | OK | 理由 |
190
+ | --- | --- | --- |
191
+ | `<p class="-m:0">` | `<p>` | resetで`margin:0`済み。不要なProperty Classがノイズになる |
192
+ | `<Heading m="0">` | `<Heading>` | 見出しmarginもbase側の前提を確認し、同値なら書かない |
193
+ | `.c--body { margin: 0; }` | `.c--body {}`または削除 | reset済みの宣言をcomponent CSSへ再掲しない |
194
+
195
+ 例外として、特定の外部CSS配下・埋め込みHTML・resetが効かない隔離領域で打ち消しが必要な場合は、理由を残して指定する。
204
196
 
205
197
  ---
206
198
 
@@ -211,13 +203,13 @@ Lism CSS では、プレフィックス(`c--` / `is--` / `has--` / `u--` / `se
211
203
  ### `:root` でのグローバル上書き
212
204
 
213
205
  | NG | OK | 理由 |
214
- |---|---|---|
206
+ | --- | --- | --- |
215
207
  | `:root { --keycolor: #c8553d; }` | `:root { --brand: #c8553d; }`(または `--accent` / `--link`) | サイト共通の色は `--brand` / `--accent` / `--link` などのセマンティックカラーで定義する |
216
208
 
217
209
  ### アクセントカラーとしての `keycolor` 参照
218
210
 
219
211
  | NG | OK | 理由 |
220
- |---|---|---|
212
+ | --- | --- | --- |
221
213
  | `<Link c="keycolor">` | `<Link c="brand">` または `<Link c="link">` | リンク・hover などの恒常的なアクセントは `brand` / `link` を使う |
222
214
  | `hov={{ c: 'keycolor' }}` | `hov={{ c: 'brand' }}` | 同上 |
223
215
  | `border-inline-start: 3px solid var(--keycolor)`(CSS 直書き) | `border-inline-start: 3px solid var(--brand)` | 同上 |
@@ -229,7 +221,7 @@ Lism CSS では、プレフィックス(`c--` / `is--` / `has--` / `u--` / `se
229
221
  ```html
230
222
  <!-- u--cbox や c--callout など、ボックス全体の色味を局所的に切り替える -->
231
223
  <div class="u--cbox" style="--keycolor: var(--red)">
232
- <p class="-c" style="--c: var(--keycolor)">danger 用カラーリング</p>
224
+ <p class="-c:keycolor">danger 用カラーリング</p>
233
225
  </div>
234
226
  ```
235
227
 
@@ -239,7 +231,7 @@ Lism CSS では、プレフィックス(`c--` / `is--` / `has--` / `u--` / `se
239
231
  </Lism>
240
232
  ```
241
233
 
242
- 詳細: [tokens.md のキーカラー変数セクション](./tokens.md#キーカラー変数-keycolor)
234
+ 詳細: [tokens.md のキーカラー変数セクション](./tokens.md#キーカラー変数---keycolor)
243
235
 
244
236
  ---
245
237
 
@@ -248,88 +240,21 @@ Lism CSS では、プレフィックス(`c--` / `is--` / `has--` / `u--` / `se
248
240
  ### Heading の `level` は文字列
249
241
 
250
242
  | NG | OK | 理由 |
251
- |---|---|---|
243
+ | --- | --- | --- |
252
244
  | `<Heading level={3}>` | `<Heading level="3">` | `level` は `'1'` 〜 `'6'` の文字列 union 型 |
253
245
 
254
246
  ### レスポンシブ値は配列 or オブジェクト
255
247
 
256
248
  | NG | OK | 理由 |
257
- |---|---|---|
249
+ | --- | --- | --- |
258
250
  | `<Columns cols="1,2,3">` | `<Columns cols={[1, 2, 3]}>` | レスポンシブは配列 |
259
251
  | `<Box p="20 30 40">` | `<Box p={[20, 30, 40]}>` | 同上 |
260
252
 
261
- ---
262
-
263
- ## レイアウト選択ミス
264
-
265
- 詳細な選択基準は [primitive-class.md](./primitive-class.md#カラムレイアウト-primitive-の使い分けガイド) の使い分けガイドを参照。
266
-
267
- ### Grid 直書き vs Columns
268
-
269
- | NG | OK | 理由 |
270
- |---|---|---|
271
- | `<Grid gtc="repeat(3, 1fr)">` | `<Columns cols={3}>` | 等幅 N 列は Columns で宣言的に書く |
272
- | `<Grid gtc={['1fr', '1fr 1fr', '1fr 1fr 1fr']}>` | `<Columns cols={[1, 2, 3]}>` | BP 切替も Columns のほうが簡潔 |
273
-
274
- ### コンテンツ幅のハードコード
275
-
276
- | NG | OK | 理由 |
277
- |---|---|---|
278
- | `style={{ maxWidth: '1200px' }}` | `<Box max-sz="l">` | ヘッダーやセクションなど、コンテンツサイズにはトークン値(`xs` / `s` / `m` / `l` / `xl` / `bleed`)をできるだけ活用する |
253
+ ### BP 非対応 Prop への配列指定
279
254
 
280
- ### サイドバー型レイアウト
255
+ レスポンシブ配列を渡せるのは BP 対応の Prop だけ。BP 対応可否は [all-props.md](./property-class/all-props.md) の BP 列で確認する。
281
256
 
282
257
  | NG | OK | 理由 |
283
- |---|---|---|
284
- | `<Grid gtc="1fr 240px">` で固定 | `<WithSide sideW="240px">` | コンテンツ幅で自動切替したいなら WithSide |
285
- | `<Flex>` で 2 カラム強制横並び | `<WithSide>` | 縦並びへの切替が必要なら WithSide |
286
-
287
- ---
288
-
289
- ## レスポンシブ抜け
290
-
291
- ### `is--container` 祖先なしで BP 値を使用
292
-
293
- レスポンシブ値(配列・オブジェクト・`-{prop}_{bp}` クラス)は、デフォルト設定(SCSS 側 `$is_container_query: 1`)では `@container` クエリで発火するため、祖先要素のいずれかに `is--container`(コンポーネントなら `isContainer` prop)が必須。
294
-
295
- ※ プロジェクトの SCSS 設定で `$is_container_query: 0` にして `@media` クエリ運用に切り替えている場合は、`is--container` 祖先は不要。
258
+ | --- | --- | --- |
259
+ | `<Box ta={['start', null, 'center']}>` | `<Box ta="center">` | `ta` / `fw` / `ov` などは BP 非対応。レスポンシブが必要なら SCSS 側で `bp: 1` を有効にするか、単一値にする |
296
260
 
297
- ```jsx
298
- // NG: container 祖先がないので sm/md 値が発火しない
299
- <div>
300
- <Box p={[20, 30, 40]}>...</Box>
301
- </div>
302
-
303
- // OK: 祖先に isContainer
304
- <Stack isContainer>
305
- <Box p={[20, 30, 40]}>...</Box>
306
- </Stack>
307
- ```
308
-
309
- ### BP 専用クラスをベース値なしで使う
310
-
311
- BP 専用クラス(`-{prop}_{bp}`)やコンポーネントの BP キー(`{ sm: ... }` 等)だけを指定すると、BP 未満では値が空になり意図しないレイアウト崩れを起こす。必ずベース値とセットで指定する。
312
-
313
- ```jsx
314
- // NG: sm 未満で p が未指定になる
315
- <Box p={{ sm: 30 }}>...</Box>
316
-
317
- // OK: ベース値(base / 配列の先頭)を必ず添える
318
- <Box p={{ base: 20, sm: 30 }}>...</Box>
319
- <Box p={[20, 30]}>...</Box>
320
- ```
321
-
322
- 生 HTML / クラス指定で書く場合も同様:
323
-
324
- | NG | OK | 理由 |
325
- |---|---|---|
326
- | `<div class="-p_sm" style="--p_sm: var(--s30)">` | `<div class="-p:20 -p_sm" style="--p_sm: var(--s30)">` | BP 未満では値が空になるため、ベースクラス `-{prop}:{value}` も必要 |
327
-
328
- ### ブレイクポイントの誤用
329
-
330
- Lism CSS の標準出力で有効な BP は `sm: 480px` / `md: 800px` / `lg: 1120px`。`xs` は BP キーとして存在しない。
331
-
332
- | NG | OK | 理由 |
333
- |---|---|---|
334
- | `<Box p={{ xs: 10, sm: 20 }}>` | `<Box p={{ base: 10, sm: 20 }}>` | デフォルトは `base`(`xs` キーは無い) |
335
- | `cols={[1, 2, 3, 4, 5]}` | `cols={[1, 2, 3, 4]}` | 標準出力では `[base, sm, md, lg]` までが有効。`xl` 以降は SCSS 設定が必要 |
@@ -38,13 +38,13 @@ Reset CSS に加え、`@layer lism-base` 内で HTML タグに基本スタイル
38
38
  ### 全要素の行間
39
39
 
40
40
  | 変数 | 用途 |
41
- |------|------|
41
+ | --- | --- |
42
42
  | `--hl` | half-leading(行間の上下余白量)。`line-height: calc(1em + var(--hl) * 2)` として全要素に適用 |
43
43
 
44
44
  ### body
45
45
 
46
46
  | 変数 | 用途 |
47
- |------|------|
47
+ | --- | --- |
48
48
  | `--fz--base` | ベースフォントサイズ |
49
49
  | `--ff--base` | ベースフォントファミリー |
50
50
  | `--lts--base` | ベース字間 |
@@ -56,7 +56,7 @@ Reset CSS に加え、`@layer lism-base` 内で HTML タグに基本スタイル
56
56
  ### 見出し(h1〜h6)
57
57
 
58
58
  | 変数 | 用途 |
59
- |------|------|
59
+ | --- | --- |
60
60
  | `--headings-ff` | 全見出し共通のフォントファミリー(デフォルト: `inherit`) |
61
61
  | `--headings-fw` | 全見出し共通のフォントウェイト(デフォルト: `var(--fw--bold)`) |
62
62
 
@@ -65,22 +65,22 @@ Reset CSS に加え、`@layer lism-base` 内で HTML タグに基本スタイル
65
65
  ### リンク(a)
66
66
 
67
67
  | 変数 | フォールバック | 用途 |
68
- |------|------------|------|
68
+ | --- | --- | --- |
69
69
  | `--link-c` | `var(--link)` | リンクテキスト色 |
70
70
  | `--link-td` | `underline` | テキスト装飾の種類 |
71
71
 
72
72
  ### リスト(ul, ol)
73
73
 
74
- class を持たない `ul` / `ol` のみブラウザ標準スタイルが自動で復活する(`_html.scss`)。Property Class のみが付いた `ul` / `ol` では list-style が消えたままになるため、箇条書き表示を維持したい場合は [`set--revert`](./set-class.md#set--revert) を付与する。
74
+ class を持たない `ul` / `ol` のみブラウザ標準スタイルが自動で復活する(`_html.scss`)。クラス付きで箇条書き表示を維持したい場合は [`set--revert`](./set-class.md#set--revert) を付与する。
75
75
 
76
76
  | 変数 | フォールバック | 用途 |
77
- |------|------------|------|
77
+ | --- | --- | --- |
78
78
  | `--list-ps` | `1.75em` | リストの `padding-inline-start` |
79
79
 
80
80
  ### テーブル(td, th)
81
81
 
82
82
  | 変数 | フォールバック | 用途 |
83
- |------|------------|------|
83
+ | --- | --- | --- |
84
84
  | `--cells-p` | `0.625em 0.875em` | セルのパディング |
85
85
 
86
86
  `td` と `th` の両方に `--cells-p` が適用される。色や最小幅などのカスタマイズは必要な要素にスタイルを直接当てる。
@@ -88,7 +88,7 @@ class を持たない `ul` / `ol` のみブラウザ標準スタイルが自動
88
88
  ### フォーム要素
89
89
 
90
90
  | 変数 | フォールバック | 用途 |
91
- |------|------------|------|
91
+ | --- | --- | --- |
92
92
  | `--controls-bgc` | `var(--base-2)` | 背景色 |
93
93
  | `--controls-bdc` | `var(--divider)` | ボーダー色 |
94
94
  | `--controls-p` | `0.25em 0.5em` | パディング |
@@ -98,5 +98,6 @@ class を持たない `ul` / `ol` のみブラウザ標準スタイルが自動
98
98
  ### その他
99
99
 
100
100
  | 変数 | 対象 | 用途 |
101
- |------|------|------|
101
+ | --- | --- | --- |
102
102
  | `--focus-offset` | `:focus-visible` | アウトラインのオフセット(デフォルト: `0px`) |
103
+ | `--o--pp` | `:disabled` | 無効状態の不透明度(デフォルト: `0.5`) |
@@ -19,6 +19,7 @@ import { Lism, Box, Flex, Stack, Grid, Text, Media } from 'lism-css/astro';
19
19
  - [Trait Components](#trait-components)
20
20
  - [Layout Primitives](#layout-primitives)
21
21
  - [`getLismProps()`](#getlismprops--外部コンポーネントとの連携)
22
+ - [AstroでのラップコンポーネントのProps型](#astroでのラップコンポーネントのprops型)
22
23
 
23
24
  [詳細](https://lism-css.com/docs/core-components/lism-props.md)
24
25
 
@@ -49,7 +50,7 @@ import { Lism, Box, Flex, Stack, Grid, Text, Media } from 'lism-css/astro';
49
50
  すべての Lism コンポーネントで使えるpropsです。
50
51
 
51
52
  | Prop | 説明 | 例 |
52
- |------|------|-----|
53
+ | --- | --- | --- |
53
54
  | `as` | レンダリングする HTML 要素または外部コンポーネントを指定(デフォルト: `"div"`) | `as="section"`, `as={Image}` |
54
55
  | `layout` | レイアウトプリミティブ(`l--{layout}`)を指定 | `layout="flow"` |
55
56
  | `atomic` | アトミックプリミティブ(`a--{atomic}`)を指定。`'divider'` / `'spacer'` / `'decorator'` が利用可能(`'icon'` は内部用) | `atomic="divider"` |
@@ -66,7 +67,7 @@ import { Lism, Box, Flex, Stack, Grid, Text, Media } from 'lism-css/astro';
66
67
  <Media as={Image} src="..." p="20" bd />
67
68
  // → Image コンポーネントに { className: '-p:20 -bd' } が渡される
68
69
 
69
- // className でコンポーネントクラスを付与(c--* も className に直接書く)
70
+ // className で独自クラスを付与(c--* も className に直接書く)
70
71
  <Lism className="c--myComponent" p="10">...</Lism>
71
72
  // → <div class="c--myComponent -p:10">...</div>
72
73
 
@@ -109,14 +110,14 @@ import { Lism, Box, Flex, Stack, Grid, Text, Media } from 'lism-css/astro';
109
110
  `prop={value}`で指定した値(`value`)によって、基本的な出力は以下のように分類されます。
110
111
 
111
112
  | 値 | 出力形式 | 例 |
112
- |------|------|-----|
113
+ | --- | --- | --- |
113
114
  | トークン値・プリセット値 | `-{prop}:{value}` クラスのみ | `fz='l'` → `class="-fz:l"` |
114
115
  | `true` | `-{prop}` クラスのみ(変数なし) | `bd` / `bd={true}` → `class="-bd"` |
115
116
  | `:` で始まる値 | 強制的にクラス化 | `p=':hoge'` → `class="-p:hoge"` |
116
117
  | その他の値(レスポンシブ対応プロパティ) | `-{prop}` + `--{prop}` | `fz='20px'` → `class="-fz"` + `style="--fz:20px"` |
117
118
  | その他の値(レスポンシブ非対応プロパティ) | `style` 属性に直接出力 | `o='0.7'` → `style="opacity:0.7"` |
118
119
  | その他の値(変数プロパティ) | `--{prop}` | `bdw='2px'` → `style="--bdw:2px"` (`border-width`としては出力されない) |
119
- | レスポンシブ指定値 | 上記いずれかのベース出力 + `-{prop}_{bp}` + `--{prop}_{bp}` | `p={[10,20]}` → `class="-p:10 -p_sm"` + `style="--p_sm:var(--s20)"`|
120
+ | レスポンシブ指定値 | 上記いずれかのベース出力 + `-{prop}_{bp}` + `--{prop}_{bp}` | `p={[10,20]}` → `class="-p:10 -p_sm"` + `style="--p_sm:var(--s20)"` |
120
121
 
121
122
  補足:
122
123
  - **レスポンシブ対応プロパティ**かどうかは、 `props.ts`で`bp: 1`がセットされているかどうかで分かります。
@@ -178,7 +179,7 @@ import { Lism, Box, Flex, Stack, Grid, Text, Media } from 'lism-css/astro';
178
179
  Trait クラス(`is--*` / `has--*`)を出力するためのプロパティ群です。
179
180
 
180
181
  | Prop | 出力クラス |
181
- |------|-----------|
182
+ | --- | --- |
182
183
  | `isWrapper` | `is--wrapper` |
183
184
  | `isWrapper="{s\|m\|l\|xl}"` | `is--wrapper` + `-contentSize:{s\|m\|l\|xl}` |
184
185
  | `isWrapper="{value}"` | `is--wrapper` + `-contentSize` + `--contentSize:{value}` |
@@ -208,7 +209,7 @@ Trait クラス(`is--*` / `has--*`)を出力するためのプロパティ
208
209
  `Lism` の `as` エイリアスとして機能するコンポーネント群です。layout クラスは付与されず、HTML のセマンティクスを表現するために使います。
209
210
 
210
211
  | コンポーネント | デフォルト要素 | 許容タグ |
211
- |-------------|-------------|---------|
212
+ | --- | --- | --- |
212
213
  | `<Text>` | `<p>` | `p`, `div`, `blockquote`, `address`, `figcaption`, `pre` |
213
214
  | `<Heading>` | `<h2>` | `h1`〜`h6`(`level` prop で指定) |
214
215
  | `<Inline>` | `<span>` | `span`, `em`, `strong`, `small`, `code`, `time`, `i`, `b`, `mark`, `abbr`, `cite`, `kbd`, `label` |
@@ -232,7 +233,7 @@ Trait クラス(`is--*` / `has--*`)を出力するためのプロパティ
232
233
  ## Atomic Primitives
233
234
 
234
235
  | コンポーネント | 出力クラス | 用途 |
235
- |-------------|-----------|------|
236
+ | --- | --- | --- |
236
237
  | `<Icon>` | `a--icon` | SVG アイコン・アイコンフォント |
237
238
  | `<Spacer>` | `a--spacer` | 空白要素 |
238
239
  | `<Divider>` | `a--divider` | 区切り線 |
@@ -247,7 +248,7 @@ Trait クラス(`is--*` / `has--*`)を出力するためのプロパティ
247
248
  `<Lism isXxx>`のエイリアスコンポーネントです。`is--*` クラスを出力します。
248
249
 
249
250
  | コンポーネント | 内部処理 | 出力クラス |
250
- |-------------|------------|-----------|
251
+ | --- | --- | --- |
251
252
  | `<Container>` | `isContainer` | `is--container` |
252
253
  | `<Wrapper>` | `isWrapper` | `is--wrapper` |
253
254
  | `<Layer>` | `isLayer` | `is--layer` |
@@ -261,7 +262,7 @@ Trait クラス(`is--*` / `has--*`)を出力するためのプロパティ
261
262
  内部で `layout` prop が固定されており、対応する `l--{layout}` クラスが自動で出力されます。各コンポーネントの専用 Props(`cols`, `rows`, `breakSize`, `sideW`/`mainW`, `flow` など)は、それぞれの詳細ファイルを参照してください。
262
263
 
263
264
  | コンポーネント | 出力クラス |
264
- |-------------|-----------|
265
+ | --- | --- |
265
266
  | `<Box>` | `l--box` |
266
267
  | `<Flex>` | `l--flex` |
267
268
  | `<Stack>` | `l--stack` |
@@ -293,3 +294,20 @@ function MyComponent({ children }) {
293
294
  return <div {...lismProps}>{children}</div>;
294
295
  }
295
296
  ```
297
+
298
+ ## AstroでのラップコンポーネントのProps型
299
+
300
+ Astroで`<Lism>`をラップする独自コンポーネントのProps型は、`interface extends`ではなく交差型(`&`)で合成する。`Lism`のProps型は`layout`による discriminated union を含むため、`interface extends`はTSエラーになる。
301
+
302
+ ```ts
303
+ import { Lism } from 'lism-css/astro';
304
+ import type { ComponentProps } from 'astro/types';
305
+
306
+ type LismProps = ComponentProps<typeof Lism>;
307
+
308
+ // NG: interface Props extends LismProps { class?: string } → TSエラー
309
+ // OK: 交差型で合成
310
+ type Props = LismProps & { class?: string };
311
+ ```
312
+
313
+ この制約は`<Lism>`に限らず、`<Text>`や`<Wrapper>`など layout Prop を受け取れるコンポーネント全般に共通する。`<Cluster>`など layout 固定のレイアウトコンポーネントのみ union を含まず`interface extends`も通るが、交差型に統一する。