@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,49 @@
|
|
|
1
|
+
export interface PromptItem {
|
|
2
|
+
id: string;
|
|
3
|
+
title: string;
|
|
4
|
+
content: string;
|
|
5
|
+
tags: string[];
|
|
6
|
+
isStarred?: boolean;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const STORAGE_KEY = 'jjlmoya_prompts';
|
|
10
|
+
|
|
11
|
+
function sortByStarred(a: PromptItem, b: PromptItem): number {
|
|
12
|
+
if (a.isStarred && !b.isStarred) return -1;
|
|
13
|
+
if (!a.isStarred && b.isStarred) return 1;
|
|
14
|
+
return 0;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function loadPrompts(): PromptItem[] {
|
|
18
|
+
try {
|
|
19
|
+
const data = localStorage.getItem(STORAGE_KEY);
|
|
20
|
+
const parsed = data ? (JSON.parse(data) as PromptItem[]) : [];
|
|
21
|
+
return parsed.sort(sortByStarred);
|
|
22
|
+
} catch (e) {
|
|
23
|
+
console.error('Error loading prompts', e);
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function savePrompts(items: PromptItem[]): void {
|
|
29
|
+
localStorage.setItem(STORAGE_KEY, JSON.stringify(items));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function addPrompt(item: Omit<PromptItem, 'id'>): void {
|
|
33
|
+
const items = loadPrompts();
|
|
34
|
+
items.unshift({ ...item, id: crypto.randomUUID() });
|
|
35
|
+
savePrompts(items);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function updatePrompt(id: string, updates: Partial<PromptItem>): void {
|
|
39
|
+
const items = loadPrompts();
|
|
40
|
+
const index = items.findIndex((p) => p.id === id);
|
|
41
|
+
if (index !== -1) {
|
|
42
|
+
items[index] = { ...items[index], ...updates };
|
|
43
|
+
savePrompts(items);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function deletePrompt(id: string): void {
|
|
48
|
+
savePrompts(loadPrompts().filter((p) => p.id !== id));
|
|
49
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { PromptLibraryUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'prompt-library';
|
|
6
|
+
const title = 'Private AI Prompt Library';
|
|
7
|
+
const description = 'Organize, tag and save your ChatGPT, Midjourney and Claude prompts privately. Your own prompt bank in localStorage.';
|
|
8
|
+
|
|
9
|
+
const faqData = [
|
|
10
|
+
{
|
|
11
|
+
question: 'Where are my prompts saved?',
|
|
12
|
+
answer: 'Your prompts are saved exclusively in your browser\'s local storage (localStorage). We do not use external servers, meaning your data is 100% private.',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: 'What happens if I clear browser cookies or history?',
|
|
16
|
+
answer: 'If you clear site data or local storage, you will lose your saved prompts. We recommend making backups if you frequently clear your browser.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'Can I use this tool for Midjourney, ChatGPT or DALL-E?',
|
|
20
|
+
answer: 'Yes, it is compatible with any type of AI instruction. You can create specific tags to organize your commands and copy them to your preferred AI tool easily.',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const howToData = [
|
|
25
|
+
{ name: 'Create a prompt', text: 'Click the New Prompt button and enter the title and instruction.' },
|
|
26
|
+
{ name: 'Add tags', text: 'Type tags separated by space or comma to classify your prompts.' },
|
|
27
|
+
{ name: 'Use variables', text: 'Use brackets [LIKE THIS] in the text to create fillable fields on the card.' },
|
|
28
|
+
{ name: 'Copy and share', text: 'Copy to clipboard with one click or share a direct link with the share button.' },
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
32
|
+
'@context': 'https://schema.org',
|
|
33
|
+
'@type': 'FAQPage',
|
|
34
|
+
mainEntity: faqData.map((item) => ({
|
|
35
|
+
'@type': 'Question',
|
|
36
|
+
name: item.question,
|
|
37
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
38
|
+
})),
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
42
|
+
'@context': 'https://schema.org',
|
|
43
|
+
'@type': 'HowTo',
|
|
44
|
+
name: title,
|
|
45
|
+
description,
|
|
46
|
+
step: howToData.map((s, i) => ({ '@type': 'HowToStep', position: i + 1, name: s.name, text: s.text })),
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
50
|
+
'@context': 'https://schema.org',
|
|
51
|
+
'@type': 'SoftwareApplication',
|
|
52
|
+
name: title,
|
|
53
|
+
description,
|
|
54
|
+
applicationCategory: 'UtilityApplication',
|
|
55
|
+
operatingSystem: 'All',
|
|
56
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
57
|
+
inLanguage: 'en',
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const ui: PromptLibraryUI = {
|
|
61
|
+
placeholderSearch: 'Search by keyword or tag...',
|
|
62
|
+
btnNew: 'New Prompt',
|
|
63
|
+
emptyTitle: 'Your library is empty',
|
|
64
|
+
emptyDesc: 'Create your first prompt and start building your private AI repository.',
|
|
65
|
+
btnAddFirst: 'Add the first one',
|
|
66
|
+
modalTitleCreate: 'Create New Prompt',
|
|
67
|
+
modalTitleEdit: 'Edit Prompt',
|
|
68
|
+
labelTitle: 'Identifying title',
|
|
69
|
+
placeholderTitle: 'E.g.: SEO Marketing Expert',
|
|
70
|
+
labelContent: 'Instruction (Prompt)',
|
|
71
|
+
placeholderContent: 'Write detailed instructions for the AI here...',
|
|
72
|
+
hintContent: 'Tip: use brackets [LIKE THESE] to fill in variables later.',
|
|
73
|
+
labelTags: 'Tags',
|
|
74
|
+
placeholderTags: 'E.g.: marketing, seo (space or comma to add)',
|
|
75
|
+
btnCancel: 'Cancel',
|
|
76
|
+
btnSave: 'Save Locally',
|
|
77
|
+
ariaLabelStar: 'Star prompt',
|
|
78
|
+
ariaLabelEdit: 'Edit prompt',
|
|
79
|
+
ariaLabelShare: 'Share prompt',
|
|
80
|
+
ariaLabelCopy: 'Copy prompt',
|
|
81
|
+
ariaLabelDelete: 'Delete prompt',
|
|
82
|
+
varsTitle: 'Required variables',
|
|
83
|
+
noResults: 'No prompts found for this search.',
|
|
84
|
+
confirmTitle: 'Delete prompt?',
|
|
85
|
+
confirmDesc: 'This action cannot be undone.',
|
|
86
|
+
btnCancelDelete: 'Cancel',
|
|
87
|
+
btnConfirmDelete: 'Delete permanently',
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
export const content: ToolLocaleContent<PromptLibraryUI> = {
|
|
91
|
+
slug,
|
|
92
|
+
title,
|
|
93
|
+
description,
|
|
94
|
+
ui,
|
|
95
|
+
faqTitle: 'Frequently Asked Questions',
|
|
96
|
+
faq: faqData,
|
|
97
|
+
bibliographyTitle: 'Prompt Engineering References',
|
|
98
|
+
bibliography: [
|
|
99
|
+
{ name: 'Prompt Engineering Guide (DAIR.AI)', url: 'https://www.promptingguide.ai/' },
|
|
100
|
+
{ name: 'What is prompt engineering (Google Cloud)', url: 'https://cloud.google.com/discover/what-is-prompt-engineering' },
|
|
101
|
+
],
|
|
102
|
+
howTo: howToData,
|
|
103
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
104
|
+
seo: [
|
|
105
|
+
{ type: 'title', text: 'Why do you need a Prompt Library?', level: 2 },
|
|
106
|
+
{
|
|
107
|
+
type: 'paragraph',
|
|
108
|
+
html: 'If you regularly work with AI tools like ChatGPT, Claude or Midjourney, you have probably found yourself repeating the same instructions. A <strong>prompt library</strong> is the definitive solution to stop wasting time rewriting your favorite commands.',
|
|
109
|
+
},
|
|
110
|
+
{ type: 'title', text: 'Benefits of organizing your prompts', level: 3 },
|
|
111
|
+
{
|
|
112
|
+
type: 'list',
|
|
113
|
+
items: [
|
|
114
|
+
'<strong>Instant search:</strong> Find that specific instruction you used months ago with a simple text search.',
|
|
115
|
+
'<strong>Tag classification:</strong> Tag your prompts as "marketing", "programming" or "copywriting" to filter quickly.',
|
|
116
|
+
'<strong>One-click copy:</strong> Copy the full text to clipboard with a single click.',
|
|
117
|
+
'<strong>Total privacy:</strong> All your data is stored locally in your browser via localStorage.',
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
{ type: 'title', text: 'Variables in your prompts', level: 3 },
|
|
121
|
+
{
|
|
122
|
+
type: 'paragraph',
|
|
123
|
+
html: 'Use the <strong>[VARIABLE]</strong> notation in your prompts to create dynamically fillable fields. When you open a card, inputs will appear for each defined variable. The prompt is copied with the filled values, ready to paste into your AI.',
|
|
124
|
+
},
|
|
125
|
+
{ type: 'title', text: 'Sharing prompts', level: 3 },
|
|
126
|
+
{
|
|
127
|
+
type: 'paragraph',
|
|
128
|
+
html: 'Each prompt can be shared via a URL. The share button generates a link that, when opened, shows the creation form pre-filled with the prompt content.',
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
};
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { PromptLibraryUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'biblioteca-prompts';
|
|
6
|
+
const title = 'Biblioteca de Prompts de IA';
|
|
7
|
+
const description = 'Organiza, etiqueta y guarda tus prompts de ChatGPT, Midjourney y Claude de forma privada. Tu propio banco de prompts en localStorage.';
|
|
8
|
+
|
|
9
|
+
const faqData = [
|
|
10
|
+
{
|
|
11
|
+
question: '\u00bfD\u00f3nde se guardan mis prompts?',
|
|
12
|
+
answer: 'Tus prompts se guardan exclusivamente en el almacenamiento local de tu navegador (localStorage). No utilizamos servidores externos, lo que significa que tus datos son 100% privados.',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: '\u00bfQu\u00e9 pasa si borro las cookies o el historial del navegador?',
|
|
16
|
+
answer: 'Si borras los datos del sitio o el almacenamiento local de tu navegador, perder\u00e1s tus prompts guardados. Te recomendamos hacer copias de seguridad si limpias tu navegador frecuentemente.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: '\u00bfPuedo usar esta herramienta para Midjourney, ChatGPT o DALL-E?',
|
|
20
|
+
answer: 'S\u00ed, es compatible con cualquier tipo de instrucci\u00f3n de IA. Puedes crear etiquetas espec\u00edficas para organizar tus comandos y copiarlos a tu herramienta de IA preferida f\u00e1cilmente.',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const howToData = [
|
|
25
|
+
{ name: 'Crear un prompt', text: 'Haz clic en el bot\u00f3n Nuevo Prompt e introduce el t\u00edtulo y la instrucci\u00f3n.' },
|
|
26
|
+
{ name: 'A\u00f1adir etiquetas', text: 'Escribe etiquetas separadas por espacio o coma para clasificar tus prompts.' },
|
|
27
|
+
{ name: 'Usar variables', text: 'Usa corchetes [ASI] en el texto para crear campos rellenables en la tarjeta.' },
|
|
28
|
+
{ name: 'Copiar y compartir', text: 'Copia al portapapeles con un clic o comparte un enlace directo con el bot\u00f3n compartir.' },
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
32
|
+
'@context': 'https://schema.org',
|
|
33
|
+
'@type': 'FAQPage',
|
|
34
|
+
mainEntity: faqData.map((item) => ({
|
|
35
|
+
'@type': 'Question',
|
|
36
|
+
name: item.question,
|
|
37
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
38
|
+
})),
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
42
|
+
'@context': 'https://schema.org',
|
|
43
|
+
'@type': 'HowTo',
|
|
44
|
+
name: title,
|
|
45
|
+
description,
|
|
46
|
+
step: howToData.map((s, i) => ({ '@type': 'HowToStep', position: i + 1, name: s.name, text: s.text })),
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
50
|
+
'@context': 'https://schema.org',
|
|
51
|
+
'@type': 'SoftwareApplication',
|
|
52
|
+
name: title,
|
|
53
|
+
description,
|
|
54
|
+
applicationCategory: 'UtilityApplication',
|
|
55
|
+
operatingSystem: 'All',
|
|
56
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
57
|
+
inLanguage: 'es',
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const ui: PromptLibraryUI = {
|
|
61
|
+
placeholderSearch: 'Buscar por palabra clave o etiqueta...',
|
|
62
|
+
btnNew: 'Nuevo Prompt',
|
|
63
|
+
emptyTitle: 'Tu biblioteca est\u00e1 vac\u00eda',
|
|
64
|
+
emptyDesc: 'Crea tu primer prompt y empieza a construir tu repositorio de inteligencia artificial privado.',
|
|
65
|
+
btnAddFirst: 'A\u00f1adir el primero',
|
|
66
|
+
modalTitleCreate: 'Crear Nuevo Prompt',
|
|
67
|
+
modalTitleEdit: 'Editar Prompt',
|
|
68
|
+
labelTitle: 'T\u00edtulo identificativo',
|
|
69
|
+
placeholderTitle: 'Ej: Experto en Marketing SEO',
|
|
70
|
+
labelContent: 'Instrucci\u00f3n (Prompt)',
|
|
71
|
+
placeholderContent: 'Escribe aqu\u00ed las instrucciones detalladas para la IA...',
|
|
72
|
+
hintContent: 'Recomendaci\u00f3n: usa corchetes [COMO ESTOS] para rellenar variables m\u00e1s tarde.',
|
|
73
|
+
labelTags: 'Etiquetas',
|
|
74
|
+
placeholderTags: 'Ej: marketing, seo (espacio o coma para a\u00f1adir)',
|
|
75
|
+
btnCancel: 'Cancelar',
|
|
76
|
+
btnSave: 'Guardar en Local',
|
|
77
|
+
ariaLabelStar: 'Destacar prompt',
|
|
78
|
+
ariaLabelEdit: 'Editar prompt',
|
|
79
|
+
ariaLabelShare: 'Compartir prompt',
|
|
80
|
+
ariaLabelCopy: 'Copiar prompt',
|
|
81
|
+
ariaLabelDelete: 'Eliminar prompt',
|
|
82
|
+
varsTitle: 'Variables requeridas',
|
|
83
|
+
noResults: 'No se encontraron prompts para esta b\u00fasqueda.',
|
|
84
|
+
confirmTitle: '\u00bfEliminar prompt?',
|
|
85
|
+
confirmDesc: 'Esta acci\u00f3n no se puede deshacer.',
|
|
86
|
+
btnCancelDelete: 'Cancelar',
|
|
87
|
+
btnConfirmDelete: 'Eliminar definitivamente',
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
export const content: ToolLocaleContent<PromptLibraryUI> = {
|
|
91
|
+
slug,
|
|
92
|
+
title,
|
|
93
|
+
description,
|
|
94
|
+
ui,
|
|
95
|
+
faqTitle: 'Preguntas Frecuentes',
|
|
96
|
+
faq: faqData,
|
|
97
|
+
bibliographyTitle: 'Referencias sobre Prompt Engineering',
|
|
98
|
+
bibliography: [
|
|
99
|
+
{ name: 'Prompt Engineering Guide (DAIR.AI)', url: 'https://www.promptingguide.ai/' },
|
|
100
|
+
{ name: 'Qu\u00e9 es prompt engineering (Google Cloud)', url: 'https://cloud.google.com/discover/what-is-prompt-engineering' },
|
|
101
|
+
],
|
|
102
|
+
howTo: howToData,
|
|
103
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
104
|
+
seo: [
|
|
105
|
+
{ type: 'title', text: '\u00bfPor qu\u00e9 necesitas una Biblioteca de Prompts?', level: 2 },
|
|
106
|
+
{
|
|
107
|
+
type: 'paragraph',
|
|
108
|
+
html: 'Si trabajas habitualmente con herramientas de inteligencia artificial como ChatGPT, Claude o Midjourney, seguramente te habrás encontrado repitiendo las mismas instrucciones. Una <strong>biblioteca de prompts</strong> es la solución definitiva para dejar de perder tiempo reescribiendo tus comandos favoritos.',
|
|
109
|
+
},
|
|
110
|
+
{ type: 'title', text: 'Ventajas de organizar tus prompts', level: 3 },
|
|
111
|
+
{
|
|
112
|
+
type: 'list',
|
|
113
|
+
items: [
|
|
114
|
+
'<strong>B\u00fasqueda instant\u00e1nea:</strong> Encuentra esa instrucci\u00f3n espec\u00edfica que utilizaste hace meses con una simple b\u00fasqueda por texto.',
|
|
115
|
+
'<strong>Clasificaci\u00f3n por etiquetas:</strong> Etiqueta tus utilidades como "marketing", "programaci\u00f3n" o "copywriting" para filtrar r\u00e1pidamente.',
|
|
116
|
+
'<strong>Copiado r\u00e1pido:</strong> Con un solo clic, puedes copiar el texto completo al portapapeles.',
|
|
117
|
+
'<strong>Privacidad total:</strong> Todos tus datos se guardan de forma local en tu navegador mediante localStorage.',
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
{ type: 'title', text: 'Variables en tus prompts', level: 3 },
|
|
121
|
+
{
|
|
122
|
+
type: 'paragraph',
|
|
123
|
+
html: 'Usa la notaci\u00f3n <strong>[VARIABLE]</strong> en tus prompts para crear campos rellenables din\u00e1micamente. Cuando abras la tarjeta, aparecer\u00e1n inputs para cada variable definida. El prompt se copia con los valores rellenos, listo para pegar en tu IA.',
|
|
124
|
+
},
|
|
125
|
+
{ type: 'title', text: 'Compartir prompts', level: 3 },
|
|
126
|
+
{
|
|
127
|
+
type: 'paragraph',
|
|
128
|
+
html: 'Cada prompt puede compartirse mediante una URL. El bot\u00f3n de compartir genera un enlace que, al abrirse, muestra el formulario de creaci\u00f3n pre-rellenado con el contenido del prompt.',
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { PromptLibraryUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'bibliotheque-prompts';
|
|
6
|
+
const title = 'Biblioth\u00e8que de Prompts IA';
|
|
7
|
+
const description = 'Organisez, \u00e9tiquetez et sauvegardez vos prompts ChatGPT, Midjourney et Claude en priv\u00e9. Votre propre banque de prompts dans localStorage.';
|
|
8
|
+
|
|
9
|
+
const faqData = [
|
|
10
|
+
{
|
|
11
|
+
question: 'O\u00f9 sont sauvegard\u00e9s mes prompts?',
|
|
12
|
+
answer: 'Vos prompts sont sauvegard\u00e9s exclusivement dans le stockage local de votre navigateur (localStorage). Nous n\'utilisons pas de serveurs externes, ce qui signifie que vos donn\u00e9es sont 100% priv\u00e9es.',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: 'Que se passe-t-il si j\'efface les cookies ou l\'historique du navigateur?',
|
|
16
|
+
answer: 'Si vous effacez les donn\u00e9es du site ou le stockage local de votre navigateur, vous perdrez vos prompts sauvegard\u00e9s. Nous vous recommandons de faire des sauvegardes si vous nettoyez fr\u00e9quemment votre navigateur.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'Puis-je utiliser cet outil pour Midjourney, ChatGPT ou DALL-E?',
|
|
20
|
+
answer: 'Oui, il est compatible avec tout type d\'instruction IA. Vous pouvez cr\u00e9er des \u00e9tiquettes sp\u00e9cifiques pour organiser vos commandes et les copier facilement dans votre outil IA pr\u00e9f\u00e9r\u00e9.',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const howToData = [
|
|
25
|
+
{ name: 'Cr\u00e9er un prompt', text: 'Cliquez sur le bouton Nouveau Prompt et entrez le titre et l\'instruction.' },
|
|
26
|
+
{ name: 'Ajouter des \u00e9tiquettes', text: 'Tapez des \u00e9tiquettes s\u00e9par\u00e9es par un espace ou une virgule pour classer vos prompts.' },
|
|
27
|
+
{ name: 'Utiliser des variables', text: 'Utilisez des crochets [COMME \u00c7A] dans le texte pour cr\u00e9er des champs \u00e0 remplir sur la carte.' },
|
|
28
|
+
{ name: 'Copier et partager', text: 'Copiez dans le presse-papiers en un clic ou partagez un lien direct avec le bouton partager.' },
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
32
|
+
'@context': 'https://schema.org',
|
|
33
|
+
'@type': 'FAQPage',
|
|
34
|
+
mainEntity: faqData.map((item) => ({
|
|
35
|
+
'@type': 'Question',
|
|
36
|
+
name: item.question,
|
|
37
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
38
|
+
})),
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
42
|
+
'@context': 'https://schema.org',
|
|
43
|
+
'@type': 'HowTo',
|
|
44
|
+
name: title,
|
|
45
|
+
description,
|
|
46
|
+
step: howToData.map((s, i) => ({ '@type': 'HowToStep', position: i + 1, name: s.name, text: s.text })),
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
50
|
+
'@context': 'https://schema.org',
|
|
51
|
+
'@type': 'SoftwareApplication',
|
|
52
|
+
name: title,
|
|
53
|
+
description,
|
|
54
|
+
applicationCategory: 'UtilityApplication',
|
|
55
|
+
operatingSystem: 'All',
|
|
56
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
57
|
+
inLanguage: 'fr',
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const ui: PromptLibraryUI = {
|
|
61
|
+
placeholderSearch: 'Rechercher par mot cl\u00e9 ou \u00e9tiquette...',
|
|
62
|
+
btnNew: 'Nouveau Prompt',
|
|
63
|
+
emptyTitle: 'Votre biblioth\u00e8que est vide',
|
|
64
|
+
emptyDesc: 'Cr\u00e9ez votre premier prompt et commencez \u00e0 construire votre r\u00e9f\u00e9rentiel IA priv\u00e9.',
|
|
65
|
+
btnAddFirst: 'Ajouter le premier',
|
|
66
|
+
modalTitleCreate: 'Cr\u00e9er un Nouveau Prompt',
|
|
67
|
+
modalTitleEdit: 'Modifier le Prompt',
|
|
68
|
+
labelTitle: 'Titre identificateur',
|
|
69
|
+
placeholderTitle: 'Ex: Expert en Marketing SEO',
|
|
70
|
+
labelContent: 'Instruction (Prompt)',
|
|
71
|
+
placeholderContent: 'R\u00e9digez ici les instructions d\u00e9taill\u00e9es pour l\'IA...',
|
|
72
|
+
hintContent: 'Conseil: utilisez des crochets [COMME CEUX-CI] pour remplir des variables plus tard.',
|
|
73
|
+
labelTags: '\u00c9tiquettes',
|
|
74
|
+
placeholderTags: 'Ex: marketing, seo (espace ou virgule pour ajouter)',
|
|
75
|
+
btnCancel: 'Annuler',
|
|
76
|
+
btnSave: 'Sauvegarder en Local',
|
|
77
|
+
ariaLabelStar: 'Mettre en favori',
|
|
78
|
+
ariaLabelEdit: 'Modifier le prompt',
|
|
79
|
+
ariaLabelShare: 'Partager le prompt',
|
|
80
|
+
ariaLabelCopy: 'Copier le prompt',
|
|
81
|
+
ariaLabelDelete: 'Supprimer le prompt',
|
|
82
|
+
varsTitle: 'Variables requises',
|
|
83
|
+
noResults: 'Aucun prompt trouv\u00e9 pour cette recherche.',
|
|
84
|
+
confirmTitle: 'Supprimer le prompt?',
|
|
85
|
+
confirmDesc: 'Cette action ne peut pas \u00eatre annul\u00e9e.',
|
|
86
|
+
btnCancelDelete: 'Annuler',
|
|
87
|
+
btnConfirmDelete: 'Supprimer d\u00e9finitivement',
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
export const content: ToolLocaleContent<PromptLibraryUI> = {
|
|
91
|
+
slug,
|
|
92
|
+
title,
|
|
93
|
+
description,
|
|
94
|
+
ui,
|
|
95
|
+
faqTitle: 'Questions Fr\u00e9quentes',
|
|
96
|
+
faq: faqData,
|
|
97
|
+
bibliographyTitle: 'R\u00e9f\u00e9rences sur le Prompt Engineering',
|
|
98
|
+
bibliography: [
|
|
99
|
+
{ name: 'Prompt Engineering Guide (DAIR.AI)', url: 'https://www.promptingguide.ai/' },
|
|
100
|
+
{ name: 'Qu\'est-ce que le prompt engineering (Google Cloud)', url: 'https://cloud.google.com/discover/what-is-prompt-engineering' },
|
|
101
|
+
],
|
|
102
|
+
howTo: howToData,
|
|
103
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
104
|
+
seo: [
|
|
105
|
+
{ type: 'title', text: 'Pourquoi avez-vous besoin d\'une Biblioth\u00e8que de Prompts?', level: 2 },
|
|
106
|
+
{
|
|
107
|
+
type: 'paragraph',
|
|
108
|
+
html: 'Si vous travaillez r\u00e9guli\u00e8rement avec des outils d\'IA comme ChatGPT, Claude ou Midjourney, vous vous \u00eates probablement retrouv\u00e9 \u00e0 r\u00e9p\u00e9ter les m\u00eames instructions. Une <strong>biblioth\u00e8que de prompts</strong> est la solution d\u00e9finitive pour arr\u00eater de perdre du temps \u00e0 r\u00e9\u00e9crire vos commandes favorites.',
|
|
109
|
+
},
|
|
110
|
+
{ type: 'title', text: 'Avantages d\'organiser vos prompts', level: 3 },
|
|
111
|
+
{
|
|
112
|
+
type: 'list',
|
|
113
|
+
items: [
|
|
114
|
+
'<strong>Recherche instantan\u00e9e:</strong> Trouvez cette instruction sp\u00e9cifique que vous avez utilis\u00e9e il y a des mois avec une simple recherche textuelle.',
|
|
115
|
+
'<strong>Classification par \u00e9tiquettes:</strong> \u00c9tiquetez vos prompts comme "marketing", "programmation" ou "copywriting" pour filtrer rapidement.',
|
|
116
|
+
'<strong>Copie en un clic:</strong> Copiez le texte complet dans le presse-papiers en un seul clic.',
|
|
117
|
+
'<strong>Confidentialit\u00e9 totale:</strong> Toutes vos donn\u00e9es sont stock\u00e9es localement dans votre navigateur via localStorage.',
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
{ type: 'title', text: 'Variables dans vos prompts', level: 3 },
|
|
121
|
+
{
|
|
122
|
+
type: 'paragraph',
|
|
123
|
+
html: 'Utilisez la notation <strong>[VARIABLE]</strong> dans vos prompts pour cr\u00e9er des champs \u00e0 remplir dynamiquement. Quand vous ouvrez une carte, des champs apparaissent pour chaque variable d\u00e9finie.',
|
|
124
|
+
},
|
|
125
|
+
],
|
|
126
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { DeveloperToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
|
|
2
|
+
import PromptLibraryComponent from './component.astro';
|
|
3
|
+
import PromptLibrarySEO from './seo.astro';
|
|
4
|
+
import PromptLibraryBibliography from './bibliography.astro';
|
|
5
|
+
import type { PromptLibraryUI } from './ui';
|
|
6
|
+
|
|
7
|
+
export type PromptLibraryLocaleContent = ToolLocaleContent<PromptLibraryUI>;
|
|
8
|
+
|
|
9
|
+
import { content as es } from './i18n/es';
|
|
10
|
+
import { content as en } from './i18n/en';
|
|
11
|
+
import { content as fr } from './i18n/fr';
|
|
12
|
+
|
|
13
|
+
export const promptLibrary: DeveloperToolEntry<PromptLibraryUI> = {
|
|
14
|
+
id: 'prompt-library',
|
|
15
|
+
icons: {
|
|
16
|
+
bg: 'mdi:robot',
|
|
17
|
+
fg: 'mdi:text-box-multiple',
|
|
18
|
+
},
|
|
19
|
+
i18n: {
|
|
20
|
+
es: async () => es,
|
|
21
|
+
en: async () => en,
|
|
22
|
+
fr: async () => fr,
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export { PromptLibraryComponent, PromptLibrarySEO, PromptLibraryBibliography };
|
|
27
|
+
|
|
28
|
+
export const PROMPT_LIBRARY_TOOL: ToolDefinition = {
|
|
29
|
+
entry: promptLibrary,
|
|
30
|
+
Component: PromptLibraryComponent,
|
|
31
|
+
SEOComponent: PromptLibrarySEO,
|
|
32
|
+
BibliographyComponent: PromptLibraryBibliography,
|
|
33
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } 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 && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface PromptLibraryUI extends Record<string, string> {
|
|
2
|
+
placeholderSearch: string;
|
|
3
|
+
btnNew: string;
|
|
4
|
+
emptyTitle: string;
|
|
5
|
+
emptyDesc: string;
|
|
6
|
+
btnAddFirst: string;
|
|
7
|
+
modalTitleCreate: string;
|
|
8
|
+
modalTitleEdit: string;
|
|
9
|
+
labelTitle: string;
|
|
10
|
+
placeholderTitle: string;
|
|
11
|
+
labelContent: string;
|
|
12
|
+
placeholderContent: string;
|
|
13
|
+
hintContent: string;
|
|
14
|
+
labelTags: string;
|
|
15
|
+
placeholderTags: string;
|
|
16
|
+
btnCancel: string;
|
|
17
|
+
btnSave: string;
|
|
18
|
+
ariaLabelStar: string;
|
|
19
|
+
ariaLabelEdit: string;
|
|
20
|
+
ariaLabelShare: string;
|
|
21
|
+
ariaLabelCopy: string;
|
|
22
|
+
ariaLabelDelete: string;
|
|
23
|
+
varsTitle: string;
|
|
24
|
+
noResults: string;
|
|
25
|
+
confirmTitle: string;
|
|
26
|
+
confirmDesc: string;
|
|
27
|
+
btnCancelDelete: string;
|
|
28
|
+
btnConfirmDelete: string;
|
|
29
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { readabilityCalculator } 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 readabilityCalculator.i18n[locale]?.();
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
{content && <SharedBibliography links={content.bibliography} />}
|