create-pugkit 1.0.0-beta.1

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.
@@ -0,0 +1,532 @@
1
+ /**
2
+ * Stylelint Configuration
3
+ * モダンなCSS/SCSSのための厳格なリントルール設定
4
+ *
5
+ * @see https://stylelint.io/user-guide/configure
6
+ */
7
+ export default {
8
+ extends: ['stylelint-config-standard-scss', 'stylelint-config-recess-order'],
9
+
10
+ ignoreFiles: [
11
+ '**/*.js',
12
+ '**/*.ts',
13
+ '**/*.html',
14
+ '**/*.pug',
15
+ '**/*.json',
16
+ '**/*.md',
17
+ '**/node_modules/**',
18
+ '**/dist/**',
19
+ '**/.git/**'
20
+ ],
21
+
22
+ rules: {
23
+ // ========================================
24
+ // @ ルール
25
+ // ========================================
26
+
27
+ /**
28
+ * @font-faceで必須プロパティを強制
29
+ * font-familyとsrcは必須
30
+ */
31
+ 'at-rule-property-required-list': {
32
+ 'font-face': ['font-family', 'src']
33
+ },
34
+
35
+ // ========================================
36
+ // カラー
37
+ // ========================================
38
+
39
+ /**
40
+ * 16進数カラーコードのアルファ値を禁止
41
+ * 理由: oklch()などのモダンなカラー関数を推奨
42
+ * NG: #ffffff80
43
+ * OK: oklch(from #fff l c h / 0.5)
44
+ */
45
+ 'color-hex-alpha': 'never',
46
+
47
+ /**
48
+ * 名前付きカラーを禁止
49
+ * 理由: 一貫性のため16進数またはoklch()を使用
50
+ * NG: color: red;
51
+ * OK: color: #ff0000; または oklch(...)
52
+ */
53
+ 'color-named': [
54
+ 'never',
55
+ {
56
+ message: '名前付きカラー(red, blue等)は禁止です。16進数(#ff0000)またはoklch()を使用してください'
57
+ }
58
+ ],
59
+
60
+ /**
61
+ * 無効な16進数カラーコードを禁止
62
+ */
63
+ 'color-no-invalid-hex': true,
64
+
65
+ /**
66
+ * モダンなカラー関数記法を強制
67
+ * 理由: oklch(), lab()などのCSS Color Module Level 4を推奨
68
+ * NG: rgb(255, 0, 0)
69
+ * OK: oklch(0.628 0.258 29.23)
70
+ */
71
+ 'color-function-notation': [
72
+ 'modern',
73
+ {
74
+ message: '古い形式のカラー関数(rgb(255, 0, 0))ではなく、モダンな形式(oklch(...))を使用してください'
75
+ }
76
+ ],
77
+
78
+ /**
79
+ * 色相角度の単位を明示
80
+ * 理由: oklch()使用時の可読性向上
81
+ * OK: oklch(0% 0 0deg / 0.3)
82
+ */
83
+ 'hue-degree-notation': 'angle',
84
+
85
+ /**
86
+ * アルファ値を数値形式で統一
87
+ * 理由: プロジェクトでは0.5形式を100%使用
88
+ * NG: oklch(... / 50%)
89
+ * OK: oklch(... / 0.5)
90
+ */
91
+ 'alpha-value-notation': [
92
+ 'number',
93
+ {
94
+ message: 'アルファ値はパーセント(50%)ではなく数値(0.5)で指定してください'
95
+ }
96
+ ],
97
+
98
+ // ========================================
99
+ // ネスト・セレクタ
100
+ // ========================================
101
+
102
+ /**
103
+ * ネストの深さを3階層までに制限
104
+ * 理由: プロジェクトの実態(最大3階層)に合わせた設定
105
+ * BEM構造を採用しているため、深いネストは不要
106
+ */
107
+ 'max-nesting-depth': [
108
+ 3,
109
+ {
110
+ ignore: ['blockless-at-rules', 'pseudo-classes'],
111
+ message: 'ネストの深さは3階層までです。BEM構造を見直してください'
112
+ }
113
+ ],
114
+
115
+ /**
116
+ * タイプセレクタによる修飾を禁止
117
+ * 理由: 詳細度の肥大化を防ぐ
118
+ * NG: div.class, a#id
119
+ * OK: .class, .class[data-attr]
120
+ */
121
+ 'selector-no-qualifying-type': [
122
+ true,
123
+ {
124
+ ignore: ['attribute', 'class'],
125
+ message: 'タグ名でクラスやIDを修飾しないでください(例: div.class → .class)'
126
+ }
127
+ ],
128
+
129
+ /**
130
+ * IDセレクタを完全禁止
131
+ * 理由: モダンなCSS設計(BEM)ではIDセレクタを使用しない
132
+ */
133
+ 'selector-max-id': [
134
+ 0,
135
+ {
136
+ message: 'IDセレクタ(#id)は使用できません。クラスセレクタ(.class)を使用してください'
137
+ }
138
+ ],
139
+
140
+ /**
141
+ * ユニバーサルセレクタの使用を制限
142
+ * 理由: パフォーマンス上の問題を防ぐ
143
+ * OK: .class + *(隣接セレクタ後は許可)
144
+ */
145
+ 'selector-max-universal': [
146
+ 1,
147
+ {
148
+ ignoreAfterCombinators: ['+']
149
+ }
150
+ ],
151
+
152
+ /**
153
+ * 疑似要素にダブルコロン記法を強制
154
+ * 理由: 疑似クラスとの区別を明確に
155
+ * NG: :before
156
+ * OK: ::before
157
+ */
158
+ 'selector-pseudo-element-colon-notation': 'double',
159
+
160
+ /**
161
+ * 未知の疑似要素を禁止(例外あり)
162
+ */
163
+ 'selector-pseudo-element-no-unknown': [
164
+ true,
165
+ {
166
+ ignorePseudoElements: ['scroll-button']
167
+ }
168
+ ],
169
+
170
+ /**
171
+ * 詳細度の降順を許可
172
+ * 理由: BEM構造では詳細度管理が明確なため不要
173
+ */
174
+ 'no-descending-specificity': null,
175
+
176
+ /**
177
+ * 重複セレクタを禁止
178
+ * 理由: コードの保守性向上
179
+ */
180
+ 'no-duplicate-selectors': null,
181
+
182
+ // ========================================
183
+ // 命名規則
184
+ // ========================================
185
+
186
+ /**
187
+ * カスタムプロパティの命名規則
188
+ * パターン: --name, --_name(プライベート変数)
189
+ * 例: --color-primary, --_space
190
+ */
191
+ 'custom-property-pattern': '^(_)?[a-z][a-z0-9]*(-[a-z0-9]+)*$',
192
+
193
+ /**
194
+ * !importantの使用を禁止
195
+ * 理由: 詳細度を適切に管理することで解決すべき
196
+ * 注意: ユーティリティクラスや外部ライブラリの上書きなど、
197
+ * プロジェクトの方針で例外を認める場合は手動でルール無効化が必要
198
+ */
199
+ 'declaration-no-important': [
200
+ true,
201
+ {
202
+ message: '!importantは使用できません。詳細度を適切に管理してください'
203
+ }
204
+ ],
205
+
206
+ /**
207
+ * クラス名の命名規則(BEM)
208
+ * パターン:
209
+ * - BEM Element: __element
210
+ * - BEM Modifier: --modifier
211
+ * - ハイフン区切り: kebab-case
212
+ *
213
+ * 例:
214
+ * - .button
215
+ * - .button__anchor
216
+ * - .button--primary
217
+ * - .about-banner
218
+ */
219
+ 'selector-class-pattern':
220
+ '^[a-z][a-z0-9]*(-[a-z0-9]+)*(__[a-z][a-z0-9]*(-[a-z0-9]+)*)?(--[a-z][a-z0-9]*(-[a-z0-9]+)*)?$',
221
+
222
+ /**
223
+ * z-indexの値を制限
224
+ * 理由: 重なり順の管理を簡素化
225
+ * OK: z-index: 1, z-index: -1, z-index: var(--z-index), z-index: calc(...)
226
+ * NG: z-index: 999, z-index: 10, z-index: 2
227
+ */
228
+ 'declaration-property-value-allowed-list': [
229
+ {
230
+ 'z-index': ['/^-?1$/', '/^var\(--/', '/^calc\(/']
231
+ /**
232
+ * text-alignプロパティの値を制限
233
+ * 理由: 国際化対応(書字方向に依存しない設計)
234
+ * OK: text-align: start, text-align: end, text-align: center, text-align: justify, text-align: unset
235
+ * NG: text-align: left, text-align: right(LTR/RTL文字列混在時に非対応)
236
+ */
237
+ },
238
+ {
239
+ message: (value, property) => {
240
+ if (property === 'z-index') {
241
+ return 'z-indexは1、-1、CSS変数(var(--)、またはcalc()のみ使用できます。他の値が必要な場合は設計を見直してください'
242
+ }
243
+ return '許可されていない値です'
244
+ }
245
+ }
246
+ ],
247
+
248
+ /**
249
+ * line-heightの単位を禁止
250
+ * 理由: 単位なしの相対値を推奨(継承の問題を防ぐ)
251
+ * NG: line-height: 24px
252
+ * OK: line-height: 1.5
253
+ */
254
+ 'declaration-property-unit-allowed-list': [
255
+ {
256
+ 'line-height': []
257
+ },
258
+ {
259
+ message: 'line-heightには単位を付けないでください。単位なしの相対値(1.5など)を使用してください'
260
+ }
261
+ ],
262
+
263
+ /**
264
+ * 未知のプロパティ値を許可
265
+ * 理由: プロジェクトのカスタム関数(px()など)を使用
266
+ */
267
+ 'declaration-property-value-no-unknown': null,
268
+
269
+ /**
270
+ * ショートハンドプロパティの冗長性チェックを無効化
271
+ * 理由: 個別プロパティの使用を推奨
272
+ * 推奨: background-color vs background
273
+ */
274
+ 'declaration-block-no-redundant-longhand-properties': null,
275
+
276
+ // ========================================
277
+ // フォント・テキスト
278
+ // ========================================
279
+
280
+ /**
281
+ * フォントファミリー名の引用符を適切に管理
282
+ * 理由: スペース含むフォント名の安全性
283
+ * OK: font-family: "Noto Sans JP", sans-serif
284
+ */
285
+ 'font-family-name-quotes': 'always-where-recommended',
286
+
287
+ /**
288
+ * font-weightを数値形式で統一
289
+ * 理由: 細かい制御が可能
290
+ * NG: font-weight: bold
291
+ * OK: font-weight: 700
292
+ * 例外: font-weight: bolder(relative)
293
+ */
294
+ 'font-weight-notation': [
295
+ 'numeric',
296
+ {
297
+ ignore: ['relative']
298
+ }
299
+ ],
300
+
301
+ // ========================================
302
+ // 関数・URL
303
+ // ========================================
304
+
305
+ /**
306
+ * 未知の関数を許可
307
+ * 理由: プロジェクトのカスタム関数(px(), svg-uri()など)を使用
308
+ */
309
+ 'function-no-unknown': null,
310
+
311
+ /**
312
+ * URLに引用符を強制
313
+ * 理由: セキュリティ向上、パス内のスペース対応
314
+ * NG: url(../img/logo.svg)
315
+ * OK: url('../img/logo.svg')
316
+ */
317
+ 'function-url-quotes': 'always',
318
+
319
+ /**
320
+ * プロトコル相対URLを禁止
321
+ * 理由: セキュリティリスク
322
+ * NG: url(//example.com/image.jpg)
323
+ */
324
+ 'function-url-no-scheme-relative': true,
325
+
326
+ // ========================================
327
+ // 単位・数値
328
+ // ========================================
329
+
330
+ /**
331
+ * 0値に単位を付けない
332
+ * 理由: 不要な単位を削除
333
+ * NG: margin: 0px
334
+ * OK: margin: 0
335
+ * 例外: カスタムプロパティ(--_: 0px)
336
+ */
337
+ 'length-zero-no-unit': [
338
+ true,
339
+ {
340
+ ignore: ['custom-properties']
341
+ }
342
+ ],
343
+
344
+ /**
345
+ * 小数点以下の桁数を5桁までに制限
346
+ * 理由: 過度な精度を防止
347
+ */
348
+ 'number-max-precision': 5,
349
+
350
+ /**
351
+ * 古いビューポート単位の使用を警告
352
+ * 理由: svw, dvw, lvwなどのモダンな単位を推奨
353
+ * 警告: vw, vh, vi, vb, vmin, vmax
354
+ * 推奨: svw, dvw, lvw, svh, dvh, lvh
355
+ */
356
+ 'unit-disallowed-list': [
357
+ ['vw', 'vh', 'vi', 'vb', 'vmin', 'vmax'],
358
+ {
359
+ severity: 'warning'
360
+ }
361
+ ],
362
+
363
+ // ========================================
364
+ // その他の値
365
+ // ========================================
366
+
367
+ /**
368
+ * メディアクエリの値を検証
369
+ */
370
+ 'media-feature-name-value-no-unknown': true,
371
+
372
+ /**
373
+ * キーワード値を小文字に統一
374
+ * 例外: SVGキーワードはキャメルケースを許可
375
+ */
376
+ 'value-keyword-case': [
377
+ 'lower',
378
+ {
379
+ camelCaseSvgKeywords: true
380
+ }
381
+ ],
382
+
383
+ // ========================================
384
+ // プロパティ
385
+ // ========================================
386
+
387
+ /**
388
+ * 未知のプロパティを禁止(例外あり)
389
+ * 例外: 実験的なCSS機能
390
+ */
391
+ 'property-no-unknown': [
392
+ true,
393
+ {
394
+ ignoreProperties: [
395
+ 'text-decoration-inset',
396
+ 'field-sizing',
397
+ 'reading-flow',
398
+ 'reading-order',
399
+ 'navigation',
400
+ 'interpolate-size',
401
+ 'text-box',
402
+ 'interactivity',
403
+ 'corner-shape'
404
+ ]
405
+ }
406
+ ],
407
+
408
+ /**
409
+ * ベンダープレフィックスを制限(例外あり)
410
+ * 例外: Autoprefixerでカバーされないプロパティ
411
+ */
412
+ 'property-no-vendor-prefix': [
413
+ true,
414
+ {
415
+ ignoreProperties: ['backdrop-filter', 'mask', 'mask-image', 'text-size-adjust', 'appearance']
416
+ }
417
+ ],
418
+
419
+ /**
420
+ * 非推奨プロパティを条件付きで許可
421
+ * 理由:
422
+ * - Chromiumブラウザのバグ対応で -webkit-user-modify が必要
423
+ * - visually-hidden パターンで clip が標準的に使用される(Bootstrap/Tailwind準拠)
424
+ */
425
+ 'property-no-deprecated': [
426
+ true,
427
+ {
428
+ ignoreProperties: ['-moz-user-modify', '-webkit-user-modify', 'clip']
429
+ }
430
+ ],
431
+
432
+ /**
433
+ * 無効なposition宣言チェックを無効化
434
+ * 理由: stylelint v17の新ルールがCSS変数(--_name)を誤検知
435
+ * TODO: stylelint側で修正されたら再有効化を検討
436
+ */
437
+ 'no-invalid-position-declaration': null,
438
+
439
+ // ========================================
440
+ // SCSS固有のルール
441
+ // ========================================
442
+
443
+ /**
444
+ * 未知のat-ruleを許可
445
+ * 理由: @container, @starting-styleなど最新CSS機能を使用
446
+ */
447
+ 'scss/at-rule-no-unknown': null,
448
+
449
+ /**
450
+ * Sass変数宣言前の空行を強制
451
+ * 例外: 最初のネスト、変数の連続、コメント後
452
+ */
453
+ 'scss/dollar-variable-empty-line-before': [
454
+ 'always',
455
+ {
456
+ except: ['first-nested', 'after-dollar-variable'],
457
+ ignore: ['after-comment']
458
+ }
459
+ ],
460
+
461
+ /**
462
+ * Sass変数の命名規則
463
+ * パターン: kebab-case
464
+ * 例: $color-primary, $grid-breakpoints
465
+ */
466
+ 'scss/dollar-variable-pattern': '^[a-z][a-z0-9]*(-[a-z0-9]+)*$',
467
+
468
+ /**
469
+ * Sassプレースホルダーの命名規則
470
+ * パターン: kebab-case
471
+ * 例: %clearfix, %button-base
472
+ */
473
+ 'scss/percent-placeholder-pattern': '^[a-z][a-z0-9]*(-[a-z0-9]+)*$',
474
+
475
+ /**
476
+ * グローバル関数名を禁止し、名前空間付き関数を強制
477
+ * 理由: Dart Sassのベストプラクティス
478
+ * NG: map-get($map, key)
479
+ * OK: map.get($map, key)
480
+ */
481
+ 'scss/no-global-function-names': [
482
+ true,
483
+ {
484
+ message: 'グローバル関数は非推奨です。名前空間付き関数を使用してください。例: map-get() → map.get()'
485
+ }
486
+ ],
487
+
488
+ /**
489
+ * @use/@forwardでのパーシャル拡張子を禁止
490
+ * 理由: Sass公式推奨(ファイル形式の変更に対応)
491
+ * NG: @use "./variables.scss"
492
+ * OK: @use "./variables"
493
+ */
494
+ 'scss/load-partial-extension': 'never',
495
+
496
+ // ========================================
497
+ // フォーマット・空白行
498
+ // ========================================
499
+
500
+ /**
501
+ * コメント前の空行を強制
502
+ * 理由: セクション区切りの可読性向上
503
+ * 例外: 最初のネスト、連続するコメント
504
+ */
505
+ 'comment-empty-line-before': [
506
+ 'always',
507
+ {
508
+ except: ['first-nested'],
509
+ ignore: ['stylelint-commands', 'after-comment']
510
+ }
511
+ ],
512
+
513
+ /**
514
+ * プロパティ宣言前の空行を許可
515
+ * 理由: プロパティ間に空行を入れない書き方を採用
516
+ */
517
+ 'declaration-empty-line-before': null,
518
+
519
+ /**
520
+ * ルール前の空行を条件付きで強制
521
+ * 理由: 可読性向上
522
+ * 例外: 最初のネスト、コメント後
523
+ */
524
+ 'rule-empty-line-before': [
525
+ 'always-multi-line',
526
+ {
527
+ except: ['first-nested'],
528
+ ignore: ['after-comment']
529
+ }
530
+ ]
531
+ }
532
+ }