@jjlmoya/utils-audiovisual 1.7.0 → 1.9.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 (152) hide show
  1. package/package.json +2 -1
  2. package/src/category/i18n/de.ts +198 -0
  3. package/src/category/i18n/id.ts +198 -0
  4. package/src/category/i18n/it.ts +198 -0
  5. package/src/category/i18n/ja.ts +198 -0
  6. package/src/category/i18n/ko.ts +198 -0
  7. package/src/category/i18n/nl.ts +198 -0
  8. package/src/category/i18n/pl.ts +198 -0
  9. package/src/category/i18n/pt.ts +198 -0
  10. package/src/category/i18n/ru.ts +198 -0
  11. package/src/category/i18n/sv.ts +198 -0
  12. package/src/category/i18n/tr.ts +198 -0
  13. package/src/category/i18n/zh.ts +198 -0
  14. package/src/category/index.ts +31 -3
  15. package/src/tests/i18n_coverage.test.ts +36 -0
  16. package/src/tests/slug_uniqueness.test.ts +81 -0
  17. package/src/tool/chromaticLens/i18n/de.ts +246 -0
  18. package/src/tool/chromaticLens/i18n/id.ts +246 -0
  19. package/src/tool/chromaticLens/i18n/it.ts +246 -0
  20. package/src/tool/chromaticLens/i18n/ja.ts +246 -0
  21. package/src/tool/chromaticLens/i18n/ko.ts +246 -0
  22. package/src/tool/chromaticLens/i18n/nl.ts +246 -0
  23. package/src/tool/chromaticLens/i18n/pl.ts +246 -0
  24. package/src/tool/chromaticLens/i18n/pt.ts +246 -0
  25. package/src/tool/chromaticLens/i18n/ru.ts +246 -0
  26. package/src/tool/chromaticLens/i18n/sv.ts +246 -0
  27. package/src/tool/chromaticLens/i18n/tr.ts +246 -0
  28. package/src/tool/chromaticLens/i18n/zh.ts +246 -0
  29. package/src/tool/chromaticLens/index.ts +15 -7
  30. package/src/tool/collageMaker/i18n/de.ts +233 -0
  31. package/src/tool/collageMaker/i18n/id.ts +233 -0
  32. package/src/tool/collageMaker/i18n/it.ts +233 -0
  33. package/src/tool/collageMaker/i18n/ja.ts +233 -0
  34. package/src/tool/collageMaker/i18n/ko.ts +233 -0
  35. package/src/tool/collageMaker/i18n/nl.ts +233 -0
  36. package/src/tool/collageMaker/i18n/pl.ts +233 -0
  37. package/src/tool/collageMaker/i18n/pt.ts +233 -0
  38. package/src/tool/collageMaker/i18n/ru.ts +233 -0
  39. package/src/tool/collageMaker/i18n/sv.ts +233 -0
  40. package/src/tool/collageMaker/i18n/tr.ts +233 -0
  41. package/src/tool/collageMaker/i18n/zh.ts +233 -0
  42. package/src/tool/collageMaker/index.ts +15 -6
  43. package/src/tool/exifCleaner/i18n/de.ts +277 -0
  44. package/src/tool/exifCleaner/i18n/fr.ts +1 -1
  45. package/src/tool/exifCleaner/i18n/id.ts +277 -0
  46. package/src/tool/exifCleaner/i18n/it.ts +277 -0
  47. package/src/tool/exifCleaner/i18n/ja.ts +277 -0
  48. package/src/tool/exifCleaner/i18n/ko.ts +277 -0
  49. package/src/tool/exifCleaner/i18n/nl.ts +277 -0
  50. package/src/tool/exifCleaner/i18n/pl.ts +277 -0
  51. package/src/tool/exifCleaner/i18n/pt.ts +277 -0
  52. package/src/tool/exifCleaner/i18n/ru.ts +277 -0
  53. package/src/tool/exifCleaner/i18n/sv.ts +277 -0
  54. package/src/tool/exifCleaner/i18n/tr.ts +277 -0
  55. package/src/tool/exifCleaner/i18n/zh.ts +277 -0
  56. package/src/tool/exifCleaner/index.ts +16 -8
  57. package/src/tool/imageCompressor/i18n/de.ts +242 -0
  58. package/src/tool/imageCompressor/i18n/en.ts +1 -1
  59. package/src/tool/imageCompressor/i18n/es.ts +1 -1
  60. package/src/tool/imageCompressor/i18n/id.ts +242 -0
  61. package/src/tool/imageCompressor/i18n/it.ts +242 -0
  62. package/src/tool/imageCompressor/i18n/ja.ts +242 -0
  63. package/src/tool/imageCompressor/i18n/ko.ts +242 -0
  64. package/src/tool/imageCompressor/i18n/nl.ts +242 -0
  65. package/src/tool/imageCompressor/i18n/pl.ts +242 -0
  66. package/src/tool/imageCompressor/i18n/pt.ts +242 -0
  67. package/src/tool/imageCompressor/i18n/ru.ts +242 -0
  68. package/src/tool/imageCompressor/i18n/sv.ts +242 -0
  69. package/src/tool/imageCompressor/i18n/tr.ts +242 -0
  70. package/src/tool/imageCompressor/i18n/zh.ts +244 -0
  71. package/src/tool/imageCompressor/index.ts +15 -7
  72. package/src/tool/printQualityCalculator/i18n/de.ts +261 -0
  73. package/src/tool/printQualityCalculator/i18n/fr.ts +1 -1
  74. package/src/tool/printQualityCalculator/i18n/id.ts +261 -0
  75. package/src/tool/printQualityCalculator/i18n/it.ts +261 -0
  76. package/src/tool/printQualityCalculator/i18n/ja.ts +261 -0
  77. package/src/tool/printQualityCalculator/i18n/ko.ts +261 -0
  78. package/src/tool/printQualityCalculator/i18n/nl.ts +261 -0
  79. package/src/tool/printQualityCalculator/i18n/pl.ts +261 -0
  80. package/src/tool/printQualityCalculator/i18n/pt.ts +261 -0
  81. package/src/tool/printQualityCalculator/i18n/ru.ts +261 -0
  82. package/src/tool/printQualityCalculator/i18n/sv.ts +261 -0
  83. package/src/tool/printQualityCalculator/i18n/tr.ts +261 -0
  84. package/src/tool/printQualityCalculator/i18n/zh.ts +261 -0
  85. package/src/tool/printQualityCalculator/index.ts +15 -7
  86. package/src/tool/privacyBlur/i18n/de.ts +238 -0
  87. package/src/tool/privacyBlur/i18n/id.ts +238 -0
  88. package/src/tool/privacyBlur/i18n/it.ts +238 -0
  89. package/src/tool/privacyBlur/i18n/ja.ts +238 -0
  90. package/src/tool/privacyBlur/i18n/ko.ts +238 -0
  91. package/src/tool/privacyBlur/i18n/nl.ts +238 -0
  92. package/src/tool/privacyBlur/i18n/pl.ts +238 -0
  93. package/src/tool/privacyBlur/i18n/pt.ts +238 -0
  94. package/src/tool/privacyBlur/i18n/ru.ts +238 -0
  95. package/src/tool/privacyBlur/i18n/sv.ts +238 -0
  96. package/src/tool/privacyBlur/i18n/tr.ts +238 -0
  97. package/src/tool/privacyBlur/i18n/zh.ts +238 -0
  98. package/src/tool/privacyBlur/index.ts +15 -7
  99. package/src/tool/subtitleSync/i18n/de.ts +241 -0
  100. package/src/tool/subtitleSync/i18n/fr.ts +5 -5
  101. package/src/tool/subtitleSync/i18n/id.ts +241 -0
  102. package/src/tool/subtitleSync/i18n/it.ts +241 -0
  103. package/src/tool/subtitleSync/i18n/ja.ts +241 -0
  104. package/src/tool/subtitleSync/i18n/ko.ts +241 -0
  105. package/src/tool/subtitleSync/i18n/nl.ts +241 -0
  106. package/src/tool/subtitleSync/i18n/pl.ts +241 -0
  107. package/src/tool/subtitleSync/i18n/pt.ts +241 -0
  108. package/src/tool/subtitleSync/i18n/ru.ts +241 -0
  109. package/src/tool/subtitleSync/i18n/sv.ts +241 -0
  110. package/src/tool/subtitleSync/i18n/tr.ts +241 -0
  111. package/src/tool/subtitleSync/i18n/zh.ts +241 -0
  112. package/src/tool/subtitleSync/index.ts +15 -7
  113. package/src/tool/timelapseCalculator/i18n/de.ts +169 -0
  114. package/src/tool/timelapseCalculator/i18n/fr.ts +2 -2
  115. package/src/tool/timelapseCalculator/i18n/id.ts +169 -0
  116. package/src/tool/timelapseCalculator/i18n/it.ts +169 -0
  117. package/src/tool/timelapseCalculator/i18n/ja.ts +169 -0
  118. package/src/tool/timelapseCalculator/i18n/ko.ts +169 -0
  119. package/src/tool/timelapseCalculator/i18n/nl.ts +169 -0
  120. package/src/tool/timelapseCalculator/i18n/pl.ts +169 -0
  121. package/src/tool/timelapseCalculator/i18n/pt.ts +169 -0
  122. package/src/tool/timelapseCalculator/i18n/ru.ts +169 -0
  123. package/src/tool/timelapseCalculator/i18n/sv.ts +169 -0
  124. package/src/tool/timelapseCalculator/i18n/tr.ts +169 -0
  125. package/src/tool/timelapseCalculator/i18n/zh.ts +169 -0
  126. package/src/tool/timelapseCalculator/index.ts +16 -8
  127. package/src/tool/tvDistance/i18n/de.ts +223 -0
  128. package/src/tool/tvDistance/i18n/id.ts +223 -0
  129. package/src/tool/tvDistance/i18n/it.ts +223 -0
  130. package/src/tool/tvDistance/i18n/ja.ts +223 -0
  131. package/src/tool/tvDistance/i18n/ko.ts +223 -0
  132. package/src/tool/tvDistance/i18n/nl.ts +223 -0
  133. package/src/tool/tvDistance/i18n/pl.ts +223 -0
  134. package/src/tool/tvDistance/i18n/pt.ts +223 -0
  135. package/src/tool/tvDistance/i18n/ru.ts +223 -0
  136. package/src/tool/tvDistance/i18n/sv.ts +223 -0
  137. package/src/tool/tvDistance/i18n/tr.ts +223 -0
  138. package/src/tool/tvDistance/i18n/zh.ts +223 -0
  139. package/src/tool/tvDistance/index.ts +15 -7
  140. package/src/tool/videoFrameExtractor/i18n/de.ts +235 -0
  141. package/src/tool/videoFrameExtractor/i18n/id.ts +235 -0
  142. package/src/tool/videoFrameExtractor/i18n/it.ts +235 -0
  143. package/src/tool/videoFrameExtractor/i18n/ja.ts +235 -0
  144. package/src/tool/videoFrameExtractor/i18n/ko.ts +235 -0
  145. package/src/tool/videoFrameExtractor/i18n/nl.ts +235 -0
  146. package/src/tool/videoFrameExtractor/i18n/pl.ts +235 -0
  147. package/src/tool/videoFrameExtractor/i18n/pt.ts +235 -0
  148. package/src/tool/videoFrameExtractor/i18n/ru.ts +235 -0
  149. package/src/tool/videoFrameExtractor/i18n/sv.ts +235 -0
  150. package/src/tool/videoFrameExtractor/i18n/tr.ts +235 -0
  151. package/src/tool/videoFrameExtractor/i18n/zh.ts +235 -0
  152. package/src/tool/videoFrameExtractor/index.ts +16 -8
@@ -0,0 +1,81 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { ALL_TOOLS } from '../tools';
3
+ import type { ToolLocaleContent } from '../types';
4
+
5
+ const sharingLocales = ['ja', 'ko', 'zh'];
6
+
7
+ interface ValidateParams {
8
+ toolId: string;
9
+ locale: string;
10
+ content: ToolLocaleContent;
11
+ enSlug: string;
12
+ slugs: Map<string, string>;
13
+ }
14
+
15
+ const validateLocaleSlug = ({
16
+ toolId,
17
+ locale,
18
+ content,
19
+ enSlug,
20
+ slugs,
21
+ }: ValidateParams) => {
22
+ expect(
23
+ content.slug,
24
+ `Tool "${toolId}" locale "${locale}" has an invalid slug ("${content.slug}"). Slugs must be transliterated (only a-z, 0-9, and -).`,
25
+ ).toMatch(/^[a-z0-9-]+$/);
26
+
27
+ if (locale === 'en') {
28
+ return;
29
+ }
30
+
31
+ if (sharingLocales.includes(locale)) {
32
+ expect(
33
+ content.slug,
34
+ `Tool "${toolId}" locale "${locale}" must use the same slug as "en" ("${enSlug}").`,
35
+ ).toBe(enSlug);
36
+ } else {
37
+ expect(
38
+ content.slug,
39
+ `Tool "${toolId}" locale "${locale}" has the same slug as "en" ("${enSlug}"). Cada slug tiene que estar en su propia idioma`,
40
+ ).not.toBe(enSlug);
41
+
42
+ if (slugs.has(content.slug)) {
43
+ const previousLocale = slugs.get(content.slug);
44
+ expect(
45
+ false,
46
+ `Tool "${toolId}" locales "${locale}" and "${previousLocale}" share the same slug ("${content.slug}"). Cada slug tiene que estar en su propia idioma`,
47
+ ).toBe(true);
48
+ }
49
+ slugs.set(content.slug, locale);
50
+ }
51
+ };
52
+
53
+ describe('Slug Localization and Uniqueness Validation', () => {
54
+ ALL_TOOLS.forEach((tool) => {
55
+ describe(`Tool: ${tool.entry.id}`, () => {
56
+ it('every locale should have a unique, translated slug', async () => {
57
+ const slugs = new Map<string, string>();
58
+ const locales = Object.keys(tool.entry.i18n);
59
+
60
+ let enSlug = '';
61
+ if (locales.includes('en')) {
62
+ const enLoader = tool.entry.i18n['en' as keyof typeof tool.entry.i18n];
63
+ const enContent = (await enLoader?.()) as ToolLocaleContent;
64
+ enSlug = enContent.slug;
65
+ }
66
+
67
+ for (const locale of locales) {
68
+ const loader = tool.entry.i18n[locale as keyof typeof tool.entry.i18n];
69
+ const content = (await loader?.()) as ToolLocaleContent;
70
+ validateLocaleSlug({
71
+ toolId: tool.entry.id,
72
+ locale,
73
+ content,
74
+ enSlug,
75
+ slugs,
76
+ });
77
+ }
78
+ });
79
+ });
80
+ });
81
+ });
@@ -0,0 +1,246 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ChromaticLensUI, ChromaticLensLocaleContent } from '../index';
3
+
4
+ const slug = 'chromatic-lens-farbpaletten-extraktion-online';
5
+ const title = 'Chromatic Lens: Online Extraktion von Farbpaletten';
6
+ const description = 'Extrahieren Sie kostenlos professionelle Farbpaletten aus jedem Bild. Identifizieren Sie dominante Farben in Ihren Fotos mithilfe mathematischer Algorithmen.';
7
+
8
+ const ui: ChromaticLensUI = {
9
+ dropTitle: "Farben analysieren",
10
+ dropSubtitle: "Ziehen Sie ein Bild hierher, um seine chromatische DNA zu extrahieren.",
11
+ processingLabel: "Palette wird extrahiert...",
12
+ paletteTitle: "Extrahierte Palette",
13
+ copyLabel: "HEX kopieren",
14
+ copiedLabel: "Kopiert!",
15
+ colorCountLabel: "Anzahl der Farben",
16
+ changeImage: "Bild ändern",
17
+ faqTitle: "Häufig gestellte Fragen zur Farbetraktion",
18
+ bibliographyTitle: "Ressourcen und technische Dokumentation"
19
+ };
20
+
21
+ const faq: ChromaticLensLocaleContent['faq'] = [
22
+ {
23
+ question: "Wie funktioniert die Farbetraktion?",
24
+ answer: "Wir verwenden den 'Median Cut' Algorithmus, der Bildpixel basierend auf ihrer Nähe im RGB-Farbraum gruppiert, um die repräsentativsten Töne zu finden.",
25
+ },
26
+ {
27
+ question: "Kann ich Farben in meinen Design-Editor kopieren?",
28
+ answer: "Ja, durch Klicken auf jede Farbe wird der HEX-Code automatisch in Ihre Zwischenablage kopiert, bereit zum Einfügen in Photoshop, Figma oder CSS.",
29
+ },
30
+ {
31
+ question: "Welche Bildtypen kann ich analysieren?",
32
+ answer: "Jede JPG-, PNG- oder WebP-Datei. Die Verarbeitung erfolgt lokal, sodass auch große Bilder schnell ohne Netzwerkkosten analysiert werden.",
33
+ },
34
+ ];
35
+
36
+ const howTo: ChromaticLensLocaleContent['howTo'] = [
37
+ {
38
+ name: "Bild hochladen",
39
+ text: "Laden Sie das Foto hoch, aus dem Sie chromatische Inspiration extrahieren möchten.",
40
+ },
41
+ {
42
+ name: "Präzision anpassen",
43
+ text: "Wählen Sie aus, wie viele dominante Farben das Tool identifizieren soll (von 3 bis 12).",
44
+ },
45
+ {
46
+ name: "Ergebnis analysieren",
47
+ text: "Die Palette erscheint sofort mit den entsprechenden Hexadezimal Codes.",
48
+ },
49
+ {
50
+ name: "Kopieren und verwenden",
51
+ text: "Klicken Sie auf die Töne, um sie zu speichern und in Ihrem Designprojekt anzuwenden.",
52
+ },
53
+ ];
54
+
55
+ const bibliography: ChromaticLensLocaleContent['bibliography'] = [
56
+ {
57
+ name: "Median Cut Algorithm - Wikipedia",
58
+ url: "https://en.wikipedia.org/wiki/Median_cut",
59
+ },
60
+ {
61
+ name: "Farblehre für Designer",
62
+ url: "https://www.smashingmagazine.com/2010/01/color-theory-for-designers-part-1-the-meaning-of-color/",
63
+ },
64
+ ];
65
+
66
+ const seo: ChromaticLensLocaleContent['seo'] = [
67
+ {
68
+ type: 'summary',
69
+ title: 'Intelligente Extraktion von Farbpaletten',
70
+ items: [
71
+ 'Professioneller Median-Cut-Algorithmus zur Farbanalyse',
72
+ 'Extraktion von 3–12 dominanten Farben aus jedem Bild',
73
+ 'HEX-Codes direkt in die Zwischenablage kopierbar',
74
+ '100% lokale Verarbeitung – ideal für Kreative'
75
+ ]
76
+ },
77
+ { type: 'title', text: 'Farbetraktion: Wissenschaft und Design', level: 2 },
78
+ { type: 'paragraph', html: 'Haben Sie sich jemals gefragt, warum ein Filmfoto so harmonisch wirkt? Das ist kein Zufall, sondern angewandte Farblehre. Chromatic Lens ermöglicht es Ihnen, diese Harmonie direkt aus den Pixeln zu extrahieren und in HEX-Codes umzuwandeln, die Sie in Ihren Designprojekten verwenden können.' },
79
+
80
+ { type: 'stats', items: [
81
+ { value: 'Sofort', label: 'Farbanalyse', icon: 'mdi:lightning-bolt' },
82
+ { value: '100%', label: 'Lokale Privatsphäre', icon: 'mdi:lock' },
83
+ { value: 'RGB', label: 'Präziser Farbraum', icon: 'mdi:palette' }
84
+ ], columns: 3 },
85
+
86
+ { type: 'title', text: 'Der Median Cut Algorithmus erklärt', level: 3 },
87
+ { type: 'paragraph', html: 'Die intelligente Palettenextraktion ist keine einfache Zufallsauswahl von Pixeln. Sie nutzt den Median-Cut-Algorithmus, eine rekursive Zerlegungstechnik, die eine originalgetreue Darstellung gewährleistet:' },
88
+ { type: 'list', items: [
89
+ '<strong>Rekursive Teilung:</strong> Der RGB-\"Farbwürfel\" des Bildes wird rekursiv in kleinere Boxen unterteilt.',
90
+ '<strong>Volumen-Balance:</strong> Jede Partition sucht nach Gruppen von Pixeln aus dem gleichen Farbraum mit ähnlichen Volumina.',
91
+ '<strong>Gewichteter Durchschnitt:</strong> Die resultierende Farbe jeder Box ist der Durchschnitt aller darin enthaltenen Pixel.',
92
+ '<strong>Originalgetreue Darstellung:</strong> Die dominanten Farben spiegeln die reale visuelle Atmosphäre des Bildes wider, nicht nur eine simple Stichprobe.'
93
+ ], icon: 'mdi:check' },
94
+
95
+ { type: 'card', title: 'Kreativer Workflow', html: 'Ideal für Webentwickler, UX/UI-Designer, digitale Künstler und Kreative, die die visuelle Essenz eines Fotos, Films oder einer Vorlage sofort erfassen möchten, um sie in ihren Interfaces, Illustrationen oder Markenpaletten anzuwenden.' },
96
+
97
+ { type: 'title', text: 'Anwendungsfälle im digitalen Design', level: 3 },
98
+ { type: 'comparative', items: [
99
+ {
100
+ title: 'UX/UI Designer',
101
+ description: 'Paletten aus Hero-Images extrahieren, um stimmige Interfaces zu erstellen',
102
+ icon: 'mdi:palette',
103
+ points: [
104
+ 'Harmonische Hintergrundfarben',
105
+ 'Buttons und sekundäre Elemente',
106
+ 'Automatisch berechneter Kontrast'
107
+ ]
108
+ },
109
+ {
110
+ title: 'Webentwickler',
111
+ description: 'CSS-Stylesheets direkt aus visuellen Referenzen erstellen',
112
+ icon: 'mdi:code-braces',
113
+ points: [
114
+ 'HEX direkt in CSS kopieren',
115
+ 'Farbvariablen in SCSS/CSS',
116
+ 'Konsistente Themes ohne vorheriges Design'
117
+ ],
118
+ highlight: true
119
+ },
120
+ {
121
+ title: 'Digitale Künstler und Illustratoren',
122
+ description: 'Chromatische Referenzen aus Filmen, Natur oder Kunst einfangen',
123
+ icon: 'mdi:brush',
124
+ points: [
125
+ 'Referenzpaletten aus Meisterwerken',
126
+ 'Cineastische Farbstudien',
127
+ 'Sofortige visuelle Inspiration'
128
+ ]
129
+ },
130
+ {
131
+ title: 'Branding Spezialisten',
132
+ description: 'Visuelle Identitäten basierend auf Beispielfotos entwickeln',
133
+ icon: 'mdi:tag-multiple',
134
+ points: [
135
+ 'Markenfarben aus Bildern extrahieren',
136
+ 'Professionelle Farb-Guides erstellen',
137
+ 'Visuelle Konsistenz gewährleisten'
138
+ ]
139
+ }
140
+ ], columns: 2 },
141
+
142
+ { type: 'title', text: 'Angewandte Farblehre', level: 3 },
143
+ { type: 'table', headers: ['Farbkonzept', 'Definition', 'Praktische Anwendung'], rows: [
144
+ ['Farharmonie', 'Farbkombination, die visuell ausgewogen ist', 'Konsistente visuelle Identität im UI'],
145
+ ['Kontrast', 'Helligkeitsunterschied zwischen Farben', 'Lesbarkeit und visuelle Hierarchie'],
146
+ ['Sättigung', 'Farbintensität eines Tons', 'Professionalität (niedrig) vs. Energie (hoch)'],
147
+ ['Farbtemperatur', 'Warme Farben (Rot) vs. kühle Farben (Blau)', 'Emotionspsychologie im Design'],
148
+ ['Monochromatische Palette', 'Variationen eines einzelnen Tons', 'Eleganz und Minimalismus']
149
+ ] },
150
+
151
+ { type: 'proscons', items: [
152
+ {
153
+ pro: 'Mathematische Präzision bei der Extraktion – keine ungefähre visuelle Auswahl',
154
+ con: 'Kaum sichtbare Farben können enthalten sein, wenn sie viele Pixel haben'
155
+ },
156
+ {
157
+ pro: 'Sofortiges Kopieren in die Zwischenablage – perfekte Integration in den Workflow',
158
+ con: 'Benötigt einen modernen Browser, der mit der Canvas-API kompatibel ist'
159
+ },
160
+ {
161
+ pro: 'Vollständige Privatsphäre – 100% lokale Analyse ohne Datenübermittlung',
162
+ con: 'Kein Verlauf früherer Analysen gespeichert'
163
+ },
164
+ {
165
+ pro: 'Kompatibel mit jedem digitalen Bildformat',
166
+ con: 'Endgültige Farben hängen von der Bildkompression und Qualität ab'
167
+ }
168
+ ], proTitle: 'Vorteile', conTitle: 'Einschränkungen' },
169
+
170
+ { type: 'diagnostic', variant: 'success', title: 'Realistische Farbdarstellung', icon: 'mdi:check-circle-outline', badge: 'Fortgeschrittener Algorithmus', html: 'Im Gegensatz zu Tools, die einfach zufällige Pixel abfragen, verwendet unser System den Median-Cut-Algorithmus, der die gesamte Pixelanzahl jedes Tons gewichtet. So wird sichergestellt, dass die resultierende Palette die visuelle Atmosphäre und Farbpsychologie des Originalbildes originalgetreu widerspiegelt.' },
171
+
172
+ { type: 'glossary', items: [
173
+ {
174
+ term: 'Median Cut',
175
+ definition: 'Farbauswahl-Algorithmus, der den RGB-Raum rekursiv in Boxen unterteilt und so eine gleichmäßige Verteilung gewährleistet. Historisch für GIF- und indizierte Farbtechnologien genutzt.'
176
+ },
177
+ {
178
+ term: 'RGB-Farbraum',
179
+ definition: 'Farbmodell basierend auf Rot, Grün und Blau. Jede Farbe wird als Kombination dieser drei Werte (0–255) dargestellt. Standard für Bildschirme und Web.'
180
+ },
181
+ {
182
+ term: 'HEX-Code',
183
+ definition: '6-stellige hexadezimale Notation (#RRGGBB) zur Darstellung von Farben im Web: #FF0000 (Rot), #00FF00 (Grün), #0000FF (Blau). Universell in CSS, Figma und Adobe.'
184
+ },
185
+ {
186
+ term: 'Farbsättigung',
187
+ definition: 'Intensität oder Reinheit der Farbe. Hohe Sättigung = lebendige Farbe; niedrige Sättigung = gräuliche Farbe. Beeinflusst die emotionale Wahrnehmung.'
188
+ },
189
+ {
190
+ term: 'Farbharmonie',
191
+ definition: 'Auswahl und Kombination von Farben, die zu einem visuell ansprechenden Ergebnis führen. Kann monochromatisch, komplementär, analog oder triadisch sein.'
192
+ }
193
+ ] },
194
+
195
+ { type: 'message', title: 'Professionelle Farbanalyse', ariaLabel: 'Technische Informationen zur Farbanalyse', html: 'Chromatic Lens verwandelt manuelle visuelle Analyse in algorithmische Präzision. Es extrahiert nicht nur Farben: Es fängt die emotionale und visuelle Essenz jedes Bildes ein und legt sie als einsatzbereite HEX-Codes direkt in Ihre Zwischenablage. Volle Privatsphäre, keine Limits.' },
196
+
197
+ { type: 'title', text: 'Design aus visueller Inspiration', level: 3 },
198
+ { type: 'paragraph', html: 'Die beste Farbpalette ist diejenige, die die visuelle Absicht Ihrer Referenz einfängt. Chromatic Lens automatisiert den ehemals manuellen Prozess: beobachten, analysieren, notieren. Jetzt ziehen Sie einfach ein Bild und erhalten in Sekunden professionelle HEX-Codes.' }
199
+ ];
200
+
201
+ const faqSchema: WithContext<FAQPage> = {
202
+ '@context': 'https://schema.org',
203
+ '@type': 'FAQPage',
204
+ mainEntity: faq.map((item) => ({
205
+ '@type': 'Question',
206
+ name: item.question,
207
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
208
+ })),
209
+ };
210
+
211
+ const howToSchema: WithContext<HowTo> = {
212
+ '@context': 'https://schema.org',
213
+ '@type': 'HowTo',
214
+ name: title,
215
+ description,
216
+ step: howTo.map((step) => ({
217
+ '@type': 'HowToStep',
218
+ name: step.name,
219
+ text: step.text,
220
+ })),
221
+ };
222
+
223
+ const appSchema: WithContext<SoftwareApplication> = {
224
+ '@context': 'https://schema.org',
225
+ '@type': 'SoftwareApplication',
226
+ name: title,
227
+ description,
228
+ applicationCategory: 'UtilitiesApplication',
229
+ operatingSystem: 'Web',
230
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
231
+ inLanguage: 'de',
232
+ };
233
+
234
+ export const content: ChromaticLensLocaleContent = {
235
+ slug,
236
+ title,
237
+ description,
238
+ ui,
239
+ seo,
240
+ faqTitle: "Häufig gestellte Fragen",
241
+ faq,
242
+ bibliographyTitle: "Referenzen",
243
+ bibliography,
244
+ howTo,
245
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
246
+ };
@@ -0,0 +1,246 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ChromaticLensUI, ChromaticLensLocaleContent } from '../index';
3
+
4
+ const slug = 'chromatic-lens-ekstraksi-palet-warna-online';
5
+ const title = 'Chromatic Lens: Ekstraksi Palet Warna Online';
6
+ const description = 'Ekstrak palet warna profesional dari gambar apa pun secara gratis. Identifikasi warna dominan dalam foto Anda menggunakan algoritma matematika.';
7
+
8
+ const ui: ChromaticLensUI = {
9
+ dropTitle: "Analisis Warna",
10
+ dropSubtitle: "Seret gambar untuk mengekstrak DNA kromatiknya.",
11
+ processingLabel: "Mengekstrak palet...",
12
+ paletteTitle: "Palet yang Diekstrak",
13
+ copyLabel: "Salin HEX",
14
+ copiedLabel: "Tersalin!",
15
+ colorCountLabel: "Jumlah warna",
16
+ changeImage: "Ganti gambar",
17
+ faqTitle: "Pertanyaan umum tentang ekstraksi warna",
18
+ bibliographyTitle: "Sumber daya dan dokumentasi teknis"
19
+ };
20
+
21
+ const faq: ChromaticLensLocaleContent['faq'] = [
22
+ {
23
+ question: "Bagaimana cara kerja ekstraksi warna?",
24
+ answer: "Kami menggunakan algoritma 'Median Cut', yang mengelompokkan piksel gambar berdasarkan kedekatannya dalam ruang warna RGB untuk menemukan nada yang paling representatif.",
25
+ },
26
+ {
27
+ question: "Dapatkah saya menyalin warna ke editor desain saya?",
28
+ answer: "Ya, dengan mengeklik setiap warna, kode HEX akan disalin secara otomatis ke papan klip Anda, siap ditempelkan ke Photoshop, Figma, atau CSS.",
29
+ },
30
+ {
31
+ question: "Jenis gambar apa yang bisa saya analisis?",
32
+ answer: "Semua file JPG, PNG, atau WebP. Pemrosesan dilakukan secara lokal, sehingga gambar besar akan dianalisis dengan cepat tanpa menghabiskan data jaringan.",
33
+ },
34
+ ];
35
+
36
+ const howTo: ChromaticLensLocaleContent['howTo'] = [
37
+ {
38
+ name: "Unggah gambar",
39
+ text: "Unggah foto yang ingin Anda ambil inspirasi kromatiknya.",
40
+ },
41
+ {
42
+ name: "Sesuaikan presisi",
43
+ text: "Pilih berapa banyak warna dominan yang ingin diidentifikasi oleh alat ini (dari 3 hingga 12).",
44
+ },
45
+ {
46
+ name: "Analisis hasilnya",
47
+ text: "Palet akan muncul secara instan dengan kode heksadesimal yang sesuai.",
48
+ },
49
+ {
50
+ name: "Salin dan gunakan",
51
+ text: "Klik pada nada warna untuk menyimpannya dan menerapkannya pada proyek desain Anda.",
52
+ },
53
+ ];
54
+
55
+ const bibliography: ChromaticLensLocaleContent['bibliography'] = [
56
+ {
57
+ name: "Median Cut Algorithm - Wikipedia",
58
+ url: "https://en.wikipedia.org/wiki/Median_cut",
59
+ },
60
+ {
61
+ name: "Teori Warna untuk Desainer",
62
+ url: "https://www.smashingmagazine.com/2010/01/color-theory-for-designers-part-1-the-meaning-of-color/",
63
+ },
64
+ ];
65
+
66
+ const seo: ChromaticLensLocaleContent['seo'] = [
67
+ {
68
+ type: 'summary',
69
+ title: 'Ekstraksi Palet Warna Cerdas',
70
+ items: [
71
+ 'Algoritma Median Cut profesional untuk analisis warna',
72
+ 'Ekstrak 3-12 warna dominan dari gambar apa pun',
73
+ 'Kode HEX dapat disalin langsung ke papan klip',
74
+ 'Pemrosesan lokal 100% - ideal untuk kreatif'
75
+ ]
76
+ },
77
+ { type: 'title', text: 'Ekstraksi Palet Warna: Sains dan Desain', level: 2 },
78
+ { type: 'paragraph', html: 'Pernahkah Anda bertanya-tanya mengapa foto film terasa begitu harmonis? Itu bukan kebetulan; itu adalah teori warna yang sedang beraksi. Chromatic Lens memungkinkan Anda mengekstrak harmoni itu langsung dari piksel, mengubahnya menjadi kode HEX yang dapat digunakan dalam proyek desain Anda.' },
79
+
80
+ { type: 'stats', items: [
81
+ { value: 'Instan', label: 'Analisis Warna', icon: 'mdi:lightning-bolt' },
82
+ { value: '100%', label: 'Privasi Lokal', icon: 'mdi:lock' },
83
+ { value: 'RGB', label: 'Ruang Warna Presisi', icon: 'mdi:palette' }
84
+ ], columns: 3 },
85
+
86
+ { type: 'title', text: 'Penjelasan Algoritma Median Cut', level: 3 },
87
+ { type: 'paragraph', html: 'Ekstraksi palet cerdas bukanlah pengambilan sampel piksel acak yang sederhana. Ia menggunakan algoritma Median Cut, teknik partisi rekursif yang memastikan representasi setia:' },
88
+ { type: 'list', items: [
89
+ '<strong>Pembagian Rekursif:</strong> \"Kubus warna\" RGB dari gambar dibagi secara rekursif menjadi kotak-kotak yang lebih kecil.',
90
+ '<strong>Keseimbangan Volume:</strong> Setiap partisi berusaha mengelompokkan piksel dari ruang warna yang sama dengan volume yang serupa.',
91
+ '<strong>Rata-rata Tertimbang:</strong> Warna yang dihasilkan dari setiap kotak adalah rata-rata dari semua piksel yang dikandungnya.',
92
+ '<strong>Representasi Setia:</strong> Warna dominan mencerminkan suasana visual nyata dari gambar, bukan sekadar sampel sederhana.'
93
+ ], icon: 'mdi:check' },
94
+
95
+ { type: 'card', title: 'Alur Kerja Kreatif', html: 'Ideal untuk pengembang web, desainer UX/UI, seniman digital, dan kreatif yang ingin menangkap esensi visual foto, film, atau referensi visual secara instan untuk diterapkan dalam antarmuka, ilustrasi, atau palet merek mereka.' },
96
+
97
+ { type: 'title', text: 'Kasus Penggunaan dalam Desain Digital', level: 3 },
98
+ { type: 'comparative', items: [
99
+ {
100
+ title: 'Desainer UX/UI',
101
+ description: 'Ekstrak palet dari gambar utama untuk membuat antarmuka yang kohesif',
102
+ icon: 'mdi:palette',
103
+ points: [
104
+ 'Warna latar belakang yang harmonis',
105
+ 'Tombol dan elemen sekunder',
106
+ 'Kontras yang dihitung secara otomatis'
107
+ ]
108
+ },
109
+ {
110
+ title: 'Pengembang Web',
111
+ description: 'Buat lembar gaya CSS langsung dari referensi visual',
112
+ icon: 'mdi:code-braces',
113
+ points: [
114
+ 'Salin HEX langsung ke CSS',
115
+ 'Variabel warna dalam SCSS/CSS',
116
+ 'Tema yang kohesif tanpa desain sebelumnya'
117
+ ],
118
+ highlight: true
119
+ },
120
+ {
121
+ title: 'Seniman Digital dan Ilustrator',
122
+ description: 'Tangkap referensi kromatik dari film, alam, atau seni',
123
+ icon: 'mdi:brush',
124
+ points: [
125
+ 'Palet referensi dari mahakarya',
126
+ 'Studi warna sinematik',
127
+ 'Inspirasi visual instan'
128
+ ]
129
+ },
130
+ {
131
+ title: 'Spesialis Branding',
132
+ description: 'Kembangkan identitas visual berdasarkan foto panduan',
133
+ icon: 'mdi:tag-multiple',
134
+ points: [
135
+ 'Ekstrak warna merek dari gambar',
136
+ 'Buat panduan kromatik profesional',
137
+ 'Pastikan konsistensi visual'
138
+ ]
139
+ }
140
+ ], columns: 2 },
141
+
142
+ { type: 'title', text: 'Teori Warna Terapan', level: 3 },
143
+ { type: 'table', headers: ['Konsep Warna', 'Definisi', 'Aplikasi Praktis'], rows: [
144
+ ['Harmoni Kromatik', 'Kombinasi warna yang seimbang secara visual', 'Identitas visual yang kohesif dalam UI'],
145
+ ['Kontras', 'Perbedaan kecerahan antar warna', 'Keterbacaan dan hierarki visual'],
146
+ ['Saturasi', 'Intensitas warna dari sebuah nada', 'Profesionalisme (rendah) vs Energi (tinggi)'],
147
+ ['Temperatur Warna', 'Warna hangat (merah) vs warna dingin (biru)', 'Psikologi emosional desain'],
148
+ ['Palet Monokromatik', 'Variasi dari satu nada warna', 'Elegan dan minimalis']
149
+ ] },
150
+
151
+ { type: 'proscons', items: [
152
+ {
153
+ pro: 'Presisi matematis dalam ekstraksi - bukan pilihan visual perkiraan',
154
+ con: 'Warna yang nyaris tidak terlihat dapat disertakan jika memiliki banyak piksel'
155
+ },
156
+ {
157
+ pro: 'Salin instan ke papan klip - integrasi sempurna dengan alur kerja',
158
+ con: 'Memerlukan browser modern yang kompatibel dengan Canvas API'
159
+ },
160
+ {
161
+ pro: 'Privasi total - analisis lokal 100% tanpa pengiriman data',
162
+ con: 'Tidak ada riwayat analisis sebelumnya yang disimpan'
163
+ },
164
+ {
165
+ pro: 'Kompatibel dengan semua format gambar digital',
166
+ con: 'Warna akhir bergantung pada kompresi dan kualitas gambar'
167
+ }
168
+ ], proTitle: 'Keunggulan', conTitle: 'Batasan' },
169
+
170
+ { type: 'diagnostic', variant: 'success', title: 'Representasi Warna Realistis', icon: 'mdi:check-circle-outline', badge: 'Algoritma Canggih', html: 'Berbeda dengan alat yang hanya mengambil sampel piksel acak, sistem kami menggunakan algoritma Median Cut yang menimbang seluruh jumlah piksel dari setiap nada, memastikan palet yang dihasilkan secara setia mencerminkan suasana visual dan psikologi warna dari gambar aslinya.' },
171
+
172
+ { type: 'glossary', items: [
173
+ {
174
+ term: 'Median Cut',
175
+ definition: 'Algoritma kuantisasi warna yang membagi ruang RGB secara rekursif menjadi kotak-kotak, memastikan distribusi yang seragam. Secara historis digunakan dalam teknologi warna GIF dan terindeks.'
176
+ },
177
+ {
178
+ term: 'Ruang Warna RGB',
179
+ definition: 'Model warna berdasarkan merah, hijau, dan biru. Setiap warna direpresentasikan sebagai kombinasi dari ketiga nilai ini (0-255). Standar pada layar digital dan web.'
180
+ },
181
+ {
182
+ term: 'Kode HEX',
183
+ definition: 'Notasi heksadesimal 6 digit (#RRGGBB) yang mewakili warna di web: #FF0000 (merah), #00FF00 (hijau), #0000FF (biru). Universal di CSS, Figma, dan Adobe.'
184
+ },
185
+ {
186
+ term: 'Saturasi Warna',
187
+ definition: 'Intensitas atau kemurnian warna. Saturasi tinggi = warna cerah; saturasi rendah = warna keabu-abuan. Mempengaruhi persepsi emosional desain.'
188
+ },
189
+ {
190
+ term: 'Harmoni Kromatik',
191
+ definition: 'Pemilihan dan kombinasi warna yang menghasilkan hasil yang menyenangkan secara visual. Bisa berupa monokromatik, komplementer, analog, atau triadik.'
192
+ }
193
+ ] },
194
+
195
+ { type: 'message', title: 'Analisis Kromatik Profesional', ariaLabel: 'Informasi teknis tentang analisis warna', html: 'Chromatic Lens mengubah analisis visual manual menjadi presisi algoritmik. Alat ini tidak hanya mengekstrak warna: ia menangkap esensi emosional dan visual dari gambar apa pun, menempatkannya langsung di papan klip Anda sebagai kode HEX yang siap digunakan. Privasi total, tanpa batas volume analisis.' },
196
+
197
+ { type: 'title', text: 'Desain dari Inspirasi Visual', level: 3 },
198
+ { type: 'paragraph', html: 'Palet warna terbaik adalah yang menangkap maksud visual dari referensi Anda. Chromatic Lens mengotomatiskan apa yang dulunya merupakan proses manual: mengamati, menganalisis, mencatat. Sekarang, cukup seret gambar dan dapatkan kode HEX profesional dalam hitungan detik.' }
199
+ ];
200
+
201
+ const faqSchema: WithContext<FAQPage> = {
202
+ '@context': 'https://schema.org',
203
+ '@type': 'FAQPage',
204
+ mainEntity: faq.map((item) => ({
205
+ '@type': 'Question',
206
+ name: item.question,
207
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
208
+ })),
209
+ };
210
+
211
+ const howToSchema: WithContext<HowTo> = {
212
+ '@context': 'https://schema.org',
213
+ '@type': 'HowTo',
214
+ name: title,
215
+ description,
216
+ step: howTo.map((step) => ({
217
+ '@type': 'HowToStep',
218
+ name: step.name,
219
+ text: step.text,
220
+ })),
221
+ };
222
+
223
+ const appSchema: WithContext<SoftwareApplication> = {
224
+ '@context': 'https://schema.org',
225
+ '@type': 'SoftwareApplication',
226
+ name: title,
227
+ description,
228
+ applicationCategory: 'UtilitiesApplication',
229
+ operatingSystem: 'Web',
230
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
231
+ inLanguage: 'id',
232
+ };
233
+
234
+ export const content: ChromaticLensLocaleContent = {
235
+ slug,
236
+ title,
237
+ description,
238
+ ui,
239
+ seo,
240
+ faqTitle: "Pertanyaan yang Sering Diajukan",
241
+ faq,
242
+ bibliographyTitle: "Referensi",
243
+ bibliography,
244
+ howTo,
245
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
246
+ };