swiftui-style-driven-components
Expert guidance on SwiftUI style-driven components following Apple patterns (ButtonStyle, LabelStyle). Use when: building components with style protocols, implementing configuration patterns, adding environment-based styling, creating extensible component libraries, or reviewing component architecture.
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o swiftui-style-driven-components.zip https://jpskill.com/download/10660.zip && unzip -o swiftui-style-driven-components.zip && rm swiftui-style-driven-components.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/10660.zip -OutFile "$d\swiftui-style-driven-components.zip"; Expand-Archive "$d\swiftui-style-driven-components.zip" -DestinationPath $d -Force; ri "$d\swiftui-style-driven-components.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
swiftui-style-driven-components.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
swiftui-style-driven-componentsフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Claude が読む原文 SKILL.md(中身を展開)
この本文は AI(Claude)が読むための原文(英語または中国語)です。日本語訳は順次追加中。
SwiftUI Style-Driven Components
Overview
This skill provides expert guidance on building, reviewing, and extending SwiftUI components following the style-driven architecture pattern. This pattern emphasizes extensibility, maintainability, and Apple-style API design, making it ideal for building reusable component libraries.
Agent Behavior Contract
- Before creating a new component, verify it needs 2+ meaningfully different styles. If not, skip the style protocol.
- Follow Apple's patterns (
ButtonStyle,LabelStyle) as the gold standard. - Use nested type-erased views in configuration (like
LabelStyleConfiguration.Title). - Never expose configuration initializers as
public. - Wrap
style.makeBodyinAnyViewfor type erasure. - Use
DynamicPropertyfor style protocols, notSendable. - Read styles from environment using existential type (
any [Component]Style).
Core Architecture Principles
- Protocol:
[Component]Style— defines HOW to render - Configuration:
[Component]StyleConfiguration— contains WHAT to render - Component: Creates configuration internally, delegates rendering to style
- Environment: Enables subtree styling without modifying components
When to Use Style Protocol
Use style protocol when:
- 2+ meaningfully different visual styles needed
- Environment-based style cascading desired
- Building reusable component library
- Styles need environment access (
@Environment)
Skip style protocol when:
- Single visual representation
- Simple, static appearance
- One-off internal component
- No style customization needed
Quick Decision Tree
Building a new component?
- Needs multiple styles? → If no, skip style protocol
- Create structure → See
references/component-structure.md - Define protocol → See
references/style-protocol.md - Create configuration → Nested type-erased views pattern
- Implement default style → Basic rendering
- Add environment key → See
references/environment-keys.md - Add convenience accessors → See
references/common-patterns.md
Adding a new style?
- Create struct conforming to
[Component]Style - Implement
makeBody(configuration:) - Add convenience accessor (
.myStyle) - No component changes needed!
Reviewing component architecture?
- Check protocol uses
DynamicProperty,@ViewBuilder @MainActor - Verify configuration uses nested type-erased views
- Confirm configuration init is
internal - Check component wraps
style.makeBodyinAnyView - Validate environment key uses existential (
any [Component]Style) - Ensure new styles don't require component changes
Triage Playbook
- Creating component file structure →
references/component-structure.md - Defining style protocol →
references/style-protocol.md - Creating configuration with content →
references/style-protocol.md - Setting up environment keys →
references/environment-keys.md - Adding convenience initializers →
references/common-patterns.md - Parameterized or adaptive styles →
references/common-patterns.md - Using design tokens →
references/design-system.md - Writing snapshot tests →
references/testing.md - Organizing previews →
references/previews.md - Accessibility requirements →
references/accessibility.md
Quick Reference
Component Structure
[Component]/
├── EnvironmentKeys/[Component]StyleKey.swift
├── Styles/
│ ├── [Component]Style.swift
│ ├── [Component]StyleConfiguration.swift
│ └── Default[Component]Style.swift
└── [Component].swift
Pattern Summary
- Style Protocol:
DynamicProperty,@ViewBuilder @MainActor func makeBody - Configuration: Nested
struct Content: Viewwithprivate let _body: () -> AnyView - Configuration Init:
internal(notpublic) - Component Body:
AnyView(style.makeBody(configuration: .init(...))) - Environment Key:
@Entry public var style: any [Component]Style = .automatic - View Modifier:
func style(_ style: some [Component]Style) -> some View
Best Practices
DO
- Use
DynamicPropertyfor style protocols - Use nested type-erased views in configuration
- Make configuration initializers
internal - Wrap
style.makeBodyinAnyView - Use design tokens, not magic numbers
- Provide convenience accessors (
.compact,.outlined)
DON'T
- Add explicit
Sendableto protocols - Make configuration initializers
public - Pass configuration to component initializer
- Put content properties in style protocol
- Use style protocol for single-variant components
- Use
AnyViewdirectly as configuration property type
Review Checklist
Architecture
- [ ] Style protocol uses
DynamicProperty - [ ]
makeBodyhas@ViewBuilder @MainActor - [ ] Configuration uses nested type-erased views
- [ ] Configuration init is
internal - [ ] Component wraps
style.makeBodyinAnyView - [ ] New styles don't require component changes
Environment
- [ ] Uses
@Entrymacro - [ ] Stores as existential (
any [Component]Style) - [ ] Modifier uses opaque parameter (
some [Component]Style) - [ ] Default value provided (
.automatic)
Quality
- [ ] Previews cover all styles (see
references/previews.md) - [ ] Snapshot tests exist (see
references/testing.md) - [ ] Accessibility supported (see
references/accessibility.md) - [ ] Design tokens used (see
references/design-system.md)
Reference Files
references/component-structure.md— Creating new component, file organizationreferences/style-protocol.md— Protocol definition, configuration pattern, adding stylesreferences/environment-keys.md— Environment injection, usage patternsreferences/common-patterns.md— Convenience initializers/accessors, parameterized stylesreferences/testing.md— Snapshot tests, test organizationreferences/previews.md— Preview structure, checklistreferences/design-system.md— Design tokens, typography, colorsreferences/accessibility.md— Labels, identifiers, Dynamic Type
Philosophy
Style-driven components prioritize:
- Extensibility — Add styles without modifying components
- Apple Patterns — Follow
ButtonStyle,LabelStyleconventions - Simplicity — Skip style protocol for single-variant components
- Type Safety — Generic APIs with internal type erasure
- Consistency — All components follow same patterns