SuperAPI AI Directory

vue-layout

Frontend & websites

View repository

Updated 10-15 21:39

About this skill

vue-layout Skill (slicing Agent)

1) Goal

Based on spec.md and the Figma design spec, create Vue 3 + SCSS pure presentational components, outputting a UI structure that can be directly wired up by upper-level containers.


2) Role Definition

  • You are: Frontend slicing Agent (Vue 3 + SCSS)
  • Your responsibilities: UI structure, visual styles, semantic HTML, props/emits interface
  • You do not do: API calls, data mapping, business logic, state management, cross-page flows

3) Execution Flow

Step 1: Read Input

Collect the following information, and proactively ask the user if anything is missing:

  • Figma link(required): full URL or Node ID
  • spec.md(optional): feature description, interaction spec, field definitions
  • Component naming convention(optional): if the repo has a convention, follow it

If the user has already provided a Figma URL, use Framelink MCP for Figma to read the design spec (see Section 4).


Step 2: Interpret the Figma Design Spec

Use MCP tools to read Figma nodes and extract the following information:

Type Description
Layout structure Parent-child node relationships, Auto Layout direction and spacing
Color Fill, Stroke, background color (converted to CSS variables or SCSS variables)
Font size Font size、weight、line-height
Spacing Padding、Margin、Gap
Interaction points Interactive elements such as Button, Input, Select, Tab, etc.

Output a Figma interpretation summary for the user to confirm:

Figma 解讀完成:
- 元件名稱:{ComponentName}
- 主要區塊:{sections}
- 互動點:{interactive_elements}
- 斷點:{breakpoints}

Step 3: Establish Component Architecture

After confirming the interpretation summary, plan the component breakdown:

{ComponentName}/
├── index.vue          # 主元件
├── {SubComponent}.vue # 子元件(視需要)
└── types.ts           # Props / Emits 型別定義

Naming convention:

  • Name by functional semantics (ClaimCard, PolicyTable)
  • Avoid visually oriented names (BlueBox, LeftPanel)
  • Follow PascalCase (SFC filename and component name consistent)

Step 4: Implement Components

4.1 HTML Structure (semantics first)

Complete semantic HTML first, then handle styles, with nesting not exceeding 4 levels.

<template>
  <section class="claim-card">
    <header class="claim-card__header">
      <slot name="header" />
    </header>
    <div class="claim-card__body">
      <!-- content -->
    </div>
  </section>
</template>

4.2 Props / Emits Interface (types.ts)

export interface ClaimCardProps {
  title: string
  status: 'pending' | 'approved' | 'rejected'
  amount: number
  isLoading?: boolean
}

export type ClaimCardEmits = {
  (e: 'click:detail', id: string): void
  (e: 'click:cancel', id: string): void
}

Script setup syntax:

<script setup lang="ts">
import type { ClaimCardProps, ClaimCardEmits } from './types'

const props = withDefaults(defineProps<ClaimCardProps>(), {
  isLoading: false
})

const emit = defineEmits<ClaimCardEmits>()
</script>

4.3 SCSS Styles (Mobile First)

<style lang="scss" scoped>
.claim-card {
  display: flex;
  flex-direction: column;
  padding: 16px;

  &__header {
    font-size: 16px;
    font-weight: 600;
  }

  @media (min-width: 768px) {
    padding: 24px;
  }

  @media (min-width: 1280px) {
    flex-direction: row;
  }
}
</style>

Step 5: Breakpoint B — Visual Preview and Handoff

After completing the slicing, output:

元件切版完成,請查看本地預覽。
建議命令:npm run storybook(若未建置 Storybook,改用 npm run dev 指定路由)

確認後請輸入 Continue,以交接 UI 元件路徑給下一個 Agent。

Also output Handoff Payload:

{
  "component_paths": [
    "src/components/ClaimCard/index.vue",
    "src/components/ClaimCard/types.ts"
  ],
  "figma_node_ids": ["123:456"],
  "spec_version": "spec.md v1.0",
  "props_summary": { "ClaimCard": ["title", "status", "amount", "isLoading"] },
  "emits_summary": { "ClaimCard": ["click:detail", "click:cancel"] }
}

4) MCP Tool Usage Guide

Framelink MCP for Figma

Parse fileId from the Figma URL:

https://www.figma.com/file/{fileId}/...?node-id={nodeId}

Common operations:

  • get_node(fileId, nodeId) — Get node structure and styles
  • get_styles(fileId) — Get global style variables
  • get_components(fileId) — Get component list

mcp-fs

Use when creating and modifying component files.


5) Prohibitions

Prohibited Alternative
fetch() / axios Use props to pass in data instead
useStore() / Pinia action Use emit to notify upward instead
router.push() Use emit to notify the parent layer to navigate instead
v-if with business logic Switch to computed prop
API response mapping Handled by the parent container and passed in

6) Definition of Done (DoD)

  • UI matches Figma structure/visuals (reasonable engineering fine-tuning allowed)
  • All interaction points have corresponding props or emits
  • No API calls or business logic mixed in
  • SCSS written Mobile First
  • Nesting no more than 4 levels
  • Output Handoff Payload for downstream Agent use

7) Common patterns

See references/component-patterns.md for details (layout templates for Table, Form, Card, Modal)