mesh-avatar-studio
일러스트를 코딩 에이전트와 로컬 편집기로 2D 메쉬 애니메이션 아바타로 변환
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
BLOKZA — Marketing Site + Visual Editor
1. The marketing site — pure HTML, CSS and vanilla JavaScript at the repo root. No build step, no dependencies.
2. The builder — a React + TypeScript single-page app in builder/, compiled into app/ and served at /app/.
The builder is a real editor, not a demo: nested containers, per-breakpoint
styling, multiple pages, and a static-site export.
app/ is committed, because the marketing site is deployed as static files
with no build step. Rebuild it and commit the result whenever builder/ changes.README 전문 보기 ↗Two things live in this repository:
builder/, compiled into app/ and served at /app/.| Page | Path | Description |
|---|---|---|
| Home | index.html | Hero, problem, tabbed showcase, features, templates, pricing, testimonials, FAQ, CTA |
| Product | product.html | Editor walkthrough |
| Features | features.html | Full feature matrix |
| Templates | templates.html | 9 production templates |
| Pricing | pricing.html | Plans, comparison table, monthly/yearly toggle |
| Docs | docs.html | Sticky sidebar + content |
| Blog | blog.html | 6-post grid with custom SVG covers |
| Contact | contact.html | Form posting to /api/contact |
| Builder | app/ | The visual builder (built from builder/) |
| Editor (legacy) | editor.html | 301 redirect to /app/ for old links |
| 404 | 404.html | Branded not-found page |
The builder is a real editor, not a demo: nested containers, per-breakpoint styling, multiple pages, and a static-site export.
cd builder
npm install
npm run dev # http://localhost:5273
cd builder
npm test # unit tests (core model, store, export)
npm run typecheck # tsc, no emit
npm run build # typecheck + emit into ../app
app/ is committed, because the marketing site is deployed as static files
with no build step. Rebuild it and commit the result whenever builder/ changes.
| Area | Where | What it does |
|---|---|---|
| Document model | builder/src/core/ | Normalised node map, tree queries, drop validation, CSS compiler, storage, export |
| Components | builder/src/registry/ | Layout, content, media and form primitives, plus section templates |
| State | builder/src/store/editor.ts | Zustand + Immer, snapshot undo with coalescing |
| Canvas | builder/src/canvas/ | Device iframe, pointer drag engine, selection overlay |
| Panels | builder/src/ui/ | Rail, top bar, insert/layers/pages/theme/settings, inspector |
Three decisions explain most of the design:
<iframe> sized to the device. Media queries fire
because the frame genuinely is 390px wide, vh resolves against a real
viewport, and no editor CSS can leak into the page.@media and :hover
cannot be expressed inline, so responsive and interaction states would
otherwise be fake. Properties come from a closed whitelist and every value is
validated before it is emitted.Publish produces a ZIP containing one HTML file per page, a single styles.css,
sitemap.xml and robots.txt. Pages are rendered through the same components
the canvas uses, so the output cannot drift from the preview. Links between pages
are rewritten to relative filenames, which means the ZIP works from a local
folder, an S3 bucket, GitHub Pages or Netlify without changes.
Everything is client-side: work autosaves to localStorage, and the project can
be downloaded as a .blokza.json file to move between browsers.
<main id="main"> landmark per pageprefers-reduced-motionOrganization + SoftwareApplication structured data/site.webmanifest)robots.txt + sitemap.xmlvercel.json/assets/*, no-cache on HTML, content-hashed ?v= stampsVercel serves the repository as committed — no build step on their side — and
runs api/auth.mjs for /api/auth/*.
./scripts/preflight.sh # is everything configured?
./scripts/release.sh # build the editor, regenerate the sitemap, stamp assets
git commit -am "…" && git push
release.sh matters because there is no build on the far side: it is what keeps
the committed app/ bundle, sitemap.xml, and every content-hashed ?v= stamp
honest. ./scripts/release.sh --check verifies without writing.
Full detail in docs/DEPLOY.md; accounts and sign-in in docs/CLOUD.md.
The form posts to /api/contact, a function in this repository that speaks SMTP
and delivers the message as email. Nothing goes through a third-party form
service, so submissions are not stored anywhere but the destination inbox.
It needs a mailbox to send from. In the Vercel project's environment variables:
| Variable | Required | Meaning |
|---|---|---|
SMTP_USER | yes | The full mailbox — [email protected] |
SMTP_PASS | yes | An app-specific password, not the account password |
CONTACT_TO | no | Where submissions land; defaults to SMTP_USER |
SMTP_HOST | no | Defaults to smtp.zoho.com |
SMTP_PORT | no | Defaults to 465 (implicit TLS) |
Zoho's free tier has no SMTP — it is web-only for new accounts — so this needs Mail Lite or above. Generate the app password under Zoho's Security → App passwords, never the login password.
With the variables unset the endpoint answers 503 and the form shows its
fallback ("email us instead") rather than failing silently. The honeypot,
validation, and success/error states are wired up either way.
No build step. Open index.html directly in a browser, or:
python3 -m http.server 8000
# or
npx serve .
Then visit http://localhost:8000.
.
├── index.html / product.html / pricing.html / ... ← marketing pages
├── editor.html ← redirect to /app/
├── 404.html ← branded not-found
├── sitemap.xml / robots.txt / site.webmanifest ← SEO foundation
├── vercel.json ← headers, redirects, function region
├── api/auth.mjs ← Neon Auth proxy (first-party cookie)
├── neon/schema.sql ← sites table + row-level security
├── .github/workflows/ci.yml ← validation pipeline
├── assets/
│ ├── css/
│ │ ├── base.css ← tokens, nav, footer, motion utilities
│ │ ├── pages.css ← hero, features, pricing, testimonials, FAQ
│ │ └── demos.css ← template demo pages
│ ├── js/
│ │ └── site.js ← reveals, submenus, pricing toggle, contact form
│ └── og-image.png ← social share card (1200×630; SVG is not rendered by any platform)
├── app/ ← built builder (committed)
├── builder/ ← builder source
│ ├── src/core/ ← document model, CSS compiler, export
│ ├── src/registry/ ← components + section templates
│ ├── src/store/ ← editor state, undo/redo
│ ├── src/canvas/ ← device iframe, drag engine, overlay
│ ├── src/ui/ ← chrome, panels, inspector
│ └── test/ ← unit tests
└── README.md
Structure. Sections, containers, stacks, rows, grids and cards nest to any depth. Drop anywhere — between siblings, inside a container, into an empty box — with a live indicator showing exactly where an element will land. Drag from the palette, from the canvas, or from the layers tree.
Elements. Heading, text, rich text, button, link, badge, quote, list, icon, image, video, embed, form, input, text area, select, checkbox, submit — plus 14 section templates (nav bar, two heroes, feature grid and media, logo strip, stats, testimonials, pricing, FAQ, gallery, CTA, contact, footer).
Styling. A generic CSS inspector over a whitelisted property set: layout,
visual spacing box, size, typography, background, border, effects, position.
Every property can be overridden per breakpoint (desktop / tablet / mobile) and
for :hover, with the current layer always named in the panel and an indicator
on any property you have changed.
Pages and theme. Multiple pages with their own path and SEO metadata, internal links that resolve to real files on export, and design tokens for colour, type, radius and content width.
Editing. Click to select, click again to edit text in place, drag to move, ⌘D to duplicate, ⌘C/⌘V to copy, ⌥↑/⌥↓ to reorder, ⇧↑ to select the parent, and undo across everything — typing counts as one step, not one per keystroke.