@jjlmoya/utils-tabletop 1.31.0 → 1.33.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 (74) hide show
  1. package/package.json +2 -2
  2. package/src/category/i18n/de.ts +1 -1
  3. package/src/category/i18n/es.ts +1 -1
  4. package/src/category/i18n/fr.ts +1 -1
  5. package/src/category/i18n/id.ts +1 -1
  6. package/src/category/i18n/it.ts +1 -1
  7. package/src/category/i18n/nl.ts +1 -1
  8. package/src/category/i18n/pl.ts +1 -1
  9. package/src/category/i18n/pt.ts +1 -1
  10. package/src/category/i18n/ru.ts +1 -1
  11. package/src/category/i18n/sv.ts +1 -1
  12. package/src/category/i18n/tr.ts +1 -1
  13. package/src/category/index.ts +25 -25
  14. package/src/components/PreviewNavSidebar.astro +1 -1
  15. package/src/components/PreviewToolbar.astro +1 -1
  16. package/src/entries.ts +43 -43
  17. package/src/env.d.ts +1 -1
  18. package/src/index.ts +24 -24
  19. package/src/layouts/PreviewLayout.astro +93 -93
  20. package/src/pages/[locale]/[slug].astro +143 -143
  21. package/src/pages/index.astro +1 -1
  22. package/src/tests/bibliography_wellformed_export.test.ts +46 -0
  23. package/src/tests/category_seo_quality.test.ts +74 -0
  24. package/src/tests/i18n_coverage.test.ts +36 -36
  25. package/src/tests/mocks/astro_mock.js +1 -1
  26. package/src/tests/no_em_dash.test.ts +47 -47
  27. package/src/tests/no_en_dash.test.ts +70 -70
  28. package/src/tests/seo_length.test.ts +3 -3
  29. package/src/tests/seo_parity.test.ts +2 -2
  30. package/src/tests/seo_wellformed_export.test.ts +65 -0
  31. package/src/tests/spanish_leakage.test.ts +175 -175
  32. package/src/tool/dungeon-map-generator/component.astro +135 -135
  33. package/src/tool/dungeon-map-generator/controller.ts +243 -243
  34. package/src/tool/dungeon-map-generator/dom-views.ts +144 -144
  35. package/src/tool/dungeon-map-generator/i18n/de.ts +172 -172
  36. package/src/tool/dungeon-map-generator/logic.ts +281 -281
  37. package/src/tool/dungeon-map-generator/random-dungeon-map-generator.css +692 -692
  38. package/src/tool/dungeon-map-generator/ui.ts +54 -54
  39. package/src/tool/fantasy-runes-translator/logic.ts +1 -1
  40. package/src/tool/first-player-selector/i18n/tr.ts +1 -1
  41. package/src/tool/investigation-board/i18n/ru.ts +209 -209
  42. package/src/tool/investigation-board/i18n/zh.ts +209 -209
  43. package/src/tool/lunar-tide-tracker/client.ts +264 -264
  44. package/src/tool/rpg-initiative-tracker/i18n/de.ts +3 -3
  45. package/src/tool/rpg-initiative-tracker/i18n/es.ts +1 -1
  46. package/src/tool/rpg-initiative-tracker/i18n/pl.ts +2 -2
  47. package/src/tool/rpg-initiative-tracker/i18n/ru.ts +1 -1
  48. package/src/tool/score-tracker/i18n/pt.ts +1 -1
  49. package/src/tool/score-tracker/i18n/sv.ts +1 -1
  50. package/src/tool/score-tracker/i18n/tr.ts +1 -1
  51. package/src/tool/score-tracker/i18n/zh.ts +1 -1
  52. package/src/tool/token-stamp-studio/component.astro +0 -1
  53. package/src/tool/token-stamp-studio/dom-views.ts +7 -34
  54. package/src/tool/token-stamp-studio/i18n/de.ts +0 -1
  55. package/src/tool/token-stamp-studio/i18n/en.ts +0 -1
  56. package/src/tool/token-stamp-studio/i18n/es.ts +0 -1
  57. package/src/tool/token-stamp-studio/i18n/fr.ts +0 -1
  58. package/src/tool/token-stamp-studio/i18n/id.ts +0 -1
  59. package/src/tool/token-stamp-studio/i18n/it.ts +0 -1
  60. package/src/tool/token-stamp-studio/i18n/ja.ts +0 -1
  61. package/src/tool/token-stamp-studio/i18n/ko.ts +0 -1
  62. package/src/tool/token-stamp-studio/i18n/nl.ts +0 -1
  63. package/src/tool/token-stamp-studio/i18n/pl.ts +0 -1
  64. package/src/tool/token-stamp-studio/i18n/pt.ts +0 -1
  65. package/src/tool/token-stamp-studio/i18n/ru.ts +0 -1
  66. package/src/tool/token-stamp-studio/i18n/sv.ts +0 -1
  67. package/src/tool/token-stamp-studio/i18n/tr.ts +0 -1
  68. package/src/tool/token-stamp-studio/i18n/zh.ts +0 -1
  69. package/src/tool/token-stamp-studio/token-stamp-studio.css +18 -4
  70. package/src/tool/token-stamp-studio/ui.ts +0 -1
  71. package/src/tool/token-stamp-studio/workspace-media.test.ts +20 -0
  72. package/src/tool/token-stamp-studio/workspace-media.ts +96 -2
  73. package/src/tool/token-stamp-studio/workspace.ts +41 -17
  74. package/src/tools.ts +25 -25
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlmoya/utils-tabletop",
3
- "version": "1.31.0",
3
+ "version": "1.33.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -27,7 +27,7 @@
27
27
  "lint": "eslint src/ --max-warnings 0 && stylelint \"src/**/*.{css,astro}\"",
28
28
  "check": "astro check",
29
29
  "type-check": "astro check",
30
- "test": "vitest run",
30
+ "test": "vitest run --reporter=verbose --testTimeout=30000",
31
31
  "preversion": "npm run lint && npm run test && npm run build",
32
32
  "postversion": "git push && git push --tags",
33
33
  "patch": "npm version patch",
@@ -2,7 +2,7 @@ import type { CategoryLocaleContent } from '../../types';
2
2
 
3
3
  const slug = 'brettspiele';
4
4
  const title = 'Brettspiel Utilities und Werkzeuge';
5
- const description = 'Kostenlose Werkzeuge für Brett- und Rollenspiele: würfle virtuelle Polyederwürfel mit Live-Statistiken, verwalte Zugzeiten mit einem Multiplayer-Timer und mehr. Läuft im Browser, ohne Anmeldung, 100 % privat.';
5
+ const description = 'Kostenlose Werkzeuge für Brett- und Rollenspiele: virtuelle Würfel, Statistiken und Multiplayer-Timer im Browser, ohne Anmeldung.';
6
6
 
7
7
  export const content: CategoryLocaleContent = {
8
8
  slug,
@@ -2,7 +2,7 @@ import type { CategoryLocaleContent } from '../../types';
2
2
 
3
3
  const slug = 'juegos-de-mesa';
4
4
  const title = 'Utilidades y Herramientas para Juegos de Mesa';
5
- const description = 'Herramientas gratuitas para juegos de mesa y rol: lanza dados virtuales con estadísticas, controla los tiempos de tus partidas con un temporizador multijugador y mucho más. Todo en tu navegador, sin registro y 100% privado.';
5
+ const description = 'Herramientas gratuitas para juegos de mesa y rol: dados virtuales, estadísticas y temporizadores multijugador en el navegador, sin registro.';
6
6
 
7
7
  export const content: CategoryLocaleContent = {
8
8
  slug,
@@ -2,7 +2,7 @@ import type { CategoryLocaleContent } from '../../types';
2
2
 
3
3
  const slug = 'jeux-de-societe';
4
4
  const title = 'Utilitaires et Outils pour Jeux de Société';
5
- const description = 'Outils gratuits pour jeux de société et de rôle: lancez des dés virtuels avec des statistiques en direct, gérez les temps de tour avec un chronomètre multijoueur et bien plus. Fonctionne dans votre navigateur, sans inscription, 100 % privé.';
5
+ const description = 'Outils gratuits pour jeux de société et de rôle: dés virtuels, statistiques et chronomètres multijoueurs dans le navigateur, sans inscription.';
6
6
 
7
7
  export const content: CategoryLocaleContent = {
8
8
  slug,
@@ -2,7 +2,7 @@ import type { CategoryLocaleContent } from '../../types';
2
2
 
3
3
  const slug = 'permainan-papan';
4
4
  const title = 'Utilitas & Alat untuk Permainan Papan';
5
- const description = 'Alat gratis untuk permainan papan dan RPG: lempar dadu virtual dengan statistik langsung, kelola waktu giliran dengan timer multipemain, dan banyak lagi. Berfungsi di browser, tanpa pendaftaran, 100% pribadi.';
5
+ const description = 'Alat gratis untuk permainan papan dan RPG: dadu virtual, statistik, dan timer multipemain di browser tanpa pendaftaran.';
6
6
 
7
7
  export const content: CategoryLocaleContent = {
8
8
  slug,
@@ -2,7 +2,7 @@ import type { CategoryLocaleContent } from '../../types';
2
2
 
3
3
  const slug = 'giochi-da-tavolo';
4
4
  const title = 'Utilità e Strumenti per Giochi da Tavolo';
5
- const description = 'Strumenti gratuiti per giochi da tavolo e di ruolo: lancia dadi virtuali con statistiche in tempo reale, gestisci i tempi di turno con un cronometro multigiocatore e molto altro. Funziona nel browser, senza registrazione, 100% privato.';
5
+ const description = 'Strumenti gratuiti per giochi da tavolo e di ruolo: dadi virtuali, statistiche e timer multigiocatore nel browser, senza registrazione.';
6
6
 
7
7
  export const content: CategoryLocaleContent = {
8
8
  slug,
@@ -2,7 +2,7 @@ import type { CategoryLocaleContent } from '../../types';
2
2
 
3
3
  const slug = 'bordspelen';
4
4
  const title = 'Bordspel Hulpmiddelen & Utilities';
5
- const description = 'Gratis hulpmiddelen voor bordspellen en RPGs: gooi virtuele dobbelstenen met live statistieken, beheer beurt tijden met een multi-player timer en meer. Werkt in de browser, geen registratie, 100% privé.';
5
+ const description = 'Gratis tools voor bordspellen en RPG\'s: virtuele dobbelstenen, statistieken en multitimer in de browser zonder registratie.';
6
6
 
7
7
  export const content: CategoryLocaleContent = {
8
8
  slug,
@@ -2,7 +2,7 @@ import type { CategoryLocaleContent } from '../../types';
2
2
 
3
3
  const slug = 'gry-planszowe';
4
4
  const title = 'Narzędzia i Pomocniki do Gier Planszowych';
5
- const description = 'Darmowe narzędzia do gier planszowych i RPG: rzucaj wirtualnymi kośćmi z statystykami na żywo, zarządzaj czasem tur z multi-timerem i nie tylko. Działa w przeglądarce, bez rejestracji, 100% prywatności.';
5
+ const description = 'Darmowe narzędzia do gier planszowych i RPG: wirtualne kości, statystyki i zegary wieloosobowe w przeglądarce, bez rejestracji.';
6
6
 
7
7
  export const content: CategoryLocaleContent = {
8
8
  slug,
@@ -2,7 +2,7 @@ import type { CategoryLocaleContent } from '../../types';
2
2
 
3
3
  const slug = 'jogos-de-mesa';
4
4
  const title = 'Utilitários e Ferramentas para Jogos de Mesa';
5
- const description = 'Ferramentas gratuitas para jogos de mesa e RPG: lance dados virtuais com estatísticas ao vivo, controle os tempos de turno com um cronómetro multijogador e muito mais. Funciona no navegador, sem registo, 100% privado.';
5
+ const description = 'Ferramentas gratuitas para jogos de mesa e RPG: dados virtuais, estatísticas e temporizadores multijogador no navegador, sem registo.';
6
6
 
7
7
  export const content: CategoryLocaleContent = {
8
8
  slug,
@@ -2,7 +2,7 @@
2
2
 
3
3
  const slug = 'nastolnye-igry';
4
4
  const title = 'Инструменты и утилиты для настольных игр';
5
- const description = 'Бесплатные инструменты для настольных и ролевых игр: бросайте виртуальные кости со статистикой в реальном времени, управляйте временем ходов с многоигроковым таймером и не только. Работает в браузере, без регистрации, 100% конфиденциально.';
5
+ const description = 'Бесплатные инструменты для настольных и ролевых игр: виртуальные кости, статистика и таймеры в браузере без регистрации.';
6
6
 
7
7
  export const content: CategoryLocaleContent = {
8
8
  slug,
@@ -2,7 +2,7 @@ import type { CategoryLocaleContent } from '../../types';
2
2
 
3
3
  const slug = 'bordspel';
4
4
  const title = 'Brädspelsverktyg & Hjälpmedel';
5
- const description = 'Gratis verktyg för brädspel och rollspel: slå virtuella tärningar med realtidsstatistik, håll koll på speltid med en multitimer och mycket mer. Fungerar i webbläsaren, ingen registrering krävs, 100 % privat.';
5
+ const description = 'Gratis verktyg för brädspel och rollspel: virtuella tärningar, statistik och multitimer i webbläsaren utan registrering.';
6
6
 
7
7
  export const content: CategoryLocaleContent = {
8
8
  slug,
@@ -2,7 +2,7 @@ import type { CategoryLocaleContent } from '../../types';
2
2
 
3
3
  const slug = 'masa-oyunlari';
4
4
  const title = 'Masa Oyunu Araçları ve Yardımcı Programları';
5
- const description = 'Masa oyunları ve RPG için ücretsiz araçlar: canlı istatistiklerle sanal zar atma, çok oyunculu süreölçer ile tur sürelerini yönetme ve daha fazlası. Tarayıcıda çalışır, kayıt gerekmez, %100 gizli.';
5
+ const description = 'Masa oyunları ve RPG için ücretsiz araçlar: sanal zarlar, istatistikler ve tarayıcıda kayıt gerektirmeyen çok oyunculu süreölçerler.';
6
6
 
7
7
  export const content: CategoryLocaleContent = {
8
8
  slug,
@@ -1,16 +1,16 @@
1
- import { diceRollerSimulator } from '../tool/dice-roller-simulator/entry';
1
+ import { diceRollerSimulator } from '../tool/dice-roller-simulator/entry';
2
2
  import { boardGameTimer } from '../tool/board-game-timer/entry';
3
3
  import { dungeonMapGenerator } from '../tool/dungeon-map-generator/entry';
4
4
  import { encounterDifficultyCalculator } from '../tool/encounter-difficulty-calculator/entry';
5
5
  import { tokenStampStudio } from '../tool/token-stamp-studio/entry';
6
6
  import { musScoreboard } from '../tool/mus-scoreboard/entry';
7
7
  import { rpgSettlementExplorationMapGenerator } from '../tool/rpg-settlement-exploration-map-generator/entry';
8
- import type { CategoryLocaleContent, KnownLocale } from '../types';
9
-
10
- export const tabletopCategory = {
11
- icon: 'mdi:dice-multiple-outline',
12
- tools: [
13
- diceRollerSimulator,
8
+ import type { CategoryLocaleContent, KnownLocale } from '../types';
9
+
10
+ export const tabletopCategory = {
11
+ icon: 'mdi:dice-multiple-outline',
12
+ tools: [
13
+ diceRollerSimulator,
14
14
  boardGameTimer,
15
15
  dungeonMapGenerator,
16
16
  encounterDifficultyCalculator,
@@ -18,21 +18,21 @@ export const tabletopCategory = {
18
18
  musScoreboard,
19
19
  rpgSettlementExplorationMapGenerator,
20
20
  ],
21
- i18n: {
22
- de: () => import('./i18n/de').then((m) => m.content),
23
- en: () => import('./i18n/en').then((m) => m.content),
24
- es: () => import('./i18n/es').then((m) => m.content),
25
- fr: () => import('./i18n/fr').then((m) => m.content),
26
- id: () => import('./i18n/id').then((m) => m.content),
27
- it: () => import('./i18n/it').then((m) => m.content),
28
- ja: () => import('./i18n/ja').then((m) => m.content),
29
- ko: () => import('./i18n/ko').then((m) => m.content),
30
- nl: () => import('./i18n/nl').then((m) => m.content),
31
- pl: () => import('./i18n/pl').then((m) => m.content),
32
- pt: () => import('./i18n/pt').then((m) => m.content),
33
- ru: () => import('./i18n/ru').then((m) => m.content),
34
- sv: () => import('./i18n/sv').then((m) => m.content),
35
- tr: () => import('./i18n/tr').then((m) => m.content),
36
- zh: () => import('./i18n/zh').then((m) => m.content),
37
- } as Partial<Record<KnownLocale, () => Promise<CategoryLocaleContent>>>,
38
- };
21
+ i18n: {
22
+ de: () => import('./i18n/de').then((m) => m.content),
23
+ en: () => import('./i18n/en').then((m) => m.content),
24
+ es: () => import('./i18n/es').then((m) => m.content),
25
+ fr: () => import('./i18n/fr').then((m) => m.content),
26
+ id: () => import('./i18n/id').then((m) => m.content),
27
+ it: () => import('./i18n/it').then((m) => m.content),
28
+ ja: () => import('./i18n/ja').then((m) => m.content),
29
+ ko: () => import('./i18n/ko').then((m) => m.content),
30
+ nl: () => import('./i18n/nl').then((m) => m.content),
31
+ pl: () => import('./i18n/pl').then((m) => m.content),
32
+ pt: () => import('./i18n/pt').then((m) => m.content),
33
+ ru: () => import('./i18n/ru').then((m) => m.content),
34
+ sv: () => import('./i18n/sv').then((m) => m.content),
35
+ tr: () => import('./i18n/tr').then((m) => m.content),
36
+ zh: () => import('./i18n/zh').then((m) => m.content),
37
+ } as Partial<Record<KnownLocale, () => Promise<CategoryLocaleContent>>>,
38
+ };
@@ -113,4 +113,4 @@ const { categoryTitle, tools = [] } = Astro.props;
113
113
  white-space: nowrap;
114
114
  }
115
115
  </style>
116
-
116
+
@@ -140,4 +140,4 @@ const otherLocales = Object.entries(localeUrls).filter(([l]) => l !== currentLoc
140
140
  box-shadow: inset -4px -2px 0 #1e293b;
141
141
  }
142
142
  </style>
143
-
143
+
package/src/entries.ts CHANGED
@@ -1,57 +1,57 @@
1
- export { diceRollerSimulator } from './tool/dice-roller-simulator/entry';
2
- export type { DiceRollerUI, DiceRollerLocaleContent } from './tool/dice-roller-simulator/entry';
3
- export { boardGameTimer } from './tool/board-game-timer/entry';
4
- export type { BoardGameTimerUI, BoardGameTimerLocaleContent } from './tool/board-game-timer/entry';
5
- export { firstPlayerSelector } from './tool/first-player-selector/entry';
6
- export type { FirstPlayerSelectorUI, FirstPlayerSelectorLocaleContent } from './tool/first-player-selector/entry';
7
- export { scoreTracker } from './tool/score-tracker/entry';
8
- export type { ScoreTrackerUI, ScoreTrackerLocaleContent } from './tool/score-tracker/entry';
9
- export { initiativeTracker } from './tool/rpg-initiative-tracker/entry';
10
- export type { InitiativeTrackerUI, InitiativeTrackerLocaleContent } from './tool/rpg-initiative-tracker/entry';
11
- export { fantasyRunesTranslator } from './tool/fantasy-runes-translator/entry';
12
- export type { FantasyRunesTranslatorUI, FantasyRunesTranslatorLocaleContent } from './tool/fantasy-runes-translator/entry';
13
- export { investigationBoard } from './tool/investigation-board/entry';
14
- export type { InvestigationBoardUI, InvestigationBoardLocaleContent } from './tool/investigation-board/entry';
15
- export { lunarTideTracker } from './tool/lunar-tide-tracker/entry';
16
- export type { LunarTideUI, LunarTideLocaleContent } from './tool/lunar-tide-tracker/entry';
17
- export { hiddenRoleDealer } from './tool/hidden-role-dealer/entry';
18
- export type { HiddenRoleDealerUI, HiddenRoleDealerLocaleContent } from './tool/hidden-role-dealer/entry';
19
- export { scatterDirectionSelector } from './tool/scatter-direction-selector/entry';
1
+ export { diceRollerSimulator } from './tool/dice-roller-simulator/entry';
2
+ export type { DiceRollerUI, DiceRollerLocaleContent } from './tool/dice-roller-simulator/entry';
3
+ export { boardGameTimer } from './tool/board-game-timer/entry';
4
+ export type { BoardGameTimerUI, BoardGameTimerLocaleContent } from './tool/board-game-timer/entry';
5
+ export { firstPlayerSelector } from './tool/first-player-selector/entry';
6
+ export type { FirstPlayerSelectorUI, FirstPlayerSelectorLocaleContent } from './tool/first-player-selector/entry';
7
+ export { scoreTracker } from './tool/score-tracker/entry';
8
+ export type { ScoreTrackerUI, ScoreTrackerLocaleContent } from './tool/score-tracker/entry';
9
+ export { initiativeTracker } from './tool/rpg-initiative-tracker/entry';
10
+ export type { InitiativeTrackerUI, InitiativeTrackerLocaleContent } from './tool/rpg-initiative-tracker/entry';
11
+ export { fantasyRunesTranslator } from './tool/fantasy-runes-translator/entry';
12
+ export type { FantasyRunesTranslatorUI, FantasyRunesTranslatorLocaleContent } from './tool/fantasy-runes-translator/entry';
13
+ export { investigationBoard } from './tool/investigation-board/entry';
14
+ export type { InvestigationBoardUI, InvestigationBoardLocaleContent } from './tool/investigation-board/entry';
15
+ export { lunarTideTracker } from './tool/lunar-tide-tracker/entry';
16
+ export type { LunarTideUI, LunarTideLocaleContent } from './tool/lunar-tide-tracker/entry';
17
+ export { hiddenRoleDealer } from './tool/hidden-role-dealer/entry';
18
+ export type { HiddenRoleDealerUI, HiddenRoleDealerLocaleContent } from './tool/hidden-role-dealer/entry';
19
+ export { scatterDirectionSelector } from './tool/scatter-direction-selector/entry';
20
20
  export type { ScatterSelectorUI, ScatterSelectorLocaleContent } from './tool/scatter-direction-selector/entry';
21
21
  export { dungeonMapGenerator } from './tool/dungeon-map-generator/entry';
22
22
  export type { DungeonMapGeneratorUI, DungeonMapGeneratorLocaleContent } from './tool/dungeon-map-generator/entry';
23
23
  export { rpgSettlementExplorationMapGenerator } from './tool/rpg-settlement-exploration-map-generator/entry';
24
24
  export type { SettlementMapUI, SettlementMapLocaleContent } from './tool/rpg-settlement-exploration-map-generator/entry';
25
25
  export { tabletopCategory } from './category';
26
-
27
- import { diceRollerSimulator } from './tool/dice-roller-simulator/entry';
28
- import { boardGameTimer } from './tool/board-game-timer/entry';
29
- import { firstPlayerSelector } from './tool/first-player-selector/entry';
30
- import { scoreTracker } from './tool/score-tracker/entry';
31
- import { initiativeTracker } from './tool/rpg-initiative-tracker/entry';
32
- import { fantasyRunesTranslator } from './tool/fantasy-runes-translator/entry';
33
- import { decisionWheel } from './tool/decision-wheel/entry';
34
- import { investigationBoard } from './tool/investigation-board/entry';
35
- import { lunarTideTracker } from './tool/lunar-tide-tracker/entry';
36
- import { hiddenRoleDealer } from './tool/hidden-role-dealer/entry';
26
+
27
+ import { diceRollerSimulator } from './tool/dice-roller-simulator/entry';
28
+ import { boardGameTimer } from './tool/board-game-timer/entry';
29
+ import { firstPlayerSelector } from './tool/first-player-selector/entry';
30
+ import { scoreTracker } from './tool/score-tracker/entry';
31
+ import { initiativeTracker } from './tool/rpg-initiative-tracker/entry';
32
+ import { fantasyRunesTranslator } from './tool/fantasy-runes-translator/entry';
33
+ import { decisionWheel } from './tool/decision-wheel/entry';
34
+ import { investigationBoard } from './tool/investigation-board/entry';
35
+ import { lunarTideTracker } from './tool/lunar-tide-tracker/entry';
36
+ import { hiddenRoleDealer } from './tool/hidden-role-dealer/entry';
37
37
  import { scatterDirectionSelector } from './tool/scatter-direction-selector/entry';
38
38
  import { dungeonMapGenerator } from './tool/dungeon-map-generator/entry';
39
39
  import { encounterDifficultyCalculator } from './tool/encounter-difficulty-calculator/entry';
40
40
  import { tokenStampStudio } from './tool/token-stamp-studio/entry';
41
41
  import { musScoreboard } from './tool/mus-scoreboard/entry';
42
42
  import { rpgSettlementExplorationMapGenerator } from './tool/rpg-settlement-exploration-map-generator/entry';
43
-
44
- export const ALL_ENTRIES = [
45
- diceRollerSimulator,
46
- boardGameTimer,
47
- firstPlayerSelector,
48
- scoreTracker,
49
- initiativeTracker,
50
- fantasyRunesTranslator,
51
- decisionWheel,
52
- investigationBoard,
53
- lunarTideTracker,
54
- hiddenRoleDealer,
43
+
44
+ export const ALL_ENTRIES = [
45
+ diceRollerSimulator,
46
+ boardGameTimer,
47
+ firstPlayerSelector,
48
+ scoreTracker,
49
+ initiativeTracker,
50
+ fantasyRunesTranslator,
51
+ decisionWheel,
52
+ investigationBoard,
53
+ lunarTideTracker,
54
+ hiddenRoleDealer,
55
55
  scatterDirectionSelector,
56
56
  dungeonMapGenerator,
57
57
  encounterDifficultyCalculator,
@@ -59,4 +59,4 @@ export const ALL_ENTRIES = [
59
59
  musScoreboard,
60
60
  rpgSettlementExplorationMapGenerator,
61
61
  ];
62
-
62
+
package/src/env.d.ts CHANGED
@@ -2,4 +2,4 @@ declare module '*.astro' {
2
2
  const Component: (_props: Record<string, unknown>) => unknown;
3
3
  export default Component;
4
4
  }
5
-
5
+
package/src/index.ts CHANGED
@@ -1,27 +1,27 @@
1
- export { tabletopCategory } from './category';
2
- export const tabletopCategorySEO = () => import('./category/TabletopCategorySEO.astro').then((m) => m.default);
3
-
4
- export { diceRollerSimulator, DICE_ROLLER_SIMULATOR_TOOL } from './tool/dice-roller-simulator';
5
- export { boardGameTimer, BOARD_GAME_TIMER_TOOL } from './tool/board-game-timer';
6
- export { fantasyRunesTranslator, FANTASY_RUNES_TRANSLATOR_TOOL } from './tool/fantasy-runes-translator';
7
- export { investigationBoard, INVESTIGATION_BOARD_TOOL } from './tool/investigation-board';
1
+ export { tabletopCategory } from './category';
2
+ export const tabletopCategorySEO = () => import('./category/TabletopCategorySEO.astro').then((m) => m.default);
3
+
4
+ export { diceRollerSimulator, DICE_ROLLER_SIMULATOR_TOOL } from './tool/dice-roller-simulator';
5
+ export { boardGameTimer, BOARD_GAME_TIMER_TOOL } from './tool/board-game-timer';
6
+ export { fantasyRunesTranslator, FANTASY_RUNES_TRANSLATOR_TOOL } from './tool/fantasy-runes-translator';
7
+ export { investigationBoard, INVESTIGATION_BOARD_TOOL } from './tool/investigation-board';
8
8
  export { lunarTideTracker, LUNAR_TIDE_TRACKER_TOOL } from './tool/lunar-tide-tracker';
9
9
  export { dungeonMapGenerator, DUNGEON_MAP_GENERATOR_TOOL } from './tool/dungeon-map-generator';
10
10
  export { tokenStampStudio, TOKEN_STAMP_STUDIO_TOOL } from './tool/token-stamp-studio';
11
-
12
-
13
- export type {
14
- KnownLocale,
15
- FAQItem,
16
- BibliographyEntry,
17
- HowToStep,
18
- ToolLocaleContent,
19
- CategoryLocaleContent,
20
- LocaleLoader,
21
- LocaleMap,
22
- TabletopToolEntry,
23
- TabletopCategoryEntry,
24
- ToolDefinition,
25
- } from './types';
26
-
27
- export { ALL_ENTRIES, ALL_TOOLS } from './tools';
11
+
12
+
13
+ export type {
14
+ KnownLocale,
15
+ FAQItem,
16
+ BibliographyEntry,
17
+ HowToStep,
18
+ ToolLocaleContent,
19
+ CategoryLocaleContent,
20
+ LocaleLoader,
21
+ LocaleMap,
22
+ TabletopToolEntry,
23
+ TabletopCategoryEntry,
24
+ ToolDefinition,
25
+ } from './types';
26
+
27
+ export { ALL_ENTRIES, ALL_TOOLS } from './tools';
@@ -1,75 +1,75 @@
1
- ---
2
- import "@jjlmoya/utils-shared/theme.css";
3
- import PreviewToolbar from "../components/PreviewToolbar.astro";
4
- import type { KnownLocale } from "../types";
5
-
6
- interface Props {
7
- title: string;
8
- currentLocale?: KnownLocale;
9
- localeUrls?: Partial<Record<KnownLocale, string>>;
10
- hasSidebar?: boolean;
11
- }
12
-
13
- const { title, currentLocale = "es", localeUrls = {}, hasSidebar = false } = Astro.props;
14
- ---
15
-
16
- <!doctype html>
17
- <html lang={currentLocale}>
18
- <head>
19
- <meta charset="UTF-8" />
20
- <meta name="viewport" content="width=device-width" />
21
- <title>{title} · preview</title>
22
- <link rel="preconnect" href="https://fonts.googleapis.com" />
23
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
24
- <link
25
- href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap"
26
- rel="stylesheet"
27
- />
28
-
29
- <script is:inline>
30
- (function () {
31
- const saved = localStorage.getItem("theme") || "theme-dark";
32
- document.documentElement.classList.add(saved);
33
- })();
34
- </script>
35
- <slot name="head" />
36
- </head>
37
- <body>
38
- <PreviewToolbar currentLocale={currentLocale} localeUrls={localeUrls} />
39
- <div class:list={["page-wrapper", { "with-sidebar": hasSidebar }]}>
40
- {
41
- hasSidebar && (
42
- <aside class="sidebar-area">
43
- <slot name="sidebar" />
44
- </aside>
45
- )
46
- }
47
- <main>
48
- <slot />
49
- </main>
50
- </div>
51
- </body>
52
- </html>
53
-
54
- <style is:global>
55
- :root {
56
- --accent: #f43f5e;
57
- --primary-base: #9f1239;
58
- --cyan: #06b6d4;
59
- }
60
-
61
- .theme-dark,
62
- .theme-light {
63
- --text-main: var(--text-base);
64
- --border-color: var(--border-base);
65
- }
66
-
67
- *,
68
- *::before,
69
- *::after {
70
- box-sizing: border-box;
71
- }
72
-
1
+ ---
2
+ import "@jjlmoya/utils-shared/theme.css";
3
+ import PreviewToolbar from "../components/PreviewToolbar.astro";
4
+ import type { KnownLocale } from "../types";
5
+
6
+ interface Props {
7
+ title: string;
8
+ currentLocale?: KnownLocale;
9
+ localeUrls?: Partial<Record<KnownLocale, string>>;
10
+ hasSidebar?: boolean;
11
+ }
12
+
13
+ const { title, currentLocale = "es", localeUrls = {}, hasSidebar = false } = Astro.props;
14
+ ---
15
+
16
+ <!doctype html>
17
+ <html lang={currentLocale}>
18
+ <head>
19
+ <meta charset="UTF-8" />
20
+ <meta name="viewport" content="width=device-width" />
21
+ <title>{title} · preview</title>
22
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
23
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
24
+ <link
25
+ href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap"
26
+ rel="stylesheet"
27
+ />
28
+
29
+ <script is:inline>
30
+ (function () {
31
+ const saved = localStorage.getItem("theme") || "theme-dark";
32
+ document.documentElement.classList.add(saved);
33
+ })();
34
+ </script>
35
+ <slot name="head" />
36
+ </head>
37
+ <body>
38
+ <PreviewToolbar currentLocale={currentLocale} localeUrls={localeUrls} />
39
+ <div class:list={["page-wrapper", { "with-sidebar": hasSidebar }]}>
40
+ {
41
+ hasSidebar && (
42
+ <aside class="sidebar-area">
43
+ <slot name="sidebar" />
44
+ </aside>
45
+ )
46
+ }
47
+ <main>
48
+ <slot />
49
+ </main>
50
+ </div>
51
+ </body>
52
+ </html>
53
+
54
+ <style is:global>
55
+ :root {
56
+ --accent: #f43f5e;
57
+ --primary-base: #9f1239;
58
+ --cyan: #06b6d4;
59
+ }
60
+
61
+ .theme-dark,
62
+ .theme-light {
63
+ --text-main: var(--text-base);
64
+ --border-color: var(--border-base);
65
+ }
66
+
67
+ *,
68
+ *::before,
69
+ *::after {
70
+ box-sizing: border-box;
71
+ }
72
+
73
73
  body {
74
74
  background-color: var(--bg-page);
75
75
  color: var(--text-base);
@@ -79,8 +79,8 @@ const { title, currentLocale = "es", localeUrls = {}, hasSidebar = false } = Ast
79
79
  transition:
80
80
  background-color 0.3s ease,
81
81
  color 0.3s ease;
82
- }
83
-
82
+ }
83
+
84
84
  main {
85
85
  padding: 0 2rem;
86
86
  }
@@ -89,23 +89,23 @@ const { title, currentLocale = "es", localeUrls = {}, hasSidebar = false } = Ast
89
89
  display: flex;
90
90
  flex-direction: column;
91
91
  }
92
-
93
- .page-wrapper.with-sidebar {
94
- display: grid;
95
- grid-template-columns: 240px 1fr;
96
- min-height: 100vh;
97
- }
98
-
99
- .sidebar-area {
100
- position: sticky;
101
- top: 0;
102
- height: 100vh;
103
- overflow-y: auto;
104
- border-right: 1px solid var(--border-color);
105
- background: var(--bg-page);
106
- }
107
-
108
- @media (max-width: 768px) {
92
+
93
+ .page-wrapper.with-sidebar {
94
+ display: grid;
95
+ grid-template-columns: 240px 1fr;
96
+ min-height: 100vh;
97
+ }
98
+
99
+ .sidebar-area {
100
+ position: sticky;
101
+ top: 0;
102
+ height: 100vh;
103
+ overflow-y: auto;
104
+ border-right: 1px solid var(--border-color);
105
+ background: var(--bg-page);
106
+ }
107
+
108
+ @media (max-width: 768px) {
109
109
  .page-wrapper.with-sidebar {
110
110
  grid-template-columns: 1fr;
111
111
  }
@@ -114,5 +114,5 @@ const { title, currentLocale = "es", localeUrls = {}, hasSidebar = false } = Ast
114
114
  display: none;
115
115
  }
116
116
  }
117
- </style>
118
-
117
+ </style>
118
+