@jjlmoya/utils-nautical 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 (125) hide show
  1. package/package.json +1 -1
  2. package/src/pages/[locale]/[slug].astro +28 -12
  3. package/src/tests/locale_completeness.test.ts +1 -31
  4. package/src/tests/shared-test-helpers.ts +56 -0
  5. package/src/tests/tool_exports.test.ts +34 -0
  6. package/src/tool/endurance/bibliography.astro +1 -1
  7. package/src/tool/endurance/bibliography.ts +12 -0
  8. package/src/tool/endurance/entry.ts +2 -2
  9. package/src/tool/endurance/i18n/de.ts +1 -13
  10. package/src/tool/endurance/i18n/en.ts +1 -12
  11. package/src/tool/endurance/i18n/es.ts +1 -13
  12. package/src/tool/endurance/i18n/fr.ts +1 -13
  13. package/src/tool/endurance/i18n/id.ts +1 -13
  14. package/src/tool/endurance/i18n/it.ts +1 -13
  15. package/src/tool/endurance/i18n/ja.ts +1 -13
  16. package/src/tool/endurance/i18n/ko.ts +1 -13
  17. package/src/tool/endurance/i18n/nl.ts +1 -13
  18. package/src/tool/endurance/i18n/pl.ts +1 -13
  19. package/src/tool/endurance/i18n/pt.ts +1 -13
  20. package/src/tool/endurance/i18n/ru.ts +1 -13
  21. package/src/tool/endurance/i18n/sv.ts +1 -13
  22. package/src/tool/endurance/i18n/tr.ts +1 -13
  23. package/src/tool/endurance/i18n/zh.ts +1 -13
  24. package/src/tool/endurance/nautical-endurance-calculator.css +1 -1
  25. package/src/tool/endurance/seo.astro +2 -42
  26. package/src/tool/nauticalConverter/bibliography.astro +1 -1
  27. package/src/tool/nauticalConverter/bibliography.ts +12 -0
  28. package/src/tool/nauticalConverter/entry.ts +2 -2
  29. package/src/tool/nauticalConverter/i18n/de.ts +1 -13
  30. package/src/tool/nauticalConverter/i18n/en.ts +1 -13
  31. package/src/tool/nauticalConverter/i18n/es.ts +1 -13
  32. package/src/tool/nauticalConverter/i18n/fr.ts +1 -13
  33. package/src/tool/nauticalConverter/i18n/id.ts +1 -13
  34. package/src/tool/nauticalConverter/i18n/it.ts +1 -13
  35. package/src/tool/nauticalConverter/i18n/ja.ts +1 -13
  36. package/src/tool/nauticalConverter/i18n/ko.ts +1 -13
  37. package/src/tool/nauticalConverter/i18n/nl.ts +1 -13
  38. package/src/tool/nauticalConverter/i18n/pl.ts +1 -13
  39. package/src/tool/nauticalConverter/i18n/pt.ts +1 -13
  40. package/src/tool/nauticalConverter/i18n/ru.ts +1 -13
  41. package/src/tool/nauticalConverter/i18n/sv.ts +1 -13
  42. package/src/tool/nauticalConverter/i18n/tr.ts +1 -13
  43. package/src/tool/nauticalConverter/i18n/zh.ts +1 -13
  44. package/src/tool/nauticalConverter/nautical-units-converter.css +1 -1
  45. package/src/tool/nauticalConverter/seo.astro +2 -39
  46. package/src/tool/sailArea/bibliography.astro +1 -1
  47. package/src/tool/sailArea/bibliography.ts +16 -0
  48. package/src/tool/sailArea/entry.ts +2 -2
  49. package/src/tool/sailArea/i18n/de.ts +1 -17
  50. package/src/tool/sailArea/i18n/en.ts +1 -17
  51. package/src/tool/sailArea/i18n/es.ts +1 -17
  52. package/src/tool/sailArea/i18n/fr.ts +1 -17
  53. package/src/tool/sailArea/i18n/id.ts +1 -17
  54. package/src/tool/sailArea/i18n/it.ts +1 -17
  55. package/src/tool/sailArea/i18n/ja.ts +1 -17
  56. package/src/tool/sailArea/i18n/ko.ts +1 -17
  57. package/src/tool/sailArea/i18n/nl.ts +1 -17
  58. package/src/tool/sailArea/i18n/pl.ts +1 -17
  59. package/src/tool/sailArea/i18n/pt.ts +1 -17
  60. package/src/tool/sailArea/i18n/ru.ts +1 -17
  61. package/src/tool/sailArea/i18n/sv.ts +1 -17
  62. package/src/tool/sailArea/i18n/tr.ts +1 -17
  63. package/src/tool/sailArea/i18n/zh.ts +1 -17
  64. package/src/tool/sailArea/sail-area-calculator.css +2 -2
  65. package/src/tool/sailArea/seo.astro +2 -39
  66. package/src/tool/speedConverter/bibliography.astro +1 -1
  67. package/src/tool/speedConverter/bibliography.ts +12 -0
  68. package/src/tool/speedConverter/entry.ts +2 -2
  69. package/src/tool/speedConverter/i18n/de.ts +1 -13
  70. package/src/tool/speedConverter/i18n/en.ts +1 -13
  71. package/src/tool/speedConverter/i18n/es.ts +1 -13
  72. package/src/tool/speedConverter/i18n/fr.ts +1 -13
  73. package/src/tool/speedConverter/i18n/id.ts +1 -13
  74. package/src/tool/speedConverter/i18n/it.ts +1 -13
  75. package/src/tool/speedConverter/i18n/ja.ts +1 -13
  76. package/src/tool/speedConverter/i18n/ko.ts +1 -13
  77. package/src/tool/speedConverter/i18n/nl.ts +1 -13
  78. package/src/tool/speedConverter/i18n/pl.ts +1 -13
  79. package/src/tool/speedConverter/i18n/pt.ts +1 -13
  80. package/src/tool/speedConverter/i18n/ru.ts +1 -13
  81. package/src/tool/speedConverter/i18n/sv.ts +1 -13
  82. package/src/tool/speedConverter/i18n/tr.ts +1 -13
  83. package/src/tool/speedConverter/i18n/zh.ts +1 -13
  84. package/src/tool/speedConverter/nautical-speed-converter.css +1 -1
  85. package/src/tool/speedConverter/seo.astro +2 -30
  86. package/src/tool/tideCalculator/bibliography.astro +1 -1
  87. package/src/tool/tideCalculator/bibliography.ts +12 -0
  88. package/src/tool/tideCalculator/entry.ts +2 -2
  89. package/src/tool/tideCalculator/i18n/de.ts +1 -13
  90. package/src/tool/tideCalculator/i18n/en.ts +1 -13
  91. package/src/tool/tideCalculator/i18n/es.ts +1 -13
  92. package/src/tool/tideCalculator/i18n/fr.ts +1 -13
  93. package/src/tool/tideCalculator/i18n/id.ts +1 -13
  94. package/src/tool/tideCalculator/i18n/it.ts +1 -13
  95. package/src/tool/tideCalculator/i18n/ja.ts +1 -13
  96. package/src/tool/tideCalculator/i18n/ko.ts +1 -13
  97. package/src/tool/tideCalculator/i18n/nl.ts +1 -13
  98. package/src/tool/tideCalculator/i18n/pl.ts +1 -13
  99. package/src/tool/tideCalculator/i18n/pt.ts +1 -13
  100. package/src/tool/tideCalculator/i18n/ru.ts +1 -13
  101. package/src/tool/tideCalculator/i18n/sv.ts +1 -13
  102. package/src/tool/tideCalculator/i18n/tr.ts +1 -13
  103. package/src/tool/tideCalculator/i18n/zh.ts +1 -13
  104. package/src/tool/tideCalculator/seo.astro +2 -48
  105. package/src/tool/tideCalculator/tide-height-calculator.css +4 -4
  106. package/src/tool/underKeel/bibliography.astro +1 -1
  107. package/src/tool/underKeel/bibliography.ts +12 -0
  108. package/src/tool/underKeel/entry.ts +2 -2
  109. package/src/tool/underKeel/i18n/de.ts +1 -13
  110. package/src/tool/underKeel/i18n/en.ts +1 -13
  111. package/src/tool/underKeel/i18n/es.ts +1 -13
  112. package/src/tool/underKeel/i18n/fr.ts +1 -13
  113. package/src/tool/underKeel/i18n/id.ts +2 -14
  114. package/src/tool/underKeel/i18n/it.ts +2 -14
  115. package/src/tool/underKeel/i18n/ja.ts +2 -14
  116. package/src/tool/underKeel/i18n/ko.ts +2 -14
  117. package/src/tool/underKeel/i18n/nl.ts +2 -14
  118. package/src/tool/underKeel/i18n/pl.ts +2 -14
  119. package/src/tool/underKeel/i18n/pt.ts +2 -14
  120. package/src/tool/underKeel/i18n/ru.ts +2 -14
  121. package/src/tool/underKeel/i18n/sv.ts +2 -14
  122. package/src/tool/underKeel/i18n/tr.ts +2 -14
  123. package/src/tool/underKeel/i18n/zh.ts +2 -14
  124. package/src/tool/underKeel/seo.astro +2 -33
  125. package/src/tool/underKeel/under-keel-clearance-calculator.css +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlmoya/utils-nautical",
3
- "version": "1.14.0",
3
+ "version": "1.16.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -34,18 +34,28 @@ export async function getStaticPaths() {
34
34
  ]),
35
35
  ) as Partial<Record<KnownLocale, string>>;
36
36
 
37
+ const firstLoader = entry.i18n.en ?? Object.values(entry.i18n)[0];
38
+ const englishSlug = firstLoader ? (await firstLoader()).slug : entry.id;
39
+
37
40
  for (const { locale, content } of localeContents) {
38
- const allToolsNav = await Promise.all(
39
- ALL_TOOLS.map(async ({ entry: navEntry }) => ({
40
- id: navEntry.id,
41
- title: (await navEntry.i18n[locale]!()).title,
42
- href: `/${locale}/${(await navEntry.i18n[locale]!()).slug}`,
43
- isActive: navEntry.id === entry.id,
44
- })),
45
- );
41
+ const allToolsNav = (
42
+ await Promise.all(
43
+ ALL_TOOLS.map(async ({ entry: navEntry }) => {
44
+ const loader = navEntry.i18n[locale] ?? navEntry.i18n.en;
45
+ if (!loader) return null;
46
+ const navContent = await loader();
47
+ return {
48
+ id: navEntry.id,
49
+ title: navContent.title,
50
+ href: `/${locale}/${navContent.slug}`,
51
+ isActive: navEntry.id === entry.id,
52
+ };
53
+ }),
54
+ )
55
+ ).filter(Boolean) as NavItem[];
46
56
  paths.push({
47
57
  params: { locale, slug: content.slug },
48
- props: { Component, locale, content, localeUrls, allToolsNav },
58
+ props: { Component, locale, content, localeUrls, allToolsNav, englishSlug },
49
59
  });
50
60
  }
51
61
  }
@@ -66,11 +76,16 @@ interface Props {
66
76
  content: ToolLocaleContent;
67
77
  localeUrls: Partial<Record<KnownLocale, string>>;
68
78
  allToolsNav: NavItem[];
79
+ englishSlug: string;
69
80
  }
70
81
 
71
- const { Component, locale, content, localeUrls, allToolsNav } = Astro.props;
82
+ const { Component, locale, content, localeUrls, allToolsNav, englishSlug } = Astro.props;
83
+
84
+ const cssFiles = import.meta.glob("../../tool/*/*.css", { query: "?raw", import: "default" });
85
+ const cssKey = Object.keys(cssFiles).find((k) => k.endsWith(`/${englishSlug}.css`));
86
+ const toolCss = cssKey ? await cssFiles[cssKey]() as string : "";
72
87
 
73
- const seoContent: UtilitySEOContent = { locale, sections: content.seo };
88
+ const seoContent: UtilitySEOContent = { locale, sections: content.seo ?? [] };
74
89
 
75
90
  const words = content.title.split(" ");
76
91
  const titleHighlight = words[0] || "";
@@ -89,8 +104,9 @@ const titleBase = words.slice(1).join(" ") || "";
89
104
  tools={allToolsNav}
90
105
  />
91
106
  <Fragment slot="head">
107
+ {toolCss ? <Fragment set:html={`<style is:inline>${toolCss}</style>`} /> : null}
92
108
  {
93
- content.schemas.map((schema: unknown) => (
109
+ ( content.schemas ?? []).map((schema: unknown) => (
94
110
  <script
95
111
  is:inline
96
112
  type="application/ld+json"
@@ -1,39 +1,9 @@
1
1
  import { describe, it, expect } from 'vitest';
2
2
  import { ALL_TOOLS } from '../tools';
3
- import type { ToolLocaleContent } from '../types';
4
3
 
5
- describe('Locale Completeness Validation', () => {
6
- ALL_TOOLS.forEach((tool) => {
7
- describe(`Tool: ${tool.entry.id}`, () => {
8
- Object.keys(tool.entry.i18n).forEach((locale) => {
9
- describe(`Locale: ${locale}`, () => {
10
- it('faqTitle should be defined when faq items exist', async () => {
11
- const loader = tool.entry.i18n[locale as keyof typeof tool.entry.i18n];
12
- const content = (await loader?.()) as ToolLocaleContent;
13
-
14
- if (content.faq.length > 0) {
15
- expect(
16
- content.ui.faqTitle,
17
- `Tool "${tool.entry.id}" locale "${locale}" has ${content.faq.length} FAQ items but is missing faqTitle in ui`,
18
- ).toBeTruthy();
19
- }
20
- });
21
4
 
22
- it('bibliographyTitle should be defined when bibliography items exist', async () => {
23
- const loader = tool.entry.i18n[locale as keyof typeof tool.entry.i18n];
24
- const content = (await loader?.()) as ToolLocaleContent;
5
+ describe('Locale Completeness Validation', () => {
25
6
 
26
- if (content.bibliography.length > 0) {
27
- expect(
28
- content.ui.bibliographyTitle,
29
- `Tool "${tool.entry.id}" locale "${locale}" has ${content.bibliography.length} bibliography items but is missing bibliographyTitle in ui`,
30
- ).toBeTruthy();
31
- }
32
- });
33
- });
34
- });
35
- });
36
- });
37
7
 
38
8
  it('all 10 tools registered', () => {
39
9
  expect(ALL_TOOLS.length).toBe(6);
@@ -0,0 +1,56 @@
1
+ import type { ToolDefinition } from '../types';
2
+
3
+ export interface ToolExportValidationResult {
4
+ passed: boolean;
5
+ failures: string[];
6
+ }
7
+
8
+ function validateComponentType(
9
+ toolId: string,
10
+ componentName: string,
11
+ component: unknown,
12
+ failures: string[],
13
+ ): void {
14
+ if (typeof component !== 'function') {
15
+ failures.push(`${toolId}: ${componentName} is not a function (${typeof component})`);
16
+ }
17
+ }
18
+
19
+ async function validateComponentExecution(
20
+ toolId: string,
21
+ componentName: string,
22
+ fn: () => Promise<unknown>,
23
+ failures: string[],
24
+ ): Promise<void> {
25
+ try {
26
+ const result = await fn();
27
+ if (!result || typeof result !== 'object') {
28
+ failures.push(`${toolId}: ${componentName} import returned invalid result`);
29
+ }
30
+ } catch (error) {
31
+ failures.push(`${toolId}: ${componentName} execution error - ${error instanceof Error ? error.message : 'unknown'}`);
32
+ }
33
+ }
34
+
35
+ export async function validateToolExports(tools: ToolDefinition[]): Promise<ToolExportValidationResult> {
36
+ const failures: string[] = [];
37
+
38
+ for (const tool of tools) {
39
+ validateComponentType(tool.entry.id, 'Component', tool.Component, failures);
40
+ validateComponentType(tool.entry.id, 'SEOComponent', tool.SEOComponent, failures);
41
+ validateComponentType(tool.entry.id, 'BibliographyComponent', tool.BibliographyComponent, failures);
42
+
43
+ const componentFn = tool.Component as () => Promise<unknown>;
44
+ const seoFn = tool.SEOComponent as () => Promise<unknown>;
45
+ const bibFn = tool.BibliographyComponent as () => Promise<unknown>;
46
+
47
+ await validateComponentExecution(tool.entry.id, 'Component', componentFn, failures);
48
+ await validateComponentExecution(tool.entry.id, 'SEOComponent', seoFn, failures);
49
+ await validateComponentExecution(tool.entry.id, 'BibliographyComponent', bibFn, failures);
50
+ }
51
+
52
+ return {
53
+ passed: failures.length === 0,
54
+ failures,
55
+ };
56
+ }
@@ -0,0 +1,34 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { ALL_TOOLS } from '../tools';
3
+ import { validateToolExports } from './shared-test-helpers';
4
+
5
+ describe('Tool Exports Pattern Validation', () => {
6
+ describe('Component Exports Format', () => {
7
+ ALL_TOOLS.forEach((tool) => {
8
+ it(`${tool.entry.id}: Component should be a lazy-loaded function`, () => {
9
+ expect(typeof tool.Component).toBe('function');
10
+ expect(tool.Component).toBeInstanceOf(Function);
11
+ });
12
+
13
+ it(`${tool.entry.id}: SEOComponent should be a lazy-loaded function`, () => {
14
+ expect(typeof tool.SEOComponent).toBe('function');
15
+ expect(tool.SEOComponent).toBeInstanceOf(Function);
16
+ });
17
+
18
+ it(`${tool.entry.id}: BibliographyComponent should be a lazy-loaded function`, () => {
19
+ expect(typeof tool.BibliographyComponent).toBe('function');
20
+ expect(tool.BibliographyComponent).toBeInstanceOf(Function);
21
+ });
22
+ });
23
+ });
24
+
25
+ describe('Dynamic Import Validation', () => {
26
+ it('all tools must have functional dynamic imports', async () => {
27
+ const result = await validateToolExports(ALL_TOOLS);
28
+ if (!result.passed) {
29
+ throw new Error(`Tool export validation failed:\n${result.failures.join('\n')}`);
30
+ }
31
+ expect(result.passed).toBe(true);
32
+ });
33
+ });
34
+ });
@@ -11,4 +11,4 @@ const { locale = 'es' } = Astro.props;
11
11
  const content = await endurance.i18n[locale]?.();
12
12
  ---
13
13
 
14
- {content && <SharedBibliography links={content.bibliography} title={content.ui.bibliographyTitle} />}
14
+ {content && <SharedBibliography links={content.bibliography} />}
@@ -0,0 +1,12 @@
1
+ import type { BibliographyEntry } from '../../types';
2
+
3
+ export const bibliography: BibliographyEntry[] = [
4
+ {
5
+ name: 'UK Maritime and Coastguard Agency',
6
+ url: 'https://www.gov.uk/government/organisations/maritime-and-coastguard-agency',
7
+ },
8
+ {
9
+ name: 'RYA - Royal Yachting Association',
10
+ url: 'https://www.rya.org.uk/',
11
+ },
12
+ ];
@@ -24,8 +24,6 @@ export interface EnduranceUI {
24
24
  seaLight: string;
25
25
  seaModerate: string;
26
26
  seaStorm: string;
27
- faqTitle: string;
28
- bibliographyTitle: string;
29
27
  }
30
28
 
31
29
  export type EnduranceLocaleContent = ToolLocaleContent<EnduranceUI>;
@@ -54,3 +52,5 @@ export const endurance: NauticalToolEntry<EnduranceUI> = {
54
52
  zh: () => import('./i18n/zh').then((m) => m.content),
55
53
  },
56
54
  };
55
+
56
+ export { bibliography } from './bibliography';
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { EnduranceUI, EnduranceLocaleContent } from '../index';
3
4
 
@@ -29,8 +30,6 @@ const ui: EnduranceUI = {
29
30
  seaLight: 'Leichter Wellengang (+15%)',
30
31
  seaModerate: 'Mäßiger Wellengang (+30%)',
31
32
  seaStorm: 'Sturm (+60%)',
32
- faqTitle: 'Häufig gestellte Fragen',
33
- bibliographyTitle: 'Bibliografie',
34
33
  };
35
34
 
36
35
  const faq: EnduranceLocaleContent['faq'] = [
@@ -75,17 +74,6 @@ const howTo: EnduranceLocaleContent['howTo'] = [
75
74
  },
76
75
  ];
77
76
 
78
- const bibliography: EnduranceLocaleContent['bibliography'] = [
79
- {
80
- name: 'UK Maritime and Coastguard Agency',
81
- url: 'https://www.gov.uk/government/organisations/maritime-and-coastguard-agency',
82
- },
83
- {
84
- name: 'RYA - Royal Yachting Association',
85
- url: 'https://www.rya.org.uk/',
86
- },
87
- ];
88
-
89
77
  const seo: EnduranceLocaleContent['seo'] = [
90
78
  {
91
79
  type: 'title',
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { EnduranceUI, EnduranceLocaleContent } from '../index';
3
4
 
@@ -29,8 +30,6 @@ const ui: EnduranceUI = {
29
30
  seaLight: 'Light swell (+15%)',
30
31
  seaModerate: 'Moderate swell (+30%)',
31
32
  seaStorm: 'Storm (+60%)',
32
- faqTitle: 'Frequently Asked Questions',
33
- bibliographyTitle: 'Bibliography',
34
33
  };
35
34
  const faq: EnduranceLocaleContent['faq'] = [
36
35
  {
@@ -73,16 +72,6 @@ const howTo: EnduranceLocaleContent['howTo'] = [
73
72
  },
74
73
  ];
75
74
 
76
- const bibliography: EnduranceLocaleContent['bibliography'] = [
77
- {
78
- name: 'UK Maritime and Coastguard Agency',
79
- url: 'https://www.gov.uk/government/organisations/maritime-and-coastguard-agency',
80
- },
81
- {
82
- name: 'RYA - Royal Yachting Association',
83
- url: 'https://www.rya.org.uk/',
84
- },
85
- ];
86
75
  const seo: EnduranceLocaleContent['seo'] = [
87
76
  {
88
77
  type: 'title',
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { EnduranceUI, EnduranceLocaleContent } from '../index';
3
4
 
@@ -29,8 +30,6 @@ const ui: EnduranceUI = {
29
30
  seaLight: 'Marejadilla (+15%)',
30
31
  seaModerate: 'Marejada (+30%)',
31
32
  seaStorm: 'Temporal (+60%)',
32
- faqTitle: 'Preguntas Frecuentes',
33
- bibliographyTitle: 'Referencias',
34
33
  };
35
34
 
36
35
  const faq: EnduranceLocaleContent['faq'] = [
@@ -75,17 +74,6 @@ const howTo: EnduranceLocaleContent['howTo'] = [
75
74
  },
76
75
  ];
77
76
 
78
- const bibliography: EnduranceLocaleContent['bibliography'] = [
79
- {
80
- name: 'Ministerio de Transportes - Nautica de Recreo',
81
- url: 'https://www.mitma.gob.es/marina-mercante/nautica-de-recreo/',
82
- },
83
- {
84
- name: 'Real Federacion Espanola de Vela - Seguridad en la Mar',
85
- url: 'https://www.rfev.es/es/seguridad/',
86
- },
87
- ];
88
-
89
77
  const seo: EnduranceLocaleContent['seo'] = [
90
78
  {
91
79
  type: 'title',
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { EnduranceUI, EnduranceLocaleContent } from '../index';
3
4
 
@@ -29,8 +30,6 @@ const ui: EnduranceUI = {
29
30
  seaLight: 'Petite houle (+15%)',
30
31
  seaModerate: 'Houle moderee (+30%)',
31
32
  seaStorm: 'Tempete (+60%)',
32
- faqTitle: 'Questions Frequentes',
33
- bibliographyTitle: 'References',
34
33
  };
35
34
 
36
35
  const faq: EnduranceLocaleContent['faq'] = [
@@ -75,17 +74,6 @@ const howTo: EnduranceLocaleContent['howTo'] = [
75
74
  },
76
75
  ];
77
76
 
78
- const bibliography: EnduranceLocaleContent['bibliography'] = [
79
- {
80
- name: 'Direction des Affaires Maritimes - Navigation de Plaisance',
81
- url: 'https://www.mer.gouv.fr/les-marins/plaisanciers',
82
- },
83
- {
84
- name: 'Federation Francaise de Voile - Securite',
85
- url: 'https://www.ffvoile.fr/',
86
- },
87
- ];
88
-
89
77
  const seo: EnduranceLocaleContent['seo'] = [
90
78
  { type: 'title', text: 'Gestion du Carburant et Autonomie en Navigation a Moteur', level: 2 },
91
79
  {
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { EnduranceUI, EnduranceLocaleContent } from '../index';
3
4
 
@@ -29,8 +30,6 @@ const ui: EnduranceUI = {
29
30
  seaLight: 'Alun Ringan (+15%)',
30
31
  seaModerate: 'Alun Sedang (+30%)',
31
32
  seaStorm: 'Badai (+60%)',
32
- faqTitle: 'Pertanyaan yang Sering Diajukan',
33
- bibliographyTitle: 'Bibliografi',
34
33
  };
35
34
 
36
35
  const faq: EnduranceLocaleContent['faq'] = [
@@ -75,17 +74,6 @@ const howTo: EnduranceLocaleContent['howTo'] = [
75
74
  },
76
75
  ];
77
76
 
78
- const bibliography: EnduranceLocaleContent['bibliography'] = [
79
- {
80
- name: 'UK Maritime and Coastguard Agency',
81
- url: 'https://www.gov.uk/government/organisations/maritime-and-coastguard-agency',
82
- },
83
- {
84
- name: 'RYA - Royal Yachting Association',
85
- url: 'https://www.rya.org.uk/',
86
- },
87
- ];
88
-
89
77
  const seo: EnduranceLocaleContent['seo'] = [
90
78
  {
91
79
  type: 'title',
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { EnduranceUI, EnduranceLocaleContent } from '../index';
3
4
 
@@ -29,8 +30,6 @@ const ui: EnduranceUI = {
29
30
  seaLight: 'Poco mosso (+15%)',
30
31
  seaModerate: 'Mosso (+30%)',
31
32
  seaStorm: 'Burrasca (+60%)',
32
- faqTitle: 'Domande Frequenti',
33
- bibliographyTitle: 'Bibliografia',
34
33
  };
35
34
 
36
35
  const faq: EnduranceLocaleContent['faq'] = [
@@ -75,17 +74,6 @@ const howTo: EnduranceLocaleContent['howTo'] = [
75
74
  },
76
75
  ];
77
76
 
78
- const bibliography: EnduranceLocaleContent['bibliography'] = [
79
- {
80
- name: 'UK Maritime and Coastguard Agency',
81
- url: 'https://www.gov.uk/government/organisations/maritime-and-coastguard-agency',
82
- },
83
- {
84
- name: 'RYA - Royal Yachting Association',
85
- url: 'https://www.rya.org.uk/',
86
- },
87
- ];
88
-
89
77
  const seo: EnduranceLocaleContent['seo'] = [
90
78
  {
91
79
  type: 'title',
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { EnduranceUI, EnduranceLocaleContent } from '../index';
3
4
 
@@ -29,8 +30,6 @@ const ui: EnduranceUI = {
29
30
  seaLight: '軽いうねり (+15%)',
30
31
  seaModerate: '中程度のうねり (+30%)',
31
32
  seaStorm: '荒天 (+60%)',
32
- faqTitle: 'よくある質問',
33
- bibliographyTitle: '参考文献',
34
33
  };
35
34
 
36
35
  const faq: EnduranceLocaleContent['faq'] = [
@@ -75,17 +74,6 @@ const howTo: EnduranceLocaleContent['howTo'] = [
75
74
  },
76
75
  ];
77
76
 
78
- const bibliography: EnduranceLocaleContent['bibliography'] = [
79
- {
80
- name: 'UK Maritime and Coastguard Agency',
81
- url: 'https://www.gov.uk/government/organisations/maritime-and-coastguard-agency',
82
- },
83
- {
84
- name: 'RYA - Royal Yachting Association',
85
- url: 'https://www.rya.org.uk/',
86
- },
87
- ];
88
-
89
77
  const seo: EnduranceLocaleContent['seo'] = [
90
78
  {
91
79
  type: 'title',
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { EnduranceUI, EnduranceLocaleContent } from '../index';
3
4
 
@@ -29,8 +30,6 @@ const ui: EnduranceUI = {
29
30
  seaLight: '약한 물결 (+15%)',
30
31
  seaModerate: '보통 물결 (+30%)',
31
32
  seaStorm: '거친 풍랑 (+60%)',
32
- faqTitle: '자주 묻는 질문',
33
- bibliographyTitle: '참고 문헌',
34
33
  };
35
34
 
36
35
  const faq: EnduranceLocaleContent['faq'] = [
@@ -75,17 +74,6 @@ const howTo: EnduranceLocaleContent['howTo'] = [
75
74
  },
76
75
  ];
77
76
 
78
- const bibliography: EnduranceLocaleContent['bibliography'] = [
79
- {
80
- name: 'UK Maritime and Coastguard Agency',
81
- url: 'https://www.gov.uk/government/organisations/maritime-and-coastguard-agency',
82
- },
83
- {
84
- name: 'RYA - Royal Yachting Association',
85
- url: 'https://www.rya.org.uk/',
86
- },
87
- ];
88
-
89
77
  const seo: EnduranceLocaleContent['seo'] = [
90
78
  {
91
79
  type: 'title',
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { EnduranceUI, EnduranceLocaleContent } from '../index';
3
4
 
@@ -29,8 +30,6 @@ const ui: EnduranceUI = {
29
30
  seaLight: 'Lichte deining (+15%)',
30
31
  seaModerate: 'Matige deining (+30%)',
31
32
  seaStorm: 'Storm (+60%)',
32
- faqTitle: 'Veelgestelde Vragen',
33
- bibliographyTitle: 'Bibliografie',
34
33
  };
35
34
 
36
35
  const faq: EnduranceLocaleContent['faq'] = [
@@ -75,17 +74,6 @@ const howTo: EnduranceLocaleContent['howTo'] = [
75
74
  },
76
75
  ];
77
76
 
78
- const bibliography: EnduranceLocaleContent['bibliography'] = [
79
- {
80
- name: 'UK Maritime and Coastguard Agency',
81
- url: 'https://www.gov.uk/government/organisations/maritime-and-coastguard-agency',
82
- },
83
- {
84
- name: 'RYA - Royal Yachting Association',
85
- url: 'https://www.rya.org.uk/',
86
- },
87
- ];
88
-
89
77
  const seo: EnduranceLocaleContent['seo'] = [
90
78
  {
91
79
  type: 'title',
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { EnduranceUI, EnduranceLocaleContent } from '../index';
3
4
 
@@ -29,8 +30,6 @@ const ui: EnduranceUI = {
29
30
  seaLight: 'Lekka fala (+15%)',
30
31
  seaModerate: 'Umiarkowana fala (+30%)',
31
32
  seaStorm: 'Sztorm (+60%)',
32
- faqTitle: 'Często Zadawane Pytania',
33
- bibliographyTitle: 'Bibliografia',
34
33
  };
35
34
 
36
35
  const faq: EnduranceLocaleContent['faq'] = [
@@ -75,17 +74,6 @@ const howTo: EnduranceLocaleContent['howTo'] = [
75
74
  },
76
75
  ];
77
76
 
78
- const bibliography: EnduranceLocaleContent['bibliography'] = [
79
- {
80
- name: 'UK Maritime and Coastguard Agency',
81
- url: 'https://www.gov.uk/government/organisations/maritime-and-coastguard-agency',
82
- },
83
- {
84
- name: 'RYA - Royal Yachting Association',
85
- url: 'https://www.rya.org.uk/',
86
- },
87
- ];
88
-
89
77
  const seo: EnduranceLocaleContent['seo'] = [
90
78
  {
91
79
  type: 'title',
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { EnduranceUI, EnduranceLocaleContent } from '../index';
3
4
 
@@ -29,8 +30,6 @@ const ui: EnduranceUI = {
29
30
  seaLight: 'Marulhento (+15%)',
30
31
  seaModerate: 'Mar de pequenas vagas (+30%)',
31
32
  seaStorm: 'Temporal (+60%)',
32
- faqTitle: 'Perguntas Frequentes',
33
- bibliographyTitle: 'Bibliografia',
34
33
  };
35
34
 
36
35
  const faq: EnduranceLocaleContent['faq'] = [
@@ -75,17 +74,6 @@ const howTo: EnduranceLocaleContent['howTo'] = [
75
74
  },
76
75
  ];
77
76
 
78
- const bibliography: EnduranceLocaleContent['bibliography'] = [
79
- {
80
- name: 'UK Maritime and Coastguard Agency',
81
- url: 'https://www.gov.uk/government/organisations/maritime-and-coastguard-agency',
82
- },
83
- {
84
- name: 'RYA - Royal Yachting Association',
85
- url: 'https://www.rya.org.uk/',
86
- },
87
- ];
88
-
89
77
  const seo: EnduranceLocaleContent['seo'] = [
90
78
  {
91
79
  type: 'title',
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { EnduranceUI, EnduranceLocaleContent } from '../index';
3
4
 
@@ -29,8 +30,6 @@ const ui: EnduranceUI = {
29
30
  seaLight: 'Легкое волнение (+15%)',
30
31
  seaModerate: 'Умеренное волнение (+30%)',
31
32
  seaStorm: 'Шторм (+60%)',
32
- faqTitle: 'Часто задаваемые вопросы',
33
- bibliographyTitle: 'Библиография',
34
33
  };
35
34
 
36
35
  const faq: EnduranceLocaleContent['faq'] = [
@@ -75,17 +74,6 @@ const howTo: EnduranceLocaleContent['howTo'] = [
75
74
  },
76
75
  ];
77
76
 
78
- const bibliography: EnduranceLocaleContent['bibliography'] = [
79
- {
80
- name: 'UK Maritime and Coastguard Agency',
81
- url: 'https://www.gov.uk/government/organisations/maritime-and-coastguard-agency',
82
- },
83
- {
84
- name: 'RYA - Royal Yachting Association',
85
- url: 'https://www.rya.org.uk/',
86
- },
87
- ];
88
-
89
77
  const seo: EnduranceLocaleContent['seo'] = [
90
78
  {
91
79
  type: 'title',
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
3
  import type { EnduranceUI, EnduranceLocaleContent } from '../index';
3
4
 
@@ -29,8 +30,6 @@ const ui: EnduranceUI = {
29
30
  seaLight: 'Lätt sjögång (+15 %)',
30
31
  seaModerate: 'Måttlig sjögång (+30 %)',
31
32
  seaStorm: 'Storm (+60 %)',
32
- faqTitle: 'Vanliga Frågor',
33
- bibliographyTitle: 'Bibliografi',
34
33
  };
35
34
 
36
35
  const faq: EnduranceLocaleContent['faq'] = [
@@ -75,17 +74,6 @@ const howTo: EnduranceLocaleContent['howTo'] = [
75
74
  },
76
75
  ];
77
76
 
78
- const bibliography: EnduranceLocaleContent['bibliography'] = [
79
- {
80
- name: 'UK Maritime and Coastguard Agency',
81
- url: 'https://www.gov.uk/government/organisations/maritime-and-coastguard-agency',
82
- },
83
- {
84
- name: 'RYA - Royal Yachting Association',
85
- url: 'https://www.rya.org.uk/',
86
- },
87
- ];
88
-
89
77
  const seo: EnduranceLocaleContent['seo'] = [
90
78
  {
91
79
  type: 'title',