@d-zero/scaffold 5.0.0-alpha.42 → 5.0.0-alpha.43
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/.vscode/extensions.json +2 -1
- package/.vscode/settings.json +1 -1
- package/CHANGELOG.md +6 -0
- package/coding-rule.mdc +163 -0
- package/package.json +7 -7
package/.vscode/extensions.json
CHANGED
package/.vscode/settings.json
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [5.0.0-alpha.43](https://github.com/d-zero-dev/frontend-env/compare/v5.0.0-alpha.42...v5.0.0-alpha.43) (2025-03-12)
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
- **scaffold:** add AI prompt behavior and coding guidelines ([522752f](https://github.com/d-zero-dev/frontend-env/commit/522752f171d2afad212cedd5ffbfd68098ab0e57))
|
|
11
|
+
|
|
6
12
|
# [5.0.0-alpha.42](https://github.com/d-zero-dev/frontend-env/compare/v5.0.0-alpha.41...v5.0.0-alpha.42) (2025-03-06)
|
|
7
13
|
|
|
8
14
|
### Bug Fixes
|
package/coding-rule.mdc
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
# コーディングに関するAIエージェントの規定
|
|
2
|
+
|
|
3
|
+
## プロンプトに対する振る舞い
|
|
4
|
+
|
|
5
|
+
### コード生成
|
|
6
|
+
|
|
7
|
+
コード生成に関する指令を受けたときは、以下の手順で基本的に対応する。
|
|
8
|
+
|
|
9
|
+
<!-- ユーザー向け情報: @d-zero/mcp-serverをCLINEに設定している前提 -->
|
|
10
|
+
|
|
11
|
+
- コーディングガイドラインをMCPサーバ経由で読み、一旦内容を記憶する
|
|
12
|
+
- FigmaのURLを受け取り、MCPサーバ経由でFigmaのFileデータを取得する
|
|
13
|
+
- FigmaのFileデータを解析し、指令に対応するコンポーネントの準備をする
|
|
14
|
+
- 必要なコンポーネントファイルを作成する
|
|
15
|
+
- マークアップの形式はPugが良いかHTMLが良いかは最初は尋ねる
|
|
16
|
+
- 要素の順番はスクリーンリーダーやフォーカスの順番に依存し重要であるため、Figmaレイヤーの順番にはこだわらず、情報設計的な在り方を最優先に視覚的な配置を加味して順番を決定する
|
|
17
|
+
- マークアップは暗黙のロールに気をつけて、然るべきHTML要素を採用すること
|
|
18
|
+
- 選択肢がいくつもある場合はユーザーに尋ねること
|
|
19
|
+
- CSSを変更した際にStylelintの警告が発生するが、保存と同時に自動修正がかかる場合があるので、保存実行後は内容を再読み込みしてから必要な警告は再把握すること
|
|
20
|
+
|
|
21
|
+
## 実装方針
|
|
22
|
+
|
|
23
|
+
コード生成にあたってコーディングガイドラインにない細かい実装方針を記す。
|
|
24
|
+
|
|
25
|
+
### 全般
|
|
26
|
+
|
|
27
|
+
- Linterの警告は数回トライして直せない場合は、無効化するかどうかユーザーに尋ねる
|
|
28
|
+
- cSpellの警告は単純なスペルミスは修正し、固有名詞と思われるものであれば`cspell.json`に単語を追加する
|
|
29
|
+
- 省略可能単語はコーディングガイドラインに準ずる
|
|
30
|
+
|
|
31
|
+
### HTML
|
|
32
|
+
|
|
33
|
+
- ページ遷移しない(リンクでない)インタラクションにa要素を使わない
|
|
34
|
+
- WAI-ARIAを用いる必要があるときは適宜ユーザーに確認する
|
|
35
|
+
- WAI-ARIAを必要とする基準はARIA Authoring Practice Guideのコンポーネント
|
|
36
|
+
- APG以外に必要とする例外
|
|
37
|
+
- aria-currentはパンくず、フォームのプロセスなどに用いる
|
|
38
|
+
- data属性はJSでインタラクティブな状態変化をつけるときのみに用いて静的なスタイルを適用しない
|
|
39
|
+
- 改行でbr要素使わず、span要素とdisplay:block/inline-blockを活用する
|
|
40
|
+
- 詩・ポエムは除く
|
|
41
|
+
|
|
42
|
+
### CSS
|
|
43
|
+
|
|
44
|
+
- ウィンドウ幅がどの幅でも横スクロールを発生させない
|
|
45
|
+
- data属性はJSでインタラクティブな状態変化をつけるときのみに用いて静的なスタイルを適用しない
|
|
46
|
+
- 色を使用する場合は、:rootにカスタムプロパティを定義して使用する
|
|
47
|
+
- 参照する際に `var(--primary-color, #000)` のようなフォールバック用の第2引数は用いない
|
|
48
|
+
|
|
49
|
+
### JavaScript
|
|
50
|
+
|
|
51
|
+
- TypeScriptで書く
|
|
52
|
+
- if/elseifよりもswitch/caseやハッシュマップを用いる
|
|
53
|
+
- なるべく早期returnを用いてネストを深くしない
|
|
54
|
+
- 関数はひとつのファイルに切り出す
|
|
55
|
+
- 純粋関数はテストコードを書くかどうかユーザーに尋ねる
|
|
56
|
+
- テストはvitestを用いる
|
|
57
|
+
- テストファイルは `*.spec.ts` という命名にする
|
|
58
|
+
- 一般的なデザインパターンに当てはまらないならclassは用いずに関数ベースの実装をする
|
|
59
|
+
- JSDocsは日本語で書く
|
|
60
|
+
- `<script type="module">`を用いてモジュール化しているので`DOMContentLoaded`イベントは**不要**
|
|
61
|
+
- document.querySelectorなどで要素の型をジェネリクスで受け取る場合、`HTMLElement`型を用いてよい
|
|
62
|
+
- HTMLやCSSクラスと照らし合わせて、セレクタの対象要素の種類が明らかな場合は`HTMLInputElement`型などを用いてよい
|
|
63
|
+
- `any`型に関して
|
|
64
|
+
- `any`型を定義する場合は`unknown`型に置き換える
|
|
65
|
+
- モジュールの型定義がない場合は、暗黙の`any`型として実装するが、プロパティやメソッドを利用する際に明示的に型を指定する
|
|
66
|
+
- 型エラーに関して
|
|
67
|
+
- 定義されていないプロパティやメソッドを利用する際には、型エラーが発生するが、その場合はユーザーに確認を取り以下のいずれかの対応を取る
|
|
68
|
+
- `@ts-ignore`を利用してエラーを無視する
|
|
69
|
+
- `in`演算子を利用してプロパティの存在を確認する
|
|
70
|
+
- 型を新たに定義してエラーを回避する
|
|
71
|
+
- ESLintの警告はWarningレベルでも修正する
|
|
72
|
+
|
|
73
|
+
### コンポーネント
|
|
74
|
+
|
|
75
|
+
#### ランドマーク
|
|
76
|
+
|
|
77
|
+
- ランドマークはページコンポーネント(`c-page-*`)に実装し、UIコンポーネントには使用しない
|
|
78
|
+
- ここでいうランドマークはLandmark Roleを持つ要素のことで以下の要素を指す
|
|
79
|
+
- `<header>`
|
|
80
|
+
- `<footer>`
|
|
81
|
+
- `<nav>`
|
|
82
|
+
- `<main>`
|
|
83
|
+
- `<aside>`
|
|
84
|
+
|
|
85
|
+
#### インタラクティブコンポーネント
|
|
86
|
+
|
|
87
|
+
- インタラクティブな呼び出し元ボタンはbutton要素を用いる
|
|
88
|
+
- アクションはcommand属性を用いる
|
|
89
|
+
- command属性に規定されているアクションはそのまま活用する
|
|
90
|
+
- `command="toggle-popover"`はポップオーバーUIの開閉を行う
|
|
91
|
+
- `command="show-popover"`はポップオーバーUIの展開を行う
|
|
92
|
+
- `command="hide-popover"`はポップオーバーUIの収納を行う
|
|
93
|
+
- `command="show-modal"`はモーダルUIの展開を行う
|
|
94
|
+
- `command="close"`はモーダルUIの収納を行う
|
|
95
|
+
- 上記以外はカスタムコマンドを用意する
|
|
96
|
+
- カスタムコマンドは`command="--command-name"`のように記述して、実装はJavaScriptに記述する
|
|
97
|
+
- 規定アクション中に内部的な処理を施す場合はCommandEventを利用してJavaScriptに記述する
|
|
98
|
+
- 状況によっては`beforetoggle`や`toggle`、`close`などのイベントが適切なので適宜利用する
|
|
99
|
+
|
|
100
|
+
### カスタムコマンドの実装例
|
|
101
|
+
|
|
102
|
+
```html
|
|
103
|
+
<button command="--custom-command" commandfor="target01">カスタムコマンド</button>
|
|
104
|
+
|
|
105
|
+
<div id="target01">カスタムコマンドの対象</div>
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
for (button of document.querySelectorAll<HTMLButtonElement>('[command]')) {
|
|
110
|
+
const targetId = button.getAttribute('commandfor') ?? null;
|
|
111
|
+
if (!targetId) {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
const target = document.getElementById(targetId);
|
|
115
|
+
target?.addEventListener('command', (e) => {
|
|
116
|
+
switch (e.command) {
|
|
117
|
+
case '--custom-command': {
|
|
118
|
+
const invoker: HTMLButtonElement = e.source; // 呼び出し元ボタンの特定
|
|
119
|
+
// カスタムコマンドの処理
|
|
120
|
+
console.log(`Hello, Custom Command: ${e.command}`);
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### 規定アクションのイベントフックの実装例
|
|
129
|
+
|
|
130
|
+
```html
|
|
131
|
+
<button type="button" command="show-modal" commandfor="dialog01">メニュー</button>
|
|
132
|
+
|
|
133
|
+
<dialog id="dialog01" aria-labelledby="dialog01-title">
|
|
134
|
+
<h2 id="dialog01-title">メニュー</h2>
|
|
135
|
+
<p>メニューの内容</p>
|
|
136
|
+
</dialog>
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
for (button of document.querySelectorAll<HTMLButtonElement>('[command]')) {
|
|
141
|
+
const targetId = button.getAttribute('commandfor') ?? null;
|
|
142
|
+
if (!targetId) {
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
const target = document.getElementById(targetId);
|
|
146
|
+
target?.addEventListener('command', (e) => {
|
|
147
|
+
switch (e.command) {
|
|
148
|
+
case 'show-modal': {
|
|
149
|
+
const invoker: HTMLButtonElement = e.source; // 呼び出し元ボタンの特定
|
|
150
|
+
// フック処理
|
|
151
|
+
console.log(`Invoked: ${e.command}`);
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
// もしくは<dialog>要素であればbeforetoggleやtoggleイベントなどを利用できる
|
|
158
|
+
target?.addEventListener('beforetoggle', (e) => {
|
|
159
|
+
// フック処理
|
|
160
|
+
console.log(`Fired: beforetoggle`);
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@d-zero/scaffold",
|
|
3
|
-
"version": "5.0.0-alpha.
|
|
3
|
+
"version": "5.0.0-alpha.43",
|
|
4
4
|
"description": "Frontend scaffold files of D-ZERO Co., Ltd.",
|
|
5
5
|
"repository": "https://github.com/d-zero-dev/frontend-env.git",
|
|
6
6
|
"author": "D-ZERO Co., Ltd.",
|
|
@@ -37,17 +37,17 @@
|
|
|
37
37
|
"last 2 ios_saf version"
|
|
38
38
|
],
|
|
39
39
|
"devDependencies": {
|
|
40
|
-
"@d-zero/builder": "5.0.0-alpha.
|
|
41
|
-
"@d-zero/linters": "5.0.0-alpha.
|
|
42
|
-
"@d-zero/postcss-config": "5.0.0-alpha.
|
|
40
|
+
"@d-zero/builder": "5.0.0-alpha.43",
|
|
41
|
+
"@d-zero/linters": "5.0.0-alpha.61",
|
|
42
|
+
"@d-zero/postcss-config": "5.0.0-alpha.43",
|
|
43
43
|
"@d-zero/tsconfig": "0.4.1",
|
|
44
|
-
"@types/node": "22.13.
|
|
44
|
+
"@types/node": "22.13.10",
|
|
45
45
|
"cross-env": "7.0.3",
|
|
46
46
|
"husky": "9.1.7",
|
|
47
47
|
"npm-run-all2": "7.0.2",
|
|
48
48
|
"sass": "1.85.1",
|
|
49
49
|
"typescript": "5.8.2",
|
|
50
|
-
"vitest": "3.0.
|
|
50
|
+
"vitest": "3.0.8"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
53
|
"destyle.css": "4.0.1",
|
|
@@ -57,5 +57,5 @@
|
|
|
57
57
|
"node": "22.14.0",
|
|
58
58
|
"yarn": "1.22.22"
|
|
59
59
|
},
|
|
60
|
-
"gitHead": "
|
|
60
|
+
"gitHead": "452e94ac38fd5329a8c671a35a2b89c206f10ee8"
|
|
61
61
|
}
|