@lism-css/mcp 0.23.0 → 0.24.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 +51 -76
  4. package/dist/data/guides/SKILL.md +162 -229
  5. package/dist/data/guides/antipatterns-layout.md +268 -0
  6. package/dist/data/guides/antipatterns.md +118 -196
  7. package/dist/data/guides/base-styles.md +10 -9
  8. package/dist/data/guides/components-core.md +26 -8
  9. package/dist/data/guides/components-ui.md +21 -21
  10. package/dist/data/guides/css-rules.md +40 -57
  11. package/dist/data/guides/customize.md +7 -5
  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 +244 -0
  32. package/dist/data/guides/property-class/bd.md +5 -70
  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 +31 -249
  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 +73 -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 +15 -15
  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 +45 -2
  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 +40 -17
  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 +17 -2
@@ -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
+ - [`c--*` CSS を `@layer lism-component` に入れない](#c---css-を-layer-lism-component-に入れない)
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
+ - [Astro/React Primitive を使わず素の HTML で組む](./antipatterns-layout.md#astroreact-primitive-を使わず素の-html-で組む)
24
+ - [ボタン装飾を reset から自作する](./antipatterns-layout.md#ボタン装飾を-reset-から自作する)
25
+ - [`Frame` 未使用のメディア枠手組み](./antipatterns-layout.md#frame-未使用のメディア枠手組み)
26
+ - [全面リンクの手組み(`BoxLink` 未使用)](./antipatterns-layout.md#全面リンクの手組みboxlink-未使用)
27
+ - [primitive 既定値の重複指定](./antipatterns-layout.md#primitive-既定値の重複指定)
28
+ - [サイト最外殻を `Wrapper` に使う](./antipatterns-layout.md#サイト最外殻を-wrapper-に使う)
29
+ - [row 方向の `Flex` / `Cluster` 直下に `Wrapper` を置く](./antipatterns-layout.md#row-方向の-flex--cluster-直下に-wrapper-を置く)
30
+ - [セクション外殻を `Flex` + `min-h` で組む](./antipatterns-layout.md#セクション外殻を-flex--min-h-で組む)
31
+ - [標準 HTML 属性を `exProps` に入れる](./antipatterns-layout.md#標準-html-属性を-exprops-に入れる)
32
+ - [レスポンシブ抜け](./antipatterns-layout.md#レスポンシブ抜け)
33
+ - [レスポンシブ配列の冗長指定](./antipatterns-layout.md#レスポンシブ配列の冗長指定)
34
+ - [`is--` の誤用(状態・バリエーション)](./antipatterns-layout.md#is---の誤用状態バリエーション)
35
+ - [カスタムクラスを全て `c--` にしてしまう](./antipatterns-layout.md#カスタムクラスを全て-c---にしてしまう)
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,112 @@ 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--*` クラス名はマークアップに残して構わない**(むしろ推奨)。コンポーネントとしての役割をソースから読み取りやすくする目的で、意味づけ用に付けたままにする。
125
-
93
+ なお、CSS が空になっても `c--*` クラス名は意味名としてマークアップに残して構わない(→ [css-rules.md の作成例](./css-rules.md#作成例))。
126
94
 
127
95
  ---
128
96
 
129
- ## `is--` の誤用(状態・バリエーション)
97
+ ## Token typo(存在しない値)
98
+
99
+ Lism CSS側が用意しているトークン値と異なるものを書かないように注意する。
100
+ 正確な一覧は [tokens.md](./tokens.md) を参照すること。
101
+
102
+ ただし、ユーザーが独自に追加定義することは可能。あくまでデフォルトで用意されていないもので間違えやすいものを紹介しておく。
103
+
104
+ ### カラー
105
+
106
+ | NG | OK | 理由 |
107
+ | --- | --- | --- |
108
+ | `bgc="primary"` | `bgc="brand"` | セマンティックカラーに `primary`/`secondary` は無い。ブランド色は `brand`/`accent` |
109
+ | `bgc="secondary"` | `bgc="base-2"` | サブ背景色は `base-2`(`base-3` がユーザーによって追加定義されている可能性もある) |
110
+ | `c="muted"` | `c="text-2"` | 補助テキスト色は `text-2` |
111
+ | `c="danger"` | `c="red"` | パレットカラーから選ぶ(`red` / `orange` 等) |
112
+
113
+ - セマンティックカラー: `base` / `base-2` / `text` / `text-2` / `divider` / `link` / `brand` / `accent` / `neutral`
114
+ - パレットカラー: `red` / `blue` / `green` / `yellow` / `purple` / `orange` / `pink` / `gray` / `white` / `black`
130
115
 
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` などは誤用)。
116
+ ### スペース(`p` / `m` / `g` 等)
132
117
 
133
- 詳細: [trait-class.md](./trait-class.md#is-trait役割宣言)
118
+ スペーストークンの数値は**離散的**で、`5/10/15/20/25/30/35/40/50/60/70/80` のみが用意されている。`8/12/14/45/65/75` 等を書きそうになったら、必ず最寄りトークンに丸めるか、ユーザーに方針確認すること(→ [デザインデータ取り込みフロー](./references/authoring.md#デザインデータ取り込みフロー))。
134
119
 
135
- `is--` と紛れがちな 2 つの用途は、Lism では別の手段で表現する:
120
+ | NG | OK | 理由 |
121
+ | --- | --- | --- |
122
+ | `p="8"` | `p="10"` | スペーストークンは離散値のみ。tailwindのような4の倍数で連続するスケールではない |
123
+ | `g="6"` | `g="5"` | 同上 |
124
+ | `m="45"`, `m="55"` | `m="40"` or `m="50"` | `40` 以降の中間値は用意されていない(前半は `5/15/25/35` まで補完済み) |
125
+ | `m="100"` | `m="80"` | 上限は `80`(ユーザーが追加定義している可能性はある) |
136
126
 
137
- ### 1. 状態管理 → `data-*` 属性を使う
127
+ ### フォントサイズ(`fz`)
138
128
 
139
- オン/オフが切り替わる状態(active / current / disabled / open / selected 等)は、`is--*` クラスを増やさず HTML の `data-*` 属性で表現する。CSS は属性セレクタで書く。
129
+ | NG | OK | 理由 |
130
+ | --- | --- | --- |
131
+ | `fz="14"` | `fz="s"` | `fz` は文字列キー(数値は不可) |
132
+ | `fz="large"`, `fz="md"` | `fz="l"` | 略号は `2xs` / `xs` / `s` / `m` / `l` / `xl` / `2xl` … |
140
133
 
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] { ... }` |
134
+ ### 角丸 /
146
135
 
147
- 理由:
136
+ | NG | OK | 理由 |
137
+ | --- | --- | --- |
138
+ | `bdrs="sm"`, `bdrs="round"` | `bdrs="20"`, `bdrs="99"` | 角丸トークンは `10` / `20` / `30` / `40` / `99` / `inner` |
139
+ | `bxsh="xs"`, `bxsh="sm"` | `bxsh="10"`, `bxsh="20"` | shadowトークンは `10` / `20` / `30` / `40` / `50` |
140
+
141
+ ### プリセット外の値を Lism Props に渡している
142
+
143
+ Lism Props では、props.ts で事前定義されたものが `-{prop}:{value}` クラスとして出力される。それ以外の値はそのまま出力されてCSSとして無効になる。
144
+
145
+ ```JSX
146
+ // NG: 事前定義されたトークン値に合致しないため、-lts:2xl は出力されない
147
+ <Text lts="2xl">...</Text>
148
+ ```
148
149
 
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 セレクタにする
150
+ 独自にProperty Classを拡張したりトークン値を増やしたりする場合は、 [property-class.md `:value` 記法](./property-class.md)を活用するか、[`lism.config.js`による拡張](./customize.md)が必要。
152
151
 
153
- ### 2. スタイルバリエーション → BEM Modifier `c--{name}--{variant}`
152
+ ---
154
153
 
155
- 「同じコンポーネントの見た目違い」は、Lism CSS 公式の BEM Modifier 記法で表現する(→ [css-rules.md の Component Class](./css-rules.md#component-classc--))。
154
+ ## `c--*` CSS `@layer lism-component` に入れない
155
+
156
+ `.c--*`のCSSは基本的に`@layer lism-component`内に置く。Astroの`<style>`内でも同じ。Layer外に置くと、Lism内部レイヤーやProperty Classとの優先順位設計が崩れる。
156
157
 
157
158
  | 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">` |
159
+ | --- | --- |
160
+ | `.c--hero { padding: var(--s40); }` | `@layer lism-component { .c--hero::before { ... } }` |
161
+ | `<style>.c--card { ... }</style>` | `<style>@layer lism-component { .c--card { ... } }</style>` |
161
162
 
162
- なお、Modifier であってもまずは [Property Class で表現できないか](#property-class-で書けるのに-css-で書く) を検討すること。「色だけ違う」程度ならマークアップ側で `-bgc:* -c:*` を差し替えるだけで済むことも多い。
163
+ ただし、`padding`/`gap`/`font-size`/`color`などProps/Property Classへ移せる宣言は、Layerへ入れる前にマークアップ側へ移す。
164
+ また、詳細度の関係で`@layer`の外で書く必要がある場合は外に出してよい。
163
165
 
164
166
  ---
165
167
 
166
- ## カスタムクラスを全て `c--` にしてしまう
167
-
168
- `c--` は「**コンポーネント**(再利用可能な UI 部品)」を表すプレフィックス。**カスタムクラスを必ず `c--` で命名する必要はない**。サイトの大まかな領域(header / sidebar / main / footer 等)やページ固有のスタイルなど、再利用が前提でないクラスは、独自プレフィックス(`z--` / `p--` 等)やプレフィックスなしの命名も選択肢として検討すること。
168
+ ## hover component CSS に書いて負ける
169
169
 
170
- 詳細: [css-rules.md の独自プレフィックス](./css-rules.md#独自プレフィックス)
170
+ hover効果は`-hov:*`、`hov={{}}`、`set--hov`、`has--transition`を優先する。component CSSの`:hover`へ単純な色・影・transformを直接書くと、Property Classやhover変数の設計と競合しやすい。
171
171
 
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` |
172
+ | NG | OK | 理由 |
173
+ | --- | --- | --- |
174
+ | `.c--button:hover { box-shadow: var(--bxsh--20); }` | `<Button hov={{ bxsh: '20' }} hasTransition>` | hover用Property Classを使う |
175
+ | `.c--card:hover { background: var(--base-2); }` | `<Box hov={{ bgc: 'base-2' }} hasTransition>` | hover時の値はPropsで宣言できる |
176
+ | `.c--link:hover { --keycolor: var(--brand); }` | `set--hov`や`hov={{ ... }}`を検討 | hover変数の仕組みに寄せる |
177
177
 
178
- `c--header` のような命名も間違いとまでは言えないが、「カスタムクラス=必ず `c--`」ではないことに注意する。
178
+ 擬似要素や複雑な子孫セレクタが必要なhoverだけCSSに残す。
179
179
 
180
180
  ---
181
181
 
182
- ## クラス名の命名ミス(kebab-case)
183
-
184
- Lism CSS では、プレフィックス(`c--` / `is--` / `has--` / `u--` / `set--` 等)に続く名称は **camelCase** で書くのが規約。kebab-case で書くと、BEM の Modifier 区切り(`--`)と視覚的に紛れて読みにくくなる。
182
+ ## Reset 済みプロパティの再指定
185
183
 
186
- 詳細: [naming.md](./naming.md#クラス名)
184
+ Lism CSSのreset/base styleで既に初期化されている値を、念のために再指定しない。特に`margin:0`系はHTML要素側で処理済みなので、意図的な差分が無い限り追加しない。
187
185
 
188
186
  | 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--` 等にも同じ規則が適用される |
187
+ | --- | --- | --- |
188
+ | `<p class="-m:0">` | `<p>` | resetで`margin:0`済み。不要なProperty Classがノイズになる |
189
+ | `<Heading m="0">` | `<Heading>` | 見出しmarginもbase側の前提を確認し、同値なら書かない |
190
+ | `.c--body { margin: 0; }` | `.c--body {}`または削除 | reset済みの宣言をcomponent CSSへ再掲しない |
194
191
 
195
- ```jsx
196
- // NG: kebab-case
197
- <Stack className="c--feature-card" />
198
- <div className="c--user-profile c--user-profile--compact" />
199
-
200
- // OK: camelCase
201
- <Stack className="c--featureCard" />
202
- <div className="c--userProfile c--userProfile--compact" />
203
- ```
192
+ 例外として、特定の外部CSS配下・埋め込みHTML・resetが効かない隔離領域で打ち消しが必要な場合は、理由を残して指定する。
204
193
 
205
194
  ---
206
195
 
@@ -211,13 +200,13 @@ Lism CSS では、プレフィックス(`c--` / `is--` / `has--` / `u--` / `se
211
200
  ### `:root` でのグローバル上書き
212
201
 
213
202
  | NG | OK | 理由 |
214
- |---|---|---|
203
+ | --- | --- | --- |
215
204
  | `:root { --keycolor: #c8553d; }` | `:root { --brand: #c8553d; }`(または `--accent` / `--link`) | サイト共通の色は `--brand` / `--accent` / `--link` などのセマンティックカラーで定義する |
216
205
 
217
206
  ### アクセントカラーとしての `keycolor` 参照
218
207
 
219
208
  | NG | OK | 理由 |
220
- |---|---|---|
209
+ | --- | --- | --- |
221
210
  | `<Link c="keycolor">` | `<Link c="brand">` または `<Link c="link">` | リンク・hover などの恒常的なアクセントは `brand` / `link` を使う |
222
211
  | `hov={{ c: 'keycolor' }}` | `hov={{ c: 'brand' }}` | 同上 |
223
212
  | `border-inline-start: 3px solid var(--keycolor)`(CSS 直書き) | `border-inline-start: 3px solid var(--brand)` | 同上 |
@@ -239,7 +228,7 @@ Lism CSS では、プレフィックス(`c--` / `is--` / `has--` / `u--` / `se
239
228
  </Lism>
240
229
  ```
241
230
 
242
- 詳細: [tokens.md のキーカラー変数セクション](./tokens.md#キーカラー変数-keycolor)
231
+ 詳細: [tokens.md のキーカラー変数セクション](./tokens.md#キーカラー変数---keycolor)
243
232
 
244
233
  ---
245
234
 
@@ -248,88 +237,21 @@ Lism CSS では、プレフィックス(`c--` / `is--` / `has--` / `u--` / `se
248
237
  ### Heading の `level` は文字列
249
238
 
250
239
  | NG | OK | 理由 |
251
- |---|---|---|
240
+ | --- | --- | --- |
252
241
  | `<Heading level={3}>` | `<Heading level="3">` | `level` は `'1'` 〜 `'6'` の文字列 union 型 |
253
242
 
254
243
  ### レスポンシブ値は配列 or オブジェクト
255
244
 
256
245
  | NG | OK | 理由 |
257
- |---|---|---|
246
+ | --- | --- | --- |
258
247
  | `<Columns cols="1,2,3">` | `<Columns cols={[1, 2, 3]}>` | レスポンシブは配列 |
259
248
  | `<Box p="20 30 40">` | `<Box p={[20, 30, 40]}>` | 同上 |
260
249
 
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`)をできるだけ活用する |
250
+ ### BP 非対応 Prop への配列指定
279
251
 
280
- ### サイドバー型レイアウト
252
+ レスポンシブ配列を渡せるのは BP 対応の Prop だけ。BP 対応可否は [all-props.md](./property-class/all-props.md) の BP 列で確認する。
281
253
 
282
254
  | 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` 祖先は不要。
255
+ | --- | --- | --- |
256
+ | `<Grid cg={['40', null, '80']}>` | `<Grid g={['40', null, '80']}>` または `<Grid cg="40">` | `cg` / `rg` は BP 非対応。レスポンシブにするなら BP 対応の `g` を使うか、単一値にする |
296
257
 
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"` |
@@ -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`も通るが、交差型に統一する。