@jjlmoya/utils-tabletop 1.14.0 → 1.16.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 (41) hide show
  1. package/package.json +1 -1
  2. package/src/category/i18n/fr.ts +3 -3
  3. package/src/category/i18n/zh.ts +7 -7
  4. package/src/layouts/PreviewLayout.astro +1 -0
  5. package/src/tests/diacritics_density.test.ts +118 -0
  6. package/src/tests/inverted_punctuation.test.ts +84 -0
  7. package/src/tests/no_en_dash.test.ts +35 -6
  8. package/src/tests/script_density.test.ts +94 -0
  9. package/src/tool/board-game-timer/board-game-timer.css +94 -0
  10. package/src/tool/board-game-timer/i18n/fr.ts +3 -3
  11. package/src/tool/board-game-timer/i18n/zh.ts +2 -2
  12. package/src/tool/decision-wheel/decision-wheel.css +119 -0
  13. package/src/tool/decision-wheel/i18n/ru.ts +207 -38
  14. package/src/tool/dice-roller-simulator/dice-roller-simulator.css +111 -0
  15. package/src/tool/dice-roller-simulator/i18n/fr.ts +6 -6
  16. package/src/tool/dice-roller-simulator/i18n/ru.ts +5 -5
  17. package/src/tool/dice-roller-simulator/i18n/zh.ts +4 -4
  18. package/src/tool/fantasy-runes-translator/i18n/fr.ts +4 -4
  19. package/src/tool/first-player-selector/i18n/fr.ts +6 -6
  20. package/src/tool/first-player-selector/i18n/ru.ts +5 -5
  21. package/src/tool/hidden-role-dealer/hidden-role-dealer.css +81 -0
  22. package/src/tool/hidden-role-dealer/i18n/fr.ts +3 -3
  23. package/src/tool/hidden-role-dealer/i18n/ru.ts +1 -1
  24. package/src/tool/hidden-role-dealer/i18n/zh.ts +1 -1
  25. package/src/tool/investigation-board/i18n/fr.ts +4 -4
  26. package/src/tool/investigation-board/i18n/ru.ts +4 -4
  27. package/src/tool/investigation-board/i18n/zh.ts +2 -2
  28. package/src/tool/investigation-board/investigation-board.css +81 -1
  29. package/src/tool/lunar-tide-tracker/i18n/fr.ts +4 -4
  30. package/src/tool/lunar-tide-tracker/i18n/tr.ts +60 -60
  31. package/src/tool/rpg-initiative-tracker/i18n/de.ts +1 -1
  32. package/src/tool/rpg-initiative-tracker/i18n/fr.ts +3 -3
  33. package/src/tool/scatter-direction-selector/i18n/pl.ts +3 -3
  34. package/src/tool/scatter-direction-selector/i18n/ru.ts +3 -3
  35. package/src/tool/scatter-direction-selector/i18n/tr.ts +3 -3
  36. package/src/tool/scatter-direction-selector/scatter-direction-selector.css +82 -0
  37. package/src/tool/score-tracker/i18n/es.ts +62 -62
  38. package/src/tool/score-tracker/i18n/fr.ts +2 -2
  39. package/src/tool/score-tracker/i18n/ru.ts +110 -110
  40. package/src/tool/score-tracker/i18n/tr.ts +53 -53
  41. package/src/tool/score-tracker/score-tracker.css +83 -0
@@ -646,3 +646,122 @@
646
646
  font-size: 0.85rem;
647
647
  font-weight: 800;
648
648
  }
649
+
650
+ @media (max-width: 600px) {
651
+ main:has(.wheel-dashboard),
652
+ .tool-page:has(.wheel-dashboard),
653
+ .section-tool:has(.wheel-dashboard),
654
+ .tool-page:has(.wheel-dashboard) .utility-header,
655
+ .tool-page:has(.wheel-dashboard) .utility-header-title,
656
+ .tool-page:has(.wheel-dashboard) .utility-header-base,
657
+ .tool-page:has(.wheel-dashboard) .utility-header-highlight,
658
+ .tool-page:has(.wheel-dashboard) .utility-header-description {
659
+ min-width: 0;
660
+ max-width: 100%;
661
+ overflow-wrap: anywhere;
662
+ }
663
+
664
+ main:has(.wheel-dashboard) {
665
+ overflow-x: hidden;
666
+ }
667
+
668
+ .tool-page:has(.wheel-dashboard) .utility-header-title {
669
+ font-size: clamp(2rem, 12vw, 3rem);
670
+ letter-spacing: 0;
671
+ }
672
+
673
+ .wheel-dashboard {
674
+ padding: 1rem;
675
+ gap: 1.5rem;
676
+ border-radius: 1rem;
677
+ min-width: 0;
678
+ overflow: hidden;
679
+ }
680
+
681
+ .wheel-layout,
682
+ .canvas-card,
683
+ .wheel-canvas-section,
684
+ .wheel-canvas-container,
685
+ .tab-container,
686
+ .editor-card {
687
+ min-width: 0;
688
+ }
689
+
690
+ .canvas-card,
691
+ .tab-container {
692
+ width: 100%;
693
+ padding: 0.75rem;
694
+ border-radius: 1rem;
695
+ overflow: hidden;
696
+ }
697
+
698
+ .wheel-canvas-section {
699
+ align-items: stretch;
700
+ gap: 1rem;
701
+ }
702
+
703
+ .wheel-canvas-container {
704
+ width: 100%;
705
+ max-width: 100%;
706
+ }
707
+
708
+ .wheel-canvas {
709
+ width: min(240px, 100%);
710
+ height: auto;
711
+ aspect-ratio: 1;
712
+ margin: 0 auto;
713
+ }
714
+
715
+ .spin-button {
716
+ align-self: stretch;
717
+ width: 100%;
718
+ max-width: 100%;
719
+ min-height: 3.5rem;
720
+ height: auto;
721
+ padding: 0.85rem;
722
+ font-size: 1rem;
723
+ white-space: normal;
724
+ }
725
+
726
+ .mute-btn {
727
+ top: 0.75rem;
728
+ right: 0.75rem;
729
+ width: 2.35rem;
730
+ height: 2.35rem;
731
+ }
732
+
733
+ .result-placeholder {
734
+ padding: 0.75rem 0.5rem;
735
+ font-size: 0.85rem;
736
+ }
737
+
738
+ .tab-headers,
739
+ .preset-group {
740
+ flex-wrap: wrap;
741
+ }
742
+
743
+ .tab-header {
744
+ flex: 1 1 7rem;
745
+ padding: 0.6rem 0.75rem;
746
+ }
747
+
748
+ .segment-row {
749
+ align-items: stretch;
750
+ flex-wrap: wrap;
751
+ gap: 0.5rem;
752
+ padding: 0.75rem;
753
+ }
754
+
755
+ .segment-input {
756
+ flex: 1 1 calc(100% - 2.5rem);
757
+ }
758
+
759
+ .segment-weight {
760
+ flex: 1 1 6rem;
761
+ width: auto;
762
+ }
763
+
764
+ .btn-remove-segment {
765
+ flex: 1 1 5rem;
766
+ }
767
+ }
@@ -3,51 +3,179 @@ import type { DecisionWheelLocaleContent } from '../entry';
3
3
 
4
4
  export const content: DecisionWheelLocaleContent = {
5
5
  slug: 'koleso-reshenij',
6
- title: 'Koleso Reshenij: Generator Vyborov i Sluchajnyj Selektor',
7
- description: 'Vrashhajte nastraivaemoe koleso reshenij dlya nastolnyh igr.',
6
+ title: 'Колесо Решений: Генератор Выбора и Случайный Селектор',
7
+ description: 'Вращайте настраиваемое колесо решений для настольных игр. Добавляйте, удаляйте и редактируйте сегменты для случайного определения результатов.',
8
8
  ui: {
9
- title: 'Koleso Reshenij',
10
- spinButton: 'Zapustit Vrashenie',
11
- clearHistory: 'Ochistit Istoriyu',
12
- resultHeading: 'Rezultat',
13
- historyTitle: 'Istoriya Vrashenij',
14
- noHistory: 'Vrashenij eshe ne bylo. Nagmite Zapustit Vrashenie.',
15
- addSegmentLabel: 'Dobavit Segment',
16
- removeSegmentLabel: 'Udalit',
17
- segmentLabelPlaceholder: 'Podpis',
18
- presetLabel: 'Zagotovki',
19
- presetYesNo: 'Da / Net',
20
- presetNumbers: 'Chisla 1-6',
21
- presetActions: 'Dejstviya',
22
- presetCustom: 'Svoi',
9
+ title: 'Колесо Решений',
10
+ spinButton: 'Запустить Вращение',
11
+ clearHistory: 'Очистить Историю',
12
+ resultHeading: 'Результат',
13
+ historyTitle: 'История Вращений',
14
+ noHistory: 'Вращений ещё не было. Нажмите "Запустить Вращение", чтобы начать.',
15
+ addSegmentLabel: 'Добавить Сегмент',
16
+ removeSegmentLabel: 'Удалить',
17
+ segmentLabelPlaceholder: 'Название',
18
+ presetLabel: 'Заготовки',
19
+ presetYesNo: 'Да / Нет',
20
+ presetNumbers: 'Числа 1-6',
21
+ presetActions: 'Действия',
22
+ presetCustom: 'Своё',
23
23
  presetD20: 'D20',
24
- presetAlignment: 'Mirovozzrenie',
25
- presetLoot: 'Redkost Dobychi',
26
- weightLabel: 'Ves',
27
- spinAgain: 'Vrashat Eshe',
28
- noSegments: 'Dobavte segmenty na koleso pered vrasheniem.',
24
+ presetAlignment: 'Мировоззрение',
25
+ presetLoot: 'Редкость Добычи',
26
+ weightLabel: 'Вес',
27
+ spinAgain: 'Вращать Ещё',
28
+ noSegments: 'Добавьте сегменты на колесо перед вращением.',
29
29
  },
30
30
  seo: [
31
- { type: 'title', text: 'Koleso Reshenij dlya Nastolnyh Igr', level: 2 },
32
- { type: 'paragraph', html: 'Koleso reshenij - eto universalnyj instrument dlya nastolnyh igr i gruppovyh meropriyatij. Nastrojte segmenty, zapustite vrashenie i poluchite sluchajnyj rezultat s realiznichnoj animaciej.' },
33
- { type: 'stats', items: [{ value: '16', label: 'Maksimum Segmentov' }, { value: '4', label: 'Rezhima Zagotovok' }, { value: '10', label: 'Zapisej Istorii' }], columns: 3 },
31
+ { type: 'title', text: 'Колесо Решений для Настольных Игр и Групповых Активностей', level: 2 },
32
+ { type: 'paragraph', html: 'Колесо Решений - это универсальный инструмент для настольных игр и групповых мероприятий. Настройте сегменты с собственными названиями и цветами, затем вращайте для случайного выбора результата. Колесо использует реалистичную анимацию замедления и подсветку выигравшего сегмента с эффектом свечения.' },
33
+ {
34
+ type: 'stats',
35
+ items: [
36
+ { value: '16', label: 'Максимум Сегментов' },
37
+ { value: '4', label: 'Режима Заготовок' },
38
+ { value: '10', label: 'Записей в Истории' },
39
+ ],
40
+ columns: 3,
41
+ },
42
+ { type: 'title', text: 'Как Использовать Колесо Решений', level: 2 },
43
+ { type: 'paragraph', html: 'Колесо Решений позволяет легко делать случайный выбор из набора вариантов. Выберите заготовку или создайте свои сегменты, затем запустите вращение. Колесо на основе Canvas анимируется с реалистичным замедлением, а при остановке выигравший сегмент подсвечивается эффектом свечения. История вращений отслеживает последние результаты.' },
44
+ { type: 'title', text: 'Настройка Сегментов Колеса', level: 3 },
45
+ { type: 'paragraph', html: 'Вы можете добавлять, удалять и редактировать названия сегментов под нужды вашей игры или мероприятия. Каждый сегмент может иметь свой цвет, что позволяет легко различать варианты. Используйте кнопки заготовок для быстрой загрузки распространённых конфигураций, таких как Да/Нет, Числа 1-6 или наборы Действий.' },
46
+ {
47
+ type: 'table',
48
+ headers: ['Заготовка', 'Сегментов', 'Применение'],
49
+ rows: [
50
+ ['Да / Нет', '2', 'Бинарные решения, голосования, успех/провал'],
51
+ ['Числа 1-6', '6', 'Альтернатива кубикам, случайный выбор'],
52
+ ['Действия', '5', 'Боевые действия, выбор исследования'],
53
+ ['Своё', '3+', 'Полная настройка под любые нужды'],
54
+ ],
55
+ },
56
+ {
57
+ type: 'proscons',
58
+ title: 'Фиксированное Колесо или Свои Сегменты',
59
+ items: [
60
+ {
61
+ pro: 'Заготовки загружаются мгновенно с предопределёнными цветами и названиями для типовых сценариев.',
62
+ con: 'Фиксированные заготовки могут не покрывать узкие или специфичные для игры типы решений.',
63
+ },
64
+ {
65
+ pro: 'Свои сегменты позволяют задать любой набор результатов с персональными названиями и цветами.',
66
+ con: 'Пользовательская настройка требует минуту конфигурации перед первым вращением.',
67
+ },
68
+ ],
69
+ },
70
+ {
71
+ type: 'comparative',
72
+ items: [
73
+ {
74
+ title: 'Быстрые Бинарные Решения',
75
+ description: 'Используйте заготовку Да/Нет для быстрых бинарных решений во время игры, таких как успех флангового манёвра, случайные встречи или результаты голосования.',
76
+ icon: 'mdi:slot-machine-outline',
77
+ highlight: false,
78
+ points: [
79
+ 'Мгновенная загрузка заготовки',
80
+ 'Чёткий визуальный результат',
81
+ 'Подходит для любой игры',
82
+ ],
83
+ },
84
+ {
85
+ title: 'Выбор Игрового Действия',
86
+ description: 'Заготовка "Действия" предоставляет набор распространённых действий для настольных игр, которые можно выбирать случайно для поведения NPC или событий.',
87
+ icon: 'mdi:sword',
88
+ highlight: true,
89
+ points: [
90
+ 'Предопределённые названия действий',
91
+ 'Цветовая кодировка сегментов',
92
+ 'Расширяется своими вариантами',
93
+ ],
94
+ },
95
+ {
96
+ title: 'Свои Голосования и Опросы',
97
+ description: 'Создавайте собственные наборы вариантов для группового голосования, случайных розыгрышей призов или выбора между несколькими путями в сюжетной игре.',
98
+ icon: 'mdi:format-list-bulleted',
99
+ highlight: false,
100
+ points: [
101
+ 'Полностью настраиваемые названия',
102
+ 'Регулируемое количество сегментов',
103
+ 'Контроль цвета каждого сегмента',
104
+ ],
105
+ },
106
+ ],
107
+ columns: 3,
108
+ },
109
+ { type: 'title', text: 'Визуальная Обратная Связь и Анимация', level: 3 },
110
+ { type: 'paragraph', html: 'При вращении колесо использует реалистичную кубическую анимацию замедления (ease-out cubic), имитирующую физическое колесо. Несколько полных оборотов обеспечивают видимую случайность результата. Когда колесо останавливается, выигравший сегмент подсвечивается эффектом масштабирования и свечения, делая результат сразу заметным для всех игроков.' },
111
+ {
112
+ type: 'glossary',
113
+ items: [
114
+ {
115
+ term: 'Ease-Out Cubic',
116
+ definition: 'Кривая анимации, при которой колесо начинает быстро и постепенно замедляется до остановки, имитируя реальное трение.',
117
+ },
118
+ {
119
+ term: 'Сегмент',
120
+ definition: 'Сектор колеса, представляющий один возможный результат, определяемый названием и цветом.',
121
+ },
122
+ {
123
+ term: 'Заготовка',
124
+ definition: 'Предварительно настроенный набор сегментов для распространённых сценариев: бинарных решений, числовых диапазонов или наборов действий.',
125
+ },
126
+ {
127
+ term: 'История Вращений',
128
+ definition: 'Журнал последних результатов вращений, показывающий до 10 исходов для справки во время игры.',
129
+ },
130
+ ],
131
+ },
34
132
  ],
35
133
  faq: [
36
- { question: 'Kak rabotaet Koleso Reshenij?', answer: 'Vyberite ili sozdajte svoi segmenty, zatem nagmite Zapustit Vrashenie. Koleso ostanavlivaetsya na sluchajnom segmente.' },
37
- { question: 'Mogu li ya dobavit svoi segmenty?', answer: 'Da, nagmite Dobavit Segment chtoby sozdat novye varianty.' },
38
- { question: 'Kakie zagotovki dostupny?', answer: 'Dostupny zagotovki Da/Net, Chisla 1-6, Dejstviya i Svoi.' },
134
+ {
135
+ question: 'Как работает Колесо Решений?',
136
+ answer: 'Выберите или создайте свои сегменты, затем нажмите "Запустить Вращение". Колесо анимируется с замедлением и останавливается на случайном сегменте, который подсвечивается как результат.',
137
+ },
138
+ {
139
+ question: 'Можно ли добавить свои сегменты?',
140
+ answer: 'Да, нажмите "Добавить Сегмент", чтобы создать новые варианты и отредактировать названия под ваши нужды. Каждый сегмент также может иметь свой цвет.',
141
+ },
142
+ {
143
+ question: 'Какие заготовки доступны?',
144
+ answer: 'Инструмент включает заготовки Да/Нет, Числа 1-6, Действия и Своё. Заготовка "Своё" начинает с трёх редактируемых вариантов.',
145
+ },
146
+ {
147
+ question: 'Сколько сегментов можно добавить?',
148
+ answer: 'Можно добавить до 16 сегментов. Для работы колеса необходимо минимум 2 сегмента.',
149
+ },
150
+ {
151
+ question: 'Есть ли история вращений?',
152
+ answer: 'Да, инструмент сохраняет историю последних 10 вращений, показывая выбранный сегмент для каждого вращения.',
153
+ },
154
+ {
155
+ question: 'Что такое эффект подсветки?',
156
+ answer: 'Когда колесо останавливается, отображение результата пульсирует с анимацией свечения и масштабирования, привлекая внимание к выбранному результату.',
157
+ },
39
158
  ],
40
159
  bibliography,
41
160
  howTo: [
42
- { name: 'Vyberite ili Sozdajte Segmenty', text: 'Vyberite zagotovku ili dobavte svoi segmenty.' },
43
- { name: 'Zapustite Vrashenie', text: 'Nagmite knopku, chtoby zapustit koleso.' },
44
- { name: 'Posmotrite Rezultat', text: 'Rezultat podcherkivaetsya vizualnym effektom.' },
161
+ {
162
+ name: 'Выберите или Создайте Сегменты',
163
+ text: 'Выберите заготовку или добавьте свои сегменты с собственными названиями и цветами.',
164
+ },
165
+ {
166
+ name: 'Запустите Вращение',
167
+ text: 'Нажмите кнопку запуска, чтобы начать анимацию колеса с реалистичным замедлением.',
168
+ },
169
+ {
170
+ name: 'Посмотрите Результат и Историю',
171
+ text: 'Выигравший сегмент отображается с подсветкой. Проверьте историю для просмотра последних вращений.',
172
+ },
45
173
  ],
46
174
  schemas: [
47
175
  {
48
176
  '@context': 'https://schema.org',
49
177
  '@type': 'SoftwareApplication',
50
- 'name': 'Decision Wheel Spinner',
178
+ 'name': 'Колесо Решений',
51
179
  'operatingSystem': 'All',
52
180
  'applicationCategory': 'UtilitiesApplication',
53
181
  'browserRequirements': 'Requires HTML5 Canvas. Requires JavaScript.',
@@ -56,19 +184,60 @@ export const content: DecisionWheelLocaleContent = {
56
184
  '@context': 'https://schema.org',
57
185
  '@type': 'FAQPage',
58
186
  'mainEntity': [
59
- { '@type': 'Question', 'name': 'Kak rabotaet Koleso Reshenij?', 'acceptedAnswer': { '@type': 'Answer', 'text': 'Vyberite ili sozdajte svoi segmenty, zatem nagmite Zapustit Vrashenie.' } },
60
- { '@type': 'Question', 'name': 'Mogu li ya dobavit svoi segmenty?', 'acceptedAnswer': { '@type': 'Answer', 'text': 'Da, nagmite Dobavit Segment chtoby sozdat novye varianty.' } },
61
- { '@type': 'Question', 'name': 'Kakie zagotovki dostupny?', 'acceptedAnswer': { '@type': 'Answer', 'text': 'Dostupny zagotovki Da/Net, Chisla 1-6, Dejstviya i Svoi.' } },
187
+ {
188
+ '@type': 'Question',
189
+ 'name': 'Как работает Колесо Решений?',
190
+ 'acceptedAnswer': {
191
+ '@type': 'Answer',
192
+ 'text': 'Выберите или создайте свои сегменты, затем нажмите "Запустить Вращение". Колесо анимируется с замедлением и останавливается на случайном сегменте, который подсвечивается как результат.',
193
+ },
194
+ },
195
+ {
196
+ '@type': 'Question',
197
+ 'name': 'Можно ли добавить свои сегменты?',
198
+ 'acceptedAnswer': {
199
+ '@type': 'Answer',
200
+ 'text': 'Да, нажмите "Добавить Сегмент", чтобы создать новые варианты и отредактировать названия под ваши нужды.',
201
+ },
202
+ },
203
+ {
204
+ '@type': 'Question',
205
+ 'name': 'Какие заготовки доступны?',
206
+ 'acceptedAnswer': {
207
+ '@type': 'Answer',
208
+ 'text': 'Инструмент включает заготовки Да/Нет, Числа 1-6, Действия и Своё.',
209
+ },
210
+ },
211
+ {
212
+ '@type': 'Question',
213
+ 'name': 'Есть ли история вращений?',
214
+ 'acceptedAnswer': {
215
+ '@type': 'Answer',
216
+ 'text': 'Да, инструмент сохраняет историю последних 10 вращений.',
217
+ },
218
+ },
62
219
  ],
63
220
  },
64
221
  {
65
222
  '@context': 'https://schema.org',
66
223
  '@type': 'HowTo',
67
- 'name': 'How to Use the Decision Wheel Spinner',
224
+ 'name': 'Как Использовать Колесо Решений',
68
225
  'step': [
69
- { '@type': 'HowToStep', 'name': 'Choose or Create Segments', 'text': 'Select a preset or add custom segments.' },
70
- { '@type': 'HowToStep', 'name': 'Spin the Wheel', 'text': 'Click the spin button to start the wheel.' },
71
- { '@type': 'HowToStep', 'name': 'View Result', 'text': 'The result is displayed with emphasis.' },
226
+ {
227
+ '@type': 'HowToStep',
228
+ 'name': 'Выберите или Создайте Сегменты',
229
+ 'text': 'Выберите заготовку или добавьте свои сегменты с собственными названиями и цветами.',
230
+ },
231
+ {
232
+ '@type': 'HowToStep',
233
+ 'name': 'Запустите Вращение',
234
+ 'text': 'Нажмите кнопку запуска, чтобы начать анимацию колеса с реалистичным замедлением.',
235
+ },
236
+ {
237
+ '@type': 'HowToStep',
238
+ 'name': 'Посмотрите Результат и Историю',
239
+ 'text': 'Выигравший сегмент отображается с подсветкой. Проверьте историю для просмотра последних вращений.',
240
+ },
72
241
  ],
73
242
  },
74
243
  ],
@@ -1306,6 +1306,117 @@
1306
1306
  animation: shiver-fumble 0.2s infinite;
1307
1307
  }
1308
1308
 
1309
+ @media (max-width: 600px) {
1310
+ main:has(.tabletop-gaming-dashboard),
1311
+ .tool-page:has(.tabletop-gaming-dashboard),
1312
+ .section-tool:has(.tabletop-gaming-dashboard),
1313
+ .tool-page:has(.tabletop-gaming-dashboard) .utility-header,
1314
+ .tool-page:has(.tabletop-gaming-dashboard) .utility-header-title,
1315
+ .tool-page:has(.tabletop-gaming-dashboard) .utility-header-base,
1316
+ .tool-page:has(.tabletop-gaming-dashboard) .utility-header-highlight,
1317
+ .tool-page:has(.tabletop-gaming-dashboard) .utility-header-description {
1318
+ min-width: 0;
1319
+ max-width: 100%;
1320
+ overflow-wrap: anywhere;
1321
+ }
1322
+
1323
+ main:has(.tabletop-gaming-dashboard) {
1324
+ overflow-x: hidden;
1325
+ }
1326
+
1327
+ .tool-page:has(.tabletop-gaming-dashboard) .utility-header-title {
1328
+ font-size: clamp(2rem, 12vw, 3rem);
1329
+ letter-spacing: 0;
1330
+ }
1331
+
1332
+ .tabletop-gaming-dashboard {
1333
+ padding: 1rem;
1334
+ gap: 1.25rem;
1335
+ border-radius: 1rem;
1336
+ min-width: 0;
1337
+ }
1338
+
1339
+ .forge-and-tray-grid,
1340
+ .dashboard-center,
1341
+ .rolling-tray-container,
1342
+ .tabletop-extra-tabs,
1343
+ .dice-forge-panel {
1344
+ min-width: 0;
1345
+ }
1346
+
1347
+ .dice-forge-panel,
1348
+ .tabletop-extra-tabs {
1349
+ padding: 1rem;
1350
+ }
1351
+
1352
+ .die-control-row {
1353
+ gap: 0.45rem;
1354
+ padding: 0.45rem;
1355
+ }
1356
+
1357
+ .die-adjust-btn,
1358
+ .die-main-button {
1359
+ height: 2.65rem;
1360
+ }
1361
+
1362
+ .die-adjust-btn {
1363
+ width: 2.65rem;
1364
+ flex: 0 0 2.65rem;
1365
+ }
1366
+
1367
+ .die-main-button {
1368
+ min-width: 0;
1369
+ padding: 0.45rem 0.6rem;
1370
+ }
1371
+
1372
+ .modifier-box,
1373
+ .banner-total,
1374
+ .history-card-body {
1375
+ align-items: stretch;
1376
+ flex-direction: column;
1377
+ }
1378
+
1379
+ .modifier-input-wrapper {
1380
+ align-self: stretch;
1381
+ justify-content: center;
1382
+ }
1383
+
1384
+ .tray-rim {
1385
+ padding: 0.5rem;
1386
+ }
1387
+
1388
+ .tray-felt {
1389
+ min-height: 260px;
1390
+ padding: 1rem;
1391
+ }
1392
+
1393
+ .btn-roll-hero {
1394
+ height: auto;
1395
+ min-height: 3.5rem;
1396
+ padding: 0.85rem;
1397
+ font-size: 1.05rem;
1398
+ }
1399
+
1400
+ .tabs-nav {
1401
+ gap: 0.5rem;
1402
+ overflow-x: auto;
1403
+ }
1404
+
1405
+ .extra-tab-btn {
1406
+ flex: 1 0 auto;
1407
+ padding: 0.55rem 0.8rem;
1408
+ font-size: 0.85rem;
1409
+ }
1410
+
1411
+ .stats-glow-grid {
1412
+ grid-template-columns: 1fr;
1413
+ }
1414
+
1415
+ .history-dice-tags {
1416
+ max-width: none;
1417
+ }
1418
+ }
1419
+
1309
1420
  @keyframes shiver-fumble {
1310
1421
  0% {
1311
1422
  transform: translate(-52%, -48%) rotate(0deg);
@@ -19,7 +19,7 @@ export const content: ToolLocaleContent = {
19
19
  selectDice: 'Sélectionnez les dés à lancer',
20
20
  },
21
21
  seo: [
22
- { type: 'title', text: 'Maîtriser les probabilités : Comment les statistiques des dés influencent votre jeu', level: 2 },
22
+ { type: 'title', text: 'Maîtriser les probabilités: Comment les statistiques des dés influencent votre jeu', level: 2 },
23
23
  { type: 'paragraph', html: 'Les dés polyédriques sont au cœur des jeux de rôle et des jeux de société modernes. Que vous visiez un jet de sauvegarde réussi dans Dungeons & Dragons ou que vous lanciez pour obtenir des ressources, le résultat est régi par des probabilités mathématiques. Comprendre comment la combinaison de différents types de dés affecte vos chances est crucial pour prendre des décisions tactiques en cours de partie.' },
24
24
  {
25
25
  type: 'stats',
@@ -30,9 +30,9 @@ export const content: ToolLocaleContent = {
30
30
  ],
31
31
  columns: 3,
32
32
  },
33
- { type: 'title', text: 'La mathématique derrière plusieurs dés : Pourquoi 3d6 est plus sûr que 1d20', level: 2 },
33
+ { type: 'title', text: 'La mathématique derrière plusieurs dés: Pourquoi 3d6 est plus sûr que 1d20', level: 2 },
34
34
  { type: 'paragraph', html: "Lorsque vous lancez un seul D20, chaque résultat de 1 à 20 a une chance égale de 5%, ce qui donne une distribution de probabilité plate. Cependant, en lançant plusieurs dés comme 3d6, les résultats se regroupent autour de la valeur moyenne de 10.5. Cette courbe de Gauss (ou courbe en cloche) signifie que vous êtes beaucoup plus susceptible d'obtenir un résultat modéré que des valeurs extrêmes, ce qui apporte de la régularité et réduit l'aspect aléatoire d'un dé unique." },
35
- { type: 'title', text: 'Probabilités du D20 : Coups critiques, pires échecs et impact des modificateurs', level: 2 },
35
+ { type: 'title', text: 'Probabilités du D20: Coups critiques, pires échecs et impact des modificateurs', level: 2 },
36
36
  { type: 'paragraph', html: "Un simple modificateur de plus deux peut modifier considérablement les probabilités de réussite, transformant des tâches difficiles en défis gérables. Dans de nombreux systèmes de jeu, un 20 naturel représente un coup critique automatique (5% de chance), tandis qu'un 1 naturel est un échec critique (une pifia). Visualiser ces résultats permet de démystifier le hasard et de planifier vos actions tactiques avec un appui statistique." },
37
37
  {
38
38
  type: 'title',
@@ -123,7 +123,7 @@ export const content: ToolLocaleContent = {
123
123
  {
124
124
  type: 'diagnostic',
125
125
  variant: 'info',
126
- title: 'Le sophisme du joueur : Pourquoi les dés n\'ont pas de mémoire',
126
+ title: 'Le sophisme du joueur: Pourquoi les dés n\'ont pas de mémoire',
127
127
  icon: 'mdi:information-outline',
128
128
  badge: 'PROBABILITY TIP',
129
129
  html: 'Une erreur courante dans le jeu de rôle est de croire que les jets passés influencent les futurs. Si vous faites trois "1" d\'affilée sur un D20, vous pouvez penser qu\'un score élevé est "dû". En réalité, chaque jet est un événement indépendant. La probabilité d\'obtenir un 20 au jet suivant est toujours d\'exactement 5%. Savoir cela aide à prendre des décisions tactiques objectives.',
@@ -170,7 +170,7 @@ export const content: ToolLocaleContent = {
170
170
  },
171
171
  {
172
172
  question: 'Quels dés sont pris en charge ?',
173
- answer: 'Tous les dés polyédriques couramment utilisés dans les JdR et jeux de société : D4, D6, D8, D10, D12, D20 et D100.',
173
+ answer: 'Tous les dés polyédriques couramment utilisés dans les JdR et jeux de société: D4, D6, D8, D10, D12, D20 et D100.',
174
174
  },
175
175
  {
176
176
  question: 'Qu\'est-ce qu\'un modificateur et comment cela fonctionne-t-il ?',
@@ -234,7 +234,7 @@ export const content: ToolLocaleContent = {
234
234
  'name': 'Quels dés sont pris en charge ?',
235
235
  'acceptedAnswer': {
236
236
  '@type': 'Answer',
237
- 'text': 'Tous les dés polyédriques couramment utilisés dans les JdR et jeux de société : D4, D6, D8, D10, D12, D20 et D100.'
237
+ 'text': 'Tous les dés polyédriques couramment utilisés dans les JdR et jeux de société: D4, D6, D8, D10, D12, D20 et D100.'
238
238
  }
239
239
  },
240
240
  {
@@ -10,7 +10,7 @@ export const content: ToolLocaleContent = {
10
10
  rollButton: 'Бросить кости',
11
11
  clearButton: 'Очистить историю',
12
12
  historyTitle: 'История бросков',
13
- noHistory: 'История бросков пуста. Добавьте кости и нажмите «Бросить кости», чтобы начать.',
13
+ noHistory: 'История бросков пуста. Добавьте кости и нажмите "Бросить кости", чтобы начать.',
14
14
  totalRolls: 'Всего бросков',
15
15
  averageRoll: 'Средний результат',
16
16
  lastRoll: 'Последняя сумма',
@@ -33,7 +33,7 @@ export const content: ToolLocaleContent = {
33
33
  { type: 'title', text: 'Математика нескольких костей: Почему 3d6 надежнее, чем 1d20', level: 2 },
34
34
  { type: 'paragraph', html: 'Когда вы бросаете одну кость D20, каждый результат от 1 до 20 имеет равный шанс в 5%, что дает равномерное распределение вероятностей. Однако при броске нескольких костей, например 3d6, результаты группируются вокруг среднего значения 10.5. Эта куполообразная кривая (распределение Гаусса) означает, что вы гораздо чаще будете выбрасывать средние значения, чем крайние, что обеспечивает стабильность и сглаживает непредсказуемость одиночного кубика.' },
35
35
  { type: 'title', text: 'Разбор вероятностей D20: Критические попадания, критические провалы (pifia) и роль модификаторов', level: 2 },
36
- { type: 'paragraph', html: 'Простой модификатор «плюс два» может кардинально изменить вероятность успеха, превращая сложные задачи в легко выполнимые. Во многих игровых системах чистая 20 означает автоматический критический успех (шанс 5%), тогда как чистая 1 - критический провал (pifia). Визуализация этих исходов помогает демистифицировать случайность и позволяет планировать тактические ходы на основе статистики.' },
36
+ { type: 'paragraph', html: 'Простой модификатор "плюс два" может кардинально изменить вероятность успеха, превращая сложные задачи в легко выполнимые. Во многих игровых системах чистая 20 означает автоматический критический успех (шанс 5%), тогда как чистая 1 - критический провал (pifia). Визуализация этих исходов помогает демистифицировать случайность и позволяет планировать тактические ходы на основе статистики.' },
37
37
  {
38
38
  type: 'title',
39
39
  text: 'Таблица характеристик стандартных многогранных костей',
@@ -126,7 +126,7 @@ export const content: ToolLocaleContent = {
126
126
  title: 'Ошибка игрока: Почему у кубиков нет памяти',
127
127
  icon: 'mdi:information-outline',
128
128
  badge: 'PROBABILITY TIP',
129
- html: 'Распространенное заблуждение в настольных играх - вера в то, что предыдущие броски влияют на будущие. Если вы выбросили три «1» подряд на D20, вам может показаться, что высокий результат уже «на подходе». На самом деле каждый бросок - независимое событие. Вероятность выбросить 20 при следующем броске по-прежнему составляет ровно 5%. �-нание этого помогает игрокам делать тактический выбор объективно.',
129
+ html: 'Распространенное заблуждение в настольных играх - вера в то, что предыдущие броски влияют на будущие. Если вы выбросили три "1" подряд на D20, вам может показаться, что высокий результат уже "на подходе". На самом деле каждый бросок - независимое событие. Вероятность выбросить 20 при следующем броске по-прежнему составляет ровно 5%. �-нание этого помогает игрокам делать тактический выбор объективно.',
130
130
  },
131
131
  {
132
132
  type: 'title',
@@ -205,7 +205,7 @@ export const content: ToolLocaleContent = {
205
205
  },
206
206
  {
207
207
  name: 'Бросить и оценить статистику',
208
- text: 'Нажмите «Бросить кости», чтобы увидеть визуализацию броска, историю и расчет вероятностей.',
208
+ text: 'Нажмите "Бросить кости", чтобы увидеть визуализацию броска, историю и расчет вероятностей.',
209
209
  },
210
210
  ],
211
211
  schemas: [
@@ -297,7 +297,7 @@ export const content: ToolLocaleContent = {
297
297
  {
298
298
  '@type': 'HowToStep',
299
299
  'name': 'Бросить и оценить статистику',
300
- 'text': 'Нажмите «Бросить кости», чтобы увидеть визуализацию броска, историю и расчет вероятностей.'
300
+ 'text': 'Нажмите "Бросить кости", чтобы увидеть визуализацию броска, историю и расчет вероятностей.'
301
301
  }
302
302
  ]
303
303
  }