Materializr
開源參數式 3D CAD 給創客 — 受限草圖、實體建模、螺紋、SVG 與文字雕刻、STL/STEP 匯出。Android、iPad、Linux、Mac、Windows。Vibe 編碼。
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
MVP веб-застосунку (і Telegram Mini App) для створення анімованих емодзі в стилі Auto Emoji Maker: вводите текст або завантажуєте SVG-логотип, обираєте персонажів, кольори та розмір і отримуєте готові файли .tgs для Telegram (або Lottie JSON). Усе працює в браузері, без сервера, акаунтів і кабінетів.檢視完整 README ↗
MVP веб-застосунку (і Telegram Mini App) для створення анімованих емодзі в стилі Auto Emoji Maker:
вводите текст або завантажуєте SVG-логотип, обираєте персонажів, кольори та розмір і отримуєте готові
файли .tgs для Telegram (або Lottie JSON). Усе працює в браузері, без сервера, акаунтів і кабінетів.
opentype.js), тож у файлі немає текстових шарів, які Telegram не підтримує.
13 вбудованих шрифтів із кирилицею (Nunito, Rubik, Unbounded, Montserrat, Russo One, Dela Gothic, Lobster…), до 3 рядків,
обводка, міжлітерний і міжрядковий інтервали, ВЕЛИКІ ЛІТЕРИ. Можна завантажити свій шрифт (TTF / OTF / WOFF).path, rect, circle, ellipse, line, polyline, polygon, <use>, вкладених <svg>, трансформацій,
CSS-класів із <style>, прозорості, fill-rule, обводок і лінійних/радіальних градієнтів. Режими «оригінальні кольори» або «перефарбувати»,
плюс контур-наліпка навколо лого. SVG ніколи не вставляється в сторінку (безпечно щодо скриптів у файлі).[ ] з клавіатури) або пальцями (одним — рух, двома — масштаб і поворот)..json, .tgs і .lottie (dotLottie з LottieFiles, з картинками всередині).
Вирази After Effects (wiggle, loopOut, прив'язки між шарами…) виконує лише повний веб-плеєр — ні Telegram, ні прев'ю їх не
запускають, тож такі файли виглядали поламаними. Під час імпорту анімація один раз програється повним плеєром (він
завантажується окремо й лише для таких файлів), а значення кожної властивості з виразом записуються звичайними ключовими
кадрами (прямі відрізки зливаються, щоб файл не ріс). Неквадратні сцени (1920×1080, 800×600…) вписуються в 512×512 у
композиції розміру свого кадру, тож те, що було за краєм, не вилазить у поля; у списку шарів ця рамка не показується.
Якщо у файлі лишилося те, чого Telegram не показує (ефекти шарів, текст, картинки, 3D, Merge Paths), панель шарів про це
попереджає. Перевірено на 93 анімаціях з прикладів rlottie і 228 анімаціях самого Telegram.t.me/addstickers/…,
t.me/addemoji/…, чи вставте його в редакторі на плитці «Пак стікерів») — редактор завантажить усі анімовані стікери,
приведе їх до формату Telegram (512×512, 60 FPS), сам знайде лого/напис, спільний для всіх стікерів паку (порівнює
контури незалежно від положення й розміру; копії-обводки ховає), і підставить замість нього ваш текст чи лого. Паки
з'являються в «Мої паки»; адміністратор бота може додати пак у «Шаблони бота» — їх бачать усі користувачі..tgs (gzip + "tgs": 1) або Lottie JSON, окремо чи одним ZIP. Для кожного файлу перевіряються ліміти Telegram:
512×512, 60 FPS, ≤ 3 с, ≤ 64 КБ. Типовий розмір — 1–5 КБ.localStorage.Звичайний користувач бачить простий застосунок (мобільний у першу чергу): Головна · Створити · Мої · PRO · Профіль, зверху — баланс «✨ Генерації: N» (дотик — поповнення).
cost генерацій на бекенді атомарно (Lua-скрипт у Redis): баланс не піде в мінус, а повторне
натискання, перезавантаження чи повтор запиту з тим самим id не спише вдруге. Результат — у «Мої генерації» (файли
зберігаються на пристрої, список — на сервері): завантажити .tgs, надіслати в Telegram, створити емодзі-пак. Бот
доставляє клієнтам лише оплачені дизайни (gens у /api/send, /api/pack перевіряються).POST /api/app/wallet), і оплата йде з нього одним
дотиком; або посилання ton://transfer / вручну з унікальним коментарем. Ціна в GRAM — за курсом Crypto Pay
(getExchangeRates, GRAM або TON) або GRAM_USD_RATE.
Генерації зараховуються тільки після підтвердження платіжною системою (Crypto Pay getInvoices / підписаний вебхук,
транзакція GRAM у блокчейні TON через toncenter — коментар, сума, не bounced) і рівно один раз. Незавершений платіж
запам'ятовується — після повернення з гаманця перевірка продовжується сама.ADMIN_IDS, PRO — оплачений строк). Адміну в профілі доступні
адмін-панель (стартові генерації, ціна дизайну, пакети, PRO, які шаблони бачать клієнти й які PRO, нарахування
користувачу, платежі) і (шари, шрифти, позиції — увесь попередній функціонал); у ньому кнопка
«Опублікувати для клієнтів» на стікерах паку шаблонів зберігає, куди підставляються фото/логотип/текст. Усі адмін-дії
перевіряються на бекенді ( → 403 для не-адмінів).Налаштування (Vercel → Settings → Environment Variables, потім Redeploy):
KV_REST_API_URL і KV_REST_API_TOKEN (або UPSTASH_REDIS_REST_URL/_TOKEN; з власним префіксом —
<PREFIX>_REST_API_URL/_TOKEN, теж підхоплюються). Без нього генерації безкоштовні,
а адмін усе одно бачить розширений редактор.ADMIN_IDS — ваш Telegram ID (бот покаже на /id).CRYPTO_PAY_TOKEN
(для тестів — @CryptoTestnetBot і CRYPTO_PAY_NETWORK=testnet). Там же в Webhooks
увімкнути й вказати https://<проєкт>.vercel.app/api/app/cryptopay (без нього оплата підтверджується опитуванням).GRAM_WALLET (або старе TON_WALLET) — адреса гаманця для прийому; за бажанням TONCENTER_API_KEY (ключ
від @tonapibot, без нього 1 запит/с), GRAM_USD_RATE (фіксований курс), GRAM_NETWORK=testnet.Якщо рахунок не створюється, у вікні оплати тепер видно причину й код: accounts-off — не підключене сховище (п. 1);
method-off — немає токена/гаманця; UNAUTHORIZED — токен Crypto Pay не той або з іншої мережі (токен з
@CryptoTestnetBot працює лише з CRYPTO_PAY_NETWORK=testnet, з @CryptoBot — без неї); інші коди — помилка Crypto Pay
(див. документацію). Якщо Crypto Pay не приймає кнопку «повернутися в
застосунок» (paid_btn_url), рахунок створюється без неї.
API: POST /api/app/me | generate | pay | pay-status | wallet | admin, GET /api/app/catalog | template-edits,
POST /api/app/cryptopay (вебхук) — одна функція Vercel api/app/[action].ts.
npm install
npm run dev # http://localhost:5173
npm test # юніт-тести (vitest)
npm run build # типізація + продакшн-збірка в dist/
npm run preview # перегляд збірки
Потрібен Node.js 20+.
/newemojipack..tgs./publish.dist/ — це статичний сайт, тож його можна розмістити на будь-якому HTTPS-хостингу. У репозиторії налаштовано
GitHub Pages (.github/workflows/pages.yml): кожен пуш у main проганяє тести, збирає застосунок і публікує його на
https://oxytarget.github.io/lottie-emoji-editor/. Запустити деплой вручну можна з вкладки Actions → Deploy to GitHub Pages → Run workflow.
Одноразове налаштування: Settings → Pages → Build and deployment → Source: GitHub Actions.
Для приватного репозиторію Pages доступні лише на платних тарифах GitHub (Pro / Team); на безкоштовному — зробіть
репозиторій публічним або використайте Netlify, Vercel чи Cloudflare Pages (команда збірки npm run build, тека dist).
Потім у @BotFather → Bot Settings → Menu Button / Configure Mini App вкажіть URL застосунку.
Налаштування бота (.github/workflows/telegram-bot.yml, запуск вручну): кнопка меню «Emoji Studio» відкриває редактор,
команда /start, опис і короткий опис (uk / ru / en). Потрібен секрет TELEGRAM_BOT_TOKEN
(Settings → Secrets and variables → Actions). Токен ніколи не комітьте в репозиторій.
Бекенд бота (api/ + worker/src/app.ts, звичайні Web Request → Response):
POST /api/send — у Telegram кнопка «Надіслати в чат» у вікні експорту відправляє файли сюди; бекенд перевіряє
підпис initData і бот надсилає .tgs файлами користувачу в чат (альбомами по 10). Якщо користувач ще не натискав Start,
Mini App попросить дозвіл на повідомлення й повторить спробу;POST /api/pack — бот сам створює емодзі-пак користувача (createNewStickerSet, тип custom_emoji, власник — користувач)
або дописує в пак, створений раніше (addStickerToSet, до 200 емодзі). У вікні експорту задаються назва паку й звичайний емодзі
для кожного персонажа; після створення бот надсилає посилання t.me/addemoji/.... Великі паки: Telegram створює пак
одразу лише з 50 емодзі, а решту дозволяє додавати по одному й лише певну кількість за кілька хвилин, потім відповідає
«retry after N s». Редактор додає рівним темпом, а таку паузу відчікує скільки треба (зворотний відлік, кнопка
«Зупинити»; пауза запам'ятовується й для наступних запитів, бо ранній запит її лише подовжує). Прогрес зберігається
(можна закрити застосунок і потім натиснути «Додати решту»), або пак можна розбити на кілька по 50 — вони створюються
без очікування. Повтор запиту безпечний: новий пак названо за nonce клієнта, а для наявного клієнт передає, скільки
емодзі в ньому нарахував (size) — бекенд звіряє з getStickerSet і не додає вдруге те, що вже потрапило в пак
(Telegram іноді приймає емодзі й одразу відповідає «зачекайте», або відповідь губиться через обрив зв'язку чи тайм-аут);
обірвані запити редактор повторює сам. Один запит додає не довше ~40 с (ліміт функції Vercel), решта — наступним. Файли перетворюються на полотно 100×100
(формат кастомних емодзі); якщо Telegram відхилить його, бекенд автоматично повторить із 512×512;POST /api/telegram — вебхук: на /start бот відповідає привітанням і кнопкою «Відкрити редактор»; на /start link —
кодом для редактора в браузері (див. нижче); на стікер, кастомне
емодзі чи посилання на пак — кнопкою «Відкрити як шаблони» (адміністраторам ще й «Додати в шаблони бота для всіх»);
/templates — список шаблонів бота, /id — ваш Telegram ID;GET /api/stickerset?name=…, GET /api/sticker?id=… — анімовані стікери паку для редактора (публічні дані, кешуються CDN;
файли віддаються через бекенд, бо посилання Telegram містять токен; віддаються лише .tgs);GET /api/templates — паки, які адміністратор додав у шаблони бота;GET /api/link?code=… — чи дійсний код прив'язки браузера;GET /api/health — перевірка, чи задано токен, і @username бота.Паки з браузера. У Mini App бот знає користувача з підпису initData. Редактор, відкритий у звичайному браузері,
у вікні «Завантажити» пропонує «Створити пак у Telegram»: кнопка «Відкрити бота» веде на t.me/<бот>?start=link, бот
відповідає кодом і кнопкою «Повернутися в редактор» (#tglink=<код> в адресі) — або код можна вставити вручну. Після цього
бот сам створює паки й надсилає файли в чат так само, як у Mini App. Код — це ID користувача й строк дії (90 днів),
підписані HMAC від токена бота: без бази даних і без /setdomain у BotFather. Код зберігається лише в цьому браузері
(вимкнути — у вікні експорту чи в профілі); прострочений бекенд відхиляє, і редактор попросить підключитися знову.
Шаблони бота для всіх. Додайте у Vercel змінну ADMIN_IDS — свій Telegram ID (бот покаже його на /id; кілька — через
кому) і зробіть Redeploy. Тоді на надісланий пак бот покаже адміністратору кнопку «➕ Додати в шаблони бота для всіх».
Список зберігається без бази даних — у повідомленні, яке бот закріплює в чаті першого адміністратора (не відкріплюйте його).
lottie-emoji-editor (Framework Preset визначиться як Vite).TELEGRAM_BOT_TOKEN = токен бота → Deploy..env.production (VITE_BOT_API_URL=https://lottie-emoji-editor.vercel.app) —
і GitHub Pages-версія, і Vercel надсилають файли через нього. Для іншого проєкту змініть цю адресу.backend_url вкажіть https://<проєкт>.vercel.app —
зареєструється вебхук (повідомлення й натискання кнопок). Після оновлень бота запустіть його ще раз.Workflow .github/workflows/bot-backend.yml деплоїть worker/, передає йому токен, реєструє вебхук і перезбирає сайт.
Секрети репозиторію: TELEGRAM_BOT_TOKEN, CLOUDFLARE_API_TOKEN (шаблон Edit Cloudflare Workers на
https://dash.cloudflare.com/profile/api-tokens), CLOUDFLARE_ACCOUNT_ID (32 символи в адресі панелі після dash.cloudflare.com/).
Перед першим деплоєм відкрийте https://dash.cloudflare.com/?to=/:account/workers/onboarding, щоб створився піддомен *.workers.dev.
Локально: cd worker && npm install, створіть worker/.dev.vars з TELEGRAM_BOT_TOKEN=... і ALLOWED_ORIGINS=http://localhost:5173,
запустіть npx wrangler dev, а сайт — VITE_BOT_API_URL=http://127.0.0.1:8787 npm run dev.
Скрипт telegram-web-app.js підвантажується лише тоді, коли сторінку відкрито як Mini App (є параметри tgWebApp*):
застосунок розгортається на весь екран, підхоплює мову користувача та дає тактильний відгук.
Деякі клієнти Telegram (зокрема iOS) блокують завантаження файлів із міні-застосунку, тому у вікні експорту є кнопка «Відкрити в браузері».
src/
lottie/ генерація Lottie: кейфрейми, шейпи, Безьє, заливки/градієнти, збирання, експорт TGS/ZIP, імпорт, перефарбування
розбір імпортованих анімацій на частини й їх переміщення (parts.ts), пошук спільного лого в паку (packs.ts)
content/ текст → контури (opentype.js), SVG → контури, каталог шрифтів
templates/ анімовані персонажі (builtin.ts) і векторні деталі (kit.ts)
state/ стан (zustand), пресети, компіляція у Web Worker (з кешем), завантаження паків, постери плиток (posters.ts)
components/ інтерфейс
lib/ інтеграція з Telegram Mini App і надсилання файлів у чат
api/ функції Vercel (бекенд бота)
worker/ спільний код бекенда + вхід для Cloudflare Workers
scripts/ налаштування бота й вебхука
Ключова ідея: будь-який контент (текст чи лого) спершу перетворюється на незалежні від роздільності контури (VectorArt),
а шаблон лише задає «слот», куди контент вписується, і анімацію. Згенеровані файли використовують тільки те, що підтримує rlottie
(рендерер Telegram): шейп-шари, null-шари для анімації, групи, контури, еліпси, прямокутники, заливки, обводки й градієнти.
Під час розробки всі шаблони перевірено рендерингом у rlottie.
clip-path, фільтри й візерунки пропускаються (редактор про це попереджає) —
переведіть текст у криві та спростіть файл перед імпортом..tgs) стікери й емодзі; відео (.webm) і статичні пропускаються. Лого шукається за
однаковими контурами в більшості стікерів паку — якщо в паку лого немає або кожен стікер різний, редактор кладе ваш текст
поверх (це можна вимкнути), а замінну частину можна вибрати вручну в «Частинах анімації»./api/app/admin