@jjlmoya/utils-creative 1.26.0 → 1.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/package.json +2 -2
  2. package/src/category/i18n/de.ts +2 -2
  3. package/src/category/i18n/en.ts +2 -2
  4. package/src/category/i18n/es.ts +2 -2
  5. package/src/category/i18n/fr.ts +2 -2
  6. package/src/category/i18n/id.ts +2 -2
  7. package/src/category/i18n/it.ts +2 -2
  8. package/src/category/i18n/ja.ts +2 -2
  9. package/src/category/i18n/ko.ts +2 -2
  10. package/src/category/i18n/nl.ts +2 -2
  11. package/src/category/i18n/pl.ts +2 -2
  12. package/src/category/i18n/pt.ts +2 -2
  13. package/src/category/i18n/ru.ts +2 -2
  14. package/src/category/i18n/sv.ts +2 -2
  15. package/src/category/i18n/tr.ts +2 -2
  16. package/src/category/i18n/zh.ts +2 -2
  17. package/src/category/seo.astro +1 -1
  18. package/src/components/PreviewNavSidebar.astro +1 -1
  19. package/src/components/PreviewToolbar.astro +1 -1
  20. package/src/env.d.ts +1 -1
  21. package/src/pages/index.astro +1 -1
  22. package/src/tests/bibliography_wellformed_export.test.ts +46 -0
  23. package/src/tests/category_seo_quality.test.ts +74 -0
  24. package/src/tests/faq_count.test.ts +1 -1
  25. package/src/tests/mocks/astro_mock.js +1 -1
  26. package/src/tests/no_h1_in_components.test.ts +1 -1
  27. package/src/tests/seo_parity.test.ts +2 -2
  28. package/src/tests/seo_translation_completeness.test.ts +69 -0
  29. package/src/tests/seo_wellformed_export.test.ts +65 -0
  30. package/src/tests/tool_validation.test.ts +17 -17
  31. package/src/tool/bead-pattern-generator/bibliography.astro +8 -8
  32. package/src/tool/bead-pattern-generator/i18n/de.ts +111 -111
  33. package/src/tool/bead-pattern-generator/i18n/en.ts +111 -111
  34. package/src/tool/bead-pattern-generator/i18n/es.ts +104 -104
  35. package/src/tool/bead-pattern-generator/i18n/fr.ts +111 -111
  36. package/src/tool/bead-pattern-generator/i18n/id.ts +111 -111
  37. package/src/tool/bead-pattern-generator/i18n/it.ts +111 -111
  38. package/src/tool/bead-pattern-generator/i18n/ja.ts +111 -111
  39. package/src/tool/bead-pattern-generator/i18n/ko.ts +111 -111
  40. package/src/tool/bead-pattern-generator/i18n/nl.ts +111 -111
  41. package/src/tool/bead-pattern-generator/i18n/pl.ts +111 -111
  42. package/src/tool/bead-pattern-generator/i18n/pt.ts +111 -111
  43. package/src/tool/bead-pattern-generator/i18n/ru.ts +111 -111
  44. package/src/tool/bead-pattern-generator/i18n/sv.ts +111 -111
  45. package/src/tool/bead-pattern-generator/i18n/tr.ts +111 -111
  46. package/src/tool/bead-pattern-generator/i18n/zh.ts +111 -111
  47. package/src/tool/bead-pattern-generator/seo.astro +19 -19
  48. package/src/tool/dice-roller/bibliography.astro +8 -8
  49. package/src/tool/dice-roller/i18n/de.ts +134 -134
  50. package/src/tool/dice-roller/i18n/en.ts +134 -134
  51. package/src/tool/dice-roller/i18n/es.ts +125 -125
  52. package/src/tool/dice-roller/i18n/fr.ts +134 -134
  53. package/src/tool/dice-roller/i18n/id.ts +134 -134
  54. package/src/tool/dice-roller/i18n/it.ts +134 -134
  55. package/src/tool/dice-roller/i18n/ja.ts +134 -134
  56. package/src/tool/dice-roller/i18n/ko.ts +134 -134
  57. package/src/tool/dice-roller/i18n/nl.ts +134 -134
  58. package/src/tool/dice-roller/i18n/pl.ts +134 -134
  59. package/src/tool/dice-roller/i18n/pt.ts +134 -134
  60. package/src/tool/dice-roller/i18n/ru.ts +134 -134
  61. package/src/tool/dice-roller/i18n/sv.ts +134 -134
  62. package/src/tool/dice-roller/i18n/tr.ts +134 -134
  63. package/src/tool/dice-roller/i18n/zh.ts +134 -134
  64. package/src/tool/dice-roller/seo.astro +15 -15
  65. package/src/tool/excuse-generator/bibliography.astro +8 -8
  66. package/src/tool/excuse-generator/i18n/de.ts +120 -120
  67. package/src/tool/excuse-generator/i18n/en.ts +120 -120
  68. package/src/tool/excuse-generator/i18n/es.ts +118 -118
  69. package/src/tool/excuse-generator/i18n/fr.ts +120 -120
  70. package/src/tool/excuse-generator/i18n/id.ts +120 -120
  71. package/src/tool/excuse-generator/i18n/it.ts +120 -120
  72. package/src/tool/excuse-generator/i18n/ja.ts +120 -120
  73. package/src/tool/excuse-generator/i18n/ko.ts +120 -120
  74. package/src/tool/excuse-generator/i18n/nl.ts +120 -120
  75. package/src/tool/excuse-generator/i18n/pl.ts +120 -120
  76. package/src/tool/excuse-generator/i18n/pt.ts +120 -120
  77. package/src/tool/excuse-generator/i18n/ru.ts +120 -120
  78. package/src/tool/excuse-generator/i18n/sv.ts +120 -120
  79. package/src/tool/excuse-generator/i18n/tr.ts +120 -120
  80. package/src/tool/excuse-generator/i18n/zh.ts +120 -120
  81. package/src/tool/excuse-generator/seo.astro +15 -15
  82. package/src/tool/fortune-cookie/bibliography.astro +8 -8
  83. package/src/tool/fortune-cookie/i18n/de.ts +124 -124
  84. package/src/tool/fortune-cookie/i18n/en.ts +124 -124
  85. package/src/tool/fortune-cookie/i18n/es.ts +125 -125
  86. package/src/tool/fortune-cookie/i18n/fr.ts +124 -124
  87. package/src/tool/fortune-cookie/i18n/id.ts +124 -124
  88. package/src/tool/fortune-cookie/i18n/it.ts +124 -124
  89. package/src/tool/fortune-cookie/i18n/ja.ts +124 -124
  90. package/src/tool/fortune-cookie/i18n/ko.ts +124 -124
  91. package/src/tool/fortune-cookie/i18n/nl.ts +124 -124
  92. package/src/tool/fortune-cookie/i18n/pl.ts +124 -124
  93. package/src/tool/fortune-cookie/i18n/pt.ts +124 -124
  94. package/src/tool/fortune-cookie/i18n/ru.ts +124 -124
  95. package/src/tool/fortune-cookie/i18n/sv.ts +124 -124
  96. package/src/tool/fortune-cookie/i18n/tr.ts +124 -124
  97. package/src/tool/fortune-cookie/i18n/zh.ts +124 -124
  98. package/src/tool/fortune-cookie/seo.astro +15 -15
  99. package/src/tool/synesthesia-painter/bibliography.astro +8 -8
  100. package/src/tool/synesthesia-painter/i18n/de.ts +118 -118
  101. package/src/tool/synesthesia-painter/i18n/en.ts +118 -118
  102. package/src/tool/synesthesia-painter/i18n/es.ts +110 -110
  103. package/src/tool/synesthesia-painter/i18n/fr.ts +118 -118
  104. package/src/tool/synesthesia-painter/i18n/id.ts +118 -118
  105. package/src/tool/synesthesia-painter/i18n/it.ts +118 -118
  106. package/src/tool/synesthesia-painter/i18n/ja.ts +118 -118
  107. package/src/tool/synesthesia-painter/i18n/ko.ts +118 -118
  108. package/src/tool/synesthesia-painter/i18n/nl.ts +118 -118
  109. package/src/tool/synesthesia-painter/i18n/pl.ts +118 -118
  110. package/src/tool/synesthesia-painter/i18n/pt.ts +118 -118
  111. package/src/tool/synesthesia-painter/i18n/ru.ts +118 -118
  112. package/src/tool/synesthesia-painter/i18n/sv.ts +118 -118
  113. package/src/tool/synesthesia-painter/i18n/tr.ts +118 -118
  114. package/src/tool/synesthesia-painter/i18n/zh.ts +118 -118
  115. package/src/tool/synesthesia-painter/seo.astro +15 -15
  116. package/src/tool/zalgo-generator/bibliography.astro +8 -8
  117. package/src/tool/zalgo-generator/i18n/de.ts +109 -109
  118. package/src/tool/zalgo-generator/i18n/en.ts +109 -109
  119. package/src/tool/zalgo-generator/i18n/es.ts +109 -109
  120. package/src/tool/zalgo-generator/i18n/fr.ts +109 -109
  121. package/src/tool/zalgo-generator/i18n/id.ts +109 -109
  122. package/src/tool/zalgo-generator/i18n/it.ts +109 -109
  123. package/src/tool/zalgo-generator/i18n/ja.ts +109 -109
  124. package/src/tool/zalgo-generator/i18n/ko.ts +109 -109
  125. package/src/tool/zalgo-generator/i18n/nl.ts +109 -109
  126. package/src/tool/zalgo-generator/i18n/pl.ts +109 -109
  127. package/src/tool/zalgo-generator/i18n/pt.ts +109 -109
  128. package/src/tool/zalgo-generator/i18n/ru.ts +109 -109
  129. package/src/tool/zalgo-generator/i18n/sv.ts +109 -109
  130. package/src/tool/zalgo-generator/i18n/tr.ts +109 -109
  131. package/src/tool/zalgo-generator/i18n/zh.ts +109 -109
  132. package/src/tool/zalgo-generator/seo.astro +15 -15
  133. package/src/types.ts +1 -1
@@ -1,120 +1,120 @@
1
- import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
- import { bibliography } from '../bibliography';
3
- import type { ExcuseGeneratorLocaleContent } from '../index';
4
-
5
- const slug = 'smoezen-generator';
6
- const title = 'Smoezen Generator';
7
- const description = 'Semantische gokmachine om stijlvol van je verplichtingen af te komen. Genereer direct surreële en onweerlegbare smoezen.';
8
-
9
- const faq: ExcuseGeneratorLocaleContent['faq'] = [
10
- {
11
- question: 'Kan deze generator mijn huwelijk redden?',
12
- answer: 'Hoewel we geen therapeuten zijn, kan het vermijden van dat etentje met je schoonfamilie door een plausibele technische noodsituatie de spanning aanzienlijk verminderen. Gebruik met mate.'
13
- },
14
- {
15
- question: 'Waarom zulke surreële zinnen?',
16
- answer: 'De strategie is gebaseerd op cognitieve dissonantie. Als je iets saais zegt, is het controleerbaar. Als je iets absurds zegt, blokkeert de verrassing het vermogen om boos te worden.'
17
- }
18
- ];
19
-
20
- const howTo: ExcuseGeneratorLocaleContent['howTo'] = [
21
- { name: 'Genereer', text: 'Klik op de genereerknop om een nieuwe smoes te maken.' },
22
- { name: 'Kopieer', text: 'Klik op de kopieerknop om de smoes naar je klembord te kopiëren.' }
23
- ];
24
-
25
- const faqSchema: WithContext<FAQPage> = {
26
- '@context': 'https://schema.org',
27
- '@type': 'FAQPage',
28
- mainEntity: faq.map((item) => ({
29
- '@type': 'Question',
30
- name: item.question,
31
- acceptedAnswer: { '@type': 'Answer', text: item.answer },
32
- })),
33
- };
34
-
35
- const howToSchema: WithContext<HowTo> = {
36
- '@context': 'https://schema.org',
37
- '@type': 'HowTo',
38
- name: title,
39
- description,
40
- step: howTo.map((step) => ({
41
- '@type': 'HowToStep',
42
- name: step.name,
43
- text: step.text,
44
- })),
45
- };
46
-
47
- const appSchema: WithContext<SoftwareApplication> = {
48
- '@context': 'https://schema.org',
49
- '@type': 'SoftwareApplication',
50
- name: title,
51
- description,
52
- applicationCategory: 'UtilitiesApplication',
53
- operatingSystem: 'Web',
54
- offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
55
- inLanguage: 'nl',
56
- };
57
-
58
- export const content: ExcuseGeneratorLocaleContent = {
59
- slug,
60
- title,
61
- description,
62
- faqTitle: 'Veelgestelde Vragen',
63
- ui: {
64
- title: 'Surreële Smoezen Generator',
65
- description: 'De alibi-calculator van de volgende generatie.',
66
- subjectLabel: 'Onderwerp',
67
- actionLabel: 'Actie',
68
- victimLabel: 'Slachtoffer',
69
- generateBtn: 'GENEREER SMOES',
70
- copyBtn: 'Kopieer deze waanzin',
71
- copied: 'Gekopieerd!',
72
- starts: JSON.stringify([
73
- "Mijn kat", "Mijn grootmoeder", "De president", "Een alien", "Mijn buurman van de 5e verdieping",
74
- "De wifi", "Mijn horoscoop", "Een tijdreiziger", "De wasmachine", "Mijn koelkast",
75
- "De geest van Kerstmis", "Mijn schaduw", "Een ninja", "De veganistische politie", "Siri",
76
- "Mijn vleesetende plant", "De Amazon-bezorger", "Mijn boosaardige kloon", "Een tovenaar", "Godzilla"
77
- ]),
78
- middles: JSON.stringify([
79
- "heeft de oorlog verklaard aan", "heeft gegeten", "heeft ontvoerd", "heeft in brand gestoken",
80
- "organiseert een feest in", "heeft overgegeven op", "weigert te vertrekken uit",
81
- "heeft gehackt", "heeft gestolen", "is verliefd geworden op", "mediteert over",
82
- "heeft een spreuk uitgesproken over", "protesteert tegen", "heeft een sekte opgericht in",
83
- "danst samba in", "heeft een demon opgeroepen in", "heeft de toegang geblokkeerd tot",
84
- "is in goud veranderd", "probeert te verkopen", "heeft een boek geschreven over"
85
- ]),
86
- ends: JSON.stringify([
87
- "mijn huissleutels.", "mijn wil om te leven.", "de garagedeur.",
88
- "mijn lievelingsbroek.", "de router in de woonkamer.", "mijn enige paar schoenen.",
89
- "de wetten van de fysica.", "mijn waardigheid.", "de lift van het gebouw.",
90
- "mijn Netflix-account.", "mijn tandenborstel.", "mijn eigendomsbewijzen.",
91
- "mijn verzameling pogs.", "de handrem van de auto.", "mijn verlangen om te socialiseren.",
92
- "mijn koffievoorraad.", "de toiletbril.", "de afstandsbediening van de tv.",
93
- "mijn gelukssokken.", "de westerse beschaving."
94
- ]),
95
- faqTitle: 'FAQ',
96
- bibliographyTitle: 'Referenties'
97
- },
98
- seo: [
99
- { type: 'title', text: 'De wetenschappelijke kunst van de perfecte smoes', level: 2 },
100
- { type: 'paragraph', html: 'We leven in de tijd van hyperconnectiviteit. Je telefoon trilt, je horloge geeft meldingen en je sociale agenda ziet eruit als een spelletje Tetris dat op het punt staat te verliezen. De druk om op alles "ja" te zeggen heeft een epidemie van sociale uitputting veroorzaakt.' },
101
- { type: 'title', text: 'De Renaissance van JOMO (Joy of Missing Out)', level: 3 },
102
- { type: 'paragraph', html: 'Waar FOMO (Fear of Missing Out) het afgelopen decennium domineerde, pleiten digitale welzijnsexperts nu voor <strong>JOMO: de vreugde van het missen</strong>. Het gaat niet om isolatie, maar om intentionaliteit.' },
103
- { type: 'tip', title: 'De formule voor het onweerlegbare alibi', html: '<strong>Het gedissocieerde onderwerp:</strong> jij bent nooit de dader. Het is "de wifi", "mijn kat", "het universum". Verplaats de schuld naar een externe entiteit.<br><strong>De hyperbolische actie:</strong> de situatie moet absurd of technisch genoeg zijn zodat niemand naar details vraagt.<br><strong>De fysieke blokkade:</strong> de uiteindelijke uitkomst moet binair zijn: of ik ga, of ik blijf thuis.' },
104
- { type: 'title', text: 'Een korte geschiedenis van de smoes', level: 3 },
105
- { type: 'list', items: [
106
- '<strong>Middeleeuwen:</strong> "Mijn paard is een hoefijzer verloren" (een tijdloze klassieker).',
107
- '<strong>Industriële Revolutie:</strong> "De stoommachine is oververhit".',
108
- '<strong>Digitale Tijdperk:</strong> "Mijn internet viel uit midden in een update".',
109
- ]},
110
- { type: 'proscons', items: [
111
- { pro: 'Verlicht direct de sociale druk', con: 'Overmatig gebruik schaadt het vertrouwen' },
112
- { pro: 'Beschermt je energie en grenzen', con: 'Kan schuldgevoel opwekken bij onzorgvuldig gebruik' },
113
- { pro: 'Creatieve en humoristische toon neemt de spanning weg', con: 'Niet geschikt voor formele of professionele contexten' },
114
- ]},
115
- ],
116
- faq,
117
- bibliography,
118
- howTo,
119
- schemas: [faqSchema as any, howToSchema as any, appSchema],
120
- };
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
3
+ import type { ExcuseGeneratorLocaleContent } from '../index';
4
+
5
+ const slug = 'smoezen-generator';
6
+ const title = 'Smoezen Generator';
7
+ const description = 'Semantische gokmachine om stijlvol van je verplichtingen af te komen. Genereer direct surreële en onweerlegbare smoezen.';
8
+
9
+ const faq: ExcuseGeneratorLocaleContent['faq'] = [
10
+ {
11
+ question: 'Kan deze generator mijn huwelijk redden?',
12
+ answer: 'Hoewel we geen therapeuten zijn, kan het vermijden van dat etentje met je schoonfamilie door een plausibele technische noodsituatie de spanning aanzienlijk verminderen. Gebruik met mate.'
13
+ },
14
+ {
15
+ question: 'Waarom zulke surreële zinnen?',
16
+ answer: 'De strategie is gebaseerd op cognitieve dissonantie. Als je iets saais zegt, is het controleerbaar. Als je iets absurds zegt, blokkeert de verrassing het vermogen om boos te worden.'
17
+ }
18
+ ];
19
+
20
+ const howTo: ExcuseGeneratorLocaleContent['howTo'] = [
21
+ { name: 'Genereer', text: 'Klik op de genereerknop om een nieuwe smoes te maken.' },
22
+ { name: 'Kopieer', text: 'Klik op de kopieerknop om de smoes naar je klembord te kopiëren.' }
23
+ ];
24
+
25
+ const faqSchema: WithContext<FAQPage> = {
26
+ '@context': 'https://schema.org',
27
+ '@type': 'FAQPage',
28
+ mainEntity: faq.map((item) => ({
29
+ '@type': 'Question',
30
+ name: item.question,
31
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
32
+ })),
33
+ };
34
+
35
+ const howToSchema: WithContext<HowTo> = {
36
+ '@context': 'https://schema.org',
37
+ '@type': 'HowTo',
38
+ name: title,
39
+ description,
40
+ step: howTo.map((step) => ({
41
+ '@type': 'HowToStep',
42
+ name: step.name,
43
+ text: step.text,
44
+ })),
45
+ };
46
+
47
+ const appSchema: WithContext<SoftwareApplication> = {
48
+ '@context': 'https://schema.org',
49
+ '@type': 'SoftwareApplication',
50
+ name: title,
51
+ description,
52
+ applicationCategory: 'UtilitiesApplication',
53
+ operatingSystem: 'Web',
54
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
55
+ inLanguage: 'nl',
56
+ };
57
+
58
+ export const content: ExcuseGeneratorLocaleContent = {
59
+ slug,
60
+ title,
61
+ description,
62
+ faqTitle: 'Veelgestelde Vragen',
63
+ ui: {
64
+ title: 'Surreële Smoezen Generator',
65
+ description: 'De alibi-calculator van de volgende generatie.',
66
+ subjectLabel: 'Onderwerp',
67
+ actionLabel: 'Actie',
68
+ victimLabel: 'Slachtoffer',
69
+ generateBtn: 'GENEREER SMOES',
70
+ copyBtn: 'Kopieer deze waanzin',
71
+ copied: 'Gekopieerd!',
72
+ starts: JSON.stringify([
73
+ "Mijn kat", "Mijn grootmoeder", "De president", "Een alien", "Mijn buurman van de 5e verdieping",
74
+ "De wifi", "Mijn horoscoop", "Een tijdreiziger", "De wasmachine", "Mijn koelkast",
75
+ "De geest van Kerstmis", "Mijn schaduw", "Een ninja", "De veganistische politie", "Siri",
76
+ "Mijn vleesetende plant", "De Amazon-bezorger", "Mijn boosaardige kloon", "Een tovenaar", "Godzilla"
77
+ ]),
78
+ middles: JSON.stringify([
79
+ "heeft de oorlog verklaard aan", "heeft gegeten", "heeft ontvoerd", "heeft in brand gestoken",
80
+ "organiseert een feest in", "heeft overgegeven op", "weigert te vertrekken uit",
81
+ "heeft gehackt", "heeft gestolen", "is verliefd geworden op", "mediteert over",
82
+ "heeft een spreuk uitgesproken over", "protesteert tegen", "heeft een sekte opgericht in",
83
+ "danst samba in", "heeft een demon opgeroepen in", "heeft de toegang geblokkeerd tot",
84
+ "is in goud veranderd", "probeert te verkopen", "heeft een boek geschreven over"
85
+ ]),
86
+ ends: JSON.stringify([
87
+ "mijn huissleutels.", "mijn wil om te leven.", "de garagedeur.",
88
+ "mijn lievelingsbroek.", "de router in de woonkamer.", "mijn enige paar schoenen.",
89
+ "de wetten van de fysica.", "mijn waardigheid.", "de lift van het gebouw.",
90
+ "mijn Netflix-account.", "mijn tandenborstel.", "mijn eigendomsbewijzen.",
91
+ "mijn verzameling pogs.", "de handrem van de auto.", "mijn verlangen om te socialiseren.",
92
+ "mijn koffievoorraad.", "de toiletbril.", "de afstandsbediening van de tv.",
93
+ "mijn gelukssokken.", "de westerse beschaving."
94
+ ]),
95
+ faqTitle: 'FAQ',
96
+ bibliographyTitle: 'Referenties'
97
+ },
98
+ seo: [
99
+ { type: 'title', text: 'De wetenschappelijke kunst van de perfecte smoes', level: 2 },
100
+ { type: 'paragraph', html: 'We leven in de tijd van hyperconnectiviteit. Je telefoon trilt, je horloge geeft meldingen en je sociale agenda ziet eruit als een spelletje Tetris dat op het punt staat te verliezen. De druk om op alles "ja" te zeggen heeft een epidemie van sociale uitputting veroorzaakt.' },
101
+ { type: 'title', text: 'De Renaissance van JOMO (Joy of Missing Out)', level: 3 },
102
+ { type: 'paragraph', html: 'Waar FOMO (Fear of Missing Out) het afgelopen decennium domineerde, pleiten digitale welzijnsexperts nu voor <strong>JOMO: de vreugde van het missen</strong>. Het gaat niet om isolatie, maar om intentionaliteit.' },
103
+ { type: 'tip', title: 'De formule voor het onweerlegbare alibi', html: '<strong>Het gedissocieerde onderwerp:</strong> jij bent nooit de dader. Het is "de wifi", "mijn kat", "het universum". Verplaats de schuld naar een externe entiteit.<br><strong>De hyperbolische actie:</strong> de situatie moet absurd of technisch genoeg zijn zodat niemand naar details vraagt.<br><strong>De fysieke blokkade:</strong> de uiteindelijke uitkomst moet binair zijn: of ik ga, of ik blijf thuis.' },
104
+ { type: 'title', text: 'Een korte geschiedenis van de smoes', level: 3 },
105
+ { type: 'list', items: [
106
+ '<strong>Middeleeuwen:</strong> "Mijn paard is een hoefijzer verloren" (een tijdloze klassieker).',
107
+ '<strong>Industriële Revolutie:</strong> "De stoommachine is oververhit".',
108
+ '<strong>Digitale Tijdperk:</strong> "Mijn internet viel uit midden in een update".',
109
+ ]},
110
+ { type: 'proscons', items: [
111
+ { pro: 'Verlicht direct de sociale druk', con: 'Overmatig gebruik schaadt het vertrouwen' },
112
+ { pro: 'Beschermt je energie en grenzen', con: 'Kan schuldgevoel opwekken bij onzorgvuldig gebruik' },
113
+ { pro: 'Creatieve en humoristische toon neemt de spanning weg', con: 'Niet geschikt voor formele of professionele contexten' },
114
+ ]},
115
+ ],
116
+ faq,
117
+ bibliography,
118
+ howTo,
119
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
120
+ };
@@ -1,120 +1,120 @@
1
- import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
- import { bibliography } from '../bibliography';
3
- import type { ExcuseGeneratorLocaleContent } from '../index';
4
-
5
- const slug = 'generator-wymowek';
6
- const title = 'Generator Wymówek';
7
- const description = 'Semantyczna maszyna losująca, która pozwoli Ci stylowo wymigać się od zobowiązań. Błyskawicznie generuj surrealistyczne i niepodważalne wymówki.';
8
-
9
- const faq: ExcuseGeneratorLocaleContent['faq'] = [
10
- {
11
- question: 'Czy ten generator może uratować moje małżeństwo?',
12
- answer: 'Choć nie jesteśmy terapeutami, uniknięcie obiadu z teściami dzięki wiarygodnej awarii technicznej może znacząco obniżyć napięcie. Używaj odpowiedzialnie.'
13
- },
14
- {
15
- question: 'Dlaczego zdania są tak surrealistyczne?',
16
- answer: 'Strategia opiera się na dysonansie poznawczym. Jeśli powiesz coś nudnego, można to zweryfikować. Jeśli powiesz coś absurdalnego, zdziwienie blokuje zdolność do gniewu.'
17
- }
18
- ];
19
-
20
- const howTo: ExcuseGeneratorLocaleContent['howTo'] = [
21
- { name: 'Generuj', text: 'Kliknij przycisk generowania, aby stworzyć nową wymówkę.' },
22
- { name: 'Kopiuj', text: 'Kliknij przycisk kopiowania, aby przenieść wymówkę do schowka.' }
23
- ];
24
-
25
- const faqSchema: WithContext<FAQPage> = {
26
- '@context': 'https://schema.org',
27
- '@type': 'FAQPage',
28
- mainEntity: faq.map((item) => ({
29
- '@type': 'Question',
30
- name: item.question,
31
- acceptedAnswer: { '@type': 'Answer', text: item.answer },
32
- })),
33
- };
34
-
35
- const howToSchema: WithContext<HowTo> = {
36
- '@context': 'https://schema.org',
37
- '@type': 'HowTo',
38
- name: title,
39
- description,
40
- step: howTo.map((step) => ({
41
- '@type': 'HowToStep',
42
- name: step.name,
43
- text: step.text,
44
- })),
45
- };
46
-
47
- const appSchema: WithContext<SoftwareApplication> = {
48
- '@context': 'https://schema.org',
49
- '@type': 'SoftwareApplication',
50
- name: title,
51
- description,
52
- applicationCategory: 'UtilitiesApplication',
53
- operatingSystem: 'Web',
54
- offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
55
- inLanguage: 'pl',
56
- };
57
-
58
- export const content: ExcuseGeneratorLocaleContent = {
59
- slug,
60
- title,
61
- description,
62
- faqTitle: 'Najczęściej Zadawane Pytania',
63
- ui: {
64
- title: 'Surrealistyczny Generator Wymówek',
65
- description: 'Kalkulator alibi nowej generacji.',
66
- subjectLabel: 'Podmiot',
67
- actionLabel: 'Akcja',
68
- victimLabel: 'Ofiara',
69
- generateBtn: 'GENERUJ WYMÓWKĘ',
70
- copyBtn: 'Skopiuj to szaleństwo',
71
- copied: 'Skopiowano!',
72
- starts: JSON.stringify([
73
- "Mój kot", "Moja babcia", "Prezydent", "Obcy", "Mój sąsiad z 5. piętra",
74
- "Wifi", "Mój horoskop", "Podróżnik w czasie", "Pralka", "Moja lodówka",
75
- "Duch Świąt", "Mój cień", "Ninja", "Policja wegańska", "Siri",
76
- "Moja roślina mięsożerna", "Kurier Amazona", "Mój zły klon", "Czarodziej", "Godzilla"
77
- ]),
78
- middles: JSON.stringify([
79
- "wypowiedział wojnę", "zjadł", "porwał", "podpalił",
80
- "organizuje imprezę w", "zwymiotował na", "odmawia opuszczenia",
81
- "zhakował", "ukradł", "zakochał się w", "medytuje nad",
82
- "rzucił zaklęcie na", "protestuje przeciwko", "założył kult w",
83
- "tańczy sambę w", "przywołał demona w", "zablokował dostęp do",
84
- "zamienił się w złoto", "próbuje sprzedać", "napisał książkę o"
85
- ]),
86
- ends: JSON.stringify([
87
- "moich kluczach do domu.", "mojej woli życia.", "bramie garażowej.",
88
- "moich ulubionych spodniach.", "ruterze w salonie.", "mojej jedynej parze butów.",
89
- "prawach fizyki.", "mojej godności.", "windzie w budynku.",
90
- "moim koncie Netflix.", "mojej szczoteczce do zębów.", "akcie własności domu.",
91
- "mojej kolekcji kapsli.", "hamulcu ręcznym w aucie.", "mojej chęci socjalizacji.",
92
- "zapasach kawy.", "desce sedesowej.", "pilocie do TV.",
93
- "moich szczęśliwych skarpetkach.", "cywilizacji zachodniej."
94
- ]),
95
- faqTitle: 'FAQ',
96
- bibliographyTitle: 'Źródła'
97
- },
98
- seo: [
99
- { type: 'title', text: 'Naukowa sztuka wymówki doskonałej', level: 2 },
100
- { type: 'paragraph', html: 'Żyjemy w erze hiperłączności. Twój telefon wibruje, zegarek wysyła powiadomienia, a Twój kalendarz towarzyski wygląda jak partia Tetrisa tuż przed przegraną. Presja, by na wszystko mówić \"tak\", stworzyła epidemię wyczerpania społecznego.' },
101
- { type: 'title', text: 'Renesans JOMO (Joy of Missing Out)', level: 3 },
102
- { type: 'paragraph', html: 'Podczas gdy FOMO (Fear of Missing Out) dominowało w ostatniej dekadzie, eksperci od cyfrowego dobrostanu promują teraz <strong>JOMO: Radość z tego, że coś nas omija</strong>. Nie chodzi o izolację, ale o intencjonalność.' },
103
- { type: 'tip', title: 'Formuła alibi nie do podważenia', html: '<strong>Podmiot zdystansowany:</strong> Nigdy nie Ty jesteś winny. To \"wifi\", \"mój kot\", \"wszechświat\". Przerzuć winę na byt zewnętrzny.<br><strong>Hiperboliczna akcja:</strong> Sytuacja musi być wystarczająco absurdalna lub techniczna, by nikt nie dopytywał o szczegóły.<br><strong>Blokada fizyczna:</strong> Wynik końcowy musi być binarny: albo idę, albo zostaję w domu.' },
104
- { type: 'title', text: 'Krótka historia wymówki', level: 3 },
105
- { type: 'list', items: [
106
- '<strong>Średniowiecze:</strong> \"Mój koń zgubił podkowę\" (ponadczasowa klasyka).',
107
- '<strong>Rewolucja przemysłowa:</strong> \"Maszyna parowa się przegrzała\".',
108
- '<strong>Era cyfrowa:</strong> \"Internet padł mi w samym środku aktualizacji\".',
109
- ]},
110
- { type: 'proscons', items: [
111
- { pro: 'Błyskawicznie łagodzi presję społeczną', con: 'Nadużywanie niszczy zaufanie' },
112
- { pro: 'Chroni Twoją energię i granice', con: 'Może budzić poczucie winy, jeśli jest używane bezmyślnie' },
113
- { pro: 'Kreatywny i humorystyczny ton rozładowuje napięcie', con: 'Nie nadaje się do kontekstów formalnych lub zawodowych' },
114
- ]},
115
- ],
116
- faq,
117
- bibliography,
118
- howTo,
119
- schemas: [faqSchema as any, howToSchema as any, appSchema],
120
- };
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import { bibliography } from '../bibliography';
3
+ import type { ExcuseGeneratorLocaleContent } from '../index';
4
+
5
+ const slug = 'generator-wymowek';
6
+ const title = 'Generator Wymówek';
7
+ const description = 'Semantyczna maszyna losująca, która pozwoli Ci stylowo wymigać się od zobowiązań. Błyskawicznie generuj surrealistyczne i niepodważalne wymówki.';
8
+
9
+ const faq: ExcuseGeneratorLocaleContent['faq'] = [
10
+ {
11
+ question: 'Czy ten generator może uratować moje małżeństwo?',
12
+ answer: 'Choć nie jesteśmy terapeutami, uniknięcie obiadu z teściami dzięki wiarygodnej awarii technicznej może znacząco obniżyć napięcie. Używaj odpowiedzialnie.'
13
+ },
14
+ {
15
+ question: 'Dlaczego zdania są tak surrealistyczne?',
16
+ answer: 'Strategia opiera się na dysonansie poznawczym. Jeśli powiesz coś nudnego, można to zweryfikować. Jeśli powiesz coś absurdalnego, zdziwienie blokuje zdolność do gniewu.'
17
+ }
18
+ ];
19
+
20
+ const howTo: ExcuseGeneratorLocaleContent['howTo'] = [
21
+ { name: 'Generuj', text: 'Kliknij przycisk generowania, aby stworzyć nową wymówkę.' },
22
+ { name: 'Kopiuj', text: 'Kliknij przycisk kopiowania, aby przenieść wymówkę do schowka.' }
23
+ ];
24
+
25
+ const faqSchema: WithContext<FAQPage> = {
26
+ '@context': 'https://schema.org',
27
+ '@type': 'FAQPage',
28
+ mainEntity: faq.map((item) => ({
29
+ '@type': 'Question',
30
+ name: item.question,
31
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
32
+ })),
33
+ };
34
+
35
+ const howToSchema: WithContext<HowTo> = {
36
+ '@context': 'https://schema.org',
37
+ '@type': 'HowTo',
38
+ name: title,
39
+ description,
40
+ step: howTo.map((step) => ({
41
+ '@type': 'HowToStep',
42
+ name: step.name,
43
+ text: step.text,
44
+ })),
45
+ };
46
+
47
+ const appSchema: WithContext<SoftwareApplication> = {
48
+ '@context': 'https://schema.org',
49
+ '@type': 'SoftwareApplication',
50
+ name: title,
51
+ description,
52
+ applicationCategory: 'UtilitiesApplication',
53
+ operatingSystem: 'Web',
54
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
55
+ inLanguage: 'pl',
56
+ };
57
+
58
+ export const content: ExcuseGeneratorLocaleContent = {
59
+ slug,
60
+ title,
61
+ description,
62
+ faqTitle: 'Najczęściej Zadawane Pytania',
63
+ ui: {
64
+ title: 'Surrealistyczny Generator Wymówek',
65
+ description: 'Kalkulator alibi nowej generacji.',
66
+ subjectLabel: 'Podmiot',
67
+ actionLabel: 'Akcja',
68
+ victimLabel: 'Ofiara',
69
+ generateBtn: 'GENERUJ WYMÓWKĘ',
70
+ copyBtn: 'Skopiuj to szaleństwo',
71
+ copied: 'Skopiowano!',
72
+ starts: JSON.stringify([
73
+ "Mój kot", "Moja babcia", "Prezydent", "Obcy", "Mój sąsiad z 5. piętra",
74
+ "Wifi", "Mój horoskop", "Podróżnik w czasie", "Pralka", "Moja lodówka",
75
+ "Duch Świąt", "Mój cień", "Ninja", "Policja wegańska", "Siri",
76
+ "Moja roślina mięsożerna", "Kurier Amazona", "Mój zły klon", "Czarodziej", "Godzilla"
77
+ ]),
78
+ middles: JSON.stringify([
79
+ "wypowiedział wojnę", "zjadł", "porwał", "podpalił",
80
+ "organizuje imprezę w", "zwymiotował na", "odmawia opuszczenia",
81
+ "zhakował", "ukradł", "zakochał się w", "medytuje nad",
82
+ "rzucił zaklęcie na", "protestuje przeciwko", "założył kult w",
83
+ "tańczy sambę w", "przywołał demona w", "zablokował dostęp do",
84
+ "zamienił się w złoto", "próbuje sprzedać", "napisał książkę o"
85
+ ]),
86
+ ends: JSON.stringify([
87
+ "moich kluczach do domu.", "mojej woli życia.", "bramie garażowej.",
88
+ "moich ulubionych spodniach.", "ruterze w salonie.", "mojej jedynej parze butów.",
89
+ "prawach fizyki.", "mojej godności.", "windzie w budynku.",
90
+ "moim koncie Netflix.", "mojej szczoteczce do zębów.", "akcie własności domu.",
91
+ "mojej kolekcji kapsli.", "hamulcu ręcznym w aucie.", "mojej chęci socjalizacji.",
92
+ "zapasach kawy.", "desce sedesowej.", "pilocie do TV.",
93
+ "moich szczęśliwych skarpetkach.", "cywilizacji zachodniej."
94
+ ]),
95
+ faqTitle: 'FAQ',
96
+ bibliographyTitle: 'Źródła'
97
+ },
98
+ seo: [
99
+ { type: 'title', text: 'Naukowa sztuka wymówki doskonałej', level: 2 },
100
+ { type: 'paragraph', html: 'Żyjemy w erze hiperłączności. Twój telefon wibruje, zegarek wysyła powiadomienia, a Twój kalendarz towarzyski wygląda jak partia Tetrisa tuż przed przegraną. Presja, by na wszystko mówić \"tak\", stworzyła epidemię wyczerpania społecznego.' },
101
+ { type: 'title', text: 'Renesans JOMO (Joy of Missing Out)', level: 3 },
102
+ { type: 'paragraph', html: 'Podczas gdy FOMO (Fear of Missing Out) dominowało w ostatniej dekadzie, eksperci od cyfrowego dobrostanu promują teraz <strong>JOMO: Radość z tego, że coś nas omija</strong>. Nie chodzi o izolację, ale o intencjonalność.' },
103
+ { type: 'tip', title: 'Formuła alibi nie do podważenia', html: '<strong>Podmiot zdystansowany:</strong> Nigdy nie Ty jesteś winny. To \"wifi\", \"mój kot\", \"wszechświat\". Przerzuć winę na byt zewnętrzny.<br><strong>Hiperboliczna akcja:</strong> Sytuacja musi być wystarczająco absurdalna lub techniczna, by nikt nie dopytywał o szczegóły.<br><strong>Blokada fizyczna:</strong> Wynik końcowy musi być binarny: albo idę, albo zostaję w domu.' },
104
+ { type: 'title', text: 'Krótka historia wymówki', level: 3 },
105
+ { type: 'list', items: [
106
+ '<strong>Średniowiecze:</strong> \"Mój koń zgubił podkowę\" (ponadczasowa klasyka).',
107
+ '<strong>Rewolucja przemysłowa:</strong> \"Maszyna parowa się przegrzała\".',
108
+ '<strong>Era cyfrowa:</strong> \"Internet padł mi w samym środku aktualizacji\".',
109
+ ]},
110
+ { type: 'proscons', items: [
111
+ { pro: 'Błyskawicznie łagodzi presję społeczną', con: 'Nadużywanie niszczy zaufanie' },
112
+ { pro: 'Chroni Twoją energię i granice', con: 'Może budzić poczucie winy, jeśli jest używane bezmyślnie' },
113
+ { pro: 'Kreatywny i humorystyczny ton rozładowuje napięcie', con: 'Nie nadaje się do kontekstów formalnych lub zawodowych' },
114
+ ]},
115
+ ],
116
+ faq,
117
+ bibliography,
118
+ howTo,
119
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
120
+ };