@jjlmoya/utils-tabletop 1.44.0 → 1.46.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 +2 -2
- package/scripts/validate-icons.mjs +57 -0
- package/src/category/TabletopCategoryHome.astro +196 -0
- package/src/category/tabletop-home.css +1139 -0
- package/src/layouts/ProductionUtilityPage.astro +5 -5
- package/src/mfe/category-ui.ts +18 -15
- package/src/mfe/widget-height.ts +14 -0
- package/src/pages/[locale]/[utilities]/[categories]/[category].astro +2 -2
- package/src/pages/utilidades/categorias/[category].astro +2 -2
- package/src/tests/category_ui.test.ts +4 -0
|
@@ -38,13 +38,14 @@ const ui = getCategoryUi(locale);
|
|
|
38
38
|
<ProductionStructuredData locale={locale} {content} {publicPath} categoryTitle={categoryTitle} categoryHref={categoryHref || publicCategoryPath} />
|
|
39
39
|
</Fragment>
|
|
40
40
|
<section class="utility-section-production"><SEOComponent locale={locale} /></section>
|
|
41
|
-
{content.bibliography
|
|
41
|
+
{(content.bibliography?.length ?? 0) > 0 && <section class="utility-section-production"><BibliographyComponent locale={locale} /></section>}
|
|
42
42
|
{relatedTools.length > 0 && <section class="utility-related-production" aria-labelledby="related-tools-title"><div class="utility-related-heading"><span class="utility-related-eyebrow">{ui.relatedEyebrow}</span><h2 id="related-tools-title">{ui.moreToolsIn} {categoryTitle}</h2></div><div class="utility-related-grid">{relatedTools.map((tool, index) => <a href={tool.href} class="utility-related-card"><span class="utility-related-index">{String(index + 1).padStart(2, "0")}</span><span class="utility-related-icon"><Icon name={tool.icon} /></span><h3>{tool.title}</h3><p>{tool.description}</p><span class="utility-related-cta">{ui.openTool} <Icon name="mdi:arrow-top-right" /></span></a>)}</div></section>}
|
|
43
43
|
</div>
|
|
44
44
|
</div>
|
|
45
45
|
</ProductionPage>
|
|
46
46
|
|
|
47
47
|
<script>
|
|
48
|
+
import { observeWidgetHeight } from "../mfe/widget-height";
|
|
48
49
|
const isWidget = new URLSearchParams(window.location.search).get("widget") === "true";
|
|
49
50
|
const page = document.querySelector<HTMLElement>(".utility-production");
|
|
50
51
|
const container = document.querySelector<HTMLElement>(".utility-tool-production");
|
|
@@ -60,11 +61,10 @@ const ui = getCategoryUi(locale);
|
|
|
60
61
|
document.querySelector('[data-zoom="reset"]')?.addEventListener("click", () => { zoom = 1; applyZoom(); localStorage.removeItem("gamebob-utility-zoom"); });
|
|
61
62
|
if (isWidget) {
|
|
62
63
|
document.body.classList.add("utility-widget-body");
|
|
63
|
-
|
|
64
|
-
page.classList.add("utility-widget-mode");
|
|
65
|
-
}
|
|
64
|
+
page?.classList.add("utility-widget-mode");
|
|
66
65
|
}
|
|
67
66
|
applyZoom();
|
|
67
|
+
if (isWidget && container) observeWidgetHeight(container);
|
|
68
68
|
</script>
|
|
69
69
|
|
|
70
70
|
<style>
|
|
@@ -88,7 +88,7 @@ const ui = getCategoryUi(locale);
|
|
|
88
88
|
margin-top: 0;
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
.utility-production.utility-widget-mode .utility-production-inner > :not(.utility-tool-production) {
|
|
91
|
+
:global(.utility-production.utility-widget-mode .utility-production-inner > :not(.utility-tool-production)) {
|
|
92
92
|
display: none;
|
|
93
93
|
}
|
|
94
94
|
|
package/src/mfe/category-ui.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import type { KnownLocale } from '../types';
|
|
2
2
|
|
|
3
3
|
export interface CategoryUi {
|
|
4
|
+
heroTitle: string;
|
|
5
|
+
catalogTitle: string;
|
|
4
6
|
useTool: string;
|
|
5
7
|
openTool: string;
|
|
8
|
+
shuffleTool: string;
|
|
6
9
|
relatedEyebrow: string;
|
|
7
10
|
moreToolsIn: string;
|
|
8
11
|
zoom: string;
|
|
@@ -14,21 +17,21 @@ export interface CategoryUi {
|
|
|
14
17
|
}
|
|
15
18
|
|
|
16
19
|
export const CATEGORY_UI: Record<KnownLocale, CategoryUi> = {
|
|
17
|
-
es: { useTool: 'Usar herramienta', openTool: 'Abrir herramienta', relatedEyebrow: 'Sigue explorando', moreToolsIn: 'Más herramientas en', zoom: 'Zoom', zoomControls: 'Controles de zoom', zoomOut: 'Reducir zoom', resetZoom: 'Restablecer zoom', zoomIn: 'Aumentar zoom', breadcrumb: 'Migas de pan' },
|
|
18
|
-
en: { useTool: 'Use tool', openTool: 'Open tool', relatedEyebrow: 'Keep exploring', moreToolsIn: 'More tools in', zoom: 'Zoom', zoomControls: 'Zoom controls', zoomOut: 'Zoom out', resetZoom: 'Reset zoom', zoomIn: 'Zoom in', breadcrumb: 'Breadcrumb' },
|
|
19
|
-
fr: { useTool: "Utiliser l'outil", openTool: "Ouvrir l'outil", relatedEyebrow: 'Continuez à explorer', moreToolsIn: "Plus d'outils dans", zoom: 'Zoom', zoomControls: 'Commandes de zoom', zoomOut: 'Réduire
|
|
20
|
-
de: { useTool: 'Werkzeug verwenden', openTool: 'Werkzeug öffnen', relatedEyebrow: 'Mehr entdecken', moreToolsIn: 'Weitere Werkzeuge in', zoom: 'Zoom', zoomControls: 'Zoom-Steuerung', zoomOut: 'Verkleinern', resetZoom: 'Zoom zurücksetzen', zoomIn: 'Vergrößern', breadcrumb: 'Brotkrümelnavigation' },
|
|
21
|
-
it: { useTool: 'Usa lo strumento', openTool: 'Apri lo strumento', relatedEyebrow: 'Continua a esplorare', moreToolsIn: 'Altri strumenti in', zoom: 'Zoom', zoomControls: 'Controlli zoom', zoomOut: 'Riduci zoom', resetZoom: 'Reimposta zoom', zoomIn: 'Aumenta zoom', breadcrumb: 'Breadcrumb' },
|
|
22
|
-
pt: { useTool: 'Usar ferramenta', openTool: 'Abrir ferramenta', relatedEyebrow: 'Continue a explorar', moreToolsIn: 'Mais ferramentas em', zoom: 'Zoom', zoomControls: 'Controlos de zoom', zoomOut: 'Reduzir zoom', resetZoom: 'Repor zoom', zoomIn: 'Aumentar zoom', breadcrumb: 'Trilho de navegação' },
|
|
23
|
-
nl: { useTool: 'Tool gebruiken', openTool: 'Tool openen', relatedEyebrow: 'Blijf ontdekken', moreToolsIn: 'Meer tools in', zoom: 'Zoom', zoomControls: 'Zoomknoppen', zoomOut: 'Uitzoomen', resetZoom: 'Zoom herstellen', zoomIn: 'Inzoomen', breadcrumb: 'Broodkruimelnavigatie' },
|
|
24
|
-
sv: { useTool: 'Använd verktyget', openTool: 'Öppna verktyget', relatedEyebrow: 'Utforska mer', moreToolsIn: 'Fler verktyg i', zoom: 'Zoom', zoomControls: 'Zoomkontroller', zoomOut: 'Zooma ut', resetZoom: 'Återställ zoom', zoomIn: 'Zooma in', breadcrumb: 'Brödsmulenavigering' },
|
|
25
|
-
pl: { useTool: 'Użyj narzędzia', openTool: 'Otwórz narzędzie', relatedEyebrow: 'Odkrywaj dalej', moreToolsIn: 'Więcej narzędzi w', zoom: 'Powiększenie', zoomControls: 'Sterowanie powiększeniem', zoomOut: 'Pomniejsz', resetZoom: 'Resetuj powiększenie', zoomIn: 'Powiększ', breadcrumb: 'Okruszki nawigacji' },
|
|
26
|
-
id: { useTool: 'Gunakan alat', openTool: 'Buka alat', relatedEyebrow: 'Jelajahi lebih lanjut', moreToolsIn: 'Alat lainnya di', zoom: 'Zoom', zoomControls: 'Kontrol zoom', zoomOut: 'Perkecil', resetZoom: 'Atur ulang zoom', zoomIn: 'Perbesar', breadcrumb: 'Breadcrumb' },
|
|
27
|
-
tr: { useTool: 'Aracı kullan', openTool: 'Aracı aç', relatedEyebrow: 'Keşfetmeye devam edin', moreToolsIn: 'Diğer araçlar:', zoom: 'Yakınlaştırma', zoomControls: 'Yakınlaştırma denetimleri', zoomOut: 'Uzaklaştır', resetZoom: 'Yakınlaştırmayı sıfırla', zoomIn: 'Yakınlaştır', breadcrumb: 'İçerik haritası' },
|
|
28
|
-
ru: { useTool: 'Использовать инструмент', openTool: 'Открыть инструмент', relatedEyebrow: 'Продолжить изучение', moreToolsIn: 'Другие инструменты в', zoom: 'Масштаб', zoomControls: 'Управление масштабом', zoomOut: 'Уменьшить', resetZoom: 'Сбросить масштаб', zoomIn: 'Увеличить', breadcrumb: 'Навигационная цепочка' },
|
|
29
|
-
ja: { useTool: 'ツールを使う', openTool: 'ツールを開く', relatedEyebrow: 'さらに探索', moreToolsIn: 'その他のツール:', zoom: 'ズーム', zoomControls: 'ズーム操作', zoomOut: '縮小', resetZoom: 'ズームをリセット', zoomIn: '拡大', breadcrumb: 'パンくずリスト' },
|
|
30
|
-
ko: { useTool: '도구 사용', openTool: '도구 열기', relatedEyebrow: '더 탐색하기', moreToolsIn: '카테고리의 다른 도구:', zoom: '확대/축소', zoomControls: '확대/축소 컨트롤', zoomOut: '축소', resetZoom: '확대/축소 초기화', zoomIn: '확대', breadcrumb: '탐색 경로' },
|
|
31
|
-
zh: { useTool: '使用工具', openTool: '打开工具', relatedEyebrow: '继续探索', moreToolsIn: '更多工具:', zoom: '缩放', zoomControls: '缩放控件', zoomOut: '缩小', resetZoom: '重置缩放', zoomIn: '放大', breadcrumb: '面包屑导航' },
|
|
20
|
+
es: { heroTitle: 'Juegos de mesa', catalogTitle: 'Herramientas para la mesa', useTool: 'Usar herramienta', openTool: 'Abrir herramienta', shuffleTool: 'Barajar el mazo', relatedEyebrow: 'Sigue explorando', moreToolsIn: 'Más herramientas en', zoom: 'Zoom', zoomControls: 'Controles de zoom', zoomOut: 'Reducir zoom', resetZoom: 'Restablecer zoom', zoomIn: 'Aumentar zoom', breadcrumb: 'Migas de pan' },
|
|
21
|
+
en: { heroTitle: 'Tabletop games', catalogTitle: 'Tools for the table', useTool: 'Use tool', openTool: 'Open tool', shuffleTool: 'Shuffle the deck', relatedEyebrow: 'Keep exploring', moreToolsIn: 'More tools in', zoom: 'Zoom', zoomControls: 'Zoom controls', zoomOut: 'Zoom out', resetZoom: 'Reset zoom', zoomIn: 'Zoom in', breadcrumb: 'Breadcrumb' },
|
|
22
|
+
fr: { heroTitle: 'Jeux de société', catalogTitle: 'Outils pour la table', useTool: "Utiliser l'outil", openTool: "Ouvrir l'outil", shuffleTool: 'Mélanger le paquet', relatedEyebrow: 'Continuez à explorer', moreToolsIn: "Plus d'outils dans", zoom: 'Zoom', zoomControls: 'Commandes de zoom', zoomOut: 'Réduire', resetZoom: 'Réinitialiser', zoomIn: 'Augmenter', breadcrumb: 'Fil d’Ariane' },
|
|
23
|
+
de: { heroTitle: 'Brettspiele', catalogTitle: 'Werkzeuge für den Tisch', useTool: 'Werkzeug verwenden', openTool: 'Werkzeug öffnen', shuffleTool: 'Deck mischen', relatedEyebrow: 'Mehr entdecken', moreToolsIn: 'Weitere Werkzeuge in', zoom: 'Zoom', zoomControls: 'Zoom-Steuerung', zoomOut: 'Verkleinern', resetZoom: 'Zoom zurücksetzen', zoomIn: 'Vergrößern', breadcrumb: 'Brotkrümelnavigation' },
|
|
24
|
+
it: { heroTitle: 'Giochi da tavolo', catalogTitle: 'Strumenti per il tavolo', useTool: 'Usa lo strumento', openTool: 'Apri lo strumento', shuffleTool: 'Mescola il mazzo', relatedEyebrow: 'Continua a esplorare', moreToolsIn: 'Altri strumenti in', zoom: 'Zoom', zoomControls: 'Controlli zoom', zoomOut: 'Riduci zoom', resetZoom: 'Reimposta zoom', zoomIn: 'Aumenta zoom', breadcrumb: 'Breadcrumb' },
|
|
25
|
+
pt: { heroTitle: 'Jogos de mesa', catalogTitle: 'Ferramentas para a mesa', useTool: 'Usar ferramenta', openTool: 'Abrir ferramenta', shuffleTool: 'Baralhar o baralho', relatedEyebrow: 'Continue a explorar', moreToolsIn: 'Mais ferramentas em', zoom: 'Zoom', zoomControls: 'Controlos de zoom', zoomOut: 'Reduzir zoom', resetZoom: 'Repor zoom', zoomIn: 'Aumentar zoom', breadcrumb: 'Trilho de navegação' },
|
|
26
|
+
nl: { heroTitle: 'Bordspellen', catalogTitle: 'Tools voor de tafel', useTool: 'Tool gebruiken', openTool: 'Tool openen', shuffleTool: 'Schud de stapel', relatedEyebrow: 'Blijf ontdekken', moreToolsIn: 'Meer tools in', zoom: 'Zoom', zoomControls: 'Zoomknoppen', zoomOut: 'Uitzoomen', resetZoom: 'Zoom herstellen', zoomIn: 'Inzoomen', breadcrumb: 'Broodkruimelnavigatie' },
|
|
27
|
+
sv: { heroTitle: 'Bordsspel', catalogTitle: 'Verktyg för bordet', useTool: 'Använd verktyget', openTool: 'Öppna verktyget', shuffleTool: 'Blanda kortleken', relatedEyebrow: 'Utforska mer', moreToolsIn: 'Fler verktyg i', zoom: 'Zoom', zoomControls: 'Zoomkontroller', zoomOut: 'Zooma ut', resetZoom: 'Återställ zoom', zoomIn: 'Zooma in', breadcrumb: 'Brödsmulenavigering' },
|
|
28
|
+
pl: { heroTitle: 'Gry planszowe', catalogTitle: 'Narzędzia do stołu', useTool: 'Użyj narzędzia', openTool: 'Otwórz narzędzie', shuffleTool: 'Przetasuj talię', relatedEyebrow: 'Odkrywaj dalej', moreToolsIn: 'Więcej narzędzi w', zoom: 'Powiększenie', zoomControls: 'Sterowanie powiększeniem', zoomOut: 'Pomniejsz', resetZoom: 'Resetuj powiększenie', zoomIn: 'Powiększ', breadcrumb: 'Okruszki nawigacji' },
|
|
29
|
+
id: { heroTitle: 'Permainan papan', catalogTitle: 'Alat untuk meja', useTool: 'Gunakan alat', openTool: 'Buka alat', shuffleTool: 'Kocokkan dek', relatedEyebrow: 'Jelajahi lebih lanjut', moreToolsIn: 'Alat lainnya di', zoom: 'Zoom', zoomControls: 'Kontrol zoom', zoomOut: 'Perkecil', resetZoom: 'Atur ulang zoom', zoomIn: 'Perbesar', breadcrumb: 'Breadcrumb' },
|
|
30
|
+
tr: { heroTitle: 'Masa oyunları', catalogTitle: 'Masa için araçlar', useTool: 'Aracı kullan', openTool: 'Aracı aç', shuffleTool: 'Desteyi karıştır', relatedEyebrow: 'Keşfetmeye devam edin', moreToolsIn: 'Diğer araçlar:', zoom: 'Yakınlaştırma', zoomControls: 'Yakınlaştırma denetimleri', zoomOut: 'Uzaklaştır', resetZoom: 'Yakınlaştırmayı sıfırla', zoomIn: 'Yakınlaştır', breadcrumb: 'İçerik haritası' },
|
|
31
|
+
ru: { heroTitle: 'Настольные игры', catalogTitle: 'Инструменты для стола', useTool: 'Использовать инструмент', openTool: 'Открыть инструмент', shuffleTool: 'Перемешать колоду', relatedEyebrow: 'Продолжить изучение', moreToolsIn: 'Другие инструменты в', zoom: 'Масштаб', zoomControls: 'Управление масштабом', zoomOut: 'Уменьшить', resetZoom: 'Сбросить масштаб', zoomIn: 'Увеличить', breadcrumb: 'Навигационная цепочка' },
|
|
32
|
+
ja: { heroTitle: 'テーブルゲーム', catalogTitle: 'テーブルのツール', useTool: 'ツールを使う', openTool: 'ツールを開く', shuffleTool: 'デッキを切る', relatedEyebrow: 'さらに探索', moreToolsIn: 'その他のツール:', zoom: 'ズーム', zoomControls: 'ズーム操作', zoomOut: '縮小', resetZoom: 'ズームをリセット', zoomIn: '拡大', breadcrumb: 'パンくずリスト' },
|
|
33
|
+
ko: { heroTitle: '테이블 게임', catalogTitle: '테이블 도구', useTool: '도구 사용', openTool: '도구 열기', shuffleTool: '덱 섞기', relatedEyebrow: '더 탐색하기', moreToolsIn: '카테고리의 다른 도구:', zoom: '확대/축소', zoomControls: '확대/축소 컨트롤', zoomOut: '축소', resetZoom: '확대/축소 초기화', zoomIn: '확대', breadcrumb: '탐색 경로' },
|
|
34
|
+
zh: { heroTitle: '桌游', catalogTitle: '桌面工具', useTool: '使用工具', openTool: '打开工具', shuffleTool: '洗牌', relatedEyebrow: '继续探索', moreToolsIn: '更多工具:', zoom: '缩放', zoomControls: '缩放控件', zoomOut: '缩小', resetZoom: '重置缩放', zoomIn: '放大', breadcrumb: '面包屑导航' },
|
|
32
35
|
};
|
|
33
36
|
|
|
34
37
|
export const getCategoryUi = (locale: KnownLocale): CategoryUi => CATEGORY_UI[locale];
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function observeWidgetHeight(container: HTMLElement): void {
|
|
2
|
+
if (window.parent === window) return;
|
|
3
|
+
|
|
4
|
+
const pathSlug = window.location.pathname.split("/").filter(Boolean).pop() ?? "utility";
|
|
5
|
+
const widgetId = new URLSearchParams(window.location.search).get("id") ?? `jj-widget-${pathSlug}`;
|
|
6
|
+
const reportHeight = (height: number) => {
|
|
7
|
+
if (height > 50) {
|
|
8
|
+
window.parent.postMessage({ jjlmoyaHeight: Math.ceil(height), jjlmoyaId: widgetId }, "*");
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
const observer = new ResizeObserver(([entry]) => reportHeight(entry?.contentRect.height ?? 0));
|
|
12
|
+
|
|
13
|
+
observer.observe(container);
|
|
14
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
import
|
|
2
|
+
import TabletopCategoryHome from "../../../../category/TabletopCategoryHome.astro";
|
|
3
3
|
import { ALL_ENTRIES, tabletopCategory } from "../../../../index";
|
|
4
4
|
import { LANGUAGE_CODES, type Language } from "../../../../i18n/languages";
|
|
5
5
|
import { getCategoryNamespace, getCategoryPath, getUtilityNamespace, getUtilityPath } from "../../../../mfe/routes";
|
|
@@ -41,4 +41,4 @@ const tools = await Promise.all(ALL_ENTRIES.map(async (entry) => {
|
|
|
41
41
|
}));
|
|
42
42
|
---
|
|
43
43
|
|
|
44
|
-
<
|
|
44
|
+
<TabletopCategoryHome locale={locale} {category} {tools} {alternates} image={CATEGORY_OG_IMAGE} />
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
import
|
|
2
|
+
import TabletopCategoryHome from "../../../category/TabletopCategoryHome.astro";
|
|
3
3
|
import { ALL_ENTRIES, tabletopCategory } from "../../../index";
|
|
4
4
|
import { LANGUAGE_CODES, type Language } from "../../../i18n/languages";
|
|
5
5
|
import { getCategoryPath, getUtilityPath } from "../../../mfe/routes";
|
|
@@ -35,4 +35,4 @@ const tools = await Promise.all(ALL_ENTRIES.map(async (entry) => {
|
|
|
35
35
|
}));
|
|
36
36
|
---
|
|
37
37
|
|
|
38
|
-
<
|
|
38
|
+
<TabletopCategoryHome locale="es" {category} {tools} {alternates} image={CATEGORY_OG_IMAGE} />
|
|
@@ -6,7 +6,10 @@ describe('category UI translations', () => {
|
|
|
6
6
|
it('provides a translated use-tool CTA for every supported locale', () => {
|
|
7
7
|
for (const locale of UTILITY_LOCALES) {
|
|
8
8
|
expect(getCategoryUi(locale).useTool.trim()).not.toBe('');
|
|
9
|
+
expect(getCategoryUi(locale).heroTitle.trim()).not.toBe('');
|
|
10
|
+
expect(getCategoryUi(locale).catalogTitle.trim()).not.toBe('');
|
|
9
11
|
expect(getCategoryUi(locale).openTool.trim()).not.toBe('');
|
|
12
|
+
expect(getCategoryUi(locale).shuffleTool.trim()).not.toBe('');
|
|
10
13
|
expect(getCategoryUi(locale).relatedEyebrow.trim()).not.toBe('');
|
|
11
14
|
expect(getCategoryUi(locale).moreToolsIn.trim()).not.toBe('');
|
|
12
15
|
expect(getCategoryUi(locale).zoomControls.trim()).not.toBe('');
|
|
@@ -16,6 +19,7 @@ describe('category UI translations', () => {
|
|
|
16
19
|
expect(Object.keys(CATEGORY_UI).sort()).toEqual([...UTILITY_LOCALES].sort());
|
|
17
20
|
expect(UTILITY_LOCALES.filter((locale) => locale !== 'en').every((locale) => getCategoryUi(locale).useTool !== 'Use tool')).toBe(true);
|
|
18
21
|
expect(UTILITY_LOCALES.filter((locale) => locale !== 'en').every((locale) => getCategoryUi(locale).openTool !== 'Open tool')).toBe(true);
|
|
22
|
+
expect(UTILITY_LOCALES.filter((locale) => locale !== 'en').every((locale) => getCategoryUi(locale).shuffleTool !== 'Roll a tool')).toBe(true);
|
|
19
23
|
expect(UTILITY_LOCALES.filter((locale) => locale !== 'en').every((locale) => getCategoryUi(locale).relatedEyebrow !== 'Keep exploring')).toBe(true);
|
|
20
24
|
expect(UTILITY_LOCALES.filter((locale) => locale !== 'en').every((locale) => getCategoryUi(locale).moreToolsIn !== 'More tools in')).toBe(true);
|
|
21
25
|
});
|