@jjlmoya/utils-creative 1.19.0 → 1.21.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/data.ts +2 -1
- package/src/entries.ts +3 -1
- package/src/index.ts +3 -0
- package/src/pages/[locale]/[slug].astro +28 -12
- package/src/tests/locale_completeness.test.ts +2 -14
- package/src/tests/shared-test-helpers.ts +56 -0
- package/src/tests/tool_exports.test.ts +34 -0
- package/src/tests/tool_validation.test.ts +2 -2
- package/src/tool/bead-pattern-generator/bibliography.astro +2 -12
- package/src/tool/bead-pattern-generator/bibliography.ts +5 -0
- package/src/tool/bead-pattern-generator/entry.ts +0 -1
- package/src/tool/bead-pattern-generator/i18n/de.ts +2 -6
- package/src/tool/bead-pattern-generator/i18n/en.ts +2 -6
- package/src/tool/bead-pattern-generator/i18n/es.ts +2 -6
- package/src/tool/bead-pattern-generator/i18n/fr.ts +2 -6
- package/src/tool/bead-pattern-generator/i18n/id.ts +2 -6
- package/src/tool/bead-pattern-generator/i18n/it.ts +2 -6
- package/src/tool/bead-pattern-generator/i18n/ja.ts +2 -6
- package/src/tool/bead-pattern-generator/i18n/ko.ts +2 -6
- package/src/tool/bead-pattern-generator/i18n/nl.ts +2 -6
- package/src/tool/bead-pattern-generator/i18n/pl.ts +2 -6
- package/src/tool/bead-pattern-generator/i18n/pt.ts +2 -6
- package/src/tool/bead-pattern-generator/i18n/ru.ts +2 -6
- package/src/tool/bead-pattern-generator/i18n/sv.ts +2 -6
- package/src/tool/bead-pattern-generator/i18n/tr.ts +2 -6
- package/src/tool/bead-pattern-generator/i18n/zh.ts +2 -6
- package/src/tool/bead-pattern-generator/seo.astro +10 -5
- package/src/tool/dice-roller/bibliography.astro +3 -12
- package/src/tool/dice-roller/bibliography.ts +5 -0
- package/src/tool/dice-roller/entry.ts +0 -1
- package/src/tool/dice-roller/i18n/de.ts +2 -6
- package/src/tool/dice-roller/i18n/en.ts +2 -6
- package/src/tool/dice-roller/i18n/es.ts +2 -6
- package/src/tool/dice-roller/i18n/fr.ts +2 -6
- package/src/tool/dice-roller/i18n/id.ts +2 -6
- package/src/tool/dice-roller/i18n/it.ts +2 -6
- package/src/tool/dice-roller/i18n/ja.ts +2 -6
- package/src/tool/dice-roller/i18n/ko.ts +2 -6
- package/src/tool/dice-roller/i18n/nl.ts +2 -6
- package/src/tool/dice-roller/i18n/pl.ts +2 -6
- package/src/tool/dice-roller/i18n/pt.ts +2 -6
- package/src/tool/dice-roller/i18n/ru.ts +2 -6
- package/src/tool/dice-roller/i18n/sv.ts +2 -6
- package/src/tool/dice-roller/i18n/tr.ts +2 -6
- package/src/tool/dice-roller/i18n/zh.ts +2 -6
- package/src/tool/dice-roller/seo.astro +2 -1
- package/src/tool/excuse-generator/bibliography.astro +2 -12
- package/src/tool/excuse-generator/bibliography.ts +3 -0
- package/src/tool/excuse-generator/entry.ts +0 -1
- package/src/tool/excuse-generator/i18n/de.ts +2 -4
- package/src/tool/excuse-generator/i18n/en.ts +2 -4
- package/src/tool/excuse-generator/i18n/es.ts +2 -4
- package/src/tool/excuse-generator/i18n/fr.ts +2 -4
- package/src/tool/excuse-generator/i18n/id.ts +2 -4
- package/src/tool/excuse-generator/i18n/it.ts +2 -4
- package/src/tool/excuse-generator/i18n/ja.ts +2 -4
- package/src/tool/excuse-generator/i18n/ko.ts +2 -4
- package/src/tool/excuse-generator/i18n/nl.ts +2 -4
- package/src/tool/excuse-generator/i18n/pl.ts +2 -4
- package/src/tool/excuse-generator/i18n/pt.ts +2 -4
- package/src/tool/excuse-generator/i18n/ru.ts +2 -4
- package/src/tool/excuse-generator/i18n/sv.ts +2 -4
- package/src/tool/excuse-generator/i18n/tr.ts +2 -4
- package/src/tool/excuse-generator/i18n/zh.ts +2 -4
- package/src/tool/excuse-generator/seo.astro +2 -1
- package/src/tool/fortune-cookie/bibliography.astro +2 -12
- package/src/tool/fortune-cookie/bibliography.ts +3 -0
- package/src/tool/fortune-cookie/entry.ts +0 -1
- package/src/tool/fortune-cookie/i18n/de.ts +2 -5
- package/src/tool/fortune-cookie/i18n/en.ts +2 -5
- package/src/tool/fortune-cookie/i18n/es.ts +2 -4
- package/src/tool/fortune-cookie/i18n/fr.ts +2 -5
- package/src/tool/fortune-cookie/i18n/id.ts +2 -5
- package/src/tool/fortune-cookie/i18n/it.ts +2 -5
- package/src/tool/fortune-cookie/i18n/ja.ts +2 -5
- package/src/tool/fortune-cookie/i18n/ko.ts +2 -5
- package/src/tool/fortune-cookie/i18n/nl.ts +2 -5
- package/src/tool/fortune-cookie/i18n/pl.ts +2 -5
- package/src/tool/fortune-cookie/i18n/pt.ts +2 -5
- package/src/tool/fortune-cookie/i18n/ru.ts +2 -5
- package/src/tool/fortune-cookie/i18n/sv.ts +2 -5
- package/src/tool/fortune-cookie/i18n/tr.ts +2 -5
- package/src/tool/fortune-cookie/i18n/zh.ts +2 -5
- package/src/tool/fortune-cookie/seo.astro +2 -1
- package/src/tool/glitch-image-distorter/bibliography.astro +8 -0
- package/src/tool/glitch-image-distorter/bibliography.ts +4 -0
- package/src/tool/glitch-image-distorter/component.astro +393 -0
- package/src/tool/glitch-image-distorter/entry.ts +48 -0
- package/src/tool/glitch-image-distorter/glitch-image-distorter.css +233 -0
- package/src/tool/glitch-image-distorter/i18n/de.ts +131 -0
- package/src/tool/glitch-image-distorter/i18n/en.ts +131 -0
- package/src/tool/glitch-image-distorter/i18n/es.ts +131 -0
- package/src/tool/glitch-image-distorter/i18n/fr.ts +131 -0
- package/src/tool/glitch-image-distorter/i18n/id.ts +131 -0
- package/src/tool/glitch-image-distorter/i18n/it.ts +131 -0
- package/src/tool/glitch-image-distorter/i18n/ja.ts +131 -0
- package/src/tool/glitch-image-distorter/i18n/ko.ts +131 -0
- package/src/tool/glitch-image-distorter/i18n/nl.ts +131 -0
- package/src/tool/glitch-image-distorter/i18n/pl.ts +131 -0
- package/src/tool/glitch-image-distorter/i18n/pt.ts +131 -0
- package/src/tool/glitch-image-distorter/i18n/ru.ts +131 -0
- package/src/tool/glitch-image-distorter/i18n/sv.ts +131 -0
- package/src/tool/glitch-image-distorter/i18n/tr.ts +131 -0
- package/src/tool/glitch-image-distorter/i18n/zh.ts +131 -0
- package/src/tool/glitch-image-distorter/index.ts +9 -0
- package/src/tool/glitch-image-distorter/seo.astro +15 -0
- package/src/tool/synesthesia-painter/bibliography.astro +3 -12
- package/src/tool/synesthesia-painter/bibliography.ts +5 -0
- package/src/tool/synesthesia-painter/entry.ts +0 -1
- package/src/tool/synesthesia-painter/i18n/de.ts +2 -6
- package/src/tool/synesthesia-painter/i18n/en.ts +2 -6
- package/src/tool/synesthesia-painter/i18n/es.ts +2 -6
- package/src/tool/synesthesia-painter/i18n/fr.ts +2 -6
- package/src/tool/synesthesia-painter/i18n/id.ts +2 -6
- package/src/tool/synesthesia-painter/i18n/it.ts +2 -6
- package/src/tool/synesthesia-painter/i18n/ja.ts +2 -6
- package/src/tool/synesthesia-painter/i18n/ko.ts +2 -6
- package/src/tool/synesthesia-painter/i18n/nl.ts +2 -6
- package/src/tool/synesthesia-painter/i18n/pl.ts +2 -6
- package/src/tool/synesthesia-painter/i18n/pt.ts +2 -6
- package/src/tool/synesthesia-painter/i18n/ru.ts +2 -6
- package/src/tool/synesthesia-painter/i18n/sv.ts +2 -6
- package/src/tool/synesthesia-painter/i18n/tr.ts +2 -6
- package/src/tool/synesthesia-painter/i18n/zh.ts +2 -6
- package/src/tool/synesthesia-painter/seo.astro +2 -1
- package/src/tool/zalgo-generator/bibliography.astro +2 -12
- package/src/tool/zalgo-generator/bibliography.ts +5 -0
- package/src/tool/zalgo-generator/entry.ts +0 -1
- package/src/tool/zalgo-generator/i18n/de.ts +2 -6
- package/src/tool/zalgo-generator/i18n/en.ts +2 -6
- package/src/tool/zalgo-generator/i18n/es.ts +2 -6
- package/src/tool/zalgo-generator/i18n/fr.ts +2 -6
- package/src/tool/zalgo-generator/i18n/id.ts +2 -6
- package/src/tool/zalgo-generator/i18n/it.ts +2 -6
- package/src/tool/zalgo-generator/i18n/ja.ts +2 -6
- package/src/tool/zalgo-generator/i18n/ko.ts +2 -6
- package/src/tool/zalgo-generator/i18n/nl.ts +2 -6
- package/src/tool/zalgo-generator/i18n/pl.ts +2 -6
- package/src/tool/zalgo-generator/i18n/pt.ts +2 -6
- package/src/tool/zalgo-generator/i18n/ru.ts +2 -6
- package/src/tool/zalgo-generator/i18n/sv.ts +2 -6
- package/src/tool/zalgo-generator/i18n/tr.ts +2 -6
- package/src/tool/zalgo-generator/i18n/zh.ts +2 -6
- package/src/tool/zalgo-generator/seo.astro +2 -1
- package/src/tools.ts +2 -0
package/package.json
CHANGED
package/src/data.ts
CHANGED
package/src/entries.ts
CHANGED
|
@@ -2,6 +2,7 @@ export { beadPatternGenerator } from './tool/bead-pattern-generator/entry';
|
|
|
2
2
|
export { diceRoller } from './tool/dice-roller/entry';
|
|
3
3
|
export { excuseGenerator } from './tool/excuse-generator/entry';
|
|
4
4
|
export { fortuneCookie } from './tool/fortune-cookie/entry';
|
|
5
|
+
export { glitchImageDistorter } from './tool/glitch-image-distorter/entry';
|
|
5
6
|
export { synesthesiaPainter } from './tool/synesthesia-painter/entry';
|
|
6
7
|
export { zalgoGenerator } from './tool/zalgo-generator/entry';
|
|
7
8
|
export { creativeCategory } from './category';
|
|
@@ -9,6 +10,7 @@ import { beadPatternGenerator } from './tool/bead-pattern-generator/entry';
|
|
|
9
10
|
import { diceRoller } from './tool/dice-roller/entry';
|
|
10
11
|
import { excuseGenerator } from './tool/excuse-generator/entry';
|
|
11
12
|
import { fortuneCookie } from './tool/fortune-cookie/entry';
|
|
13
|
+
import { glitchImageDistorter } from './tool/glitch-image-distorter/entry';
|
|
12
14
|
import { synesthesiaPainter } from './tool/synesthesia-painter/entry';
|
|
13
15
|
import { zalgoGenerator } from './tool/zalgo-generator/entry';
|
|
14
|
-
export const ALL_ENTRIES = [beadPatternGenerator, diceRoller, excuseGenerator, fortuneCookie, synesthesiaPainter, zalgoGenerator];
|
|
16
|
+
export const ALL_ENTRIES = [beadPatternGenerator, diceRoller, excuseGenerator, fortuneCookie, glitchImageDistorter, synesthesiaPainter, zalgoGenerator];
|
package/src/index.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { creativeCategory } from './category';
|
|
|
2
2
|
import type { ToolDefinition } from './types';
|
|
3
3
|
import { EXCUSE_GENERATOR_TOOL } from './tool/excuse-generator';
|
|
4
4
|
import { FORTUNE_COOKIE_TOOL } from './tool/fortune-cookie';
|
|
5
|
+
import { GLITCH_IMAGE_DISTORTER_TOOL } from './tool/glitch-image-distorter';
|
|
5
6
|
import { SYNESTHESIA_PAINTER_TOOL } from './tool/synesthesia-painter';
|
|
6
7
|
import { ZALGO_GENERATOR_TOOL } from './tool/zalgo-generator';
|
|
7
8
|
import { BEAD_PATTERN_GENERATOR_TOOL } from './tool/bead-pattern-generator';
|
|
@@ -12,6 +13,7 @@ export const templateCategory = creativeCategory;
|
|
|
12
13
|
export const CREATIVE_TOOLS: Record<string, ToolDefinition> = {
|
|
13
14
|
'excuse-generator': EXCUSE_GENERATOR_TOOL,
|
|
14
15
|
'fortune-cookie': FORTUNE_COOKIE_TOOL,
|
|
16
|
+
'glitch-image-distorter': GLITCH_IMAGE_DISTORTER_TOOL,
|
|
15
17
|
'synesthesia-painter': SYNESTHESIA_PAINTER_TOOL,
|
|
16
18
|
'zalgo-generator': ZALGO_GENERATOR_TOOL,
|
|
17
19
|
'bead-pattern-generator': BEAD_PATTERN_GENERATOR_TOOL,
|
|
@@ -21,6 +23,7 @@ export const ALL_TOOLS = Object.values(CREATIVE_TOOLS);
|
|
|
21
23
|
|
|
22
24
|
export * from './tool/excuse-generator';
|
|
23
25
|
export * from './tool/fortune-cookie';
|
|
26
|
+
export * from './tool/glitch-image-distorter';
|
|
24
27
|
export * from './tool/synesthesia-painter';
|
|
25
28
|
export * from './tool/zalgo-generator';
|
|
26
29
|
export * from './tool/bead-pattern-generator';
|
|
@@ -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 =
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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"
|
|
@@ -18,25 +18,13 @@ describe('Locale Completeness Validation', () => {
|
|
|
18
18
|
).toBeTruthy();
|
|
19
19
|
}
|
|
20
20
|
});
|
|
21
|
-
|
|
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;
|
|
25
|
-
|
|
26
|
-
if (content.bibliography.length > 0) {
|
|
27
|
-
expect(
|
|
28
|
-
content.bibliographyTitle,
|
|
29
|
-
`Tool "${tool.entry.id}" locale "${locale}" has ${content.bibliography.length} bibliography items but is missing bibliographyTitle`,
|
|
30
|
-
).toBeTruthy();
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
21
|
});
|
|
34
22
|
});
|
|
35
23
|
});
|
|
36
24
|
});
|
|
37
25
|
|
|
38
|
-
it('all
|
|
39
|
-
expect(ALL_TOOLS.length).toBe(
|
|
26
|
+
it('all 7 tools registered', () => {
|
|
27
|
+
expect(ALL_TOOLS.length).toBe(7);
|
|
40
28
|
});
|
|
41
29
|
});
|
|
42
30
|
|
|
@@ -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
|
+
});
|
|
@@ -4,8 +4,8 @@ import { creativeCategory } from '../data';
|
|
|
4
4
|
|
|
5
5
|
describe('Tool Validation Suite', () => {
|
|
6
6
|
describe('Library Registration', () => {
|
|
7
|
-
it('should have
|
|
8
|
-
expect(ALL_TOOLS.length).toBe(
|
|
7
|
+
it('should have 7 tools in ALL_TOOLS', () => {
|
|
8
|
+
expect(ALL_TOOLS.length).toBe(7);
|
|
9
9
|
});
|
|
10
10
|
|
|
11
11
|
it('creativeCategory should be defined', () => {
|
|
@@ -1,18 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
|
|
3
|
-
import {
|
|
4
|
-
import type { KnownLocale } from '../../types';
|
|
3
|
+
import { bibliography } from './bibliography';
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
locale?: KnownLocale;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const { locale = 'es' } = Astro.props;
|
|
11
|
-
const localeContentLoader = (beadPatternGenerator.i18n as Record<string, () => Promise<BeadPatternGeneratorLocaleContent>>)[locale];
|
|
12
|
-
const content = localeContentLoader ? await localeContentLoader() : null;
|
|
13
|
-
if (!content) return null;
|
|
14
|
-
|
|
15
|
-
const { bibliography } = content;
|
|
5
|
+
if (!bibliography || bibliography.length === 0) return null;
|
|
16
6
|
---
|
|
17
7
|
|
|
18
8
|
<SharedBibliography links={bibliography} />
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export const bibliography = [
|
|
2
|
+
{ name: 'Scikit-Image: Color Quantization using K-Means', url: 'https://scikit-learn.org/0.23/auto_examples/cluster/plot_color_quantization.html' },
|
|
3
|
+
{ name: 'Miyuki Delica Beads Specification', url: 'https://www.miyuki-beads.co.jp/english/seedbeads/delica.html' },
|
|
4
|
+
{ name: 'Visgraf Lab: Dithering Algorithms', url: 'https://www.visgraf.impa.br/Courses/ip00/proj/Dithering1/floyd_steinberg_dithering.html' },
|
|
5
|
+
];
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
2
3
|
import type { BeadPatternGeneratorLocaleContent } from '../index';
|
|
3
4
|
|
|
4
5
|
const slug = 'perlenmuster-generator';
|
|
@@ -57,7 +58,6 @@ export const content: BeadPatternGeneratorLocaleContent = {
|
|
|
57
58
|
title,
|
|
58
59
|
description,
|
|
59
60
|
faqTitle: 'Häufig gestellte Fragen',
|
|
60
|
-
bibliographyTitle: 'Handwerks-Bibliographie',
|
|
61
61
|
ui: {
|
|
62
62
|
title: 'Muster Labor',
|
|
63
63
|
subtitle: 'Farbtechnik für Ihre Hände',
|
|
@@ -105,11 +105,7 @@ export const content: BeadPatternGeneratorLocaleContent = {
|
|
|
105
105
|
{ type: 'paragraph', html: 'In einer Ära flüchtiger Bildschirme ist das Erschaffen von etwas Physischem ein revolutionärer Akt. Dieses Werkzeug versucht nicht, Kunst zu automatisieren, sondern den <strong>Handwerker zu stärken</strong>. Wir geben Ihnen rechnerische Präzision, damit Ihre Hände bleibende Vermächtnisse schaffen können.' },
|
|
106
106
|
],
|
|
107
107
|
faq,
|
|
108
|
-
bibliography
|
|
109
|
-
{ name: 'Scikit-Image: Color Quantization using K-Means', url: 'https://scikit-learn.org/0.23/auto_examples/cluster/plot_color_quantization.html' },
|
|
110
|
-
{ name: 'Miyuki Delica Beads Specification', url: 'https://www.miyuki-beads.co.jp/english/seedbeads/delica.html' },
|
|
111
|
-
{ name: 'Visgraf Lab: Dithering Algorithms', url: 'https://www.visgraf.impa.br/Courses/ip00/proj/Dithering1/floyd_steinberg_dithering.html' },
|
|
112
|
-
],
|
|
108
|
+
bibliography,
|
|
113
109
|
howTo,
|
|
114
110
|
schemas: [faqSchema as any, howToSchema as any, appSchema],
|
|
115
111
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
2
3
|
import type { BeadPatternGeneratorLocaleContent } from '../index';
|
|
3
4
|
|
|
4
5
|
const slug = 'bead-pattern-generator';
|
|
@@ -57,7 +58,6 @@ export const content: BeadPatternGeneratorLocaleContent = {
|
|
|
57
58
|
title,
|
|
58
59
|
description,
|
|
59
60
|
faqTitle: 'Frequently Asked Questions',
|
|
60
|
-
bibliographyTitle: 'Artisan Bibliography',
|
|
61
61
|
ui: {
|
|
62
62
|
title: 'Pattern Laboratory',
|
|
63
63
|
subtitle: 'Color engineering for your hands',
|
|
@@ -105,11 +105,7 @@ export const content: BeadPatternGeneratorLocaleContent = {
|
|
|
105
105
|
{ type: 'paragraph', html: 'In an era of ephemeral screens, creating something physical is a revolutionary act. This tool does not seek to automate art, but to <strong>empower the artisan</strong>. We give you computational precision so your hands can build lasting legacies.' },
|
|
106
106
|
],
|
|
107
107
|
faq,
|
|
108
|
-
bibliography
|
|
109
|
-
{ name: 'Scikit-Image: Color Quantization using K-Means', url: 'https://scikit-learn.org/0.23/auto_examples/cluster/plot_color_quantization.html' },
|
|
110
|
-
{ name: 'Miyuki Delica Beads Specification', url: 'https://www.miyuki-beads.co.jp/english/seedbeads/delica.html' },
|
|
111
|
-
{ name: 'Visgraf Lab: Dithering Algorithms', url: 'https://www.visgraf.impa.br/Courses/ip00/proj/Dithering1/floyd_steinberg_dithering.html' },
|
|
112
|
-
],
|
|
108
|
+
bibliography,
|
|
113
109
|
howTo,
|
|
114
110
|
schemas: [faqSchema as any, howToSchema as any, appSchema],
|
|
115
111
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
2
3
|
import type { BeadPatternGeneratorLocaleContent } from '../index';
|
|
3
4
|
|
|
4
5
|
const slug = 'generador-patrones-cuentas';
|
|
@@ -57,7 +58,6 @@ export const content: BeadPatternGeneratorLocaleContent = {
|
|
|
57
58
|
title,
|
|
58
59
|
description,
|
|
59
60
|
faqTitle: 'Preguntas Frecuentes',
|
|
60
|
-
bibliographyTitle: 'Bibliografía del Artesano',
|
|
61
61
|
ui: {
|
|
62
62
|
title: 'Laboratorio de Patrones',
|
|
63
63
|
subtitle: 'Ingeniería de color para tus manos',
|
|
@@ -112,11 +112,7 @@ export const content: BeadPatternGeneratorLocaleContent = {
|
|
|
112
112
|
]},
|
|
113
113
|
],
|
|
114
114
|
faq,
|
|
115
|
-
bibliography
|
|
116
|
-
{ name: 'Scikit-Image: Color Quantization using K-Means', url: 'https://scikit-learn.org/0.23/auto_examples/cluster/plot_color_quantization.html' },
|
|
117
|
-
{ name: 'Miyuki Delica Beads Specification', url: 'https://www.miyuki-beads.co.jp/english/seedbeads/delica.html' },
|
|
118
|
-
{ name: 'Visgraf Lab: Dithering Algorithms', url: 'https://www.visgraf.impa.br/Courses/ip00/proj/Dithering1/floyd_steinberg_dithering.html' },
|
|
119
|
-
],
|
|
115
|
+
bibliography,
|
|
120
116
|
howTo,
|
|
121
117
|
schemas: [faqSchema as any, howToSchema as any, appSchema],
|
|
122
118
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
2
3
|
import type { BeadPatternGeneratorLocaleContent } from '../index';
|
|
3
4
|
|
|
4
5
|
const slug = 'generateur-de-modeles-de-perles';
|
|
@@ -57,7 +58,6 @@ export const content: BeadPatternGeneratorLocaleContent = {
|
|
|
57
58
|
title,
|
|
58
59
|
description,
|
|
59
60
|
faqTitle: 'Questions Fréquemment Posées',
|
|
60
|
-
bibliographyTitle: 'Bibliographie de l\'Artisan',
|
|
61
61
|
ui: {
|
|
62
62
|
title: 'Laboratoire de Modèles',
|
|
63
63
|
subtitle: 'Ingénierie chromatique pour vos mains',
|
|
@@ -105,11 +105,7 @@ export const content: BeadPatternGeneratorLocaleContent = {
|
|
|
105
105
|
{ type: 'paragraph', html: 'À l\'ère des écrans éphémères, créer quelque chose de physique est un acte révolutionnaire. Cet outil ne cherche pas à automatiser l\'art, mais à <strong>donner du pouvoir à l\'artisan</strong>. Nous vous offrons la précision informatique pour que vos mains puissent bâtir des héritages durables.' },
|
|
106
106
|
],
|
|
107
107
|
faq,
|
|
108
|
-
bibliography
|
|
109
|
-
{ name: 'Scikit-Image: Quantification de couleurs utilisant K-Means', url: 'https://scikit-learn.org/0.23/auto_examples/cluster/plot_color_quantization.html' },
|
|
110
|
-
{ name: 'Spécifications des Perles Miyuki Delica', url: 'https://www.miyuki-beads.co.jp/english/seedbeads/delica.html' },
|
|
111
|
-
{ name: 'Visgraf Lab: Algorithmes de Tramage (Dithering)', url: 'https://www.visgraf.impa.br/Courses/ip00/proj/Dithering1/floyd_steinberg_dithering.html' },
|
|
112
|
-
],
|
|
108
|
+
bibliography,
|
|
113
109
|
howTo,
|
|
114
110
|
schemas: [faqSchema as any, howToSchema as any, appSchema],
|
|
115
111
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
2
3
|
import type { BeadPatternGeneratorLocaleContent } from '../index';
|
|
3
4
|
|
|
4
5
|
const slug = 'pembuat-pola-manik';
|
|
@@ -57,7 +58,6 @@ export const content: BeadPatternGeneratorLocaleContent = {
|
|
|
57
58
|
title,
|
|
58
59
|
description,
|
|
59
60
|
faqTitle: 'Pertanyaan yang Sering Diajukan',
|
|
60
|
-
bibliographyTitle: 'Bibliografi Artisan',
|
|
61
61
|
ui: {
|
|
62
62
|
title: 'Laboratorium Pola',
|
|
63
63
|
subtitle: 'Rekayasa warna untuk tangan Anda',
|
|
@@ -105,11 +105,7 @@ export const content: BeadPatternGeneratorLocaleContent = {
|
|
|
105
105
|
{ type: 'paragraph', html: 'Di era layar yang fana, menciptakan sesuatu yang fisik adalah tindakan revolusioner. Alat ini tidak berusaha mengotomatisasi seni, tetapi untuk <strong>memberdayakan artisan</strong>. Kami memberi Anda presisi komputasi sehingga tangan Anda dapat membangun warisan yang langgeng.' },
|
|
106
106
|
],
|
|
107
107
|
faq,
|
|
108
|
-
bibliography
|
|
109
|
-
{ name: 'Scikit-Image: Color Quantization using K-Means', url: 'https://scikit-learn.org/0.23/auto_examples/cluster/plot_color_quantization.html' },
|
|
110
|
-
{ name: 'Miyuki Delica Beads Specification', url: 'https://www.miyuki-beads.co.jp/english/seedbeads/delica.html' },
|
|
111
|
-
{ name: 'Visgraf Lab: Dithering Algorithms', url: 'https://www.visgraf.impa.br/Courses/ip00/proj/Dithering1/floyd_steinberg_dithering.html' },
|
|
112
|
-
],
|
|
108
|
+
bibliography,
|
|
113
109
|
howTo,
|
|
114
110
|
schemas: [faqSchema as any, howToSchema as any, appSchema],
|
|
115
111
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
2
3
|
import type { BeadPatternGeneratorLocaleContent } from '../index';
|
|
3
4
|
|
|
4
5
|
const slug = 'generatore-schemi-perline';
|
|
@@ -57,7 +58,6 @@ export const content: BeadPatternGeneratorLocaleContent = {
|
|
|
57
58
|
title,
|
|
58
59
|
description,
|
|
59
60
|
faqTitle: 'Domande Frequenti',
|
|
60
|
-
bibliographyTitle: 'Bibliografia Artigiana',
|
|
61
61
|
ui: {
|
|
62
62
|
title: 'Laboratorio di Schemi',
|
|
63
63
|
subtitle: 'Ingegneria del colore per le tue mani',
|
|
@@ -105,11 +105,7 @@ export const content: BeadPatternGeneratorLocaleContent = {
|
|
|
105
105
|
{ type: 'paragraph', html: 'In un\'epoca di schermi effimeri, creare qualcosa di fisico è un atto rivoluzionario. Questo strumento non cerca di automatizzare l\'arte, ma di <strong>potenziare l\'artigiano</strong>. Ti diamo precisione computazionale affinché le tue mani possano costruire eredità durature.' },
|
|
106
106
|
],
|
|
107
107
|
faq,
|
|
108
|
-
bibliography
|
|
109
|
-
{ name: 'Scikit-Image: Color Quantization using K-Means', url: 'https://scikit-learn.org/0.23/auto_examples/cluster/plot_color_quantization.html' },
|
|
110
|
-
{ name: 'Miyuki Delica Beads Specification', url: 'https://www.miyuki-beads.co.jp/english/seedbeads/delica.html' },
|
|
111
|
-
{ name: 'Visgraf Lab: Dithering Algorithms', url: 'https://www.visgraf.impa.br/Courses/ip00/proj/Dithering1/floyd_steinberg_dithering.html' },
|
|
112
|
-
],
|
|
108
|
+
bibliography,
|
|
113
109
|
howTo,
|
|
114
110
|
schemas: [faqSchema as any, howToSchema as any, appSchema],
|
|
115
111
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
2
3
|
import type { BeadPatternGeneratorLocaleContent } from '../index';
|
|
3
4
|
|
|
4
5
|
const slug = 'bead-pattern-generator';
|
|
@@ -57,7 +58,6 @@ export const content: BeadPatternGeneratorLocaleContent = {
|
|
|
57
58
|
title,
|
|
58
59
|
description,
|
|
59
60
|
faqTitle: 'よくある質問',
|
|
60
|
-
bibliographyTitle: '職人のための参考文献',
|
|
61
61
|
ui: {
|
|
62
62
|
title: 'パターン研究所',
|
|
63
63
|
subtitle: 'その手で色を操るエンジニアリング',
|
|
@@ -105,11 +105,7 @@ export const content: BeadPatternGeneratorLocaleContent = {
|
|
|
105
105
|
{ type: 'paragraph', html: '刹那的な画面が支配する現代において、形のある物を創り出すことは、ある種の革命です。このツールは芸術の自動化を目指すものではなく、<strong>職人の力を引き出す</strong>ためのものです。コンピューターの精度を貸与することで、あなたの手で不朽の遺産を築く手助けをします。' },
|
|
106
106
|
],
|
|
107
107
|
faq,
|
|
108
|
-
bibliography
|
|
109
|
-
{ name: 'Scikit-Image: Color Quantization using K-Means', url: 'https://scikit-learn.org/0.23/auto_examples/cluster/plot_color_quantization.html' },
|
|
110
|
-
{ name: 'Miyuki Delica Beads Specification', url: 'https://www.miyuki-beads.co.jp/english/seedbeads/delica.html' },
|
|
111
|
-
{ name: 'Visgraf Lab: Dithering Algorithms', url: 'https://www.visgraf.impa.br/Courses/ip00/proj/Dithering1/floyd_steinberg_dithering.html' },
|
|
112
|
-
],
|
|
108
|
+
bibliography,
|
|
113
109
|
howTo,
|
|
114
110
|
schemas: [faqSchema as any, howToSchema as any, appSchema],
|
|
115
111
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
2
3
|
import type { BeadPatternGeneratorLocaleContent } from '../index';
|
|
3
4
|
|
|
4
5
|
const slug = 'bead-pattern-generator';
|
|
@@ -57,7 +58,6 @@ export const content: BeadPatternGeneratorLocaleContent = {
|
|
|
57
58
|
title,
|
|
58
59
|
description,
|
|
59
60
|
faqTitle: '자주 묻는 질문',
|
|
60
|
-
bibliographyTitle: '전문가 참고 자료',
|
|
61
61
|
ui: {
|
|
62
62
|
title: '도안 연구소',
|
|
63
63
|
subtitle: '당신의 손을 위한 색상 공학',
|
|
@@ -105,11 +105,7 @@ export const content: BeadPatternGeneratorLocaleContent = {
|
|
|
105
105
|
{ type: 'paragraph', html: '덧없는 화면의 시대에 물리적인 무언가를 만드는 것은 혁명적인 행위입니다. 이 도구는 예술을 자동화하려는 것이 아니라 <strong>장인의 능력을 강화</strong>하기 위한 것입니다. 당신의 손이 지속적인 유산을 쌓을 수 있도록 계산적인 정밀함을 제공합니다.' },
|
|
106
106
|
],
|
|
107
107
|
faq,
|
|
108
|
-
bibliography
|
|
109
|
-
{ name: 'Scikit-Image: Color Quantization using K-Means', url: 'https://scikit-learn.org/0.23/auto_examples/cluster/plot_color_quantization.html' },
|
|
110
|
-
{ name: 'Miyuki Delica Beads Specification', url: 'https://www.miyuki-beads.co.jp/english/seedbeads/delica.html' },
|
|
111
|
-
{ name: 'Visgraf Lab: Dithering Algorithms', url: 'https://www.visgraf.impa.br/Courses/ip00/proj/Dithering1/floyd_steinberg_dithering.html' },
|
|
112
|
-
],
|
|
108
|
+
bibliography,
|
|
113
109
|
howTo,
|
|
114
110
|
schemas: [faqSchema as any, howToSchema as any, appSchema],
|
|
115
111
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
2
3
|
import type { BeadPatternGeneratorLocaleContent } from '../index';
|
|
3
4
|
|
|
4
5
|
const slug = 'kralenpatroon-generator';
|
|
@@ -57,7 +58,6 @@ export const content: BeadPatternGeneratorLocaleContent = {
|
|
|
57
58
|
title,
|
|
58
59
|
description,
|
|
59
60
|
faqTitle: 'Veelgestelde Vragen',
|
|
60
|
-
bibliographyTitle: 'Ambachtelijke Bibliografie',
|
|
61
61
|
ui: {
|
|
62
62
|
title: 'Patroon Laboratorium',
|
|
63
63
|
subtitle: 'Kleurtechniek voor je eigen handen',
|
|
@@ -105,11 +105,7 @@ export const content: BeadPatternGeneratorLocaleContent = {
|
|
|
105
105
|
{ type: 'paragraph', html: 'In een tijdperk van vluchtige schermen is het creëren van iets fysieks een revolutionaire daad. Deze tool probeert kunst niet te automatiseren, maar de <strong>ambachtsman te versterken</strong>. We geven je computationele precisie zodat jouw handen blijvende erfenissen kunnen bouwen.' },
|
|
106
106
|
],
|
|
107
107
|
faq,
|
|
108
|
-
bibliography
|
|
109
|
-
{ name: 'Scikit-Image: Color Quantization using K-Means', url: 'https://scikit-learn.org/0.23/auto_examples/cluster/plot_color_quantization.html' },
|
|
110
|
-
{ name: 'Miyuki Delica Beads Specification', url: 'https://www.miyuki-beads.co.jp/english/seedbeads/delica.html' },
|
|
111
|
-
{ name: 'Visgraf Lab: Dithering Algorithms', url: 'https://www.visgraf.impa.br/Courses/ip00/proj/Dithering1/floyd_steinberg_dithering.html' },
|
|
112
|
-
],
|
|
108
|
+
bibliography,
|
|
113
109
|
howTo,
|
|
114
110
|
schemas: [faqSchema as any, howToSchema as any, appSchema],
|
|
115
111
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
2
3
|
import type { BeadPatternGeneratorLocaleContent } from '../index';
|
|
3
4
|
|
|
4
5
|
const slug = 'generator-wzorow-koralikowych';
|
|
@@ -57,7 +58,6 @@ export const content: BeadPatternGeneratorLocaleContent = {
|
|
|
57
58
|
title,
|
|
58
59
|
description,
|
|
59
60
|
faqTitle: 'Najczęściej Zadawane Pytania',
|
|
60
|
-
bibliographyTitle: 'Bibliografia Rękodzielnicza',
|
|
61
61
|
ui: {
|
|
62
62
|
title: 'Laboratorium Wzorów',
|
|
63
63
|
subtitle: 'Inżynieria kolorów dla Twoich rąk',
|
|
@@ -105,11 +105,7 @@ export const content: BeadPatternGeneratorLocaleContent = {
|
|
|
105
105
|
{ type: 'paragraph', html: 'W erze efemerycznych ekranów, tworzenie czegoś fizycznego jest aktem rewolucyjnym. To narzędzie nie dąży do zautomatyzowania sztuki, ale do <strong>wzmocnienia rzemieślnika</strong>. Dajemy Ci obliczeniową precyzję, aby Twoje ręce mogły budować trwałe dziedzictwo.' },
|
|
106
106
|
],
|
|
107
107
|
faq,
|
|
108
|
-
bibliography
|
|
109
|
-
{ name: 'Scikit-Image: Color Quantization using K-Means', url: 'https://scikit-learn.org/0.23/auto_examples/cluster/plot_color_quantization.html' },
|
|
110
|
-
{ name: 'Miyuki Delica Beads Specification', url: 'https://www.miyuki-beads.co.jp/english/seedbeads/delica.html' },
|
|
111
|
-
{ name: 'Visgraf Lab: Dithering Algorithms', url: 'https://www.visgraf.impa.br/Courses/ip00/proj/Dithering1/floyd_steinberg_dithering.html' },
|
|
112
|
-
],
|
|
108
|
+
bibliography,
|
|
113
109
|
howTo,
|
|
114
110
|
schemas: [faqSchema as any, howToSchema as any, appSchema],
|
|
115
111
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
2
3
|
import type { BeadPatternGeneratorLocaleContent } from '../index';
|
|
3
4
|
|
|
4
5
|
const slug = 'gerador-de-padroes-de-contas';
|
|
@@ -57,7 +58,6 @@ export const content: BeadPatternGeneratorLocaleContent = {
|
|
|
57
58
|
title,
|
|
58
59
|
description,
|
|
59
60
|
faqTitle: 'Perguntas Frequentes',
|
|
60
|
-
bibliographyTitle: 'Bibliografia Artesanal',
|
|
61
61
|
ui: {
|
|
62
62
|
title: 'Laboratório de Padrões',
|
|
63
63
|
subtitle: 'Engenharia de cores para as suas mãos',
|
|
@@ -105,11 +105,7 @@ export const content: BeadPatternGeneratorLocaleContent = {
|
|
|
105
105
|
{ type: 'paragraph', html: 'Numa era de ecrãs efémeros, criar algo físico é um ato revolucionário. Esta ferramenta não procura automatizar a arte, mas sim <strong>capacitar o artesão</strong>. Damos-lhe precisão computacional para que as suas mãos possam construir legados duradouros.' },
|
|
106
106
|
],
|
|
107
107
|
faq,
|
|
108
|
-
bibliography
|
|
109
|
-
{ name: 'Scikit-Image: Color Quantization using K-Means', url: 'https://scikit-learn.org/0.23/auto_examples/cluster/plot_color_quantization.html' },
|
|
110
|
-
{ name: 'Miyuki Delica Beads Specification', url: 'https://www.miyuki-beads.co.jp/english/seedbeads/delica.html' },
|
|
111
|
-
{ name: 'Visgraf Lab: Dithering Algorithms', url: 'https://www.visgraf.impa.br/Courses/ip00/proj/Dithering1/floyd_steinberg_dithering.html' },
|
|
112
|
-
],
|
|
108
|
+
bibliography,
|
|
113
109
|
howTo,
|
|
114
110
|
schemas: [faqSchema as any, howToSchema as any, appSchema],
|
|
115
111
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
2
3
|
import type { BeadPatternGeneratorLocaleContent } from '../index';
|
|
3
4
|
|
|
4
5
|
const slug = 'generator-skhem';
|
|
@@ -57,7 +58,6 @@ export const content: BeadPatternGeneratorLocaleContent = {
|
|
|
57
58
|
title,
|
|
58
59
|
description,
|
|
59
60
|
faqTitle: 'Часто задаваемые вопросы',
|
|
60
|
-
bibliographyTitle: 'Библиография мастера',
|
|
61
61
|
ui: {
|
|
62
62
|
title: 'Лаборатория узоров',
|
|
63
63
|
subtitle: 'Инженерия цвета для ваших рук',
|
|
@@ -105,11 +105,7 @@ export const content: BeadPatternGeneratorLocaleContent = {
|
|
|
105
105
|
{ type: 'paragraph', html: 'В эпоху ускользающих экранов создание чего-то физического — это революционный акт. Этот инструмент не стремится автоматизировать искусство, он призван <strong>расширить возможности мастера</strong>. Мы даем вам вычислительную точность, чтобы ваши руки могли создавать долговечное наследие.' },
|
|
106
106
|
],
|
|
107
107
|
faq,
|
|
108
|
-
bibliography
|
|
109
|
-
{ name: 'Scikit-Image: Color Quantization using K-Means', url: 'https://scikit-learn.org/0.23/auto_examples/cluster/plot_color_quantization.html' },
|
|
110
|
-
{ name: 'Miyuki Delica Beads Specification', url: 'https://www.miyuki-beads.co.jp/english/seedbeads/delica.html' },
|
|
111
|
-
{ name: 'Visgraf Lab: Dithering Algorithms', url: 'https://www.visgraf.impa.br/Courses/ip00/proj/Dithering1/floyd_steinberg_dithering.html' },
|
|
112
|
-
],
|
|
108
|
+
bibliography,
|
|
113
109
|
howTo,
|
|
114
110
|
schemas: [faqSchema as any, howToSchema as any, appSchema],
|
|
115
111
|
};
|