@jjlmoya/utils-tabletop 1.26.0 → 1.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/category/index.ts +2 -0
- package/src/entries.ts +2 -0
- package/src/index.ts +1 -0
- package/src/tests/locale_completeness.test.ts +1 -1
- package/src/tests/tool_validation.test.ts +1 -1
- package/src/tool/token-stamp-studio/bibliography.astro +16 -0
- package/src/tool/token-stamp-studio/bibliography.ts +12 -0
- package/src/tool/token-stamp-studio/component.astro +91 -0
- package/src/tool/token-stamp-studio/controller.ts +179 -0
- package/src/tool/token-stamp-studio/dom-views.ts +266 -0
- package/src/tool/token-stamp-studio/entry.ts +27 -0
- package/src/tool/token-stamp-studio/evaluator.ts +6 -0
- package/src/tool/token-stamp-studio/i18n/de.ts +132 -0
- package/src/tool/token-stamp-studio/i18n/en.ts +132 -0
- package/src/tool/token-stamp-studio/i18n/es.ts +132 -0
- package/src/tool/token-stamp-studio/i18n/fr.ts +132 -0
- package/src/tool/token-stamp-studio/i18n/id.ts +132 -0
- package/src/tool/token-stamp-studio/i18n/it.ts +132 -0
- package/src/tool/token-stamp-studio/i18n/ja.ts +132 -0
- package/src/tool/token-stamp-studio/i18n/ko.ts +132 -0
- package/src/tool/token-stamp-studio/i18n/nl.ts +132 -0
- package/src/tool/token-stamp-studio/i18n/pl.ts +132 -0
- package/src/tool/token-stamp-studio/i18n/pt.ts +132 -0
- package/src/tool/token-stamp-studio/i18n/ru.ts +132 -0
- package/src/tool/token-stamp-studio/i18n/sv.ts +132 -0
- package/src/tool/token-stamp-studio/i18n/tr.ts +132 -0
- package/src/tool/token-stamp-studio/i18n/zh.ts +132 -0
- package/src/tool/token-stamp-studio/index.ts +11 -0
- package/src/tool/token-stamp-studio/logic.test.ts +36 -0
- package/src/tool/token-stamp-studio/logic.ts +127 -0
- package/src/tool/token-stamp-studio/seo.astro +16 -0
- package/src/tool/token-stamp-studio/storage.ts +69 -0
- package/src/tool/token-stamp-studio/store.ts +139 -0
- package/src/tool/token-stamp-studio/token-stamp-studio.css +646 -0
- package/src/tool/token-stamp-studio/types.ts +65 -0
- package/src/tool/token-stamp-studio/ui.ts +50 -0
- package/src/tool/token-stamp-studio/workspace-media.ts +36 -0
- package/src/tool/token-stamp-studio/workspace.ts +83 -0
- package/src/tools.ts +2 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
3
|
+
import type { TokenStampLocaleContent, TokenStampUI } from '../entry';
|
|
4
|
+
|
|
5
|
+
const ui: TokenStampUI = {
|
|
6
|
+
frameLegend: 'Pilih bingkai',
|
|
7
|
+
frameHint: 'Pilih siluet yang menunjukkan siapa karakter ini sebelum orang lain membaca namanya.',
|
|
8
|
+
randomFrame: 'Bingkai acak',
|
|
9
|
+
surfaceLegend: 'Warnai token',
|
|
10
|
+
backgroundLabel: 'Latar belakang',
|
|
11
|
+
borderLabel: 'Bingkai',
|
|
12
|
+
textLabel: 'Teks',
|
|
13
|
+
overlayLabel: 'Warna lapisan',
|
|
14
|
+
randomColors: 'Warna acak',
|
|
15
|
+
borderWidthLabel: 'Ketebalan bingkai',
|
|
16
|
+
opacityLabel: 'Opasitas bingkai',
|
|
17
|
+
overlayOpacityLabel: 'Opasitas potret',
|
|
18
|
+
stageLabel: 'Arena pembuat token',
|
|
19
|
+
chooseImage: 'Pilih potret',
|
|
20
|
+
clearImage: 'Hapus potret',
|
|
21
|
+
positionHint: 'Geser potret atau label langsung di atas token.',
|
|
22
|
+
markerName: 'Nama penanda',
|
|
23
|
+
markerNamePlaceholder: 'Beri nama penanda ini',
|
|
24
|
+
textLegend: 'Tambah detail yang mudah dibaca',
|
|
25
|
+
textHint: 'Gunakan label singkat seperti nama, level, peran, atau kondisi. Geser label ke posisi yang pas.',
|
|
26
|
+
textPlaceholder: 'Nama karakter atau peran',
|
|
27
|
+
addText: 'Tambah label',
|
|
28
|
+
removeText: 'Hapus label',
|
|
29
|
+
textSizeLabel: 'Ukuran huruf',
|
|
30
|
+
alignmentLabel: 'Rataan label',
|
|
31
|
+
alignLeft: 'Rata kiri',
|
|
32
|
+
alignCenter: 'Rata tengah',
|
|
33
|
+
alignRight: 'Rata kanan',
|
|
34
|
+
imageLegend: 'Atur potret',
|
|
35
|
+
imageZoomLabel: 'Zoom potret',
|
|
36
|
+
scaleLabel: 'Skala ekspor',
|
|
37
|
+
savedMarkers: 'Penanda tersimpan',
|
|
38
|
+
noSavedMarkers: 'Penanda tersimpan akan muncul di sini untuk dibuka kembali dan diedit kapan saja.',
|
|
39
|
+
reuseMarker: 'Pilih penanda untuk membukanya kembali.',
|
|
40
|
+
deleteMarker: 'Hapus penanda',
|
|
41
|
+
newMarker: 'Penanda baru',
|
|
42
|
+
download: 'Unduh PNG',
|
|
43
|
+
copy: 'Salin PNG',
|
|
44
|
+
downloadBatch: 'Unduh masal',
|
|
45
|
+
batchLabel: 'Ekspor masal lanjutan',
|
|
46
|
+
batchHint: 'Opsional: ekspor beberapa potret sekaligus dengan bingkai dan warna saat ini.',
|
|
47
|
+
chooseBatch: 'Pilih potret masal',
|
|
48
|
+
batchReady: '{count} potret siap dibuat.',
|
|
49
|
+
noImage: 'Belum ada potret yang dimuat',
|
|
50
|
+
noText: 'Belum ada label. Tambahkan detail yang dibutuhkan kelompok Anda.',
|
|
51
|
+
tokenDetails: 'Kontrol token karakter',
|
|
52
|
+
exportHint: 'Gambar PNG transparan di luar siluet pilihan Anda, siap digunakan di VTT atau cetakan.',
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const faq = [
|
|
56
|
+
{
|
|
57
|
+
question: 'Kriteria potret yang bagus untuk token karakter?',
|
|
58
|
+
answer: 'Pilih gambar dengan wajah yang jelas dan kontras yang cukup terhadap bingkai. Potongan kepala dan bahu biasanya tetap mudah dibaca saat token berukuran kecil di meja virtual.',
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
question: 'Bagaimana cara mengatur posisi potret di dalam bingkai?',
|
|
62
|
+
answer: 'Masukkan gambar lalu geser langsung di atas token. Gunakan zoom potret untuk memperbesar wajah tanpa mengubah bingkai atau label.',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
question: 'Bisakah saya menambahkan nama dan level karakter?',
|
|
66
|
+
answer: 'Bisa. Tambahkan beberapa label singkat, atur ukuran serta ratapannya, lalu geser ke posisi yang mudah dibaca.',
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
question: 'Apakah PNG hasil ekspor mempertahankan latar belakang transparan?',
|
|
70
|
+
answer: 'Ya. Latar belakang di luar siluet pilihan tetap transparan sehingga mudah diletakkan di atas peta permainan.',
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
question: 'Bisakah saya membuat token untuk seluruh anggota tim sekaligus?',
|
|
74
|
+
answer: 'Bisa. Gunakan fitur ekspor masal untuk memproses beberapa potret sekaligus dengan gaya bingkai yang sama.',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
question: 'Di mana penanda tersimpan saya disimpan?',
|
|
78
|
+
answer: 'Penanda disimpan secara lokal di memori peramban perangkat Anda dan tidak diunggah ke server luar.',
|
|
79
|
+
},
|
|
80
|
+
];
|
|
81
|
+
|
|
82
|
+
const howTo = [
|
|
83
|
+
{ name: 'Pilih siluet karakter', text: 'Mulai dengan bingkai yang sesuai: lingkaran untuk pahlawan, segi enam untuk taktis, atau bintang untuk bos.' },
|
|
84
|
+
{ name: 'Masukkan dan atur potret', text: 'Pilih gambar lalu posisikan wajah agar pas di dalam bingkai dengan mengatur zoom.' },
|
|
85
|
+
{ name: 'Tambahkan label penting', text: 'Beri nama singkat, peran, atau kondisi karakter agar mudah dibaca di meja permainan.' },
|
|
86
|
+
{ name: 'Simpan dan ekspor ke PNG', text: 'Unduh file PNG transparan yang siap dipakai di aplikasi VTT atau dicetak.' },
|
|
87
|
+
];
|
|
88
|
+
|
|
89
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
90
|
+
'@context': 'https://schema.org',
|
|
91
|
+
'@type': 'FAQPage',
|
|
92
|
+
mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })),
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
96
|
+
'@context': 'https://schema.org',
|
|
97
|
+
'@type': 'SoftwareApplication',
|
|
98
|
+
name: 'Token Stamp Studio',
|
|
99
|
+
operatingSystem: 'All',
|
|
100
|
+
applicationCategory: 'DesignApplication',
|
|
101
|
+
description: 'Buat token karakter RPG meja yang mudah dibaca dengan bingkai khusus, label, latar transparan, dan ekspor masal PNG.',
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const howToSchema: WithContext<HowTo> = {
|
|
105
|
+
'@context': 'https://schema.org',
|
|
106
|
+
'@type': 'HowTo',
|
|
107
|
+
name: 'Cara membuat token karakter RPG meja',
|
|
108
|
+
step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })),
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
export const content: TokenStampLocaleContent = {
|
|
112
|
+
slug: 'pembuat-token-karakter-rpg-meja',
|
|
113
|
+
title: 'Pembuat Token Karakter RPG Meja Online',
|
|
114
|
+
description: 'Buat token karakter RPG meja yang mudah dibaca dengan bingkai khusus, label, latar transparan, dan ekspor masal PNG.',
|
|
115
|
+
ui,
|
|
116
|
+
seo: [
|
|
117
|
+
{ type: 'title', text: 'Buat token karakter yang jelas dan mudah dibaca di peta permainan', level: 2 },
|
|
118
|
+
{ type: 'paragraph', html: 'Token adalah alat komunikasi visual yang sangat penting di meja permainan RPG. Siluetnya memberi tahu seluruh kelompok apakah mereka sedang melihat pahlawan, monster, efek sihir, atau lokasi penting sebelum ada yang memperbesar layar. Mulailah dengan memilih bingkai yang sesuai dengan karakter, lalu pastikan potret dan label tetap mudah dibaca pada skala ukuran yang digunakan meja virtual Anda.' },
|
|
119
|
+
{ type: 'title', text: 'Pilih bingkai yang tepat sesuai peran dan jenis karakter', level: 2 },
|
|
120
|
+
{ type: 'list', items: ['<strong>Lingkaran atau cincin:</strong> pilihan standar yang andal untuk karakter pemain dan sekutu utama.', '<strong>Segi enam atau segi delapan:</strong> mudah dibedakan dalam pertempuran taktis yang melibatkan banyak unit.', '<strong>Bintang:</strong> sangat cocok untuk musuh utama, bos, atau karakter penting yang membutuhkan perhatian langsung.', '<strong>Awan:</strong> bentuk yang lebih lembut untuk roh, familiars, makhluk gaib, atau entitas mistis.'] },
|
|
121
|
+
{ type: 'tip', title: 'Desain untuk tampilan ukuran terkecil saat dimainkan', html: 'Perkecil peta permainan sampai token berukuran hanya beberapa puluh piksel. Jika wajah, bingkai, dan label masih dapat dibedakan dengan jelas, penanda Anda akan berfungsi dengan sangat baik selama pertempuran yang sibuk.' },
|
|
122
|
+
{ type: 'title', text: 'Gunakan label singkat dan berguna saat sesi permainan', level: 2 },
|
|
123
|
+
{ type: 'paragraph', html: 'Token pertempuran bukanlah pengganti lembar karakter lengkap. Cukup tambahkan satu atau dua fakta yang sering dibutuhkan kelompok: nama pendek, level, peran seperti penyembuh, atau kondisi seperti tertegun. Kalimat yang terlalu panjang hanya akan menjadi gangguan visual dan bersaing dengan gambar potret.' },
|
|
124
|
+
{ type: 'title', text: 'Siapkan token untuk seluruh kelompok tanpa kehilangan identitas', level: 2 },
|
|
125
|
+
{ type: 'paragraph', html: 'Fitur ekspor masal sangat berguna setelah sesi awal atau saat kelompok mendapatkan sekutu baru dalam kampanye. Pilih satu bingkai dan skema warna untuk seluruh kelompok, lalu biarkan setiap potret mempertahankan kepribadiannya. Bingkai yang konsisten membuat kelompok terasa menyatu sementara wajah setiap karakter tetap langsung dikenali.' },
|
|
126
|
+
{ type: 'tip', title: 'Penyimpanan otomatis langsung di perangkat Anda', html: 'Penyimpanan lokal menyimpan posisi pemotongan potret dan label pada perangkat ini. File PNG yang diekspor adalah salinan untuk dimainkan, sedangkan penanda yang tersimpan adalah versi yang dapat dibuka kembali saat karakter mengalami perkembangan.' },
|
|
127
|
+
],
|
|
128
|
+
faq,
|
|
129
|
+
bibliography,
|
|
130
|
+
howTo,
|
|
131
|
+
schemas: [faqSchema, appSchema, howToSchema] as unknown as Record<string, unknown>[],
|
|
132
|
+
};
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
3
|
+
import type { TokenStampLocaleContent, TokenStampUI } from '../entry';
|
|
4
|
+
|
|
5
|
+
const ui: TokenStampUI = {
|
|
6
|
+
frameLegend: 'Scegli una cornice',
|
|
7
|
+
frameHint: 'Scegli la silhouette che indica al tavolo chi è questo personaggio prima ancora di leggerne il nome.',
|
|
8
|
+
randomFrame: 'Cornice casuale',
|
|
9
|
+
surfaceLegend: 'Dipingi il token',
|
|
10
|
+
backgroundLabel: 'Sfondo',
|
|
11
|
+
borderLabel: 'Bordo',
|
|
12
|
+
textLabel: 'Testo',
|
|
13
|
+
overlayLabel: 'Tinta',
|
|
14
|
+
randomColors: 'Colori casuali',
|
|
15
|
+
borderWidthLabel: 'Spessore bordo',
|
|
16
|
+
opacityLabel: 'Opacità bordo',
|
|
17
|
+
overlayOpacityLabel: 'Tinta ritratto',
|
|
18
|
+
stageLabel: 'Fucina token in tempo reale',
|
|
19
|
+
chooseImage: 'Scegli ritratto',
|
|
20
|
+
clearImage: 'Rimuovi ritratto',
|
|
21
|
+
positionHint: 'Trascina il ritratto o le etichette direttamente sul token.',
|
|
22
|
+
markerName: 'Nome segnalino',
|
|
23
|
+
markerNamePlaceholder: 'Assegna un nome a questo segnalino',
|
|
24
|
+
textLegend: 'Aggiungi dettagli leggibili al tavolo',
|
|
25
|
+
textHint: 'Usa etichette brevi come nome, livello, ruolo o stato. Trascina ciascuna sul token.',
|
|
26
|
+
textPlaceholder: 'Nome personaggio o ruolo',
|
|
27
|
+
addText: 'Aggiungi etichetta',
|
|
28
|
+
removeText: 'Rimuovi etichetta',
|
|
29
|
+
textSizeLabel: 'Dimensione testo',
|
|
30
|
+
alignmentLabel: 'Allineamento testo',
|
|
31
|
+
alignLeft: 'Allinea a sinistra',
|
|
32
|
+
alignCenter: 'Centra',
|
|
33
|
+
alignRight: 'Allinea a destra',
|
|
34
|
+
imageLegend: 'Regola il ritratto',
|
|
35
|
+
imageZoomLabel: 'Zoom ritratto',
|
|
36
|
+
scaleLabel: 'Esportazione scala',
|
|
37
|
+
savedMarkers: 'Segnalini salvati',
|
|
38
|
+
noSavedMarkers: 'I segnalini salvati appariranno qui per essere riaperti, modificati e riutilizzati.',
|
|
39
|
+
reuseMarker: 'Seleziona un segnalino per riaprirlo nella fucina.',
|
|
40
|
+
deleteMarker: 'Elimina segnalino',
|
|
41
|
+
newMarker: 'Nuovo segnalino',
|
|
42
|
+
download: 'Scarica PNG',
|
|
43
|
+
copy: 'Copia PNG',
|
|
44
|
+
downloadBatch: 'Scarica lotto',
|
|
45
|
+
batchLabel: 'Esportazione avanzata in lotto',
|
|
46
|
+
batchHint: 'Opzionale: esporta più ritratti con la cornice e i colori attuali.',
|
|
47
|
+
chooseBatch: 'Scegli ritratti',
|
|
48
|
+
batchReady: '{count} ritratti pronti per la fucina.',
|
|
49
|
+
noImage: 'Nessun ritratto caricato',
|
|
50
|
+
noText: 'Nessuna etichetta. Aggiungi i dettagli utili per il tuo gruppo.',
|
|
51
|
+
tokenDetails: 'Controlli del token personaggio',
|
|
52
|
+
exportHint: 'Il PNG è trasparente all\'esterno della silhouette scelta, pronto per VTT o stampa.',
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const faq = [
|
|
56
|
+
{
|
|
57
|
+
question: 'Cosa rende efficace il ritratto di un token personaggio?',
|
|
58
|
+
answer: 'Scegli un\'immagine con un viso ben visibile e un buon contrasto rispetto alla cornice. Un taglio a mezzo busto rimane perfettamente leggibile sul tavolo virtuale.',
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
question: 'Come posiziono al meglio il ritratto nella cornice?',
|
|
62
|
+
answer: 'Carica l\'immagine e trascinala direttamente sul token. Usa lo zoom ritratto per ingrandire il volto senza alterare la forma del bordo.',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
question: 'Posso aggiungere nome e livello del personaggio?',
|
|
66
|
+
answer: 'Sì. Aggiungi etichette brevi, regolane dimensione e allineamento, e trascinale in un punto ben visibile sul token.',
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
question: 'Il file PNG mantiene la trasparenza all\'esterno del token?',
|
|
70
|
+
answer: 'Sì. L\'immagine esportata conserva la trasparenza al di fuori della silhouette selezionata, rendendola perfetta da sovrapporre alle mappe.',
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
question: 'Posso creare i token per l\'intero gruppo in una volta sola?',
|
|
74
|
+
answer: 'Sì. Usa l\'esportazione in lotto per caricare più ritratti e scaricare un file PNG trasparente per ciascuno mantenedo le impostazioni di stile.',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
question: 'Dove vengono salvati i miei segnalini?',
|
|
78
|
+
answer: 'I segnalini salvati rimangono nella memoria locale del tuo browser. Nessuna immagine viene caricata su server esterni.',
|
|
79
|
+
},
|
|
80
|
+
];
|
|
81
|
+
|
|
82
|
+
const howTo = [
|
|
83
|
+
{ name: 'Scegli la silhouette del personaggio', text: 'Seleziona la cornice adatta al ruolo: circolare per un eroe, esagonale per scontro tattico o stella per un boss.' },
|
|
84
|
+
{ name: 'Inquadra il ritratto', text: 'Carica un\'immagine e trascinala fino a centrare il volto, regolando lo zoom secondo necessità.' },
|
|
85
|
+
{ name: 'Aggiungi le informazioni chiave', text: 'Inserisci un nome breve, livello o stato senza coprire i dettagli principali dell\'illustrazione.' },
|
|
86
|
+
{ name: 'Esporta in formato PNG', text: 'Scarica il PNG trasparente pronto per la tua piattaforma di gioco virtuale o scheda stampata.' },
|
|
87
|
+
];
|
|
88
|
+
|
|
89
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
90
|
+
'@context': 'https://schema.org',
|
|
91
|
+
'@type': 'FAQPage',
|
|
92
|
+
mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })),
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
96
|
+
'@context': 'https://schema.org',
|
|
97
|
+
'@type': 'SoftwareApplication',
|
|
98
|
+
name: 'Token Stamp Studio',
|
|
99
|
+
operatingSystem: 'All',
|
|
100
|
+
applicationCategory: 'DesignApplication',
|
|
101
|
+
description: 'Crea token personaggio leggibili per GDR da tavolo con cornici personalizzate, etichette, trasparenza ed esportazione PNG in lotto.',
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const howToSchema: WithContext<HowTo> = {
|
|
105
|
+
'@context': 'https://schema.org',
|
|
106
|
+
'@type': 'HowTo',
|
|
107
|
+
name: 'Come creare un token personaggio per GDR da tavolo',
|
|
108
|
+
step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })),
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
export const content: TokenStampLocaleContent = {
|
|
112
|
+
slug: 'creatore-token-personaggi-gdr-tavolo',
|
|
113
|
+
title: 'Creatore di Token Personaggio per GDR da Tavolo',
|
|
114
|
+
description: 'Crea token personaggio leggibili per GDR da tavolo con cornici personalizzate, etichette, trasparenza ed esportazione PNG in lotto.',
|
|
115
|
+
ui,
|
|
116
|
+
seo: [
|
|
117
|
+
{ type: 'title', text: 'Crea token personaggio chiari e leggibili sulla mappa', level: 2 },
|
|
118
|
+
{ type: 'paragraph', html: 'Un token è un elemento di comunicazione al tavolo da gioco. La sua silhouette fa capire subito al gruppo se si tratta di un eroe, un mostro o un alleato. Scegli la cornice idonea e mantieni volto e testi ben visibili.' },
|
|
119
|
+
{ type: 'title', text: 'Scegli la cornice giusta per il personaggio', level: 2 },
|
|
120
|
+
{ type: 'list', items: ['<strong>Cerchio:</strong> ideale per personaggi giocanti e alleati.', '<strong>Esagono o ottagono:</strong> ottimo nei combattimenti tattici con molte unità.', '<strong>Stella:</strong> perfetto per boss, campioni o bersagli primari.', '<strong>Nuvola:</strong> forma morbida per spiriti, famigli e creature fatate.'] },
|
|
121
|
+
{ type: 'tip', title: 'Progetta per la dimensione minima di gioco', html: 'Riduci lo zoom della mappa finché il token non diventa piccolo. Se volto e testo rimangono distinguibili, il token funzionerà benissimo durante le sessioni.' },
|
|
122
|
+
{ type: 'title', text: 'Etichette brevi ed efficaci durante la partita', level: 2 },
|
|
123
|
+
{ type: 'paragraph', html: 'Il token non deve sostituire la scheda del personaggio. Aggiungi solo i dati consultati spesso: nome breve, livello o stato attuale.' },
|
|
124
|
+
{ type: 'title', text: 'Prepara l\'intero party senza perdere l\'identità dei singoli', level: 2 },
|
|
125
|
+
{ type: 'paragraph', html: 'L\'esportazione in lotto permette di uniformare lo stile del gruppo mantenendo distinti i volti di ciascun personaggio.' },
|
|
126
|
+
{ type: 'tip', title: 'Salvataggio automatico sul tuo dispositivo', html: 'Il segnalino attivo viene salvato nel browser così potrai riaprirlo e modificarlo quando il personaggio sale di livello.' },
|
|
127
|
+
],
|
|
128
|
+
faq,
|
|
129
|
+
bibliography,
|
|
130
|
+
howTo,
|
|
131
|
+
schemas: [faqSchema, appSchema, howToSchema] as unknown as Record<string, unknown>[],
|
|
132
|
+
};
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
3
|
+
import type { TokenStampLocaleContent, TokenStampUI } from '../entry';
|
|
4
|
+
|
|
5
|
+
const ui: TokenStampUI = {
|
|
6
|
+
frameLegend: 'フレームを選択',
|
|
7
|
+
frameHint: '名前を読む前にキャラクターの役割が伝わるシルエットを選びます。',
|
|
8
|
+
randomFrame: 'ランダムフレーム',
|
|
9
|
+
surfaceLegend: 'トリートメント設定',
|
|
10
|
+
backgroundLabel: '背景色',
|
|
11
|
+
borderLabel: 'フレーム色',
|
|
12
|
+
textLabel: '文字色',
|
|
13
|
+
overlayLabel: 'トーン',
|
|
14
|
+
randomColors: 'ランダムカラー',
|
|
15
|
+
borderWidthLabel: 'フレーム幅',
|
|
16
|
+
opacityLabel: 'フレーム不透明度',
|
|
17
|
+
overlayOpacityLabel: 'ポートレート不透明度',
|
|
18
|
+
stageLabel: 'ライブコマ作成スタジオ',
|
|
19
|
+
chooseImage: '画像を選択',
|
|
20
|
+
clearImage: '画像をクリア',
|
|
21
|
+
positionHint: 'コマ上で直接画像やラベルをドラッグして移動できます。',
|
|
22
|
+
markerName: 'マーカー名',
|
|
23
|
+
markerNamePlaceholder: 'マーカーの名前を入力',
|
|
24
|
+
textLegend: '卓で役立つテキストを追加',
|
|
25
|
+
textHint: '名前、レベル、役割、状態などの短いラベルを追加してコマ上に配置します。',
|
|
26
|
+
textPlaceholder: 'キャラクター名や役割',
|
|
27
|
+
addText: 'ラベルを追加',
|
|
28
|
+
removeText: 'ラベルを削除',
|
|
29
|
+
textSizeLabel: '文字サイズ',
|
|
30
|
+
alignmentLabel: 'テキスト揃え',
|
|
31
|
+
alignLeft: '左揃え',
|
|
32
|
+
alignCenter: '中央揃え',
|
|
33
|
+
alignRight: '右揃え',
|
|
34
|
+
imageLegend: 'ポートレートの調整',
|
|
35
|
+
imageZoomLabel: 'ズーム倍率',
|
|
36
|
+
scaleLabel: '出力スケール',
|
|
37
|
+
savedMarkers: '保存済みマーカー',
|
|
38
|
+
noSavedMarkers: '保存されたコマはここに表示され、後から再編集や再利用が可能です。',
|
|
39
|
+
reuseMarker: '再編集するコマを選択してください。',
|
|
40
|
+
deleteMarker: 'コマを削除',
|
|
41
|
+
newMarker: '新規コマ',
|
|
42
|
+
download: 'PNGをダウンロード',
|
|
43
|
+
copy: 'PNGをコピー',
|
|
44
|
+
downloadBatch: '一括ダウンロード',
|
|
45
|
+
batchLabel: '高度な一括エクスポート',
|
|
46
|
+
batchHint: '複数のポートレート画像に同じフレーム設定を適用して一括出力します。',
|
|
47
|
+
chooseBatch: '一括画像を選択',
|
|
48
|
+
batchReady: '{count} 枚の画像が準備完了。',
|
|
49
|
+
noImage: '画像が未読み込みです',
|
|
50
|
+
noText: 'ラベルはまだありません。必要な情報を追加してください。',
|
|
51
|
+
tokenDetails: 'キャラクターコマ操作パネル',
|
|
52
|
+
exportHint: 'フレームの外側は透明PNGとして出力され、ココフォリア等のココフォリアやVTT、印刷シートでそのまま使えます。',
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const faq = [
|
|
56
|
+
{
|
|
57
|
+
question: '視認性の高いキャラクターコマを作成するコツは?',
|
|
58
|
+
answer: '顔がはっきりと写っているイラストや、フレームとのコントラストが高い画像を選びます。胸から上の切り抜きにすると、オンラインセッション画面で縮小しても見やすくなります。',
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
question: 'フレーム内でイラストをうまく配置するには?',
|
|
62
|
+
answer: '画像を読み込んだ後、コマ上で直接ドラッグして位置を調整します。ズーム倍率を変更することで、フレーム枠を変えずに顔の位置を調整できます。',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
question: 'キャラクター名やレベルをコマに印字できますか?',
|
|
66
|
+
answer: 'はい。短いラベルを自由に追加し、サイズや配置を調整してコマ上の読みやすい位置にドラッグして配置できます。',
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
question: '出力されるPNG画像の背景は透過されますか?',
|
|
70
|
+
answer: 'はい。選択したフレームの外側は背景透過PNGとして保存されるため、マップの上にそのまま配置できます。',
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
question: 'パーティー全員のコマを一括で作成できますか?',
|
|
74
|
+
answer: 'はい。一括エクスポート機能を使用すると、同じフレーム設定を複数の画像に適用して一括で透明PNGを出力できます。',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
question: '作成したコマデータはどこに保存されますか?',
|
|
78
|
+
answer: 'お使いのブラウザのローカルストレージに保存されます。サーバーへ画像がアップロードされることはありません。',
|
|
79
|
+
},
|
|
80
|
+
];
|
|
81
|
+
|
|
82
|
+
const howTo = [
|
|
83
|
+
{ name: 'キャラに合ったフレームを選択', text: 'PC用には円形、エネミーや戦術戦闘用には六角形、ボスには星形など、キャラクターの性質に合わせた枠を選びます。' },
|
|
84
|
+
{ name: '画像を読み込んで位置を調整', text: 'イラストを選択またはドラッグ&ドロップし、顔が中央に来るように位置とズームを調整します。' },
|
|
85
|
+
{ name: '必要なテキストを追加', text: '名前や役割などの短い文字を追加し、イラストを邪魔しない位置に配置します。' },
|
|
86
|
+
{ name: '透過PNGとしてエクスポート', text: '完成したコマをPNGとしてダウンロードし、オンラインセッションツール(VTT)で使用します。' },
|
|
87
|
+
];
|
|
88
|
+
|
|
89
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
90
|
+
'@context': 'https://schema.org',
|
|
91
|
+
'@type': 'FAQPage',
|
|
92
|
+
mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })),
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
96
|
+
'@context': 'https://schema.org',
|
|
97
|
+
'@type': 'SoftwareApplication',
|
|
98
|
+
name: 'Token Stamp Studio',
|
|
99
|
+
operatingSystem: 'All',
|
|
100
|
+
applicationCategory: 'DesignApplication',
|
|
101
|
+
description: 'TRPGのオンラインセッションで使える見やすいキャラクターコマ(Token)を作成。透過PNG出力、一括作成対応。',
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const howToSchema: WithContext<HowTo> = {
|
|
105
|
+
'@context': 'https://schema.org',
|
|
106
|
+
'@type': 'HowTo',
|
|
107
|
+
name: 'TRPGキャラクターコマの作り方',
|
|
108
|
+
step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })),
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
export const content: TokenStampLocaleContent = {
|
|
112
|
+
slug: 'token-stamp-studio',
|
|
113
|
+
title: 'TRPG用キャラクターコマ作成ツール(透過PNG対応)',
|
|
114
|
+
description: 'TRPGのオンラインセッションで使える見やすいキャラクターコマ(Token)を作成。透過PNG出力、一括作成対応。',
|
|
115
|
+
ui,
|
|
116
|
+
seo: [
|
|
117
|
+
{ type: 'title', text: '卓上で一目で判別できるキャラクターコマを作成', level: 2 },
|
|
118
|
+
{ type: 'paragraph', html: 'オンラインセッションや卓上ゲームにおいて、コマのシルエットはキャラクターの種別や状態を瞬時に伝える大切な要素です。適切なフレームを選び、縮小表示しても視認性を損なわないコマを作成しましょう。' },
|
|
119
|
+
{ type: 'title', text: 'キャラクターの役割に合わせたフレーム選び', level: 2 },
|
|
120
|
+
{ type: 'list', items: ['<strong>円形・リング:</strong> プレイヤーキャラクターや味方NPCに最適な王道スタイル。', '<strong>六角形・八角形:</strong> 戦術的なマス目や多数のエネミーの判別に便利。', '<strong>星形:</strong> ボスキャラクターや強調したいユニットに最適。', '<strong>雲型:</strong> 召喚獣や精霊、ファミリアなどの特殊な存在に。'] },
|
|
121
|
+
{ type: 'tip', title: '実際のプレイ画面サイズを意識したデザイン', html: 'マップを縮小してコマが小さくなっても、顔の表情やテキストが潰れないか確認しながら作成するのがコツです。' },
|
|
122
|
+
{ type: 'title', text: 'プレイ中に役立つ短く簡潔なテキスト配置', level: 2 },
|
|
123
|
+
{ type: 'paragraph', html: 'コマ上に載せる情報は名前や簡単な状態(気絶、毒など)に絞ることで、イラストの見やすさを保ちつつ必要な情報を共有できます。' },
|
|
124
|
+
{ type: 'title', text: 'パーティー全体のコマを一括で作成', level: 2 },
|
|
125
|
+
{ type: 'paragraph', html: '一括作成機能を使えば、統一感のあるデザインでメンバー全員のコマを素早く作成できます。' },
|
|
126
|
+
{ type: 'tip', title: 'ローカル自動保存機能', html: '作成途中のコマ設定はブラウザに保存されるため、レベルアップ時などの再編集も簡単です。' },
|
|
127
|
+
],
|
|
128
|
+
faq,
|
|
129
|
+
bibliography,
|
|
130
|
+
howTo,
|
|
131
|
+
schemas: [faqSchema, appSchema, howToSchema] as unknown as Record<string, unknown>[],
|
|
132
|
+
};
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
3
|
+
import type { TokenStampLocaleContent, TokenStampUI } from '../entry';
|
|
4
|
+
|
|
5
|
+
const ui: TokenStampUI = {
|
|
6
|
+
frameLegend: '프레임 선택',
|
|
7
|
+
frameHint: '이름을 읽기 전에 캐릭터의 역할이 전달되는 실루엣을 선택하세요.',
|
|
8
|
+
randomFrame: '무작위 프레임',
|
|
9
|
+
surfaceLegend: '토큰 색상 설정',
|
|
10
|
+
backgroundLabel: '배경색',
|
|
11
|
+
borderLabel: '테두리색',
|
|
12
|
+
textLabel: '글자색',
|
|
13
|
+
overlayLabel: '톤 덮어씌우기',
|
|
14
|
+
randomColors: '무작위 색상',
|
|
15
|
+
borderWidthLabel: '테두리 두께',
|
|
16
|
+
opacityLabel: '테두리 투명도',
|
|
17
|
+
overlayOpacityLabel: '초상화 투명도',
|
|
18
|
+
stageLabel: '실시간 토큰 제작소',
|
|
19
|
+
chooseImage: '초상화 선택',
|
|
20
|
+
clearImage: '초상화 지우기',
|
|
21
|
+
positionHint: '토큰 위에서 직접 이미지나 라벨을 드래그하여 이동하세요.',
|
|
22
|
+
markerName: '마커 이름',
|
|
23
|
+
markerNamePlaceholder: '마커 이름 입력',
|
|
24
|
+
textLegend: '플레이용 상세 정보 추가',
|
|
25
|
+
textHint: '이름, 레벨, 역할, 상태 등 짧은 라벨을 추가하여 토큰 위에 배치하세요.',
|
|
26
|
+
textPlaceholder: '캐릭터 이름 또는 역할',
|
|
27
|
+
addText: '라벨 추가',
|
|
28
|
+
removeText: '라벨 삭제',
|
|
29
|
+
textSizeLabel: '글자 크기',
|
|
30
|
+
alignmentLabel: '텍스트 정렬',
|
|
31
|
+
alignLeft: '왼쪽 정렬',
|
|
32
|
+
alignCenter: '가운데 정렬',
|
|
33
|
+
alignRight: '오른쪽 정렬',
|
|
34
|
+
imageLegend: '초상화 조절',
|
|
35
|
+
imageZoomLabel: '초상화 확대',
|
|
36
|
+
scaleLabel: '내보내기 크기',
|
|
37
|
+
savedMarkers: '저장된 마커',
|
|
38
|
+
noSavedMarkers: '저장된 마커가 여기에 표시되며 언제든지 다시 열어 수정할 수 있습니다.',
|
|
39
|
+
reuseMarker: '수정할 마커를 선택하세요.',
|
|
40
|
+
deleteMarker: '마커 삭제',
|
|
41
|
+
newMarker: '새 마커',
|
|
42
|
+
download: 'PNG 다운로드',
|
|
43
|
+
copy: 'PNG 복사',
|
|
44
|
+
downloadBatch: '일괄 다운로드',
|
|
45
|
+
batchLabel: '고급 일괄 내보내기',
|
|
46
|
+
batchHint: '여러 초상화 이미지에 현재 프레임 설정을 적용하여 한 번에 내보냅니다.',
|
|
47
|
+
chooseBatch: '일괄 이미지 선택',
|
|
48
|
+
batchReady: '{count}개의 초상화 준비 완료.',
|
|
49
|
+
noImage: '불러온 초상화가 없습니다',
|
|
50
|
+
noText: '라벨이 없습니다. 필요한 정보를 추가하세요.',
|
|
51
|
+
tokenDetails: '캐릭터 토큰 제어판',
|
|
52
|
+
exportHint: '프레임 외곽은 투명 PNG로 저장되어 VTT(온라인 세션) 및 인쇄용으로 바로 사용 가능합니다.',
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const faq = [
|
|
56
|
+
{
|
|
57
|
+
question: '시인성이 좋은 캐릭터 토큰 초상화 조건은 무엇인가요?',
|
|
58
|
+
answer: '얼굴이 명확히 보이고 테두리와의 대비가 분명한 이미지를 선택하세요. 머리와 어깨 위주의 크롭이 온라인 세션 화면에서 축소되어도 잘 보입니다.',
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
question: '프레임 안에서 초상화 위치를 어떻게 맞추나요?',
|
|
62
|
+
answer: '이미지를 불러온 후 토큰 위에서 직접 드래그하여 맞춥니다. 초상화 확대 기능을 사용하면 프레임 형태 변경 없이 얼굴을 맞출 수 있습니다.',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
question: '캐릭터 이름이나 레벨을 토큰에 넣을 수 있나요?',
|
|
66
|
+
answer: '네. 짧은 라벨을 여러 개 추가하고 크기와 정렬을 조절한 후 보기 좋은 위치로 드래그하여 배치할 수 있습니다.',
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
question: '저장된 PNG의 배경은 투명하게 유지되나요?',
|
|
70
|
+
answer: '네. 선택한 실루엣 외곽은 배경이 투명한 PNG로 저장되어 지도 위에 자연스럽게 배치됩니다.',
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
question: '파티원 전체의 토큰을 한 번에 만들 수 있나요?',
|
|
74
|
+
answer: '네. 일괄 내보내기 기능을 활용하면 일관된 프레임 스타일을 여러 이미지에 적용하여 한 번에 다운로드할 수 있습니다.',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
question: '저장한 마커는 어디에 보관되나요?',
|
|
78
|
+
answer: '마커 데이터는 사용 중인 브라우저의 로컬 저장소에 보관됩니다. 외부 서버로 사진이 업로드되지 않습니다.',
|
|
79
|
+
},
|
|
80
|
+
];
|
|
81
|
+
|
|
82
|
+
const howTo = [
|
|
83
|
+
{ name: '캐릭터에 어울리는 프레임 선택', text: '플레이어 캐릭터는 원형, 전술 전투용은 육각형, 보스는 별 모양 등 캐릭터 성격에 맞는 형태를 선택합니다.' },
|
|
84
|
+
{ name: '초상화 등록 및 위치 조절', text: '이미지를 드롭하고 얼굴이 중앙에 오도록 드래그 및 확대율을 조절합니다.' },
|
|
85
|
+
{ name: '플레이에 필요한 라벨 추가', text: '이름이나 역할 등 짧은 텍스트를 추가하여 그림을 가리지 않는 위치에 배치합니다.' },
|
|
86
|
+
{ name: '투명 PNG로 내보내기', text: '완성된 토큰을 PNG로 저장하여 VTT 프로그램이나 인쇄용 시트에서 사용합니다.' },
|
|
87
|
+
];
|
|
88
|
+
|
|
89
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
90
|
+
'@context': 'https://schema.org',
|
|
91
|
+
'@type': 'FAQPage',
|
|
92
|
+
mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })),
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
96
|
+
'@context': 'https://schema.org',
|
|
97
|
+
'@type': 'SoftwareApplication',
|
|
98
|
+
name: 'Token Stamp Studio',
|
|
99
|
+
operatingSystem: 'All',
|
|
100
|
+
applicationCategory: 'DesignApplication',
|
|
101
|
+
description: 'TRPG 온라인 세션용 캐릭터 토큰 생성기. 맞춤 프레임, 투명 PNG 다운로드, 일괄 제작 지원.',
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const howToSchema: WithContext<HowTo> = {
|
|
105
|
+
'@context': 'https://schema.org',
|
|
106
|
+
'@type': 'HowTo',
|
|
107
|
+
name: 'TRPG 캐릭터 토큰 만드는 법',
|
|
108
|
+
step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })),
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
export const content: TokenStampLocaleContent = {
|
|
112
|
+
slug: 'token-stamp-studio',
|
|
113
|
+
title: 'TRPG 캐릭터 토큰 만들기 스튜디오 (투명 PNG)',
|
|
114
|
+
description: 'TRPG 온라인 세션용 캐릭터 토큰 생성기. 맞춤 프레임, 투명 PNG 다운로드, 일괄 제작 지원.',
|
|
115
|
+
ui,
|
|
116
|
+
seo: [
|
|
117
|
+
{ type: 'title', text: '지도에서 한눈에 구분되는 캐릭터 토큰 제작', level: 2 },
|
|
118
|
+
{ type: 'paragraph', html: 'TRPG 및 보드게임 지도에서 토큰의 실루엣은 캐릭터의 형태와 정체를 직관적으로 보여주는 중요한 요소입니다. 캐릭터에 맞는 프레임을 고르고 축소 상태에서도 잘 보이도록 디자인하세요.' },
|
|
119
|
+
{ type: 'title', text: '캐릭터 역할에 맞는 프레임 선택', level: 2 },
|
|
120
|
+
{ type: 'list', items: ['<strong>원형:</strong> 플레이어 캐릭터 및 동료 NPC에 가장 무난한 디자인.', '<strong>육각형/팔각형:</strong> 많은 단위가 등장하는 전술 전투에서 구분이 용이.', '<strong>별 모양:</strong> 보스 몬스터나 강조가 필요한 캐릭터용.', '<strong>구름형:</strong> 정령, 소환수, 소환물 등 특수 존재용.'] },
|
|
121
|
+
{ type: 'tip', title: '실제 게임 플레이 화면 크기를 고려', html: '지도를 축소해 토큰이 작아진 상태에서도 얼굴과 이름이 명확히 구별되는지 확인하며 제작하세요.' },
|
|
122
|
+
{ type: 'title', text: '게임에 도움 되는 짧은 라벨 활용', level: 2 },
|
|
123
|
+
{ type: 'paragraph', html: '토큰에는 이름이나 짧은 상태 정보만 넣어 일러스트를 가리지 않도록 하는 것이 좋습니다.' },
|
|
124
|
+
{ type: 'title', text: '파티 전체 토큰 일괄 생성', level: 2 },
|
|
125
|
+
{ type: 'paragraph', html: '일괄 작업 기능을 사용하면 통일된 프레임 디자인으로 파티원 전체의 토큰을 빠르게 완성할 수 있습니다.' },
|
|
126
|
+
{ type: 'tip', title: '자동 로컬 저장 기능', html: '작업 중인 토큰은 브라우저에 저장되므로 캐릭터 성장에 맞춰 언제든 수정할 수 있습니다.' },
|
|
127
|
+
],
|
|
128
|
+
faq,
|
|
129
|
+
bibliography,
|
|
130
|
+
howTo,
|
|
131
|
+
schemas: [faqSchema, appSchema, howToSchema] as unknown as Record<string, unknown>[],
|
|
132
|
+
};
|