@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.
- package/package.json +1 -1
- package/src/category/TabletopCategorySEO.astro +2 -7
- package/src/category/i18n/en.ts +4 -4
- package/src/category/i18n/ru.ts +2 -2
- package/src/category/i18n/zh.ts +8 -8
- package/src/category/index.ts +2 -1
- package/src/entries.ts +14 -1
- package/src/index.ts +1 -0
- package/src/pages/[locale]/[slug].astro +7 -6
- package/src/tests/locale_completeness.test.ts +1 -1
- package/src/tests/no_em_dash.test.ts +47 -0
- package/src/tests/seo_length.test.ts +1 -0
- package/src/tests/title_quality.test.ts +1 -1
- package/src/tests/tool_validation.test.ts +1 -1
- package/src/tool/board-game-timer/modules/ColorHelper.ts +2 -2
- package/src/tool/board-game-timer/modules/DuelViewManager.ts +4 -4
- package/src/tool/board-game-timer/modules/GameRunner.ts +1 -1
- package/src/tool/board-game-timer/modules/MultiplayerViewManager.ts +2 -2
- package/src/tool/board-game-timer/modules/SetupPanelManager.ts +1 -1
- package/src/tool/board-game-timer/modules/TimerEngine.ts +1 -1
- package/src/tool/board-game-timer/types.ts +1 -1
- package/src/tool/decision-wheel/audio.ts +78 -0
- package/src/tool/decision-wheel/bibliography.astro +16 -0
- package/src/tool/decision-wheel/bibliography.ts +8 -0
- package/src/tool/decision-wheel/client.ts +226 -0
- package/src/tool/decision-wheel/component.astro +48 -0
- package/src/tool/decision-wheel/components/SegmentEditor.astro +22 -0
- package/src/tool/decision-wheel/components/SpinHistory.astro +17 -0
- package/src/tool/decision-wheel/components/SpinResult.astro +13 -0
- package/src/tool/decision-wheel/components/WheelCanvas.astro +23 -0
- package/src/tool/decision-wheel/decision-wheel.css +632 -0
- package/src/tool/decision-wheel/drawing.ts +144 -0
- package/src/tool/decision-wheel/entry.ts +48 -0
- package/src/tool/decision-wheel/i18n/de.ts +97 -0
- package/src/tool/decision-wheel/i18n/en.ts +251 -0
- package/src/tool/decision-wheel/i18n/es.ts +93 -0
- package/src/tool/decision-wheel/i18n/fr.ts +93 -0
- package/src/tool/decision-wheel/i18n/id.ts +93 -0
- package/src/tool/decision-wheel/i18n/it.ts +93 -0
- package/src/tool/decision-wheel/i18n/ja.ts +93 -0
- package/src/tool/decision-wheel/i18n/ko.ts +93 -0
- package/src/tool/decision-wheel/i18n/nl.ts +93 -0
- package/src/tool/decision-wheel/i18n/pl.ts +93 -0
- package/src/tool/decision-wheel/i18n/pt.ts +93 -0
- package/src/tool/decision-wheel/i18n/ru.ts +75 -0
- package/src/tool/decision-wheel/i18n/sv.ts +93 -0
- package/src/tool/decision-wheel/i18n/tr.ts +93 -0
- package/src/tool/decision-wheel/i18n/zh.ts +93 -0
- package/src/tool/decision-wheel/index.ts +9 -0
- package/src/tool/decision-wheel/logic.test.ts +163 -0
- package/src/tool/decision-wheel/logic.ts +145 -0
- package/src/tool/decision-wheel/seo.astro +16 -0
- package/src/tool/decision-wheel/types.ts +14 -0
- package/src/tool/decision-wheel/ui.ts +121 -0
- package/src/tool/dice-roller-simulator/client.ts +2 -2
- package/src/tool/dice-roller-simulator/i18n/ru.ts +8 -8
- package/src/tool/dice-roller-simulator/modules/history.ts +1 -1
- package/src/tool/fantasy-runes-translator/bibliography.astro +16 -0
- package/src/tool/fantasy-runes-translator/bibliography.ts +16 -0
- package/src/tool/fantasy-runes-translator/client.ts +205 -0
- package/src/tool/fantasy-runes-translator/component.astro +95 -0
- package/src/tool/fantasy-runes-translator/entry.ts +56 -0
- package/src/tool/fantasy-runes-translator/fantasy-runes-translator.css +712 -0
- package/src/tool/fantasy-runes-translator/i18n/de.ts +139 -0
- package/src/tool/fantasy-runes-translator/i18n/en.ts +139 -0
- package/src/tool/fantasy-runes-translator/i18n/es.ts +139 -0
- package/src/tool/fantasy-runes-translator/i18n/fr.ts +139 -0
- package/src/tool/fantasy-runes-translator/i18n/id.ts +139 -0
- package/src/tool/fantasy-runes-translator/i18n/it.ts +139 -0
- package/src/tool/fantasy-runes-translator/i18n/ja.ts +139 -0
- package/src/tool/fantasy-runes-translator/i18n/ko.ts +139 -0
- package/src/tool/fantasy-runes-translator/i18n/nl.ts +139 -0
- package/src/tool/fantasy-runes-translator/i18n/pl.ts +139 -0
- package/src/tool/fantasy-runes-translator/i18n/pt.ts +139 -0
- package/src/tool/fantasy-runes-translator/i18n/ru.ts +139 -0
- package/src/tool/fantasy-runes-translator/i18n/sv.ts +139 -0
- package/src/tool/fantasy-runes-translator/i18n/tr.ts +139 -0
- package/src/tool/fantasy-runes-translator/i18n/zh.ts +139 -0
- package/src/tool/fantasy-runes-translator/index.ts +9 -0
- package/src/tool/fantasy-runes-translator/logic.ts +174 -0
- package/src/tool/fantasy-runes-translator/seo.astro +16 -0
- package/src/tool/fantasy-runes-translator/types.ts +26 -0
- package/src/tool/first-player-selector/bibliography.astro +16 -0
- package/src/tool/first-player-selector/bibliography.ts +12 -0
- package/src/tool/first-player-selector/client.ts +197 -0
- package/src/tool/first-player-selector/component.astro +77 -0
- package/src/tool/first-player-selector/entry.ts +42 -0
- package/src/tool/first-player-selector/first-player-selector.css +303 -0
- package/src/tool/first-player-selector/i18n/de.ts +226 -0
- package/src/tool/first-player-selector/i18n/en.ts +226 -0
- package/src/tool/first-player-selector/i18n/es.ts +226 -0
- package/src/tool/first-player-selector/i18n/fr.ts +227 -0
- package/src/tool/first-player-selector/i18n/id.ts +226 -0
- package/src/tool/first-player-selector/i18n/it.ts +227 -0
- package/src/tool/first-player-selector/i18n/ja.ts +227 -0
- package/src/tool/first-player-selector/i18n/ko.ts +227 -0
- package/src/tool/first-player-selector/i18n/nl.ts +226 -0
- package/src/tool/first-player-selector/i18n/pl.ts +227 -0
- package/src/tool/first-player-selector/i18n/pt.ts +226 -0
- package/src/tool/first-player-selector/i18n/ru.ts +227 -0
- package/src/tool/first-player-selector/i18n/sv.ts +226 -0
- package/src/tool/first-player-selector/i18n/tr.ts +226 -0
- package/src/tool/first-player-selector/i18n/zh.ts +227 -0
- package/src/tool/first-player-selector/index.ts +9 -0
- package/src/tool/first-player-selector/modules/AnimationEffects.ts +256 -0
- package/src/tool/first-player-selector/modules/SelectionEngine.ts +249 -0
- package/src/tool/first-player-selector/modules/SoundEffects.ts +87 -0
- package/src/tool/first-player-selector/modules/TouchTracker.ts +148 -0
- package/src/tool/first-player-selector/seo.astro +16 -0
- package/src/tool/first-player-selector/types.ts +21 -0
- package/src/tool/rpg-initiative-tracker/bibliography.astro +16 -0
- package/src/tool/rpg-initiative-tracker/bibliography.ts +12 -0
- package/src/tool/rpg-initiative-tracker/client.ts +201 -0
- package/src/tool/rpg-initiative-tracker/component.astro +23 -0
- package/src/tool/rpg-initiative-tracker/components/AddForm.astro +49 -0
- package/src/tool/rpg-initiative-tracker/components/CombatantList.astro +16 -0
- package/src/tool/rpg-initiative-tracker/components/TurnControls.astro +28 -0
- package/src/tool/rpg-initiative-tracker/entry.ts +50 -0
- package/src/tool/rpg-initiative-tracker/i18n/de.ts +266 -0
- package/src/tool/rpg-initiative-tracker/i18n/en.ts +263 -0
- package/src/tool/rpg-initiative-tracker/i18n/es.ts +264 -0
- package/src/tool/rpg-initiative-tracker/i18n/fr.ts +263 -0
- package/src/tool/rpg-initiative-tracker/i18n/id.ts +263 -0
- package/src/tool/rpg-initiative-tracker/i18n/it.ts +263 -0
- package/src/tool/rpg-initiative-tracker/i18n/ja.ts +263 -0
- package/src/tool/rpg-initiative-tracker/i18n/ko.ts +263 -0
- package/src/tool/rpg-initiative-tracker/i18n/nl.ts +263 -0
- package/src/tool/rpg-initiative-tracker/i18n/pl.ts +264 -0
- package/src/tool/rpg-initiative-tracker/i18n/pt.ts +263 -0
- package/src/tool/rpg-initiative-tracker/i18n/ru.ts +264 -0
- package/src/tool/rpg-initiative-tracker/i18n/sv.ts +263 -0
- package/src/tool/rpg-initiative-tracker/i18n/tr.ts +263 -0
- package/src/tool/rpg-initiative-tracker/i18n/zh.ts +263 -0
- package/src/tool/rpg-initiative-tracker/index.ts +9 -0
- package/src/tool/rpg-initiative-tracker/logic.test.ts +121 -0
- package/src/tool/rpg-initiative-tracker/logic.ts +122 -0
- package/src/tool/rpg-initiative-tracker/rpg-initiative-tracker.css +617 -0
- package/src/tool/rpg-initiative-tracker/seo.astro +16 -0
- package/src/tool/rpg-initiative-tracker/types.ts +15 -0
- package/src/tool/score-tracker/bibliography.astro +16 -0
- package/src/tool/score-tracker/bibliography.ts +12 -0
- package/src/tool/score-tracker/client.ts +248 -0
- package/src/tool/score-tracker/component.astro +34 -0
- package/src/tool/score-tracker/components/Leaderboard.astro +19 -0
- package/src/tool/score-tracker/components/PlayerSetup.astro +32 -0
- package/src/tool/score-tracker/components/RoundScoring.astro +22 -0
- package/src/tool/score-tracker/components/ScoreHistory.astro +25 -0
- package/src/tool/score-tracker/entry.ts +57 -0
- package/src/tool/score-tracker/i18n/de.ts +278 -0
- package/src/tool/score-tracker/i18n/en.ts +278 -0
- package/src/tool/score-tracker/i18n/es.ts +251 -0
- package/src/tool/score-tracker/i18n/fr.ts +278 -0
- package/src/tool/score-tracker/i18n/id.ts +278 -0
- package/src/tool/score-tracker/i18n/it.ts +278 -0
- package/src/tool/score-tracker/i18n/ja.ts +278 -0
- package/src/tool/score-tracker/i18n/ko.ts +278 -0
- package/src/tool/score-tracker/i18n/nl.ts +278 -0
- package/src/tool/score-tracker/i18n/pl.ts +278 -0
- package/src/tool/score-tracker/i18n/pt.ts +278 -0
- package/src/tool/score-tracker/i18n/ru.ts +278 -0
- package/src/tool/score-tracker/i18n/sv.ts +278 -0
- package/src/tool/score-tracker/i18n/tr.ts +278 -0
- package/src/tool/score-tracker/i18n/zh.ts +278 -0
- package/src/tool/score-tracker/index.ts +9 -0
- package/src/tool/score-tracker/logic.test.ts +83 -0
- package/src/tool/score-tracker/logic.ts +122 -0
- package/src/tool/score-tracker/score-tracker.css +1029 -0
- package/src/tool/score-tracker/seo.astro +16 -0
- package/src/tool/score-tracker/types.ts +17 -0
- package/src/tools.ts +10 -0
- 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">ᚨ</span><span class="pill-label">{ui.elderFuthark}</span></button>
|
|
15
|
+
<button type="button" class="pill" data-alphabet="anglo-saxon"><span class="pill-rune">ᚪ</span><span class="pill-label">{ui.angloSaxon}</span></button>
|
|
16
|
+
<button type="button" class="pill" data-alphabet="fantasy"><span class="pill-rune">ᛟ</span><span class="pill-label">{ui.fantasy}</span></button>
|
|
17
|
+
<button type="button" class="pill" data-alphabet="theban"><span class="pill-rune">ᚠ</span><span class="pill-label">{ui.theban}</span></button>
|
|
18
|
+
<button type="button" class="pill" data-alphabet="enochian"><span class="pill-rune">ᛁ</span><span class="pill-label">{ui.enochian}</span></button>
|
|
19
|
+
<button type="button" class="pill" data-alphabet="daemonic"><span class="pill-rune">ᛊ</span><span class="pill-label">{ui.daemonic}</span></button>
|
|
20
|
+
<button type="button" class="pill" data-alphabet="ogham"><span class="pill-rune">ᛗ</span><span class="pill-label">{ui.ogham}</span></button>
|
|
21
|
+
</div>
|
|
22
|
+
<button type="button" class="seed-cog" id="seed-toggle-btn" title="Seed">⚙</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">↻</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">ᛟ</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">✕</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
|
+
};
|