@jjlmoya/utils-tabletop 1.3.0 → 1.5.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 (171) hide show
  1. package/package.json +1 -1
  2. package/src/category/TabletopCategorySEO.astro +2 -7
  3. package/src/category/i18n/en.ts +4 -4
  4. package/src/category/i18n/ru.ts +2 -2
  5. package/src/category/i18n/zh.ts +8 -8
  6. package/src/category/index.ts +2 -1
  7. package/src/entries.ts +14 -1
  8. package/src/index.ts +1 -0
  9. package/src/pages/[locale]/[slug].astro +7 -6
  10. package/src/tests/locale_completeness.test.ts +1 -1
  11. package/src/tests/no_em_dash.test.ts +47 -0
  12. package/src/tests/seo_length.test.ts +1 -0
  13. package/src/tests/title_quality.test.ts +1 -1
  14. package/src/tests/tool_validation.test.ts +1 -1
  15. package/src/tool/board-game-timer/modules/ColorHelper.ts +2 -2
  16. package/src/tool/board-game-timer/modules/DuelViewManager.ts +4 -4
  17. package/src/tool/board-game-timer/modules/GameRunner.ts +1 -1
  18. package/src/tool/board-game-timer/modules/MultiplayerViewManager.ts +2 -2
  19. package/src/tool/board-game-timer/modules/SetupPanelManager.ts +1 -1
  20. package/src/tool/board-game-timer/modules/TimerEngine.ts +1 -1
  21. package/src/tool/board-game-timer/types.ts +1 -1
  22. package/src/tool/decision-wheel/audio.ts +78 -0
  23. package/src/tool/decision-wheel/bibliography.astro +16 -0
  24. package/src/tool/decision-wheel/bibliography.ts +8 -0
  25. package/src/tool/decision-wheel/client.ts +226 -0
  26. package/src/tool/decision-wheel/component.astro +48 -0
  27. package/src/tool/decision-wheel/components/SegmentEditor.astro +22 -0
  28. package/src/tool/decision-wheel/components/SpinHistory.astro +17 -0
  29. package/src/tool/decision-wheel/components/SpinResult.astro +13 -0
  30. package/src/tool/decision-wheel/components/WheelCanvas.astro +23 -0
  31. package/src/tool/decision-wheel/decision-wheel.css +632 -0
  32. package/src/tool/decision-wheel/drawing.ts +144 -0
  33. package/src/tool/decision-wheel/entry.ts +48 -0
  34. package/src/tool/decision-wheel/i18n/de.ts +97 -0
  35. package/src/tool/decision-wheel/i18n/en.ts +251 -0
  36. package/src/tool/decision-wheel/i18n/es.ts +93 -0
  37. package/src/tool/decision-wheel/i18n/fr.ts +93 -0
  38. package/src/tool/decision-wheel/i18n/id.ts +93 -0
  39. package/src/tool/decision-wheel/i18n/it.ts +93 -0
  40. package/src/tool/decision-wheel/i18n/ja.ts +93 -0
  41. package/src/tool/decision-wheel/i18n/ko.ts +93 -0
  42. package/src/tool/decision-wheel/i18n/nl.ts +93 -0
  43. package/src/tool/decision-wheel/i18n/pl.ts +93 -0
  44. package/src/tool/decision-wheel/i18n/pt.ts +93 -0
  45. package/src/tool/decision-wheel/i18n/ru.ts +75 -0
  46. package/src/tool/decision-wheel/i18n/sv.ts +93 -0
  47. package/src/tool/decision-wheel/i18n/tr.ts +93 -0
  48. package/src/tool/decision-wheel/i18n/zh.ts +93 -0
  49. package/src/tool/decision-wheel/index.ts +9 -0
  50. package/src/tool/decision-wheel/logic.test.ts +163 -0
  51. package/src/tool/decision-wheel/logic.ts +145 -0
  52. package/src/tool/decision-wheel/seo.astro +16 -0
  53. package/src/tool/decision-wheel/types.ts +14 -0
  54. package/src/tool/decision-wheel/ui.ts +121 -0
  55. package/src/tool/dice-roller-simulator/client.ts +2 -2
  56. package/src/tool/dice-roller-simulator/i18n/ru.ts +8 -8
  57. package/src/tool/dice-roller-simulator/modules/history.ts +1 -1
  58. package/src/tool/fantasy-runes-translator/bibliography.astro +16 -0
  59. package/src/tool/fantasy-runes-translator/bibliography.ts +16 -0
  60. package/src/tool/fantasy-runes-translator/client.ts +205 -0
  61. package/src/tool/fantasy-runes-translator/component.astro +95 -0
  62. package/src/tool/fantasy-runes-translator/entry.ts +56 -0
  63. package/src/tool/fantasy-runes-translator/fantasy-runes-translator.css +712 -0
  64. package/src/tool/fantasy-runes-translator/i18n/de.ts +139 -0
  65. package/src/tool/fantasy-runes-translator/i18n/en.ts +139 -0
  66. package/src/tool/fantasy-runes-translator/i18n/es.ts +139 -0
  67. package/src/tool/fantasy-runes-translator/i18n/fr.ts +139 -0
  68. package/src/tool/fantasy-runes-translator/i18n/id.ts +139 -0
  69. package/src/tool/fantasy-runes-translator/i18n/it.ts +139 -0
  70. package/src/tool/fantasy-runes-translator/i18n/ja.ts +139 -0
  71. package/src/tool/fantasy-runes-translator/i18n/ko.ts +139 -0
  72. package/src/tool/fantasy-runes-translator/i18n/nl.ts +139 -0
  73. package/src/tool/fantasy-runes-translator/i18n/pl.ts +139 -0
  74. package/src/tool/fantasy-runes-translator/i18n/pt.ts +139 -0
  75. package/src/tool/fantasy-runes-translator/i18n/ru.ts +139 -0
  76. package/src/tool/fantasy-runes-translator/i18n/sv.ts +139 -0
  77. package/src/tool/fantasy-runes-translator/i18n/tr.ts +139 -0
  78. package/src/tool/fantasy-runes-translator/i18n/zh.ts +139 -0
  79. package/src/tool/fantasy-runes-translator/index.ts +9 -0
  80. package/src/tool/fantasy-runes-translator/logic.ts +174 -0
  81. package/src/tool/fantasy-runes-translator/seo.astro +16 -0
  82. package/src/tool/fantasy-runes-translator/types.ts +26 -0
  83. package/src/tool/first-player-selector/bibliography.astro +16 -0
  84. package/src/tool/first-player-selector/bibliography.ts +12 -0
  85. package/src/tool/first-player-selector/client.ts +197 -0
  86. package/src/tool/first-player-selector/component.astro +77 -0
  87. package/src/tool/first-player-selector/entry.ts +42 -0
  88. package/src/tool/first-player-selector/first-player-selector.css +303 -0
  89. package/src/tool/first-player-selector/i18n/de.ts +226 -0
  90. package/src/tool/first-player-selector/i18n/en.ts +226 -0
  91. package/src/tool/first-player-selector/i18n/es.ts +226 -0
  92. package/src/tool/first-player-selector/i18n/fr.ts +227 -0
  93. package/src/tool/first-player-selector/i18n/id.ts +226 -0
  94. package/src/tool/first-player-selector/i18n/it.ts +227 -0
  95. package/src/tool/first-player-selector/i18n/ja.ts +227 -0
  96. package/src/tool/first-player-selector/i18n/ko.ts +227 -0
  97. package/src/tool/first-player-selector/i18n/nl.ts +226 -0
  98. package/src/tool/first-player-selector/i18n/pl.ts +227 -0
  99. package/src/tool/first-player-selector/i18n/pt.ts +226 -0
  100. package/src/tool/first-player-selector/i18n/ru.ts +227 -0
  101. package/src/tool/first-player-selector/i18n/sv.ts +226 -0
  102. package/src/tool/first-player-selector/i18n/tr.ts +226 -0
  103. package/src/tool/first-player-selector/i18n/zh.ts +227 -0
  104. package/src/tool/first-player-selector/index.ts +9 -0
  105. package/src/tool/first-player-selector/modules/AnimationEffects.ts +256 -0
  106. package/src/tool/first-player-selector/modules/SelectionEngine.ts +249 -0
  107. package/src/tool/first-player-selector/modules/SoundEffects.ts +87 -0
  108. package/src/tool/first-player-selector/modules/TouchTracker.ts +148 -0
  109. package/src/tool/first-player-selector/seo.astro +16 -0
  110. package/src/tool/first-player-selector/types.ts +21 -0
  111. package/src/tool/rpg-initiative-tracker/bibliography.astro +16 -0
  112. package/src/tool/rpg-initiative-tracker/bibliography.ts +12 -0
  113. package/src/tool/rpg-initiative-tracker/client.ts +201 -0
  114. package/src/tool/rpg-initiative-tracker/component.astro +23 -0
  115. package/src/tool/rpg-initiative-tracker/components/AddForm.astro +49 -0
  116. package/src/tool/rpg-initiative-tracker/components/CombatantList.astro +16 -0
  117. package/src/tool/rpg-initiative-tracker/components/TurnControls.astro +28 -0
  118. package/src/tool/rpg-initiative-tracker/entry.ts +50 -0
  119. package/src/tool/rpg-initiative-tracker/i18n/de.ts +266 -0
  120. package/src/tool/rpg-initiative-tracker/i18n/en.ts +263 -0
  121. package/src/tool/rpg-initiative-tracker/i18n/es.ts +264 -0
  122. package/src/tool/rpg-initiative-tracker/i18n/fr.ts +263 -0
  123. package/src/tool/rpg-initiative-tracker/i18n/id.ts +263 -0
  124. package/src/tool/rpg-initiative-tracker/i18n/it.ts +263 -0
  125. package/src/tool/rpg-initiative-tracker/i18n/ja.ts +263 -0
  126. package/src/tool/rpg-initiative-tracker/i18n/ko.ts +263 -0
  127. package/src/tool/rpg-initiative-tracker/i18n/nl.ts +263 -0
  128. package/src/tool/rpg-initiative-tracker/i18n/pl.ts +264 -0
  129. package/src/tool/rpg-initiative-tracker/i18n/pt.ts +263 -0
  130. package/src/tool/rpg-initiative-tracker/i18n/ru.ts +264 -0
  131. package/src/tool/rpg-initiative-tracker/i18n/sv.ts +263 -0
  132. package/src/tool/rpg-initiative-tracker/i18n/tr.ts +263 -0
  133. package/src/tool/rpg-initiative-tracker/i18n/zh.ts +263 -0
  134. package/src/tool/rpg-initiative-tracker/index.ts +9 -0
  135. package/src/tool/rpg-initiative-tracker/logic.test.ts +121 -0
  136. package/src/tool/rpg-initiative-tracker/logic.ts +122 -0
  137. package/src/tool/rpg-initiative-tracker/rpg-initiative-tracker.css +617 -0
  138. package/src/tool/rpg-initiative-tracker/seo.astro +16 -0
  139. package/src/tool/rpg-initiative-tracker/types.ts +15 -0
  140. package/src/tool/score-tracker/bibliography.astro +16 -0
  141. package/src/tool/score-tracker/bibliography.ts +12 -0
  142. package/src/tool/score-tracker/client.ts +248 -0
  143. package/src/tool/score-tracker/component.astro +34 -0
  144. package/src/tool/score-tracker/components/Leaderboard.astro +19 -0
  145. package/src/tool/score-tracker/components/PlayerSetup.astro +32 -0
  146. package/src/tool/score-tracker/components/RoundScoring.astro +22 -0
  147. package/src/tool/score-tracker/components/ScoreHistory.astro +25 -0
  148. package/src/tool/score-tracker/entry.ts +57 -0
  149. package/src/tool/score-tracker/i18n/de.ts +278 -0
  150. package/src/tool/score-tracker/i18n/en.ts +278 -0
  151. package/src/tool/score-tracker/i18n/es.ts +251 -0
  152. package/src/tool/score-tracker/i18n/fr.ts +278 -0
  153. package/src/tool/score-tracker/i18n/id.ts +278 -0
  154. package/src/tool/score-tracker/i18n/it.ts +278 -0
  155. package/src/tool/score-tracker/i18n/ja.ts +278 -0
  156. package/src/tool/score-tracker/i18n/ko.ts +278 -0
  157. package/src/tool/score-tracker/i18n/nl.ts +278 -0
  158. package/src/tool/score-tracker/i18n/pl.ts +278 -0
  159. package/src/tool/score-tracker/i18n/pt.ts +278 -0
  160. package/src/tool/score-tracker/i18n/ru.ts +278 -0
  161. package/src/tool/score-tracker/i18n/sv.ts +278 -0
  162. package/src/tool/score-tracker/i18n/tr.ts +278 -0
  163. package/src/tool/score-tracker/i18n/zh.ts +278 -0
  164. package/src/tool/score-tracker/index.ts +9 -0
  165. package/src/tool/score-tracker/logic.test.ts +83 -0
  166. package/src/tool/score-tracker/logic.ts +122 -0
  167. package/src/tool/score-tracker/score-tracker.css +1029 -0
  168. package/src/tool/score-tracker/seo.astro +16 -0
  169. package/src/tool/score-tracker/types.ts +17 -0
  170. package/src/tools.ts +10 -0
  171. package/src/types.ts +1 -2
@@ -0,0 +1,95 @@
1
+ ---
2
+ import './fantasy-runes-translator.css';
3
+
4
+ interface Props {
5
+ ui: Record<string, string>;
6
+ }
7
+
8
+ const { ui } = Astro.props;
9
+ ---
10
+
11
+ <div class="runes-wrap" data-ui={JSON.stringify(ui)}>
12
+ <div class="runes-top-bar">
13
+ <div class="alphabet-pills" id="alphabet-pills">
14
+ <button type="button" class="pill" data-alphabet="elder-futhark"><span class="pill-rune">&#x16A8;</span><span class="pill-label">{ui.elderFuthark}</span></button>
15
+ <button type="button" class="pill" data-alphabet="anglo-saxon"><span class="pill-rune">&#x16AA;</span><span class="pill-label">{ui.angloSaxon}</span></button>
16
+ <button type="button" class="pill" data-alphabet="fantasy"><span class="pill-rune">&#x16DF;</span><span class="pill-label">{ui.fantasy}</span></button>
17
+ <button type="button" class="pill" data-alphabet="theban"><span class="pill-rune">&#x16A0;</span><span class="pill-label">{ui.theban}</span></button>
18
+ <button type="button" class="pill" data-alphabet="enochian"><span class="pill-rune">&#x16C1;</span><span class="pill-label">{ui.enochian}</span></button>
19
+ <button type="button" class="pill" data-alphabet="daemonic"><span class="pill-rune">&#x16CA;</span><span class="pill-label">{ui.daemonic}</span></button>
20
+ <button type="button" class="pill" data-alphabet="ogham"><span class="pill-rune">&#x16D7;</span><span class="pill-label">{ui.ogham}</span></button>
21
+ </div>
22
+ <button type="button" class="seed-cog" id="seed-toggle-btn" title="Seed">&#x2699;</button>
23
+ </div>
24
+
25
+ <div class="seed-drawer" id="seed-drawer">
26
+ <div class="seed-inner">
27
+ <div class="seed-field">
28
+ <input type="number" id="runes-seed" placeholder={ui.seedPlaceholder} min="1" max="999999" />
29
+ <button type="button" class="seed-shuffle" id="seed-shuffle-btn">&#x21BB;</button>
30
+ </div>
31
+ <span class="seed-tag" id="seed-tag">{ui.seedApplied}</span>
32
+ <span class="seed-hint">Shuffles which rune matches each letter</span>
33
+ </div>
34
+ </div>
35
+
36
+ <div class="runes-input-area">
37
+ <input type="text" id="runes-input" placeholder={ui.inputPlaceholder} autocomplete="off" />
38
+ </div>
39
+
40
+ <div class="runes-output" id="runes-output">
41
+ <div class="runes-output-empty">
42
+ <span class="empty-rune">&#x16DF;</span>
43
+ <span class="empty-label">{ui.noInput}</span>
44
+ </div>
45
+ </div>
46
+
47
+ <div class="detail-card" id="detail-card">
48
+ <div class="detail-row">
49
+ <span class="detail-lbl">NAME</span>
50
+ <span class="detail-val" id="detail-name"></span>
51
+ </div>
52
+ <div class="detail-row">
53
+ <span class="detail-lbl">MEANING</span>
54
+ <span class="detail-val" id="detail-meaning"></span>
55
+ </div>
56
+ <div class="detail-row">
57
+ <span class="detail-lbl">SOUND</span>
58
+ <span class="detail-val" id="detail-phonetic"></span>
59
+ </div>
60
+ </div>
61
+
62
+ <div class="runes-bottom-bar">
63
+ <button type="button" class="bot-btn gm-reveal" id="runes-gm-btn">
64
+ <svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>
65
+ {ui.gmMode}
66
+ </button>
67
+ <div class="bot-spacer"></div>
68
+ <button type="button" class="bot-btn" id="runes-copy-btn" title={ui.copy}>
69
+ <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>
70
+ </button>
71
+ <button type="button" class="bot-btn" id="runes-clear-btn" title={ui.clear}>
72
+ <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
73
+ </button>
74
+ <button type="button" class="bot-btn" id="runes-ref-all-btn" title="Full Alphabet">
75
+ <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"/></svg>
76
+ </button>
77
+ <button type="button" class="bot-btn" id="runes-ref-found-btn" title="Discovered">
78
+ <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4"/><circle cx="12" cy="8" r="0.5" fill="currentColor"/></svg>
79
+ </button>
80
+ </div>
81
+ </div>
82
+
83
+ <div class="ref-overlay" id="ref-overlay">
84
+ <button type="button" class="ref-close" id="ref-close-btn">&#x2715;</button>
85
+ <div class="ref-title" id="ref-title">Rune Dictionary</div>
86
+ <div class="ref-grid" id="ref-grid"></div>
87
+ </div>
88
+
89
+ <div class="gm-overlay" id="gm-overlay">
90
+ <div class="gm-particles" id="gm-particles"></div>
91
+ <button type="button" class="gm-exit" id="gm-exit-btn">{ui.exitGmMode}</button>
92
+ <div class="gm-runes" id="gm-runes"></div>
93
+ </div>
94
+
95
+ <script src="./client.ts"></script>
@@ -0,0 +1,56 @@
1
+ import type { TabletopToolEntry, ToolLocaleContent } from '../../types';
2
+
3
+ export type FantasyRunesTranslatorUI = {
4
+ title: string;
5
+ inputPlaceholder: string;
6
+ alphabetLabel: string;
7
+ elderFuthark: string;
8
+ angloSaxon: string;
9
+ fantasy: string;
10
+ theban: string;
11
+ enochian: string;
12
+ daemonic: string;
13
+ ogham: string;
14
+ translate: string;
15
+ clear: string;
16
+ copy: string;
17
+ copied: string;
18
+ runeName: string;
19
+ runeMeaning: string;
20
+ runePhonetic: string;
21
+ clickHint: string;
22
+ outputLabel: string;
23
+ noInput: string;
24
+ unknownChar: string;
25
+ gmMode: string;
26
+ exitGmMode: string;
27
+ gmHint: string;
28
+ seedLabel: string;
29
+ seedPlaceholder: string;
30
+ seedApplied: string;
31
+ shuffleSeed: string;
32
+ };
33
+
34
+ export type FantasyRunesTranslatorLocaleContent = ToolLocaleContent<FantasyRunesTranslatorUI>;
35
+
36
+ export const fantasyRunesTranslator: TabletopToolEntry<FantasyRunesTranslatorUI> = {
37
+ id: 'fantasy-runes-translator',
38
+ icons: { bg: 'mdi:run-fast', fg: 'mdi:run-fast' },
39
+ i18n: {
40
+ en: () => import('./i18n/en').then((m) => m.content),
41
+ de: () => import('./i18n/de').then((m) => m.content),
42
+ es: () => import('./i18n/es').then((m) => m.content),
43
+ fr: () => import('./i18n/fr').then((m) => m.content),
44
+ it: () => import('./i18n/it').then((m) => m.content),
45
+ nl: () => import('./i18n/nl').then((m) => m.content),
46
+ pt: () => import('./i18n/pt').then((m) => m.content),
47
+ sv: () => import('./i18n/sv').then((m) => m.content),
48
+ id: () => import('./i18n/id').then((m) => m.content),
49
+ pl: () => import('./i18n/pl').then((m) => m.content),
50
+ ru: () => import('./i18n/ru').then((m) => m.content),
51
+ tr: () => import('./i18n/tr').then((m) => m.content),
52
+ ja: () => import('./i18n/ja').then((m) => m.content),
53
+ ko: () => import('./i18n/ko').then((m) => m.content),
54
+ zh: () => import('./i18n/zh').then((m) => m.content),
55
+ },
56
+ };