@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,144 @@
|
|
|
1
|
+
import type { WheelSegment } from './types';
|
|
2
|
+
|
|
3
|
+
interface CanvasCtx {
|
|
4
|
+
ctx: CanvasRenderingContext2D;
|
|
5
|
+
cx: number;
|
|
6
|
+
cy: number;
|
|
7
|
+
radius: number;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
interface LabelCtx {
|
|
11
|
+
label: string;
|
|
12
|
+
midAngle: number;
|
|
13
|
+
labelR: number;
|
|
14
|
+
sliceAngle: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function drawSegmentLabel(c: CanvasCtx, lc: LabelCtx): void {
|
|
18
|
+
const { ctx, cx, cy } = c;
|
|
19
|
+
const { label, midAngle, labelR, sliceAngle } = lc;
|
|
20
|
+
ctx.save();
|
|
21
|
+
ctx.translate(cx + Math.cos(midAngle) * labelR, cy + Math.sin(midAngle) * labelR);
|
|
22
|
+
ctx.rotate(midAngle + Math.PI / 2);
|
|
23
|
+
ctx.fillStyle = '#ffffff';
|
|
24
|
+
const fontSize = Math.max(9, Math.min(13, Math.round(sliceAngle * 17)));
|
|
25
|
+
ctx.font = `bold ${fontSize}px system-ui, -apple-system, sans-serif`;
|
|
26
|
+
ctx.shadowColor = 'rgba(0, 0, 0, 0.6)';
|
|
27
|
+
ctx.shadowBlur = 4;
|
|
28
|
+
ctx.textAlign = 'center';
|
|
29
|
+
ctx.textBaseline = 'middle';
|
|
30
|
+
let labelText = label;
|
|
31
|
+
const maxAllowedWidth = labelR * sliceAngle * 0.85;
|
|
32
|
+
if (ctx.measureText(labelText).width > maxAllowedWidth) {
|
|
33
|
+
let len = labelText.length;
|
|
34
|
+
while (len > 1 && ctx.measureText(labelText.substring(0, len) + '..').width > maxAllowedWidth) {
|
|
35
|
+
len--;
|
|
36
|
+
}
|
|
37
|
+
labelText = labelText.substring(0, len) + '..';
|
|
38
|
+
}
|
|
39
|
+
ctx.fillText(labelText, 0, 0);
|
|
40
|
+
ctx.restore();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function drawSegments(c: CanvasCtx, segments: WheelSegment[], currentAngle: number): void {
|
|
44
|
+
const { ctx, cx, cy, radius } = c;
|
|
45
|
+
const totalWeight = segments.reduce((sum, s) => sum + (s.weight || 1), 0);
|
|
46
|
+
let accumulatedAngle = 0;
|
|
47
|
+
for (let i = 0; i < segments.length; i++) {
|
|
48
|
+
const seg = segments[i];
|
|
49
|
+
const weight = seg.weight || 1;
|
|
50
|
+
const sliceAngle = (weight / totalWeight) * 2 * Math.PI;
|
|
51
|
+
const startAngle = accumulatedAngle + currentAngle - Math.PI / 2;
|
|
52
|
+
const endAngle = startAngle + sliceAngle;
|
|
53
|
+
|
|
54
|
+
ctx.beginPath();
|
|
55
|
+
ctx.moveTo(cx, cy);
|
|
56
|
+
ctx.arc(cx, cy, radius, startAngle, endAngle);
|
|
57
|
+
ctx.closePath();
|
|
58
|
+
ctx.fillStyle = seg.color;
|
|
59
|
+
ctx.fill();
|
|
60
|
+
ctx.strokeStyle = 'rgba(15, 23, 42, 0.4)';
|
|
61
|
+
ctx.lineWidth = 1.5;
|
|
62
|
+
ctx.stroke();
|
|
63
|
+
|
|
64
|
+
const midAngle = startAngle + sliceAngle / 2;
|
|
65
|
+
const labelR = radius * 0.65;
|
|
66
|
+
drawSegmentLabel(c, { label: seg.label, midAngle, labelR, sliceAngle });
|
|
67
|
+
|
|
68
|
+
accumulatedAngle += sliceAngle;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function drawShadingOverlay(c: CanvasCtx): void {
|
|
73
|
+
const { ctx, cx, cy, radius } = c;
|
|
74
|
+
const grad = ctx.createRadialGradient(cx, cy, radius * 0.35, cx, cy, radius);
|
|
75
|
+
grad.addColorStop(0, 'rgba(255, 255, 255, 0.1)');
|
|
76
|
+
grad.addColorStop(0.6, 'rgba(0, 0, 0, 0)');
|
|
77
|
+
grad.addColorStop(1, 'rgba(0, 0, 0, 0.5)');
|
|
78
|
+
ctx.beginPath();
|
|
79
|
+
ctx.arc(cx, cy, radius, 0, Math.PI * 2);
|
|
80
|
+
ctx.fillStyle = grad;
|
|
81
|
+
ctx.fill();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function drawGoldRim(c: CanvasCtx): void {
|
|
85
|
+
const { ctx, cx, cy, radius } = c;
|
|
86
|
+
ctx.beginPath();
|
|
87
|
+
ctx.arc(cx, cy, radius + 2, 0, Math.PI * 2);
|
|
88
|
+
ctx.lineWidth = 6;
|
|
89
|
+
const rimGrad = ctx.createLinearGradient(cx - radius, cy - radius, cx + radius, cy + radius);
|
|
90
|
+
rimGrad.addColorStop(0, '#ffe066');
|
|
91
|
+
rimGrad.addColorStop(0.3, '#d4af37');
|
|
92
|
+
rimGrad.addColorStop(0.5, '#aa7c11');
|
|
93
|
+
rimGrad.addColorStop(0.7, '#d4af37');
|
|
94
|
+
rimGrad.addColorStop(1, '#ffe066');
|
|
95
|
+
ctx.strokeStyle = rimGrad;
|
|
96
|
+
ctx.stroke();
|
|
97
|
+
|
|
98
|
+
ctx.beginPath();
|
|
99
|
+
ctx.arc(cx, cy, radius - 1, 0, Math.PI * 2);
|
|
100
|
+
ctx.lineWidth = 1;
|
|
101
|
+
ctx.strokeStyle = 'rgba(15, 23, 42, 0.6)';
|
|
102
|
+
ctx.stroke();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function drawCenter(c: CanvasCtx): void {
|
|
106
|
+
const { ctx, cx, cy } = c;
|
|
107
|
+
ctx.beginPath();
|
|
108
|
+
ctx.arc(cx, cy, 22, 0, Math.PI * 2);
|
|
109
|
+
const hubGrad = ctx.createLinearGradient(cx - 20, cy - 20, cx + 20, cy + 20);
|
|
110
|
+
hubGrad.addColorStop(0, '#aa7c11');
|
|
111
|
+
hubGrad.addColorStop(0.5, '#ffe066');
|
|
112
|
+
hubGrad.addColorStop(1, '#aa7c11');
|
|
113
|
+
ctx.fillStyle = hubGrad;
|
|
114
|
+
ctx.fill();
|
|
115
|
+
ctx.strokeStyle = 'rgba(15, 23, 42, 0.6)';
|
|
116
|
+
ctx.lineWidth = 2;
|
|
117
|
+
ctx.stroke();
|
|
118
|
+
|
|
119
|
+
ctx.beginPath();
|
|
120
|
+
ctx.arc(cx, cy, 10, 0, Math.PI * 2);
|
|
121
|
+
const gemGrad = ctx.createRadialGradient(cx - 3, cy - 3, 1, cx, cy, 10);
|
|
122
|
+
gemGrad.addColorStop(0, '#fca5a5');
|
|
123
|
+
gemGrad.addColorStop(0.4, '#ef4444');
|
|
124
|
+
gemGrad.addColorStop(1, '#991b1b');
|
|
125
|
+
ctx.fillStyle = gemGrad;
|
|
126
|
+
ctx.fill();
|
|
127
|
+
ctx.strokeStyle = '#7f1d1d';
|
|
128
|
+
ctx.lineWidth = 1;
|
|
129
|
+
ctx.stroke();
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export function drawWheel(canvas: HTMLCanvasElement, segments: WheelSegment[], currentAngle: number): void {
|
|
133
|
+
const ctx = canvas.getContext('2d');
|
|
134
|
+
if (!ctx) return;
|
|
135
|
+
const cx = canvas.width / 2;
|
|
136
|
+
const cy = canvas.height / 2;
|
|
137
|
+
const radius = Math.min(cx, cy) - 10;
|
|
138
|
+
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
139
|
+
const c: CanvasCtx = { ctx, cx, cy, radius };
|
|
140
|
+
drawSegments(c, segments, currentAngle);
|
|
141
|
+
drawShadingOverlay(c);
|
|
142
|
+
drawGoldRim(c);
|
|
143
|
+
drawCenter(c);
|
|
144
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { TabletopToolEntry, ToolLocaleContent } from '../../types';
|
|
2
|
+
|
|
3
|
+
export type DecisionWheelUI = {
|
|
4
|
+
title: string;
|
|
5
|
+
spinButton: string;
|
|
6
|
+
clearHistory: string;
|
|
7
|
+
resultHeading: string;
|
|
8
|
+
historyTitle: string;
|
|
9
|
+
noHistory: string;
|
|
10
|
+
addSegmentLabel: string;
|
|
11
|
+
removeSegmentLabel: string;
|
|
12
|
+
segmentLabelPlaceholder: string;
|
|
13
|
+
presetLabel: string;
|
|
14
|
+
presetYesNo: string;
|
|
15
|
+
presetNumbers: string;
|
|
16
|
+
presetActions: string;
|
|
17
|
+
presetCustom: string;
|
|
18
|
+
presetD20: string;
|
|
19
|
+
presetAlignment: string;
|
|
20
|
+
presetLoot: string;
|
|
21
|
+
weightLabel: string;
|
|
22
|
+
spinAgain: string;
|
|
23
|
+
noSegments: string;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export type DecisionWheelLocaleContent = ToolLocaleContent<DecisionWheelUI>;
|
|
27
|
+
|
|
28
|
+
export const decisionWheel: TabletopToolEntry<DecisionWheelUI> = {
|
|
29
|
+
id: 'decision-wheel',
|
|
30
|
+
icons: { bg: 'mdi:slot-machine-outline', fg: 'mdi:slot-machine' },
|
|
31
|
+
i18n: {
|
|
32
|
+
en: () => import('./i18n/en').then((m) => m.content),
|
|
33
|
+
de: () => import('./i18n/de').then((m) => m.content),
|
|
34
|
+
es: () => import('./i18n/es').then((m) => m.content),
|
|
35
|
+
fr: () => import('./i18n/fr').then((m) => m.content),
|
|
36
|
+
id: () => import('./i18n/id').then((m) => m.content),
|
|
37
|
+
it: () => import('./i18n/it').then((m) => m.content),
|
|
38
|
+
ja: () => import('./i18n/ja').then((m) => m.content),
|
|
39
|
+
ko: () => import('./i18n/ko').then((m) => m.content),
|
|
40
|
+
nl: () => import('./i18n/nl').then((m) => m.content),
|
|
41
|
+
pl: () => import('./i18n/pl').then((m) => m.content),
|
|
42
|
+
pt: () => import('./i18n/pt').then((m) => m.content),
|
|
43
|
+
ru: () => import('./i18n/ru').then((m) => m.content),
|
|
44
|
+
sv: () => import('./i18n/sv').then((m) => m.content),
|
|
45
|
+
tr: () => import('./i18n/tr').then((m) => m.content),
|
|
46
|
+
zh: () => import('./i18n/zh').then((m) => m.content),
|
|
47
|
+
},
|
|
48
|
+
};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
2
|
+
import type { DecisionWheelLocaleContent } from '../entry';
|
|
3
|
+
|
|
4
|
+
export const content: DecisionWheelLocaleContent = {
|
|
5
|
+
slug: 'entscheidungsrad',
|
|
6
|
+
title: 'Entscheidungsrad: Zufallsgenerator und Auswahldrehrad',
|
|
7
|
+
description: 'Drehen Sie ein anpassbares Entscheidungsrad für Brettspiele. Fügen Sie Segmente mit Gewichtungen hinzu, um Ergebnisse zufällig zu bestimmen.',
|
|
8
|
+
ui: {
|
|
9
|
+
title: 'Entscheidungsrad',
|
|
10
|
+
spinButton: 'Rad Drehen',
|
|
11
|
+
clearHistory: 'Verlauf Löschen',
|
|
12
|
+
resultHeading: 'Ergebnis',
|
|
13
|
+
historyTitle: 'Drehverlauf',
|
|
14
|
+
noHistory: 'Noch keine Drehs. Klicken Sie auf Rad Drehen, um zu starten.',
|
|
15
|
+
addSegmentLabel: 'Segment Hinzufügen',
|
|
16
|
+
removeSegmentLabel: 'Entfernen',
|
|
17
|
+
segmentLabelPlaceholder: 'Name',
|
|
18
|
+
presetLabel: 'Vorlagen',
|
|
19
|
+
presetYesNo: 'Ja oder Nein',
|
|
20
|
+
presetNumbers: 'Zahlen 1-6',
|
|
21
|
+
presetActions: 'Aktionen',
|
|
22
|
+
presetCustom: 'Benutzerdefiniert',
|
|
23
|
+
presetD20: 'D20',
|
|
24
|
+
presetAlignment: 'Gesinnung',
|
|
25
|
+
presetLoot: 'Beuteseltenheit',
|
|
26
|
+
weightLabel: 'Gewicht',
|
|
27
|
+
spinAgain: 'Nochmals Drehen',
|
|
28
|
+
noSegments: 'Fügen Sie Segmente hinzu, bevor Sie drehen.',
|
|
29
|
+
},
|
|
30
|
+
seo: [
|
|
31
|
+
{ type: 'title', text: 'Entscheidungsrad für Brettspiele und Gruppenaktivitäten', level: 2 },
|
|
32
|
+
{ type: 'paragraph', html: 'Das Entscheidungsrad ist ein vielseitiges Werkzeug für Brettspiele und Gruppenaktivitäten. Passen Sie die Segmente mit eigenen Namen und Farben an.' },
|
|
33
|
+
{
|
|
34
|
+
type: 'stats',
|
|
35
|
+
items: [
|
|
36
|
+
{ value: '16', label: 'Segment Hinzufügen' },
|
|
37
|
+
{ value: '7', label: 'Vorlagen' },
|
|
38
|
+
{ value: '10', label: 'Drehverlauf' },
|
|
39
|
+
],
|
|
40
|
+
columns: 3,
|
|
41
|
+
},
|
|
42
|
+
{ type: 'title', text: 'So Verwenden Sie das Entscheidungsrad', level: 2 },
|
|
43
|
+
{ type: 'paragraph', html: 'Wählen Sie eine Vorlage oder erstellen Sie eigene Segmente mit Gewichtungen, um die Gewinnwahrscheinlichkeiten anzupassen.' },
|
|
44
|
+
],
|
|
45
|
+
faq: [
|
|
46
|
+
{
|
|
47
|
+
question: 'Wie funktioniert das Entscheidungsrad?',
|
|
48
|
+
answer: 'Wählen Sie eine Vorlage oder erstellen Sie eigene Optionen, legen Sie Gewichtungen fest und klicken Sie auf Drehen.',
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
question: 'Kann ich Farben und Namen anpassen?',
|
|
52
|
+
answer: 'Ja, Sie können beliebig Segmente hinzufügen, Namen ändern, Farben wählen und die Gewichtung von 1 bis 5 anpassen.',
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
bibliography,
|
|
56
|
+
howTo: [
|
|
57
|
+
{
|
|
58
|
+
name: 'Segmente Erstellen',
|
|
59
|
+
text: 'Wählen Sie eine Vorlage oder fügen Sie benutzerdefinierte Segmente mit Namen und Farben hinzu.',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: 'Das Rad Drehen',
|
|
63
|
+
text: 'Klicken Sie auf Drehen und warten Sie, bis das Rad mit realistischer Verzögerung stoppt.',
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
schemas: [
|
|
67
|
+
{
|
|
68
|
+
'@context': 'https://schema.org',
|
|
69
|
+
'@type': 'SoftwareApplication',
|
|
70
|
+
'name': 'Entscheidungsrad',
|
|
71
|
+
'operatingSystem': 'All',
|
|
72
|
+
'applicationCategory': 'UtilitiesApplication',
|
|
73
|
+
'browserRequirements': 'Requires HTML5 Canvas. Requires JavaScript.',
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
'@context': 'https://schema.org',
|
|
77
|
+
'@type': 'FAQPage',
|
|
78
|
+
'mainEntity': [
|
|
79
|
+
{
|
|
80
|
+
'@type': 'Question',
|
|
81
|
+
'name': 'Wie funktioniert das Entscheidungsrad?',
|
|
82
|
+
'acceptedAnswer': { '@type': 'Answer', 'text': 'Wählen Sie eine Vorlage oder erstellen Sie eigene Optionen, legen Sie Gewichtungen fest und klicken Sie auf Drehen.' },
|
|
83
|
+
},
|
|
84
|
+
{ '@type': 'Question', 'name': 'Kann ich Farben und Namen anpassen?', 'acceptedAnswer': { '@type': 'Answer', 'text': 'Ja, Sie können beliebig Segmente hinzufügen, Namen ändern, Farben wählen und die Gewichtung von 1 bis 5 anpassen.' } },
|
|
85
|
+
],
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
'@context': 'https://schema.org',
|
|
89
|
+
'@type': 'HowTo',
|
|
90
|
+
'name': 'How to Use the Decision Wheel Spinner',
|
|
91
|
+
'step': [
|
|
92
|
+
{ '@type': 'HowToStep', 'name': 'Segmente Erstellen', 'text': 'Wählen Sie eine Vorlage oder fügen Sie benutzerdefinierte Segmente mit Namen und Farben hinzu.' },
|
|
93
|
+
{ '@type': 'HowToStep', 'name': 'Das Rad Drehen', 'text': 'Klicken Sie auf Drehen und warten Sie, bis das Rad mit realistischer Verzögerung stoppt.' },
|
|
94
|
+
],
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
};
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
2
|
+
import type { DecisionWheelLocaleContent } from '../entry';
|
|
3
|
+
|
|
4
|
+
export const content: DecisionWheelLocaleContent = {
|
|
5
|
+
slug: 'decision-wheel',
|
|
6
|
+
title: 'Decision Wheel Spinner',
|
|
7
|
+
description: 'Spin a customizable decision wheel for tabletop games. Add, remove, and edit segments to randomly determine outcomes.',
|
|
8
|
+
ui: {
|
|
9
|
+
title: 'Decision Wheel Spinner',
|
|
10
|
+
spinButton: 'Spin the Wheel',
|
|
11
|
+
clearHistory: 'Clear History',
|
|
12
|
+
resultHeading: 'Result',
|
|
13
|
+
historyTitle: 'Spin History',
|
|
14
|
+
noHistory: 'No spins yet. Click Spin the Wheel to start.',
|
|
15
|
+
addSegmentLabel: 'Add Segment',
|
|
16
|
+
removeSegmentLabel: 'Remove',
|
|
17
|
+
segmentLabelPlaceholder: 'Label',
|
|
18
|
+
presetLabel: 'Presets',
|
|
19
|
+
presetYesNo: 'Yes / No',
|
|
20
|
+
presetNumbers: 'Numbers 1-6',
|
|
21
|
+
presetActions: 'Actions',
|
|
22
|
+
presetCustom: 'Custom',
|
|
23
|
+
presetD20: 'D20',
|
|
24
|
+
presetAlignment: 'Alignment',
|
|
25
|
+
presetLoot: 'Loot Rarity',
|
|
26
|
+
weightLabel: 'Weight',
|
|
27
|
+
spinAgain: 'Spin Again',
|
|
28
|
+
noSegments: 'Add segments to the wheel before spinning.',
|
|
29
|
+
},
|
|
30
|
+
seo: [
|
|
31
|
+
{ type: 'title', text: 'Decision Wheel Spinner for Tabletop Games and Group Activities', level: 2 },
|
|
32
|
+
{ type: 'paragraph', html: 'The Decision Wheel Spinner is a versatile tool for tabletop games and group activities. Customize the wheel segments with your own labels and colors, then spin to randomly select an outcome. The wheel features realistic deceleration animation and a visual result display with emphasis effects.' },
|
|
33
|
+
{
|
|
34
|
+
type: 'stats',
|
|
35
|
+
items: [
|
|
36
|
+
{ value: '16', label: 'Max Segments' },
|
|
37
|
+
{ value: '4', label: 'Preset Modes' },
|
|
38
|
+
{ value: '10', label: 'History Entries' },
|
|
39
|
+
],
|
|
40
|
+
columns: 3,
|
|
41
|
+
},
|
|
42
|
+
{ type: 'title', text: 'How to Use the Decision Wheel', level: 2 },
|
|
43
|
+
{ type: 'paragraph', html: 'The Decision Wheel makes it easy to randomly pick from a set of options. Choose a preset or create your own segments, then spin the wheel. The canvas-based wheel animates with realistic deceleration, and when it stops the winning segment is highlighted with a glow effect. A spin history keeps track of recent results.' },
|
|
44
|
+
{ type: 'title', text: 'Customizing Wheel Segments', level: 3 },
|
|
45
|
+
{ type: 'paragraph', html: 'You can add, remove, and edit segment labels to match your game or activity needs. Each segment can have its own color, making it easy to distinguish between different options at a glance. Use the preset buttons to quickly load common configurations like Yes/No, Numbers 1-6, or Action sets.' },
|
|
46
|
+
{
|
|
47
|
+
type: 'table',
|
|
48
|
+
headers: ['Preset', 'Segments', 'Use Case'],
|
|
49
|
+
rows: [
|
|
50
|
+
['Yes / No', '2', 'Binary decisions, votes, pass/fail'],
|
|
51
|
+
['Numbers 1-6', '6', 'Dice alternatives, random selection'],
|
|
52
|
+
['Actions', '5', 'Combat actions, exploration choices'],
|
|
53
|
+
['Custom', '3+', 'Fully customizable for any need'],
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
type: 'proscons',
|
|
58
|
+
title: 'Fixed Wheel vs Custom Segments',
|
|
59
|
+
items: [
|
|
60
|
+
{
|
|
61
|
+
pro: 'Presets load instantly with predefined colors and labels for common scenarios.',
|
|
62
|
+
con: 'Fixed presets may not cover niche or game-specific decision types.',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
pro: 'Custom segments let you define any set of outcomes with personalized labels and colors.',
|
|
66
|
+
con: 'Custom setup requires a moment of configuration before the first spin.',
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
type: 'comparative',
|
|
72
|
+
items: [
|
|
73
|
+
{
|
|
74
|
+
title: 'Quick Binary Decisions',
|
|
75
|
+
description: 'Use the Yes/No preset for quick binary decisions during gameplay, such as flanking success, random encounters, or vote outcomes.',
|
|
76
|
+
icon: 'mdi:slot-machine-outline',
|
|
77
|
+
highlight: false,
|
|
78
|
+
points: [
|
|
79
|
+
'Instant preset loading',
|
|
80
|
+
'Clear visual result',
|
|
81
|
+
'Suitable for any game',
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
title: 'Game Action Selection',
|
|
86
|
+
description: 'The Actions preset provides a set of common tabletop game actions that can be randomized for NPC behavior or event outcomes.',
|
|
87
|
+
icon: 'mdi:sword',
|
|
88
|
+
highlight: true,
|
|
89
|
+
points: [
|
|
90
|
+
'Predefined action labels',
|
|
91
|
+
'Color-coded segments',
|
|
92
|
+
'Expandable with custom options',
|
|
93
|
+
],
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
title: 'Custom Voting and Polls',
|
|
97
|
+
description: 'Create custom sets of options for group voting, random prize draws, or choosing between multiple paths in a story-driven game.',
|
|
98
|
+
icon: 'mdi:format-list-bulleted',
|
|
99
|
+
highlight: false,
|
|
100
|
+
points: [
|
|
101
|
+
'Fully customizable labels',
|
|
102
|
+
'Adjustable segment count',
|
|
103
|
+
'Per-segment color control',
|
|
104
|
+
],
|
|
105
|
+
},
|
|
106
|
+
],
|
|
107
|
+
columns: 3,
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
type: 'title',
|
|
111
|
+
text: 'Visual Feedback and Animation',
|
|
112
|
+
level: 3,
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
type: 'paragraph',
|
|
116
|
+
html: 'When the wheel spins, it uses a realistic cubic ease-out deceleration animation that mimics a physical spinning wheel. Multiple full rotations ensure true randomness is visually apparent. When the wheel stops, the winning segment is highlighted with a scale and glow emphasis effect, making the result immediately clear to all players.',
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
type: 'glossary',
|
|
120
|
+
items: [
|
|
121
|
+
{
|
|
122
|
+
term: 'Ease-Out Cubic',
|
|
123
|
+
definition: 'An animation curve where the wheel starts fast and gradually decelerates to a stop, mimicking real-world friction.',
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
term: 'Segment',
|
|
127
|
+
definition: 'A slice of the wheel representing one possible outcome, defined by a label and a color.',
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
term: 'Preset',
|
|
131
|
+
definition: 'A preconfigured set of segments for common scenarios like binary decisions, number ranges, or action sets.',
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
term: 'Spin History',
|
|
135
|
+
definition: 'A log of recent spin results showing the last 10 outcomes for reference during gameplay.',
|
|
136
|
+
},
|
|
137
|
+
],
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
faq: [
|
|
141
|
+
{
|
|
142
|
+
question: 'How does the Decision Wheel work?',
|
|
143
|
+
answer: 'Select or create your segments, then click Spin the Wheel. The wheel animates with deceleration and stops on a random segment, which is highlighted as the result.',
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
question: 'Can I add my own segments?',
|
|
147
|
+
answer: 'Yes, click Add Segment to create new options and edit the labels to match your needs. Each segment can also have its own color.',
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
question: 'What presets are available?',
|
|
151
|
+
answer: 'The tool includes Yes/No, Numbers 1-6, Actions, and Custom presets. Custom preset starts with three editable options.',
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
question: 'How many segments can I have?',
|
|
155
|
+
answer: 'You can add up to 16 segments. A minimum of 2 segments is required for the wheel to function.',
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
question: 'Is there a spin history?',
|
|
159
|
+
answer: 'Yes, the tool keeps a history of the last 10 spins, showing the selected segment for each spin.',
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
question: 'What is the emphasis effect?',
|
|
163
|
+
answer: 'When the wheel stops, the result display pulses with a glow and scale animation to draw attention to the selected outcome.',
|
|
164
|
+
},
|
|
165
|
+
],
|
|
166
|
+
bibliography,
|
|
167
|
+
howTo: [
|
|
168
|
+
{
|
|
169
|
+
name: 'Choose or Create Segments',
|
|
170
|
+
text: 'Select a preset or add custom segments with your own labels and colors.',
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
name: 'Spin the Wheel',
|
|
174
|
+
text: 'Click the spin button to start the wheel animation with realistic deceleration.',
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
name: 'View Result and History',
|
|
178
|
+
text: 'The winning segment is displayed with emphasis. Check the history for recent spins.',
|
|
179
|
+
},
|
|
180
|
+
],
|
|
181
|
+
schemas: [
|
|
182
|
+
{
|
|
183
|
+
'@context': 'https://schema.org',
|
|
184
|
+
'@type': 'SoftwareApplication',
|
|
185
|
+
'name': 'Decision Wheel Spinner',
|
|
186
|
+
'operatingSystem': 'All',
|
|
187
|
+
'applicationCategory': 'UtilitiesApplication',
|
|
188
|
+
'browserRequirements': 'Requires HTML5 Canvas. Requires JavaScript.',
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
'@context': 'https://schema.org',
|
|
192
|
+
'@type': 'FAQPage',
|
|
193
|
+
'mainEntity': [
|
|
194
|
+
{
|
|
195
|
+
'@type': 'Question',
|
|
196
|
+
'name': 'How does the Decision Wheel work?',
|
|
197
|
+
'acceptedAnswer': {
|
|
198
|
+
'@type': 'Answer',
|
|
199
|
+
'text': 'Select or create your segments, then click Spin the Wheel. The wheel animates with deceleration and stops on a random segment, which is highlighted as the result.',
|
|
200
|
+
},
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
'@type': 'Question',
|
|
204
|
+
'name': 'Can I add my own segments?',
|
|
205
|
+
'acceptedAnswer': {
|
|
206
|
+
'@type': 'Answer',
|
|
207
|
+
'text': 'Yes, click Add Segment to create new options and edit the labels to match your needs.',
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
'@type': 'Question',
|
|
212
|
+
'name': 'What presets are available?',
|
|
213
|
+
'acceptedAnswer': {
|
|
214
|
+
'@type': 'Answer',
|
|
215
|
+
'text': 'The tool includes Yes/No, Numbers 1-6, Actions, and Custom presets.',
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
'@type': 'Question',
|
|
220
|
+
'name': 'Is there a spin history?',
|
|
221
|
+
'acceptedAnswer': {
|
|
222
|
+
'@type': 'Answer',
|
|
223
|
+
'text': 'Yes, the tool keeps a history of the last 10 spins.',
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
],
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
'@context': 'https://schema.org',
|
|
230
|
+
'@type': 'HowTo',
|
|
231
|
+
'name': 'How to Use the Decision Wheel Spinner',
|
|
232
|
+
'step': [
|
|
233
|
+
{
|
|
234
|
+
'@type': 'HowToStep',
|
|
235
|
+
'name': 'Choose or Create Segments',
|
|
236
|
+
'text': 'Select a preset or add custom segments with your own labels and colors.',
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
'@type': 'HowToStep',
|
|
240
|
+
'name': 'Spin the Wheel',
|
|
241
|
+
'text': 'Click the spin button to start the wheel animation with realistic deceleration.',
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
'@type': 'HowToStep',
|
|
245
|
+
'name': 'View Result and History',
|
|
246
|
+
'text': 'The winning segment is displayed with emphasis. Check the history for recent spins.',
|
|
247
|
+
},
|
|
248
|
+
],
|
|
249
|
+
},
|
|
250
|
+
],
|
|
251
|
+
};
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
2
|
+
import type { DecisionWheelLocaleContent } from '../entry';
|
|
3
|
+
|
|
4
|
+
export const content: DecisionWheelLocaleContent = {
|
|
5
|
+
slug: 'ruleta-de-decisiones',
|
|
6
|
+
title: 'Ruleta de Decisiones: Selector Aleatorio y Generador de Opciones',
|
|
7
|
+
description: 'Gira una ruleta de decisiones personalizable para tus juegos de mesa. Añade, elimina y edita secciones con pesos para decidir resultados al azar.',
|
|
8
|
+
ui: {
|
|
9
|
+
title: 'Ruleta de Decisiones',
|
|
10
|
+
spinButton: 'Girar la Ruleta',
|
|
11
|
+
clearHistory: 'Limpiar Historial',
|
|
12
|
+
resultHeading: 'Resultado',
|
|
13
|
+
historyTitle: 'Historial de Giros',
|
|
14
|
+
noHistory: 'Sin giros registrados. Haz clic en Girar la Ruleta para comenzar.',
|
|
15
|
+
addSegmentLabel: 'Añadir Sección',
|
|
16
|
+
removeSegmentLabel: 'Eliminar',
|
|
17
|
+
segmentLabelPlaceholder: 'Etiqueta',
|
|
18
|
+
presetLabel: 'Preajustes',
|
|
19
|
+
presetYesNo: 'Sí o No',
|
|
20
|
+
presetNumbers: 'Números 1-6',
|
|
21
|
+
presetActions: 'Acciones',
|
|
22
|
+
presetCustom: 'Personalizado',
|
|
23
|
+
presetD20: 'D20',
|
|
24
|
+
presetAlignment: 'Alineación',
|
|
25
|
+
presetLoot: 'Rareza de Botín',
|
|
26
|
+
weightLabel: 'Peso',
|
|
27
|
+
spinAgain: 'Girar de Nuevo',
|
|
28
|
+
noSegments: 'Añade secciones a la ruleta antes de girar.',
|
|
29
|
+
},
|
|
30
|
+
seo: [
|
|
31
|
+
{ type: 'title', text: 'Ruleta de Decisiones para Juegos de Mesa y Actividades', level: 2 },
|
|
32
|
+
{ type: 'paragraph', html: 'La ruleta de decisiones es una herramienta versátil para juegos de mesa y actividades grupales. Personaliza las secciones con tus propios textos y colores, luego gira para seleccionar un resultado aleatorio.' },
|
|
33
|
+
{
|
|
34
|
+
type: 'stats',
|
|
35
|
+
items: [
|
|
36
|
+
{ value: '16', label: 'Añadir Sección' },
|
|
37
|
+
{ value: '7', label: 'Preajustes' },
|
|
38
|
+
{ value: '10', label: 'Historial de Giros' },
|
|
39
|
+
],
|
|
40
|
+
columns: 3,
|
|
41
|
+
},
|
|
42
|
+
{ type: 'title', text: 'Cómo Usar la Ruleta de Decisiones', level: 2 },
|
|
43
|
+
{ type: 'paragraph', html: 'La ruleta facilita elegir al azar entre un conjunto de opciones. Elige un preajuste o crea tus propias secciones con diferentes pesos para ajustar las probabilidades.' },
|
|
44
|
+
],
|
|
45
|
+
faq: [
|
|
46
|
+
{
|
|
47
|
+
question: '¿Cómo funciona la ruleta de decisiones?',
|
|
48
|
+
answer: 'Selecciona o crea tus secciones, asigna pesos si quieres variar la probabilidad de cada opción y pulsa Girar para obtener un resultado al azar.',
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
question: '¿Puedo personalizar los colores y nombres?',
|
|
52
|
+
answer: 'Sí, puedes añadir secciones, cambiar las etiquetas de texto, asignar colores personalizados y ajustar su peso del 1 al 5.',
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
bibliography,
|
|
56
|
+
howTo: [
|
|
57
|
+
{
|
|
58
|
+
name: 'Elegir o Crear Opciones',
|
|
59
|
+
text: 'Selecciona un preajuste rápido o crea tus propias secciones editando los nombres y colores.',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: 'Girar la Ruleta',
|
|
63
|
+
text: 'Haz clic en el botón de girar y observa la animación con físicas de deceleración realista.',
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
schemas: [
|
|
67
|
+
{
|
|
68
|
+
'@context': 'https://schema.org',
|
|
69
|
+
'@type': 'SoftwareApplication',
|
|
70
|
+
'name': 'Ruleta de Decisiones',
|
|
71
|
+
'operatingSystem': 'All',
|
|
72
|
+
'applicationCategory': 'UtilitiesApplication',
|
|
73
|
+
'browserRequirements': 'Requires HTML5 Canvas. Requires JavaScript.',
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
'@context': 'https://schema.org',
|
|
77
|
+
'@type': 'FAQPage',
|
|
78
|
+
'mainEntity': [
|
|
79
|
+
{ '@type': 'Question', 'name': '¿Cómo funciona la ruleta de decisiones?', 'acceptedAnswer': { '@type': 'Answer', 'text': 'Selecciona o crea tus secciones, asigna pesos si quieres variar la probabilidad de cada opción y pulsa Girar para obtener un resultado al azar.' } },
|
|
80
|
+
{ '@type': 'Question', 'name': '¿Puedo personalizar los colores y nombres?', 'acceptedAnswer': { '@type': 'Answer', 'text': 'Sí, puedes añadir secciones, cambiar las etiquetas de texto, asignar colores personalizados y ajustar su peso del 1 al 5.' } },
|
|
81
|
+
],
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
'@context': 'https://schema.org',
|
|
85
|
+
'@type': 'HowTo',
|
|
86
|
+
'name': 'How to Use the Decision Wheel Spinner',
|
|
87
|
+
'step': [
|
|
88
|
+
{ '@type': 'HowToStep', 'name': 'Elegir o Crear Opciones', 'text': 'Selecciona un preajuste rápido o crea tus propias secciones editando los nombres y colores.' },
|
|
89
|
+
{ '@type': 'HowToStep', 'name': 'Girar la Ruleta', 'text': 'Haz clic en el botón de girar y observa la animación con físicas de deceleración realista.' },
|
|
90
|
+
],
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
};
|