---
name: develop-component
description: コンポーネントを新規作成・更新する。CSS、HTML、Storybook Stories、テスト、JavaScript(Custom Elements)の実装を含む。
---
# コンポーネント開発スキル
コンポーネントを開発するためのガイドライン。CSS、HTML、Stories、テストファイル、および必要に応じてJavaScriptの実装を対象とする。
## コンポーネントのファイル構成
各コンポーネントは `src/components/ `、`
`、``等)は `margin: 0` でリセットする。
```css
.dads-divider {
margin: 0;
/* ... */
}
```
### セレクタの詳細度
- セレクタは原則としてクラス名を使用する。IDセレクタや要素セレクタは使用しない
- 詳細度を最小限にするための過度な工夫(`:where()`の多用等)は避ける
- 記述が多くの開発者にとって理解しやすいことを優先する
```css
/* DO: 直感的で読みやすい */
.dads-button[data-type="solid-fill"]:hover {
background-color: var(--button-hover-color);
}
/* DON'T: 詳細度を下げるための過剰な :where() */
.dads-button:where([data-type="solid-fill"]:hover) {
background-color: var(--button-hover-color);
}
```
### デザイントークンの使用
`src/global.css` で定義されたCSS Custom Propertiesを使用する。
```css
/* カラー */
var(--color-key-900) /* キーカラー */
var(--color-primitive-blue-900) /* プリミティブカラー */
var(--color-neutral-solid-gray-800) /* ニュートラルカラー */
var(--color-neutral-white)
var(--color-neutral-black)
var(--color-semantic-error-1) /* セマンティックカラー */
/* フォント */
var(--font-family-sans) /* Noto Sans JP */
var(--font-family-mono) /* Noto Sans Mono */
/* エレベーション */
var(--elevation-1) 〜 var(--elevation-5)
```
### コンポーネントスコープのCustom Properties
コンポーネント内で再利用する値は、コンポーネントスコープのCustom Propertiesとして定義できる。ただし、過度な抽象化は避ける。
**プレフィックスの使い分け:**
- `--_` プレフィックス: プライベート(コンポーネント内部でのみ使用、外部から設定されることを想定しない)
- `--` プレフィックス(`_`なし): パブリックAPI(コンポーネント利用者が外部から上書きできる)
```css
/* プライベート: サイズバリエーションの内部値 */
.dads-checkbox[data-size="sm"] {
--_gap: calc(4 / 16 * 1rem);
--_checkbox-size: calc(24 / 16 * 1rem);
}
.dads-checkbox[data-size="md"] {
--_gap: calc(8 / 16 * 1rem);
--_checkbox-size: calc(32 / 16 * 1rem);
}
/* パブリック: 利用者がテーマカラーを変更できるAPI */
.dads-button {
--button-color: var(--color-key-900);
--button-hover-color: var(--color-key-1000);
}
/* DON'T: 全プロパティをCustom Propertiesに間接化 */
.dads-button {
--dads-button-bg-color: var(--color-key-900);
--dads-button-text-decoration: none;
background-color: var(--dads-button-bg-color);
text-decoration: var(--dads-button-text-decoration);
}
```
### フォーカススタイル
フォーカスが可視な要素には統一的なフォーカスリングを適用する。
```css
.dads-component:focus-visible {
outline: calc(4 / 16 * 1rem) solid var(--color-neutral-black);
outline-offset: calc(2 / 16 * 1rem);
box-shadow: 0 0 0 calc(2 / 16 * 1rem) var(--color-primitive-yellow-300);
}
```
### 無効状態
`disabled`属性と`aria-disabled`属性の両方に対応する。
```css
.dads-component:disabled,
.dads-component[aria-disabled="true"] {
/* 無効スタイル */
}
```
### エラー状態
`:user-invalid`擬似クラスと`aria-invalid`属性に対応する。
```css
.dads-component:is(:user-invalid, [aria-invalid="true"]) {
border-color: var(--color-semantic-error-1);
}
```
### メディアクエリ
#### レスポンシブ(モバイルファースト)
```css
.dads-component { /* モバイルスタイル */ }
@media (min-width: 48rem) {
.dads-component { /* デスクトップスタイル */ }
}
```
#### ホバー
タッチ端末でホバーが発動しないよう、ホバースタイルは `@media (hover: hover)` で囲む。
```css
@media (hover: hover) {
.dads-component:hover {
/* ホバースタイル */
}
}
```
#### 強制カラーモード
Windowsのコントラストテーマに対応する。
```css
@media (forced-colors: active) {
.dads-component {
/* 強制カラーモード用のスタイル調整 */
}
}
```
使用できるシステムカラー: `GrayText`、`Canvas`、`ButtonText`、`Highlight`、`HighlightText` 等。
#### 視覚効果低減モード
フェード以外のアニメーションがある場合に対応する。
```css
@media (prefers-reduced-motion: reduce) {
.dads-component {
transition: none;
}
}
```
### 論理的プロパティの不使用
`margin-block`、`padding-inline`等の論理的プロパティは使用しない。`margin-top`、`padding-left` 等の物理的プロパティを使用する。
### カスケードレイヤーの不使用
`@layer` は使用しない。
### CSSプリプロセッサの不使用
標準的なCSSのみで記述する。Sass、Less等は使用しない。
## HTML
### HTMLファイルのテンプレート
全てのHTMLファイルは以下のテンプレートに従う。
```html