angular-cdk-integration
ng-eventsプロジェクトにおいて、Angular CDKのドラッグ&ドロップ、オーバーレイ、スクロールなどの便利な機能を利用し、再利用可能でアクセシビリティにも配慮したUIコンポーネントを効率的に開発するSkill。
📜 元の英語説明(参考)
Create components using Angular CDK utilities including drag-drop, overlay, portal, scrolling, a11y, clipboard, and platform detection for ng-events project
🇯🇵 日本人クリエイター向け解説
ng-eventsプロジェクトにおいて、Angular CDKのドラッグ&ドロップ、オーバーレイ、スクロールなどの便利な機能を利用し、再利用可能でアクセシビリティにも配慮したUIコンポーネントを効率的に開発するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o angular-cdk-integration.zip https://jpskill.com/download/16771.zip && unzip -o angular-cdk-integration.zip && rm angular-cdk-integration.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/16771.zip -OutFile "$d\angular-cdk-integration.zip"; Expand-Archive "$d\angular-cdk-integration.zip" -DestinationPath $d -Force; ri "$d\angular-cdk-integration.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
angular-cdk-integration.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
angular-cdk-integrationフォルダができる - 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
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
[Skill 名] angular-cdk-integration
Angular CDK Integration Skill
このスキルは、ng-events 建設現場管理システムにおいて、Angular CDK (@angular/cdk) ユーティリティを使用してコンポーネントと機能を作成する方法をガイドします。
このスキルを使用する場面
トリガー: "Angular CDK", "drag and drop", "overlay", "portal", "virtual scroll", "accessibility", "clipboard", "platform detection", "CDK utilities"
このスキルは、以下の場合に使用します。
- ドラッグアンドドロップ機能を実装する
- オーバーレイ、ツールチップ、またはポップオーバーを作成する
- 仮想スクロールリストを構築する
- フォーカスとアクセシビリティを管理する
- プラットフォーム/ブラウザの機能を検出する
- クリップボード操作を扱う
- スクロール動作を管理する
主要な CDK モジュール
1. Drag and Drop (@angular/cdk/drag-drop)
目的: ドラッグ可能な要素とドロップゾーンを作成する
import { Component } from '@angular/core';
import { CdkDragDrop, moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';
import { CommonModule } from '@angular/common';
import { CdkDropList, CdkDrag } from '@angular/cdk/drag-drop';
@Component({
selector: 'app-task-board',
standalone: true,
imports: [CommonModule, CdkDropList, CdkDrag],
template: `
<div class="task-board">
<div class="column" cdkDropList #todoList="cdkDropList"
[cdkDropListData]="todo"
[cdkDropListConnectedTo]="[inProgressList, doneList]"
(cdkDropListDropped)="drop($event)">
<h3>To Do</h3>
@for (task of todo; track task.id) {
<div cdkDrag class="task-card">
{{ task.title }}
<div *cdkDragPlaceholder class="drag-placeholder"></div>
</div>
}
</div>
<div class="column" cdkDropList #inProgressList="cdkDropList"
[cdkDropListData]="inProgress"
[cdkDropListConnectedTo]="[todoList, doneList]"
(cdkDropListDropped)="drop($event)">
<h3>In Progress</h3>
@for (task of inProgress; track task.id) {
<div cdkDrag class="task-card">{{ task.title }}</div>
}
</div>
<div class="column" cdkDropList #doneList="cdkDropList"
[cdkDropListData]="done"
[cdkDropListConnectedTo]="[todoList, inProgressList]"
(cdkDropListDropped)="drop($event)">
<h3>Done</h3>
@for (task of done; track task.id) {
<div cdkDrag class="task-card">{{ task.title }}</div>
}
</div>
</div>
`,
styles: [`
.task-board {
display: flex;
gap: 20px;
}
.column {
flex: 1;
min-height: 400px;
background: #f5f5f5;
padding: 16px;
border-radius: 4px;
}
.task-card {
background: white;
padding: 12px;
margin-bottom: 8px;
border-radius: 4px;
cursor: move;
}
.task-card:active {
box-shadow: 0 5px 5px -3px rgba(0,0,0,.2);
}
.drag-placeholder {
background: #ccc;
border: dotted 2px #999;
height: 40px;
transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
}
`]
})
export class TaskBoardComponent {
todo = [
{ id: '1', title: 'Task 1' },
{ id: '2', title: 'Task 2' }
];
inProgress = [
{ id: '3', title: 'Task 3' }
];
done = [
{ id: '4', title: 'Task 4' }
];
drop(event: CdkDragDrop<Task[]>) {
if (event.previousContainer === event.container) {
moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
} else {
transferArrayItem(
event.previousContainer.data,
event.container.data,
event.previousIndex,
event.currentIndex
);
}
}
}
2. Overlay (@angular/cdk/overlay)
目的: フローティングパネルとポップアップを作成する
import { Component, inject } from '@angular/core';
import { Overlay, OverlayRef } from '@angular/cdk/overlay';
import { ComponentPortal } from '@angular/cdk/portal';
@Component({
selector: 'app-menu-trigger',
standalone: true,
template: `
<button (click)="openMenu()">Open Menu</button>
`
})
export class MenuTriggerComponent {
private overlay = inject(Overlay);
private overlayRef: OverlayRef | null = null;
openMenu(): void {
if (this.overlayRef) {
this.overlayRef.dispose();
this.overlayRef = null;
return;
}
const positionStrategy = this.overlay
.position()
.flexibleConnectedTo(this.elementRef)
.withPositions([
{
originX: 'start',
originY: 'bottom',
overlayX: 'start',
overlayY: 'top'
}
]);
this.overlayRef = this.overlay.create({
positionStrategy,
scrollStrategy: this.overlay.scrollStrategies.reposition(),
hasBackdrop: true,
backdropClass: 'cdk-overlay-transparent-backdrop'
});
const menuPortal = new ComponentPortal(MenuComponent);
this.overlayRef.attach(menuPortal);
// Close on backdrop click
this.overlayRef.backdropClick().subscribe(() => {
this.overlayRef?.dispose();
this.overlayRef = null;
});
}
}
3. Virtual Scrolling (@angular/cdk/scrolling)
目的: 大規模なリストを効率的にレンダリングする
import { Component, signal } from '@angular/core';
import { ScrollingModule } from '@angular/cdk/scrolling';
import { CommonModule } from '@angular/common';
@Component({
selector: 'app-task-list-virtual',
standalone: true,
imports: [CommonModule, ScrollingModule],
template: `
<cdk-virtual-scroll-viewport itemSize="50" class="viewport">
<div *cdkVirtualFor="let task of tasks()" class="task-item">
<h4>{{ task.title }}</h4>
<p>{{ task.description }}</p>
</div>
</cdk-virtual-scroll-viewport>
`,
styles: [`
.viewport {
height: 400px;
width: 100%;
border: 1px solid #ccc;
}
.task-item {
height: 50px;
padding: 10px;
border-bottom: 1px solid #eee;
}
`]
})
export class TaskListVirtualComponent
(原文がここで切り詰められています) 📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Angular CDK Integration Skill
This skill guides the creation of components and features using Angular CDK (@angular/cdk) utilities in the ng-events construction site management system.
When to Use This Skill
Triggers: "Angular CDK", "drag and drop", "overlay", "portal", "virtual scroll", "accessibility", "clipboard", "platform detection", "CDK utilities"
Use this skill when:
- Implementing drag-and-drop functionality
- Creating overlays, tooltips, or popovers
- Building virtual scrolling lists
- Managing focus and accessibility
- Detecting platform/browser capabilities
- Working with clipboard operations
- Managing scrolling behavior
Core CDK Modules
1. Drag and Drop (@angular/cdk/drag-drop)
Purpose: Create draggable elements and drop zones
import { Component } from '@angular/core';
import { CdkDragDrop, moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';
import { CommonModule } from '@angular/common';
import { CdkDropList, CdkDrag } from '@angular/cdk/drag-drop';
@Component({
selector: 'app-task-board',
standalone: true,
imports: [CommonModule, CdkDropList, CdkDrag],
template: `
<div class="task-board">
<div class="column" cdkDropList #todoList="cdkDropList"
[cdkDropListData]="todo"
[cdkDropListConnectedTo]="[inProgressList, doneList]"
(cdkDropListDropped)="drop($event)">
<h3>To Do</h3>
@for (task of todo; track task.id) {
<div cdkDrag class="task-card">
{{ task.title }}
<div *cdkDragPlaceholder class="drag-placeholder"></div>
</div>
}
</div>
<div class="column" cdkDropList #inProgressList="cdkDropList"
[cdkDropListData]="inProgress"
[cdkDropListConnectedTo]="[todoList, doneList]"
(cdkDropListDropped)="drop($event)">
<h3>In Progress</h3>
@for (task of inProgress; track task.id) {
<div cdkDrag class="task-card">{{ task.title }}</div>
}
</div>
<div class="column" cdkDropList #doneList="cdkDropList"
[cdkDropListData]="done"
[cdkDropListConnectedTo]="[todoList, inProgressList]"
(cdkDropListDropped)="drop($event)">
<h3>Done</h3>
@for (task of done; track task.id) {
<div cdkDrag class="task-card">{{ task.title }}</div>
}
</div>
</div>
`,
styles: [`
.task-board {
display: flex;
gap: 20px;
}
.column {
flex: 1;
min-height: 400px;
background: #f5f5f5;
padding: 16px;
border-radius: 4px;
}
.task-card {
background: white;
padding: 12px;
margin-bottom: 8px;
border-radius: 4px;
cursor: move;
}
.task-card:active {
box-shadow: 0 5px 5px -3px rgba(0,0,0,.2);
}
.drag-placeholder {
background: #ccc;
border: dotted 2px #999;
height: 40px;
transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
}
`]
})
export class TaskBoardComponent {
todo = [
{ id: '1', title: 'Task 1' },
{ id: '2', title: 'Task 2' }
];
inProgress = [
{ id: '3', title: 'Task 3' }
];
done = [
{ id: '4', title: 'Task 4' }
];
drop(event: CdkDragDrop<Task[]>) {
if (event.previousContainer === event.container) {
moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
} else {
transferArrayItem(
event.previousContainer.data,
event.container.data,
event.previousIndex,
event.currentIndex
);
}
}
}
2. Overlay (@angular/cdk/overlay)
Purpose: Create floating panels and popups
import { Component, inject } from '@angular/core';
import { Overlay, OverlayRef } from '@angular/cdk/overlay';
import { ComponentPortal } from '@angular/cdk/portal';
@Component({
selector: 'app-menu-trigger',
standalone: true,
template: `
<button (click)="openMenu()">Open Menu</button>
`
})
export class MenuTriggerComponent {
private overlay = inject(Overlay);
private overlayRef: OverlayRef | null = null;
openMenu(): void {
if (this.overlayRef) {
this.overlayRef.dispose();
this.overlayRef = null;
return;
}
const positionStrategy = this.overlay
.position()
.flexibleConnectedTo(this.elementRef)
.withPositions([
{
originX: 'start',
originY: 'bottom',
overlayX: 'start',
overlayY: 'top'
}
]);
this.overlayRef = this.overlay.create({
positionStrategy,
scrollStrategy: this.overlay.scrollStrategies.reposition(),
hasBackdrop: true,
backdropClass: 'cdk-overlay-transparent-backdrop'
});
const menuPortal = new ComponentPortal(MenuComponent);
this.overlayRef.attach(menuPortal);
// Close on backdrop click
this.overlayRef.backdropClick().subscribe(() => {
this.overlayRef?.dispose();
this.overlayRef = null;
});
}
}
3. Virtual Scrolling (@angular/cdk/scrolling)
Purpose: Efficiently render large lists
import { Component, signal } from '@angular/core';
import { ScrollingModule } from '@angular/cdk/scrolling';
import { CommonModule } from '@angular/common';
@Component({
selector: 'app-task-list-virtual',
standalone: true,
imports: [CommonModule, ScrollingModule],
template: `
<cdk-virtual-scroll-viewport itemSize="50" class="viewport">
<div *cdkVirtualFor="let task of tasks()" class="task-item">
<h4>{{ task.title }}</h4>
<p>{{ task.description }}</p>
</div>
</cdk-virtual-scroll-viewport>
`,
styles: [`
.viewport {
height: 400px;
width: 100%;
border: 1px solid #ccc;
}
.task-item {
height: 50px;
padding: 10px;
border-bottom: 1px solid #eee;
}
`]
})
export class TaskListVirtualComponent {
tasks = signal(Array.from({ length: 10000 }, (_, i) => ({
id: `task-${i}`,
title: `Task ${i}`,
description: `Description for task ${i}`
})));
}
4. Clipboard (@angular/cdk/clipboard)
Purpose: Copy text to clipboard
import { Component, inject } from '@angular/core';
import { Clipboard, ClipboardModule } from '@angular/cdk/clipboard';
@Component({
selector: 'app-share-link',
standalone: true,
imports: [ClipboardModule],
template: `
<div class="share-container">
<input [value]="shareLink" readonly #linkInput />
<button
[cdkCopyToClipboard]="shareLink"
(cdkCopyToClipboardCopied)="onCopied($event)">
Copy Link
</button>
@if (copied) {
<span class="success">Copied!</span>
}
</div>
`
})
export class ShareLinkComponent {
private clipboard = inject(Clipboard);
shareLink = 'https://ng-events.com/blueprints/123';
copied = false;
onCopied(success: boolean): void {
if (success) {
this.copied = true;
setTimeout(() => this.copied = false, 2000);
}
}
}
5. Platform Detection (@angular/cdk/platform)
Purpose: Detect browser and platform capabilities
import { Component, inject, OnInit } from '@angular/core';
import { Platform } from '@angular/cdk/platform';
@Component({
selector: 'app-platform-aware',
standalone: true,
template: `
<div class="platform-info">
<h3>Platform Information</h3>
<ul>
<li>Browser: {{ browser }}</li>
<li>Mobile: {{ isMobile }}</li>
<li>iOS: {{ isIOS }}</li>
<li>Android: {{ isAndroid }}</li>
</ul>
</div>
`
})
export class PlatformAwareComponent implements OnInit {
private platform = inject(Platform);
browser = '';
isMobile = false;
isIOS = false;
isAndroid = false;
ngOnInit(): void {
this.isMobile = this.platform.IOS || this.platform.ANDROID;
this.isIOS = this.platform.IOS;
this.isAndroid = this.platform.ANDROID;
if (this.platform.FIREFOX) this.browser = 'Firefox';
else if (this.platform.EDGE) this.browser = 'Edge';
else if (this.platform.SAFARI) this.browser = 'Safari';
else if (this.platform.WEBKIT) this.browser = 'WebKit';
else this.browser = 'Unknown';
}
}
Integration Checklist
When using Angular CDK:
- [ ] Import specific CDK modules (not full @angular/cdk)
- [ ] Use standalone components with CDK directives
- [ ] Implement proper cleanup (subscriptions, overlays)
- [ ] Test accessibility with screen readers
- [ ] Handle mobile/touch interactions
- [ ] Consider performance (virtual scrolling for lists >100 items)
- [ ] Integrate with Blueprint multi-tenancy when needed
- [ ] Follow three-layer architecture (CDK in UI layer only)
Best Practices
DO ✅
- Use CDK for complex UI interactions
- Leverage virtual scrolling for large datasets
- Use overlay service for tooltips/menus
- Detect platform for feature support
- Clean up overlays and portals on destroy
DON'T ❌
- Use CDK in services or repositories (UI layer only)
- Create overlays without disposal logic
- Skip accessibility considerations
- Ignore mobile touch events
References
Version: 1.0.0
Compatible with: @angular/cdk 20.x, Angular 20.3.x
Last Updated: 2025-12-25