PlanMe · Designers
Proces krok po kroku
Dziesięć kroków od pustego artboardu do przekazanego pakietu: ustawienie dokumentu, tokeny, kartki dzienne, kolor, czcionki, eksport, nazwa pliku i kontroler. Rób je po kolei — każdy zakłada poprzedni.
Krok 1. Ustaw dokument
Rysuj w dokładnych proporcjach papieru, jeden artboard na plik. Płótno ustaw w milimetrach, a viewBox musi zgadzać się z tymi samymi liczbami.
- 1Utwórz dokument z jednym artboardem w potrzebnym rozmiarze (tabela niżej).
- 2Ustaw jednostki dokumentu na milimetry.
- 3Upewnij się, że artboard jest dokładnie jeden. Drugi psuje import.
- 4Trzymaj spad wewnątrz płótna: strona jest przycinana dokładnie do tego prostokąta.
| Format | Rozmiar (mm) | 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 i A5 mają te same proporcje (1:√2), więc plik A4 jest automatycznie używany także dla A5. Własnego rysunku wymaga tylko Letter — dwa pliki na szablon, nie trzy.
Krok 2. Narysuj układ
Rysuj jak gotową stronę na konkretny miesiąc: prawdziwa siatka, prawdziwe nagłówki, prawdziwe linie. Dopiero sam tekst zamieni się w token w następnym kroku.
Dla siatki miesiąca narysuj 42 obiekty tekstowe w sześciu rzędach po siedem. Wyrównanie do właściwego dnia tygodnia i puste komórki na początku miesiąca PlanMe robi sam.
- 1Połóż tło, ramki, linie i dekoracje.
- 2Utwórz osobny obiekt tekstowy dla każdego miejsca, gdzie pojawi się zmienny tekst.
- 3Nadaj każdemu obiektowi tekstowemu docelowy stopień, grubość i wyrównanie.
- 4Sprawdź, czy najdłuższy podpis z manifestu wciąż się mieści.
Krok 3. Wstaw tokeny
Token ma postać [family.key] i trafia do treści tekstu albo do wartości dowolnego atrybutu. Podczas renderowania każdy zostaje zastąpiony realną wartością.
- 1Zamień zmienny tekst na jego token (odnośnik niżej na tej stronie).
- 2Wpisz token za jednym razem; nie edytuj go w środku.
- 3Zaznacz cały obiekt tekstowy i ostyluj go w całości, nigdy fragmentu.
- 4Nigdy nie zamieniaj tekstu na krzywe: PlanMe musi w niego podstawiać.
<rect fill="[color.primary]"/>
<text style="fill:[color.text];font-family:[font.heading]">
[month.name] [year]
</text>Nieznany token zostaje zastąpiony niczym — po cichu. Literówka typu [colour.primary] po prostu kasuje tekst. Dlatego krok 9 jest ważny.
Krok 4. Kartki dzienne — jedyna pułapka
Tydzień mieści się na całkowitej liczbie kartek dzięki temu, że weekend dostaje połowę wysokości zwykłego dnia. Stąd pięć szablonów dziennych.
Rzecz najważniejsza: kartka numeruje swoje dni OD SIEBIE, a nie od początku tygodnia. [sheet.date.0] to dzień, od którego zaczyna się właśnie ta kartka. Dlatego jeden rysunek day-2-up obsługuje i pon+wt, i śr+czw.
- 1Na kartkach dziennych używaj [sheet.*] — nigdy [week.day.N].
- 2Numeruj sloty od zera, z góry na dół.
- 3W day-1-plus-2 i day-2-plus-2 ostatnie dwa dni to weekend; daj im mniej więcej połowę wysokości pozostałych.
- 4Możesz narysować więcej slotów niż trzeba: nadmiarowe same się wygaszą.
| Szablon | Dni na kartce | Kartek na tydzień |
|---|---|---|
| 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] na kartce dziennej pokaże właściwą datę tylko na pierwszej kartce tygodnia, a dalej cudze liczby. To najczęstszy błąd w tym systemie.
Krok 5. Kolor
Dwa działające podejścia — wybierz zależnie od pakietu.
- 1Najprościej: skopiuj wartości hex palety pakietu z manifestu (stylePacks[].palette) i rysuj bezpośrednio nimi. Dla pakietu mono to prawie zawsze właściwy wybór — to tylko czerń, szarość i biel.
- 2Jeśli jeden rysunek ma obsłużyć kilka pakietów: po eksporcie otwórz .svg w edytorze tekstu i zamień każdy hex na odpowiedni [color.*]. Tokena nie wpiszesz do próbnika kolorów w Illustratorze.
Na stronach wewnętrznych unikaj jasnych szarości cieńszych niż 0,5 pt — domowa drukarka laserowa po prostu ich nie odbije.
Krok 6. Czcionki
Stosy systemowe działają bez żadnych zabiegów. Jeśli pakiet używa własnego kroju, umieść plik .woff2 w folderze fonts/ i opisz go w pack.json.
- 1Umieść czcionkę w fonts/ obok swoich plików SVG.
- 2Dodaj ją do tablicy fonts w pack.json.
- 3W samym SVG odwołaj się do niej zwykłym font-family albo przez [font.heading].
- 4Sprawdź, czy licencja pozwala na osadzanie w webie i w PDF.
{
"slug": "mono-serif",
"name": "Serif",
"fonts": [
{ "family": "MyDisplay", "weight": 700, "file": "MyDisplay.woff2" }
]
}Krok 7. Eksport z Illustratora
Ustawienia eksportu znaczą więcej, niż się wydaje: połowa problemów z grafiką zaczyna się właśnie tutaj.
- 1File → Export → Export As… → SVG.
- 2Styling: Presentation Attributes. NIE Internal CSS, bo kolory przestaną się podmieniać.
- 3Font: SVG (nigdy Convert to outlines).
- 4Images: Embed.
- 5Object IDs: Layer Names. Decimal: 2.
- 6Minify wyłączone. Responsive wyłączone.
Internal CSS poznasz po klasach w stylu .st0 w pliku. Kontroler z kroku 9 wyłapuje to natychmiast.
Krok 8. Nazwij plik
Nazwa pliku to adres, nie opis. Po niej PlanMe rozpoznaje, którą stronę i w jakim formacie narysowałeś.
- 1Wzór to <klucz-szablonu>.<format>.svg — na przykład month-calendar.A4.svg.
- 2Klucz weź z listy na dole tej strony, znak po znaku.
- 3Format to dokładnie A4, A5 albo Letter, z wielkiej litery.
Plik z literówką w kluczu zaimportuje się po cichu i nigdy nie wyrenderuje. To znana ostra krawędź — od tego jest kontroler.
Krok 9. Sprawdź przed wysłaniem
Kontroler znajduje wszystko, co system inaczej przełknąłby bez słowa: nieznane tokeny, Internal CSS, tekst na krzywych, tokeny rozbite na kilka tspanów, źle proporcjonowany artboard.
- 1Umieść pliki w storage/assets/<slug>/.
- 2Uruchom kontroler (polecenie poniżej).
- 3Popraw wszystko, co zgłosi jako błąd. Ostrzeżenia zostawiamy Tobie.
- 4Przyślij jeden gotowy plik na początku, a nie dwadzieścia na końcu.
npm run assets:checkKrok 10. Przekaż pakiet
Jeden folder na pakiet. pack.json jest potrzebny tylko wtedy, gdy pakiet ma własne czcionki — w przeciwnym razie dodamy go sami.
<pack-slug>/
pack.json
cover.A4.svg
cover.Letter.svg
month-calendar.A4.svg
...
fonts/
MyDisplay.woff2Slug folderu musi dokładnie odpowiadać slugowi pakietu z sekcji pakietów stylów.
Odnośnik tokenów
Trzy zasady warte poznania na start: tokeny nie mogą być zagnieżdżane; token nie może zawierać nawiasów; podstawione wartości są escapowane dla XML, więc stosy czcionek wracają z ' zamiast apostrofów — to poprawne i renderuje się dobrze.
| Token | Co podstawia |
|---|---|
| [color.primary] … [color.line] | Paleta pakietu: primary, accent, background, surface, text, muted, line. |
| [font.heading] / [font.body] | Stosy czcionek pakietu — nagłówkowa i podstawowa. |
| [themeName] / [motif] | Nazwa pakietu i jego krótki motyw dekoracyjny. |
| [title] / [subtitle] / [heading] | Tytuł planera, podtytuł i nagłówek strony z ustawień użytkownika. |
| [year] | Rok planera. |
| [label.*] | Statyczne podpisy, przetłumaczone na język planera. Pełna lista poniżej. |
| [month.name] / [month.short] | Nazwa miesiąca strony, pełna i skrócona. |
| [month.year] | Rok, do którego należy miesiąc — zakres może obejmować dwa lata. |
| [month.days] | Liczba dni w miesiącu strony. |
| [weekday.long.N] / [weekday.short.N] | Nagłówki dni tygodnia 0–6, obrócone do początku tygodnia użytkownika. |
| [grid.0] … [grid.41] | Siatka miesiąca, sześć rzędów po siedem. Komórki przed 1. i po ostatnim dniu są puste. |
| [monthday.1] … [monthday.31] | Numer dnia, jeśli istnieje w tym miesiącu, inaczej pusto: rząd 31 slotów sam się skraca w lutym. |
| [day.1] … [day.31] | Dosłowne cyfry 1–31. NIE kalendarzowe — tylko stałe nagłówki kolumn. |
| [week.day.N] / [week.date.N] / [week.iso.N] | Dzień N (0–6) tygodnia strony: numer, pełna data, data ISO. |
| [week.range] / [week.number] / [week.month] | Nagłówki tygodnia: zakres, numer ISO, miesiąc pierwszego dnia. |
| [sheet.date.N] / [sheet.day.N] / [sheet.iso.N] | Dzień N TEJ kartki — numerowany od kartki, nie od tygodnia. Sloty ponad pojemność są puste. |
| [sheet.weekday.long.N] / [sheet.weekday.short.N] | Nazwa dnia tygodnia dla dnia N tej kartki. |
| [sheet.range] / [sheet.count] | Zakres dat kartki i liczba dni na niej. |
| [date] / [date.day] / [date.weekday] / [date.iso] | Pierwszy dzień kartki: pełna data, numer, dzień tygodnia, ISO. |
| [config.<key>] | Dowolna wartość z konfiguracji strony; pusto, gdy jej nie ma. |
Częste błędy
- Tekst zamieniony na krzywe. PlanMe nie ma w co podstawiać — strona na zawsze zostaje z Twoim tekstem zastępczym.
- Token rozbity na kilka tspanów. Zdarza się przy edycji tekstu w środku albo stylowaniu części wiersza. [month.name] staje się [mon + th.name] i nigdy nie zadziała.
- Eksport z Internal CSS. Kolory przestają reagować na pakiet.
- [week.day.N] na kartce dziennej zamiast [sheet.*]. Daty zgadzają się tylko na pierwszej kartce tygodnia.
- Literówka w tokenie. Wartość znika bez żadnego ostrzeżenia.
- Dwa artboardy w jednym pliku. Importuje się tylko pierwszy.
- Zaszyty na sztywno rok albo nazwa miesiąca. Plik działa dokładnie przez jeden rok.
Wszystkie tokeny [label.*]
To statyczne podpisy, które PlanMe tłumaczy za Ciebie. Pisz [label.notes], a nie „Notatki” — inaczej strona zostanie po angielsku w ukraińskim planerze.
| Klucz | Token |
|---|---|
| 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] |
Klucze szablonów stron
Pierwsza część nazwy pliku. Błędny klucz zaimportuje się po cichu i nigdy się nie wyrenderuje.
coveryear-overviewmonth-calendarweek-one-pageday-1-upday-2-upday-3-upday-1-plus-2day-2-plus-2day-1-plus-noteshabit-trackerhealth-trackernotes-linedgoalsbudgetgratitude