0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

個人開発で、抽象図形ライブラリ「MOYO」を作って npm に公開しました。
着想から公開まで、だいたい2日です。

この記事では何を作ったのか、どうやって思いついたのか、具体的どう行動したのかを整理します。

MOYOのサンプル(wander / churn / cluster)

対象読者

  • 個人開発で npm 公開を一度やってみたい人
  • 「ライブラリってどう世に出すの?」が気になっている人
  • Vue で余白やローディングに動きを足したい人

1. きっかけ:MDI の逆を行きたくなった

Material Design Icons(MDI)を眺めていて、ふと思いました。
並んでいるのは、当たり前ですが、ぜんぶ 形に意味がある アイコンです。

MDI のアイコン群(形に意味がある世界)

じゃあ、「抽象的なアイコン」があってもいいのでは?
npm でコード1行で呼べたら面白いかも、と。

そういえば Claude のローディングアイコンも、意味を決めない有機的な動きでした。
「なんだかわからないけど、生きてる塊」を余白に置けるライブラリが欲しくなりました。

2. 作ったもの:MOYO

作ったのが MOYO です。

  • コンセプトは「動きが主役、形は容れ物」
  • 名前の由来は「模様」+「モヨっ」の響き
  • Vue なら MoyoBlob を1行置くだけで動く
  • 動きに愛着が生まれる思想で設計した
<script setup>
// Vue 3 ならこれだけ
import { MoyoBlob } from "@ikg-systems/moyo-vue";
</script>

<template>
  <MoyoBlob base="wander" color="#5436DA" :size="160" />
</template>

クイックスタート:wander が動く

デモはここです。スライダーで触って、Copy Vue でコードをコピーできます。

👉 https://yoseiikegami.github.io/moyo/

デモ画面のスクリーンショット

3. 使えそうな場面を4つ作ってみた

抽象的だからこそ、用途を決めつけにくい。
LT用に、画面イメージを4つ作りました。

キービジュアル

ヒーロー余白に置いた例

感情・ムード

言いづらいモヤモヤを形にした例

ローディング

送信ボタン後のローディング例

入力中…

チャットのタイピング表示例

ヒーローにも、モヤモヤにも、入力中にもなる。
形に意味を持たせていないので、コピーやUIとぶつかりにくいです。

4. こだわったこと

どんな形にしても、カクカクしない

制御点を Catmull-Rom スプラインでベジェに変換しています。
complexity を上げても、トゲや自己交差のない閉曲線になるようにしました。

動きを、3つの「性格」に分けた

強さの違いではなく、質の違いです。

base どんな感じ どう動く
breathe 穏やかに呼吸する 輪郭全体が、そろって膨らんだり縮んだりする
wander ゆったり流れる へこみと出っぱりが、縁をぐるっと一周する
churn いきいき暴れる 各点がバラバラのリズムで、押し引きする

モーション3種:breathe / wander / churn

scaleUp みたいな無機質な名前ではなく、「呼吸」「かき混ぜる」と付けました。
使う側が演出を選べるようにしたかったからです。

複数の塊が、くっついたり離れたり

MoyoCluster は群れです。SVGの gooey フィルタで、塊同士がニュルッと融合します。

<script setup>
import { MoyoCluster } from "@ikg-systems/moyo-vue";
</script>

<template>
  <!-- count と spread で群れの様子を調整 -->
  <MoyoCluster base="wander" :count="6" :spread="0.5" :spin-speed="0.3" color="#5436DA" />
</template>

Clusterモード

seed で形を固定できる

毎回ランダムだとロゴ用途に使いにくいので、同じ seed なら同じ形になるようにしました。

<!-- ブランドマーク想定:seed で形を固定 -->
<MoyoBlob
  base="breathe"
  color="#D94A1E"
  :size="120"
  :complexity="14"
  :edge="0.5"
  :spike="0.4"
  seed="site-logo"
/>

同じ seed は同じ形、別 seed は別の形

パッケージを2層に分けた

パッケージ 役割
@ikg-systems/moyo SVGパスを生成するコア(framework非依存)
@ikg-systems/moyo-vue Vue 3 のコンポーネント

「計算」と「描画」を分けておくと、あとで React などに広げやすいです。
Vueユーザーは moyo-vue を入れるだけで足ります。

# Vue ならこちら
npm install @ikg-systems/moyo-vue

# コアだけ使いたい場合
npm install @ikg-systems/moyo

5. AI を工程で使い分けた

作るときは、AIを工程ごとに分けました。

工程 道具 やったこと
思想・壁打ち Gemini 「MDIの逆」を一緒に転がす
設計・レビュー Claude モノレポ構成、責務分割の相談
実装 Cursor 設計を渡して一気にコード化
公開 自分 npm・デモ・GitHub Pages

Gemini で「何を作るか」を固め、Claude で「どう組むか」を固め、Cursor で形にする。
考える → 設計する → 書く、を道具ごとに分けた感覚です。

モノレポの参照設定みたいな面倒なところも、設計を渡して「このまま実装して」で通ることが多かったです。
公開まわり(アカウント、スコープ、package.json、publish)は自分で進めました。

6. npm 公開は、思ったより簡単だった

初めての公開でやったことは、だいたいこれです。

  1. 名前を確保moyo は取られていたので @ikg-systems/moyo(スコープ)にした
  2. package.json を整えるexports / files / publishConfig
  3. 2FA を設定 — publish には必須。メールでの認証を行いました。
  4. pnpm -r publish --access public — スコープ公開は --access public を忘れずに

パッケージ名が空いているかは、最初に確認した方がいいです。取られていたら @your-name/pkg にするのが早いです。自分は確認不足でこのタイミングで気づきました(笑)

あわせて GitHub と、デモの GitHub Pages も公開しました。
ここまで含めて、着想からだいたい2日でした。

7. 正直な弱点

公開してから見えた課題もあります。

  • 常時アニメーションが回り続けるprefers-reduced-motion や画面外での自動停止(IntersectionObserver)はまだない
  • すぐ使えるのは今のところ Vue だけ — React / Svelte はコアから自分で組む必要がある
  • バージョンはまだ 0.1.x — 初期版らしい粗さが残っている

公開して人に見せる前提に立って、初めて「直さなきゃ」と気づけた部分です。

8. パフォーマンスの目安

装飾用途なら、体感では気になりにくい軽さです。

  • 配布サイズ:gzip で core + vue 合わせて 約 4KB(依存ゼロ)
  • 単一 blob:CPU 占有 約 1.2%
  • 検証環境でCPU を6倍遅くした端末でも、数個〜50個なら 60fps 超
条件 素の性能 CPU 6倍遅い端末
単一 blob 120fps 120fps
50個 120fps 111fps
100個 120fps 54fps

依存ゼロで gzip 約4KBなので、装飾として気軽に足しやすいです。
Lottie 系と比べると、ランタイム+JSONアセットが要らないぶん軽いです。

9. まとめ

  • MDI の逆をいく、抽象的な図形を作った
  • AI を工程で使い分けて、着想から2日で公開した
  • npm 公開自体は、思ったより簡単だった
  • 使い方はユーザー次第。ヒーローにも待機表示にも使える

リンクはこちらです。

気になった方は、デモで触ってみてください。

余談:npm は、誰でも公開できる

個人でもここまで出せる、というのは素直に嬉しいです。
一方で、品質を問わず誰でも公開できる、という面もあります。

使う側としては、次のような目線が大事だなと、作ってみて実感しました。

  • メンテされているか
  • 依存は安全か
  • 自分で読める規模か

初めての公開で手探りだったからこそ、普段使っているライブラリへの親近感も湧きました。
やりたいアイデアがまだあるので、これからも続けます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?