PlanMe · Designers
Покроковий процес
Десять кроків від чистого артборда до переданого пакета: налаштування документа, токени, денні аркуші, колір, шрифти, експорт, назва файлу і перевірка. Робіть їх по порядку — кожен наступний спирається на попередній.
Крок 1. Налаштуйте документ
Малюйте в точних пропорціях паперу — по одному артборду на файл. Полотно задавайте в міліметрах, а viewBox має збігатися з цими ж числами.
- 1Створіть документ із одним артбордом потрібного розміру (таблиця нижче).
- 2У налаштуваннях документа виберіть одиниці — міліметри.
- 3Переконайтеся, що артборд один. Другий артборд зламає імпорт.
- 4Тримайте виліт усередині полотна: сторінка обрізається рівно по цьому прямокутнику.
| Формат | Розмір (мм) | viewBox |
|---|---|---|
| A4 | 210 × 297 | 0 0 210 297 |
| A5 | 148 × 210 | 0 0 148 210 |
| Letter | 215.9 × 279.4 | 0 0 215.9 279.4 |
<svg xmlns="http://www.w3.org/2000/svg"
width="210mm" height="297mm" viewBox="0 0 210 297"
preserveAspectRatio="xMidYMid meet">A4 і A5 мають однакові пропорції (1:√2), тому файл A4 автоматично використовується і для A5 — масштабується. Окремий файл потрібен лише для Letter. Тобто два файли на шаблон, а не три.
Крок 2. Намалюйте макет
Малюйте так, ніби це готова сторінка на конкретний місяць: реальна сітка, реальні заголовки, реальні лінійки. Тільки замість самого тексту ви поставите токени на наступному кроці.
Для сітки місяця намалюйте 42 текстові елементи — шість рядів по сім. Вирівнювання під потрібний день тижня і порожні клітинки на початку місяця PlanMe робить сам.
- 1Розмістіть фон, рамки, лінійки та декор.
- 2Створіть окремий текстовий об'єкт для кожного місця, де з'являтиметься змінний текст.
- 3Задайте кожному текстовому об'єкту фінальний кегль, накреслення й вирівнювання.
- 4Перевірте найдовший варіант підпису з маніфесту — чи вміщається він.
Крок 3. Поставте токени
Токен має вигляд [family.key] і пишеться або в тексті, або в значенні будь-якого атрибута. Під час рендеру кожен токен замінюється на реальне значення.
- 1Замініть змінний текст на відповідний токен (довідник — нижче на цій сторінці).
- 2Друкуйте токен одним рухом, не редагуючи його посередині.
- 3Виділіть увесь текстовий об'єкт і задайте стиль одразу всьому — не частинами.
- 4Ніколи не переводьте текст у криві: PlanMe має підставити в нього значення.
<rect fill="[color.primary]"/>
<text style="fill:[color.text];font-family:[font.heading]">
[month.name] [year]
</text>Невідомий токен замінюється на порожнечу — без попередження. Одруківка на кшталт [colour.primary] просто зітре текст. Тому крок 8 не пропускайте.
Крок 4. Денні аркуші — головна хитрість
Тиждень розкладається на ціле число аркушів за рахунок того, що вихідні займають половину висоти звичайного дня. Звідси п'ять денних шаблонів.
Найважливіше: аркуш нумерує свої дні ВІД СЕБЕ, а не від початку тижня. [sheet.date.0] — це той день, з якого починається саме цей аркуш. Тому одне креслення day-2-up обслуговує і понеділок+вівторок, і середу+четвер.
- 1Використовуйте [sheet.*] на денних аркушах — ніколи [week.day.N].
- 2Нумеруйте слоти від нуля згори вниз.
- 3У day-1-plus-2 і day-2-plus-2 останні два дні — це вихідні; дайте їм приблизно половину висоти решти.
- 4Можна намалювати більше слотів, ніж потрібно: зайві стануть порожніми самі.
| Шаблон | Днів на аркуші | Аркушів на тиждень |
|---|---|---|
| day-1-up | 1 | Mon 7 · Sun 7 |
| day-2-up | 2 | Mon 2 · Sun 3 |
| day-3-up | 3 | Mon 1 · Sun 2 |
| day-1-plus-2 | 3 | Mon 1 · Sun — |
| day-2-plus-2 | 4 | Mon 1 · Sun — |
| day-1-plus-notes | 1 | Mon — · Sun 1 |
[week.day.N] на денному аркуші покаже правильну дату лише на першому аркуші тижня, а далі — чужі числа. Це найпоширеніша помилка в цій системі.
Крок 5. Колір
Два робочі підходи — обирайте під пакет.
- 1Найпростіше: візьміть hex-значення палітри цього пакета з маніфесту (stylePacks[].palette) і малюйте прямо ними. Для чорно-білого пакета це майже завжди правильний вибір — там лише чорний, сірий і білий.
- 2Якщо одне креслення має обслуговувати кілька пакетів: після експорту відкрийте .svg у текстовому редакторі й замініть кожен hex на відповідний [color.*]. В Illustrator токен у піпетку не введеш.
Для внутрішніх сторінок не використовуйте світло-сірий тонше за 0,5 pt — домашній лазерний принтер його просто не надрукує.
Крок 6. Шрифти
Системні стеки працюють без жодних дій. Якщо пакет використовує власний шрифт, покладіть файл .woff2 у теку fonts/ і опишіть його в pack.json.
- 1Складіть шрифт у fonts/ поруч зі своїми SVG.
- 2Додайте його до масиву fonts у pack.json.
- 3У самому SVG посилайтеся на нього через звичайний font-family або через [font.heading].
- 4Переконайтеся, що ліцензія шрифту дозволяє вбудовування у веб і в PDF.
{
"slug": "mono-serif",
"name": "Serif",
"fonts": [
{ "family": "MyDisplay", "weight": 700, "file": "MyDisplay.woff2" }
]
}Крок 7. Експорт з Illustrator
Налаштування експорту важливіші, ніж здається: половина проблем із артворком починається саме тут.
- 1File → Export → Export As… → формат SVG.
- 2Styling: Presentation Attributes. НЕ Internal CSS — інакше кольори не підмінятимуться.
- 3Font: SVG (жодних Convert to outlines).
- 4Images: Embed.
- 5Object IDs: Layer Names. Decimal: 2.
- 6Minify — вимкнено. Responsive — вимкнено.
Internal CSS видно за класами на кшталт .st0 у файлі. Перевірка з кроку 8 ловить це одразу.
Крок 8. Назвіть файл
Назва файлу — це не опис, а адреса. За нею PlanMe розуміє, яку сторінку і в якому форматі ви намалювали.
- 1Формат назви: <ключ-шаблону>.<формат>.svg — наприклад month-calendar.A4.svg.
- 2Ключ беріть зі списку внизу цієї сторінки, символ у символ.
- 3Формат — рівно A4, A5 або Letter, з великої літери.
Файл із помилкою в ключі імпортується мовчки й ніколи не відрендериться. Це відома гостра грань — саме тому є перевірка.
Крок 9. Перевірте перед відправкою
Перевірка знаходить усе, що система інакше проковтне мовчки: невідомі токени, Internal CSS, текст у кривих, токени, розірвані на кілька tspan, неправильні пропорції артборда.
- 1Покладіть файли у storage/assets/<slug>/.
- 2Запустіть перевірку (команда нижче).
- 3Виправте все, що вона позначила як помилку. Попередження — на ваш розсуд.
- 4Надішліть один готовий файл на початку роботи, а не двадцять наприкінці.
npm run assets:checkКрок 10. Передайте пакет
Одна тека на пакет. pack.json потрібен лише якщо пакет має власні шрифти — інакше ми його додамо самі.
<pack-slug>/
pack.json
cover.A4.svg
cover.Letter.svg
month-calendar.A4.svg
...
fonts/
MyDisplay.woff2Slug теки має точно збігатися зі slug набору зі списку в розділі «Набори стилів».
Довідник токенів
Три правила, які варто знати до початку: токен не можна вкладати в токен; усередині токена не буває дужок; підставлені значення екрануються для XML, тому шрифтові стеки повертаються з ' замість апострофів — це нормально.
| Токен | Що підставляється |
|---|---|
| [color.primary] … [color.line] | Кольори палітри пакета: primary, accent, background, surface, text, muted, line. |
| [font.heading] / [font.body] | Шрифтові стеки пакета — заголовковий і основний. |
| [themeName] / [motif] | Назва пакета та його короткий декоративний мотив. |
| [title] / [subtitle] / [heading] | Назва планера, підзаголовок і заголовок сторінки з налаштувань користувача. |
| [year] | Рік планера. |
| [label.*] | Статичні підписи, перекладені на мову планера. Повний список — нижче. |
| [month.name] / [month.short] | Назва місяця сторінки, повна й скорочена. |
| [month.year] | Рік, до якого належить місяць — діапазон може охоплювати два роки. |
| [month.days] | Кількість днів у місяці сторінки. |
| [weekday.long.N] / [weekday.short.N] | Заголовки днів тижня 0–6, повернуті під початок тижня користувача. |
| [grid.0] … [grid.41] | Сітка місяця, шість рядів по сім. Клітинки до 1-го і після останнього дня — порожні. |
| [monthday.1] … [monthday.31] | Номер дня, якщо він існує цього місяця, інакше порожньо: рядок із 31 слота сам скорочується в лютому. |
| [day.1] … [day.31] | Літеральні цифри 1–31. НЕ календарні — лише для фіксованих заголовків стовпців. |
| [week.day.N] / [week.date.N] / [week.iso.N] | День N (0–6) тижня сторінки: число, повна дата, ISO-дата. |
| [week.range] / [week.number] / [week.month] | Заголовки тижня: діапазон, номер за ISO, назва місяця першого дня. |
| [sheet.date.N] / [sheet.day.N] / [sheet.iso.N] | День N ЦЬОГО аркуша — нумерація від аркуша, не від тижня. Слоти понад місткість аркуша — порожні. |
| [sheet.weekday.long.N] / [sheet.weekday.short.N] | Назва дня тижня для дня N цього аркуша. |
| [sheet.range] / [sheet.count] | Діапазон дат аркуша та кількість днів на ньому. |
| [date] / [date.day] / [date.weekday] / [date.iso] | Перший день аркуша: повна дата, число, день тижня, ISO. |
| [config.<key>] | Будь-яке значення з конфігурації сторінки; порожньо, якщо його немає. |
Часті помилки
- Текст переведено в криві. PlanMe нема куди підставляти значення — сторінка залишиться з вашим тестовим текстом назавжди.
- Токен розірвано на кілька tspan. Так буває, якщо редагувати текст посередині або застосувати стиль до частини рядка. [month.name] перетворюється на [mon + th.name] і не спрацьовує.
- Експорт з Internal CSS. Кольори перестають підмінюватися під пакет.
- [week.day.N] на денному аркуші замість [sheet.*]. Дати збігаються лише на першому аркуші тижня.
- Одруківка в токені. Значення зникає без жодного попередження.
- Два артборди в одному файлі. Імпортується лише перший.
- Жорстко вписаний рік або назва місяця. Файл працюватиме рівно один рік.
Усі токени [label.*]
Це статичні підписи, які PlanMe перекладає сам. Пишіть [label.notes], а не «Нотатки» — інакше сторінка залишиться англійською в українському планері.
| Ключ | Токен |
|---|---|
| amount | [label.amount] |
| atAGlance | [label.atAGlance] |
| bed | [label.bed] |
| budget | [label.budget] |
| career | [label.career] |
| dailyPlan | [label.dailyPlan] |
| dailyTracker | [label.dailyTracker] |
| date | [label.date] |
| description | [label.description] |
| edition | [label.edition] |
| expenses | [label.expenses] |
| finance | [label.finance] |
| freeReflection | [label.freeReflection] |
| goals | [label.goals] |
| gratefulFor | [label.gratefulFor] |
| gratitude | [label.gratitude] |
| habitTracker | [label.habitTracker] |
| health | [label.health] |
| healthWellness | [label.healthWellness] |
| hours | [label.hours] |
| income | [label.income] |
| intentions | [label.intentions] |
| meals | [label.meals] |
| moodEnergy | [label.moodEnergy] |
| notes | [label.notes] |
| personal | [label.personal] |
| quality | [label.quality] |
| reflectAppreciate | [label.reflectAppreciate] |
| savings | [label.savings] |
| schedule | [label.schedule] |
| sleep | [label.sleep] |
| smallWin | [label.smallWin] |
| thisYearIWill | [label.thisYearIWill] |
| todo | [label.todo] |
| top3 | [label.top3] |
| topPriorities | [label.topPriorities] |
| transactions | [label.transactions] |
| wake | [label.wake] |
| water | [label.water] |
| waterIntake | [label.waterIntake] |
| watermark | [label.watermark] |
| weekNotes | [label.weekNotes] |
| weekSpread | [label.weekSpread] |
| weeklyPlan | [label.weeklyPlan] |
| yearOverview | [label.yearOverview] |
Ключі шаблонів сторінок
Перша частина назви файлу. Помилка в ключі означає, що файл імпортується, але ніколи не відрендериться.
coveryear-overviewmonth-calendarweek-one-pageday-1-upday-2-upday-3-upday-1-plus-2day-2-plus-2day-1-plus-noteshabit-trackerhealth-trackernotes-linedgoalsbudgetgratitude