@jjlmoya/utils-tabletop 1.26.0 → 1.28.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.
Files changed (69) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +4 -0
  3. package/src/entries.ts +4 -0
  4. package/src/index.ts +1 -0
  5. package/src/tests/locale_completeness.test.ts +1 -1
  6. package/src/tests/tool_validation.test.ts +1 -1
  7. package/src/tool/mus-scoreboard/bibliography.astro +16 -0
  8. package/src/tool/mus-scoreboard/bibliography.ts +12 -0
  9. package/src/tool/mus-scoreboard/component.astro +169 -0
  10. package/src/tool/mus-scoreboard/controller.ts +178 -0
  11. package/src/tool/mus-scoreboard/dom-views.ts +87 -0
  12. package/src/tool/mus-scoreboard/entry.ts +27 -0
  13. package/src/tool/mus-scoreboard/evaluator.ts +27 -0
  14. package/src/tool/mus-scoreboard/i18n/de.ts +187 -0
  15. package/src/tool/mus-scoreboard/i18n/en.ts +187 -0
  16. package/src/tool/mus-scoreboard/i18n/es.ts +187 -0
  17. package/src/tool/mus-scoreboard/i18n/fr.ts +187 -0
  18. package/src/tool/mus-scoreboard/i18n/id.ts +187 -0
  19. package/src/tool/mus-scoreboard/i18n/it.ts +187 -0
  20. package/src/tool/mus-scoreboard/i18n/ja.ts +187 -0
  21. package/src/tool/mus-scoreboard/i18n/ko.ts +187 -0
  22. package/src/tool/mus-scoreboard/i18n/nl.ts +187 -0
  23. package/src/tool/mus-scoreboard/i18n/pl.ts +187 -0
  24. package/src/tool/mus-scoreboard/i18n/pt.ts +187 -0
  25. package/src/tool/mus-scoreboard/i18n/ru.ts +187 -0
  26. package/src/tool/mus-scoreboard/i18n/sv.ts +187 -0
  27. package/src/tool/mus-scoreboard/i18n/tr.ts +187 -0
  28. package/src/tool/mus-scoreboard/i18n/zh.ts +187 -0
  29. package/src/tool/mus-scoreboard/index.ts +11 -0
  30. package/src/tool/mus-scoreboard/logic.test.ts +82 -0
  31. package/src/tool/mus-scoreboard/logic.ts +122 -0
  32. package/src/tool/mus-scoreboard/online-mus-scoreboard.css +740 -0
  33. package/src/tool/mus-scoreboard/seo.astro +16 -0
  34. package/src/tool/mus-scoreboard/storage.ts +29 -0
  35. package/src/tool/mus-scoreboard/ui.ts +63 -0
  36. package/src/tool/token-stamp-studio/bibliography.astro +16 -0
  37. package/src/tool/token-stamp-studio/bibliography.ts +12 -0
  38. package/src/tool/token-stamp-studio/component.astro +91 -0
  39. package/src/tool/token-stamp-studio/controller.ts +179 -0
  40. package/src/tool/token-stamp-studio/dom-views.ts +266 -0
  41. package/src/tool/token-stamp-studio/entry.ts +27 -0
  42. package/src/tool/token-stamp-studio/evaluator.ts +6 -0
  43. package/src/tool/token-stamp-studio/i18n/de.ts +132 -0
  44. package/src/tool/token-stamp-studio/i18n/en.ts +132 -0
  45. package/src/tool/token-stamp-studio/i18n/es.ts +132 -0
  46. package/src/tool/token-stamp-studio/i18n/fr.ts +132 -0
  47. package/src/tool/token-stamp-studio/i18n/id.ts +132 -0
  48. package/src/tool/token-stamp-studio/i18n/it.ts +132 -0
  49. package/src/tool/token-stamp-studio/i18n/ja.ts +132 -0
  50. package/src/tool/token-stamp-studio/i18n/ko.ts +132 -0
  51. package/src/tool/token-stamp-studio/i18n/nl.ts +132 -0
  52. package/src/tool/token-stamp-studio/i18n/pl.ts +132 -0
  53. package/src/tool/token-stamp-studio/i18n/pt.ts +132 -0
  54. package/src/tool/token-stamp-studio/i18n/ru.ts +132 -0
  55. package/src/tool/token-stamp-studio/i18n/sv.ts +132 -0
  56. package/src/tool/token-stamp-studio/i18n/tr.ts +132 -0
  57. package/src/tool/token-stamp-studio/i18n/zh.ts +132 -0
  58. package/src/tool/token-stamp-studio/index.ts +11 -0
  59. package/src/tool/token-stamp-studio/logic.test.ts +36 -0
  60. package/src/tool/token-stamp-studio/logic.ts +127 -0
  61. package/src/tool/token-stamp-studio/seo.astro +16 -0
  62. package/src/tool/token-stamp-studio/storage.ts +69 -0
  63. package/src/tool/token-stamp-studio/store.ts +139 -0
  64. package/src/tool/token-stamp-studio/token-stamp-studio.css +646 -0
  65. package/src/tool/token-stamp-studio/types.ts +65 -0
  66. package/src/tool/token-stamp-studio/ui.ts +50 -0
  67. package/src/tool/token-stamp-studio/workspace-media.ts +36 -0
  68. package/src/tool/token-stamp-studio/workspace.ts +83 -0
  69. package/src/tools.ts +4 -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: 'Escolha uma moldura',
7
+ frameHint: 'Escolha a silhueta que indica à mesa quem é a personagem antes mesmo de lerem o nome.',
8
+ randomFrame: 'Moldura aleatória',
9
+ surfaceLegend: 'Pinte o token',
10
+ backgroundLabel: 'Fundo',
11
+ borderLabel: 'Borda',
12
+ textLabel: 'Texto',
13
+ overlayLabel: 'Tinta',
14
+ randomColors: 'Cores aleatórias',
15
+ borderWidthLabel: 'Espessura da borda',
16
+ opacityLabel: 'Opacidade da borda',
17
+ overlayOpacityLabel: 'Tinta do retrato',
18
+ stageLabel: 'Forja de tokens em tempo real',
19
+ chooseImage: 'Escolher retrato',
20
+ clearImage: 'Remover retrato',
21
+ positionHint: 'Arraste o retrato ou as etiquetas diretamente sobre o token.',
22
+ markerName: 'Nome do marcador',
23
+ markerNamePlaceholder: 'Dê um nome a este marcador',
24
+ textLegend: 'Adicione detalhes legíveis',
25
+ textHint: 'Use etiquetas curtas como nome, nível, função ou estado. Arraste cada uma para o token.',
26
+ textPlaceholder: 'Nome da personagem ou função',
27
+ addText: 'Adicionar etiqueta',
28
+ removeText: 'Remover etiqueta',
29
+ textSizeLabel: 'Tamanho da fonte',
30
+ alignmentLabel: 'Alinhamento do texto',
31
+ alignLeft: 'Alinhar à esquerda',
32
+ alignCenter: 'Centralizar',
33
+ alignRight: 'Alinhar à direita',
34
+ imageLegend: 'Ajuste o retrato',
35
+ imageZoomLabel: 'Zoom do retrato',
36
+ scaleLabel: 'Escala de exportação',
37
+ savedMarkers: 'Marcadores salvos',
38
+ noSavedMarkers: 'Os marcadores salvos aparecerão aqui para você reabrir e editar quando quiser.',
39
+ reuseMarker: 'Selecione um marcador para reabri-lo na forja.',
40
+ deleteMarker: 'Excluir marcador',
41
+ newMarker: 'Novo marcador',
42
+ download: 'Baixar PNG',
43
+ copy: 'Copiar PNG',
44
+ downloadBatch: 'Baixar lote',
45
+ batchLabel: 'Exportação avançada em lote',
46
+ batchHint: 'Opcional: exporte vários retratos com a moldura e cores atuais.',
47
+ chooseBatch: 'Escolher retratos',
48
+ batchReady: '{count} retratos prontos para forjar.',
49
+ noImage: 'Nenhum retrato carregado',
50
+ noText: 'Sem etiquetas ainda. Adicione as informações de que seu grupo precisa.',
51
+ tokenDetails: 'Controles do token de personagem',
52
+ exportHint: 'O PNG é transparente fora da silhueta escolhida, pronto para VTT ou folha impressa.',
53
+ };
54
+
55
+ const faq = [
56
+ {
57
+ question: 'O que faz um bom retrato para token de personagem?',
58
+ answer: 'Escolha uma ilustração com um rosto claro e bom contraste com a moldura. Um corte de cabeça e ombros permanece legível mesmo quando o token é pequeno na mesa virtual.',
59
+ },
60
+ {
61
+ question: 'Como posicionar o retrato corretamente na moldura?',
62
+ answer: 'Carregue a imagem e arraste-a diretamente no token. Use o zoom de retrato para aproximar o rosto sem alterar o formato da borda.',
63
+ },
64
+ {
65
+ question: 'Posso adicionar o nome e o nível da personagem?',
66
+ answer: 'Sim. Adicione etiquetas curtas, ajuste o tamanho e o alinhamento e arraste para uma posição legível no token.',
67
+ },
68
+ {
69
+ question: 'O arquivo PNG mantém a transparência fora do token?',
70
+ answer: 'Sim. A imagem exportada mantém o fundo transparente fora da silhueta selecionada, facilitando a colocação sobre mapas.',
71
+ },
72
+ {
73
+ question: 'Posso criar tokens para todo o grupo de uma vez?',
74
+ answer: 'Sim. Use a exportação em lote para carregar vários retratos e baixar um arquivo PNG transparente para cada um mantendo as configurações.',
75
+ },
76
+ {
77
+ question: 'Onde meus marcadores salvos ficam armazenados?',
78
+ answer: 'Os marcadores salvos ficam armazenados localmente no seu navegador. Nenhuma imagem é enviada para servidores externos.',
79
+ },
80
+ ];
81
+
82
+ const howTo = [
83
+ { name: 'Escolha a silhueta da personagem', text: 'Selecione a moldura ideal: circular para heróis, hexagonal para combate tático ou estrela para chefes.' },
84
+ { name: 'Carregue e enquadre o retrato', text: 'Escolha a imagem, arraste-a no token e ajuste o zoom para centralizar o rosto.' },
85
+ { name: 'Adicione informações importantes', text: 'Insira um nome curto ou estado sem poluir a ilustração.' },
86
+ { name: 'Exporte como PNG transparente', text: 'Baixe o arquivo PNG transparente pronto para ser usado no seu VTT ou impresso.' },
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: 'Crie tokens de personagem legíveis para RPG de mesa com molduras personalizadas, etiquetas, transparência e exportação em lote.',
102
+ };
103
+
104
+ const howToSchema: WithContext<HowTo> = {
105
+ '@context': 'https://schema.org',
106
+ '@type': 'HowTo',
107
+ name: 'Como fazer um token de personagem para RPG de mesa',
108
+ step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })),
109
+ };
110
+
111
+ export const content: TokenStampLocaleContent = {
112
+ slug: 'criador-tokens-personagens-rpg-mesa',
113
+ title: 'Criador de Tokens de Personagem para RPG de Mesa',
114
+ description: 'Crie tokens de personagem legíveis para RPG de mesa com molduras personalizadas, etiquetas, transparência e exportação em lote.',
115
+ ui,
116
+ seo: [
117
+ { type: 'title', text: 'Crie tokens de personagem claros e legíveis no mapa', level: 2 },
118
+ { type: 'paragraph', html: 'Um token é um elemento fundamental de comunicação na mesa de jogo. Sua silhueta mostra imediatamente ao grupo se trata de um herói, monstro ou aliado. Escolha a moldura certa e mantenha o rosto e o texto legíveis.' },
119
+ { type: 'title', text: 'Escolha a moldura certa para a personagem', level: 2 },
120
+ { type: 'list', items: ['<strong>Círculo:</strong> padrão para personagens de jogadores e aliados.', '<strong>Hexágono ou octógono:</strong> ótimo para combates táticos com muitas unidades.', '<strong>Estrela:</strong> perfeito para chefes, campeões ou alvos prioritários.', '<strong>Nuvem:</strong> formato suave para espíritos, familiares e criaturas místicas.'] },
121
+ { type: 'tip', title: 'Projete pensando no menor tamanho de exibição', html: 'Reduza o zoom do mapa até que o token fique pequeno. Se o rosto e o texto continuarem visíveis, seu token funcionará perfeitamente.' },
122
+ { type: 'title', text: 'Etiquetas curtas e úteis durante a partida', level: 2 },
123
+ { type: 'paragraph', html: 'O token não deve substituir a ficha de personagem. Adicione apenas os dados mais consultados: nome curto, nível ou estado atual.' },
124
+ { type: 'title', text: 'Prepare todo o grupo de aventureiros de uma só vez', level: 2 },
125
+ { type: 'paragraph', html: 'A exportação em lote permite padronizar o estilo do grupo mantendo a identidade visual de cada personagem.' },
126
+ { type: 'tip', title: 'Salvamento automático no seu dispositivo', html: 'O marcador ativo fica salvo no seu navegador para que você possa editá-lo facilmente quando a personagem subir de nível.' },
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: 'Да. Экспортированное изображение имеет прозрачный фон за пределами силуэта, что удобно для размещения на картах.',
71
+ },
72
+ {
73
+ question: 'Можно ли создать жетоны для всей группы одновременно?',
74
+ answer: 'Да. Используйте пакетный экспорт, чтобы загрузить несколько портретов и получить прозрачные PNG для каждого из них.',
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: 'Создание понятных жетонов персонажей для настольных RPG с рамками, подписями, прозрачным фоном и пакетным экспортом.',
102
+ };
103
+
104
+ const howToSchema: WithContext<HowTo> = {
105
+ '@context': 'https://schema.org',
106
+ '@type': 'HowTo',
107
+ name: 'Как создать жетон персонажа для настольных RPG',
108
+ step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })),
109
+ };
110
+
111
+ export const content: TokenStampLocaleContent = {
112
+ slug: 'sozdatel-zhetonov-personazhey-rpg-nastolnyh',
113
+ title: 'Создатель Жетонов Персонажей для Настольных RPG (Tokens)',
114
+ description: 'Создание понятных жетонов персонажей для настольных RPG с рамками, подписями, прозрачным фоном и пакетным экспортом.',
115
+ ui,
116
+ seo: [
117
+ { type: 'title', text: 'Создавайте четкие и понятные жетоны персонажей для любых карт настольных RPG', level: 2 },
118
+ { type: 'paragraph', html: 'Жетон - это важнейший элемент визуальной коммуникации за игровым столом. Его силуэт сразу показывает всем участникам группы, кто перед ними: главный герой, опасный монстр, заклинание или важный союзник до того, как кто-то приблизит виртуальную карту. Выбирайте подходящую рамку и следите за тем, чтобы лицо и подписи оставались читаемыми.' },
119
+ { type: 'title', text: 'Подберите подходящую рамку под роль и тип персонажа', level: 2 },
120
+ { type: 'list', items: ['<strong>Круг или кольцо:</strong> классический и надежный выбор для персонажей игроков и постоянных союзников.', '<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: 'Välj en ram',
7
+ frameHint: 'Välj den silhuett som visar gruppen vem karaktären är innan någon hinner läsa namnet.',
8
+ randomFrame: 'Slumpmässig ram',
9
+ surfaceLegend: 'Färglägg din token',
10
+ backgroundLabel: 'Bakgrund',
11
+ borderLabel: 'Ram',
12
+ textLabel: 'Text',
13
+ overlayLabel: 'Toning',
14
+ randomColors: 'Slumpmässiga färger',
15
+ borderWidthLabel: 'Ramtjocklek',
16
+ opacityLabel: 'Ramopacitet',
17
+ overlayOpacityLabel: 'Porträttoning',
18
+ stageLabel: 'Live token-smedja',
19
+ chooseImage: 'Välj porträtt',
20
+ clearImage: 'Ta bort porträtt',
21
+ positionHint: 'Dra porträttet eller etiketter direkt på din token.',
22
+ markerName: 'Markörnamn',
23
+ markerNamePlaceholder: 'Namnge denna markör',
24
+ textLegend: 'Lägg till läsbar information',
25
+ textHint: 'Använd korta etiketter som namn, nivå eller roll. Dra varje etikett på din token.',
26
+ textPlaceholder: 'Karaktärsnamn eller roll',
27
+ addText: 'Lägg till etikett',
28
+ removeText: 'Ta bort etikett',
29
+ textSizeLabel: 'Textstorlek',
30
+ alignmentLabel: 'Textjustering',
31
+ alignLeft: 'Vänsterjustera',
32
+ alignCenter: 'Centrera',
33
+ alignRight: 'Högerjustera',
34
+ imageLegend: 'Justera porträttet',
35
+ imageZoomLabel: 'Porträttzoom',
36
+ scaleLabel: 'Exportskala',
37
+ savedMarkers: 'Sparade markörer',
38
+ noSavedMarkers: 'Sparade markörer visas här så att du kan öppna och redigera dem igen.',
39
+ reuseMarker: 'Välj en markör för att öppna den igen.',
40
+ deleteMarker: 'Ta bort markör',
41
+ newMarker: 'Ny markör',
42
+ download: 'Ladda ner PNG',
43
+ copy: 'Kopiera PNG',
44
+ downloadBatch: 'Ladda ner batch',
45
+ batchLabel: 'Avancerad batchexport',
46
+ batchHint: 'Valfritt: exportera flera porträtt med nuvarande ram och färger.',
47
+ chooseBatch: 'Välj porträtt',
48
+ batchReady: '{count} porträtt redo att smidas.',
49
+ noImage: 'Inget porträtt laddat',
50
+ noText: 'Inga etiketter ännu. Lägg till informationen som din spelgrupp behöver.',
51
+ tokenDetails: 'Token-kontroller',
52
+ exportHint: 'PNG-filen har transparent bakgrund utanför den valda silhuetten, redo för VTT eller utskrift.',
53
+ };
54
+
55
+ const faq = [
56
+ {
57
+ question: 'Vad gör ett porträtt bra för en karaktärs-token?',
58
+ answer: 'Välj en bild med tydligt ansikte och bra kontrast mot ramen. En beskärning av huvud och axlar förblir lättläst på det virtuella spelbordet.',
59
+ },
60
+ {
61
+ question: 'Hur placerar jag porträttet bäst i ramen?',
62
+ answer: 'Ladda upp bilden och dra den direkt på token för att centrera ansiktet. Använd porträttzoom för att förstora utan att ändra ramen.',
63
+ },
64
+ {
65
+ question: 'Kan jag lägga till namnet och nivån på karaktären?',
66
+ answer: 'Ja. Lägg till korta etiketter, anpassa storlek och justering, och dra dem till en tydlig plats på din token.',
67
+ },
68
+ {
69
+ question: 'Behåller PNG-filen sin transparens utanför ramen?',
70
+ answer: 'Ja. Den exporterade bilden har genomskinlig bakgrund utanför silhuetten, vilket gör den enkelt att placera över kartor.',
71
+ },
72
+ {
73
+ question: 'Kan jag skapa tokens för hela spelgruppen samtidigt?',
74
+ answer: 'Ja. Använd batchexport för att ladda upp flera porträtt och ladda ner en transparent PNG för varje bild.',
75
+ },
76
+ {
77
+ question: 'Var sparas mina markörer?',
78
+ answer: 'Markörerna sparas lokalt i din webbläsare. Inga bilder laddas upp till externa servrar.',
79
+ },
80
+ ];
81
+
82
+ const howTo = [
83
+ { name: 'Välj karaktärens silhuett', text: 'Välj en ram som passar rollen: rund för hjältar, sexkantig för taktiska strider eller stjärna för bossar.' },
84
+ { name: 'Ladda upp och centrera porträttet', text: 'Välj en bild, dra den till din token och justera zoomen så att ansiktet hamnar i mitten.' },
85
+ { name: 'Lägg till viktig information', text: 'Skriv ett kort namn eller status utan att täcka över viktiga detaljer i bilden.' },
86
+ { name: 'Exportera som transparent PNG', text: 'Ladda ner din transparenta PNG redo för digitala spelbord eller utskrift.' },
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: 'Skapa tydliga karaktärs-tokens för rollspel med anpassade ramar, etiketter, transparens och batchexport.',
102
+ };
103
+
104
+ const howToSchema: WithContext<HowTo> = {
105
+ '@context': 'https://schema.org',
106
+ '@type': 'HowTo',
107
+ name: 'Hur man skapar en karaktärs-token för rollspel',
108
+ step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })),
109
+ };
110
+
111
+ export const content: TokenStampLocaleContent = {
112
+ slug: 'karaktars-token-skapare-rpg-bordssport',
113
+ title: 'Skapa Karaktärs Tokens för Rollspel Online',
114
+ description: 'Skapa tydliga karaktärs-tokens för rollspel med anpassade ramar, etiketter, transparens och batchexport.',
115
+ ui,
116
+ seo: [
117
+ { type: 'title', text: 'Skapa tydliga karaktärs-tokens för alla dina digitala spelkartor', level: 2 },
118
+ { type: 'paragraph', html: 'En token är ett extremt viktigt visuellt hjälpmedel vid det digitala spelbordet. Silhuetten visar spelgruppen direkt om det rör sig om en hjälte, ett farligt monster, en förtrollningseffekt eller en viktig allierad innan någon ens hinner zooma in på kartan. Välj rätt ram och se till att både bild och text förblir perfekt läsbara på den storlek din virtuella spelplattform använder.' },
119
+ { type: 'title', text: 'Välj rätt ram för varje unik karaktärstyp i kampanjen', level: 2 },
120
+ { type: 'list', items: ['<strong>Rund eller ring:</strong> klassisk och pålitlig standard för spelarkaraktärer och återkommande allierade.', '<strong>Sexkant eller åttkant:</strong> mycket enkelt att skilja ut i taktiska strider med många olika enheter.', '<strong>Stjärna:</strong> utmärkt för bossar, mästare och viktiga mål som kräver omedelbar uppmärksamhet.', '<strong>Moln:</strong> en mjuk och stilren form för andar, familjärer och magiska varelser.'] },
121
+ { type: 'tip', title: 'Designa alltid för den minsta spelstorleken du använder', html: 'Zooma ut på kartan tills din token blir bara ett tiotal pixlar bred. Om ansiktet, ramen och texten fortfarande syns tydligt kommer din token fungera utmärkt under intensiva strider.' },
122
+ { type: 'title', text: 'Håll alla etiketter korta och praktiska under spelsessionen', level: 2 },
123
+ { type: 'paragraph', html: 'En token ska aldrig ersätta ett fullständigt karaktärsblad. Lägg bara till den allra viktigaste informationen som gruppen ständigt behöver: ett kort namn, en nivå, en roll eller en status. För långa meningar skapar bara visuellt brus och täcker över bilden.' },
124
+ { type: 'title', text: 'Skapa tokens för hela spelgruppen samtidigt utan att förlora deras stil', level: 2 },
125
+ { type: 'paragraph', html: 'Batchexport gör det väldigt enkelt att ge hela gruppen samma visuella ramstil efter session noll medan varje enskilt porträtt behåller sin unika karaktär. En enhetlig inramning skapar sammanhållning i gruppen samtidigt som varje ansikte känns igen direkt.' },
126
+ { type: 'tip', title: 'Automatisk lokal sparande direkt på din enhet', html: 'Din aktiva markör sparas automatiskt i webbläsaren så att du enkelt kan öppna och redigera den igen när karaktären går upp i nivå.' },
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: 'Bir çerçeve seçin',
7
+ frameHint: 'Kimse ismi okumadan önce bu karakterin kim olduğunu masaya gösteren silüeti seçin.',
8
+ randomFrame: 'Rastgele çerçeve',
9
+ surfaceLegend: 'Pulu renklendirin',
10
+ backgroundLabel: 'Arka plan',
11
+ borderLabel: 'Çerçeve',
12
+ textLabel: 'Yazı',
13
+ overlayLabel: 'Ton',
14
+ randomColors: 'Rastgele renkler',
15
+ borderWidthLabel: 'Çerçeve kalınlığı',
16
+ opacityLabel: 'Çerçeve saydamlığı',
17
+ overlayOpacityLabel: 'Portre tonu',
18
+ stageLabel: 'Canlı pul atölyesi',
19
+ chooseImage: 'Portre seçin',
20
+ clearImage: 'Portreyi kaldır',
21
+ positionHint: 'Portreyi veya etiketleri doğrudan pulun üzerine sürükleyin.',
22
+ markerName: 'İşaretçi adı',
23
+ markerNamePlaceholder: 'Bu işaretçiyi adlandırın',
24
+ textLegend: 'Okunabilir detaylar ekleyin',
25
+ textHint: 'İsim, seviye, rol gibi kısa etiketler kullanın. Her birini pulun üzerine sürükleyin.',
26
+ textPlaceholder: 'Karakter adı veya rolü',
27
+ addText: 'Etiket ekle',
28
+ removeText: 'Etiketi kaldır',
29
+ textSizeLabel: 'Yazı boyutu',
30
+ alignmentLabel: 'Yazı hizalaması',
31
+ alignLeft: 'Sola hizala',
32
+ alignCenter: 'Ortala',
33
+ alignRight: 'Sağa hizala',
34
+ imageLegend: 'Portreyi ayarlayın',
35
+ imageZoomLabel: 'Portre yakınlaştırma',
36
+ scaleLabel: 'Dışa aktarma ölçeği',
37
+ savedMarkers: 'Kaydedilen işaretçiler',
38
+ noSavedMarkers: 'Kaydedilen işaretçiler yeniden açıp düzenlemeniz için burada görünecektir.',
39
+ reuseMarker: 'Yeniden açmak için bir işaretçi seçin.',
40
+ deleteMarker: 'İşaretçiyi sil',
41
+ newMarker: 'Yeni işaretçi',
42
+ download: 'PNG indir',
43
+ copy: 'PNG kopyala',
44
+ downloadBatch: 'Toplu indir',
45
+ batchLabel: 'Gelişmiş toplu dışa aktarma',
46
+ batchHint: 'İsteğe bağlı: Mevcut çerçeve ve renk ayarlarıyla birden fazla portreyi dışa aktarın.',
47
+ chooseBatch: 'Portreleri seçin',
48
+ batchReady: '{count} portre hazırlanmaya hazır.',
49
+ noImage: 'Portre yüklenmedi',
50
+ noText: 'Henüz etiket yok. Grubunuzun ihtiyaç duyduğu detayları ekleyin.',
51
+ tokenDetails: 'Karakter pulu kontrolleri',
52
+ exportHint: 'PNG dosyası seçilen silüetin dışında şeffaftır, sanal masaüstü veya baskı için hazırdır.',
53
+ };
54
+
55
+ const faq = [
56
+ {
57
+ question: 'İyi bir karakter pulu portresi nasıl olmalıdır?',
58
+ answer: 'Net bir yüze ve çerçeveye göre yeterli kontrasta sahip bir görsel seçin. Baş ve omuz kesimi sanal masaüstünde pul küçüldüğünde bile okunabilir kalır.',
59
+ },
60
+ {
61
+ question: 'Portreyi çerçeve içine en iyi şekilde nasıl yerleştiririm?',
62
+ answer: 'Görseli yükleyin ve yüzü ortalamak için doğrudan pul üzerine sürükleyin. Çerçeveyi değiştirmeden yüzü büyütmek için portre yakınlaştırmayı kullanın.',
63
+ },
64
+ {
65
+ question: 'Karakter adı ve seviyesini ekleyebilir miyim?',
66
+ answer: 'Evet. İstediğiniz kadar kısa etiket ekleyin, boyutunu ve hizalamasını ayarlayın ve pul üzerinde okunabilir bir yere sürükleyin.',
67
+ },
68
+ {
69
+ question: 'PNG dosyası çerçevenin dışında şeffaflığı korur mu?',
70
+ answer: 'Evet. Dışa aktarılan görsel seçilen silüetin dışını şeffaf tutar, bu da haritalar üzerine yerleştirmeyi kolaylaştırır.',
71
+ },
72
+ {
73
+ question: 'Tüm grup için tek seferde pul oluşturabilir miyim?',
74
+ answer: 'Evet. Toplu dışa aktarmayı kullanarak birden fazla portre yükleyin ve her biri için şeffaf bir PNG indirin.',
75
+ },
76
+ {
77
+ question: 'Kaydedilen işaretçilerim nerede saklanır?',
78
+ answer: 'İşaretçiler tarayıcınızın yerel depolama alanında saklanır. Hiçbir görsel harici sunuculara yüklenmez.',
79
+ },
80
+ ];
81
+
82
+ const howTo = [
83
+ { name: 'Karakter silüetini seçin', text: 'Role uygun bir çerçeve seçin: kahramanlar için daire, taktik savaşlar için altıgen veya patronlar için yıldız.' },
84
+ { name: 'Portreyi yükleyin ve ortalayın', text: 'Görseli seçin, pula sürükleyin ve yüz ortalanacak şekilde yakınlaştırmayı ayarlayın.' },
85
+ { name: 'Önemli bilgileri ekleyin', text: 'Görseli kapatmayacak şekilde kısa bir isim veya durum bilgisi ekleyin.' },
86
+ { name: 'Şeffaf PNG olarak dışa aktarın', text: 'Sanal masaüstünüzde (VTT) veya baskıda kullanmak üzere şeffaf PNG dosyasını indirin.' },
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: 'Masaüstü RPG oyunları için özel çerçeveli, etiketli, şeffaf ve toplu PNG indirmeli karakter pulları (tokens) oluşturun.',
102
+ };
103
+
104
+ const howToSchema: WithContext<HowTo> = {
105
+ '@context': 'https://schema.org',
106
+ '@type': 'HowTo',
107
+ name: 'Masaüstü RPG karakter pulu nasıl yapılır',
108
+ step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })),
109
+ };
110
+
111
+ export const content: TokenStampLocaleContent = {
112
+ slug: 'rpg-karakter-pulu-olusturucu-masaustu',
113
+ title: 'Masaüstü RPG Karakter Pulu Oluşturucu (Tokens)',
114
+ description: 'Masaüstü RPG oyunları için özel çerçeveli, etiketli, şeffaf ve toplu PNG indirmeli karakter pulları (tokens) oluşturun.',
115
+ ui,
116
+ seo: [
117
+ { type: 'title', text: 'Oyun haritanızda son derece net görünen karakter pulları tasarlayın', level: 2 },
118
+ { type: 'paragraph', html: 'Bir pul, oyun masasındaki en önemli görsel iletişim araçlarından biridir. Silüeti, tüm gruba henüz haritayı yakınlaştırmadan önce bir kahramanla mı, tehlikeli bir canavarla mı yoksa kilit bir müttefikle mi karşı karşıya olduklarını anında gösterir. Doğru çerçeveyi seçin ve sanal masaüstü platformunuzun kullandığı ölçekte hem görselin hem de yazıların mükemmel bir okunabilirlikte kalmasını sağlayın.' },
119
+ { type: 'title', text: 'Karakter tipine ve rolüne en uygun çerçeveyi seçin', level: 2 },
120
+ { type: 'list', items: ['<strong>Daire veya halka:</strong> oyuncu karakterleri ve sürekli müttefikler için standart ve güvenilir bir seçim.', '<strong>Altıgen veya sekizgen:</strong> çok birimli taktik savaşlarda birimleri birbirinden kolayca ayırmak için harikadır.', '<strong>Yıldız:</strong> patronlar, şampiyonlar veya hemen dikkat çekmesi gereken önemli hedefler için mükemmeldir.', '<strong>Bulut:</strong> ruhlar, büyülü yaratıklar ve mistik varlıklar için yumuşak bir form.'] },
121
+ { type: 'tip', title: 'Her zaman aslında oynayacağınız en küçük boyutu hedefleyerek tasarlayın', html: 'Haritayı pul yalnızca birkaç düzine piksel genişliğinde kalana kadar uzaklaştırın. Yüz, çerçeve ve yazı hala net bir şekilde birbirinden ayrılabiliyorsa, pulunuz yoğun savaş anlarında harika çalışacaktır.' },
122
+ { type: 'title', text: 'Oyun sırasında kısa ve kullanışlı etiketler kullanın', level: 2 },
123
+ { type: 'paragraph', html: 'Bir pul asla eksiksiz bir karakter kağıdının yerini almaz. Yalnızca masanın sürekli ihtiyaç duyduğu en önemli bilgileri ekleyin: kısa bir isim, seviye veya sersemlemiş gibi bir durum bilgisi. Çok uzun cümleler yalnızca görsel kirlilik yaratır ve portrenin önüne geçer.' },
124
+ { type: 'title', text: 'Tüm ekibin pullarını kimliklerini kaybetmeden tek seferde hazırlayın', level: 2 },
125
+ { type: 'paragraph', html: 'Toplu dışa aktarma, her portrenin özgünlüğünü ve benzersizliğini korurken grubun genel stilini birleştirmenize olanak tanır. Tutarlı bir çerçeveleme ekibe görsel bir bütünlük katar.' },
126
+ { type: 'tip', title: 'Cihazınızda otomatik yerel kaydetme kolaylığı', html: 'Aktif işaretçiniz tarayıcınızda otomatik olarak saklanır, böylece karakter seviye atladığında kolayca yeniden açıp düzenleyebilirsiniz.' },
127
+ ],
128
+ faq,
129
+ bibliography,
130
+ howTo,
131
+ schemas: [faqSchema, appSchema, howToSchema] as unknown as Record<string, unknown>[],
132
+ };