@jjlmoya/utils-creative 1.26.0 → 1.28.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 +75 -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 = 'ausredengenerator';
6
- const title = 'Ausredengenerator';
7
- const description = 'Semantische Glücksmaschine, um Verpflichtungen mit Stil loszuwerden. Generieren Sie sofort surreale und unwiderlegbare Ausreden.';
8
-
9
- const faq: ExcuseGeneratorLocaleContent['faq'] = [
10
- {
11
- question: 'Kann dieser Generator meine Ehe retten?',
12
- answer: 'Wir sind zwar keine Therapeuten, aber das Vermeiden dieses Abendessens mit den Schwiegereltern durch einen plausiblen technischen Notfall kann die Spannungen erheblich reduzieren. Mit Verantwortung verwenden.'
13
- },
14
- {
15
- question: 'Warum solch surreale Phrasen?',
16
- answer: 'Die Strategie basiert auf kognitiver Dissonanz. Wenn man etwas Langweiliges sagt, ist es überprüfbar. Wenn man etwas Absurdes sagt, blockiert die Überraschung die Fähigkeit zur Wut.'
17
- }
18
- ];
19
-
20
- const howTo: ExcuseGeneratorLocaleContent['howTo'] = [
21
- { name: 'Generieren', text: 'Klicken Sie auf die Schaltfläche "Generieren", um eine neue Ausrede zu erstellen.' },
22
- { name: 'Kopieren', text: 'Klicken Sie auf die Schaltfläche "Kopieren", um die Ausrede in Ihre Zwischenablage zu kopieren.' }
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: 'de',
56
- };
57
-
58
- export const content: ExcuseGeneratorLocaleContent = {
59
- slug,
60
- title,
61
- description,
62
- faqTitle: 'Häufig gestellte Fragen',
63
- ui: {
64
- title: 'Surrealer Ausredengenerator',
65
- description: 'Alibi-Rechner der nächsten Generation.',
66
- subjectLabel: 'Subjekt',
67
- actionLabel: 'Aktion',
68
- victimLabel: 'Opfer',
69
- generateBtn: 'AUSREDE GENERIEREN',
70
- copyBtn: 'Diesen Wahnsinn kopieren',
71
- copied: 'Kopiert!',
72
- starts: JSON.stringify([
73
- "Meine Katze", "Meine Großmutter", "Der Präsident", "Ein Alien", "Mein Nachbar aus der 5. Etage",
74
- "Das WLAN", "Mein Horoskop", "Ein Zeitreisender", "Die Waschmaschine", "Mein Kühlschrank",
75
- "Der Geist der Weihnacht", "Mein Schatten", "Ein Ninja", "Die vegane Polizei", "Siri",
76
- "Meine fleischfressende Pflanze", "Der Amazon-Lieferant", "Mein böser Klon", "Ein Zauberer", "Godzilla"
77
- ]),
78
- middles: JSON.stringify([
79
- "hat den Krieg erklärt gegen", "hat gefressen", "hat entführt", "hat angezündet",
80
- "organisiert eine Party in", "hat sich erbrochen auf", "weigert sich zu verlassen",
81
- "hat gehackt", "hat gestohlen", "hat sich verliebt in", "meditiert über",
82
- "hat einen Zauberspruch gewirkt auf", "protestiert gegen", "hat einen Kult gegründet in",
83
- "tanzt Samba in", "hat einen Dämon beschworen in", "hat den Zugang blockiert zu",
84
- "hat sich in Gold verwandelt", "versucht zu verkaufen", "hat ein Buch geschrieben über"
85
- ]),
86
- ends: JSON.stringify([
87
- "meine Hausschlüssel.", "meinen Lebenswillen.", "das Garagentor.",
88
- "meine Lieblingshose.", "den Wohnzimmer-Router.", "mein einziges Paar Schuhe.",
89
- "die Gesetze der Physik.", "meine Würde.", "den Aufzug des Gebäudes.",
90
- "meinen Netflix-Account.", "meine Zahnbürste.", "meine Hausurkunden.",
91
- "meine Pogs-Sammlung.", "die Handbremse des Autos.", "meinen Wunsch nach Sozialkontakt.",
92
- "meinen Kaffeevorrat.", "den Toilettendeckel.", "die TV-Fernbedienung.",
93
- "meine Glückssocken.", "die westliche Zivilisation."
94
- ]),
95
- faqTitle: 'FAQ',
96
- bibliographyTitle: 'Referenzen'
97
- },
98
- seo: [
99
- { type: 'title', text: 'Die wissenschaftliche Kunst der perfekten Ausrede', level: 2 },
100
- { type: 'paragraph', html: 'Wir leben im Zeitalter der Hyperkonnektivität. Ihr Telefon vibriert, Ihre Uhr benachrichtigt Sie und Ihr Terminkalender sieht aus wie ein Tetris-Spiel, das kurz vor dem Verlieren steht. Der Druck, zu allem \"Ja\" zu sagen, hat eine Epidemie der sozialen Erschöpfung ausgelöst.' },
101
- { type: 'title', text: 'Die Renaissance von JOMO (Joy of Missing Out)', level: 3 },
102
- { type: 'paragraph', html: 'Während FOMO (Fear of Missing Out) das letzte Jahrzehnt dominierte, plädieren Experten für digitales Wohlbefinden nun für <strong>JOMO: Die Freude am Verpassen</strong>. Es geht nicht um Isolation, sondern um Intentionalität.' },
103
- { type: 'tip', title: 'Die Formel für das unwiderlegbare Alibi', html: '<strong>Das dissoziierte Subjekt:</strong> Sie sind niemals der Schuldige. Es ist \"das WLAN\", \"meine Katze\", \"das Universum\". Schieben Sie die Schuld auf eine externe Instanz.<br><strong>Die hyperbolische Aktion:</strong> Die Situation muss so absurd oder technisch sein, dass niemand nach Details fragt.<br><strong>Die physische Blockade:</strong> Das Endergebnis muss binär sein: Entweder ich gehe oder ich bleibe zu Hause.' },
104
- { type: 'title', text: 'Eine kurze Geschichte der Ausrede', level: 3 },
105
- { type: 'list', items: [
106
- '<strong>Mittelalter:</strong> \"Mein Pferd hat ein Hufeisen verloren\" (Ein zeitloser Klassiker).',
107
- '<strong>Industrielle Revolution:</strong> \"Die Dampfmaschine ist überhitzt\".',
108
- '<strong>Digitales Zeitalter:</strong> \"Mein Internet ist mitten im Update ausgefallen\".',
109
- ]},
110
- { type: 'proscons', items: [
111
- { pro: 'Befreit sofort von sozialem Druck', con: 'Übermäßiger Gebrauch untergräbt das Vertrauen' },
112
- { pro: 'Schützt Ihre Energie und Grenzen', con: 'Kann Schuldgefühle erzeugen, wenn es unvorsichtig benutzt wird' },
113
- { pro: 'Kreativer und humorvoller Ton entschärft Spannungen', con: 'Nicht für formelle oder professionelle Kontexte geeignet' },
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 = 'ausredengenerator';
6
+ const title = 'Ausredengenerator';
7
+ const description = 'Semantische Glücksmaschine, um Verpflichtungen mit Stil loszuwerden. Generieren Sie sofort surreale und unwiderlegbare Ausreden.';
8
+
9
+ const faq: ExcuseGeneratorLocaleContent['faq'] = [
10
+ {
11
+ question: 'Kann dieser Generator meine Ehe retten?',
12
+ answer: 'Wir sind zwar keine Therapeuten, aber das Vermeiden dieses Abendessens mit den Schwiegereltern durch einen plausiblen technischen Notfall kann die Spannungen erheblich reduzieren. Mit Verantwortung verwenden.'
13
+ },
14
+ {
15
+ question: 'Warum solch surreale Phrasen?',
16
+ answer: 'Die Strategie basiert auf kognitiver Dissonanz. Wenn man etwas Langweiliges sagt, ist es überprüfbar. Wenn man etwas Absurdes sagt, blockiert die Überraschung die Fähigkeit zur Wut.'
17
+ }
18
+ ];
19
+
20
+ const howTo: ExcuseGeneratorLocaleContent['howTo'] = [
21
+ { name: 'Generieren', text: 'Klicken Sie auf die Schaltfläche "Generieren", um eine neue Ausrede zu erstellen.' },
22
+ { name: 'Kopieren', text: 'Klicken Sie auf die Schaltfläche "Kopieren", um die Ausrede in Ihre Zwischenablage zu kopieren.' }
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: 'de',
56
+ };
57
+
58
+ export const content: ExcuseGeneratorLocaleContent = {
59
+ slug,
60
+ title,
61
+ description,
62
+ faqTitle: 'Häufig gestellte Fragen',
63
+ ui: {
64
+ title: 'Surrealer Ausredengenerator',
65
+ description: 'Alibi-Rechner der nächsten Generation.',
66
+ subjectLabel: 'Subjekt',
67
+ actionLabel: 'Aktion',
68
+ victimLabel: 'Opfer',
69
+ generateBtn: 'AUSREDE GENERIEREN',
70
+ copyBtn: 'Diesen Wahnsinn kopieren',
71
+ copied: 'Kopiert!',
72
+ starts: JSON.stringify([
73
+ "Meine Katze", "Meine Großmutter", "Der Präsident", "Ein Alien", "Mein Nachbar aus der 5. Etage",
74
+ "Das WLAN", "Mein Horoskop", "Ein Zeitreisender", "Die Waschmaschine", "Mein Kühlschrank",
75
+ "Der Geist der Weihnacht", "Mein Schatten", "Ein Ninja", "Die vegane Polizei", "Siri",
76
+ "Meine fleischfressende Pflanze", "Der Amazon-Lieferant", "Mein böser Klon", "Ein Zauberer", "Godzilla"
77
+ ]),
78
+ middles: JSON.stringify([
79
+ "hat den Krieg erklärt gegen", "hat gefressen", "hat entführt", "hat angezündet",
80
+ "organisiert eine Party in", "hat sich erbrochen auf", "weigert sich zu verlassen",
81
+ "hat gehackt", "hat gestohlen", "hat sich verliebt in", "meditiert über",
82
+ "hat einen Zauberspruch gewirkt auf", "protestiert gegen", "hat einen Kult gegründet in",
83
+ "tanzt Samba in", "hat einen Dämon beschworen in", "hat den Zugang blockiert zu",
84
+ "hat sich in Gold verwandelt", "versucht zu verkaufen", "hat ein Buch geschrieben über"
85
+ ]),
86
+ ends: JSON.stringify([
87
+ "meine Hausschlüssel.", "meinen Lebenswillen.", "das Garagentor.",
88
+ "meine Lieblingshose.", "den Wohnzimmer-Router.", "mein einziges Paar Schuhe.",
89
+ "die Gesetze der Physik.", "meine Würde.", "den Aufzug des Gebäudes.",
90
+ "meinen Netflix-Account.", "meine Zahnbürste.", "meine Hausurkunden.",
91
+ "meine Pogs-Sammlung.", "die Handbremse des Autos.", "meinen Wunsch nach Sozialkontakt.",
92
+ "meinen Kaffeevorrat.", "den Toilettendeckel.", "die TV-Fernbedienung.",
93
+ "meine Glückssocken.", "die westliche Zivilisation."
94
+ ]),
95
+ faqTitle: 'FAQ',
96
+ bibliographyTitle: 'Referenzen'
97
+ },
98
+ seo: [
99
+ { type: 'title', text: 'Die wissenschaftliche Kunst der perfekten Ausrede', level: 2 },
100
+ { type: 'paragraph', html: 'Wir leben im Zeitalter der Hyperkonnektivität. Ihr Telefon vibriert, Ihre Uhr benachrichtigt Sie und Ihr Terminkalender sieht aus wie ein Tetris-Spiel, das kurz vor dem Verlieren steht. Der Druck, zu allem \"Ja\" zu sagen, hat eine Epidemie der sozialen Erschöpfung ausgelöst.' },
101
+ { type: 'title', text: 'Die Renaissance von JOMO (Joy of Missing Out)', level: 3 },
102
+ { type: 'paragraph', html: 'Während FOMO (Fear of Missing Out) das letzte Jahrzehnt dominierte, plädieren Experten für digitales Wohlbefinden nun für <strong>JOMO: Die Freude am Verpassen</strong>. Es geht nicht um Isolation, sondern um Intentionalität.' },
103
+ { type: 'tip', title: 'Die Formel für das unwiderlegbare Alibi', html: '<strong>Das dissoziierte Subjekt:</strong> Sie sind niemals der Schuldige. Es ist \"das WLAN\", \"meine Katze\", \"das Universum\". Schieben Sie die Schuld auf eine externe Instanz.<br><strong>Die hyperbolische Aktion:</strong> Die Situation muss so absurd oder technisch sein, dass niemand nach Details fragt.<br><strong>Die physische Blockade:</strong> Das Endergebnis muss binär sein: Entweder ich gehe oder ich bleibe zu Hause.' },
104
+ { type: 'title', text: 'Eine kurze Geschichte der Ausrede', level: 3 },
105
+ { type: 'list', items: [
106
+ '<strong>Mittelalter:</strong> \"Mein Pferd hat ein Hufeisen verloren\" (Ein zeitloser Klassiker).',
107
+ '<strong>Industrielle Revolution:</strong> \"Die Dampfmaschine ist überhitzt\".',
108
+ '<strong>Digitales Zeitalter:</strong> \"Mein Internet ist mitten im Update ausgefallen\".',
109
+ ]},
110
+ { type: 'proscons', items: [
111
+ { pro: 'Befreit sofort von sozialem Druck', con: 'Übermäßiger Gebrauch untergräbt das Vertrauen' },
112
+ { pro: 'Schützt Ihre Energie und Grenzen', con: 'Kann Schuldgefühle erzeugen, wenn es unvorsichtig benutzt wird' },
113
+ { pro: 'Kreativer und humorvoller Ton entschärft Spannungen', con: 'Nicht für formelle oder professionelle Kontexte geeignet' },
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 = 'excuse-generator';
6
- const title = 'Excuse Generator';
7
- const description = 'Semantic gambling machine to get rid of commitments with style. Generate surreal and irrefutable excuses instantly.';
8
-
9
- const faq: ExcuseGeneratorLocaleContent['faq'] = [
10
- {
11
- question: 'Can this generator save my marriage?',
12
- answer: 'While we are not therapists, avoiding that dinner with the in-laws using a plausible technical emergency can significantly reduce tension. Use responsibly.'
13
- },
14
- {
15
- question: 'Why such surreal phrases?',
16
- answer: 'The strategy is based on Cognitive Dissonance. If you say something boring it is verifiable. If you say something absurd, the surprise blocks the capacity for anger.'
17
- }
18
- ];
19
-
20
- const howTo: ExcuseGeneratorLocaleContent['howTo'] = [
21
- { name: 'Generate', text: 'Click the generate button to create a new excuse.' },
22
- { name: 'Copy', text: 'Click the copy button to bring the excuse to your clipboard.' }
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: 'en',
56
- };
57
-
58
- export const content: ExcuseGeneratorLocaleContent = {
59
- slug,
60
- title,
61
- description,
62
- faqTitle: 'Frequently Asked Questions',
63
- ui: {
64
- title: 'Surreal Excuse Generator',
65
- description: 'Next-generation alibi calculator.',
66
- subjectLabel: 'Subject',
67
- actionLabel: 'Action',
68
- victimLabel: 'Victim',
69
- generateBtn: 'GENERATE EXCUSE',
70
- copyBtn: 'Copy this craziness',
71
- copied: 'Copied!',
72
- starts: JSON.stringify([
73
- "My cat", "My grandmother", "The president", "An alien", "My neighbor from the 5th floor",
74
- "The wifi", "My horoscope", "A time traveler", "The washing machine", "My fridge",
75
- "The spirit of Christmas", "My shadow", "A ninja", "The vegan police", "Siri",
76
- "My carnivorous plant", "The Amazon delivery guy", "My evil clone", "A wizard", "Godzilla"
77
- ]),
78
- middles: JSON.stringify([
79
- "has declared war on", "has eaten", "has kidnapped", "has set fire to",
80
- "is organizing a party in", "has vomited on", "refuses to leave",
81
- "has hacked", "has stolen", "has fallen in love with", "is meditating on",
82
- "has cast a spell on", "is protesting against", "has founded a cult in",
83
- "is dancing samba in", "has summoned a demon in", "has blocked access to",
84
- "has turned into gold", "is trying to sell", "has written a book about"
85
- ]),
86
- ends: JSON.stringify([
87
- "my house keys.", "my will to live.", "the garage door.",
88
- "my favorite pants.", "the living room router.", "my only pair of shoes.",
89
- "the laws of physics.", "my dignity.", "the building's elevator.",
90
- "my Netflix account.", "my toothbrush.", "my house deeds.",
91
- "my pogs collection.", "the car's handbrake.", "my desire to socialize.",
92
- "my coffee supply.", "the toilet lid.", "the TV remote.",
93
- "my lucky socks.", "Western civilization."
94
- ]),
95
- faqTitle: 'FAQ',
96
- bibliographyTitle: 'References'
97
- },
98
- seo: [
99
- { type: 'title', text: 'The Scientific Art of the Perfect Excuse', level: 2 },
100
- { type: 'paragraph', html: 'We live in the era of hyperconnectivity. Your phone vibrates, your watch notifies you, and your social agenda looks like a game of Tetris about to lose. The pressure to say "yes" to everything has created an epidemic of social exhaustion.' },
101
- { type: 'title', text: 'The Renaissance of JOMO (Joy of Missing Out)', level: 3 },
102
- { type: 'paragraph', html: 'While FOMO (Fear of Missing Out) dominated the last decade, digital wellness experts now advocate for <strong>JOMO: The Joy of Missing Out</strong>. It\'s not about isolation, but about intentionality.' },
103
- { type: 'tip', title: 'The Formula for the Irrefutable Alibi', html: '<strong>The Dissociated Subject:</strong> You are never the culprit. It is "the wifi", "my cat", "the universe". Shift the blame to an external entity.<br><strong>The Hyperbolic Action:</strong> The situation must be absurd or technical enough that nobody asks for details.<br><strong>The Physical Block:</strong> The final outcome must be binary: either I go or I stay home.' },
104
- { type: 'title', text: 'A Brief History of the Excuse', level: 3 },
105
- { type: 'list', items: [
106
- '<strong>Middle Ages:</strong> "My horse has lost a horseshoe" (A timeless classic).',
107
- '<strong>Industrial Revolution:</strong> "The steam engine overheated".',
108
- '<strong>Digital Era:</strong> "My internet dropped right in the middle of an update".',
109
- ]},
110
- { type: 'proscons', items: [
111
- { pro: 'Instantly relieves social pressure', con: 'Overuse erodes trust' },
112
- { pro: 'Protects your energy and boundaries', con: 'May generate guilt if used carelessly' },
113
- { pro: 'Creative and humorous tone defuses tension', con: 'Not suitable for formal or professional contexts' },
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 = 'excuse-generator';
6
+ const title = 'Excuse Generator';
7
+ const description = 'Semantic gambling machine to get rid of commitments with style. Generate surreal and irrefutable excuses instantly.';
8
+
9
+ const faq: ExcuseGeneratorLocaleContent['faq'] = [
10
+ {
11
+ question: 'Can this generator save my marriage?',
12
+ answer: 'While we are not therapists, avoiding that dinner with the in-laws using a plausible technical emergency can significantly reduce tension. Use responsibly.'
13
+ },
14
+ {
15
+ question: 'Why such surreal phrases?',
16
+ answer: 'The strategy is based on Cognitive Dissonance. If you say something boring it is verifiable. If you say something absurd, the surprise blocks the capacity for anger.'
17
+ }
18
+ ];
19
+
20
+ const howTo: ExcuseGeneratorLocaleContent['howTo'] = [
21
+ { name: 'Generate', text: 'Click the generate button to create a new excuse.' },
22
+ { name: 'Copy', text: 'Click the copy button to bring the excuse to your clipboard.' }
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: 'en',
56
+ };
57
+
58
+ export const content: ExcuseGeneratorLocaleContent = {
59
+ slug,
60
+ title,
61
+ description,
62
+ faqTitle: 'Frequently Asked Questions',
63
+ ui: {
64
+ title: 'Surreal Excuse Generator',
65
+ description: 'Next-generation alibi calculator.',
66
+ subjectLabel: 'Subject',
67
+ actionLabel: 'Action',
68
+ victimLabel: 'Victim',
69
+ generateBtn: 'GENERATE EXCUSE',
70
+ copyBtn: 'Copy this craziness',
71
+ copied: 'Copied!',
72
+ starts: JSON.stringify([
73
+ "My cat", "My grandmother", "The president", "An alien", "My neighbor from the 5th floor",
74
+ "The wifi", "My horoscope", "A time traveler", "The washing machine", "My fridge",
75
+ "The spirit of Christmas", "My shadow", "A ninja", "The vegan police", "Siri",
76
+ "My carnivorous plant", "The Amazon delivery guy", "My evil clone", "A wizard", "Godzilla"
77
+ ]),
78
+ middles: JSON.stringify([
79
+ "has declared war on", "has eaten", "has kidnapped", "has set fire to",
80
+ "is organizing a party in", "has vomited on", "refuses to leave",
81
+ "has hacked", "has stolen", "has fallen in love with", "is meditating on",
82
+ "has cast a spell on", "is protesting against", "has founded a cult in",
83
+ "is dancing samba in", "has summoned a demon in", "has blocked access to",
84
+ "has turned into gold", "is trying to sell", "has written a book about"
85
+ ]),
86
+ ends: JSON.stringify([
87
+ "my house keys.", "my will to live.", "the garage door.",
88
+ "my favorite pants.", "the living room router.", "my only pair of shoes.",
89
+ "the laws of physics.", "my dignity.", "the building's elevator.",
90
+ "my Netflix account.", "my toothbrush.", "my house deeds.",
91
+ "my pogs collection.", "the car's handbrake.", "my desire to socialize.",
92
+ "my coffee supply.", "the toilet lid.", "the TV remote.",
93
+ "my lucky socks.", "Western civilization."
94
+ ]),
95
+ faqTitle: 'FAQ',
96
+ bibliographyTitle: 'References'
97
+ },
98
+ seo: [
99
+ { type: 'title', text: 'The Scientific Art of the Perfect Excuse', level: 2 },
100
+ { type: 'paragraph', html: 'We live in the era of hyperconnectivity. Your phone vibrates, your watch notifies you, and your social agenda looks like a game of Tetris about to lose. The pressure to say "yes" to everything has created an epidemic of social exhaustion.' },
101
+ { type: 'title', text: 'The Renaissance of JOMO (Joy of Missing Out)', level: 3 },
102
+ { type: 'paragraph', html: 'While FOMO (Fear of Missing Out) dominated the last decade, digital wellness experts now advocate for <strong>JOMO: The Joy of Missing Out</strong>. It\'s not about isolation, but about intentionality.' },
103
+ { type: 'tip', title: 'The Formula for the Irrefutable Alibi', html: '<strong>The Dissociated Subject:</strong> You are never the culprit. It is "the wifi", "my cat", "the universe". Shift the blame to an external entity.<br><strong>The Hyperbolic Action:</strong> The situation must be absurd or technical enough that nobody asks for details.<br><strong>The Physical Block:</strong> The final outcome must be binary: either I go or I stay home.' },
104
+ { type: 'title', text: 'A Brief History of the Excuse', level: 3 },
105
+ { type: 'list', items: [
106
+ '<strong>Middle Ages:</strong> "My horse has lost a horseshoe" (A timeless classic).',
107
+ '<strong>Industrial Revolution:</strong> "The steam engine overheated".',
108
+ '<strong>Digital Era:</strong> "My internet dropped right in the middle of an update".',
109
+ ]},
110
+ { type: 'proscons', items: [
111
+ { pro: 'Instantly relieves social pressure', con: 'Overuse erodes trust' },
112
+ { pro: 'Protects your energy and boundaries', con: 'May generate guilt if used carelessly' },
113
+ { pro: 'Creative and humorous tone defuses tension', con: 'Not suitable for formal or professional contexts' },
114
+ ]},
115
+ ],
116
+ faq,
117
+ bibliography,
118
+ howTo,
119
+ schemas: [faqSchema as any, howToSchema as any, appSchema],
120
+ };