@lism-css/mcp 0.10.4 → 0.12.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/README.ja.md +4 -2
- package/README.md +4 -2
- package/dist/data/docs-index.json +282 -64
- package/dist/data/guides/SKILL.md +113 -0
- package/dist/data/guides/base-styles.md +106 -0
- package/dist/data/guides/components-core.md +338 -0
- package/dist/data/guides/components-ui.md +351 -0
- package/dist/data/guides/css-rules.md +146 -0
- package/dist/data/guides/module-class.md +162 -0
- package/dist/data/guides/prop-responsive.md +54 -0
- package/dist/data/guides/property-class.md +400 -0
- package/dist/data/guides/set-class.md +190 -0
- package/dist/data/guides/tokens.md +210 -0
- package/dist/data/guides/utility-class.md +81 -0
- package/dist/data/meta.js +2 -2
- package/dist/index.js +4 -0
- package/dist/lib/load-data.js +2 -11
- package/dist/lib/load-markdown.d.ts +6 -0
- package/dist/lib/load-markdown.js +29 -0
- package/dist/lib/markdown-utils.d.ts +42 -0
- package/dist/lib/markdown-utils.js +158 -0
- package/dist/lib/schemas.d.ts +0 -242
- package/dist/lib/schemas.js +0 -64
- package/dist/lib/search.d.ts +2 -16
- package/dist/lib/search.js +9 -68
- package/dist/lib/types.d.ts +0 -64
- package/dist/tools/convert-css.js +96 -55
- package/dist/tools/get-component.js +60 -29
- package/dist/tools/get-guide.d.ts +2 -0
- package/dist/tools/get-guide.js +45 -0
- package/dist/tools/get-overview.js +26 -39
- package/dist/tools/get-props-system.js +45 -33
- package/dist/tools/get-tokens.js +9 -14
- package/dist/tools/search-docs.js +27 -9
- package/package.json +2 -2
- package/dist/data/components.json +0 -564
- package/dist/data/overview.json +0 -114
- package/dist/data/props-system.json +0 -1154
- package/dist/data/tokens.json +0 -152
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
# デザイントークン
|
|
2
|
+
|
|
3
|
+
Lism CSS では、余白・フォントサイズ・カラーなどの主要なCSSプロパティに対してデザイントークンを定義しています。
|
|
4
|
+
トークン値は CSS 変数にマッピングされ、Props やユーティリティクラスから参照できます。
|
|
5
|
+
|
|
6
|
+
CSSコードを書く場合やコンポーネントのPropsに値を指定する際は、明確な意図がない限りは固定値のハードコーディングを避け、デザイントークンの値を優先して使用してください。
|
|
7
|
+
|
|
8
|
+
## TOC
|
|
9
|
+
|
|
10
|
+
- [トークン概要テーブル](#トークン概要テーブル)
|
|
11
|
+
- [余白 (space)](#余白-space)
|
|
12
|
+
- [フォントサイズ (fz)](#フォントサイズ-fz)
|
|
13
|
+
- [行間 (lh/hl)](#行間-lhhl)
|
|
14
|
+
- [字間 (lts)](#字間-lts)
|
|
15
|
+
- [フォント (ff)](#フォント-ff)
|
|
16
|
+
- [ウェイト (fw)](#ウェイト-fw)
|
|
17
|
+
- [透明度 (o)](#透明度-o)
|
|
18
|
+
- [角丸 (bdrs)](#角丸-bdrs)
|
|
19
|
+
- [影 (bxsh)](#影-bxsh)
|
|
20
|
+
- [カラー](#カラー)
|
|
21
|
+
- [トークン値の命名規則](#トークン値の命名規則)
|
|
22
|
+
|
|
23
|
+
[詳細](https://lism-css.com/docs/tokens/)
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## トークン概要テーブル
|
|
28
|
+
|
|
29
|
+
| カテゴリ | トークン値 | CSS変数パターン | 例 |
|
|
30
|
+
|---|---|---|---|
|
|
31
|
+
| 余白 (space) | `5`, `10`, `15`, `20`, `30`, `40`, `50`, `60`, `70`, `80` | `--s{n}` | `--s20` |
|
|
32
|
+
| フォントサイズ (fz) | `root`, `base`, `2xs`, `xs`, `s`, `m`, `l`, `xl`, `2xl`, `3xl`, `4xl`, `5xl` | `--fz--{key}` | `--fz--l` |
|
|
33
|
+
| ハーフレディング・行間 (lh/hl) | `base`, `xs`, `s`, `l` | `--hl--{key}` | `--hl--s` |
|
|
34
|
+
| 字間 (lts) | `base`, `s`, `l` | `--lts--{key}` | `--lts--s` |
|
|
35
|
+
| フォント (ff) | `base`, `accent`, `mono` | `--ff--{key}` | `--ff--mono` |
|
|
36
|
+
| ウェイト (fw) | `light`, `normal`, `bold` | `--fw--{key}` | `--fw--bold` |
|
|
37
|
+
| 透明度 (o) | `-10`, `-20`, `-30` | `--o--n{n}` | `--o--n10` |
|
|
38
|
+
| 角丸 (bdrs) | `10`, `20`, `30`, `40`, `99`, `inner` | `--bdrs--{key}` | `--bdrs--20` |
|
|
39
|
+
| 影 (bxsh) | `10`, `20`, `30`, `40` | `--bxsh--{n}` | `--bxsh--20` |
|
|
40
|
+
| サイズ (sz) | `xs`, `s`, `m`, `l`, `xl`, `min`, `full`, `container` | `--sz--{key}` | `--sz--l` |
|
|
41
|
+
| アスペクト比 (ar) | `og` | `--ar--{key}` | `--ar--og` |
|
|
42
|
+
| 書字方向 (writing) | `vertical` | `--writing--{key}` | `--writing--vertical` |
|
|
43
|
+
| フロー余白 (flow) | `s`, `l` | `--flow--{key}` | `--flow--s` |
|
|
44
|
+
| セマンティックカラー (c) | `base`, `base-2`, `text`, `text-2`, `divider`, `link`, `brand`, `accent` | `--{name}` | `--brand` |
|
|
45
|
+
| パレットカラー (palette) | `red`, `blue`, `green`, `yellow`, `purple`, `orange`, `pink`, `gray`, `white`, `black` | `--{name}` | `--red` |
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
## 余白 (space)
|
|
52
|
+
|
|
53
|
+
フィボナッチ数列ベースのスケーリング。`--s-unit`(≒ 8px)を基準単位とする。
|
|
54
|
+
|
|
55
|
+
| CSS変数 | 値 | 実サイズ目安 |
|
|
56
|
+
|---------|-----|------------|
|
|
57
|
+
| `--s5` | `calc(0.5 * var(--s-unit))` | ≒ 4px |
|
|
58
|
+
| `--s10` | `var(--s-unit)` | ≒ 8px |
|
|
59
|
+
| `--s15` | `calc(1.5 * var(--s-unit))` | ≒ 12px |
|
|
60
|
+
| `--s20` | `calc(2 * var(--s-unit))` | ≒ 16px |
|
|
61
|
+
| `--s30` | `calc(3 * var(--s-unit))` | ≒ 24px |
|
|
62
|
+
| `--s40` | `calc(5 * var(--s-unit))` | ≒ 40px |
|
|
63
|
+
| `--s50` | `calc(8 * var(--s-unit))` | ≒ 64px |
|
|
64
|
+
| `--s60` | `calc(13 * var(--s-unit))` | ≒ 104px |
|
|
65
|
+
| `--s70` | `calc(21 * var(--s-unit))` | ≒ 168px |
|
|
66
|
+
| `--s80` | `calc(34 * var(--s-unit))` | ≒ 272px |
|
|
67
|
+
|
|
68
|
+
係数 `0.5, 1, 1.5, 2, 3, 5, 8, 13, 21, 34` はフィボナッチ数列に基づいている。`--s-unit` を上書きすることでスケール全体を調整可能。
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
## フォントサイズ (fz)
|
|
72
|
+
|
|
73
|
+
倍音列(調和数列)ベースの、ハーモニックモジュラースケーリングを採用。`--fz-mol`(デフォルト `8`)を分子とする `mol / (mol ± n)` の比率で算出される。
|
|
74
|
+
|
|
75
|
+
| CSS変数 | 値 | 説明 |
|
|
76
|
+
|---------|-----|------|
|
|
77
|
+
| `--fz--5xl` | `calc(1em * var(--fz-mol) / (var(--fz-mol) - 6))` | 最大(mol/(mol-6)) |
|
|
78
|
+
| `--fz--4xl` | `calc(1em * var(--fz-mol) / (var(--fz-mol) - 5))` | 特大(mol/(mol-5)) |
|
|
79
|
+
| `--fz--3xl` | `calc(1em * var(--fz-mol) / (var(--fz-mol) - 4))` | 3XL(mol/(mol-4)) |
|
|
80
|
+
| `--fz--2xl` | `calc(1em * var(--fz-mol) / (var(--fz-mol) - 3))` | 2XL(mol/(mol-3)) |
|
|
81
|
+
| `--fz--xl` | `calc(1em * var(--fz-mol) / (var(--fz-mol) - 2))` | XL(mol/(mol-2)) |
|
|
82
|
+
| `--fz--l` | `calc(1em * var(--fz-mol) / (var(--fz-mol) - 1))` | L(mol/(mol-1)) |
|
|
83
|
+
| `--fz--m` | `1em` | M(基準) |
|
|
84
|
+
| `--fz--s` | `calc(1em * var(--fz-mol) / (var(--fz-mol) + 1))` | S(mol/(mol+1)) |
|
|
85
|
+
| `--fz--xs` | `calc(1em * var(--fz-mol) / (var(--fz-mol) + 2))` | XS(mol/(mol+2)) |
|
|
86
|
+
| `--fz--2xs` | `calc(1em * var(--fz-mol) / (var(--fz-mol) + 3))` | 最小(mol/(mol+3)) |
|
|
87
|
+
| `--fz--base` | `var(--REM)` | 本文の基本フォントサイズ(≒ 1rem) |
|
|
88
|
+
| `--fz--root` | — | `:root` のフォントサイズ |
|
|
89
|
+
|
|
90
|
+
`--fz-mol` を上書きすることでスケール全体を調整可能(7以上の値に対応)。
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
## 行間 (lh/hl)
|
|
94
|
+
|
|
95
|
+
ハーフレディングの大きさ。Lism CSSでは、`line-height` は `calc(1em + var(--hl) * 2)` で算出される。`--hl-unit`(≒ 2px)を基準単位とする。
|
|
96
|
+
|
|
97
|
+
| CSS変数 | 値 | 説明 |
|
|
98
|
+
|---------|-----|------|
|
|
99
|
+
| `--hl--xs` | `var(--hl-unit)` | 極小の行間(≒ 2px) |
|
|
100
|
+
| `--hl--s` | `calc(var(--hl-unit) * 2)` | 小さめの行間(≒ 4px) |
|
|
101
|
+
| `--hl--base` | `calc(var(--hl-unit) * 3)` | 基本の行間(≒ 6px) |
|
|
102
|
+
| `--hl--l` | `calc(var(--hl-unit) * 4)` | 大きめの行間(≒ 8px) |
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
## 字間 (lts)
|
|
106
|
+
|
|
107
|
+
| CSS変数 | 値 | 説明 |
|
|
108
|
+
|---------|-----|------|
|
|
109
|
+
| `--lts--base` | `normal` | 基本の文字間隔 |
|
|
110
|
+
| `--lts--s` | `-0.05em` | 狭めの文字間隔 |
|
|
111
|
+
| `--lts--l` | `0.05em` | 広めの文字間隔 |
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
## フォント (ff)
|
|
115
|
+
|
|
116
|
+
| CSS変数 | 値 |
|
|
117
|
+
|---------|-----|
|
|
118
|
+
| `--ff--base` | `-apple-system, 'BlinkMacSystemFont', 'Hiragino Sans', sans-serif, 'Segoe UI Emoji'` |
|
|
119
|
+
| `--ff--accent` | `'Garamond', 'Baskerville', 'Times New Roman', serif` |
|
|
120
|
+
| `--ff--mono` | `ui-monospace, 'SFMono-Regular', Menlo, Consolas, monospace` |
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
## ウェイト (fw)
|
|
124
|
+
|
|
125
|
+
| CSS変数 | 値 | 説明 |
|
|
126
|
+
|---------|-----|------|
|
|
127
|
+
| `--fw--light` | `300` | 細め |
|
|
128
|
+
| `--fw--normal` | `400` | 標準 |
|
|
129
|
+
| `--fw--bold` | `600` | 太字(Hiragino Sans W6 相当) |
|
|
130
|
+
|
|
131
|
+
数値ユーティリティ: `-fw:100` 〜 `-fw:900` も使用可能。
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
## 透明度 (o)
|
|
135
|
+
|
|
136
|
+
| CSS変数 | 値 | 説明 |
|
|
137
|
+
|---------|-----|------|
|
|
138
|
+
| `--o--n10` | `0.75` | 75%の不透明度 |
|
|
139
|
+
| `--o--n20` | `0.5` | 50%の不透明度 |
|
|
140
|
+
| `--o--n30` | `0.25` | 25%の不透明度 |
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
## 角丸 (bdrs)
|
|
144
|
+
|
|
145
|
+
| CSS変数 | 値 | 説明 |
|
|
146
|
+
|---------|-----|------|
|
|
147
|
+
| `--bdrs--10` | `0.25rem` | ≒ 4px |
|
|
148
|
+
| `--bdrs--20` | `0.5rem` | ≒ 8px |
|
|
149
|
+
| `--bdrs--30` | `1rem` | ≒ 16px |
|
|
150
|
+
| `--bdrs--40` | `1.5rem` | ≒ 24px |
|
|
151
|
+
| `--bdrs--99` | `99rem` | 完全な丸(pill) |
|
|
152
|
+
| `--bdrs--inner` | `calc(var(--bdrs, 0px) - var(--p, 0px))` | 内側の角丸(親要素に合わせる) |
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
## 影 (bxsh)
|
|
156
|
+
|
|
157
|
+
`--shc`(シャドウカラー: `hsl(220 4% 8% / 5%)`)と `--shsz--{n}`(シャドウサイズ)を組み合わせた複合シャドウ。使用時は `set--shadow` クラスの併用が必要(影色 `--shc` の再計算のため)。
|
|
158
|
+
|
|
159
|
+
| CSS変数 | 値 | 説明 |
|
|
160
|
+
|---------|-----|------|
|
|
161
|
+
| `--bxsh--10` | `var(--sh--5), var(--sh--10)` | step 10 |
|
|
162
|
+
| `--bxsh--20` | `var(--sh--10), var(--sh--20)` | step 20 |
|
|
163
|
+
| `--bxsh--30` | `var(--sh--20), var(--sh--30)` | step 30 |
|
|
164
|
+
| `--bxsh--40` | `var(--sh--30), var(--sh--40)` | step 40(最も濃い) |
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
## カラー
|
|
168
|
+
|
|
169
|
+
### セマンティックカラー
|
|
170
|
+
|
|
171
|
+
サイト全体のカラー設計に使用するトークン。
|
|
172
|
+
|
|
173
|
+
| CSS変数 | デフォルト値 | 説明 |
|
|
174
|
+
|---------|------------|------|
|
|
175
|
+
| `--base` | `hsl(224 4% 99%)` | ベース背景色 |
|
|
176
|
+
| `--base-2` | `hsl(224 8% 95%)` | 代替背景色 |
|
|
177
|
+
| `--text` | `hsl(224 4% 8%)` | 基本テキスト色 |
|
|
178
|
+
| `--text-2` | `hsl(224 6% 32%)` | 補助テキスト色 |
|
|
179
|
+
| `--divider` | `hsl(224 8% 88%)` | 区切り線色 |
|
|
180
|
+
| `--link` | `oklch(50% 0.3 240)` | リンク色 |
|
|
181
|
+
| `--brand` | `#1e5f8c` | ブランド色 |
|
|
182
|
+
| `--accent` | `#d94a6a` | アクセント色 |
|
|
183
|
+
|
|
184
|
+
### パレットカラー
|
|
185
|
+
|
|
186
|
+
OKLCH で定義されたカラーパレット。`--L`(明度)と `--C`(彩度)の基準値を調整するとパレット全体の色味を変更可能。デフォルト: `--L: 60%`, `--C: 0.22`。
|
|
187
|
+
|
|
188
|
+
| CSS変数 | 値 |
|
|
189
|
+
|---------|-----|
|
|
190
|
+
| `--red` | `oklch(var(--L) var(--C) 20)` |
|
|
191
|
+
| `--orange` | `oklch(calc(var(--L) + 4%) calc(var(--C) - 0.01) 52)` |
|
|
192
|
+
| `--yellow` | `oklch(calc(var(--L) + 12%) calc(var(--C) - 0.025) 84)` |
|
|
193
|
+
| `--green` | `oklch(calc(var(--L) + 4%) calc(var(--C) - 0.02) 152)` |
|
|
194
|
+
| `--blue` | `oklch(calc(var(--L) - 2%) calc(var(--C) + 0.01) 260)` |
|
|
195
|
+
| `--purple` | `oklch(calc(var(--L) - 4%) calc(var(--C) + 0.02) 292)` |
|
|
196
|
+
| `--pink` | `oklch(calc(var(--L) + 2%) calc(var(--C) + 0.02) 348)` |
|
|
197
|
+
| `--gray` | `oklch(calc(var(--L) - 4%) 0.04 256)` |
|
|
198
|
+
| `--black` | `#000` |
|
|
199
|
+
| `--white` | `#fff` |
|
|
200
|
+
|
|
201
|
+
- `c`, `bgc` 等のカラー系 Props では、セマンティックカラー → パレットカラーの順で検索される
|
|
202
|
+
- どちらも最終的に `var(--{name})` に変換される
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
## トークン値の命名規則
|
|
206
|
+
|
|
207
|
+
1. **`s`, `m`, `l`, `xl` 等のサイズ表記** — ベース値(`base` or `m`)があり、それに対する大小を表すトークン
|
|
208
|
+
- `:root`/`body` にセットされている値に戻すものは `base`、そうでない中心値は `m`
|
|
209
|
+
2. **`10`, `20`, `30` 等の数値表記** — `0`(`none`)が基準で、段階的に値を持つトークン
|
|
210
|
+
3. **セマンティック名** — プロパティ固有の意味を持つ名前(例: `--ar--og`, `--ff--mono`など)
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# ユーティリティクラス(`u--`)
|
|
2
|
+
|
|
3
|
+
`u--` プレフィックスを持つユーティリティクラスは、用途が明確なスタイルセットをまとめて適用するクラスです。
|
|
4
|
+
`@layer lism-utility` に属します。
|
|
5
|
+
|
|
6
|
+
> **Property Class との違い:**
|
|
7
|
+
> Property Class(`-{prop}:{value}`)は個別の CSS プロパティを 1 対 1 で制御するクラスです。
|
|
8
|
+
> ユーティリティクラス(`u--{name}`)は複数のプロパティや子要素への効果をまとめて提供するもので、まったく別の仕組みです。
|
|
9
|
+
|
|
10
|
+
## TOC
|
|
11
|
+
|
|
12
|
+
- [コアに含まれるユーティリティ一覧](#コアに含まれるユーティリティ一覧)
|
|
13
|
+
- [使用例](#使用例)
|
|
14
|
+
- [Opt-in ユーティリティ](#opt-in-ユーティリティ)
|
|
15
|
+
- [ユーザー定義のユーティリティクラス](#ユーザー定義のユーティリティクラス)
|
|
16
|
+
|
|
17
|
+
[詳細](https://lism-css.com/docs/utility-class/)
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## コアに含まれるユーティリティ一覧
|
|
22
|
+
|
|
23
|
+
以下は `lism-css` コアの CSS に組み込まれているユーティリティクラスです。
|
|
24
|
+
|
|
25
|
+
| クラス | 用途 | ソースファイル |
|
|
26
|
+
|--------|------|---------------|
|
|
27
|
+
| `u--trim` | ハーフレディングのネガティブマージンでテキスト上下の余白を詰める | [`_trimHL.scss`](https://github.com/lism-css/lism-css/blob/main/packages/lism-css/src/scss/utility/_trimHL.scss) |
|
|
28
|
+
| `u--trimChildren` | 子要素すべてにハーフレディングトリムを適用(`img`, `figure`, `button` は除外) | [`_trimHL.scss`](https://github.com/lism-css/lism-css/blob/main/packages/lism-css/src/scss/utility/_trimHL.scss) |
|
|
29
|
+
| `u--cbox` | `--keycolor` を使い `color-mix()` で `--c` / `--bgc` / `--bdc` を自動生成する色付きボックス | [`_cbox.scss`](https://github.com/lism-css/lism-css/blob/main/packages/lism-css/src/scss/utility/_cbox.scss) |
|
|
30
|
+
| `u--collapseGrid` | Grid / Flex の子要素間に `box-shadow` で境界線を表現する | [`_itemDivider.scss`](https://github.com/lism-css/lism-css/blob/main/packages/lism-css/src/scss/utility/_itemDivider.scss) |
|
|
31
|
+
| `u--expandedLink` | `::before` 疑似要素で親コンテナ全体をクリック可能にするリンク。`is--linkBox` と併用 | [`_linkExpand.scss`](https://github.com/lism-css/lism-css/blob/main/packages/lism-css/src/scss/utility/_linkExpand.scss) |
|
|
32
|
+
| `u--srOnly` | スクリーンリーダー専用(視覚的に非表示)。`clip-path: inset(50%)` で実装 | [`_hidden.scss`](https://github.com/lism-css/lism-css/blob/main/packages/lism-css/src/scss/utility/_hidden.scss) |
|
|
33
|
+
| `u--snap` | スクロールスナップコンテナ。`--snapType`, `--snapAlign`, `--snapStop` で制御 | [`_snap.scss`](https://github.com/lism-css/lism-css/blob/main/packages/lism-css/src/scss/utility/_snap.scss) |
|
|
34
|
+
| `u--clipText` | テキストで背景をクリッピング(`background-clip: text`) | [`_clipText.scss`](https://github.com/lism-css/lism-css/blob/main/packages/lism-css/src/scss/utility/_clipText.scss) |
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
## 使用例
|
|
38
|
+
|
|
39
|
+
```html
|
|
40
|
+
<!-- u--cbox: キーカラーで色付きボックス -->
|
|
41
|
+
<div class="u--cbox -bd -p:20" style="--keycolor: var(--blue)">...</div>
|
|
42
|
+
|
|
43
|
+
<!-- u--trim: テキスト余白の詰め -->
|
|
44
|
+
<p class="u--trim">テキスト...</p>
|
|
45
|
+
|
|
46
|
+
<!-- u--collapseGrid: グリッド子要素間の境界線 -->
|
|
47
|
+
<div class="l--grid u--collapseGrid" style="--gtc: 1fr 1fr">
|
|
48
|
+
<div>A</div>
|
|
49
|
+
<div>B</div>
|
|
50
|
+
</div>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
```jsx
|
|
54
|
+
// JSX での使用(className で指定)
|
|
55
|
+
<Lism className="u--cbox" keycolor="red" bd p="20">...</Lism>
|
|
56
|
+
<Text className="u--trim">テキスト...</Text>
|
|
57
|
+
<Grid className="u--collapseGrid" gtc="1fr 1fr">...</Grid>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
## Opt-in ユーティリティ
|
|
62
|
+
|
|
63
|
+
コアには含まれないが、ドキュメントで紹介されている追加ユーティリティの例:
|
|
64
|
+
|
|
65
|
+
- `u--inlineCenter`: 絵文字やインラインアイコンをテキスト中央に揃える
|
|
66
|
+
|
|
67
|
+
これらは必要に応じて自分で CSS を追加して使用します。
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
## ユーザー定義のユーティリティクラス
|
|
71
|
+
|
|
72
|
+
`u--{name}` の命名規則に従えば、独自のユーティリティクラスを自由に定義できます。
|
|
73
|
+
定義は `@layer lism-utility` の中で行ってください。
|
|
74
|
+
|
|
75
|
+
```css
|
|
76
|
+
@layer lism-utility {
|
|
77
|
+
.u--myUtil {
|
|
78
|
+
/* カスタムスタイル */
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
```
|
package/dist/data/meta.js
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
3
|
import { preloadAll } from './lib/load-data.js';
|
|
4
|
+
import { preloadGuides } from './lib/load-markdown.js';
|
|
4
5
|
import { registerGetOverview } from './tools/get-overview.js';
|
|
5
6
|
import { registerGetTokens } from './tools/get-tokens.js';
|
|
6
7
|
import { registerGetPropsSystem } from './tools/get-props-system.js';
|
|
7
8
|
import { registerGetComponent } from './tools/get-component.js';
|
|
9
|
+
import { registerGetGuide } from './tools/get-guide.js';
|
|
8
10
|
import { registerSearchDocs } from './tools/search-docs.js';
|
|
9
11
|
import { registerConvertCss } from './tools/convert-css.js';
|
|
10
12
|
async function main() {
|
|
11
13
|
preloadAll();
|
|
14
|
+
preloadGuides();
|
|
12
15
|
const server = new McpServer({
|
|
13
16
|
name: 'lism-css',
|
|
14
17
|
version: '0.1.0',
|
|
@@ -17,6 +20,7 @@ async function main() {
|
|
|
17
20
|
registerGetTokens(server);
|
|
18
21
|
registerGetPropsSystem(server);
|
|
19
22
|
registerGetComponent(server);
|
|
23
|
+
registerGetGuide(server);
|
|
20
24
|
registerSearchDocs(server);
|
|
21
25
|
registerConvertCss(server);
|
|
22
26
|
const transport = new StdioServerTransport();
|
package/dist/lib/load-data.js
CHANGED
|
@@ -2,7 +2,7 @@ import { readFileSync } from 'node:fs';
|
|
|
2
2
|
import { dirname, resolve } from 'node:path';
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
4
|
import { z } from 'zod';
|
|
5
|
-
import {
|
|
5
|
+
import { DocsEntrySchema } from './schemas.js';
|
|
6
6
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
7
7
|
const dataDir = resolve(__dirname, '..', 'data');
|
|
8
8
|
const cache = new Map();
|
|
@@ -16,14 +16,5 @@ export function loadJSON(filename, schema) {
|
|
|
16
16
|
return data;
|
|
17
17
|
}
|
|
18
18
|
export function preloadAll() {
|
|
19
|
-
|
|
20
|
-
{ filename: 'overview.json', schema: OverviewDataSchema },
|
|
21
|
-
{ filename: 'tokens.json', schema: z.array(TokenCategorySchema) },
|
|
22
|
-
{ filename: 'props-system.json', schema: PropsSystemDataSchema },
|
|
23
|
-
{ filename: 'components.json', schema: z.array(ComponentInfoSchema) },
|
|
24
|
-
{ filename: 'docs-index.json', schema: z.array(DocsEntrySchema) },
|
|
25
|
-
];
|
|
26
|
-
for (const { filename, schema } of entries) {
|
|
27
|
-
loadJSON(filename, schema);
|
|
28
|
-
}
|
|
19
|
+
loadJSON('docs-index.json', z.array(DocsEntrySchema));
|
|
29
20
|
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** guides/ ディレクトリから Markdown ファイルを読み込む(キャッシュ付き) */
|
|
2
|
+
export declare function loadMarkdown(filename: string): string;
|
|
3
|
+
/** 利用可能なガイドファイル名の一覧を返す */
|
|
4
|
+
export declare function getGuideFilenames(): string[];
|
|
5
|
+
/** 起動時に全ガイドを一括読み込みしてキャッシュに載せる */
|
|
6
|
+
export declare function preloadGuides(): void;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
2
|
+
import { dirname, resolve } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
5
|
+
// スキル Markdown の正本を直接参照(開発・テスト時)
|
|
6
|
+
// npm パッケージとして利用される場合は dist/data/guides/ にフォールバック
|
|
7
|
+
const skillsDir = resolve(__dirname, '..', '..', '..', '..', '.claude', 'skills', 'lism-css-guide');
|
|
8
|
+
const distDir = resolve(__dirname, '..', 'data', 'guides');
|
|
9
|
+
const guidesDir = existsSync(skillsDir) ? skillsDir : distDir;
|
|
10
|
+
const cache = new Map();
|
|
11
|
+
/** guides/ ディレクトリから Markdown ファイルを読み込む(キャッシュ付き) */
|
|
12
|
+
export function loadMarkdown(filename) {
|
|
13
|
+
if (cache.has(filename))
|
|
14
|
+
return cache.get(filename);
|
|
15
|
+
const filePath = resolve(guidesDir, filename);
|
|
16
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
17
|
+
cache.set(filename, content);
|
|
18
|
+
return content;
|
|
19
|
+
}
|
|
20
|
+
/** 利用可能なガイドファイル名の一覧を返す */
|
|
21
|
+
export function getGuideFilenames() {
|
|
22
|
+
return readdirSync(guidesDir).filter((f) => f.endsWith('.md'));
|
|
23
|
+
}
|
|
24
|
+
/** 起動時に全ガイドを一括読み込みしてキャッシュに載せる */
|
|
25
|
+
export function preloadGuides() {
|
|
26
|
+
for (const filename of getGuideFilenames()) {
|
|
27
|
+
loadMarkdown(filename);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown から指定した見出しのセクションを抽出する。
|
|
3
|
+
* 同レベル以上の次の見出しが来るまでの内容を返す。
|
|
4
|
+
* @param md - Markdown 全文
|
|
5
|
+
* @param heading - 見出しテキスト(`#` プレフィックスあり・なし両可)
|
|
6
|
+
*/
|
|
7
|
+
export declare function extractSection(md: string, heading: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* Markdown から全ての見出しとその開始行を抽出する。
|
|
10
|
+
*/
|
|
11
|
+
export declare function listHeadings(md: string): {
|
|
12
|
+
level: number;
|
|
13
|
+
text: string;
|
|
14
|
+
line: number;
|
|
15
|
+
}[];
|
|
16
|
+
export interface PropRow {
|
|
17
|
+
/** Lism Prop 名(例: "fz") */
|
|
18
|
+
prop: string;
|
|
19
|
+
/** CSS プロパティ名(例: "font-size")。変数形式("--hl")も含む */
|
|
20
|
+
cssProperty: string;
|
|
21
|
+
/** 所属する ### セクション名 */
|
|
22
|
+
sectionName: string;
|
|
23
|
+
/** プリセット値クラス列の生テキスト(例: "-fz:root, -fz:base, ...") */
|
|
24
|
+
presetColumn: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* property-class.md のテーブルを全て解析して PropRow[] を返す。
|
|
28
|
+
* `| Prop | CSS プロパティ | ...` 形式のテーブルのみ対象とする。
|
|
29
|
+
*/
|
|
30
|
+
export declare function parsePropRows(md: string): PropRow[];
|
|
31
|
+
/**
|
|
32
|
+
* Markdown からコンポーネント名に一致するセクションを探して返す。
|
|
33
|
+
*
|
|
34
|
+
* components-ui.md のように各コンポーネントが `## ComponentName` で始まる場合に有効。
|
|
35
|
+
*/
|
|
36
|
+
export declare function findComponentByHeading(md: string, name: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* Markdown 内のテーブルセル(`` `<ComponentName>` ``)からコンポーネントを含む
|
|
39
|
+
* `##` セクション全体を返す。
|
|
40
|
+
* components-core.md のように複数コンポーネントが同一セクションに列挙されている場合に使う。
|
|
41
|
+
*/
|
|
42
|
+
export declare function findComponentInTables(md: string, name: string): string;
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/** 見出しの `#` レベルを返す(見出しでなければ 0) */
|
|
2
|
+
function headingLevel(line) {
|
|
3
|
+
const m = line.match(/^(#{1,6})\s/);
|
|
4
|
+
return m ? m[1].length : 0;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Markdown から指定した見出しのセクションを抽出する。
|
|
8
|
+
* 同レベル以上の次の見出しが来るまでの内容を返す。
|
|
9
|
+
* @param md - Markdown 全文
|
|
10
|
+
* @param heading - 見出しテキスト(`#` プレフィックスあり・なし両可)
|
|
11
|
+
*/
|
|
12
|
+
export function extractSection(md, heading) {
|
|
13
|
+
const headingText = heading.replace(/^#+\s*/, '').trim();
|
|
14
|
+
const lines = md.split('\n');
|
|
15
|
+
let startIdx = -1;
|
|
16
|
+
let level = 0;
|
|
17
|
+
for (let i = 0; i < lines.length; i++) {
|
|
18
|
+
const lv = headingLevel(lines[i]);
|
|
19
|
+
if (lv > 0 && lines[i].replace(/^#+\s*/, '').trim() === headingText) {
|
|
20
|
+
startIdx = i;
|
|
21
|
+
level = lv;
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (startIdx === -1)
|
|
26
|
+
return '';
|
|
27
|
+
let endIdx = lines.length;
|
|
28
|
+
for (let i = startIdx + 1; i < lines.length; i++) {
|
|
29
|
+
const lv = headingLevel(lines[i]);
|
|
30
|
+
if (lv > 0 && lv <= level) {
|
|
31
|
+
endIdx = i;
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return lines.slice(startIdx, endIdx).join('\n').trimEnd();
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Markdown から全ての見出しとその開始行を抽出する。
|
|
39
|
+
*/
|
|
40
|
+
export function listHeadings(md) {
|
|
41
|
+
return md.split('\n').flatMap((line, i) => {
|
|
42
|
+
const lv = headingLevel(line);
|
|
43
|
+
if (lv === 0)
|
|
44
|
+
return [];
|
|
45
|
+
return [{ level: lv, text: line.replace(/^#+\s*/, '').trim(), line: i }];
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* property-class.md のテーブルを全て解析して PropRow[] を返す。
|
|
50
|
+
* `| Prop | CSS プロパティ | ...` 形式のテーブルのみ対象とする。
|
|
51
|
+
*/
|
|
52
|
+
export function parsePropRows(md) {
|
|
53
|
+
const lines = md.split('\n');
|
|
54
|
+
const rows = [];
|
|
55
|
+
let currentSection = '';
|
|
56
|
+
let inPropTable = false;
|
|
57
|
+
for (const line of lines) {
|
|
58
|
+
const lv = headingLevel(line);
|
|
59
|
+
// セクション見出しを追跡(### レベル)
|
|
60
|
+
if (lv >= 2) {
|
|
61
|
+
currentSection = line.replace(/^#+\s*/, '').trim();
|
|
62
|
+
inPropTable = false;
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
// Property Class テーブルのヘッダー行を検出
|
|
66
|
+
if (line.includes('Prop') && line.includes('CSS プロパティ')) {
|
|
67
|
+
inPropTable = true;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
// 区切り行はスキップ
|
|
71
|
+
if (inPropTable && /^\|[-\s|:]+\|/.test(line)) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
// テーブルの終了を検出
|
|
75
|
+
if (inPropTable && !line.startsWith('|')) {
|
|
76
|
+
inPropTable = false;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
// データ行を解析
|
|
80
|
+
if (inPropTable && line.startsWith('|')) {
|
|
81
|
+
const cells = line
|
|
82
|
+
.split('|')
|
|
83
|
+
.map((c) => c.trim())
|
|
84
|
+
.filter(Boolean);
|
|
85
|
+
if (cells.length >= 2) {
|
|
86
|
+
const prop = cells[0].replace(/`/g, '').trim();
|
|
87
|
+
// CSS プロパティ: バッククォート除去、括弧内の注釈は保持しない
|
|
88
|
+
const cssPropertyRaw = cells[1].replace(/`/g, '').trim();
|
|
89
|
+
// `line-height`(`--hl` 経由) のような括弧注釈を除去
|
|
90
|
+
const cssProperty = cssPropertyRaw
|
|
91
|
+
.replace(/([^)]*)$/, '')
|
|
92
|
+
.replace(/\([^)]*\)$/, '')
|
|
93
|
+
.trim();
|
|
94
|
+
if (prop && cssProperty) {
|
|
95
|
+
const presetColumn = cells.length >= 3 ? cells[2].replace(/`/g, '').trim() : '';
|
|
96
|
+
rows.push({ prop, cssProperty, sectionName: currentSection, presetColumn });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return rows;
|
|
102
|
+
}
|
|
103
|
+
// ----------------------------------------------------------------
|
|
104
|
+
// コンポーネント検索
|
|
105
|
+
// ----------------------------------------------------------------
|
|
106
|
+
/**
|
|
107
|
+
* Markdown からコンポーネント名に一致するセクションを探して返す。
|
|
108
|
+
*
|
|
109
|
+
* components-ui.md のように各コンポーネントが `## ComponentName` で始まる場合に有効。
|
|
110
|
+
*/
|
|
111
|
+
export function findComponentByHeading(md, name) {
|
|
112
|
+
return extractSection(md, name);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Markdown 内のテーブルセル(`` `<ComponentName>` ``)からコンポーネントを含む
|
|
116
|
+
* `##` セクション全体を返す。
|
|
117
|
+
* components-core.md のように複数コンポーネントが同一セクションに列挙されている場合に使う。
|
|
118
|
+
*/
|
|
119
|
+
export function findComponentInTables(md, name) {
|
|
120
|
+
const nameLower = name.toLowerCase();
|
|
121
|
+
const lines = md.split('\n');
|
|
122
|
+
// コンポーネント名のパターン: `<Flex>`, `<flex>`, または単純に "flex" がテーブル行に含まれるか
|
|
123
|
+
const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
124
|
+
const pattern = new RegExp(`\`?<${escaped}>?\`?`, 'i');
|
|
125
|
+
// まず対象行を探す
|
|
126
|
+
let targetLineIdx = -1;
|
|
127
|
+
for (let i = 0; i < lines.length; i++) {
|
|
128
|
+
if (lines[i].startsWith('|') && (pattern.test(lines[i]) || lines[i].toLowerCase().includes(`\`${nameLower}\``))) {
|
|
129
|
+
targetLineIdx = i;
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (targetLineIdx === -1)
|
|
134
|
+
return '';
|
|
135
|
+
// 対象行を含む ## セクションの開始を遡って探す
|
|
136
|
+
let sectionStart = -1;
|
|
137
|
+
let sectionLevel = 0;
|
|
138
|
+
for (let i = targetLineIdx; i >= 0; i--) {
|
|
139
|
+
const lv = headingLevel(lines[i]);
|
|
140
|
+
if (lv === 2) {
|
|
141
|
+
sectionStart = i;
|
|
142
|
+
sectionLevel = lv;
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (sectionStart === -1)
|
|
147
|
+
return lines.slice(0, targetLineIdx + 20).join('\n');
|
|
148
|
+
// セクションの終端を探す
|
|
149
|
+
let sectionEnd = lines.length;
|
|
150
|
+
for (let i = sectionStart + 1; i < lines.length; i++) {
|
|
151
|
+
const lv = headingLevel(lines[i]);
|
|
152
|
+
if (lv > 0 && lv <= sectionLevel) {
|
|
153
|
+
sectionEnd = i;
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return lines.slice(sectionStart, sectionEnd).join('\n').trimEnd();
|
|
158
|
+
}
|