@jjlmoya/utils-developer 1.14.0 → 1.15.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/category/i18n/fr.ts +1 -1
- package/src/category/i18n/ru.ts +1 -1
- package/src/layouts/PreviewLayout.astro +1 -0
- package/src/pages/[locale]/[slug].astro +29 -12
- package/src/tests/diacritics_density.test.ts +118 -0
- package/src/tests/inverted_punctuation.test.ts +113 -0
- package/src/tests/no_en_dash.test.ts +73 -0
- package/src/tests/script_density.test.ts +94 -0
- package/src/tests/shared-test-helpers.ts +56 -0
- package/src/tests/tool_exports.test.ts +34 -0
- package/src/tool/aspectRatio/i18n/de.ts +1 -1
- package/src/tool/aspectRatio/i18n/fr.ts +1 -1
- package/src/tool/aspectRatio/i18n/pl.ts +2 -2
- package/src/tool/aspectRatio/i18n/ru.ts +4 -4
- package/src/tool/aspectRatio/i18n/zh.ts +1 -1
- package/src/tool/aspectRatio/seo.astro +2 -1
- package/src/tool/calculadoraTiempoDatos/i18n/de.ts +1 -1
- package/src/tool/calculadoraTiempoDatos/i18n/pl.ts +1 -1
- package/src/tool/calculadoraTiempoDatos/i18n/ru.ts +5 -5
- package/src/tool/calculadoraTiempoDatos/i18n/sv.ts +5 -5
- package/src/tool/calculadoraTiempoDatos/i18n/zh.ts +1 -1
- package/src/tool/calculadoraTiempoDatos/seo.astro +2 -1
- package/src/tool/colorConverter/i18n/de.ts +1 -1
- package/src/tool/colorConverter/i18n/ru.ts +2 -2
- package/src/tool/colorConverter/seo.astro +2 -1
- package/src/tool/conversorExcelCsvHtml/i18n/es.ts +1 -1
- package/src/tool/conversorExcelCsvHtml/i18n/pl.ts +1 -1
- package/src/tool/conversorExcelCsvHtml/i18n/ru.ts +2 -2
- package/src/tool/conversorExcelCsvHtml/i18n/zh.ts +2 -2
- package/src/tool/conversorExcelCsvHtml/seo.astro +2 -1
- package/src/tool/cronGenerator/i18n/de.ts +4 -4
- package/src/tool/cronGenerator/i18n/en.ts +1 -1
- package/src/tool/cronGenerator/i18n/es.ts +2 -2
- package/src/tool/cronGenerator/i18n/fr.ts +5 -5
- package/src/tool/cronGenerator/i18n/id.ts +1 -1
- package/src/tool/cronGenerator/i18n/nl.ts +1 -1
- package/src/tool/cronGenerator/i18n/pl.ts +8 -8
- package/src/tool/cronGenerator/i18n/pt.ts +1 -1
- package/src/tool/cronGenerator/i18n/ru.ts +9 -9
- package/src/tool/cronGenerator/i18n/sv.ts +1 -1
- package/src/tool/cronGenerator/i18n/zh.ts +3 -3
- package/src/tool/cronGenerator/seo.astro +2 -1
- package/src/tool/cssSpecificityCalculator/i18n/de.ts +1 -1
- package/src/tool/cssSpecificityCalculator/i18n/fr.ts +3 -3
- package/src/tool/cssSpecificityCalculator/i18n/pl.ts +2 -2
- package/src/tool/cssSpecificityCalculator/i18n/ru.ts +2 -2
- package/src/tool/cssSpecificityCalculator/seo.astro +2 -1
- package/src/tool/cssToInlineConverter/i18n/de.ts +6 -6
- package/src/tool/cssToInlineConverter/i18n/es.ts +1 -1
- package/src/tool/cssToInlineConverter/i18n/fr.ts +3 -3
- package/src/tool/cssToInlineConverter/seo.astro +2 -1
- package/src/tool/duplicateCssRemover/i18n/de.ts +7 -7
- package/src/tool/duplicateCssRemover/i18n/fr.ts +1 -1
- package/src/tool/duplicateCssRemover/i18n/id.ts +1 -1
- package/src/tool/duplicateCssRemover/i18n/nl.ts +1 -1
- package/src/tool/duplicateCssRemover/i18n/pl.ts +1 -1
- package/src/tool/duplicateCssRemover/i18n/pt.ts +1 -1
- package/src/tool/duplicateCssRemover/i18n/ru.ts +3 -3
- package/src/tool/duplicateCssRemover/i18n/sv.ts +1 -1
- package/src/tool/duplicateCssRemover/seo.astro +2 -1
- package/src/tool/generadorSecurityTxt/i18n/de.ts +5 -5
- package/src/tool/generadorSecurityTxt/i18n/ru.ts +2 -2
- package/src/tool/generadorSecurityTxt/seo.astro +2 -1
- package/src/tool/hashGenerator/i18n/ru.ts +5 -5
- package/src/tool/hashGenerator/i18n/zh.ts +2 -2
- package/src/tool/hashGenerator/seo.astro +2 -1
- package/src/tool/inspectorCertificadosSsl/i18n/de.ts +6 -6
- package/src/tool/inspectorCertificadosSsl/i18n/ru.ts +5 -5
- package/src/tool/inspectorCertificadosSsl/seo.astro +2 -1
- package/src/tool/jsonFormatter/i18n/de.ts +4 -4
- package/src/tool/jsonFormatter/i18n/en.ts +4 -4
- package/src/tool/jsonFormatter/i18n/es.ts +4 -4
- package/src/tool/jsonFormatter/i18n/fr.ts +4 -4
- package/src/tool/jsonFormatter/i18n/id.ts +4 -4
- package/src/tool/jsonFormatter/i18n/it.ts +4 -4
- package/src/tool/jsonFormatter/i18n/ja.ts +4 -4
- package/src/tool/jsonFormatter/i18n/ko.ts +4 -4
- package/src/tool/jsonFormatter/i18n/nl.ts +4 -4
- package/src/tool/jsonFormatter/i18n/pl.ts +4 -4
- package/src/tool/jsonFormatter/i18n/pt.ts +4 -4
- package/src/tool/jsonFormatter/i18n/ru.ts +5 -5
- package/src/tool/jsonFormatter/i18n/sv.ts +4 -4
- package/src/tool/jsonFormatter/i18n/tr.ts +4 -4
- package/src/tool/jsonFormatter/i18n/zh.ts +5 -5
- package/src/tool/jsonFormatter/seo.astro +2 -1
- package/src/tool/keycode/i18n/de.ts +7 -7
- package/src/tool/keycode/i18n/en.ts +5 -5
- package/src/tool/keycode/i18n/es.ts +5 -5
- package/src/tool/keycode/i18n/fr.ts +7 -7
- package/src/tool/keycode/i18n/id.ts +5 -5
- package/src/tool/keycode/i18n/it.ts +5 -5
- package/src/tool/keycode/i18n/ja.ts +5 -5
- package/src/tool/keycode/i18n/ko.ts +5 -5
- package/src/tool/keycode/i18n/nl.ts +5 -5
- package/src/tool/keycode/i18n/pl.ts +7 -7
- package/src/tool/keycode/i18n/pt.ts +5 -5
- package/src/tool/keycode/i18n/ru.ts +6 -6
- package/src/tool/keycode/i18n/sv.ts +5 -5
- package/src/tool/keycode/i18n/tr.ts +5 -5
- package/src/tool/keycode/i18n/zh.ts +5 -5
- package/src/tool/keycode/seo.astro +2 -1
- package/src/tool/llmCostCalculator/i18n/de.ts +4 -4
- package/src/tool/llmCostCalculator/i18n/en.ts +3 -3
- package/src/tool/llmCostCalculator/i18n/fr.ts +3 -3
- package/src/tool/llmCostCalculator/i18n/id.ts +3 -3
- package/src/tool/llmCostCalculator/i18n/pt.ts +3 -3
- package/src/tool/llmCostCalculator/i18n/ru.ts +3 -3
- package/src/tool/llmCostCalculator/i18n/sv.ts +3 -3
- package/src/tool/llmCostCalculator/i18n/tr.ts +3 -3
- package/src/tool/llmCostCalculator/i18n/zh.ts +3 -3
- package/src/tool/llmCostCalculator/seo.astro +2 -1
- package/src/tool/mobileMockupGenerator/i18n/es.ts +1 -1
- package/src/tool/mobileMockupGenerator/seo.astro +2 -1
- package/src/tool/musicalTypography/i18n/de.ts +1 -1
- package/src/tool/musicalTypography/i18n/fr.ts +1 -1
- package/src/tool/musicalTypography/i18n/id.ts +1 -1
- package/src/tool/musicalTypography/i18n/it.ts +1 -1
- package/src/tool/musicalTypography/i18n/ko.ts +1 -1
- package/src/tool/musicalTypography/i18n/ru.ts +3 -3
- package/src/tool/musicalTypography/seo.astro +2 -1
- package/src/tool/placeholderGenerator/i18n/de.ts +4 -4
- package/src/tool/placeholderGenerator/i18n/ru.ts +1 -1
- package/src/tool/placeholderGenerator/seo.astro +2 -1
- package/src/tool/promptLibrary/i18n/de.ts +1 -1
- package/src/tool/promptLibrary/seo.astro +2 -1
- package/src/tool/readabilityCalculator/i18n/de.ts +2 -2
- package/src/tool/readabilityCalculator/seo.astro +2 -1
- package/src/tool/readabilityCalculator/visual-readability-calculator-wcag-apca.css +87 -3
- package/src/tool/svgSanitizer/i18n/de.ts +2 -2
- package/src/tool/svgSanitizer/i18n/id.ts +1 -1
- package/src/tool/svgSanitizer/i18n/pl.ts +1 -1
- package/src/tool/svgSanitizer/i18n/ru.ts +7 -7
- package/src/tool/svgSanitizer/i18n/sv.ts +3 -3
- package/src/tool/svgSanitizer/i18n/tr.ts +3 -3
- package/src/tool/svgSanitizer/i18n/zh.ts +3 -3
- package/src/tool/svgSanitizer/seo.astro +2 -1
- package/src/tool/svgToCss/i18n/de.ts +2 -2
- package/src/tool/svgToCss/i18n/es.ts +1 -1
- package/src/tool/svgToCss/i18n/fr.ts +1 -1
- package/src/tool/svgToCss/i18n/pl.ts +1 -1
- package/src/tool/svgToCss/i18n/ru.ts +2 -2
- package/src/tool/svgToCss/i18n/zh.ts +2 -2
- package/src/tool/svgToCss/seo.astro +2 -1
- package/src/tool/urlCleaner/component.astro +23 -5
- package/src/tool/urlCleaner/i18n/de.ts +3 -3
- package/src/tool/urlCleaner/i18n/es.ts +1 -1
- package/src/tool/urlCleaner/i18n/id.ts +1 -1
- package/src/tool/urlCleaner/i18n/nl.ts +1 -1
- package/src/tool/urlCleaner/seo.astro +2 -1
- package/src/tool/urlCleaner/url-tracking-cleaner.css +92 -2
- package/src/tool/urlEncoderDecoder/i18n/de.ts +5 -5
- package/src/tool/urlEncoderDecoder/i18n/fr.ts +2 -2
- package/src/tool/urlEncoderDecoder/i18n/pl.ts +5 -5
- package/src/tool/urlEncoderDecoder/i18n/ru.ts +8 -8
- package/src/tool/urlEncoderDecoder/i18n/sv.ts +5 -5
- package/src/tool/urlEncoderDecoder/i18n/zh.ts +5 -5
- package/src/tool/urlEncoderDecoder/seo.astro +2 -1
- package/src/tool/utmGenerator/i18n/de.ts +2 -2
- package/src/tool/utmGenerator/i18n/pl.ts +5 -5
- package/src/tool/utmGenerator/i18n/ru.ts +6 -6
- package/src/tool/utmGenerator/seo.astro +2 -1
|
@@ -155,7 +155,7 @@ export const content: ToolLocaleContent<MusicalTypographyUI> = {
|
|
|
155
155
|
{
|
|
156
156
|
type: 'card',
|
|
157
157
|
title: 'La formule',
|
|
158
|
-
html: '<p>La progression est simple
|
|
158
|
+
html: '<p>La progression est simple: <code>Taille = Base × Ratio<sup>n</sup></code>. L\'étape 0 est votre texte de base. L\'étape 1 est un petit sous-titre. L\'étape 4 ou 5 pourrait être votre H1 principal. La même constante multiplicative garantit que toutes les relations sont cohérentes.</p>',
|
|
159
159
|
},
|
|
160
160
|
{
|
|
161
161
|
type: 'card',
|
|
@@ -160,7 +160,7 @@ export const content: ToolLocaleContent<MusicalTypographyUI> = {
|
|
|
160
160
|
{
|
|
161
161
|
type: 'card',
|
|
162
162
|
title: 'Mengapa "Musikal"',
|
|
163
|
-
html: '<p>Kaum Pythagoras menemukan bahwa membagi senar dalam proporsi sederhana (1:2, 2:3, 3:4) menghasilkan bunyi yang konsonan. Interval-interval ini
|
|
163
|
+
html: '<p>Kaum Pythagoras menemukan bahwa membagi senar dalam proporsi sederhana (1:2, 2:3, 3:4) menghasilkan bunyi yang konsonan. Interval-interval ini - oktaf, kuint sempurna, dan kuart sempurna - adalah persis rasio tipografi yang digunakan. Anda sedang menggubah musik visual.</p>',
|
|
164
164
|
},
|
|
165
165
|
{
|
|
166
166
|
type: 'title',
|
|
@@ -160,7 +160,7 @@ export const content: ToolLocaleContent<MusicalTypographyUI> = {
|
|
|
160
160
|
{
|
|
161
161
|
type: 'card',
|
|
162
162
|
title: 'Perché "Musicale"',
|
|
163
|
-
html: "<p>I pitagorici scoprirono che dividere una corda in proporzioni semplici (1:2, 2:3, 3:4) produceva suoni consonanti. Questi intervalli
|
|
163
|
+
html: "<p>I pitagorici scoprirono che dividere una corda in proporzioni semplici (1:2, 2:3, 3:4) produceva suoni consonanti. Questi intervalli - ottava, quinta giusta e quarta giusta - sono esattamente i rapporti tipografici. Stai componendo musica visiva.</p>",
|
|
164
164
|
},
|
|
165
165
|
{
|
|
166
166
|
type: 'title',
|
|
@@ -160,7 +160,7 @@ export const content: ToolLocaleContent<MusicalTypographyUI> = {
|
|
|
160
160
|
{
|
|
161
161
|
type: 'card',
|
|
162
162
|
title: '왜 "음악적"인가',
|
|
163
|
-
html: '<p>피타고라스학파는 현을 단순한 비율(1:2, 2:3, 3:4)로 나누면 협화음이 생긴다는 것을 발견했습니다. 옥타브, 완전5도, 완전4도
|
|
163
|
+
html: '<p>피타고라스학파는 현을 단순한 비율(1:2, 2:3, 3:4)로 나누면 협화음이 생긴다는 것을 발견했습니다. 옥타브, 완전5도, 완전4도 - 이 음정들이 바로 타이포그래피 비율과 정확히 일치합니다. 당신은 시각적 음악을 작곡하고 있는 것입니다.</p>',
|
|
164
164
|
},
|
|
165
165
|
{
|
|
166
166
|
type: 'title',
|
|
@@ -8,7 +8,7 @@ const description = 'Бесплатный онлайн-инструмент дл
|
|
|
8
8
|
|
|
9
9
|
const faqData = [
|
|
10
10
|
{ question: 'Что такое типографическая модульная шкала?', answer: 'Это метод определения размеров шрифтов на основе постоянного математического соотношения. Подобно музыке, где ноты имеют гармонические отношения, модульная шкала создаёт сбалансированную и предсказуемую визуальную иерархию.' },
|
|
11
|
-
{ question: 'Почему использовать музыкальные интервалы для дизайна?', answer: 'Музыкальные интервалы
|
|
11
|
+
{ question: 'Почему использовать музыкальные интервалы для дизайна?', answer: 'Музыкальные интервалы - это пропорции, которые человеческий мозг воспринимает как гармоничные. Применение их к размерам текста создаёт визуальную структуру, которая ощущается правильной и профессиональной, а не случайно выбранной.' },
|
|
12
12
|
{ question: 'Что такое Золотое Сечение в типографии?', answer: 'Это пропорция 1.618, известная как Золотое Сечение. Она создаёт очень драматичные и элегантные шкалы, где каждый шаг иерархии растёт экспоненциально. Идеально для портфолио или сайтов, ориентированных на искусство.' },
|
|
13
13
|
{ question: 'Как я могу применить шкалу в своём файле CSS?', answer: 'Инструмент генерирует CSS-переменные (токены) в формате :root { --step-N: Xrem; }. Скопируйте их в свой основной CSS-файл и используйте с var(--step-N), чтобы сохранить типографическую согласованность на всём сайте.' },
|
|
14
14
|
];
|
|
@@ -38,8 +38,8 @@ export const content: ToolLocaleContent<MusicalTypographyUI> = {
|
|
|
38
38
|
{ type: 'paragraph', html: '<strong>Музыкальная Типографическая Шкала</strong> применяет математику музыкальных интервалов к типографическому дизайну. Подобно тому, как музыкальная композиция управляется точными пропорциями, хороший дизайн выигрывает от математической структуры, которая связывает все размеры вместе.' },
|
|
39
39
|
{ type: 'title', text: 'Как работает модульная шкала', level: 3 },
|
|
40
40
|
{ type: 'grid', columns: 2 },
|
|
41
|
-
{ type: 'card', title: 'Формула', html: '<p>Прогрессия простая: <code>Size = Base × Ratio<sup>n</sup></code>. Шаг 0
|
|
42
|
-
{ type: 'card', title: 'Почему "Музыкальная"', html: '<p>Пифагорейцы открыли, что деление струны на простые пропорции (1:2, 2:3, 3:4) производит созвучные звуки. Эти интервалы, октава, чистая квинта и чистая кварта,
|
|
41
|
+
{ type: 'card', title: 'Формула', html: '<p>Прогрессия простая: <code>Size = Base × Ratio<sup>n</sup></code>. Шаг 0 - это ваш базовый текст. Шаг 1 - маленький подзаголовок. Шаг 4 или 5 может быть вашим главным H1. Одна и та же постоянная умножения (соотношение) гарантирует, что все отношения согласованы.</p>' },
|
|
42
|
+
{ type: 'card', title: 'Почему "Музыкальная"', html: '<p>Пифагорейцы открыли, что деление струны на простые пропорции (1:2, 2:3, 3:4) производит созвучные звуки. Эти интервалы, октава, чистая квинта и чистая кварта, - это ровно типографические соотношения. Вы сочиняете визуальную музыку.</p>' },
|
|
43
43
|
{ type: 'title', text: 'Выбор правильного соотношения', level: 3 },
|
|
44
44
|
{ type: 'tip', html: 'Для плотных интерфейсов (приборные панели, таблицы) используйте малые соотношения, такие как <code>1.125</code> или <code>1.2</code>. Для редакционных или портфельных сайтов используйте более выразительные соотношения, такие как <code>1.5</code> или <code>1.618</code>.' },
|
|
45
45
|
{ type: 'paragraph', html: 'Не ограничивайте шкалу только <code>font-size</code>. Те же CSS-переменные работают для <code>margin</code>, <code>padding</code> и <code>gap</code>. Когда белое пространство следует той же математической прогрессии, что и текст, дизайн достигает уровня связности, который все ощущают, но мало кто может объяснить.' },
|
|
@@ -9,6 +9,7 @@ interface Props {
|
|
|
9
9
|
|
|
10
10
|
const { locale = 'es' } = Astro.props;
|
|
11
11
|
const content = await musicalTypography.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
12
13
|
---
|
|
13
14
|
|
|
14
|
-
{content && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -16,7 +16,7 @@ const faqData = [
|
|
|
16
16
|
{
|
|
17
17
|
question: 'Kann ich im Generator jede beliebige Auflösung verwenden?',
|
|
18
18
|
answer:
|
|
19
|
-
'Ja, Sie können beliebige numerische Werte für Breite und Höhe eingeben. Der Generator erstellt eine Arbeitsfläche mit exakt den angeforderten Abmessungen
|
|
19
|
+
'Ja, Sie können beliebige numerische Werte für Breite und Höhe eingeben. Der Generator erstellt eine Arbeitsfläche mit exakt den angeforderten Abmessungen - ideal für präzise Raster oder spezifische Werbeformate.',
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
question: 'In welchem Format werden die Bilder heruntergeladen?',
|
|
@@ -45,7 +45,7 @@ const howToData = [
|
|
|
45
45
|
},
|
|
46
46
|
{
|
|
47
47
|
name: 'Bild herunterladen',
|
|
48
|
-
text: 'Klicken Sie auf die Schaltfläche
|
|
48
|
+
text: 'Klicken Sie auf die Schaltfläche "Herunterladen", um das erstellte Platzhalterbild direkt auf Ihrem Gerät zu speichern.',
|
|
49
49
|
},
|
|
50
50
|
];
|
|
51
51
|
|
|
@@ -159,7 +159,7 @@ export const content: ToolLocaleContent<PlaceholderGeneratorUI> = {
|
|
|
159
159
|
type: 'list',
|
|
160
160
|
items: [
|
|
161
161
|
'<strong>Pixel-genaue Auflösung:</strong> Der native HTML5 Canvas stellt sicher, dass die exportierte Arbeitsfläche arithmetisch exakt den vom Nutzer angegebenen Koordinaten entspricht.',
|
|
162
|
-
'<strong>Typografisches Autoscaling:</strong> Im automatischen Modus berechnet die Schriftgröße die Umfangsfläche und Zeichenanzahl, um den Text elegant einzupassen
|
|
162
|
+
'<strong>Typografisches Autoscaling:</strong> Im automatischen Modus berechnet die Schriftgröße die Umfangsfläche und Zeichenanzahl, um den Text elegant einzupassen - ohne unerwünschte <em>Overflows</em>.',
|
|
163
163
|
'<strong>Hexadezimale Synchronisation:</strong> Bidirektionale Zustandskontrolle zwischen nativen HTML-Farbwählern und Texteingaben sorgt für präzise Kontraste, die Ihrer Figma- oder Penpot-Palette entsprechen.',
|
|
164
164
|
],
|
|
165
165
|
},
|
|
@@ -170,7 +170,7 @@ export const content: ToolLocaleContent<PlaceholderGeneratorUI> = {
|
|
|
170
170
|
},
|
|
171
171
|
{
|
|
172
172
|
type: 'paragraph',
|
|
173
|
-
html: 'Kein monolithisches Projekt und kein Micro-Frontend kommt ohne Grundlagenarbeit aus
|
|
173
|
+
html: 'Kein monolithisches Projekt und kein Micro-Frontend kommt ohne Grundlagenarbeit aus - erst recht nicht bei anspruchsvollen Kunden oder Product Managern mit klarer Vision. Wer grafische Iterationen zügig durchführen kann, ohne fertige <em>Assets</em> mitschleppen zu müssen, hat einen klaren Vorteil. Dieser Generator greift direkt auf die moderne JS-API <code>toDataURL()</code> auf Ihrer lokalen Maschine zurück und liefert ein professionelles Ergebnis ohne fragwürdige Zwischenverarbeitung.',
|
|
174
174
|
},
|
|
175
175
|
],
|
|
176
176
|
};
|
|
@@ -11,7 +11,7 @@ const faqData = [
|
|
|
11
11
|
{
|
|
12
12
|
question: 'Что такое плейсхолдер-изображение?',
|
|
13
13
|
answer:
|
|
14
|
-
'Плейсхолдер или заполняющее изображение
|
|
14
|
+
'Плейсхолдер или заполняющее изображение - это временный графический элемент, используемый в веб-дизайне и макете для зарезервирования пространства, где будет размещено окончательное изображение. Они помогают визуализировать структуру страницы до появления финального контента.',
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
17
|
question: 'Могу ли я использовать любое разрешение в генераторе?',
|
|
@@ -9,6 +9,7 @@ interface Props {
|
|
|
9
9
|
|
|
10
10
|
const { locale = 'es' } = Astro.props;
|
|
11
11
|
const content = await placeholderGenerator.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
12
13
|
---
|
|
13
14
|
|
|
14
|
-
{content && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -112,7 +112,7 @@ export const content: ToolLocaleContent<PromptLibraryUI> = {
|
|
|
112
112
|
type: 'list',
|
|
113
113
|
items: [
|
|
114
114
|
'<strong>Sofortsuche:</strong> Finde jene spezifische Anweisung, die du vor Monaten verwendet hast, mit einer einfachen Textsuche.',
|
|
115
|
-
'<strong>Tag-Klassifizierung:</strong> Verschlagworte deine Prompts mit
|
|
115
|
+
'<strong>Tag-Klassifizierung:</strong> Verschlagworte deine Prompts mit "Marketing", "Programmierung" oder "Copywriting", um schnell zu filtern.',
|
|
116
116
|
'<strong>Ein-Klick-Kopieren:</strong> Den vollständigen Text mit einem einzigen Klick in die Zwischenablage kopieren.',
|
|
117
117
|
'<strong>Vollständige Privatsphäre:</strong> Alle deine Daten werden lokal im Browser über localStorage gespeichert.',
|
|
118
118
|
],
|
|
@@ -9,6 +9,7 @@ interface Props {
|
|
|
9
9
|
|
|
10
10
|
const { locale = 'es' } = Astro.props;
|
|
11
11
|
const content = await promptLibrary.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
12
13
|
---
|
|
13
14
|
|
|
14
|
-
{content && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -9,7 +9,7 @@ const description = 'Prüfen Sie den echten Kontrast Ihrer Designs mit APCA (WCA
|
|
|
9
9
|
const faqData = [
|
|
10
10
|
{
|
|
11
11
|
question: 'Was ist APCA und warum unterscheidet es sich von WCAG 2.1?',
|
|
12
|
-
answer: 'APCA ist der Advanced Perceptual Contrast Algorithm, der für WCAG 3.0 entwickelt wurde. Anders als das alte einfache Verhältnis verwendet APCA mathematische Modelle, die nachbilden, wie das menschliche Gehirn Kontrast wahrnimmt
|
|
12
|
+
answer: 'APCA ist der Advanced Perceptual Contrast Algorithm, der für WCAG 3.0 entwickelt wurde. Anders als das alte einfache Verhältnis verwendet APCA mathematische Modelle, die nachbilden, wie das menschliche Gehirn Kontrast wahrnimmt - unter Berücksichtigung der Polarität (heller vs. dunkler Hintergrund) und der Schriftgröße bzw. des Schriftgewichts.',
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
15
|
question: 'Was bedeutet der Lc-Wert?',
|
|
@@ -108,7 +108,7 @@ export const content: ToolLocaleContent<ReadabilityCalculatorUI> = {
|
|
|
108
108
|
{ type: 'title', text: 'Visueller Lesbarkeitsrechner (WCAG vs APCA)', level: 2 },
|
|
109
109
|
{
|
|
110
110
|
type: 'paragraph',
|
|
111
|
-
html: 'Verstehen Sie, wie Farben und Typografie die tatsächliche Lesbarkeit beeinflussen
|
|
111
|
+
html: 'Verstehen Sie, wie Farben und Typografie die tatsächliche Lesbarkeit beeinflussen - mit dem neuen wahrnehmungsbasierten Barrierefreiheitsstandard. WCAG 2.1 nutzt eine einfache Formel aus dem Jahr 2008. <strong>APCA</strong> ist das neue Modell für <strong>WCAG 3.0</strong>, das menschliche Wahrnehmung nachbildet.',
|
|
112
112
|
},
|
|
113
113
|
{ type: 'title', text: 'Kernpunkte von APCA', level: 3 },
|
|
114
114
|
{
|
|
@@ -9,6 +9,7 @@ interface Props {
|
|
|
9
9
|
|
|
10
10
|
const { locale = 'es' } = Astro.props;
|
|
11
11
|
const content = await readabilityCalculator.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
12
13
|
---
|
|
13
14
|
|
|
14
|
-
{content && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
.rc-root {
|
|
2
2
|
width: 100%;
|
|
3
|
+
min-width: 0;
|
|
3
4
|
}
|
|
4
5
|
|
|
5
6
|
.rc-container {
|
|
7
|
+
container-type: inline-size;
|
|
6
8
|
display: grid;
|
|
7
9
|
grid-template-columns: 1fr;
|
|
8
10
|
gap: 2rem;
|
|
9
11
|
max-width: 1200px;
|
|
10
12
|
margin: 0 auto;
|
|
11
13
|
padding: 1.5rem;
|
|
14
|
+
min-width: 0;
|
|
12
15
|
}
|
|
13
16
|
|
|
14
17
|
@media (min-width: 1024px) {
|
|
@@ -28,6 +31,7 @@
|
|
|
28
31
|
flex-direction: column;
|
|
29
32
|
gap: 2rem;
|
|
30
33
|
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 10px 15px -3px rgba(0, 0, 0, 0.05), inset 0 0 0 1px rgba(255, 255, 255, 0.5);
|
|
34
|
+
min-width: 0;
|
|
31
35
|
}
|
|
32
36
|
|
|
33
37
|
.theme-dark .rc-card {
|
|
@@ -61,7 +65,7 @@
|
|
|
61
65
|
|
|
62
66
|
.rc-inputs-grid {
|
|
63
67
|
display: grid;
|
|
64
|
-
grid-template-columns: repeat(
|
|
68
|
+
grid-template-columns: repeat(auto-fit, minmax(min(100%, 13rem), 1fr));
|
|
65
69
|
gap: 1.5rem;
|
|
66
70
|
}
|
|
67
71
|
|
|
@@ -90,6 +94,7 @@
|
|
|
90
94
|
padding: 0.5rem;
|
|
91
95
|
border-radius: 0.75rem;
|
|
92
96
|
transition: all 0.2s ease;
|
|
97
|
+
min-width: 0;
|
|
93
98
|
}
|
|
94
99
|
|
|
95
100
|
.theme-dark .rc-color-input-container {
|
|
@@ -127,6 +132,8 @@
|
|
|
127
132
|
font-weight: 600;
|
|
128
133
|
color: rgb(71, 85, 105);
|
|
129
134
|
flex: 1;
|
|
135
|
+
min-width: 0;
|
|
136
|
+
overflow-wrap: anywhere;
|
|
130
137
|
}
|
|
131
138
|
|
|
132
139
|
.theme-dark .rc-hex-text {
|
|
@@ -193,7 +200,7 @@
|
|
|
193
200
|
|
|
194
201
|
.rc-comparison-grid {
|
|
195
202
|
display: grid;
|
|
196
|
-
grid-template-columns: repeat(
|
|
203
|
+
grid-template-columns: repeat(auto-fit, minmax(min(100%, 10rem), 1fr));
|
|
197
204
|
gap: 1rem;
|
|
198
205
|
}
|
|
199
206
|
|
|
@@ -206,6 +213,7 @@
|
|
|
206
213
|
gap: 0.5rem;
|
|
207
214
|
background: rgba(255, 255, 255, 0.4);
|
|
208
215
|
border: 1px solid rgba(0, 0, 0, 0.05);
|
|
216
|
+
min-width: 0;
|
|
209
217
|
}
|
|
210
218
|
|
|
211
219
|
.theme-dark .rc-score-card {
|
|
@@ -232,6 +240,8 @@
|
|
|
232
240
|
padding: 0.2rem 0.6rem;
|
|
233
241
|
border-radius: 0.5rem;
|
|
234
242
|
text-transform: uppercase;
|
|
243
|
+
text-align: center;
|
|
244
|
+
overflow-wrap: anywhere;
|
|
235
245
|
}
|
|
236
246
|
|
|
237
247
|
.rc-status-pass {
|
|
@@ -274,6 +284,7 @@
|
|
|
274
284
|
.rc-preview-text {
|
|
275
285
|
line-height: 1.5;
|
|
276
286
|
margin: 0;
|
|
287
|
+
overflow-wrap: anywhere;
|
|
277
288
|
}
|
|
278
289
|
|
|
279
290
|
.rc-apca-breakdown {
|
|
@@ -292,6 +303,7 @@
|
|
|
292
303
|
.rc-breakdown-item {
|
|
293
304
|
display: flex;
|
|
294
305
|
justify-content: space-between;
|
|
306
|
+
gap: 1rem;
|
|
295
307
|
font-size: 0.875rem;
|
|
296
308
|
}
|
|
297
309
|
|
|
@@ -309,6 +321,8 @@
|
|
|
309
321
|
display: flex;
|
|
310
322
|
align-items: center;
|
|
311
323
|
gap: 0.4rem;
|
|
324
|
+
text-align: right;
|
|
325
|
+
white-space: nowrap;
|
|
312
326
|
}
|
|
313
327
|
|
|
314
328
|
.rc-check-yes {
|
|
@@ -317,4 +331,74 @@
|
|
|
317
331
|
|
|
318
332
|
.rc-check-no {
|
|
319
333
|
color: rgb(239, 68, 68);
|
|
320
|
-
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
@container (max-width: 520px) {
|
|
337
|
+
.rc-container {
|
|
338
|
+
gap: 1rem;
|
|
339
|
+
padding: 0;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
.rc-card {
|
|
343
|
+
border-radius: 1rem;
|
|
344
|
+
gap: 1.25rem;
|
|
345
|
+
padding: 1rem;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
.rc-control-section {
|
|
349
|
+
gap: 1.25rem;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
.rc-group-title {
|
|
353
|
+
margin-bottom: 0.75rem;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
.rc-inputs-grid,
|
|
357
|
+
.rc-comparison-grid {
|
|
358
|
+
grid-template-columns: 1fr;
|
|
359
|
+
gap: 1rem;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
.rc-color-input-container {
|
|
363
|
+
align-items: stretch;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
.rc-color-picker {
|
|
367
|
+
flex: 0 0 2.5rem;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
.rc-score-card,
|
|
371
|
+
.rc-apca-breakdown {
|
|
372
|
+
padding: 1rem;
|
|
373
|
+
border-radius: 0.75rem;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
.rc-main-preview-box {
|
|
377
|
+
min-height: 120px;
|
|
378
|
+
padding: 1.25rem;
|
|
379
|
+
border-radius: 0.875rem;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
.rc-breakdown-item {
|
|
383
|
+
align-items: flex-start;
|
|
384
|
+
flex-direction: column;
|
|
385
|
+
gap: 0.35rem;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
.rc-item-check {
|
|
389
|
+
text-align: left;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
@media (max-width: 640px) {
|
|
394
|
+
.rc-container {
|
|
395
|
+
gap: 1rem;
|
|
396
|
+
padding: 0;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
.rc-card {
|
|
400
|
+
border-radius: 1rem;
|
|
401
|
+
gap: 1.25rem;
|
|
402
|
+
padding: 1rem;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
@@ -31,7 +31,7 @@ const faqData = [
|
|
|
31
31
|
|
|
32
32
|
const howToData = [
|
|
33
33
|
{ name: 'SVG einfügen', text: 'Füge den SVG-Code aus Figma, Illustrator oder Inkscape in das Textfeld ein.' },
|
|
34
|
-
{ name: 'Optionen konfigurieren', text: 'Aktiviere oder deaktiviere die Optionen: IDs entfernen, width/height entfernen und minifizieren
|
|
34
|
+
{ name: 'Optionen konfigurieren', text: 'Aktiviere oder deaktiviere die Optionen: IDs entfernen, width/height entfernen und minifizieren - je nach Bedarf.' },
|
|
35
35
|
{ name: 'Bereinigen', text: 'Klicke auf SVG bereinigen, um den Code zu verarbeiten und das optimierte Ergebnis zu erhalten.' },
|
|
36
36
|
{ name: 'Kopieren oder herunterladen', text: 'Nutze die Schaltflächen Kopieren oder Herunterladen, um das bereinigte SVG für die Produktion zu sichern.' },
|
|
37
37
|
];
|
|
@@ -108,7 +108,7 @@ export const content: ToolLocaleContent<SvgSanitizerUI> = {
|
|
|
108
108
|
{ type: 'title', text: 'Warum sind exportierte SVGs so unordentlich?', level: 3 },
|
|
109
109
|
{
|
|
110
110
|
type: 'paragraph',
|
|
111
|
-
html: 'Wenn du ein SVG aus Figma exportierst, erhältst du eine Datei voller Attribute, die nur innerhalb der App einen Sinn ergeben: <code>data-name</code>, <code>xml:space</code>, Verweise auf interne Ebenen und Design-Metadaten. Das Ergebnis ist ein SVG, das 40
|
|
111
|
+
html: 'Wenn du ein SVG aus Figma exportierst, erhältst du eine Datei voller Attribute, die nur innerhalb der App einen Sinn ergeben: <code>data-name</code>, <code>xml:space</code>, Verweise auf interne Ebenen und Design-Metadaten. Das Ergebnis ist ein SVG, das 40-70 % größer als nötig sein kann.',
|
|
112
112
|
},
|
|
113
113
|
{ type: 'title', text: 'Was der Bereiniger entfernt', level: 3 },
|
|
114
114
|
{
|
|
@@ -108,7 +108,7 @@ export const content: ToolLocaleContent<SvgSanitizerUI> = {
|
|
|
108
108
|
{ type: 'title', text: 'Mengapa SVG yang diekspor begitu berantakan?', level: 3 },
|
|
109
109
|
{
|
|
110
110
|
type: 'paragraph',
|
|
111
|
-
html: 'Saat kamu mengekspor SVG dari Figma, kamu mendapatkan file yang penuh dengan atribut yang hanya bermakna di dalam aplikasinya: <code>data-name</code>, <code>xml:space</code>, referensi ke layer internal, dan metadata desain. Hasilnya adalah SVG yang bisa 40
|
|
111
|
+
html: 'Saat kamu mengekspor SVG dari Figma, kamu mendapatkan file yang penuh dengan atribut yang hanya bermakna di dalam aplikasinya: <code>data-name</code>, <code>xml:space</code>, referensi ke layer internal, dan metadata desain. Hasilnya adalah SVG yang bisa 40-70% lebih besar dari yang seharusnya.',
|
|
112
112
|
},
|
|
113
113
|
{ type: 'title', text: 'Apa yang dihapus oleh Pembersih', level: 3 },
|
|
114
114
|
{
|
|
@@ -108,7 +108,7 @@ export const content: ToolLocaleContent<SvgSanitizerUI> = {
|
|
|
108
108
|
{ type: 'title', text: 'Dlaczego wyeksportowane pliki SVG są takie brudne?', level: 3 },
|
|
109
109
|
{
|
|
110
110
|
type: 'paragraph',
|
|
111
|
-
html: 'Gdy eksportujesz SVG z Figmy, otrzymujesz plik wypełniony atrybutami, które mają sens tylko wewnątrz aplikacji: <code>data-name</code>, <code>xml:space</code>, odwołania do wewnętrznych warstw i metadane projektu. Efektem jest SVG, który może ważyć o 40
|
|
111
|
+
html: 'Gdy eksportujesz SVG z Figmy, otrzymujesz plik wypełniony atrybutami, które mają sens tylko wewnątrz aplikacji: <code>data-name</code>, <code>xml:space</code>, odwołania do wewnętrznych warstw i metadane projektu. Efektem jest SVG, który może ważyć o 40-70% więcej niż powinien.',
|
|
112
112
|
},
|
|
113
113
|
{ type: 'title', text: 'Co usuwa oczyszczacz', level: 3 },
|
|
114
114
|
{
|
|
@@ -13,7 +13,7 @@ const faqData = [
|
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
15
|
question: 'Работает ли это с SVG из Illustrator?',
|
|
16
|
-
answer: 'Да. Illustrator экспортирует SVG с XML-объявлениями, метаданными и собственными пространствами имён, которые очиститель удаляет. Результат
|
|
16
|
+
answer: 'Да. Illustrator экспортирует SVG с XML-объявлениями, метаданными и собственными пространствами имён, которые очиститель удаляет. Результат - это SVG, совместимый со всеми современными браузерами.',
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
question: 'Какая разница между очисткой и минификацией?',
|
|
@@ -21,7 +21,7 @@ const faqData = [
|
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
question: 'Может ли удаление ID-элементов повредить SVG?',
|
|
24
|
-
answer: 'Только если элемент в SVG ссылается на другой по ID, например через fill="url(#gradient)". В этом случае отключите опцию
|
|
24
|
+
answer: 'Только если элемент в SVG ссылается на другой по ID, например через fill="url(#gradient)". В этом случае отключите опцию "Удалить ID". Она отключена по умолчанию именно чтобы избежать этой проблемы.',
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
27
|
question: 'Передаётся ли код SVG на какой-нибудь сервер?',
|
|
@@ -32,7 +32,7 @@ const faqData = [
|
|
|
32
32
|
const howToData = [
|
|
33
33
|
{ name: 'Вставьте SVG', text: 'Вставьте код SVG, экспортированный из Figma, Illustrator или Inkscape, в текстовое поле.' },
|
|
34
34
|
{ name: 'Настройте параметры', text: 'Включите или отключите опции: удалить ID, убрать ширину/высоту и минифицировать в зависимости от ваших нужд.' },
|
|
35
|
-
{ name: 'Очистите', text: 'Нажмите
|
|
35
|
+
{ name: 'Очистите', text: 'Нажмите "Очистить SVG", чтобы обработать код и получить оптимизированный результат.' },
|
|
36
36
|
{ name: 'Скопируйте или скачайте', text: 'Используйте кнопки копирования или загрузки, чтобы получить чистый SVG, готовый для продакшена.' },
|
|
37
37
|
];
|
|
38
38
|
|
|
@@ -93,9 +93,9 @@ export const content: ToolLocaleContent<SvgSanitizerUI> = {
|
|
|
93
93
|
faq: faqData,
|
|
94
94
|
bibliographyTitle: 'Ссылки',
|
|
95
95
|
bibliography: [
|
|
96
|
-
{ name: 'SVG Specification
|
|
97
|
-
{ name: 'Figma SVG Export
|
|
98
|
-
{ name: 'SVGO
|
|
96
|
+
{ name: 'SVG Specification - W3C', url: 'https://www.w3.org/TR/SVG2/' },
|
|
97
|
+
{ name: 'Figma SVG Export - Official Documentation', url: 'https://help.figma.com/hc/en-us/articles/360040028114-Export-from-Figma' },
|
|
98
|
+
{ name: 'SVGO - SVG Optimizer (open source reference)', url: 'https://github.com/svg/svgo' },
|
|
99
99
|
],
|
|
100
100
|
howTo: howToData,
|
|
101
101
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
@@ -108,7 +108,7 @@ export const content: ToolLocaleContent<SvgSanitizerUI> = {
|
|
|
108
108
|
{ type: 'title', text: 'Почему экспортированные SVG такие грязные?', level: 3 },
|
|
109
109
|
{
|
|
110
110
|
type: 'paragraph',
|
|
111
|
-
html: 'Когда вы экспортируете SVG из Figma, вы получаете файл, перегруженный атрибутами, которые имеют смысл только внутри приложения: <code>data-name</code>, <code>xml:space</code>, ссылки на внутренние слои и метаданные дизайна. Результат
|
|
111
|
+
html: 'Когда вы экспортируете SVG из Figma, вы получаете файл, перегруженный атрибутами, которые имеют смысл только внутри приложения: <code>data-name</code>, <code>xml:space</code>, ссылки на внутренние слои и метаданные дизайна. Результат - это SVG, весящий на 40-70% больше необходимого.',
|
|
112
112
|
},
|
|
113
113
|
{ type: 'title', text: 'Что удаляет очиститель', level: 3 },
|
|
114
114
|
{
|
|
@@ -93,9 +93,9 @@ export const content: ToolLocaleContent<SvgSanitizerUI> = {
|
|
|
93
93
|
faq: faqData,
|
|
94
94
|
bibliographyTitle: 'Referenser',
|
|
95
95
|
bibliography: [
|
|
96
|
-
{ name: 'SVG Specification
|
|
97
|
-
{ name: 'Figma SVG Export
|
|
98
|
-
{ name: 'SVGO
|
|
96
|
+
{ name: 'SVG Specification - W3C', url: 'https://www.w3.org/TR/SVG2/' },
|
|
97
|
+
{ name: 'Figma SVG Export - Official Documentation', url: 'https://help.figma.com/hc/en-us/articles/360040028114-Export-from-Figma' },
|
|
98
|
+
{ name: 'SVGO - SVG Optimizer (open source reference)', url: 'https://github.com/svg/svgo' },
|
|
99
99
|
],
|
|
100
100
|
howTo: howToData,
|
|
101
101
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
@@ -93,9 +93,9 @@ export const content: ToolLocaleContent<SvgSanitizerUI> = {
|
|
|
93
93
|
faq: faqData,
|
|
94
94
|
bibliographyTitle: 'Referanslar',
|
|
95
95
|
bibliography: [
|
|
96
|
-
{ name: 'SVG Specification
|
|
97
|
-
{ name: 'Figma SVG Export
|
|
98
|
-
{ name: 'SVGO
|
|
96
|
+
{ name: 'SVG Specification - W3C', url: 'https://www.w3.org/TR/SVG2/' },
|
|
97
|
+
{ name: 'Figma SVG Export - Official Documentation', url: 'https://help.figma.com/hc/en-us/articles/360040028114-Export-from-Figma' },
|
|
98
|
+
{ name: 'SVGO - SVG Optimizer (open source reference)', url: 'https://github.com/svg/svgo' },
|
|
99
99
|
],
|
|
100
100
|
howTo: howToData,
|
|
101
101
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
@@ -93,9 +93,9 @@ export const content: ToolLocaleContent<SvgSanitizerUI> = {
|
|
|
93
93
|
faq: faqData,
|
|
94
94
|
bibliographyTitle: '参考资料',
|
|
95
95
|
bibliography: [
|
|
96
|
-
{ name: 'SVG Specification
|
|
97
|
-
{ name: 'Figma SVG Export
|
|
98
|
-
{ name: 'SVGO
|
|
96
|
+
{ name: 'SVG Specification - W3C', url: 'https://www.w3.org/TR/SVG2/' },
|
|
97
|
+
{ name: 'Figma SVG Export - Official Documentation', url: 'https://help.figma.com/hc/en-us/articles/360040028114-Export-from-Figma' },
|
|
98
|
+
{ name: 'SVGO - SVG Optimizer (open source reference)', url: 'https://github.com/svg/svgo' },
|
|
99
99
|
],
|
|
100
100
|
howTo: howToData,
|
|
101
101
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
@@ -9,6 +9,7 @@ interface Props {
|
|
|
9
9
|
|
|
10
10
|
const { locale = 'es' } = Astro.props;
|
|
11
11
|
const content = await svgSanitizer.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
12
13
|
---
|
|
13
14
|
|
|
14
|
-
{content && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -16,7 +16,7 @@ const faqData = [
|
|
|
16
16
|
{
|
|
17
17
|
question: 'Wie ändere ich die Farbe eines in CSS eingebetteten SVGs?',
|
|
18
18
|
answer:
|
|
19
|
-
'Der beste Weg ist über
|
|
19
|
+
'Der beste Weg ist über "mask-image". Indem Sie das SVG als Maske definieren, können Sie die "background-color" verwenden, um die Farbe dynamisch zu ändern, sogar in :hover-Zuständen.',
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
question: 'Welche Browser unterstützen CSS-Masken?',
|
|
@@ -46,7 +46,7 @@ const howToData = [
|
|
|
46
46
|
},
|
|
47
47
|
{
|
|
48
48
|
name: 'Ergebnis kopieren',
|
|
49
|
-
text: 'Klicken Sie auf
|
|
49
|
+
text: 'Klicken Sie auf "Kopieren", um den generierten CSS-Code in Ihre Zwischenablage zu übernehmen.',
|
|
50
50
|
},
|
|
51
51
|
{
|
|
52
52
|
name: 'In Ihr Projekt übernehmen',
|
|
@@ -9,7 +9,7 @@ const description =
|
|
|
9
9
|
|
|
10
10
|
const faqData = [
|
|
11
11
|
{
|
|
12
|
-
question: '¿Es mejor usar Data URI o un archivo
|
|
12
|
+
question: '¿Es mejor usar Data URI o un archivo SVG externo?',
|
|
13
13
|
answer:
|
|
14
14
|
'Depende del uso. Los Data URIs eliminan peticiones HTTP (ideal para iconos pequeños), pero aumentan el tamaño del CSS. Para ilustraciones grandes o ricas en detalles, es preferible un archivo externo.',
|
|
15
15
|
},
|
|
@@ -164,7 +164,7 @@ export const content: ToolLocaleContent<SvgToCssUI> = {
|
|
|
164
164
|
},
|
|
165
165
|
{
|
|
166
166
|
type: 'paragraph',
|
|
167
|
-
html: "Beaucoup de développeurs utilisent simplement <code>background-image</code> pour intégrer des vecteurs, mais cela a une limitation
|
|
167
|
+
html: "Beaucoup de développeurs utilisent simplement <code>background-image</code> pour intégrer des vecteurs, mais cela a une limitation: vous ne pouvez pas changer la couleur du SVG dynamiquement depuis le CSS.",
|
|
168
168
|
},
|
|
169
169
|
{
|
|
170
170
|
type: 'paragraph',
|
|
@@ -16,7 +16,7 @@ const faqData = [
|
|
|
16
16
|
{
|
|
17
17
|
question: 'Как изменить цвет SVG, встроенного в CSS?',
|
|
18
18
|
answer:
|
|
19
|
-
"Лучший способ
|
|
19
|
+
"Лучший способ - через 'mask-image'. Определив SVG как маску, вы можете использовать 'background-color' для динамического изменения его цвета, даже в состояниях :hover.",
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
question: ' какие браузеры поддерживают CSS Masks?',
|
|
@@ -46,7 +46,7 @@ const howToData = [
|
|
|
46
46
|
},
|
|
47
47
|
{
|
|
48
48
|
name: 'Скопируйте результат',
|
|
49
|
-
text: 'Нажмите
|
|
49
|
+
text: 'Нажмите "Копировать", чтобы перенести сгенерированный CSS-код в буфер обмена.',
|
|
50
50
|
},
|
|
51
51
|
{
|
|
52
52
|
name: 'Примените в своем проекте',
|
|
@@ -16,7 +16,7 @@ const faqData = [
|
|
|
16
16
|
{
|
|
17
17
|
question: '如何更改嵌入 CSS 的 SVG 的颜色?',
|
|
18
18
|
answer:
|
|
19
|
-
'
|
|
19
|
+
'最好的方法是通过"mask-image"。通过将 SVG 定义为遮罩(mask),您可以使用"background-color"动态更改其颜色,甚至在 :hover 状态下也可以。',
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
question: '哪些浏览器支持 CSS 遮罩(Masks)?',
|
|
@@ -46,7 +46,7 @@ const howToData = [
|
|
|
46
46
|
},
|
|
47
47
|
{
|
|
48
48
|
name: '复制结果',
|
|
49
|
-
text: '
|
|
49
|
+
text: '点击"复制"将生成的 CSS 代码获取到剪贴板中。',
|
|
50
50
|
},
|
|
51
51
|
{
|
|
52
52
|
name: '在项目中使用',
|
|
@@ -9,6 +9,7 @@ interface Props {
|
|
|
9
9
|
|
|
10
10
|
const { locale = 'es' } = Astro.props;
|
|
11
11
|
const content = await svgToCss.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
12
13
|
---
|
|
13
14
|
|
|
14
|
-
{content && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
15
|
+
{content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
|