【Figma】NextJSのソースコードを自動生成(Clapy)

1. 概要

前回はLocofy.aiを利用してソースコードを自動生成する内容でした。

今回はClapyプラグインを使い、NextJSソースコードを自動生成してローカルで確認する内容となります。

2. Clapyサンプルを取り込む

2-1. Open in Figma

2-2. サンプルを選択

  • Figma basics

3. プラグイン「Clapy」の選択

3-1. Clapy

  • Plugins
    • 「clapy」で検索
  • 「アカウント作成」を済ます
    • Sign up

4. ソースコードの生成

4-1. Figma上でFrame「Shopping Cart」を選択&「Clapy」を検索

  • ソースコードの自動生成対象

4-2. Generate code

4-3. 「Live preview」を選択

  • https://xyz.csb.app/

4-4. 「Edit code」を選択

  • https://codesandbox.io/p/sandbox/xyz?file=%2Fsrc%2FApp.tsx

5. ソースコードのダウンロード

5-1. Advanced options

  • 下記を選択
    • Download as zip

5-2. Generate code

  • ファイルがダウンロードされる
    • Code export.zip

5-3. ファイル構成

  • zipを解凍
.
├── index.html
├── package.json
├── public
│   ├── assets
│   │   ├── edONeilAvvdZlhDowAUnsplash1.jpeg
│   │   ├── k8_fkPHulvMUnsplash2.jpeg
│   │   └── noonbrewZiCb4_EKmakUnsplash.jpeg
│   └── robots.txt
├── src
│   ├── App.module.scss
│   ├── App.tsx
│   ├── components
│   │   ├── ShoppingCart
│   │   │   ├── ButtonIcon.tsx
│   │   │   ├── InputFieldIcon.tsx
│   │   │   ├── InputFieldIcon2.tsx
│   │   │   ├── InputFieldIcon3.tsx
│   │   │   ├── ShoppingCart.module.scss
│   │   │   └── ShoppingCart.tsx
│   │   └── _resets.module.scss
│   ├── favicon.svg
│   ├── main.tsx
│   ├── resets.scss
│   └── vite-env.d.ts
├── tsconfig.json
├── tsconfig.node.json
└── vite.config.ts

5 directories, 22 files

5-4. 自動生成ソースコードの一部

  • ShoppingCart.tsx
import { memo } from "react";
import type { FC } from "react";

import resets from "../_resets.module.scss";
import { ButtonIcon } from "./ButtonIcon";
import { InputFieldIcon2 } from "./InputFieldIcon2";
import { InputFieldIcon3 } from "./InputFieldIcon3";
import { InputFieldIcon } from "./InputFieldIcon";
import classes from "./ShoppingCart.module.scss";

interface Props {
  className?: string;
}
/* @figmaId 4368:321123 */
export const ShoppingCart: FC<Props> = memo(function ShoppingCart(props = {}) {
  return (
    <div className={`${resets.clapyResets} ${classes.root}`}>
      <div className={classes.tomato}>
        <div className={classes.heirloomTomato}>Heirloom tomato</div>
        <div className={classes._599}>$5.99</div>
        <div className={classes._599Lb}>$5.99 / lb</div>
        <div className={classes.inputField}>
          <div className={classes._1Lb}>1 lb</div>
          <div className={classes.icon}>
            <InputFieldIcon className={classes.icon2} />
          </div>
        </div>
        <div className={classes.edONeilAvvdZlhDowAUnsplash1}></div>
      </div>
      <div className={classes.ginger}>
        <div className={classes.organicGinger}>Organic ginger</div>
        <div className={classes._1299Lb}>$12.99 / lb</div>
        <div className={classes.inputField2}>
          <div className={classes._5Lb}>0.5 lb</div>
          <div className={classes.icon3}>
            <InputFieldIcon2 className={classes.icon4} />
          </div>
        </div>
        <div className={classes._650}>$6.50</div>
        <div className={classes.noonbrewZiCb4_EKmakUnsplash}></div>
      </div>
      <div className={classes.onion}>
        <div className={classes.sweetOnion}>Sweet onion</div>
        <div className={classes._299Lb}>$2.99 / lb</div>
        <div className={classes.inputField3}>
          <div className={classes._5Lb2}>5 lb</div>
          <div className={classes.icon5}>
            <InputFieldIcon3 className={classes.icon6} />
          </div>
        </div>
        <div className={classes._1495}>$14.95</div>
        <div className={classes.k8_fkPHulvMUnsplash2}></div>
      </div>
      <div className={classes.summary}>
        <div className={classes.orderSummary}>Order summary</div>
        <div className={classes.subtotal}>Subtotal</div>
        <div className={classes._2744}>$27.44</div>
        <div className={classes.shipping}>Shipping</div>
        <div className={classes._399}>$3.99</div>
        <div className={classes.tax}>Tax</div>
        <div className={classes._20}>$2.00</div>
        <div className={classes.total}>Total</div>
        <div className={classes._3343}>$33.43</div>
        <button className={classes.button}>
          <div className={classes.continueToPayment}>Continue to payment</div>
          <div className={classes.icon7}>
            <ButtonIcon className={classes.icon8} />
          </div>
        </button>
      </div>
      <div className={classes.pageHeading}>
        <div className={classes._3Items}>3 items</div>
        <div className={classes.basket}>Basket</div>
        <div className={classes.divider}></div>
      </div>
      <div className={classes.navigation}>
        <div className={classes.worldPeas}>World Peas</div>
        <div className={classes.shop}>Shop</div>
        <div className={classes.newstand}>Newstand</div>
        <div className={classes.whoWeAre}>Who we are</div>
        <div className={classes.myProfile}>My profile</div>
        <button className={classes.cartButton}>
          <div className={classes.basket3}>Basket (3)</div>
        </button>
      </div>
    </div>
  );
});

  • ShoppingCart.module.css
.root {
  position: relative;
  width: 1440px;
  height: 1024px;
  flex-direction: column;
  align-items: flex-start;
  background-color: #fff;
  overflow: hidden;
}
.tomato {
  position: absolute;
  left: 96px;
  right: 523px;
  top: 301px;
  height: 159px;
  flex-direction: column;
  align-items: flex-start;
  outline: solid 2px #e6e6e6;
  outline-offset: -2px;
  border-radius: 24px;
  background-color: #fafaf5;
  overflow: hidden;
}
.heirloomTomato {
  color: #000;
  font-size: 20px;
  line-height: 130%;
  font-weight: 600;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  left: 184px;
  top: 24px;
  width: min-content;
  height: min-content;
  white-space: nowrap;
  flex-direction: column;
}
._599 {
  color: #000;
  font-size: 20px;
  line-height: 130%;
  font-weight: 600;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  right: 24px;
  top: 24px;
  width: min-content;
  height: min-content;
  text-align: end;
  align-items: end;
  white-space: nowrap;
  flex-direction: column;
}
._599Lb {
  color: #426b1f;
  font-size: 20px;
  line-height: 130%;
  font-weight: 600;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  left: 184px;
  top: 54px;
  width: min-content;
  height: min-content;
  white-space: nowrap;
  flex-direction: column;
}
.inputField {
  position: absolute;
  left: 184px;
  bottom: 24px;
  width: 128px;
  height: 40px;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  gap: 10px;
  padding: 8px 16px;
  outline: solid 2px #0000000f;
  outline-offset: -2px;
  border-radius: 20px;
  background-color: #fff;
  overflow: hidden;
}
._1Lb {
  color: #000;
  font-size: 16px;
  line-height: 130%;
  font-weight: 600;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  left: 16px;
  top: 50%;
  width: min-content;
  height: min-content;
  white-space: nowrap;
  flex-direction: column;
  transform: translateY(-50%);
}
.icon {
  position: absolute;
  right: 8px;
  top: 50%;
  width: 32px;
  height: 32px;
  overflow: visible;
  transform: translateY(-50%);
}
.icon2 {
  width: 100%;
  height: 100%;
}
.edONeilAvvdZlhDowAUnsplash1 {
  position: absolute;
  left: 0;
  top: 0;
  bottom: -1px;
  width: 160px;
  background-image:/* webpackIgnore: true */ url('/assets/edONeilAvvdZlhDowAUnsplash1.jpeg');
  background-position: center;
  background-repeat: no-repeat;
  background-size: cover;
}
.ginger {
  position: absolute;
  left: 96px;
  right: 523px;
  top: 491px;
  height: 159px;
  flex-direction: column;
  align-items: flex-start;
  outline: solid 2px #e6e6e6;
  outline-offset: -2px;
  border-radius: 24px;
  background-color: #fafaf5;
  overflow: hidden;
}
.organicGinger {
  color: #000;
  font-size: 20px;
  line-height: 130%;
  font-weight: 600;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  left: 184px;
  top: 24px;
  width: min-content;
  height: min-content;
  white-space: nowrap;
  flex-direction: column;
}
._1299Lb {
  color: #426b1f;
  font-size: 20px;
  line-height: 130%;
  font-weight: 600;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  left: 184px;
  top: 54px;
  width: min-content;
  height: min-content;
  white-space: nowrap;
  flex-direction: column;
}
.inputField2 {
  position: absolute;
  left: 184px;
  bottom: 24px;
  width: 128px;
  height: 40px;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  gap: 10px;
  padding: 8px 16px;
  outline: solid 2px #0000000f;
  outline-offset: -2px;
  border-radius: 20px;
  background-color: #fff;
  overflow: hidden;
}
._5Lb {
  color: #000;
  font-size: 16px;
  line-height: 130%;
  font-weight: bold;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  left: 16px;
  top: 50%;
  width: min-content;
  height: min-content;
  white-space: nowrap;
  flex-direction: column;
  transform: translateY(-50%);
}
.icon3 {
  position: absolute;
  right: 8px;
  top: 50%;
  width: 32px;
  height: 32px;
  overflow: visible;
  transform: translateY(-50%);
}
.icon4 {
  width: 100%;
  height: 100%;
}
._650 {
  color: #000;
  font-size: 20px;
  line-height: 130%;
  font-weight: 600;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  right: 24px;
  top: 24px;
  width: min-content;
  height: min-content;
  text-align: end;
  align-items: end;
  white-space: nowrap;
  flex-direction: column;
}
.noonbrewZiCb4_EKmakUnsplash {
  position: absolute;
  left: 0;
  top: 0;
  bottom: -1px;
  width: 160px;
  background-image:/* webpackIgnore: true */ url('/assets/noonbrewZiCb4_EKmakUnsplash.jpeg');
  background-position: center;
  background-repeat: no-repeat;
  background-size: cover;
}
.onion {
  position: absolute;
  left: 96px;
  right: 523px;
  top: 681px;
  height: 159px;
  flex-direction: column;
  align-items: flex-start;
  outline: solid 2px #e6e6e6;
  outline-offset: -2px;
  border-radius: 24px;
  background-color: #fafaf5;
  overflow: hidden;
}
.sweetOnion {
  color: #000;
  font-size: 20px;
  line-height: 130%;
  font-weight: 600;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  left: 184px;
  top: 24px;
  width: min-content;
  height: min-content;
  white-space: nowrap;
  flex-direction: column;
}
._299Lb {
  color: #426b1f;
  font-size: 20px;
  line-height: 130%;
  font-weight: 600;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  left: 184px;
  top: 54px;
  width: min-content;
  height: min-content;
  white-space: nowrap;
  flex-direction: column;
}
.inputField3 {
  position: absolute;
  left: 184px;
  bottom: 24px;
  width: 128px;
  height: 40px;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  gap: 10px;
  padding: 8px 16px;
  outline: solid 2px #0000000f;
  outline-offset: -2px;
  border-radius: 20px;
  background-color: #fff;
  overflow: hidden;
}
._5Lb2 {
  color: #000;
  font-size: 16px;
  line-height: 130%;
  font-weight: bold;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  left: 16px;
  top: 50%;
  width: min-content;
  height: min-content;
  white-space: nowrap;
  flex-direction: column;
  transform: translateY(-50%);
}
.icon5 {
  position: absolute;
  right: 8px;
  top: 50%;
  width: 32px;
  height: 32px;
  overflow: visible;
  transform: translateY(-50%);
}
.icon6 {
  width: 100%;
  height: 100%;
}
._1495 {
  color: #000;
  font-size: 20px;
  line-height: 130%;
  font-weight: 600;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  right: 24px;
  top: 24px;
  width: min-content;
  height: min-content;
  text-align: end;
  align-items: end;
  white-space: nowrap;
  flex-direction: column;
}
.k8_fkPHulvMUnsplash2 {
  position: absolute;
  left: 0;
  top: 0;
  bottom: -1px;
  width: 160px;
  background-image:/* webpackIgnore: true */ url('/assets/k8_fkPHulvMUnsplash2.jpeg');
  background-position: center;
  background-repeat: no-repeat;
  background-size: cover;
}
.summary {
  position: absolute;
  left: 949px;
  right: 96px;
  top: 301px;
  height: 318px;
  flex-direction: column;
  align-items: flex-start;
  outline: solid 2px #e6e6e6;
  outline-offset: -2px;
  border-radius: 24px;
  background-color: #fafaf5;
  overflow: hidden;
}
.orderSummary {
  color: #000;
  font-size: 20px;
  line-height: 130%;
  font-weight: 600;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  left: 24px;
  top: 24px;
  width: min-content;
  height: min-content;
  white-space: nowrap;
  flex-direction: column;
}
.subtotal {
  color: #000;
  font-size: 16px;
  line-height: 130%;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  left: 24px;
  top: 82px;
  width: min-content;
  height: min-content;
  white-space: nowrap;
  flex-direction: column;
}
._2744 {
  color: #000;
  font-size: 16px;
  line-height: 130%;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  right: 24px;
  top: 82px;
  width: min-content;
  height: min-content;
  text-align: end;
  align-items: end;
  white-space: nowrap;
  flex-direction: column;
}
.shipping {
  color: #000;
  font-size: 16px;
  line-height: 130%;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  left: 24px;
  top: 119px;
  width: min-content;
  height: min-content;
  white-space: nowrap;
  flex-direction: column;
}
._399 {
  color: #000;
  font-size: 16px;
  line-height: 130%;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  right: 24px;
  top: 119px;
  width: min-content;
  height: min-content;
  text-align: end;
  align-items: end;
  white-space: nowrap;
  flex-direction: column;
}
.tax {
  color: #000;
  font-size: 16px;
  line-height: 130%;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  left: 24px;
  top: 156px;
  width: min-content;
  height: min-content;
  white-space: nowrap;
  flex-direction: column;
}
._20 {
  color: #000;
  font-size: 16px;
  line-height: 130%;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  right: 24px;
  top: 156px;
  width: min-content;
  height: min-content;
  text-align: end;
  align-items: end;
  white-space: nowrap;
  flex-direction: column;
}
.total {
  color: #000;
  font-size: 16px;
  line-height: 130%;
  font-weight: 600;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  left: 24px;
  top: 193px;
  width: min-content;
  height: min-content;
  white-space: nowrap;
  flex-direction: column;
}
._3343 {
  color: #000;
  font-size: 16px;
  line-height: 130%;
  font-weight: 600;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  right: 24px;
  top: 190px;
  width: min-content;
  height: min-content;
  text-align: end;
  align-items: end;
  white-space: nowrap;
  flex-direction: column;
}
.button {
  position: absolute;
  left: 24px;
  right: 24px;
  bottom: 24px;
  height: 48px;
  flex-direction: column;
  align-items: center;
  gap: 8px;
  padding: 10px 8px 10px 16px;
  border-radius: 8px;
  background-color: #426b1f;
  overflow: hidden;
}
.continueToPayment {
  color: #fff;
  font-size: 16px;
  line-height: 130%;
  font-weight: 600;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  left: 24px;
  top: calc(50% - -0.5px);
  width: min-content;
  height: min-content;
  white-space: nowrap;
  flex-direction: column;
  transform: translateY(-50%);
}
.icon7 {
  position: absolute;
  right: 16px;
  top: 50%;
  width: 32px;
  height: 32px;
  transform: translateY(-50%);
}
.icon8 {
  width: 100%;
  height: 100%;
}
.pageHeading {
  position: absolute;
  left: 0;
  right: 0;
  top: 112px;
  height: 149px;
  flex-direction: column;
  align-items: flex-start;
  background-color: #fff;
  overflow: hidden;
}
._3Items {
  color: #000;
  font-size: 20px;
  line-height: 130%;
  font-weight: 300;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  left: 301px;
  bottom: 33px;
  width: min-content;
  height: min-content;
  white-space: nowrap;
  flex-direction: column;
}
.basket {
  color: #000;
  font-size: 64px;
  line-height: 120%;
  font-family: Newsreader, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  letter-spacing: -0.02em;
  position: absolute;
  left: 96px;
  bottom: 16px;
  width: min-content;
  height: min-content;
  white-space: nowrap;
  flex-direction: column;
}
.divider {
  position: relative;
  left: 96px;
  right: 96px;
  bottom: 0;
  max-width: 100%;
  height: 2.0001px;
  max-height: 100%;
  width: 1248px;
}
.divider::before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  transform-origin: 0 0;
  transform: rotate(0deg);
  height: 0;
  outline: solid 1px #e6e6e6;
  box-shadow: 0px 4px 4px 0px #00000040;
}
.navigation {
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  height: 112px;
  flex-direction: column;
  align-items: flex-start;
  overflow: hidden;
}
.worldPeas {
  color: #426b1f;
  font-size: 32px;
  line-height: 100%;
  font-weight: 500;
  font-family: Newsreader, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  letter-spacing: -0.01em;
  position: absolute;
  left: 96px;
  top: 41px;
  width: min-content;
  height: min-content;
  white-space: nowrap;
  flex-direction: column;
}
.shop {
  color: #000;
  font-size: 16px;
  line-height: 130%;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  right: 657px;
  top: 45.5px;
  width: min-content;
  height: min-content;
  text-align: center;
  align-items: center;
  white-space: nowrap;
  flex-direction: column;
}
.newstand {
  color: #000;
  font-size: 16px;
  line-height: 130%;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  right: 532px;
  top: 45.5px;
  width: min-content;
  height: min-content;
  text-align: center;
  align-items: center;
  white-space: nowrap;
  flex-direction: column;
}
.whoWeAre {
  color: #000;
  font-size: 16px;
  line-height: 130%;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  right: 394px;
  top: 45.5px;
  width: min-content;
  height: min-content;
  text-align: center;
  align-items: center;
  white-space: nowrap;
  flex-direction: column;
}
.myProfile {
  color: #000;
  font-size: 16px;
  line-height: 130%;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  right: 270px;
  top: 45.5px;
  width: min-content;
  height: min-content;
  text-align: center;
  align-items: center;
  white-space: nowrap;
  flex-direction: column;
}
.cartButton {
  position: absolute;
  right: 96px;
  top: 32px;
  width: 126px;
  height: 48px;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  padding: 14px 23px;
  border-radius: 4px;
  background-color: #426b1f;
  overflow: hidden;
}
.basket3 {
  color: #fff;
  font-size: 16px;
  line-height: 130%;
  font-weight: 600;
  font-family: Inter, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
    'Liberation Sans', sans-serif;
  position: absolute;
  left: 50%;
  top: 50%;
  width: min-content;
  height: min-content;
  text-align: center;
  align-items: center;
  white-space: nowrap;
  flex-direction: column;
  transform: translate(-50%, -50%);
}

6. プロジェクトを作成(NextJS)

6-1. プロジェクトを作成

npx create-next-app@latest
Need to install the following packages:
create-next-app@15.0.0
Ok to proceed? (y)

✔ What is your project named? … figma-clapy
✔ Would you like to use TypeScript? … No / Yes
✔ Would you like to use ESLint? … No / Yes
✔ Would you like to use Tailwind CSS? … No / Yes
✔ Would you like your code inside a `src/` directory? … No / Yes
✔ Would you like to use App Router? (recommended) … No / Yes
✔ Would you like to use Turbopack for next dev? … No / Yes
✔ Would you like to customize the import alias (@/* by default)? … No / Yes
✔ What import alias would you like configured? … @/*
Creating a new Next.js app in /home/sondon/dev/wsl/nodejs/react/figma-clapy.

6-2. ファイル構成

.
├── README.md
├── next-env.d.ts
├── next.config.ts
├── package-lock.json
├── package.json
├── public
│   ├── file.svg
│   ├── globe.svg
│   ├── next.svg
│   ├── vercel.svg
│   └── window.svg
├── src
│   └── app
│       ├── favicon.ico
│       ├── fonts
│       │   ├── GeistMonoVF.woff
│       │   └── GeistVF.woff
│       ├── globals.css
│       ├── layout.tsx
│       ├── page.module.css
│       └── page.tsx
└── tsconfig.json

4 directories, 18 files

6-3. ライブラリをインストール

npm i sass

7. サーバーを起動

npm run dev

8. ブラウザで確認

  • http://localhost:3000

9. プロジェクトにダウンロードファイルをコピー

9-1. 対応内容

  • 「public」に以下をコピー
    • public/assets
  • 「src/app」に以下をコピー
    • src/components
    • src/App.module.scss
    • src/App.tsx
    • src/favicon.svg
    • src/resets.scss
  • 「main.tsx」を「page.tsx」に置き換え

9-2. ソース内から「.js」を削除

9-2-1. App.tsx

import { ShoppingCart } from "./components/ShoppingCart/ShoppingCart.js";
↓
import { ShoppingCart } from "./components/ShoppingCart/ShoppingCart";

9-2-2. components/ShoppingCart.tsx

import { ButtonIcon } from "./ButtonIcon.js";
import { InputFieldIcon2 } from "./InputFieldIcon2.js";
import { InputFieldIcon3 } from "./InputFieldIcon3.js";
import { InputFieldIcon } from "./InputFieldIcon.js";
↓
import { ButtonIcon } from "./ButtonIcon";
import { InputFieldIcon2 } from "./InputFieldIcon2";
import { InputFieldIcon3 } from "./InputFieldIcon3";
import { InputFieldIcon } from "./InputFieldIcon";

9-3. ファイル構成

.
├── README.md
├── next-env.d.ts
├── next.config.ts
├── package-lock.json
├── package.json
├── public
│   ├── assets
│   │   ├── edONeilAvvdZlhDowAUnsplash1.jpeg
│   │   ├── k8_fkPHulvMUnsplash2.jpeg
│   │   └── noonbrewZiCb4_EKmakUnsplash.jpeg
│   ├── file.svg
│   ├── globe.svg
│   ├── next.svg
│   ├── vercel.svg
│   └── window.svg
├── src
│   └── app
│       ├── App.module.scss
│       ├── App.tsx
│       ├── components
│       │   ├── ShoppingCart
│       │   │   ├── ButtonIcon.tsx
│       │   │   ├── InputFieldIcon.tsx
│       │   │   ├── InputFieldIcon2.tsx
│       │   │   ├── InputFieldIcon3.tsx
│       │   │   ├── ShoppingCart.module.scss
│       │   │   └── ShoppingCart.tsx
│       │   └── _resets.module.scss
│       ├── favicon.ico
│       ├── favicon.svg
│       ├── fonts
│       │   ├── GeistMonoVF.woff
│       │   └── GeistVF.woff
│       ├── globals.css
│       ├── layout.tsx
│       ├── page.module.css
│       ├── page.tsx
│       └── resets.scss
└── tsconfig.json

7 directories, 32 files

10. ブラウザで確認(コピー後)

  • http://localhost:3000

11. 備考

今回はClapyプラグインを使い、NextJSのソースコードを自動生成する内容でした。

12. 参考

投稿者プロフィール

Sondon
開発好きなシステムエンジニアです。
卓球にハマってます。

関連記事

  1. 【Figma】Layout Gridを作成(PC・Tablet・Mob…

  2. 【Figma】NextJSのソースコードを自動生成(Locofy.ai…

  3. 【Figma】Figmaを使ってみる

  4. 【Figma】既存のサイトからワイヤーフレームを作ってみる

最近の記事

  1. AWS
  2. AWS
  3. AWS

制作実績一覧

  1. Checkeys