@jjlmoya/utils-developer 1.2.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 +64 -0
- package/src/category/i18n/en.ts +34 -0
- package/src/category/i18n/es.ts +34 -0
- package/src/category/i18n/fr.ts +34 -0
- package/src/category/index.ts +31 -0
- package/src/category/seo.astro +15 -0
- package/src/components/PreviewNavSidebar.astro +116 -0
- package/src/components/PreviewToolbar.astro +143 -0
- package/src/data.ts +11 -0
- package/src/env.d.ts +5 -0
- package/src/index.ts +78 -0
- package/src/layouts/PreviewLayout.astro +117 -0
- package/src/pages/[locale]/[slug].astro +146 -0
- package/src/pages/[locale].astro +251 -0
- package/src/pages/index.astro +4 -0
- package/src/tests/css_specificity_logic.test.ts +39 -0
- package/src/tests/faq_count.test.ts +19 -0
- package/src/tests/locale_completeness.test.ts +42 -0
- package/src/tests/mocks/astro_mock.js +2 -0
- package/src/tests/no_h1_in_components.test.ts +48 -0
- package/src/tests/schemas_fulfillment.test.ts +23 -0
- package/src/tests/seo_length.test.ts +22 -0
- package/src/tests/title_quality.test.ts +55 -0
- package/src/tests/tool_validation.test.ts +17 -0
- package/src/tool/aspectRatio/bibliography.astro +14 -0
- package/src/tool/aspectRatio/component.astro +468 -0
- package/src/tool/aspectRatio/i18n/en.ts +177 -0
- package/src/tool/aspectRatio/i18n/es.ts +177 -0
- package/src/tool/aspectRatio/i18n/fr.ts +177 -0
- package/src/tool/aspectRatio/index.ts +34 -0
- package/src/tool/aspectRatio/seo.astro +14 -0
- package/src/tool/aspectRatio/ui.ts +12 -0
- package/src/tool/calculadoraTiempoDatos/bibliography.astro +14 -0
- package/src/tool/calculadoraTiempoDatos/component.astro +829 -0
- package/src/tool/calculadoraTiempoDatos/i18n/en.ts +150 -0
- package/src/tool/calculadoraTiempoDatos/i18n/es.ts +163 -0
- package/src/tool/calculadoraTiempoDatos/i18n/fr.ts +150 -0
- package/src/tool/calculadoraTiempoDatos/index.ts +33 -0
- package/src/tool/calculadoraTiempoDatos/seo.astro +14 -0
- package/src/tool/calculadoraTiempoDatos/ui.ts +24 -0
- package/src/tool/colorConverter/bibliography.astro +14 -0
- package/src/tool/colorConverter/component.astro +504 -0
- package/src/tool/colorConverter/i18n/en.ts +126 -0
- package/src/tool/colorConverter/i18n/es.ts +126 -0
- package/src/tool/colorConverter/i18n/fr.ts +126 -0
- package/src/tool/colorConverter/index.ts +33 -0
- package/src/tool/colorConverter/seo.astro +14 -0
- package/src/tool/colorConverter/ui.ts +16 -0
- package/src/tool/conversorExcelCsvHtml/bibliography.astro +14 -0
- package/src/tool/conversorExcelCsvHtml/component.astro +595 -0
- package/src/tool/conversorExcelCsvHtml/i18n/en.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/i18n/es.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/i18n/fr.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/index.ts +33 -0
- package/src/tool/conversorExcelCsvHtml/seo.astro +14 -0
- package/src/tool/conversorExcelCsvHtml/ui.ts +14 -0
- package/src/tool/cronGenerator/bibliography.astro +14 -0
- package/src/tool/cronGenerator/component.astro +667 -0
- package/src/tool/cronGenerator/i18n/en.ts +191 -0
- package/src/tool/cronGenerator/i18n/es.ts +191 -0
- package/src/tool/cronGenerator/i18n/fr.ts +191 -0
- package/src/tool/cronGenerator/index.ts +34 -0
- package/src/tool/cronGenerator/seo.astro +14 -0
- package/src/tool/cronGenerator/ui.ts +45 -0
- package/src/tool/cssSpecificityCalculator/bibliography.astro +14 -0
- package/src/tool/cssSpecificityCalculator/component.astro +292 -0
- package/src/tool/cssSpecificityCalculator/i18n/en.ts +168 -0
- package/src/tool/cssSpecificityCalculator/i18n/es.ts +168 -0
- package/src/tool/cssSpecificityCalculator/i18n/fr.ts +168 -0
- package/src/tool/cssSpecificityCalculator/index.ts +34 -0
- package/src/tool/cssSpecificityCalculator/logic.ts +100 -0
- package/src/tool/cssSpecificityCalculator/seo.astro +14 -0
- package/src/tool/cssSpecificityCalculator/ui-controller.ts +57 -0
- package/src/tool/cssSpecificityCalculator/ui.ts +11 -0
- package/src/tool/cssToInlineConverter/bibliography.astro +14 -0
- package/src/tool/cssToInlineConverter/component.astro +308 -0
- package/src/tool/cssToInlineConverter/i18n/en.ts +160 -0
- package/src/tool/cssToInlineConverter/i18n/es.ts +160 -0
- package/src/tool/cssToInlineConverter/i18n/fr.ts +160 -0
- package/src/tool/cssToInlineConverter/index.ts +34 -0
- package/src/tool/cssToInlineConverter/seo.astro +14 -0
- package/src/tool/cssToInlineConverter/ui.ts +12 -0
- package/src/tool/duplicateCssRemover/bibliography.astro +14 -0
- package/src/tool/duplicateCssRemover/component.astro +353 -0
- package/src/tool/duplicateCssRemover/i18n/en.ts +167 -0
- package/src/tool/duplicateCssRemover/i18n/es.ts +167 -0
- package/src/tool/duplicateCssRemover/i18n/fr.ts +167 -0
- package/src/tool/duplicateCssRemover/index.ts +34 -0
- package/src/tool/duplicateCssRemover/seo.astro +14 -0
- package/src/tool/duplicateCssRemover/ui.ts +12 -0
- package/src/tool/generadorSecurityTxt/bibliography.astro +14 -0
- package/src/tool/generadorSecurityTxt/component.astro +473 -0
- package/src/tool/generadorSecurityTxt/i18n/en.ts +173 -0
- package/src/tool/generadorSecurityTxt/i18n/es.ts +173 -0
- package/src/tool/generadorSecurityTxt/i18n/fr.ts +173 -0
- package/src/tool/generadorSecurityTxt/index.ts +33 -0
- package/src/tool/generadorSecurityTxt/seo.astro +14 -0
- package/src/tool/generadorSecurityTxt/ui.ts +27 -0
- package/src/tool/hashGenerator/bibliography.astro +14 -0
- package/src/tool/hashGenerator/component.astro +367 -0
- package/src/tool/hashGenerator/i18n/en.ts +118 -0
- package/src/tool/hashGenerator/i18n/es.ts +118 -0
- package/src/tool/hashGenerator/i18n/fr.ts +118 -0
- package/src/tool/hashGenerator/index.ts +33 -0
- package/src/tool/hashGenerator/md5.ts +138 -0
- package/src/tool/hashGenerator/seo.astro +14 -0
- package/src/tool/hashGenerator/ui.ts +11 -0
- package/src/tool/inspectorCertificadosSsl/bibliography.astro +14 -0
- package/src/tool/inspectorCertificadosSsl/component.astro +580 -0
- package/src/tool/inspectorCertificadosSsl/i18n/en.ts +214 -0
- package/src/tool/inspectorCertificadosSsl/i18n/es.ts +214 -0
- package/src/tool/inspectorCertificadosSsl/i18n/fr.ts +214 -0
- package/src/tool/inspectorCertificadosSsl/index.ts +33 -0
- package/src/tool/inspectorCertificadosSsl/seo.astro +14 -0
- package/src/tool/inspectorCertificadosSsl/ui.ts +29 -0
- package/src/tool/jsonFormatter/bibliography.astro +14 -0
- package/src/tool/jsonFormatter/component.astro +590 -0
- package/src/tool/jsonFormatter/i18n/en.ts +156 -0
- package/src/tool/jsonFormatter/i18n/es.ts +156 -0
- package/src/tool/jsonFormatter/i18n/fr.ts +156 -0
- package/src/tool/jsonFormatter/index.ts +34 -0
- package/src/tool/jsonFormatter/seo.astro +14 -0
- package/src/tool/jsonFormatter/ui.ts +15 -0
- package/src/tool/keycode/bibliography.astro +14 -0
- package/src/tool/keycode/component.astro +540 -0
- package/src/tool/keycode/i18n/en.ts +160 -0
- package/src/tool/keycode/i18n/es.ts +160 -0
- package/src/tool/keycode/i18n/fr.ts +160 -0
- package/src/tool/keycode/index.ts +34 -0
- package/src/tool/keycode/seo.astro +14 -0
- package/src/tool/keycode/ui.ts +10 -0
- package/src/tool/llmCostCalculator/bibliography.astro +14 -0
- package/src/tool/llmCostCalculator/component.astro +488 -0
- package/src/tool/llmCostCalculator/data.ts +99 -0
- package/src/tool/llmCostCalculator/i18n/en.ts +165 -0
- package/src/tool/llmCostCalculator/i18n/es.ts +165 -0
- package/src/tool/llmCostCalculator/i18n/fr.ts +165 -0
- package/src/tool/llmCostCalculator/index.ts +34 -0
- package/src/tool/llmCostCalculator/seo.astro +14 -0
- package/src/tool/llmCostCalculator/ui.ts +11 -0
- package/src/tool/mobileMockupGenerator/app.ts +614 -0
- package/src/tool/mobileMockupGenerator/bibliography.astro +14 -0
- package/src/tool/mobileMockupGenerator/component.astro +1044 -0
- package/src/tool/mobileMockupGenerator/constants.ts +48 -0
- package/src/tool/mobileMockupGenerator/i18n/en.ts +121 -0
- package/src/tool/mobileMockupGenerator/i18n/es.ts +121 -0
- package/src/tool/mobileMockupGenerator/i18n/fr.ts +121 -0
- package/src/tool/mobileMockupGenerator/index.ts +33 -0
- package/src/tool/mobileMockupGenerator/rendering.ts +189 -0
- package/src/tool/mobileMockupGenerator/seo.astro +14 -0
- package/src/tool/mobileMockupGenerator/store.ts +145 -0
- package/src/tool/mobileMockupGenerator/types.ts +41 -0
- package/src/tool/mobileMockupGenerator/ui.ts +48 -0
- package/src/tool/musicalTypography/bibliography.astro +14 -0
- package/src/tool/musicalTypography/component.astro +480 -0
- package/src/tool/musicalTypography/i18n/en.ts +179 -0
- package/src/tool/musicalTypography/i18n/es.ts +179 -0
- package/src/tool/musicalTypography/i18n/fr.ts +179 -0
- package/src/tool/musicalTypography/index.ts +33 -0
- package/src/tool/musicalTypography/seo.astro +14 -0
- package/src/tool/musicalTypography/ui.ts +25 -0
- package/src/tool/placeholderGenerator/bibliography.astro +14 -0
- package/src/tool/placeholderGenerator/component.astro +499 -0
- package/src/tool/placeholderGenerator/i18n/en.ts +176 -0
- package/src/tool/placeholderGenerator/i18n/es.ts +176 -0
- package/src/tool/placeholderGenerator/i18n/fr.ts +176 -0
- package/src/tool/placeholderGenerator/index.ts +34 -0
- package/src/tool/placeholderGenerator/seo.astro +14 -0
- package/src/tool/placeholderGenerator/ui.ts +14 -0
- package/src/tool/promptLibrary/bibliography.astro +14 -0
- package/src/tool/promptLibrary/component.astro +1131 -0
- package/src/tool/promptLibrary/controller.ts +49 -0
- package/src/tool/promptLibrary/i18n/en.ts +131 -0
- package/src/tool/promptLibrary/i18n/es.ts +131 -0
- package/src/tool/promptLibrary/i18n/fr.ts +126 -0
- package/src/tool/promptLibrary/index.ts +33 -0
- package/src/tool/promptLibrary/seo.astro +14 -0
- package/src/tool/promptLibrary/ui.ts +29 -0
- package/src/tool/readabilityCalculator/bibliography.astro +14 -0
- package/src/tool/readabilityCalculator/component.astro +534 -0
- package/src/tool/readabilityCalculator/i18n/en.ts +133 -0
- package/src/tool/readabilityCalculator/i18n/es.ts +133 -0
- package/src/tool/readabilityCalculator/i18n/fr.ts +133 -0
- package/src/tool/readabilityCalculator/index.ts +33 -0
- package/src/tool/readabilityCalculator/seo.astro +14 -0
- package/src/tool/readabilityCalculator/ui.ts +27 -0
- package/src/tool/svgSanitizer/bibliography.astro +14 -0
- package/src/tool/svgSanitizer/component.astro +554 -0
- package/src/tool/svgSanitizer/i18n/en.ts +125 -0
- package/src/tool/svgSanitizer/i18n/es.ts +125 -0
- package/src/tool/svgSanitizer/i18n/fr.ts +125 -0
- package/src/tool/svgSanitizer/index.ts +33 -0
- package/src/tool/svgSanitizer/seo.astro +14 -0
- package/src/tool/svgSanitizer/ui.ts +18 -0
- package/src/tool/svgToCss/bibliography.astro +14 -0
- package/src/tool/svgToCss/component.astro +381 -0
- package/src/tool/svgToCss/i18n/en.ts +174 -0
- package/src/tool/svgToCss/i18n/es.ts +174 -0
- package/src/tool/svgToCss/i18n/fr.ts +174 -0
- package/src/tool/svgToCss/index.ts +34 -0
- package/src/tool/svgToCss/seo.astro +14 -0
- package/src/tool/svgToCss/ui.ts +13 -0
- package/src/tool/urlCleaner/bibliography.astro +14 -0
- package/src/tool/urlCleaner/component.astro +458 -0
- package/src/tool/urlCleaner/i18n/en.ts +116 -0
- package/src/tool/urlCleaner/i18n/es.ts +116 -0
- package/src/tool/urlCleaner/i18n/fr.ts +116 -0
- package/src/tool/urlCleaner/index.ts +33 -0
- package/src/tool/urlCleaner/seo.astro +14 -0
- package/src/tool/urlCleaner/ui.ts +12 -0
- package/src/tool/urlEncoderDecoder/bibliography.astro +14 -0
- package/src/tool/urlEncoderDecoder/component.astro +291 -0
- package/src/tool/urlEncoderDecoder/i18n/en.ts +162 -0
- package/src/tool/urlEncoderDecoder/i18n/es.ts +162 -0
- package/src/tool/urlEncoderDecoder/i18n/fr.ts +162 -0
- package/src/tool/urlEncoderDecoder/index.ts +34 -0
- package/src/tool/urlEncoderDecoder/seo.astro +14 -0
- package/src/tool/urlEncoderDecoder/ui.ts +11 -0
- package/src/tool/utmGenerator/bibliography.astro +14 -0
- package/src/tool/utmGenerator/component.astro +270 -0
- package/src/tool/utmGenerator/i18n/en.ts +117 -0
- package/src/tool/utmGenerator/i18n/es.ts +117 -0
- package/src/tool/utmGenerator/i18n/fr.ts +117 -0
- package/src/tool/utmGenerator/index.ts +33 -0
- package/src/tool/utmGenerator/seo.astro +14 -0
- package/src/tool/utmGenerator/ui.ts +13 -0
- package/src/tools.ts +27 -0
- package/src/types.ts +72 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { PlaceholderGeneratorUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'generador-imagenes-placeholder';
|
|
6
|
+
const title = 'Generador de Imágenes Placeholder. Mockups Rápidos Online';
|
|
7
|
+
const description =
|
|
8
|
+
'Crea imágenes de relleno personalizadas para tus diseños web. Ajusta resolución, fondo, texto y exporta en PNG, WebP o JPEG en milisegundos.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: '¿Qué es una imagen placeholder?',
|
|
13
|
+
answer:
|
|
14
|
+
'Una imagen placeholder o de relleno es un gráfico temporal utilizado en diseño web y maquetación para reservar el espacio donde irá una imagen definitiva. Ayudan a visualizar la estructura de una página antes de tener el contenido final.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: '¿Puedo usar cualquier resolución en el generador?',
|
|
18
|
+
answer:
|
|
19
|
+
'Sí, puedes introducir cualquier valor numérico para el ancho y el alto. El generador creará un lienzo con las dimensiones exactas solicitadas, perfecto para cuadrículas estrictas o banners publicitarios específicos.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: '¿En qué formato se descargan las imágenes?',
|
|
23
|
+
answer:
|
|
24
|
+
'Por defecto, las imágenes se generan en WebP para una compresión óptima, pero puedes elegir descargarlas en formato PNG si buscas mantener la máxima calidad sin pérdida, o JPEG para compatibilidad tradicional.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: '¿Se procesa esto en algún servidor?',
|
|
28
|
+
answer:
|
|
29
|
+
'No, todo el renderizado de la imagen se genera instantáneamente en la memoria virtual (Canvas) de tu propio navegador. Es instantáneo y no requiere enviar datos a través de la red.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Establecer dimensiones',
|
|
36
|
+
text: 'Introduce los valores de ancho y alto directamente o haz clic en uno de los presets (FHD, HD, Instagram, etc.) para rellenarlos automáticamente.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Configurar colores y texto',
|
|
40
|
+
text: 'Elige el color de fondo y de texto usando los selectores nativos o escribiendo un código hexadecimal. Opcionalmente, añade texto personalizado para reemplazar la etiqueta de dimensiones predeterminada.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Seleccionar tipografía y formato',
|
|
44
|
+
text: 'Escoge la familia tipográfica y el tamaño de fuente. Selecciona el formato de salida (WebP, PNG o JPEG) según tus necesidades.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Descargar la imagen',
|
|
48
|
+
text: 'Haz clic en el botón Descargar para guardar el placeholder generado directamente en tu dispositivo.',
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
53
|
+
'@context': 'https://schema.org',
|
|
54
|
+
'@type': 'FAQPage',
|
|
55
|
+
mainEntity: faqData.map((item) => ({
|
|
56
|
+
'@type': 'Question',
|
|
57
|
+
name: item.question,
|
|
58
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
59
|
+
})),
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
63
|
+
'@context': 'https://schema.org',
|
|
64
|
+
'@type': 'HowTo',
|
|
65
|
+
name: title,
|
|
66
|
+
description,
|
|
67
|
+
step: howToData.map((step, i) => ({
|
|
68
|
+
'@type': 'HowToStep',
|
|
69
|
+
position: i + 1,
|
|
70
|
+
name: step.name,
|
|
71
|
+
text: step.text,
|
|
72
|
+
})),
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
76
|
+
'@context': 'https://schema.org',
|
|
77
|
+
'@type': 'SoftwareApplication',
|
|
78
|
+
name: title,
|
|
79
|
+
description,
|
|
80
|
+
applicationCategory: 'UtilityApplication',
|
|
81
|
+
operatingSystem: 'All',
|
|
82
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
83
|
+
inLanguage: 'es',
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const ui: PlaceholderGeneratorUI = {
|
|
87
|
+
labelDimensions: 'Dimensiones Rápidas',
|
|
88
|
+
labelWidth: 'Ancho (px)',
|
|
89
|
+
labelHeight: 'Alto (px)',
|
|
90
|
+
labelBgColor: 'Fondo',
|
|
91
|
+
labelTextColor: 'Texto',
|
|
92
|
+
labelCustomText: 'Texto Personalizado (Opcional)',
|
|
93
|
+
placeholderCustomText: 'Ej: Banner Hero',
|
|
94
|
+
labelFontFamily: 'Tipografía',
|
|
95
|
+
labelFontSize: 'Tamaño Base',
|
|
96
|
+
fontSizeAuto: 'Automático',
|
|
97
|
+
labelFormat: 'Formato de Salida',
|
|
98
|
+
btnDownload: 'Descargar Imagen',
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
export const content: ToolLocaleContent<PlaceholderGeneratorUI> = {
|
|
102
|
+
slug,
|
|
103
|
+
title,
|
|
104
|
+
description,
|
|
105
|
+
ui,
|
|
106
|
+
faqTitle: 'Preguntas Frecuentes',
|
|
107
|
+
faq: faqData,
|
|
108
|
+
bibliographyTitle: 'Referencias y Documentación',
|
|
109
|
+
bibliography: [
|
|
110
|
+
{
|
|
111
|
+
name: 'MDN Web Docs: HTMLCanvasElement.toDataURL()',
|
|
112
|
+
url: 'https://developer.mozilla.org/es/docs/Web/API/HTMLCanvasElement/toDataURL',
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
name: 'MDN Web Docs: CanvasRenderingContext2D',
|
|
116
|
+
url: 'https://developer.mozilla.org/es/docs/Web/API/CanvasRenderingContext2D',
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
name: 'W3C: HTML Canvas 2D Context',
|
|
120
|
+
url: 'https://www.w3.org/TR/2dcontext/',
|
|
121
|
+
},
|
|
122
|
+
],
|
|
123
|
+
howTo: howToData,
|
|
124
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
125
|
+
seo: [
|
|
126
|
+
{
|
|
127
|
+
type: 'title',
|
|
128
|
+
text: 'La Herramienta Definitiva para Mockups Rápidos',
|
|
129
|
+
level: 2,
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
type: 'paragraph',
|
|
133
|
+
html: 'Cuando nos encontramos en las fases tempranas de conceptualización o maquetación estructural de un sitio web (wireframing), rara vez disponemos del contenido fotográfico final. Las dimensiones vacías pueden distorsionar la visualización global del producto y ocultar errores críticos de espaciado o proporciones. Un generador de imágenes placeholder resuelve de golpe este contratiempo, permitiendo inyectar áreas coloreadas rigurosamente dimensionadas de forma instantánea.',
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
type: 'tip',
|
|
137
|
+
title: 'Diseño sin Fricciones',
|
|
138
|
+
html: 'Integrar un espacio de 1200x800 píxeles exactamente es imperativo cuando construyes CSS Grids. Al descargar los bloques de relleno evitas inyectar CSS extra o scripts de terceros en tu código temporal.',
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
type: 'title',
|
|
142
|
+
text: 'La Importancia de Prescindir de Servicios Externos',
|
|
143
|
+
level: 3,
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
type: 'paragraph',
|
|
147
|
+
html: 'Una práctica recurrente del ecosistema frontend consiste en vincular servicios como <code>via.placeholder.com</code> o similares directamente en los atributos <code>src</code> del HTML. Si bien resulta teóricamente ágil mediante parámetros URL, posee profundos efectos secundarios que un programador meticuloso evitaría a toda costa.',
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
type: 'paragraph',
|
|
151
|
+
html: 'Insertar un dominio remoto en cada etiqueta de carga de una página en desarrollo incrementa la cantidad de peticiones DNS, penaliza los sistemas de hot-reloading de Vite, Gulp o Webpack y expone accidentalmente trazas en ramas que eventualmente acaban en la nube. Al usar esta utilidad y generar la imagen en tu formato preferido (WebP, PNG o JPEG), centralizas tu prototipo completamente en modo localhost.',
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
type: 'title',
|
|
155
|
+
text: 'Características Fundamentales del Algoritmo del Generador',
|
|
156
|
+
level: 3,
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
type: 'list',
|
|
160
|
+
items: [
|
|
161
|
+
'<strong>Resolución Pixel Perfect:</strong> HTML5 Canvas nativo asegura que el lienzo exportado corresponde aritméticamente a las coordenadas estipuladas por el usuario.',
|
|
162
|
+
'<strong>Autoscaling Tipográfico:</strong> En el modo Automático, la dimensión de la fuente calcula el área perimetral y el número de caracteres para acoplar con elegancia el texto a lo largo y ancho sin provocar <em>overflows</em> indeseados.',
|
|
163
|
+
'<strong>Fusión Hexadecimal:</strong> Control de estado bidireccional entre selectores de ecosistema nativo HTML e inputs mecanografiados garantizando contrastes precisos dictados por la paleta del UI/UX de tu Figma o Penpot original.',
|
|
164
|
+
],
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
type: 'title',
|
|
168
|
+
text: 'El Arte Oculto del Wireframing Técnico',
|
|
169
|
+
level: 3,
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
type: 'paragraph',
|
|
173
|
+
html: 'No existe proyecto monolítico ni micro frontends que no pase por etapas de cimentación, especialmente frente a clientes exigentes o Product Managers con una visión férrea. Facilitar iteraciones gráficas ágiles sin arrastrar la sobrecarga de <em>assets</em> finalizados separa al desarrollador veloz del atascado. Este generador exprime directamente la API <code>toDataURL()</code> moderna de JS en tu máquina local para brindar un resultado a la altura del mercado industrial sin procesamientos intermedios dudosos.',
|
|
174
|
+
},
|
|
175
|
+
],
|
|
176
|
+
};
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { PlaceholderGeneratorUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'generateur-images-placeholder';
|
|
6
|
+
const title = "Générateur d'Images Placeholder. Maquettes Web Rapides en Ligne";
|
|
7
|
+
const description =
|
|
8
|
+
"Créez des images de remplissage personnalisées pour vos designs web. Ajustez la résolution, le fond, le texte et exportez en PNG, WebP ou JPEG en quelques millisecondes.";
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: "Qu'est-ce qu'une image placeholder ?",
|
|
13
|
+
answer:
|
|
14
|
+
"Une image placeholder ou de remplissage est un graphique temporaire utilisé en design web et en maquettage pour réserver l'espace où ira une image définitive. Elles aident à visualiser la structure d'une page avant d'avoir le contenu final.",
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: "Puis-je utiliser n'importe quelle résolution dans le générateur ?",
|
|
18
|
+
answer:
|
|
19
|
+
"Oui, vous pouvez saisir n'importe quelle valeur numérique pour la largeur et la hauteur. Le générateur créera un canevas avec les dimensions exactes demandées, parfait pour des grilles strictes ou des bannières publicitaires spécifiques.",
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'Dans quel format les images sont-elles téléchargées ?',
|
|
23
|
+
answer:
|
|
24
|
+
"Par défaut, les images sont générées en WebP pour une compression optimale, mais vous pouvez choisir de les télécharger en format PNG pour conserver la qualité maximale sans perte, ou JPEG pour la compatibilité traditionnelle.",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: 'Est-ce traité sur un serveur ?',
|
|
28
|
+
answer:
|
|
29
|
+
"Non, tout le rendu de l'image est généré instantanément dans la mémoire virtuelle (Canvas) de votre propre navigateur. C'est instantané et ne nécessite pas l'envoi de données sur le réseau.",
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Définir les dimensions',
|
|
36
|
+
text: "Saisissez les valeurs de largeur et de hauteur directement ou cliquez sur l'un des presets (FHD, HD, Instagram, etc.) pour les remplir automatiquement.",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Configurer les couleurs et le texte',
|
|
40
|
+
text: 'Choisissez la couleur de fond et de texte en utilisant les sélecteurs natifs ou en tapant un code hexadécimal. Optionnellement, ajoutez du texte personnalisé pour remplacer le label de dimensions par défaut.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Sélectionner la typographie et le format',
|
|
44
|
+
text: 'Choisissez la famille typographique et la taille de police. Sélectionnez le format de sortie (WebP, PNG ou JPEG) selon vos besoins.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: "Télécharger l'image",
|
|
48
|
+
text: "Cliquez sur le bouton Télécharger pour sauvegarder le placeholder généré directement sur votre appareil.",
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
53
|
+
'@context': 'https://schema.org',
|
|
54
|
+
'@type': 'FAQPage',
|
|
55
|
+
mainEntity: faqData.map((item) => ({
|
|
56
|
+
'@type': 'Question',
|
|
57
|
+
name: item.question,
|
|
58
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
59
|
+
})),
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
63
|
+
'@context': 'https://schema.org',
|
|
64
|
+
'@type': 'HowTo',
|
|
65
|
+
name: title,
|
|
66
|
+
description,
|
|
67
|
+
step: howToData.map((step, i) => ({
|
|
68
|
+
'@type': 'HowToStep',
|
|
69
|
+
position: i + 1,
|
|
70
|
+
name: step.name,
|
|
71
|
+
text: step.text,
|
|
72
|
+
})),
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
76
|
+
'@context': 'https://schema.org',
|
|
77
|
+
'@type': 'SoftwareApplication',
|
|
78
|
+
name: title,
|
|
79
|
+
description,
|
|
80
|
+
applicationCategory: 'UtilityApplication',
|
|
81
|
+
operatingSystem: 'All',
|
|
82
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
83
|
+
inLanguage: 'fr',
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const ui: PlaceholderGeneratorUI = {
|
|
87
|
+
labelDimensions: 'Dimensions Rapides',
|
|
88
|
+
labelWidth: 'Largeur (px)',
|
|
89
|
+
labelHeight: 'Hauteur (px)',
|
|
90
|
+
labelBgColor: 'Fond',
|
|
91
|
+
labelTextColor: 'Texte',
|
|
92
|
+
labelCustomText: 'Texte Personnalisé (Optionnel)',
|
|
93
|
+
placeholderCustomText: 'Ex: Bannière Hero',
|
|
94
|
+
labelFontFamily: 'Typographie',
|
|
95
|
+
labelFontSize: 'Taille de Base',
|
|
96
|
+
fontSizeAuto: 'Automatique',
|
|
97
|
+
labelFormat: 'Format de Sortie',
|
|
98
|
+
btnDownload: "Télécharger l'Image",
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
export const content: ToolLocaleContent<PlaceholderGeneratorUI> = {
|
|
102
|
+
slug,
|
|
103
|
+
title,
|
|
104
|
+
description,
|
|
105
|
+
ui,
|
|
106
|
+
faqTitle: 'Questions Fréquentes',
|
|
107
|
+
faq: faqData,
|
|
108
|
+
bibliographyTitle: 'Références et Documentation',
|
|
109
|
+
bibliography: [
|
|
110
|
+
{
|
|
111
|
+
name: 'MDN Web Docs: HTMLCanvasElement.toDataURL()',
|
|
112
|
+
url: 'https://developer.mozilla.org/fr/docs/Web/API/HTMLCanvasElement/toDataURL',
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
name: 'MDN Web Docs: CanvasRenderingContext2D',
|
|
116
|
+
url: 'https://developer.mozilla.org/fr/docs/Web/API/CanvasRenderingContext2D',
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
name: 'W3C: HTML Canvas 2D Context',
|
|
120
|
+
url: 'https://www.w3.org/TR/2dcontext/',
|
|
121
|
+
},
|
|
122
|
+
],
|
|
123
|
+
howTo: howToData,
|
|
124
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
125
|
+
seo: [
|
|
126
|
+
{
|
|
127
|
+
type: 'title',
|
|
128
|
+
text: "L'Outil Définitif pour des Maquettes Rapides",
|
|
129
|
+
level: 2,
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
type: 'paragraph',
|
|
133
|
+
html: "Lors des premières phases de conceptualisation ou de maquettage structurel d'un site web (wireframing), nous disposons rarement du contenu photographique final. Les dimensions vides peuvent fausser la visualisation globale du produit et masquer des erreurs critiques d'espacement ou de proportions. Un générateur d'images placeholder résout instantanément ce problème, permettant d'injecter des zones colorées rigoureusement dimensionnées.",
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
type: 'tip',
|
|
137
|
+
title: 'Design sans Friction',
|
|
138
|
+
html: "Intégrer un espace de 1200x800 pixels exactement est impératif lors de la construction de CSS Grids. En téléchargeant les blocs de remplissage, vous évitez d'injecter du CSS supplémentaire ou des scripts tiers dans votre code temporaire.",
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
type: 'title',
|
|
142
|
+
text: "L'Importance d'Éviter les Services Externes",
|
|
143
|
+
level: 3,
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
type: 'paragraph',
|
|
147
|
+
html: "Une pratique récurrente dans l'écosystème frontend consiste à lier des services comme <code>via.placeholder.com</code> ou similaires directement dans les attributs <code>src</code> du HTML. Bien que théoriquement agile via des paramètres URL, cela présente de profonds effets secondaires qu'un développeur méticuleux éviterait à tout prix.",
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
type: 'paragraph',
|
|
151
|
+
html: "Insérer un domaine distant dans chaque balise d'image d'une page en développement augmente les requêtes DNS, pénalise les systèmes de hot-reloading de Vite, Gulp ou Webpack et expose accidentellement des traces dans des branches qui finissent dans le cloud. En utilisant cet outil et en générant l'image dans votre format préféré (WebP, PNG ou JPEG), vous centralisez votre prototype entièrement en mode localhost.",
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
type: 'title',
|
|
155
|
+
text: "Caractéristiques Fondamentales de l'Algorithme du Générateur",
|
|
156
|
+
level: 3,
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
type: 'list',
|
|
160
|
+
items: [
|
|
161
|
+
"<strong>Résolution Pixel Perfect :</strong> HTML5 Canvas natif garantit que le canevas exporté correspond arithmétiquement aux coordonnées stipulées par l'utilisateur.",
|
|
162
|
+
"<strong>Autoscaling Typographique :</strong> En mode Automatique, la taille de la police calcule l'aire périmétrique et le nombre de caractères pour adapter élégamment le texte sans provoquer d'<em>overflows</em> indésirables.",
|
|
163
|
+
'<strong>Fusion Hexadécimale :</strong> Contrôle d\'état bidirectionnel entre les sélecteurs natifs HTML et les inputs typés, garantissant des contrastes précis dictés par la palette UI/UX de votre Figma ou Penpot original.',
|
|
164
|
+
],
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
type: 'title',
|
|
168
|
+
text: "L'Art Caché du Wireframing Technique",
|
|
169
|
+
level: 3,
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
type: 'paragraph',
|
|
173
|
+
html: "Il n'existe aucun projet monolithique ni micro frontend qui ne passe pas par des étapes de fondation, surtout face à des clients exigeants ou des Product Managers avec une vision de fer. Faciliter des itérations graphiques agiles sans traîner la surcharge d'<em>assets</em> finalisés sépare le développeur rapide du développeur bloqué. Ce générateur exploite directement l'API moderne JS <code>toDataURL()</code> sur votre machine locale pour offrir un résultat à la hauteur du marché industriel sans traitement intermédiaire douteux.",
|
|
174
|
+
},
|
|
175
|
+
],
|
|
176
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { DeveloperToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
|
|
2
|
+
import PlaceholderGeneratorComponent from './component.astro';
|
|
3
|
+
import PlaceholderGeneratorSEO from './seo.astro';
|
|
4
|
+
import PlaceholderGeneratorBibliography from './bibliography.astro';
|
|
5
|
+
|
|
6
|
+
import type { PlaceholderGeneratorUI } from './ui';
|
|
7
|
+
|
|
8
|
+
export type PlaceholderGeneratorLocaleContent = ToolLocaleContent<PlaceholderGeneratorUI>;
|
|
9
|
+
|
|
10
|
+
import { content as es } from './i18n/es';
|
|
11
|
+
import { content as en } from './i18n/en';
|
|
12
|
+
import { content as fr } from './i18n/fr';
|
|
13
|
+
|
|
14
|
+
export const placeholderGenerator: DeveloperToolEntry<PlaceholderGeneratorUI> = {
|
|
15
|
+
id: 'placeholder-generator',
|
|
16
|
+
icons: {
|
|
17
|
+
bg: 'mdi:image-outline',
|
|
18
|
+
fg: 'mdi:image-size-select-actual',
|
|
19
|
+
},
|
|
20
|
+
i18n: {
|
|
21
|
+
es: async () => es,
|
|
22
|
+
en: async () => en,
|
|
23
|
+
fr: async () => fr,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export { PlaceholderGeneratorComponent, PlaceholderGeneratorSEO, PlaceholderGeneratorBibliography };
|
|
28
|
+
|
|
29
|
+
export const PLACEHOLDER_GENERATOR_TOOL: ToolDefinition = {
|
|
30
|
+
entry: placeholderGenerator,
|
|
31
|
+
Component: PlaceholderGeneratorComponent,
|
|
32
|
+
SEOComponent: PlaceholderGeneratorSEO,
|
|
33
|
+
BibliographyComponent: PlaceholderGeneratorBibliography,
|
|
34
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { placeholderGenerator } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'es' } = Astro.props;
|
|
11
|
+
const content = await placeholderGenerator.i18n[locale]?.();
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
{content && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface PlaceholderGeneratorUI extends Record<string, string> {
|
|
2
|
+
labelDimensions: string;
|
|
3
|
+
labelWidth: string;
|
|
4
|
+
labelHeight: string;
|
|
5
|
+
labelBgColor: string;
|
|
6
|
+
labelTextColor: string;
|
|
7
|
+
labelCustomText: string;
|
|
8
|
+
placeholderCustomText: string;
|
|
9
|
+
labelFontFamily: string;
|
|
10
|
+
labelFontSize: string;
|
|
11
|
+
fontSizeAuto: string;
|
|
12
|
+
labelFormat: string;
|
|
13
|
+
btnDownload: string;
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { promptLibrary } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'es' } = Astro.props;
|
|
11
|
+
const content = await promptLibrary.i18n[locale]?.();
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
{content && <SharedBibliography links={content.bibliography} />}
|